<?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>164099</bug_id>
          
          <creation_ts>2016-10-27 17:28:01 -0700</creation_ts>
          <short_desc>One file per class for Executable.h/.cpp</short_desc>
          <delta_ts>2016-10-28 14:01:55 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>ossy</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1245365</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-10-27 17:28:01 -0700</bug_when>
    <thetext>One file per class for Executable.h/.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245367</commentid>
    <comment_count>1</comment_count>
      <attachid>293087</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-10-27 17:30:42 -0700</bug_when>
    <thetext>Created attachment 293087
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245368</commentid>
    <comment_count>2</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-10-27 17:31:14 -0700</bug_when>
    <thetext>This is a first step toward fixing some problems with code caching.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245486</commentid>
    <comment_count>3</comment_count>
      <attachid>293087</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-10-28 01:27:49 -0700</bug_when>
    <thetext>Comment on attachment 293087
Patch

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

r=me

I wish bugzilla did a better job with showing diffs for these patches.

&gt; PerformanceTests/ChangeLog:1
&gt; +2016-10-27  Geoffrey Garen  &lt;ggaren@apple.com&gt;

Is this change expected?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245702</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-10-28 12:24:23 -0700</bug_when>
    <thetext>&gt; &gt; PerformanceTests/ChangeLog:1
&gt; &gt; +2016-10-27  Geoffrey Garen  &lt;ggaren@apple.com&gt;
&gt; 
&gt; Is this change expected?

Oops! Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245716</commentid>
    <comment_count>5</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-10-28 13:07:48 -0700</bug_when>
    <thetext>Committed r208063: &lt;http://trac.webkit.org/changeset/208063&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1245765</commentid>
    <comment_count>6</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2016-10-28 14:01:55 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Committed r208063: &lt;http://trac.webkit.org/changeset/208063&gt;

It broke the CLoop build, see build.webkit.org for details.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>293087</attachid>
            <date>2016-10-27 17:30:42 -0700</date>
            <delta_ts>2016-10-28 01:27:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-164099-20161027172654.patch</filename>
            <type>text/plain</type>
            <size>1157046</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMDgwMTkpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyIEBACisyMDE2LTEwLTI3ICBH
ZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CisKKyAgICAgICAgT25lIGZpbGUgcGVy
IGNsYXNzIGZvciBFeGVjdXRhYmxlLmgvLmNwcAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY0MDk5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgKiBNYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qOgorCiAyMDE2LTEwLTAzICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBw
bGUuY29tPgogCiAgICAgICAgIE1hcEhhc2ggc2hvdWxkIHNwZWN1bGF0ZSBvbiB0aGUgdHlwZSBv
ZiBpdHMgY2hpbGQgbm9kZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAy
MDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMgKzEsNzY0IEBACisyMDE2LTEwLTI3ICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBh
cHBsZS5jb20+CisKKyAgICAgICAgT25lIGZpbGUgcGVyIGNsYXNzIGZvciBFeGVjdXRhYmxlLmgv
LmNwcAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY0
MDk5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBD
TWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qOgorICAgICAgICAqIFNjcmlwdHMvYnVpbHRpbnMvYnVpbHRpbnNfZ2VuZXJhdGVf
Y29tYmluZWRfaW1wbGVtZW50YXRpb24ucHk6CisgICAgICAgIChCdWlsdGluc0NvbWJpbmVkSW1w
bGVtZW50YXRpb25HZW5lcmF0b3IuZ2VuZXJhdGVfc2Vjb25kYXJ5X2hlYWRlcl9pbmNsdWRlcyk6
CisgICAgICAgICogU2NyaXB0cy9idWlsdGlucy9idWlsdGluc19nZW5lcmF0ZV9zZXBhcmF0ZV9p
bXBsZW1lbnRhdGlvbi5weToKKyAgICAgICAgKEJ1aWx0aW5zU2VwYXJhdGVJbXBsZW1lbnRhdGlv
bkdlbmVyYXRvci5nZW5lcmF0ZV9zZWNvbmRhcnlfaGVhZGVyX2luY2x1ZGVzKToKKyAgICAgICAg
KiBidWlsdGlucy9CdWlsdGluRXhlY3V0YWJsZXMuY3BwOgorICAgICAgICAqIGJ5dGVjb2RlL0Nh
bGxWYXJpYW50Lmg6CisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAg
KiBieXRlY29kZS9Db2RlQmxvY2suaDoKKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
cHJlcGFyZUZvckV4ZWN1dGlvbik6CisgICAgICAgICogYnl0ZWNvZGUvQ29kZU9yaWdpbi5jcHA6
CisgICAgICAgICogYnl0ZWNvZGUvRXZhbENvZGVDYWNoZS5oOgorICAgICAgICAqIGJ5dGVjb2Rl
L0lubGluZUNhbGxGcmFtZS5jcHA6CisgICAgICAgICogYnl0ZWNvZGUvVW5saW5rZWRDb2RlQmxv
Y2suY3BwOgorICAgICAgICAqIGJ5dGVjb2RlL1VubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLmNw
cDoKKyAgICAgICAgKiBieXRlY29tcGlsZXIvU3RhdGljUHJvcGVydHlBbmFseXNpcy5oOgorICAg
ICAgICAqIGRlYnVnZ2VyL0RlYnVnZ2VyTG9jYXRpb24uY3BwOgorICAgICAgICAqIGRmZy9ERkdD
YXBhYmlsaXRpZXMuaDoKKyAgICAgICAgKiBkZmcvREZHT1NSRXhpdFByZXBhcmF0aW9uLmNwcDoK
KyAgICAgICAgKiBkZmcvREZHVG9GVExEZWZlcnJlZENvbXBpbGF0aW9uQ2FsbGJhY2suY3BwOgor
ICAgICAgICAqIGRmZy9ERkdUb0ZUTEZvck9TUkVudHJ5RGVmZXJyZWRDb21waWxhdGlvbkNhbGxi
YWNrLmNwcDoKKyAgICAgICAgKiBpbnRlcnByZXRlci9TdGFja1Zpc2l0b3IuY3BwOgorICAgICAg
ICAqIGppdC9KSVRUaHVua3MuY3BwOgorICAgICAgICAqIGppdC9KSVRUb0RGR0RlZmVycmVkQ29t
cGlsYXRpb25DYWxsYmFjay5jcHA6CisgICAgICAgICogaml0L1NwZWNpYWxpemVkVGh1bmtKSVQu
aDoKKyAgICAgICAgKiBsbGludC9MTEludE9mZnNldHNFeHRyYWN0b3IuY3BwOgorICAgICAgICAq
IHBhcnNlci9QYXJzZXIuaDoKKyAgICAgICAgKiBydW50aW1lL0NhbGxEYXRhLmNwcDoKKyAgICAg
ICAgKiBydW50aW1lL0NvbnN0cnVjdERhdGEuY3BwOgorICAgICAgICAqIHJ1bnRpbWUvRXZhbEV4
ZWN1dGFibGUuY3BwOiBDb3BpZWQgZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9F
eGVjdXRhYmxlLmNwcC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmRlc3Ryb3kpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6Y2xlYXJDb2RlKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6TmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6TmF0aXZlRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZVN0cnVjdHVyZSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6TmF0aXZlRXhlY3V0YWJsZTo6TmF0aXZlRXhlY3V0YWJsZSk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OlNjcmlwdEV4ZWN1dGFibGUpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFsbENvZGUpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpuZXdDb2RlQmxvY2tGb3IpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpuZXdSZXBsYWNlbWVudENvZGVCbG9j
a0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OnNldHVwTExJbnQpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpzZXR1cEpJVCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb25JbXBsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
UHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6Y3JlYXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0
YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNo
Q3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OmRl
c3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpzYW1wbGluZ0Rlc2NyaXB0aW9uKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmNoZWNrU3ludGF4KTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmluaXRpYWxpemVHbG9iYWxQ
cm9wZXJ0aWVzKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OnZp
c2l0Q2hpbGRyZW4pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhl
Y3V0YWJsZTo6YmFzZWxpbmVDb2RlQmxvY2tGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpG
dW5jdGlvbkV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4pOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpGdW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4ZWN1dGFibGUpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpXZWJBc3NlbWJseUV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpXZWJBc3NlbWJseUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4p
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZHVtcCk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpoYXNoRm9yKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6TmF0aXZlRXhlY3V0YWJsZTo6aGFzaEZvcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6Omhhc2hGb3IpOiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRp
bWUvRXZhbEV4ZWN1dGFibGUuaDogQ29waWVkIGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvRXhlY3V0YWJsZS5oLgorICAgICAgICAoSlNDOjppc0NhbGwpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6RXhlY3V0YWJsZUJhc2UpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNFdmFsRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0Z1bmN0aW9uRXhlY3V0YWJsZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc1Byb2dyYW1FeGVjdXRhYmxlKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmlzTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNIb3N0
RnVuY3Rpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNXZWJB
c3NlbWJseUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFz
ZTo6Y3JlYXRlU3RydWN0dXJlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJh
c2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhl
Y3V0YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6Z2VuZXJhdGVkSklUQ29kZUZvcik6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjplbnRyeXBvaW50Rm9yKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Om9mZnNldE9mSklUQ29kZVdpdGhBcml0eUNo
ZWNrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Om9mZnNldE9m
TnVtUGFyYW1ldGVyc0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNl
OjpoYXNKSVRDb2RlRm9yQ2FsbCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVC
YXNlOjpoYXNKSVRDb2RlRm9yQ29uc3RydWN0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhl
Y3V0YWJsZUJhc2U6Omhhc0pJVENvZGVGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVj
dXRhYmxlQmFzZTo6aW50cmluc2ljKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJs
ZUJhc2U6OmludHJpbnNpY0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6OnNvdXJjZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OnNvdXJjZUlEKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c291
cmNlVVJMKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6Zmlyc3RM
aW5lKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c2V0T3ZlcnJp
ZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
aGFzT3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhl
Y3V0YWJsZTo6b3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6bGFzdExpbmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRF
eGVjdXRhYmxlOjpzdGFydENvbHVtbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4
ZWN1dGFibGU6OmVuZENvbHVtbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6OnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OnR5cGVQcm9maWxpbmdFbmRPZmZzZXQpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjp1c2VzRXZhbCk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnVzZXNBcmd1bWVudHMpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc0Fycm93RnVuY3Rpb25Db250ZXh0KTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNTdHJpY3RNb2RlKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZGVyaXZlZENvbnRleHRUeXBlKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZXZhbENvbnRleHRUeXBl
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZWNtYU1vZGUpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXROZXZlcklubGluZSk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldE5ldmVyT3B0aW1p
emUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXROZXZlckZU
TE9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c2V0
RGlkVHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6OnNldENhblVzZU9TUkV4aXRGdXp6aW5nKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJJbmxpbmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpuZXZlck9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJGVExPcHRpbWl6ZSk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6OmRpZFRyeVRvRW50ZXJJbkxvb3ApOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc0lubGluaW5nQ2FuZGlkYXRlKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNPa1RvT3B0aW1pemUpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpjYW5Vc2VPU1JFeGl0RnV6emlu
Zyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmFkZHJlc3NPZkRp
ZFRyeVRvRW50ZXJJbkxvb3ApOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRh
YmxlOjpmZWF0dXJlcyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OnJlY29yZFBhcnNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxl
OjpwcmVwYXJlRm9yRXhlY3V0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKiBydW50aW1lL0V4ZWN1
dGFibGUuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHJ1bnRpbWUvRXhlY3V0YWJsZS5oOiBSZW1v
dmVkLgorICAgICAgICAqIHJ1bnRpbWUvRXhlY3V0YWJsZUJhc2UuY3BwOiBDb3BpZWQgZnJvbSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlLmNwcC4KKyAgICAgICAgKEpT
Qzo6TmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TmF0
aXZlRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4
ZWN1dGFibGU6OmNyZWF0ZVN0cnVjdHVyZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2
ZUV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TmF0
aXZlRXhlY3V0YWJsZTo6TmF0aXZlRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OlNjcmlwdEV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFsbENvZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpuZXdDb2RlQmxvY2tGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpTY3JpcHRFeGVjdXRhYmxlOjpuZXdSZXBsYWNlbWVudENvZGVCbG9ja0Zvcik6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OnNldHVwTExJbnQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpzZXR1
cEpJVCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVG
b3JFeGVjdXRpb25JbXBsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6
OmNyZWF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjpFdmFsRXhl
Y3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjpkZXN0cm95
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1FeGVj
dXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ry
b3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZTo6Y3JlYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5jdGlv
bkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpzYW1wbGluZ0Rlc2NyaXB0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1
dGFibGU6OnZpc2l0Q2hpbGRyZW4pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhl
Y3V0YWJsZTo6Y2hlY2tTeW50YXgpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhl
Y3V0YWJsZTo6aW5pdGlhbGl6ZUdsb2JhbFByb3BlcnRpZXMpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpiYXNlbGluZUNvZGVCbG9ja0Zvcik6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJl
bik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2Jh
bENvZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpXZWJBc3NlbWJseUV4ZWN1dGFibGU6Oldl
YkFzc2VtYmx5RXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5
RXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5
RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2
ZUV4ZWN1dGFibGU6Omhhc2hGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpoYXNoRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKiBydW50aW1lL0V4ZWN1dGFibGVC
YXNlLmg6IENvcGllZCBmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFi
bGUuaC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c291cmNlKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c291cmNlSUQpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzb3VyY2VVUkwpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpmaXJzdExpbmUpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXRPdmVycmlkZUxpbmVOdW1iZXIpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpoYXNPdmVycmlkZUxpbmVOdW1iZXIpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpvdmVycmlkZUxpbmVOdW1i
ZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpsYXN0TGluZSk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnN0YXJ0Q29sdW1uKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZW5kQ29sdW1uKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6dHlwZVByb2ZpbGluZ1N0YXJ0
T2Zmc2V0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6dHlwZVBy
b2ZpbGluZ0VuZE9mZnNldCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFi
bGU6OnVzZXNFdmFsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
dXNlc0FyZ3VtZW50cyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OmlzQXJyb3dGdW5jdGlvbkNvbnRleHQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRF
eGVjdXRhYmxlOjppc1N0cmljdE1vZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRF
eGVjdXRhYmxlOjpkZXJpdmVkQ29udGV4dFR5cGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpldmFsQ29udGV4dFR5cGUpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpTY3JpcHRFeGVjdXRhYmxlOjplY21hTW9kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNj
cmlwdEV4ZWN1dGFibGU6OnNldE5ldmVySW5saW5lKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6c2V0TmV2ZXJPcHRpbWl6ZSk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldE5ldmVyRlRMT3B0aW1pemUpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXREaWRUcnlUb0VudGVySW5Mb29wKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c2V0Q2FuVXNlT1NSRXhpdEZ1
enppbmcpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpuZXZlcklu
bGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Om5ldmVyT3B0
aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpuZXZlckZU
TE9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZGlk
VHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFi
bGU6OmlzSW5saW5pbmdDYW5kaWRhdGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRF
eGVjdXRhYmxlOjppc09rVG9PcHRpbWl6ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlw
dEV4ZWN1dGFibGU6OmNhblVzZU9TUkV4aXRGdXp6aW5nKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6U2NyaXB0RXhlY3V0YWJsZTo6YWRkcmVzc09mRGlkVHJ5VG9FbnRlckluTG9vcCk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmZlYXR1cmVzKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6cmVjb3JkUGFyc2UpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb24pOiBE
ZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlLmNwcDogQ29waWVk
IGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHAuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5h
dGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4
ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVjdXRh
YmxlOjpjcmVhdGVTdHJ1Y3R1cmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVj
dXRhYmxlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4
ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3Jp
cHRFeGVjdXRhYmxlOjpTY3JpcHRFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlw
dEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0
RXhlY3V0YWJsZTo6bmV3Q29kZUJsb2NrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6bmV3UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3IpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpzZXR1cExMSW50KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6c2V0dXBKSVQp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhl
Y3V0aW9uSW1wbCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjpjcmVh
dGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhlY3V0YWJsZTo6RXZhbEV4ZWN1dGFi
bGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OlByb2dyYW1FeGVjdXRhYmxlOjpQcm9ncmFtRXhlY3V0YWJs
ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6Ok1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGU6OmNyZWF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6c2FtcGxpbmdEZXNj
cmlwdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjp2aXNpdENo
aWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmNoZWNr
U3ludGF4KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmluaXRp
YWxpemVHbG9iYWxQcm9wZXJ0aWVzKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4
ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmR1bXApOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aGFzaEZvcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6Ok5hdGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpoYXNoRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKiBydW50aW1lL0Z1
bmN0aW9uRXhlY3V0YWJsZS5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9FeGVjdXRhYmxlLmguCisgICAgICAgIChKU0M6OmlzQ2FsbCk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpFeGVjdXRhYmxlQmFzZSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0V2YWxFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmlzRnVuY3Rpb25FeGVjdXRhYmxlKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmlzUHJvZ3JhbUV4ZWN1dGFibGUpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0hvc3RG
dW5jdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc1dlYkFz
c2VtYmx5RXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNl
OjpjcmVhdGVTdHJ1Y3R1cmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFz
ZTo6Z2VuZXJhdGVkSklUQ29kZUZvckNhbGwpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVj
dXRhYmxlQmFzZTo6Z2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpnZW5lcmF0ZWRKSVRDb2RlRm9yKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmVudHJ5cG9pbnRGb3IpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6b2Zmc2V0T2ZKSVRDb2RlV2l0aEFyaXR5Q2hl
Y2tGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6b2Zmc2V0T2ZO
dW1QYXJhbWV0ZXJzRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6
Omhhc0pJVENvZGVGb3JDYWxsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJh
c2U6Omhhc0pJVENvZGVGb3JDb25zdHJ1Y3QpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVj
dXRhYmxlQmFzZTo6aGFzSklUQ29kZUZvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1
dGFibGVCYXNlOjppbnRyaW5zaWMpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxl
QmFzZTo6aW50cmluc2ljRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0
YWJsZTo6c291cmNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
c291cmNlSUQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzb3Vy
Y2VVUkwpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpmaXJzdExp
bmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXRPdmVycmlk
ZUxpbmVOdW1iZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpo
YXNPdmVycmlkZUxpbmVOdW1iZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpvdmVycmlkZUxpbmVOdW1iZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3Jp
cHRFeGVjdXRhYmxlOjpsYXN0TGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4
ZWN1dGFibGU6OnN0YXJ0Q29sdW1uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhl
Y3V0YWJsZTo6ZW5kQ29sdW1uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0
YWJsZTo6dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6dHlwZVByb2ZpbGluZ0VuZE9mZnNldCk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnVzZXNFdmFsKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6dXNlc0FyZ3VtZW50cyk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmlzQXJyb3dGdW5jdGlvbkNvbnRleHQpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc1N0cmljdE1vZGUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpkZXJpdmVkQ29udGV4dFR5cGUpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpldmFsQ29udGV4dFR5cGUp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjplY21hTW9kZSk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldE5ldmVySW5saW5lKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c2V0TmV2ZXJPcHRpbWl6
ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldE5ldmVyRlRM
T3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXRE
aWRUcnlUb0VudGVySW5Mb29wKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0
YWJsZTo6c2V0Q2FuVXNlT1NSRXhpdEZ1enppbmcpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpuZXZlcklubGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNj
cmlwdEV4ZWN1dGFibGU6Om5ldmVyT3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpuZXZlckZUTE9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6U2NyaXB0RXhlY3V0YWJsZTo6ZGlkVHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmlzSW5saW5pbmdDYW5kaWRhdGUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc09rVG9PcHRpbWl6ZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmNhblVzZU9TUkV4aXRGdXp6aW5n
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6YWRkcmVzc09mRGlk
VHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFi
bGU6OmZlYXR1cmVzKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
cmVjb3JkUGFyc2UpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpm
aW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OnByZXBhcmVGb3JFeGVjdXRpb24pOiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvRnVuY3Rp
b25FeGVjdXRhYmxlRHVtcC5oOgorICAgICAgICAqIHJ1bnRpbWUvSlNBcnJheS5jcHA6CisgICAg
ICAgICogcnVudGltZS9KU0Z1bmN0aW9uSW5saW5lcy5oOgorICAgICAgICAqIHJ1bnRpbWUvSlNN
b2R1bGVSZWNvcmQuY3BwOgorICAgICAgICAqIHJ1bnRpbWUvSlNPYmplY3QuY3BwOgorICAgICAg
ICAqIHJ1bnRpbWUvTG9va3VwLmNwcDoKKyAgICAgICAgKiBydW50aW1lL01vZHVsZVByb2dyYW1F
eGVjdXRhYmxlLmNwcDogQ29waWVkIGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUv
RXhlY3V0YWJsZS5jcHAuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpkZXN0cm95KTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZSk6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGVTdHJ1Y3R1cmUpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpOYXRpdmVFeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpTY3JpcHRFeGVjdXRhYmxlKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV3Q29kZUJsb2NrRm9yKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV3UmVwbGFjZW1lbnRDb2RlQmxv
Y2tGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpzZXR1cExMSW50KTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6c2V0dXBKSVQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkV2YWxFeGVjdXRhYmxlOjpjcmVhdGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhl
Y3V0YWJsZTo6RXZhbEV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhl
Y3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlByb2dyYW1FeGVjdXRh
YmxlOjpQcm9ncmFtRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlByb2dyYW1F
eGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVj
dXRhYmxlOjpGdW5jdGlvbkV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5j
dGlvbkV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
RnVuY3Rpb25FeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6c2Ft
cGxpbmdEZXNjcmlwdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxl
Ojp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFi
bGU6OmNoZWNrU3ludGF4KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFi
bGU6OmluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
UHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4pOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpGdW5jdGlvbkV4ZWN1dGFibGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9yKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xvYmFsQ29kZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6V2ViQXNzZW1ibHlFeGVj
dXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpk
ZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp2
aXNpdENoaWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmR1
bXApOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aGFzaEZvcik6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpoYXNoRm9yKTogRGVsZXRlZC4KKyAg
ICAgICAgKiBydW50aW1lL01vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmg6IENvcGllZCBmcm9tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuaC4KKyAgICAgICAgKEpTQzo6
aXNDYWxsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OkV4ZWN1dGFi
bGVCYXNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmZpbmlzaENy
ZWF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmlzRXZhbEV4
ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNGdW5j
dGlvbkV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6
aXNQcm9ncmFtRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVC
YXNlOjppc01vZHVsZVByb2dyYW1FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
RXhlY3V0YWJsZUJhc2U6OmlzSG9zdEZ1bmN0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
RXhlY3V0YWJsZUJhc2U6OmlzV2ViQXNzZW1ibHlFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmNyZWF0ZVN0cnVjdHVyZSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpnZW5lcmF0ZWRKSVRDb2RlRm9yQ29u
c3RydWN0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmdlbmVyYXRl
ZEpJVENvZGVGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZW50
cnlwb2ludEZvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpvZmZz
ZXRPZkpJVENvZGVXaXRoQXJpdHlDaGVja0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4
ZWN1dGFibGVCYXNlOjpvZmZzZXRPZk51bVBhcmFtZXRlcnNGb3IpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aGFzSklUQ29kZUZvckNhbGwpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aGFzSklUQ29kZUZvckNvbnN0cnVjdCk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpoYXNKSVRDb2RlRm9yKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmludHJpbnNpYyk6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppbnRyaW5zaWNGb3IpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzb3VyY2UpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzb3VyY2VJRCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OnNvdXJjZVVSTCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNj
cmlwdEV4ZWN1dGFibGU6OmZpcnN0TGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlw
dEV4ZWN1dGFibGU6OnNldE92ZXJyaWRlTGluZU51bWJlcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6Omhhc092ZXJyaWRlTGluZU51bWJlcik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Om92ZXJyaWRlTGluZU51bWJlcik6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Omxhc3RMaW5lKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c3RhcnRDb2x1bW4pOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjplbmRDb2x1bW4pOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjp0eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjp0eXBlUHJvZmlsaW5nRW5k
T2Zmc2V0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6dXNlc0V2
YWwpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjp1c2VzQXJndW1l
bnRzKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNBcnJvd0Z1
bmN0aW9uQ29udGV4dCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OmlzU3RyaWN0TW9kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OmRlcml2ZWRDb250ZXh0VHlwZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6OmV2YWxDb250ZXh0VHlwZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4
ZWN1dGFibGU6OmVjbWFNb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0
YWJsZTo6c2V0TmV2ZXJJbmxpbmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpzZXROZXZlck9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0
RXhlY3V0YWJsZTo6c2V0TmV2ZXJGVExPcHRpbWl6ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OnNldERpZFRyeVRvRW50ZXJJbkxvb3ApOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXRDYW5Vc2VPU1JFeGl0RnV6emluZyk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Om5ldmVySW5saW5lKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJPcHRpbWl6ZSk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Om5ldmVyRlRMT3B0aW1pemUp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpkaWRUcnlUb0VudGVy
SW5Mb29wKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNJbmxp
bmluZ0NhbmRpZGF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OmlzT2tUb09wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJs
ZTo6Y2FuVXNlT1NSRXhpdEZ1enppbmcpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRF
eGVjdXRhYmxlOjphZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZmVhdHVyZXMpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpyZWNvcmRQYXJzZSk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbik6IERlbGV0ZWQuCisg
ICAgICAgICogcnVudGltZS9OYXRpdmVFeGVjdXRhYmxlLmNwcDogQ29waWVkIGZyb20gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHAuCisgICAgICAgIChKU0M6OkV4
ZWN1dGFibGVCYXNlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJs
ZUJhc2U6OmNsZWFyQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFi
bGU6OlNjcmlwdEV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJs
ZTo6aW5zdGFsbENvZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxl
OjpuZXdDb2RlQmxvY2tGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRh
YmxlOjpuZXdSZXBsYWNlbWVudENvZGVCbG9ja0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OnNldHVwTExJbnQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpzZXR1cEpJVCk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb25JbXBs
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6OmNyZWF0ZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjpFdmFsRXhlY3V0YWJsZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1FeGVjdXRhYmxlKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6UHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6
Y3JlYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6
OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OkZ1
bmN0aW9uRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0
YWJsZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4
ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpzYW1wbGluZ0Rlc2Ny
aXB0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6OnZpc2l0Q2hp
bGRyZW4pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhlY3V0YWJsZTo6Y2hlY2tT
eW50YXgpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhlY3V0YWJsZTo6aW5pdGlh
bGl6ZUdsb2JhbFByb3BlcnRpZXMpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhl
Y3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
RnVuY3Rpb25FeGVjdXRhYmxlOjpiYXNlbGluZUNvZGVCbG9ja0Zvcik6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpXZWJBc3NlbWJseUV4ZWN1dGFibGU6OldlYkFzc2VtYmx5RXhlY3V0
YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6ZGVz
dHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6dmlz
aXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpkdW1w
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpoYXNoRm9yKTogRGVsZXRlZC4K
KyAgICAgICAgKiBydW50aW1lL05hdGl2ZUV4ZWN1dGFibGUuaDogQ29waWVkIGZyb20gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5oLgorICAgICAgICAoSlNDOjppc0Nh
bGwpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6RXhlY3V0YWJsZUJh
c2UpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZmluaXNoQ3JlYXRp
b24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNFdmFsRXhlY3V0
YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0Z1bmN0aW9u
RXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc1By
b2dyYW1FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6
OmlzTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVj
dXRhYmxlQmFzZTo6aXNIb3N0RnVuY3Rpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVj
dXRhYmxlQmFzZTo6aXNXZWJBc3NlbWJseUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpFeGVjdXRhYmxlQmFzZTo6Y3JlYXRlU3RydWN0dXJlKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6RXhlY3V0YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1
Y3QpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6Z2VuZXJhdGVkSklU
Q29kZUZvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjplbnRyeXBv
aW50Rm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Om9mZnNldE9m
SklUQ29kZVdpdGhBcml0eUNoZWNrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0
YWJsZUJhc2U6Om9mZnNldE9mTnVtUGFyYW1ldGVyc0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OkV4ZWN1dGFibGVCYXNlOjpoYXNKSVRDb2RlRm9yQ2FsbCk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OkV4ZWN1dGFibGVCYXNlOjpoYXNKSVRDb2RlRm9yQ29uc3RydWN0KTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omhhc0pJVENvZGVGb3IpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aW50cmluc2ljKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmludHJpbnNpY0Zvcik6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNvdXJjZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OnNvdXJjZUlEKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6c291cmNlVVJMKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0
RXhlY3V0YWJsZTo6Zmlyc3RMaW5lKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhl
Y3V0YWJsZTo6c2V0T3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6aGFzT3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6b3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bGFzdExpbmUpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzdGFydENvbHVtbik6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmVuZENvbHVtbik6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnR5cGVQcm9maWxpbmdFbmRPZmZz
ZXQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjp1c2VzRXZhbCk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnVzZXNBcmd1bWVudHMp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc0Fycm93RnVuY3Rp
b25Db250ZXh0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNT
dHJpY3RNb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZGVy
aXZlZENvbnRleHRUeXBlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJs
ZTo6ZXZhbENvbnRleHRUeXBlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0
YWJsZTo6ZWNtYU1vZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxl
OjpzZXROZXZlcklubGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFi
bGU6OnNldE5ldmVyT3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpzZXROZXZlckZUTE9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6c2V0RGlkVHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldENhblVzZU9TUkV4aXRGdXp6aW5nKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJJbmxpbmUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpuZXZlck9wdGltaXplKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJGVExPcHRpbWl6ZSk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmRpZFRyeVRvRW50ZXJJbkxv
b3ApOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc0lubGluaW5n
Q2FuZGlkYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNP
a1RvT3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpj
YW5Vc2VPU1JFeGl0RnV6emluZyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6OmFkZHJlc3NPZkRpZFRyeVRvRW50ZXJJbkxvb3ApOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpmZWF0dXJlcyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OnJlY29yZFBhcnNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
U2NyaXB0RXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uKTogRGVsZXRlZC4KKyAgICAg
ICAgKiBydW50aW1lL1Byb2dyYW1FeGVjdXRhYmxlLmNwcDogQ29waWVkIGZyb20gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHAuCisgICAgICAgIChKU0M6OkV4ZWN1
dGFibGVCYXNlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJh
c2U6OmNsZWFyQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6
OmNyZWF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6OmRlc3Ry
b3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGVTdHJ1
Y3R1cmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVjdXRhYmxlOjpmaW5pc2hD
cmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2
ZUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpT
Y3JpcHRFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJs
ZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6Omlu
c3RhbGxDb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV3
Q29kZUJsb2NrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
bmV3UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpzZXR1
cExMSW50KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6c2V0dXBKSVQpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OkV2YWxFeGVjdXRhYmxlOjpjcmVhdGUpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpFdmFsRXhlY3V0YWJsZTo6RXZhbEV4ZWN1dGFibGUpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpFdmFsRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJv
eSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6RnVuY3Rpb25F
eGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpm
aW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJs
ZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OnNhbXBsaW5nRGVzY3JpcHRpb24p
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENo
aWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpiYXNl
bGluZUNvZGVCbG9ja0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0
YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhl
Y3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpXZWJBc3Nl
bWJseUV4ZWN1dGFibGU6OldlYkFzc2VtYmx5RXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpkdW1wKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRp
dmVFeGVjdXRhYmxlOjpoYXNoRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhl
Y3V0YWJsZTo6aGFzaEZvcik6IERlbGV0ZWQuCisgICAgICAgICogcnVudGltZS9Qcm9ncmFtRXhl
Y3V0YWJsZS5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVj
dXRhYmxlLmguCisgICAgICAgIChKU0M6OmlzQ2FsbCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkV4ZWN1dGFibGVCYXNlOjpFeGVjdXRhYmxlQmFzZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkV4ZWN1dGFibGVCYXNlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkV4ZWN1dGFibGVCYXNlOjppc0V2YWxFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6OmlzRnVuY3Rpb25FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmlzUHJvZ3JhbUV4ZWN1dGFibGUpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0hvc3RGdW5jdGlvbik6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc1dlYkFzc2VtYmx5RXhl
Y3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpjcmVhdGVT
dHJ1Y3R1cmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6Z2VuZXJh
dGVkSklUQ29kZUZvckNhbGwpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFz
ZTo6Z2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkV4ZWN1dGFibGVCYXNlOjpnZW5lcmF0ZWRKSVRDb2RlRm9yKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6RXhlY3V0YWJsZUJhc2U6OmVudHJ5cG9pbnRGb3IpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpFeGVjdXRhYmxlQmFzZTo6b2Zmc2V0T2ZKSVRDb2RlV2l0aEFyaXR5Q2hlY2tGb3IpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6b2Zmc2V0T2ZOdW1QYXJhbWV0
ZXJzRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omhhc0pJVENv
ZGVGb3JDYWxsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omhhc0pJ
VENvZGVGb3JDb25zdHJ1Y3QpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFz
ZTo6aGFzSklUQ29kZUZvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNl
OjppbnRyaW5zaWMpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aW50
cmluc2ljRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c291
cmNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c291cmNlSUQp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzb3VyY2VVUkwpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpmaXJzdExpbmUpOiBEZWxl
dGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXRPdmVycmlkZUxpbmVOdW1i
ZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpoYXNPdmVycmlk
ZUxpbmVOdW1iZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpv
dmVycmlkZUxpbmVOdW1iZXIpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRh
YmxlOjpsYXN0TGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OnN0YXJ0Q29sdW1uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
ZW5kQ29sdW1uKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6dHlw
ZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhl
Y3V0YWJsZTo6dHlwZVByb2ZpbGluZ0VuZE9mZnNldCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OnVzZXNFdmFsKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6dXNlc0FyZ3VtZW50cyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNj
cmlwdEV4ZWN1dGFibGU6OmlzQXJyb3dGdW5jdGlvbkNvbnRleHQpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc1N0cmljdE1vZGUpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpkZXJpdmVkQ29udGV4dFR5cGUpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpldmFsQ29udGV4dFR5cGUpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjplY21hTW9kZSk6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldE5ldmVySW5saW5lKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c2V0TmV2ZXJPcHRpbWl6ZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldE5ldmVyRlRMT3B0aW1pemUp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzZXREaWRUcnlUb0Vu
dGVySW5Mb29wKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6c2V0
Q2FuVXNlT1NSRXhpdEZ1enppbmcpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpuZXZlcklubGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1
dGFibGU6Om5ldmVyT3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVj
dXRhYmxlOjpuZXZlckZUTE9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0
RXhlY3V0YWJsZTo6ZGlkVHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6OmlzSW5saW5pbmdDYW5kaWRhdGUpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc09rVG9PcHRpbWl6ZSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmNhblVzZU9TUkV4aXRGdXp6aW5nKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6YWRkcmVzc09mRGlkVHJ5VG9FbnRl
ckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmZlYXR1
cmVzKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6cmVjb3JkUGFy
c2UpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpmaW5pc2hDcmVh
dGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVG
b3JFeGVjdXRpb24pOiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvU2FtcGxpbmdQcm9maWxl
ci5jcHA6CisgICAgICAgICogcnVudGltZS9TY3JpcHRFeGVjdXRhYmxlLmNwcDogQ29waWVkIGZy
b20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHAuCisgICAgICAg
IChKU0M6OkV4ZWN1dGFibGVCYXNlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
RXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2
ZUV4ZWN1dGFibGU6OmNyZWF0ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1
dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVjdXRhYmxl
OjpjcmVhdGVTdHJ1Y3R1cmUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVjdXRh
YmxlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1
dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhl
Y3V0YWJsZTo6Y3JlYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6
OkV2YWxFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6
OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhlY3V0YWJsZTo6UHJv
Z3JhbUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhlY3V0YWJs
ZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkZ1bmN0aW9uRXhlY3V0YWJsZTo6RnVuY3Rpb25FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OnNhbXBsaW5nRGVzY3JpcHRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpF
dmFsRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlBy
b2dyYW1FeGVjdXRhYmxlOjpjaGVja1N5bnRheCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlBy
b2dyYW1FeGVjdXRhYmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyk6IERlbGV0ZWQuCisg
ICAgICAgIChKU0M6OlByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4pOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OmJhc2VsaW5lQ29kZUJs
b2NrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjp2aXNp
dENoaWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpm
cm9tR2xvYmFsQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5RXhlY3V0
YWJsZTo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6V2Vi
QXNzZW1ibHlFeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6V2Vi
QXNzZW1ibHlFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6OmR1bXApOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRh
YmxlQmFzZTo6aGFzaEZvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok5hdGl2ZUV4ZWN1dGFi
bGU6Omhhc2hGb3IpOiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvU2NyaXB0RXhlY3V0YWJs
ZS5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxl
LmguCisgICAgICAgICgpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjppc0NhbGwpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6RXhlY3V0YWJsZUJhc2UpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNFdmFsRXhlY3V0YWJsZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0Z1bmN0aW9uRXhlY3V0YWJsZSk6
IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc1Byb2dyYW1FeGVjdXRh
YmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmlzTW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6
aXNIb3N0RnVuY3Rpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6
aXNXZWJBc3NlbWJseUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRh
YmxlQmFzZTo6Y3JlYXRlU3RydWN0dXJlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0
YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6Z2VuZXJhdGVkSklUQ29kZUZvcik6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjplbnRyeXBvaW50Rm9yKTogRGVs
ZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Om9mZnNldE9mSklUQ29kZVdpdGhB
cml0eUNoZWNrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Om9m
ZnNldE9mTnVtUGFyYW1ldGVyc0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFi
bGVCYXNlOjpoYXNKSVRDb2RlRm9yQ2FsbCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1
dGFibGVCYXNlOjpoYXNKSVRDb2RlRm9yQ29uc3RydWN0KTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6Omhhc0pJVENvZGVGb3IpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpFeGVjdXRhYmxlQmFzZTo6aW50cmluc2ljKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhl
Y3V0YWJsZUJhc2U6OmludHJpbnNpY0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlw
dEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb24pOiBEZWxldGVkLgorICAgICAgICAqIHJ1
bnRpbWUvU3RyaW5nQ29uc3RydWN0b3IuY3BwOgorICAgICAgICAqIHJ1bnRpbWUvU3RyaW5nUHJv
dG90eXBlLmNwcDoKKyAgICAgICAgKiBydW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0YWJsZS5jcHA6
IENvcGllZCBmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3Bw
LgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAg
ICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpjbGVhckNvZGUpOiBEZWxldGVkLgorICAgICAgICAo
SlNDOjpOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpO
YXRpdmVFeGVjdXRhYmxlOjpkZXN0cm95KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TmF0aXZl
RXhlY3V0YWJsZTo6Y3JlYXRlU3RydWN0dXJlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6TmF0
aXZlRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpO
YXRpdmVFeGVjdXRhYmxlOjpOYXRpdmVFeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6U2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0RXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmRlc3Ryb3kpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpTY3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OlNjcmlwdEV4ZWN1dGFibGU6Om5ld0NvZGVCbG9ja0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6Om5ld1JlcGxhY2VtZW50Q29kZUJsb2NrRm9yKTogRGVsZXRl
ZC4KKyAgICAgICAgKEpTQzo6c2V0dXBMTEludCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OnNl
dHVwSklUKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFy
ZUZvckV4ZWN1dGlvbkltcGwpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhlY3V0YWJs
ZTo6Y3JlYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6OkV2YWxF
eGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXZhbEV4ZWN1dGFibGU6OmRlc3Ry
b3kpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhlY3V0YWJsZTo6UHJvZ3JhbUV4
ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpQcm9ncmFtRXhlY3V0YWJsZTo6ZGVz
dHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6Ok1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkZ1bmN0
aW9uRXhlY3V0YWJsZTo6RnVuY3Rpb25FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbik6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6ZGVzdHJveSk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OnNhbXBsaW5nRGVzY3JpcHRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFdmFsRXhl
Y3V0YWJsZTo6dmlzaXRDaGlsZHJlbik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlByb2dyYW1F
eGVjdXRhYmxlOjpjaGVja1N5bnRheCk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlByb2dyYW1F
eGVjdXRhYmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyk6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKTogRGVsZXRlZC4KKyAgICAg
ICAgKEpTQzo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4pOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9y
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjp2aXNpdENoaWxk
cmVuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xv
YmFsQ29kZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjpkdW1wKTog
RGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IpOiBEZWxldGVk
LgorICAgICAgICAoSlNDOjpOYXRpdmVFeGVjdXRhYmxlOjpoYXNoRm9yKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aGFzaEZvcik6IERlbGV0ZWQuCisgICAgICAg
ICogcnVudGltZS9XZWJBc3NlbWJseUV4ZWN1dGFibGUuaDogQ29waWVkIGZyb20gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5oLgorICAgICAgICAoSlNDOjppc0NhbGwp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6RXhlY3V0YWJsZUJhc2Up
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6ZmluaXNoQ3JlYXRpb24p
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aXNFdmFsRXhlY3V0YWJs
ZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc0Z1bmN0aW9uRXhl
Y3V0YWJsZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjppc1Byb2dy
YW1FeGVjdXRhYmxlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omlz
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRh
YmxlQmFzZTo6aXNIb3N0RnVuY3Rpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRh
YmxlQmFzZTo6aXNXZWJBc3NlbWJseUV4ZWN1dGFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpFeGVjdXRhYmxlQmFzZTo6Y3JlYXRlU3RydWN0dXJlKTogRGVsZXRlZC4KKyAgICAgICAgKEpT
Qzo6RXhlY3V0YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6OmdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3Qp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6Z2VuZXJhdGVkSklUQ29k
ZUZvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OkV4ZWN1dGFibGVCYXNlOjplbnRyeXBvaW50
Rm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Om9mZnNldE9mSklU
Q29kZVdpdGhBcml0eUNoZWNrRm9yKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6RXhlY3V0YWJs
ZUJhc2U6Om9mZnNldE9mTnVtUGFyYW1ldGVyc0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChKU0M6
OkV4ZWN1dGFibGVCYXNlOjpoYXNKSVRDb2RlRm9yQ2FsbCk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OkV4ZWN1dGFibGVCYXNlOjpoYXNKSVRDb2RlRm9yQ29uc3RydWN0KTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6RXhlY3V0YWJsZUJhc2U6Omhhc0pJVENvZGVGb3IpOiBEZWxldGVkLgorICAg
ICAgICAoSlNDOjpFeGVjdXRhYmxlQmFzZTo6aW50cmluc2ljKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6RXhlY3V0YWJsZUJhc2U6OmludHJpbnNpY0Zvcik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNvdXJjZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNj
cmlwdEV4ZWN1dGFibGU6OnNvdXJjZUlEKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0
RXhlY3V0YWJsZTo6c291cmNlVVJMKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhl
Y3V0YWJsZTo6Zmlyc3RMaW5lKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0
YWJsZTo6c2V0T3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6aGFzT3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAgICAgICAg
KEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6b3ZlcnJpZGVMaW5lTnVtYmVyKTogRGVsZXRlZC4KKyAg
ICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bGFzdExpbmUpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpzdGFydENvbHVtbik6IERlbGV0ZWQuCisgICAgICAg
IChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmVuZENvbHVtbik6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6OnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCk6IERlbGV0ZWQu
CisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnR5cGVQcm9maWxpbmdFbmRPZmZzZXQp
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjp1c2VzRXZhbCk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OnVzZXNBcmd1bWVudHMpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc0Fycm93RnVuY3Rpb25D
b250ZXh0KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNTdHJp
Y3RNb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6ZGVyaXZl
ZENvbnRleHRUeXBlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6
ZXZhbENvbnRleHRUeXBlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJs
ZTo6ZWNtYU1vZGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpz
ZXROZXZlcklubGluZSk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6
OnNldE5ldmVyT3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRh
YmxlOjpzZXROZXZlckZUTE9wdGltaXplKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0
RXhlY3V0YWJsZTo6c2V0RGlkVHJ5VG9FbnRlckluTG9vcCk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OlNjcmlwdEV4ZWN1dGFibGU6OnNldENhblVzZU9TUkV4aXRGdXp6aW5nKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJJbmxpbmUpOiBEZWxldGVkLgor
ICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpuZXZlck9wdGltaXplKTogRGVsZXRlZC4K
KyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6bmV2ZXJGVExPcHRpbWl6ZSk6IERlbGV0
ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFibGU6OmRpZFRyeVRvRW50ZXJJbkxvb3Ap
OiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjppc0lubGluaW5nQ2Fu
ZGlkYXRlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2NyaXB0RXhlY3V0YWJsZTo6aXNPa1Rv
T3B0aW1pemUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpTY3JpcHRFeGVjdXRhYmxlOjpjYW5V
c2VPU1JFeGl0RnV6emluZyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNjcmlwdEV4ZWN1dGFi
bGU6OmFkZHJlc3NPZkRpZFRyeVRvRW50ZXJJbkxvb3ApOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpTY3JpcHRFeGVjdXRhYmxlOjpmZWF0dXJlcyk6IERlbGV0ZWQuCisgICAgICAgIChKU0M6OlNj
cmlwdEV4ZWN1dGFibGU6OnJlY29yZFBhcnNlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6U2Ny
aXB0RXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpT
Y3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uKTogRGVsZXRlZC4KKwogMjAxNi0x
MC0yNCAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KIAogICAgICAgICBb
RE9NSklUXVtERkddIENhbGxET00gbmV2ZXIgd3JpdGVzIFN0YWNrCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTY3MiwxMyArNjcyLDE1
IEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAgICAgcnVudGltZS9FcnJvckhhbmRsaW5n
U2NvcGUuY3BwCiAgICAgcnVudGltZS9FcnJvckluc3RhbmNlLmNwcAogICAgIHJ1bnRpbWUvRXJy
b3JQcm90b3R5cGUuY3BwCisgICAgcnVudGltZS9FdmFsRXhlY3V0YWJsZS5jcHAKICAgICBydW50
aW1lL0V4Y2VwdGlvbi5jcHAKICAgICBydW50aW1lL0V4Y2VwdGlvbkV2ZW50TG9jYXRpb24uY3Bw
CiAgICAgcnVudGltZS9FeGNlcHRpb25GdXp6LmNwcAogICAgIHJ1bnRpbWUvRXhjZXB0aW9uSGVs
cGVycy5jcHAKICAgICBydW50aW1lL0V4Y2VwdGlvblNjb3BlLmNwcAotICAgIHJ1bnRpbWUvRXhl
Y3V0YWJsZS5jcHAKKyAgICBydW50aW1lL0V4ZWN1dGFibGVCYXNlLmNwcAogICAgIHJ1bnRpbWUv
RnVuY3Rpb25Db25zdHJ1Y3Rvci5jcHAKKyAgICBydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJsZS5j
cHAKICAgICBydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJsZUR1bXAuY3BwCiAgICAgcnVudGltZS9G
dW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUuY3BwCiAgICAgcnVudGltZS9GdW5jdGlvblByb3RvdHlw
ZS5jcHAKQEAgLTc4Miw4ICs3ODQsMTAgQEAgc2V0KEphdmFTY3JpcHRDb3JlX1NPVVJDRVMKICAg
ICBydW50aW1lL01hdGhPYmplY3QuY3BwCiAgICAgcnVudGltZS9NZW1vcnlTdGF0aXN0aWNzLmNw
cAogICAgIHJ1bnRpbWUvTW9kdWxlTG9hZGVyUHJvdG90eXBlLmNwcAorICAgIHJ1bnRpbWUvTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUuY3BwCiAgICAgcnVudGltZS9OYXRpdmVFcnJvckNvbnN0cnVj
dG9yLmNwcAogICAgIHJ1bnRpbWUvTmF0aXZlRXJyb3JQcm90b3R5cGUuY3BwCisgICAgcnVudGlt
ZS9OYXRpdmVFeGVjdXRhYmxlLmNwcAogICAgIHJ1bnRpbWUvTmF0aXZlU3RkRnVuY3Rpb25DZWxs
LmNwcAogICAgIHJ1bnRpbWUvTnVsbEdldHRlckZ1bmN0aW9uLmNwcAogICAgIHJ1bnRpbWUvTnVs
bFNldHRlckZ1bmN0aW9uLmNwcApAQCAtNzk0LDYgKzc5OCw3IEBAIHNldChKYXZhU2NyaXB0Q29y
ZV9TT1VSQ0VTCiAgICAgcnVudGltZS9PYmplY3RQcm90b3R5cGUuY3BwCiAgICAgcnVudGltZS9P
cGVyYXRpb25zLmNwcAogICAgIHJ1bnRpbWUvT3B0aW9ucy5jcHAKKyAgICBydW50aW1lL1Byb2dy
YW1FeGVjdXRhYmxlLmNwcAogICAgIHJ1bnRpbWUvUHJvcGVydHlEZXNjcmlwdG9yLmNwcAogICAg
IHJ1bnRpbWUvUHJvcGVydHlTbG90LmNwcAogICAgIHJ1bnRpbWUvUHJvcGVydHlUYWJsZS5jcHAK
QEAgLTgxNSw2ICs4MjAsNyBAQCBzZXQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIHJ1bnRp
bWUvU2NvcGVPZmZzZXQuY3BwCiAgICAgcnVudGltZS9TY29wZWRBcmd1bWVudHMuY3BwCiAgICAg
cnVudGltZS9TY29wZWRBcmd1bWVudHNUYWJsZS5jcHAKKyAgICBydW50aW1lL1NjcmlwdEV4ZWN1
dGFibGUuY3BwCiAgICAgcnVudGltZS9TZXRDb25zdHJ1Y3Rvci5jcHAKICAgICBydW50aW1lL1Nl
dEl0ZXJhdG9yUHJvdG90eXBlLmNwcAogICAgIHJ1bnRpbWUvU2V0UHJvdG90eXBlLmNwcApAQCAt
ODM3LDkgKzg0Myw5IEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VSQ0VTCiAgICAgcnVudGltZS9T
eW1ib2xPYmplY3QuY3BwCiAgICAgcnVudGltZS9TeW1ib2xQcm90b3R5cGUuY3BwCiAgICAgcnVu
dGltZS9TeW1ib2xUYWJsZS5jcHAKLSAgICBydW50aW1lL1Rocm93U2NvcGUuY3BwCiAgICAgcnVu
dGltZS9UZW1wbGF0ZVJlZ2lzdHJ5LmNwcAogICAgIHJ1bnRpbWUvVGVzdFJ1bm5lclV0aWxzLmNw
cAorICAgIHJ1bnRpbWUvVGhyb3dTY29wZS5jcHAKICAgICBydW50aW1lL1R5cGVMb2NhdGlvbkNh
Y2hlLmNwcAogICAgIHJ1bnRpbWUvVHlwZVByb2ZpbGVyLmNwcAogICAgIHJ1bnRpbWUvVHlwZVBy
b2ZpbGVyTG9nLmNwcApAQCAtODU2LDYgKzg2Miw3IEBAIHNldChKYXZhU2NyaXB0Q29yZV9TT1VS
Q0VTCiAgICAgcnVudGltZS9XZWFrTWFwUHJvdG90eXBlLmNwcAogICAgIHJ1bnRpbWUvV2Vha1Nl
dENvbnN0cnVjdG9yLmNwcAogICAgIHJ1bnRpbWUvV2Vha1NldFByb3RvdHlwZS5jcHAKKyAgICBy
dW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0YWJsZS5jcHAKIAogICAgIHRvb2xzL0NvZGVQcm9maWxl
LmNwcAogICAgIHRvb2xzL0NvZGVQcm9maWxpbmcuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0ph
dmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAg
LTEwNzQsNiArMTA3NCwyMiBAQAogCQkxNDZBQUIzODBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJp
bmdSZWZDRi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSAxNDZBQUIzNzBCNjZBOTQ0MDBFNTVGMTYgLyogSlNTdHJpbmdSZWZDRi5jcHAgKi87IH07CiAJ
CTE0NkIxNkQ4MTJFQjVCNTkwMDFCRUMxQiAvKiBDb25zZXJ2YXRpdmVSb290cy5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDZCMTREQjEyRUI1QjEy
MDAxQkVDMUIgLyogQ29uc2VydmF0aXZlUm9vdHMuY3BwICovOyB9OwogCQkxNDZGRTUxMjExQTcx
MDQzMDA4N0FFNjYgLyogSklUQ2FsbDMyXzY0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0NkZFNTExMTFBNzEwNDMwMDg3QUU2NiAvKiBKSVRDYWxs
MzJfNjQuY3BwICovOyB9OworCQkxNDczNDFDQzFEQzAyRDcyMDBBQTI5QkEgLyogRXhlY3V0YWJs
ZUJhc2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0
NzM0MUNCMURDMDJENzIwMEFBMjlCQSAvKiBFeGVjdXRhYmxlQmFzZS5oICovOyBzZXR0aW5ncyA9
IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCTE0NzM0MUNFMURDMDJENzkwMEFB
MjlCQSAvKiBTY3JpcHRFeGVjdXRhYmxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFDRDFEQzAyRDc5MDBBQTI5QkEgLyogU2NyaXB0RXhlY3V0
YWJsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJ
CTE0NzM0MUQwMURDMDJEQjQwMEFBMjlCQSAvKiBOYXRpdmVFeGVjdXRhYmxlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFDRjFEQzAyREI0MDBB
QTI5QkEgLyogTmF0aXZlRXhlY3V0YWJsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0g
KFByaXZhdGUsICk7IH07IH07CisJCTE0NzM0MUQyMURDMDJFMkUwMEFBMjlCQSAvKiBFdmFsRXhl
Y3V0YWJsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MTQ3MzQxRDExREMwMkUyRTAwQUEyOUJBIC8qIEV2YWxFeGVjdXRhYmxlLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJMTQ3MzQxRDQxREMwMkU2RDAw
QUEyOUJBIC8qIFByb2dyYW1FeGVjdXRhYmxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFEMzFEQzAyRTZEMDBBQTI5QkEgLyogUHJvZ3JhbUV4
ZWN1dGFibGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OworCQkxNDczNDFENjFEQzAyRUI5MDBBQTI5QkEgLyogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0NzM0MUQ1
MURDMDJFQjkwMEFBMjlCQSAvKiBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZS5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCTE0NzM0MUQ4MURDMDJGOTkw
MEFBMjlCQSAvKiBGdW5jdGlvbkV4ZWN1dGFibGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0NzM0MUQ3MURDMDJGOTkwMEFBMjlCQSAvKiBGdW5jdGlv
bkV4ZWN1dGFibGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OworCQkxNDczNDFEQTFEQzAzMDAxMDBBQTI5QkEgLyogV2ViQXNzZW1ibHlFeGVjdXRhYmxl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFE
OTFEQzAzMDAxMDBBQTI5QkEgLyogV2ViQXNzZW1ibHlFeGVjdXRhYmxlLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJMTQ3MzQxRTIxREMyQ0U5NjAw
QUEyOUJBIC8qIEV2YWxFeGVjdXRhYmxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDE0NzM0MURCMURDMkNFOTYwMEFBMjlCQSAvKiBFdmFsRXhlY3V0
YWJsZS5jcHAgKi87IH07CisJCTE0NzM0MUUzMURDMkNFOTYwMEFBMjlCQSAvKiBGdW5jdGlvbkV4
ZWN1dGFibGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMTQ3MzQxREMxREMyQ0U5NjAwQUEyOUJBIC8qIEZ1bmN0aW9uRXhlY3V0YWJsZS5jcHAgKi87
IH07CisJCTE0NzM0MUU0MURDMkNFOTYwMEFBMjlCQSAvKiBNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDcz
NDFERDFEQzJDRTk2MDBBQTI5QkEgLyogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUuY3BwICovOyB9
OworCQkxNDczNDFFNTFEQzJDRTk2MDBBQTI5QkEgLyogTmF0aXZlRXhlY3V0YWJsZS5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFERTFEQzJD
RTk2MDBBQTI5QkEgLyogTmF0aXZlRXhlY3V0YWJsZS5jcHAgKi87IH07CisJCTE0NzM0MUU2MURD
MkNFOTYwMEFBMjlCQSAvKiBQcm9ncmFtRXhlY3V0YWJsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFERjFEQzJDRTk2MDBBQTI5QkEgLyog
UHJvZ3JhbUV4ZWN1dGFibGUuY3BwICovOyB9OworCQkxNDczNDFFNzFEQzJDRTk2MDBBQTI5QkEg
LyogU2NyaXB0RXhlY3V0YWJsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAxNDczNDFFMDFEQzJDRTk2MDBBQTI5QkEgLyogU2NyaXB0RXhlY3V0YWJs
ZS5jcHAgKi87IH07CisJCTE0NzM0MUU4MURDMkNFOTYwMEFBMjlCQSAvKiBXZWJBc3NlbWJseUV4
ZWN1dGFibGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gMTQ3MzQxRTExREMyQ0U5NjAwQUEyOUJBIC8qIFdlYkFzc2VtYmx5RXhlY3V0YWJsZS5jcHAg
Ki87IH07CisJCTE0NzM0MUVBMURDMkNGMjUwMEFBMjlCQSAvKiBFeGVjdXRhYmxlQmFzZS5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNDczNDFFOTFE
QzJDRjI1MDBBQTI5QkEgLyogRXhlY3V0YWJsZUJhc2UuY3BwICovOyB9OwogCQkxNDc0QzMzQjE2
QUEyRDk1MDA2MkYwMUQgLyogUHJvdG90eXBlTWFwLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEQ4NDRBMzE2QUEyQzcwMDBBNjVBRjAgLyogUHJvdG90
eXBlTWFwLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJMTQ3NEMzM0MxNkFBMkQ5QjAwNjJGMDFEIC8qIFByb3RvdHlwZU1hcC5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEQ4NDRBMjE2QUEyQzcwMDBB
NjVBRjAgLyogUHJvdG90eXBlTWFwLmNwcCAqLzsgfTsKIAkJMTQ3ODI5N0IxMzc5RThBODAwQTdD
MkEzIC8qIEhhbmRsZVR5cGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAxNDZGQTVBODEzNzhGNkIwMDAzNjI3QTMgLyogSGFuZGxlVHlwZXMuaCAqLzsg
c2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtMTQyMiw4ICsx
NDM4LDYgQEAKIAkJODZDNTY4RTAxMUEyMTNFRTAwMDdGN0YwIC8qIE1hY3JvQXNzZW1ibGVyQVJN
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2QzU2
OEREMTFBMjEzRUUwMDA3RjdGMCAvKiBNYWNyb0Fzc2VtYmxlckFSTS5jcHAgKi87IH07CiAJCTg2
QzU2OEUxMTFBMjEzRUUwMDA3RjdGMCAvKiBNYWNyb0Fzc2VtYmxlck1JUFMuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2QzU2OERFMTFBMjEzRUUwMDA3
RjdGMCAvKiBNYWNyb0Fzc2VtYmxlck1JUFMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
IChQcml2YXRlLCApOyB9OyB9OwogCQk4NkM1NjhFMjExQTIxM0VFMDAwN0Y3RjAgLyogTUlQU0Fz
c2VtYmxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
ODZDNTY4REYxMUEyMTNFRTAwMDdGN0YwIC8qIE1JUFNBc3NlbWJsZXIuaCAqLzsgc2V0dGluZ3Mg
PSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwotCQk4NkNBMDMyRTEwMzhFODQ0MDAy
OEE2MDkgLyogRXhlY3V0YWJsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA4NkNBMDMyRDEwMzhFODQ0MDAyOEE2MDkgLyogRXhlY3V0YWJsZS5jcHAg
Ki87IH07Ci0JCTg2Q0FGRUUzMTAzNURERTYwMDI4QTYwOSAvKiBFeGVjdXRhYmxlLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NkNBRkVFMjEwMzVEREU2
MDAyOEE2MDkgLyogRXhlY3V0YWJsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFBy
aXZhdGUsICk7IH07IH07CiAJCTg2Q0M4NUExMEVFNzlBNDcwMDI4ODY4MiAvKiBKSVRJbmxpbmVz
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NkNDODVB
MDBFRTc5QTQ3MDAyODg2ODIgLyogSklUSW5saW5lcy5oICovOyB9OwogCQk4NkNDODVBMzBFRTc5
Qjc0MDAyODg2ODIgLyogSklUQ2FsbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4NkNDODVBMjBFRTc5Qjc0MDAyODg2ODIgLyogSklUQ2FsbC5jcHAg
Ki87IH07CiAJCTg2Q0M4NUM0MEVFN0E4OTQwMDI4ODY4MiAvKiBKSVRQcm9wZXJ0eUFjY2Vzcy5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NkNDODVD
MzBFRTdBODk0MDAyODg2ODIgLyogSklUUHJvcGVydHlBY2Nlc3MuY3BwICovOyB9OwpAQCAtMzM4
MSw2ICszMzk1LDIyIEBACiAJCTE0NkIxNERCMTJFQjVCMTIwMDFCRUMxQiAvKiBDb25zZXJ2YXRp
dmVSb290cy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDb25zZXJ2
YXRpdmVSb290cy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0NkZBNUE4MTM3
OEY2QjAwMDM2MjdBMyAvKiBIYW5kbGVUeXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBIYW5kbGVUeXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNDZG
RTUxMTExQTcxMDQzMDA4N0FFNjYgLyogSklUQ2FsbDMyXzY0LmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpJVENhbGwzMl82NC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCTE0NzM0MUNCMURDMDJENzIwMEFBMjlCQSAvKiBFeGVjdXRhYmxlQmFzZS5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBFeGVjdXRhYmxlQmFzZS5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxNDczNDFDRDFEQzAyRDc5MDBBQTI5QkEgLyogU2Ny
aXB0RXhlY3V0YWJsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTY3JpcHRF
eGVjdXRhYmxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTE0NzM0MUNGMURDMDJE
QjQwMEFBMjlCQSAvKiBOYXRpdmVFeGVjdXRhYmxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IE5hdGl2ZUV4ZWN1dGFibGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJMTQ3MzQxRDExREMwMkUyRTAwQUEyOUJBIC8qIEV2YWxFeGVjdXRhYmxlLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEV2YWxFeGVjdXRhYmxlLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTE0NzM0MUQzMURDMDJFNkQwMEFBMjlCQSAvKiBQcm9ncmFtRXhlY3V0
YWJsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQcm9ncmFtRXhlY3V0YWJs
ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxNDczNDFENTFEQzAyRUI5MDBBQTI5
QkEgLyogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJMTQ3MzQxRDcxREMwMkY5OTAwQUEyOUJBIC8qIEZ1bmN0aW9uRXhlY3V0YWJsZS5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBGdW5jdGlvbkV4ZWN1dGFibGUuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTQ3MzQxRDkxREMwMzAwMTAwQUEyOUJBIC8q
IFdlYkFzc2VtYmx5RXhlY3V0YWJsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBXZWJBc3NlbWJseUV4ZWN1dGFibGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MTQ3MzQxREIxREMyQ0U5NjAwQUEyOUJBIC8qIEV2YWxFeGVjdXRhYmxlLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEV2YWxFeGVjdXRhYmxlLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTQ3MzQxREMxREMyQ0U5NjAwQUEyOUJBIC8qIEZ1bmN0aW9u
RXhlY3V0YWJsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBGdW5j
dGlvbkV4ZWN1dGFibGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxNDczNDFE
RDFEQzJDRTk2MDBBQTI5QkEgLyogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxNDczNDFERTFEQzJDRTk2MDBBQTI5QkEg
LyogTmF0aXZlRXhlY3V0YWJsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBOYXRpdmVFeGVjdXRhYmxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MTQ3MzQxREYxREMyQ0U5NjAwQUEyOUJBIC8qIFByb2dyYW1FeGVjdXRhYmxlLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFByb2dyYW1FeGVjdXRhYmxlLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTQ3MzQxRTAxREMyQ0U5NjAwQUEyOUJBIC8qIFNj
cmlwdEV4ZWN1dGFibGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
U2NyaXB0RXhlY3V0YWJsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTE0NzM0
MUUxMURDMkNFOTYwMEFBMjlCQSAvKiBXZWJBc3NlbWJseUV4ZWN1dGFibGUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV2ViQXNzZW1ibHlFeGVjdXRhYmxlLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTQ3MzQxRTkxREMyQ0YyNTAwQUEyOUJBIC8q
IEV4ZWN1dGFibGVCYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9
IEV4ZWN1dGFibGVCYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQ3Qjgz
QUEwRTZEQjhDOTAwNDc3NUE0IC8qIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0N0I4NDYyMEU2REU2QjEwMDQ3NzVBNCAv
KiBQdXRQcm9wZXJ0eVNsb3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUHV0
UHJvcGVydHlTbG90Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTE0ODBEQjlCMERE
QzIyN0YwMDNDRkRGMiAvKiBEZWJ1Z2dlckNhbGxGcmFtZS5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBEZWJ1Z2dlckNhbGxGcmFtZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtMzc5Miw4ICszODIyLDYgQEAKIAkJODZDNTY4REQxMUEyMTNFRTAwMDdGN0YwIC8q
IE1hY3JvQXNzZW1ibGVyQVJNLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IE1hY3JvQXNzZW1ibGVyQVJNLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
ODZDNTY4REUxMUEyMTNFRTAwMDdGN0YwIC8qIE1hY3JvQXNzZW1ibGVyTUlQUy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBNYWNyb0Fzc2VtYmxlck1JUFMuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJODZDNTY4REYxMUEyMTNFRTAwMDdGN0YwIC8qIE1JUFNBc3Nl
bWJsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTUlQU0Fzc2VtYmxlci5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk4NkNBMDMyRDEwMzhFODQ0MDAyOEE2MDkg
LyogRXhlY3V0YWJsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBF
eGVjdXRhYmxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJODZDQUZFRTIxMDM1
RERFNjAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gRXhlY3V0YWJsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4NkNDODVB
MDBFRTc5QTQ3MDAyODg2ODIgLyogSklUSW5saW5lcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKSVRJbmxpbmVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTg2
Q0M4NUEyMEVFNzlCNzQwMDI4ODY4MiAvKiBKSVRDYWxsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IEpJVENhbGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk4NkNDODVDMzBFRTdBODk0MDAyODg2ODIgLyogSklUUHJvcGVydHlBY2Nlc3MuY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSklUUHJvcGVydHlBY2Nlc3MuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNTk5Myw2ICs2MDIxLDcgQEAKIAkJCQkx
NEExNTYzMDEwOTY2MzY1MDA2RkEyNjAgLyogRGF0ZUluc3RhbmNlQ2FjaGUuaCAqLywKIAkJCQlC
Q0QyMDM0NzBFMTcxMzVFMDAyQzdFODIgLyogRGF0ZVByb3RvdHlwZS5jcHAgKi8sCiAJCQkJQkNE
MjAzNDgwRTE3MTM1RTAwMkM3RTgyIC8qIERhdGVQcm90b3R5cGUuaCAqLywKKwkJCQkxNjk5NDhF
REU2OEQ0MDU0QjAxRUY3OTcgLyogRGVmaW5lUHJvcGVydHlBdHRyaWJ1dGVzLmggKi8sCiAJCQkJ
MEZFMDUwMEYxQUE5MDkxMTAwRDMzQjMzIC8qIERpcmVjdEFyZ3VtZW50cy5jcHAgKi8sCiAJCQkJ
MEZFMDUwMTAxQUE5MDkxMTAwRDMzQjMzIC8qIERpcmVjdEFyZ3VtZW50cy5oICovLAogCQkJCTBG
RTA1MDBEMUFBOTA5MTEwMEQzM0IzMyAvKiBEaXJlY3RBcmd1bWVudHNPZmZzZXQuY3BwICovLApA
QCAtNjAxMiw2ICs2MDQxLDggQEAKIAkJCQlCQzAyRTk4QjBFMTgzRTM4MDAwRjkyOTcgLyogRXJy
b3JJbnN0YW5jZS5oICovLAogCQkJCUJDMDJFOTA2MEUxODM5REIwMDBGOTI5NyAvKiBFcnJvclBy
b3RvdHlwZS5jcHAgKi8sCiAJCQkJQkMwMkU5MDcwRTE4MzlEQjAwMEY5Mjk3IC8qIEVycm9yUHJv
dG90eXBlLmggKi8sCisJCQkJMTQ3MzQxREIxREMyQ0U5NjAwQUEyOUJBIC8qIEV2YWxFeGVjdXRh
YmxlLmNwcCAqLywKKwkJCQkxNDczNDFEMTFEQzAyRTJFMDBBQTI5QkEgLyogRXZhbEV4ZWN1dGFi
bGUuaCAqLywKIAkJCQlGRTFDMEZGRTFCMTk0RkQxMDBCNTNGQ0EgLyogRXhjZXB0aW9uLmNwcCAq
LywKIAkJCQlGRTFDMEZGQzFCMTkzRTk4MDBCNTNGQ0EgLyogRXhjZXB0aW9uLmggKi8sCiAJCQkJ
RkU4MEMxOUExRDc3NjhGRDAwODUxMEMwIC8qIEV4Y2VwdGlvbkV2ZW50TG9jYXRpb24uY3BwICov
LApAQCAtNjAyMiwxMiArNjA1MywxNCBAQAogCQkJCUE3MjcwMUIzMERBREU5NDkwMEU1NDhENyAv
KiBFeGNlcHRpb25IZWxwZXJzLmggKi8sCiAJCQkJRkU2NDkxMzgxRDc4RjNBMzAwQTY5NEQ0IC8q
IEV4Y2VwdGlvblNjb3BlLmNwcCAqLywKIAkJCQlGRTY0OTEzNjFENzhGMDEzMDBBNjk0RDQgLyog
RXhjZXB0aW9uU2NvcGUuaCAqLywKLQkJCQk4NkNBMDMyRDEwMzhFODQ0MDAyOEE2MDkgLyogRXhl
Y3V0YWJsZS5jcHAgKi8sCi0JCQkJODZDQUZFRTIxMDM1RERFNjAwMjhBNjA5IC8qIEV4ZWN1dGFi
bGUuaCAqLywKKwkJCQkxNDczNDFFOTFEQzJDRjI1MDBBQTI5QkEgLyogRXhlY3V0YWJsZUJhc2Uu
Y3BwICovLAorCQkJCTE0NzM0MUNCMURDMDJENzIwMEFBMjlCQSAvKiBFeGVjdXRhYmxlQmFzZS5o
ICovLAogCQkJCUE3QThBRjI5MTdBREI1RjMwMDVBQjE3NCAvKiBGbG9hdDMyQXJyYXkuaCAqLywK
IAkJCQlBN0E4QUYyQTE3QURCNUYzMDA1QUIxNzQgLyogRmxvYXQ2NEFycmF5LmggKi8sCiAJCQkJ
QkMyNjgwQzAwRTE2RDRFOTAwQTA2RTkyIC8qIEZ1bmN0aW9uQ29uc3RydWN0b3IuY3BwICovLAog
CQkJCUJDMjY4MEMxMEUxNkQ0RTkwMEEwNkU5MiAvKiBGdW5jdGlvbkNvbnN0cnVjdG9yLmggKi8s
CisJCQkJMTQ3MzQxREMxREMyQ0U5NjAwQUEyOUJBIC8qIEZ1bmN0aW9uRXhlY3V0YWJsZS5jcHAg
Ki8sCisJCQkJMTQ3MzQxRDcxREMwMkY5OTAwQUEyOUJBIC8qIEZ1bmN0aW9uRXhlY3V0YWJsZS5o
ICovLAogCQkJCTBGQjRCNTIxMTZCNjI3OEQwMDNGNjk2QiAvKiBGdW5jdGlvbkV4ZWN1dGFibGVE
dW1wLmNwcCAqLywKIAkJCQkwRkI0QjUyMjE2QjYyNzhEMDAzRjY5NkIgLyogRnVuY3Rpb25FeGVj
dXRhYmxlRHVtcC5oICovLAogCQkJCTUyQjMxMEZDMTk3NEFFODcwMDgwODU3QyAvKiBGdW5jdGlv
bkhhc0V4ZWN1dGVkQ2FjaGUuY3BwICovLApAQCAtNjI4MiwxMCArNjMxNSwxNCBAQAogCQkJCTdD
MDA4Q0U1MTg3NjMxQjYwMDk1NUMyNCAvKiBNaWNyb3Rhc2suaCAqLywKIAkJCQlFMzU1RjM1MDFC
N0RDODUzMDBDNTBEQzUgLyogTW9kdWxlTG9hZGVyUHJvdG90eXBlLmNwcCAqLywKIAkJCQlFMzU1
RjM1MTFCN0RDODUzMDBDNTBEQzUgLyogTW9kdWxlTG9hZGVyUHJvdG90eXBlLmggKi8sCisJCQkJ
MTQ3MzQxREQxREMyQ0U5NjAwQUEyOUJBIC8qIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmNwcCAq
LywKKwkJCQkxNDczNDFENTFEQzAyRUI5MDBBQTI5QkEgLyogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUuaCAqLywKIAkJCQlCQzAyRTkwODBFMTgzOURCMDAwRjkyOTcgLyogTmF0aXZlRXJyb3JDb25z
dHJ1Y3Rvci5jcHAgKi8sCiAJCQkJQkMwMkU5MDkwRTE4MzlEQjAwMEY5Mjk3IC8qIE5hdGl2ZUVy
cm9yQ29uc3RydWN0b3IuaCAqLywKIAkJCQlCQzAyRTkwQTBFMTgzOURCMDAwRjkyOTcgLyogTmF0
aXZlRXJyb3JQcm90b3R5cGUuY3BwICovLAogCQkJCUJDMDJFOTBCMEUxODM5REIwMDBGOTI5NyAv
KiBOYXRpdmVFcnJvclByb3RvdHlwZS5oICovLAorCQkJCTE0NzM0MURFMURDMkNFOTYwMEFBMjlC
QSAvKiBOYXRpdmVFeGVjdXRhYmxlLmNwcCAqLywKKwkJCQkxNDczNDFDRjFEQzAyREI0MDBBQTI5
QkEgLyogTmF0aXZlRXhlY3V0YWJsZS5oICovLAogCQkJCUUzM0U4RDFFMUI5MDEzREUwMDM0NkI1
MiAvKiBOYXRpdmVTdGRGdW5jdGlvbkNlbGwuY3BwICovLAogCQkJCUUzM0U4RDFGMUI5MDEzREUw
MDM0NkI1MiAvKiBOYXRpdmVTdGRGdW5jdGlvbkNlbGwuaCAqLywKIAkJCQk2NTQ2RjUxRjFBMzJB
NTlDMDA2RjA3RDUgLyogTnVsbEdldHRlckZ1bmN0aW9uLmNwcCAqLywKQEAgLTYzMDgsNiArNjM0
NSw4IEBACiAJCQkJMEZFMjI4RUExNDM2QUIyMzAwMTk2QzQ4IC8qIE9wdGlvbnMuY3BwICovLAog
CQkJCTBGRTIyOEVCMTQzNkFCMjMwMDE5NkM0OCAvKiBPcHRpb25zLmggKi8sCiAJCQkJODY4OTE2
QTkxNTVGMjg1NDAwQ0IyQjlBIC8qIFByaXZhdGVOYW1lLmggKi8sCisJCQkJMTQ3MzQxREYxREMy
Q0U5NjAwQUEyOUJBIC8qIFByb2dyYW1FeGVjdXRhYmxlLmNwcCAqLywKKwkJCQkxNDczNDFEMzFE
QzAyRTZEMDBBQTI5QkEgLyogUHJvZ3JhbUV4ZWN1dGFibGUuaCAqLywKIAkJCQlBN0ZCNjBBMzEw
M0Y3REMyMDAxN0EyODYgLyogUHJvcGVydHlEZXNjcmlwdG9yLmNwcCAqLywKIAkJCQlBN0ZCNjA0
QjEwM0Y1RUFCMDAxN0EyODYgLyogUHJvcGVydHlEZXNjcmlwdG9yLmggKi8sCiAJCQkJQkM5NTQz
N0MwRUJBNzBGRDAwNzJCNkQzIC8qIFByb3BlcnR5TWFwSGFzaFRhYmxlLmggKi8sCkBAIC02MzY0
LDYgKzY0MDMsOCBAQAogCQkJCTBGRTA1MDIwMUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZWRBcmd1
bWVudHNUYWJsZS5oICovLAogCQkJCTBGRTA1MDIxMUFBOTA5NTYwMEQzM0IzMyAvKiBTY29wZU9m
ZnNldC5jcHAgKi8sCiAJCQkJMEZFMDUwMjIxQUE5MDk1NjAwRDMzQjMzIC8qIFNjb3BlT2Zmc2V0
LmggKi8sCisJCQkJMTQ3MzQxRTAxREMyQ0U5NjAwQUEyOUJBIC8qIFNjcmlwdEV4ZWN1dGFibGUu
Y3BwICovLAorCQkJCTE0NzM0MUNEMURDMDJENzkwMEFBMjlCQSAvKiBTY3JpcHRFeGVjdXRhYmxl
LmggKi8sCiAJCQkJQTcyOTlEQTMxN0QxMjg1ODAwNUY1RkY5IC8qIFNldENvbnN0cnVjdG9yLmNw
cCAqLywKIAkJCQlBNzI5OURBNDE3RDEyODU4MDA1RjVGRjkgLyogU2V0Q29uc3RydWN0b3IuaCAq
LywKIAkJCQlBNzkwREQ2NzE4MkY0OTk3MDA1ODg4MDcgLyogU2V0SXRlcmF0b3JQcm90b3R5cGUu
Y3BwICovLApAQCAtNjQ2NSw5ICs2NTA2LDEwIEBACiAJCQkJNzA5RkI4NjQxQUUzMzVDNjAwMzlE
MDY5IC8qIFdlYWtTZXRDb25zdHJ1Y3Rvci5oICovLAogCQkJCTcwOUZCODY1MUFFMzM1QzYwMDM5
RDA2OSAvKiBXZWFrU2V0UHJvdG90eXBlLmNwcCAqLywKIAkJCQk3MDlGQjg2NjFBRTMzNUM2MDAz
OUQwNjkgLyogV2Vha1NldFByb3RvdHlwZS5oICovLAorCQkJCTE0NzM0MUUxMURDMkNFOTYwMEFB
MjlCQSAvKiBXZWJBc3NlbWJseUV4ZWN1dGFibGUuY3BwICovLAorCQkJCTE0NzM0MUQ5MURDMDMw
MDEwMEFBMjlCQSAvKiBXZWJBc3NlbWJseUV4ZWN1dGFibGUuaCAqLywKIAkJCQlBN0RDQjc3OTEy
RTNEOTA1MDA5MTE5NDAgLyogV3JpdGVCYXJyaWVyLmggKi8sCiAJCQkJQzJCNkQ3NTIxOEEzMzc5
MzAwNEE5MzAxIC8qIFdyaXRlQmFycmllcklubGluZXMuaCAqLywKLQkJCQkxNjk5NDhFREU2OEQ0
MDU0QjAxRUY3OTcgLyogRGVmaW5lUHJvcGVydHlBdHRyaWJ1dGVzLmggKi8sCiAJCQkpOwogCQkJ
cGF0aCA9IHJ1bnRpbWU7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwpAQCAtNzU0Miw2ICs3
NTg0LDcgQEAKIAkJCQkwRkVDODUwQzFCREFDREFDMDA4MEZGNzQgLyogQjNDb21tdXRhdGl2aXR5
LmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkVDODUwRTFCREFDREFDMDA4MEZGNzQgLyogQjNDb25z
dDMyVmFsdWUuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRUM4NTEwMUJEQUNEQUMwMDgwRkY3NCAv
KiBCM0NvbnN0NjRWYWx1ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMTQ3MzQxRDQxREMwMkU2RDAw
QUEyOUJBIC8qIFByb2dyYW1FeGVjdXRhYmxlLmggaW4gSGVhZGVycyAqLywKIAkJCQkwRkVDODUx
MjFCREFDREFDMDA4MEZGNzQgLyogQjNDb25zdERvdWJsZVZhbHVlLmggaW4gSGVhZGVycyAqLywK
IAkJCQkwRkVDODVCMzFCREVEOTU3MDA4MEZGNzQgLyogQjNDb25zdFB0clZhbHVlLmggaW4gSGVh
ZGVycyAqLywKIAkJCQkwRkVDODVDMTFCRTE2N0EwMDA4MEZGNzQgLyogQjNFZmZlY3RzLmggaW4g
SGVhZGVycyAqLywKQEAgLTc4MjIsNiArNzg2NSw3IEBACiAJCQkJQTczQTUzNUIxNzk5Q0Q1RDAw
MTcwQzE5IC8qIERGR0xhenlKU1ZhbHVlLmggaW4gSGVhZGVycyAqLywKIAkJCQk2MkYyQUEzODFC
MEJFREUzMDA2MTBDN0EgLyogREZHTGF6eU5vZGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUE3RDlB
Mjk4MTdBMEJDNzQwMEVFMjYxOCAvKiBERkdMSUNNUGhhc2UuaCBpbiBIZWFkZXJzICovLAorCQkJ
CTE0NzM0MUQyMURDMDJFMkUwMEFBMjlCQSAvKiBFdmFsRXhlY3V0YWJsZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJOTlENkExMTYxQkVBRDM0RDAwRTI1QzM3IC8qIFJlbW90ZUF1dG9tYXRpb25UYXJn
ZXQuaCBpbiBIZWFkZXJzICovLAogCQkJCTc5QzRCMTVFMUJBMjE1OEYwMEZENTkyRSAvKiBERkdM
aXZlQ2F0Y2hWYXJpYWJsZVByZXNlcnZhdGlvblBoYXNlLmggaW4gSGVhZGVycyAqLywKIAkJCQkw
Rjg2QTI2RjFENkY3QjMzMDBDQjBDOTIgLyogR0NUeXBlTWFwLmggaW4gSGVhZGVycyAqLywKQEAg
LTc5MjksNiArNzk3Myw3IEBACiAJCQkJMEZGRkM5NjAxNEVGOTBCRDAwQzcyNTMyIC8qIERGR1Zp
cnR1YWxSZWdpc3RlckFsbG9jYXRpb25QaGFzZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZDOTdG
NDIxODIwMjExOTAwMkM5QjI2IC8qIERGR1dhdGNocG9pbnRDb2xsZWN0aW9uUGhhc2UuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTBGREIyQ0U4MTc0ODMwQTIwMDdCM0MxQiAvKiBERkdXb3JrbGlzdC5o
IGluIEhlYWRlcnMgKi8sCisJCQkJMTQ3MzQxREExREMwMzAwMTAwQUEyOUJBIC8qIFdlYkFzc2Vt
Ymx5RXhlY3V0YWJsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEYwNzBBNDkxRDU0M0E5MzAwNkU3
MjMyIC8qIEhlYXBDZWxsSW5saW5lcy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZFMDUwMTgxQUE5
MDkxMTAwRDMzQjMzIC8qIERpcmVjdEFyZ3VtZW50cy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMEZF
MDUwMTYxQUE5MDkxMTAwRDMzQjMzIC8qIERpcmVjdEFyZ3VtZW50c09mZnNldC5oIGluIEhlYWRl
cnMgKi8sCkBAIC03OTUyLDcgKzc5OTcsNiBAQAogCQkJCUZFMUMwRkZEMUIxOTNFOTgwMEI1M0ZD
QSAvKiBFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAogCQkJCTBGMTJERTEwMTk3OUQ1RkQwMDA2
RkY0RSAvKiBFeGNlcHRpb25GdXp6LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzE4QzQwMDBFMTZG
NUNEMDBCMzQ0NjAgLyogRXhjZXB0aW9uSGVscGVycy5oIGluIEhlYWRlcnMgKi8sCi0JCQkJODZD
QUZFRTMxMDM1RERFNjAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTBGRjA1NEZBMUFDMzVCNDQwMEU1QkU1NyAvKiBFeGVjdXRhYmxlQWxsb2NhdGlvbkZ1enouaCBp
biBIZWFkZXJzICovLAogCQkJCUE3NjZCNDRGMEVFOERDRDEwMDk1MThDQSAvKiBFeGVjdXRhYmxl
QWxsb2NhdG9yLmggaW4gSGVhZGVycyAqLywKIAkJCQkxNDE0MkU1MzFCNzk2RUREMDBGNEJGNEIg
LyogRXhlY3V0YWJsZUluZm8uaCBpbiBIZWFkZXJzICovLApAQCAtNzk3Myw2ICs4MDE3LDcgQEAK
IAkJCQkwRjZCOEFFNTFDNEVGRTE3MDA5NjkwNTIgLyogQjNGaXhTU0EuaCBpbiBIZWFkZXJzICov
LAogCQkJCTBGRUEwQTBBMTcwNTEzREIwMEJCNzIyQyAvKiBGVExDYXBhYmlsaXRpZXMuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTBGRUEwQTIzMTcwOTYwNjkwMEJCNzIyQyAvKiBGVExDb21tb25WYWx1
ZXMuaCBpbiBIZWFkZXJzICovLAorCQkJCTE0NzM0MUQ4MURDMDJGOTkwMEFBMjlCQSAvKiBGdW5j
dGlvbkV4ZWN1dGFibGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRUEwQTBDMTcwNTEzREIwMEJC
NzIyQyAvKiBGVExDb21waWxlLmggaW4gSGVhZGVycyAqLywKIAkJCQkwRjIzNUJENDE3MTc4RTFD
MDA2OTBDN0YgLyogRlRMRXhpdEFyZ3VtZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQlBRDJGQ0JG
OTFEQjU4REFEMDBCM0U3MzYgLyogV2ViQXNzZW1ibHlSdW50aW1lRXJyb3JDb25zdHJ1Y3Rvci5o
IGluIEhlYWRlcnMgKi8sCkBAIC04MTUyLDYgKzgxOTcsNyBAQAogCQkJCUExQjlFMjNBMUI0RTBE
NjcwMEJDN0ZFRCAvKiBJbnRsQ29sbGF0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJCUExQjlFMjND
MUI0RTBENjcwMEJDN0ZFRCAvKiBJbnRsQ29sbGF0b3JDb25zdHJ1Y3Rvci5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQTE4MTkzRTMxQjRFMENEQjAwRkMxMDI5IC8qIEludGxDb2xsYXRvckNvbnN0cnVj
dG9yLmx1dC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMTQ3MzQxQ0UxREMwMkQ3OTAwQUEyOUJBIC8q
IFNjcmlwdEV4ZWN1dGFibGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUExQjlFMjNFMUI0RTBENjcw
MEJDN0ZFRCAvKiBJbnRsQ29sbGF0b3JQcm90b3R5cGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUEx
ODE5M0U0MUI0RTBDREIwMEZDMTAyOSAvKiBJbnRsQ29sbGF0b3JQcm90b3R5cGUubHV0LmggaW4g
SGVhZGVycyAqLywKIAkJCQkwRkE3NjIwNTFEQjkyNDI5MDBCN0EyRkQgLyogQ29sbGVjdGlvblNj
b3BlLmggaW4gSGVhZGVycyAqLywKQEAgLTg0MzQsNiArODQ4MCw3IEBACiAJCQkJODYxMkU0Q0Qx
NTIzODlFQzAwQzgzNkJFIC8qIE1hdGNoUmVzdWx0LmggaW4gSGVhZGVycyAqLywKIAkJCQk0MzQw
QTQ4NTFBOTA1MUFGMDBENzNDQ0EgLyogTWF0aENvbW1vbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
QkMxOEM0M0MwRTE2RjVDRDAwQjM0NDYwIC8qIE1hdGhPYmplY3QuaCBpbiBIZWFkZXJzICovLAor
CQkJCTE0NzM0MUNDMURDMDJENzIwMEFBMjlCQSAvKiBFeGVjdXRhYmxlQmFzZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJOTAyMTNFM0UxMjNBNDBDMjAwRDQyMkYzIC8qIE1lbW9yeVN0YXRpc3RpY3Mu
aCBpbiBIZWFkZXJzICovLAogCQkJCTBGQjU0NjdCMTRGNUM3RTEwMDJDMjk4OSAvKiBNZXRob2RP
ZkdldHRpbmdBVmFsdWVQcm9maWxlLmggaW4gSGVhZGVycyAqLywKIAkJCQk3QzAwOENFNzE4NzYz
MUI2MDA5NTVDMjQgLyogTWljcm90YXNrLmggaW4gSGVhZGVycyAqLywKQEAgLTg2MTIsNiArODY1
OSw3IEBACiAJCQkJMTQyRTMxM0IxMzRGRjBBNjAwQUZBREI1IC8qIFN0cm9uZy5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMTQ1NzIyODYxNDM3RTE0MDAwNUZERTI2IC8qIFN0cm9uZ0lubGluZXMuaCBp
biBIZWFkZXJzICovLAogCQkJCUJDREUzQUI4MEU2QzgyRjUwMDE0NTNBNyAvKiBTdHJ1Y3R1cmUu
aCBpbiBIZWFkZXJzICovLAorCQkJCTE0NzM0MUQ2MURDMDJFQjkwMEFBMjlCQSAvKiBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJN0U0RUU3MDkwRUJCNzk2MzAw
NTkzNEFBIC8qIFN0cnVjdHVyZUNoYWluLmggaW4gSGVhZGVycyAqLywKIAkJCQlGRTY0OTEzNzFE
NzhGMDFEMDBBNjk0RDQgLyogRXhjZXB0aW9uU2NvcGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTJB
QUFBMzEyMThCRDQ5RDEwMDM5NENDOCAvKiBTdHJ1Y3R1cmVJREJsb2IuaCBpbiBIZWFkZXJzICov
LApAQCAtODY3Miw2ICs4NzIwLDcgQEAKIAkJCQlBN0U1QUIzOTE3OTlFNEIyMDBEMjgzM0QgLyog
VURpczg2RGlzYXNzZW1ibGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk3OURGQ0JEQjFEODhDNTk2
MDA1MjdEMDMgLyogSGFzT3duUHJvcGVydHlDYWNoZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTdB
OEFGNDExN0FEQjVGMzAwNUFCMTc0IC8qIFVpbnQxNkFycmF5LmggaW4gSGVhZGVycyAqLywKKwkJ
CQkxNDczNDFEMDFEQzAyREI0MDBBQTI5QkEgLyogTmF0aXZlRXhlY3V0YWJsZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJODY2NzM5RDMxM0JGREU3MTAwMjNEODdDIC8qIFVpbnQxNldpdGhGcmFjdGlv
bi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTdBOEFGNDIxN0FEQjVGMzAwNUFCMTc0IC8qIFVpbnQz
MkFycmF5LmggaW4gSGVhZGVycyAqLywKIAkJCQlBN0E4QUYzRjE3QURCNUYzMDA1QUIxNzQgLyog
VWludDhBcnJheS5oIGluIEhlYWRlcnMgKi8sCkBAIC05NDAwLDYgKzk0NDksNyBAQAogCQkJCTBG
MkQ0REREMTk4MzJEMzQwMDdENEIxOSAvKiBEZWJ1Z2dlclNjb3BlLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTJBN0E1OEVGMTgwOEE0QzQwMDIwQkRGNyAvKiBEZWZlckdDLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGQzcxMkRFMTdDRDg3NzkwMDhDQzkzQyAvKiBEZWZlcnJlZENvbXBpbGF0aW9u
Q2FsbGJhY2suY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMTQ3MzQxRUExREMyQ0YyNTAwQUEyOUJB
IC8qIEV4ZWN1dGFibGVCYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUZFNTA2ODY3MUFFMjVF
MjgwMDA5REFCNyAvKiBEZWZlcnJlZFNvdXJjZUR1bXAuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
QTc3QTQyM0QxN0EwQkJGRDAwQThEQjgxIC8qIERGR0Fic3RyYWN0SGVhcC5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQkwRjU1QzE5NDE3Mjc2RTQ2MDBDRUFCRkQgLyogREZHQWJzdHJhY3RWYWx1ZS5j
cHAgaW4gU291cmNlcyAqLywKQEAgLTk0ODksNiArOTUzOSw3IEBACiAJCQkJMEY1ODc0RUQxOTRG
RUIxMjAwQUFCMkMxIC8qIERGR01heUV4aXQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEYxNzI1
RkYxQjQ4NzE5QTAwQUMzQTU1IC8qIERGR01pbmlmaWVkR3JhcGguY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJMEYyQkRDNEQxNTIyODE4NjAwQ0Q4OTEwIC8qIERGR01pbmlmaWVkTm9kZS5jcHAgaW4g
U291cmNlcyAqLywKKwkJCQkxNDczNDFFNTFEQzJDRTk2MDBBQTI5QkEgLyogTmF0aXZlRXhlY3V0
YWJsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjhGMTQzNTFBREYwOTAxMDBFRDc5MkMgLyog
REZHTW92SGludFJlbW92YWxQaGFzZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkYyQ0Q1QjFC
NjFBNEY4MDA0OTU1QTggLyogREZHTXVsdGlHZXRCeU9mZnNldERhdGEuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQTczNzgxMEQxNzk5RUEyRTAwODE3NTMzIC8qIERGR05hdHVyYWxMb29wcy5jcHAg
aW4gU291cmNlcyAqLywKQEAgLTk1MTgsMTEgKzk1NjksMTMgQEAKIAkJCQkwRjM5MkM4OTFCNDYx
ODg0MDA4NDQ3MjggLyogREZHT1NSRXhpdEZ1enouY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZF
RkM5QUExNjgxQTNCMzAwNTY3RjUzIC8qIERGR09TUkV4aXRKdW1wUGxhY2Vob2xkZXIuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJMEYyMzVCRUQxNzE3OEU3MzAwNjkwQzdGIC8qIERGR09TUkV4aXRQ
cmVwYXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkxNDczNDFFMzFEQzJDRTk2MDBBQTI5
QkEgLyogRnVuY3Rpb25FeGVjdXRhYmxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGNjIzNzk3
MUFFNDVDQTcwMEQ0MDJFQSAvKiBERkdQaGFudG9tSW5zZXJ0aW9uUGhhc2UuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJMEZGRkM5NUIxNEVGOTBBRDAwQzcyNTMyIC8qIERGR1BoYXNlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTBGMkI5Q0VBMTlEMEJBN0QwMEIxRDFCNSAvKiBERkdQaGlDaGlsZHJl
bi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBNzhBOTc3QTE3OTczOEI4MDA5REY3NDQgLyogREZH
UGxhbi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRkJFMEY3NDE2QzFEQjA5MDA4MkM1RTggLyog
REZHUHJlZGljdGlvbkluamVjdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE0NzM0
MUU4MURDMkNFOTYwMEFBMjlCQSAvKiBXZWJBc3NlbWJseUV4ZWN1dGFibGUuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJMEZGRkM5NUQxNEVGOTBCMzAwQzcyNTMyIC8qIERGR1ByZWRpY3Rpb25Qcm9w
YWdhdGlvblBoYXNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGM0UwMUFBMTlEMzUzQTUwMEY2
MUI3RiAvKiBERkdQcmVQb3N0TnVtYmVyaW5nLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGMkI5
Q0VDMTlEMEJBN0QwMEIxRDFCNSAvKiBERkdQcm9tb3RlZEhlYXBMb2NhdGlvbi5jcHAgaW4gU291
cmNlcyAqLywKQEAgLTk1MzMsNiArOTU4Niw3IEBACiAJCQkJODZFQzlERDIxMzI4REY4MjAwMkIy
QUQ3IC8qIERGR1NwZWN1bGF0aXZlSklULmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2ODgwRjFG
MTQzMjhCQjkwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTg2ODgwRjREMTQzNTNCMjEwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDY0
LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE0NzM0MUU2MURDMkNFOTYwMEFBMjlCQSAvKiBQcm9n
cmFtRXhlY3V0YWJsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjY4MkZCMjE5QkNCMzY0MDBG
QTNCQUQgLyogREZHU1NBQ2FsY3VsYXRvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0Q4OUNG
RjE3QTBCOENDMDA3NzNBRDggLyogREZHU1NBQ29udmVyc2lvblBoYXNlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTBGQzIwQ0I5MTg1NTZBMzUwMEM5RTk1NCAvKiBERkdTU0FMb3dlcmluZ1BoYXNl
LmNwcCBpbiBTb3VyY2VzICovLApAQCAtOTU4NSw3ICs5NjM5LDYgQEAKIAkJCQkwRjEyREUwRjE5
NzlENUZEMDAwNkZGNEUgLyogRXhjZXB0aW9uRnV6ei5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlE
Q0YzRDU2OTFDRDI5NDZEMDAzRDVDNjUgLyogTGF6eUNsYXNzU3RydWN0dXJlLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTE0MjlEODc4MEVEMjFBQ0QwMEI4OTYxOSAvKiBFeGNlcHRpb25IZWxwZXJz
LmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTg2Q0EwMzJFMTAzOEU4NDQwMDI4QTYwOSAvKiBFeGVj
dXRhYmxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRjA1NEY5MUFDMzVCNDQwMEU1QkU1NyAv
KiBFeGVjdXRhYmxlQWxsb2NhdGlvbkZ1enouY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTdCNDhG
NDkwRUU4OTM2RjAwRENCREI2IC8qIEV4ZWN1dGFibGVBbGxvY2F0b3IuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJODZEQjY0NjQwRjk1QzZGQzAwRDdEOTIxIC8qIEV4ZWN1dGFibGVBbGxvY2F0b3JG
aXhlZFZNUG9vbC5jcHAgaW4gU291cmNlcyAqLywKQEAgLTk3MTEsNiArOTc2NCw3IEBACiAJCQkJ
REU1QTBBMDAxQkEzQUMzRTAwM0Q0NDI0IC8qIEludHJpbnNpY0VtaXR0ZXIuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJNzAxMTNENEIxQThEQjA5MzAwMzg0OEM0IC8qIEl0ZXJhdG9yT3BlcmF0aW9u
cy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3MERDM0UwOTFCMkRGMkM3MDAwNTQyOTkgLyogSXRl
cmF0b3JQcm90b3R5cGUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMTQ3MzQxRTQxREMyQ0U5NjAw
QUEyOUJBIC8qIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CUE1MDNGQTE5MTg4RTBGQjAwMDExMEYxNCAvKiBKYXZhU2NyaXB0Q2FsbEZyYW1lLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTc5RDVDRDVBMUMxMTA2QTkwMENFQ0EwNyAvKiBTYW1wbGluZ1Byb2Zp
bGVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjlEOTJGMEVEMjJENzAwMEI4OTYxOSAvKiBK
SVQuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC05ODk5LDYgKzk5NTMsNyBAQAogCQkJCTBGQjU0NjdE
MTRGNUNGRDYwMDJDMjk4OSAvKiBNZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUUzNzk0RTc1MUI3N0VCOTcwMDU1NDNBRSAvKiBNb2R1bGVBbmFseXpl
ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlFMzU1RjM1MjFCN0RDODUzMDBDNTBEQzUgLyogTW9k
dWxlTG9hZGVyUHJvdG90eXBlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE0NzM0MUUyMURDMkNF
OTYwMEFBMjlCQSAvKiBFdmFsRXhlY3V0YWJsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjMz
OEUwQjFCRjAyNzZDMDAxM0M4OEYgLyogQjNDb21waWxhdGlvbi5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkxNDQ2OURFMDEwN0VDN0U3MDA2NTA0NDYgLyogTmF0aXZlRXJyb3JDb25zdHJ1Y3Rvci5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQk3OTE2MERCRDFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlS
ZXZva2UuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC0xMDAzOSw2ICsxMDA5NCw3IEBACiAJCQkJQTcz
ODY1NTUxMTg2OTdCNDAwNTQwMjc5IC8qIFRodW5rR2VuZXJhdG9ycy5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQkwRjJENERFODE5ODMyREFDMDA3RDRCMTkgLyogVG9UaGlzU3RhdHVzLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTBGOTUyQUJDMUI0ODdBNzcwMEMzNjdDNSAvKiBUcmFja2VkUmVmZXJl
bmNlcy5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkxNDczNDFFNzFEQzJDRTk2MDBBQTI5QkEgLyog
U2NyaXB0RXhlY3V0YWJsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjJCNjcwNzE3QjZCNUFC
MDBBN0FFM0YgLyogVHlwZWRBcnJheUNvbnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
MEYyQjY3MEExN0I2QjVBQjAwQTdBRTNGIC8qIFR5cGVkQXJyYXlUeXBlLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTUyQjMxMEZGMTk3NUI0MjQwMDgwODU3QyAvKiBUeXBlTG9jYXRpb25DYWNoZS5j
cHAgaW4gU291cmNlcyAqLywKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9TY3JpcHRzL2J1
aWx0aW5zL2J1aWx0aW5zX2dlbmVyYXRlX2NvbWJpbmVkX2ltcGxlbWVudGF0aW9uLnB5Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9TY3JpcHRzL2J1aWx0aW5zL2J1aWx0aW5z
X2dlbmVyYXRlX2NvbWJpbmVkX2ltcGxlbWVudGF0aW9uLnB5CShyZXZpc2lvbiAyMDc3OTApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvU2NyaXB0cy9idWlsdGlucy9idWlsdGluc19nZW5lcmF0
ZV9jb21iaW5lZF9pbXBsZW1lbnRhdGlvbi5weQkod29ya2luZyBjb3B5KQpAQCAtNzUsNyArNzUs
NyBAQCBjbGFzcyBCdWlsdGluc0NvbWJpbmVkSW1wbGVtZW50YXRpb25HZW5lCiAgICAgICAgICAg
ICAgICAgKCJKYXZhU2NyaXB0Q29yZSIsICJoZWFwL0hlYXBJbmxpbmVzLmgiKSwKICAgICAgICAg
ICAgICksCiAgICAgICAgICAgICAoWyJKYXZhU2NyaXB0Q29yZSIsICJXZWJDb3JlIl0sCi0gICAg
ICAgICAgICAgICAgKCJKYXZhU2NyaXB0Q29yZSIsICJydW50aW1lL0V4ZWN1dGFibGUuaCIpLAor
ICAgICAgICAgICAgICAgICgiSmF2YVNjcmlwdENvcmUiLCAicnVudGltZS9VbmxpbmtlZEZ1bmN0
aW9uRXhlY3V0YWJsZS5oIiksCiAgICAgICAgICAgICApLAogICAgICAgICAgICAgKFsiSmF2YVNj
cmlwdENvcmUiLCAiV2ViQ29yZSJdLAogICAgICAgICAgICAgICAgICgiSmF2YVNjcmlwdENvcmUi
LCAicnVudGltZS9KU0NlbGxJbmxpbmVzLmgiKSwKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9TY3JpcHRzL2J1aWx0aW5zL2J1aWx0aW5zX2dlbmVyYXRlX3NlcGFyYXRlX2ltcGxlbWVudGF0
aW9uLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9TY3JpcHRzL2J1aWx0
aW5zL2J1aWx0aW5zX2dlbmVyYXRlX3NlcGFyYXRlX2ltcGxlbWVudGF0aW9uLnB5CShyZXZpc2lv
biAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvU2NyaXB0cy9idWlsdGlucy9idWls
dGluc19nZW5lcmF0ZV9zZXBhcmF0ZV9pbXBsZW1lbnRhdGlvbi5weQkod29ya2luZyBjb3B5KQpA
QCAtODcsOSArODcsNiBAQCBjbGFzcyBCdWlsdGluc1NlcGFyYXRlSW1wbGVtZW50YXRpb25HZW5l
CiAgICAgICAgICAgICAgICAgKCJKYXZhU2NyaXB0Q29yZSIsICJoZWFwL0hlYXBJbmxpbmVzLmgi
KSwKICAgICAgICAgICAgICksCiAgICAgICAgICAgICAoWyJKYXZhU2NyaXB0Q29yZSIsICJXZWJD
b3JlIl0sCi0gICAgICAgICAgICAgICAgKCJKYXZhU2NyaXB0Q29yZSIsICJydW50aW1lL0V4ZWN1
dGFibGUuaCIpLAotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIChbIkphdmFTY3JpcHRDb3Jl
IiwgIldlYkNvcmUiXSwKICAgICAgICAgICAgICAgICAoIkphdmFTY3JpcHRDb3JlIiwgInJ1bnRp
bWUvSlNDZWxsSW5saW5lcy5oIiksCiAgICAgICAgICAgICApLAogICAgICAgICAgICAgKFsiV2Vi
Q29yZSJdLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J1aWx0aW5zL0J1aWx0aW5FeGVj
dXRhYmxlcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J1aWx0aW5z
L0J1aWx0aW5FeGVjdXRhYmxlcy5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9idWlsdGlucy9CdWlsdGluRXhlY3V0YWJsZXMuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAiQnVpbHRpbkV4ZWN1dGFibGVzLmgiCiAKICNp
bmNsdWRlICJCdWlsdGluTmFtZXMuaCIKLSNpbmNsdWRlICJFeGVjdXRhYmxlLmgiCiAjaW5jbHVk
ZSAiSlNDSW5saW5lcy5oIgogI2luY2x1ZGUgIlBhcnNlci5oIgogI2luY2x1ZGUgPHd0Zi9OZXZl
ckRlc3Ryb3llZC5oPgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NhbGxW
YXJpYW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0Nh
bGxWYXJpYW50LmgJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
eXRlY29kZS9DYWxsVmFyaWFudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw3ICsyNSw3IEBACiAK
ICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgorI2luY2x1ZGUgIkZ1bmN0
aW9uRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkpTQ2VsbC5oIgogI2luY2x1ZGUgIkpTRnVuY3Rp
b24uaCIKIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9j
ay5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9Db2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MCw2ICs3MCw3IEBACiAjaW5jbHVk
ZSAiVHlwZVByb2ZpbGVyLmgiCiAjaW5jbHVkZSAiVW5saW5rZWRJbnN0cnVjdGlvblN0cmVhbS5o
IgogI2luY2x1ZGUgIlZNSW5saW5lcy5oIgorI2luY2x1ZGUgIldlYkFzc2VtYmx5RXhlY3V0YWJs
ZS5oIgogI2luY2x1ZGUgPHd0Zi9CYWdUb0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvQ29tbWFQ
cmludGVyLmg+CiAjaW5jbHVkZSA8d3RmL1NpbXBsZVN0YXRzLmg+CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5oCShyZXZpc2lvbiAyMDc3OTApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJFdmFsQ29kZUNhY2hlLmgiCiAjaW5jbHVkZSAi
RXhlY3V0aW9uQ291bnRlci5oIgogI2luY2x1ZGUgIkV4cHJlc3Npb25SYW5nZUluZm8uaCIKKyNp
bmNsdWRlICJGdW5jdGlvbkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJIYW5kbGVySW5mby5oIgog
I2luY2x1ZGUgIkluc3RydWN0aW9uLmgiCiAjaW5jbHVkZSAiSklUQ29kZS5oIgpAQCAtNTUsOSAr
NTYsMTEgQEAKICNpbmNsdWRlICJMTEludENhbGxMaW5rSW5mby5oIgogI2luY2x1ZGUgIkxMSW50
UHJvdG90eXBlTG9hZEFkYXB0aXZlU3RydWN0dXJlV2F0Y2hwb2ludC5oIgogI2luY2x1ZGUgIkxh
enlPcGVyYW5kVmFsdWVQcm9maWxlLmgiCisjaW5jbHVkZSAiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUuaCIKICNpbmNsdWRlICJPYmplY3RBbGxvY2F0aW9uUHJvZmlsZS5oIgogI2luY2x1ZGUgIk9w
dGlvbnMuaCIKICNpbmNsdWRlICJQcm9maWxlckpldHRpc29uUmVhc29uLmgiCisjaW5jbHVkZSAi
UHJvZ3JhbUV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJQdXRQcm9wZXJ0eVNsb3QuaCIKICNpbmNs
dWRlICJVbmNvbmRpdGlvbmFsRmluYWxpemVyLmgiCiAjaW5jbHVkZSAiVmFsdWVQcm9maWxlLmgi
CkBAIC0xMzQ3LDYgKzEzNTAsMjUgQEAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+IGlubGlu
ZSB2b2lkIAogICAgIH0KIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgor
SlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb24oVk0mIHZtLCBK
U0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktp
bmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQoreworICAgIGlmIChoYXNKSVRD
b2RlRm9yKGtpbmQpKSB7CisgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUs
IEV2YWxFeGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBq
c0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9j
aygpKTsKKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBQcm9n
cmFtRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganND
YXN0PENvZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxv
Y2soKSk7CisgICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9j
ayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0
aGlzKS0+Y29kZUJsb2NrKCkpOworICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0
YWJsZVR5cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0
Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUq
Pih0aGlzKS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
UkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgfQorICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCh2bSwgZnVuY3Rpb24sIHNj
b3BlLCBraW5kLCByZXN1bHRDb2RlQmxvY2spOworfQorCiAjZGVmaW5lIENPREVCTE9DS19MT0df
RVZFTlQoY29kZUJsb2NrLCBzdW1tYXJ5LCBkZXRhaWxzKSBcCiAgICAgKGNvZGVCbG9jay0+dm0o
KS0+bG9nRXZlbnQoY29kZUJsb2NrLCBzdW1tYXJ5LCBbJl0gKCkgeyByZXR1cm4gdG9DU3RyaW5n
IGRldGFpbHM7IH0pKQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29k
ZU9yaWdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L0NvZGVPcmlnaW4uY3BwCShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQ29kZU9yaWdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDYg
QEAKIAogI2luY2x1ZGUgIkNhbGxGcmFtZS5oIgogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgotI2lu
Y2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJJbmxpbmVDYWxsRnJhbWUuaCIKICNpbmNs
dWRlICJKU0NJbmxpbmVzLmgiCiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9FdmFsQ29kZUNhY2hlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL0V2YWxDb2RlQ2FjaGUuaAkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2J5dGVjb2RlL0V2YWxDb2RlQ2FjaGUuaAkod29ya2luZyBjb3B5KQpAQCAtMjgs
NyArMjgsNyBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKKyNp
bmNsdWRlICJFdmFsRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAj
aW5jbHVkZSAiSlNTY29wZS5oIgogI2luY2x1ZGUgIk9wdGlvbnMuaCIKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9JbmxpbmVDYWxsRnJhbWUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9JbmxpbmVDYWxsRnJhbWUuY3BwCShyZXZp
c2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvSW5saW5lQ2Fs
bEZyYW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAi
Q2FsbEZyYW1lLmgiCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJs
ZS5oIgogI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKIAogbmFtZXNwYWNlIEpTQyB7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRDb2RlQmxvY2suY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9VbmxpbmtlZENvZGVCbG9j
ay5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9VbmxpbmtlZENvZGVCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDcgKzMxLDYgQEAK
ICNpbmNsdWRlICJCeXRlY29kZVJld3JpdGVyLmgiCiAjaW5jbHVkZSAiQ2xhc3NJbmZvLmgiCiAj
aW5jbHVkZSAiQ29kZUNhY2hlLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUg
IkV4ZWN1dGFibGVJbmZvLmgiCiAjaW5jbHVkZSAiRnVuY3Rpb25PdmVycmlkZXMuaCIKICNpbmNs
dWRlICJKU1N0cmluZy5oIgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1Vu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUuY3BwCShyZXZpc2lv
biAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRGdW5j
dGlvbkV4ZWN1dGFibGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw2IEBACiAjaW5j
bHVkZSAiQ2xhc3NJbmZvLmgiCiAjaW5jbHVkZSAiQ29kZUNhY2hlLmgiCiAjaW5jbHVkZSAiRGVi
dWdnZXIuaCIKLSNpbmNsdWRlICJFeGVjdXRhYmxlLmgiCiAjaW5jbHVkZSAiRXhlY3V0YWJsZUlu
Zm8uaCIKICNpbmNsdWRlICJGdW5jdGlvbk92ZXJyaWRlcy5oIgogI2luY2x1ZGUgIkpTQ0lubGlu
ZXMuaCIKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvU3RhdGljUHJv
cGVydHlBbmFseXNpcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29tcGlsZXIvU3RhdGljUHJvcGVydHlBbmFseXNpcy5oCShyZXZpc2lvbiAyMDc3OTApCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL1N0YXRpY1Byb3BlcnR5QW5hbHlzaXMu
aAkod29ya2luZyBjb3B5KQpAQCAtMjUsNyArMjUsNiBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2lu
Y2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgogI2luY2x1
ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZWJ1Z2dl
ci9EZWJ1Z2dlckxvY2F0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvZGVidWdnZXIvRGVidWdnZXJMb2NhdGlvbi5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZWJ1Z2dlci9EZWJ1Z2dlckxvY2F0aW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUg
IkRlYnVnZ2VyTG9jYXRpb24uaCIKIAotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKKyNpbmNsdWRl
ICJTY3JpcHRFeGVjdXRhYmxlLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZGZnL0RGR0NhcGFiaWxpdGllcy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgJKHJldmlzaW9uIDIwNzc5MCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQ2FwYWJpbGl0aWVzLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI3LDcgKzI3LDYgQEAKIAogI2luY2x1ZGUgIkNvZGVCbG9jay5oIgogI2luY2x1
ZGUgIkRGR0NvbW1vbi5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJJbnRl
cnByZXRlci5oIgogI2luY2x1ZGUgIkludHJpbnNpYy5oIgogI2luY2x1ZGUgIk9wdGlvbnMuaCIK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdFByZXBhcmF0aW9uLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRQcmVw
YXJhdGlvbi5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHT1NSRXhpdFByZXBhcmF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjks
NiBAQAogI2lmIEVOQUJMRShERkdfSklUKQogCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCi0jaW5j
bHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkpJVC5oIgogI2luY2x1ZGUgIkpJVENvZGUu
aCIKICNpbmNsdWRlICJKSVRXb3JrbGlzdC5oIgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdUb0ZUTERlZmVycmVkQ29tcGlsYXRpb25DYWxsYmFjay5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdUb0ZUTERlZmVycmVkQ29tcGlsYXRpb25D
YWxsYmFjay5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHVG9GVExEZWZlcnJlZENvbXBpbGF0aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMCw3ICszMCw2IEBACiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJE
RkdKSVRDb2RlLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkpTQ0lubGlu
ZXMuaCIKIAogbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBERkcgewpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdUb0ZUTEZvck9TUkVudHJ5RGVmZXJyZWRDb21waWxhdGlvbkNh
bGxiYWNrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Rv
RlRMRm9yT1NSRW50cnlEZWZlcnJlZENvbXBpbGF0aW9uQ2FsbGJhY2suY3BwCShyZXZpc2lvbiAy
MDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RvRlRMRm9yT1NSRW50cnlE
ZWZlcnJlZENvbXBpbGF0aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICsz
MCw2IEBACiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKICNpbmNsdWRlICJERkdKSVRDb2RlLmgi
Ci0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkZUTEZvck9TUkVudHJ5SklUQ29k
ZS5oIgogI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKIApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2ludGVycHJldGVyL1N0YWNrVmlzaXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2ludGVycHJldGVyL1N0YWNrVmlzaXRvci5jcHAJKHJldmlzaW9uIDIwNzc5
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9TdGFja1Zpc2l0b3IuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw2IEBACiAKICNpbmNsdWRlICJDbG9uZWRBcmd1
bWVudHMuaCIKICNpbmNsdWRlICJEZWJ1Z2dlclByaW1pdGl2ZXMuaCIKLSNpbmNsdWRlICJFeGVj
dXRhYmxlLmgiCiAjaW5jbHVkZSAiSW5saW5lQ2FsbEZyYW1lLmgiCiAjaW5jbHVkZSAiSW50ZXJw
cmV0ZXIuaCIKICNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0pJVFRodW5rcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2ppdC9KSVRUaHVua3MuY3BwCShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvaml0L0pJVFRodW5rcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDYg
QEAKIAogI2lmIEVOQUJMRShKSVQpCiAKLSNpbmNsdWRlICJFeGVjdXRhYmxlLmgiCiAjaW5jbHVk
ZSAiSklULmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgogI2luY2x1ZGUgIkxMSW50RGF0YS5o
IgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRUb0RGR0RlZmVycmVkQ29tcGls
YXRpb25DYWxsYmFjay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2pp
dC9KSVRUb0RGR0RlZmVycmVkQ29tcGlsYXRpb25DYWxsYmFjay5jcHAJKHJldmlzaW9uIDIwNzc5
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklUVG9ERkdEZWZlcnJlZENvbXBpbGF0
aW9uQ2FsbGJhY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsyOSw2IEBACiAjaWYgRU5B
QkxFKERGR19KSVQpCiAKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKLSNpbmNsdWRlICJFeGVjdXRh
YmxlLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgogCiBuYW1lc3BhY2UgSlNDIHsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvU3BlY2lhbGl6ZWRUaHVua0pJVC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvU3BlY2lhbGl6ZWRUaHVua0pJVC5oCShy
ZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1NwZWNpYWxpemVk
VGh1bmtKSVQuaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNyArMjcsNiBAQAogCiAjaWYgRU5BQkxF
KEpJVCkKIAotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJKSVQuaCIKICNpbmNs
dWRlICJKSVRJbmxpbmVzLmgiCiAjaW5jbHVkZSAiSlNJbnRlcmZhY2VKSVQuaCIKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9sbGludC9MTEludE9mZnNldHNFeHRyYWN0b3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9sbGludC9MTEludE9mZnNldHNFeHRyYWN0
b3IuY3BwCShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvbGxpbnQv
TExJbnRPZmZzZXRzRXh0cmFjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNyArMzAsNiBA
QAogI2luY2x1ZGUgIkNvbW1vblNsb3dQYXRocy5oIgogI2luY2x1ZGUgIkRpcmVjdEFyZ3VtZW50
cy5oIgogI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNp
bmNsdWRlICJIZWFwLmgiCiAjaW5jbHVkZSAiSW50ZXJwcmV0ZXIuaCIKICNpbmNsdWRlICJKU0Fy
cmF5LmgiCkBAIC00Niw2ICs0NSw3IEBACiAjaW5jbHVkZSAiSnVtcFRhYmxlLmgiCiAjaW5jbHVk
ZSAiTExJbnRPZmZsaW5lQXNtQ29uZmlnLmgiCiAjaW5jbHVkZSAiTWFya2VkU3BhY2UuaCIKKyNp
bmNsdWRlICJOYXRpdmVFeGVjdXRhYmxlLmgiCiAjaW5jbHVkZSAiUHJvdG9DYWxsRnJhbWUuaCIK
ICNpbmNsdWRlICJTaGFkb3dDaGlja2VuLmgiCiAjaW5jbHVkZSAiU3RydWN0dXJlLmgiCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1BhcnNlci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmgJKHJldmlzaW9uIDIwNzc5MCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTIzLDcgKzIzLDYgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSAiRXhjZXB0aW9uSGVscGVy
cy5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJMZXhlci5oIgogI2luY2x1
ZGUgIk1vZHVsZVNjb3BlRGF0YS5oIgogI2luY2x1ZGUgIk5vZGVzLmgiCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9DYWxsRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ2FsbERhdGEuY3BwCShyZXZpc2lvbiAyMDc3OTApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9DYWxsRGF0YS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJDYWxs
RGF0YS5oIgogCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkludGVycHJldGVy
LmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgogI2luY2x1ZGUgIkpTRnVuY3Rpb24uaCIKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbnN0cnVjdERhdGEuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbnN0cnVjdERhdGEuY3Bw
CShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db25z
dHJ1Y3REYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUg
ImNvbmZpZy5oIgogI2luY2x1ZGUgIkNvbnN0cnVjdERhdGEuaCIKIAotI2luY2x1ZGUgIkV4ZWN1
dGFibGUuaCIKICNpbmNsdWRlICJJbnRlcnByZXRlci5oIgogI2luY2x1ZGUgIkpTQ0lubGluZXMu
aCIKICNpbmNsdWRlICJKU0Z1bmN0aW9uLmgiCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9FdmFsRXhlY3V0YWJsZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFibGUuY3BwCShyZXZpc2lvbiAyMDc3OTApCShmcm9t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3BwOjIwNzc5MCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V2YWxFeGVjdXRhYmxlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAx
MCwgMjAxMywgMjAxNS0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlLmgiCisKKyNpbmNsdWRlICJCYXRjaGVkVHJhbnNpdGlv
bk9wdGltaXplci5oIgorI2luY2x1ZGUgIkNvZGVCbG9jay5oIgorI2luY2x1ZGUgIkRlYnVnZ2Vy
LmgiCisjaW5jbHVkZSAiSklULmgiCisjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUg
IkpTV2FzbU1vZHVsZS5oIgorI2luY2x1ZGUgIkxMSW50RW50cnlwb2ludC5oIgorI2luY2x1ZGUg
IlBhcnNlci5oIgorI2luY2x1ZGUgIlR5cGVQcm9maWxlci5oIgorI2luY2x1ZGUgIlZNSW5saW5l
cy5oIgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7CisK
K2NvbnN0IENsYXNzSW5mbyBFeGVjdXRhYmxlQmFzZTo6c19pbmZvID0geyAiRXhlY3V0YWJsZSIs
IDAsIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRXhlY3V0YWJsZUJhc2UpIH07CisKK3ZvaWQgRXhl
Y3V0YWJsZUJhc2U6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PEV4
ZWN1dGFibGVCYXNlKj4oY2VsbCktPkV4ZWN1dGFibGVCYXNlOjp+RXhlY3V0YWJsZUJhc2UoKTsK
K30KKwordm9pZCBFeGVjdXRhYmxlQmFzZTo6Y2xlYXJDb2RlKCkKK3sKKyNpZiBFTkFCTEUoSklU
KQorICAgIG1faml0Q29kZUZvckNhbGwgPSBudWxscHRyOworICAgIG1faml0Q29kZUZvckNvbnN0
cnVjdCA9IG51bGxwdHI7CisgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFj
cm9Bc3NlbWJsZXJDb2RlUHRyKCk7CisgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5
Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKKyNlbmRpZgorICAgIG1fbnVtUGFyYW1l
dGVyc0ZvckNhbGwgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7CisgICAgbV9udW1QYXJh
bWV0ZXJzRm9yQ29uc3RydWN0ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOworCisgICAg
aWYgKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAg
IEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFi
bGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFy
KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmNsZWFyKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4
ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2V2
YWxDb2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxD
b2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAo
Y2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBQcm9n
cmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRo
aXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKKyAg
ICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Cisg
ICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAg
ICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigp
OworICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuY2xl
YXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyNpZiBFTkFCTEUoV0VCQVNTRU1C
TFkpCisgICAgaWYgKGNsYXNzSW5mbygpID09IFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6aW5mbygp
KSB7CisgICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxX
ZWJBc3NlbWJseUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2Rl
QmxvY2tGb3JDYWxsLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKwor
ICAgIEFTU0VSVChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpOworfQor
Citjb25zdCBDbGFzc0luZm8gTmF0aXZlRXhlY3V0YWJsZTo6c19pbmZvID0geyAiTmF0aXZlRXhl
Y3V0YWJsZSIsICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxF
KE5hdGl2ZUV4ZWN1dGFibGUpIH07CisKK05hdGl2ZUV4ZWN1dGFibGUqIE5hdGl2ZUV4ZWN1dGFi
bGU6OmNyZWF0ZShWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVG
dW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0
aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmlu
ZyYgbmFtZSkKK3sKKyAgICBOYXRpdmVFeGVjdXRhYmxlKiBleGVjdXRhYmxlOworICAgIGV4ZWN1
dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxOYXRpdmVFeGVjdXRhYmxlPih2bS5o
ZWFwKSkgTmF0aXZlRXhlY3V0YWJsZSh2bSwgZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBpbnRyaW5z
aWMpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtLCBjYWxsVGh1bmssIGNvbnN0
cnVjdFRodW5rLCBuYW1lKTsKKyAgICByZXR1cm4gZXhlY3V0YWJsZTsKK30KKwordm9pZCBOYXRp
dmVFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2FzdDxO
YXRpdmVFeGVjdXRhYmxlKj4oY2VsbCktPk5hdGl2ZUV4ZWN1dGFibGU6On5OYXRpdmVFeGVjdXRh
YmxlKCk7Cit9CisKK1N0cnVjdHVyZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlU3RydWN0dXJl
KFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKK3sK
KyAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5
cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Cit9CisKK3ZvaWQgTmF0
aXZlRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+
IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3Ry
aW5nJiBuYW1lKQoreworICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICBtX2ppdENv
ZGVGb3JDYWxsID0gY2FsbFRodW5rOworICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGNvbnN0
cnVjdFRodW5rOworICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IG1faml0Q29k
ZUZvckNhbGwtPmFkZHJlc3NGb3JDYWxsKE11c3RDaGVja0FyaXR5KTsKKyAgICBtX2ppdENvZGVG
b3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNvbnN0cnVjdC0+YWRkcmVz
c0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOworICAgIG1fbmFtZSA9IG5hbWU7Cit9CisKK05hdGl2
ZUV4ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUoVk0mIHZtLCBOYXRpdmVGdW5jdGlvbiBmdW5j
dGlvbiwgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMpCisg
ICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0ubmF0aXZlRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQo
KSwgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCwgaW50cmluc2ljKQorICAgICwgbV9mdW5jdGlvbihm
dW5jdGlvbikKKyAgICAsIG1fY29uc3RydWN0b3IoY29uc3RydWN0b3IpCit7Cit9CisKK2NvbnN0
IENsYXNzSW5mbyBTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJTY3JpcHRFeGVjdXRhYmxl
IiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoU2NyaXB0
RXhlY3V0YWJsZSkgfTsKKworU2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0RXhlY3V0YWJsZShTdHJ1
Y3R1cmUqIHN0cnVjdHVyZSwgVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wg
aXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUs
IGJvb2wgaXNJbkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRl
eHRUeXBlLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHN0
cnVjdHVyZSwgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVELCBpbnRyaW5zaWMpCisgICAgLCBt
X2ZlYXR1cmVzKGlzSW5TdHJpY3RDb250ZXh0ID8gU3RyaWN0TW9kZUZlYXR1cmUgOiAwKQorICAg
ICwgbV9kaWRUcnlUb0VudGVySW5Mb29wKGZhbHNlKQorICAgICwgbV9oYXNDYXB0dXJlZFZhcmlh
YmxlcyhmYWxzZSkKKyAgICAsIG1fbmV2ZXJJbmxpbmUoZmFsc2UpCisgICAgLCBtX25ldmVyT3B0
aW1pemUoZmFsc2UpCisgICAgLCBtX25ldmVyRlRMT3B0aW1pemUoZmFsc2UpCisgICAgLCBtX2lz
QXJyb3dGdW5jdGlvbkNvbnRleHQoaXNJbkFycm93RnVuY3Rpb25Db250ZXh0KQorICAgICwgbV9j
YW5Vc2VPU1JFeGl0RnV6emluZyh0cnVlKQorICAgICwgbV9kZXJpdmVkQ29udGV4dFR5cGUoc3Rh
dGljX2Nhc3Q8dW5zaWduZWQ+KGRlcml2ZWRDb250ZXh0VHlwZSkpCisgICAgLCBtX2V2YWxDb250
ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZXZhbENvbnRleHRUeXBlKSkKKyAgICAsIG1f
b3ZlcnJpZGVMaW5lTnVtYmVyKC0xKQorICAgICwgbV9maXJzdExpbmUoLTEpCisgICAgLCBtX2xh
c3RMaW5lKC0xKQorICAgICwgbV9zdGFydENvbHVtbihVSU5UX01BWCkKKyAgICAsIG1fZW5kQ29s
dW1uKFVJTlRfTUFYKQorICAgICwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoVUlOVF9NQVgp
CisgICAgLCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQoVUlOVF9NQVgpCisgICAgLCBtX3NvdXJj
ZShzb3VyY2UpCit7Cit9CisKK3ZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwq
IGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8U2NyaXB0RXhlY3V0YWJsZSo+KGNlbGwpLT5TY3Jp
cHRFeGVjdXRhYmxlOjp+U2NyaXB0RXhlY3V0YWJsZSgpOworfQorCit2b2lkIFNjcmlwdEV4ZWN1
dGFibGU6Omluc3RhbGxDb2RlKENvZGVCbG9jayogY29kZUJsb2NrKQoreworICAgIGluc3RhbGxD
b2RlKCpjb2RlQmxvY2stPnZtKCksIGNvZGVCbG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgpLCBj
b2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsKK30KKwordm9pZCBTY3JpcHRFeGVjdXRh
YmxlOjppbnN0YWxsQ29kZShWTSYgdm0sIENvZGVCbG9jayogZ2VuZXJpY0NvZGVCbG9jaywgQ29k
ZVR5cGUgY29kZVR5cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sKKyAgICBBU1NF
UlQodm0uaGVhcC5pc0RlZmVycmVkKCkpOworICAgIAorICAgIGlmIChnZW5lcmljQ29kZUJsb2Nr
KQorICAgICAgICBDT0RFQkxPQ0tfTE9HX0VWRU5UKGdlbmVyaWNDb2RlQmxvY2ssICJpbnN0YWxs
Q29kZSIsICgpKTsKKyAgICAKKyAgICBDb2RlQmxvY2sqIG9sZENvZGVCbG9jayA9IG51bGxwdHI7
CisgICAgCisgICAgc3dpdGNoIChjb2RlVHlwZSkgeworICAgIGNhc2UgR2xvYmFsQ29kZTogewor
ICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhl
Y3V0YWJsZSo+KHRoaXMpOworICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBz
dGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisgICAgICAg
IAorICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIAorICAgICAg
ICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7Cisg
ICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRo
aXMsIGNvZGVCbG9jayk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgTW9kdWxl
Q29kZTogeworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJs
b2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNhbGwpOworCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJv
Z3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFt
Q29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorCisgICAgY2FzZSBFdmFsQ29kZTogeworICAgICAgICBFdmFsRXhlY3V0YWJs
ZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBF
dmFsQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oZ2Vu
ZXJpY0NvZGVCbG9jayk7CisgICAgICAgIAorICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9y
Q2FsbCk7CisgICAgICAgIAorICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2V2
YWxDb2RlQmxvY2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5z
ZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7CisgICAgICAgIGJyZWFrOworICAgIH0K
KyAgICAgICAgCisgICAgY2FzZSBGdW5jdGlvbkNvZGU6IHsKKyAgICAgICAgRnVuY3Rpb25FeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwor
ICAgICAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RnVuY3Rp
b25Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRj
aCAoa2luZCkgeworICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICAgICAgb2xkQ29k
ZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgICAgICAg
ICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLnNldE1heUJlTnVsbCh2bSwgdGhpcywg
Y29kZUJsb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvZGVGb3JDb25z
dHJ1Y3Q6CisgICAgICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2Nr
Rm9yQ29uc3RydWN0LnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAg
ICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICBtX2ppdENv
ZGVGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUo
KSA6IG51bGxwdHI7CisgICAgICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1h
Y3JvQXNzZW1ibGVyQ29kZVB0cigpOworICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDYWxsID0g
Z2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5V
TV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2Rl
Rm9yQ29uc3RydWN0OgorICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29k
ZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0cjsKKyAgICAgICAg
bV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQ
dHIoKTsKKyAgICAgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0NvZGVC
bG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJT
X05PVF9DT01QSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGdlbmVyaWND
b2RlQmxvY2spIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZ2VuZXJpY0NvZGVCbG9jay0+b3du
ZXJFeGVjdXRhYmxlKCkgPT0gdGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKEpJVENvZGU6
OmlzRXhlY3V0YWJsZVNjcmlwdChnZW5lcmljQ29kZUJsb2NrLT5qaXRUeXBlKCkpKTsKKyAgICAg
ICAgCisgICAgICAgIGlmIChPcHRpb25zOjp2ZXJib3NlT1NSKCkpCisgICAgICAgICAgICBkYXRh
TG9nKCJJbnN0YWxsaW5nICIsICpnZW5lcmljQ29kZUJsb2NrLCAiXG4iKTsKKyAgICAgICAgCisg
ICAgICAgIGlmICh2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpCisgICAgICAgICAgICB2bS5tX3Bl
ckJ5dGVjb2RlUHJvZmlsZXItPmVuc3VyZUJ5dGVjb2Rlc0ZvcihnZW5lcmljQ29kZUJsb2NrKTsK
KyAgICAgICAgCisgICAgICAgIGlmIChEZWJ1Z2dlciogZGVidWdnZXIgPSBnZW5lcmljQ29kZUJs
b2NrLT5nbG9iYWxPYmplY3QoKS0+ZGVidWdnZXIoKSkKKyAgICAgICAgICAgIGRlYnVnZ2VyLT5y
ZWdpc3RlckNvZGVCbG9jayhnZW5lcmljQ29kZUJsb2NrKTsKKyAgICB9CisKKyAgICBpZiAob2xk
Q29kZUJsb2NrKQorICAgICAgICBvbGRDb2RlQmxvY2stPnVubGlua0luY29taW5nQ2FsbHMoKTsK
KworICAgIHZtLmhlYXAud3JpdGVCYXJyaWVyKHRoaXMpOworfQorCitDb2RlQmxvY2sqIFNjcmlw
dEV4ZWN1dGFibGU6Om5ld0NvZGVCbG9ja0ZvcigKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQsIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgSlNPYmplY3QqJiBl
eGNlcHRpb24pCit7CisgICAgVk0qIHZtID0gc2NvcGUtPnZtKCk7CisgICAgYXV0byB0aHJvd1Nj
b3BlID0gREVDTEFSRV9USFJPV19TQ09QRSgqdm0pOworCisgICAgQVNTRVJUKHZtLT5oZWFwLmlz
RGVmZXJyZWQoKSk7CisgICAgQVNTRVJUKHN0YXJ0Q29sdW1uKCkgIT0gVUlOVF9NQVgpOworICAg
IEFTU0VSVChlbmRDb2x1bW4oKSAhPSBVSU5UX01BWCk7CisKKyAgICBpZiAoY2xhc3NJbmZvKCkg
PT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNF
X0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4
ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5j
dGlvbik7CisgICAgICAgIHJldHVybiBFdmFsQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAg
ICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5nZXQo
KSwgc2NvcGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpKTsK
KyAgICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjpp
bmZvKCkpIHsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8
UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9
PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX3By
b2dyYW1Db2RlQmxvY2spOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOworICAg
ICAgICByZXR1cm4gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAgICAgICAgZXhl
Y3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNj
b3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0
YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKSk7CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5m
bygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUqPih0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2Fs
bCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1D
b2RlQmxvY2spOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOworICAgICAgICBy
ZXR1cm4gTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAgICAgICAgZXhl
Y3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0
KCksIHNjb3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwg
ZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKSk7CisgICAgfQorCisgICAgUkVMRUFT
RV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOworICAg
IFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uKTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgUkVMRUFTRV9B
U1NFUlQoIWV4ZWN1dGFibGUtPmNvZGVCbG9ja0ZvcihraW5kKSk7CisgICAgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKKyAgICBQYXJzZXJFcnJv
ciBlcnJvcjsKKyAgICBEZWJ1Z2dlck1vZGUgZGVidWdnZXJNb2RlID0gZ2xvYmFsT2JqZWN0LT5o
YXNJbnRlcmFjdGl2ZURlYnVnZ2VyKCkgPyBEZWJ1Z2dlck9uIDogRGVidWdnZXJPZmY7CisgICAg
VW5saW5rZWRGdW5jdGlvbkNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sgPSAKKyAgICAgICAg
ZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPnVubGlua2VkQ29kZUJsb2NrRm9yKAor
ICAgICAgICAgICAgKnZtLCBleGVjdXRhYmxlLT5tX3NvdXJjZSwga2luZCwgZGVidWdnZXJNb2Rl
LCBlcnJvciwgCisgICAgICAgICAgICBleGVjdXRhYmxlLT5wYXJzZU1vZGUoKSk7CisgICAgcmVj
b3JkUGFyc2UoCisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5mZWF0
dXJlcygpLCAKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmhhc0Nh
cHR1cmVkVmFyaWFibGVzKCksIGZpcnN0TGluZSgpLCAKKyAgICAgICAgbGFzdExpbmUoKSwgc3Rh
cnRDb2x1bW4oKSwgZW5kQ29sdW1uKCkpOyAKKyAgICBpZiAoIXVubGlua2VkQ29kZUJsb2NrKSB7
CisgICAgICAgIGV4Y2VwdGlvbiA9IHRocm93RXhjZXB0aW9uKAorICAgICAgICAgICAgZ2xvYmFs
T2JqZWN0LT5nbG9iYWxFeGVjKCksIHRocm93U2NvcGUsCisgICAgICAgICAgICBlcnJvci50b0Vy
cm9yT2JqZWN0KGdsb2JhbE9iamVjdCwgZXhlY3V0YWJsZS0+bV9zb3VyY2UpKTsKKyAgICAgICAg
cmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgU291cmNlUHJvdmlkZXIqIHByb3ZpZGVyID0g
ZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKTsKKyAgICB1bnNpZ25lZCBzb3VyY2VPZmZz
ZXQgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydE9mZnNldCgpOworICAgIHVuc2lnbmVkIHN0
YXJ0Q29sdW1uID0gZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKTsKKworICAgIHJl
dHVybiBGdW5jdGlvbkNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAgICBleGVjdXRhYmxlLCB1
bmxpbmtlZENvZGVCbG9jaywgc2NvcGUsIHByb3ZpZGVyLCBzb3VyY2VPZmZzZXQsIHN0YXJ0Q29s
dW1uKTsKK30KKworQ29kZUJsb2NrKiBTY3JpcHRFeGVjdXRhYmxlOjpuZXdSZXBsYWNlbWVudENv
ZGVCbG9ja0ZvcigKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCit7CisgICAgaWYg
KGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBl
eGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIEV2YWxD
b2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9jayo+KAorICAgICAg
ICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Cisg
ICAgICAgIEV2YWxDb2RlQmxvY2sqIHJlc3VsdCA9IEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSgp
LAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Cisg
ICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dy
YW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ2FsbCk7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sq
IGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KAorICAgICAgICAgICAg
ZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7CisgICAg
ICAgIFByb2dyYW1Db2RlQmxvY2sqIHJlc3VsdCA9IFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2
bSgpLAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7
CisgICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5k
ID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAg
TW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrKj4oCisgICAgICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1D
b2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayogcmVzdWx0ID0gTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCisgICAg
ICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICAgICAg
cmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0
aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgRnVuY3Rpb25Db2Rl
QmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPigKKyAgICAg
ICAgZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpLT5iYXNlbGluZVZlcnNpb24oKSk7Cisg
ICAgRnVuY3Rpb25Db2RlQmxvY2sqIHJlc3VsdCA9IEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUo
dm0oKSwKKyAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Cisg
ICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwTExJbnQoVk0mIHZtLCBDb2RlQmxvY2sqIGNv
ZGVCbG9jaykKK3sKKyAgICBMTEludDo6c2V0RW50cnlwb2ludCh2bSwgY29kZUJsb2NrKTsKK30K
Kworc3RhdGljIHZvaWQgc2V0dXBKSVQoVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sK
KyNpZiBFTkFCTEUoSklUKQorICAgIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IEpJVDo6Y29t
cGlsZSgmdm0sIGNvZGVCbG9jaywgSklUQ29tcGlsYXRpb25NdXN0U3VjY2VlZCk7CisgICAgUkVM
RUFTRV9BU1NFUlQocmVzdWx0ID09IENvbXBpbGF0aW9uU3VjY2Vzc2Z1bCk7CisjZWxzZQorICAg
IFVOVVNFRF9QQVJBTSh2bSk7CisgICAgVU5VU0VEX1BBUkFNKGNvZGVCbG9jayk7CisgICAgVU5S
RUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7CisjZW5kaWYKK30KKworSlNPYmplY3QqIFNjcmlwdEV4
ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb25JbXBsKAorICAgIFZNJiB2bSwgSlNGdW5jdGlv
biogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQs
IENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jaykKK3sKKyAgICBEZWZlckdDRm9yQVdoaWxlIGRl
ZmVyR0Modm0uaGVhcCk7CisKKyAgICBpZiAodm0uZ2V0QW5kQ2xlYXJGYWlsTmV4dE5ld0NvZGVC
bG9jaygpKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3Ioc2NvcGUtPmdsb2JhbE9iamVjdCgp
LT5nbG9iYWxFeGVjKCksIEFTQ0lJTGl0ZXJhbCgiRm9yY2VkIEZhaWx1cmUiKSk7CisKKyAgICBK
U09iamVjdCogZXhjZXB0aW9uID0gMDsKKyAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG5ld0Nv
ZGVCbG9ja0ZvcihraW5kLCBmdW5jdGlvbiwgc2NvcGUsIGV4Y2VwdGlvbik7CisgICAgcmVzdWx0
Q29kZUJsb2NrID0gY29kZUJsb2NrOworICAgIGlmICghY29kZUJsb2NrKSB7CisgICAgICAgIFJF
TEVBU0VfQVNTRVJUKGV4Y2VwdGlvbik7CisgICAgICAgIHJldHVybiBleGNlcHRpb247CisgICAg
fQorICAgIAorICAgIGlmIChPcHRpb25zOjp2YWxpZGF0ZUJ5dGVjb2RlKCkpCisgICAgICAgIGNv
ZGVCbG9jay0+dmFsaWRhdGUoKTsKKyAgICAKKyAgICBpZiAoT3B0aW9uczo6dXNlTExJbnQoKSkK
KyAgICAgICAgc2V0dXBMTEludCh2bSwgY29kZUJsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHNl
dHVwSklUKHZtLCBjb2RlQmxvY2spOworICAgIAorICAgIGluc3RhbGxDb2RlKHZtLCBjb2RlQmxv
Y2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwgY29kZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQo
KSk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBFdmFsRXhlY3V0
YWJsZTo6c19pbmZvID0geyAiRXZhbEV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19p
bmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEV2YWxFeGVjdXRhYmxlKSB9OworCitFdmFsRXhl
Y3V0YWJsZSogRXZhbEV4ZWN1dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNv
dXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRU
eXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFs
Q29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50KiB2
YXJpYWJsZXNVbmRlclREWikKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8g
c2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKworICAgIEpTR2xvYmFsT2JqZWN0KiBn
bG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgaWYgKCFnbG9i
YWxPYmplY3QtPmV2YWxFbmFibGVkKCkpIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywg
c2NvcGUsIGNyZWF0ZUV2YWxFcnJvcihleGVjLCBnbG9iYWxPYmplY3QtPmV2YWxEaXNhYmxlZEVy
cm9yTWVzc2FnZSgpKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEV2YWxFeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8RXZhbEV4ZWN1
dGFibGU+KCpleGVjLT5oZWFwKCkpKSBFdmFsRXhlY3V0YWJsZShleGVjLCBzb3VyY2UsIGlzSW5T
dHJpY3RDb250ZXh0LCBkZXJpdmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQs
IGV2YWxDb250ZXh0VHlwZSk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwor
CisgICAgVW5saW5rZWRFdmFsQ29kZUJsb2NrKiB1bmxpbmtlZEV2YWxDb2RlID0gZ2xvYmFsT2Jq
ZWN0LT5jcmVhdGVFdmFsQ29kZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUsIHZhcmlhYmxlc1VuZGVy
VERaKTsKKyAgICBpZiAoIXVubGlua2VkRXZhbENvZGUpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suc2V0KHZtLCBleGVjdXRhYmxl
LCB1bmxpbmtlZEV2YWxDb2RlKTsKKworICAgIHJldHVybiBleGVjdXRhYmxlOworfQorCitFdmFs
RXhlY3V0YWJsZTo6RXZhbEV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VD
b2RlJiBzb3VyY2UsIGJvb2wgaW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVy
aXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0
VHlwZSBldmFsQ29udGV4dFR5cGUpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCku
ZXZhbEV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgaW5TdHJp
Y3RDb250ZXh0LCBkZXJpdmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIGV2
YWxDb250ZXh0VHlwZSwgTm9JbnRyaW5zaWMpCit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRl
cigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsK
K30KKwordm9pZCBFdmFsRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAg
c3RhdGljX2Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihjZWxsKS0+RXZhbEV4ZWN1dGFibGU6On5FdmFs
RXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gUHJvZ3JhbUV4ZWN1dGFibGU6OnNf
aW5mbyA9IHsgIlByb2dyYW1FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywg
MCwgQ1JFQVRFX01FVEhPRF9UQUJMRShQcm9ncmFtRXhlY3V0YWJsZSkgfTsKKworUHJvZ3JhbUV4
ZWN1dGFibGU6OlByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNl
Q29kZSYgc291cmNlKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLnByb2dyYW1F
eGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJp
dmVkQ29udGV4dFR5cGU6Ok5vbmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIE5vSW50
cmluc2ljKQoreworICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09
IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6UHJvZ3JhbSk7CisgICAgbV90eXBlUHJvZmlsaW5n
U3RhcnRPZmZzZXQgPSAwOworICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5s
ZW5ndGgoKSAtIDE7CisgICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+
dm0oKS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpCisgICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25I
YXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5
cGVQcm9maWxpbmdTdGFydE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKK30KKwor
dm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3Rh
dGljX2Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKS0+UHJvZ3JhbUV4ZWN1dGFibGU6On5Q
cm9ncmFtRXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIiwgJlNjcmlwdEV4
ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSkgfTsKKworTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6Ok1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAgIDog
U2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLm1vZHVsZVByb2dyYW1FeGVjdXRhYmxlU3RydWN0
dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJpdmVkQ29udGV4dFR5cGU6
Ok5vbmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIE5vSW50cmluc2ljKQoreworICAg
IEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVy
U291cmNlVHlwZTo6TW9kdWxlKTsKKyAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IDA7
CisgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0aCgpIC0gMTsKKyAg
ICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52bSgpLmNvbnRyb2xGbG93
UHJvZmlsZXIoKSkKKyAgICAgICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUo
KS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlwZVByb2ZpbGluZ1N0YXJ0
T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQpOworfQorCitNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKK3sKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFs
T2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOworICAgIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8TW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGU+KCpleGVjLT5oZWFwKCkpKSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZShleGVjLCBzb3VyY2UpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKGV4ZWMtPnZt
KCkpOworCisgICAgVW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZE1vZHVs
ZVByb2dyYW1Db2RlID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
KGV4ZWMsIGV4ZWN1dGFibGUpOworICAgIGlmICghdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZSkK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVs
ZVByb2dyYW1Db2RlQmxvY2suc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUsIHVubGlua2VkTW9k
dWxlUHJvZ3JhbUNvZGUpOworCisgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVFbnZpcm9ubWVudFN5
bWJvbFRhYmxlLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCBqc0Nhc3Q8U3ltYm9sVGFibGUq
Pih1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlLT5jb25zdGFudFJlZ2lzdGVyKHVubGlua2VkTW9k
dWxlUHJvZ3JhbUNvZGUtPm1vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGVDb25zdGFudFJlZ2lz
dGVyT2Zmc2V0KCkpLmdldCgpKS0+Y2xvbmVTY29wZVBhcnQoZXhlYy0+dm0oKSkpOworCisgICAg
cmV0dXJuIGV4ZWN1dGFibGU7Cit9CisKK3ZvaWQgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmRl
c3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKj4oY2VsbCktPk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp+TW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUoKTsKK30KKworY29uc3QgQ2xhc3NJbmZvIEZ1bmN0aW9uRXhlY3V0YWJsZTo6c19p
bmZvID0geyAiRnVuY3Rpb25FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywg
MCwgQ1JFQVRFX01FVEhPRF9UQUJMRShGdW5jdGlvbkV4ZWN1dGFibGUpIH07CisKK0Z1bmN0aW9u
RXhlY3V0YWJsZTo6RnVuY3Rpb25FeGVjdXRhYmxlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYg
c291cmNlLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlLCB1
bnNpZ25lZCBmaXJzdExpbmUsIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVt
biwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgIDogU2NyaXB0
RXhlY3V0YWJsZSh2bS5mdW5jdGlvbkV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIHZtLCBzb3Vy
Y2UsIHVubGlua2VkRXhlY3V0YWJsZS0+aXNJblN0cmljdENvbnRleHQoKSwgdW5saW5rZWRFeGVj
dXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9u
ZSwgaW50cmluc2ljKQorICAgICwgbV91bmxpbmtlZEV4ZWN1dGFibGUodm0sIHRoaXMsIHVubGlu
a2VkRXhlY3V0YWJsZSkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVCghc291cmNlLmlzTnVsbCgpKTsK
KyAgICBBU1NFUlQoc291cmNlLmxlbmd0aCgpKTsKKyAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGlu
ZTsKKyAgICBtX2xhc3RMaW5lID0gbGFzdExpbmU7CisgICAgQVNTRVJUKHN0YXJ0Q29sdW1uICE9
IFVJTlRfTUFYKTsKKyAgICBBU1NFUlQoZW5kQ29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICBtX3N0
YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47CisgICAgbV9lbmRDb2x1bW4gPSBlbmRDb2x1bW47Cisg
ICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRl
cnNTdGFydE9mZnNldCgpOworICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdW5saW5r
ZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKTsKKyAgICBtX3R5cGVQcm9m
aWxpbmdFbmRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdFbmRPZmZz
ZXQoKTsKK30KKwordm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKFZNJiB2
bSkKK3sKKyAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7CisgICAgbV9zaW5nbGV0b25GdW5j
dGlvbi5zZXQodm0sIHRoaXMsIEluZmVycmVkVmFsdWU6OmNyZWF0ZSh2bSkpOworfQorCit2b2lk
IEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGlj
X2Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oY2VsbCktPkZ1bmN0aW9uRXhlY3V0YWJsZTo6fkZ1
bmN0aW9uRXhlY3V0YWJsZSgpOworfQorCitpbmxpbmUgY29uc3QgY2hhciogc2FtcGxpbmdEZXNj
cmlwdGlvbihKSVRDb2RlOjpKSVRUeXBlIGppdFR5cGUpCit7CisgICAgc3dpdGNoIChqaXRUeXBl
KSB7CisgICAgY2FzZSBKSVRDb2RlOjpJbnRlcnByZXRlclRodW5rOgorICAgICAgICByZXR1cm4g
IkludGVycHJldGVyIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGNhc2UgSklUQ29kZTo6QmFz
ZWxpbmVKSVQ6CisgICAgICAgIHJldHVybiAiQmFzZWxpbmUgQ29tcGlsYXRpb24gKFRPVEFMKSI7
CisgICAgY2FzZSBKSVRDb2RlOjpERkdKSVQ6CisgICAgICAgIHJldHVybiAiREZHIENvbXBpbGF0
aW9uIChUT1RBTCkiOworICAgIGNhc2UgSklUQ29kZTo6RlRMSklUOgorICAgICAgICByZXR1cm4g
IkZUTCBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3Zv
aWQgRXZhbEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRv
ciYgdmlzaXRvcikKK3sKKyAgICBFdmFsRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxF
dmFsRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhp
c09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRo
aXNPYmplY3QsIHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3Vu
bGlua2VkRXZhbENvZGVCbG9jayk7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9j
aykKKyAgICAgICAgdGhpc09iamVjdC0+bV9ldmFsQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNp
dG9yKTsKK30KKworSlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxlOjpjaGVja1N5bnRheChFeGVj
U3RhdGUqIGV4ZWMpCit7CisgICAgUGFyc2VyRXJyb3IgZXJyb3I7CisgICAgVk0qIHZtID0gJmV4
ZWMtPnZtKCk7CisgICAgSlNHbG9iYWxPYmplY3QqIGxleGljYWxHbG9iYWxPYmplY3QgPSBleGVj
LT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW1Ob2Rl
PiBwcm9ncmFtTm9kZSA9IHBhcnNlPFByb2dyYW1Ob2RlPigKKyAgICAgICAgdm0sIG1fc291cmNl
LCBJZGVudGlmaWVyKCksIEpTUGFyc2VyQnVpbHRpbk1vZGU6Ok5vdEJ1aWx0aW4sCisgICAgICAg
IEpTUGFyc2VyU3RyaWN0TW9kZTo6Tm90U3RyaWN0LCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNz
aWMsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVk
LCBlcnJvcik7CisgICAgaWYgKHByb2dyYW1Ob2RlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBB
U1NFUlQoZXJyb3IuaXNWYWxpZCgpKTsKKyAgICByZXR1cm4gZXJyb3IudG9FcnJvck9iamVjdChs
ZXhpY2FsR2xvYmFsT2JqZWN0LCBtX3NvdXJjZSk7Cit9CisKK0pTT2JqZWN0KiBQcm9ncmFtRXhl
Y3V0YWJsZTo6aW5pdGlhbGl6ZUdsb2JhbFByb3BlcnRpZXMoVk0mIHZtLCBDYWxsRnJhbWUqIGNh
bGxGcmFtZSwgSlNTY29wZSogc2NvcGUpCit7CisgICAgUkVMRUFTRV9BU1NFUlQoc2NvcGUpOwor
ICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+Z2xvYmFsT2JqZWN0KCk7
CisgICAgUkVMRUFTRV9BU1NFUlQoZ2xvYmFsT2JqZWN0KTsKKyAgICBBU1NFUlQoJmdsb2JhbE9i
amVjdC0+dm0oKSA9PSAmdm0pOworCisgICAgSlNPYmplY3QqIGV4Y2VwdGlvbiA9IDA7CisgICAg
VW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9jayA9IGdsb2JhbE9iamVj
dC0+Y3JlYXRlUHJvZ3JhbUNvZGVCbG9jayhjYWxsRnJhbWUsIHRoaXMsICZleGNlcHRpb24pOwor
ICAgIGlmIChleGNlcHRpb24pCisgICAgICAgIHJldHVybiBleGNlcHRpb247CisKKyAgICBKU0ds
b2JhbExleGljYWxFbnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50ID0gZ2xvYmFs
T2JqZWN0LT5nbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQoKTsKKyAgICBjb25zdCBWYXJpYWJsZUVu
dmlyb25tZW50JiB2YXJpYWJsZURlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT52YXJp
YWJsZURlY2xhcmF0aW9ucygpOworICAgIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQmIGxleGlj
YWxEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+bGV4aWNhbERlY2xhcmF0aW9ucygp
OworICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQgbm8gdmFycy9nbG9iYWwgcHJvcGVydGll
cy9sZXQvY29uc3QgY2FuIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KKyAgICAv
LyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gMTUuMS44IG9mIHRoZSBFUzYgc3BlYzogaHR0cDov
L3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1n
bG9iYWxkZWNsYXJhdGlvbmluc3RhbnRpYXRpb24KKyAgICB7CisgICAgICAgIEV4ZWNTdGF0ZSog
ZXhlYyA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpOworICAgICAgICAvLyBDaGVjayBmb3Ig
aW50ZXJzZWN0aW9uIG9mICJ2YXIiIGFuZCAibGV0Ii8iY29uc3QiLyJjbGFzcyIKKyAgICAgICAg
Zm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlm
ICh2YXJpYWJsZURlY2xhcmF0aW9ucy5jb250YWlucyhlbnRyeS5rZXkpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVh
dGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAibGV0Ii8iY29uc3Qi
LyJjbGFzcyIgd2lsbCBzaGFkb3cgYW55IHByZS1leGlzdGluZyBnbG9iYWwgcHJvcGVydHkgbmFt
ZXMsIG9yICJ2YXIiLyJsZXQiLyJjb25zdCIgdmFyaWFibGVzLgorICAgICAgICAvLyBJdCdzIGFu
IGVycm9yIHRvIGludHJvZHVjZSBhIHNoYWRvdy4KKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6
IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChnbG9iYWxPYmplY3QtPmhh
c1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBU
aGUgRVM2IHNwZWMgc2F5cyB0aGF0IGp1c3QgUmVzdHJpY3RlZEdsb2JhbFByb3BlcnR5IGNhbid0
IGJlIHNoYWRvd2VkCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXJyaWVkIG91dCBzZWN0aW9u
IDguMS4xLjQuMTQgb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25h
bC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWhhc3Jlc3RyaWN0ZWRnbG9iYWxwcm9w
ZXJ0eQorICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAg
ICAgICAgICAgICAgIGdsb2JhbE9iamVjdC0+Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4ZWMs
IGVudHJ5LmtleS5nZXQoKSwgZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgaWYgKGRlc2NyaXB0b3IudmFsdWUoKSAhPSBqc1VuZGVmaW5lZCgpICYmICFkZXNj
cmlwdG9yLmNvbmZpZ3VyYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRl
U3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJp
YWJsZSB0aGF0IHNoYWRvd3MgYSBnbG9iYWwgcHJvcGVydHk6ICciLCBTdHJpbmcoZW50cnkua2V5
LmdldCgpKSwgIiciKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRy
eS5rZXkuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKFVOTElLRUxZKGVudHJ5LnZhbHVl
LmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29uc3RSZWRlY2xhcmF0aW9uU2hvdWxkVGhyb3coKSAm
JiAhaXNTdHJpY3RNb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgYWxs
b3cgImNvbnN0IiBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIHVuZGVyIHRoaXMgc2V0dGluZy4KKyAg
ICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHdlIGRvbid0ICJsZXQiIHZhcmlhYmxl
cyB0byBiZSBvdmVycmlkZGVuIGJ5ICJjb25zdCIgdmFyaWFibGVzLgorICAgICAgICAgICAgICAg
ICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0NvbnN0VmFyaWFibGUoZW50cnku
a2V5LmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywg
bWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhl
bnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIC8vIENoZWNrIGlmIGFueSBuZXcgInZhciJzIHdpbGwgc2hhZG93IGFueSBwcmV2aW91cyAi
bGV0Ii8iY29uc3QiLyJjbGFzcyIgbmFtZXMuCisgICAgICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8g
aW50cm9kdWNlIGEgc2hhZG93LgorICAgICAgICBpZiAoIWdsb2JhbExleGljYWxFbnZpcm9ubWVu
dC0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogdmFyaWFibGVE
ZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25t
ZW50LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3Jl
YXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIp
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgbV91bmxpbmtlZFBy
b2dyYW1Db2RlQmxvY2suc2V0KHZtLCB0aGlzLCB1bmxpbmtlZENvZGVCbG9jayk7CisKKyAgICBC
YXRjaGVkVHJhbnNpdGlvbk9wdGltaXplciBvcHRpbWl6ZXIodm0sIGdsb2JhbE9iamVjdCk7CisK
KyAgICBmb3IgKHNpemVfdCBpID0gMCwgbnVtYmVyT2ZGdW5jdGlvbnMgPSB1bmxpbmtlZENvZGVC
bG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IGkgPCBudW1iZXJPZkZ1bmN0aW9uczsgKytp
KSB7CisgICAgICAgIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEZ1bmN0aW9u
RXhlY3V0YWJsZSA9IHVubGlua2VkQ29kZUJsb2NrLT5mdW5jdGlvbkRlY2woaSk7CisgICAgICAg
IEFTU0VSVCghdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPm5hbWUoKS5pc0VtcHR5KCkpOwor
ICAgICAgICBnbG9iYWxPYmplY3QtPmFkZEZ1bmN0aW9uKGNhbGxGcmFtZSwgdW5saW5rZWRGdW5j
dGlvbkV4ZWN1dGFibGUtPm5hbWUoKSk7CisgICAgICAgIGlmICh2bS50eXBlUHJvZmlsZXIoKSB8
fCB2bS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpIHsKKyAgICAgICAgICAgIHZtLmZ1bmN0aW9uSGFz
RXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgCisgICAg
ICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdTdGFy
dE9mZnNldCgpLCAKKyAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+
dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAo
YXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgeworICAgICAgICBBU1NFUlQoZW50
cnkudmFsdWUuaXNWYXIoKSk7CisgICAgICAgIGdsb2JhbE9iamVjdC0+YWRkVmFyKGNhbGxGcmFt
ZSwgSWRlbnRpZmllcjo6ZnJvbVVpZCgmdm0sIGVudHJ5LmtleS5nZXQoKSkpOworICAgIH0KKwor
ICAgIHsKKyAgICAgICAgSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGdsb2JhbExleGljYWxF
bnZpcm9ubWVudCA9IGpzQ2FzdDxKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCo+KGdsb2JhbE9i
amVjdC0+Z2xvYmFsU2NvcGUoKSk7CisgICAgICAgIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSA9
IGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+c3ltYm9sVGFibGUoKTsKKyAgICAgICAgQ29uY3Vy
cmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7CisgICAgICAgIGZvciAo
YXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7CisgICAgICAgICAgICBpZiAoVU5M
SUtFTFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRp
b25TaG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoc3ltYm9sVGFibGUtPmNvbnRhaW5zKGxvY2tlciwgZW50cnkua2V5LmdldCgpKSkKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTY29w
ZU9mZnNldCBvZmZzZXQgPSBzeW1ib2xUYWJsZS0+dGFrZU5leHRTY29wZU9mZnNldChsb2NrZXIp
OworICAgICAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBuZXdFbnRyeShWYXJPZmZzZXQob2Zmc2V0
KSwgZW50cnkudmFsdWUuaXNDb25zdCgpID8gUmVhZE9ubHkgOiAwKTsKKyAgICAgICAgICAgIG5l
d0VudHJ5LnByZXBhcmVUb1dhdGNoKCk7CisgICAgICAgICAgICBzeW1ib2xUYWJsZS0+YWRkKGxv
Y2tlciwgZW50cnkua2V5LmdldCgpLCBuZXdFbnRyeSk7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIFNjb3BlT2Zmc2V0IG9mZnNldEZvckFzc2VydCA9IGdsb2JhbExleGljYWxFbnZpcm9ubWVu
dC0+YWRkVmFyaWFibGVzKDEsIGpzVERaVmFsdWUoKSk7CisgICAgICAgICAgICBSRUxFQVNFX0FT
U0VSVChvZmZzZXRGb3JBc3NlcnQgPT0gb2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBy
ZXR1cm4gMDsKK30KKwordm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0Nl
bGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIFByb2dyYW1FeGVjdXRhYmxl
KiB0aGlzT2JqZWN0ID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNT
RVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIFNjcmlwdEV4
ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7CisgICAgdmlzaXRv
ci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrKTsKKyAgICBp
ZiAodGhpc09iamVjdC0+bV9wcm9ncmFtQ29kZUJsb2NrKQorICAgICAgICB0aGlzT2JqZWN0LT5t
X3Byb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworfQorCit2b2lkIE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0
b3ImIHZpc2l0b3IpCit7CisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIHRoaXNPYmplY3Qg
PSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0Nf
T0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJs
ZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFwcGVu
ZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2spOworICAgIHZp
c2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUp
OworICAgIGlmICh0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2spCisgICAgICAg
IHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRv
cik7Cit9CisKK0Z1bmN0aW9uQ29kZUJsb2NrKiBGdW5jdGlvbkV4ZWN1dGFibGU6OmJhc2VsaW5l
Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sKKyAgICBGdW5jdGlv
bkNvZGVCbG9jayogcmVzdWx0OworICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAg
ICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgZWxzZSB7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJlc3Vs
dCA9IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKyAgICBpZiAoIXJlc3Vs
dCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29k
ZUJsb2NrKj4ocmVzdWx0LT5iYXNlbGluZUFsdGVybmF0aXZlKCkpOworfQorCit2b2lkIEZ1bmN0
aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2
aXNpdG9yKQoreworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxG
dW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRT
KHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJl
bih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tG
b3JDYWxsKQorICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwtPnZpc2l0V2Vh
a2x5KHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVj
dCkKKyAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QtPnZpc2l0V2Vh
a2x5KHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2Vk
RXhlY3V0YWJsZSk7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fc2luZ2xldG9u
RnVuY3Rpb24pOworfQorCitGdW5jdGlvbkV4ZWN1dGFibGUqIEZ1bmN0aW9uRXhlY3V0YWJsZTo6
ZnJvbUdsb2JhbENvZGUoCisgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiBl
eGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIAorICAgIEpTT2JqZWN0KiYgZXhjZXB0aW9u
LCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKQoreworICAgIFVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUgPSAKKyAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1
dGFibGU6OmZyb21HbG9iYWxDb2RlKAorICAgICAgICAgICAgbmFtZSwgZXhlYywgc291cmNlLCBl
eGNlcHRpb24sIG92ZXJyaWRlTGluZU51bWJlcik7CisgICAgaWYgKCF1bmxpbmtlZEV4ZWN1dGFi
bGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIHVubGlua2VkRXhlY3V0
YWJsZS0+bGluayhleGVjLnZtKCksIHNvdXJjZSwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsKK30KKwor
I2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKK2NvbnN0IENsYXNzSW5mbyBXZWJBc3NlbWJseUV4ZWN1
dGFibGU6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5RXhlY3V0YWJsZSIsICZFeGVjdXRhYmxlQmFz
ZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFdlYkFzc2VtYmx5RXhlY3V0YWJsZSkg
fTsKKworV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4ZWN1dGFibGUoVk0mIHZt
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSogbW9kdWxlLCB1bnNpZ25l
ZCBmdW5jdGlvbkluZGV4KQorICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZtLndlYkFzc2VtYmx5
RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVELCBO
b0ludHJpbnNpYykKKyAgICAsIG1fc291cmNlKHNvdXJjZSkKKyAgICAsIG1fbW9kdWxlKHZtLCB0
aGlzLCBtb2R1bGUpCisgICAgLCBtX2Z1bmN0aW9uSW5kZXgoZnVuY3Rpb25JbmRleCkKK3sKKyAg
ICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRl
clNvdXJjZVR5cGU6OldlYkFzc2VtYmx5KTsKK30KKwordm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFi
bGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PFdlYkFzc2VtYmx5
RXhlY3V0YWJsZSo+KGNlbGwpLT5XZWJBc3NlbWJseUV4ZWN1dGFibGU6On5XZWJBc3NlbWJseUV4
ZWN1dGFibGUoKTsKK30KKwordm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRy
ZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBXZWJBc3NlbWJs
eUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlFeGVjdXRhYmxlKj4o
Y2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkp
OworICAgIEV4ZWN1dGFibGVCYXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3Ip
OworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCisgICAgICAgIHRoaXNP
YmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRvcik7CisgICAgdmlz
aXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlKTsKK30KKyNlbmRpZgorCit2b2lkIEV4
ZWN1dGFibGVCYXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgRXhlY3V0
YWJsZUJhc2UqIHJlYWxUaGlzID0gY29uc3RfY2FzdDxFeGVjdXRhYmxlQmFzZSo+KHRoaXMpOwor
ICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpIHsK
KyAgICAgICAgTmF0aXZlRXhlY3V0YWJsZSogbmF0aXZlID0ganNDYXN0PE5hdGl2ZUV4ZWN1dGFi
bGUqPihyZWFsVGhpcyk7CisgICAgICAgIG91dC5wcmludCgiTmF0aXZlRXhlY3V0YWJsZToiLCBS
YXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5mdW5jdGlvbigpKSksICIvIiwg
UmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+Y29uc3RydWN0b3IoKSkpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZh
bEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXZhbCA9IGpz
Q2FzdDxFdmFsRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYgKENvZGVCbG9jayog
Y29kZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoKmNv
ZGVCbG9jayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiRXZhbEV4ZWN1
dGFibGUgdy9vIENvZGVCbG9jayIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAg
IGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAg
IFByb2dyYW1FeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4ocmVh
bFRoaXMpOworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBldmFsLT5jb2RlQmxv
Y2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgb3V0LnByaW50KCJQcm9ncmFtRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHJlYWxU
aGlzKTsKKyAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXhlY3V0YWJsZS0+Y29k
ZUJsb2NrKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIG91dC5wcmludCgiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUgdy9vIENv
ZGVCbG9jayIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIEZ1bmN0aW9uRXhl
Y3V0YWJsZSogZnVuY3Rpb24gPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4ocmVhbFRoaXMp
OworICAgIGlmICghZnVuY3Rpb24tPmVpdGhlckNvZGVCbG9jaygpKQorICAgICAgICBvdXQucHJp
bnQoIkZ1bmN0aW9uRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7CisgICAgZWxzZSB7CisgICAg
ICAgIENvbW1hUHJpbnRlciBjb21tYSgiLyIpOworICAgICAgICBpZiAoZnVuY3Rpb24tPmNvZGVC
bG9ja0ZvckNhbGwoKSkKKyAgICAgICAgICAgIG91dC5wcmludChjb21tYSwgKmZ1bmN0aW9uLT5j
b2RlQmxvY2tGb3JDYWxsKCkpOworICAgICAgICBpZiAoZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNv
bnN0cnVjdCgpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVC
bG9ja0ZvckNvbnN0cnVjdCgpKTsKKyAgICB9Cit9CisKK0NvZGVCbG9ja0hhc2ggRXhlY3V0YWJs
ZUJhc2U6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAoreworICAg
IGlmICh0aGlzLT5jbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpCisgICAg
ICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgTmF0aXZlRXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9y
KGtpbmQpOworICAgIAorICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgU2NyaXB0RXhlY3V0YWJsZSo+
KHRoaXMpLT5oYXNoRm9yKGtpbmQpOworfQorCitDb2RlQmxvY2tIYXNoIE5hdGl2ZUV4ZWN1dGFi
bGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAoreworICAgIGlm
IChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzdGF0
aWNfY2FzdDx1bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9mdW5jdGlvbikpKTsKKyAg
ICAKKyAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgIHJl
dHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6
ZV90PihtX2NvbnN0cnVjdG9yKSkpOworfQorCitDb2RlQmxvY2tIYXNoIFNjcmlwdEV4ZWN1dGFi
bGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAoreworICAgIHJl
dHVybiBDb2RlQmxvY2tIYXNoKHNvdXJjZSgpLCBraW5kKTsKK30KKworfQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFibGUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V2YWxFeGVjdXRhYmxlLmNwcAkocmV2aXNp
b24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFi
bGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw2IEBACiAgKi8KIAogI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKIAogI2luY2x1ZGUgIkJhdGNoZWRU
cmFuc2l0aW9uT3B0aW1pemVyLmgiCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCkBAIC00MCwzOTEg
KzM5LDYgQEAKIAogbmFtZXNwYWNlIEpTQyB7CiAKLWNvbnN0IENsYXNzSW5mbyBFeGVjdXRhYmxl
QmFzZTo6c19pbmZvID0geyAiRXhlY3V0YWJsZSIsIDAsIDAsIENSRUFURV9NRVRIT0RfVEFCTEUo
RXhlY3V0YWJsZUJhc2UpIH07Ci0KLXZvaWQgRXhlY3V0YWJsZUJhc2U6OmRlc3Ryb3koSlNDZWxs
KiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PEV4ZWN1dGFibGVCYXNlKj4oY2VsbCktPkV4ZWN1
dGFibGVCYXNlOjp+RXhlY3V0YWJsZUJhc2UoKTsKLX0KLQotdm9pZCBFeGVjdXRhYmxlQmFzZTo6
Y2xlYXJDb2RlKCkKLXsKLSNpZiBFTkFCTEUoSklUKQotICAgIG1faml0Q29kZUZvckNhbGwgPSBu
dWxscHRyOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IG51bGxwdHI7Ci0gICAgbV9qaXRD
b2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0gICAg
bV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQ
dHIoKTsKLSNlbmRpZgotICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBOVU1fUEFSQU1FVEVS
U19OT1RfQ09NUElMRUQ7Ci0gICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0gTlVNX1BB
UkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IEZ1bmN0aW9u
RXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0
YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0
YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAg
ICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRo
aXMpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suY2xlYXIoKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1
dGFibGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVjdXRhYmxlLT5t
X3Byb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtl
ZFByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0g
ICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxl
UHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2Vk
TW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVjdXRhYmxlLT5tX21v
ZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi0gICAgaWYgKGNsYXNzSW5mbygpID09
IFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPih0aGlz
KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIEFTU0VSVChjbGFzc0luZm8oKSA9PSBO
YXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpOwotfQotCi1jb25zdCBDbGFzc0luZm8gTmF0aXZlRXhl
Y3V0YWJsZTo6c19pbmZvID0geyAiTmF0aXZlRXhlY3V0YWJsZSIsICZFeGVjdXRhYmxlQmFzZTo6
c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE5hdGl2ZUV4ZWN1dGFibGUpIH07Ci0KLU5h
dGl2ZUV4ZWN1dGFibGUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZShWTSYgdm0sIFBhc3NSZWZQ
dHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0
cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIElu
dHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBOYXRpdmVFeGVj
dXRhYmxlKiBleGVjdXRhYmxlOwotICAgIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9j
YXRlQ2VsbDxOYXRpdmVFeGVjdXRhYmxlPih2bS5oZWFwKSkgTmF0aXZlRXhlY3V0YWJsZSh2bSwg
ZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBpbnRyaW5zaWMpOwotICAgIGV4ZWN1dGFibGUtPmZpbmlz
aENyZWF0aW9uKHZtLCBjYWxsVGh1bmssIGNvbnN0cnVjdFRodW5rLCBuYW1lKTsKLSAgICByZXR1
cm4gZXhlY3V0YWJsZTsKLX0KLQotdm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2Vs
bCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4oY2VsbCktPk5h
dGl2ZUV4ZWN1dGFibGU6On5OYXRpdmVFeGVjdXRhYmxlKCk7Ci19Ci0KLVN0cnVjdHVyZSogTmF0
aXZlRXhlY3V0YWJsZTo6Y3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGds
b2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLXsKLSAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVh
dGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7Ci19Ci0KLXZvaWQgTmF0aXZlRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRp
b24oVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRD
b2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIEJhc2U6OmZp
bmlzaENyZWF0aW9uKHZtKTsKLSAgICBtX2ppdENvZGVGb3JDYWxsID0gY2FsbFRodW5rOwotICAg
IG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGNvbnN0cnVjdFRodW5rOwotICAgIG1faml0Q29kZUZv
ckNhbGxXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNhbGwtPmFkZHJlc3NGb3JDYWxsKE11
c3RDaGVja0FyaXR5KTsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9
IG1faml0Q29kZUZvckNvbnN0cnVjdC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOwot
ICAgIG1fbmFtZSA9IG5hbWU7Ci19Ci0KLU5hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFi
bGUoVk0mIHZtLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rpb24gY29uc3Ry
dWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0u
bmF0aXZlRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCwg
aW50cmluc2ljKQotICAgICwgbV9mdW5jdGlvbihmdW5jdGlvbikKLSAgICAsIG1fY29uc3RydWN0
b3IoY29uc3RydWN0b3IpCi17Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBTY3JpcHRFeGVjdXRhYmxl
OjpzX2luZm8gPSB7ICJTY3JpcHRFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoU2NyaXB0RXhlY3V0YWJsZSkgfTsKLQotU2NyaXB0RXhl
Y3V0YWJsZTo6U2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgVk0mIHZtLCBj
b25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRD
b250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVuY3Rpb25Db250
ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMgaW50cmluc2lj
KQotICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHN0cnVjdHVyZSwgTlVNX1BBUkFNRVRFUlNfTk9U
X0NPTVBJTEVELCBpbnRyaW5zaWMpCi0gICAgLCBtX2ZlYXR1cmVzKGlzSW5TdHJpY3RDb250ZXh0
ID8gU3RyaWN0TW9kZUZlYXR1cmUgOiAwKQotICAgICwgbV9kaWRUcnlUb0VudGVySW5Mb29wKGZh
bHNlKQotICAgICwgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyhmYWxzZSkKLSAgICAsIG1fbmV2ZXJJ
bmxpbmUoZmFsc2UpCi0gICAgLCBtX25ldmVyT3B0aW1pemUoZmFsc2UpCi0gICAgLCBtX25ldmVy
RlRMT3B0aW1pemUoZmFsc2UpCi0gICAgLCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQoaXNJbkFy
cm93RnVuY3Rpb25Db250ZXh0KQotICAgICwgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyh0cnVlKQot
ICAgICwgbV9kZXJpdmVkQ29udGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRlcml2ZWRD
b250ZXh0VHlwZSkpCi0gICAgLCBtX2V2YWxDb250ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25l
ZD4oZXZhbENvbnRleHRUeXBlKSkKLSAgICAsIG1fb3ZlcnJpZGVMaW5lTnVtYmVyKC0xKQotICAg
ICwgbV9maXJzdExpbmUoLTEpCi0gICAgLCBtX2xhc3RMaW5lKC0xKQotICAgICwgbV9zdGFydENv
bHVtbihVSU5UX01BWCkKLSAgICAsIG1fZW5kQ29sdW1uKFVJTlRfTUFYKQotICAgICwgbV90eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQoVUlOVF9NQVgpCi0gICAgLCBtX3R5cGVQcm9maWxpbmdFbmRP
ZmZzZXQoVUlOVF9NQVgpCi0gICAgLCBtX3NvdXJjZShzb3VyY2UpCi17Ci19Ci0KLXZvaWQgU2Ny
aXB0RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8
U2NyaXB0RXhlY3V0YWJsZSo+KGNlbGwpLT5TY3JpcHRFeGVjdXRhYmxlOjp+U2NyaXB0RXhlY3V0
YWJsZSgpOwotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKENvZGVCbG9j
ayogY29kZUJsb2NrKQotewotICAgIGluc3RhbGxDb2RlKCpjb2RlQmxvY2stPnZtKCksIGNvZGVC
bG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2lu
ZCgpKTsKLX0KLQotdm9pZCBTY3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZShWTSYgdm0sIENv
ZGVCbG9jayogZ2VuZXJpY0NvZGVCbG9jaywgQ29kZVR5cGUgY29kZVR5cGUsIENvZGVTcGVjaWFs
aXphdGlvbktpbmQga2luZCkKLXsKLSAgICBBU1NFUlQodm0uaGVhcC5pc0RlZmVycmVkKCkpOwot
ICAgIAotICAgIGlmIChnZW5lcmljQ29kZUJsb2NrKQotICAgICAgICBDT0RFQkxPQ0tfTE9HX0VW
RU5UKGdlbmVyaWNDb2RlQmxvY2ssICJpbnN0YWxsQ29kZSIsICgpKTsKLSAgICAKLSAgICBDb2Rl
QmxvY2sqIG9sZENvZGVCbG9jayA9IG51bGxwdHI7Ci0gICAgCi0gICAgc3dpdGNoIChjb2RlVHlw
ZSkgewotICAgIGNhc2UgR2xvYmFsQ29kZTogewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBQ
cm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2Nr
Kj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBBU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ2FsbCk7Ci0gICAgICAgIAotICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxl
LT5tX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3Jh
bUNvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLQotICAgIGNhc2UgTW9kdWxlQ29kZTogewotICAgICAgICBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSo+KHRoaXMpOwotICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBz
dGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0K
LSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotCi0gICAgICAgIG9sZENvZGVC
bG9jayA9IGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwg
dGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBFdmFs
Q29kZTogewotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFs
RXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBFdmFsQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBz
dGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAot
ICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIAotICAgICAgICBv
bGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suZ2V0KCk7Ci0gICAgICAg
IGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVC
bG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgICAgCi0gICAgY2FzZSBGdW5jdGlv
bkNvZGU6IHsKLSAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBGdW5jdGlvbkNvZGVCbG9jayog
Y29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJs
b2NrKTsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICBjYXNlIENv
ZGVGb3JDYWxsOgotICAgICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2Rl
QmxvY2tGb3JDYWxsLmdldCgpOwotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tG
b3JDYWxsLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAgICBvbGRDb2Rl
QmxvY2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICAg
ICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LnNldE1heUJlTnVsbCh2
bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICBjYXNl
IENvZGVGb3JDYWxsOgotICAgICAgICBtX2ppdENvZGVGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9j
ayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7Ci0gICAgICAgIG1faml0
Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOwotICAg
ICAgICBtX251bVBhcmFtZXRlcnNGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWND
b2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsK
LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAgICAgICBtX2pp
dENvZGVGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+
aml0Q29kZSgpIDogbnVsbHB0cjsKLSAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFy
aXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKLSAgICAgICAgbV9udW1QYXJhbWV0
ZXJzRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51
bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotCi0gICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spIHsKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlQoZ2VuZXJpY0NvZGVCbG9jay0+b3duZXJFeGVjdXRhYmxlKCkgPT0gdGhpcyk7Ci0g
ICAgICAgIFJFTEVBU0VfQVNTRVJUKEpJVENvZGU6OmlzRXhlY3V0YWJsZVNjcmlwdChnZW5lcmlj
Q29kZUJsb2NrLT5qaXRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChPcHRpb25zOjp2
ZXJib3NlT1NSKCkpCi0gICAgICAgICAgICBkYXRhTG9nKCJJbnN0YWxsaW5nICIsICpnZW5lcmlj
Q29kZUJsb2NrLCAiXG4iKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh2bS5tX3BlckJ5dGVjb2Rl
UHJvZmlsZXIpCi0gICAgICAgICAgICB2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXItPmVuc3VyZUJ5
dGVjb2Rlc0ZvcihnZW5lcmljQ29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChEZWJ1
Z2dlciogZGVidWdnZXIgPSBnZW5lcmljQ29kZUJsb2NrLT5nbG9iYWxPYmplY3QoKS0+ZGVidWdn
ZXIoKSkKLSAgICAgICAgICAgIGRlYnVnZ2VyLT5yZWdpc3RlckNvZGVCbG9jayhnZW5lcmljQ29k
ZUJsb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAob2xkQ29kZUJsb2NrKQotICAgICAgICBvbGRDb2Rl
QmxvY2stPnVubGlua0luY29taW5nQ2FsbHMoKTsKLQotICAgIHZtLmhlYXAud3JpdGVCYXJyaWVy
KHRoaXMpOwotfQotCi1Db2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld0NvZGVCbG9ja0Zv
cigKLSAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIEpTRnVuY3Rpb24qIGZ1bmN0aW9u
LCBKU1Njb3BlKiBzY29wZSwgSlNPYmplY3QqJiBleGNlcHRpb24pCi17Ci0gICAgVk0qIHZtID0g
c2NvcGUtPnZtKCk7Ci0gICAgYXV0byB0aHJvd1Njb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSgq
dm0pOwotCi0gICAgQVNTRVJUKHZtLT5oZWFwLmlzRGVmZXJyZWQoKSk7Ci0gICAgQVNTRVJUKHN0
YXJ0Q29sdW1uKCkgIT0gVUlOVF9NQVgpOwotICAgIEFTU0VSVChlbmRDb2x1bW4oKSAhPSBVSU5U
X01BWCk7Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkg
ewotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0
YWJsZSo+KHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxs
KTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jayk7
Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJldHVybiBFdmFs
Q29kZUJsb2NrOjpjcmVhdGUodm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxl
LT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAgICAgICAgICBleGVj
dXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNz
SW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3JhbUV4
ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsK
LSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFJF
TEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2spOwotICAgICAgICBS
RUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOwotICAgICAgICByZXR1cm4gUHJvZ3JhbUNvZGVCbG9j
azo6Y3JlYXRlKHZtLAotICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxp
bmtlZFByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAotICAgICAgICAgICAgZXhlY3V0YWJs
ZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4o
KSk7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlOjppbmZvKCkpIHsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgUkVM
RUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJU
KCFleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2spOwotICAgICAgICBSRUxFQVNF
X0FTU0VSVCghZnVuY3Rpb24pOwotICAgICAgICByZXR1cm4gTW9kdWxlUHJvZ3JhbUNvZGVCbG9j
azo6Y3JlYXRlKHZtLAotICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxp
bmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAotICAgICAgICAgICAgZXhl
Y3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRD
b2x1bW4oKSk7Ci0gICAgfQotCi0gICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVu
Y3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOwotICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uKTsK
LSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVj
dXRhYmxlKj4odGhpcyk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPmNvZGVCbG9j
a0ZvcihraW5kKSk7Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5n
bG9iYWxPYmplY3QoKTsKLSAgICBQYXJzZXJFcnJvciBlcnJvcjsKLSAgICBEZWJ1Z2dlck1vZGUg
ZGVidWdnZXJNb2RlID0gZ2xvYmFsT2JqZWN0LT5oYXNJbnRlcmFjdGl2ZURlYnVnZ2VyKCkgPyBE
ZWJ1Z2dlck9uIDogRGVidWdnZXJPZmY7Ci0gICAgVW5saW5rZWRGdW5jdGlvbkNvZGVCbG9jayog
dW5saW5rZWRDb2RlQmxvY2sgPSAKLSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1
dGFibGUtPnVubGlua2VkQ29kZUJsb2NrRm9yKAotICAgICAgICAgICAgKnZtLCBleGVjdXRhYmxl
LT5tX3NvdXJjZSwga2luZCwgZGVidWdnZXJNb2RlLCBlcnJvciwgCi0gICAgICAgICAgICBleGVj
dXRhYmxlLT5wYXJzZU1vZGUoKSk7Ci0gICAgcmVjb3JkUGFyc2UoCi0gICAgICAgIGV4ZWN1dGFi
bGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5mZWF0dXJlcygpLCAKLSAgICAgICAgZXhlY3V0YWJs
ZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmhhc0NhcHR1cmVkVmFyaWFibGVzKCksIGZpcnN0TGlu
ZSgpLCAKLSAgICAgICAgbGFzdExpbmUoKSwgc3RhcnRDb2x1bW4oKSwgZW5kQ29sdW1uKCkpOyAK
LSAgICBpZiAoIXVubGlua2VkQ29kZUJsb2NrKSB7Ci0gICAgICAgIGV4Y2VwdGlvbiA9IHRocm93
RXhjZXB0aW9uKAotICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCksIHRocm93
U2NvcGUsCi0gICAgICAgICAgICBlcnJvci50b0Vycm9yT2JqZWN0KGdsb2JhbE9iamVjdCwgZXhl
Y3V0YWJsZS0+bV9zb3VyY2UpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0g
ICAgU291cmNlUHJvdmlkZXIqIHByb3ZpZGVyID0gZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlk
ZXIoKTsKLSAgICB1bnNpZ25lZCBzb3VyY2VPZmZzZXQgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5z
dGFydE9mZnNldCgpOwotICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uID0gZXhlY3V0YWJsZS0+c291
cmNlKCkuc3RhcnRDb2x1bW4oKTsKLQotICAgIHJldHVybiBGdW5jdGlvbkNvZGVCbG9jazo6Y3Jl
YXRlKHZtLAotICAgICAgICBleGVjdXRhYmxlLCB1bmxpbmtlZENvZGVCbG9jaywgc2NvcGUsIHBy
b3ZpZGVyLCBzb3VyY2VPZmZzZXQsIHN0YXJ0Q29sdW1uKTsKLX0KLQotQ29kZUJsb2NrKiBTY3Jp
cHRFeGVjdXRhYmxlOjpuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcigKLSAgICBDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRh
YmxlOjppbmZvKCkpIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2Fs
bCk7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVj
dXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEV2YWxDb2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGlj
X2Nhc3Q8RXZhbENvZGVCbG9jayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29k
ZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIEV2YWxDb2RlQmxvY2sqIHJlc3Vs
dCA9IEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICAgICAgQ29kZUJsb2NrOjpD
b3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRp
dmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAg
Ci0gICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFByb2dy
YW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhp
cyk7Ci0gICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8UHJv
Z3JhbUNvZGVCbG9jayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJs
b2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIHJlc3Vs
dCA9IFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICAgICAgQ29kZUJsb2Nr
OjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJu
YXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0K
LSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkg
ewotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAg
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogYmFz
ZWxpbmUgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oCi0gICAgICAgICAg
ICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigp
KTsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJz
ZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0o
KSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIFJFTEVB
U0VfQVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKLSAg
ICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRh
YmxlKj4odGhpcyk7Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nh
c3Q8RnVuY3Rpb25Db2RlQmxvY2sqPigKLSAgICAgICAgZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9y
KGtpbmQpLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIHJlc3Vs
dCA9IEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKLSAgICAgICAgQ29kZUJsb2NrOjpD
b3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgq
dm0oKSwgYmFzZWxpbmUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNl
dHVwTExJbnQoVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSAgICBMTEludDo6c2V0
RW50cnlwb2ludCh2bSwgY29kZUJsb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBKSVQoVk0m
IHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSNpZiBFTkFCTEUoSklUKQotICAgIENvbXBp
bGF0aW9uUmVzdWx0IHJlc3VsdCA9IEpJVDo6Y29tcGlsZSgmdm0sIGNvZGVCbG9jaywgSklUQ29t
cGlsYXRpb25NdXN0U3VjY2VlZCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0ID09IENvbXBp
bGF0aW9uU3VjY2Vzc2Z1bCk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTSh2bSk7Ci0gICAgVU5V
U0VEX1BBUkFNKGNvZGVCbG9jayk7Ci0gICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7Ci0j
ZW5kaWYKLX0KLQotSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRp
b25JbXBsKAotICAgIFZNJiB2bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3Bl
LCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9j
aykKLXsKLSAgICBEZWZlckdDRm9yQVdoaWxlIGRlZmVyR0Modm0uaGVhcCk7Ci0KLSAgICBpZiAo
dm0uZ2V0QW5kQ2xlYXJGYWlsTmV4dE5ld0NvZGVCbG9jaygpKQotICAgICAgICByZXR1cm4gY3Jl
YXRlRXJyb3Ioc2NvcGUtPmdsb2JhbE9iamVjdCgpLT5nbG9iYWxFeGVjKCksIEFTQ0lJTGl0ZXJh
bCgiRm9yY2VkIEZhaWx1cmUiKSk7Ci0KLSAgICBKU09iamVjdCogZXhjZXB0aW9uID0gMDsKLSAg
ICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG5ld0NvZGVCbG9ja0ZvcihraW5kLCBmdW5jdGlvbiwg
c2NvcGUsIGV4Y2VwdGlvbik7Ci0gICAgcmVzdWx0Q29kZUJsb2NrID0gY29kZUJsb2NrOwotICAg
IGlmICghY29kZUJsb2NrKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGV4Y2VwdGlvbik7Ci0g
ICAgICAgIHJldHVybiBleGNlcHRpb247Ci0gICAgfQotICAgIAotICAgIGlmIChPcHRpb25zOjp2
YWxpZGF0ZUJ5dGVjb2RlKCkpCi0gICAgICAgIGNvZGVCbG9jay0+dmFsaWRhdGUoKTsKLSAgICAK
LSAgICBpZiAoT3B0aW9uczo6dXNlTExJbnQoKSkKLSAgICAgICAgc2V0dXBMTEludCh2bSwgY29k
ZUJsb2NrKTsKLSAgICBlbHNlCi0gICAgICAgIHNldHVwSklUKHZtLCBjb2RlQmxvY2spOwotICAg
IAotICAgIGluc3RhbGxDb2RlKHZtLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwg
Y29kZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQoKSk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci19
Ci0KIGNvbnN0IENsYXNzSW5mbyBFdmFsRXhlY3V0YWJsZTo6c19pbmZvID0geyAiRXZhbEV4ZWN1
dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxF
KEV2YWxFeGVjdXRhYmxlKSB9OwogCiBFdmFsRXhlY3V0YWJsZSogRXZhbEV4ZWN1dGFibGU6OmNy
ZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0lu
U3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9v
bCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBl
LCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50KiB2YXJpYWJsZXNVbmRlclREWikKQEAgLTQ2MSwx
MDMgKzc1LDYgQEAgdm9pZCBFdmFsRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbAogICAg
IHN0YXRpY19jYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCktPkV2YWxFeGVjdXRhYmxlOjp+RXZh
bEV4ZWN1dGFibGUoKTsKIH0KIAotY29uc3QgQ2xhc3NJbmZvIFByb2dyYW1FeGVjdXRhYmxlOjpz
X2luZm8gPSB7ICJQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoUHJvZ3JhbUV4ZWN1dGFibGUpIH07Ci0KLVByb2dyYW1F
eGVjdXRhYmxlOjpQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJj
ZUNvZGUmIHNvdXJjZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5wcm9ncmFt
RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVy
aXZlZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0lu
dHJpbnNpYykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9
PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOwotICAgIG1fdHlwZVByb2ZpbGlu
Z1N0YXJ0T2Zmc2V0ID0gMDsKLSAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2Uu
bGVuZ3RoKCkgLSAxOwotICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMt
PnZtKCkuY29udHJvbEZsb3dQcm9maWxlcigpKQotICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9u
SGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90
eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Ci19Ci0K
LXZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0
YXRpY19jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPlByb2dyYW1FeGVjdXRhYmxlOjp+
UHJvZ3JhbUV4ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRF
eGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUpIH07Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICA6
IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVN0cnVj
dHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBl
OjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsKLSAg
ICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRl
clNvdXJjZVR5cGU6Ok1vZHVsZSk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAw
OwotICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0g
ICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxv
d1Byb2ZpbGVyKCkpCi0gICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hl
KCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFy
dE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKLX0KLQotTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUqIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi17Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUoZXhlYywgc291cmNlKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52
bSgpKTsKLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlTW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayhleGVjLCBleGVjdXRhYmxlKTsKLSAgICBpZiAoIXVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUp
Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCB1bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlKTsKLQotICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRT
eW1ib2xUYWJsZS5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwganNDYXN0PFN5bWJvbFRhYmxl
Kj4odW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+Y29uc3RhbnRSZWdpc3Rlcih1bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlQ29uc3RhbnRSZWdp
c3Rlck9mZnNldCgpKS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0KGV4ZWMtPnZtKCkpKTsKLQotICAg
IHJldHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpk
ZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSo+KGNlbGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6fk1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBGdW5jdGlvbkV4ZWN1dGFibGU6OnNf
aW5mbyA9IHsgIkZ1bmN0aW9uRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVjdXRhYmxlKSB9OwotCi1GdW5jdGlv
bkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwg
dW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1
bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IFNjcmlw
dEV4ZWN1dGFibGUodm0uZnVuY3Rpb25FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCB2bSwgc291
cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmlzSW5TdHJpY3RDb250ZXh0KCksIHVubGlua2VkRXhl
Y3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5v
bmUsIGludHJpbnNpYykKLSAgICAsIG1fdW5saW5rZWRFeGVjdXRhYmxlKHZtLCB0aGlzLCB1bmxp
bmtlZEV4ZWN1dGFibGUpCi17Ci0gICAgUkVMRUFTRV9BU1NFUlQoIXNvdXJjZS5pc051bGwoKSk7
Ci0gICAgQVNTRVJUKHNvdXJjZS5sZW5ndGgoKSk7Ci0gICAgbV9maXJzdExpbmUgPSBmaXJzdExp
bmU7Ci0gICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotICAgIEFTU0VSVChzdGFydENvbHVtbiAh
PSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgbV9z
dGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOwotICAgIG1fZW5kQ29sdW1uID0gZW5kQ29sdW1uOwot
ICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0
ZXJzU3RhcnRPZmZzZXQoKTsKLSAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IHVubGlu
a2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCk7Ci0gICAgbV90eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KCk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYg
dm0pCi17Ci0gICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgIG1fc2luZ2xldG9uRnVu
Y3Rpb24uc2V0KHZtLCB0aGlzLCBJbmZlcnJlZFZhbHVlOjpjcmVhdGUodm0pKTsKLX0KLQotdm9p
ZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRp
Y19jYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5GdW5jdGlvbkV4ZWN1dGFibGU6On5G
dW5jdGlvbkV4ZWN1dGFibGUoKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIHNhbXBsaW5nRGVz
Y3JpcHRpb24oSklUQ29kZTo6SklUVHlwZSBqaXRUeXBlKQotewotICAgIHN3aXRjaCAoaml0VHlw
ZSkgewotICAgIGNhc2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJUaHVuazoKLSAgICAgICAgcmV0dXJu
ICJJbnRlcnByZXRlciBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkJh
c2VsaW5lSklUOgotICAgICAgICByZXR1cm4gIkJhc2VsaW5lIENvbXBpbGF0aW9uIChUT1RBTCki
OwotICAgIGNhc2UgSklUQ29kZTo6REZHSklUOgotICAgICAgICByZXR1cm4gIkRGRyBDb21waWxh
dGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkZUTEpJVDoKLSAgICAgICAgcmV0dXJu
ICJGVEwgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCiB2
b2lkIEV2YWxFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0
b3ImIHZpc2l0b3IpCiB7CiAgICAgRXZhbEV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8
RXZhbEV4ZWN1dGFibGUqPihjZWxsKTsKQEAgLTU2OCwyNzkgKzg1LDQgQEAgdm9pZCBFdmFsRXhl
Y3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbAogICAgICAgICB0aGlzT2JqZWN0LT5tX2V2YWxD
b2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwogfQogCi1KU09iamVjdCogUHJvZ3JhbUV4
ZWN1dGFibGU6OmNoZWNrU3ludGF4KEV4ZWNTdGF0ZSogZXhlYykKLXsKLSAgICBQYXJzZXJFcnJv
ciBlcnJvcjsKLSAgICBWTSogdm0gPSAmZXhlYy0+dm0oKTsKLSAgICBKU0dsb2JhbE9iamVjdCog
bGV4aWNhbEdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBz
dGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbU5vZGU+IHByb2dyYW1Ob2RlID0gcGFyc2U8UHJvZ3JhbU5v
ZGU+KAotICAgICAgICB2bSwgbV9zb3VyY2UsIElkZW50aWZpZXIoKSwgSlNQYXJzZXJCdWlsdGlu
TW9kZTo6Tm90QnVpbHRpbiwKLSAgICAgICAgSlNQYXJzZXJTdHJpY3RNb2RlOjpOb3RTdHJpY3Qs
IEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9k
ZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIGVycm9yKTsKLSAgICBpZiAocHJvZ3JhbU5vZGUp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIEFTU0VSVChlcnJvci5pc1ZhbGlkKCkpOwotICAgIHJl
dHVybiBlcnJvci50b0Vycm9yT2JqZWN0KGxleGljYWxHbG9iYWxPYmplY3QsIG1fc291cmNlKTsK
LX0KLQotSlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVy
dGllcyhWTSYgdm0sIENhbGxGcmFtZSogY2FsbEZyYW1lLCBKU1Njb3BlKiBzY29wZSkKLXsKLSAg
ICBSRUxFQVNFX0FTU0VSVChzY29wZSk7Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVj
dCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKLSAgICBSRUxFQVNFX0FTU0VSVChnbG9iYWxPYmpl
Y3QpOwotICAgIEFTU0VSVCgmZ2xvYmFsT2JqZWN0LT52bSgpID09ICZ2bSk7Ci0KLSAgICBKU09i
amVjdCogZXhjZXB0aW9uID0gMDsKLSAgICBVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2sqIHVubGlu
a2VkQ29kZUJsb2NrID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVQcm9ncmFtQ29kZUJsb2NrKGNhbGxG
cmFtZSwgdGhpcywgJmV4Y2VwdGlvbik7Ci0gICAgaWYgKGV4Y2VwdGlvbikKLSAgICAgICAgcmV0
dXJuIGV4Y2VwdGlvbjsKLQotICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxM
ZXhpY2FsRW52aXJvbm1lbnQgPSBnbG9iYWxPYmplY3QtPmdsb2JhbExleGljYWxFbnZpcm9ubWVu
dCgpOwotICAgIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQmIHZhcmlhYmxlRGVjbGFyYXRpb25z
ID0gdW5saW5rZWRDb2RlQmxvY2stPnZhcmlhYmxlRGVjbGFyYXRpb25zKCk7Ci0gICAgY29uc3Qg
VmFyaWFibGVFbnZpcm9ubWVudCYgbGV4aWNhbERlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJs
b2NrLT5sZXhpY2FsRGVjbGFyYXRpb25zKCk7Ci0gICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhh
dCBubyB2YXJzL2dsb2JhbCBwcm9wZXJ0aWVzL2xldC9jb25zdCBjYW4gYmUgZHVwbGljYXRlZCBp
biB0aGUgZ2xvYmFsIHNjb3BlLgotICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlvbiAxNS4x
Ljggb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNt
YS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWdsb2JhbGRlY2xhcmF0aW9uaW5zdGFudGlhdGlvbgot
ICAgIHsKLSAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVj
KCk7Ci0gICAgICAgIC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gb2YgInZhciIgYW5kICJsZXQi
LyJjb25zdCIvImNsYXNzIgotICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xh
cmF0aW9ucykgewotICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25zLmNvbnRhaW5z
KGVudHJ5LmtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4
ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJp
bmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVj
ayBpZiBhbnkgbmV3ICJsZXQiLyJjb25zdCIvImNsYXNzIiB3aWxsIHNoYWRvdyBhbnkgcHJlLWV4
aXN0aW5nIGdsb2JhbCBwcm9wZXJ0eSBuYW1lcywgb3IgInZhciIvImxldCIvImNvbnN0IiB2YXJp
YWJsZXMuCi0gICAgICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93Lgot
ICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAg
ICAgICAgaWYgKGdsb2JhbE9iamVjdC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgp
KSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQganVzdCBSZXN0
cmljdGVkR2xvYmFsUHJvcGVydHkgY2FuJ3QgYmUgc2hhZG93ZWQKLSAgICAgICAgICAgICAgICAv
LyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gOC4xLjEuNC4xNCBvZiB0aGUgRVM2IHNwZWM6IGh0
dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNz
ZWMtaGFzcmVzdHJpY3RlZGdsb2JhbHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlE
ZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nZXRP
d25Qcm9wZXJ0eURlc2NyaXB0b3IoZXhlYywgZW50cnkua2V5LmdldCgpLCBkZXNjcmlwdG9yKTsK
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgp
ICE9IGpzVW5kZWZpbmVkKCkgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKCkpCi0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJD
YW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlIHRoYXQgc2hhZG93cyBhIGdsb2JhbCBwcm9w
ZXJ0eTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJl
ZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gV2Ugb25seSBhbGxvdyAiY29uc3QiIGR1cGxpY2F0ZSBkZWNsYXJhdGlv
bnMgdW5kZXIgdGhpcyBzZXR0aW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBs
ZSwgd2UgZG9uJ3QgImxldCIgdmFyaWFibGVzIHRvIGJlIG92ZXJyaWRkZW4gYnkgImNvbnN0IiB2
YXJpYWJsZXMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQtPmlzQ29uc3RWYXJpYWJsZShlbnRyeS5rZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVy
biBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGlj
YXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAidmFyInMg
d2lsbCBzaGFkb3cgYW55IHByZXZpb3VzICJsZXQiLyJjb25zdCIvImNsYXNzIiBuYW1lcy4KLSAg
ICAgICAgLy8gSXQncyBhbiBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAgICAgIGlm
ICghZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZv
ciAoYXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAg
IGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5Lmtl
eS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihl
eGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3Ry
aW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgfQotCi0KLSAgICBtX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5zZXQodm0sIHRoaXMsIHVu
bGlua2VkQ29kZUJsb2NrKTsKLQotICAgIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyIG9wdGlt
aXplcih2bSwgZ2xvYmFsT2JqZWN0KTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBudW1iZXJP
ZkZ1bmN0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsg
aSA8IG51bWJlck9mRnVuY3Rpb25zOyArK2kpIHsKLSAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4
ZWN1dGFibGUqIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlID0gdW5saW5rZWRDb2RlQmxvY2st
PmZ1bmN0aW9uRGVjbChpKTsKLSAgICAgICAgQVNTRVJUKCF1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7Ci0gICAgICAgIGdsb2JhbE9iamVjdC0+YWRkRnVuY3Rp
b24oY2FsbEZyYW1lLCB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpKTsKLSAgICAg
ICAgaWYgKHZtLnR5cGVQcm9maWxlcigpIHx8IHZtLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkgewot
ICAgICAgICAgICAgdm0uZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0
ZWRSYW5nZShzb3VyY2VJRCgpLCAKLSAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhl
Y3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCksIAotICAgICAgICAgICAgICAgIHVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRp
b25zKSB7Ci0gICAgICAgIEFTU0VSVChlbnRyeS52YWx1ZS5pc1ZhcigpKTsKLSAgICAgICAgZ2xv
YmFsT2JqZWN0LT5hZGRWYXIoY2FsbEZyYW1lLCBJZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgZW50
cnkua2V5LmdldCgpKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBKU0dsb2JhbExleGljYWxF
bnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50ID0ganNDYXN0PEpTR2xvYmFsTGV4
aWNhbEVudmlyb25tZW50Kj4oZ2xvYmFsT2JqZWN0LT5nbG9iYWxTY29wZSgpKTsKLSAgICAgICAg
U3ltYm9sVGFibGUqIHN5bWJvbFRhYmxlID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5zeW1i
b2xUYWJsZSgpOwotICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJs
ZS0+bV9sb2NrKTsKLSAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlv
bnMpIHsKLSAgICAgICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYg
IXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9k
ZSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChzeW1ib2xUYWJsZS0+Y29udGFpbnMobG9ja2Vy
LCBlbnRyeS5rZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldCA9IHN5bWJvbFRhYmxlLT50
YWtlTmV4dFNjb3BlT2Zmc2V0KGxvY2tlcik7Ci0gICAgICAgICAgICBTeW1ib2xUYWJsZUVudHJ5
IG5ld0VudHJ5KFZhck9mZnNldChvZmZzZXQpLCBlbnRyeS52YWx1ZS5pc0NvbnN0KCkgPyBSZWFk
T25seSA6IDApOwotICAgICAgICAgICAgbmV3RW50cnkucHJlcGFyZVRvV2F0Y2goKTsKLSAgICAg
ICAgICAgIHN5bWJvbFRhYmxlLT5hZGQobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCksIG5ld0VudHJ5
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0
ID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5hZGRWYXJpYWJsZXMoMSwganNURFpWYWx1ZSgp
KTsKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG9mZnNldEZvckFzc2VydCA9PSBvZmZzZXQp
OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFByb2dyYW1FeGVj
dXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3Ip
Ci17Ci0gICAgUHJvZ3JhbUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4
ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmpl
Y3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2Jq
ZWN0LCB2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtl
ZFByb2dyYW1Db2RlQmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxv
Y2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHko
dmlzaXRvcik7Ci19Ci0KLXZvaWQgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRy
ZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAgICBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSo+KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5m
bygpKTsKLSAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZp
c2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkTW9kdWxl
UHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9k
dWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZSk7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fbW9kdWxl
UHJvZ3JhbUNvZGVCbG9jaykKLSAgICAgICAgdGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLX0KLQotRnVuY3Rpb25Db2RlQmxvY2sqIEZ1
bmN0aW9uRXhlY3V0YWJsZTo6YmFzZWxpbmVDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9u
S2luZCBraW5kKQotewotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiByZXN1bHQ7Ci0gICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ2FsbC5n
ZXQoKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9y
Q29uc3RydWN0KTsKLSAgICAgICAgcmVzdWx0ID0gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0
KCk7Ci0gICAgfQotICAgIGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihyZXN1bHQtPmJhc2VsaW5lQWx0ZXJu
YXRpdmUoKSk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpT
Q2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgRnVuY3Rpb25FeGVjdXRh
YmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpOwotICAg
IEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBTY3Jp
cHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotICAgIGlm
ICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCi0gICAgICAgIHRoaXNPYmplY3QtPm1f
Y29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci0gICAgaWYgKHRoaXNPYmpl
Y3QtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0KQotICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVC
bG9ja0ZvckNvbnN0cnVjdC0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBl
bmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRFeGVjdXRhYmxlKTsKLSAgICB2aXNpdG9yLmFwcGVu
ZCgmdGhpc09iamVjdC0+bV9zaW5nbGV0b25GdW5jdGlvbik7Ci19Ci0KLUZ1bmN0aW9uRXhlY3V0
YWJsZSogRnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xvYmFsQ29kZSgKLSAgICBjb25zdCBJZGVu
dGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwg
Ci0gICAgSlNPYmplY3QqJiBleGNlcHRpb24sIGludCBvdmVycmlkZUxpbmVOdW1iZXIpCi17Ci0g
ICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSA9IAotICAg
ICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCi0gICAgICAg
ICAgICBuYW1lLCBleGVjLCBzb3VyY2UsIGV4Y2VwdGlvbiwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsK
LSAgICBpZiAoIXVubGlua2VkRXhlY3V0YWJsZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0K
LSAgICByZXR1cm4gdW5saW5rZWRFeGVjdXRhYmxlLT5saW5rKGV4ZWMudm0oKSwgc291cmNlLCBv
dmVycmlkZUxpbmVOdW1iZXIpOwotfQotCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotY29uc3Qg
Q2xhc3NJbmZvIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHlF
eGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFC
TEUoV2ViQXNzZW1ibHlFeGVjdXRhYmxlKSB9OwotCi1XZWJBc3NlbWJseUV4ZWN1dGFibGU6Oldl
YkFzc2VtYmx5RXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNX
YXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpCi0gICAgOiBFeGVjdXRh
YmxlQmFzZSh2bSwgdm0ud2ViQXNzZW1ibHlFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1f
UEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIE5vSW50cmluc2ljKQotICAgICwgbV9zb3VyY2Uoc291
cmNlKQotICAgICwgbV9tb2R1bGUodm0sIHRoaXMsIG1vZHVsZSkKLSAgICAsIG1fZnVuY3Rpb25J
bmRleChmdW5jdGlvbkluZGV4KQotewotICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291
cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6V2ViQXNzZW1ibHkpOwotfQot
Ci12b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0g
ICAgc3RhdGljX2Nhc3Q8V2ViQXNzZW1ibHlFeGVjdXRhYmxlKj4oY2VsbCktPldlYkFzc2VtYmx5
RXhlY3V0YWJsZTo6fldlYkFzc2VtYmx5RXhlY3V0YWJsZSgpOwotfQotCi12b2lkIFdlYkFzc2Vt
Ymx5RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2
aXNpdG9yKQotewotICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2Fz
dDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lO
SEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgRXhlY3V0YWJsZUJhc2U6OnZpc2l0Q2hp
bGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJs
b2NrRm9yQ2FsbCkKLSAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNp
dFdlYWtseSh2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1
bGUpOwotfQotI2VuZGlmCi0KLXZvaWQgRXhlY3V0YWJsZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0m
IG91dCkgY29uc3QKLXsKLSAgICBFeGVjdXRhYmxlQmFzZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0
PEV4ZWN1dGFibGVCYXNlKj4odGhpcyk7Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE5h
dGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRp
dmUgPSBqc0Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgb3V0LnBy
aW50KCJOYXRpdmVFeGVjdXRhYmxlOiIsIFJhd1BvaW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihu
YXRpdmUtPmZ1bmN0aW9uKCkpKSwgIi8iLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4o
bmF0aXZlLT5jb25zdHJ1Y3RvcigpKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAot
ICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAg
IEV2YWxFeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMp
OwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkK
LSAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgb3V0LnByaW50KCJFdmFsRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVj
dXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nh
c3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIGlmIChDb2RlQmxvY2sq
IGNvZGVCbG9jayA9IGV2YWwtPmNvZGVCbG9jaygpKQotICAgICAgICAgICAgb3V0LnByaW50KCpj
b2RlQmxvY2spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXQucHJpbnQoIlByb2dyYW1F
eGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0g
ICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBj
b2RlQmxvY2sgPSBleGVjdXRhYmxlLT5jb2RlQmxvY2soKSkKLSAgICAgICAgICAgIG91dC5wcmlu
dCgqY29kZUJsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCJNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgCi0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5j
dGlvbkV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgaWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29k
ZUJsb2NrKCkpCi0gICAgICAgIG91dC5wcmludCgiRnVuY3Rpb25FeGVjdXRhYmxlIHcvbyBDb2Rl
QmxvY2siKTsKLSAgICBlbHNlIHsKLSAgICAgICAgQ29tbWFQcmludGVyIGNvbW1hKCIvIik7Ci0g
ICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ2FsbCgpKQotICAgICAgICAgICAgb3V0
LnByaW50KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSk7Ci0gICAgICAgIGlm
IChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpCi0gICAgICAgICAgICBvdXQucHJp
bnQoY29tbWEsICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpOwotICAgIH0KLX0K
LQotQ29kZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFzZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKHRoaXMtPmNsYXNzSW5mbygpID09IE5hdGl2
ZUV4ZWN1dGFibGU6OmluZm8oKSkKLSAgICAgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVF
eGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Ci0gICAgCi0gICAgcmV0dXJuIGpzQ2Fz
dDxjb25zdCBTY3JpcHRFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Ci19Ci0KLUNv
ZGVCbG9ja0hhc2ggTmF0aXZlRXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAg
IHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8
c2l6ZV90PihtX2Z1bmN0aW9uKSkpOwotICAgIAotICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0g
Q29kZUZvckNvbnN0cnVjdCk7Ci0gICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+KG1fY29uc3RydWN0b3IpKSk7Ci19Ci0KLUNv
ZGVCbG9ja0hhc2ggU2NyaXB0RXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc291cmNlKCksIGtp
bmQpOwotfQotCi19Cit9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0V2YWxFeGVjdXRhYmxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFibGUuaAkocmV2aXNpb24gMjA3NzkwKQkoZnJv
bSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlLmg6MjA3NzkwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFibGUuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDc3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwg
MjAxMy0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAi
QXJpdHlDaGVja01vZGUuaCIKKyNpbmNsdWRlICJDYWxsRGF0YS5oIgorI2luY2x1ZGUgIkNvZGVC
bG9ja0hhc2guaCIKKyNpbmNsdWRlICJDb2RlU3BlY2lhbGl6YXRpb25LaW5kLmgiCisjaW5jbHVk
ZSAiQ29tcGlsYXRpb25SZXN1bHQuaCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlSW5mby5oIgorI2lu
Y2x1ZGUgIkhhbmRsZXJJbmZvLmgiCisjaW5jbHVkZSAiSW5mZXJyZWRWYWx1ZS5oIgorI2luY2x1
ZGUgIkpJVENvZGUuaCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgIlNv
dXJjZUNvZGUuaCIKKyNpbmNsdWRlICJUeXBlU2V0LmgiCisjaW5jbHVkZSAiVW5saW5rZWRDb2Rl
QmxvY2suaCIKKyNpbmNsdWRlICJVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS5oIgorCituYW1l
c3BhY2UgSlNDIHsKKworY2xhc3MgQ29kZUJsb2NrOworY2xhc3MgRXZhbENvZGVCbG9jazsKK2Ns
YXNzIEZ1bmN0aW9uQ29kZUJsb2NrOworY2xhc3MgSlNTY29wZTsKK2NsYXNzIEpTV2FzbU1vZHVs
ZTsKK2NsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK2NsYXNzIE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2s7CitjbGFzcyBQcm9ncmFtQ29kZUJsb2NrOworY2xhc3MgV2ViQXNzZW1ibHlDb2RlQmxv
Y2s7CisKK2VudW0gQ29tcGlsYXRpb25LaW5kIHsgRmlyc3RDb21waWxhdGlvbiwgT3B0aW1pemlu
Z0NvbXBpbGF0aW9uIH07CisKK2lubGluZSBib29sIGlzQ2FsbChDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQpCit7CisgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgIHJldHVy
biBmYWxzZTsKK30KKworY2xhc3MgRXhlY3V0YWJsZUJhc2UgOiBwdWJsaWMgSlNDZWxsIHsKKyAg
ICBmcmllbmQgY2xhc3MgSklUOworCitwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGNvbnN0IGludCBO
VU1fUEFSQU1FVEVSU19JU19IT1NUID0gMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJB
TUVURVJTX05PVF9DT01QSUxFRCA9IC0xOworCisgICAgRXhlY3V0YWJsZUJhc2UoVk0mIHZtLCBT
dHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50IG51bVBhcmFtZXRlcnMsIEludHJpbnNpYyBpbnRyaW5z
aWMpCisgICAgICAgIDogSlNDZWxsKHZtLCBzdHJ1Y3R1cmUpCisgICAgICAgICwgbV9udW1QYXJh
bWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0ZXJzKQorICAgICAgICAsIG1fbnVtUGFyYW1ldGVyc0Zv
ckNvbnN0cnVjdChudW1QYXJhbWV0ZXJzKQorICAgICAgICAsIG1faW50cmluc2ljKGludHJpbnNp
YykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCisgICAg
eworICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7CisgICAgfQorCitwdWJsaWM6Cisg
ICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0
dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKKworICAgIHN0YXRpYyBjb25zdCBib29s
IG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVlOworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxs
Kik7CisgICAgICAgIAorICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kKSBjb25zdDsKKworICAgIGJvb2wgaXNFdmFsRXhlY3V0YWJsZSgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gdHlwZSgpID09IEV2YWxFeGVjdXRhYmxlVHlwZTsKKyAgICB9Cisg
ICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhlY3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJvb2wgaXNQ
cm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09
IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsKKyAgICB9CisgICAgYm9vbCBpc01vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlKCkgPT0gTW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGVUeXBlOworICAgIH0KKworCisgICAgYm9vbCBpc0hvc3RGdW5jdGlvbigpIGNv
bnN0CisgICAgeworICAgICAgICBBU1NFUlQoKG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVN
X1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0gKG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9PSBO
VU1fUEFSQU1FVEVSU19JU19IT1NUKSk7CisgICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNG
b3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Q7CisgICAgfQorCisjaWYgRU5BQkxFKFdF
QkFTU0VNQkxZKQorICAgIGJvb2wgaXNXZWJBc3NlbWJseUV4ZWN1dGFibGUoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlOwor
ICAgIH0KKyNlbmRpZgorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZN
JiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykgeyByZXR1
cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENl
bGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7IH0KKyAgICAgICAgCisgICAgdm9pZCBj
bGVhckNvZGUoKTsKKworICAgIERFQ0xBUkVfRVhQT1JUX0lORk87CisKK3Byb3RlY3RlZDoKKyAg
ICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbDsKKyAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9y
Q29uc3RydWN0OworCitwdWJsaWM6CisgICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRK
SVRDb2RlRm9yQ2FsbCgpCisgICAgeworICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ2FsbCk7
CisgICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDYWxsOworICAgIH0KKworICAgIFBhc3NSZWZQ
dHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgpCisgICAgeworICAgICAg
ICBBU1NFUlQobV9qaXRDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIG1faml0Q29k
ZUZvckNvbnN0cnVjdDsKKyAgICB9CisgICAgICAgIAorICAgIFBhc3NSZWZQdHI8SklUQ29kZT4g
Z2VuZXJhdGVkSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgewor
ICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBnZW5l
cmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29u
c3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QoKTsK
KyAgICB9CisgICAgCisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIGVudHJ5cG9pbnRGb3IoQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBBcml0eUNoZWNrTW9kZSBhcml0eSkKKyAgICB7Cisg
ICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0LiBXZSBvbmx5IGhhdmUg
aXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1c2Ugd2UgdXNlIHRoZQorICAgICAgICAvLyBuby1hcml0
eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0dWFsIGNhbGxzLCB3aGljaCB3aWxsICJjYWNoZSIgdGhp
cyB2YWx1ZSBkaXJlY3RseSBpbgorICAgICAgICAvLyBtYWNoaW5lIGNvZGUuCisgICAgICAgIGlm
IChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgeworICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7
CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICAgICAgICAgIGlmIChNYWNy
b0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNr
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgICAg
IGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0
V2l0aEFyaXR5Q2hlY2spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTWFj
cm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9CisgICAgICAgICAgICBnZW5lcmF0ZWRKSVRDb2Rl
Rm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2FsbChhcml0eSk7CisgICAgICAgIGlmIChhcml0eSA9PSBN
dXN0Q2hlY2tBcml0eSkgeworICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdDsgdGhpcyBp
cyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQncyB2aXJ0dWFsIGNhbGwgb3B0aW1pemF0aW9ucy4KKyAg
ICAgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoK
KyAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1
Y3Q6CisgICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sg
PSByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgcHRyZGlmZl90
IG9mZnNldE9mSklUQ29kZVdpdGhBcml0eUNoZWNrRm9yKAorICAgICAgICBDb2RlU3BlY2lhbGl6
YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAg
Y2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhl
Y3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayk7CisgICAgICAgIGNh
c2UgQ29kZUZvckNvbnN0cnVjdDoKKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0Yo
RXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKTsKKyAg
ICAgICAgfQorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk51bVBh
cmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAg
aWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNF
VE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKTsKKyAgICAgICAgQVNT
RVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZG
U0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCk7CisgICAg
fQorCisgICAgYm9vbCBoYXNKSVRDb2RlRm9yQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA+PSAwOworICAgIH0KKyAgICAgICAgCisgICAg
Ym9vbCBoYXNKSVRDb2RlRm9yQ29uc3RydWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPj0gMDsKKyAgICB9CisgICAgICAgIAorICAg
IGJvb2wgaGFzSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVy
biBoYXNKSVRDb2RlRm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29u
c3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKTsKKyAgICB9
CisKKyAgICAvLyBJbnRyaW5zaWNzIGFyZSBvbmx5IGZvciBjYWxscywgY3VycmVudGx5LgorICAg
IEludHJpbnNpYyBpbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpYzsgfQorICAg
ICAgICAKKyAgICBJbnRyaW5zaWMgaW50cmluc2ljRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQg
a2luZCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0NhbGwoa2luZCkpCisgICAgICAgICAg
ICByZXR1cm4gaW50cmluc2ljKCk7CisgICAgICAgIHJldHVybiBOb0ludHJpbnNpYzsKKyAgICB9
CisgICAgCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgICAgIAorcHJv
dGVjdGVkOgorICAgIEludHJpbnNpYyBtX2ludHJpbnNpYzsKKyAgICBSZWZQdHI8SklUQ29kZT4g
bV9qaXRDb2RlRm9yQ2FsbDsKKyAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ29uc3Ry
dWN0OworICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5
Q2hlY2s7CisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1faml0Q29kZUZvckNvbnN0cnVjdFdp
dGhBcml0eUNoZWNrOworfTsKKworY2xhc3MgTmF0aXZlRXhlY3V0YWJsZSBmaW5hbCA6IHB1Ymxp
YyBFeGVjdXRhYmxlQmFzZSB7CisgICAgZnJpZW5kIGNsYXNzIEpJVDsKKyAgICBmcmllbmQgY2xh
c3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgRXhlY3V0YWJs
ZUJhc2UgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBC
YXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMg
TmF0aXZlRXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxs
VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0
cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNp
YywgY29uc3QgU3RyaW5nJiBuYW1lKTsKKworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxs
Kik7CisKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkg
Y29uc3Q7CisKKyAgICBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbigpIHsgcmV0dXJuIG1fZnVuY3Rp
b247IH0KKyAgICBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvcigpIHsgcmV0dXJuIG1fY29uc3Ry
dWN0b3I7IH0KKyAgICAgICAgCisgICAgTmF0aXZlRnVuY3Rpb24gbmF0aXZlRnVuY3Rpb25Gb3Io
Q29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0g
Q29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsKKyAgICAgICAgQVNT
RVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rv
cigpOworICAgIH0KKyAgICAgICAgCisgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk5hdGl2
ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAg
IGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZT
RVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2Z1bmN0aW9uKTsKKyAgICAgICAgQVNTRVJUKGtpbmQg
PT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoTmF0
aXZlRXhlY3V0YWJsZSwgbV9jb25zdHJ1Y3Rvcik7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVj
dHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiwgSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVlIHByb3Rv
KTsKKyAgICAgICAgCisgICAgREVDTEFSRV9JTkZPOworCisgICAgY29uc3QgU3RyaW5nJiBuYW1l
KCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZpbmlz
aENyZWF0aW9uKFZNJiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIFBhc3NSZWZQdHI8
SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0cmluZyYgbmFtZSk7CisKK3ByaXZhdGU6
CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworCisgICAgTmF0aXZlRXhlY3V0YWJs
ZShWTSYsIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3Rv
ciwgSW50cmluc2ljKTsKKworICAgIE5hdGl2ZUZ1bmN0aW9uIG1fZnVuY3Rpb247CisgICAgTmF0
aXZlRnVuY3Rpb24gbV9jb25zdHJ1Y3RvcjsKKworICAgIFN0cmluZyBtX25hbWU7Cit9OworCitj
bGFzcyBTY3JpcHRFeGVjdXRhYmxlIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2ln
bmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7CisKKyAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hG
b3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBjb25zdCBTb3VyY2VDb2Rl
JiBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZTsgfQorICAgIGludHB0cl90IHNvdXJj
ZUlEKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2UucHJvdmlkZXJJRCgpOyB9CisgICAgY29uc3Qg
U3RyaW5nJiBzb3VyY2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcigpLT51
cmwoKTsgfQorICAgIGludCBmaXJzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0TGluZTsg
fQorICAgIHZvaWQgc2V0T3ZlcnJpZGVMaW5lTnVtYmVyKGludCBvdmVycmlkZUxpbmVOdW1iZXIp
IHsgbV9vdmVycmlkZUxpbmVOdW1iZXIgPSBvdmVycmlkZUxpbmVOdW1iZXI7IH0KKyAgICBib29s
IGhhc092ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVt
YmVyICE9IC0xOyB9CisgICAgaW50IG92ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJu
IG1fb3ZlcnJpZGVMaW5lTnVtYmVyOyB9CisgICAgaW50IGxhc3RMaW5lKCkgY29uc3QgeyByZXR1
cm4gbV9sYXN0TGluZTsgfQorICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1
cm4gbV9zdGFydENvbHVtbjsgfQorICAgIHVuc2lnbmVkIGVuZENvbHVtbigpIGNvbnN0IHsgcmV0
dXJuIG1fZW5kQ29sdW1uOyB9CisgICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7IH0KKyAgICB1bnNp
Z25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmls
aW5nRW5kT2Zmc2V0OyB9CisKKyAgICBib29sIHVzZXNFdmFsKCkgY29uc3QgeyByZXR1cm4gbV9m
ZWF0dXJlcyAmIEV2YWxGZWF0dXJlOyB9CisgICAgYm9vbCB1c2VzQXJndW1lbnRzKCkgY29uc3Qg
eyByZXR1cm4gbV9mZWF0dXJlcyAmIEFyZ3VtZW50c0ZlYXR1cmU7IH0KKyAgICBib29sIGlzQXJy
b3dGdW5jdGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lzQXJyb3dGdW5jdGlvbkNvbnRl
eHQ7IH0KKyAgICBib29sIGlzU3RyaWN0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMg
JiBTdHJpY3RNb2RlRmVhdHVyZTsgfQorICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29u
dGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkQ29udGV4dFR5cGU+
KG1fZGVyaXZlZENvbnRleHRUeXBlKTsgfQorICAgIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4
dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFdmFsQ29udGV4dFR5cGU+KG1fZXZh
bENvbnRleHRUeXBlKTsgfQorCisgICAgRUNNQU1vZGUgZWNtYU1vZGUoKSBjb25zdCB7IHJldHVy
biBpc1N0cmljdE1vZGUoKSA/IFN0cmljdE1vZGUgOiBOb3RTdHJpY3RNb2RlOyB9CisgICAgICAg
IAorICAgIHZvaWQgc2V0TmV2ZXJJbmxpbmUoYm9vbCB2YWx1ZSkgeyBtX25ldmVySW5saW5lID0g
dmFsdWU7IH0KKyAgICB2b2lkIHNldE5ldmVyT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVy
T3B0aW1pemUgPSB2YWx1ZTsgfQorICAgIHZvaWQgc2V0TmV2ZXJGVExPcHRpbWl6ZShib29sIHZh
bHVlKSB7IG1fbmV2ZXJGVExPcHRpbWl6ZSA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXREaWRUcnlU
b0VudGVySW5Mb29wKGJvb2wgdmFsdWUpIHsgbV9kaWRUcnlUb0VudGVySW5Mb29wID0gdmFsdWU7
IH0KKyAgICB2b2lkIHNldENhblVzZU9TUkV4aXRGdXp6aW5nKGJvb2wgdmFsdWUpIHsgbV9jYW5V
c2VPU1JFeGl0RnV6emluZyA9IHZhbHVlOyB9CisgICAgYm9vbCBuZXZlcklubGluZSgpIGNvbnN0
IHsgcmV0dXJuIG1fbmV2ZXJJbmxpbmU7IH0KKyAgICBib29sIG5ldmVyT3B0aW1pemUoKSBjb25z
dCB7IHJldHVybiBtX25ldmVyT3B0aW1pemU7IH0KKyAgICBib29sIG5ldmVyRlRMT3B0aW1pemUo
KSBjb25zdCB7IHJldHVybiBtX25ldmVyRlRMT3B0aW1pemU7IH0KKyAgICBib29sIGRpZFRyeVRv
RW50ZXJJbkxvb3AoKSBjb25zdCB7IHJldHVybiBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KKyAg
ICBib29sIGlzSW5saW5pbmdDYW5kaWRhdGUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJJbmxpbmUo
KTsgfQorICAgIGJvb2wgaXNPa1RvT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJPcHRp
bWl6ZSgpOyB9CisgICAgYm9vbCBjYW5Vc2VPU1JFeGl0RnV6emluZygpIGNvbnN0IHsgcmV0dXJu
IG1fY2FuVXNlT1NSRXhpdEZ1enppbmc7IH0KKyAgICAKKyAgICBib29sKiBhZGRyZXNzT2ZEaWRU
cnlUb0VudGVySW5Mb29wKCkgeyByZXR1cm4gJm1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQorCisg
ICAgQ29kZUZlYXR1cmVzIGZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlczsgfQor
ICAgICAgICAKKyAgICBERUNMQVJFX0VYUE9SVF9JTkZPOworCisgICAgdm9pZCByZWNvcmRQYXJz
ZShDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGJvb2wgaGFzQ2FwdHVyZWRWYXJpYWJsZXMsIGludCBm
aXJzdExpbmUsIGludCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVu
ZENvbHVtbikKKyAgICB7CisgICAgICAgIG1fZmVhdHVyZXMgPSBmZWF0dXJlczsKKyAgICAgICAg
bV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA9IGhhc0NhcHR1cmVkVmFyaWFibGVzOworICAgICAgICBt
X2ZpcnN0TGluZSA9IGZpcnN0TGluZTsKKyAgICAgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwor
ICAgICAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgICAgICBtX3N0YXJ0
Q29sdW1uID0gc3RhcnRDb2x1bW47CisgICAgICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9N
QVgpOworICAgICAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKKyAgICB9CisKKyAgICB2b2lk
IGluc3RhbGxDb2RlKENvZGVCbG9jayopOworICAgIHZvaWQgaW5zdGFsbENvZGUoVk0mLCBDb2Rl
QmxvY2sqLCBDb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7CisgICAgQ29kZUJsb2Nr
KiBuZXdDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgSlNGdW5jdGlvbiosIEpT
U2NvcGUqLCBKU09iamVjdComIGV4Y2VwdGlvbik7CisgICAgQ29kZUJsb2NrKiBuZXdSZXBsYWNl
bWVudENvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKKworICAgIC8vIFRoaXMg
ZnVuY3Rpb24gaGFzIGFuIGludGVyZXN0aW5nIEdDIHN0b3J5LiBDYWxsZXJzIG9mIHRoaXMgZnVu
Y3Rpb24gYXJlIGFza2luZyB1cyB0byBjcmVhdGUgYSBDb2RlQmxvY2sKKyAgICAvLyB0aGF0IGlz
IG5vdCBqZXR0aXNvbmVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIENhbGxlcnMgYXJl
IGVzc2VudGlhbGx5IGFza2luZyBmb3IgYSBzdHJvbmcgcmVmZXJlbmNlCisgICAgLy8gdG8gdGhl
IENvZGVCbG9jay4gQmVjYXVzZSB0aGUgRXhlY3V0YWJsZSBtYXkgYmUgYWxsb2NhdGluZyB0aGUg
Q29kZUJsb2NrLCB3ZSByZXF1aXJlIGNhbGxlcnMgdG8gcGFzcyBpbgorICAgIC8vIHRoZWlyIENv
ZGVCbG9jayomIHJlZmVyZW5jZSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgQ29kZUJsb2NrIHRvIGJl
IGpldHRpc29uZWQgaWYgRXhlY3V0YWJsZSBpcyB0aGUgb25seSB0aGluZworICAgIC8vIHRvIHBv
aW50IHRvIGl0LiBUaGlzIGZvcmNlcyBjYWxsZXJzIHRvIGhhdmUgYSBDb2RlQmxvY2sqIGluIGEg
cmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNrIHRoYXQgd2lsbCBiZSBtYXJrZWQKKyAgICAvLyBieSBj
b25zZXJ2YXRpdmUgR0MgaWYgYSBHQyBoYXBwZW5zIGFmdGVyIHdlIGNyZWF0ZSB0aGUgQ29kZUJs
b2NrLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4KKyAgICBKU09iamVj
dCogcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKTsKKworICAgIHRl
bXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPiB2b2lkIGZvckVhY2hDb2RlQmxvY2soRnVuY3RvciYm
KTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgSlNP
YmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb25JbXBsKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUq
LCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJik7CisKK3Byb3RlY3RlZDoKKyAg
ICBTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSosIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIGJv
b2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dG
dW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSwgSW50cmluc2ljKTsKKworICAgIHZvaWQg
ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQorICAgIHsKKyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRp
b24odm0pOworICAgICAgICB2bS5oZWFwLmFkZEV4ZWN1dGFibGUodGhpcyk7IC8vIEJhbGFuY2Vk
IGJ5IEhlYXA6OmRlbGV0ZVVubWFya2VkQ29tcGlsZWRDb2RlKCkuCisKKyNpZiBFTkFCTEUoQ09E
RUJMT0NLX1NBTVBMSU5HKQorICAgICAgICBpZiAoU2FtcGxpbmdUb29sKiBzYW1wbGVyID0gdm0u
aW50ZXJwcmV0ZXItPnNhbXBsZXIoKSkKKyAgICAgICAgICAgIHNhbXBsZXItPm5vdGlmeU9mU2Nv
cGUodm0sIHRoaXMpOworI2VuZGlmCisgICAgfQorCisgICAgQ29kZUZlYXR1cmVzIG1fZmVhdHVy
ZXM7CisgICAgYm9vbCBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7CisgICAgYm9vbCBtX2hhc0NhcHR1
cmVkVmFyaWFibGVzIDogMTsKKyAgICBib29sIG1fbmV2ZXJJbmxpbmUgOiAxOworICAgIGJvb2wg
bV9uZXZlck9wdGltaXplIDogMTsKKyAgICBib29sIG1fbmV2ZXJGVExPcHRpbWl6ZSA6IDE7Cisg
ICAgYm9vbCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQgOiAxOworICAgIGJvb2wgbV9jYW5Vc2VP
U1JFeGl0RnV6emluZyA6IDE7CisgICAgdW5zaWduZWQgbV9kZXJpdmVkQ29udGV4dFR5cGUgOiAy
OyAvLyBEZXJpdmVkQ29udGV4dFR5cGUKKyAgICB1bnNpZ25lZCBtX2V2YWxDb250ZXh0VHlwZSA6
IDI7IC8vIEV2YWxDb250ZXh0VHlwZQorCisgICAgaW50IG1fb3ZlcnJpZGVMaW5lTnVtYmVyOwor
ICAgIGludCBtX2ZpcnN0TGluZTsKKyAgICBpbnQgbV9sYXN0TGluZTsKKyAgICB1bnNpZ25lZCBt
X3N0YXJ0Q29sdW1uOworICAgIHVuc2lnbmVkIG1fZW5kQ29sdW1uOworICAgIHVuc2lnbmVkIG1f
dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OworICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ0Vu
ZE9mZnNldDsKKyAgICBTb3VyY2VDb2RlIG1fc291cmNlOworfTsKKworY2xhc3MgRXZhbEV4ZWN1
dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNz
IExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1
dGFibGUgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBC
YXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrKCkK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2V2YWxDb2RlQmxvY2suZ2V0KCk7CisgICAgfQorCisg
ICAgc3RhdGljIEV2YWxFeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNl
Q29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBp
c0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52
aXJvbm1lbnQqKTsKKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgp
CisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9
CisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2Jh
bE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhF
dmFsRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisgICAg
ICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJ
bmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RN
b2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlw
dE1vZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6
OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4
dCgpLCBmYWxzZSwgZXZhbENvbnRleHRUeXBlKCkpOyB9CisKKyAgICB1bnNpZ25lZCBudW1WYXJp
YWJsZXMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFibGVzKCk7
IH0KKyAgICB1bnNpZ25lZCBudW1iZXJPZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBtX3VubGlu
a2VkRXZhbENvZGVCbG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IH0KKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgZnJpZW5kIGNsYXNzIFNjcmlw
dEV4ZWN1dGFibGU7CisKKyAgICBFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3Vy
Y2VDb2RlJiwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBp
c0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUpOworCisgICAgc3RhdGljIHZv
aWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJy
aWVyPEV2YWxDb2RlQmxvY2s+IG1fZXZhbENvZGVCbG9jazsKKyAgICBXcml0ZUJhcnJpZXI8VW5s
aW5rZWRFdmFsQ29kZUJsb2NrPiBtX3VubGlua2VkRXZhbENvZGVCbG9jazsKK307CisKK2NsYXNz
IFByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAg
IGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRl
ZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVj
dHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwor
CisgICAgc3RhdGljIFByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBj
b25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCisgICAgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJs
ZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFByb2dyYW1FeGVjdXRh
YmxlPigqZXhlYy0+aGVhcCgpKSkgUHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKKyAg
ICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7CisgICAgICAgIHJl
dHVybiBleGVjdXRhYmxlOworICAgIH0KKworCisgICAgSlNPYmplY3QqIGluaXRpYWxpemVHbG9i
YWxQcm9wZXJ0aWVzKFZNJiwgQ2FsbEZyYW1lKiwgSlNTY29wZSopOworCisgICAgc3RhdGljIHZv
aWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygp
CisgICAgeworICAgICAgICByZXR1cm4gbV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgIH0K
KworICAgIEpTT2JqZWN0KiBjaGVja1N5bnRheChFeGVjU3RhdGUqKTsKKworICAgIFBhc3NSZWZQ
dHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2Vu
ZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9CisgICAgICAgIAorICAgIHN0YXRpYyBTdHJ1
Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmpl
Y3QsIEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVh
dGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFByb2dyYW1FeGVjdXRhYmxlVHlw
ZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOworICAgIH0KKyAgICAgICAgCisgICAgREVDTEFS
RV9JTkZPOworCisgICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJl
dHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZh
bHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywg
U3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIGRl
cml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFs
Q29udGV4dFR5cGU6Ok5vbmUpOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1
dGFibGVCYXNlOworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgUHJv
Z3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3Rh
dGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgV3Jp
dGVCYXJyaWVyPFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZFByb2dyYW1Db2Rl
QmxvY2s7CisgICAgV3JpdGVCYXJyaWVyPFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3JhbUNvZGVC
bG9jazsKK307CisKK2NsYXNzIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGlj
IFNjcmlwdEV4ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0
b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3Mg
fCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGlj
IHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNv
ZGVCbG9jaygpCisgICAgeworICAgICAgICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
LmdldCgpOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29k
ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5m
byhNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsK
KyAgICB9CisKKyAgICBERUNMQVJFX0lORk87CisKKyAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRh
YmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3Ry
aWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJT
Y3JpcHRNb2RlOjpNb2R1bGUsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1v
ZGU6Ok1vZHVsZUV2YWx1YXRlTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5j
dGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KKworICAgIFVu
bGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJs
b2NrKCkgeyByZXR1cm4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7IH0K
KworICAgIFN5bWJvbFRhYmxlKiBtb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkgeyByZXR1
cm4gbV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLmdldCgpOyB9CisKK3ByaXZhdGU6Cisg
ICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRF
eGVjdXRhYmxlOworCisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29u
c3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwq
LCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jaz4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7CisgICAgV3JpdGVC
YXJyaWVyPFN5bWJvbFRhYmxlPiBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7CisgICAg
V3JpdGVCYXJyaWVyPE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNvZGVC
bG9jazsKK307CisKK2NsYXNzIEZ1bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3Jp
cHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgSklUOworICAgIGZyaWVuZCBjbGFzcyBM
TEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRh
YmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFz
ZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIEZ1
bmN0aW9uRXhlY3V0YWJsZSogY3JlYXRlKAorICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJjZUNv
ZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJs
ZSwgCisgICAgICAgIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2ln
bmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMp
CisgICAgeworICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5v
dE51bGwsIGFsbG9jYXRlQ2VsbDxGdW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5jdGlv
bkV4ZWN1dGFibGUodm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUsIGxh
c3RMaW5lLCBzdGFydENvbHVtbiwgZW5kQ29sdW1uLCBpbnRyaW5zaWMpOworICAgICAgICBleGVj
dXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOwor
ICAgIH0KKyAgICBzdGF0aWMgRnVuY3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgKKyAg
ICAgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNlQ29k
ZSYsIAorICAgICAgICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJl
cik7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBV
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKKyAgICB9CisK
KyAgICAvLyBSZXR1cm5zIGVpdGhlciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhpcyBj
YW4gYmUgYXBwcm9wcmlhdGUKKyAgICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0IHRo
YXQgZG9uJ3QgdmFyeSBiZXR3ZWVuIGNhbGwgYW5kIGNvbnN0cnVjdCAtLQorICAgIC8vIGZvciBl
eGFtcGxlLCBhcmd1bWVudHNSZWdpc3RlcigpLgorICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBlaXRo
ZXJDb2RlQmxvY2soKQorICAgIHsKKyAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkKKyAg
ICAgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgICAgIHJldHVy
biBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICB9CisgICAgICAgIAorICAgIGJv
b2wgaXNHZW5lcmF0ZWRGb3JDYWxsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhIW1f
Y29kZUJsb2NrRm9yQ2FsbDsKKyAgICB9CisKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJs
b2NrRm9yQ2FsbCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdl
dCgpOworICAgIH0KKworICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAg
IH0KKworICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0K
KyAgICAgICAgCisgICAgYm9vbCBpc0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAg
ICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0g
Q29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0cnVj
dCgpOworICAgIH0KKyAgICAgICAgCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0Zv
cihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7Cisg
ICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4g
Y29kZUJsb2NrRm9yQ29uc3RydWN0KCk7CisgICAgfQorCisgICAgRnVuY3Rpb25Db2RlQmxvY2sq
IGJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOworICAgICAgICAK
KyAgICBGdW5jdGlvbkNvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxp
emF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJsb2Nr
Rm9yKGtpbmQpOworICAgIH0KKworICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1lbnRU
eXBlU2V0KCkgCisgICAgeworICAgICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCkK
KyAgICAgICAgICAgIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0ZSgp
OworCisgICAgICAgIHJldHVybiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7CisgICAgfQorICAg
ICAgICAKKyAgICBGdW5jdGlvbk1vZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxpbmtl
ZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTW9kZSgpOyB9CisgICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlv
bigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5jdGlv
bigpOyB9CisgICAgQ29uc3RydWN0QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3QgeyBy
ZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQorICAgIGJv
b2wgaXNDbGFzcygpIGNvbnN0IHsgcmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9Cisg
ICAgYm9vbCBpc0Fycm93RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBT
b3VyY2VQYXJzZU1vZGU6OkFycm93RnVuY3Rpb25Nb2RlOyB9CisgICAgYm9vbCBpc0dldHRlcigp
IGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVyTW9k
ZTsgfQorICAgIGJvb2wgaXNTZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBT
b3VyY2VQYXJzZU1vZGU6OlNldHRlck1vZGU7IH0KKyAgICBib29sIGlzR2VuZXJhdG9yKCkgY29u
c3QgeyByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9y
Qm9keU1vZGUsIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZSku
Y29udGFpbnMocGFyc2VNb2RlKCkpOyB9CisgICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsgcmV0
dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQorICAgIGJv
b2wgaGFzQ2FsbGVyQW5kQXJndW1lbnRzUHJvcGVydGllcygpIGNvbnN0CisgICAgeworICAgICAg
ICAvLyBQZXIgaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVuLWV4
dGVuc2lvbnMsIG9ubHkgc2xvcHB5LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9sZC1z
dHlsZSAocHJlLUVTNikgc3ludGFjdGljIGZvcm1zIGNhbiBjb250YWluCisgICAgICAgIC8vICJj
YWxsZXIiIGFuZCAiYXJndW1lbnRzIi4KKyAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUoKSAm
JiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAmJiAh
aXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsKKyAgICB9CisgICAgYm9vbCBoYXNQcm90b3R5
cGVQcm9wZXJ0eSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gU291cmNlUGFyc2VNb2Rl
U2V0KAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUsCisg
ICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAorICAgICAgICAg
ICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCisgICAgICAg
ICkuY29udGFpbnMocGFyc2VNb2RlKCkpIHx8IGlzQ2xhc3MoKTsKKyAgICB9CisgICAgRGVyaXZl
ZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5r
ZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKTsgfQorICAgIGJvb2wgaXNDbGFzc0Nv
bnN0cnVjdG9yRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+
aXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsgfQorICAgIGNvbnN0IElkZW50aWZpZXImIG5h
bWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9CisgICAgY29uc3Qg
SWRlbnRpZmllciYgZWNtYU5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZWNt
YU5hbWUoKTsgfQorICAgIGNvbnN0IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0dXJu
IG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pbmZlcnJlZE5hbWUoKTsgfQorICAgIHVuc2lnbmVkIHBh
cmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFt
ZXRlckNvdW50KCk7IH0gLy8gRXhjbHVkaW5nICd0aGlzJyEKKyAgICB1bnNpZ25lZCBmdW5jdGlv
bkxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbkxl
bmd0aCgpOyB9CisgICAgU291cmNlUGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0dXJu
IG1fdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJzZU1vZGUoKTsgfQorICAgIEpTUGFyc2VyU2NyaXB0
TW9kZSBzY3JpcHRNb2RlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnNj
cmlwdE1vZGUoKTsgfQorICAgIGNvbnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29uc3Qg
eyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KKworICAgIHN0
YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKyAgICBzdGF0
aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xv
YmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVy
ZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4ZWN1
dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAgfQorCisgICAgdW5zaWdu
ZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJzU3Rh
cnRPZmZzZXQ7IH0KKworICAgIHZvaWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmlsaW5n
U3RhcnRFbmRPZmZzZXRzKHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWduZWQg
dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0
KQorICAgIHsKKyAgICAgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJzU3Rh
cnRPZmZzZXQ7CisgICAgICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVByb2Zp
bGluZ1N0YXJ0T2Zmc2V0OworICAgICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0eXBl
UHJvZmlsaW5nRW5kT2Zmc2V0OworICAgIH0KKworICAgIERFQ0xBUkVfSU5GTzsKKworICAgIElu
ZmVycmVkVmFsdWUqIHNpbmdsZXRvbkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25GdW5j
dGlvbi5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFz
ZTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUoCisgICAgICAgIFZNJiwgY29uc3QgU291cmNlQ29k
ZSYsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAKKyAg
ICAgICAgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBl
bmRDb2x1bW4sIEludHJpbnNpYyk7CisgICAgCisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYp
OworCisgICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7CisgICAgCisgICAgdW5zaWdu
ZWQgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7CisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRnVu
Y3Rpb25FeGVjdXRhYmxlPiBtX3VubGlua2VkRXhlY3V0YWJsZTsKKyAgICBXcml0ZUJhcnJpZXI8
RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKKyAgICBXcml0ZUJhcnJpZXI8
RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0OworICAgIFJlZlB0cjxU
eXBlU2V0PiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7CisgICAgV3JpdGVCYXJyaWVyPEluZmVy
cmVkVmFsdWU+IG1fc2luZ2xldG9uRnVuY3Rpb247Cit9OworCisjaWYgRU5BQkxFKFdFQkFTU0VN
QkxZKQorY2xhc3MgV2ViQXNzZW1ibHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFi
bGVCYXNlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxh
Z3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIFdlYkFzc2VtYmx5RXhlY3V0
YWJsZSogY3JlYXRlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1
bGUqIG1vZHVsZSwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCkKKyAgICB7CisgICAgICAgIFdlYkFz
c2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxs
PFdlYkFzc2VtYmx5RXhlY3V0YWJsZT4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSh2
bSwgc291cmNlLCBtb2R1bGUsIGZ1bmN0aW9uSW5kZXgpOworICAgICAgICBleGVjdXRhYmxlLT5m
aW5pc2hDcmVhdGlvbih2bSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKwor
ICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2Jq
ZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAgICByZXR1cm4g
U3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdlYkFz
c2VtYmx5RXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisK
KyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAgREVDTEFSRV9JTkZPOwor
CisgICAgdm9pZCBwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJik7CisKKyAgICBXZWJBc3NlbWJseUNv
ZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9jb2Rl
QmxvY2tGb3JDYWxsLmdldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
RXhlY3V0YWJsZUJhc2U7CisgICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3QgU291
cmNlQ29kZSYsIEpTV2FzbU1vZHVsZSosIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOworCisgICAg
c3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAg
U291cmNlQ29kZSBtX3NvdXJjZTsKKyAgICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBtX21v
ZHVsZTsKKyAgICB1bnNpZ25lZCBtX2Z1bmN0aW9uSW5kZXg7CisKKyAgICBXcml0ZUJhcnJpZXI8
V2ViQXNzZW1ibHlDb2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKK307CisjZW5kaWYKKwor
dGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgorSlNPYmplY3QqIFNjcmlwdEV4ZWN1
dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwg
SlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYg
cmVzdWx0Q29kZUJsb2NrKQoreworICAgIGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7CisgICAg
ICAgIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6dmFs
dWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanND
YXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKKyAgICAgICAgZWxzZSBp
ZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVl
KQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2Fz
dDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7CisgICAgICAgIGVsc2Ug
aWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+
Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sq
Pihqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwor
ICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9uRXhl
Y3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENv
ZGVCbG9jayo+KGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrRm9y
KGtpbmQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwcmVw
YXJlRm9yRXhlY3V0aW9uSW1wbCh2bSwgZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRDb2Rl
QmxvY2spOworfQorCit9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0V2YWxFeGVjdXRhYmxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFibGUuaAkocmV2aXNpb24gMjA3NzkwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXZhbEV4ZWN1dGFibGUuaAkod29ya2luZyBj
b3B5KQpAQCAtMjUsMzk1ICsyNSwxMCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkFy
aXR5Q2hlY2tNb2RlLmgiCi0jaW5jbHVkZSAiQ2FsbERhdGEuaCIKLSNpbmNsdWRlICJDb2RlQmxv
Y2tIYXNoLmgiCi0jaW5jbHVkZSAiQ29kZVNwZWNpYWxpemF0aW9uS2luZC5oIgotI2luY2x1ZGUg
IkNvbXBpbGF0aW9uUmVzdWx0LmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZUluZm8uaCIKLSNpbmNs
dWRlICJIYW5kbGVySW5mby5oIgotI2luY2x1ZGUgIkluZmVycmVkVmFsdWUuaCIKLSNpbmNsdWRl
ICJKSVRDb2RlLmgiCi0jaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKLSNpbmNsdWRlICJTb3Vy
Y2VDb2RlLmgiCi0jaW5jbHVkZSAiVHlwZVNldC5oIgotI2luY2x1ZGUgIlVubGlua2VkQ29kZUJs
b2NrLmgiCi0jaW5jbHVkZSAiVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUuaCIKKyNpbmNsdWRl
ICJTY3JpcHRFeGVjdXRhYmxlLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCi1jbGFzcyBDb2RlQmxv
Y2s7Ci1jbGFzcyBFdmFsQ29kZUJsb2NrOwotY2xhc3MgRnVuY3Rpb25Db2RlQmxvY2s7Ci1jbGFz
cyBKU1Njb3BlOwotY2xhc3MgSlNXYXNtTW9kdWxlOwotY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFj
dG9yOwotY2xhc3MgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLWNsYXNzIFByb2dyYW1Db2RlQmxv
Y2s7Ci1jbGFzcyBXZWJBc3NlbWJseUNvZGVCbG9jazsKLQotZW51bSBDb21waWxhdGlvbktpbmQg
eyBGaXJzdENvbXBpbGF0aW9uLCBPcHRpbWl6aW5nQ29tcGlsYXRpb24gfTsKLQotaW5saW5lIGJv
b2wgaXNDYWxsKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsKLSAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgQVNTRVJUKGtpbmQgPT0g
Q29kZUZvckNvbnN0cnVjdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jbGFzcyBFeGVjdXRh
YmxlQmFzZSA6IHB1YmxpYyBKU0NlbGwgewotICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0KLXByb3Rl
Y3RlZDoKLSAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QgPSAwOwot
ICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEID0gLTE7Ci0K
LSAgICBFeGVjdXRhYmxlQmFzZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBpbnQgbnVt
UGFyYW1ldGVycywgSW50cmluc2ljIGludHJpbnNpYykKLSAgICAgICAgOiBKU0NlbGwodm0sIHN0
cnVjdHVyZSkKLSAgICAgICAgLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKG51bVBhcmFtZXRlcnMp
Ci0gICAgICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0KG51bVBhcmFtZXRlcnMpCi0g
ICAgICAgICwgbV9pbnRyaW5zaWMoaW50cmluc2ljKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lk
IGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKLSAgICB7Ci0gICAgICAgIEJhc2U6OmZpbmlzaENyZWF0
aW9uKHZtKTsKLSAgICB9Ci0KLXB1YmxpYzoKLSAgICB0eXBlZGVmIEpTQ2VsbCBCYXNlOwotICAg
IHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZs
YWdzOwotCi0gICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRydWU7Ci0g
ICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLSAgICAgICAgCi0gICAgQ29kZUJsb2Nr
SGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OwotCi0gICAgYm9vbCBp
c0V2YWxFeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0g
RXZhbEV4ZWN1dGFibGVUeXBlOwotICAgIH0KLSAgICBib29sIGlzRnVuY3Rpb25FeGVjdXRhYmxl
KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gRnVuY3Rpb25FeGVjdXRh
YmxlVHlwZTsKLSAgICB9Ci0gICAgYm9vbCBpc1Byb2dyYW1FeGVjdXRhYmxlKCkgY29uc3QKLSAg
ICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwotICAg
IH0KLSAgICBib29sIGlzTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIHR5cGUoKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotCi0K
LSAgICBib29sIGlzSG9zdEZ1bmN0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVCgo
bV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSA9PSAobV9u
dW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QpKTsKLSAg
ICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNf
SE9TVDsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi0gICAgYm9vbCBpc1dlYkFz
c2VtYmx5RXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09
IFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBzdGF0aWMg
U3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFs
T2JqZWN0LCBKU1ZhbHVlIHByb3RvKSB7IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xv
YmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oQ2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5m
bygpKTsgfQotICAgICAgICAKLSAgICB2b2lkIGNsZWFyQ29kZSgpOwotCi0gICAgREVDTEFSRV9F
WFBPUlRfSU5GTzsKLQotcHJvdGVjdGVkOgotICAgIGludCBtX251bVBhcmFtZXRlcnNGb3JDYWxs
OwotICAgIGludCBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3Q7Ci0KLXB1YmxpYzoKLSAgICBQ
YXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCkKLSAgICB7Ci0gICAg
ICAgIEFTU0VSVChtX2ppdENvZGVGb3JDYWxsKTsKLSAgICAgICAgcmV0dXJuIG1faml0Q29kZUZv
ckNhbGw7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2Rl
Rm9yQ29uc3RydWN0KCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2ppdENvZGVGb3JDb25zdHJ1
Y3QpOwotICAgICAgICByZXR1cm4gbV9qaXRDb2RlRm9yQ29uc3RydWN0OwotICAgIH0KLSAgICAg
ICAgCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yKENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JD
YWxsKQotICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7Ci0gICAg
ICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gZ2Vu
ZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgpOwotICAgIH0KLSAgICAKLSAgICBNYWNyb0Fzc2Vt
YmxlckNvZGVQdHIgZW50cnlwb2ludEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIEFy
aXR5Q2hlY2tNb2RlIGFyaXR5KQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBh
IGNhY2hlZCByZXN1bHQuIFdlIG9ubHkgaGF2ZSBpdCBmb3IgYXJpdHkgY2hlY2sgYmVjYXVzZSB3
ZSB1c2UgdGhlCi0gICAgICAgIC8vIG5vLWFyaXR5IGVudHJ5cG9pbnQgaW4gbm9uLXZpcnR1YWwg
Y2FsbHMsIHdoaWNoIHdpbGwgImNhY2hlIiB0aGlzIHZhbHVlIGRpcmVjdGx5IGluCi0gICAgICAg
IC8vIG1hY2hpbmUgY29kZS4KLSAgICAgICAgaWYgKGFyaXR5ID09IE11c3RDaGVja0FyaXR5KSB7
Ci0gICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgQ29kZUZvckNh
bGw6Ci0gICAgICAgICAgICAgICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPSBt
X2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2spCi0gICAgICAgICAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvZGVG
b3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBy
ZXN1bHQgPSBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjaykKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0K
LSAgICAgICAgICAgIGdlbmVyYXRlZEpJVENvZGVGb3Ioa2luZCktPmFkZHJlc3NGb3JDYWxsKGFy
aXR5KTsKLSAgICAgICAgaWYgKGFyaXR5ID09IE11c3RDaGVja0FyaXR5KSB7Ci0gICAgICAgICAg
ICAvLyBDYWNoZSB0aGUgcmVzdWx0OyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIEpJVCdzIHZp
cnR1YWwgY2FsbCBvcHRpbWl6YXRpb25zLgotICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0g
ICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgICAgIG1faml0Q29kZUZv
ckNhbGxXaXRoQXJpdHlDaGVjayA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgICAgICBtX2ppdENv
ZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0Owot
ICAgIH0KLQotICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZKSVRDb2RlV2l0aEFyaXR5Q2hl
Y2tGb3IoCi0gICAgICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAg
ICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAg
ICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9qaXRDb2RlRm9yQ2Fs
bFdpdGhBcml0eUNoZWNrKTsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAgICAg
ICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9qaXRDb2RlRm9y
Q29uc3RydWN0V2l0aEFyaXR5Q2hlY2spOwotICAgICAgICB9Ci0gICAgICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBz
dGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTnVtUGFyYW1ldGVyc0ZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAg
ICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFy
YW1ldGVyc0ZvckNhbGwpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0
KTsKLSAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9udW1Q
YXJhbWV0ZXJzRm9yQ29uc3RydWN0KTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0pJVENvZGVGb3JD
YWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDYWxs
ID49IDA7Ci0gICAgfQotICAgICAgICAKLSAgICBib29sIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3Qo
KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVj
dCA+PSAwOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yKENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENv
ZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDYWxsKCk7Ci0gICAg
ICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gaGFz
SklUQ29kZUZvckNvbnN0cnVjdCgpOwotICAgIH0KLQotICAgIC8vIEludHJpbnNpY3MgYXJlIG9u
bHkgZm9yIGNhbGxzLCBjdXJyZW50bHkuCi0gICAgSW50cmluc2ljIGludHJpbnNpYygpIGNvbnN0
IHsgcmV0dXJuIG1faW50cmluc2ljOyB9Ci0gICAgICAgIAotICAgIEludHJpbnNpYyBpbnRyaW5z
aWNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAotICAgIHsKLSAgICAgICAg
aWYgKGlzQ2FsbChraW5kKSkKLSAgICAgICAgICAgIHJldHVybiBpbnRyaW5zaWMoKTsKLSAgICAg
ICAgcmV0dXJuIE5vSW50cmluc2ljOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgSW50cmluc2ljIG1faW50
cmluc2ljOwotICAgIFJlZlB0cjxKSVRDb2RlPiBtX2ppdENvZGVGb3JDYWxsOwotICAgIFJlZlB0
cjxKSVRDb2RlPiBtX2ppdENvZGVGb3JDb25zdHJ1Y3Q7Ci0gICAgTWFjcm9Bc3NlbWJsZXJDb2Rl
UHRyIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjazsKLSAgICBNYWNyb0Fzc2VtYmxlckNv
ZGVQdHIgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2s7Ci19OwotCi1jbGFzcyBO
YXRpdmVFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLSAgICBmcmll
bmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1w
dWJsaWM6Ci0gICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOwotICAgIHN0YXRpYyBjb25z
dCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0
dXJlSXNJbW1vcnRhbDsKLQotICAgIHN0YXRpYyBOYXRpdmVFeGVjdXRhYmxlKiBjcmVhdGUoVk0m
IHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZlRnVuY3Rpb24gZnVuY3Rp
b24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGNv
bnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJpbmcmIG5hbWUpOwotCi0g
ICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAgIENvZGVCbG9ja0hhc2ggaGFz
aEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIE5hdGl2ZUZ1bmN0aW9u
IGZ1bmN0aW9uKCkgeyByZXR1cm4gbV9mdW5jdGlvbjsgfQotICAgIE5hdGl2ZUZ1bmN0aW9uIGNv
bnN0cnVjdG9yKCkgeyByZXR1cm4gbV9jb25zdHJ1Y3RvcjsgfQotICAgICAgICAKLSAgICBOYXRp
dmVGdW5jdGlvbiBuYXRpdmVGdW5jdGlvbkZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
Ci0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJl
dHVybiBmdW5jdGlvbigpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0
KTsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKCk7Ci0gICAgfQotICAgICAgICAKLSAgICBz
dGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTmF0aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0
aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0g
ICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUsIG1fZnVu
Y3Rpb24pOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAg
ICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2NvbnN0cnVjdG9y
KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBK
U0dsb2JhbE9iamVjdCosIEpTVmFsdWUgcHJvdG8pOwotICAgICAgICAKLSAgICBERUNMQVJFX0lO
Rk87Ci0KLSAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0K
LQotcHJvdGVjdGVkOgotICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mLCBQYXNzUmVmUHRyPEpJ
VENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29u
c3QgU3RyaW5nJiBuYW1lKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJs
ZUJhc2U7Ci0KLSAgICBOYXRpdmVFeGVjdXRhYmxlKFZNJiwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rp
b24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMpOwotCi0gICAgTmF0aXZl
RnVuY3Rpb24gbV9mdW5jdGlvbjsKLSAgICBOYXRpdmVGdW5jdGlvbiBtX2NvbnN0cnVjdG9yOwot
Ci0gICAgU3RyaW5nIG1fbmFtZTsKLX07Ci0KLWNsYXNzIFNjcmlwdEV4ZWN1dGFibGUgOiBwdWJs
aWMgRXhlY3V0YWJsZUJhc2UgewotcHVibGljOgotICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2Ug
QmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpT
dHJ1Y3R1cmVGbGFnczsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0gICAg
ICAgIAotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBj
b25zdDsKLQotICAgIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c291cmNlOyB9Ci0gICAgaW50cHRyX3Qgc291cmNlSUQoKSBjb25zdCB7IHJldHVybiBtX3NvdXJj
ZS5wcm92aWRlcklEKCk7IH0KLSAgICBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCgpIGNvbnN0IHsg
cmV0dXJuIG1fc291cmNlLnByb3ZpZGVyKCktPnVybCgpOyB9Ci0gICAgaW50IGZpcnN0TGluZSgp
IGNvbnN0IHsgcmV0dXJuIG1fZmlyc3RMaW5lOyB9Ci0gICAgdm9pZCBzZXRPdmVycmlkZUxpbmVO
dW1iZXIoaW50IG92ZXJyaWRlTGluZU51bWJlcikgeyBtX292ZXJyaWRlTGluZU51bWJlciA9IG92
ZXJyaWRlTGluZU51bWJlcjsgfQotICAgIGJvb2wgaGFzT3ZlcnJpZGVMaW5lTnVtYmVyKCkgY29u
c3QgeyByZXR1cm4gbV9vdmVycmlkZUxpbmVOdW1iZXIgIT0gLTE7IH0KLSAgICBpbnQgb3ZlcnJp
ZGVMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9vdmVycmlkZUxpbmVOdW1iZXI7IH0KLSAg
ICBpbnQgbGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2xhc3RMaW5lOyB9Ci0gICAgdW5zaWdu
ZWQgc3RhcnRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0Q29sdW1uOyB9Ci0gICAgdW5z
aWduZWQgZW5kQ29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9lbmRDb2x1bW47IH0KLSAgICB1bnNp
Z25lZCB0eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3R5cGVQcm9m
aWxpbmdTdGFydE9mZnNldDsgfQotICAgIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdFbmRPZmZzZXQo
KSBjb25zdCB7IHJldHVybiBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQ7IH0KLQotICAgIGJvb2wg
dXNlc0V2YWwoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzICYgRXZhbEZlYXR1cmU7IH0KLSAg
ICBib29sIHVzZXNBcmd1bWVudHMoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzICYgQXJndW1l
bnRzRmVhdHVyZTsgfQotICAgIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpIGNvbnN0IHsg
cmV0dXJuIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dDsgfQotICAgIGJvb2wgaXNTdHJpY3RNb2Rl
KCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIFN0cmljdE1vZGVGZWF0dXJlOyB9Ci0gICAg
RGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0
YXRpY19jYXN0PERlcml2ZWRDb250ZXh0VHlwZT4obV9kZXJpdmVkQ29udGV4dFR5cGUpOyB9Ci0g
ICAgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PEV2YWxDb250ZXh0VHlwZT4obV9ldmFsQ29udGV4dFR5cGUpOyB9Ci0KLSAgICBFQ01B
TW9kZSBlY21hTW9kZSgpIGNvbnN0IHsgcmV0dXJuIGlzU3RyaWN0TW9kZSgpID8gU3RyaWN0TW9k
ZSA6IE5vdFN0cmljdE1vZGU7IH0KLSAgICAgICAgCi0gICAgdm9pZCBzZXROZXZlcklubGluZShi
b29sIHZhbHVlKSB7IG1fbmV2ZXJJbmxpbmUgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0TmV2ZXJP
cHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJPcHRpbWl6ZSA9IHZhbHVlOyB9Ci0gICAgdm9p
ZCBzZXROZXZlckZUTE9wdGltaXplKGJvb2wgdmFsdWUpIHsgbV9uZXZlckZUTE9wdGltaXplID0g
dmFsdWU7IH0KLSAgICB2b2lkIHNldERpZFRyeVRvRW50ZXJJbkxvb3AoYm9vbCB2YWx1ZSkgeyBt
X2RpZFRyeVRvRW50ZXJJbkxvb3AgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0Q2FuVXNlT1NSRXhp
dEZ1enppbmcoYm9vbCB2YWx1ZSkgeyBtX2NhblVzZU9TUkV4aXRGdXp6aW5nID0gdmFsdWU7IH0K
LSAgICBib29sIG5ldmVySW5saW5lKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlcklubGluZTsgfQot
ICAgIGJvb2wgbmV2ZXJPcHRpbWl6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJPcHRpbWl6ZTsg
fQotICAgIGJvb2wgbmV2ZXJGVExPcHRpbWl6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJGVExP
cHRpbWl6ZTsgfQotICAgIGJvb2wgZGlkVHJ5VG9FbnRlckluTG9vcCgpIGNvbnN0IHsgcmV0dXJu
IG1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQotICAgIGJvb2wgaXNJbmxpbmluZ0NhbmRpZGF0ZSgp
IGNvbnN0IHsgcmV0dXJuICFuZXZlcklubGluZSgpOyB9Ci0gICAgYm9vbCBpc09rVG9PcHRpbWl6
ZSgpIGNvbnN0IHsgcmV0dXJuICFuZXZlck9wdGltaXplKCk7IH0KLSAgICBib29sIGNhblVzZU9T
UkV4aXRGdXp6aW5nKCkgY29uc3QgeyByZXR1cm4gbV9jYW5Vc2VPU1JFeGl0RnV6emluZzsgfQot
ICAgIAotICAgIGJvb2wqIGFkZHJlc3NPZkRpZFRyeVRvRW50ZXJJbkxvb3AoKSB7IHJldHVybiAm
bV9kaWRUcnlUb0VudGVySW5Mb29wOyB9Ci0KLSAgICBDb2RlRmVhdHVyZXMgZmVhdHVyZXMoKSBj
b25zdCB7IHJldHVybiBtX2ZlYXR1cmVzOyB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfRVhQT1JU
X0lORk87Ci0KLSAgICB2b2lkIHJlY29yZFBhcnNlKENvZGVGZWF0dXJlcyBmZWF0dXJlcywgYm9v
bCBoYXNDYXB0dXJlZFZhcmlhYmxlcywgaW50IGZpcnN0TGluZSwgaW50IGxhc3RMaW5lLCB1bnNp
Z25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uKQotICAgIHsKLSAgICAgICAgbV9m
ZWF0dXJlcyA9IGZlYXR1cmVzOwotICAgICAgICBtX2hhc0NhcHR1cmVkVmFyaWFibGVzID0gaGFz
Q2FwdHVyZWRWYXJpYWJsZXM7Ci0gICAgICAgIG1fZmlyc3RMaW5lID0gZmlyc3RMaW5lOwotICAg
ICAgICBtX2xhc3RMaW5lID0gbGFzdExpbmU7Ci0gICAgICAgIEFTU0VSVChzdGFydENvbHVtbiAh
PSBVSU5UX01BWCk7Ci0gICAgICAgIG1fc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKLSAgICAg
ICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgICAgIG1fZW5kQ29sdW1uID0g
ZW5kQ29sdW1uOwotICAgIH0KLQotICAgIHZvaWQgaW5zdGFsbENvZGUoQ29kZUJsb2NrKik7Ci0g
ICAgdm9pZCBpbnN0YWxsQ29kZShWTSYsIENvZGVCbG9jayosIENvZGVUeXBlLCBDb2RlU3BlY2lh
bGl6YXRpb25LaW5kKTsKLSAgICBDb2RlQmxvY2sqIG5ld0NvZGVCbG9ja0ZvcihDb2RlU3BlY2lh
bGl6YXRpb25LaW5kLCBKU0Z1bmN0aW9uKiwgSlNTY29wZSosIEpTT2JqZWN0KiYgZXhjZXB0aW9u
KTsKLSAgICBDb2RlQmxvY2sqIG5ld1JlcGxhY2VtZW50Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFs
aXphdGlvbktpbmQpOwotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgYW4gaW50ZXJlc3Rpbmcg
R0Mgc3RvcnkuIENhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgYXNraW5nIHVzIHRvIGNyZWF0
ZSBhIENvZGVCbG9jawotICAgIC8vIHRoYXQgaXMgbm90IGpldHRpc29uZWQgYmVmb3JlIHRoaXMg
ZnVuY3Rpb24gcmV0dXJucy4gQ2FsbGVycyBhcmUgZXNzZW50aWFsbHkgYXNraW5nIGZvciBhIHN0
cm9uZyByZWZlcmVuY2UKLSAgICAvLyB0byB0aGUgQ29kZUJsb2NrLiBCZWNhdXNlIHRoZSBFeGVj
dXRhYmxlIG1heSBiZSBhbGxvY2F0aW5nIHRoZSBDb2RlQmxvY2ssIHdlIHJlcXVpcmUgY2FsbGVy
cyB0byBwYXNzIGluCi0gICAgLy8gdGhlaXIgQ29kZUJsb2NrKiYgcmVmZXJlbmNlIGJlY2F1c2Ug
aXQncyBzYWZlIGZvciBDb2RlQmxvY2sgdG8gYmUgamV0dGlzb25lZCBpZiBFeGVjdXRhYmxlIGlz
IHRoZSBvbmx5IHRoaW5nCi0gICAgLy8gdG8gcG9pbnQgdG8gaXQuIFRoaXMgZm9yY2VzIGNhbGxl
cnMgdG8gaGF2ZSBhIENvZGVCbG9jayogaW4gYSByZWdpc3RlciBvciBvbiB0aGUgc3RhY2sgdGhh
dCB3aWxsIGJlIG1hcmtlZAotICAgIC8vIGJ5IGNvbnNlcnZhdGl2ZSBHQyBpZiBhIEdDIGhhcHBl
bnMgYWZ0ZXIgd2UgY3JlYXRlIHRoZSBDb2RlQmxvY2suCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1l
IEV4ZWN1dGFibGVUeXBlPgotICAgIEpTT2JqZWN0KiBwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJiwg
SlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sq
JiByZXN1bHRDb2RlQmxvY2spOwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+IHZv
aWQgZm9yRWFjaENvZGVCbG9jayhGdW5jdG9yJiYpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBj
bGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbklt
cGwoVk0mLCBKU0Z1bmN0aW9uKiwgSlNTY29wZSosIENvZGVTcGVjaWFsaXphdGlvbktpbmQsIENv
ZGVCbG9jayomKTsKLQotcHJvdGVjdGVkOgotICAgIFNjcmlwdEV4ZWN1dGFibGUoU3RydWN0dXJl
KiwgVk0mLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZl
ZENvbnRleHRUeXBlLCBib29sIGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRU
eXBlLCBJbnRyaW5zaWMpOwotCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCi0gICAg
ewotICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIHZtLmhlYXAuYWRk
RXhlY3V0YWJsZSh0aGlzKTsgLy8gQmFsYW5jZWQgYnkgSGVhcDo6ZGVsZXRlVW5tYXJrZWRDb21w
aWxlZENvZGUoKS4KLQotI2lmIEVOQUJMRShDT0RFQkxPQ0tfU0FNUExJTkcpCi0gICAgICAgIGlm
IChTYW1wbGluZ1Rvb2wqIHNhbXBsZXIgPSB2bS5pbnRlcnByZXRlci0+c2FtcGxlcigpKQotICAg
ICAgICAgICAgc2FtcGxlci0+bm90aWZ5T2ZTY29wZSh2bSwgdGhpcyk7Ci0jZW5kaWYKLSAgICB9
Ci0KLSAgICBDb2RlRmVhdHVyZXMgbV9mZWF0dXJlczsKLSAgICBib29sIG1fZGlkVHJ5VG9FbnRl
ckluTG9vcDsKLSAgICBib29sIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMgOiAxOwotICAgIGJvb2wg
bV9uZXZlcklubGluZSA6IDE7Ci0gICAgYm9vbCBtX25ldmVyT3B0aW1pemUgOiAxOwotICAgIGJv
b2wgbV9uZXZlckZUTE9wdGltaXplIDogMTsKLSAgICBib29sIG1faXNBcnJvd0Z1bmN0aW9uQ29u
dGV4dCA6IDE7Ci0gICAgYm9vbCBtX2NhblVzZU9TUkV4aXRGdXp6aW5nIDogMTsKLSAgICB1bnNp
Z25lZCBtX2Rlcml2ZWRDb250ZXh0VHlwZSA6IDI7IC8vIERlcml2ZWRDb250ZXh0VHlwZQotICAg
IHVuc2lnbmVkIG1fZXZhbENvbnRleHRUeXBlIDogMjsgLy8gRXZhbENvbnRleHRUeXBlCi0KLSAg
ICBpbnQgbV9vdmVycmlkZUxpbmVOdW1iZXI7Ci0gICAgaW50IG1fZmlyc3RMaW5lOwotICAgIGlu
dCBtX2xhc3RMaW5lOwotICAgIHVuc2lnbmVkIG1fc3RhcnRDb2x1bW47Ci0gICAgdW5zaWduZWQg
bV9lbmRDb2x1bW47Ci0gICAgdW5zaWduZWQgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7Ci0g
ICAgdW5zaWduZWQgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OwotICAgIFNvdXJjZUNvZGUgbV9z
b3VyY2U7Ci19OwotCiBjbGFzcyBFdmFsRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRF
eGVjdXRhYmxlIHsKICAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwogcHVi
bGljOgpAQCAtNDU4LDMyMSArNzMsNCBAQCBwcml2YXRlOgogICAgIFdyaXRlQmFycmllcjxVbmxp
bmtlZEV2YWxDb2RlQmxvY2s+IG1fdW5saW5rZWRFdmFsQ29kZUJsb2NrOwogfTsKIAotY2xhc3Mg
UHJvZ3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAg
ZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVm
IFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0
dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0K
LSAgICBzdGF0aWMgUHJvZ3JhbUV4ZWN1dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNv
bnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8UHJvZ3JhbUV4ZWN1dGFi
bGU+KCpleGVjLT5oZWFwKCkpKSBQcm9ncmFtRXhlY3V0YWJsZShleGVjLCBzb3VyY2UpOwotICAg
ICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52bSgpKTsKLSAgICAgICAgcmV0
dXJuIGV4ZWN1dGFibGU7Ci0gICAgfQotCi0KLSAgICBKU09iamVjdCogaW5pdGlhbGl6ZUdsb2Jh
bFByb3BlcnRpZXMoVk0mLCBDYWxsRnJhbWUqLCBKU1Njb3BlKik7Ci0KLSAgICBzdGF0aWMgdm9p
ZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrKCkK
LSAgICB7Ci0gICAgICAgIHJldHVybiBtX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgfQot
Ci0gICAgSlNPYmplY3QqIGNoZWNrU3ludGF4KEV4ZWNTdGF0ZSopOwotCi0gICAgUGFzc1JlZlB0
cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZW5l
cmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgc3RhdGljIFN0cnVj
dHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVj
dCwgSlNWYWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0
ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oUHJvZ3JhbUV4ZWN1dGFibGVUeXBl
LCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotICAgICAgICAKLSAgICBERUNMQVJF
X0lORk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0
dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFs
c2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBT
dXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgZGVy
aXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2YWxD
b250ZXh0VHlwZTo6Tm9uZSk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0
YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBQcm9n
cmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0
aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBXcml0
ZUJhcnJpZXI8VW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrPiBtX3VubGlua2VkUHJvZ3JhbUNvZGVC
bG9jazsKLSAgICBXcml0ZUJhcnJpZXI8UHJvZ3JhbUNvZGVCbG9jaz4gbV9wcm9ncmFtQ29kZUJs
b2NrOwotfTsKLQotY2xhc3MgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMg
U2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3Rv
cjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8
IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUqIGNyZWF0ZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogY29k
ZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX21vZHVsZVByb2dyYW1Db2RlQmxvY2su
Z2V0KCk7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2Rl
KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAg
IH0KLQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xv
YmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICBy
ZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZv
KE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwot
ICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFi
bGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJp
Y3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNj
cmlwdE1vZGU6Ok1vZHVsZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9k
ZTo6TW9kdWxlRXZhbHVhdGVNb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0
aW9uQ29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lKTsgfQotCi0gICAgVW5s
aW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2soKSB7IHJldHVybiBtX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsgfQot
Ci0gICAgU3ltYm9sVGFibGUqIG1vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUoKSB7IHJldHVy
biBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuZ2V0KCk7IH0KLQotcHJpdmF0ZToKLSAg
ICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4
ZWN1dGFibGU7Ci0KLSAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25z
dCBTb3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCos
IFNsb3RWaXNpdG9yJik7Ci0KLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRNb2R1bGVQcm9ncmFt
Q29kZUJsb2NrPiBtX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLSAgICBXcml0ZUJh
cnJpZXI8U3ltYm9sVGFibGU+IG1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZTsKLSAgICBX
cml0ZUJhcnJpZXI8TW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV9tb2R1bGVQcm9ncmFtQ29kZUJs
b2NrOwotfTsKLQotY2xhc3MgRnVuY3Rpb25FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlw
dEV4ZWN1dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0gICAgZnJpZW5kIGNsYXNzIExM
SW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFi
bGUgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNl
OjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgRnVu
Y3Rpb25FeGVjdXRhYmxlKiBjcmVhdGUoCi0gICAgICAgIFZNJiB2bSwgY29uc3QgU291cmNlQ29k
ZSYgc291cmNlLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxl
LCAKLSAgICAgICAgdW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWdu
ZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykK
LSAgICB7Ci0gICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90
TnVsbCwgYWxsb2NhdGVDZWxsPEZ1bmN0aW9uRXhlY3V0YWJsZT4odm0uaGVhcCkpIEZ1bmN0aW9u
RXhlY3V0YWJsZSh2bSwgc291cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUsIGZpcnN0TGluZSwgbGFz
dExpbmUsIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4sIGludHJpbnNpYyk7Ci0gICAgICAgIGV4ZWN1
dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci0g
ICAgfQotICAgIHN0YXRpYyBGdW5jdGlvbkV4ZWN1dGFibGUqIGZyb21HbG9iYWxDb2RlKAotICAg
ICAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmLCBjb25zdCBTb3VyY2VDb2Rl
JiwgCi0gICAgICAgIEpTT2JqZWN0KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVy
KTsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0gICAgICAgIAotICAgIFVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUoKSBjb25zdAotICAg
IHsKLSAgICAgICAgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLmdldCgpOwotICAgIH0KLQot
ICAgIC8vIFJldHVybnMgZWl0aGVyIGNhbGwgb3IgY29uc3RydWN0IGJ5dGVjb2RlLiBUaGlzIGNh
biBiZSBhcHByb3ByaWF0ZQotICAgIC8vIGZvciBhbnN3ZXJpbmcgcXVlc3Rpb25zIHRoYXQgdGhh
dCBkb24ndCB2YXJ5IGJldHdlZW4gY2FsbCBhbmQgY29uc3RydWN0IC0tCi0gICAgLy8gZm9yIGV4
YW1wbGUsIGFyZ3VtZW50c1JlZ2lzdGVyKCkuCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGVpdGhl
ckNvZGVCbG9jaygpCi0gICAgewotICAgICAgICBpZiAobV9jb2RlQmxvY2tGb3JDYWxsKQotICAg
ICAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICAgICAgcmV0dXJu
IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9v
bCBpc0dlbmVyYXRlZEZvckNhbGwoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICEhbV9j
b2RlQmxvY2tGb3JDYWxsOwotICAgIH0KLQotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxv
Y2tGb3JDYWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0
KCk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpIGNvbnN0Ci0g
ICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAg
fQotCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpCi0gICAg
ewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgfQot
ICAgICAgICAKLSAgICBib29sIGlzR2VuZXJhdGVkRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQg
a2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICAg
ICAgcmV0dXJuIGlzR2VuZXJhdGVkRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVkRm9yQ29uc3RydWN0
KCk7Ci0gICAgfQotICAgICAgICAKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9y
KENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09
IENvZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJuIGNvZGVCbG9ja0ZvckNhbGwoKTsKLSAg
ICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBj
b2RlQmxvY2tGb3JDb25zdHJ1Y3QoKTsKLSAgICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayog
YmFzZWxpbmVDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgICAgIAot
ICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6
YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZWxpbmVDb2RlQmxvY2tG
b3Ioa2luZCk7Ci0gICAgfQotCi0gICAgUmVmUHRyPFR5cGVTZXQ+IHJldHVyblN0YXRlbWVudFR5
cGVTZXQoKSAKLSAgICB7Ci0gICAgICAgIGlmICghbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KQot
ICAgICAgICAgICAgbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0ID0gVHlwZVNldDo6Y3JlYXRlKCk7
Ci0KLSAgICAgICAgcmV0dXJuIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldDsKLSAgICB9Ci0gICAg
ICAgIAotICAgIEZ1bmN0aW9uTW9kZSBmdW5jdGlvbk1vZGUoKSB7IHJldHVybiBtX3VubGlua2Vk
RXhlY3V0YWJsZS0+ZnVuY3Rpb25Nb2RlKCk7IH0KLSAgICBib29sIGlzQnVpbHRpbkZ1bmN0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmlzQnVpbHRpbkZ1bmN0aW9u
KCk7IH0KLSAgICBDb25zdHJ1Y3RBYmlsaXR5IGNvbnN0cnVjdEFiaWxpdHkoKSBjb25zdCB7IHJl
dHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+Y29uc3RydWN0QWJpbGl0eSgpOyB9Ci0gICAgYm9v
bCBpc0NsYXNzKCkgY29uc3QgeyByZXR1cm4gIWNsYXNzU291cmNlKCkuaXNOdWxsKCk7IH0KLSAg
ICBib29sIGlzQXJyb3dGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNv
dXJjZVBhcnNlTW9kZTo6QXJyb3dGdW5jdGlvbk1vZGU7IH0KLSAgICBib29sIGlzR2V0dGVyKCkg
Y29uc3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpHZXR0ZXJNb2Rl
OyB9Ci0gICAgYm9vbCBpc1NldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNv
dXJjZVBhcnNlTW9kZTo6U2V0dGVyTW9kZTsgfQotICAgIGJvb2wgaXNHZW5lcmF0b3IoKSBjb25z
dCB7IHJldHVybiBTb3VyY2VQYXJzZU1vZGVTZXQoU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JC
b2R5TW9kZSwgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlKS5j
b250YWlucyhwYXJzZU1vZGUoKSk7IH0KLSAgICBib29sIGlzTWV0aG9kKCkgY29uc3QgeyByZXR1
cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpNZXRob2RNb2RlOyB9Ci0gICAgYm9v
bCBoYXNDYWxsZXJBbmRBcmd1bWVudHNQcm9wZXJ0aWVzKCkgY29uc3QKLSAgICB7Ci0gICAgICAg
IC8vIFBlciBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3JiaWRkZW4tZXh0
ZW5zaW9ucywgb25seSBzbG9wcHktbW9kZSBub24tYnVpbHRpbiBmdW5jdGlvbnMgaW4gb2xkLXN0
eWxlIChwcmUtRVM2KSBzeW50YWN0aWMgZm9ybXMgY2FuIGNvbnRhaW4KLSAgICAgICAgLy8gImNh
bGxlciIgYW5kICJhcmd1bWVudHMiLgotICAgICAgICByZXR1cm4gIWlzU3RyaWN0TW9kZSgpICYm
IHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6Tm9ybWFsRnVuY3Rpb25Nb2RlICYmICFp
c0NsYXNzQ29uc3RydWN0b3JGdW5jdGlvbigpOwotICAgIH0KLSAgICBib29sIGhhc1Byb3RvdHlw
ZVByb3BlcnR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBTb3VyY2VQYXJzZU1vZGVT
ZXQoCi0gICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSwKLSAg
ICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsCi0gICAgICAgICAg
ICBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvcldyYXBwZXJGdW5jdGlvbk1vZGUKLSAgICAgICAg
KS5jb250YWlucyhwYXJzZU1vZGUoKSkgfHwgaXNDbGFzcygpOwotICAgIH0KLSAgICBEZXJpdmVk
Q29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtl
ZEV4ZWN1dGFibGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpOyB9Ci0gICAgYm9vbCBpc0NsYXNzQ29u
c3RydWN0b3JGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5p
c0NsYXNzQ29uc3RydWN0b3JGdW5jdGlvbigpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYgbmFt
ZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5uYW1lKCk7IH0KLSAgICBjb25zdCBJ
ZGVudGlmaWVyJiBlY21hTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5lY21h
TmFtZSgpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYgaW5mZXJyZWROYW1lKCkgeyByZXR1cm4g
bV91bmxpbmtlZEV4ZWN1dGFibGUtPmluZmVycmVkTmFtZSgpOyB9Ci0gICAgdW5zaWduZWQgcGFy
YW1ldGVyQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+cGFyYW1l
dGVyQ291bnQoKTsgfSAvLyBFeGNsdWRpbmcgJ3RoaXMnIQotICAgIHVuc2lnbmVkIGZ1bmN0aW9u
TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTGVu
Z3RoKCk7IH0KLSAgICBTb3VyY2VQYXJzZU1vZGUgcGFyc2VNb2RlKCkgY29uc3QgeyByZXR1cm4g
bV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcnNlTW9kZSgpOyB9Ci0gICAgSlNQYXJzZXJTY3JpcHRN
b2RlIHNjcmlwdE1vZGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+c2Ny
aXB0TW9kZSgpOyB9Ci0gICAgY29uc3QgU291cmNlQ29kZSYgY2xhc3NTb3VyY2UoKSBjb25zdCB7
IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+Y2xhc3NTb3VyY2UoKTsgfQotCi0gICAgc3Rh
dGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotICAgIHN0YXRp
YyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9i
YWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJl
OjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKEZ1bmN0aW9uRXhlY3V0
YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICB1bnNpZ25l
ZCBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3BhcmFtZXRlcnNTdGFy
dE9mZnNldDsgfQotCi0gICAgdm9pZCBvdmVycmlkZVBhcmFtZXRlckFuZFR5cGVQcm9maWxpbmdT
dGFydEVuZE9mZnNldHModW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0
eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdFbmRPZmZzZXQp
Ci0gICAgewotICAgICAgICBtX3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHBhcmFtZXRlcnNTdGFy
dE9mZnNldDsKLSAgICAgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSB0eXBlUHJvZmls
aW5nU3RhcnRPZmZzZXQ7Ci0gICAgICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHR5cGVQ
cm9maWxpbmdFbmRPZmZzZXQ7Ci0gICAgfQotCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgSW5m
ZXJyZWRWYWx1ZSogc2luZ2xldG9uRnVuY3Rpb24oKSB7IHJldHVybiBtX3NpbmdsZXRvbkZ1bmN0
aW9uLmdldCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNl
OwotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSgKLSAgICAgICAgVk0mLCBjb25zdCBTb3VyY2VDb2Rl
JiwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqLCB1bnNpZ25lZCBmaXJzdExpbmUsIAotICAg
ICAgICB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVu
ZENvbHVtbiwgSW50cmluc2ljKTsKLSAgICAKLSAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJik7
Ci0KLSAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKLSAgICAKLSAgICB1bnNpZ25l
ZCBtX3BhcmFtZXRlcnNTdGFydE9mZnNldDsKLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRGdW5j
dGlvbkV4ZWN1dGFibGU+IG1fdW5saW5rZWRFeGVjdXRhYmxlOwotICAgIFdyaXRlQmFycmllcjxG
dW5jdGlvbkNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOwotICAgIFdyaXRlQmFycmllcjxG
dW5jdGlvbkNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3Q7Ci0gICAgUmVmUHRyPFR5
cGVTZXQ+IG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldDsKLSAgICBXcml0ZUJhcnJpZXI8SW5mZXJy
ZWRWYWx1ZT4gbV9zaW5nbGV0b25GdW5jdGlvbjsKLX07Ci0KLSNpZiBFTkFCTEUoV0VCQVNTRU1C
TFkpCi1jbGFzcyBXZWJBc3NlbWJseUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhlY3V0YWJs
ZUJhc2UgewotcHVibGljOgotICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKLSAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFn
cyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgV2ViQXNzZW1ibHlFeGVjdXRh
YmxlKiBjcmVhdGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVs
ZSogbW9kdWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQotICAgIHsKLSAgICAgICAgV2ViQXNz
ZW1ibHlFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8
V2ViQXNzZW1ibHlFeGVjdXRhYmxlPih2bS5oZWFwKSkgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKHZt
LCBzb3VyY2UsIG1vZHVsZSwgZnVuY3Rpb25JbmRleCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPmZp
bmlzaENyZWF0aW9uKHZtKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci0gICAgfQotCi0g
ICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBT
dHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oV2ViQXNz
ZW1ibHlFeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLQot
ICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBERUNMQVJFX0lORk87Ci0K
LSAgICB2b2lkIHByZXBhcmVGb3JFeGVjdXRpb24oVk0mKTsKLQotICAgIFdlYkFzc2VtYmx5Q29k
ZUJsb2NrKiBjb2RlQmxvY2tGb3JDYWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVC
bG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBF
eGVjdXRhYmxlQmFzZTsKLSAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUoVk0mLCBjb25zdCBTb3Vy
Y2VDb2RlJiwgSlNXYXNtTW9kdWxlKiwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCk7Ci0KLSAgICBz
dGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBT
b3VyY2VDb2RlIG1fc291cmNlOwotICAgIFdyaXRlQmFycmllcjxKU1dhc21Nb2R1bGU+IG1fbW9k
dWxlOwotICAgIHVuc2lnbmVkIG1fZnVuY3Rpb25JbmRleDsKLQotICAgIFdyaXRlQmFycmllcjxX
ZWJBc3NlbWJseUNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOwotfTsKLSNlbmRpZgotCi10
ZW1wbGF0ZSA8dHlwZW5hbWUgRXhlY3V0YWJsZVR5cGU+Ci1KU09iamVjdCogU2NyaXB0RXhlY3V0
YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbihWTSYgdm0sIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBK
U1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBDb2RlQmxvY2sqJiBy
ZXN1bHRDb2RlQmxvY2spCi17Ci0gICAgaWYgKGhhc0pJVENvZGVGb3Ioa2luZCkpIHsKLSAgICAg
ICAgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRXZhbEV4ZWN1dGFibGU+Ojp2YWx1
ZSkKLSAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nh
c3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNlIGlm
IChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIFByb2dyYW1FeGVjdXRhYmxlPjo6dmFsdWUp
Ci0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0
PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBp
ZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZT46
OnZhbHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+
KGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0g
ICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRnVuY3Rpb25FeGVj
dXRhYmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29k
ZUJsb2NrKj4oanNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2tGb3Io
a2luZCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZXBh
cmVGb3JFeGVjdXRpb25JbXBsKHZtLCBmdW5jdGlvbiwgc2NvcGUsIGtpbmQsIHJlc3VsdENvZGVC
bG9jayk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3BwCShub25leGlzdGVudCkKQEAg
LTEsODQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTMsIDIw
MTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
Ci0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiRXhlY3V0YWJsZS5oIgotCi0jaW5jbHVkZSAiQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIu
aCIKLSNpbmNsdWRlICJDb2RlQmxvY2suaCIKLSNpbmNsdWRlICJEZWJ1Z2dlci5oIgotI2luY2x1
ZGUgIkpJVC5oIgotI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKLSNpbmNsdWRlICJKU1dhc21Nb2R1
bGUuaCIKLSNpbmNsdWRlICJMTEludEVudHJ5cG9pbnQuaCIKLSNpbmNsdWRlICJQYXJzZXIuaCIK
LSNpbmNsdWRlICJUeXBlUHJvZmlsZXIuaCIKLSNpbmNsdWRlICJWTUlubGluZXMuaCIKLSNpbmNs
dWRlIDx3dGYvQ29tbWFQcmludGVyLmg+Ci0KLW5hbWVzcGFjZSBKU0MgewotCi1jb25zdCBDbGFz
c0luZm8gRXhlY3V0YWJsZUJhc2U6OnNfaW5mbyA9IHsgIkV4ZWN1dGFibGUiLCAwLCAwLCBDUkVB
VEVfTUVUSE9EX1RBQkxFKEV4ZWN1dGFibGVCYXNlKSB9OwotCi12b2lkIEV4ZWN1dGFibGVCYXNl
OjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxFeGVjdXRhYmxlQmFz
ZSo+KGNlbGwpLT5FeGVjdXRhYmxlQmFzZTo6fkV4ZWN1dGFibGVCYXNlKCk7Ci19Ci0KLXZvaWQg
RXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSgpCi17Ci0jaWYgRU5BQkxFKEpJVCkKLSAgICBtX2pp
dENvZGVGb3JDYWxsID0gbnVsbHB0cjsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBudWxs
cHRyOwotICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVy
Q29kZVB0cigpOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gTWFj
cm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0jZW5kaWYKLSAgICBtX251bVBhcmFtZXRlcnNGb3JDYWxs
ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNv
bnN0cnVjdCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKLQotICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBGdW5jdGlvbkV4
ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7
Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5jbGVhcigpOwotICAgICAg
ICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5jbGVhcigpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjpp
bmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZh
bEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2Nr
LmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLmNs
ZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygp
ID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1
dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJs
ZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVj
dXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgZXhlY3V0
YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAg
ZXhlY3V0YWJsZS0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLmNsZWFyKCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotICAgIGlm
IChjbGFzc0luZm8oKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAg
ICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlF
eGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2Fs
bC5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICBBU1NFUlQo
Y2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6aW5mbygpKTsKLX0KLQotY29uc3QgQ2xh
c3NJbmZvIE5hdGl2ZUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk5hdGl2ZUV4ZWN1dGFibGUiLCAm
RXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShOYXRpdmVFeGVj
dXRhYmxlKSB9OwotCi1OYXRpdmVFeGVjdXRhYmxlKiBOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGUo
Vk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZlRnVuY3Rpb24gZnVu
Y3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5hdGl2ZUZ1bmN0aW9u
IGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17
Ci0gICAgTmF0aXZlRXhlY3V0YWJsZSogZXhlY3V0YWJsZTsKLSAgICBleGVjdXRhYmxlID0gbmV3
IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8TmF0aXZlRXhlY3V0YWJsZT4odm0uaGVhcCkpIE5hdGl2
ZUV4ZWN1dGFibGUodm0sIGZ1bmN0aW9uLCBjb25zdHJ1Y3RvciwgaW50cmluc2ljKTsKLSAgICBl
eGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSwgY2FsbFRodW5rLCBjb25zdHJ1Y3RUaHVuaywg
bmFtZSk7Ci0gICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci19Ci0KLXZvaWQgTmF0aXZlRXhlY3V0YWJs
ZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8TmF0aXZlRXhlY3V0
YWJsZSo+KGNlbGwpLT5OYXRpdmVFeGVjdXRhYmxlOjp+TmF0aXZlRXhlY3V0YWJsZSgpOwotfQot
Ci1TdHJ1Y3R1cmUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpT
R2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi17Ci0gICAgcmV0dXJu
IFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhDZWxs
VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotfQotCi12b2lkIE5hdGl2ZUV4ZWN1dGFi
bGU6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmss
IFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0cmluZyYgbmFtZSkK
LXsKLSAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgbV9qaXRDb2RlRm9yQ2FsbCA9
IGNhbGxUaHVuazsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBjb25zdHJ1Y3RUaHVuazsK
LSAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENvZGVGb3JDYWxsLT5h
ZGRyZXNzRm9yQ2FsbChNdXN0Q2hlY2tBcml0eSk7Ci0gICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0
V2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENvZGVGb3JDb25zdHJ1Y3QtPmFkZHJlc3NGb3JDYWxsKE11
c3RDaGVja0FyaXR5KTsKLSAgICBtX25hbWUgPSBuYW1lOwotfQotCi1OYXRpdmVFeGVjdXRhYmxl
OjpOYXRpdmVFeGVjdXRhYmxlKFZNJiB2bSwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIE5hdGl2
ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljKQotICAgIDogRXhlY3V0
YWJsZUJhc2Uodm0sIHZtLm5hdGl2ZUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIE5VTV9QQVJB
TUVURVJTX0lTX0hPU1QsIGludHJpbnNpYykKLSAgICAsIG1fZnVuY3Rpb24oZnVuY3Rpb24pCi0g
ICAgLCBtX2NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKQotewotfQotCi1jb25zdCBDbGFzc0luZm8g
U2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvID0geyAiU2NyaXB0RXhlY3V0YWJsZSIsICZFeGVjdXRh
YmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFNjcmlwdEV4ZWN1dGFibGUp
IH07Ci0KLVNjcmlwdEV4ZWN1dGFibGU6OlNjcmlwdEV4ZWN1dGFibGUoU3RydWN0dXJlKiBzdHJ1
Y3R1cmUsIFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGlzSW5TdHJpY3RD
b250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzSW5B
cnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSwgSW50
cmluc2ljIGludHJpbnNpYykKLSAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCBzdHJ1Y3R1cmUsIE5V
TV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCwgaW50cmluc2ljKQotICAgICwgbV9mZWF0dXJlcyhp
c0luU3RyaWN0Q29udGV4dCA/IFN0cmljdE1vZGVGZWF0dXJlIDogMCkKLSAgICAsIG1fZGlkVHJ5
VG9FbnRlckluTG9vcChmYWxzZSkKLSAgICAsIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMoZmFsc2Up
Ci0gICAgLCBtX25ldmVySW5saW5lKGZhbHNlKQotICAgICwgbV9uZXZlck9wdGltaXplKGZhbHNl
KQotICAgICwgbV9uZXZlckZUTE9wdGltaXplKGZhbHNlKQotICAgICwgbV9pc0Fycm93RnVuY3Rp
b25Db250ZXh0KGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCkKLSAgICAsIG1fY2FuVXNlT1NSRXhp
dEZ1enppbmcodHJ1ZSkKLSAgICAsIG1fZGVyaXZlZENvbnRleHRUeXBlKHN0YXRpY19jYXN0PHVu
c2lnbmVkPihkZXJpdmVkQ29udGV4dFR5cGUpKQotICAgICwgbV9ldmFsQ29udGV4dFR5cGUoc3Rh
dGljX2Nhc3Q8dW5zaWduZWQ+KGV2YWxDb250ZXh0VHlwZSkpCi0gICAgLCBtX292ZXJyaWRlTGlu
ZU51bWJlcigtMSkKLSAgICAsIG1fZmlyc3RMaW5lKC0xKQotICAgICwgbV9sYXN0TGluZSgtMSkK
LSAgICAsIG1fc3RhcnRDb2x1bW4oVUlOVF9NQVgpCi0gICAgLCBtX2VuZENvbHVtbihVSU5UX01B
WCkKLSAgICAsIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KFVJTlRfTUFYKQotICAgICwgbV90
eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KFVJTlRfTUFYKQotICAgICwgbV9zb3VyY2Uoc291cmNlKQot
ewotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewot
ICAgIHN0YXRpY19jYXN0PFNjcmlwdEV4ZWN1dGFibGUqPihjZWxsKS0+U2NyaXB0RXhlY3V0YWJs
ZTo6flNjcmlwdEV4ZWN1dGFibGUoKTsKLX0KLQotdm9pZCBTY3JpcHRFeGVjdXRhYmxlOjppbnN0
YWxsQ29kZShDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSAgICBpbnN0YWxsQ29kZSgqY29kZUJs
b2NrLT52bSgpLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwgY29kZUJsb2NrLT5z
cGVjaWFsaXphdGlvbktpbmQoKSk7Ci19Ci0KLXZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFs
bENvZGUoVk0mIHZtLCBDb2RlQmxvY2sqIGdlbmVyaWNDb2RlQmxvY2ssIENvZGVUeXBlIGNvZGVU
eXBlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgQVNTRVJUKHZtLmhlYXAu
aXNEZWZlcnJlZCgpKTsKLSAgICAKLSAgICBpZiAoZ2VuZXJpY0NvZGVCbG9jaykKLSAgICAgICAg
Q09ERUJMT0NLX0xPR19FVkVOVChnZW5lcmljQ29kZUJsb2NrLCAiaW5zdGFsbENvZGUiLCAoKSk7
Ci0gICAgCi0gICAgQ29kZUJsb2NrKiBvbGRDb2RlQmxvY2sgPSBudWxscHRyOwotICAgIAotICAg
IHN3aXRjaCAoY29kZVR5cGUpIHsKLSAgICBjYXNlIEdsb2JhbENvZGU6IHsKLSAgICAgICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0
aGlzKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8
UHJvZ3JhbUNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAgICAKLSAgICAgICAg
QVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICAKLSAgICAgICAgb2xkQ29kZUJs
b2NrID0gZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAgICAgICBleGVj
dXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxv
Y2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1vZHVsZUNvZGU6IHsKLSAg
ICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUNvZGVCbG9jayo+KGdlbmVy
aWNDb2RlQmxvY2spOwotCi0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLQot
ICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxv
Y2suZ2V0KCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5z
ZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0K
LQotICAgIGNhc2UgRXZhbENvZGU6IHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgRXZhbENvZGVCbG9j
ayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxv
Y2spOwotICAgICAgICAKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAg
ICAgICAKLSAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2Nr
LmdldCgpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suc2V0TWF5QmVOdWxs
KHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgICAgIAot
ICAgIGNhc2UgRnVuY3Rpb25Db2RlOiB7Ci0gICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgRnVu
Y3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29kZUJsb2Nr
Kj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKGtpbmQpIHsK
LSAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgIG9sZENvZGVCbG9jayA9IGV4
ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICAgICAgICAgIGV4ZWN1dGFi
bGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAg
ICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1
Y3QuZ2V0KCk7Ci0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVj
dC5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChr
aW5kKSB7Ci0gICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbCA9
IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkgOiBudWxscHRy
OwotICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxl
ckNvZGVQdHIoKTsKLSAgICAgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9IGdlbmVyaWNDb2Rl
QmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBOVU1fUEFSQU1FVEVS
U19OT1RfQ09NUElMRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ29kZUZvckNvbnN0cnVj
dDoKLSAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdl
bmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7Ci0gICAgICAgIG1faml0Q29kZUZv
ckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0gICAg
ICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5l
cmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElM
RUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChnZW5lcmljQ29kZUJsb2NrKSB7
Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGdlbmVyaWNDb2RlQmxvY2stPm93bmVyRXhlY3V0YWJs
ZSgpID09IHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChKSVRDb2RlOjppc0V4ZWN1dGFi
bGVTY3JpcHQoZ2VuZXJpY0NvZGVCbG9jay0+aml0VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAg
ICBpZiAoT3B0aW9uczo6dmVyYm9zZU9TUigpKQotICAgICAgICAgICAgZGF0YUxvZygiSW5zdGFs
bGluZyAiLCAqZ2VuZXJpY0NvZGVCbG9jaywgIlxuIik7Ci0gICAgICAgIAotICAgICAgICBpZiAo
dm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyKQotICAgICAgICAgICAgdm0ubV9wZXJCeXRlY29kZVBy
b2ZpbGVyLT5lbnN1cmVCeXRlY29kZXNGb3IoZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAot
ICAgICAgICBpZiAoRGVidWdnZXIqIGRlYnVnZ2VyID0gZ2VuZXJpY0NvZGVCbG9jay0+Z2xvYmFs
T2JqZWN0KCktPmRlYnVnZ2VyKCkpCi0gICAgICAgICAgICBkZWJ1Z2dlci0+cmVnaXN0ZXJDb2Rl
QmxvY2soZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG9sZENvZGVCbG9jaykK
LSAgICAgICAgb2xkQ29kZUJsb2NrLT51bmxpbmtJbmNvbWluZ0NhbGxzKCk7Ci0KLSAgICB2bS5o
ZWFwLndyaXRlQmFycmllcih0aGlzKTsKLX0KLQotQ29kZUJsb2NrKiBTY3JpcHRFeGVjdXRhYmxl
OjpuZXdDb2RlQmxvY2tGb3IoCi0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBKU0Z1
bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIEpTT2JqZWN0KiYgZXhjZXB0aW9uKQot
ewotICAgIFZNKiB2bSA9IHNjb3BlLT52bSgpOwotICAgIGF1dG8gdGhyb3dTY29wZSA9IERFQ0xB
UkVfVEhST1dfU0NPUEUoKnZtKTsKLQotICAgIEFTU0VSVCh2bS0+aGVhcC5pc0RlZmVycmVkKCkp
OwotICAgIEFTU0VSVChzdGFydENvbHVtbigpICE9IFVJTlRfTUFYKTsKLSAgICBBU1NFUlQoZW5k
Q29sdW1uKCkgIT0gVUlOVF9NQVgpOwotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVj
dXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBq
c0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5t
X2V2YWxDb2RlQmxvY2spOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOwotICAg
ICAgICByZXR1cm4gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtLAotICAgICAgICAgICAgZXhlY3V0
YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suZ2V0KCksIHNjb3BlLAot
ICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSk7Ci0gICAgfQotICAg
IAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0g
ICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVj
dXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNh
bGwpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJs
b2NrKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAgICAgcmV0dXJu
IFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUsIGV4
ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLmdldCgpLCBzY29wZSwKLSAgICAg
ICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCksIGV4ZWN1dGFibGUtPnNvdXJj
ZSgpLnN0YXJ0Q29sdW1uKCkpOwotICAgIH0KLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhp
cyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAg
ICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrKTsK
LSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAgICAgcmV0dXJuIE1vZHVs
ZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUsIGV4
ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpLCBzY29wZSwK
LSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCksIGV4ZWN1dGFibGUt
PnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOwotICAgIH0KLQotICAgIFJFTEVBU0VfQVNTRVJUKGNs
YXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKLSAgICBSRUxFQVNFX0FT
U0VSVChmdW5jdGlvbik7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgIFJFTEVBU0VfQVNTRVJUKCFleGVj
dXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCkpOwotICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QgPSBzY29wZS0+Z2xvYmFsT2JqZWN0KCk7Ci0gICAgUGFyc2VyRXJyb3IgZXJyb3I7Ci0g
ICAgRGVidWdnZXJNb2RlIGRlYnVnZ2VyTW9kZSA9IGdsb2JhbE9iamVjdC0+aGFzSW50ZXJhY3Rp
dmVEZWJ1Z2dlcigpID8gRGVidWdnZXJPbiA6IERlYnVnZ2VyT2ZmOwotICAgIFVubGlua2VkRnVu
Y3Rpb25Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2NrID0gCi0gICAgICAgIGV4ZWN1dGFibGUt
Pm1fdW5saW5rZWRFeGVjdXRhYmxlLT51bmxpbmtlZENvZGVCbG9ja0ZvcigKLSAgICAgICAgICAg
ICp2bSwgZXhlY3V0YWJsZS0+bV9zb3VyY2UsIGtpbmQsIGRlYnVnZ2VyTW9kZSwgZXJyb3IsIAot
ICAgICAgICAgICAgZXhlY3V0YWJsZS0+cGFyc2VNb2RlKCkpOwotICAgIHJlY29yZFBhcnNlKAot
ICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+ZmVhdHVyZXMoKSwgCi0g
ICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5oYXNDYXB0dXJlZFZhcmlh
YmxlcygpLCBmaXJzdExpbmUoKSwgCi0gICAgICAgIGxhc3RMaW5lKCksIHN0YXJ0Q29sdW1uKCks
IGVuZENvbHVtbigpKTsgCi0gICAgaWYgKCF1bmxpbmtlZENvZGVCbG9jaykgewotICAgICAgICBl
eGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbigKLSAgICAgICAgICAgIGdsb2JhbE9iamVjdC0+Z2xv
YmFsRXhlYygpLCB0aHJvd1Njb3BlLAotICAgICAgICAgICAgZXJyb3IudG9FcnJvck9iamVjdChn
bG9iYWxPYmplY3QsIGV4ZWN1dGFibGUtPm1fc291cmNlKSk7Ci0gICAgICAgIHJldHVybiBudWxs
cHRyOwotICAgIH0KLQotICAgIFNvdXJjZVByb3ZpZGVyKiBwcm92aWRlciA9IGV4ZWN1dGFibGUt
PnNvdXJjZSgpLnByb3ZpZGVyKCk7Ci0gICAgdW5zaWduZWQgc291cmNlT2Zmc2V0ID0gZXhlY3V0
YWJsZS0+c291cmNlKCkuc3RhcnRPZmZzZXQoKTsKLSAgICB1bnNpZ25lZCBzdGFydENvbHVtbiA9
IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCk7Ci0KLSAgICByZXR1cm4gRnVuY3Rp
b25Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgZXhlY3V0YWJsZSwgdW5saW5rZWRDb2Rl
QmxvY2ssIHNjb3BlLCBwcm92aWRlciwgc291cmNlT2Zmc2V0LCBzdGFydENvbHVtbik7Ci19Ci0K
LUNvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3Io
Ci0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotewotICAgIGlmIChjbGFzc0luZm8o
KSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBFdmFsQ29kZUJsb2NrKiBi
YXNlbGluZSA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPigKLSAgICAgICAgICAgIGV4ZWN1
dGFibGUtPm1fZXZhbENvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAgICAgICBFdmFs
Q29kZUJsb2NrKiByZXN1bHQgPSBFdmFsQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKLSAgICAgICAg
ICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAgICAgICByZXN1
bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgICAgIHJldHVybiByZXN1
bHQ7Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJs
ZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwp
OwotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFt
RXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9
IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPigKLSAgICAgICAgICAgIGV4ZWN1dGFibGUt
Pm1fcHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAgICAgICBQcm9ncmFt
Q29kZUJsb2NrKiByZXN1bHQgPSBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKLSAgICAg
ICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAgICAgICBy
ZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgICAgIHJldHVybiBy
ZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9y
Q2FsbCk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIE1vZHVsZVByb2dy
YW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLT5i
YXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHJlc3Vs
dCA9IE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICAgICAgQ29k
ZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAgIHJlc3VsdC0+c2V0
QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAg
ICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFi
bGU6OmluZm8oKSk7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBiYXNl
bGluZSA9IHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29kZUJsb2NrKj4oCi0gICAgICAgIGV4ZWN1dGFi
bGUtPmNvZGVCbG9ja0ZvcihraW5kKS0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAgIEZ1bmN0aW9u
Q29kZUJsb2NrKiByZXN1bHQgPSBGdW5jdGlvbkNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAg
ICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAgIHJlc3VsdC0+
c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1zdGF0aWMgdm9pZCBzZXR1cExMSW50KFZNJiB2bSwgQ29kZUJsb2NrKiBjb2RlQmxvY2spCi17
Ci0gICAgTExJbnQ6OnNldEVudHJ5cG9pbnQodm0sIGNvZGVCbG9jayk7Ci19Ci0KLXN0YXRpYyB2
b2lkIHNldHVwSklUKFZNJiB2bSwgQ29kZUJsb2NrKiBjb2RlQmxvY2spCi17Ci0jaWYgRU5BQkxF
KEpJVCkKLSAgICBDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBKSVQ6OmNvbXBpbGUoJnZtLCBj
b2RlQmxvY2ssIEpJVENvbXBpbGF0aW9uTXVzdFN1Y2NlZWQpOwotICAgIFJFTEVBU0VfQVNTRVJU
KHJlc3VsdCA9PSBDb21waWxhdGlvblN1Y2Nlc3NmdWwpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFS
QU0odm0pOwotICAgIFVOVVNFRF9QQVJBTShjb2RlQmxvY2spOwotICAgIFVOUkVBQ0hBQkxFX0ZP
Ul9QTEFURk9STSgpOwotI2VuZGlmCi19Ci0KLUpTT2JqZWN0KiBTY3JpcHRFeGVjdXRhYmxlOjpw
cmVwYXJlRm9yRXhlY3V0aW9uSW1wbCgKLSAgICBWTSYgdm0sIEpTRnVuY3Rpb24qIGZ1bmN0aW9u
LCBKU1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBDb2RlQmxvY2sq
JiByZXN1bHRDb2RlQmxvY2spCi17Ci0gICAgRGVmZXJHQ0ZvckFXaGlsZSBkZWZlckdDKHZtLmhl
YXApOwotCi0gICAgaWYgKHZtLmdldEFuZENsZWFyRmFpbE5leHROZXdDb2RlQmxvY2soKSkKLSAg
ICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKHNjb3BlLT5nbG9iYWxPYmplY3QoKS0+Z2xvYmFsRXhl
YygpLCBBU0NJSUxpdGVyYWwoIkZvcmNlZCBGYWlsdXJlIikpOwotCi0gICAgSlNPYmplY3QqIGV4
Y2VwdGlvbiA9IDA7Ci0gICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBuZXdDb2RlQmxvY2tGb3Io
a2luZCwgZnVuY3Rpb24sIHNjb3BlLCBleGNlcHRpb24pOwotICAgIHJlc3VsdENvZGVCbG9jayA9
IGNvZGVCbG9jazsKLSAgICBpZiAoIWNvZGVCbG9jaykgewotICAgICAgICBSRUxFQVNFX0FTU0VS
VChleGNlcHRpb24pOwotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgIH0KLSAgICAKLSAg
ICBpZiAoT3B0aW9uczo6dmFsaWRhdGVCeXRlY29kZSgpKQotICAgICAgICBjb2RlQmxvY2stPnZh
bGlkYXRlKCk7Ci0gICAgCi0gICAgaWYgKE9wdGlvbnM6OnVzZUxMSW50KCkpCi0gICAgICAgIHNl
dHVwTExJbnQodm0sIGNvZGVCbG9jayk7Ci0gICAgZWxzZQotICAgICAgICBzZXR1cEpJVCh2bSwg
Y29kZUJsb2NrKTsKLSAgICAKLSAgICBpbnN0YWxsQ29kZSh2bSwgY29kZUJsb2NrLCBjb2RlQmxv
Y2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lhbGl6YXRpb25LaW5kKCkpOwotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi1jb25zdCBDbGFzc0luZm8gRXZhbEV4ZWN1dGFibGU6OnNfaW5m
byA9IHsgIkV2YWxFeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JF
QVRFX01FVEhPRF9UQUJMRShFdmFsRXhlY3V0YWJsZSkgfTsKLQotRXZhbEV4ZWN1dGFibGUqIEV2
YWxFeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVk
Q29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBl
IGV2YWxDb250ZXh0VHlwZSwgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCogdmFyaWFibGVzVW5k
ZXJURFopCi17Ci0gICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKLSAgICBhdXRvIHNjb3BlID0gREVD
TEFSRV9USFJPV19TQ09QRSh2bSk7Ci0KLSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIGlmICghZ2xvYmFsT2JqZWN0LT5l
dmFsRW5hYmxlZCgpKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBjcmVh
dGVFdmFsRXJyb3IoZXhlYywgZ2xvYmFsT2JqZWN0LT5ldmFsRGlzYWJsZWRFcnJvck1lc3NhZ2Uo
KSkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFdmFsRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEV2YWxFeGVjdXRhYmxlPigqZXhl
Yy0+aGVhcCgpKSkgRXZhbEV4ZWN1dGFibGUoZXhlYywgc291cmNlLCBpc0luU3RyaWN0Q29udGV4
dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBldmFsQ29udGV4
dFR5cGUpOwotICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtKTsKLQotICAgIFVubGlu
a2VkRXZhbENvZGVCbG9jayogdW5saW5rZWRFdmFsQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRl
RXZhbENvZGVCbG9jayhleGVjLCBleGVjdXRhYmxlLCB2YXJpYWJsZXNVbmRlclREWik7Ci0gICAg
aWYgKCF1bmxpbmtlZEV2YWxDb2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGV4ZWN1dGFi
bGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLnNldCh2bSwgZXhlY3V0YWJsZSwgdW5saW5rZWRF
dmFsQ29kZSk7Ci0KLSAgICByZXR1cm4gZXhlY3V0YWJsZTsKLX0KLQotRXZhbEV4ZWN1dGFibGU6
OkV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNl
LCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0
VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENv
bnRleHRUeXBlKQotICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLmV2YWxFeGVjdXRh
YmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGluU3RyaWN0Q29udGV4dCwg
ZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBldmFsQ29udGV4dFR5
cGUsIE5vSW50cmluc2ljKQotewotICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNl
VHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6UHJvZ3JhbSk7Ci19Ci0KLXZvaWQg
RXZhbEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0
PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCktPkV2YWxFeGVjdXRhYmxlOjp+RXZhbEV4ZWN1dGFibGUo
KTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIFByb2dyYW1FeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJQ
cm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9N
RVRIT0RfVEFCTEUoUHJvZ3JhbUV4ZWN1dGFibGUpIH07Ci0KLVByb2dyYW1FeGVjdXRhYmxlOjpQ
cm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJj
ZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5wcm9ncmFtRXhlY3V0YWJsZVN0
cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRU
eXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsK
LSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92
aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOwotICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
ID0gMDsKLSAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2UubGVuZ3RoKCkgLSAx
OwotICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZtKCkuY29udHJv
bEZsb3dQcm9maWxlcigpKQotICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9uSGFzRXhlY3V0ZWRD
YWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90eXBlUHJvZmlsaW5n
U3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Ci19Ci0KLXZvaWQgUHJvZ3Jh
bUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PFBy
b2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPlByb2dyYW1FeGVjdXRhYmxlOjp+UHJvZ3JhbUV4ZWN1
dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpz
X2luZm8gPSB7ICJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpz
X2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUpIH07
Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZShFeGVj
U3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICA6IFNjcmlwdEV4ZWN1
dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwg
ZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBlOjpOb25lLCBmYWxz
ZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsKLSAgICBBU1NFUlQoc291
cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6
Ok1vZHVsZSk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAwOwotICAgIG1fdHlw
ZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0gICAgaWYgKGV4ZWMt
PnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxvd1Byb2ZpbGVyKCkp
Ci0gICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVu
ZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgbV90
eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKLX0KLQotTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3Vy
Y2VDb2RlJiBzb3VyY2UpCi17Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IGV4
ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291
cmNlKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52bSgpKTsKLQotICAg
IFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29k
ZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayhleGVjLCBleGVj
dXRhYmxlKTsKLSAgICBpZiAoIXVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUpCi0gICAgICAgIHJl
dHVybiBudWxscHRyOwotICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCB1bmxpbmtlZE1vZHVsZVByb2dyYW1D
b2RlKTsKLQotICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5z
ZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwganNDYXN0PFN5bWJvbFRhYmxlKj4odW5saW5rZWRN
b2R1bGVQcm9ncmFtQ29kZS0+Y29uc3RhbnRSZWdpc3Rlcih1bmxpbmtlZE1vZHVsZVByb2dyYW1D
b2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlQ29uc3RhbnRSZWdpc3Rlck9mZnNldCgp
KS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0KGV4ZWMtPnZtKCkpKTsKLQotICAgIHJldHVybiBleGVj
dXRhYmxlOwotfQotCi12b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2Vs
bCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNl
bGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6fk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKCk7
Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBGdW5jdGlvbkV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIkZ1
bmN0aW9uRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9N
RVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVjdXRhYmxlKSB9OwotCi1GdW5jdGlvbkV4ZWN1dGFibGU6
OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5s
aW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgdW5zaWduZWQgZmly
c3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVk
IGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUo
dm0uZnVuY3Rpb25FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCB2bSwgc291cmNlLCB1bmxpbmtl
ZEV4ZWN1dGFibGUtPmlzSW5TdHJpY3RDb250ZXh0KCksIHVubGlua2VkRXhlY3V0YWJsZS0+ZGVy
aXZlZENvbnRleHRUeXBlKCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIGludHJpbnNp
YykKLSAgICAsIG1fdW5saW5rZWRFeGVjdXRhYmxlKHZtLCB0aGlzLCB1bmxpbmtlZEV4ZWN1dGFi
bGUpCi17Ci0gICAgUkVMRUFTRV9BU1NFUlQoIXNvdXJjZS5pc051bGwoKSk7Ci0gICAgQVNTRVJU
KHNvdXJjZS5sZW5ndGgoKSk7Ci0gICAgbV9maXJzdExpbmUgPSBmaXJzdExpbmU7Ci0gICAgbV9s
YXN0TGluZSA9IGxhc3RMaW5lOwotICAgIEFTU0VSVChzdGFydENvbHVtbiAhPSBVSU5UX01BWCk7
Ci0gICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgbV9zdGFydENvbHVtbiA9
IHN0YXJ0Q29sdW1uOwotICAgIG1fZW5kQ29sdW1uID0gZW5kQ29sdW1uOwotICAgIG1fcGFyYW1l
dGVyc1N0YXJ0T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0ZXJzU3RhcnRPZmZz
ZXQoKTsKLSAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJs
ZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCk7Ci0gICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCk7Ci19Ci0K
LXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYgdm0pCi17Ci0gICAg
QmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgIG1fc2luZ2xldG9uRnVuY3Rpb24uc2V0KHZt
LCB0aGlzLCBJbmZlcnJlZFZhbHVlOjpjcmVhdGUodm0pKTsKLX0KLQotdm9pZCBGdW5jdGlvbkV4
ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PEZ1bmN0
aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5GdW5jdGlvbkV4ZWN1dGFibGU6On5GdW5jdGlvbkV4ZWN1
dGFibGUoKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIHNhbXBsaW5nRGVzY3JpcHRpb24oSklU
Q29kZTo6SklUVHlwZSBqaXRUeXBlKQotewotICAgIHN3aXRjaCAoaml0VHlwZSkgewotICAgIGNh
c2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJUaHVuazoKLSAgICAgICAgcmV0dXJuICJJbnRlcnByZXRl
ciBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkJhc2VsaW5lSklUOgot
ICAgICAgICByZXR1cm4gIkJhc2VsaW5lIENvbXBpbGF0aW9uIChUT1RBTCkiOwotICAgIGNhc2Ug
SklUQ29kZTo6REZHSklUOgotICAgICAgICByZXR1cm4gIkRGRyBDb21waWxhdGlvbiAoVE9UQUwp
IjsKLSAgICBjYXNlIEpJVENvZGU6OkZUTEpJVDoKLSAgICAgICAgcmV0dXJuICJGVEwgQ29tcGls
YXRpb24gKFRPVEFMKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi12b2lkIEV2YWxFeGVj
dXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3Ip
Ci17Ci0gICAgRXZhbEV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFi
bGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGlu
Zm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2
aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZEV2YWxD
b2RlQmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxvY2spCi0gICAgICAg
IHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci19Ci0K
LUpTT2JqZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6Y2hlY2tTeW50YXgoRXhlY1N0YXRlKiBleGVj
KQotewotICAgIFBhcnNlckVycm9yIGVycm9yOwotICAgIFZNKiB2bSA9ICZleGVjLT52bSgpOwot
ICAgIEpTR2xvYmFsT2JqZWN0KiBsZXhpY2FsR2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEds
b2JhbE9iamVjdCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxQcm9ncmFtTm9kZT4gcHJvZ3JhbU5v
ZGUgPSBwYXJzZTxQcm9ncmFtTm9kZT4oCi0gICAgICAgIHZtLCBtX3NvdXJjZSwgSWRlbnRpZmll
cigpLCBKU1BhcnNlckJ1aWx0aW5Nb2RlOjpOb3RCdWlsdGluLAotICAgICAgICBKU1BhcnNlclN0
cmljdE1vZGU6Ok5vdFN0cmljdCwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTb3VyY2VQ
YXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgZXJyb3IpOwot
ICAgIGlmIChwcm9ncmFtTm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQVNTRVJUKGVycm9y
LmlzVmFsaWQoKSk7Ci0gICAgcmV0dXJuIGVycm9yLnRvRXJyb3JPYmplY3QobGV4aWNhbEdsb2Jh
bE9iamVjdCwgbV9zb3VyY2UpOwotfQotCi1KU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6Omlu
aXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiB2bSwgQ2FsbEZyYW1lKiBjYWxsRnJhbWUsIEpT
U2NvcGUqIHNjb3BlKQotewotICAgIFJFTEVBU0VfQVNTRVJUKHNjb3BlKTsKLSAgICBKU0dsb2Jh
bE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgpOwotICAgIFJFTEVB
U0VfQVNTRVJUKGdsb2JhbE9iamVjdCk7Ci0gICAgQVNTRVJUKCZnbG9iYWxPYmplY3QtPnZtKCkg
PT0gJnZtKTsKLQotICAgIEpTT2JqZWN0KiBleGNlcHRpb24gPSAwOwotICAgIFVubGlua2VkUHJv
Z3JhbUNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZVBy
b2dyYW1Db2RlQmxvY2soY2FsbEZyYW1lLCB0aGlzLCAmZXhjZXB0aW9uKTsKLSAgICBpZiAoZXhj
ZXB0aW9uKQotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotCi0gICAgSlNHbG9iYWxMZXhpY2Fs
RW52aXJvbm1lbnQqIGdsb2JhbExleGljYWxFbnZpcm9ubWVudCA9IGdsb2JhbE9iamVjdC0+Z2xv
YmFsTGV4aWNhbEVudmlyb25tZW50KCk7Ci0gICAgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCYg
dmFyaWFibGVEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+dmFyaWFibGVEZWNsYXJh
dGlvbnMoKTsKLSAgICBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50JiBsZXhpY2FsRGVjbGFyYXRp
b25zID0gdW5saW5rZWRDb2RlQmxvY2stPmxleGljYWxEZWNsYXJhdGlvbnMoKTsKLSAgICAvLyBU
aGUgRVM2IHNwZWMgc2F5cyB0aGF0IG5vIHZhcnMvZ2xvYmFsIHByb3BlcnRpZXMvbGV0L2NvbnN0
IGNhbiBiZSBkdXBsaWNhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0gICAgLy8gVGhpcyBjYXJy
aWVkIG91dCBzZWN0aW9uIDE1LjEuOCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNtYS1p
bnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsZGVjbGFy
YXRpb25pbnN0YW50aWF0aW9uCi0gICAgewotICAgICAgICBFeGVjU3RhdGUqIGV4ZWMgPSBnbG9i
YWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyc2VjdGlv
biBvZiAidmFyIiBhbmQgImxldCIvImNvbnN0Ii8iY2xhc3MiCi0gICAgICAgIGZvciAoYXV0byYg
ZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAodmFyaWFibGVE
ZWNsYXJhdGlvbnMuY29udGFpbnMoZW50cnkua2V5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
Y3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0
ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKLSAgICAgICAg
fQotCi0gICAgICAgIC8vIENoZWNrIGlmIGFueSBuZXcgImxldCIvImNvbnN0Ii8iY2xhc3MiIHdp
bGwgc2hhZG93IGFueSBwcmUtZXhpc3RpbmcgZ2xvYmFsIHByb3BlcnR5IG5hbWVzLCBvciAidmFy
Ii8ibGV0Ii8iY29uc3QiIHZhcmlhYmxlcy4KLSAgICAgICAgLy8gSXQncyBhbiBlcnJvciB0byBp
bnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVj
bGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoZ2xvYmFsT2JqZWN0LT5oYXNQcm9wZXJ0eShl
eGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIEVTNiBzcGVj
IHNheXMgdGhhdCBqdXN0IFJlc3RyaWN0ZWRHbG9iYWxQcm9wZXJ0eSBjYW4ndCBiZSBzaGFkb3dl
ZAotICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlvbiA4LjEuMS40LjE0
IG9mIHRoZSBFUzYgc3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEt
MjYyLzYuMC9pbmRleC5odG1sI3NlYy1oYXNyZXN0cmljdGVkZ2xvYmFscHJvcGVydHkKLSAgICAg
ICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAg
ICBnbG9iYWxPYmplY3QtPmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleGVjLCBlbnRyeS5rZXku
Z2V0KCksIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlm
IChkZXNjcmlwdG9yLnZhbHVlKCkgIT0ganNVbmRlZmluZWQoKSAmJiAhZGVzY3JpcHRvci5jb25m
aWd1cmFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9y
KGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGUgdGhhdCBz
aGFkb3dzIGEgZ2xvYmFsIHByb3BlcnR5OiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICIn
IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGds
b2JhbExleGljYWxFbnZpcm9ubWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgp
KSkgewotICAgICAgICAgICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1ZS5pc0NvbnN0KCkg
JiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkgJiYgIWlzU3RyaWN0
TW9kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGFsbG93ICJjb25zdCIg
ZHVwbGljYXRlIGRlY2xhcmF0aW9ucyB1bmRlciB0aGlzIHNldHRpbmcuCi0gICAgICAgICAgICAg
ICAgICAgIC8vIEZvciBleGFtcGxlLCB3ZSBkb24ndCAibGV0IiB2YXJpYWJsZXMgdG8gYmUgb3Zl
cnJpZGRlbiBieSAiY29uc3QiIHZhcmlhYmxlcy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGds
b2JhbExleGljYWxFbnZpcm9ubWVudC0+aXNDb25zdFZhcmlhYmxlKGVudHJ5LmtleS5nZXQoKSkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmco
IkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5Lmdl
dCgpKSwgIiciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVj
ayBpZiBhbnkgbmV3ICJ2YXIicyB3aWxsIHNoYWRvdyBhbnkgcHJldmlvdXMgImxldCIvImNvbnN0
Ii8iY2xhc3MiIG5hbWVzLgotICAgICAgICAvLyBJdCdzIGFuIGVycm9yIHRvIGludHJvZHVjZSBh
IHNoYWRvdy4KLSAgICAgICAgaWYgKCFnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzRW1wdHko
KSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25z
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aGFzUHJv
cGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNh
dGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIG1fdW5saW5rZWRQcm9ncmFtQ29kZUJs
b2NrLnNldCh2bSwgdGhpcywgdW5saW5rZWRDb2RlQmxvY2spOwotCi0gICAgQmF0Y2hlZFRyYW5z
aXRpb25PcHRpbWl6ZXIgb3B0aW1pemVyKHZtLCBnbG9iYWxPYmplY3QpOwotCi0gICAgZm9yIChz
aXplX3QgaSA9IDAsIG51bWJlck9mRnVuY3Rpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPm51bWJl
ck9mRnVuY3Rpb25EZWNscygpOyBpIDwgbnVtYmVyT2ZGdW5jdGlvbnM7ICsraSkgewotICAgICAg
ICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUg
PSB1bmxpbmtlZENvZGVCbG9jay0+ZnVuY3Rpb25EZWNsKGkpOwotICAgICAgICBBU1NFUlQoIXVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgZ2xv
YmFsT2JqZWN0LT5hZGRGdW5jdGlvbihjYWxsRnJhbWUsIHVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlLT5uYW1lKCkpOwotICAgICAgICBpZiAodm0udHlwZVByb2ZpbGVyKCkgfHwgdm0uY29udHJv
bEZsb3dQcm9maWxlcigpKSB7Ci0gICAgICAgICAgICB2bS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2Fj
aGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIAotICAgICAgICAgICAgICAg
IHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKSwg
Ci0gICAgICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPnR5cGVQcm9maWxp
bmdFbmRPZmZzZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8mIGVudHJ5
IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgQVNTRVJUKGVudHJ5LnZhbHVlLmlz
VmFyKCkpOwotICAgICAgICBnbG9iYWxPYmplY3QtPmFkZFZhcihjYWxsRnJhbWUsIElkZW50aWZp
ZXI6OmZyb21VaWQoJnZtLCBlbnRyeS5rZXkuZ2V0KCkpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAg
ICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQg
PSBqc0Nhc3Q8SlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqPihnbG9iYWxPYmplY3QtPmdsb2Jh
bFNjb3BlKCkpOwotICAgICAgICBTeW1ib2xUYWJsZSogc3ltYm9sVGFibGUgPSBnbG9iYWxMZXhp
Y2FsRW52aXJvbm1lbnQtPnN5bWJvbFRhYmxlKCk7Ci0gICAgICAgIENvbmN1cnJlbnRKSVRMb2Nr
ZXIgbG9ja2VyKHN5bWJvbFRhYmxlLT5tX2xvY2spOwotICAgICAgICBmb3IgKGF1dG8mIGVudHJ5
IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgaWYgKFVOTElLRUxZKGVudHJ5
LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29uc3RSZWRlY2xhcmF0aW9uU2hvdWxkVGhy
b3coKSAmJiAhaXNTdHJpY3RNb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN5bWJvbFRh
YmxlLT5jb250YWlucyhsb2NrZXIsIGVudHJ5LmtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zm
c2V0ID0gc3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVPZmZzZXQobG9ja2VyKTsKLSAgICAgICAg
ICAgIFN5bWJvbFRhYmxlRW50cnkgbmV3RW50cnkoVmFyT2Zmc2V0KG9mZnNldCksIGVudHJ5LnZh
bHVlLmlzQ29uc3QoKSA/IFJlYWRPbmx5IDogMCk7Ci0gICAgICAgICAgICBuZXdFbnRyeS5wcmVw
YXJlVG9XYXRjaCgpOwotICAgICAgICAgICAgc3ltYm9sVGFibGUtPmFkZChsb2NrZXIsIGVudHJ5
LmtleS5nZXQoKSwgbmV3RW50cnkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTY29wZU9m
ZnNldCBvZmZzZXRGb3JBc3NlcnQgPSBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmFkZFZhcmlh
YmxlcygxLCBqc1REWlZhbHVlKCkpOwotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQob2Zmc2V0
Rm9yQXNzZXJ0ID09IG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19
Ci0KLXZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBT
bG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAgICBQcm9ncmFtRXhlY3V0YWJsZSogdGhpc09iamVj
dCA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpF
Q1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBTY3JpcHRFeGVjdXRhYmxlOjp2
aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0
aGlzT2JqZWN0LT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgaWYgKHRoaXNPYmpl
Y3QtPm1fcHJvZ3JhbUNvZGVCbG9jaykKLSAgICAgICAgdGhpc09iamVjdC0+bV9wcm9ncmFtQ29k
ZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLX0KLQotdm9pZCBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9y
KQotewotICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhF
UklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hp
bGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmpl
Y3QtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKTsKLSAgICB2aXNpdG9yLmFwcGVu
ZCgmdGhpc09iamVjdC0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKTsKLSAgICBpZiAo
dGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrKQotICAgICAgICB0aGlzT2JqZWN0
LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotfQotCi1G
dW5jdGlvbkNvZGVCbG9jayogRnVuY3Rpb25FeGVjdXRhYmxlOjpiYXNlbGluZUNvZGVCbG9ja0Zv
cihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sq
IHJlc3VsdDsKLSAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgcmVzdWx0ID0g
bV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgIGVsc2UgewotICAgICAgICBSRUxFQVNFX0FT
U0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXN1bHQgPSBtX2NvZGVC
bG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgaWYgKCFyZXN1bHQpCi0gICAgICAg
IHJldHVybiAwOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KHJl
c3VsdC0+YmFzZWxpbmVBbHRlcm5hdGl2ZSgpKTsKLX0KLQotdm9pZCBGdW5jdGlvbkV4ZWN1dGFi
bGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsK
LSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVj
dXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0
LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVj
dCwgdmlzaXRvcik7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbCkKLSAg
ICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdlYWtseSh2aXNpdG9y
KTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QpCi0gICAgICAg
IHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LT52aXNpdFdlYWtseSh2aXNpdG9y
KTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZEV4ZWN1dGFibGUp
OwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3NpbmdsZXRvbkZ1bmN0aW9uKTsK
LX0KLQotRnVuY3Rpb25FeGVjdXRhYmxlKiBGdW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxD
b2RlKAotICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUsIEV4ZWNTdGF0ZSYgZXhlYywgY29uc3Qg
U291cmNlQ29kZSYgc291cmNlLCAKLSAgICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJy
aWRlTGluZU51bWJlcikKLXsKLSAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5r
ZWRFeGVjdXRhYmxlID0gCi0gICAgICAgIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9t
R2xvYmFsQ29kZSgKLSAgICAgICAgICAgIG5hbWUsIGV4ZWMsIHNvdXJjZSwgZXhjZXB0aW9uLCBv
dmVycmlkZUxpbmVOdW1iZXIpOwotICAgIGlmICghdW5saW5rZWRFeGVjdXRhYmxlKQotICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJldHVybiB1bmxpbmtlZEV4ZWN1dGFibGUtPmxpbmso
ZXhlYy52bSgpLCBzb3VyY2UsIG92ZXJyaWRlTGluZU51bWJlcik7Ci19Ci0KLSNpZiBFTkFCTEUo
V0VCQVNTRU1CTFkpCi1jb25zdCBDbGFzc0luZm8gV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpzX2lu
Zm8gPSB7ICJXZWJBc3NlbWJseUV4ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywg
MCwgQ1JFQVRFX01FVEhPRF9UQUJMRShXZWJBc3NlbWJseUV4ZWN1dGFibGUpIH07Ci0KLVdlYkFz
c2VtYmx5RXhlY3V0YWJsZTo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiB2bSwgY29uc3QgU291
cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWduZWQgZnVuY3Rpb25J
bmRleCkKLSAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCB2bS53ZWJBc3NlbWJseUV4ZWN1dGFibGVT
dHJ1Y3R1cmUuZ2V0KCksIE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCwgTm9JbnRyaW5zaWMp
Ci0gICAgLCBtX3NvdXJjZShzb3VyY2UpCi0gICAgLCBtX21vZHVsZSh2bSwgdGhpcywgbW9kdWxl
KQotICAgICwgbV9mdW5jdGlvbkluZGV4KGZ1bmN0aW9uSW5kZXgpCi17Ci0gICAgQVNTRVJUKHNv
dXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBl
OjpXZWJBc3NlbWJseSk7Ci19Ci0KLXZvaWQgV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpkZXN0cm95
KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUq
PihjZWxsKS0+V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp+V2ViQXNzZW1ibHlFeGVjdXRhYmxlKCk7
Ci19Ci0KLXZvaWQgV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCog
Y2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxl
KiB0aGlzT2JqZWN0ID0ganNDYXN0PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwpOwotICAg
IEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBFeGVj
dXRhYmxlQmFzZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICBpZiAo
dGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsKQotICAgICAgICB0aGlzT2JqZWN0LT5tX2Nv
ZGVCbG9ja0ZvckNhbGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5k
KCZ0aGlzT2JqZWN0LT5tX21vZHVsZSk7Ci19Ci0jZW5kaWYKLQotdm9pZCBFeGVjdXRhYmxlQmFz
ZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAotewotICAgIEV4ZWN1dGFibGVCYXNlKiBy
ZWFsVGhpcyA9IGNvbnN0X2Nhc3Q8RXhlY3V0YWJsZUJhc2UqPih0aGlzKTsKLSAgICAKLSAgICBp
ZiAoY2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE5h
dGl2ZUV4ZWN1dGFibGUqIG5hdGl2ZSA9IGpzQ2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4ocmVhbFRo
aXMpOwotICAgICAgICBvdXQucHJpbnQoIk5hdGl2ZUV4ZWN1dGFibGU6IiwgUmF3UG9pbnRlcihi
aXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+ZnVuY3Rpb24oKSkpLCAiLyIsIFJhd1BvaW50ZXIo
Yml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUtPmNvbnN0cnVjdG9yKCkpKSk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxl
OjppbmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8RXZhbEV4
ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9
IGV2YWwtPmNvZGVCbG9jaygpKQotICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOwot
ICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXQucHJpbnQoIkV2YWxFeGVjdXRhYmxlIHcvbyBD
b2RlQmxvY2siKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFtRXhl
Y3V0YWJsZSogZXZhbCA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAg
ICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCi0gICAg
ICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IG91dC5wcmludCgiUHJvZ3JhbUV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAg
ICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV4ZWN1dGFibGUtPmNvZGVCbG9jaygpKQot
ICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBvdXQucHJpbnQoIk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1
bmN0aW9uID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICBpZiAo
IWZ1bmN0aW9uLT5laXRoZXJDb2RlQmxvY2soKSkKLSAgICAgICAgb3V0LnByaW50KCJGdW5jdGlv
bkV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgIGVsc2UgewotICAgICAgICBDb21tYVBy
aW50ZXIgY29tbWEoIi8iKTsKLSAgICAgICAgaWYgKGZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxs
KCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9y
Q2FsbCgpKTsKLSAgICAgICAgaWYgKGZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKSkK
LSAgICAgICAgICAgIG91dC5wcmludChjb21tYSwgKmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDb25z
dHJ1Y3QoKSk7Ci0gICAgfQotfQotCi1Db2RlQmxvY2tIYXNoIEV4ZWN1dGFibGVCYXNlOjpoYXNo
Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKLXsKLSAgICBpZiAodGhpcy0+
Y2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6aW5mbygpKQotICAgICAgICByZXR1cm4g
anNDYXN0PGNvbnN0IE5hdGl2ZUV4ZWN1dGFibGUqPih0aGlzKS0+aGFzaEZvcihraW5kKTsKLSAg
ICAKLSAgICByZXR1cm4ganNDYXN0PGNvbnN0IFNjcmlwdEV4ZWN1dGFibGUqPih0aGlzKS0+aGFz
aEZvcihraW5kKTsKLX0KLQotQ29kZUJsb2NrSGFzaCBOYXRpdmVFeGVjdXRhYmxlOjpoYXNoRm9y
KENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKLXsKLSAgICBpZiAoa2luZCA9PSBD
b2RlRm9yQ2FsbCkKLSAgICAgICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5z
aWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+KG1fZnVuY3Rpb24pKSk7Ci0gICAgCi0gICAgUkVM
RUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICByZXR1cm4gQ29kZUJs
b2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9jb25z
dHJ1Y3RvcikpKTsKLX0KLQotQ29kZUJsb2NrSGFzaCBTY3JpcHRFeGVjdXRhYmxlOjpoYXNoRm9y
KENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ29kZUJs
b2NrSGFzaChzb3VyY2UoKSwga2luZCk7Ci19Ci0KLX0KClByb3BlcnR5IGNoYW5nZXMgb246IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3BwCl9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KRGVs
ZXRlZDogc3ZuOmVvbC1zdHlsZQojIyAtMSArMCwwICMjCi1uYXRpdmUKXCBObyBuZXdsaW5lIGF0
IGVuZCBvZiBwcm9wZXJ0eQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhl
Y3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4
ZWN1dGFibGUuaAkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvRXhlY3V0YWJsZS5oCShub25leGlzdGVudCkKQEAgLTEsNzc4ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTMtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwot
Ci0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkFyaXR5Q2hlY2tNb2RlLmgiCi0jaW5jbHVkZSAi
Q2FsbERhdGEuaCIKLSNpbmNsdWRlICJDb2RlQmxvY2tIYXNoLmgiCi0jaW5jbHVkZSAiQ29kZVNw
ZWNpYWxpemF0aW9uS2luZC5oIgotI2luY2x1ZGUgIkNvbXBpbGF0aW9uUmVzdWx0LmgiCi0jaW5j
bHVkZSAiRXhlY3V0YWJsZUluZm8uaCIKLSNpbmNsdWRlICJIYW5kbGVySW5mby5oIgotI2luY2x1
ZGUgIkluZmVycmVkVmFsdWUuaCIKLSNpbmNsdWRlICJKSVRDb2RlLmgiCi0jaW5jbHVkZSAiSlNH
bG9iYWxPYmplY3QuaCIKLSNpbmNsdWRlICJTb3VyY2VDb2RlLmgiCi0jaW5jbHVkZSAiVHlwZVNl
dC5oIgotI2luY2x1ZGUgIlVubGlua2VkQ29kZUJsb2NrLmgiCi0jaW5jbHVkZSAiVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGUuaCIKLQotbmFtZXNwYWNlIEpTQyB7Ci0KLWNsYXNzIENvZGVCbG9j
azsKLWNsYXNzIEV2YWxDb2RlQmxvY2s7Ci1jbGFzcyBGdW5jdGlvbkNvZGVCbG9jazsKLWNsYXNz
IEpTU2NvcGU7Ci1jbGFzcyBKU1dhc21Nb2R1bGU7Ci1jbGFzcyBMTEludE9mZnNldHNFeHRyYWN0
b3I7Ci1jbGFzcyBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOwotY2xhc3MgUHJvZ3JhbUNvZGVCbG9j
azsKLWNsYXNzIFdlYkFzc2VtYmx5Q29kZUJsb2NrOwotCi1lbnVtIENvbXBpbGF0aW9uS2luZCB7
IEZpcnN0Q29tcGlsYXRpb24sIE9wdGltaXppbmdDb21waWxhdGlvbiB9OwotCi1pbmxpbmUgYm9v
bCBpc0NhbGwoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotewotICAgIGlmIChraW5kID09
IENvZGVGb3JDYWxsKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBBU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ29uc3RydWN0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNsYXNzIEV4ZWN1dGFi
bGVCYXNlIDogcHVibGljIEpTQ2VsbCB7Ci0gICAgZnJpZW5kIGNsYXNzIEpJVDsKLQotcHJvdGVj
dGVkOgotICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCA9IDA7Ci0g
ICAgc3RhdGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQgPSAtMTsKLQot
ICAgIEV4ZWN1dGFibGVCYXNlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIGludCBudW1Q
YXJhbWV0ZXJzLCBJbnRyaW5zaWMgaW50cmluc2ljKQotICAgICAgICA6IEpTQ2VsbCh2bSwgc3Ry
dWN0dXJlKQotICAgICAgICAsIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwobnVtUGFyYW1ldGVycykK
LSAgICAgICAgLCBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QobnVtUGFyYW1ldGVycykKLSAg
ICAgICAgLCBtX2ludHJpbnNpYyhpbnRyaW5zaWMpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQg
ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQotICAgIHsKLSAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRp
b24odm0pOwotICAgIH0KLQotcHVibGljOgotICAgIHR5cGVkZWYgSlNDZWxsIEJhc2U7Ci0gICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxh
Z3M7Ci0KLSAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVkc0Rlc3RydWN0aW9uID0gdHJ1ZTsKLSAg
ICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAgICBDb2RlQmxvY2tI
YXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7Ci0KLSAgICBib29sIGlz
RXZhbEV4ZWN1dGFibGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBF
dmFsRXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotICAgIGJvb2wgaXNGdW5jdGlvbkV4ZWN1dGFibGUo
KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBGdW5jdGlvbkV4ZWN1dGFi
bGVUeXBlOwotICAgIH0KLSAgICBib29sIGlzUHJvZ3JhbUV4ZWN1dGFibGUoKSBjb25zdAotICAg
IHsKLSAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBQcm9ncmFtRXhlY3V0YWJsZVR5cGU7Ci0gICAg
fQotICAgIGJvb2wgaXNNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpCi0gICAgewotICAgICAgICBy
ZXR1cm4gdHlwZSgpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0KLQot
ICAgIGJvb2wgaXNIb3N0RnVuY3Rpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgQVNTRVJUKCht
X251bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QpID09IChtX251
bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkpOwotICAg
ICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9PSBOVU1fUEFSQU1FVEVSU19JU19I
T1NUOwotICAgIH0KLQotI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKLSAgICBib29sIGlzV2ViQXNz
ZW1ibHlFeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0g
V2ViQXNzZW1ibHlFeGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHN0YXRpYyBT
dHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QsIEpTVmFsdWUgcHJvdG8pIHsgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9i
YWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhDZWxsVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZv
KCkpOyB9Ci0gICAgICAgIAotICAgIHZvaWQgY2xlYXJDb2RlKCk7Ci0KLSAgICBERUNMQVJFX0VY
UE9SVF9JTkZPOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG1fbnVtUGFyYW1ldGVyc0ZvckNhbGw7
Ci0gICAgaW50IG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdDsKLQotcHVibGljOgotICAgIFBh
c3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKQotICAgIHsKLSAgICAg
ICAgQVNTRVJUKG1faml0Q29kZUZvckNhbGwpOwotICAgICAgICByZXR1cm4gbV9qaXRDb2RlRm9y
Q2FsbDsKLSAgICB9Ci0KLSAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVG
b3JDb25zdHJ1Y3QoKQotICAgIHsKLSAgICAgICAgQVNTRVJUKG1faml0Q29kZUZvckNvbnN0cnVj
dCk7Ci0gICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDb25zdHJ1Y3Q7Ci0gICAgfQotICAgICAg
ICAKLSAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3IoQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNh
bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICAg
ICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBnZW5l
cmF0ZWRKSVRDb2RlRm9yQ29uc3RydWN0KCk7Ci0gICAgfQotICAgIAotICAgIE1hY3JvQXNzZW1i
bGVyQ29kZVB0ciBlbnRyeXBvaW50Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQXJp
dHlDaGVja01vZGUgYXJpdHkpCi0gICAgewotICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEg
Y2FjaGVkIHJlc3VsdC4gV2Ugb25seSBoYXZlIGl0IGZvciBhcml0eSBjaGVjayBiZWNhdXNlIHdl
IHVzZSB0aGUKLSAgICAgICAgLy8gbm8tYXJpdHkgZW50cnlwb2ludCBpbiBub24tdmlydHVhbCBj
YWxscywgd2hpY2ggd2lsbCAiY2FjaGUiIHRoaXMgdmFsdWUgZGlyZWN0bHkgaW4KLSAgICAgICAg
Ly8gbWFjaGluZSBjb2RlLgotICAgICAgICBpZiAoYXJpdHkgPT0gTXVzdENoZWNrQXJpdHkpIHsK
LSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2Fs
bDoKLSAgICAgICAgICAgICAgICBpZiAoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9IG1f
aml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjaykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29kZUZv
ckNvbnN0cnVjdDoKLSAgICAgICAgICAgICAgICBpZiAoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJl
c3VsdCA9IG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKQotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPQot
ICAgICAgICAgICAgZ2VuZXJhdGVkSklUQ29kZUZvcihraW5kKS0+YWRkcmVzc0ZvckNhbGwoYXJp
dHkpOwotICAgICAgICBpZiAoYXJpdHkgPT0gTXVzdENoZWNrQXJpdHkpIHsKLSAgICAgICAgICAg
IC8vIENhY2hlIHRoZSByZXN1bHQ7IHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgSklUJ3Mgdmly
dHVhbCBjYWxsIG9wdGltaXphdGlvbnMuCi0gICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAg
ICAgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6Ci0gICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9y
Q2FsbFdpdGhBcml0eUNoZWNrID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAgICAgICAgICAgICAgIG1faml0Q29k
ZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0g
ICAgfQotCi0gICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZkpJVENvZGVXaXRoQXJpdHlDaGVj
a0ZvcigKLSAgICAgICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAg
ICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgIGNhc2UgQ29kZUZvckNhbGw6Ci0gICAgICAgICAg
ICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX2ppdENvZGVGb3JDYWxs
V2l0aEFyaXR5Q2hlY2spOwotICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAg
ICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX2ppdENvZGVGb3JD
b25zdHJ1Y3RXaXRoQXJpdHlDaGVjayk7Ci0gICAgICAgIH0KLSAgICAgICAgUkVMRUFTRV9BU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHN0
YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZOdW1QYXJhbWV0ZXJzRm9yKENvZGVTcGVjaWFsaXphdGlv
bktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAg
ICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9udW1QYXJh
bWV0ZXJzRm9yQ2FsbCk7Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3Qp
OwotICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBh
cmFtZXRlcnNGb3JDb25zdHJ1Y3QpOwotICAgIH0KLQotICAgIGJvb2wgaGFzSklUQ29kZUZvckNh
bGwoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwg
Pj0gMDsKLSAgICB9Ci0gICAgICAgIAotICAgIGJvb2wgaGFzSklUQ29kZUZvckNvbnN0cnVjdCgp
IGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0
ID49IDA7Ci0gICAgfQotICAgICAgICAKLSAgICBib29sIGhhc0pJVENvZGVGb3IoQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29k
ZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gaGFzSklUQ29kZUZvckNhbGwoKTsKLSAgICAg
ICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBoYXNK
SVRDb2RlRm9yQ29uc3RydWN0KCk7Ci0gICAgfQotCi0gICAgLy8gSW50cmluc2ljcyBhcmUgb25s
eSBmb3IgY2FsbHMsIGN1cnJlbnRseS4KLSAgICBJbnRyaW5zaWMgaW50cmluc2ljKCkgY29uc3Qg
eyByZXR1cm4gbV9pbnRyaW5zaWM7IH0KLSAgICAgICAgCi0gICAgSW50cmluc2ljIGludHJpbnNp
Y0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Ci0gICAgewotICAgICAgICBp
ZiAoaXNDYWxsKGtpbmQpKQotICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpYygpOwotICAgICAg
ICByZXR1cm4gTm9JbnRyaW5zaWM7Ci0gICAgfQotICAgIAotICAgIHZvaWQgZHVtcChQcmludFN0
cmVhbSYpIGNvbnN0OwotICAgICAgICAKLXByb3RlY3RlZDoKLSAgICBJbnRyaW5zaWMgbV9pbnRy
aW5zaWM7Ci0gICAgUmVmUHRyPEpJVENvZGU+IG1faml0Q29kZUZvckNhbGw7Ci0gICAgUmVmUHRy
PEpJVENvZGU+IG1faml0Q29kZUZvckNvbnN0cnVjdDsKLSAgICBNYWNyb0Fzc2VtYmxlckNvZGVQ
dHIgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrOwotICAgIE1hY3JvQXNzZW1ibGVyQ29k
ZVB0ciBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjazsKLX07Ci0KLWNsYXNzIE5h
dGl2ZUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgewotICAgIGZyaWVu
ZCBjbGFzcyBKSVQ7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1
YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1
cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIE5hdGl2ZUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYg
dm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlv
biwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29u
c3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSk7Ci0KLSAg
ICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgQ29kZUJsb2NrSGFzaCBoYXNo
Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OwotCi0gICAgTmF0aXZlRnVuY3Rpb24g
ZnVuY3Rpb24oKSB7IHJldHVybiBtX2Z1bmN0aW9uOyB9Ci0gICAgTmF0aXZlRnVuY3Rpb24gY29u
c3RydWN0b3IoKSB7IHJldHVybiBtX2NvbnN0cnVjdG9yOyB9Ci0gICAgICAgIAotICAgIE5hdGl2
ZUZ1bmN0aW9uIG5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkK
LSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0
dXJuIGZ1bmN0aW9uKCk7Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3Qp
OwotICAgICAgICByZXR1cm4gY29uc3RydWN0b3IoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHN0
YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZOYXRpdmVGdW5jdGlvbkZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAg
ICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9mdW5j
dGlvbik7Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAg
ICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUsIG1fY29uc3RydWN0b3Ip
OwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYsIEpT
R2xvYmFsT2JqZWN0KiwgSlNWYWx1ZSBwcm90byk7Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5G
TzsKLQotICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQot
Ci1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYsIFBhc3NSZWZQdHI8SklU
Q29kZT4gY2FsbFRodW5rLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25z
dCBTdHJpbmcmIG5hbWUpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxl
QmFzZTsKLQotICAgIE5hdGl2ZUV4ZWN1dGFibGUoVk0mLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlv
biwgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyk7Ci0KLSAgICBOYXRpdmVG
dW5jdGlvbiBtX2Z1bmN0aW9uOwotICAgIE5hdGl2ZUZ1bmN0aW9uIG1fY29uc3RydWN0b3I7Ci0K
LSAgICBTdHJpbmcgbV9uYW1lOwotfTsKLQotY2xhc3MgU2NyaXB0RXhlY3V0YWJsZSA6IHB1Ymxp
YyBFeGVjdXRhYmxlQmFzZSB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBC
YXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0
cnVjdHVyZUZsYWdzOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLSAgICAg
ICAgCi0gICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNv
bnN0OwotCi0gICAgY29uc3QgU291cmNlQ29kZSYgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbV9z
b3VyY2U7IH0KLSAgICBpbnRwdHJfdCBzb3VyY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNl
LnByb3ZpZGVySUQoKTsgfQotICAgIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKCkgY29uc3QgeyBy
ZXR1cm4gbV9zb3VyY2UucHJvdmlkZXIoKS0+dXJsKCk7IH0KLSAgICBpbnQgZmlyc3RMaW5lKCkg
Y29uc3QgeyByZXR1cm4gbV9maXJzdExpbmU7IH0KLSAgICB2b2lkIHNldE92ZXJyaWRlTGluZU51
bWJlcihpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKSB7IG1fb3ZlcnJpZGVMaW5lTnVtYmVyID0gb3Zl
cnJpZGVMaW5lTnVtYmVyOyB9Ci0gICAgYm9vbCBoYXNPdmVycmlkZUxpbmVOdW1iZXIoKSBjb25z
dCB7IHJldHVybiBtX292ZXJyaWRlTGluZU51bWJlciAhPSAtMTsgfQotICAgIGludCBvdmVycmlk
ZUxpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX292ZXJyaWRlTGluZU51bWJlcjsgfQotICAg
IGludCBsYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdExpbmU7IH0KLSAgICB1bnNpZ25l
ZCBzdGFydENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRDb2x1bW47IH0KLSAgICB1bnNp
Z25lZCBlbmRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBtX2VuZENvbHVtbjsgfQotICAgIHVuc2ln
bmVkIHR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZVByb2Zp
bGluZ1N0YXJ0T2Zmc2V0OyB9Ci0gICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ0VuZE9mZnNldCgp
IGNvbnN0IHsgcmV0dXJuIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsgfQotCi0gICAgYm9vbCB1
c2VzRXZhbCgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBFdmFsRmVhdHVyZTsgfQotICAg
IGJvb2wgdXNlc0FyZ3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBBcmd1bWVu
dHNGZWF0dXJlOyB9Ci0gICAgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCkgY29uc3QgeyBy
ZXR1cm4gbV9pc0Fycm93RnVuY3Rpb25Db250ZXh0OyB9Ci0gICAgYm9vbCBpc1N0cmljdE1vZGUo
KSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzICYgU3RyaWN0TW9kZUZlYXR1cmU7IH0KLSAgICBE
ZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3Rh
dGljX2Nhc3Q8RGVyaXZlZENvbnRleHRUeXBlPihtX2Rlcml2ZWRDb250ZXh0VHlwZSk7IH0KLSAg
ICBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8RXZhbENvbnRleHRUeXBlPihtX2V2YWxDb250ZXh0VHlwZSk7IH0KLQotICAgIEVDTUFN
b2RlIGVjbWFNb2RlKCkgY29uc3QgeyByZXR1cm4gaXNTdHJpY3RNb2RlKCkgPyBTdHJpY3RNb2Rl
IDogTm90U3RyaWN0TW9kZTsgfQotICAgICAgICAKLSAgICB2b2lkIHNldE5ldmVySW5saW5lKGJv
b2wgdmFsdWUpIHsgbV9uZXZlcklubGluZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXROZXZlck9w
dGltaXplKGJvb2wgdmFsdWUpIHsgbV9uZXZlck9wdGltaXplID0gdmFsdWU7IH0KLSAgICB2b2lk
IHNldE5ldmVyRlRMT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyRlRMT3B0aW1pemUgPSB2
YWx1ZTsgfQotICAgIHZvaWQgc2V0RGlkVHJ5VG9FbnRlckluTG9vcChib29sIHZhbHVlKSB7IG1f
ZGlkVHJ5VG9FbnRlckluTG9vcCA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXRDYW5Vc2VPU1JFeGl0
RnV6emluZyhib29sIHZhbHVlKSB7IG1fY2FuVXNlT1NSRXhpdEZ1enppbmcgPSB2YWx1ZTsgfQot
ICAgIGJvb2wgbmV2ZXJJbmxpbmUoKSBjb25zdCB7IHJldHVybiBtX25ldmVySW5saW5lOyB9Ci0g
ICAgYm9vbCBuZXZlck9wdGltaXplKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlck9wdGltaXplOyB9
Ci0gICAgYm9vbCBuZXZlckZUTE9wdGltaXplKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlckZUTE9w
dGltaXplOyB9Ci0gICAgYm9vbCBkaWRUcnlUb0VudGVySW5Mb29wKCkgY29uc3QgeyByZXR1cm4g
bV9kaWRUcnlUb0VudGVySW5Mb29wOyB9Ci0gICAgYm9vbCBpc0lubGluaW5nQ2FuZGlkYXRlKCkg
Y29uc3QgeyByZXR1cm4gIW5ldmVySW5saW5lKCk7IH0KLSAgICBib29sIGlzT2tUb09wdGltaXpl
KCkgY29uc3QgeyByZXR1cm4gIW5ldmVyT3B0aW1pemUoKTsgfQotICAgIGJvb2wgY2FuVXNlT1NS
RXhpdEZ1enppbmcoKSBjb25zdCB7IHJldHVybiBtX2NhblVzZU9TUkV4aXRGdXp6aW5nOyB9Ci0g
ICAgCi0gICAgYm9vbCogYWRkcmVzc09mRGlkVHJ5VG9FbnRlckluTG9vcCgpIHsgcmV0dXJuICZt
X2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KLQotICAgIENvZGVGZWF0dXJlcyBmZWF0dXJlcygpIGNv
bnN0IHsgcmV0dXJuIG1fZmVhdHVyZXM7IH0KLSAgICAgICAgCi0gICAgREVDTEFSRV9FWFBPUlRf
SU5GTzsKLQotICAgIHZvaWQgcmVjb3JkUGFyc2UoQ29kZUZlYXR1cmVzIGZlYXR1cmVzLCBib29s
IGhhc0NhcHR1cmVkVmFyaWFibGVzLCBpbnQgZmlyc3RMaW5lLCBpbnQgbGFzdExpbmUsIHVuc2ln
bmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4pCi0gICAgewotICAgICAgICBtX2Zl
YXR1cmVzID0gZmVhdHVyZXM7Ci0gICAgICAgIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMgPSBoYXND
YXB0dXJlZFZhcmlhYmxlczsKLSAgICAgICAgbV9maXJzdExpbmUgPSBmaXJzdExpbmU7Ci0gICAg
ICAgIG1fbGFzdExpbmUgPSBsYXN0TGluZTsKLSAgICAgICAgQVNTRVJUKHN0YXJ0Q29sdW1uICE9
IFVJTlRfTUFYKTsKLSAgICAgICAgbV9zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOwotICAgICAg
ICBBU1NFUlQoZW5kQ29sdW1uICE9IFVJTlRfTUFYKTsKLSAgICAgICAgbV9lbmRDb2x1bW4gPSBl
bmRDb2x1bW47Ci0gICAgfQotCi0gICAgdm9pZCBpbnN0YWxsQ29kZShDb2RlQmxvY2sqKTsKLSAg
ICB2b2lkIGluc3RhbGxDb2RlKFZNJiwgQ29kZUJsb2NrKiwgQ29kZVR5cGUsIENvZGVTcGVjaWFs
aXphdGlvbktpbmQpOwotICAgIENvZGVCbG9jayogbmV3Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFs
aXphdGlvbktpbmQsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgSlNPYmplY3QqJiBleGNlcHRpb24p
OwotICAgIENvZGVCbG9jayogbmV3UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxp
emF0aW9uS2luZCk7Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyBhbiBpbnRlcmVzdGluZyBH
QyBzdG9yeS4gQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBhc2tpbmcgdXMgdG8gY3JlYXRl
IGEgQ29kZUJsb2NrCi0gICAgLy8gdGhhdCBpcyBub3QgamV0dGlzb25lZCBiZWZvcmUgdGhpcyBm
dW5jdGlvbiByZXR1cm5zLiBDYWxsZXJzIGFyZSBlc3NlbnRpYWxseSBhc2tpbmcgZm9yIGEgc3Ry
b25nIHJlZmVyZW5jZQotICAgIC8vIHRvIHRoZSBDb2RlQmxvY2suIEJlY2F1c2UgdGhlIEV4ZWN1
dGFibGUgbWF5IGJlIGFsbG9jYXRpbmcgdGhlIENvZGVCbG9jaywgd2UgcmVxdWlyZSBjYWxsZXJz
IHRvIHBhc3MgaW4KLSAgICAvLyB0aGVpciBDb2RlQmxvY2sqJiByZWZlcmVuY2UgYmVjYXVzZSBp
dCdzIHNhZmUgZm9yIENvZGVCbG9jayB0byBiZSBqZXR0aXNvbmVkIGlmIEV4ZWN1dGFibGUgaXMg
dGhlIG9ubHkgdGhpbmcKLSAgICAvLyB0byBwb2ludCB0byBpdC4gVGhpcyBmb3JjZXMgY2FsbGVy
cyB0byBoYXZlIGEgQ29kZUJsb2NrKiBpbiBhIHJlZ2lzdGVyIG9yIG9uIHRoZSBzdGFjayB0aGF0
IHdpbGwgYmUgbWFya2VkCi0gICAgLy8gYnkgY29uc2VydmF0aXZlIEdDIGlmIGEgR0MgaGFwcGVu
cyBhZnRlciB3ZSBjcmVhdGUgdGhlIENvZGVCbG9jay4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
RXhlY3V0YWJsZVR5cGU+Ci0gICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb24oVk0mLCBK
U0Z1bmN0aW9uKiwgSlNTY29wZSosIENvZGVTcGVjaWFsaXphdGlvbktpbmQsIENvZGVCbG9jayom
IHJlc3VsdENvZGVCbG9jayk7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4gdm9p
ZCBmb3JFYWNoQ29kZUJsb2NrKEZ1bmN0b3ImJik7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNs
YXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIEpTT2JqZWN0KiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1w
bChWTSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29k
ZUJsb2NrKiYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgU2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUq
LCBWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVk
Q29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5
cGUsIEludHJpbnNpYyk7Ci0KLSAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKLSAgICB7
Ci0gICAgICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICAgICAgdm0uaGVhcC5hZGRF
eGVjdXRhYmxlKHRoaXMpOyAvLyBCYWxhbmNlZCBieSBIZWFwOjpkZWxldGVVbm1hcmtlZENvbXBp
bGVkQ29kZSgpLgotCi0jaWYgRU5BQkxFKENPREVCTE9DS19TQU1QTElORykKLSAgICAgICAgaWYg
KFNhbXBsaW5nVG9vbCogc2FtcGxlciA9IHZtLmludGVycHJldGVyLT5zYW1wbGVyKCkpCi0gICAg
ICAgICAgICBzYW1wbGVyLT5ub3RpZnlPZlNjb3BlKHZtLCB0aGlzKTsKLSNlbmRpZgotICAgIH0K
LQotICAgIENvZGVGZWF0dXJlcyBtX2ZlYXR1cmVzOwotICAgIGJvb2wgbV9kaWRUcnlUb0VudGVy
SW5Mb29wOwotICAgIGJvb2wgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA6IDE7Ci0gICAgYm9vbCBt
X25ldmVySW5saW5lIDogMTsKLSAgICBib29sIG1fbmV2ZXJPcHRpbWl6ZSA6IDE7Ci0gICAgYm9v
bCBtX25ldmVyRlRMT3B0aW1pemUgOiAxOwotICAgIGJvb2wgbV9pc0Fycm93RnVuY3Rpb25Db250
ZXh0IDogMTsKLSAgICBib29sIG1fY2FuVXNlT1NSRXhpdEZ1enppbmcgOiAxOwotICAgIHVuc2ln
bmVkIG1fZGVyaXZlZENvbnRleHRUeXBlIDogMjsgLy8gRGVyaXZlZENvbnRleHRUeXBlCi0gICAg
dW5zaWduZWQgbV9ldmFsQ29udGV4dFR5cGUgOiAyOyAvLyBFdmFsQ29udGV4dFR5cGUKLQotICAg
IGludCBtX292ZXJyaWRlTGluZU51bWJlcjsKLSAgICBpbnQgbV9maXJzdExpbmU7Ci0gICAgaW50
IG1fbGFzdExpbmU7Ci0gICAgdW5zaWduZWQgbV9zdGFydENvbHVtbjsKLSAgICB1bnNpZ25lZCBt
X2VuZENvbHVtbjsKLSAgICB1bnNpZ25lZCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldDsKLSAg
ICB1bnNpZ25lZCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQ7Ci0gICAgU291cmNlQ29kZSBtX3Nv
dXJjZTsKLX07Ci0KLWNsYXNzIEV2YWxFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4
ZWN1dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJs
aWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1
cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAg
IEV2YWxDb2RlQmxvY2sqIGNvZGVCbG9jaygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9ldmFs
Q29kZUJsb2NrLmdldCgpOwotICAgIH0KLQotICAgIHN0YXRpYyBFdmFsRXhlY3V0YWJsZSogY3Jl
YXRlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGlzSW5TdHJpY3RDb250ZXh0
LCBEZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENv
bnRleHRUeXBlLCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50Kik7Ci0KLSAgICBQYXNzUmVmUHRy
PEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdlbmVy
YXRlZEpJVENvZGVGb3JDYWxsKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3Jl
YXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1
ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xv
YmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oRXZhbEV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7Ci0gICAgfQotICAgICAgICAKLSAgICBERUNMQVJFX0lORk87Ci0KLSAg
ICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFi
bGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVj
dG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTdXBlckJpbmRpbmc6
Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgZGVyaXZlZENvbnRleHRU
eXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIGV2YWxDb250ZXh0VHlwZSgp
KTsgfQotCi0gICAgdW5zaWduZWQgbnVtVmFyaWFibGVzKCkgeyByZXR1cm4gbV91bmxpbmtlZEV2
YWxDb2RlQmxvY2stPm51bVZhcmlhYmxlcygpOyB9Ci0gICAgdW5zaWduZWQgbnVtYmVyT2ZGdW5j
dGlvbkRlY2xzKCkgeyByZXR1cm4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2stPm51bWJlck9mRnVu
Y3Rpb25EZWNscygpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVC
YXNlOwotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwotCi0gICAgRXZhbEV4ZWN1
dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaW5TdHJpY3RDb250ZXh0
LCBEZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENv
bnRleHRUeXBlKTsKLQotICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xv
dFZpc2l0b3ImKTsKLQotICAgIFdyaXRlQmFycmllcjxFdmFsQ29kZUJsb2NrPiBtX2V2YWxDb2Rl
QmxvY2s7Ci0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRXZhbENvZGVCbG9jaz4gbV91bmxpbmtl
ZEV2YWxDb2RlQmxvY2s7Ci19OwotCi1jbGFzcyBQcm9ncmFtRXhlY3V0YWJsZSBmaW5hbCA6IHB1
YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKLSAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0
cmFjdG9yOwotcHVibGljOgotICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOwotICAg
IHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZs
YWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKLQotICAgIHN0YXRpYyBQcm9ncmFtRXhlY3V0YWJs
ZSogY3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQotICAg
IHsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGws
IGFsbG9jYXRlQ2VsbDxQcm9ncmFtRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIFByb2dyYW1F
eGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0
aW9uKGV4ZWMtPnZtKCkpOwotICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKLSAgICB9Ci0KLQot
ICAgIEpTT2JqZWN0KiBpbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYsIENhbGxGcmFtZSos
IEpTU2NvcGUqKTsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBQ
cm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2soKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcHJv
Z3JhbUNvZGVCbG9jay5nZXQoKTsKLSAgICB9Ci0KLSAgICBKU09iamVjdCogY2hlY2tTeW50YXgo
RXhlY1N0YXRlKik7Ci0KLSAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUo
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7Ci0gICAg
fQotICAgICAgICAKLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZt
LCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBU
eXBlSW5mbyhQcm9ncmFtRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsK
LSAgICB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEV4ZWN1dGFibGVJbmZv
IGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwo
KSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBK
U1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3Vy
Y2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1
bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lKTsgfQotCi1wcml2
YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBmcmllbmQgY2xhc3Mg
U2NyaXB0RXhlY3V0YWJsZTsKLQotICAgIFByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNv
bnN0IFNvdXJjZUNvZGUmKTsKLQotICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxs
KiwgU2xvdFZpc2l0b3ImKTsKLQotICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZFByb2dyYW1Db2Rl
QmxvY2s+IG1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrOwotICAgIFdyaXRlQmFycmllcjxQcm9n
cmFtQ29kZUJsb2NrPiBtX3Byb2dyYW1Db2RlQmxvY2s7Ci19OwotCi1jbGFzcyBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKLSAgICBmcmll
bmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwotcHVibGljOgotICAgIHR5cGVkZWYgU2Ny
aXB0RXhlY3V0YWJsZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVG
bGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKLQotICAg
IHN0YXRpYyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNTdGF0ZSosIGNvbnN0
IFNvdXJjZUNvZGUmKTsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAg
ICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2soKQotICAgIHsKLSAgICAgICAgcmV0
dXJuIG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKLSAgICB9Ci0KLSAgICBQYXNzUmVm
UHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdl
bmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cnVjdHVyZSog
Y3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNW
YWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwg
Z2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBl
LCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAgREVDTEFSRV9JTkZPOwot
Ci0gICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVj
dXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25z
dHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6TW9kdWxlLCBTdXBlckJpbmRp
bmc6Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpNb2R1bGVFdmFsdWF0ZU1vZGUsIGRlcml2
ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29u
dGV4dFR5cGU6Ok5vbmUpOyB9Ci0KLSAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sq
IHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaygpIHsgcmV0dXJuIG1fdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOyB9Ci0KLSAgICBTeW1ib2xUYWJsZSogbW9kdWxlRW52
aXJvbm1lbnRTeW1ib2xUYWJsZSgpIHsgcmV0dXJuIG1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xU
YWJsZS5nZXQoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFz
ZTsKLSAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKLQotICAgIE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmKTsKLQotICAgIHN0YXRp
YyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKLQotICAgIFdyaXRl
QmFycmllcjxVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fdW5saW5rZWRNb2R1bGVQ
cm9ncmFtQ29kZUJsb2NrOwotICAgIFdyaXRlQmFycmllcjxTeW1ib2xUYWJsZT4gbV9tb2R1bGVF
bnZpcm9ubWVudFN5bWJvbFRhYmxlOwotICAgIFdyaXRlQmFycmllcjxNb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrPiBtX21vZHVsZVByb2dyYW1Db2RlQmxvY2s7Ci19OwotCi1jbGFzcyBGdW5jdGlvbkV4
ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNs
YXNzIEpJVDsKLSAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwotcHVibGlj
OgotICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJl
SXNJbW1vcnRhbDsKLQotICAgIHN0YXRpYyBGdW5jdGlvbkV4ZWN1dGFibGUqIGNyZWF0ZSgKLSAg
ICAgICAgVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVubGlua2VkRnVuY3Rpb25F
eGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUsIAotICAgICAgICB1bnNpZ25lZCBmaXJzdExp
bmUsIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5k
Q29sdW1uLCBJbnRyaW5zaWMgaW50cmluc2ljKQotICAgIHsKLSAgICAgICAgRnVuY3Rpb25FeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8RnVuY3Rpb25F
eGVjdXRhYmxlPih2bS5oZWFwKSkgRnVuY3Rpb25FeGVjdXRhYmxlKHZtLCBzb3VyY2UsIHVubGlu
a2VkRXhlY3V0YWJsZSwgZmlyc3RMaW5lLCBsYXN0TGluZSwgc3RhcnRDb2x1bW4sIGVuZENvbHVt
biwgaW50cmluc2ljKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwot
ICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKLSAgICB9Ci0gICAgc3RhdGljIEZ1bmN0aW9uRXhl
Y3V0YWJsZSogZnJvbUdsb2JhbENvZGUoCi0gICAgICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUs
IEV4ZWNTdGF0ZSYsIGNvbnN0IFNvdXJjZUNvZGUmLCAKLSAgICAgICAgSlNPYmplY3QqJiBleGNl
cHRpb24sIGludCBvdmVycmlkZUxpbmVOdW1iZXIpOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJv
eShKU0NlbGwqKTsKLSAgICAgICAgCi0gICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVu
bGlua2VkRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV91bmxpbmtl
ZEV4ZWN1dGFibGUuZ2V0KCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyBlaXRoZXIgY2FsbCBv
ciBjb25zdHJ1Y3QgYnl0ZWNvZGUuIFRoaXMgY2FuIGJlIGFwcHJvcHJpYXRlCi0gICAgLy8gZm9y
IGFuc3dlcmluZyBxdWVzdGlvbnMgdGhhdCB0aGF0IGRvbid0IHZhcnkgYmV0d2VlbiBjYWxsIGFu
ZCBjb25zdHJ1Y3QgLS0KLSAgICAvLyBmb3IgZXhhbXBsZSwgYXJndW1lbnRzUmVnaXN0ZXIoKS4K
LSAgICBGdW5jdGlvbkNvZGVCbG9jayogZWl0aGVyQ29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAg
IGlmIChtX2NvZGVCbG9ja0ZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tG
b3JDYWxsLmdldCgpOwotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0
KCk7Ci0gICAgfQotICAgICAgICAKLSAgICBib29sIGlzR2VuZXJhdGVkRm9yQ2FsbCgpIGNvbnN0
Ci0gICAgewotICAgICAgICByZXR1cm4gISFtX2NvZGVCbG9ja0ZvckNhbGw7Ci0gICAgfQotCi0g
ICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNhbGwoKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICB9Ci0KLSAgICBib29sIGlzR2Vu
ZXJhdGVkRm9yQ29uc3RydWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVC
bG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayog
Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGJvb2wgaXNHZW5lcmF0
ZWRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZWRGb3JDYWxs
KCk7Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICBy
ZXR1cm4gaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIEZ1
bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
KQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICBy
ZXR1cm4gY29kZUJsb2NrRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9y
Q29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpOwotICAg
IH0KLQotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9ja0ZvcihDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kKTsKLSAgICAgICAgCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIHByb2Zp
bGVkQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAg
ICAgIHJldHVybiBiYXNlbGluZUNvZGVCbG9ja0ZvcihraW5kKTsKLSAgICB9Ci0KLSAgICBSZWZQ
dHI8VHlwZVNldD4gcmV0dXJuU3RhdGVtZW50VHlwZVNldCgpIAotICAgIHsKLSAgICAgICAgaWYg
KCFtX3JldHVyblN0YXRlbWVudFR5cGVTZXQpCi0gICAgICAgICAgICBtX3JldHVyblN0YXRlbWVu
dFR5cGVTZXQgPSBUeXBlU2V0OjpjcmVhdGUoKTsKLQotICAgICAgICByZXR1cm4gbV9yZXR1cm5T
dGF0ZW1lbnRUeXBlU2V0OwotICAgIH0KLSAgICAgICAgCi0gICAgRnVuY3Rpb25Nb2RlIGZ1bmN0
aW9uTW9kZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbk1vZGUoKTsg
fQotICAgIGJvb2wgaXNCdWlsdGluRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2Vk
RXhlY3V0YWJsZS0+aXNCdWlsdGluRnVuY3Rpb24oKTsgfQotICAgIENvbnN0cnVjdEFiaWxpdHkg
Y29uc3RydWN0QWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5j
b25zdHJ1Y3RBYmlsaXR5KCk7IH0KLSAgICBib29sIGlzQ2xhc3MoKSBjb25zdCB7IHJldHVybiAh
Y2xhc3NTb3VyY2UoKS5pc051bGwoKTsgfQotICAgIGJvb2wgaXNBcnJvd0Z1bmN0aW9uKCkgY29u
c3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpBcnJvd0Z1bmN0aW9u
TW9kZTsgfQotICAgIGJvb2wgaXNHZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9
PSBTb3VyY2VQYXJzZU1vZGU6OkdldHRlck1vZGU7IH0KLSAgICBib29sIGlzU2V0dGVyKCkgY29u
c3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpTZXR0ZXJNb2RlOyB9
Ci0gICAgYm9vbCBpc0dlbmVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNl
dChTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLCBTb3VyY2VQYXJzZU1vZGU6Okdl
bmVyYXRvcldyYXBwZXJGdW5jdGlvbk1vZGUpLmNvbnRhaW5zKHBhcnNlTW9kZSgpKTsgfQotICAg
IGJvb2wgaXNNZXRob2QoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJz
ZU1vZGU6Ok1ldGhvZE1vZGU7IH0KLSAgICBib29sIGhhc0NhbGxlckFuZEFyZ3VtZW50c1Byb3Bl
cnRpZXMoKSBjb25zdAotICAgIHsKLSAgICAgICAgLy8gUGVyIGh0dHBzOi8vdGMzOS5naXRodWIu
aW8vZWNtYTI2Mi8jc2VjLWZvcmJpZGRlbi1leHRlbnNpb25zLCBvbmx5IHNsb3BweS1tb2RlIG5v
bi1idWlsdGluIGZ1bmN0aW9ucyBpbiBvbGQtc3R5bGUgKHByZS1FUzYpIHN5bnRhY3RpYyBmb3Jt
cyBjYW4gY29udGFpbgotICAgICAgICAvLyAiY2FsbGVyIiBhbmQgImFyZ3VtZW50cyIuCi0gICAg
ICAgIHJldHVybiAhaXNTdHJpY3RNb2RlKCkgJiYgcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VN
b2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUgJiYgIWlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7
Ci0gICAgfQotICAgIGJvb2wgaGFzUHJvdG90eXBlUHJvcGVydHkoKSBjb25zdAotICAgIHsKLSAg
ICAgICAgcmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNldCgKLSAgICAgICAgICAgIFNvdXJjZVBhcnNl
TW9kZTo6Tm9ybWFsRnVuY3Rpb25Nb2RlLAotICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpH
ZW5lcmF0b3JCb2R5TW9kZSwKLSAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9y
V3JhcHBlckZ1bmN0aW9uTW9kZQotICAgICAgICApLmNvbnRhaW5zKHBhcnNlTW9kZSgpKSB8fCBp
c0NsYXNzKCk7Ci0gICAgfQotICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5
cGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZGVyaXZlZENvbnRleHRU
eXBlKCk7IH0KLSAgICBib29sIGlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7
IH0KLSAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1
dGFibGUtPm5hbWUoKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXImIGVjbWFOYW1lKCkgeyByZXR1
cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmVjbWFOYW1lKCk7IH0KLSAgICBjb25zdCBJZGVudGlm
aWVyJiBpbmZlcnJlZE5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aW5mZXJy
ZWROYW1lKCk7IH0KLSAgICB1bnNpZ25lZCBwYXJhbWV0ZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJu
IG1fdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0ZXJDb3VudCgpOyB9IC8vIEV4Y2x1ZGluZyAn
dGhpcychCi0gICAgdW5zaWduZWQgZnVuY3Rpb25MZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3Vu
bGlua2VkRXhlY3V0YWJsZS0+ZnVuY3Rpb25MZW5ndGgoKTsgfQotICAgIFNvdXJjZVBhcnNlTW9k
ZSBwYXJzZU1vZGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+cGFyc2VN
b2RlKCk7IH0KLSAgICBKU1BhcnNlclNjcmlwdE1vZGUgc2NyaXB0TW9kZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5zY3JpcHRNb2RlKCk7IH0KLSAgICBjb25zdCBTb3Vy
Y2VDb2RlJiBjbGFzc1NvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5jbGFzc1NvdXJjZSgpOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2Vs
bCosIFNsb3RWaXNpdG9yJik7Ci0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJl
KFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBw
cm90bywgVHlwZUluZm8oRnVuY3Rpb25FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBp
bmZvKCkpOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCgpIGNv
bnN0IHsgcmV0dXJuIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OyB9Ci0KLSAgICB2b2lkIG92ZXJy
aWRlUGFyYW1ldGVyQW5kVHlwZVByb2ZpbGluZ1N0YXJ0RW5kT2Zmc2V0cyh1bnNpZ25lZCBwYXJh
bWV0ZXJzU3RhcnRPZmZzZXQsIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgdW5z
aWduZWQgdHlwZVByb2ZpbGluZ0VuZE9mZnNldCkKLSAgICB7Ci0gICAgICAgIG1fcGFyYW1ldGVy
c1N0YXJ0T2Zmc2V0ID0gcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OwotICAgICAgICBtX3R5cGVQcm9m
aWxpbmdTdGFydE9mZnNldCA9IHR5cGVQcm9maWxpbmdTdGFydE9mZnNldDsKLSAgICAgICAgbV90
eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKLSAgICB9Ci0K
LSAgICBERUNMQVJFX0lORk87Ci0KLSAgICBJbmZlcnJlZFZhbHVlKiBzaW5nbGV0b25GdW5jdGlv
bigpIHsgcmV0dXJuIG1fc2luZ2xldG9uRnVuY3Rpb24uZ2V0KCk7IH0KLQotcHJpdmF0ZToKLSAg
ICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKAot
ICAgICAgICBWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJs
ZSosIHVuc2lnbmVkIGZpcnN0TGluZSwgCi0gICAgICAgIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNp
Z25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMpOwotICAgIAot
ICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mKTsKLQotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRF
eGVjdXRhYmxlOwotICAgIAotICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0Owot
ICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZT4gbV91bmxpbmtlZEV4
ZWN1dGFibGU7Ci0gICAgV3JpdGVCYXJyaWVyPEZ1bmN0aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9j
a0ZvckNhbGw7Ci0gICAgV3JpdGVCYXJyaWVyPEZ1bmN0aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdDsKLSAgICBSZWZQdHI8VHlwZVNldD4gbV9yZXR1cm5TdGF0ZW1lbnRUeXBl
U2V0OwotICAgIFdyaXRlQmFycmllcjxJbmZlcnJlZFZhbHVlPiBtX3NpbmdsZXRvbkZ1bmN0aW9u
OwotfTsKLQotI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKLWNsYXNzIFdlYkFzc2VtYmx5RXhlY3V0
YWJsZSBmaW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRl
ZiBFeGVjdXRhYmxlQmFzZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1
cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKLQot
ICAgIHN0YXRpYyBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYgdm0sIGNvbnN0IFNv
dXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9u
SW5kZXgpCi0gICAgewotICAgICAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUg
PSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxXZWJBc3NlbWJseUV4ZWN1dGFibGU+KHZtLmhl
YXApKSBXZWJBc3NlbWJseUV4ZWN1dGFibGUodm0sIHNvdXJjZSwgbW9kdWxlLCBmdW5jdGlvbklu
ZGV4KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwotICAgICAgICBy
ZXR1cm4gZXhlY3V0YWJsZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVT
dHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHBy
b3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxP
YmplY3QsIHByb3RvLCBUeXBlSW5mbyhXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1
cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0Nl
bGwqKTsKLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIHZvaWQgcHJlcGFyZUZvckV4ZWN1dGlv
bihWTSYpOwotCi0gICAgV2ViQXNzZW1ibHlDb2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNhbGwoKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICB9Ci0K
LXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIFdlYkFzc2Vt
Ymx5RXhlY3V0YWJsZShWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBKU1dhc21Nb2R1bGUqLCB1bnNp
Z25lZCBmdW5jdGlvbkluZGV4KTsKLQotICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlND
ZWxsKiwgU2xvdFZpc2l0b3ImKTsKLQotICAgIFNvdXJjZUNvZGUgbV9zb3VyY2U7Ci0gICAgV3Jp
dGVCYXJyaWVyPEpTV2FzbU1vZHVsZT4gbV9tb2R1bGU7Ci0gICAgdW5zaWduZWQgbV9mdW5jdGlv
bkluZGV4OwotCi0gICAgV3JpdGVCYXJyaWVyPFdlYkFzc2VtYmx5Q29kZUJsb2NrPiBtX2NvZGVC
bG9ja0ZvckNhbGw7Ci19OwotI2VuZGlmCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxl
VHlwZT4KLUpTT2JqZWN0KiBTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uKFZN
JiB2bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6
YXRpb25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jaykKLXsKLSAgICBpZiAo
aGFzSklUQ29kZUZvcihraW5kKSkgewotICAgICAgICBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFi
bGVUeXBlLCBFdmFsRXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJs
b2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpLT5j
b2RlQmxvY2soKSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlw
ZSwgUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKLSAgICAgICAgICAgIHJlc3VsdENvZGVCbG9j
ayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+
Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5
cGUsIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1bHRD
b2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1l
PEV4ZWN1dGFibGVUeXBlLCBGdW5jdGlvbkV4ZWN1dGFibGU+Ojp2YWx1ZSkKLSAgICAgICAgICAg
IHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8RnVuY3Rpb25FeGVj
dXRhYmxlKj4odGhpcyktPmNvZGVCbG9ja0ZvcihraW5kKSk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBudWxs
cHRyOwotICAgIH0KLSAgICByZXR1cm4gcHJlcGFyZUZvckV4ZWN1dGlvbkltcGwodm0sIGZ1bmN0
aW9uLCBzY29wZSwga2luZCwgcmVzdWx0Q29kZUJsb2NrKTsKLX0KLQotfSAvLyBuYW1lc3BhY2Ug
SlNDCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9F
eGVjdXRhYmxlLmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwpEZWxldGVkOiBzdm46ZW9sLXN0eWxlCiMjIC0xICswLDAg
IyMKLW5hdGl2ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIHByb3BlcnR5CkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlQmFzZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZUJhc2UuY3BwCShyZXZpc2lv
biAyMDc3OTApCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUu
Y3BwOjIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGVC
YXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSwgMjAxMCwgMjAxMywgMjAxNS0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlLmgiCisKKyNpbmNsdWRlICJC
YXRjaGVkVHJhbnNpdGlvbk9wdGltaXplci5oIgorI2luY2x1ZGUgIkNvZGVCbG9jay5oIgorI2lu
Y2x1ZGUgIkRlYnVnZ2VyLmgiCisjaW5jbHVkZSAiSklULmgiCisjaW5jbHVkZSAiSlNDSW5saW5l
cy5oIgorI2luY2x1ZGUgIkpTV2FzbU1vZHVsZS5oIgorI2luY2x1ZGUgIkxMSW50RW50cnlwb2lu
dC5oIgorI2luY2x1ZGUgIlBhcnNlci5oIgorI2luY2x1ZGUgIlR5cGVQcm9maWxlci5oIgorI2lu
Y2x1ZGUgIlZNSW5saW5lcy5oIgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFt
ZXNwYWNlIEpTQyB7CisKK2NvbnN0IENsYXNzSW5mbyBFeGVjdXRhYmxlQmFzZTo6c19pbmZvID0g
eyAiRXhlY3V0YWJsZSIsIDAsIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRXhlY3V0YWJsZUJhc2Up
IH07CisKK3ZvaWQgRXhlY3V0YWJsZUJhc2U6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAg
IHN0YXRpY19jYXN0PEV4ZWN1dGFibGVCYXNlKj4oY2VsbCktPkV4ZWN1dGFibGVCYXNlOjp+RXhl
Y3V0YWJsZUJhc2UoKTsKK30KKwordm9pZCBFeGVjdXRhYmxlQmFzZTo6Y2xlYXJDb2RlKCkKK3sK
KyNpZiBFTkFCTEUoSklUKQorICAgIG1faml0Q29kZUZvckNhbGwgPSBudWxscHRyOworICAgIG1f
aml0Q29kZUZvckNvbnN0cnVjdCA9IG51bGxwdHI7CisgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhB
cml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7CisgICAgbV9qaXRDb2RlRm9yQ29u
c3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKKyNlbmRpZgor
ICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7
CisgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NP
TVBJTEVEOworCisgICAgaWYgKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5m
bygpKSB7CisgICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxG
dW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxv
Y2tGb3JDYWxsLmNsZWFyKCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29u
c3RydWN0LmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJs
ZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBl
eGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+
bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkg
eworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFt
RXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxv
Y2suY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxv
Y2suY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8o
KSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIE1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50
U3ltYm9sVGFibGUuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyNpZiBF
TkFCTEUoV0VCQVNTRU1CTFkpCisgICAgaWYgKGNsYXNzSW5mbygpID09IFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0
YWJsZSA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhl
Y3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisjZW5kaWYKKworICAgIEFTU0VSVChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxl
OjppbmZvKCkpOworfQorCitjb25zdCBDbGFzc0luZm8gTmF0aXZlRXhlY3V0YWJsZTo6c19pbmZv
ID0geyAiTmF0aXZlRXhlY3V0YWJsZSIsICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVB
VEVfTUVUSE9EX1RBQkxFKE5hdGl2ZUV4ZWN1dGFibGUpIH07CisKK05hdGl2ZUV4ZWN1dGFibGUq
IE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZShWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2Fs
bFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25z
dHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5z
aWMsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBOYXRpdmVFeGVjdXRhYmxlKiBleGVjdXRh
YmxlOworICAgIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxOYXRpdmVF
eGVjdXRhYmxlPih2bS5oZWFwKSkgTmF0aXZlRXhlY3V0YWJsZSh2bSwgZnVuY3Rpb24sIGNvbnN0
cnVjdG9yLCBpbnRyaW5zaWMpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtLCBj
YWxsVGh1bmssIGNvbnN0cnVjdFRodW5rLCBuYW1lKTsKKyAgICByZXR1cm4gZXhlY3V0YWJsZTsK
K30KKwordm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAg
ICBzdGF0aWNfY2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4oY2VsbCktPk5hdGl2ZUV4ZWN1dGFibGU6
On5OYXRpdmVFeGVjdXRhYmxlKCk7Cit9CisKK1N0cnVjdHVyZSogTmF0aXZlRXhlY3V0YWJsZTo6
Y3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNW
YWx1ZSBwcm90bykKK3sKKyAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9i
amVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7
Cit9CisKK3ZvaWQgTmF0aXZlRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBQYXNz
UmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RU
aHVuaywgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZt
KTsKKyAgICBtX2ppdENvZGVGb3JDYWxsID0gY2FsbFRodW5rOworICAgIG1faml0Q29kZUZvckNv
bnN0cnVjdCA9IGNvbnN0cnVjdFRodW5rOworICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlD
aGVjayA9IG1faml0Q29kZUZvckNhbGwtPmFkZHJlc3NGb3JDYWxsKE11c3RDaGVja0FyaXR5KTsK
KyAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNv
bnN0cnVjdC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOworICAgIG1fbmFtZSA9IG5h
bWU7Cit9CisKK05hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUoVk0mIHZtLCBOYXRp
dmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNp
YyBpbnRyaW5zaWMpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0ubmF0aXZlRXhlY3V0YWJs
ZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCwgaW50cmluc2ljKQorICAg
ICwgbV9mdW5jdGlvbihmdW5jdGlvbikKKyAgICAsIG1fY29uc3RydWN0b3IoY29uc3RydWN0b3Ip
Cit7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJT
Y3JpcHRFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRI
T0RfVEFCTEUoU2NyaXB0RXhlY3V0YWJsZSkgfTsKKworU2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0
RXhlY3V0YWJsZShTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgVk0mIHZtLCBjb25zdCBTb3VyY2VDb2Rl
JiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJp
dmVkQ29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4
dFR5cGUgZXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgIDogRXhlY3V0
YWJsZUJhc2Uodm0sIHN0cnVjdHVyZSwgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVELCBpbnRy
aW5zaWMpCisgICAgLCBtX2ZlYXR1cmVzKGlzSW5TdHJpY3RDb250ZXh0ID8gU3RyaWN0TW9kZUZl
YXR1cmUgOiAwKQorICAgICwgbV9kaWRUcnlUb0VudGVySW5Mb29wKGZhbHNlKQorICAgICwgbV9o
YXNDYXB0dXJlZFZhcmlhYmxlcyhmYWxzZSkKKyAgICAsIG1fbmV2ZXJJbmxpbmUoZmFsc2UpCisg
ICAgLCBtX25ldmVyT3B0aW1pemUoZmFsc2UpCisgICAgLCBtX25ldmVyRlRMT3B0aW1pemUoZmFs
c2UpCisgICAgLCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQoaXNJbkFycm93RnVuY3Rpb25Db250
ZXh0KQorICAgICwgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyh0cnVlKQorICAgICwgbV9kZXJpdmVk
Q29udGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRlcml2ZWRDb250ZXh0VHlwZSkpCisg
ICAgLCBtX2V2YWxDb250ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZXZhbENvbnRleHRU
eXBlKSkKKyAgICAsIG1fb3ZlcnJpZGVMaW5lTnVtYmVyKC0xKQorICAgICwgbV9maXJzdExpbmUo
LTEpCisgICAgLCBtX2xhc3RMaW5lKC0xKQorICAgICwgbV9zdGFydENvbHVtbihVSU5UX01BWCkK
KyAgICAsIG1fZW5kQ29sdW1uKFVJTlRfTUFYKQorICAgICwgbV90eXBlUHJvZmlsaW5nU3RhcnRP
ZmZzZXQoVUlOVF9NQVgpCisgICAgLCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQoVUlOVF9NQVgp
CisgICAgLCBtX3NvdXJjZShzb3VyY2UpCit7Cit9CisKK3ZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6
ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8U2NyaXB0RXhlY3V0YWJs
ZSo+KGNlbGwpLT5TY3JpcHRFeGVjdXRhYmxlOjp+U2NyaXB0RXhlY3V0YWJsZSgpOworfQorCit2
b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKENvZGVCbG9jayogY29kZUJsb2NrKQor
eworICAgIGluc3RhbGxDb2RlKCpjb2RlQmxvY2stPnZtKCksIGNvZGVCbG9jaywgY29kZUJsb2Nr
LT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsKK30KKwordm9p
ZCBTY3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZShWTSYgdm0sIENvZGVCbG9jayogZ2VuZXJp
Y0NvZGVCbG9jaywgQ29kZVR5cGUgY29kZVR5cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2lu
ZCkKK3sKKyAgICBBU1NFUlQodm0uaGVhcC5pc0RlZmVycmVkKCkpOworICAgIAorICAgIGlmIChn
ZW5lcmljQ29kZUJsb2NrKQorICAgICAgICBDT0RFQkxPQ0tfTE9HX0VWRU5UKGdlbmVyaWNDb2Rl
QmxvY2ssICJpbnN0YWxsQ29kZSIsICgpKTsKKyAgICAKKyAgICBDb2RlQmxvY2sqIG9sZENvZGVC
bG9jayA9IG51bGxwdHI7CisgICAgCisgICAgc3dpdGNoIChjb2RlVHlwZSkgeworICAgIGNhc2Ug
R2xvYmFsQ29kZTogeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBQcm9ncmFtQ29kZUJsb2Nr
KiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVC
bG9jayk7CisgICAgICAgIAorICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Cisg
ICAgICAgIAorICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2Rl
QmxvY2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5zZXRN
YXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7CisgICAgICAgIGJyZWFrOworICAgIH0KKwor
ICAgIGNhc2UgTW9kdWxlQ29kZTogeworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAg
ICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisKKyAgICAgICAgQVNTRVJU
KGtpbmQgPT0gQ29kZUZvckNhbGwpOworCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFi
bGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+
bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2Nr
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBFdmFsQ29kZTogeworICAgICAg
ICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRo
aXMpOworICAgICAgICBFdmFsQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxFdmFs
Q29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisgICAgICAgIAorICAgICAgICBBU1NFUlQo
a2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIAorICAgICAgICBvbGRDb2RlQmxvY2sgPSBl
eGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1f
ZXZhbENvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7CisgICAgICAg
IGJyZWFrOworICAgIH0KKyAgICAgICAgCisgICAgY2FzZSBGdW5jdGlvbkNvZGU6IHsKKyAgICAg
ICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0
YWJsZSo+KHRoaXMpOworICAgICAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrID0gc3Rh
dGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAg
CisgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgorICAg
ICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmdl
dCgpOworICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLnNldE1heUJl
TnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRh
YmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICAgICAgICAgIGV4ZWN1dGFi
bGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJs
b2NrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAg
IH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIENvZGVGb3JDYWxsOgor
ICAgICAgICBtX2ppdENvZGVGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2Rl
QmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7CisgICAgICAgIG1faml0Q29kZUZvckNhbGxXaXRo
QXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOworICAgICAgICBtX251bVBhcmFt
ZXRlcnNGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51bVBh
cmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1
Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVs
bHB0cjsKKyAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNy
b0Fzc2VtYmxlckNvZGVQdHIoKTsKKyAgICAgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0
ID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6
IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisg
ICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZ2VuZXJp
Y0NvZGVCbG9jay0+b3duZXJFeGVjdXRhYmxlKCkgPT0gdGhpcyk7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKEpJVENvZGU6OmlzRXhlY3V0YWJsZVNjcmlwdChnZW5lcmljQ29kZUJsb2NrLT5qaXRU
eXBlKCkpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChPcHRpb25zOjp2ZXJib3NlT1NSKCkpCisg
ICAgICAgICAgICBkYXRhTG9nKCJJbnN0YWxsaW5nICIsICpnZW5lcmljQ29kZUJsb2NrLCAiXG4i
KTsKKyAgICAgICAgCisgICAgICAgIGlmICh2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpCisgICAg
ICAgICAgICB2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXItPmVuc3VyZUJ5dGVjb2Rlc0ZvcihnZW5l
cmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIGlmIChEZWJ1Z2dlciogZGVidWdnZXIg
PSBnZW5lcmljQ29kZUJsb2NrLT5nbG9iYWxPYmplY3QoKS0+ZGVidWdnZXIoKSkKKyAgICAgICAg
ICAgIGRlYnVnZ2VyLT5yZWdpc3RlckNvZGVCbG9jayhnZW5lcmljQ29kZUJsb2NrKTsKKyAgICB9
CisKKyAgICBpZiAob2xkQ29kZUJsb2NrKQorICAgICAgICBvbGRDb2RlQmxvY2stPnVubGlua0lu
Y29taW5nQ2FsbHMoKTsKKworICAgIHZtLmhlYXAud3JpdGVCYXJyaWVyKHRoaXMpOworfQorCitD
b2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld0NvZGVCbG9ja0ZvcigKKyAgICBDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kIGtpbmQsIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29w
ZSwgSlNPYmplY3QqJiBleGNlcHRpb24pCit7CisgICAgVk0qIHZtID0gc2NvcGUtPnZtKCk7Cisg
ICAgYXV0byB0aHJvd1Njb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSgqdm0pOworCisgICAgQVNT
RVJUKHZtLT5oZWFwLmlzRGVmZXJyZWQoKSk7CisgICAgQVNTRVJUKHN0YXJ0Q29sdW1uKCkgIT0g
VUlOVF9NQVgpOworICAgIEFTU0VSVChlbmRDb2x1bW4oKSAhPSBVSU5UX01BWCk7CisKKyAgICBp
ZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFs
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOwor
ICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jayk7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAgIHJldHVybiBFdmFsQ29kZUJsb2NrOjpjcmVh
dGUodm0sCisgICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZh
bENvZGVCbG9jay5nZXQoKSwgc2NvcGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2Uo
KS5wcm92aWRlcigpKTsKKyAgICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dy
YW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFl
eGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2spOworICAgICAgICBSRUxFQVNFX0FTU0VSVCgh
ZnVuY3Rpb24pOworICAgICAgICByZXR1cm4gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtLAor
ICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2Rl
QmxvY2suZ2V0KCksIHNjb3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJv
dmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKSk7CisgICAgfQorCisg
ICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsK
KyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5t
X21vZHVsZVByb2dyYW1Db2RlQmxvY2spOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rp
b24pOworICAgICAgICByZXR1cm4gTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtLAor
ICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dy
YW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNl
KCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKSk7CisgICAg
fQorCisgICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxl
OjppbmZvKCkpOworICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uKTsKKyAgICBGdW5jdGlvbkV4
ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7
CisgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPmNvZGVCbG9ja0ZvcihraW5kKSk7Cisg
ICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsK
KyAgICBQYXJzZXJFcnJvciBlcnJvcjsKKyAgICBEZWJ1Z2dlck1vZGUgZGVidWdnZXJNb2RlID0g
Z2xvYmFsT2JqZWN0LT5oYXNJbnRlcmFjdGl2ZURlYnVnZ2VyKCkgPyBEZWJ1Z2dlck9uIDogRGVi
dWdnZXJPZmY7CisgICAgVW5saW5rZWRGdW5jdGlvbkNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxv
Y2sgPSAKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPnVubGlua2Vk
Q29kZUJsb2NrRm9yKAorICAgICAgICAgICAgKnZtLCBleGVjdXRhYmxlLT5tX3NvdXJjZSwga2lu
ZCwgZGVidWdnZXJNb2RlLCBlcnJvciwgCisgICAgICAgICAgICBleGVjdXRhYmxlLT5wYXJzZU1v
ZGUoKSk7CisgICAgcmVjb3JkUGFyc2UoCisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRF
eGVjdXRhYmxlLT5mZWF0dXJlcygpLCAKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4
ZWN1dGFibGUtPmhhc0NhcHR1cmVkVmFyaWFibGVzKCksIGZpcnN0TGluZSgpLCAKKyAgICAgICAg
bGFzdExpbmUoKSwgc3RhcnRDb2x1bW4oKSwgZW5kQ29sdW1uKCkpOyAKKyAgICBpZiAoIXVubGlu
a2VkQ29kZUJsb2NrKSB7CisgICAgICAgIGV4Y2VwdGlvbiA9IHRocm93RXhjZXB0aW9uKAorICAg
ICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCksIHRocm93U2NvcGUsCisgICAgICAg
ICAgICBlcnJvci50b0Vycm9yT2JqZWN0KGdsb2JhbE9iamVjdCwgZXhlY3V0YWJsZS0+bV9zb3Vy
Y2UpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgU291cmNlUHJvdmlk
ZXIqIHByb3ZpZGVyID0gZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKTsKKyAgICB1bnNp
Z25lZCBzb3VyY2VPZmZzZXQgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydE9mZnNldCgpOwor
ICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uID0gZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1
bW4oKTsKKworICAgIHJldHVybiBGdW5jdGlvbkNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAg
ICBleGVjdXRhYmxlLCB1bmxpbmtlZENvZGVCbG9jaywgc2NvcGUsIHByb3ZpZGVyLCBzb3VyY2VP
ZmZzZXQsIHN0YXJ0Q29sdW1uKTsKK30KKworQ29kZUJsb2NrKiBTY3JpcHRFeGVjdXRhYmxlOjpu
ZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcigKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQpCit7CisgICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsK
KyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIEV2
YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7
CisgICAgICAgIEV2YWxDb2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVC
bG9jayo+KAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLT5iYXNlbGlu
ZVZlcnNpb24oKSk7CisgICAgICAgIEV2YWxDb2RlQmxvY2sqIHJlc3VsdCA9IEV2YWxDb2RlQmxv
Y2s6OmNyZWF0ZSh2bSgpLAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ss
ICpiYXNlbGluZSk7CisgICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2Vs
aW5lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgaWYgKGNsYXNz
SW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBl
eGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFBy
b2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+
KAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLT5iYXNlbGluZVZl
cnNpb24oKSk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIHJlc3VsdCA9IFByb2dyYW1Db2Rl
QmxvY2s6OmNyZWF0ZSh2bSgpLAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxv
Y2ssICpiYXNlbGluZSk7CisgICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJh
c2VsaW5lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxF
QVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0
aGlzKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNf
Y2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oCisgICAgICAgICAgICBleGVjdXRhYmxlLT5t
X21vZHVsZVByb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAgICAgTW9k
dWxlUHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3Jl
YXRlKHZtKCksCisgICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2Vs
aW5lKTsKKyAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUKGNsYXNz
SW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKKyAgICBGdW5jdGlvbkV4ZWN1
dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7Cisg
ICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2Rl
QmxvY2sqPigKKyAgICAgICAgZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpLT5iYXNlbGlu
ZVZlcnNpb24oKSk7CisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIHJlc3VsdCA9IEZ1bmN0aW9uQ29k
ZUJsb2NrOjpjcmVhdGUodm0oKSwKKyAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ss
ICpiYXNlbGluZSk7CisgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwTExJbnQoVk0mIHZt
LCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sKKyAgICBMTEludDo6c2V0RW50cnlwb2ludCh2bSwg
Y29kZUJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBKSVQoVk0mIHZtLCBDb2RlQmxvY2sq
IGNvZGVCbG9jaykKK3sKKyNpZiBFTkFCTEUoSklUKQorICAgIENvbXBpbGF0aW9uUmVzdWx0IHJl
c3VsdCA9IEpJVDo6Y29tcGlsZSgmdm0sIGNvZGVCbG9jaywgSklUQ29tcGlsYXRpb25NdXN0U3Vj
Y2VlZCk7CisgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0ID09IENvbXBpbGF0aW9uU3VjY2Vzc2Z1
bCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTSh2bSk7CisgICAgVU5VU0VEX1BBUkFNKGNvZGVC
bG9jayk7CisgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7CisjZW5kaWYKK30KKworSlNP
YmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb25JbXBsKAorICAgIFZN
JiB2bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6
YXRpb25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jaykKK3sKKyAgICBEZWZl
ckdDRm9yQVdoaWxlIGRlZmVyR0Modm0uaGVhcCk7CisKKyAgICBpZiAodm0uZ2V0QW5kQ2xlYXJG
YWlsTmV4dE5ld0NvZGVCbG9jaygpKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3Ioc2NvcGUt
Pmdsb2JhbE9iamVjdCgpLT5nbG9iYWxFeGVjKCksIEFTQ0lJTGl0ZXJhbCgiRm9yY2VkIEZhaWx1
cmUiKSk7CisKKyAgICBKU09iamVjdCogZXhjZXB0aW9uID0gMDsKKyAgICBDb2RlQmxvY2sqIGNv
ZGVCbG9jayA9IG5ld0NvZGVCbG9ja0ZvcihraW5kLCBmdW5jdGlvbiwgc2NvcGUsIGV4Y2VwdGlv
bik7CisgICAgcmVzdWx0Q29kZUJsb2NrID0gY29kZUJsb2NrOworICAgIGlmICghY29kZUJsb2Nr
KSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGV4Y2VwdGlvbik7CisgICAgICAgIHJldHVybiBl
eGNlcHRpb247CisgICAgfQorICAgIAorICAgIGlmIChPcHRpb25zOjp2YWxpZGF0ZUJ5dGVjb2Rl
KCkpCisgICAgICAgIGNvZGVCbG9jay0+dmFsaWRhdGUoKTsKKyAgICAKKyAgICBpZiAoT3B0aW9u
czo6dXNlTExJbnQoKSkKKyAgICAgICAgc2V0dXBMTEludCh2bSwgY29kZUJsb2NrKTsKKyAgICBl
bHNlCisgICAgICAgIHNldHVwSklUKHZtLCBjb2RlQmxvY2spOworICAgIAorICAgIGluc3RhbGxD
b2RlKHZtLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwgY29kZUJsb2NrLT5zcGVj
aWFsaXphdGlvbktpbmQoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IENsYXNz
SW5mbyBFdmFsRXhlY3V0YWJsZTo6c19pbmZvID0geyAiRXZhbEV4ZWN1dGFibGUiLCAmU2NyaXB0
RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEV2YWxFeGVjdXRhYmxl
KSB9OworCitFdmFsRXhlY3V0YWJsZSogRXZhbEV4ZWN1dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUq
IGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwg
RGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rp
b25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBjb25zdCBWYXJpYWJs
ZUVudmlyb25tZW50KiB2YXJpYWJsZXNVbmRlclREWikKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52
bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKworICAgIEpT
R2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7
CisgICAgaWYgKCFnbG9iYWxPYmplY3QtPmV2YWxFbmFibGVkKCkpIHsKKyAgICAgICAgdGhyb3dF
eGNlcHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZUV2YWxFcnJvcihleGVjLCBnbG9iYWxPYmplY3Qt
PmV2YWxEaXNhYmxlZEVycm9yTWVzc2FnZSgpKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KworICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0
ZUNlbGw8RXZhbEV4ZWN1dGFibGU+KCpleGVjLT5oZWFwKCkpKSBFdmFsRXhlY3V0YWJsZShleGVj
LCBzb3VyY2UsIGlzSW5TdHJpY3RDb250ZXh0LCBkZXJpdmVkQ29udGV4dFR5cGUsIGlzQXJyb3dG
dW5jdGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNo
Q3JlYXRpb24odm0pOworCisgICAgVW5saW5rZWRFdmFsQ29kZUJsb2NrKiB1bmxpbmtlZEV2YWxD
b2RlID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVFdmFsQ29kZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUs
IHZhcmlhYmxlc1VuZGVyVERaKTsKKyAgICBpZiAoIXVubGlua2VkRXZhbENvZGUpCisgICAgICAg
IHJldHVybiAwOworCisgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suc2V0
KHZtLCBleGVjdXRhYmxlLCB1bmxpbmtlZEV2YWxDb2RlKTsKKworICAgIHJldHVybiBleGVjdXRh
YmxlOworfQorCitFdmFsRXhlY3V0YWJsZTo6RXZhbEV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaW5TdHJpY3RDb250ZXh0LCBEZXJpdmVk
Q29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRl
eHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUpCisgICAgOiBTY3JpcHRFeGVjdXRh
YmxlKGV4ZWMtPnZtKCkuZXZhbEV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCks
IHNvdXJjZSwgaW5TdHJpY3RDb250ZXh0LCBkZXJpdmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5j
dGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSwgTm9JbnRyaW5zaWMpCit7CisgICAgQVNTRVJU
KHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VU
eXBlOjpQcm9ncmFtKTsKK30KKwordm9pZCBFdmFsRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwq
IGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihjZWxsKS0+RXZhbEV4
ZWN1dGFibGU6On5FdmFsRXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gUHJvZ3Jh
bUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlByb2dyYW1FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1
dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShQcm9ncmFtRXhlY3V0YWJsZSkg
fTsKKworUHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhl
YywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVj
LT52bSgpLnByb2dyYW1FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3Vy
Y2UsIGZhbHNlLCBEZXJpdmVkQ29udGV4dFR5cGU6Ok5vbmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5
cGU6Ok5vbmUsIE5vSW50cmluc2ljKQoreworICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+
c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6UHJvZ3JhbSk7CisgICAg
bV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAwOworICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9m
ZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7CisgICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2Zp
bGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpCisgICAgICAgIGV4ZWMt
PnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShz
b3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5k
T2Zmc2V0KTsKK30KKwordm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNl
bGwpCit7CisgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKS0+UHJvZ3Jh
bUV4ZWN1dGFibGU6On5Qcm9ncmFtRXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8g
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSkgfTsKKworTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6Ok1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYg
c291cmNlKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLm1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJp
dmVkQ29udGV4dFR5cGU6Ok5vbmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIE5vSW50
cmluc2ljKQoreworICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09
IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6TW9kdWxlKTsKKyAgICBtX3R5cGVQcm9maWxpbmdT
dGFydE9mZnNldCA9IDA7CisgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gc291cmNlLmxl
bmd0aCgpIC0gMTsKKyAgICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52
bSgpLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkKKyAgICAgICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhh
c0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlw
ZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQpOworfQorCitN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmNyZWF0ZShF
eGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKK3sKKyAgICBKU0dsb2Jh
bE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOworICAg
IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxv
Y2F0ZUNlbGw8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+KCpleGVjLT5oZWFwKCkpKSBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZShleGVjLCBzb3VyY2UpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENy
ZWF0aW9uKGV4ZWMtPnZtKCkpOworCisgICAgVW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
KiB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVNb2R1bGVQ
cm9ncmFtQ29kZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUpOworICAgIGlmICghdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgZXhlY3V0YWJsZS0+
bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFi
bGUsIHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUpOworCisgICAgZXhlY3V0YWJsZS0+bV9tb2R1
bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCBqc0Nh
c3Q8U3ltYm9sVGFibGUqPih1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlLT5jb25zdGFudFJlZ2lz
dGVyKHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUtPm1vZHVsZUVudmlyb25tZW50U3ltYm9sVGFi
bGVDb25zdGFudFJlZ2lzdGVyT2Zmc2V0KCkpLmdldCgpKS0+Y2xvbmVTY29wZVBhcnQoZXhlYy0+
dm0oKSkpOworCisgICAgcmV0dXJuIGV4ZWN1dGFibGU7Cit9CisKK3ZvaWQgTW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp+
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoKTsKK30KKworY29uc3QgQ2xhc3NJbmZvIEZ1bmN0aW9u
RXhlY3V0YWJsZTo6c19pbmZvID0geyAiRnVuY3Rpb25FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1
dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShGdW5jdGlvbkV4ZWN1dGFibGUp
IH07CisKK0Z1bmN0aW9uRXhlY3V0YWJsZTo6RnVuY3Rpb25FeGVjdXRhYmxlKFZNJiB2bSwgY29u
c3QgU291cmNlQ29kZSYgc291cmNlLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5r
ZWRFeGVjdXRhYmxlLCB1bnNpZ25lZCBmaXJzdExpbmUsIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNp
Z25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMgaW50cmluc2lj
KQorICAgIDogU2NyaXB0RXhlY3V0YWJsZSh2bS5mdW5jdGlvbkV4ZWN1dGFibGVTdHJ1Y3R1cmUu
Z2V0KCksIHZtLCBzb3VyY2UsIHVubGlua2VkRXhlY3V0YWJsZS0+aXNJblN0cmljdENvbnRleHQo
KSwgdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKSwgZmFsc2UsIEV2YWxD
b250ZXh0VHlwZTo6Tm9uZSwgaW50cmluc2ljKQorICAgICwgbV91bmxpbmtlZEV4ZWN1dGFibGUo
dm0sIHRoaXMsIHVubGlua2VkRXhlY3V0YWJsZSkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVCghc291
cmNlLmlzTnVsbCgpKTsKKyAgICBBU1NFUlQoc291cmNlLmxlbmd0aCgpKTsKKyAgICBtX2ZpcnN0
TGluZSA9IGZpcnN0TGluZTsKKyAgICBtX2xhc3RMaW5lID0gbGFzdExpbmU7CisgICAgQVNTRVJU
KHN0YXJ0Q29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICBBU1NFUlQoZW5kQ29sdW1uICE9IFVJTlRf
TUFYKTsKKyAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47CisgICAgbV9lbmRDb2x1bW4g
PSBlbmRDb2x1bW47CisgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1
dGFibGUtPnBhcmFtZXRlcnNTdGFydE9mZnNldCgpOworICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0
T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKTsK
KyAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQ
cm9maWxpbmdFbmRPZmZzZXQoKTsKK30KKwordm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmZpbmlz
aENyZWF0aW9uKFZNJiB2bSkKK3sKKyAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7CisgICAg
bV9zaW5nbGV0b25GdW5jdGlvbi5zZXQodm0sIHRoaXMsIEluZmVycmVkVmFsdWU6OmNyZWF0ZSh2
bSkpOworfQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwp
Cit7CisgICAgc3RhdGljX2Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oY2VsbCktPkZ1bmN0aW9u
RXhlY3V0YWJsZTo6fkZ1bmN0aW9uRXhlY3V0YWJsZSgpOworfQorCitpbmxpbmUgY29uc3QgY2hh
ciogc2FtcGxpbmdEZXNjcmlwdGlvbihKSVRDb2RlOjpKSVRUeXBlIGppdFR5cGUpCit7CisgICAg
c3dpdGNoIChqaXRUeXBlKSB7CisgICAgY2FzZSBKSVRDb2RlOjpJbnRlcnByZXRlclRodW5rOgor
ICAgICAgICByZXR1cm4gIkludGVycHJldGVyIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGNh
c2UgSklUQ29kZTo6QmFzZWxpbmVKSVQ6CisgICAgICAgIHJldHVybiAiQmFzZWxpbmUgQ29tcGls
YXRpb24gKFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpERkdKSVQ6CisgICAgICAgIHJldHVy
biAiREZHIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGNhc2UgSklUQ29kZTo6RlRMSklUOgor
ICAgICAgICByZXR1cm4gIkZUTCBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAgICBkZWZhdWx0Ogor
ICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsK
KyAgICB9Cit9CisKK3ZvaWQgRXZhbEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBj
ZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBFdmFsRXhlY3V0YWJsZSogdGhpc09i
amVjdCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpF
Q1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2
aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0
aGlzT2JqZWN0LT5tX3VubGlua2VkRXZhbENvZGVCbG9jayk7CisgICAgaWYgKHRoaXNPYmplY3Qt
Pm1fZXZhbENvZGVCbG9jaykKKyAgICAgICAgdGhpc09iamVjdC0+bV9ldmFsQ29kZUJsb2NrLT52
aXNpdFdlYWtseSh2aXNpdG9yKTsKK30KKworSlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxlOjpj
aGVja1N5bnRheChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgUGFyc2VyRXJyb3IgZXJyb3I7Cisg
ICAgVk0qIHZtID0gJmV4ZWMtPnZtKCk7CisgICAgSlNHbG9iYWxPYmplY3QqIGxleGljYWxHbG9i
YWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgc3RkOjp1bmlxdWVf
cHRyPFByb2dyYW1Ob2RlPiBwcm9ncmFtTm9kZSA9IHBhcnNlPFByb2dyYW1Ob2RlPigKKyAgICAg
ICAgdm0sIG1fc291cmNlLCBJZGVudGlmaWVyKCksIEpTUGFyc2VyQnVpbHRpbk1vZGU6Ok5vdEJ1
aWx0aW4sCisgICAgICAgIEpTUGFyc2VyU3RyaWN0TW9kZTo6Tm90U3RyaWN0LCBKU1BhcnNlclNj
cmlwdE1vZGU6OkNsYXNzaWMsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIFN1cGVyQmlu
ZGluZzo6Tm90TmVlZGVkLCBlcnJvcik7CisgICAgaWYgKHByb2dyYW1Ob2RlKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICBBU1NFUlQoZXJyb3IuaXNWYWxpZCgpKTsKKyAgICByZXR1cm4gZXJyb3Iu
dG9FcnJvck9iamVjdChsZXhpY2FsR2xvYmFsT2JqZWN0LCBtX3NvdXJjZSk7Cit9CisKK0pTT2Jq
ZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6aW5pdGlhbGl6ZUdsb2JhbFByb3BlcnRpZXMoVk0mIHZt
LCBDYWxsRnJhbWUqIGNhbGxGcmFtZSwgSlNTY29wZSogc2NvcGUpCit7CisgICAgUkVMRUFTRV9B
U1NFUlQoc2NvcGUpOworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+
Z2xvYmFsT2JqZWN0KCk7CisgICAgUkVMRUFTRV9BU1NFUlQoZ2xvYmFsT2JqZWN0KTsKKyAgICBB
U1NFUlQoJmdsb2JhbE9iamVjdC0+dm0oKSA9PSAmdm0pOworCisgICAgSlNPYmplY3QqIGV4Y2Vw
dGlvbiA9IDA7CisgICAgVW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9j
ayA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlUHJvZ3JhbUNvZGVCbG9jayhjYWxsRnJhbWUsIHRoaXMs
ICZleGNlcHRpb24pOworICAgIGlmIChleGNlcHRpb24pCisgICAgICAgIHJldHVybiBleGNlcHRp
b247CisKKyAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmly
b25tZW50ID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQoKTsKKyAgICBj
b25zdCBWYXJpYWJsZUVudmlyb25tZW50JiB2YXJpYWJsZURlY2xhcmF0aW9ucyA9IHVubGlua2Vk
Q29kZUJsb2NrLT52YXJpYWJsZURlY2xhcmF0aW9ucygpOworICAgIGNvbnN0IFZhcmlhYmxlRW52
aXJvbm1lbnQmIGxleGljYWxEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+bGV4aWNh
bERlY2xhcmF0aW9ucygpOworICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQgbm8gdmFycy9n
bG9iYWwgcHJvcGVydGllcy9sZXQvY29uc3QgY2FuIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIGdsb2Jh
bCBzY29wZS4KKyAgICAvLyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gMTUuMS44IG9mIHRoZSBF
UzYgc3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9p
bmRleC5odG1sI3NlYy1nbG9iYWxkZWNsYXJhdGlvbmluc3RhbnRpYXRpb24KKyAgICB7CisgICAg
ICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpOworICAgICAg
ICAvLyBDaGVjayBmb3IgaW50ZXJzZWN0aW9uIG9mICJ2YXIiIGFuZCAibGV0Ii8iY29uc3QiLyJj
bGFzcyIKKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsK
KyAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9ucy5jb250YWlucyhlbnRyeS5rZXkp
KQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3Ry
aW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5Lmtl
eS5nZXQoKSksICInIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5l
dyAibGV0Ii8iY29uc3QiLyJjbGFzcyIgd2lsbCBzaGFkb3cgYW55IHByZS1leGlzdGluZyBnbG9i
YWwgcHJvcGVydHkgbmFtZXMsIG9yICJ2YXIiLyJsZXQiLyJjb25zdCIgdmFyaWFibGVzLgorICAg
ICAgICAvLyBJdCdzIGFuIGVycm9yIHRvIGludHJvZHVjZSBhIHNoYWRvdy4KKyAgICAgICAgZm9y
IChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChn
bG9iYWxPYmplY3QtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKKyAgICAg
ICAgICAgICAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0aGF0IGp1c3QgUmVzdHJpY3RlZEdsb2Jh
bFByb3BlcnR5IGNhbid0IGJlIHNoYWRvd2VkCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXJy
aWVkIG91dCBzZWN0aW9uIDguMS4xLjQuMTQgb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVj
bWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWhhc3Jlc3Ry
aWN0ZWRnbG9iYWxwcm9wZXJ0eQorICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBk
ZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIGdsb2JhbE9iamVjdC0+Z2V0T3duUHJvcGVydHlE
ZXNjcmlwdG9yKGV4ZWMsIGVudHJ5LmtleS5nZXQoKSwgZGVzY3JpcHRvcik7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IudmFsdWUoKSAhPSBqc1VuZGVm
aW5lZCgpICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRl
IGR1cGxpY2F0ZSB2YXJpYWJsZSB0aGF0IHNoYWRvd3MgYSBnbG9iYWwgcHJvcGVydHk6ICciLCBT
dHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5oYXNQcm9w
ZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKFVOTElL
RUxZKGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29uc3RSZWRlY2xhcmF0aW9u
U2hvdWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIFdlIG9ubHkgYWxsb3cgImNvbnN0IiBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIHVuZGVyIHRo
aXMgc2V0dGluZy4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHdlIGRvbid0
ICJsZXQiIHZhcmlhYmxlcyB0byBiZSBvdmVycmlkZGVuIGJ5ICJjb25zdCIgdmFyaWFibGVzLgor
ICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0NvbnN0
VmFyaWFibGUoZW50cnkua2V5LmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3lu
dGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJs
ZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIGFueSBuZXcgInZhciJzIHdpbGwgc2hhZG93
IGFueSBwcmV2aW91cyAibGV0Ii8iY29uc3QiLyJjbGFzcyIgbmFtZXMuCisgICAgICAgIC8vIEl0
J3MgYW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93LgorICAgICAgICBpZiAoIWdsb2JhbExl
eGljYWxFbnZpcm9ubWVudC0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGVu
dHJ5IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFs
TGV4aWNhbEVudmlyb25tZW50LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKQor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0
cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5r
ZXkuZ2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisg
ICAgbV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suc2V0KHZtLCB0aGlzLCB1bmxpbmtlZENvZGVC
bG9jayk7CisKKyAgICBCYXRjaGVkVHJhbnNpdGlvbk9wdGltaXplciBvcHRpbWl6ZXIodm0sIGds
b2JhbE9iamVjdCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgbnVtYmVyT2ZGdW5jdGlvbnMg
PSB1bmxpbmtlZENvZGVCbG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IGkgPCBudW1iZXJP
ZkZ1bmN0aW9uczsgKytpKSB7CisgICAgICAgIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSA9IHVubGlua2VkQ29kZUJsb2NrLT5mdW5jdGlvbkRl
Y2woaSk7CisgICAgICAgIEFTU0VSVCghdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPm5hbWUo
KS5pc0VtcHR5KCkpOworICAgICAgICBnbG9iYWxPYmplY3QtPmFkZEZ1bmN0aW9uKGNhbGxGcmFt
ZSwgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPm5hbWUoKSk7CisgICAgICAgIGlmICh2bS50
eXBlUHJvZmlsZXIoKSB8fCB2bS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpIHsKKyAgICAgICAgICAg
IHZtLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291
cmNlSUQoKSwgCisgICAgICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPnR5
cGVQcm9maWxpbmdTdGFydE9mZnNldCgpLCAKKyAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0
aW9uRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIGZvciAoYXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgeworICAg
ICAgICBBU1NFUlQoZW50cnkudmFsdWUuaXNWYXIoKSk7CisgICAgICAgIGdsb2JhbE9iamVjdC0+
YWRkVmFyKGNhbGxGcmFtZSwgSWRlbnRpZmllcjo6ZnJvbVVpZCgmdm0sIGVudHJ5LmtleS5nZXQo
KSkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQq
IGdsb2JhbExleGljYWxFbnZpcm9ubWVudCA9IGpzQ2FzdDxKU0dsb2JhbExleGljYWxFbnZpcm9u
bWVudCo+KGdsb2JhbE9iamVjdC0+Z2xvYmFsU2NvcGUoKSk7CisgICAgICAgIFN5bWJvbFRhYmxl
KiBzeW1ib2xUYWJsZSA9IGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+c3ltYm9sVGFibGUoKTsK
KyAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7
CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7CisgICAg
ICAgICAgICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxD
b25zdFJlZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoc3ltYm9sVGFibGUtPmNvbnRhaW5zKGxvY2tlciwgZW50cnkua2V5
LmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBTY29wZU9mZnNldCBvZmZzZXQgPSBzeW1ib2xUYWJsZS0+dGFrZU5leHRTY29w
ZU9mZnNldChsb2NrZXIpOworICAgICAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBuZXdFbnRyeShW
YXJPZmZzZXQob2Zmc2V0KSwgZW50cnkudmFsdWUuaXNDb25zdCgpID8gUmVhZE9ubHkgOiAwKTsK
KyAgICAgICAgICAgIG5ld0VudHJ5LnByZXBhcmVUb1dhdGNoKCk7CisgICAgICAgICAgICBzeW1i
b2xUYWJsZS0+YWRkKGxvY2tlciwgZW50cnkua2V5LmdldCgpLCBuZXdFbnRyeSk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldEZvckFzc2VydCA9IGdsb2JhbExl
eGljYWxFbnZpcm9ubWVudC0+YWRkVmFyaWFibGVzKDEsIGpzVERaVmFsdWUoKSk7CisgICAgICAg
ICAgICBSRUxFQVNFX0FTU0VSVChvZmZzZXRGb3JBc3NlcnQgPT0gb2Zmc2V0KTsKKyAgICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6dmlz
aXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIFBy
b2dyYW1FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4o
Y2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkp
OworICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRv
cik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRQcm9ncmFtQ29k
ZUJsb2NrKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9wcm9ncmFtQ29kZUJsb2NrKQorICAgICAg
ICB0aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwor
fQorCit2b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCog
Y2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsK
KyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAg
U2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAg
ICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2spOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZUVudmlyb25t
ZW50U3ltYm9sVGFibGUpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2Rl
QmxvY2spCisgICAgICAgIHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+dmlz
aXRXZWFrbHkodmlzaXRvcik7Cit9CisKK0Z1bmN0aW9uQ29kZUJsb2NrKiBGdW5jdGlvbkV4ZWN1
dGFibGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkK
K3sKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0OworICAgIGlmIChraW5kID09IENvZGVG
b3JDYWxsKQorICAgICAgICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAg
ZWxzZSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7
CisgICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0K
KyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHN0YXRpY19j
YXN0PEZ1bmN0aW9uQ29kZUJsb2NrKj4ocmVzdWx0LT5iYXNlbGluZUFsdGVybmF0aXZlKCkpOwor
fQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGws
IFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogdGhpc09i
amVjdCA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0Nf
T0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJs
ZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICBpZiAodGhpc09iamVj
dC0+bV9jb2RlQmxvY2tGb3JDYWxsKQorICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0Zv
ckNhbGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVC
bG9ja0ZvckNvbnN0cnVjdCkKKyAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25z
dHJ1Y3QtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2Jq
ZWN0LT5tX3VubGlua2VkRXhlY3V0YWJsZSk7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmpl
Y3QtPm1fc2luZ2xldG9uRnVuY3Rpb24pOworfQorCitGdW5jdGlvbkV4ZWN1dGFibGUqIEZ1bmN0
aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCisgICAgY29uc3QgSWRlbnRpZmllciYgbmFt
ZSwgRXhlY1N0YXRlJiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIAorICAgIEpTT2Jq
ZWN0KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKQoreworICAgIFVubGlua2Vk
RnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUgPSAKKyAgICAgICAgVW5saW5r
ZWRGdW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKAorICAgICAgICAgICAgbmFtZSwg
ZXhlYywgc291cmNlLCBleGNlcHRpb24sIG92ZXJyaWRlTGluZU51bWJlcik7CisgICAgaWYgKCF1
bmxpbmtlZEV4ZWN1dGFibGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJu
IHVubGlua2VkRXhlY3V0YWJsZS0+bGluayhleGVjLnZtKCksIHNvdXJjZSwgb3ZlcnJpZGVMaW5l
TnVtYmVyKTsKK30KKworI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKK2NvbnN0IENsYXNzSW5mbyBX
ZWJBc3NlbWJseUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5RXhlY3V0YWJsZSIs
ICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFdlYkFzc2Vt
Ymx5RXhlY3V0YWJsZSkgfTsKKworV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4
ZWN1dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSog
bW9kdWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQorICAgIDogRXhlY3V0YWJsZUJhc2Uodm0s
IHZtLndlYkFzc2VtYmx5RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNf
Tk9UX0NPTVBJTEVELCBOb0ludHJpbnNpYykKKyAgICAsIG1fc291cmNlKHNvdXJjZSkKKyAgICAs
IG1fbW9kdWxlKHZtLCB0aGlzLCBtb2R1bGUpCisgICAgLCBtX2Z1bmN0aW9uSW5kZXgoZnVuY3Rp
b25JbmRleCkKK3sKKyAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9
PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OldlYkFzc2VtYmx5KTsKK30KKwordm9pZCBXZWJB
c3NlbWJseUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19j
YXN0PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwpLT5XZWJBc3NlbWJseUV4ZWN1dGFibGU6
On5XZWJBc3NlbWJseUV4ZWN1dGFibGUoKTsKK30KKwordm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFi
bGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sK
KyAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8V2ViQXNzZW1i
bHlFeGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlz
T2JqZWN0LCBpbmZvKCkpOworICAgIEV4ZWN1dGFibGVCYXNlOjp2aXNpdENoaWxkcmVuKHRoaXNP
YmplY3QsIHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwp
CisgICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlz
aXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlKTsKK30KKyNl
bmRpZgorCit2b2lkIEV4ZWN1dGFibGVCYXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0
Cit7CisgICAgRXhlY3V0YWJsZUJhc2UqIHJlYWxUaGlzID0gY29uc3RfY2FzdDxFeGVjdXRhYmxl
QmFzZSo+KHRoaXMpOworICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRh
YmxlOjppbmZvKCkpIHsKKyAgICAgICAgTmF0aXZlRXhlY3V0YWJsZSogbmF0aXZlID0ganNDYXN0
PE5hdGl2ZUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7CisgICAgICAgIG91dC5wcmludCgiTmF0aXZl
RXhlY3V0YWJsZToiLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5mdW5j
dGlvbigpKSksICIvIiwgUmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+Y29u
c3RydWN0b3IoKSkpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoY2xh
c3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0
YWJsZSogZXZhbCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAg
aWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCisgICAgICAgICAg
ICBvdXQucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5w
cmludCgiRXZhbEV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5m
bygpKSB7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PFByb2dyYW1F
eGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sg
PSBldmFsLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCJQcm9ncmFtRXhlY3V0YWJsZSB3
L28gQ29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0g
ZXhlY3V0YWJsZS0+Y29kZUJsb2NrKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9j
ayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAor
ICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZnVuY3Rpb24gPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRh
YmxlKj4ocmVhbFRoaXMpOworICAgIGlmICghZnVuY3Rpb24tPmVpdGhlckNvZGVCbG9jaygpKQor
ICAgICAgICBvdXQucHJpbnQoIkZ1bmN0aW9uRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Cisg
ICAgZWxzZSB7CisgICAgICAgIENvbW1hUHJpbnRlciBjb21tYSgiLyIpOworICAgICAgICBpZiAo
ZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSkKKyAgICAgICAgICAgIG91dC5wcmludChjb21t
YSwgKmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkpOworICAgICAgICBpZiAoZnVuY3Rpb24t
PmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAq
ZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpKTsKKyAgICB9Cit9CisKK0NvZGVCbG9j
a0hhc2ggRXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
KSBjb25zdAoreworICAgIGlmICh0aGlzLT5jbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxl
OjppbmZvKCkpCisgICAgICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgTmF0aXZlRXhlY3V0YWJsZSo+
KHRoaXMpLT5oYXNoRm9yKGtpbmQpOworICAgIAorICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgU2Ny
aXB0RXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9yKGtpbmQpOworfQorCitDb2RlQmxvY2tIYXNo
IE5hdGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBj
b25zdAoreworICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICByZXR1cm4gQ29k
ZUJsb2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9m
dW5jdGlvbikpKTsKKyAgICAKKyAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25z
dHJ1Y3QpOworICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihi
aXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2NvbnN0cnVjdG9yKSkpOworfQorCitDb2RlQmxvY2tIYXNo
IFNjcmlwdEV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBj
b25zdAoreworICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHNvdXJjZSgpLCBraW5kKTsKK30KKwor
fQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZUJhc2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGVC
YXNlLmNwcAkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRp
bWUvRXhlY3V0YWJsZUJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw2IEBACiAg
Ki8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKIAogI2lu
Y2x1ZGUgIkJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmgiCiAjaW5jbHVkZSAiQ29kZUJsb2Nr
LmgiCkBAIC05OCw2ODAgKzk3LDYgQEAgdm9pZCBFeGVjdXRhYmxlQmFzZTo6Y2xlYXJDb2RlKCkK
ICAgICBBU1NFUlQoY2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6aW5mbygpKTsKIH0K
IAotY29uc3QgQ2xhc3NJbmZvIE5hdGl2ZUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk5hdGl2ZUV4
ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJM
RShOYXRpdmVFeGVjdXRhYmxlKSB9OwotCi1OYXRpdmVFeGVjdXRhYmxlKiBOYXRpdmVFeGVjdXRh
YmxlOjpjcmVhdGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZl
RnVuY3Rpb24gZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5h
dGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJp
bmcmIG5hbWUpCi17Ci0gICAgTmF0aXZlRXhlY3V0YWJsZSogZXhlY3V0YWJsZTsKLSAgICBleGVj
dXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8TmF0aXZlRXhlY3V0YWJsZT4odm0u
aGVhcCkpIE5hdGl2ZUV4ZWN1dGFibGUodm0sIGZ1bmN0aW9uLCBjb25zdHJ1Y3RvciwgaW50cmlu
c2ljKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSwgY2FsbFRodW5rLCBjb25z
dHJ1Y3RUaHVuaywgbmFtZSk7Ci0gICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci19Ci0KLXZvaWQgTmF0
aXZlRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8
TmF0aXZlRXhlY3V0YWJsZSo+KGNlbGwpLT5OYXRpdmVFeGVjdXRhYmxlOjp+TmF0aXZlRXhlY3V0
YWJsZSgpOwotfQotCi1TdHJ1Y3R1cmUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZVN0cnVjdHVy
ZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi17
Ci0gICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBU
eXBlSW5mbyhDZWxsVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotfQotCi12b2lkIE5h
dGl2ZUV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2Rl
PiBjYWxsVGh1bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0
cmluZyYgbmFtZSkKLXsKLSAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgbV9qaXRD
b2RlRm9yQ2FsbCA9IGNhbGxUaHVuazsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBjb25z
dHJ1Y3RUaHVuazsKLSAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENv
ZGVGb3JDYWxsLT5hZGRyZXNzRm9yQ2FsbChNdXN0Q2hlY2tBcml0eSk7Ci0gICAgbV9qaXRDb2Rl
Rm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENvZGVGb3JDb25zdHJ1Y3QtPmFkZHJl
c3NGb3JDYWxsKE11c3RDaGVja0FyaXR5KTsKLSAgICBtX25hbWUgPSBuYW1lOwotfQotCi1OYXRp
dmVFeGVjdXRhYmxlOjpOYXRpdmVFeGVjdXRhYmxlKFZNJiB2bSwgTmF0aXZlRnVuY3Rpb24gZnVu
Y3Rpb24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljKQot
ICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZtLm5hdGl2ZUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0
KCksIE5VTV9QQVJBTUVURVJTX0lTX0hPU1QsIGludHJpbnNpYykKLSAgICAsIG1fZnVuY3Rpb24o
ZnVuY3Rpb24pCi0gICAgLCBtX2NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKQotewotfQotCi1jb25z
dCBDbGFzc0luZm8gU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvID0geyAiU2NyaXB0RXhlY3V0YWJs
ZSIsICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFNjcmlw
dEV4ZWN1dGFibGUpIH07Ci0KLVNjcmlwdEV4ZWN1dGFibGU6OlNjcmlwdEV4ZWN1dGFibGUoU3Ry
dWN0dXJlKiBzdHJ1Y3R1cmUsIFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29s
IGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBl
LCBib29sIGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250
ZXh0VHlwZSwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCBz
dHJ1Y3R1cmUsIE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCwgaW50cmluc2ljKQotICAgICwg
bV9mZWF0dXJlcyhpc0luU3RyaWN0Q29udGV4dCA/IFN0cmljdE1vZGVGZWF0dXJlIDogMCkKLSAg
ICAsIG1fZGlkVHJ5VG9FbnRlckluTG9vcChmYWxzZSkKLSAgICAsIG1faGFzQ2FwdHVyZWRWYXJp
YWJsZXMoZmFsc2UpCi0gICAgLCBtX25ldmVySW5saW5lKGZhbHNlKQotICAgICwgbV9uZXZlck9w
dGltaXplKGZhbHNlKQotICAgICwgbV9uZXZlckZUTE9wdGltaXplKGZhbHNlKQotICAgICwgbV9p
c0Fycm93RnVuY3Rpb25Db250ZXh0KGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCkKLSAgICAsIG1f
Y2FuVXNlT1NSRXhpdEZ1enppbmcodHJ1ZSkKLSAgICAsIG1fZGVyaXZlZENvbnRleHRUeXBlKHN0
YXRpY19jYXN0PHVuc2lnbmVkPihkZXJpdmVkQ29udGV4dFR5cGUpKQotICAgICwgbV9ldmFsQ29u
dGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGV2YWxDb250ZXh0VHlwZSkpCi0gICAgLCBt
X292ZXJyaWRlTGluZU51bWJlcigtMSkKLSAgICAsIG1fZmlyc3RMaW5lKC0xKQotICAgICwgbV9s
YXN0TGluZSgtMSkKLSAgICAsIG1fc3RhcnRDb2x1bW4oVUlOVF9NQVgpCi0gICAgLCBtX2VuZENv
bHVtbihVSU5UX01BWCkKLSAgICAsIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KFVJTlRfTUFY
KQotICAgICwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KFVJTlRfTUFYKQotICAgICwgbV9zb3Vy
Y2Uoc291cmNlKQotewotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxs
KiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PFNjcmlwdEV4ZWN1dGFibGUqPihjZWxsKS0+U2Ny
aXB0RXhlY3V0YWJsZTo6flNjcmlwdEV4ZWN1dGFibGUoKTsKLX0KLQotdm9pZCBTY3JpcHRFeGVj
dXRhYmxlOjppbnN0YWxsQ29kZShDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSAgICBpbnN0YWxs
Q29kZSgqY29kZUJsb2NrLT52bSgpLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwg
Y29kZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQoKSk7Ci19Ci0KLXZvaWQgU2NyaXB0RXhlY3V0
YWJsZTo6aW5zdGFsbENvZGUoVk0mIHZtLCBDb2RlQmxvY2sqIGdlbmVyaWNDb2RlQmxvY2ssIENv
ZGVUeXBlIGNvZGVUeXBlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgQVNT
RVJUKHZtLmhlYXAuaXNEZWZlcnJlZCgpKTsKLSAgICAKLSAgICBpZiAoZ2VuZXJpY0NvZGVCbG9j
aykKLSAgICAgICAgQ09ERUJMT0NLX0xPR19FVkVOVChnZW5lcmljQ29kZUJsb2NrLCAiaW5zdGFs
bENvZGUiLCAoKSk7Ci0gICAgCi0gICAgQ29kZUJsb2NrKiBvbGRDb2RlQmxvY2sgPSBudWxscHRy
OwotICAgIAotICAgIHN3aXRjaCAoY29kZVR5cGUpIHsKLSAgICBjYXNlIEdsb2JhbENvZGU6IHsK
LSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4
ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrID0g
c3RhdGljX2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAg
ICAKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICAKLSAgICAg
ICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOwot
ICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0
aGlzLCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1vZHVs
ZUNvZGU6IHsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBq
c0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgTW9kdWxlUHJv
Z3JhbUNvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOwotCi0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVG
b3JDYWxsKTsKLQotICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX21vZHVsZVBy
b2dyYW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLQotICAgIGNhc2UgRXZhbENvZGU6IHsKLSAgICAgICAgRXZhbEV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAg
RXZhbENvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9jayo+KGdl
bmVyaWNDb2RlQmxvY2spOwotICAgICAgICAKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNhbGwpOwotICAgICAgICAKLSAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9l
dmFsQ29kZUJsb2NrLmdldCgpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2su
c2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9
Ci0gICAgICAgIAotICAgIGNhc2UgRnVuY3Rpb25Db2RlOiB7Ci0gICAgICAgIEZ1bmN0aW9uRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsK
LSAgICAgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEZ1bmN0
aW9uQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBzd2l0
Y2ggKGtpbmQpIHsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgIG9sZENv
ZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICAgICAg
ICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5zZXRNYXlCZU51bGwodm0sIHRoaXMs
IGNvZGVCbG9jayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ29u
c3RydWN0OgotICAgICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2RlQmxv
Y2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdC5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotCi0g
ICAgc3dpdGNoIChraW5kKSB7Ci0gICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgbV9qaXRD
b2RlRm9yQ2FsbCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2Rl
KCkgOiBudWxscHRyOwotICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBN
YWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKLSAgICAgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9
IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBO
VU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ29k
ZUZvckNvbnN0cnVjdDoKLSAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0Nv
ZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7Ci0gICAgICAg
IG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2Rl
UHRyKCk7Ci0gICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2Rl
QmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBOVU1fUEFSQU1FVEVS
U19OT1RfQ09NUElMRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChnZW5lcmlj
Q29kZUJsb2NrKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGdlbmVyaWNDb2RlQmxvY2stPm93
bmVyRXhlY3V0YWJsZSgpID09IHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChKSVRDb2Rl
Ojppc0V4ZWN1dGFibGVTY3JpcHQoZ2VuZXJpY0NvZGVCbG9jay0+aml0VHlwZSgpKSk7Ci0gICAg
ICAgIAotICAgICAgICBpZiAoT3B0aW9uczo6dmVyYm9zZU9TUigpKQotICAgICAgICAgICAgZGF0
YUxvZygiSW5zdGFsbGluZyAiLCAqZ2VuZXJpY0NvZGVCbG9jaywgIlxuIik7Ci0gICAgICAgIAot
ICAgICAgICBpZiAodm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyKQotICAgICAgICAgICAgdm0ubV9w
ZXJCeXRlY29kZVByb2ZpbGVyLT5lbnN1cmVCeXRlY29kZXNGb3IoZ2VuZXJpY0NvZGVCbG9jayk7
Ci0gICAgICAgIAotICAgICAgICBpZiAoRGVidWdnZXIqIGRlYnVnZ2VyID0gZ2VuZXJpY0NvZGVC
bG9jay0+Z2xvYmFsT2JqZWN0KCktPmRlYnVnZ2VyKCkpCi0gICAgICAgICAgICBkZWJ1Z2dlci0+
cmVnaXN0ZXJDb2RlQmxvY2soZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG9s
ZENvZGVCbG9jaykKLSAgICAgICAgb2xkQ29kZUJsb2NrLT51bmxpbmtJbmNvbWluZ0NhbGxzKCk7
Ci0KLSAgICB2bS5oZWFwLndyaXRlQmFycmllcih0aGlzKTsKLX0KLQotQ29kZUJsb2NrKiBTY3Jp
cHRFeGVjdXRhYmxlOjpuZXdDb2RlQmxvY2tGb3IoCi0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCBraW5kLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIEpTT2JqZWN0KiYg
ZXhjZXB0aW9uKQotewotICAgIFZNKiB2bSA9IHNjb3BlLT52bSgpOwotICAgIGF1dG8gdGhyb3dT
Y29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUoKnZtKTsKLQotICAgIEFTU0VSVCh2bS0+aGVhcC5p
c0RlZmVycmVkKCkpOwotICAgIEFTU0VSVChzdGFydENvbHVtbigpICE9IFVJTlRfTUFYKTsKLSAg
ICBBU1NFUlQoZW5kQ29sdW1uKCkgIT0gVUlOVF9NQVgpOwotCi0gICAgaWYgKGNsYXNzSW5mbygp
ID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFl
eGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2spOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVu
Y3Rpb24pOwotICAgICAgICByZXR1cm4gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtLAotICAgICAg
ICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suZ2V0
KCksIHNjb3BlLAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSk7
Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6
aW5mbygpKSB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQg
PT0gQ29kZUZvckNhbGwpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9w
cm9ncmFtQ29kZUJsb2NrKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAg
ICAgICAgcmV0dXJuIFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4
ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLmdldCgpLCBz
Y29wZSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCksIGV4ZWN1
dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOwotICAgIH0KLQotICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNh
bGwpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFt
Q29kZUJsb2NrKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAgICAg
cmV0dXJuIE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4
ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdl
dCgpLCBzY29wZSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCks
IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOwotICAgIH0KLQotICAgIFJFTEVB
U0VfQVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKLSAg
ICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbik7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVj
dXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgIFJFTEVBU0Vf
QVNTRVJUKCFleGVjdXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCkpOwotICAgIEpTR2xvYmFsT2Jq
ZWN0KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+Z2xvYmFsT2JqZWN0KCk7Ci0gICAgUGFyc2VyRXJy
b3IgZXJyb3I7Ci0gICAgRGVidWdnZXJNb2RlIGRlYnVnZ2VyTW9kZSA9IGdsb2JhbE9iamVjdC0+
aGFzSW50ZXJhY3RpdmVEZWJ1Z2dlcigpID8gRGVidWdnZXJPbiA6IERlYnVnZ2VyT2ZmOwotICAg
IFVubGlua2VkRnVuY3Rpb25Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2NrID0gCi0gICAgICAg
IGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT51bmxpbmtlZENvZGVCbG9ja0ZvcigK
LSAgICAgICAgICAgICp2bSwgZXhlY3V0YWJsZS0+bV9zb3VyY2UsIGtpbmQsIGRlYnVnZ2VyTW9k
ZSwgZXJyb3IsIAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+cGFyc2VNb2RlKCkpOwotICAgIHJl
Y29yZFBhcnNlKAotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+ZmVh
dHVyZXMoKSwgCi0gICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5oYXND
YXB0dXJlZFZhcmlhYmxlcygpLCBmaXJzdExpbmUoKSwgCi0gICAgICAgIGxhc3RMaW5lKCksIHN0
YXJ0Q29sdW1uKCksIGVuZENvbHVtbigpKTsgCi0gICAgaWYgKCF1bmxpbmtlZENvZGVCbG9jaykg
ewotICAgICAgICBleGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbigKLSAgICAgICAgICAgIGdsb2Jh
bE9iamVjdC0+Z2xvYmFsRXhlYygpLCB0aHJvd1Njb3BlLAotICAgICAgICAgICAgZXJyb3IudG9F
cnJvck9iamVjdChnbG9iYWxPYmplY3QsIGV4ZWN1dGFibGUtPm1fc291cmNlKSk7Ci0gICAgICAg
IHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIFNvdXJjZVByb3ZpZGVyKiBwcm92aWRlciA9
IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCk7Ci0gICAgdW5zaWduZWQgc291cmNlT2Zm
c2V0ID0gZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRPZmZzZXQoKTsKLSAgICB1bnNpZ25lZCBz
dGFydENvbHVtbiA9IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCk7Ci0KLSAgICBy
ZXR1cm4gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgZXhlY3V0YWJsZSwg
dW5saW5rZWRDb2RlQmxvY2ssIHNjb3BlLCBwcm92aWRlciwgc291cmNlT2Zmc2V0LCBzdGFydENv
bHVtbik7Ci19Ci0KLUNvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3UmVwbGFjZW1lbnRD
b2RlQmxvY2tGb3IoCi0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotewotICAgIGlm
IChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVB
U0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICBFdmFsRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBFdmFs
Q29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPigKLSAgICAg
ICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwot
ICAgICAgICBFdmFsQ29kZUJsb2NrKiByZXN1bHQgPSBFdmFsQ29kZUJsb2NrOjpjcmVhdGUodm0o
KSwKLSAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwot
ICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9n
cmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0g
Q29kZUZvckNhbGwpOwotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBQcm9ncmFtQ29kZUJsb2Nr
KiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPigKLSAgICAgICAgICAg
IGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAg
ICAgICBQcm9ncmFtQ29kZUJsb2NrKiByZXN1bHQgPSBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUo
dm0oKSwKLSAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUp
OwotICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAg
ICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVj
dXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAg
IE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8TW9kdWxlUHJv
Z3JhbUNvZGVCbG9jayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFt
Q29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2sqIHJlc3VsdCA9IE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAg
ICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAg
IHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJu
IHJlc3VsdDsKLSAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0luZm8oKSA9PSBGdW5j
dGlvbkV4ZWN1dGFibGU6OmluZm8oKSk7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgIEZ1bmN0aW9uQ29k
ZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29kZUJsb2NrKj4oCi0gICAg
ICAgIGV4ZWN1dGFibGUtPmNvZGVCbG9ja0ZvcihraW5kKS0+YmFzZWxpbmVWZXJzaW9uKCkpOwot
ICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiByZXN1bHQgPSBGdW5jdGlvbkNvZGVCbG9jazo6Y3JlYXRl
KHZtKCksCi0gICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwot
ICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cExMSW50KFZNJiB2bSwgQ29kZUJsb2NrKiBj
b2RlQmxvY2spCi17Ci0gICAgTExJbnQ6OnNldEVudHJ5cG9pbnQodm0sIGNvZGVCbG9jayk7Ci19
Ci0KLXN0YXRpYyB2b2lkIHNldHVwSklUKFZNJiB2bSwgQ29kZUJsb2NrKiBjb2RlQmxvY2spCi17
Ci0jaWYgRU5BQkxFKEpJVCkKLSAgICBDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBKSVQ6OmNv
bXBpbGUoJnZtLCBjb2RlQmxvY2ssIEpJVENvbXBpbGF0aW9uTXVzdFN1Y2NlZWQpOwotICAgIFJF
TEVBU0VfQVNTRVJUKHJlc3VsdCA9PSBDb21waWxhdGlvblN1Y2Nlc3NmdWwpOwotI2Vsc2UKLSAg
ICBVTlVTRURfUEFSQU0odm0pOwotICAgIFVOVVNFRF9QQVJBTShjb2RlQmxvY2spOwotICAgIFVO
UkVBQ0hBQkxFX0ZPUl9QTEFURk9STSgpOwotI2VuZGlmCi19Ci0KLUpTT2JqZWN0KiBTY3JpcHRF
eGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCgKLSAgICBWTSYgdm0sIEpTRnVuY3Rp
b24qIGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
LCBDb2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2spCi17Ci0gICAgRGVmZXJHQ0ZvckFXaGlsZSBk
ZWZlckdDKHZtLmhlYXApOwotCi0gICAgaWYgKHZtLmdldEFuZENsZWFyRmFpbE5leHROZXdDb2Rl
QmxvY2soKSkKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKHNjb3BlLT5nbG9iYWxPYmplY3Qo
KS0+Z2xvYmFsRXhlYygpLCBBU0NJSUxpdGVyYWwoIkZvcmNlZCBGYWlsdXJlIikpOwotCi0gICAg
SlNPYmplY3QqIGV4Y2VwdGlvbiA9IDA7Ci0gICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBuZXdD
b2RlQmxvY2tGb3Ioa2luZCwgZnVuY3Rpb24sIHNjb3BlLCBleGNlcHRpb24pOwotICAgIHJlc3Vs
dENvZGVCbG9jayA9IGNvZGVCbG9jazsKLSAgICBpZiAoIWNvZGVCbG9jaykgewotICAgICAgICBS
RUxFQVNFX0FTU0VSVChleGNlcHRpb24pOwotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAg
IH0KLSAgICAKLSAgICBpZiAoT3B0aW9uczo6dmFsaWRhdGVCeXRlY29kZSgpKQotICAgICAgICBj
b2RlQmxvY2stPnZhbGlkYXRlKCk7Ci0gICAgCi0gICAgaWYgKE9wdGlvbnM6OnVzZUxMSW50KCkp
Ci0gICAgICAgIHNldHVwTExJbnQodm0sIGNvZGVCbG9jayk7Ci0gICAgZWxzZQotICAgICAgICBz
ZXR1cEpJVCh2bSwgY29kZUJsb2NrKTsKLSAgICAKLSAgICBpbnN0YWxsQ29kZSh2bSwgY29kZUJs
b2NrLCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lhbGl6YXRpb25LaW5k
KCkpOwotICAgIHJldHVybiBudWxscHRyOwotfQotCi1jb25zdCBDbGFzc0luZm8gRXZhbEV4ZWN1
dGFibGU6OnNfaW5mbyA9IHsgIkV2YWxFeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNf
aW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShFdmFsRXhlY3V0YWJsZSkgfTsKLQotRXZhbEV4
ZWN1dGFibGUqIEV2YWxFeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBT
b3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0
VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZh
bENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSwgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCog
dmFyaWFibGVzVW5kZXJURFopCi17Ci0gICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKLSAgICBhdXRv
IHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0KLSAgICBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIGlmICghZ2xv
YmFsT2JqZWN0LT5ldmFsRW5hYmxlZCgpKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uKGV4ZWMs
IHNjb3BlLCBjcmVhdGVFdmFsRXJyb3IoZXhlYywgZ2xvYmFsT2JqZWN0LT5ldmFsRGlzYWJsZWRF
cnJvck1lc3NhZ2UoKSkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFdmFsRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEV2YWxFeGVj
dXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgRXZhbEV4ZWN1dGFibGUoZXhlYywgc291cmNlLCBpc0lu
U3RyaWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
LCBldmFsQ29udGV4dFR5cGUpOwotICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtKTsK
LQotICAgIFVubGlua2VkRXZhbENvZGVCbG9jayogdW5saW5rZWRFdmFsQ29kZSA9IGdsb2JhbE9i
amVjdC0+Y3JlYXRlRXZhbENvZGVCbG9jayhleGVjLCBleGVjdXRhYmxlLCB2YXJpYWJsZXNVbmRl
clREWik7Ci0gICAgaWYgKCF1bmxpbmtlZEV2YWxDb2RlKQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLnNldCh2bSwgZXhlY3V0YWJs
ZSwgdW5saW5rZWRFdmFsQ29kZSk7Ci0KLSAgICByZXR1cm4gZXhlY3V0YWJsZTsKLX0KLQotRXZh
bEV4ZWN1dGFibGU6OkV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNl
Q29kZSYgc291cmNlLCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRl
cml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4
dFR5cGUgZXZhbENvbnRleHRUeXBlKQotICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgp
LmV2YWxFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGluU3Ry
aWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBl
dmFsQ29udGV4dFR5cGUsIE5vSW50cmluc2ljKQotewotICAgIEFTU0VSVChzb3VyY2UucHJvdmlk
ZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6UHJvZ3JhbSk7
Ci19Ci0KLXZvaWQgRXZhbEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAg
IHN0YXRpY19jYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCktPkV2YWxFeGVjdXRhYmxlOjp+RXZh
bEV4ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIFByb2dyYW1FeGVjdXRhYmxlOjpz
X2luZm8gPSB7ICJQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoUHJvZ3JhbUV4ZWN1dGFibGUpIH07Ci0KLVByb2dyYW1F
eGVjdXRhYmxlOjpQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJj
ZUNvZGUmIHNvdXJjZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5wcm9ncmFt
RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVy
aXZlZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0lu
dHJpbnNpYykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9
PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOwotICAgIG1fdHlwZVByb2ZpbGlu
Z1N0YXJ0T2Zmc2V0ID0gMDsKLSAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2Uu
bGVuZ3RoKCkgLSAxOwotICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMt
PnZtKCkuY29udHJvbEZsb3dQcm9maWxlcigpKQotICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9u
SGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90
eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Ci19Ci0K
LXZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0
YXRpY19jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPlByb2dyYW1FeGVjdXRhYmxlOjp+
UHJvZ3JhbUV4ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRF
eGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUpIH07Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICA6
IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVN0cnVj
dHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBl
OjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsKLSAg
ICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRl
clNvdXJjZVR5cGU6Ok1vZHVsZSk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAw
OwotICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0g
ICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxv
d1Byb2ZpbGVyKCkpCi0gICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hl
KCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFy
dE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKLX0KLQotTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUqIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi17Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUoZXhlYywgc291cmNlKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52
bSgpKTsKLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlTW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayhleGVjLCBleGVjdXRhYmxlKTsKLSAgICBpZiAoIXVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUp
Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCB1bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlKTsKLQotICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRT
eW1ib2xUYWJsZS5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwganNDYXN0PFN5bWJvbFRhYmxl
Kj4odW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+Y29uc3RhbnRSZWdpc3Rlcih1bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlQ29uc3RhbnRSZWdp
c3Rlck9mZnNldCgpKS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0KGV4ZWMtPnZtKCkpKTsKLQotICAg
IHJldHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpk
ZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSo+KGNlbGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6fk1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBGdW5jdGlvbkV4ZWN1dGFibGU6OnNf
aW5mbyA9IHsgIkZ1bmN0aW9uRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVjdXRhYmxlKSB9OwotCi1GdW5jdGlv
bkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwg
dW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1
bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IFNjcmlw
dEV4ZWN1dGFibGUodm0uZnVuY3Rpb25FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCB2bSwgc291
cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmlzSW5TdHJpY3RDb250ZXh0KCksIHVubGlua2VkRXhl
Y3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5v
bmUsIGludHJpbnNpYykKLSAgICAsIG1fdW5saW5rZWRFeGVjdXRhYmxlKHZtLCB0aGlzLCB1bmxp
bmtlZEV4ZWN1dGFibGUpCi17Ci0gICAgUkVMRUFTRV9BU1NFUlQoIXNvdXJjZS5pc051bGwoKSk7
Ci0gICAgQVNTRVJUKHNvdXJjZS5sZW5ndGgoKSk7Ci0gICAgbV9maXJzdExpbmUgPSBmaXJzdExp
bmU7Ci0gICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotICAgIEFTU0VSVChzdGFydENvbHVtbiAh
PSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgbV9z
dGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOwotICAgIG1fZW5kQ29sdW1uID0gZW5kQ29sdW1uOwot
ICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0
ZXJzU3RhcnRPZmZzZXQoKTsKLSAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IHVubGlu
a2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCk7Ci0gICAgbV90eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KCk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYg
dm0pCi17Ci0gICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgIG1fc2luZ2xldG9uRnVu
Y3Rpb24uc2V0KHZtLCB0aGlzLCBJbmZlcnJlZFZhbHVlOjpjcmVhdGUodm0pKTsKLX0KLQotdm9p
ZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRp
Y19jYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5GdW5jdGlvbkV4ZWN1dGFibGU6On5G
dW5jdGlvbkV4ZWN1dGFibGUoKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIHNhbXBsaW5nRGVz
Y3JpcHRpb24oSklUQ29kZTo6SklUVHlwZSBqaXRUeXBlKQotewotICAgIHN3aXRjaCAoaml0VHlw
ZSkgewotICAgIGNhc2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJUaHVuazoKLSAgICAgICAgcmV0dXJu
ICJJbnRlcnByZXRlciBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkJh
c2VsaW5lSklUOgotICAgICAgICByZXR1cm4gIkJhc2VsaW5lIENvbXBpbGF0aW9uIChUT1RBTCki
OwotICAgIGNhc2UgSklUQ29kZTo6REZHSklUOgotICAgICAgICByZXR1cm4gIkRGRyBDb21waWxh
dGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkZUTEpJVDoKLSAgICAgICAgcmV0dXJu
ICJGVEwgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi12
b2lkIEV2YWxFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0
b3ImIHZpc2l0b3IpCi17Ci0gICAgRXZhbEV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8
RXZhbEV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRo
aXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0
aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91
bmxpbmtlZEV2YWxDb2RlQmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxv
Y2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlz
aXRvcik7Ci19Ci0KLUpTT2JqZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6Y2hlY2tTeW50YXgoRXhl
Y1N0YXRlKiBleGVjKQotewotICAgIFBhcnNlckVycm9yIGVycm9yOwotICAgIFZNKiB2bSA9ICZl
eGVjLT52bSgpOwotICAgIEpTR2xvYmFsT2JqZWN0KiBsZXhpY2FsR2xvYmFsT2JqZWN0ID0gZXhl
Yy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxQcm9ncmFtTm9k
ZT4gcHJvZ3JhbU5vZGUgPSBwYXJzZTxQcm9ncmFtTm9kZT4oCi0gICAgICAgIHZtLCBtX3NvdXJj
ZSwgSWRlbnRpZmllcigpLCBKU1BhcnNlckJ1aWx0aW5Nb2RlOjpOb3RCdWlsdGluLAotICAgICAg
ICBKU1BhcnNlclN0cmljdE1vZGU6Ok5vdFN0cmljdCwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFz
c2ljLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRl
ZCwgZXJyb3IpOwotICAgIGlmIChwcm9ncmFtTm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
QVNTRVJUKGVycm9yLmlzVmFsaWQoKSk7Ci0gICAgcmV0dXJuIGVycm9yLnRvRXJyb3JPYmplY3Qo
bGV4aWNhbEdsb2JhbE9iamVjdCwgbV9zb3VyY2UpOwotfQotCi1KU09iamVjdCogUHJvZ3JhbUV4
ZWN1dGFibGU6OmluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiB2bSwgQ2FsbEZyYW1lKiBj
YWxsRnJhbWUsIEpTU2NvcGUqIHNjb3BlKQotewotICAgIFJFTEVBU0VfQVNTRVJUKHNjb3BlKTsK
LSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgp
OwotICAgIFJFTEVBU0VfQVNTRVJUKGdsb2JhbE9iamVjdCk7Ci0gICAgQVNTRVJUKCZnbG9iYWxP
YmplY3QtPnZtKCkgPT0gJnZtKTsKLQotICAgIEpTT2JqZWN0KiBleGNlcHRpb24gPSAwOwotICAg
IFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sgPSBnbG9iYWxPYmpl
Y3QtPmNyZWF0ZVByb2dyYW1Db2RlQmxvY2soY2FsbEZyYW1lLCB0aGlzLCAmZXhjZXB0aW9uKTsK
LSAgICBpZiAoZXhjZXB0aW9uKQotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotCi0gICAgSlNH
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGdsb2JhbExleGljYWxFbnZpcm9ubWVudCA9IGdsb2Jh
bE9iamVjdC0+Z2xvYmFsTGV4aWNhbEVudmlyb25tZW50KCk7Ci0gICAgY29uc3QgVmFyaWFibGVF
bnZpcm9ubWVudCYgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+dmFy
aWFibGVEZWNsYXJhdGlvbnMoKTsKLSAgICBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50JiBsZXhp
Y2FsRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPmxleGljYWxEZWNsYXJhdGlvbnMo
KTsKLSAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0aGF0IG5vIHZhcnMvZ2xvYmFsIHByb3BlcnRp
ZXMvbGV0L2NvbnN0IGNhbiBiZSBkdXBsaWNhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0gICAg
Ly8gVGhpcyBjYXJyaWVkIG91dCBzZWN0aW9uIDE1LjEuOCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6
Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMt
Z2xvYmFsZGVjbGFyYXRpb25pbnN0YW50aWF0aW9uCi0gICAgewotICAgICAgICBFeGVjU3RhdGUq
IGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsKLSAgICAgICAgLy8gQ2hlY2sgZm9y
IGludGVyc2VjdGlvbiBvZiAidmFyIiBhbmQgImxldCIvImNvbnN0Ii8iY2xhc3MiCi0gICAgICAg
IGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBp
ZiAodmFyaWFibGVEZWNsYXJhdGlvbnMuY29udGFpbnMoZW50cnkua2V5KSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3Jl
YXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIp
KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGlmIGFueSBuZXcgImxldCIvImNvbnN0
Ii8iY2xhc3MiIHdpbGwgc2hhZG93IGFueSBwcmUtZXhpc3RpbmcgZ2xvYmFsIHByb3BlcnR5IG5h
bWVzLCBvciAidmFyIi8ibGV0Ii8iY29uc3QiIHZhcmlhYmxlcy4KLSAgICAgICAgLy8gSXQncyBh
biBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAgICAgIGZvciAoYXV0byYgZW50cnkg
OiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoZ2xvYmFsT2JqZWN0LT5o
YXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
VGhlIEVTNiBzcGVjIHNheXMgdGhhdCBqdXN0IFJlc3RyaWN0ZWRHbG9iYWxQcm9wZXJ0eSBjYW4n
dCBiZSBzaGFkb3dlZAotICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlv
biA4LjEuMS40LjE0IG9mIHRoZSBFUzYgc3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9u
YWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1oYXNyZXN0cmljdGVkZ2xvYmFscHJv
cGVydHkKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAg
ICAgICAgICAgICAgICBnbG9iYWxPYmplY3QtPmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleGVj
LCBlbnRyeS5rZXkuZ2V0KCksIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKCkgIT0ganNVbmRlZmluZWQoKSAmJiAhZGVz
Y3JpcHRvci5jb25maWd1cmFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0
ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFy
aWFibGUgdGhhdCBzaGFkb3dzIGEgZ2xvYmFsIHByb3BlcnR5OiAnIiwgU3RyaW5nKGVudHJ5Lmtl
eS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50
cnkua2V5LmdldCgpKSkgewotICAgICAgICAgICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1
ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkg
JiYgIWlzU3RyaWN0TW9kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGFs
bG93ICJjb25zdCIgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyB1bmRlciB0aGlzIHNldHRpbmcuCi0g
ICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB3ZSBkb24ndCAibGV0IiB2YXJpYWJs
ZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSAiY29uc3QiIHZhcmlhYmxlcy4KLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aXNDb25zdFZhcmlhYmxlKGVudHJ5
LmtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMs
IG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmco
ZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJ2YXIicyB3aWxsIHNoYWRvdyBhbnkgcHJldmlvdXMg
ImxldCIvImNvbnN0Ii8iY2xhc3MiIG5hbWVzLgotICAgICAgICAvLyBJdCdzIGFuIGVycm9yIHRv
IGludHJvZHVjZSBhIHNoYWRvdy4KLSAgICAgICAgaWYgKCFnbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQtPmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxl
RGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9u
bWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNy
ZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIici
KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIG1fdW5saW5rZWRQ
cm9ncmFtQ29kZUJsb2NrLnNldCh2bSwgdGhpcywgdW5saW5rZWRDb2RlQmxvY2spOwotCi0gICAg
QmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIgb3B0aW1pemVyKHZtLCBnbG9iYWxPYmplY3QpOwot
Ci0gICAgZm9yIChzaXplX3QgaSA9IDAsIG51bWJlck9mRnVuY3Rpb25zID0gdW5saW5rZWRDb2Rl
QmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpOyBpIDwgbnVtYmVyT2ZGdW5jdGlvbnM7ICsr
aSkgewotICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRGdW5jdGlv
bkV4ZWN1dGFibGUgPSB1bmxpbmtlZENvZGVCbG9jay0+ZnVuY3Rpb25EZWNsKGkpOwotICAgICAg
ICBBU1NFUlQoIXVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsK
LSAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRGdW5jdGlvbihjYWxsRnJhbWUsIHVubGlua2VkRnVu
Y3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkpOwotICAgICAgICBpZiAodm0udHlwZVByb2ZpbGVyKCkg
fHwgdm0uY29udHJvbEZsb3dQcm9maWxlcigpKSB7Ci0gICAgICAgICAgICB2bS5mdW5jdGlvbkhh
c0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIAotICAg
ICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nU3Rh
cnRPZmZzZXQoKSwgCi0gICAgICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUt
PnR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgQVNTRVJUKGVu
dHJ5LnZhbHVlLmlzVmFyKCkpOwotICAgICAgICBnbG9iYWxPYmplY3QtPmFkZFZhcihjYWxsRnJh
bWUsIElkZW50aWZpZXI6OmZyb21VaWQoJnZtLCBlbnRyeS5rZXkuZ2V0KCkpKTsKLSAgICB9Ci0K
LSAgICB7Ci0gICAgICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2Fs
RW52aXJvbm1lbnQgPSBqc0Nhc3Q8SlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqPihnbG9iYWxP
YmplY3QtPmdsb2JhbFNjb3BlKCkpOwotICAgICAgICBTeW1ib2xUYWJsZSogc3ltYm9sVGFibGUg
PSBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPnN5bWJvbFRhYmxlKCk7Ci0gICAgICAgIENvbmN1
cnJlbnRKSVRMb2NrZXIgbG9ja2VyKHN5bWJvbFRhYmxlLT5tX2xvY2spOwotICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgaWYgKFVO
TElLRUxZKGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29uc3RSZWRlY2xhcmF0
aW9uU2hvdWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKHN5bWJvbFRhYmxlLT5jb250YWlucyhsb2NrZXIsIGVudHJ5LmtleS5nZXQoKSkpCi0gICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Nv
cGVPZmZzZXQgb2Zmc2V0ID0gc3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVPZmZzZXQobG9ja2Vy
KTsKLSAgICAgICAgICAgIFN5bWJvbFRhYmxlRW50cnkgbmV3RW50cnkoVmFyT2Zmc2V0KG9mZnNl
dCksIGVudHJ5LnZhbHVlLmlzQ29uc3QoKSA/IFJlYWRPbmx5IDogMCk7Ci0gICAgICAgICAgICBu
ZXdFbnRyeS5wcmVwYXJlVG9XYXRjaCgpOwotICAgICAgICAgICAgc3ltYm9sVGFibGUtPmFkZChs
b2NrZXIsIGVudHJ5LmtleS5nZXQoKSwgbmV3RW50cnkpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBTY29wZU9mZnNldCBvZmZzZXRGb3JBc3NlcnQgPSBnbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQtPmFkZFZhcmlhYmxlcygxLCBqc1REWlZhbHVlKCkpOwotICAgICAgICAgICAgUkVMRUFTRV9B
U1NFUlQob2Zmc2V0Rm9yQXNzZXJ0ID09IG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLXZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlND
ZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAgICBQcm9ncmFtRXhlY3V0YWJs
ZSogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOwotICAgIEFT
U0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBTY3JpcHRF
eGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotICAgIHZpc2l0
b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAg
aWYgKHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jaykKLSAgICAgICAgdGhpc09iamVjdC0+
bV9wcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLX0KLQotdm9pZCBNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNp
dG9yJiB2aXNpdG9yKQotewotICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiB0aGlzT2JqZWN0
ID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dD
X09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFi
bGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBl
bmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKTsKLSAgICB2
aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxl
KTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrKQotICAgICAg
ICB0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0
b3IpOwotfQotCi1GdW5jdGlvbkNvZGVCbG9jayogRnVuY3Rpb25FeGVjdXRhYmxlOjpiYXNlbGlu
ZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgRnVuY3Rp
b25Db2RlQmxvY2sqIHJlc3VsdDsKLSAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAg
ICAgcmVzdWx0ID0gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgIGVsc2UgewotICAgICAg
ICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXN1
bHQgPSBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgaWYgKCFyZXN1
bHQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxGdW5jdGlvbkNv
ZGVCbG9jayo+KHJlc3VsdC0+YmFzZWxpbmVBbHRlcm5hdGl2ZSgpKTsKLX0KLQotdm9pZCBGdW5j
dGlvbkV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYg
dmlzaXRvcikKLXsKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8
RnVuY3Rpb25FeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklU
Uyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRy
ZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2Nr
Rm9yQ2FsbCkKLSAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdl
YWtseSh2aXNpdG9yKTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1
Y3QpCi0gICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LT52aXNpdFdl
YWtseSh2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtl
ZEV4ZWN1dGFibGUpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3NpbmdsZXRv
bkZ1bmN0aW9uKTsKLX0KLQotRnVuY3Rpb25FeGVjdXRhYmxlKiBGdW5jdGlvbkV4ZWN1dGFibGU6
OmZyb21HbG9iYWxDb2RlKAotICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUsIEV4ZWNTdGF0ZSYg
ZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCAKLSAgICBKU09iamVjdComIGV4Y2VwdGlv
biwgaW50IG92ZXJyaWRlTGluZU51bWJlcikKLXsKLSAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlID0gCi0gICAgICAgIFVubGlua2VkRnVuY3Rpb25FeGVj
dXRhYmxlOjpmcm9tR2xvYmFsQ29kZSgKLSAgICAgICAgICAgIG5hbWUsIGV4ZWMsIHNvdXJjZSwg
ZXhjZXB0aW9uLCBvdmVycmlkZUxpbmVOdW1iZXIpOwotICAgIGlmICghdW5saW5rZWRFeGVjdXRh
YmxlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIHJldHVybiB1bmxpbmtlZEV4ZWN1
dGFibGUtPmxpbmsoZXhlYy52bSgpLCBzb3VyY2UsIG92ZXJyaWRlTGluZU51bWJlcik7Ci19Ci0K
LSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi1jb25zdCBDbGFzc0luZm8gV2ViQXNzZW1ibHlFeGVj
dXRhYmxlOjpzX2luZm8gPSB7ICJXZWJBc3NlbWJseUV4ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJh
c2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShXZWJBc3NlbWJseUV4ZWN1dGFibGUp
IH07Ci0KLVdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6V2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiB2
bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWdu
ZWQgZnVuY3Rpb25JbmRleCkKLSAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCB2bS53ZWJBc3NlbWJs
eUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCwg
Tm9JbnRyaW5zaWMpCi0gICAgLCBtX3NvdXJjZShzb3VyY2UpCi0gICAgLCBtX21vZHVsZSh2bSwg
dGhpcywgbW9kdWxlKQotICAgICwgbV9mdW5jdGlvbkluZGV4KGZ1bmN0aW9uSW5kZXgpCi17Ci0g
ICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlk
ZXJTb3VyY2VUeXBlOjpXZWJBc3NlbWJseSk7Ci19Ci0KLXZvaWQgV2ViQXNzZW1ibHlFeGVjdXRh
YmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxXZWJBc3NlbWJs
eUV4ZWN1dGFibGUqPihjZWxsKS0+V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp+V2ViQXNzZW1ibHlF
eGVjdXRhYmxlKCk7Ci19Ci0KLXZvaWQgV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp2aXNpdENoaWxk
cmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgV2ViQXNzZW1i
bHlFeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+
KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygp
KTsKLSAgICBFeGVjdXRhYmxlQmFzZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9y
KTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsKQotICAgICAgICB0aGlz
T2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotICAgIHZp
c2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZSk7Ci19Ci0jZW5kaWYKLQogdm9pZCBF
eGVjdXRhYmxlQmFzZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAogewogICAgIEV4ZWN1
dGFibGVCYXNlKiByZWFsVGhpcyA9IGNvbnN0X2Nhc3Q8RXhlY3V0YWJsZUJhc2UqPih0aGlzKTsK
QEAgLTgyOSwxOCArMTU0LDQgQEAgQ29kZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFzZTo6aGFzaEZv
cihDbwogICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgU2NyaXB0RXhlY3V0YWJsZSo+KHRoaXMpLT5o
YXNoRm9yKGtpbmQpOwogfQogCi1Db2RlQmxvY2tIYXNoIE5hdGl2ZUV4ZWN1dGFibGU6Omhhc2hG
b3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAotewotICAgIGlmIChraW5kID09
IENvZGVGb3JDYWxsKQotICAgICAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzdGF0aWNfY2FzdDx1
bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9mdW5jdGlvbikpKTsKLSAgICAKLSAgICBS
RUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgIHJldHVybiBDb2Rl
QmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2Nv
bnN0cnVjdG9yKSkpOwotfQotCi1Db2RlQmxvY2tIYXNoIFNjcmlwdEV4ZWN1dGFibGU6Omhhc2hG
b3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAotewotICAgIHJldHVybiBDb2Rl
QmxvY2tIYXNoKHNvdXJjZSgpLCBraW5kKTsKLX0KLQotfQorfSAvLyBuYW1lc3BhY2UgSlNDCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlQmFzZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGVCYXNlLmgJ
KHJldmlzaW9uIDIwNzc5MCkJKGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhl
Y3V0YWJsZS5oOjIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1
dGFibGVCYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NzggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTMtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjcHJh
Z21hIG9uY2UKKworI2luY2x1ZGUgIkFyaXR5Q2hlY2tNb2RlLmgiCisjaW5jbHVkZSAiQ2FsbERh
dGEuaCIKKyNpbmNsdWRlICJDb2RlQmxvY2tIYXNoLmgiCisjaW5jbHVkZSAiQ29kZVNwZWNpYWxp
emF0aW9uS2luZC5oIgorI2luY2x1ZGUgIkNvbXBpbGF0aW9uUmVzdWx0LmgiCisjaW5jbHVkZSAi
RXhlY3V0YWJsZUluZm8uaCIKKyNpbmNsdWRlICJIYW5kbGVySW5mby5oIgorI2luY2x1ZGUgIklu
ZmVycmVkVmFsdWUuaCIKKyNpbmNsdWRlICJKSVRDb2RlLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxP
YmplY3QuaCIKKyNpbmNsdWRlICJTb3VyY2VDb2RlLmgiCisjaW5jbHVkZSAiVHlwZVNldC5oIgor
I2luY2x1ZGUgIlVubGlua2VkQ29kZUJsb2NrLmgiCisjaW5jbHVkZSAiVW5saW5rZWRGdW5jdGlv
bkV4ZWN1dGFibGUuaCIKKworbmFtZXNwYWNlIEpTQyB7CisKK2NsYXNzIENvZGVCbG9jazsKK2Ns
YXNzIEV2YWxDb2RlQmxvY2s7CitjbGFzcyBGdW5jdGlvbkNvZGVCbG9jazsKK2NsYXNzIEpTU2Nv
cGU7CitjbGFzcyBKU1dhc21Nb2R1bGU7CitjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Citj
bGFzcyBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOworY2xhc3MgUHJvZ3JhbUNvZGVCbG9jazsKK2Ns
YXNzIFdlYkFzc2VtYmx5Q29kZUJsb2NrOworCitlbnVtIENvbXBpbGF0aW9uS2luZCB7IEZpcnN0
Q29tcGlsYXRpb24sIE9wdGltaXppbmdDb21waWxhdGlvbiB9OworCitpbmxpbmUgYm9vbCBpc0Nh
bGwoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQoreworICAgIGlmIChraW5kID09IENvZGVG
b3JDYWxsKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9y
Q29uc3RydWN0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NsYXNzIEV4ZWN1dGFibGVCYXNl
IDogcHVibGljIEpTQ2VsbCB7CisgICAgZnJpZW5kIGNsYXNzIEpJVDsKKworcHJvdGVjdGVkOgor
ICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCA9IDA7CisgICAgc3Rh
dGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQgPSAtMTsKKworICAgIEV4
ZWN1dGFibGVCYXNlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIGludCBudW1QYXJhbWV0
ZXJzLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgICAgICA6IEpTQ2VsbCh2bSwgc3RydWN0dXJl
KQorICAgICAgICAsIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwobnVtUGFyYW1ldGVycykKKyAgICAg
ICAgLCBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QobnVtUGFyYW1ldGVycykKKyAgICAgICAg
LCBtX2ludHJpbnNpYyhpbnRyaW5zaWMpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZmluaXNo
Q3JlYXRpb24oVk0mIHZtKQorICAgIHsKKyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0p
OworICAgIH0KKworcHVibGljOgorICAgIHR5cGVkZWYgSlNDZWxsIEJhc2U7CisgICAgc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7CisK
KyAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVkc0Rlc3RydWN0aW9uID0gdHJ1ZTsKKyAgICBzdGF0
aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBDb2RlQmxvY2tIYXNoIGhh
c2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBib29sIGlzRXZhbEV4
ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBFdmFsRXhl
Y3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJvb2wgaXNGdW5jdGlvbkV4ZWN1dGFibGUoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGVUeXBl
OworICAgIH0KKyAgICBib29sIGlzUHJvZ3JhbUV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHR5cGUoKSA9PSBQcm9ncmFtRXhlY3V0YWJsZVR5cGU7CisgICAgfQorICAg
IGJvb2wgaXNNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4g
dHlwZSgpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZTsKKyAgICB9CisKKworICAgIGJv
b2wgaXNIb3N0RnVuY3Rpb24oKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKChtX251bVBh
cmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QpID09IChtX251bVBhcmFt
ZXRlcnNGb3JDb25zdHJ1Y3QgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkpOworICAgICAgICBy
ZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUOwor
ICAgIH0KKworI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKKyAgICBib29sIGlzV2ViQXNzZW1ibHlF
eGVjdXRhYmxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlKCkgPT0gV2ViQXNz
ZW1ibHlFeGVjdXRhYmxlVHlwZTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXRpYyBTdHJ1Y3R1
cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Qs
IEpTVmFsdWUgcHJvdG8pIHsgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmpl
Y3QsIHByb3RvLCBUeXBlSW5mbyhDZWxsVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOyB9
CisgICAgICAgIAorICAgIHZvaWQgY2xlYXJDb2RlKCk7CisKKyAgICBERUNMQVJFX0VYUE9SVF9J
TkZPOworCitwcm90ZWN0ZWQ6CisgICAgaW50IG1fbnVtUGFyYW1ldGVyc0ZvckNhbGw7CisgICAg
aW50IG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdDsKKworcHVibGljOgorICAgIFBhc3NSZWZQ
dHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1faml0Q29kZUZvckNhbGwpOworICAgICAgICByZXR1cm4gbV9qaXRDb2RlRm9yQ2FsbDsK
KyAgICB9CisKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3JDb25z
dHJ1Y3QoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1faml0Q29kZUZvckNvbnN0cnVjdCk7Cisg
ICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDb25zdHJ1Y3Q7CisgICAgfQorICAgICAgICAKKyAg
ICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3IoQ29kZVNwZWNpYWxpemF0
aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisg
ICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICAgICAgQVNT
RVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRK
SVRDb2RlRm9yQ29uc3RydWN0KCk7CisgICAgfQorICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29k
ZVB0ciBlbnRyeXBvaW50Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQXJpdHlDaGVj
a01vZGUgYXJpdHkpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgY2FjaGVk
IHJlc3VsdC4gV2Ugb25seSBoYXZlIGl0IGZvciBhcml0eSBjaGVjayBiZWNhdXNlIHdlIHVzZSB0
aGUKKyAgICAgICAgLy8gbm8tYXJpdHkgZW50cnlwb2ludCBpbiBub24tdmlydHVhbCBjYWxscywg
d2hpY2ggd2lsbCAiY2FjaGUiIHRoaXMgdmFsdWUgZGlyZWN0bHkgaW4KKyAgICAgICAgLy8gbWFj
aGluZSBjb2RlLgorICAgICAgICBpZiAoYXJpdHkgPT0gTXVzdENoZWNrQXJpdHkpIHsKKyAgICAg
ICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAg
ICAgICAgICAgICAgICBpZiAoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9IG1faml0Q29k
ZUZvckNhbGxXaXRoQXJpdHlDaGVjaykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0
cnVjdDoKKyAgICAgICAgICAgICAgICBpZiAoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9
IG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPQorICAgICAg
ICAgICAgZ2VuZXJhdGVkSklUQ29kZUZvcihraW5kKS0+YWRkcmVzc0ZvckNhbGwoYXJpdHkpOwor
ICAgICAgICBpZiAoYXJpdHkgPT0gTXVzdENoZWNrQXJpdHkpIHsKKyAgICAgICAgICAgIC8vIENh
Y2hlIHRoZSByZXN1bHQ7IHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgSklUJ3MgdmlydHVhbCBj
YWxsIG9wdGltaXphdGlvbnMuCisgICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAg
ICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdp
dGhBcml0eUNoZWNrID0gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgICAgIG1faml0Q29kZUZvckNv
bnN0cnVjdFdpdGhBcml0eUNoZWNrID0gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
CisgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZkpJVENvZGVXaXRoQXJpdHlDaGVja0ZvcigK
KyAgICAgICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgICAgICByZXR1
cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX2ppdENvZGVGb3JDYWxsV2l0aEFy
aXR5Q2hlY2spOworICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICBy
ZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX2ppdENvZGVGb3JDb25zdHJ1
Y3RXaXRoQXJpdHlDaGVjayk7CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBw
dHJkaWZmX3Qgb2Zmc2V0T2ZOdW1QYXJhbWV0ZXJzRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQg
a2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAg
ICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9udW1QYXJhbWV0ZXJz
Rm9yQ2FsbCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAg
ICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRl
cnNGb3JDb25zdHJ1Y3QpOworICAgIH0KKworICAgIGJvb2wgaGFzSklUQ29kZUZvckNhbGwoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPj0gMDsK
KyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaGFzSklUQ29kZUZvckNvbnN0cnVjdCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID49IDA7
CisgICAgfQorICAgICAgICAKKyAgICBib29sIGhhc0pJVENvZGVGb3IoQ29kZVNwZWNpYWxpemF0
aW9uS2luZCBraW5kKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNh
bGwpCisgICAgICAgICAgICByZXR1cm4gaGFzSklUQ29kZUZvckNhbGwoKTsKKyAgICAgICAgQVNT
RVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBoYXNKSVRDb2Rl
Rm9yQ29uc3RydWN0KCk7CisgICAgfQorCisgICAgLy8gSW50cmluc2ljcyBhcmUgb25seSBmb3Ig
Y2FsbHMsIGN1cnJlbnRseS4KKyAgICBJbnRyaW5zaWMgaW50cmluc2ljKCkgY29uc3QgeyByZXR1
cm4gbV9pbnRyaW5zaWM7IH0KKyAgICAgICAgCisgICAgSW50cmluc2ljIGludHJpbnNpY0ZvcihD
b2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXND
YWxsKGtpbmQpKQorICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpYygpOworICAgICAgICByZXR1
cm4gTm9JbnRyaW5zaWM7CisgICAgfQorICAgIAorICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYp
IGNvbnN0OworICAgICAgICAKK3Byb3RlY3RlZDoKKyAgICBJbnRyaW5zaWMgbV9pbnRyaW5zaWM7
CisgICAgUmVmUHRyPEpJVENvZGU+IG1faml0Q29kZUZvckNhbGw7CisgICAgUmVmUHRyPEpJVENv
ZGU+IG1faml0Q29kZUZvckNvbnN0cnVjdDsKKyAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgbV9q
aXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrOworICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBt
X2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjazsKK307CisKK2NsYXNzIE5hdGl2ZUV4
ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgeworICAgIGZyaWVuZCBjbGFz
cyBKSVQ7CisgICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2ln
bmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0lt
bW9ydGFsOworCisgICAgc3RhdGljIE5hdGl2ZUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYgdm0sIFBh
c3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgUGFz
c1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0
b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisKKyAgICBzdGF0
aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENv
ZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OworCisgICAgTmF0aXZlRnVuY3Rpb24gZnVuY3Rp
b24oKSB7IHJldHVybiBtX2Z1bmN0aW9uOyB9CisgICAgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0
b3IoKSB7IHJldHVybiBtX2NvbnN0cnVjdG9yOyB9CisgICAgICAgIAorICAgIE5hdGl2ZUZ1bmN0
aW9uIG5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7
CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIGZ1
bmN0aW9uKCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAg
ICAgICByZXR1cm4gY29uc3RydWN0b3IoKTsKKyAgICB9CisgICAgICAgIAorICAgIHN0YXRpYyBw
dHJkaWZmX3Qgb2Zmc2V0T2ZOYXRpdmVGdW5jdGlvbkZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAg
ICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9mdW5jdGlvbik7
CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1
cm4gT0JKRUNUX09GRlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUsIG1fY29uc3RydWN0b3IpOworICAg
IH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYsIEpTR2xvYmFs
T2JqZWN0KiwgSlNWYWx1ZSBwcm90byk7CisgICAgICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKwor
ICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorCitwcm90
ZWN0ZWQ6CisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYsIFBhc3NSZWZQdHI8SklUQ29kZT4g
Y2FsbFRodW5rLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJp
bmcmIG5hbWUpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsK
KworICAgIE5hdGl2ZUV4ZWN1dGFibGUoVk0mLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0
aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyk7CisKKyAgICBOYXRpdmVGdW5jdGlv
biBtX2Z1bmN0aW9uOworICAgIE5hdGl2ZUZ1bmN0aW9uIG1fY29uc3RydWN0b3I7CisKKyAgICBT
dHJpbmcgbV9uYW1lOworfTsKKworY2xhc3MgU2NyaXB0RXhlY3V0YWJsZSA6IHB1YmxpYyBFeGVj
dXRhYmxlQmFzZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOwor
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVy
ZUZsYWdzOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKyAgICAgICAgCisg
ICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0Owor
CisgICAgY29uc3QgU291cmNlQ29kZSYgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2U7
IH0KKyAgICBpbnRwdHJfdCBzb3VyY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlLnByb3Zp
ZGVySUQoKTsgfQorICAgIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKCkgY29uc3QgeyByZXR1cm4g
bV9zb3VyY2UucHJvdmlkZXIoKS0+dXJsKCk7IH0KKyAgICBpbnQgZmlyc3RMaW5lKCkgY29uc3Qg
eyByZXR1cm4gbV9maXJzdExpbmU7IH0KKyAgICB2b2lkIHNldE92ZXJyaWRlTGluZU51bWJlcihp
bnQgb3ZlcnJpZGVMaW5lTnVtYmVyKSB7IG1fb3ZlcnJpZGVMaW5lTnVtYmVyID0gb3ZlcnJpZGVM
aW5lTnVtYmVyOyB9CisgICAgYm9vbCBoYXNPdmVycmlkZUxpbmVOdW1iZXIoKSBjb25zdCB7IHJl
dHVybiBtX292ZXJyaWRlTGluZU51bWJlciAhPSAtMTsgfQorICAgIGludCBvdmVycmlkZUxpbmVO
dW1iZXIoKSBjb25zdCB7IHJldHVybiBtX292ZXJyaWRlTGluZU51bWJlcjsgfQorICAgIGludCBs
YXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdExpbmU7IH0KKyAgICB1bnNpZ25lZCBzdGFy
dENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRDb2x1bW47IH0KKyAgICB1bnNpZ25lZCBl
bmRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBtX2VuZENvbHVtbjsgfQorICAgIHVuc2lnbmVkIHR5
cGVQcm9maWxpbmdTdGFydE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZVByb2ZpbGluZ1N0
YXJ0T2Zmc2V0OyB9CisgICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpIGNvbnN0
IHsgcmV0dXJuIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsgfQorCisgICAgYm9vbCB1c2VzRXZh
bCgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBFdmFsRmVhdHVyZTsgfQorICAgIGJvb2wg
dXNlc0FyZ3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBBcmd1bWVudHNGZWF0
dXJlOyB9CisgICAgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCkgY29uc3QgeyByZXR1cm4g
bV9pc0Fycm93RnVuY3Rpb25Db250ZXh0OyB9CisgICAgYm9vbCBpc1N0cmljdE1vZGUoKSBjb25z
dCB7IHJldHVybiBtX2ZlYXR1cmVzICYgU3RyaWN0TW9kZUZlYXR1cmU7IH0KKyAgICBEZXJpdmVk
Q29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nh
c3Q8RGVyaXZlZENvbnRleHRUeXBlPihtX2Rlcml2ZWRDb250ZXh0VHlwZSk7IH0KKyAgICBFdmFs
Q29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8
RXZhbENvbnRleHRUeXBlPihtX2V2YWxDb250ZXh0VHlwZSk7IH0KKworICAgIEVDTUFNb2RlIGVj
bWFNb2RlKCkgY29uc3QgeyByZXR1cm4gaXNTdHJpY3RNb2RlKCkgPyBTdHJpY3RNb2RlIDogTm90
U3RyaWN0TW9kZTsgfQorICAgICAgICAKKyAgICB2b2lkIHNldE5ldmVySW5saW5lKGJvb2wgdmFs
dWUpIHsgbV9uZXZlcklubGluZSA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXROZXZlck9wdGltaXpl
KGJvb2wgdmFsdWUpIHsgbV9uZXZlck9wdGltaXplID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldE5l
dmVyRlRMT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyRlRMT3B0aW1pemUgPSB2YWx1ZTsg
fQorICAgIHZvaWQgc2V0RGlkVHJ5VG9FbnRlckluTG9vcChib29sIHZhbHVlKSB7IG1fZGlkVHJ5
VG9FbnRlckluTG9vcCA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXRDYW5Vc2VPU1JFeGl0RnV6emlu
Zyhib29sIHZhbHVlKSB7IG1fY2FuVXNlT1NSRXhpdEZ1enppbmcgPSB2YWx1ZTsgfQorICAgIGJv
b2wgbmV2ZXJJbmxpbmUoKSBjb25zdCB7IHJldHVybiBtX25ldmVySW5saW5lOyB9CisgICAgYm9v
bCBuZXZlck9wdGltaXplKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlck9wdGltaXplOyB9CisgICAg
Ym9vbCBuZXZlckZUTE9wdGltaXplKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlckZUTE9wdGltaXpl
OyB9CisgICAgYm9vbCBkaWRUcnlUb0VudGVySW5Mb29wKCkgY29uc3QgeyByZXR1cm4gbV9kaWRU
cnlUb0VudGVySW5Mb29wOyB9CisgICAgYm9vbCBpc0lubGluaW5nQ2FuZGlkYXRlKCkgY29uc3Qg
eyByZXR1cm4gIW5ldmVySW5saW5lKCk7IH0KKyAgICBib29sIGlzT2tUb09wdGltaXplKCkgY29u
c3QgeyByZXR1cm4gIW5ldmVyT3B0aW1pemUoKTsgfQorICAgIGJvb2wgY2FuVXNlT1NSRXhpdEZ1
enppbmcoKSBjb25zdCB7IHJldHVybiBtX2NhblVzZU9TUkV4aXRGdXp6aW5nOyB9CisgICAgCisg
ICAgYm9vbCogYWRkcmVzc09mRGlkVHJ5VG9FbnRlckluTG9vcCgpIHsgcmV0dXJuICZtX2RpZFRy
eVRvRW50ZXJJbkxvb3A7IH0KKworICAgIENvZGVGZWF0dXJlcyBmZWF0dXJlcygpIGNvbnN0IHsg
cmV0dXJuIG1fZmVhdHVyZXM7IH0KKyAgICAgICAgCisgICAgREVDTEFSRV9FWFBPUlRfSU5GTzsK
KworICAgIHZvaWQgcmVjb3JkUGFyc2UoQ29kZUZlYXR1cmVzIGZlYXR1cmVzLCBib29sIGhhc0Nh
cHR1cmVkVmFyaWFibGVzLCBpbnQgZmlyc3RMaW5lLCBpbnQgbGFzdExpbmUsIHVuc2lnbmVkIHN0
YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4pCisgICAgeworICAgICAgICBtX2ZlYXR1cmVz
ID0gZmVhdHVyZXM7CisgICAgICAgIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMgPSBoYXNDYXB0dXJl
ZFZhcmlhYmxlczsKKyAgICAgICAgbV9maXJzdExpbmUgPSBmaXJzdExpbmU7CisgICAgICAgIG1f
bGFzdExpbmUgPSBsYXN0TGluZTsKKyAgICAgICAgQVNTRVJUKHN0YXJ0Q29sdW1uICE9IFVJTlRf
TUFYKTsKKyAgICAgICAgbV9zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOworICAgICAgICBBU1NF
UlQoZW5kQ29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICAgICAgbV9lbmRDb2x1bW4gPSBlbmRDb2x1
bW47CisgICAgfQorCisgICAgdm9pZCBpbnN0YWxsQ29kZShDb2RlQmxvY2sqKTsKKyAgICB2b2lk
IGluc3RhbGxDb2RlKFZNJiwgQ29kZUJsb2NrKiwgQ29kZVR5cGUsIENvZGVTcGVjaWFsaXphdGlv
bktpbmQpOworICAgIENvZGVCbG9jayogbmV3Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlv
bktpbmQsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgSlNPYmplY3QqJiBleGNlcHRpb24pOworICAg
IENvZGVCbG9jayogbmV3UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9u
S2luZCk7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyBhbiBpbnRlcmVzdGluZyBHQyBzdG9y
eS4gQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBhc2tpbmcgdXMgdG8gY3JlYXRlIGEgQ29k
ZUJsb2NrCisgICAgLy8gdGhhdCBpcyBub3QgamV0dGlzb25lZCBiZWZvcmUgdGhpcyBmdW5jdGlv
biByZXR1cm5zLiBDYWxsZXJzIGFyZSBlc3NlbnRpYWxseSBhc2tpbmcgZm9yIGEgc3Ryb25nIHJl
ZmVyZW5jZQorICAgIC8vIHRvIHRoZSBDb2RlQmxvY2suIEJlY2F1c2UgdGhlIEV4ZWN1dGFibGUg
bWF5IGJlIGFsbG9jYXRpbmcgdGhlIENvZGVCbG9jaywgd2UgcmVxdWlyZSBjYWxsZXJzIHRvIHBh
c3MgaW4KKyAgICAvLyB0aGVpciBDb2RlQmxvY2sqJiByZWZlcmVuY2UgYmVjYXVzZSBpdCdzIHNh
ZmUgZm9yIENvZGVCbG9jayB0byBiZSBqZXR0aXNvbmVkIGlmIEV4ZWN1dGFibGUgaXMgdGhlIG9u
bHkgdGhpbmcKKyAgICAvLyB0byBwb2ludCB0byBpdC4gVGhpcyBmb3JjZXMgY2FsbGVycyB0byBo
YXZlIGEgQ29kZUJsb2NrKiBpbiBhIHJlZ2lzdGVyIG9yIG9uIHRoZSBzdGFjayB0aGF0IHdpbGwg
YmUgbWFya2VkCisgICAgLy8gYnkgY29uc2VydmF0aXZlIEdDIGlmIGEgR0MgaGFwcGVucyBhZnRl
ciB3ZSBjcmVhdGUgdGhlIENvZGVCbG9jay4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhlY3V0
YWJsZVR5cGU+CisgICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb24oVk0mLCBKU0Z1bmN0
aW9uKiwgSlNTY29wZSosIENvZGVTcGVjaWFsaXphdGlvbktpbmQsIENvZGVCbG9jayomIHJlc3Vs
dENvZGVCbG9jayk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4gdm9pZCBmb3JF
YWNoQ29kZUJsb2NrKEZ1bmN0b3ImJik7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4
ZWN1dGFibGVCYXNlOworICAgIEpTT2JqZWN0KiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbChWTSYs
IEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2Nr
KiYpOworCitwcm90ZWN0ZWQ6CisgICAgU2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqLCBWTSYs
IGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4
dFR5cGUsIGJvb2wgaXNJbkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIElu
dHJpbnNpYyk7CisKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKKyAgICB7CisgICAg
ICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICAgICAgdm0uaGVhcC5hZGRFeGVjdXRh
YmxlKHRoaXMpOyAvLyBCYWxhbmNlZCBieSBIZWFwOjpkZWxldGVVbm1hcmtlZENvbXBpbGVkQ29k
ZSgpLgorCisjaWYgRU5BQkxFKENPREVCTE9DS19TQU1QTElORykKKyAgICAgICAgaWYgKFNhbXBs
aW5nVG9vbCogc2FtcGxlciA9IHZtLmludGVycHJldGVyLT5zYW1wbGVyKCkpCisgICAgICAgICAg
ICBzYW1wbGVyLT5ub3RpZnlPZlNjb3BlKHZtLCB0aGlzKTsKKyNlbmRpZgorICAgIH0KKworICAg
IENvZGVGZWF0dXJlcyBtX2ZlYXR1cmVzOworICAgIGJvb2wgbV9kaWRUcnlUb0VudGVySW5Mb29w
OworICAgIGJvb2wgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA6IDE7CisgICAgYm9vbCBtX25ldmVy
SW5saW5lIDogMTsKKyAgICBib29sIG1fbmV2ZXJPcHRpbWl6ZSA6IDE7CisgICAgYm9vbCBtX25l
dmVyRlRMT3B0aW1pemUgOiAxOworICAgIGJvb2wgbV9pc0Fycm93RnVuY3Rpb25Db250ZXh0IDog
MTsKKyAgICBib29sIG1fY2FuVXNlT1NSRXhpdEZ1enppbmcgOiAxOworICAgIHVuc2lnbmVkIG1f
ZGVyaXZlZENvbnRleHRUeXBlIDogMjsgLy8gRGVyaXZlZENvbnRleHRUeXBlCisgICAgdW5zaWdu
ZWQgbV9ldmFsQ29udGV4dFR5cGUgOiAyOyAvLyBFdmFsQ29udGV4dFR5cGUKKworICAgIGludCBt
X292ZXJyaWRlTGluZU51bWJlcjsKKyAgICBpbnQgbV9maXJzdExpbmU7CisgICAgaW50IG1fbGFz
dExpbmU7CisgICAgdW5zaWduZWQgbV9zdGFydENvbHVtbjsKKyAgICB1bnNpZ25lZCBtX2VuZENv
bHVtbjsKKyAgICB1bnNpZ25lZCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldDsKKyAgICB1bnNp
Z25lZCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQ7CisgICAgU291cmNlQ29kZSBtX3NvdXJjZTsK
K307CisKK2NsYXNzIEV2YWxFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFi
bGUgeworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6Cisg
ICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2ln
bmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0lt
bW9ydGFsOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIEV2YWxD
b2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAgeworICAgICAgICByZXR1cm4gbV9ldmFsQ29kZUJs
b2NrLmdldCgpOworICAgIH0KKworICAgIHN0YXRpYyBFdmFsRXhlY3V0YWJsZSogY3JlYXRlKEV4
ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJp
dmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRU
eXBlLCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50Kik7CisKKyAgICBQYXNzUmVmUHRyPEpJVENv
ZGU+IGdlbmVyYXRlZEpJVENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJ
VENvZGVGb3JDYWxsKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3Ry
dWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90
bykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2Jq
ZWN0LCBwcm90bywgVHlwZUluZm8oRXZhbEV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyks
IGluZm8oKSk7CisgICAgfQorICAgICAgICAKKyAgICBERUNMQVJFX0lORk87CisKKyAgICBFeGVj
dXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZv
KHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2lu
ZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTdXBlckJpbmRpbmc6Ok5vdE5l
ZWRlZCwgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCks
IGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIGV2YWxDb250ZXh0VHlwZSgpKTsgfQor
CisgICAgdW5zaWduZWQgbnVtVmFyaWFibGVzKCkgeyByZXR1cm4gbV91bmxpbmtlZEV2YWxDb2Rl
QmxvY2stPm51bVZhcmlhYmxlcygpOyB9CisgICAgdW5zaWduZWQgbnVtYmVyT2ZGdW5jdGlvbkRl
Y2xzKCkgeyByZXR1cm4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2stPm51bWJlck9mRnVuY3Rpb25E
ZWNscygpOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwor
ICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgRXZhbEV4ZWN1dGFibGUo
RXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaW5TdHJpY3RDb250ZXh0LCBEZXJp
dmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRU
eXBlKTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0
b3ImKTsKKworICAgIFdyaXRlQmFycmllcjxFdmFsQ29kZUJsb2NrPiBtX2V2YWxDb2RlQmxvY2s7
CisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRXZhbENvZGVCbG9jaz4gbV91bmxpbmtlZEV2YWxD
b2RlQmxvY2s7Cit9OworCitjbGFzcyBQcm9ncmFtRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBT
Y3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9y
OworcHVibGljOgorICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOworICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwg
U3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBQcm9ncmFtRXhlY3V0YWJsZSogY3Jl
YXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAgIHsKKyAg
ICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9j
YXRlQ2VsbDxQcm9ncmFtRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIFByb2dyYW1FeGVjdXRh
YmxlKGV4ZWMsIHNvdXJjZSk7CisgICAgICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKGV4
ZWMtPnZtKCkpOworICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKKyAgICB9CisKKworICAgIEpT
T2JqZWN0KiBpbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYsIENhbGxGcmFtZSosIEpTU2Nv
cGUqKTsKKworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBQcm9ncmFt
Q29kZUJsb2NrKiBjb2RlQmxvY2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcHJvZ3JhbUNv
ZGVCbG9jay5nZXQoKTsKKyAgICB9CisKKyAgICBKU09iamVjdCogY2hlY2tTeW50YXgoRXhlY1N0
YXRlKik7CisKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7CisgICAgfQorICAg
ICAgICAKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5m
byhQcm9ncmFtRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9
CisgICAgICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1
dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNT
dHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNl
clNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJz
ZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9u
Q29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lKTsgfQorCitwcml2YXRlOgor
ICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBmcmllbmQgY2xhc3MgU2NyaXB0
RXhlY3V0YWJsZTsKKworICAgIFByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNv
dXJjZUNvZGUmKTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xv
dFZpc2l0b3ImKTsKKworICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2s+
IG1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrOworICAgIFdyaXRlQmFycmllcjxQcm9ncmFtQ29k
ZUJsb2NrPiBtX3Byb2dyYW1Db2RlQmxvY2s7Cit9OworCitjbGFzcyBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xh
c3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgU2NyaXB0RXhl
Y3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9
IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRp
YyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJj
ZUNvZGUmKTsKKworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
bW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPEpJ
VENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRl
ZEpJVENvZGVGb3JDYWxsKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRl
U3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBw
cm90bykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFs
T2JqZWN0LCBwcm90bywgVHlwZUluZm8oTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlLCBTdHJ1
Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAgfQorCisgICAgREVDTEFSRV9JTkZPOworCisgICAg
RXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxl
SW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3Rv
cktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6TW9kdWxlLCBTdXBlckJpbmRpbmc6Ok5v
dE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpNb2R1bGVFdmFsdWF0ZU1vZGUsIGRlcml2ZWRDb250
ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5
cGU6Ok5vbmUpOyB9CisKKyAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHVubGlu
a2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaygpIHsgcmV0dXJuIG1fdW5saW5rZWRNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrLmdldCgpOyB9CisKKyAgICBTeW1ib2xUYWJsZSogbW9kdWxlRW52aXJvbm1l
bnRTeW1ib2xUYWJsZSgpIHsgcmV0dXJuIG1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5n
ZXQoKTsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAg
ICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKKworICAgIE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmKTsKKworICAgIHN0YXRpYyB2b2lk
IHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKworICAgIFdyaXRlQmFycmll
cjxVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fdW5saW5rZWRNb2R1bGVQcm9ncmFt
Q29kZUJsb2NrOworICAgIFdyaXRlQmFycmllcjxTeW1ib2xUYWJsZT4gbV9tb2R1bGVFbnZpcm9u
bWVudFN5bWJvbFRhYmxlOworICAgIFdyaXRlQmFycmllcjxNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
PiBtX21vZHVsZVByb2dyYW1Db2RlQmxvY2s7Cit9OworCitjbGFzcyBGdW5jdGlvbkV4ZWN1dGFi
bGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNzIEpJ
VDsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAg
IHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25l
ZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1v
cnRhbDsKKworICAgIHN0YXRpYyBGdW5jdGlvbkV4ZWN1dGFibGUqIGNyZWF0ZSgKKyAgICAgICAg
Vk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUsIAorICAgICAgICB1bnNpZ25lZCBmaXJzdExpbmUsIHVu
c2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1u
LCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgIHsKKyAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8RnVuY3Rpb25FeGVjdXRh
YmxlPih2bS5oZWFwKSkgRnVuY3Rpb25FeGVjdXRhYmxlKHZtLCBzb3VyY2UsIHVubGlua2VkRXhl
Y3V0YWJsZSwgZmlyc3RMaW5lLCBsYXN0TGluZSwgc3RhcnRDb2x1bW4sIGVuZENvbHVtbiwgaW50
cmluc2ljKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAg
ICByZXR1cm4gZXhlY3V0YWJsZTsKKyAgICB9CisgICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJs
ZSogZnJvbUdsb2JhbENvZGUoCisgICAgICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUsIEV4ZWNT
dGF0ZSYsIGNvbnN0IFNvdXJjZUNvZGUmLCAKKyAgICAgICAgSlNPYmplY3QqJiBleGNlcHRpb24s
IGludCBvdmVycmlkZUxpbmVOdW1iZXIpOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0Nl
bGwqKTsKKyAgICAgICAgCisgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2Vk
RXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV91bmxpbmtlZEV4ZWN1
dGFibGUuZ2V0KCk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyBlaXRoZXIgY2FsbCBvciBjb25z
dHJ1Y3QgYnl0ZWNvZGUuIFRoaXMgY2FuIGJlIGFwcHJvcHJpYXRlCisgICAgLy8gZm9yIGFuc3dl
cmluZyBxdWVzdGlvbnMgdGhhdCB0aGF0IGRvbid0IHZhcnkgYmV0d2VlbiBjYWxsIGFuZCBjb25z
dHJ1Y3QgLS0KKyAgICAvLyBmb3IgZXhhbXBsZSwgYXJndW1lbnRzUmVnaXN0ZXIoKS4KKyAgICBG
dW5jdGlvbkNvZGVCbG9jayogZWl0aGVyQ29kZUJsb2NrKCkKKyAgICB7CisgICAgICAgIGlmICht
X2NvZGVCbG9ja0ZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxs
LmdldCgpOworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Cisg
ICAgfQorICAgICAgICAKKyAgICBib29sIGlzR2VuZXJhdGVkRm9yQ2FsbCgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gISFtX2NvZGVCbG9ja0ZvckNhbGw7CisgICAgfQorCisgICAgRnVu
Y3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNhbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICB9CisKKyAgICBib29sIGlzR2VuZXJhdGVk
Rm9yQ29uc3RydWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0Zv
ckNvbnN0cnVjdC5nZXQoKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJs
b2NrRm9yQ29uc3RydWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNv
bnN0cnVjdC5nZXQoKTsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3Io
Q29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0g
Q29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZWRGb3JDYWxsKCk7Cisg
ICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4g
aXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisgICAgICAgIAorICAgIEZ1bmN0aW9u
Q29kZUJsb2NrKiBjb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAg
IHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4g
Y29kZUJsb2NrRm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3Ry
dWN0KTsKKyAgICAgICAgcmV0dXJuIGNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpOworICAgIH0KKwor
ICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6
YXRpb25LaW5kKTsKKyAgICAgICAgCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIHByb2ZpbGVkQ29k
ZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBiYXNlbGluZUNvZGVCbG9ja0ZvcihraW5kKTsKKyAgICB9CisKKyAgICBSZWZQdHI8VHlw
ZVNldD4gcmV0dXJuU3RhdGVtZW50VHlwZVNldCgpIAorICAgIHsKKyAgICAgICAgaWYgKCFtX3Jl
dHVyblN0YXRlbWVudFR5cGVTZXQpCisgICAgICAgICAgICBtX3JldHVyblN0YXRlbWVudFR5cGVT
ZXQgPSBUeXBlU2V0OjpjcmVhdGUoKTsKKworICAgICAgICByZXR1cm4gbV9yZXR1cm5TdGF0ZW1l
bnRUeXBlU2V0OworICAgIH0KKyAgICAgICAgCisgICAgRnVuY3Rpb25Nb2RlIGZ1bmN0aW9uTW9k
ZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbk1vZGUoKTsgfQorICAg
IGJvb2wgaXNCdWlsdGluRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0
YWJsZS0+aXNCdWlsdGluRnVuY3Rpb24oKTsgfQorICAgIENvbnN0cnVjdEFiaWxpdHkgY29uc3Ry
dWN0QWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5jb25zdHJ1
Y3RBYmlsaXR5KCk7IH0KKyAgICBib29sIGlzQ2xhc3MoKSBjb25zdCB7IHJldHVybiAhY2xhc3NT
b3VyY2UoKS5pc051bGwoKTsgfQorICAgIGJvb2wgaXNBcnJvd0Z1bmN0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpBcnJvd0Z1bmN0aW9uTW9kZTsg
fQorICAgIGJvb2wgaXNHZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3Vy
Y2VQYXJzZU1vZGU6OkdldHRlck1vZGU7IH0KKyAgICBib29sIGlzU2V0dGVyKCkgY29uc3QgeyBy
ZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpTZXR0ZXJNb2RlOyB9CisgICAg
Ym9vbCBpc0dlbmVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNldChTb3Vy
Y2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLCBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRv
cldyYXBwZXJGdW5jdGlvbk1vZGUpLmNvbnRhaW5zKHBhcnNlTW9kZSgpKTsgfQorICAgIGJvb2wg
aXNNZXRob2QoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6
Ok1ldGhvZE1vZGU7IH0KKyAgICBib29sIGhhc0NhbGxlckFuZEFyZ3VtZW50c1Byb3BlcnRpZXMo
KSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gUGVyIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNt
YTI2Mi8jc2VjLWZvcmJpZGRlbi1leHRlbnNpb25zLCBvbmx5IHNsb3BweS1tb2RlIG5vbi1idWls
dGluIGZ1bmN0aW9ucyBpbiBvbGQtc3R5bGUgKHByZS1FUzYpIHN5bnRhY3RpYyBmb3JtcyBjYW4g
Y29udGFpbgorICAgICAgICAvLyAiY2FsbGVyIiBhbmQgImFyZ3VtZW50cyIuCisgICAgICAgIHJl
dHVybiAhaXNTdHJpY3RNb2RlKCkgJiYgcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpO
b3JtYWxGdW5jdGlvbk1vZGUgJiYgIWlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7CisgICAg
fQorICAgIGJvb2wgaGFzUHJvdG90eXBlUHJvcGVydHkoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNldCgKKyAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6
Tm9ybWFsRnVuY3Rpb25Nb2RlLAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0
b3JCb2R5TW9kZSwKKyAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBl
ckZ1bmN0aW9uTW9kZQorICAgICAgICApLmNvbnRhaW5zKHBhcnNlTW9kZSgpKSB8fCBpc0NsYXNz
KCk7CisgICAgfQorICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBj
b25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCk7
IH0KKyAgICBib29sIGlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4g
bV91bmxpbmtlZEV4ZWN1dGFibGUtPmlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7IH0KKyAg
ICBjb25zdCBJZGVudGlmaWVyJiBuYW1lKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUt
Pm5hbWUoKTsgfQorICAgIGNvbnN0IElkZW50aWZpZXImIGVjbWFOYW1lKCkgeyByZXR1cm4gbV91
bmxpbmtlZEV4ZWN1dGFibGUtPmVjbWFOYW1lKCk7IH0KKyAgICBjb25zdCBJZGVudGlmaWVyJiBp
bmZlcnJlZE5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aW5mZXJyZWROYW1l
KCk7IH0KKyAgICB1bnNpZ25lZCBwYXJhbWV0ZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5s
aW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0ZXJDb3VudCgpOyB9IC8vIEV4Y2x1ZGluZyAndGhpcych
CisgICAgdW5zaWduZWQgZnVuY3Rpb25MZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2Vk
RXhlY3V0YWJsZS0+ZnVuY3Rpb25MZW5ndGgoKTsgfQorICAgIFNvdXJjZVBhcnNlTW9kZSBwYXJz
ZU1vZGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+cGFyc2VNb2RlKCk7
IH0KKyAgICBKU1BhcnNlclNjcmlwdE1vZGUgc2NyaXB0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1f
dW5saW5rZWRFeGVjdXRhYmxlLT5zY3JpcHRNb2RlKCk7IH0KKyAgICBjb25zdCBTb3VyY2VDb2Rl
JiBjbGFzc1NvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5jbGFz
c1NvdXJjZSgpOyB9CisKKyAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNs
b3RWaXNpdG9yJik7CisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2
bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7Cisg
ICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywg
VHlwZUluZm8oRnVuY3Rpb25FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkp
OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCgpIGNvbnN0IHsg
cmV0dXJuIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OyB9CisKKyAgICB2b2lkIG92ZXJyaWRlUGFy
YW1ldGVyQW5kVHlwZVByb2ZpbGluZ1N0YXJ0RW5kT2Zmc2V0cyh1bnNpZ25lZCBwYXJhbWV0ZXJz
U3RhcnRPZmZzZXQsIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgdW5zaWduZWQg
dHlwZVByb2ZpbGluZ0VuZE9mZnNldCkKKyAgICB7CisgICAgICAgIG1fcGFyYW1ldGVyc1N0YXJ0
T2Zmc2V0ID0gcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OworICAgICAgICBtX3R5cGVQcm9maWxpbmdT
dGFydE9mZnNldCA9IHR5cGVQcm9maWxpbmdTdGFydE9mZnNldDsKKyAgICAgICAgbV90eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0ID0gdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKKyAgICB9CisKKyAgICBE
RUNMQVJFX0lORk87CisKKyAgICBJbmZlcnJlZFZhbHVlKiBzaW5nbGV0b25GdW5jdGlvbigpIHsg
cmV0dXJuIG1fc2luZ2xldG9uRnVuY3Rpb24uZ2V0KCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmll
bmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgRnVuY3Rpb25FeGVjdXRhYmxlKAorICAgICAg
ICBWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSosIHVu
c2lnbmVkIGZpcnN0TGluZSwgCisgICAgICAgIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBz
dGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMpOworICAgIAorICAgIHZv
aWQgZmluaXNoQ3JlYXRpb24oVk0mKTsKKworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRh
YmxlOworICAgIAorICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OworICAgIFdy
aXRlQmFycmllcjxVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZT4gbV91bmxpbmtlZEV4ZWN1dGFi
bGU7CisgICAgV3JpdGVCYXJyaWVyPEZ1bmN0aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNh
bGw7CisgICAgV3JpdGVCYXJyaWVyPEZ1bmN0aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNv
bnN0cnVjdDsKKyAgICBSZWZQdHI8VHlwZVNldD4gbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0Owor
ICAgIFdyaXRlQmFycmllcjxJbmZlcnJlZFZhbHVlPiBtX3NpbmdsZXRvbkZ1bmN0aW9uOworfTsK
KworI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKK2NsYXNzIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSBm
aW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFeGVj
dXRhYmxlQmFzZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFn
cyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0
YXRpYyBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNv
ZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgp
CisgICAgeworICAgICAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcg
KE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxXZWJBc3NlbWJseUV4ZWN1dGFibGU+KHZtLmhlYXApKSBX
ZWJBc3NlbWJseUV4ZWN1dGFibGUodm0sIHNvdXJjZSwgbW9kdWxlLCBmdW5jdGlvbkluZGV4KTsK
KyAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICByZXR1cm4g
ZXhlY3V0YWJsZTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1
cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3Qs
IHByb3RvLCBUeXBlSW5mbyhXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFn
cyksIGluZm8oKSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsK
KworICAgIERFQ0xBUkVfSU5GTzsKKworICAgIHZvaWQgcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYp
OworCisgICAgV2ViQXNzZW1ibHlDb2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNhbGwoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZShWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBKU1dhc21Nb2R1bGUqLCB1bnNpZ25lZCBm
dW5jdGlvbkluZGV4KTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwg
U2xvdFZpc2l0b3ImKTsKKworICAgIFNvdXJjZUNvZGUgbV9zb3VyY2U7CisgICAgV3JpdGVCYXJy
aWVyPEpTV2FzbU1vZHVsZT4gbV9tb2R1bGU7CisgICAgdW5zaWduZWQgbV9mdW5jdGlvbkluZGV4
OworCisgICAgV3JpdGVCYXJyaWVyPFdlYkFzc2VtYmx5Q29kZUJsb2NrPiBtX2NvZGVCbG9ja0Zv
ckNhbGw7Cit9OworI2VuZGlmCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4K
K0pTT2JqZWN0KiBTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJiB2bSwg
SlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jaykKK3sKKyAgICBpZiAoaGFzSklU
Q29kZUZvcihraW5kKSkgeworICAgICAgICBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBl
LCBFdmFsRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0g
anNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxv
Y2soKSk7CisgICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgUHJv
Z3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpz
Q2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJs
b2NrKCkpOworICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxv
Y2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4o
dGhpcyktPmNvZGVCbG9jaygpKTsKKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1
dGFibGVUeXBlLCBGdW5jdGlvbkV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3Vs
dENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxl
Kj4odGhpcyktPmNvZGVCbG9ja0ZvcihraW5kKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOwor
ICAgIH0KKyAgICByZXR1cm4gcHJlcGFyZUZvckV4ZWN1dGlvbkltcGwodm0sIGZ1bmN0aW9uLCBz
Y29wZSwga2luZCwgcmVzdWx0Q29kZUJsb2NrKTsKK30KKworfSAvLyBuYW1lc3BhY2UgSlNDCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlQmFzZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGVCYXNlLmgJ
KHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1
dGFibGVCYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI0NSw1MzQgKzI0NSw0IEBAIHByb3RlY3Rl
ZDoKICAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFy
aXR5Q2hlY2s7CiB9OwogCi1jbGFzcyBOYXRpdmVFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4
ZWN1dGFibGVCYXNlIHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBM
TEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFz
ZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6
OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKLQotICAgIHN0YXRpYyBOYXRp
dmVFeGVjdXRhYmxlKiBjcmVhdGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVu
aywgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0
VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBj
b25zdCBTdHJpbmcmIG5hbWUpOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsK
LQotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25z
dDsKLQotICAgIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uKCkgeyByZXR1cm4gbV9mdW5jdGlvbjsg
fQotICAgIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yKCkgeyByZXR1cm4gbV9jb25zdHJ1Y3Rv
cjsgfQotICAgICAgICAKLSAgICBOYXRpdmVGdW5jdGlvbiBuYXRpdmVGdW5jdGlvbkZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2Rl
Rm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpOwotICAgICAgICBBU1NFUlQo
a2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKCk7
Ci0gICAgfQotICAgICAgICAKLSAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTmF0aXZlRnVu
Y3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYg
KGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9G
KE5hdGl2ZUV4ZWN1dGFibGUsIG1fZnVuY3Rpb24pOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVF
eGVjdXRhYmxlLCBtX2NvbnN0cnVjdG9yKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJl
KiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUgcHJvdG8pOwot
ICAgICAgICAKLSAgICBERUNMQVJFX0lORk87Ci0KLSAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBj
b25zdCB7IHJldHVybiBtX25hbWU7IH0KLQotcHJvdGVjdGVkOgotICAgIHZvaWQgZmluaXNoQ3Jl
YXRpb24oVk0mLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRD
b2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3RyaW5nJiBuYW1lKTsKLQotcHJpdmF0ZToKLSAg
ICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0KLSAgICBOYXRpdmVFeGVjdXRhYmxlKFZN
JiwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJ
bnRyaW5zaWMpOwotCi0gICAgTmF0aXZlRnVuY3Rpb24gbV9mdW5jdGlvbjsKLSAgICBOYXRpdmVG
dW5jdGlvbiBtX2NvbnN0cnVjdG9yOwotCi0gICAgU3RyaW5nIG1fbmFtZTsKLX07Ci0KLWNsYXNz
IFNjcmlwdEV4ZWN1dGFibGUgOiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgewotcHVibGljOgotICAg
IHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQg
U3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKLQotICAgIHN0YXRpYyB2b2lk
IGRlc3Ryb3koSlNDZWxsKik7Ci0gICAgICAgIAotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihD
b2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIGNvbnN0IFNvdXJjZUNvZGUmIHNv
dXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlOyB9Ci0gICAgaW50cHRyX3Qgc291cmNlSUQo
KSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcklEKCk7IH0KLSAgICBjb25zdCBTdHJp
bmcmIHNvdXJjZVVSTCgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlLnByb3ZpZGVyKCktPnVybCgp
OyB9Ci0gICAgaW50IGZpcnN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmlyc3RMaW5lOyB9Ci0g
ICAgdm9pZCBzZXRPdmVycmlkZUxpbmVOdW1iZXIoaW50IG92ZXJyaWRlTGluZU51bWJlcikgeyBt
X292ZXJyaWRlTGluZU51bWJlciA9IG92ZXJyaWRlTGluZU51bWJlcjsgfQotICAgIGJvb2wgaGFz
T3ZlcnJpZGVMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9vdmVycmlkZUxpbmVOdW1iZXIg
IT0gLTE7IH0KLSAgICBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9v
dmVycmlkZUxpbmVOdW1iZXI7IH0KLSAgICBpbnQgbGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBt
X2xhc3RMaW5lOyB9Ci0gICAgdW5zaWduZWQgc3RhcnRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBt
X3N0YXJ0Q29sdW1uOyB9Ci0gICAgdW5zaWduZWQgZW5kQ29sdW1uKCkgY29uc3QgeyByZXR1cm4g
bV9lbmRDb2x1bW47IH0KLSAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKSBj
b25zdCB7IHJldHVybiBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldDsgfQotICAgIHVuc2lnbmVk
IHR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3R5cGVQcm9maWxpbmdF
bmRPZmZzZXQ7IH0KLQotICAgIGJvb2wgdXNlc0V2YWwoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1
cmVzICYgRXZhbEZlYXR1cmU7IH0KLSAgICBib29sIHVzZXNBcmd1bWVudHMoKSBjb25zdCB7IHJl
dHVybiBtX2ZlYXR1cmVzICYgQXJndW1lbnRzRmVhdHVyZTsgfQotICAgIGJvb2wgaXNBcnJvd0Z1
bmN0aW9uQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dDsg
fQotICAgIGJvb2wgaXNTdHJpY3RNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIFN0
cmljdE1vZGVGZWF0dXJlOyB9Ci0gICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0
VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWRDb250ZXh0VHlwZT4obV9k
ZXJpdmVkQ29udGV4dFR5cGUpOyB9Ci0gICAgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlw
ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEV2YWxDb250ZXh0VHlwZT4obV9ldmFsQ29u
dGV4dFR5cGUpOyB9Ci0KLSAgICBFQ01BTW9kZSBlY21hTW9kZSgpIGNvbnN0IHsgcmV0dXJuIGlz
U3RyaWN0TW9kZSgpID8gU3RyaWN0TW9kZSA6IE5vdFN0cmljdE1vZGU7IH0KLSAgICAgICAgCi0g
ICAgdm9pZCBzZXROZXZlcklubGluZShib29sIHZhbHVlKSB7IG1fbmV2ZXJJbmxpbmUgPSB2YWx1
ZTsgfQotICAgIHZvaWQgc2V0TmV2ZXJPcHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJPcHRp
bWl6ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXROZXZlckZUTE9wdGltaXplKGJvb2wgdmFsdWUp
IHsgbV9uZXZlckZUTE9wdGltaXplID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldERpZFRyeVRvRW50
ZXJJbkxvb3AoYm9vbCB2YWx1ZSkgeyBtX2RpZFRyeVRvRW50ZXJJbkxvb3AgPSB2YWx1ZTsgfQot
ICAgIHZvaWQgc2V0Q2FuVXNlT1NSRXhpdEZ1enppbmcoYm9vbCB2YWx1ZSkgeyBtX2NhblVzZU9T
UkV4aXRGdXp6aW5nID0gdmFsdWU7IH0KLSAgICBib29sIG5ldmVySW5saW5lKCkgY29uc3QgeyBy
ZXR1cm4gbV9uZXZlcklubGluZTsgfQotICAgIGJvb2wgbmV2ZXJPcHRpbWl6ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fbmV2ZXJPcHRpbWl6ZTsgfQotICAgIGJvb2wgbmV2ZXJGVExPcHRpbWl6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fbmV2ZXJGVExPcHRpbWl6ZTsgfQotICAgIGJvb2wgZGlkVHJ5VG9FbnRl
ckluTG9vcCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQotICAgIGJv
b2wgaXNJbmxpbmluZ0NhbmRpZGF0ZSgpIGNvbnN0IHsgcmV0dXJuICFuZXZlcklubGluZSgpOyB9
Ci0gICAgYm9vbCBpc09rVG9PcHRpbWl6ZSgpIGNvbnN0IHsgcmV0dXJuICFuZXZlck9wdGltaXpl
KCk7IH0KLSAgICBib29sIGNhblVzZU9TUkV4aXRGdXp6aW5nKCkgY29uc3QgeyByZXR1cm4gbV9j
YW5Vc2VPU1JFeGl0RnV6emluZzsgfQotICAgIAotICAgIGJvb2wqIGFkZHJlc3NPZkRpZFRyeVRv
RW50ZXJJbkxvb3AoKSB7IHJldHVybiAmbV9kaWRUcnlUb0VudGVySW5Mb29wOyB9Ci0KLSAgICBD
b2RlRmVhdHVyZXMgZmVhdHVyZXMoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzOyB9Ci0gICAg
ICAgIAotICAgIERFQ0xBUkVfRVhQT1JUX0lORk87Ci0KLSAgICB2b2lkIHJlY29yZFBhcnNlKENv
ZGVGZWF0dXJlcyBmZWF0dXJlcywgYm9vbCBoYXNDYXB0dXJlZFZhcmlhYmxlcywgaW50IGZpcnN0
TGluZSwgaW50IGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29s
dW1uKQotICAgIHsKLSAgICAgICAgbV9mZWF0dXJlcyA9IGZlYXR1cmVzOwotICAgICAgICBtX2hh
c0NhcHR1cmVkVmFyaWFibGVzID0gaGFzQ2FwdHVyZWRWYXJpYWJsZXM7Ci0gICAgICAgIG1fZmly
c3RMaW5lID0gZmlyc3RMaW5lOwotICAgICAgICBtX2xhc3RMaW5lID0gbGFzdExpbmU7Ci0gICAg
ICAgIEFTU0VSVChzdGFydENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgICAgIG1fc3RhcnRDb2x1
bW4gPSBzdGFydENvbHVtbjsKLSAgICAgICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7
Ci0gICAgICAgIG1fZW5kQ29sdW1uID0gZW5kQ29sdW1uOwotICAgIH0KLQotICAgIHZvaWQgaW5z
dGFsbENvZGUoQ29kZUJsb2NrKik7Ci0gICAgdm9pZCBpbnN0YWxsQ29kZShWTSYsIENvZGVCbG9j
ayosIENvZGVUeXBlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKLSAgICBDb2RlQmxvY2sqIG5l
d0NvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBKU0Z1bmN0aW9uKiwgSlNTY29w
ZSosIEpTT2JqZWN0KiYgZXhjZXB0aW9uKTsKLSAgICBDb2RlQmxvY2sqIG5ld1JlcGxhY2VtZW50
Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwotCi0gICAgLy8gVGhpcyBmdW5j
dGlvbiBoYXMgYW4gaW50ZXJlc3RpbmcgR0Mgc3RvcnkuIENhbGxlcnMgb2YgdGhpcyBmdW5jdGlv
biBhcmUgYXNraW5nIHVzIHRvIGNyZWF0ZSBhIENvZGVCbG9jawotICAgIC8vIHRoYXQgaXMgbm90
IGpldHRpc29uZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gQ2FsbGVycyBhcmUgZXNz
ZW50aWFsbHkgYXNraW5nIGZvciBhIHN0cm9uZyByZWZlcmVuY2UKLSAgICAvLyB0byB0aGUgQ29k
ZUJsb2NrLiBCZWNhdXNlIHRoZSBFeGVjdXRhYmxlIG1heSBiZSBhbGxvY2F0aW5nIHRoZSBDb2Rl
QmxvY2ssIHdlIHJlcXVpcmUgY2FsbGVycyB0byBwYXNzIGluCi0gICAgLy8gdGhlaXIgQ29kZUJs
b2NrKiYgcmVmZXJlbmNlIGJlY2F1c2UgaXQncyBzYWZlIGZvciBDb2RlQmxvY2sgdG8gYmUgamV0
dGlzb25lZCBpZiBFeGVjdXRhYmxlIGlzIHRoZSBvbmx5IHRoaW5nCi0gICAgLy8gdG8gcG9pbnQg
dG8gaXQuIFRoaXMgZm9yY2VzIGNhbGxlcnMgdG8gaGF2ZSBhIENvZGVCbG9jayogaW4gYSByZWdp
c3RlciBvciBvbiB0aGUgc3RhY2sgdGhhdCB3aWxsIGJlIG1hcmtlZAotICAgIC8vIGJ5IGNvbnNl
cnZhdGl2ZSBHQyBpZiBhIEdDIGhhcHBlbnMgYWZ0ZXIgd2UgY3JlYXRlIHRoZSBDb2RlQmxvY2su
Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgotICAgIEpTT2JqZWN0KiBw
cmVwYXJlRm9yRXhlY3V0aW9uKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lh
bGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2spOwotCi0gICAgdGVtcGxh
dGUgPHR5cGVuYW1lIEZ1bmN0b3I+IHZvaWQgZm9yRWFjaENvZGVCbG9jayhGdW5jdG9yJiYpOwot
Ci1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBKU09iamVj
dCogcHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoVk0mLCBKU0Z1bmN0aW9uKiwgSlNTY29wZSosIENv
ZGVTcGVjaWFsaXphdGlvbktpbmQsIENvZGVCbG9jayomKTsKLQotcHJvdGVjdGVkOgotICAgIFNj
cmlwdEV4ZWN1dGFibGUoU3RydWN0dXJlKiwgVk0mLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBp
c0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzSW5BcnJvd0Z1bmN0
aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMpOwotCi0gICAgdm9pZCBmaW5p
c2hDcmVhdGlvbihWTSYgdm0pCi0gICAgewotICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2
bSk7Ci0gICAgICAgIHZtLmhlYXAuYWRkRXhlY3V0YWJsZSh0aGlzKTsgLy8gQmFsYW5jZWQgYnkg
SGVhcDo6ZGVsZXRlVW5tYXJrZWRDb21waWxlZENvZGUoKS4KLQotI2lmIEVOQUJMRShDT0RFQkxP
Q0tfU0FNUExJTkcpCi0gICAgICAgIGlmIChTYW1wbGluZ1Rvb2wqIHNhbXBsZXIgPSB2bS5pbnRl
cnByZXRlci0+c2FtcGxlcigpKQotICAgICAgICAgICAgc2FtcGxlci0+bm90aWZ5T2ZTY29wZSh2
bSwgdGhpcyk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBDb2RlRmVhdHVyZXMgbV9mZWF0dXJlczsK
LSAgICBib29sIG1fZGlkVHJ5VG9FbnRlckluTG9vcDsKLSAgICBib29sIG1faGFzQ2FwdHVyZWRW
YXJpYWJsZXMgOiAxOwotICAgIGJvb2wgbV9uZXZlcklubGluZSA6IDE7Ci0gICAgYm9vbCBtX25l
dmVyT3B0aW1pemUgOiAxOwotICAgIGJvb2wgbV9uZXZlckZUTE9wdGltaXplIDogMTsKLSAgICBi
b29sIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dCA6IDE7Ci0gICAgYm9vbCBtX2NhblVzZU9TUkV4
aXRGdXp6aW5nIDogMTsKLSAgICB1bnNpZ25lZCBtX2Rlcml2ZWRDb250ZXh0VHlwZSA6IDI7IC8v
IERlcml2ZWRDb250ZXh0VHlwZQotICAgIHVuc2lnbmVkIG1fZXZhbENvbnRleHRUeXBlIDogMjsg
Ly8gRXZhbENvbnRleHRUeXBlCi0KLSAgICBpbnQgbV9vdmVycmlkZUxpbmVOdW1iZXI7Ci0gICAg
aW50IG1fZmlyc3RMaW5lOwotICAgIGludCBtX2xhc3RMaW5lOwotICAgIHVuc2lnbmVkIG1fc3Rh
cnRDb2x1bW47Ci0gICAgdW5zaWduZWQgbV9lbmRDb2x1bW47Ci0gICAgdW5zaWduZWQgbV90eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQ7Ci0gICAgdW5zaWduZWQgbV90eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0OwotICAgIFNvdXJjZUNvZGUgbV9zb3VyY2U7Ci19OwotCi1jbGFzcyBFdmFsRXhlY3V0YWJs
ZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKLSAgICBmcmllbmQgY2xhc3MgTExJ
bnRPZmZzZXRzRXh0cmFjdG9yOwotcHVibGljOgotICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJs
ZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6
OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKLQotICAgIHN0YXRpYyB2b2lk
IGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBFdmFsQ29kZUJsb2NrKiBjb2RlQmxvY2soKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIG1fZXZhbENvZGVCbG9jay5nZXQoKTsKLSAgICB9Ci0KLSAgICBz
dGF0aWMgRXZhbEV4ZWN1dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2Rl
JiwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJy
b3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSwgY29uc3QgVmFyaWFibGVFbnZpcm9u
bWVudCopOwotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgIH0KLQot
ICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2Jq
ZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4g
U3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKEV2YWxF
eGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLSAgICAgICAg
Ci0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8o
KSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUo
KSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9k
ZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJv
Z3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCks
IGZhbHNlLCBldmFsQ29udGV4dFR5cGUoKSk7IH0KLQotICAgIHVuc2lnbmVkIG51bVZhcmlhYmxl
cygpIHsgcmV0dXJuIG1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLT5udW1WYXJpYWJsZXMoKTsgfQot
ICAgIHVuc2lnbmVkIG51bWJlck9mRnVuY3Rpb25EZWNscygpIHsgcmV0dXJuIG1fdW5saW5rZWRF
dmFsQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgfQotCi1wcml2YXRlOgotICAg
IGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhl
Y3V0YWJsZTsKLQotICAgIEV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNv
ZGUmLCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJy
b3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCB2
aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBXcml0ZUJhcnJpZXI8
RXZhbENvZGVCbG9jaz4gbV9ldmFsQ29kZUJsb2NrOwotICAgIFdyaXRlQmFycmllcjxVbmxpbmtl
ZEV2YWxDb2RlQmxvY2s+IG1fdW5saW5rZWRFdmFsQ29kZUJsb2NrOwotfTsKLQotY2xhc3MgUHJv
Z3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJp
ZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNj
cmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJl
RmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAg
ICBzdGF0aWMgUHJvZ3JhbUV4ZWN1dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0
IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBl
eGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8UHJvZ3JhbUV4ZWN1dGFibGU+
KCpleGVjLT5oZWFwKCkpKSBQcm9ncmFtRXhlY3V0YWJsZShleGVjLCBzb3VyY2UpOwotICAgICAg
ICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52bSgpKTsKLSAgICAgICAgcmV0dXJu
IGV4ZWN1dGFibGU7Ci0gICAgfQotCi0KLSAgICBKU09iamVjdCogaW5pdGlhbGl6ZUdsb2JhbFBy
b3BlcnRpZXMoVk0mLCBDYWxsRnJhbWUqLCBKU1Njb3BlKik7Ci0KLSAgICBzdGF0aWMgdm9pZCBk
ZXN0cm95KEpTQ2VsbCopOwotCi0gICAgUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrKCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBtX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgfQotCi0g
ICAgSlNPYmplY3QqIGNoZWNrU3ludGF4KEV4ZWNTdGF0ZSopOwotCi0gICAgUGFzc1JlZlB0cjxK
SVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0
ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgc3RhdGljIFN0cnVjdHVy
ZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwg
SlNWYWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2
bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oUHJvZ3JhbUV4ZWN1dGFibGVUeXBlLCBT
dHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotICAgICAgICAKLSAgICBERUNMQVJFX0lO
Rk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJu
IEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2Us
IENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTdXBl
ckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgZGVyaXZl
ZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2YWxDb250
ZXh0VHlwZTo6Tm9uZSk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJs
ZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBQcm9ncmFt
RXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMg
dm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBXcml0ZUJh
cnJpZXI8VW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrPiBtX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9j
azsKLSAgICBXcml0ZUJhcnJpZXI8UHJvZ3JhbUNvZGVCbG9jaz4gbV9wcm9ncmFtQ29kZUJsb2Nr
OwotfTsKLQotY2xhc3MgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2Ny
aXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsK
LXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0
cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
IGNyZWF0ZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMgdm9p
ZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogY29kZUJs
b2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX21vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0
KCk7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkK
LSAgICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgIH0K
LQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFs
T2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1
cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAg
IH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJ
bmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RN
b2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlw
dE1vZGU6Ok1vZHVsZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6
TW9kdWxlRXZhbHVhdGVNb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9u
Q29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lKTsgfQotCi0gICAgVW5saW5r
ZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2so
KSB7IHJldHVybiBtX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsgfQotCi0g
ICAgU3ltYm9sVGFibGUqIG1vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUoKSB7IHJldHVybiBt
X21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuZ2V0KCk7IH0KLQotcHJpdmF0ZToKLSAgICBm
cmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1
dGFibGU7Ci0KLSAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBT
b3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNs
b3RWaXNpdG9yJik7Ci0KLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRNb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrPiBtX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJp
ZXI8U3ltYm9sVGFibGU+IG1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZTsKLSAgICBXcml0
ZUJhcnJpZXI8TW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
OwotfTsKLQotY2xhc3MgRnVuY3Rpb25FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4
ZWN1dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50
T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUg
QmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpT
dHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgRnVuY3Rp
b25FeGVjdXRhYmxlKiBjcmVhdGUoCi0gICAgICAgIFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYg
c291cmNlLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlLCAK
LSAgICAgICAgdW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQg
c3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykKLSAg
ICB7Ci0gICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVs
bCwgYWxsb2NhdGVDZWxsPEZ1bmN0aW9uRXhlY3V0YWJsZT4odm0uaGVhcCkpIEZ1bmN0aW9uRXhl
Y3V0YWJsZSh2bSwgc291cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUsIGZpcnN0TGluZSwgbGFzdExp
bmUsIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4sIGludHJpbnNpYyk7Ci0gICAgICAgIGV4ZWN1dGFi
bGUtPmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci0gICAg
fQotICAgIHN0YXRpYyBGdW5jdGlvbkV4ZWN1dGFibGUqIGZyb21HbG9iYWxDb2RlKAotICAgICAg
ICBjb25zdCBJZGVudGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmLCBjb25zdCBTb3VyY2VDb2RlJiwg
Ci0gICAgICAgIEpTT2JqZWN0KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKTsK
LQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0gICAgICAgIAotICAgIFVubGlu
a2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUoKSBjb25zdAotICAgIHsK
LSAgICAgICAgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLmdldCgpOwotICAgIH0KLQotICAg
IC8vIFJldHVybnMgZWl0aGVyIGNhbGwgb3IgY29uc3RydWN0IGJ5dGVjb2RlLiBUaGlzIGNhbiBi
ZSBhcHByb3ByaWF0ZQotICAgIC8vIGZvciBhbnN3ZXJpbmcgcXVlc3Rpb25zIHRoYXQgdGhhdCBk
b24ndCB2YXJ5IGJldHdlZW4gY2FsbCBhbmQgY29uc3RydWN0IC0tCi0gICAgLy8gZm9yIGV4YW1w
bGUsIGFyZ3VtZW50c1JlZ2lzdGVyKCkuCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGVpdGhlckNv
ZGVCbG9jaygpCi0gICAgewotICAgICAgICBpZiAobV9jb2RlQmxvY2tGb3JDYWxsKQotICAgICAg
ICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICAgICAgcmV0dXJuIG1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBp
c0dlbmVyYXRlZEZvckNhbGwoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICEhbV9jb2Rl
QmxvY2tGb3JDYWxsOwotICAgIH0KLQotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tG
b3JDYWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7
Ci0gICAgfQotCi0gICAgYm9vbCBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpIGNvbnN0Ci0gICAg
ewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgfQot
Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpCi0gICAgewot
ICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgfQotICAg
ICAgICAKLSAgICBib29sIGlzR2VuZXJhdGVkRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2lu
ZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICAgICAg
cmV0dXJuIGlzR2VuZXJhdGVkRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2Rl
Rm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVkRm9yQ29uc3RydWN0KCk7
Ci0gICAgfQotICAgICAgICAKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yKENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENv
ZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJuIGNvZGVCbG9ja0ZvckNhbGwoKTsKLSAgICAg
ICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBjb2Rl
QmxvY2tGb3JDb25zdHJ1Y3QoKTsKLSAgICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayogYmFz
ZWxpbmVDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgICAgIAotICAg
IEZ1bmN0aW9uQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICByZXR1cm4gYmFzZWxpbmVDb2RlQmxvY2tGb3Io
a2luZCk7Ci0gICAgfQotCi0gICAgUmVmUHRyPFR5cGVTZXQ+IHJldHVyblN0YXRlbWVudFR5cGVT
ZXQoKSAKLSAgICB7Ci0gICAgICAgIGlmICghbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KQotICAg
ICAgICAgICAgbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0ID0gVHlwZVNldDo6Y3JlYXRlKCk7Ci0K
LSAgICAgICAgcmV0dXJuIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldDsKLSAgICB9Ci0gICAgICAg
IAotICAgIEZ1bmN0aW9uTW9kZSBmdW5jdGlvbk1vZGUoKSB7IHJldHVybiBtX3VubGlua2VkRXhl
Y3V0YWJsZS0+ZnVuY3Rpb25Nb2RlKCk7IH0KLSAgICBib29sIGlzQnVpbHRpbkZ1bmN0aW9uKCkg
Y29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmlzQnVpbHRpbkZ1bmN0aW9uKCk7
IH0KLSAgICBDb25zdHJ1Y3RBYmlsaXR5IGNvbnN0cnVjdEFiaWxpdHkoKSBjb25zdCB7IHJldHVy
biBtX3VubGlua2VkRXhlY3V0YWJsZS0+Y29uc3RydWN0QWJpbGl0eSgpOyB9Ci0gICAgYm9vbCBp
c0NsYXNzKCkgY29uc3QgeyByZXR1cm4gIWNsYXNzU291cmNlKCkuaXNOdWxsKCk7IH0KLSAgICBi
b29sIGlzQXJyb3dGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJj
ZVBhcnNlTW9kZTo6QXJyb3dGdW5jdGlvbk1vZGU7IH0KLSAgICBib29sIGlzR2V0dGVyKCkgY29u
c3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpHZXR0ZXJNb2RlOyB9
Ci0gICAgYm9vbCBpc1NldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJj
ZVBhcnNlTW9kZTo6U2V0dGVyTW9kZTsgfQotICAgIGJvb2wgaXNHZW5lcmF0b3IoKSBjb25zdCB7
IHJldHVybiBTb3VyY2VQYXJzZU1vZGVTZXQoU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JCb2R5
TW9kZSwgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlKS5jb250
YWlucyhwYXJzZU1vZGUoKSk7IH0KLSAgICBib29sIGlzTWV0aG9kKCkgY29uc3QgeyByZXR1cm4g
cGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpNZXRob2RNb2RlOyB9Ci0gICAgYm9vbCBo
YXNDYWxsZXJBbmRBcmd1bWVudHNQcm9wZXJ0aWVzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIC8v
IFBlciBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3JiaWRkZW4tZXh0ZW5z
aW9ucywgb25seSBzbG9wcHktbW9kZSBub24tYnVpbHRpbiBmdW5jdGlvbnMgaW4gb2xkLXN0eWxl
IChwcmUtRVM2KSBzeW50YWN0aWMgZm9ybXMgY2FuIGNvbnRhaW4KLSAgICAgICAgLy8gImNhbGxl
ciIgYW5kICJhcmd1bWVudHMiLgotICAgICAgICByZXR1cm4gIWlzU3RyaWN0TW9kZSgpICYmIHBh
cnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6Tm9ybWFsRnVuY3Rpb25Nb2RlICYmICFpc0Ns
YXNzQ29uc3RydWN0b3JGdW5jdGlvbigpOwotICAgIH0KLSAgICBib29sIGhhc1Byb3RvdHlwZVBy
b3BlcnR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBTb3VyY2VQYXJzZU1vZGVTZXQo
Ci0gICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSwKLSAgICAg
ICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsCi0gICAgICAgICAgICBT
b3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvcldyYXBwZXJGdW5jdGlvbk1vZGUKLSAgICAgICAgKS5j
b250YWlucyhwYXJzZU1vZGUoKSkgfHwgaXNDbGFzcygpOwotICAgIH0KLSAgICBEZXJpdmVkQ29u
dGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4
ZWN1dGFibGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpOyB9Ci0gICAgYm9vbCBpc0NsYXNzQ29uc3Ry
dWN0b3JGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pc0Ns
YXNzQ29uc3RydWN0b3JGdW5jdGlvbigpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSgp
IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5uYW1lKCk7IH0KLSAgICBjb25zdCBJZGVu
dGlmaWVyJiBlY21hTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5lY21hTmFt
ZSgpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYgaW5mZXJyZWROYW1lKCkgeyByZXR1cm4gbV91
bmxpbmtlZEV4ZWN1dGFibGUtPmluZmVycmVkTmFtZSgpOyB9Ci0gICAgdW5zaWduZWQgcGFyYW1l
dGVyQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+cGFyYW1ldGVy
Q291bnQoKTsgfSAvLyBFeGNsdWRpbmcgJ3RoaXMnIQotICAgIHVuc2lnbmVkIGZ1bmN0aW9uTGVu
Z3RoKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTGVuZ3Ro
KCk7IH0KLSAgICBTb3VyY2VQYXJzZU1vZGUgcGFyc2VNb2RlKCkgY29uc3QgeyByZXR1cm4gbV91
bmxpbmtlZEV4ZWN1dGFibGUtPnBhcnNlTW9kZSgpOyB9Ci0gICAgSlNQYXJzZXJTY3JpcHRNb2Rl
IHNjcmlwdE1vZGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+c2NyaXB0
TW9kZSgpOyB9Ci0gICAgY29uc3QgU291cmNlQ29kZSYgY2xhc3NTb3VyY2UoKSBjb25zdCB7IHJl
dHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+Y2xhc3NTb3VyY2UoKTsgfQotCi0gICAgc3RhdGlj
IHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotICAgIHN0YXRpYyBT
dHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpj
cmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKEZ1bmN0aW9uRXhlY3V0YWJs
ZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBw
YXJhbWV0ZXJzU3RhcnRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3BhcmFtZXRlcnNTdGFydE9m
ZnNldDsgfQotCi0gICAgdm9pZCBvdmVycmlkZVBhcmFtZXRlckFuZFR5cGVQcm9maWxpbmdTdGFy
dEVuZE9mZnNldHModW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQsIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdFbmRPZmZzZXQpCi0g
ICAgewotICAgICAgICBtX3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHBhcmFtZXRlcnNTdGFydE9m
ZnNldDsKLSAgICAgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSB0eXBlUHJvZmlsaW5n
U3RhcnRPZmZzZXQ7Ci0gICAgICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHR5cGVQcm9m
aWxpbmdFbmRPZmZzZXQ7Ci0gICAgfQotCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgSW5mZXJy
ZWRWYWx1ZSogc2luZ2xldG9uRnVuY3Rpb24oKSB7IHJldHVybiBtX3NpbmdsZXRvbkZ1bmN0aW9u
LmdldCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwot
ICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSgKLSAgICAgICAgVk0mLCBjb25zdCBTb3VyY2VDb2RlJiwg
VW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqLCB1bnNpZ25lZCBmaXJzdExpbmUsIAotICAgICAg
ICB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENv
bHVtbiwgSW50cmluc2ljKTsKLSAgICAKLSAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJik7Ci0K
LSAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKLSAgICAKLSAgICB1bnNpZ25lZCBt
X3BhcmFtZXRlcnNTdGFydE9mZnNldDsKLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRGdW5jdGlv
bkV4ZWN1dGFibGU+IG1fdW5saW5rZWRFeGVjdXRhYmxlOwotICAgIFdyaXRlQmFycmllcjxGdW5j
dGlvbkNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOwotICAgIFdyaXRlQmFycmllcjxGdW5j
dGlvbkNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3Q7Ci0gICAgUmVmUHRyPFR5cGVT
ZXQ+IG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldDsKLSAgICBXcml0ZUJhcnJpZXI8SW5mZXJyZWRW
YWx1ZT4gbV9zaW5nbGV0b25GdW5jdGlvbjsKLX07Ci0KLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkp
Ci1jbGFzcyBXZWJBc3NlbWJseUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhlY3V0YWJsZUJh
c2UgewotcHVibGljOgotICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKLSAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8
IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgV2ViQXNzZW1ibHlFeGVjdXRhYmxl
KiBjcmVhdGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSog
bW9kdWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQotICAgIHsKLSAgICAgICAgV2ViQXNzZW1i
bHlFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8V2Vi
QXNzZW1ibHlFeGVjdXRhYmxlPih2bS5oZWFwKSkgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKHZtLCBz
b3VyY2UsIG1vZHVsZSwgZnVuY3Rpb25JbmRleCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPmZpbmlz
aENyZWF0aW9uKHZtKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci0gICAgfQotCi0gICAg
c3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3Qq
IGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJ1
Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oV2ViQXNzZW1i
bHlFeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLQotICAg
IHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBERUNMQVJFX0lORk87Ci0KLSAg
ICB2b2lkIHByZXBhcmVGb3JFeGVjdXRpb24oVk0mKTsKLQotICAgIFdlYkFzc2VtYmx5Q29kZUJs
b2NrKiBjb2RlQmxvY2tGb3JDYWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9j
a0ZvckNhbGwuZ2V0KCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVj
dXRhYmxlQmFzZTsKLSAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUoVk0mLCBjb25zdCBTb3VyY2VD
b2RlJiwgSlNXYXNtTW9kdWxlKiwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCk7Ci0KLSAgICBzdGF0
aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBTb3Vy
Y2VDb2RlIG1fc291cmNlOwotICAgIFdyaXRlQmFycmllcjxKU1dhc21Nb2R1bGU+IG1fbW9kdWxl
OwotICAgIHVuc2lnbmVkIG1fZnVuY3Rpb25JbmRleDsKLQotICAgIFdyaXRlQmFycmllcjxXZWJB
c3NlbWJseUNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOwotfTsKLSNlbmRpZgotCi10ZW1w
bGF0ZSA8dHlwZW5hbWUgRXhlY3V0YWJsZVR5cGU+Ci1KU09iamVjdCogU2NyaXB0RXhlY3V0YWJs
ZTo6cHJlcGFyZUZvckV4ZWN1dGlvbihWTSYgdm0sIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBKU1Nj
b3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBDb2RlQmxvY2sqJiByZXN1
bHRDb2RlQmxvY2spCi17Ci0gICAgaWYgKGhhc0pJVENvZGVGb3Ioa2luZCkpIHsKLSAgICAgICAg
aWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRXZhbEV4ZWN1dGFibGU+Ojp2YWx1ZSkK
LSAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8
RXZhbEV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNlIGlmIChz
dGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIFByb2dyYW1FeGVjdXRhYmxlPjo6dmFsdWUpCi0g
ICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PFBy
b2dyYW1FeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBpZiAo
c3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZT46OnZh
bHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpz
Q2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0gICAg
ICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRnVuY3Rpb25FeGVjdXRh
YmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJs
b2NrKj4oanNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2tGb3Ioa2lu
ZCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZXBhcmVG
b3JFeGVjdXRpb25JbXBsKHZtLCBmdW5jdGlvbiwgc2NvcGUsIGtpbmQsIHJlc3VsdENvZGVCbG9j
ayk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9GdW5jdGlvbkV4ZWN1dGFibGUuY3BwCShyZXZpc2lvbiAyMDc3
OTApCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3BwOjIw
Nzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJs
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDksIDIwMTAsIDIwMTMsIDIwMTUtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgorCisjaW5jbHVkZSAiQmF0
Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCIKKyNpbmNsdWRlICJDb2RlQmxvY2suaCIKKyNpbmNs
dWRlICJEZWJ1Z2dlci5oIgorI2luY2x1ZGUgIkpJVC5oIgorI2luY2x1ZGUgIkpTQ0lubGluZXMu
aCIKKyNpbmNsdWRlICJKU1dhc21Nb2R1bGUuaCIKKyNpbmNsdWRlICJMTEludEVudHJ5cG9pbnQu
aCIKKyNpbmNsdWRlICJQYXJzZXIuaCIKKyNpbmNsdWRlICJUeXBlUHJvZmlsZXIuaCIKKyNpbmNs
dWRlICJWTUlubGluZXMuaCIKKyNpbmNsdWRlIDx3dGYvQ29tbWFQcmludGVyLmg+CisKK25hbWVz
cGFjZSBKU0MgeworCitjb25zdCBDbGFzc0luZm8gRXhlY3V0YWJsZUJhc2U6OnNfaW5mbyA9IHsg
IkV4ZWN1dGFibGUiLCAwLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEV4ZWN1dGFibGVCYXNlKSB9
OworCit2b2lkIEV4ZWN1dGFibGVCYXNlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBz
dGF0aWNfY2FzdDxFeGVjdXRhYmxlQmFzZSo+KGNlbGwpLT5FeGVjdXRhYmxlQmFzZTo6fkV4ZWN1
dGFibGVCYXNlKCk7Cit9CisKK3ZvaWQgRXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSgpCit7Cisj
aWYgRU5BQkxFKEpJVCkKKyAgICBtX2ppdENvZGVGb3JDYWxsID0gbnVsbHB0cjsKKyAgICBtX2pp
dENvZGVGb3JDb25zdHJ1Y3QgPSBudWxscHRyOworICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJp
dHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOworICAgIG1faml0Q29kZUZvckNvbnN0
cnVjdFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7CisjZW5kaWYKKyAg
ICBtX251bVBhcmFtZXRlcnNGb3JDYWxsID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwor
ICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01Q
SUxFRDsKKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8o
KSkgeworICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVu
Y3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2Nr
Rm9yQ2FsbC5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0
cnVjdC5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5m
bygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgRXZhbEV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhl
Y3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLmNsZWFyKCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1f
dW5saW5rZWRFdmFsQ29kZUJsb2NrLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsK
KyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4
ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2Nr
LmNsZWFyKCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2Nr
LmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkg
PT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2su
Y2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2suY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVFbnZpcm9ubWVudFN5
bWJvbFRhYmxlLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisjaWYgRU5B
QkxFKFdFQkFTU0VNQkxZKQorICAgIGlmIChjbGFzc0luZm8oKSA9PSBXZWJBc3NlbWJseUV4ZWN1
dGFibGU6OmluZm8oKSkgeworICAgICAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1
dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAg
fQorI2VuZGlmCisKKyAgICBBU1NFUlQoY2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6
aW5mbygpKTsKK30KKworY29uc3QgQ2xhc3NJbmZvIE5hdGl2ZUV4ZWN1dGFibGU6OnNfaW5mbyA9
IHsgIk5hdGl2ZUV4ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRF
X01FVEhPRF9UQUJMRShOYXRpdmVFeGVjdXRhYmxlKSB9OworCitOYXRpdmVFeGVjdXRhYmxlKiBO
YXRpdmVFeGVjdXRhYmxlOjpjcmVhdGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxU
aHVuaywgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3Ry
dWN0VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2lj
LCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgTmF0aXZlRXhlY3V0YWJsZSogZXhlY3V0YWJs
ZTsKKyAgICBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8TmF0aXZlRXhl
Y3V0YWJsZT4odm0uaGVhcCkpIE5hdGl2ZUV4ZWN1dGFibGUodm0sIGZ1bmN0aW9uLCBjb25zdHJ1
Y3RvciwgaW50cmluc2ljKTsKKyAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSwgY2Fs
bFRodW5rLCBjb25zdHJ1Y3RUaHVuaywgbmFtZSk7CisgICAgcmV0dXJuIGV4ZWN1dGFibGU7Cit9
CisKK3ZvaWQgTmF0aXZlRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAg
c3RhdGljX2Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+KGNlbGwpLT5OYXRpdmVFeGVjdXRhYmxlOjp+
TmF0aXZlRXhlY3V0YWJsZSgpOworfQorCitTdHJ1Y3R1cmUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNy
ZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFs
dWUgcHJvdG8pCit7CisgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmpl
Y3QsIHByb3RvLCBUeXBlSW5mbyhDZWxsVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwor
fQorCit2b2lkIE5hdGl2ZUV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgUGFzc1Jl
ZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1
bmssIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7
CisgICAgbV9qaXRDb2RlRm9yQ2FsbCA9IGNhbGxUaHVuazsKKyAgICBtX2ppdENvZGVGb3JDb25z
dHJ1Y3QgPSBjb25zdHJ1Y3RUaHVuazsKKyAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hl
Y2sgPSBtX2ppdENvZGVGb3JDYWxsLT5hZGRyZXNzRm9yQ2FsbChNdXN0Q2hlY2tBcml0eSk7Cisg
ICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENvZGVGb3JDb25z
dHJ1Y3QtPmFkZHJlc3NGb3JDYWxsKE11c3RDaGVja0FyaXR5KTsKKyAgICBtX25hbWUgPSBuYW1l
OworfQorCitOYXRpdmVFeGVjdXRhYmxlOjpOYXRpdmVFeGVjdXRhYmxlKFZNJiB2bSwgTmF0aXZl
RnVuY3Rpb24gZnVuY3Rpb24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMg
aW50cmluc2ljKQorICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZtLm5hdGl2ZUV4ZWN1dGFibGVT
dHJ1Y3R1cmUuZ2V0KCksIE5VTV9QQVJBTUVURVJTX0lTX0hPU1QsIGludHJpbnNpYykKKyAgICAs
IG1fZnVuY3Rpb24oZnVuY3Rpb24pCisgICAgLCBtX2NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKQor
eworfQorCitjb25zdCBDbGFzc0luZm8gU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvID0geyAiU2Ny
aXB0RXhlY3V0YWJsZSIsICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9E
X1RBQkxFKFNjcmlwdEV4ZWN1dGFibGUpIH07CisKK1NjcmlwdEV4ZWN1dGFibGU6OlNjcmlwdEV4
ZWN1dGFibGUoU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYg
c291cmNlLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZl
ZENvbnRleHRUeXBlLCBib29sIGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRU
eXBlIGV2YWxDb250ZXh0VHlwZSwgSW50cmluc2ljIGludHJpbnNpYykKKyAgICA6IEV4ZWN1dGFi
bGVCYXNlKHZtLCBzdHJ1Y3R1cmUsIE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCwgaW50cmlu
c2ljKQorICAgICwgbV9mZWF0dXJlcyhpc0luU3RyaWN0Q29udGV4dCA/IFN0cmljdE1vZGVGZWF0
dXJlIDogMCkKKyAgICAsIG1fZGlkVHJ5VG9FbnRlckluTG9vcChmYWxzZSkKKyAgICAsIG1faGFz
Q2FwdHVyZWRWYXJpYWJsZXMoZmFsc2UpCisgICAgLCBtX25ldmVySW5saW5lKGZhbHNlKQorICAg
ICwgbV9uZXZlck9wdGltaXplKGZhbHNlKQorICAgICwgbV9uZXZlckZUTE9wdGltaXplKGZhbHNl
KQorICAgICwgbV9pc0Fycm93RnVuY3Rpb25Db250ZXh0KGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4
dCkKKyAgICAsIG1fY2FuVXNlT1NSRXhpdEZ1enppbmcodHJ1ZSkKKyAgICAsIG1fZGVyaXZlZENv
bnRleHRUeXBlKHN0YXRpY19jYXN0PHVuc2lnbmVkPihkZXJpdmVkQ29udGV4dFR5cGUpKQorICAg
ICwgbV9ldmFsQ29udGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGV2YWxDb250ZXh0VHlw
ZSkpCisgICAgLCBtX292ZXJyaWRlTGluZU51bWJlcigtMSkKKyAgICAsIG1fZmlyc3RMaW5lKC0x
KQorICAgICwgbV9sYXN0TGluZSgtMSkKKyAgICAsIG1fc3RhcnRDb2x1bW4oVUlOVF9NQVgpCisg
ICAgLCBtX2VuZENvbHVtbihVSU5UX01BWCkKKyAgICAsIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0KFVJTlRfTUFYKQorICAgICwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KFVJTlRfTUFYKQor
ICAgICwgbV9zb3VyY2Uoc291cmNlKQoreworfQorCit2b2lkIFNjcmlwdEV4ZWN1dGFibGU6OmRl
c3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PFNjcmlwdEV4ZWN1dGFibGUq
PihjZWxsKS0+U2NyaXB0RXhlY3V0YWJsZTo6flNjcmlwdEV4ZWN1dGFibGUoKTsKK30KKwordm9p
ZCBTY3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZShDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sK
KyAgICBpbnN0YWxsQ29kZSgqY29kZUJsb2NrLT52bSgpLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+
Y29kZVR5cGUoKSwgY29kZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQoKSk7Cit9CisKK3ZvaWQg
U2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFsbENvZGUoVk0mIHZtLCBDb2RlQmxvY2sqIGdlbmVyaWND
b2RlQmxvY2ssIENvZGVUeXBlIGNvZGVUeXBlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
Cit7CisgICAgQVNTRVJUKHZtLmhlYXAuaXNEZWZlcnJlZCgpKTsKKyAgICAKKyAgICBpZiAoZ2Vu
ZXJpY0NvZGVCbG9jaykKKyAgICAgICAgQ09ERUJMT0NLX0xPR19FVkVOVChnZW5lcmljQ29kZUJs
b2NrLCAiaW5zdGFsbENvZGUiLCAoKSk7CisgICAgCisgICAgQ29kZUJsb2NrKiBvbGRDb2RlQmxv
Y2sgPSBudWxscHRyOworICAgIAorICAgIHN3aXRjaCAoY29kZVR5cGUpIHsKKyAgICBjYXNlIEds
b2JhbENvZGU6IHsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nh
c3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayog
Y29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxv
Y2spOworICAgICAgICAKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAg
ICAgICAKKyAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJs
b2NrLmdldCgpOworICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suc2V0TWF5
QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAg
ICBjYXNlIE1vZHVsZUNvZGU6IHsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAg
ICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8TW9kdWxl
UHJvZ3JhbUNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOworCisgICAgICAgIEFTU0VSVChr
aW5kID09IENvZGVGb3JDYWxsKTsKKworICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxl
LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1f
bW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7
CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRXZhbENvZGU6IHsKKyAgICAgICAg
RXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlz
KTsKKyAgICAgICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RXZhbENv
ZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOworICAgICAgICAKKyAgICAgICAgQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICAKKyAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhl
Y3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLmdldCgpOworICAgICAgICBleGVjdXRhYmxlLT5tX2V2
YWxDb2RlQmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICBi
cmVhazsKKyAgICB9CisgICAgICAgIAorICAgIGNhc2UgRnVuY3Rpb25Db2RlOiB7CisgICAgICAg
IEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFi
bGUqPih0aGlzKTsKKyAgICAgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRp
Y19jYXN0PEZ1bmN0aW9uQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisgICAgICAgIAor
ICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAg
ICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5nZXQo
KTsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5zZXRNYXlCZU51
bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJs
ZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAgICAgICAgICBleGVjdXRhYmxl
LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9j
ayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9
CisgICAgfQorCisgICAgc3dpdGNoIChraW5kKSB7CisgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAg
ICAgICAgbV9qaXRDb2RlRm9yQ2FsbCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJs
b2NrLT5qaXRDb2RlKCkgOiBudWxscHRyOworICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFy
aXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKKyAgICAgICAgbV9udW1QYXJhbWV0
ZXJzRm9yQ2FsbCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJh
bWV0ZXJzKCkgOiBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKKyAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0
ID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxw
dHI7CisgICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gTWFjcm9B
c3NlbWJsZXJDb2RlUHRyKCk7CisgICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9
IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBO
VU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAg
IGlmIChnZW5lcmljQ29kZUJsb2NrKSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGdlbmVyaWND
b2RlQmxvY2stPm93bmVyRXhlY3V0YWJsZSgpID09IHRoaXMpOworICAgICAgICBSRUxFQVNFX0FT
U0VSVChKSVRDb2RlOjppc0V4ZWN1dGFibGVTY3JpcHQoZ2VuZXJpY0NvZGVCbG9jay0+aml0VHlw
ZSgpKSk7CisgICAgICAgIAorICAgICAgICBpZiAoT3B0aW9uczo6dmVyYm9zZU9TUigpKQorICAg
ICAgICAgICAgZGF0YUxvZygiSW5zdGFsbGluZyAiLCAqZ2VuZXJpY0NvZGVCbG9jaywgIlxuIik7
CisgICAgICAgIAorICAgICAgICBpZiAodm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyKQorICAgICAg
ICAgICAgdm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyLT5lbnN1cmVCeXRlY29kZXNGb3IoZ2VuZXJp
Y0NvZGVCbG9jayk7CisgICAgICAgIAorICAgICAgICBpZiAoRGVidWdnZXIqIGRlYnVnZ2VyID0g
Z2VuZXJpY0NvZGVCbG9jay0+Z2xvYmFsT2JqZWN0KCktPmRlYnVnZ2VyKCkpCisgICAgICAgICAg
ICBkZWJ1Z2dlci0+cmVnaXN0ZXJDb2RlQmxvY2soZ2VuZXJpY0NvZGVCbG9jayk7CisgICAgfQor
CisgICAgaWYgKG9sZENvZGVCbG9jaykKKyAgICAgICAgb2xkQ29kZUJsb2NrLT51bmxpbmtJbmNv
bWluZ0NhbGxzKCk7CisKKyAgICB2bS5oZWFwLndyaXRlQmFycmllcih0aGlzKTsKK30KKworQ29k
ZUJsb2NrKiBTY3JpcHRFeGVjdXRhYmxlOjpuZXdDb2RlQmxvY2tGb3IoCisgICAgQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUs
IEpTT2JqZWN0KiYgZXhjZXB0aW9uKQoreworICAgIFZNKiB2bSA9IHNjb3BlLT52bSgpOworICAg
IGF1dG8gdGhyb3dTY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUoKnZtKTsKKworICAgIEFTU0VS
VCh2bS0+aGVhcC5pc0RlZmVycmVkKCkpOworICAgIEFTU0VSVChzdGFydENvbHVtbigpICE9IFVJ
TlRfTUFYKTsKKyAgICBBU1NFUlQoZW5kQ29sdW1uKCkgIT0gVUlOVF9NQVgpOworCisgICAgaWYg
KGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgRXZhbEV4
ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2spOworICAgICAgICBSRUxFQVNF
X0FTU0VSVCghZnVuY3Rpb24pOworICAgICAgICByZXR1cm4gRXZhbENvZGVCbG9jazo6Y3JlYXRl
KHZtLAorICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxD
b2RlQmxvY2suZ2V0KCksIHNjb3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCku
cHJvdmlkZXIoKSk7CisgICAgfQorICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFt
RXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhl
Y3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1
bmN0aW9uKTsKKyAgICAgICAgcmV0dXJuIFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKKyAg
ICAgICAgICAgIGV4ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJs
b2NrLmdldCgpLCBzY29wZSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3Zp
ZGVyKCksIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOworICAgIH0KKworICAg
IGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Cisg
ICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQg
PT0gQ29kZUZvckNhbGwpOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9t
b2R1bGVQcm9ncmFtQ29kZUJsb2NrKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9u
KTsKKyAgICAgICAgcmV0dXJuIE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKKyAg
ICAgICAgICAgIGV4ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFt
Q29kZUJsb2NrLmdldCgpLCBzY29wZSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgp
LnByb3ZpZGVyKCksIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOworICAgIH0K
KworICAgIFJFTEVBU0VfQVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6
aW5mbygpKTsKKyAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbik7CisgICAgRnVuY3Rpb25FeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwor
ICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCkpOworICAg
IEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+Z2xvYmFsT2JqZWN0KCk7Cisg
ICAgUGFyc2VyRXJyb3IgZXJyb3I7CisgICAgRGVidWdnZXJNb2RlIGRlYnVnZ2VyTW9kZSA9IGds
b2JhbE9iamVjdC0+aGFzSW50ZXJhY3RpdmVEZWJ1Z2dlcigpID8gRGVidWdnZXJPbiA6IERlYnVn
Z2VyT2ZmOworICAgIFVubGlua2VkRnVuY3Rpb25Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2Nr
ID0gCisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT51bmxpbmtlZENv
ZGVCbG9ja0ZvcigKKyAgICAgICAgICAgICp2bSwgZXhlY3V0YWJsZS0+bV9zb3VyY2UsIGtpbmQs
IGRlYnVnZ2VyTW9kZSwgZXJyb3IsIAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+cGFyc2VNb2Rl
KCkpOworICAgIHJlY29yZFBhcnNlKAorICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhl
Y3V0YWJsZS0+ZmVhdHVyZXMoKSwgCisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVj
dXRhYmxlLT5oYXNDYXB0dXJlZFZhcmlhYmxlcygpLCBmaXJzdExpbmUoKSwgCisgICAgICAgIGxh
c3RMaW5lKCksIHN0YXJ0Q29sdW1uKCksIGVuZENvbHVtbigpKTsgCisgICAgaWYgKCF1bmxpbmtl
ZENvZGVCbG9jaykgeworICAgICAgICBleGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbigKKyAgICAg
ICAgICAgIGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpLCB0aHJvd1Njb3BlLAorICAgICAgICAg
ICAgZXJyb3IudG9FcnJvck9iamVjdChnbG9iYWxPYmplY3QsIGV4ZWN1dGFibGUtPm1fc291cmNl
KSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIFNvdXJjZVByb3ZpZGVy
KiBwcm92aWRlciA9IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCk7CisgICAgdW5zaWdu
ZWQgc291cmNlT2Zmc2V0ID0gZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRPZmZzZXQoKTsKKyAg
ICB1bnNpZ25lZCBzdGFydENvbHVtbiA9IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1u
KCk7CisKKyAgICByZXR1cm4gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKKyAgICAgICAg
ZXhlY3V0YWJsZSwgdW5saW5rZWRDb2RlQmxvY2ssIHNjb3BlLCBwcm92aWRlciwgc291cmNlT2Zm
c2V0LCBzdGFydENvbHVtbik7Cit9CisKK0NvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3
UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3IoCisgICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
KQoreworICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBFdmFs
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOwor
ICAgICAgICBFdmFsQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxv
Y2sqPigKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay0+YmFzZWxpbmVW
ZXJzaW9uKCkpOworICAgICAgICBFdmFsQ29kZUJsb2NrKiByZXN1bHQgPSBFdmFsQ29kZUJsb2Nr
OjpjcmVhdGUodm0oKSwKKyAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAq
YmFzZWxpbmUpOworICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGlu
ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFJFTEVBU0VfQVNT
RVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBQcm9n
cmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPigK
KyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJz
aW9uKCkpOworICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiByZXN1bHQgPSBQcm9ncmFtQ29kZUJs
b2NrOjpjcmVhdGUodm0oKSwKKyAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2Nr
LCAqYmFzZWxpbmUpOworICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNl
bGluZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5m
bygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhp
cyk7CisgICAgICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nh
c3Q8TW9kdWxlUHJvZ3JhbUNvZGVCbG9jayo+KAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9t
b2R1bGVQcm9ncmFtQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7CisgICAgICAgIE1vZHVs
ZVByb2dyYW1Db2RlQmxvY2sqIHJlc3VsdCA9IE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0
ZSh2bSgpLAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGlu
ZSk7CisgICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0lu
Zm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSk7CisgICAgRnVuY3Rpb25FeGVjdXRh
YmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOworICAg
IEZ1bmN0aW9uQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29kZUJs
b2NrKj4oCisgICAgICAgIGV4ZWN1dGFibGUtPmNvZGVCbG9ja0ZvcihraW5kKS0+YmFzZWxpbmVW
ZXJzaW9uKCkpOworICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiByZXN1bHQgPSBGdW5jdGlvbkNvZGVC
bG9jazo6Y3JlYXRlKHZtKCksCisgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAq
YmFzZWxpbmUpOworICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsK
KyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzZXR1cExMSW50KFZNJiB2bSwg
Q29kZUJsb2NrKiBjb2RlQmxvY2spCit7CisgICAgTExJbnQ6OnNldEVudHJ5cG9pbnQodm0sIGNv
ZGVCbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwSklUKFZNJiB2bSwgQ29kZUJsb2NrKiBj
b2RlQmxvY2spCit7CisjaWYgRU5BQkxFKEpJVCkKKyAgICBDb21waWxhdGlvblJlc3VsdCByZXN1
bHQgPSBKSVQ6OmNvbXBpbGUoJnZtLCBjb2RlQmxvY2ssIEpJVENvbXBpbGF0aW9uTXVzdFN1Y2Nl
ZWQpOworICAgIFJFTEVBU0VfQVNTRVJUKHJlc3VsdCA9PSBDb21waWxhdGlvblN1Y2Nlc3NmdWwp
OworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0odm0pOworICAgIFVOVVNFRF9QQVJBTShjb2RlQmxv
Y2spOworICAgIFVOUkVBQ0hBQkxFX0ZPUl9QTEFURk9STSgpOworI2VuZGlmCit9CisKK0pTT2Jq
ZWN0KiBTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCgKKyAgICBWTSYg
dm0sIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0
aW9uS2luZCBraW5kLCBDb2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2spCit7CisgICAgRGVmZXJH
Q0ZvckFXaGlsZSBkZWZlckdDKHZtLmhlYXApOworCisgICAgaWYgKHZtLmdldEFuZENsZWFyRmFp
bE5leHROZXdDb2RlQmxvY2soKSkKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKHNjb3BlLT5n
bG9iYWxPYmplY3QoKS0+Z2xvYmFsRXhlYygpLCBBU0NJSUxpdGVyYWwoIkZvcmNlZCBGYWlsdXJl
IikpOworCisgICAgSlNPYmplY3QqIGV4Y2VwdGlvbiA9IDA7CisgICAgQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBuZXdDb2RlQmxvY2tGb3Ioa2luZCwgZnVuY3Rpb24sIHNjb3BlLCBleGNlcHRpb24p
OworICAgIHJlc3VsdENvZGVCbG9jayA9IGNvZGVCbG9jazsKKyAgICBpZiAoIWNvZGVCbG9jaykg
eworICAgICAgICBSRUxFQVNFX0FTU0VSVChleGNlcHRpb24pOworICAgICAgICByZXR1cm4gZXhj
ZXB0aW9uOworICAgIH0KKyAgICAKKyAgICBpZiAoT3B0aW9uczo6dmFsaWRhdGVCeXRlY29kZSgp
KQorICAgICAgICBjb2RlQmxvY2stPnZhbGlkYXRlKCk7CisgICAgCisgICAgaWYgKE9wdGlvbnM6
OnVzZUxMSW50KCkpCisgICAgICAgIHNldHVwTExJbnQodm0sIGNvZGVCbG9jayk7CisgICAgZWxz
ZQorICAgICAgICBzZXR1cEpJVCh2bSwgY29kZUJsb2NrKTsKKyAgICAKKyAgICBpbnN0YWxsQ29k
ZSh2bSwgY29kZUJsb2NrLCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lh
bGl6YXRpb25LaW5kKCkpOworICAgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBDbGFzc0lu
Zm8gRXZhbEV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIkV2YWxFeGVjdXRhYmxlIiwgJlNjcmlwdEV4
ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShFdmFsRXhlY3V0YWJsZSkg
fTsKKworRXZhbEV4ZWN1dGFibGUqIEV2YWxFeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBl
eGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERl
cml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9u
Q29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSwgY29uc3QgVmFyaWFibGVF
bnZpcm9ubWVudCogdmFyaWFibGVzVW5kZXJURFopCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0o
KTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CisKKyAgICBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwor
ICAgIGlmICghZ2xvYmFsT2JqZWN0LT5ldmFsRW5hYmxlZCgpKSB7CisgICAgICAgIHRocm93RXhj
ZXB0aW9uKGV4ZWMsIHNjb3BlLCBjcmVhdGVFdmFsRXJyb3IoZXhlYywgZ2xvYmFsT2JqZWN0LT5l
dmFsRGlzYWJsZWRFcnJvck1lc3NhZ2UoKSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisK
KyAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVD
ZWxsPEV2YWxFeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgRXZhbEV4ZWN1dGFibGUoZXhlYywg
c291cmNlLCBpc0luU3RyaWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVu
Y3Rpb25Db250ZXh0LCBldmFsQ29udGV4dFR5cGUpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENy
ZWF0aW9uKHZtKTsKKworICAgIFVubGlua2VkRXZhbENvZGVCbG9jayogdW5saW5rZWRFdmFsQ29k
ZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlRXZhbENvZGVCbG9jayhleGVjLCBleGVjdXRhYmxlLCB2
YXJpYWJsZXNVbmRlclREWik7CisgICAgaWYgKCF1bmxpbmtlZEV2YWxDb2RlKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLnNldCh2
bSwgZXhlY3V0YWJsZSwgdW5saW5rZWRFdmFsQ29kZSk7CisKKyAgICByZXR1cm4gZXhlY3V0YWJs
ZTsKK30KKworRXZhbEV4ZWN1dGFibGU6OkV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywg
Y29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVyaXZlZENv
bnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlKQorICAgIDogU2NyaXB0RXhlY3V0YWJs
ZShleGVjLT52bSgpLmV2YWxFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBz
b3VyY2UsIGluU3RyaWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rp
b25Db250ZXh0LCBldmFsQ29udGV4dFR5cGUsIE5vSW50cmluc2ljKQoreworICAgIEFTU0VSVChz
b3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlw
ZTo6UHJvZ3JhbSk7Cit9CisKK3ZvaWQgRXZhbEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBj
ZWxsKQoreworICAgIHN0YXRpY19jYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCktPkV2YWxFeGVj
dXRhYmxlOjp+RXZhbEV4ZWN1dGFibGUoKTsKK30KKworY29uc3QgQ2xhc3NJbmZvIFByb2dyYW1F
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRh
YmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoUHJvZ3JhbUV4ZWN1dGFibGUpIH07
CisKK1Byb2dyYW1FeGVjdXRhYmxlOjpQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKKyAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+
dm0oKS5wcm9ncmFtRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNl
LCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBl
OjpOb25lLCBOb0ludHJpbnNpYykKK3sKKyAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNv
dXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOworICAgIG1f
dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gMDsKKyAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZz
ZXQgPSBzb3VyY2UubGVuZ3RoKCkgLSAxOworICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxl
cigpIHx8IGV4ZWMtPnZtKCkuY29udHJvbEZsb3dQcm9maWxlcigpKQorICAgICAgICBleGVjLT52
bSgpLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291
cmNlSUQoKSwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9m
ZnNldCk7Cit9CisKK3ZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxs
KQoreworICAgIHN0YXRpY19jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPlByb2dyYW1F
eGVjdXRhYmxlOjp+UHJvZ3JhbUV4ZWN1dGFibGUoKTsKK30KKworY29uc3QgQ2xhc3NJbmZvIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUpIH07CisKK01vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNv
dXJjZSkKKyAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZl
ZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJp
bnNpYykKK3sKKyAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBT
b3VyY2VQcm92aWRlclNvdXJjZVR5cGU6Ok1vZHVsZSk7CisgICAgbV90eXBlUHJvZmlsaW5nU3Rh
cnRPZmZzZXQgPSAwOworICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5n
dGgoKSAtIDE7CisgICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0o
KS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpCisgICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNF
eGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQ
cm9maWxpbmdTdGFydE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKK30KKworTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCit7CisgICAgSlNHbG9iYWxP
YmplY3QqIGdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKKyAgICBN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2Nh
dGVDZWxsPE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgTW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKKyAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVh
dGlvbihleGVjLT52bSgpKTsKKworICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayog
dW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlTW9kdWxlUHJv
Z3JhbUNvZGVCbG9jayhleGVjLCBleGVjdXRhYmxlKTsKKyAgICBpZiAoIXVubGlua2VkTW9kdWxl
UHJvZ3JhbUNvZGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIGV4ZWN1dGFibGUtPm1f
dW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxl
LCB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlKTsKKworICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxl
RW52aXJvbm1lbnRTeW1ib2xUYWJsZS5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwganNDYXN0
PFN5bWJvbFRhYmxlKj4odW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+Y29uc3RhbnRSZWdpc3Rl
cih1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxl
Q29uc3RhbnRSZWdpc3Rlck9mZnNldCgpKS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0KGV4ZWMtPnZt
KCkpKTsKKworICAgIHJldHVybiBleGVjdXRhYmxlOworfQorCit2b2lkIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2FzdDxNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6fk1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBGdW5jdGlvbkV4
ZWN1dGFibGU6OnNfaW5mbyA9IHsgIkZ1bmN0aW9uRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRh
YmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVjdXRhYmxlKSB9
OworCitGdW5jdGlvbkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0
IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2Vk
RXhlY3V0YWJsZSwgdW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWdu
ZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykK
KyAgICA6IFNjcmlwdEV4ZWN1dGFibGUodm0uZnVuY3Rpb25FeGVjdXRhYmxlU3RydWN0dXJlLmdl
dCgpLCB2bSwgc291cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmlzSW5TdHJpY3RDb250ZXh0KCks
IHVubGlua2VkRXhlY3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCksIGZhbHNlLCBFdmFsQ29u
dGV4dFR5cGU6Ok5vbmUsIGludHJpbnNpYykKKyAgICAsIG1fdW5saW5rZWRFeGVjdXRhYmxlKHZt
LCB0aGlzLCB1bmxpbmtlZEV4ZWN1dGFibGUpCit7CisgICAgUkVMRUFTRV9BU1NFUlQoIXNvdXJj
ZS5pc051bGwoKSk7CisgICAgQVNTRVJUKHNvdXJjZS5sZW5ndGgoKSk7CisgICAgbV9maXJzdExp
bmUgPSBmaXJzdExpbmU7CisgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOworICAgIEFTU0VSVChz
dGFydENvbHVtbiAhPSBVSU5UX01BWCk7CisgICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01B
WCk7CisgICAgbV9zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOworICAgIG1fZW5kQ29sdW1uID0g
ZW5kQ29sdW1uOworICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRh
YmxlLT5wYXJhbWV0ZXJzU3RhcnRPZmZzZXQoKTsKKyAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9m
ZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCk7Cisg
ICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0KCk7Cit9CisKK3ZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hD
cmVhdGlvbihWTSYgdm0pCit7CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgIG1f
c2luZ2xldG9uRnVuY3Rpb24uc2V0KHZtLCB0aGlzLCBJbmZlcnJlZFZhbHVlOjpjcmVhdGUodm0p
KTsKK30KKwordm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQor
eworICAgIHN0YXRpY19jYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5GdW5jdGlvbkV4
ZWN1dGFibGU6On5GdW5jdGlvbkV4ZWN1dGFibGUoKTsKK30KKworaW5saW5lIGNvbnN0IGNoYXIq
IHNhbXBsaW5nRGVzY3JpcHRpb24oSklUQ29kZTo6SklUVHlwZSBqaXRUeXBlKQoreworICAgIHN3
aXRjaCAoaml0VHlwZSkgeworICAgIGNhc2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJUaHVuazoKKyAg
ICAgICAgcmV0dXJuICJJbnRlcnByZXRlciBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAgICBjYXNl
IEpJVENvZGU6OkJhc2VsaW5lSklUOgorICAgICAgICByZXR1cm4gIkJhc2VsaW5lIENvbXBpbGF0
aW9uIChUT1RBTCkiOworICAgIGNhc2UgSklUQ29kZTo6REZHSklUOgorICAgICAgICByZXR1cm4g
IkRGRyBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAgICBjYXNlIEpJVENvZGU6OkZUTEpJVDoKKyAg
ICAgICAgcmV0dXJuICJGVEwgQ29tcGlsYXRpb24gKFRPVEFMKSI7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorfQorCit2b2lkIEV2YWxFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2Vs
bCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgRXZhbEV4ZWN1dGFibGUqIHRoaXNPYmpl
Y3QgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNU
X0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlz
aXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhp
c09iamVjdC0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2spOworICAgIGlmICh0aGlzT2JqZWN0LT5t
X2V2YWxDb2RlQmxvY2spCisgICAgICAgIHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9jay0+dmlz
aXRXZWFrbHkodmlzaXRvcik7Cit9CisKK0pTT2JqZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6Y2hl
Y2tTeW50YXgoRXhlY1N0YXRlKiBleGVjKQoreworICAgIFBhcnNlckVycm9yIGVycm9yOworICAg
IFZNKiB2bSA9ICZleGVjLT52bSgpOworICAgIEpTR2xvYmFsT2JqZWN0KiBsZXhpY2FsR2xvYmFs
T2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOworICAgIHN0ZDo6dW5pcXVlX3B0
cjxQcm9ncmFtTm9kZT4gcHJvZ3JhbU5vZGUgPSBwYXJzZTxQcm9ncmFtTm9kZT4oCisgICAgICAg
IHZtLCBtX3NvdXJjZSwgSWRlbnRpZmllcigpLCBKU1BhcnNlckJ1aWx0aW5Nb2RlOjpOb3RCdWls
dGluLAorICAgICAgICBKU1BhcnNlclN0cmljdE1vZGU6Ok5vdFN0cmljdCwgSlNQYXJzZXJTY3Jp
cHRNb2RlOjpDbGFzc2ljLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBTdXBlckJpbmRp
bmc6Ok5vdE5lZWRlZCwgZXJyb3IpOworICAgIGlmIChwcm9ncmFtTm9kZSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgQVNTRVJUKGVycm9yLmlzVmFsaWQoKSk7CisgICAgcmV0dXJuIGVycm9yLnRv
RXJyb3JPYmplY3QobGV4aWNhbEdsb2JhbE9iamVjdCwgbV9zb3VyY2UpOworfQorCitKU09iamVj
dCogUHJvZ3JhbUV4ZWN1dGFibGU6OmluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiB2bSwg
Q2FsbEZyYW1lKiBjYWxsRnJhbWUsIEpTU2NvcGUqIHNjb3BlKQoreworICAgIFJFTEVBU0VfQVNT
RVJUKHNjb3BlKTsKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUtPmds
b2JhbE9iamVjdCgpOworICAgIFJFTEVBU0VfQVNTRVJUKGdsb2JhbE9iamVjdCk7CisgICAgQVNT
RVJUKCZnbG9iYWxPYmplY3QtPnZtKCkgPT0gJnZtKTsKKworICAgIEpTT2JqZWN0KiBleGNlcHRp
b24gPSAwOworICAgIFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sg
PSBnbG9iYWxPYmplY3QtPmNyZWF0ZVByb2dyYW1Db2RlQmxvY2soY2FsbEZyYW1lLCB0aGlzLCAm
ZXhjZXB0aW9uKTsKKyAgICBpZiAoZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gZXhjZXB0aW9u
OworCisgICAgSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGdsb2JhbExleGljYWxFbnZpcm9u
bWVudCA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsTGV4aWNhbEVudmlyb25tZW50KCk7CisgICAgY29u
c3QgVmFyaWFibGVFbnZpcm9ubWVudCYgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENv
ZGVCbG9jay0+dmFyaWFibGVEZWNsYXJhdGlvbnMoKTsKKyAgICBjb25zdCBWYXJpYWJsZUVudmly
b25tZW50JiBsZXhpY2FsRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPmxleGljYWxE
ZWNsYXJhdGlvbnMoKTsKKyAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0aGF0IG5vIHZhcnMvZ2xv
YmFsIHByb3BlcnRpZXMvbGV0L2NvbnN0IGNhbiBiZSBkdXBsaWNhdGVkIGluIHRoZSBnbG9iYWwg
c2NvcGUuCisgICAgLy8gVGhpcyBjYXJyaWVkIG91dCBzZWN0aW9uIDE1LjEuOCBvZiB0aGUgRVM2
IHNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5k
ZXguaHRtbCNzZWMtZ2xvYmFsZGVjbGFyYXRpb25pbnN0YW50aWF0aW9uCisgICAgeworICAgICAg
ICBFeGVjU3RhdGUqIGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsKKyAgICAgICAg
Ly8gQ2hlY2sgZm9yIGludGVyc2VjdGlvbiBvZiAidmFyIiBhbmQgImxldCIvImNvbnN0Ii8iY2xh
c3MiCisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Cisg
ICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbnMuY29udGFpbnMoZW50cnkua2V5KSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmlu
ZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXku
Z2V0KCkpLCAiJyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIGFueSBuZXcg
ImxldCIvImNvbnN0Ii8iY2xhc3MiIHdpbGwgc2hhZG93IGFueSBwcmUtZXhpc3RpbmcgZ2xvYmFs
IHByb3BlcnR5IG5hbWVzLCBvciAidmFyIi8ibGV0Ii8iY29uc3QiIHZhcmlhYmxlcy4KKyAgICAg
ICAgLy8gSXQncyBhbiBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCisgICAgICAgIGZvciAo
YXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7CisgICAgICAgICAgICBpZiAoZ2xv
YmFsT2JqZWN0LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7CisgICAgICAg
ICAgICAgICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBqdXN0IFJlc3RyaWN0ZWRHbG9iYWxQ
cm9wZXJ0eSBjYW4ndCBiZSBzaGFkb3dlZAorICAgICAgICAgICAgICAgIC8vIFRoaXMgY2Fycmll
ZCBvdXQgc2VjdGlvbiA4LjEuMS40LjE0IG9mIHRoZSBFUzYgc3BlYzogaHR0cDovL3d3dy5lY21h
LWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1oYXNyZXN0cmlj
dGVkZ2xvYmFscHJvcGVydHkKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVz
Y3JpcHRvcjsKKyAgICAgICAgICAgICAgICBnbG9iYWxPYmplY3QtPmdldE93blByb3BlcnR5RGVz
Y3JpcHRvcihleGVjLCBlbnRyeS5rZXkuZ2V0KCksIGRlc2NyaXB0b3IpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKCkgIT0ganNVbmRlZmlu
ZWQoKSAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBk
dXBsaWNhdGUgdmFyaWFibGUgdGhhdCBzaGFkb3dzIGEgZ2xvYmFsIHByb3BlcnR5OiAnIiwgU3Ry
aW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aGFzUHJvcGVy
dHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChVTkxJS0VM
WShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNo
b3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAv
LyBXZSBvbmx5IGFsbG93ICJjb25zdCIgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyB1bmRlciB0aGlz
IHNldHRpbmcuCisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB3ZSBkb24ndCAi
bGV0IiB2YXJpYWJsZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSAiY29uc3QiIHZhcmlhYmxlcy4KKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aXNDb25zdFZh
cmlhYmxlKGVudHJ5LmtleS5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRh
eEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6
ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJ2YXIicyB3aWxsIHNoYWRvdyBh
bnkgcHJldmlvdXMgImxldCIvImNvbnN0Ii8iY2xhc3MiIG5hbWVzLgorICAgICAgICAvLyBJdCdz
IGFuIGVycm9yIHRvIGludHJvZHVjZSBhIHNoYWRvdy4KKyAgICAgICAgaWYgKCFnbG9iYWxMZXhp
Y2FsRW52aXJvbm1lbnQtPmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBlbnRy
eSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbExl
eGljYWxFbnZpcm9ubWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJp
bmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5
LmdldCgpKSwgIiciKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAg
IG1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLnNldCh2bSwgdGhpcywgdW5saW5rZWRDb2RlQmxv
Y2spOworCisgICAgQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIgb3B0aW1pemVyKHZtLCBnbG9i
YWxPYmplY3QpOworCisgICAgZm9yIChzaXplX3QgaSA9IDAsIG51bWJlck9mRnVuY3Rpb25zID0g
dW5saW5rZWRDb2RlQmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpOyBpIDwgbnVtYmVyT2ZG
dW5jdGlvbnM7ICsraSkgeworICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5s
aW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUgPSB1bmxpbmtlZENvZGVCbG9jay0+ZnVuY3Rpb25EZWNs
KGkpOworICAgICAgICBBU1NFUlQoIXVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT5uYW1lKCku
aXNFbXB0eSgpKTsKKyAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRGdW5jdGlvbihjYWxsRnJhbWUs
IHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkpOworICAgICAgICBpZiAodm0udHlw
ZVByb2ZpbGVyKCkgfHwgdm0uY29udHJvbEZsb3dQcm9maWxlcigpKSB7CisgICAgICAgICAgICB2
bS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJj
ZUlEKCksIAorICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQoKSwgCisgICAgICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlv
bkV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBmb3IgKGF1dG8mIGVudHJ5IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKKyAgICAg
ICAgQVNTRVJUKGVudHJ5LnZhbHVlLmlzVmFyKCkpOworICAgICAgICBnbG9iYWxPYmplY3QtPmFk
ZFZhcihjYWxsRnJhbWUsIElkZW50aWZpZXI6OmZyb21VaWQoJnZtLCBlbnRyeS5rZXkuZ2V0KCkp
KTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBn
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQgPSBqc0Nhc3Q8SlNHbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQqPihnbG9iYWxPYmplY3QtPmdsb2JhbFNjb3BlKCkpOworICAgICAgICBTeW1ib2xUYWJsZSog
c3ltYm9sVGFibGUgPSBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPnN5bWJvbFRhYmxlKCk7Cisg
ICAgICAgIENvbmN1cnJlbnRKSVRMb2NrZXIgbG9ja2VyKHN5bWJvbFRhYmxlLT5tX2xvY2spOwor
ICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgeworICAgICAg
ICAgICAgaWYgKFVOTElLRUxZKGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29u
c3RSZWRlY2xhcmF0aW9uU2hvdWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKHN5bWJvbFRhYmxlLT5jb250YWlucyhsb2NrZXIsIGVudHJ5LmtleS5n
ZXQoKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0ID0gc3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVP
ZmZzZXQobG9ja2VyKTsKKyAgICAgICAgICAgIFN5bWJvbFRhYmxlRW50cnkgbmV3RW50cnkoVmFy
T2Zmc2V0KG9mZnNldCksIGVudHJ5LnZhbHVlLmlzQ29uc3QoKSA/IFJlYWRPbmx5IDogMCk7Cisg
ICAgICAgICAgICBuZXdFbnRyeS5wcmVwYXJlVG9XYXRjaCgpOworICAgICAgICAgICAgc3ltYm9s
VGFibGUtPmFkZChsb2NrZXIsIGVudHJ5LmtleS5nZXQoKSwgbmV3RW50cnkpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBTY29wZU9mZnNldCBvZmZzZXRGb3JBc3NlcnQgPSBnbG9iYWxMZXhp
Y2FsRW52aXJvbm1lbnQtPmFkZFZhcmlhYmxlcygxLCBqc1REWlZhbHVlKCkpOworICAgICAgICAg
ICAgUkVMRUFTRV9BU1NFUlQob2Zmc2V0Rm9yQXNzZXJ0ID09IG9mZnNldCk7CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0
Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBQcm9n
cmFtRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNl
bGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsK
KyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3Ip
OworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkUHJvZ3JhbUNvZGVC
bG9jayk7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jaykKKyAgICAgICAg
dGhpc09iamVjdC0+bV9wcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKK30K
Kwordm9pZCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNl
bGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
KiB0aGlzT2JqZWN0ID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCk7Cisg
ICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIFNj
cmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7CisgICAg
dmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJs
b2NrKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGVFbnZpcm9ubWVu
dFN5bWJvbFRhYmxlKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJs
b2NrKQorICAgICAgICB0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPnZpc2l0
V2Vha2x5KHZpc2l0b3IpOworfQorCitGdW5jdGlvbkNvZGVCbG9jayogRnVuY3Rpb25FeGVjdXRh
YmxlOjpiYXNlbGluZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCit7
CisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIHJlc3VsdDsKKyAgICBpZiAoa2luZCA9PSBDb2RlRm9y
Q2FsbCkKKyAgICAgICAgcmVzdWx0ID0gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgIGVs
c2UgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwor
ICAgICAgICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICB9Cisg
ICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxGdW5jdGlvbkNvZGVCbG9jayo+KHJlc3VsdC0+YmFzZWxpbmVBbHRlcm5hdGl2ZSgpKTsKK30K
Kwordm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBT
bG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIHRoaXNPYmpl
Y3QgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09C
SkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIFNjcmlwdEV4ZWN1dGFibGU6
OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7CisgICAgaWYgKHRoaXNPYmplY3Qt
Pm1fY29kZUJsb2NrRm9yQ2FsbCkKKyAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JD
YWxsLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxv
Y2tGb3JDb25zdHJ1Y3QpCisgICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ29uc3Ry
dWN0LT52aXNpdFdlYWtseSh2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVj
dC0+bV91bmxpbmtlZEV4ZWN1dGFibGUpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0
LT5tX3NpbmdsZXRvbkZ1bmN0aW9uKTsKK30KKworRnVuY3Rpb25FeGVjdXRhYmxlKiBGdW5jdGlv
bkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKAorICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUs
IEV4ZWNTdGF0ZSYgZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCAKKyAgICBKU09iamVj
dComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcikKK3sKKyAgICBVbmxpbmtlZEZ1
bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlID0gCisgICAgICAgIFVubGlua2Vk
RnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xvYmFsQ29kZSgKKyAgICAgICAgICAgIG5hbWUsIGV4
ZWMsIHNvdXJjZSwgZXhjZXB0aW9uLCBvdmVycmlkZUxpbmVOdW1iZXIpOworICAgIGlmICghdW5s
aW5rZWRFeGVjdXRhYmxlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiB1
bmxpbmtlZEV4ZWN1dGFibGUtPmxpbmsoZXhlYy52bSgpLCBzb3VyY2UsIG92ZXJyaWRlTGluZU51
bWJlcik7Cit9CisKKyNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCitjb25zdCBDbGFzc0luZm8gV2Vi
QXNzZW1ibHlFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJXZWJBc3NlbWJseUV4ZWN1dGFibGUiLCAm
RXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShXZWJBc3NlbWJs
eUV4ZWN1dGFibGUpIH07CisKK1dlYkFzc2VtYmx5RXhlY3V0YWJsZTo6V2ViQXNzZW1ibHlFeGVj
dXRhYmxlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1v
ZHVsZSwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCkKKyAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCB2
bS53ZWJBc3NlbWJseUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIE5VTV9QQVJBTUVURVJTX05P
VF9DT01QSUxFRCwgTm9JbnRyaW5zaWMpCisgICAgLCBtX3NvdXJjZShzb3VyY2UpCisgICAgLCBt
X21vZHVsZSh2bSwgdGhpcywgbW9kdWxlKQorICAgICwgbV9mdW5jdGlvbkluZGV4KGZ1bmN0aW9u
SW5kZXgpCit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0g
U291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpXZWJBc3NlbWJseSk7Cit9CisKK3ZvaWQgV2ViQXNz
ZW1ibHlFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2Fz
dDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPihjZWxsKS0+V2ViQXNzZW1ibHlFeGVjdXRhYmxlOjp+
V2ViQXNzZW1ibHlFeGVjdXRhYmxlKCk7Cit9CisKK3ZvaWQgV2ViQXNzZW1ibHlFeGVjdXRhYmxl
Ojp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7Cisg
ICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PFdlYkFzc2VtYmx5
RXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09i
amVjdCwgaW5mbygpKTsKKyAgICBFeGVjdXRhYmxlQmFzZTo6dmlzaXRDaGlsZHJlbih0aGlzT2Jq
ZWN0LCB2aXNpdG9yKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsKQor
ICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwtPnZpc2l0V2Vha2x5KHZpc2l0
b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZSk7Cit9CisjZW5k
aWYKKwordm9pZCBFeGVjdXRhYmxlQmFzZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0KSBjb25zdAor
eworICAgIEV4ZWN1dGFibGVCYXNlKiByZWFsVGhpcyA9IGNvbnN0X2Nhc3Q8RXhlY3V0YWJsZUJh
c2UqPih0aGlzKTsKKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJs
ZTo6aW5mbygpKSB7CisgICAgICAgIE5hdGl2ZUV4ZWN1dGFibGUqIG5hdGl2ZSA9IGpzQ2FzdDxO
YXRpdmVFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBvdXQucHJpbnQoIk5hdGl2ZUV4
ZWN1dGFibGU6IiwgUmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+ZnVuY3Rp
b24oKSkpLCAiLyIsIFJhd1BvaW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUtPmNvbnN0
cnVjdG9yKCkpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYgKGNsYXNz
SW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgRXZhbEV4ZWN1dGFi
bGUqIGV2YWwgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihyZWFsVGhpcyk7CisgICAgICAgIGlm
IChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV2YWwtPmNvZGVCbG9jaygpKQorICAgICAgICAgICAg
b3V0LnByaW50KCpjb2RlQmxvY2spOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJp
bnQoIkV2YWxFeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8o
KSkgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXZhbCA9IGpzQ2FzdDxQcm9ncmFtRXhl
Y3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0g
ZXZhbC0+Y29kZUJsb2NrKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiUHJvZ3JhbUV4ZWN1dGFibGUgdy9v
IENvZGVCbG9jayIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5m
bygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUqPihyZWFsVGhpcyk7CisgICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV4
ZWN1dGFibGUtPmNvZGVCbG9jaygpKQorICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2sp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJpbnQoIk1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAg
ICBGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJs
ZSo+KHJlYWxUaGlzKTsKKyAgICBpZiAoIWZ1bmN0aW9uLT5laXRoZXJDb2RlQmxvY2soKSkKKyAg
ICAgICAgb3V0LnByaW50KCJGdW5jdGlvbkV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOworICAg
IGVsc2UgeworICAgICAgICBDb21tYVByaW50ZXIgY29tbWEoIi8iKTsKKyAgICAgICAgaWYgKGZ1
bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEs
ICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ2FsbCgpKTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uLT5j
b2RlQmxvY2tGb3JDb25zdHJ1Y3QoKSkKKyAgICAgICAgICAgIG91dC5wcmludChjb21tYSwgKmZ1
bmN0aW9uLT5jb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKSk7CisgICAgfQorfQorCitDb2RlQmxvY2tI
YXNoIEV4ZWN1dGFibGVCYXNlOjpoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkg
Y29uc3QKK3sKKyAgICBpZiAodGhpcy0+Y2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6
aW5mbygpKQorICAgICAgICByZXR1cm4ganNDYXN0PGNvbnN0IE5hdGl2ZUV4ZWN1dGFibGUqPih0
aGlzKS0+aGFzaEZvcihraW5kKTsKKyAgICAKKyAgICByZXR1cm4ganNDYXN0PGNvbnN0IFNjcmlw
dEV4ZWN1dGFibGUqPih0aGlzKS0+aGFzaEZvcihraW5kKTsKK30KKworQ29kZUJsb2NrSGFzaCBO
YXRpdmVFeGVjdXRhYmxlOjpoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29u
c3QKK3sKKyAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgcmV0dXJuIENvZGVC
bG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+KG1fZnVu
Y3Rpb24pKSk7CisgICAgCisgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3Ry
dWN0KTsKKyAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYml0
d2lzZV9jYXN0PHNpemVfdD4obV9jb25zdHJ1Y3RvcikpKTsKK30KKworQ29kZUJsb2NrSGFzaCBT
Y3JpcHRFeGVjdXRhYmxlOjpoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29u
c3QKK3sKKyAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzb3VyY2UoKSwga2luZCk7Cit9CisKK30K
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJsZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRnVuY3Rpb25F
eGVjdXRhYmxlLmNwcAkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyAr
MjQsNiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJFeGVjdXRhYmxl
LmgiCiAKICNpbmNsdWRlICJCYXRjaGVkVHJhbnNpdGlvbk9wdGltaXplci5oIgogI2luY2x1ZGUg
IkNvZGVCbG9jay5oIgpAQCAtNDAsNDc3ICszOSw2IEBACiAKIG5hbWVzcGFjZSBKU0MgewogCi1j
b25zdCBDbGFzc0luZm8gRXhlY3V0YWJsZUJhc2U6OnNfaW5mbyA9IHsgIkV4ZWN1dGFibGUiLCAw
LCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEV4ZWN1dGFibGVCYXNlKSB9OwotCi12b2lkIEV4ZWN1
dGFibGVCYXNlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxFeGVj
dXRhYmxlQmFzZSo+KGNlbGwpLT5FeGVjdXRhYmxlQmFzZTo6fkV4ZWN1dGFibGVCYXNlKCk7Ci19
Ci0KLXZvaWQgRXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSgpCi17Ci0jaWYgRU5BQkxFKEpJVCkK
LSAgICBtX2ppdENvZGVGb3JDYWxsID0gbnVsbHB0cjsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1
Y3QgPSBudWxscHRyOwotICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1hY3Jv
QXNzZW1ibGVyQ29kZVB0cigpOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNo
ZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0jZW5kaWYKLSAgICBtX251bVBhcmFtZXRl
cnNGb3JDYWxsID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotICAgIG1fbnVtUGFyYW1l
dGVyc0ZvckNvbnN0cnVjdCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKLQotICAgIGlm
IChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBG
dW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxl
Kj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5jbGVhcigp
OwotICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5jbGVhcigpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVj
dXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBq
c0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFs
Q29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29k
ZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNs
YXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3Jh
bUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlz
KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAg
ICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAg
ICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsK
LSAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLmNsZWFy
KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZ
KQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OmluZm8oKSkg
ewotICAgICAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8V2Vi
QXNzZW1ibHlFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJs
b2NrRm9yQ2FsbC5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAg
ICBBU1NFUlQoY2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6aW5mbygpKTsKLX0KLQot
Y29uc3QgQ2xhc3NJbmZvIE5hdGl2ZUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk5hdGl2ZUV4ZWN1
dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShO
YXRpdmVFeGVjdXRhYmxlKSB9OwotCi1OYXRpdmVFeGVjdXRhYmxlKiBOYXRpdmVFeGVjdXRhYmxl
OjpjcmVhdGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZlRnVu
Y3Rpb24gZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5hdGl2
ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJpbmcm
IG5hbWUpCi17Ci0gICAgTmF0aXZlRXhlY3V0YWJsZSogZXhlY3V0YWJsZTsKLSAgICBleGVjdXRh
YmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8TmF0aXZlRXhlY3V0YWJsZT4odm0uaGVh
cCkpIE5hdGl2ZUV4ZWN1dGFibGUodm0sIGZ1bmN0aW9uLCBjb25zdHJ1Y3RvciwgaW50cmluc2lj
KTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSwgY2FsbFRodW5rLCBjb25zdHJ1
Y3RUaHVuaywgbmFtZSk7Ci0gICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci19Ci0KLXZvaWQgTmF0aXZl
RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8TmF0
aXZlRXhlY3V0YWJsZSo+KGNlbGwpLT5OYXRpdmVFeGVjdXRhYmxlOjp+TmF0aXZlRXhlY3V0YWJs
ZSgpOwotfQotCi1TdHJ1Y3R1cmUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZVN0cnVjdHVyZShW
TSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi17Ci0g
ICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBl
SW5mbyhDZWxsVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotfQotCi12b2lkIE5hdGl2
ZUV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBj
YWxsVGh1bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0cmlu
ZyYgbmFtZSkKLXsKLSAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgbV9qaXRDb2Rl
Rm9yQ2FsbCA9IGNhbGxUaHVuazsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBjb25zdHJ1
Y3RUaHVuazsKLSAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENvZGVG
b3JDYWxsLT5hZGRyZXNzRm9yQ2FsbChNdXN0Q2hlY2tBcml0eSk7Ci0gICAgbV9qaXRDb2RlRm9y
Q29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBtX2ppdENvZGVGb3JDb25zdHJ1Y3QtPmFkZHJlc3NG
b3JDYWxsKE11c3RDaGVja0FyaXR5KTsKLSAgICBtX25hbWUgPSBuYW1lOwotfQotCi1OYXRpdmVF
eGVjdXRhYmxlOjpOYXRpdmVFeGVjdXRhYmxlKFZNJiB2bSwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rp
b24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljKQotICAg
IDogRXhlY3V0YWJsZUJhc2Uodm0sIHZtLm5hdGl2ZUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCks
IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QsIGludHJpbnNpYykKLSAgICAsIG1fZnVuY3Rpb24oZnVu
Y3Rpb24pCi0gICAgLCBtX2NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKQotewotfQotCi1jb25zdCBD
bGFzc0luZm8gU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvID0geyAiU2NyaXB0RXhlY3V0YWJsZSIs
ICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFNjcmlwdEV4
ZWN1dGFibGUpIH07Ci0KLVNjcmlwdEV4ZWN1dGFibGU6OlNjcmlwdEV4ZWN1dGFibGUoU3RydWN0
dXJlKiBzdHJ1Y3R1cmUsIFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGlz
SW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBi
b29sIGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0
VHlwZSwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCBzdHJ1
Y3R1cmUsIE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCwgaW50cmluc2ljKQotICAgICwgbV9m
ZWF0dXJlcyhpc0luU3RyaWN0Q29udGV4dCA/IFN0cmljdE1vZGVGZWF0dXJlIDogMCkKLSAgICAs
IG1fZGlkVHJ5VG9FbnRlckluTG9vcChmYWxzZSkKLSAgICAsIG1faGFzQ2FwdHVyZWRWYXJpYWJs
ZXMoZmFsc2UpCi0gICAgLCBtX25ldmVySW5saW5lKGZhbHNlKQotICAgICwgbV9uZXZlck9wdGlt
aXplKGZhbHNlKQotICAgICwgbV9uZXZlckZUTE9wdGltaXplKGZhbHNlKQotICAgICwgbV9pc0Fy
cm93RnVuY3Rpb25Db250ZXh0KGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCkKLSAgICAsIG1fY2Fu
VXNlT1NSRXhpdEZ1enppbmcodHJ1ZSkKLSAgICAsIG1fZGVyaXZlZENvbnRleHRUeXBlKHN0YXRp
Y19jYXN0PHVuc2lnbmVkPihkZXJpdmVkQ29udGV4dFR5cGUpKQotICAgICwgbV9ldmFsQ29udGV4
dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGV2YWxDb250ZXh0VHlwZSkpCi0gICAgLCBtX292
ZXJyaWRlTGluZU51bWJlcigtMSkKLSAgICAsIG1fZmlyc3RMaW5lKC0xKQotICAgICwgbV9sYXN0
TGluZSgtMSkKLSAgICAsIG1fc3RhcnRDb2x1bW4oVUlOVF9NQVgpCi0gICAgLCBtX2VuZENvbHVt
bihVSU5UX01BWCkKLSAgICAsIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KFVJTlRfTUFYKQot
ICAgICwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KFVJTlRfTUFYKQotICAgICwgbV9zb3VyY2Uo
c291cmNlKQotewotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBj
ZWxsKQotewotICAgIHN0YXRpY19jYXN0PFNjcmlwdEV4ZWN1dGFibGUqPihjZWxsKS0+U2NyaXB0
RXhlY3V0YWJsZTo6flNjcmlwdEV4ZWN1dGFibGUoKTsKLX0KLQotdm9pZCBTY3JpcHRFeGVjdXRh
YmxlOjppbnN0YWxsQ29kZShDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSAgICBpbnN0YWxsQ29k
ZSgqY29kZUJsb2NrLT52bSgpLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwgY29k
ZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQoKSk7Ci19Ci0KLXZvaWQgU2NyaXB0RXhlY3V0YWJs
ZTo6aW5zdGFsbENvZGUoVk0mIHZtLCBDb2RlQmxvY2sqIGdlbmVyaWNDb2RlQmxvY2ssIENvZGVU
eXBlIGNvZGVUeXBlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgQVNTRVJU
KHZtLmhlYXAuaXNEZWZlcnJlZCgpKTsKLSAgICAKLSAgICBpZiAoZ2VuZXJpY0NvZGVCbG9jaykK
LSAgICAgICAgQ09ERUJMT0NLX0xPR19FVkVOVChnZW5lcmljQ29kZUJsb2NrLCAiaW5zdGFsbENv
ZGUiLCAoKSk7Ci0gICAgCi0gICAgQ29kZUJsb2NrKiBvbGRDb2RlQmxvY2sgPSBudWxscHRyOwot
ICAgIAotICAgIHN3aXRjaCAoY29kZVR5cGUpIHsKLSAgICBjYXNlIEdsb2JhbENvZGU6IHsKLSAg
ICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1
dGFibGUqPih0aGlzKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrID0gc3Rh
dGljX2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAgICAK
LSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICAKLSAgICAgICAg
b2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAg
ICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0aGlz
LCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIE1vZHVsZUNv
ZGU6IHsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nh
c3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayo+KGdlbmVyaWNDb2RlQmxvY2spOwotCi0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JD
YWxsKTsKLQotICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dy
YW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAgIGJyZWFr
OwotICAgIH0KLQotICAgIGNhc2UgRXZhbENvZGU6IHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgRXZh
bENvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9jayo+KGdlbmVy
aWNDb2RlQmxvY2spOwotICAgICAgICAKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNh
bGwpOwotICAgICAgICAKLSAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9ldmFs
Q29kZUJsb2NrLmdldCgpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suc2V0
TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0g
ICAgICAgIAotICAgIGNhc2UgRnVuY3Rpb25Db2RlOiB7Ci0gICAgICAgIEZ1bmN0aW9uRXhlY3V0
YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKLSAg
ICAgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEZ1bmN0aW9u
Q29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2gg
KGtpbmQpIHsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgIG9sZENvZGVC
bG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICAgICAgICAg
IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNv
ZGVCbG9jayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3Ry
dWN0OgotICAgICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tG
b3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0Zv
ckNvbnN0cnVjdC5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotCi0gICAg
c3dpdGNoIChraW5kKSB7Ci0gICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgbV9qaXRDb2Rl
Rm9yQ2FsbCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkg
OiBudWxscHRyOwotICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBNYWNy
b0Fzc2VtYmxlckNvZGVQdHIoKTsKLSAgICAgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9IGdl
bmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBOVU1f
UEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ29kZUZv
ckNvbnN0cnVjdDoKLSAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0NvZGVC
bG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7Ci0gICAgICAgIG1f
aml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRy
KCk7Ci0gICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxv
Y2sgPyBnZW5lcmljQ29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkgOiBOVU1fUEFSQU1FVEVSU19O
T1RfQ09NUElMRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChnZW5lcmljQ29k
ZUJsb2NrKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGdlbmVyaWNDb2RlQmxvY2stPm93bmVy
RXhlY3V0YWJsZSgpID09IHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChKSVRDb2RlOjpp
c0V4ZWN1dGFibGVTY3JpcHQoZ2VuZXJpY0NvZGVCbG9jay0+aml0VHlwZSgpKSk7Ci0gICAgICAg
IAotICAgICAgICBpZiAoT3B0aW9uczo6dmVyYm9zZU9TUigpKQotICAgICAgICAgICAgZGF0YUxv
ZygiSW5zdGFsbGluZyAiLCAqZ2VuZXJpY0NvZGVCbG9jaywgIlxuIik7Ci0gICAgICAgIAotICAg
ICAgICBpZiAodm0ubV9wZXJCeXRlY29kZVByb2ZpbGVyKQotICAgICAgICAgICAgdm0ubV9wZXJC
eXRlY29kZVByb2ZpbGVyLT5lbnN1cmVCeXRlY29kZXNGb3IoZ2VuZXJpY0NvZGVCbG9jayk7Ci0g
ICAgICAgIAotICAgICAgICBpZiAoRGVidWdnZXIqIGRlYnVnZ2VyID0gZ2VuZXJpY0NvZGVCbG9j
ay0+Z2xvYmFsT2JqZWN0KCktPmRlYnVnZ2VyKCkpCi0gICAgICAgICAgICBkZWJ1Z2dlci0+cmVn
aXN0ZXJDb2RlQmxvY2soZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG9sZENv
ZGVCbG9jaykKLSAgICAgICAgb2xkQ29kZUJsb2NrLT51bmxpbmtJbmNvbWluZ0NhbGxzKCk7Ci0K
LSAgICB2bS5oZWFwLndyaXRlQmFycmllcih0aGlzKTsKLX0KLQotQ29kZUJsb2NrKiBTY3JpcHRF
eGVjdXRhYmxlOjpuZXdDb2RlQmxvY2tGb3IoCi0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIEpTT2JqZWN0KiYgZXhj
ZXB0aW9uKQotewotICAgIFZNKiB2bSA9IHNjb3BlLT52bSgpOwotICAgIGF1dG8gdGhyb3dTY29w
ZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUoKnZtKTsKLQotICAgIEFTU0VSVCh2bS0+aGVhcC5pc0Rl
ZmVycmVkKCkpOwotICAgIEFTU0VSVChzdGFydENvbHVtbigpICE9IFVJTlRfTUFYKTsKLSAgICBB
U1NFUlQoZW5kQ29sdW1uKCkgIT0gVUlOVF9NQVgpOwotCi0gICAgaWYgKGNsYXNzSW5mbygpID09
IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgUkVMRUFTRV9B
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVj
dXRhYmxlLT5tX2V2YWxDb2RlQmxvY2spOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rp
b24pOwotICAgICAgICByZXR1cm4gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtLAotICAgICAgICAg
ICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suZ2V0KCks
IHNjb3BlLAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSk7Ci0g
ICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5m
bygpKSB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFBy
b2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0g
Q29kZUZvckNhbGwpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9wcm9n
cmFtQ29kZUJsb2NrKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAg
ICAgcmV0dXJuIFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1
dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLmdldCgpLCBzY29w
ZSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCksIGV4ZWN1dGFi
bGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOwotICAgIH0KLQotICAgIGlmIChjbGFzc0luZm8o
KSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwp
OwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAgICAgcmV0
dXJuIE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1
dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgp
LCBzY29wZSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCksIGV4
ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCkpOwotICAgIH0KLQotICAgIFJFTEVBU0Vf
QVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKLSAgICBS
RUxFQVNFX0FTU0VSVChmdW5jdGlvbik7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgIFJFTEVBU0VfQVNT
RVJUKCFleGVjdXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCkpOwotICAgIEpTR2xvYmFsT2JqZWN0
KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+Z2xvYmFsT2JqZWN0KCk7Ci0gICAgUGFyc2VyRXJyb3Ig
ZXJyb3I7Ci0gICAgRGVidWdnZXJNb2RlIGRlYnVnZ2VyTW9kZSA9IGdsb2JhbE9iamVjdC0+aGFz
SW50ZXJhY3RpdmVEZWJ1Z2dlcigpID8gRGVidWdnZXJPbiA6IERlYnVnZ2VyT2ZmOwotICAgIFVu
bGlua2VkRnVuY3Rpb25Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2NrID0gCi0gICAgICAgIGV4
ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT51bmxpbmtlZENvZGVCbG9ja0ZvcigKLSAg
ICAgICAgICAgICp2bSwgZXhlY3V0YWJsZS0+bV9zb3VyY2UsIGtpbmQsIGRlYnVnZ2VyTW9kZSwg
ZXJyb3IsIAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+cGFyc2VNb2RlKCkpOwotICAgIHJlY29y
ZFBhcnNlKAotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+ZmVhdHVy
ZXMoKSwgCi0gICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5oYXNDYXB0
dXJlZFZhcmlhYmxlcygpLCBmaXJzdExpbmUoKSwgCi0gICAgICAgIGxhc3RMaW5lKCksIHN0YXJ0
Q29sdW1uKCksIGVuZENvbHVtbigpKTsgCi0gICAgaWYgKCF1bmxpbmtlZENvZGVCbG9jaykgewot
ICAgICAgICBleGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbigKLSAgICAgICAgICAgIGdsb2JhbE9i
amVjdC0+Z2xvYmFsRXhlYygpLCB0aHJvd1Njb3BlLAotICAgICAgICAgICAgZXJyb3IudG9FcnJv
ck9iamVjdChnbG9iYWxPYmplY3QsIGV4ZWN1dGFibGUtPm1fc291cmNlKSk7Ci0gICAgICAgIHJl
dHVybiBudWxscHRyOwotICAgIH0KLQotICAgIFNvdXJjZVByb3ZpZGVyKiBwcm92aWRlciA9IGV4
ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCk7Ci0gICAgdW5zaWduZWQgc291cmNlT2Zmc2V0
ID0gZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRPZmZzZXQoKTsKLSAgICB1bnNpZ25lZCBzdGFy
dENvbHVtbiA9IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0Q29sdW1uKCk7Ci0KLSAgICByZXR1
cm4gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgZXhlY3V0YWJsZSwgdW5s
aW5rZWRDb2RlQmxvY2ssIHNjb3BlLCBwcm92aWRlciwgc291cmNlT2Zmc2V0LCBzdGFydENvbHVt
bik7Ci19Ci0KLUNvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3UmVwbGFjZW1lbnRDb2Rl
QmxvY2tGb3IoCi0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotewotICAgIGlmIChj
bGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVBU0Vf
QVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBFdmFsQ29k
ZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPigKLSAgICAgICAg
ICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAg
ICAgICBFdmFsQ29kZUJsb2NrKiByZXN1bHQgPSBFdmFsQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwK
LSAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAg
ICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgICAgIHJl
dHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFt
RXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29k
ZUZvckNhbGwpOwotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2Fz
dDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiBi
YXNlbGluZSA9IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPigKLSAgICAgICAgICAgIGV4
ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAgICAg
ICBQcm9ncmFtQ29kZUJsb2NrKiByZXN1bHQgPSBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0o
KSwKLSAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwot
ICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9
PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIE1v
ZHVsZVByb2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2sqIHJlc3VsdCA9IE1vZHVsZVByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAg
ICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAgIHJl
c3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJuIHJl
c3VsdDsKLSAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0luZm8oKSA9PSBGdW5jdGlv
bkV4ZWN1dGFibGU6OmluZm8oKSk7Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgIEZ1bmN0aW9uQ29kZUJs
b2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29kZUJsb2NrKj4oCi0gICAgICAg
IGV4ZWN1dGFibGUtPmNvZGVCbG9ja0ZvcihraW5kKS0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAg
IEZ1bmN0aW9uQ29kZUJsb2NrKiByZXN1bHQgPSBGdW5jdGlvbkNvZGVCbG9jazo6Y3JlYXRlKHZt
KCksCi0gICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAg
IHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cExMSW50KFZNJiB2bSwgQ29kZUJsb2NrKiBjb2Rl
QmxvY2spCi17Ci0gICAgTExJbnQ6OnNldEVudHJ5cG9pbnQodm0sIGNvZGVCbG9jayk7Ci19Ci0K
LXN0YXRpYyB2b2lkIHNldHVwSklUKFZNJiB2bSwgQ29kZUJsb2NrKiBjb2RlQmxvY2spCi17Ci0j
aWYgRU5BQkxFKEpJVCkKLSAgICBDb21waWxhdGlvblJlc3VsdCByZXN1bHQgPSBKSVQ6OmNvbXBp
bGUoJnZtLCBjb2RlQmxvY2ssIEpJVENvbXBpbGF0aW9uTXVzdFN1Y2NlZWQpOwotICAgIFJFTEVB
U0VfQVNTRVJUKHJlc3VsdCA9PSBDb21waWxhdGlvblN1Y2Nlc3NmdWwpOwotI2Vsc2UKLSAgICBV
TlVTRURfUEFSQU0odm0pOwotICAgIFVOVVNFRF9QQVJBTShjb2RlQmxvY2spOwotICAgIFVOUkVB
Q0hBQkxFX0ZPUl9QTEFURk9STSgpOwotI2VuZGlmCi19Ci0KLUpTT2JqZWN0KiBTY3JpcHRFeGVj
dXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCgKLSAgICBWTSYgdm0sIEpTRnVuY3Rpb24q
IGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBD
b2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2spCi17Ci0gICAgRGVmZXJHQ0ZvckFXaGlsZSBkZWZl
ckdDKHZtLmhlYXApOwotCi0gICAgaWYgKHZtLmdldEFuZENsZWFyRmFpbE5leHROZXdDb2RlQmxv
Y2soKSkKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKHNjb3BlLT5nbG9iYWxPYmplY3QoKS0+
Z2xvYmFsRXhlYygpLCBBU0NJSUxpdGVyYWwoIkZvcmNlZCBGYWlsdXJlIikpOwotCi0gICAgSlNP
YmplY3QqIGV4Y2VwdGlvbiA9IDA7Ci0gICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBuZXdDb2Rl
QmxvY2tGb3Ioa2luZCwgZnVuY3Rpb24sIHNjb3BlLCBleGNlcHRpb24pOwotICAgIHJlc3VsdENv
ZGVCbG9jayA9IGNvZGVCbG9jazsKLSAgICBpZiAoIWNvZGVCbG9jaykgewotICAgICAgICBSRUxF
QVNFX0FTU0VSVChleGNlcHRpb24pOwotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgIH0K
LSAgICAKLSAgICBpZiAoT3B0aW9uczo6dmFsaWRhdGVCeXRlY29kZSgpKQotICAgICAgICBjb2Rl
QmxvY2stPnZhbGlkYXRlKCk7Ci0gICAgCi0gICAgaWYgKE9wdGlvbnM6OnVzZUxMSW50KCkpCi0g
ICAgICAgIHNldHVwTExJbnQodm0sIGNvZGVCbG9jayk7Ci0gICAgZWxzZQotICAgICAgICBzZXR1
cEpJVCh2bSwgY29kZUJsb2NrKTsKLSAgICAKLSAgICBpbnN0YWxsQ29kZSh2bSwgY29kZUJsb2Nr
LCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lhbGl6YXRpb25LaW5kKCkp
OwotICAgIHJldHVybiBudWxscHRyOwotfQotCi1jb25zdCBDbGFzc0luZm8gRXZhbEV4ZWN1dGFi
bGU6OnNfaW5mbyA9IHsgIkV2YWxFeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5m
bywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShFdmFsRXhlY3V0YWJsZSkgfTsKLQotRXZhbEV4ZWN1
dGFibGUqIEV2YWxFeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3Vy
Y2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlw
ZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENv
bnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSwgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCogdmFy
aWFibGVzVW5kZXJURFopCi17Ci0gICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKLSAgICBhdXRvIHNj
b3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0KLSAgICBKU0dsb2JhbE9iamVjdCogZ2xv
YmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIGlmICghZ2xvYmFs
T2JqZWN0LT5ldmFsRW5hYmxlZCgpKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uKGV4ZWMsIHNj
b3BlLCBjcmVhdGVFdmFsRXJyb3IoZXhlYywgZ2xvYmFsT2JqZWN0LT5ldmFsRGlzYWJsZWRFcnJv
ck1lc3NhZ2UoKSkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFdmFsRXhlY3V0
YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEV2YWxFeGVjdXRh
YmxlPigqZXhlYy0+aGVhcCgpKSkgRXZhbEV4ZWN1dGFibGUoZXhlYywgc291cmNlLCBpc0luU3Ry
aWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBl
dmFsQ29udGV4dFR5cGUpOwotICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtKTsKLQot
ICAgIFVubGlua2VkRXZhbENvZGVCbG9jayogdW5saW5rZWRFdmFsQ29kZSA9IGdsb2JhbE9iamVj
dC0+Y3JlYXRlRXZhbENvZGVCbG9jayhleGVjLCBleGVjdXRhYmxlLCB2YXJpYWJsZXNVbmRlclRE
Wik7Ci0gICAgaWYgKCF1bmxpbmtlZEV2YWxDb2RlKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLnNldCh2bSwgZXhlY3V0YWJsZSwg
dW5saW5rZWRFdmFsQ29kZSk7Ci0KLSAgICByZXR1cm4gZXhlY3V0YWJsZTsKLX0KLQotRXZhbEV4
ZWN1dGFibGU6OkV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29k
ZSYgc291cmNlLCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2
ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5
cGUgZXZhbENvbnRleHRUeXBlKQotICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLmV2
YWxFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGluU3RyaWN0
Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBldmFs
Q29udGV4dFR5cGUsIE5vSW50cmluc2ljKQotewotICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIo
KS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6UHJvZ3JhbSk7Ci19
Ci0KLXZvaWQgRXZhbEV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0
YXRpY19jYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCktPkV2YWxFeGVjdXRhYmxlOjp+RXZhbEV4
ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIFByb2dyYW1FeGVjdXRhYmxlOjpzX2lu
Zm8gPSB7ICJQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAs
IENSRUFURV9NRVRIT0RfVEFCTEUoUHJvZ3JhbUV4ZWN1dGFibGUpIH07Ci0KLVByb2dyYW1FeGVj
dXRhYmxlOjpQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNv
ZGUmIHNvdXJjZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5wcm9ncmFtRXhl
Y3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZl
ZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJp
bnNpYykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBT
b3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOwotICAgIG1fdHlwZVByb2ZpbGluZ1N0
YXJ0T2Zmc2V0ID0gMDsKLSAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2UubGVu
Z3RoKCkgLSAxOwotICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZt
KCkuY29udHJvbEZsb3dQcm9maWxlcigpKQotICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9uSGFz
RXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Ci19Ci0KLXZv
aWQgUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRp
Y19jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPlByb2dyYW1FeGVjdXRhYmxlOjp+UHJv
Z3JhbUV4ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlOjpzX2luZm8gPSB7ICJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVj
dXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUpIH07Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICA6IFNj
cmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVN0cnVjdHVy
ZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBlOjpO
b25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsKLSAgICBB
U1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNv
dXJjZVR5cGU6Ok1vZHVsZSk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAwOwot
ICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0gICAg
aWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxvd1By
b2ZpbGVyKCkpCi0gICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCkt
Pmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFydE9m
ZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKLX0KLQotTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUqIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBj
b25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi17Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9i
amVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUo
ZXhlYywgc291cmNlKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52bSgp
KTsKLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1bGVQ
cm9ncmFtQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayhl
eGVjLCBleGVjdXRhYmxlKTsKLSAgICBpZiAoIXVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUpCi0g
ICAgICAgIHJldHVybiBudWxscHRyOwotICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQ
cm9ncmFtQ29kZUJsb2NrLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCB1bmxpbmtlZE1vZHVs
ZVByb2dyYW1Db2RlKTsKLQotICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1i
b2xUYWJsZS5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwganNDYXN0PFN5bWJvbFRhYmxlKj4o
dW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+Y29uc3RhbnRSZWdpc3Rlcih1bmxpbmtlZE1vZHVs
ZVByb2dyYW1Db2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlQ29uc3RhbnRSZWdpc3Rl
ck9mZnNldCgpKS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0KGV4ZWMtPnZtKCkpKTsKLQotICAgIHJl
dHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpkZXN0
cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSo+KGNlbGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6fk1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKCk7Ci19Ci0KIGNvbnN0IENsYXNzSW5mbyBGdW5jdGlvbkV4ZWN1dGFibGU6OnNfaW5m
byA9IHsgIkZ1bmN0aW9uRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAs
IENSRUFURV9NRVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVjdXRhYmxlKSB9OwogCiBGdW5jdGlvbkV4
ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNv
dXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgdW5z
aWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4s
IHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykKQEAgLTU0MSwxNjkgKzY5
LDYgQEAgdm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKgogICAgIHN0YXRp
Y19jYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5GdW5jdGlvbkV4ZWN1dGFibGU6On5G
dW5jdGlvbkV4ZWN1dGFibGUoKTsKIH0KIAotaW5saW5lIGNvbnN0IGNoYXIqIHNhbXBsaW5nRGVz
Y3JpcHRpb24oSklUQ29kZTo6SklUVHlwZSBqaXRUeXBlKQotewotICAgIHN3aXRjaCAoaml0VHlw
ZSkgewotICAgIGNhc2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJUaHVuazoKLSAgICAgICAgcmV0dXJu
ICJJbnRlcnByZXRlciBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkJh
c2VsaW5lSklUOgotICAgICAgICByZXR1cm4gIkJhc2VsaW5lIENvbXBpbGF0aW9uIChUT1RBTCki
OwotICAgIGNhc2UgSklUQ29kZTo6REZHSklUOgotICAgICAgICByZXR1cm4gIkRGRyBDb21waWxh
dGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkZUTEpJVDoKLSAgICAgICAgcmV0dXJu
ICJGVEwgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi12
b2lkIEV2YWxFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0
b3ImIHZpc2l0b3IpCi17Ci0gICAgRXZhbEV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8
RXZhbEV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRo
aXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0
aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91
bmxpbmtlZEV2YWxDb2RlQmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxv
Y2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlz
aXRvcik7Ci19Ci0KLUpTT2JqZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6Y2hlY2tTeW50YXgoRXhl
Y1N0YXRlKiBleGVjKQotewotICAgIFBhcnNlckVycm9yIGVycm9yOwotICAgIFZNKiB2bSA9ICZl
eGVjLT52bSgpOwotICAgIEpTR2xvYmFsT2JqZWN0KiBsZXhpY2FsR2xvYmFsT2JqZWN0ID0gZXhl
Yy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxQcm9ncmFtTm9k
ZT4gcHJvZ3JhbU5vZGUgPSBwYXJzZTxQcm9ncmFtTm9kZT4oCi0gICAgICAgIHZtLCBtX3NvdXJj
ZSwgSWRlbnRpZmllcigpLCBKU1BhcnNlckJ1aWx0aW5Nb2RlOjpOb3RCdWlsdGluLAotICAgICAg
ICBKU1BhcnNlclN0cmljdE1vZGU6Ok5vdFN0cmljdCwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFz
c2ljLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRl
ZCwgZXJyb3IpOwotICAgIGlmIChwcm9ncmFtTm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
QVNTRVJUKGVycm9yLmlzVmFsaWQoKSk7Ci0gICAgcmV0dXJuIGVycm9yLnRvRXJyb3JPYmplY3Qo
bGV4aWNhbEdsb2JhbE9iamVjdCwgbV9zb3VyY2UpOwotfQotCi1KU09iamVjdCogUHJvZ3JhbUV4
ZWN1dGFibGU6OmluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiB2bSwgQ2FsbEZyYW1lKiBj
YWxsRnJhbWUsIEpTU2NvcGUqIHNjb3BlKQotewotICAgIFJFTEVBU0VfQVNTRVJUKHNjb3BlKTsK
LSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgp
OwotICAgIFJFTEVBU0VfQVNTRVJUKGdsb2JhbE9iamVjdCk7Ci0gICAgQVNTRVJUKCZnbG9iYWxP
YmplY3QtPnZtKCkgPT0gJnZtKTsKLQotICAgIEpTT2JqZWN0KiBleGNlcHRpb24gPSAwOwotICAg
IFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sgPSBnbG9iYWxPYmpl
Y3QtPmNyZWF0ZVByb2dyYW1Db2RlQmxvY2soY2FsbEZyYW1lLCB0aGlzLCAmZXhjZXB0aW9uKTsK
LSAgICBpZiAoZXhjZXB0aW9uKQotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotCi0gICAgSlNH
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGdsb2JhbExleGljYWxFbnZpcm9ubWVudCA9IGdsb2Jh
bE9iamVjdC0+Z2xvYmFsTGV4aWNhbEVudmlyb25tZW50KCk7Ci0gICAgY29uc3QgVmFyaWFibGVF
bnZpcm9ubWVudCYgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+dmFy
aWFibGVEZWNsYXJhdGlvbnMoKTsKLSAgICBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50JiBsZXhp
Y2FsRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPmxleGljYWxEZWNsYXJhdGlvbnMo
KTsKLSAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0aGF0IG5vIHZhcnMvZ2xvYmFsIHByb3BlcnRp
ZXMvbGV0L2NvbnN0IGNhbiBiZSBkdXBsaWNhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCi0gICAg
Ly8gVGhpcyBjYXJyaWVkIG91dCBzZWN0aW9uIDE1LjEuOCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6
Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMt
Z2xvYmFsZGVjbGFyYXRpb25pbnN0YW50aWF0aW9uCi0gICAgewotICAgICAgICBFeGVjU3RhdGUq
IGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsKLSAgICAgICAgLy8gQ2hlY2sgZm9y
IGludGVyc2VjdGlvbiBvZiAidmFyIiBhbmQgImxldCIvImNvbnN0Ii8iY2xhc3MiCi0gICAgICAg
IGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBp
ZiAodmFyaWFibGVEZWNsYXJhdGlvbnMuY29udGFpbnMoZW50cnkua2V5KSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3Jl
YXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIp
KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGlmIGFueSBuZXcgImxldCIvImNvbnN0
Ii8iY2xhc3MiIHdpbGwgc2hhZG93IGFueSBwcmUtZXhpc3RpbmcgZ2xvYmFsIHByb3BlcnR5IG5h
bWVzLCBvciAidmFyIi8ibGV0Ii8iY29uc3QiIHZhcmlhYmxlcy4KLSAgICAgICAgLy8gSXQncyBh
biBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAgICAgIGZvciAoYXV0byYgZW50cnkg
OiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoZ2xvYmFsT2JqZWN0LT5o
YXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
VGhlIEVTNiBzcGVjIHNheXMgdGhhdCBqdXN0IFJlc3RyaWN0ZWRHbG9iYWxQcm9wZXJ0eSBjYW4n
dCBiZSBzaGFkb3dlZAotICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlv
biA4LjEuMS40LjE0IG9mIHRoZSBFUzYgc3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9u
YWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1oYXNyZXN0cmljdGVkZ2xvYmFscHJv
cGVydHkKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAg
ICAgICAgICAgICAgICBnbG9iYWxPYmplY3QtPmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleGVj
LCBlbnRyeS5rZXkuZ2V0KCksIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKCkgIT0ganNVbmRlZmluZWQoKSAmJiAhZGVz
Y3JpcHRvci5jb25maWd1cmFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0
ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFy
aWFibGUgdGhhdCBzaGFkb3dzIGEgZ2xvYmFsIHByb3BlcnR5OiAnIiwgU3RyaW5nKGVudHJ5Lmtl
eS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50
cnkua2V5LmdldCgpKSkgewotICAgICAgICAgICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1
ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkg
JiYgIWlzU3RyaWN0TW9kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGFs
bG93ICJjb25zdCIgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyB1bmRlciB0aGlzIHNldHRpbmcuCi0g
ICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB3ZSBkb24ndCAibGV0IiB2YXJpYWJs
ZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSAiY29uc3QiIHZhcmlhYmxlcy4KLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aXNDb25zdFZhcmlhYmxlKGVudHJ5
LmtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMs
IG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmco
ZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJ2YXIicyB3aWxsIHNoYWRvdyBhbnkgcHJldmlvdXMg
ImxldCIvImNvbnN0Ii8iY2xhc3MiIG5hbWVzLgotICAgICAgICAvLyBJdCdzIGFuIGVycm9yIHRv
IGludHJvZHVjZSBhIHNoYWRvdy4KLSAgICAgICAgaWYgKCFnbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQtPmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxl
RGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9u
bWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNy
ZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIici
KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIG1fdW5saW5rZWRQ
cm9ncmFtQ29kZUJsb2NrLnNldCh2bSwgdGhpcywgdW5saW5rZWRDb2RlQmxvY2spOwotCi0gICAg
QmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIgb3B0aW1pemVyKHZtLCBnbG9iYWxPYmplY3QpOwot
Ci0gICAgZm9yIChzaXplX3QgaSA9IDAsIG51bWJlck9mRnVuY3Rpb25zID0gdW5saW5rZWRDb2Rl
QmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpOyBpIDwgbnVtYmVyT2ZGdW5jdGlvbnM7ICsr
aSkgewotICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRGdW5jdGlv
bkV4ZWN1dGFibGUgPSB1bmxpbmtlZENvZGVCbG9jay0+ZnVuY3Rpb25EZWNsKGkpOwotICAgICAg
ICBBU1NFUlQoIXVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsK
LSAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRGdW5jdGlvbihjYWxsRnJhbWUsIHVubGlua2VkRnVu
Y3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkpOwotICAgICAgICBpZiAodm0udHlwZVByb2ZpbGVyKCkg
fHwgdm0uY29udHJvbEZsb3dQcm9maWxlcigpKSB7Ci0gICAgICAgICAgICB2bS5mdW5jdGlvbkhh
c0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIAotICAg
ICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nU3Rh
cnRPZmZzZXQoKSwgCi0gICAgICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUt
PnR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgQVNTRVJUKGVu
dHJ5LnZhbHVlLmlzVmFyKCkpOwotICAgICAgICBnbG9iYWxPYmplY3QtPmFkZFZhcihjYWxsRnJh
bWUsIElkZW50aWZpZXI6OmZyb21VaWQoJnZtLCBlbnRyeS5rZXkuZ2V0KCkpKTsKLSAgICB9Ci0K
LSAgICB7Ci0gICAgICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2Fs
RW52aXJvbm1lbnQgPSBqc0Nhc3Q8SlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqPihnbG9iYWxP
YmplY3QtPmdsb2JhbFNjb3BlKCkpOwotICAgICAgICBTeW1ib2xUYWJsZSogc3ltYm9sVGFibGUg
PSBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPnN5bWJvbFRhYmxlKCk7Ci0gICAgICAgIENvbmN1
cnJlbnRKSVRMb2NrZXIgbG9ja2VyKHN5bWJvbFRhYmxlLT5tX2xvY2spOwotICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgaWYgKFVO
TElLRUxZKGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29uc3RSZWRlY2xhcmF0
aW9uU2hvdWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKHN5bWJvbFRhYmxlLT5jb250YWlucyhsb2NrZXIsIGVudHJ5LmtleS5nZXQoKSkpCi0gICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Nv
cGVPZmZzZXQgb2Zmc2V0ID0gc3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVPZmZzZXQobG9ja2Vy
KTsKLSAgICAgICAgICAgIFN5bWJvbFRhYmxlRW50cnkgbmV3RW50cnkoVmFyT2Zmc2V0KG9mZnNl
dCksIGVudHJ5LnZhbHVlLmlzQ29uc3QoKSA/IFJlYWRPbmx5IDogMCk7Ci0gICAgICAgICAgICBu
ZXdFbnRyeS5wcmVwYXJlVG9XYXRjaCgpOwotICAgICAgICAgICAgc3ltYm9sVGFibGUtPmFkZChs
b2NrZXIsIGVudHJ5LmtleS5nZXQoKSwgbmV3RW50cnkpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBTY29wZU9mZnNldCBvZmZzZXRGb3JBc3NlcnQgPSBnbG9iYWxMZXhpY2FsRW52aXJvbm1l
bnQtPmFkZFZhcmlhYmxlcygxLCBqc1REWlZhbHVlKCkpOwotICAgICAgICAgICAgUkVMRUFTRV9B
U1NFUlQob2Zmc2V0Rm9yQXNzZXJ0ID09IG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLXZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlND
ZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAgICBQcm9ncmFtRXhlY3V0YWJs
ZSogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOwotICAgIEFT
U0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBTY3JpcHRF
eGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotICAgIHZpc2l0
b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAg
aWYgKHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jaykKLSAgICAgICAgdGhpc09iamVjdC0+
bV9wcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLX0KLQotdm9pZCBNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNp
dG9yJiB2aXNpdG9yKQotewotICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiB0aGlzT2JqZWN0
ID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dD
X09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFi
bGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBl
bmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKTsKLSAgICB2
aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxl
KTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrKQotICAgICAg
ICB0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0
b3IpOwotfQotCiBGdW5jdGlvbkNvZGVCbG9jayogRnVuY3Rpb25FeGVjdXRhYmxlOjpiYXNlbGlu
ZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCiB7CiAgICAgRnVuY3Rp
b25Db2RlQmxvY2sqIHJlc3VsdDsKQEAgLTc0NCwxMDMgKzEwOSw0IEBAIEZ1bmN0aW9uRXhlY3V0
YWJsZSogRnVuY3Rpb25FeGVjdXRhYmxlOjoKICAgICByZXR1cm4gdW5saW5rZWRFeGVjdXRhYmxl
LT5saW5rKGV4ZWMudm0oKSwgc291cmNlLCBvdmVycmlkZUxpbmVOdW1iZXIpOwogfQogCi0jaWYg
RU5BQkxFKFdFQkFTU0VNQkxZKQotY29uc3QgQ2xhc3NJbmZvIFdlYkFzc2VtYmx5RXhlY3V0YWJs
ZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHlFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpz
X2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoV2ViQXNzZW1ibHlFeGVjdXRhYmxlKSB9Owot
Ci1XZWJBc3NlbWJseUV4ZWN1dGFibGU6OldlYkFzc2VtYmx5RXhlY3V0YWJsZShWTSYgdm0sIGNv
bnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1
bmN0aW9uSW5kZXgpCi0gICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0ud2ViQXNzZW1ibHlFeGVj
dXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIE5vSW50
cmluc2ljKQotICAgICwgbV9zb3VyY2Uoc291cmNlKQotICAgICwgbV9tb2R1bGUodm0sIHRoaXMs
IG1vZHVsZSkKLSAgICAsIG1fZnVuY3Rpb25JbmRleChmdW5jdGlvbkluZGV4KQotewotICAgIEFT
U0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291
cmNlVHlwZTo6V2ViQXNzZW1ibHkpOwotfQotCi12b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6
ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8V2ViQXNzZW1ibHlFeGVj
dXRhYmxlKj4oY2VsbCktPldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6fldlYkFzc2VtYmx5RXhlY3V0
YWJsZSgpOwotfQotCi12b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihK
U0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPihjZWxs
KTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0g
ICAgRXhlY3V0YWJsZUJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0g
ICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbCkKLSAgICAgICAgdGhpc09iamVj
dC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLSAgICB2aXNpdG9y
LmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGUpOwotfQotI2VuZGlmCi0KLXZvaWQgRXhlY3V0
YWJsZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKLXsKLSAgICBFeGVjdXRhYmxl
QmFzZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0PEV4ZWN1dGFibGVCYXNlKj4odGhpcyk7Ci0gICAg
Ci0gICAgaWYgKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAg
ICAgICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRpdmUgPSBqc0Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+
KHJlYWxUaGlzKTsKLSAgICAgICAgb3V0LnByaW50KCJOYXRpdmVFeGVjdXRhYmxlOiIsIFJhd1Bv
aW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUtPmZ1bmN0aW9uKCkpKSwgIi8iLCBSYXdQ
b2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5jb25zdHJ1Y3RvcigpKSkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhl
Y3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBldmFsID0ganNDYXN0
PEV2YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkKLSAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJs
b2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCJFdmFsRXhlY3V0YWJs
ZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYg
KGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihyZWFsVGhp
cyk7Ci0gICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV2YWwtPmNvZGVCbG9jaygp
KQotICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICBvdXQucHJpbnQoIlByb2dyYW1FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMp
OwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5jb2RlQmxv
Y2soKSkKLSAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgb3V0LnByaW50KCJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSB3L28gQ29kZUJs
b2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgRnVuY3Rpb25FeGVjdXRh
YmxlKiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0g
ICAgaWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29kZUJsb2NrKCkpCi0gICAgICAgIG91dC5wcmludCgi
RnVuY3Rpb25FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKLSAgICBlbHNlIHsKLSAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hKCIvIik7Ci0gICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2Nr
Rm9yQ2FsbCgpKQotICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVC
bG9ja0ZvckNhbGwoKSk7Ci0gICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3Ry
dWN0KCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsICpmdW5jdGlvbi0+Y29kZUJsb2Nr
Rm9yQ29uc3RydWN0KCkpOwotICAgIH0KLX0KLQotQ29kZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFz
ZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgaWYg
KHRoaXMtPmNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkKLSAgICAgICAg
cmV0dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2lu
ZCk7Ci0gICAgCi0gICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBTY3JpcHRFeGVjdXRhYmxlKj4odGhp
cyktPmhhc2hGb3Ioa2luZCk7Ci19Ci0KLUNvZGVCbG9ja0hhc2ggTmF0aXZlRXhlY3V0YWJsZTo6
aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19j
YXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2Z1bmN0aW9uKSkpOwotICAgIAot
ICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgcmV0dXJu
IENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+
KG1fY29uc3RydWN0b3IpKSk7Ci19Ci0KLUNvZGVCbG9ja0hhc2ggU2NyaXB0RXhlY3V0YWJsZTo6
aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IENvZGVCbG9ja0hhc2goc291cmNlKCksIGtpbmQpOwotfQotCi19Cit9IC8vIG5hbWVzcGFjZSBK
U0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJs
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0aW9u
RXhlY3V0YWJsZS5oCShyZXZpc2lvbiAyMDc3OTApCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0V4ZWN1dGFibGUuaDoyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9GdW5jdGlvbkV4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc3
OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMy0yMDE2IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQXJpdHlDaGVja01vZGUuaCIK
KyNpbmNsdWRlICJDYWxsRGF0YS5oIgorI2luY2x1ZGUgIkNvZGVCbG9ja0hhc2guaCIKKyNpbmNs
dWRlICJDb2RlU3BlY2lhbGl6YXRpb25LaW5kLmgiCisjaW5jbHVkZSAiQ29tcGlsYXRpb25SZXN1
bHQuaCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlSW5mby5oIgorI2luY2x1ZGUgIkhhbmRsZXJJbmZv
LmgiCisjaW5jbHVkZSAiSW5mZXJyZWRWYWx1ZS5oIgorI2luY2x1ZGUgIkpJVENvZGUuaCIKKyNp
bmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgIlNvdXJjZUNvZGUuaCIKKyNpbmNs
dWRlICJUeXBlU2V0LmgiCisjaW5jbHVkZSAiVW5saW5rZWRDb2RlQmxvY2suaCIKKyNpbmNsdWRl
ICJVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS5oIgorCituYW1lc3BhY2UgSlNDIHsKKworY2xh
c3MgQ29kZUJsb2NrOworY2xhc3MgRXZhbENvZGVCbG9jazsKK2NsYXNzIEZ1bmN0aW9uQ29kZUJs
b2NrOworY2xhc3MgSlNTY29wZTsKK2NsYXNzIEpTV2FzbU1vZHVsZTsKK2NsYXNzIExMSW50T2Zm
c2V0c0V4dHJhY3RvcjsKK2NsYXNzIE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7CitjbGFzcyBQcm9n
cmFtQ29kZUJsb2NrOworY2xhc3MgV2ViQXNzZW1ibHlDb2RlQmxvY2s7CisKK2VudW0gQ29tcGls
YXRpb25LaW5kIHsgRmlyc3RDb21waWxhdGlvbiwgT3B0aW1pemluZ0NvbXBpbGF0aW9uIH07CisK
K2lubGluZSBib29sIGlzQ2FsbChDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCit7CisgICAg
aWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIEFTU0VS
VChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgIHJldHVybiBmYWxzZTsKK30KKworY2xh
c3MgRXhlY3V0YWJsZUJhc2UgOiBwdWJsaWMgSlNDZWxsIHsKKyAgICBmcmllbmQgY2xhc3MgSklU
OworCitwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19JU19I
T1NUID0gMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxF
RCA9IC0xOworCisgICAgRXhlY3V0YWJsZUJhc2UoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVy
ZSwgaW50IG51bVBhcmFtZXRlcnMsIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgICAgIDogSlND
ZWxsKHZtLCBzdHJ1Y3R1cmUpCisgICAgICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1Q
YXJhbWV0ZXJzKQorICAgICAgICAsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdChudW1QYXJh
bWV0ZXJzKQorICAgICAgICAsIG1faW50cmluc2ljKGludHJpbnNpYykKKyAgICB7CisgICAgfQor
CisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCisgICAgeworICAgICAgICBCYXNlOjpm
aW5pc2hDcmVhdGlvbih2bSk7CisgICAgfQorCitwdWJsaWM6CisgICAgdHlwZWRlZiBKU0NlbGwg
QmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpT
dHJ1Y3R1cmVGbGFnczsKKworICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24g
PSB0cnVlOworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisgICAgICAgIAorICAg
IENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKKwor
ICAgIGJvb2wgaXNFdmFsRXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
dHlwZSgpID09IEV2YWxFeGVjdXRhYmxlVHlwZTsKKyAgICB9CisgICAgYm9vbCBpc0Z1bmN0aW9u
RXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IEZ1bmN0
aW9uRXhlY3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJvb2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IFByb2dyYW1FeGVjdXRhYmxl
VHlwZTsKKyAgICB9CisgICAgYm9vbCBpc01vZHVsZVByb2dyYW1FeGVjdXRhYmxlKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0eXBlKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwor
ICAgIH0KKworCisgICAgYm9vbCBpc0hvc3RGdW5jdGlvbigpIGNvbnN0CisgICAgeworICAgICAg
ICBBU1NFUlQoKG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9T
VCkgPT0gKG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9PSBOVU1fUEFSQU1FVEVSU19JU19I
T1NUKSk7CisgICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJB
TUVURVJTX0lTX0hPU1Q7CisgICAgfQorCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorICAgIGJv
b2wgaXNXZWJBc3NlbWJseUV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IHR5cGUoKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlOworICAgIH0KKyNlbmRpZgorCisg
ICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykgeyByZXR1cm4gU3RydWN0dXJlOjpjcmVh
dGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7IH0KKyAgICAgICAgCisgICAgdm9pZCBjbGVhckNvZGUoKTsKKworICAg
IERFQ0xBUkVfRVhQT1JUX0lORk87CisKK3Byb3RlY3RlZDoKKyAgICBpbnQgbV9udW1QYXJhbWV0
ZXJzRm9yQ2FsbDsKKyAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0OworCitwdWJs
aWM6CisgICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCisg
ICAgeworICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ2FsbCk7CisgICAgICAgIHJldHVybiBt
X2ppdENvZGVGb3JDYWxsOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJh
dGVkSklUQ29kZUZvckNvbnN0cnVjdCgpCisgICAgeworICAgICAgICBBU1NFUlQobV9qaXRDb2Rl
Rm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIG1faml0Q29kZUZvckNvbnN0cnVjdDsKKyAg
ICB9CisgICAgICAgIAorICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZv
cihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2Fs
bCgpOworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAg
cmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisgICAgCisgICAg
TWFjcm9Bc3NlbWJsZXJDb2RlUHRyIGVudHJ5cG9pbnRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCBraW5kLCBBcml0eUNoZWNrTW9kZSBhcml0eSkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlm
IHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0LiBXZSBvbmx5IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNr
IGJlY2F1c2Ugd2UgdXNlIHRoZQorICAgICAgICAvLyBuby1hcml0eSBlbnRyeXBvaW50IGluIG5v
bi12aXJ0dWFsIGNhbGxzLCB3aGljaCB3aWxsICJjYWNoZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBp
bgorICAgICAgICAvLyBtYWNoaW5lIGNvZGUuCisgICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hl
Y2tBcml0eSkgeworICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgICAgICBjYXNl
IENvZGVGb3JDYWxsOgorICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIg
cmVzdWx0ID0gbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrKQorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxl
ckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRy
IHJlc3VsdCA9CisgICAgICAgICAgICBnZW5lcmF0ZWRKSVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNz
Rm9yQ2FsbChhcml0eSk7CisgICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewor
ICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdDsgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRo
ZSBKSVQncyB2aXJ0dWFsIGNhbGwgb3B0aW1pemF0aW9ucy4KKyAgICAgICAgICAgIHN3aXRjaCAo
a2luZCkgeworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAgICAgICBt
X2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICAg
ICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mSklUQ29kZVdp
dGhBcml0eUNoZWNrRm9yKAorICAgICAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisg
ICAgeworICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoK
KyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0
Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayk7CisgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVj
dDoKKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1f
aml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKTsKKyAgICAgICAgfQorICAgICAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cisg
ICAgCisgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk51bVBhcmFtZXRlcnNGb3IoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZv
ckNhbGwpCisgICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNl
LCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJh
c2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCk7CisgICAgfQorCisgICAgYm9vbCBoYXNK
SVRDb2RlRm9yQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0
ZXJzRm9yQ2FsbCA+PSAwOworICAgIH0KKyAgICAgICAgCisgICAgYm9vbCBoYXNKSVRDb2RlRm9y
Q29uc3RydWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNG
b3JDb25zdHJ1Y3QgPj0gMDsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaGFzSklUQ29kZUZv
cihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAo
a2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ2Fs
bCgpOworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAg
cmV0dXJuIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisKKyAgICAvLyBJbnRyaW5z
aWNzIGFyZSBvbmx5IGZvciBjYWxscywgY3VycmVudGx5LgorICAgIEludHJpbnNpYyBpbnRyaW5z
aWMoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpYzsgfQorICAgICAgICAKKyAgICBJbnRyaW5z
aWMgaW50cmluc2ljRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKKyAgICB7
CisgICAgICAgIGlmIChpc0NhbGwoa2luZCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmluc2lj
KCk7CisgICAgICAgIHJldHVybiBOb0ludHJpbnNpYzsKKyAgICB9CisgICAgCisgICAgdm9pZCBk
dW1wKFByaW50U3RyZWFtJikgY29uc3Q7CisgICAgICAgIAorcHJvdGVjdGVkOgorICAgIEludHJp
bnNpYyBtX2ludHJpbnNpYzsKKyAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsK
KyAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ29uc3RydWN0OworICAgIE1hY3JvQXNz
ZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2s7CisgICAgTWFjcm9B
c3NlbWJsZXJDb2RlUHRyIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrOworfTsK
KworY2xhc3MgTmF0aXZlRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7
CisgICAgZnJpZW5kIGNsYXNzIEpJVDsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0
cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFn
cyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMgTmF0aXZlRXhlY3V0YWJsZSog
Y3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0
aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVG
dW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBu
YW1lKTsKKworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBDb2RlQmxv
Y2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBOYXRp
dmVGdW5jdGlvbiBmdW5jdGlvbigpIHsgcmV0dXJuIG1fZnVuY3Rpb247IH0KKyAgICBOYXRpdmVG
dW5jdGlvbiBjb25zdHJ1Y3RvcigpIHsgcmV0dXJuIG1fY29uc3RydWN0b3I7IH0KKyAgICAgICAg
CisgICAgTmF0aXZlRnVuY3Rpb24gbmF0aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9u
S2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAg
ICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcigpOworICAgIH0KKyAgICAg
ICAgCisgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVT
cGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVG
b3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRh
YmxlLCBtX2Z1bmN0aW9uKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVj
dCk7CisgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9j
b25zdHJ1Y3Rvcik7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0
dXJlKFZNJiwgSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVlIHByb3RvKTsKKyAgICAgICAgCisgICAg
REVDTEFSRV9JTkZPOworCisgICAgY29uc3QgU3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4g
bV9uYW1lOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgUGFz
c1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0
VGh1bmssIGNvbnN0IFN0cmluZyYgbmFtZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNz
IEV4ZWN1dGFibGVCYXNlOworCisgICAgTmF0aXZlRXhlY3V0YWJsZShWTSYsIE5hdGl2ZUZ1bmN0
aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljKTsKKwor
ICAgIE5hdGl2ZUZ1bmN0aW9uIG1fZnVuY3Rpb247CisgICAgTmF0aXZlRnVuY3Rpb24gbV9jb25z
dHJ1Y3RvcjsKKworICAgIFN0cmluZyBtX25hbWU7Cit9OworCitjbGFzcyBTY3JpcHRFeGVjdXRh
YmxlIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEV4ZWN1
dGFibGVCYXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdz
ID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2Vs
bCopOworICAgICAgICAKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0
aW9uS2luZCkgY29uc3Q7CisKKyAgICBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7
IHJldHVybiBtX3NvdXJjZTsgfQorICAgIGludHB0cl90IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1
cm4gbV9zb3VyY2UucHJvdmlkZXJJRCgpOyB9CisgICAgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwo
KSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcigpLT51cmwoKTsgfQorICAgIGludCBm
aXJzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0TGluZTsgfQorICAgIHZvaWQgc2V0T3Zl
cnJpZGVMaW5lTnVtYmVyKGludCBvdmVycmlkZUxpbmVOdW1iZXIpIHsgbV9vdmVycmlkZUxpbmVO
dW1iZXIgPSBvdmVycmlkZUxpbmVOdW1iZXI7IH0KKyAgICBib29sIGhhc092ZXJyaWRlTGluZU51
bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyICE9IC0xOyB9CisgICAg
aW50IG92ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVt
YmVyOyB9CisgICAgaW50IGxhc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0TGluZTsgfQor
ICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9zdGFydENvbHVtbjsg
fQorICAgIHVuc2lnbmVkIGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9
CisgICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4g
bV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7IH0KKyAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5n
RW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OyB9CisK
KyAgICBib29sIHVzZXNFdmFsKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0
dXJlOyB9CisgICAgYm9vbCB1c2VzQXJndW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJl
cyAmIEFyZ3VtZW50c0ZlYXR1cmU7IH0KKyAgICBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQo
KSBjb25zdCB7IHJldHVybiBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQ7IH0KKyAgICBib29sIGlz
U3RyaWN0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVy
ZTsgfQorICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkQ29udGV4dFR5cGU+KG1fZGVyaXZlZENvbnRleHRU
eXBlKTsgfQorICAgIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxFdmFsQ29udGV4dFR5cGU+KG1fZXZhbENvbnRleHRUeXBlKTsgfQor
CisgICAgRUNNQU1vZGUgZWNtYU1vZGUoKSBjb25zdCB7IHJldHVybiBpc1N0cmljdE1vZGUoKSA/
IFN0cmljdE1vZGUgOiBOb3RTdHJpY3RNb2RlOyB9CisgICAgICAgIAorICAgIHZvaWQgc2V0TmV2
ZXJJbmxpbmUoYm9vbCB2YWx1ZSkgeyBtX25ldmVySW5saW5lID0gdmFsdWU7IH0KKyAgICB2b2lk
IHNldE5ldmVyT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyT3B0aW1pemUgPSB2YWx1ZTsg
fQorICAgIHZvaWQgc2V0TmV2ZXJGVExPcHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJGVExP
cHRpbWl6ZSA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXREaWRUcnlUb0VudGVySW5Mb29wKGJvb2wg
dmFsdWUpIHsgbV9kaWRUcnlUb0VudGVySW5Mb29wID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldENh
blVzZU9TUkV4aXRGdXp6aW5nKGJvb2wgdmFsdWUpIHsgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9
IHZhbHVlOyB9CisgICAgYm9vbCBuZXZlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJ
bmxpbmU7IH0KKyAgICBib29sIG5ldmVyT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVy
T3B0aW1pemU7IH0KKyAgICBib29sIG5ldmVyRlRMT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBt
X25ldmVyRlRMT3B0aW1pemU7IH0KKyAgICBib29sIGRpZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25z
dCB7IHJldHVybiBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KKyAgICBib29sIGlzSW5saW5pbmdD
YW5kaWRhdGUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJJbmxpbmUoKTsgfQorICAgIGJvb2wgaXNP
a1RvT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJPcHRpbWl6ZSgpOyB9CisgICAgYm9v
bCBjYW5Vc2VPU1JFeGl0RnV6emluZygpIGNvbnN0IHsgcmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1
enppbmc7IH0KKyAgICAKKyAgICBib29sKiBhZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKCkg
eyByZXR1cm4gJm1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQorCisgICAgQ29kZUZlYXR1cmVzIGZl
YXR1cmVzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlczsgfQorICAgICAgICAKKyAgICBERUNM
QVJFX0VYUE9SVF9JTkZPOworCisgICAgdm9pZCByZWNvcmRQYXJzZShDb2RlRmVhdHVyZXMgZmVh
dHVyZXMsIGJvb2wgaGFzQ2FwdHVyZWRWYXJpYWJsZXMsIGludCBmaXJzdExpbmUsIGludCBsYXN0
TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbikKKyAgICB7Cisg
ICAgICAgIG1fZmVhdHVyZXMgPSBmZWF0dXJlczsKKyAgICAgICAgbV9oYXNDYXB0dXJlZFZhcmlh
YmxlcyA9IGhhc0NhcHR1cmVkVmFyaWFibGVzOworICAgICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0
TGluZTsKKyAgICAgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOworICAgICAgICBBU1NFUlQoc3Rh
cnRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgICAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1
bW47CisgICAgICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgICAgICBtX2Vu
ZENvbHVtbiA9IGVuZENvbHVtbjsKKyAgICB9CisKKyAgICB2b2lkIGluc3RhbGxDb2RlKENvZGVC
bG9jayopOworICAgIHZvaWQgaW5zdGFsbENvZGUoVk0mLCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwg
Q29kZVNwZWNpYWxpemF0aW9uS2luZCk7CisgICAgQ29kZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3Io
Q29kZVNwZWNpYWxpemF0aW9uS2luZCwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBKU09iamVjdCom
IGV4Y2VwdGlvbik7CisgICAgQ29kZUJsb2NrKiBuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcihD
b2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGlu
dGVyZXN0aW5nIEdDIHN0b3J5LiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFza2luZyB1
cyB0byBjcmVhdGUgYSBDb2RlQmxvY2sKKyAgICAvLyB0aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJl
Zm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIENhbGxlcnMgYXJlIGVzc2VudGlhbGx5IGFza2lu
ZyBmb3IgYSBzdHJvbmcgcmVmZXJlbmNlCisgICAgLy8gdG8gdGhlIENvZGVCbG9jay4gQmVjYXVz
ZSB0aGUgRXhlY3V0YWJsZSBtYXkgYmUgYWxsb2NhdGluZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1
aXJlIGNhbGxlcnMgdG8gcGFzcyBpbgorICAgIC8vIHRoZWlyIENvZGVCbG9jayomIHJlZmVyZW5j
ZSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgQ29kZUJsb2NrIHRvIGJlIGpldHRpc29uZWQgaWYgRXhl
Y3V0YWJsZSBpcyB0aGUgb25seSB0aGluZworICAgIC8vIHRvIHBvaW50IHRvIGl0LiBUaGlzIGZv
cmNlcyBjYWxsZXJzIHRvIGhhdmUgYSBDb2RlQmxvY2sqIGluIGEgcmVnaXN0ZXIgb3Igb24gdGhl
IHN0YWNrIHRoYXQgd2lsbCBiZSBtYXJrZWQKKyAgICAvLyBieSBjb25zZXJ2YXRpdmUgR0MgaWYg
YSBHQyBoYXBwZW5zIGFmdGVyIHdlIGNyZWF0ZSB0aGUgQ29kZUJsb2NrLgorICAgIHRlbXBsYXRl
IDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4KKyAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1
dGlvbihWTSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwg
Q29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBG
dW5jdG9yPiB2b2lkIGZvckVhY2hDb2RlQmxvY2soRnVuY3RvciYmKTsKKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgSlNPYmplY3QqIHByZXBhcmVGb3JF
eGVjdXRpb25JbXBsKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRp
b25LaW5kLCBDb2RlQmxvY2sqJik7CisKK3Byb3RlY3RlZDoKKyAgICBTY3JpcHRFeGVjdXRhYmxl
KFN0cnVjdHVyZSosIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRl
eHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2
YWxDb250ZXh0VHlwZSwgSW50cmluc2ljKTsKKworICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0m
IHZtKQorICAgIHsKKyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICB2
bS5oZWFwLmFkZEV4ZWN1dGFibGUodGhpcyk7IC8vIEJhbGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVu
bWFya2VkQ29tcGlsZWRDb2RlKCkuCisKKyNpZiBFTkFCTEUoQ09ERUJMT0NLX1NBTVBMSU5HKQor
ICAgICAgICBpZiAoU2FtcGxpbmdUb29sKiBzYW1wbGVyID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBs
ZXIoKSkKKyAgICAgICAgICAgIHNhbXBsZXItPm5vdGlmeU9mU2NvcGUodm0sIHRoaXMpOworI2Vu
ZGlmCisgICAgfQorCisgICAgQ29kZUZlYXR1cmVzIG1fZmVhdHVyZXM7CisgICAgYm9vbCBtX2Rp
ZFRyeVRvRW50ZXJJbkxvb3A7CisgICAgYm9vbCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDogMTsK
KyAgICBib29sIG1fbmV2ZXJJbmxpbmUgOiAxOworICAgIGJvb2wgbV9uZXZlck9wdGltaXplIDog
MTsKKyAgICBib29sIG1fbmV2ZXJGVExPcHRpbWl6ZSA6IDE7CisgICAgYm9vbCBtX2lzQXJyb3dG
dW5jdGlvbkNvbnRleHQgOiAxOworICAgIGJvb2wgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7
CisgICAgdW5zaWduZWQgbV9kZXJpdmVkQ29udGV4dFR5cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4
dFR5cGUKKyAgICB1bnNpZ25lZCBtX2V2YWxDb250ZXh0VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0
VHlwZQorCisgICAgaW50IG1fb3ZlcnJpZGVMaW5lTnVtYmVyOworICAgIGludCBtX2ZpcnN0TGlu
ZTsKKyAgICBpbnQgbV9sYXN0TGluZTsKKyAgICB1bnNpZ25lZCBtX3N0YXJ0Q29sdW1uOworICAg
IHVuc2lnbmVkIG1fZW5kQ29sdW1uOworICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0
T2Zmc2V0OworICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKKyAgICBTb3Vy
Y2VDb2RlIG1fc291cmNlOworfTsKKworY2xhc3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJs
aWMgU2NyaXB0RXhlY3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJh
Y3RvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFn
cyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2Vs
bCopOworCisgICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX2V2YWxDb2RlQmxvY2suZ2V0KCk7CisgICAgfQorCisgICAgc3RhdGljIEV2YWxFeGVj
dXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0
cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250
ZXh0LCBFdmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKKworICAg
IFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAgICBy
ZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3Ry
dWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3Jl
YXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUs
IFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisgICAgICAgIAorICAgIERFQ0xBUkVf
SU5GTzsKKworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1
cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxz
ZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1
cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJp
dmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENv
bnRleHRUeXBlKCkpOyB9CisKKyAgICB1bnNpZ25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBt
X3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFibGVzKCk7IH0KKyAgICB1bnNpZ25lZCBu
dW1iZXJPZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+
bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
RXhlY3V0YWJsZUJhc2U7CisgICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7CisKKyAg
ICBFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0
cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250
ZXh0LCBFdmFsQ29udGV4dFR5cGUpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihK
U0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+
IG1fZXZhbENvZGVCbG9jazsKKyAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2Nr
PiBtX3VubGlua2VkRXZhbENvZGVCbG9jazsKK307CisKK2NsYXNzIFByb2dyYW1FeGVjdXRhYmxl
IGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBMTElu
dE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxl
IEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6
U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIFByb2dy
YW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UpCisgICAgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5l
dyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgp
KSkgUHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+
ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOwor
ICAgIH0KKworCisgICAgSlNPYmplY3QqIGluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwg
Q2FsbEZyYW1lKiwgSlNTY29wZSopOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwq
KTsKKworICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAgeworICAgICAgICBy
ZXR1cm4gbV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgIH0KKworICAgIEpTT2JqZWN0KiBj
aGVja1N5bnRheChFeGVjU3RhdGUqKTsKKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJh
dGVkSklUQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNh
bGwoKTsKKyAgICB9CisgICAgICAgIAorICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVj
dHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8p
CisgICAgeworICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVj
dCwgcHJvdG8sIFR5cGVJbmZvKFByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3Mp
LCBpbmZvKCkpOworICAgIH0KKyAgICAgICAgCisgICAgREVDTEFSRV9JTkZPOworCisgICAgRXhl
Y3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5m
byh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3Rvcktp
bmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3RO
ZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgp
LCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUp
OyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZy
aWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhl
Y1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGls
ZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJyaWVyPFVubGlua2Vk
UHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2s7CisgICAgV3JpdGVC
YXJyaWVyPFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3JhbUNvZGVCbG9jazsKK307CisKK2NsYXNz
IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUg
eworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAg
dHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk
IFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9y
dGFsOworCisgICAgc3RhdGljIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0
YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0Nl
bGwqKTsKKworICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAgewor
ICAgICAgICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgIH0KKwor
ICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAg
ICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMg
U3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFs
T2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6
Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisKKyAgICBERUNM
QVJFX0lORk87CisKKyAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsg
cmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwg
ZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpNb2R1bGUs
IFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6Ok1vZHVsZUV2YWx1YXRl
TW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFs
c2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KKworICAgIFVubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKCkgeyByZXR1cm4gbV91
bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7IH0KKworICAgIFN5bWJvbFRhYmxl
KiBtb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkgeyByZXR1cm4gbV9tb2R1bGVFbnZpcm9u
bWVudFN5bWJvbFRhYmxlLmdldCgpOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4
ZWN1dGFibGVCYXNlOworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAg
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwor
CisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwor
CisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxp
bmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7CisgICAgV3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxl
PiBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7CisgICAgV3JpdGVCYXJyaWVyPE1vZHVs
ZVByb2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKK307CisKK2NsYXNz
IEZ1bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAg
ICBmcmllbmQgY2xhc3MgSklUOworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0
b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3Mg
fCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSog
Y3JlYXRlKAorICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5r
ZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgCisgICAgICAgIHVuc2ln
bmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1
bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgeworICAgICAgICBG
dW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2Vs
bDxGdW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5jdGlvbkV4ZWN1dGFibGUodm0sIHNv
dXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBzdGFydENvbHVt
biwgZW5kQ29sdW1uLCBpbnRyaW5zaWMpOworICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVh
dGlvbih2bSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKyAgICBzdGF0aWMg
RnVuY3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgKKyAgICAgICAgY29uc3QgSWRlbnRp
ZmllciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNlQ29kZSYsIAorICAgICAgICBKU09i
amVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcik7CisKKyAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBVbmxpbmtlZEZ1bmN0aW9uRXhl
Y3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIGVp
dGhlciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhpcyBjYW4gYmUgYXBwcm9wcmlhdGUK
KyAgICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0IHRoYXQgZG9uJ3QgdmFyeSBiZXR3
ZWVuIGNhbGwgYW5kIGNvbnN0cnVjdCAtLQorICAgIC8vIGZvciBleGFtcGxlLCBhcmd1bWVudHNS
ZWdpc3RlcigpLgorICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBlaXRoZXJDb2RlQmxvY2soKQorICAg
IHsKKyAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBt
X2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNv
bnN0cnVjdC5nZXQoKTsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JD
YWxsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhIW1fY29kZUJsb2NrRm9yQ2FsbDsK
KyAgICB9CisKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCisgICAg
eworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgIH0KKworICAg
IGJvb2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKworICAgIEZ1bmN0aW9u
Q29kZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKyAgICAgICAgCisgICAgYm9v
bCBpc0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAg
ICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBpc0dlbmVy
YXRlZEZvckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7
CisgICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpOworICAgIH0KKyAgICAg
ICAgCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAg
ICAgICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7CisgICAgICAgIEFTU0VSVChraW5k
ID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9yQ29uc3Ry
dWN0KCk7CisgICAgfQorCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2Nr
Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOworICAgICAgICAKKyAgICBGdW5jdGlvbkNvZGVC
bG9jayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJsb2NrRm9yKGtpbmQpOworICAgIH0K
KworICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KCkgCisgICAgewor
ICAgICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCkKKyAgICAgICAgICAgIG1fcmV0
dXJuU3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0ZSgpOworCisgICAgICAgIHJldHVy
biBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7CisgICAgfQorICAgICAgICAKKyAgICBGdW5jdGlv
bk1vZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0
aW9uTW9kZSgpOyB9CisgICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJu
IG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5jdGlvbigpOyB9CisgICAgQ29uc3Ry
dWN0QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4
ZWN1dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQorICAgIGJvb2wgaXNDbGFzcygpIGNvbnN0
IHsgcmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9CisgICAgYm9vbCBpc0Fycm93RnVu
Y3Rpb24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OkFy
cm93RnVuY3Rpb25Nb2RlOyB9CisgICAgYm9vbCBpc0dldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBh
cnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVyTW9kZTsgfQorICAgIGJvb2wgaXNT
ZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OlNl
dHRlck1vZGU7IH0KKyAgICBib29sIGlzR2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gU291cmNl
UGFyc2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsIFNvdXJjZVBh
cnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZSkuY29udGFpbnMocGFyc2VNb2Rl
KCkpOyB9CisgICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09
IFNvdXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQorICAgIGJvb2wgaGFzQ2FsbGVyQW5kQXJn
dW1lbnRzUHJvcGVydGllcygpIGNvbnN0CisgICAgeworICAgICAgICAvLyBQZXIgaHR0cHM6Ly90
YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVuLWV4dGVuc2lvbnMsIG9ubHkgc2xv
cHB5LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9sZC1zdHlsZSAocHJlLUVTNikgc3lu
dGFjdGljIGZvcm1zIGNhbiBjb250YWluCisgICAgICAgIC8vICJjYWxsZXIiIGFuZCAiYXJndW1l
bnRzIi4KKyAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUoKSAmJiBwYXJzZU1vZGUoKSA9PSBT
b3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAmJiAhaXNDbGFzc0NvbnN0cnVjdG9y
RnVuY3Rpb24oKTsKKyAgICB9CisgICAgYm9vbCBoYXNQcm90b3R5cGVQcm9wZXJ0eSgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KAorICAgICAgICAgICAg
U291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUsCisgICAgICAgICAgICBTb3VyY2VQ
YXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2Rl
OjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCisgICAgICAgICkuY29udGFpbnMocGFyc2VN
b2RlKCkpIHx8IGlzQ2xhc3MoKTsKKyAgICB9CisgICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2
ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJp
dmVkQ29udGV4dFR5cGUoKTsgfQorICAgIGJvb2wgaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24o
KSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNDbGFzc0NvbnN0cnVjdG9y
RnVuY3Rpb24oKTsgfQorICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUoKSB7IHJldHVybiBtX3Vu
bGlua2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9CisgICAgY29uc3QgSWRlbnRpZmllciYgZWNtYU5h
bWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZWNtYU5hbWUoKTsgfQorICAgIGNv
bnN0IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRh
YmxlLT5pbmZlcnJlZE5hbWUoKTsgfQorICAgIHVuc2lnbmVkIHBhcmFtZXRlckNvdW50KCkgY29u
c3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7IH0gLy8g
RXhjbHVkaW5nICd0aGlzJyEKKyAgICB1bnNpZ25lZCBmdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsg
cmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbkxlbmd0aCgpOyB9CisgICAgU291
cmNlUGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRh
YmxlLT5wYXJzZU1vZGUoKTsgfQorICAgIEpTUGFyc2VyU2NyaXB0TW9kZSBzY3JpcHRNb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnNjcmlwdE1vZGUoKTsgfQorICAg
IGNvbnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtl
ZEV4ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hp
bGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVh
dGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVl
IHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9i
YWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1
cmVGbGFncyksIGluZm8oKSk7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0
T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7IH0KKworICAg
IHZvaWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmlsaW5nU3RhcnRFbmRPZmZzZXRzKHVu
c2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0
T2Zmc2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KQorICAgIHsKKyAgICAgICAg
bV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7CisgICAgICAg
IG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0Owor
ICAgICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0
OworICAgIH0KKworICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEluZmVycmVkVmFsdWUqIHNpbmds
ZXRvbkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25GdW5jdGlvbi5nZXQoKTsgfQorCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBGdW5jdGlvbkV4
ZWN1dGFibGUoCisgICAgICAgIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIFVubGlua2VkRnVuY3Rp
b25FeGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAKKyAgICAgICAgdW5zaWduZWQgbGFz
dExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNp
Yyk7CisgICAgCisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYpOworCisgICAgZnJpZW5kIGNs
YXNzIFNjcmlwdEV4ZWN1dGFibGU7CisgICAgCisgICAgdW5zaWduZWQgbV9wYXJhbWV0ZXJzU3Rh
cnRPZmZzZXQ7CisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlPiBt
X3VubGlua2VkRXhlY3V0YWJsZTsKKyAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+
IG1fY29kZUJsb2NrRm9yQ2FsbDsKKyAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+
IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0OworICAgIFJlZlB0cjxUeXBlU2V0PiBtX3JldHVyblN0
YXRlbWVudFR5cGVTZXQ7CisgICAgV3JpdGVCYXJyaWVyPEluZmVycmVkVmFsdWU+IG1fc2luZ2xl
dG9uRnVuY3Rpb247Cit9OworCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorY2xhc3MgV2ViQXNz
ZW1ibHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2ln
bmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0lt
bW9ydGFsOworCisgICAgc3RhdGljIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2
bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWdu
ZWQgZnVuY3Rpb25JbmRleCkKKyAgICB7CisgICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFdlYkFzc2VtYmx5RXhlY3V0
YWJsZT4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSh2bSwgc291cmNlLCBtb2R1bGUs
IGZ1bmN0aW9uSW5kZXgpOworICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7
CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1
cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Qs
IEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUo
dm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5
cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBk
ZXN0cm95KEpTQ2VsbCopOworCisgICAgREVDTEFSRV9JTkZPOworCisgICAgdm9pZCBwcmVwYXJl
Rm9yRXhlY3V0aW9uKFZNJik7CisKKyAgICBXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2Nr
Rm9yQ2FsbCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgp
OworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Cisg
ICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3QgU291cmNlQ29kZSYsIEpTV2FzbU1v
ZHVsZSosIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRD
aGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgU291cmNlQ29kZSBtX3NvdXJj
ZTsKKyAgICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBtX21vZHVsZTsKKyAgICB1bnNpZ25l
ZCBtX2Z1bmN0aW9uSW5kZXg7CisKKyAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlDb2RlQmxv
Y2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKK307CisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1l
IEV4ZWN1dGFibGVUeXBlPgorSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JF
eGVjdXRpb24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQor
eworICAgIGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7CisgICAgICAgIGlmIChzdGQ6OmlzX3Nh
bWU8RXhlY3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICBy
ZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVjdXRhYmxl
Kj4odGhpcyktPmNvZGVCbG9jaygpKTsKKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4
ZWN1dGFibGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVz
dWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJs
ZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7CisgICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxF
eGVjdXRhYmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAg
ICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOworICAgICAgICBlbHNlIGlmIChz
dGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZhbHVlKQor
ICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxG
dW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
cmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1w
bCh2bSwgZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRDb2RlQmxvY2spOworfQorCit9IC8v
IG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Z1bmN0
aW9uRXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0Z1bmN0aW9uRXhlY3V0YWJsZS5oCShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9GdW5jdGlvbkV4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpA
QCAtMjUsNTM2ICsyNSwxMCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkFyaXR5Q2hl
Y2tNb2RlLmgiCi0jaW5jbHVkZSAiQ2FsbERhdGEuaCIKLSNpbmNsdWRlICJDb2RlQmxvY2tIYXNo
LmgiCi0jaW5jbHVkZSAiQ29kZVNwZWNpYWxpemF0aW9uS2luZC5oIgotI2luY2x1ZGUgIkNvbXBp
bGF0aW9uUmVzdWx0LmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZUluZm8uaCIKLSNpbmNsdWRlICJI
YW5kbGVySW5mby5oIgotI2luY2x1ZGUgIkluZmVycmVkVmFsdWUuaCIKLSNpbmNsdWRlICJKSVRD
b2RlLmgiCi0jaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKLSNpbmNsdWRlICJTb3VyY2VDb2Rl
LmgiCi0jaW5jbHVkZSAiVHlwZVNldC5oIgotI2luY2x1ZGUgIlVubGlua2VkQ29kZUJsb2NrLmgi
Ci0jaW5jbHVkZSAiVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUuaCIKKyNpbmNsdWRlICJTY3Jp
cHRFeGVjdXRhYmxlLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCi1jbGFzcyBDb2RlQmxvY2s7Ci1j
bGFzcyBFdmFsQ29kZUJsb2NrOwotY2xhc3MgRnVuY3Rpb25Db2RlQmxvY2s7Ci1jbGFzcyBKU1Nj
b3BlOwotY2xhc3MgSlNXYXNtTW9kdWxlOwotY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwot
Y2xhc3MgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLWNsYXNzIFByb2dyYW1Db2RlQmxvY2s7Ci1j
bGFzcyBXZWJBc3NlbWJseUNvZGVCbG9jazsKLQotZW51bSBDb21waWxhdGlvbktpbmQgeyBGaXJz
dENvbXBpbGF0aW9uLCBPcHRpbWl6aW5nQ29tcGlsYXRpb24gfTsKLQotaW5saW5lIGJvb2wgaXND
YWxsKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsKLSAgICBpZiAoa2luZCA9PSBDb2Rl
Rm9yQ2FsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNvbnN0cnVjdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jbGFzcyBFeGVjdXRhYmxlQmFz
ZSA6IHB1YmxpYyBKU0NlbGwgewotICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0KLXByb3RlY3RlZDoK
LSAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QgPSAwOwotICAgIHN0
YXRpYyBjb25zdCBpbnQgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEID0gLTE7Ci0KLSAgICBF
eGVjdXRhYmxlQmFzZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBpbnQgbnVtUGFyYW1l
dGVycywgSW50cmluc2ljIGludHJpbnNpYykKLSAgICAgICAgOiBKU0NlbGwodm0sIHN0cnVjdHVy
ZSkKLSAgICAgICAgLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKG51bVBhcmFtZXRlcnMpCi0gICAg
ICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0KG51bVBhcmFtZXRlcnMpCi0gICAgICAg
ICwgbV9pbnRyaW5zaWMoaW50cmluc2ljKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIGZpbmlz
aENyZWF0aW9uKFZNJiB2bSkKLSAgICB7Ci0gICAgICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZt
KTsKLSAgICB9Ci0KLXB1YmxpYzoKLSAgICB0eXBlZGVmIEpTQ2VsbCBCYXNlOwotICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzOwot
Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRydWU7Ci0gICAgc3Rh
dGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLSAgICAgICAgCi0gICAgQ29kZUJsb2NrSGFzaCBo
YXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OwotCi0gICAgYm9vbCBpc0V2YWxF
eGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gRXZhbEV4
ZWN1dGFibGVUeXBlOwotICAgIH0KLSAgICBib29sIGlzRnVuY3Rpb25FeGVjdXRhYmxlKCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlVHlw
ZTsKLSAgICB9Ci0gICAgYm9vbCBpc1Byb2dyYW1FeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0g
ICAgICAgIHJldHVybiB0eXBlKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwotICAgIH0KLSAg
ICBib29sIGlzTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJu
IHR5cGUoKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotCi0KLSAgICBi
b29sIGlzSG9zdEZ1bmN0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFTU0VSVCgobV9udW1Q
YXJhbWV0ZXJzRm9yQ2FsbCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSA9PSAobV9udW1QYXJh
bWV0ZXJzRm9yQ29uc3RydWN0ID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QpKTsKLSAgICAgICAg
cmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVDsK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi0gICAgYm9vbCBpc1dlYkFzc2VtYmx5
RXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09IFdlYkFz
c2VtYmx5RXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBzdGF0aWMgU3RydWN0
dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
LCBKU1ZhbHVlIHByb3RvKSB7IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2Jq
ZWN0LCBwcm90bywgVHlwZUluZm8oQ2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsg
fQotICAgICAgICAKLSAgICB2b2lkIGNsZWFyQ29kZSgpOwotCi0gICAgREVDTEFSRV9FWFBPUlRf
SU5GTzsKLQotcHJvdGVjdGVkOgotICAgIGludCBtX251bVBhcmFtZXRlcnNGb3JDYWxsOwotICAg
IGludCBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3Q7Ci0KLXB1YmxpYzoKLSAgICBQYXNzUmVm
UHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCkKLSAgICB7Ci0gICAgICAgIEFT
U0VSVChtX2ppdENvZGVGb3JDYWxsKTsKLSAgICAgICAgcmV0dXJuIG1faml0Q29kZUZvckNhbGw7
Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ29u
c3RydWN0KCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2ppdENvZGVGb3JDb25zdHJ1Y3QpOwot
ICAgICAgICByZXR1cm4gbV9qaXRDb2RlRm9yQ29uc3RydWN0OwotICAgIH0KLSAgICAgICAgCi0g
ICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yKENvZGVTcGVjaWFsaXph
dGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQot
ICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7Ci0gICAgICAgIEFT
U0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gZ2VuZXJhdGVk
SklUQ29kZUZvckNvbnN0cnVjdCgpOwotICAgIH0KLSAgICAKLSAgICBNYWNyb0Fzc2VtYmxlckNv
ZGVQdHIgZW50cnlwb2ludEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIEFyaXR5Q2hl
Y2tNb2RlIGFyaXR5KQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNhY2hl
ZCByZXN1bHQuIFdlIG9ubHkgaGF2ZSBpdCBmb3IgYXJpdHkgY2hlY2sgYmVjYXVzZSB3ZSB1c2Ug
dGhlCi0gICAgICAgIC8vIG5vLWFyaXR5IGVudHJ5cG9pbnQgaW4gbm9uLXZpcnR1YWwgY2FsbHMs
IHdoaWNoIHdpbGwgImNhY2hlIiB0aGlzIHZhbHVlIGRpcmVjdGx5IGluCi0gICAgICAgIC8vIG1h
Y2hpbmUgY29kZS4KLSAgICAgICAgaWYgKGFyaXR5ID09IE11c3RDaGVja0FyaXR5KSB7Ci0gICAg
ICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6Ci0g
ICAgICAgICAgICAgICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPSBtX2ppdENv
ZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JDb25z
dHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQg
PSBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjaykKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0KLSAgICAg
ICAgICAgIGdlbmVyYXRlZEpJVENvZGVGb3Ioa2luZCktPmFkZHJlc3NGb3JDYWxsKGFyaXR5KTsK
LSAgICAgICAgaWYgKGFyaXR5ID09IE11c3RDaGVja0FyaXR5KSB7Ci0gICAgICAgICAgICAvLyBD
YWNoZSB0aGUgcmVzdWx0OyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIEpJVCdzIHZpcnR1YWwg
Y2FsbCBvcHRpbWl6YXRpb25zLgotICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAg
ICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgICAgIG1faml0Q29kZUZvckNhbGxX
aXRoQXJpdHlDaGVjayA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JD
b25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0K
LQotICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZKSVRDb2RlV2l0aEFyaXR5Q2hlY2tGb3Io
Ci0gICAgICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIHN3
aXRjaCAoa2luZCkgewotICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgcmV0
dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9qaXRDb2RlRm9yQ2FsbFdpdGhB
cml0eUNoZWNrKTsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAgICAgICAgICAg
cmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9qaXRDb2RlRm9yQ29uc3Ry
dWN0V2l0aEFyaXR5Q2hlY2spOwotICAgICAgICB9Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUX05P
VF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMg
cHRyZGlmZl90IG9mZnNldE9mTnVtUGFyYW1ldGVyc0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAg
ICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVy
c0ZvckNhbGwpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAg
ICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9udW1QYXJhbWV0
ZXJzRm9yQ29uc3RydWN0KTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0pJVENvZGVGb3JDYWxsKCkg
Y29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDYWxsID49IDA7
Ci0gICAgfQotICAgICAgICAKLSAgICBib29sIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKSBjb25z
dAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA+PSAw
OwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yKENvZGVTcGVjaWFsaXph
dGlvbktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JD
YWxsKQotICAgICAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDYWxsKCk7Ci0gICAgICAgIEFT
U0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gaGFzSklUQ29k
ZUZvckNvbnN0cnVjdCgpOwotICAgIH0KLQotICAgIC8vIEludHJpbnNpY3MgYXJlIG9ubHkgZm9y
IGNhbGxzLCBjdXJyZW50bHkuCi0gICAgSW50cmluc2ljIGludHJpbnNpYygpIGNvbnN0IHsgcmV0
dXJuIG1faW50cmluc2ljOyB9Ci0gICAgICAgIAotICAgIEludHJpbnNpYyBpbnRyaW5zaWNGb3Io
Q29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGlz
Q2FsbChraW5kKSkKLSAgICAgICAgICAgIHJldHVybiBpbnRyaW5zaWMoKTsKLSAgICAgICAgcmV0
dXJuIE5vSW50cmluc2ljOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0m
KSBjb25zdDsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgSW50cmluc2ljIG1faW50cmluc2lj
OwotICAgIFJlZlB0cjxKSVRDb2RlPiBtX2ppdENvZGVGb3JDYWxsOwotICAgIFJlZlB0cjxKSVRD
b2RlPiBtX2ppdENvZGVGb3JDb25zdHJ1Y3Q7Ci0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1f
aml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjazsKLSAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIg
bV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2s7Ci19OwotCi1jbGFzcyBOYXRpdmVF
eGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLSAgICBmcmllbmQgY2xh
c3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6
Ci0gICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJ
bW1vcnRhbDsKLQotICAgIHN0YXRpYyBOYXRpdmVFeGVjdXRhYmxlKiBjcmVhdGUoVk0mIHZtLCBQ
YXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIFBh
c3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVj
dG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJpbmcmIG5hbWUpOwotCi0gICAgc3Rh
dGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihD
b2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0
aW9uKCkgeyByZXR1cm4gbV9mdW5jdGlvbjsgfQotICAgIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVj
dG9yKCkgeyByZXR1cm4gbV9jb25zdHJ1Y3RvcjsgfQotICAgICAgICAKLSAgICBOYXRpdmVGdW5j
dGlvbiBuYXRpdmVGdW5jdGlvbkZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAg
ewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBm
dW5jdGlvbigpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAg
ICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKCk7Ci0gICAgfQotICAgICAgICAKLSAgICBzdGF0aWMg
cHRyZGlmZl90IG9mZnNldE9mTmF0aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAg
ICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUsIG1fZnVuY3Rpb24p
OwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0
dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2NvbnN0cnVjdG9yKTsKLSAg
ICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2Jh
bE9iamVjdCosIEpTVmFsdWUgcHJvdG8pOwotICAgICAgICAKLSAgICBERUNMQVJFX0lORk87Ci0K
LSAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KLQotcHJv
dGVjdGVkOgotICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mLCBQYXNzUmVmUHRyPEpJVENvZGU+
IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3Ry
aW5nJiBuYW1lKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7
Ci0KLSAgICBOYXRpdmVFeGVjdXRhYmxlKFZNJiwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIE5h
dGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMpOwotCi0gICAgTmF0aXZlRnVuY3Rp
b24gbV9mdW5jdGlvbjsKLSAgICBOYXRpdmVGdW5jdGlvbiBtX2NvbnN0cnVjdG9yOwotCi0gICAg
U3RyaW5nIG1fbmFtZTsKLX07Ci0KLWNsYXNzIFNjcmlwdEV4ZWN1dGFibGUgOiBwdWJsaWMgRXhl
Y3V0YWJsZUJhc2UgewotcHVibGljOgotICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsK
LSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1
cmVGbGFnczsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0gICAgICAgIAot
ICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsK
LQotICAgIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNl
OyB9Ci0gICAgaW50cHRyX3Qgc291cmNlSUQoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92
aWRlcklEKCk7IH0KLSAgICBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCgpIGNvbnN0IHsgcmV0dXJu
IG1fc291cmNlLnByb3ZpZGVyKCktPnVybCgpOyB9Ci0gICAgaW50IGZpcnN0TGluZSgpIGNvbnN0
IHsgcmV0dXJuIG1fZmlyc3RMaW5lOyB9Ci0gICAgdm9pZCBzZXRPdmVycmlkZUxpbmVOdW1iZXIo
aW50IG92ZXJyaWRlTGluZU51bWJlcikgeyBtX292ZXJyaWRlTGluZU51bWJlciA9IG92ZXJyaWRl
TGluZU51bWJlcjsgfQotICAgIGJvb2wgaGFzT3ZlcnJpZGVMaW5lTnVtYmVyKCkgY29uc3QgeyBy
ZXR1cm4gbV9vdmVycmlkZUxpbmVOdW1iZXIgIT0gLTE7IH0KLSAgICBpbnQgb3ZlcnJpZGVMaW5l
TnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9vdmVycmlkZUxpbmVOdW1iZXI7IH0KLSAgICBpbnQg
bGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2xhc3RMaW5lOyB9Ci0gICAgdW5zaWduZWQgc3Rh
cnRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0Q29sdW1uOyB9Ci0gICAgdW5zaWduZWQg
ZW5kQ29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9lbmRDb2x1bW47IH0KLSAgICB1bnNpZ25lZCB0
eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3R5cGVQcm9maWxpbmdT
dGFydE9mZnNldDsgfQotICAgIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSBjb25z
dCB7IHJldHVybiBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQ7IH0KLQotICAgIGJvb2wgdXNlc0V2
YWwoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzICYgRXZhbEZlYXR1cmU7IH0KLSAgICBib29s
IHVzZXNBcmd1bWVudHMoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzICYgQXJndW1lbnRzRmVh
dHVyZTsgfQotICAgIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJu
IG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dDsgfQotICAgIGJvb2wgaXNTdHJpY3RNb2RlKCkgY29u
c3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIFN0cmljdE1vZGVGZWF0dXJlOyB9Ci0gICAgRGVyaXZl
ZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19j
YXN0PERlcml2ZWRDb250ZXh0VHlwZT4obV9kZXJpdmVkQ29udGV4dFR5cGUpOyB9Ci0gICAgRXZh
bENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0
PEV2YWxDb250ZXh0VHlwZT4obV9ldmFsQ29udGV4dFR5cGUpOyB9Ci0KLSAgICBFQ01BTW9kZSBl
Y21hTW9kZSgpIGNvbnN0IHsgcmV0dXJuIGlzU3RyaWN0TW9kZSgpID8gU3RyaWN0TW9kZSA6IE5v
dFN0cmljdE1vZGU7IH0KLSAgICAgICAgCi0gICAgdm9pZCBzZXROZXZlcklubGluZShib29sIHZh
bHVlKSB7IG1fbmV2ZXJJbmxpbmUgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0TmV2ZXJPcHRpbWl6
ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJPcHRpbWl6ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXRO
ZXZlckZUTE9wdGltaXplKGJvb2wgdmFsdWUpIHsgbV9uZXZlckZUTE9wdGltaXplID0gdmFsdWU7
IH0KLSAgICB2b2lkIHNldERpZFRyeVRvRW50ZXJJbkxvb3AoYm9vbCB2YWx1ZSkgeyBtX2RpZFRy
eVRvRW50ZXJJbkxvb3AgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0Q2FuVXNlT1NSRXhpdEZ1enpp
bmcoYm9vbCB2YWx1ZSkgeyBtX2NhblVzZU9TUkV4aXRGdXp6aW5nID0gdmFsdWU7IH0KLSAgICBi
b29sIG5ldmVySW5saW5lKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlcklubGluZTsgfQotICAgIGJv
b2wgbmV2ZXJPcHRpbWl6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJPcHRpbWl6ZTsgfQotICAg
IGJvb2wgbmV2ZXJGVExPcHRpbWl6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJGVExPcHRpbWl6
ZTsgfQotICAgIGJvb2wgZGlkVHJ5VG9FbnRlckluTG9vcCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlk
VHJ5VG9FbnRlckluTG9vcDsgfQotICAgIGJvb2wgaXNJbmxpbmluZ0NhbmRpZGF0ZSgpIGNvbnN0
IHsgcmV0dXJuICFuZXZlcklubGluZSgpOyB9Ci0gICAgYm9vbCBpc09rVG9PcHRpbWl6ZSgpIGNv
bnN0IHsgcmV0dXJuICFuZXZlck9wdGltaXplKCk7IH0KLSAgICBib29sIGNhblVzZU9TUkV4aXRG
dXp6aW5nKCkgY29uc3QgeyByZXR1cm4gbV9jYW5Vc2VPU1JFeGl0RnV6emluZzsgfQotICAgIAot
ICAgIGJvb2wqIGFkZHJlc3NPZkRpZFRyeVRvRW50ZXJJbkxvb3AoKSB7IHJldHVybiAmbV9kaWRU
cnlUb0VudGVySW5Mb29wOyB9Ci0KLSAgICBDb2RlRmVhdHVyZXMgZmVhdHVyZXMoKSBjb25zdCB7
IHJldHVybiBtX2ZlYXR1cmVzOyB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfRVhQT1JUX0lORk87
Ci0KLSAgICB2b2lkIHJlY29yZFBhcnNlKENvZGVGZWF0dXJlcyBmZWF0dXJlcywgYm9vbCBoYXND
YXB0dXJlZFZhcmlhYmxlcywgaW50IGZpcnN0TGluZSwgaW50IGxhc3RMaW5lLCB1bnNpZ25lZCBz
dGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uKQotICAgIHsKLSAgICAgICAgbV9mZWF0dXJl
cyA9IGZlYXR1cmVzOwotICAgICAgICBtX2hhc0NhcHR1cmVkVmFyaWFibGVzID0gaGFzQ2FwdHVy
ZWRWYXJpYWJsZXM7Ci0gICAgICAgIG1fZmlyc3RMaW5lID0gZmlyc3RMaW5lOwotICAgICAgICBt
X2xhc3RMaW5lID0gbGFzdExpbmU7Ci0gICAgICAgIEFTU0VSVChzdGFydENvbHVtbiAhPSBVSU5U
X01BWCk7Ci0gICAgICAgIG1fc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKLSAgICAgICAgQVNT
RVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgICAgIG1fZW5kQ29sdW1uID0gZW5kQ29s
dW1uOwotICAgIH0KLQotICAgIHZvaWQgaW5zdGFsbENvZGUoQ29kZUJsb2NrKik7Ci0gICAgdm9p
ZCBpbnN0YWxsQ29kZShWTSYsIENvZGVCbG9jayosIENvZGVUeXBlLCBDb2RlU3BlY2lhbGl6YXRp
b25LaW5kKTsKLSAgICBDb2RlQmxvY2sqIG5ld0NvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kLCBKU0Z1bmN0aW9uKiwgSlNTY29wZSosIEpTT2JqZWN0KiYgZXhjZXB0aW9uKTsKLSAg
ICBDb2RlQmxvY2sqIG5ld1JlcGxhY2VtZW50Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlv
bktpbmQpOwotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgYW4gaW50ZXJlc3RpbmcgR0Mgc3Rv
cnkuIENhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgYXNraW5nIHVzIHRvIGNyZWF0ZSBhIENv
ZGVCbG9jawotICAgIC8vIHRoYXQgaXMgbm90IGpldHRpc29uZWQgYmVmb3JlIHRoaXMgZnVuY3Rp
b24gcmV0dXJucy4gQ2FsbGVycyBhcmUgZXNzZW50aWFsbHkgYXNraW5nIGZvciBhIHN0cm9uZyBy
ZWZlcmVuY2UKLSAgICAvLyB0byB0aGUgQ29kZUJsb2NrLiBCZWNhdXNlIHRoZSBFeGVjdXRhYmxl
IG1heSBiZSBhbGxvY2F0aW5nIHRoZSBDb2RlQmxvY2ssIHdlIHJlcXVpcmUgY2FsbGVycyB0byBw
YXNzIGluCi0gICAgLy8gdGhlaXIgQ29kZUJsb2NrKiYgcmVmZXJlbmNlIGJlY2F1c2UgaXQncyBz
YWZlIGZvciBDb2RlQmxvY2sgdG8gYmUgamV0dGlzb25lZCBpZiBFeGVjdXRhYmxlIGlzIHRoZSBv
bmx5IHRoaW5nCi0gICAgLy8gdG8gcG9pbnQgdG8gaXQuIFRoaXMgZm9yY2VzIGNhbGxlcnMgdG8g
aGF2ZSBhIENvZGVCbG9jayogaW4gYSByZWdpc3RlciBvciBvbiB0aGUgc3RhY2sgdGhhdCB3aWxs
IGJlIG1hcmtlZAotICAgIC8vIGJ5IGNvbnNlcnZhdGl2ZSBHQyBpZiBhIEdDIGhhcHBlbnMgYWZ0
ZXIgd2UgY3JlYXRlIHRoZSBDb2RlQmxvY2suCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1
dGFibGVUeXBlPgotICAgIEpTT2JqZWN0KiBwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJiwgSlNGdW5j
dGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJiByZXN1
bHRDb2RlQmxvY2spOwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+IHZvaWQgZm9y
RWFjaENvZGVCbG9jayhGdW5jdG9yJiYpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBF
eGVjdXRhYmxlQmFzZTsKLSAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoVk0m
LCBKU0Z1bmN0aW9uKiwgSlNTY29wZSosIENvZGVTcGVjaWFsaXphdGlvbktpbmQsIENvZGVCbG9j
ayomKTsKLQotcHJvdGVjdGVkOgotICAgIFNjcmlwdEV4ZWN1dGFibGUoU3RydWN0dXJlKiwgVk0m
LCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRl
eHRUeXBlLCBib29sIGlzSW5BcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlLCBJ
bnRyaW5zaWMpOwotCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCi0gICAgewotICAg
ICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIHZtLmhlYXAuYWRkRXhlY3V0
YWJsZSh0aGlzKTsgLy8gQmFsYW5jZWQgYnkgSGVhcDo6ZGVsZXRlVW5tYXJrZWRDb21waWxlZENv
ZGUoKS4KLQotI2lmIEVOQUJMRShDT0RFQkxPQ0tfU0FNUExJTkcpCi0gICAgICAgIGlmIChTYW1w
bGluZ1Rvb2wqIHNhbXBsZXIgPSB2bS5pbnRlcnByZXRlci0+c2FtcGxlcigpKQotICAgICAgICAg
ICAgc2FtcGxlci0+bm90aWZ5T2ZTY29wZSh2bSwgdGhpcyk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAg
ICBDb2RlRmVhdHVyZXMgbV9mZWF0dXJlczsKLSAgICBib29sIG1fZGlkVHJ5VG9FbnRlckluTG9v
cDsKLSAgICBib29sIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMgOiAxOwotICAgIGJvb2wgbV9uZXZl
cklubGluZSA6IDE7Ci0gICAgYm9vbCBtX25ldmVyT3B0aW1pemUgOiAxOwotICAgIGJvb2wgbV9u
ZXZlckZUTE9wdGltaXplIDogMTsKLSAgICBib29sIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dCA6
IDE7Ci0gICAgYm9vbCBtX2NhblVzZU9TUkV4aXRGdXp6aW5nIDogMTsKLSAgICB1bnNpZ25lZCBt
X2Rlcml2ZWRDb250ZXh0VHlwZSA6IDI7IC8vIERlcml2ZWRDb250ZXh0VHlwZQotICAgIHVuc2ln
bmVkIG1fZXZhbENvbnRleHRUeXBlIDogMjsgLy8gRXZhbENvbnRleHRUeXBlCi0KLSAgICBpbnQg
bV9vdmVycmlkZUxpbmVOdW1iZXI7Ci0gICAgaW50IG1fZmlyc3RMaW5lOwotICAgIGludCBtX2xh
c3RMaW5lOwotICAgIHVuc2lnbmVkIG1fc3RhcnRDb2x1bW47Ci0gICAgdW5zaWduZWQgbV9lbmRD
b2x1bW47Ci0gICAgdW5zaWduZWQgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7Ci0gICAgdW5z
aWduZWQgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OwotICAgIFNvdXJjZUNvZGUgbV9zb3VyY2U7
Ci19OwotCi1jbGFzcyBFdmFsRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRh
YmxlIHsKLSAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwotcHVibGljOgot
ICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOwotICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJ
bW1vcnRhbDsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBFdmFs
Q29kZUJsb2NrKiBjb2RlQmxvY2soKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZXZhbENvZGVC
bG9jay5nZXQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRXZhbEV4ZWN1dGFibGUqIGNyZWF0ZShF
eGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVy
aXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0
VHlwZSwgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCopOwotCi0gICAgUGFzc1JlZlB0cjxKSVRD
b2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZWRK
SVRDb2RlRm9yQ2FsbCgpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0
cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJv
dG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9i
amVjdCwgcHJvdG8sIFR5cGVJbmZvKEV2YWxFeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3Mp
LCBpbmZvKCkpOwotICAgIH0KLSAgICAgICAgCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgRXhl
Y3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5m
byh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3Rvcktp
bmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3RO
ZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgp
LCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBldmFsQ29udGV4dFR5cGUoKSk7IH0K
LQotICAgIHVuc2lnbmVkIG51bVZhcmlhYmxlcygpIHsgcmV0dXJuIG1fdW5saW5rZWRFdmFsQ29k
ZUJsb2NrLT5udW1WYXJpYWJsZXMoKTsgfQotICAgIHVuc2lnbmVkIG51bWJlck9mRnVuY3Rpb25E
ZWNscygpIHsgcmV0dXJuIG1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9u
RGVjbHMoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsK
LSAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKLQotICAgIEV2YWxFeGVjdXRhYmxl
KEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVy
aXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0
VHlwZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNp
dG9yJik7Ci0KLSAgICBXcml0ZUJhcnJpZXI8RXZhbENvZGVCbG9jaz4gbV9ldmFsQ29kZUJsb2Nr
OwotICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZEV2YWxDb2RlQmxvY2s+IG1fdW5saW5rZWRFdmFs
Q29kZUJsb2NrOwotfTsKLQotY2xhc3MgUHJvZ3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMg
U2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3Rv
cjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8
IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgUHJvZ3JhbUV4ZWN1dGFibGUqIGNy
ZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICB7Ci0g
ICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxv
Y2F0ZUNlbGw8UHJvZ3JhbUV4ZWN1dGFibGU+KCpleGVjLT5oZWFwKCkpKSBQcm9ncmFtRXhlY3V0
YWJsZShleGVjLCBzb3VyY2UpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihl
eGVjLT52bSgpKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci0gICAgfQotCi0KLSAgICBK
U09iamVjdCogaW5pdGlhbGl6ZUdsb2JhbFByb3BlcnRpZXMoVk0mLCBDYWxsRnJhbWUqLCBKU1Nj
b3BlKik7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgUHJvZ3Jh
bUNvZGVCbG9jayogY29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3Byb2dyYW1D
b2RlQmxvY2suZ2V0KCk7Ci0gICAgfQotCi0gICAgSlNPYmplY3QqIGNoZWNrU3ludGF4KEV4ZWNT
dGF0ZSopOwotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgIH0KLSAg
ICAgICAgCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNH
bG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAg
IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUlu
Zm8oUHJvZ3JhbUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAg
fQotICAgICAgICAKLSAgICBERUNMQVJFX0lORk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBleGVj
dXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlz
U3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJz
ZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291cmNlUGFy
c2VNb2RlOjpQcm9ncmFtTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlv
bkNvbnRleHQoKSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KLQotcHJpdmF0ZToK
LSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlw
dEV4ZWN1dGFibGU7Ci0KLSAgICBQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBT
b3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNs
b3RWaXNpdG9yJik7Ci0KLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRQcm9ncmFtQ29kZUJsb2Nr
PiBtX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJpZXI8UHJvZ3JhbUNv
ZGVCbG9jaz4gbV9wcm9ncmFtQ29kZUJsb2NrOwotfTsKLQotY2xhc3MgTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNs
YXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4
ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3Mg
PSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0
aWMgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqLCBjb25zdCBTb3Vy
Y2VDb2RlJik7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgTW9k
dWxlUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
X21vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxK
SVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0
ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0
ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUg
cHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2Jh
bE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3Ry
dWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAg
IEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJs
ZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0
b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6Ok1vZHVsZSwgU3VwZXJCaW5kaW5nOjpO
b3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6TW9kdWxlRXZhbHVhdGVNb2RlLCBkZXJpdmVkQ29u
dGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRleHRU
eXBlOjpOb25lKTsgfQotCi0gICAgVW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1bmxp
bmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2soKSB7IHJldHVybiBtX3VubGlua2VkTW9kdWxlUHJv
Z3JhbUNvZGVCbG9jay5nZXQoKTsgfQotCi0gICAgU3ltYm9sVGFibGUqIG1vZHVsZUVudmlyb25t
ZW50U3ltYm9sVGFibGUoKSB7IHJldHVybiBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUu
Z2V0KCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0g
ICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7Ci0KLSAgICBzdGF0aWMgdm9p
ZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBXcml0ZUJhcnJp
ZXI8VW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrPiBtX3VubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJpZXI8U3ltYm9sVGFibGU+IG1fbW9kdWxlRW52aXJv
bm1lbnRTeW1ib2xUYWJsZTsKLSAgICBXcml0ZUJhcnJpZXI8TW9kdWxlUHJvZ3JhbUNvZGVCbG9j
az4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrOwotfTsKLQogY2xhc3MgRnVuY3Rpb25FeGVjdXRh
YmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewogICAgIGZyaWVuZCBjbGFzcyBK
SVQ7CiAgICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKQEAgLTcxMyw2NiAr
MTg3LDQgQEAgcHJpdmF0ZToKICAgICBXcml0ZUJhcnJpZXI8SW5mZXJyZWRWYWx1ZT4gbV9zaW5n
bGV0b25GdW5jdGlvbjsKIH07CiAKLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi1jbGFzcyBXZWJB
c3NlbWJseUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgewotcHVibGlj
OgotICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlz
SW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiBjcmVhdGUoVk0m
IHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSogbW9kdWxlLCB1bnNp
Z25lZCBmdW5jdGlvbkluZGV4KQotICAgIHsKLSAgICAgICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8V2ViQXNzZW1ibHlFeGVj
dXRhYmxlPih2bS5oZWFwKSkgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKHZtLCBzb3VyY2UsIG1vZHVs
ZSwgZnVuY3Rpb25JbmRleCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZt
KTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cnVj
dHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVj
dCwgSlNWYWx1ZSBwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0
ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oV2ViQXNzZW1ibHlFeGVjdXRhYmxl
VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lk
IGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBERUNMQVJFX0lORk87Ci0KLSAgICB2b2lkIHByZXBh
cmVGb3JFeGVjdXRpb24oVk0mKTsKLQotICAgIFdlYkFzc2VtYmx5Q29kZUJsb2NrKiBjb2RlQmxv
Y2tGb3JDYWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0
KCk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsK
LSAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUoVk0mLCBjb25zdCBTb3VyY2VDb2RlJiwgSlNXYXNt
TW9kdWxlKiwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCk7Ci0KLSAgICBzdGF0aWMgdm9pZCB2aXNp
dENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7Ci0KLSAgICBTb3VyY2VDb2RlIG1fc291
cmNlOwotICAgIFdyaXRlQmFycmllcjxKU1dhc21Nb2R1bGU+IG1fbW9kdWxlOwotICAgIHVuc2ln
bmVkIG1fZnVuY3Rpb25JbmRleDsKLQotICAgIFdyaXRlQmFycmllcjxXZWJBc3NlbWJseUNvZGVC
bG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOwotfTsKLSNlbmRpZgotCi10ZW1wbGF0ZSA8dHlwZW5h
bWUgRXhlY3V0YWJsZVR5cGU+Ci1KU09iamVjdCogU2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFyZUZv
ckV4ZWN1dGlvbihWTSYgdm0sIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwg
Q29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBDb2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2sp
Ci17Ci0gICAgaWYgKGhhc0pJVENvZGVGb3Ioa2luZCkpIHsKLSAgICAgICAgaWYgKHN0ZDo6aXNf
c2FtZTxFeGVjdXRhYmxlVHlwZSwgRXZhbEV4ZWN1dGFibGU+Ojp2YWx1ZSkKLSAgICAgICAgICAg
IHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8RXZhbEV4ZWN1dGFi
bGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8
RXhlY3V0YWJsZVR5cGUsIFByb2dyYW1FeGVjdXRhYmxlPjo6dmFsdWUpCi0gICAgICAgICAgICBy
ZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PFByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1l
PEV4ZWN1dGFibGVUeXBlLCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAg
ICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0gICAgICAgIGVsc2UgaWYg
KHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRnVuY3Rpb25FeGVjdXRhYmxlPjo6dmFsdWUp
Ci0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0
PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2tGb3Ioa2luZCkpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZXBhcmVGb3JFeGVjdXRpb25J
bXBsKHZtLCBmdW5jdGlvbiwgc2NvcGUsIGtpbmQsIHJlc3VsdENvZGVCbG9jayk7Ci19Ci0KIH0g
Ly8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRnVu
Y3Rpb25FeGVjdXRhYmxlRHVtcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJsZUR1bXAuaAkocmV2aXNpb24gMjA3NzkwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlRHVtcC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yNSwxMSArMjUsMTIgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNs
dWRlICJFeGVjdXRhYmxlLmgiCiAjaW5jbHVkZSA8d3RmL1ByaW50U3RyZWFtLmg+CiAKIG5hbWVz
cGFjZSBKU0MgewogCitjbGFzcyBGdW5jdGlvbkV4ZWN1dGFibGU7CisKIGNsYXNzIEZ1bmN0aW9u
RXhlY3V0YWJsZUR1bXAgewogcHVibGljOgogICAgIGV4cGxpY2l0IEZ1bmN0aW9uRXhlY3V0YWJs
ZUR1bXAoRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlKQpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNBcnJheS5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTQXJyYXkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Nyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiQnV0dGVyZmx5SW5saW5lcy5oIgogI2luY2x1ZGUgIkNv
ZGVCbG9jay5oIgogI2luY2x1ZGUgIkVycm9yLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgog
I2luY2x1ZGUgIkdldHRlclNldHRlci5oIgogI2luY2x1ZGUgIkluZGV4aW5nSGVhZGVySW5saW5l
cy5oIgogI2luY2x1ZGUgIkpTQXJyYXlJbmxpbmVzLmgiCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU0Z1bmN0aW9uSW5saW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTRnVuY3Rpb25JbmxpbmVzLmgJKHJldmlzaW9uIDIwNzc5
MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTRnVuY3Rpb25JbmxpbmVzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI1LDggKzI1LDEwIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5j
bHVkZSAiRXhlY3V0YWJsZS5oIgorI2luY2x1ZGUgIkZ1bmN0aW9uRXhlY3V0YWJsZS5oIgogI2lu
Y2x1ZGUgIkpTRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJOYXRpdmVFeGVjdXRhYmxlLmgiCisjaW5j
bHVkZSAiV2ViQXNzZW1ibHlFeGVjdXRhYmxlLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU01vZHVsZVJlY29yZC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNNb2R1bGVSZWNvcmQuY3Bw
CShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU01v
ZHVsZVJlY29yZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRl
ICJKU01vZHVsZVJlY29yZC5oIgogCiAjaW5jbHVkZSAiRXJyb3IuaCIKLSNpbmNsdWRlICJFeGVj
dXRhYmxlLmgiCiAjaW5jbHVkZSAiSW50ZXJwcmV0ZXIuaCIKICNpbmNsdWRlICJKU0NJbmxpbmVz
LmgiCiAjaW5jbHVkZSAiSlNNYXAuaCIKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU09iamVjdC5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0pTT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjksNiBA
QAogI2luY2x1ZGUgIkRhdGVQcm90b3R5cGUuaCIKICNpbmNsdWRlICJFcnJvckNvbnN0cnVjdG9y
LmgiCiAjaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogI2lu
Y2x1ZGUgIkdldHRlclNldHRlci5oIgogI2luY2x1ZGUgIkhlYXBTbmFwc2hvdEJ1aWxkZXIuaCIK
ICNpbmNsdWRlICJJbmRleGluZ0hlYWRlcklubGluZXMuaCIKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0xvb2t1cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvTG9va3VwLmNwcAkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvTG9va3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjAsNyAr
MjAsNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkxvb2t1cC5oIgogCi0jaW5j
bHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIkdldHRlclNldHRlci5oIgogI2luY2x1ZGUg
IkpTRnVuY3Rpb24uaCIKICNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUuY3BwCShyZXZpc2lvbiAyMDc3OTApCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0V4ZWN1dGFibGUuY3BwOjIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL01vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDg0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMywgMjAxNS0yMDE2
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJFeGVj
dXRhYmxlLmgiCisKKyNpbmNsdWRlICJCYXRjaGVkVHJhbnNpdGlvbk9wdGltaXplci5oIgorI2lu
Y2x1ZGUgIkNvZGVCbG9jay5oIgorI2luY2x1ZGUgIkRlYnVnZ2VyLmgiCisjaW5jbHVkZSAiSklU
LmgiCisjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUgIkpTV2FzbU1vZHVsZS5oIgor
I2luY2x1ZGUgIkxMSW50RW50cnlwb2ludC5oIgorI2luY2x1ZGUgIlBhcnNlci5oIgorI2luY2x1
ZGUgIlR5cGVQcm9maWxlci5oIgorI2luY2x1ZGUgIlZNSW5saW5lcy5oIgorI2luY2x1ZGUgPHd0
Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNwYWNlIEpTQyB7CisKK2NvbnN0IENsYXNzSW5mbyBF
eGVjdXRhYmxlQmFzZTo6c19pbmZvID0geyAiRXhlY3V0YWJsZSIsIDAsIDAsIENSRUFURV9NRVRI
T0RfVEFCTEUoRXhlY3V0YWJsZUJhc2UpIH07CisKK3ZvaWQgRXhlY3V0YWJsZUJhc2U6OmRlc3Ry
b3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PEV4ZWN1dGFibGVCYXNlKj4oY2Vs
bCktPkV4ZWN1dGFibGVCYXNlOjp+RXhlY3V0YWJsZUJhc2UoKTsKK30KKwordm9pZCBFeGVjdXRh
YmxlQmFzZTo6Y2xlYXJDb2RlKCkKK3sKKyNpZiBFTkFCTEUoSklUKQorICAgIG1faml0Q29kZUZv
ckNhbGwgPSBudWxscHRyOworICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IG51bGxwdHI7Cisg
ICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRy
KCk7CisgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2Vt
YmxlckNvZGVQdHIoKTsKKyNlbmRpZgorICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBOVU1f
UEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7CisgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0
ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOworCisgICAgaWYgKGNsYXNzSW5mbygpID09
IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJs
ZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAg
ICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7CisgICAgICAgIGV4ZWN1
dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmNsZWFyKCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkg
eworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0
YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suY2xlYXIo
KTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suY2xlYXIoKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJv
Z3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVj
dXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+
bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5m
bygpKSB7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUt
Pm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5t
X3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRh
YmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuY2xlYXIoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICAKKyNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCisgICAgaWYgKGNsYXNz
SW5mbygpID09IFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFdlYkFz
c2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFi
bGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFy
KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIEFTU0VSVChjbGFzc0lu
Zm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpOworfQorCitjb25zdCBDbGFzc0luZm8g
TmF0aXZlRXhlY3V0YWJsZTo6c19pbmZvID0geyAiTmF0aXZlRXhlY3V0YWJsZSIsICZFeGVjdXRh
YmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE5hdGl2ZUV4ZWN1dGFibGUp
IH07CisKK05hdGl2ZUV4ZWN1dGFibGUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZShWTSYgdm0s
IFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwg
UGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3Ry
dWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBO
YXRpdmVFeGVjdXRhYmxlKiBleGVjdXRhYmxlOworICAgIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51
bGwsIGFsbG9jYXRlQ2VsbDxOYXRpdmVFeGVjdXRhYmxlPih2bS5oZWFwKSkgTmF0aXZlRXhlY3V0
YWJsZSh2bSwgZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBpbnRyaW5zaWMpOworICAgIGV4ZWN1dGFi
bGUtPmZpbmlzaENyZWF0aW9uKHZtLCBjYWxsVGh1bmssIGNvbnN0cnVjdFRodW5rLCBuYW1lKTsK
KyAgICByZXR1cm4gZXhlY3V0YWJsZTsKK30KKwordm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpkZXN0
cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4o
Y2VsbCktPk5hdGl2ZUV4ZWN1dGFibGU6On5OYXRpdmVFeGVjdXRhYmxlKCk7Cit9CisKK1N0cnVj
dHVyZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxP
YmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKK3sKKyAgICByZXR1cm4gU3RydWN0
dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBT
dHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Cit9CisKK3ZvaWQgTmF0aXZlRXhlY3V0YWJsZTo6Zmlu
aXNoQ3JlYXRpb24oVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1Jl
ZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAg
IEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICBtX2ppdENvZGVGb3JDYWxsID0gY2FsbFRo
dW5rOworICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGNvbnN0cnVjdFRodW5rOworICAgIG1f
aml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNhbGwtPmFkZHJlc3NG
b3JDYWxsKE11c3RDaGVja0FyaXR5KTsKKyAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJp
dHlDaGVjayA9IG1faml0Q29kZUZvckNvbnN0cnVjdC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNr
QXJpdHkpOworICAgIG1fbmFtZSA9IG5hbWU7Cit9CisKK05hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2
ZUV4ZWN1dGFibGUoVk0mIHZtLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rp
b24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgOiBFeGVjdXRhYmxlQmFz
ZSh2bSwgdm0ubmF0aXZlRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNf
SVNfSE9TVCwgaW50cmluc2ljKQorICAgICwgbV9mdW5jdGlvbihmdW5jdGlvbikKKyAgICAsIG1f
Y29uc3RydWN0b3IoY29uc3RydWN0b3IpCit7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBTY3JpcHRF
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJTY3JpcHRFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNl
OjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoU2NyaXB0RXhlY3V0YWJsZSkgfTsKKwor
U2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwg
Vk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQs
IERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVu
Y3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMg
aW50cmluc2ljKQorICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHN0cnVjdHVyZSwgTlVNX1BBUkFN
RVRFUlNfTk9UX0NPTVBJTEVELCBpbnRyaW5zaWMpCisgICAgLCBtX2ZlYXR1cmVzKGlzSW5TdHJp
Y3RDb250ZXh0ID8gU3RyaWN0TW9kZUZlYXR1cmUgOiAwKQorICAgICwgbV9kaWRUcnlUb0VudGVy
SW5Mb29wKGZhbHNlKQorICAgICwgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyhmYWxzZSkKKyAgICAs
IG1fbmV2ZXJJbmxpbmUoZmFsc2UpCisgICAgLCBtX25ldmVyT3B0aW1pemUoZmFsc2UpCisgICAg
LCBtX25ldmVyRlRMT3B0aW1pemUoZmFsc2UpCisgICAgLCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRl
eHQoaXNJbkFycm93RnVuY3Rpb25Db250ZXh0KQorICAgICwgbV9jYW5Vc2VPU1JFeGl0RnV6emlu
Zyh0cnVlKQorICAgICwgbV9kZXJpdmVkQ29udGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KGRlcml2ZWRDb250ZXh0VHlwZSkpCisgICAgLCBtX2V2YWxDb250ZXh0VHlwZShzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oZXZhbENvbnRleHRUeXBlKSkKKyAgICAsIG1fb3ZlcnJpZGVMaW5lTnVtYmVy
KC0xKQorICAgICwgbV9maXJzdExpbmUoLTEpCisgICAgLCBtX2xhc3RMaW5lKC0xKQorICAgICwg
bV9zdGFydENvbHVtbihVSU5UX01BWCkKKyAgICAsIG1fZW5kQ29sdW1uKFVJTlRfTUFYKQorICAg
ICwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoVUlOVF9NQVgpCisgICAgLCBtX3R5cGVQcm9m
aWxpbmdFbmRPZmZzZXQoVUlOVF9NQVgpCisgICAgLCBtX3NvdXJjZShzb3VyY2UpCit7Cit9CisK
K3ZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3Rh
dGljX2Nhc3Q8U2NyaXB0RXhlY3V0YWJsZSo+KGNlbGwpLT5TY3JpcHRFeGVjdXRhYmxlOjp+U2Ny
aXB0RXhlY3V0YWJsZSgpOworfQorCit2b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2Rl
KENvZGVCbG9jayogY29kZUJsb2NrKQoreworICAgIGluc3RhbGxDb2RlKCpjb2RlQmxvY2stPnZt
KCksIGNvZGVCbG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxp
emF0aW9uS2luZCgpKTsKK30KKwordm9pZCBTY3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZShW
TSYgdm0sIENvZGVCbG9jayogZ2VuZXJpY0NvZGVCbG9jaywgQ29kZVR5cGUgY29kZVR5cGUsIENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sKKyAgICBBU1NFUlQodm0uaGVhcC5pc0RlZmVy
cmVkKCkpOworICAgIAorICAgIGlmIChnZW5lcmljQ29kZUJsb2NrKQorICAgICAgICBDT0RFQkxP
Q0tfTE9HX0VWRU5UKGdlbmVyaWNDb2RlQmxvY2ssICJpbnN0YWxsQ29kZSIsICgpKTsKKyAgICAK
KyAgICBDb2RlQmxvY2sqIG9sZENvZGVCbG9jayA9IG51bGxwdHI7CisgICAgCisgICAgc3dpdGNo
IChjb2RlVHlwZSkgeworICAgIGNhc2UgR2xvYmFsQ29kZTogeworICAgICAgICBQcm9ncmFtRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwor
ICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxQcm9ncmFt
Q29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisgICAgICAgIAorICAgICAgICBBU1NFUlQo
a2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIAorICAgICAgICBvbGRDb2RlQmxvY2sgPSBl
eGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUt
Pm1fcHJvZ3JhbUNvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgTW9kdWxlQ29kZTogeworICAgICAgICBN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVC
bG9jayk7CisKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworCisgICAgICAg
IG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQo
KTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldE1heUJl
TnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg
Y2FzZSBFdmFsQ29kZTogeworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBFdmFsQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Cisg
ICAgICAgIAorICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIAor
ICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suZ2V0KCk7
CisgICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRo
aXMsIGNvZGVCbG9jayk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAgICAgCisgICAgY2Fz
ZSBGdW5jdGlvbkNvZGU6IHsKKyAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBGdW5jdGlvbkNv
ZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihnZW5l
cmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAg
ICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJs
ZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9j
b2RlQmxvY2tGb3JDYWxsLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAg
ICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQo
KTsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LnNldE1h
eUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGtpbmQpIHsK
KyAgICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICBtX2ppdENvZGVGb3JDYWxsID0gZ2VuZXJp
Y0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7CisgICAg
ICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0
cigpOworICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/
IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9D
T01QSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAg
ICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0Nv
ZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0cjsKKyAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3Ry
dWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKKyAgICAgICAgbV9u
dW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2Rl
QmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spIHsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoZ2VuZXJpY0NvZGVCbG9jay0+b3duZXJFeGVjdXRhYmxlKCkgPT0g
dGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKEpJVENvZGU6OmlzRXhlY3V0YWJsZVNjcmlw
dChnZW5lcmljQ29kZUJsb2NrLT5qaXRUeXBlKCkpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChP
cHRpb25zOjp2ZXJib3NlT1NSKCkpCisgICAgICAgICAgICBkYXRhTG9nKCJJbnN0YWxsaW5nICIs
ICpnZW5lcmljQ29kZUJsb2NrLCAiXG4iKTsKKyAgICAgICAgCisgICAgICAgIGlmICh2bS5tX3Bl
ckJ5dGVjb2RlUHJvZmlsZXIpCisgICAgICAgICAgICB2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIt
PmVuc3VyZUJ5dGVjb2Rlc0ZvcihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAg
IGlmIChEZWJ1Z2dlciogZGVidWdnZXIgPSBnZW5lcmljQ29kZUJsb2NrLT5nbG9iYWxPYmplY3Qo
KS0+ZGVidWdnZXIoKSkKKyAgICAgICAgICAgIGRlYnVnZ2VyLT5yZWdpc3RlckNvZGVCbG9jayhn
ZW5lcmljQ29kZUJsb2NrKTsKKyAgICB9CisKKyAgICBpZiAob2xkQ29kZUJsb2NrKQorICAgICAg
ICBvbGRDb2RlQmxvY2stPnVubGlua0luY29taW5nQ2FsbHMoKTsKKworICAgIHZtLmhlYXAud3Jp
dGVCYXJyaWVyKHRoaXMpOworfQorCitDb2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld0Nv
ZGVCbG9ja0ZvcigKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIEpTRnVuY3Rpb24q
IGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgSlNPYmplY3QqJiBleGNlcHRpb24pCit7CisgICAg
Vk0qIHZtID0gc2NvcGUtPnZtKCk7CisgICAgYXV0byB0aHJvd1Njb3BlID0gREVDTEFSRV9USFJP
V19TQ09QRSgqdm0pOworCisgICAgQVNTRVJUKHZtLT5oZWFwLmlzRGVmZXJyZWQoKSk7CisgICAg
QVNTRVJUKHN0YXJ0Q29sdW1uKCkgIT0gVUlOVF9NQVgpOworICAgIEFTU0VSVChlbmRDb2x1bW4o
KSAhPSBVSU5UX01BWCk7CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6
OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxF
dmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENv
ZGVGb3JDYWxsKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fZXZhbENv
ZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAgIHJl
dHVybiBFdmFsQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgICAgICBleGVjdXRhYmxlLCBl
eGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5nZXQoKSwgc2NvcGUsCisgICAgICAg
ICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpKTsKKyAgICB9CisgICAgCisgICAg
aWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAg
UHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUq
Pih0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2spOwor
ICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOworICAgICAgICByZXR1cm4gUHJvZ3Jh
bUNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJs
ZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAorICAgICAgICAgICAg
ZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3Rh
cnRDb2x1bW4oKSk7CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2spOworICAgICAg
ICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOworICAgICAgICByZXR1cm4gTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJs
ZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAorICAgICAg
ICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNl
KCkuc3RhcnRDb2x1bW4oKSk7CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZv
KCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOworICAgIFJFTEVBU0VfQVNTRVJUKGZ1
bmN0aW9uKTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVu
Y3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUt
PmNvZGVCbG9ja0ZvcihraW5kKSk7CisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9
IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKKyAgICBQYXJzZXJFcnJvciBlcnJvcjsKKyAgICBEZWJ1
Z2dlck1vZGUgZGVidWdnZXJNb2RlID0gZ2xvYmFsT2JqZWN0LT5oYXNJbnRlcmFjdGl2ZURlYnVn
Z2VyKCkgPyBEZWJ1Z2dlck9uIDogRGVidWdnZXJPZmY7CisgICAgVW5saW5rZWRGdW5jdGlvbkNv
ZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sgPSAKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxp
bmtlZEV4ZWN1dGFibGUtPnVubGlua2VkQ29kZUJsb2NrRm9yKAorICAgICAgICAgICAgKnZtLCBl
eGVjdXRhYmxlLT5tX3NvdXJjZSwga2luZCwgZGVidWdnZXJNb2RlLCBlcnJvciwgCisgICAgICAg
ICAgICBleGVjdXRhYmxlLT5wYXJzZU1vZGUoKSk7CisgICAgcmVjb3JkUGFyc2UoCisgICAgICAg
IGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5mZWF0dXJlcygpLCAKKyAgICAgICAg
ZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmhhc0NhcHR1cmVkVmFyaWFibGVzKCks
IGZpcnN0TGluZSgpLCAKKyAgICAgICAgbGFzdExpbmUoKSwgc3RhcnRDb2x1bW4oKSwgZW5kQ29s
dW1uKCkpOyAKKyAgICBpZiAoIXVubGlua2VkQ29kZUJsb2NrKSB7CisgICAgICAgIGV4Y2VwdGlv
biA9IHRocm93RXhjZXB0aW9uKAorICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVj
KCksIHRocm93U2NvcGUsCisgICAgICAgICAgICBlcnJvci50b0Vycm9yT2JqZWN0KGdsb2JhbE9i
amVjdCwgZXhlY3V0YWJsZS0+bV9zb3VyY2UpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgfQorCisgICAgU291cmNlUHJvdmlkZXIqIHByb3ZpZGVyID0gZXhlY3V0YWJsZS0+c291cmNl
KCkucHJvdmlkZXIoKTsKKyAgICB1bnNpZ25lZCBzb3VyY2VPZmZzZXQgPSBleGVjdXRhYmxlLT5z
b3VyY2UoKS5zdGFydE9mZnNldCgpOworICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uID0gZXhlY3V0
YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKTsKKworICAgIHJldHVybiBGdW5jdGlvbkNvZGVC
bG9jazo6Y3JlYXRlKHZtLAorICAgICAgICBleGVjdXRhYmxlLCB1bmxpbmtlZENvZGVCbG9jaywg
c2NvcGUsIHByb3ZpZGVyLCBzb3VyY2VPZmZzZXQsIHN0YXJ0Q29sdW1uKTsKK30KKworQ29kZUJs
b2NrKiBTY3JpcHRFeGVjdXRhYmxlOjpuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcigKKyAgICBD
b2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCit7CisgICAgaWYgKGNsYXNzSW5mbygpID09IEV2
YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ2FsbCk7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIEV2YWxDb2RlQmxvY2sqIGJhc2VsaW5l
ID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9jayo+KAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+
bV9ldmFsQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7CisgICAgICAgIEV2YWxDb2RlQmxv
Y2sqIHJlc3VsdCA9IEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAorICAgICAgICAgICAgQ29k
ZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7CisgICAgICAgIHJlc3VsdC0+c2V0
QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZv
KCkpIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAg
ICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGlj
X2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9n
cmFtQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7CisgICAgICAgIFByb2dyYW1Db2RlQmxv
Y2sqIHJlc3VsdCA9IFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAorICAgICAgICAgICAg
Q29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7CisgICAgICAgIHJlc3VsdC0+
c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6
OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsK
KyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oCisg
ICAgICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5l
VmVyc2lvbigpKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gTW9k
dWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCisgICAgICAgICAgICBDb2RlQmxvY2s6
OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5h
dGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwor
ICAgIFJFTEVBU0VfQVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5m
bygpKTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rp
b25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lID0g
c3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPigKKyAgICAgICAgZXhlY3V0YWJsZS0+Y29k
ZUJsb2NrRm9yKGtpbmQpLT5iYXNlbGluZVZlcnNpb24oKSk7CisgICAgRnVuY3Rpb25Db2RlQmxv
Y2sqIHJlc3VsdCA9IEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKKyAgICAgICAgQ29k
ZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7CisgICAgcmVzdWx0LT5zZXRBbHRl
cm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRp
YyB2b2lkIHNldHVwTExJbnQoVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sKKyAgICBM
TEludDo6c2V0RW50cnlwb2ludCh2bSwgY29kZUJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2V0
dXBKSVQoVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKK3sKKyNpZiBFTkFCTEUoSklUKQor
ICAgIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IEpJVDo6Y29tcGlsZSgmdm0sIGNvZGVCbG9j
aywgSklUQ29tcGlsYXRpb25NdXN0U3VjY2VlZCk7CisgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0
ID09IENvbXBpbGF0aW9uU3VjY2Vzc2Z1bCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTSh2bSk7
CisgICAgVU5VU0VEX1BBUkFNKGNvZGVCbG9jayk7CisgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRG
T1JNKCk7CisjZW5kaWYKK30KKworSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVG
b3JFeGVjdXRpb25JbXBsKAorICAgIFZNJiB2bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2Nv
cGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3Vs
dENvZGVCbG9jaykKK3sKKyAgICBEZWZlckdDRm9yQVdoaWxlIGRlZmVyR0Modm0uaGVhcCk7CisK
KyAgICBpZiAodm0uZ2V0QW5kQ2xlYXJGYWlsTmV4dE5ld0NvZGVCbG9jaygpKQorICAgICAgICBy
ZXR1cm4gY3JlYXRlRXJyb3Ioc2NvcGUtPmdsb2JhbE9iamVjdCgpLT5nbG9iYWxFeGVjKCksIEFT
Q0lJTGl0ZXJhbCgiRm9yY2VkIEZhaWx1cmUiKSk7CisKKyAgICBKU09iamVjdCogZXhjZXB0aW9u
ID0gMDsKKyAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG5ld0NvZGVCbG9ja0ZvcihraW5kLCBm
dW5jdGlvbiwgc2NvcGUsIGV4Y2VwdGlvbik7CisgICAgcmVzdWx0Q29kZUJsb2NrID0gY29kZUJs
b2NrOworICAgIGlmICghY29kZUJsb2NrKSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGV4Y2Vw
dGlvbik7CisgICAgICAgIHJldHVybiBleGNlcHRpb247CisgICAgfQorICAgIAorICAgIGlmIChP
cHRpb25zOjp2YWxpZGF0ZUJ5dGVjb2RlKCkpCisgICAgICAgIGNvZGVCbG9jay0+dmFsaWRhdGUo
KTsKKyAgICAKKyAgICBpZiAoT3B0aW9uczo6dXNlTExJbnQoKSkKKyAgICAgICAgc2V0dXBMTElu
dCh2bSwgY29kZUJsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHNldHVwSklUKHZtLCBjb2RlQmxv
Y2spOworICAgIAorICAgIGluc3RhbGxDb2RlKHZtLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29k
ZVR5cGUoKSwgY29kZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQoKSk7CisgICAgcmV0dXJuIG51
bGxwdHI7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBFdmFsRXhlY3V0YWJsZTo6c19pbmZvID0geyAi
RXZhbEV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVU
SE9EX1RBQkxFKEV2YWxFeGVjdXRhYmxlKSB9OworCitFdmFsRXhlY3V0YWJsZSogRXZhbEV4ZWN1
dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwg
Ym9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0
VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENv
bnRleHRUeXBlLCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50KiB2YXJpYWJsZXNVbmRlclREWikK
K3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RI
Uk9XX1NDT1BFKHZtKTsKKworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVj
LT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgaWYgKCFnbG9iYWxPYmplY3QtPmV2YWxFbmFi
bGVkKCkpIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZUV2YWxF
cnJvcihleGVjLCBnbG9iYWxPYmplY3QtPmV2YWxEaXNhYmxlZEVycm9yTWVzc2FnZSgpKSk7Cisg
ICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8RXZhbEV4ZWN1dGFibGU+KCpleGVjLT5oZWFw
KCkpKSBFdmFsRXhlY3V0YWJsZShleGVjLCBzb3VyY2UsIGlzSW5TdHJpY3RDb250ZXh0LCBkZXJp
dmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSk7
CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOworCisgICAgVW5saW5rZWRFdmFs
Q29kZUJsb2NrKiB1bmxpbmtlZEV2YWxDb2RlID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVFdmFsQ29k
ZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUsIHZhcmlhYmxlc1VuZGVyVERaKTsKKyAgICBpZiAoIXVu
bGlua2VkRXZhbENvZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgZXhlY3V0YWJsZS0+bV91
bmxpbmtlZEV2YWxDb2RlQmxvY2suc2V0KHZtLCBleGVjdXRhYmxlLCB1bmxpbmtlZEV2YWxDb2Rl
KTsKKworICAgIHJldHVybiBleGVjdXRhYmxlOworfQorCitFdmFsRXhlY3V0YWJsZTo6RXZhbEV4
ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wg
aW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBi
b29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5
cGUpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkuZXZhbEV4ZWN1dGFibGVTdHJ1
Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgaW5TdHJpY3RDb250ZXh0LCBkZXJpdmVk
Q29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSwgTm9J
bnRyaW5zaWMpCit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkg
PT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsKK30KKwordm9pZCBFdmFsRXhl
Y3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8RXZhbEV4
ZWN1dGFibGUqPihjZWxsKS0+RXZhbEV4ZWN1dGFibGU6On5FdmFsRXhlY3V0YWJsZSgpOworfQor
Citjb25zdCBDbGFzc0luZm8gUHJvZ3JhbUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlByb2dyYW1F
eGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9U
QUJMRShQcm9ncmFtRXhlY3V0YWJsZSkgfTsKKworUHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1F
eGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAg
IDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLnByb2dyYW1FeGVjdXRhYmxlU3RydWN0dXJl
LmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJpdmVkQ29udGV4dFR5cGU6Ok5v
bmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIE5vSW50cmluc2ljKQoreworICAgIEFT
U0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291
cmNlVHlwZTo6UHJvZ3JhbSk7CisgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAwOwor
ICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7CisgICAg
aWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxvd1By
b2ZpbGVyKCkpCisgICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCkt
Pmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFydE9m
ZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKK30KKwordm9pZCBQcm9ncmFtRXhlY3V0
YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUV4
ZWN1dGFibGUqPihjZWxsKS0+UHJvZ3JhbUV4ZWN1dGFibGU6On5Qcm9ncmFtRXhlY3V0YWJsZSgp
OworfQorCitjb25zdCBDbGFzc0luZm8gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnNfaW5mbyA9
IHsgIk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywg
MCwgQ1JFQVRFX01FVEhPRF9UQUJMRShNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSkgfTsKKworTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGU6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSog
ZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZShl
eGVjLT52bSgpLm1vZHVsZVByb2dyYW1FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52
bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJpdmVkQ29udGV4dFR5cGU6Ok5vbmUsIGZhbHNlLCBFdmFs
Q29udGV4dFR5cGU6Ok5vbmUsIE5vSW50cmluc2ljKQoreworICAgIEFTU0VSVChzb3VyY2UucHJv
dmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6TW9kdWxl
KTsKKyAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IDA7CisgICAgbV90eXBlUHJvZmls
aW5nRW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0aCgpIC0gMTsKKyAgICBpZiAoZXhlYy0+dm0oKS50
eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52bSgpLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkKKyAgICAg
ICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRl
ZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9m
aWxpbmdFbmRPZmZzZXQpOworfQorCitNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogTW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZSkKK3sKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4
aWNhbEdsb2JhbE9iamVjdCgpOworICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+
KCpleGVjLT5oZWFwKCkpKSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZShleGVjLCBzb3VyY2UpOwor
ICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKGV4ZWMtPnZtKCkpOworCisgICAgVW5saW5r
ZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlID0gZ2xv
YmFsT2JqZWN0LT5jcmVhdGVNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUp
OworICAgIGlmICghdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZSkKKyAgICAgICAgcmV0dXJuIG51
bGxwdHI7CisgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2su
c2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUsIHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUpOwor
CisgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLnNldChleGVj
LT52bSgpLCBleGVjdXRhYmxlLCBqc0Nhc3Q8U3ltYm9sVGFibGUqPih1bmxpbmtlZE1vZHVsZVBy
b2dyYW1Db2RlLT5jb25zdGFudFJlZ2lzdGVyKHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUtPm1v
ZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGVDb25zdGFudFJlZ2lzdGVyT2Zmc2V0KCkpLmdldCgp
KS0+Y2xvbmVTY29wZVBhcnQoZXhlYy0+dm0oKSkpOworCisgICAgcmV0dXJuIGV4ZWN1dGFibGU7
Cit9CisKK3ZvaWQgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxs
KQoreworICAgIHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPk1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoKTsKK30KKwor
Y29uc3QgQ2xhc3NJbmZvIEZ1bmN0aW9uRXhlY3V0YWJsZTo6c19pbmZvID0geyAiRnVuY3Rpb25F
eGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9U
QUJMRShGdW5jdGlvbkV4ZWN1dGFibGUpIH07CisKK0Z1bmN0aW9uRXhlY3V0YWJsZTo6RnVuY3Rp
b25FeGVjdXRhYmxlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBVbmxpbmtlZEZ1
bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlLCB1bnNpZ25lZCBmaXJzdExpbmUs
IHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29s
dW1uLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZSh2bS5mdW5j
dGlvbkV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIHZtLCBzb3VyY2UsIHVubGlua2VkRXhlY3V0
YWJsZS0+aXNJblN0cmljdENvbnRleHQoKSwgdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29u
dGV4dFR5cGUoKSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgaW50cmluc2ljKQorICAg
ICwgbV91bmxpbmtlZEV4ZWN1dGFibGUodm0sIHRoaXMsIHVubGlua2VkRXhlY3V0YWJsZSkKK3sK
KyAgICBSRUxFQVNFX0FTU0VSVCghc291cmNlLmlzTnVsbCgpKTsKKyAgICBBU1NFUlQoc291cmNl
Lmxlbmd0aCgpKTsKKyAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGluZTsKKyAgICBtX2xhc3RMaW5l
ID0gbGFzdExpbmU7CisgICAgQVNTRVJUKHN0YXJ0Q29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICBB
U1NFUlQoZW5kQ29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRD
b2x1bW47CisgICAgbV9lbmRDb2x1bW4gPSBlbmRDb2x1bW47CisgICAgbV9wYXJhbWV0ZXJzU3Rh
cnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRlcnNTdGFydE9mZnNldCgpOwor
ICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQoKTsKKyAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB1
bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKTsKK30KKwordm9pZCBG
dW5jdGlvbkV4ZWN1dGFibGU6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSkKK3sKKyAgICBCYXNlOjpm
aW5pc2hDcmVhdGlvbih2bSk7CisgICAgbV9zaW5nbGV0b25GdW5jdGlvbi5zZXQodm0sIHRoaXMs
IEluZmVycmVkVmFsdWU6OmNyZWF0ZSh2bSkpOworfQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJs
ZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8RnVuY3Rpb25FeGVj
dXRhYmxlKj4oY2VsbCktPkZ1bmN0aW9uRXhlY3V0YWJsZTo6fkZ1bmN0aW9uRXhlY3V0YWJsZSgp
OworfQorCitpbmxpbmUgY29uc3QgY2hhciogc2FtcGxpbmdEZXNjcmlwdGlvbihKSVRDb2RlOjpK
SVRUeXBlIGppdFR5cGUpCit7CisgICAgc3dpdGNoIChqaXRUeXBlKSB7CisgICAgY2FzZSBKSVRD
b2RlOjpJbnRlcnByZXRlclRodW5rOgorICAgICAgICByZXR1cm4gIkludGVycHJldGVyIENvbXBp
bGF0aW9uIChUT1RBTCkiOworICAgIGNhc2UgSklUQ29kZTo6QmFzZWxpbmVKSVQ6CisgICAgICAg
IHJldHVybiAiQmFzZWxpbmUgQ29tcGlsYXRpb24gKFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2Rl
OjpERkdKSVQ6CisgICAgICAgIHJldHVybiAiREZHIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAg
IGNhc2UgSklUQ29kZTo6RlRMSklUOgorICAgICAgICByZXR1cm4gIkZUTCBDb21waWxhdGlvbiAo
VE9UQUwpIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgRXZhbEV4ZWN1dGFibGU6
OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAg
ICBFdmFsRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNl
bGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsK
KyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3Ip
OworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkRXZhbENvZGVCbG9j
ayk7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9jaykKKyAgICAgICAgdGhpc09i
amVjdC0+bV9ldmFsQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKK30KKworSlNPYmpl
Y3QqIFByb2dyYW1FeGVjdXRhYmxlOjpjaGVja1N5bnRheChFeGVjU3RhdGUqIGV4ZWMpCit7Cisg
ICAgUGFyc2VyRXJyb3IgZXJyb3I7CisgICAgVk0qIHZtID0gJmV4ZWMtPnZtKCk7CisgICAgSlNH
bG9iYWxPYmplY3QqIGxleGljYWxHbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2Jq
ZWN0KCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW1Ob2RlPiBwcm9ncmFtTm9kZSA9IHBh
cnNlPFByb2dyYW1Ob2RlPigKKyAgICAgICAgdm0sIG1fc291cmNlLCBJZGVudGlmaWVyKCksIEpT
UGFyc2VyQnVpbHRpbk1vZGU6Ok5vdEJ1aWx0aW4sCisgICAgICAgIEpTUGFyc2VyU3RyaWN0TW9k
ZTo6Tm90U3RyaWN0LCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFNvdXJjZVBhcnNlTW9k
ZTo6UHJvZ3JhbU1vZGUsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBlcnJvcik7CisgICAgaWYg
KHByb2dyYW1Ob2RlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQoZXJyb3IuaXNWYWxp
ZCgpKTsKKyAgICByZXR1cm4gZXJyb3IudG9FcnJvck9iamVjdChsZXhpY2FsR2xvYmFsT2JqZWN0
LCBtX3NvdXJjZSk7Cit9CisKK0pTT2JqZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6aW5pdGlhbGl6
ZUdsb2JhbFByb3BlcnRpZXMoVk0mIHZtLCBDYWxsRnJhbWUqIGNhbGxGcmFtZSwgSlNTY29wZSog
c2NvcGUpCit7CisgICAgUkVMRUFTRV9BU1NFUlQoc2NvcGUpOworICAgIEpTR2xvYmFsT2JqZWN0
KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+Z2xvYmFsT2JqZWN0KCk7CisgICAgUkVMRUFTRV9BU1NF
UlQoZ2xvYmFsT2JqZWN0KTsKKyAgICBBU1NFUlQoJmdsb2JhbE9iamVjdC0+dm0oKSA9PSAmdm0p
OworCisgICAgSlNPYmplY3QqIGV4Y2VwdGlvbiA9IDA7CisgICAgVW5saW5rZWRQcm9ncmFtQ29k
ZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9jayA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlUHJvZ3JhbUNv
ZGVCbG9jayhjYWxsRnJhbWUsIHRoaXMsICZleGNlcHRpb24pOworICAgIGlmIChleGNlcHRpb24p
CisgICAgICAgIHJldHVybiBleGNlcHRpb247CisKKyAgICBKU0dsb2JhbExleGljYWxFbnZpcm9u
bWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50ID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxMZXhp
Y2FsRW52aXJvbm1lbnQoKTsKKyAgICBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50JiB2YXJpYWJs
ZURlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT52YXJpYWJsZURlY2xhcmF0aW9ucygp
OworICAgIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQmIGxleGljYWxEZWNsYXJhdGlvbnMgPSB1
bmxpbmtlZENvZGVCbG9jay0+bGV4aWNhbERlY2xhcmF0aW9ucygpOworICAgIC8vIFRoZSBFUzYg
c3BlYyBzYXlzIHRoYXQgbm8gdmFycy9nbG9iYWwgcHJvcGVydGllcy9sZXQvY29uc3QgY2FuIGJl
IGR1cGxpY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KKyAgICAvLyBUaGlzIGNhcnJpZWQgb3V0
IHNlY3Rpb24gMTUuMS44IG9mIHRoZSBFUzYgc3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0
aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1nbG9iYWxkZWNsYXJhdGlvbmlu
c3RhbnRpYXRpb24KKyAgICB7CisgICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGdsb2JhbE9iamVj
dC0+Z2xvYmFsRXhlYygpOworICAgICAgICAvLyBDaGVjayBmb3IgaW50ZXJzZWN0aW9uIG9mICJ2
YXIiIGFuZCAibGV0Ii8iY29uc3QiLyJjbGFzcyIKKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6
IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0
aW9ucy5jb250YWlucyhlbnRyeS5rZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVT
eW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlh
YmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAibGV0Ii8iY29uc3QiLyJjbGFzcyIgd2lsbCBzaGFk
b3cgYW55IHByZS1leGlzdGluZyBnbG9iYWwgcHJvcGVydHkgbmFtZXMsIG9yICJ2YXIiLyJsZXQi
LyJjb25zdCIgdmFyaWFibGVzLgorICAgICAgICAvLyBJdCdzIGFuIGVycm9yIHRvIGludHJvZHVj
ZSBhIHNoYWRvdy4KKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlv
bnMpIHsKKyAgICAgICAgICAgIGlmIChnbG9iYWxPYmplY3QtPmhhc1Byb3BlcnR5KGV4ZWMsIGVu
dHJ5LmtleS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0
aGF0IGp1c3QgUmVzdHJpY3RlZEdsb2JhbFByb3BlcnR5IGNhbid0IGJlIHNoYWRvd2VkCisgICAg
ICAgICAgICAgICAgLy8gVGhpcyBjYXJyaWVkIG91dCBzZWN0aW9uIDguMS4xLjQuMTQgb2YgdGhl
IEVTNiBzcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4w
L2luZGV4Lmh0bWwjc2VjLWhhc3Jlc3RyaWN0ZWRnbG9iYWxwcm9wZXJ0eQorICAgICAgICAgICAg
ICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIGdsb2Jh
bE9iamVjdC0+Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4ZWMsIGVudHJ5LmtleS5nZXQoKSwg
ZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGRlc2Ny
aXB0b3IudmFsdWUoKSAhPSBqc1VuZGVmaW5lZCgpICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJs
ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywg
bWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZSB0aGF0IHNoYWRvd3Mg
YSBnbG9iYWwgcHJvcGVydHk6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKFVOTElLRUxZKGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0u
Z2xvYmFsQ29uc3RSZWRlY2xhcmF0aW9uU2hvdWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkp
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgImNvbnN0IiBkdXBsaWNh
dGUgZGVjbGFyYXRpb25zIHVuZGVyIHRoaXMgc2V0dGluZy4KKyAgICAgICAgICAgICAgICAgICAg
Ly8gRm9yIGV4YW1wbGUsIHdlIGRvbid0ICJsZXQiIHZhcmlhYmxlcyB0byBiZSBvdmVycmlkZGVu
IGJ5ICJjb25zdCIgdmFyaWFibGVzLgorICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5pc0NvbnN0VmFyaWFibGUoZW50cnkua2V5LmdldCgpKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3Qg
Y3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAi
JyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIGFu
eSBuZXcgInZhciJzIHdpbGwgc2hhZG93IGFueSBwcmV2aW91cyAibGV0Ii8iY29uc3QiLyJjbGFz
cyIgbmFtZXMuCisgICAgICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93
LgorICAgICAgICBpZiAoIWdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5oYXNQcm9wZXJ0eShl
eGVjLCBlbnRyeS5rZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRl
U3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJp
YWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworCisgICAgbV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suc2V0
KHZtLCB0aGlzLCB1bmxpbmtlZENvZGVCbG9jayk7CisKKyAgICBCYXRjaGVkVHJhbnNpdGlvbk9w
dGltaXplciBvcHRpbWl6ZXIodm0sIGdsb2JhbE9iamVjdCk7CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMCwgbnVtYmVyT2ZGdW5jdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+bnVtYmVyT2ZGdW5j
dGlvbkRlY2xzKCk7IGkgPCBudW1iZXJPZkZ1bmN0aW9uczsgKytpKSB7CisgICAgICAgIFVubGlu
a2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSA9IHVubGlu
a2VkQ29kZUJsb2NrLT5mdW5jdGlvbkRlY2woaSk7CisgICAgICAgIEFTU0VSVCghdW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGUtPm5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICBnbG9iYWxPYmpl
Y3QtPmFkZEZ1bmN0aW9uKGNhbGxGcmFtZSwgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPm5h
bWUoKSk7CisgICAgICAgIGlmICh2bS50eXBlUHJvZmlsZXIoKSB8fCB2bS5jb250cm9sRmxvd1By
b2ZpbGVyKCkpIHsKKyAgICAgICAgICAgIHZtLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5p
bnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgCisgICAgICAgICAgICAgICAgdW5saW5r
ZWRGdW5jdGlvbkV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpLCAKKyAgICAg
ICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ0VuZE9m
ZnNldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byYgZW50cnkgOiB2YXJp
YWJsZURlY2xhcmF0aW9ucykgeworICAgICAgICBBU1NFUlQoZW50cnkudmFsdWUuaXNWYXIoKSk7
CisgICAgICAgIGdsb2JhbE9iamVjdC0+YWRkVmFyKGNhbGxGcmFtZSwgSWRlbnRpZmllcjo6ZnJv
bVVpZCgmdm0sIGVudHJ5LmtleS5nZXQoKSkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgSlNH
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGdsb2JhbExleGljYWxFbnZpcm9ubWVudCA9IGpzQ2Fz
dDxKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCo+KGdsb2JhbE9iamVjdC0+Z2xvYmFsU2NvcGUo
KSk7CisgICAgICAgIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSA9IGdsb2JhbExleGljYWxFbnZp
cm9ubWVudC0+c3ltYm9sVGFibGUoKTsKKyAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2Nr
ZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7CisgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhp
Y2FsRGVjbGFyYXRpb25zKSB7CisgICAgICAgICAgICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUu
aXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYm
ICFpc1N0cmljdE1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3ltYm9sVGFibGUtPmNv
bnRhaW5zKGxvY2tlciwgZW50cnkua2V5LmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTY29wZU9mZnNldCBvZmZzZXQgPSBz
eW1ib2xUYWJsZS0+dGFrZU5leHRTY29wZU9mZnNldChsb2NrZXIpOworICAgICAgICAgICAgU3lt
Ym9sVGFibGVFbnRyeSBuZXdFbnRyeShWYXJPZmZzZXQob2Zmc2V0KSwgZW50cnkudmFsdWUuaXND
b25zdCgpID8gUmVhZE9ubHkgOiAwKTsKKyAgICAgICAgICAgIG5ld0VudHJ5LnByZXBhcmVUb1dh
dGNoKCk7CisgICAgICAgICAgICBzeW1ib2xUYWJsZS0+YWRkKGxvY2tlciwgZW50cnkua2V5Lmdl
dCgpLCBuZXdFbnRyeSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9m
ZnNldEZvckFzc2VydCA9IGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+YWRkVmFyaWFibGVzKDEs
IGpzVERaVmFsdWUoKSk7CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChvZmZzZXRGb3JBc3Nl
cnQgPT0gb2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9p
ZCBQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNp
dG9yJiB2aXNpdG9yKQoreworICAgIFByb2dyYW1FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganND
YXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhF
UklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hp
bGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmpl
Y3QtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9w
cm9ncmFtQ29kZUJsb2NrKQorICAgICAgICB0aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2st
PnZpc2l0V2Vha2x5KHZpc2l0b3IpOworfQorCit2b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
Ojp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7Cisg
ICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8TW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRo
aXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0
aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91
bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2spOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlz
T2JqZWN0LT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUpOworICAgIGlmICh0aGlzT2Jq
ZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2spCisgICAgICAgIHRoaXNPYmplY3QtPm1fbW9k
dWxlUHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Cit9CisKK0Z1bmN0aW9u
Q29kZUJsb2NrKiBGdW5jdGlvbkV4ZWN1dGFibGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVT
cGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0
OworICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICByZXN1bHQgPSBtX2NvZGVC
bG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgZWxzZSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9y
Q29uc3RydWN0LmdldCgpOworICAgIH0KKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZ1bmN0aW9uQ29kZUJsb2NrKj4ocmVzdWx0LT5i
YXNlbGluZUFsdGVybmF0aXZlKCkpOworfQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlz
aXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIEZ1
bmN0aW9uRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUq
PihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8o
KSk7CisgICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNp
dG9yKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsKQorICAgICAgICB0
aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworICAg
IGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdCkKKyAgICAgICAgdGhpc09i
amVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworICAg
IHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkRXhlY3V0YWJsZSk7CisgICAg
dmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fc2luZ2xldG9uRnVuY3Rpb24pOworfQorCitG
dW5jdGlvbkV4ZWN1dGFibGUqIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCisg
ICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiBleGVjLCBjb25zdCBTb3VyY2VD
b2RlJiBzb3VyY2UsIAorICAgIEpTT2JqZWN0KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5l
TnVtYmVyKQoreworICAgIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1
dGFibGUgPSAKKyAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxD
b2RlKAorICAgICAgICAgICAgbmFtZSwgZXhlYywgc291cmNlLCBleGNlcHRpb24sIG92ZXJyaWRl
TGluZU51bWJlcik7CisgICAgaWYgKCF1bmxpbmtlZEV4ZWN1dGFibGUpCisgICAgICAgIHJldHVy
biBudWxscHRyOworCisgICAgcmV0dXJuIHVubGlua2VkRXhlY3V0YWJsZS0+bGluayhleGVjLnZt
KCksIHNvdXJjZSwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsKK30KKworI2lmIEVOQUJMRShXRUJBU1NF
TUJMWSkKK2NvbnN0IENsYXNzSW5mbyBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsg
IldlYkFzc2VtYmx5RXhlY3V0YWJsZSIsICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVB
VEVfTUVUSE9EX1RBQkxFKFdlYkFzc2VtYmx5RXhlY3V0YWJsZSkgfTsKKworV2ViQXNzZW1ibHlF
eGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4ZWN1dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2Rl
JiBzb3VyY2UsIEpTV2FzbU1vZHVsZSogbW9kdWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQor
ICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZtLndlYkFzc2VtYmx5RXhlY3V0YWJsZVN0cnVjdHVy
ZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVELCBOb0ludHJpbnNpYykKKyAgICAs
IG1fc291cmNlKHNvdXJjZSkKKyAgICAsIG1fbW9kdWxlKHZtLCB0aGlzLCBtb2R1bGUpCisgICAg
LCBtX2Z1bmN0aW9uSW5kZXgoZnVuY3Rpb25JbmRleCkKK3sKKyAgICBBU1NFUlQoc291cmNlLnBy
b3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OldlYkFz
c2VtYmx5KTsKK30KKwordm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxs
KiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwp
LT5XZWJBc3NlbWJseUV4ZWN1dGFibGU6On5XZWJBc3NlbWJseUV4ZWN1dGFibGUoKTsKK30KKwor
dm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBT
bG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIHRoaXNP
YmplY3QgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlFeGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJU
X0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIEV4ZWN1dGFibGVC
YXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIGlmICh0aGlzT2Jq
ZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCisgICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2Nr
Rm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNP
YmplY3QtPm1fbW9kdWxlKTsKK30KKyNlbmRpZgorCit2b2lkIEV4ZWN1dGFibGVCYXNlOjpkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7CisgICAgRXhlY3V0YWJsZUJhc2UqIHJlYWxUaGlz
ID0gY29uc3RfY2FzdDxFeGVjdXRhYmxlQmFzZSo+KHRoaXMpOworICAgIAorICAgIGlmIChjbGFz
c0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTmF0aXZlRXhl
Y3V0YWJsZSogbmF0aXZlID0ganNDYXN0PE5hdGl2ZUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Cisg
ICAgICAgIG91dC5wcmludCgiTmF0aXZlRXhlY3V0YWJsZToiLCBSYXdQb2ludGVyKGJpdHdpc2Vf
Y2FzdDx2b2lkKj4obmF0aXZlLT5mdW5jdGlvbigpKSksICIvIiwgUmF3UG9pbnRlcihiaXR3aXNl
X2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+Y29uc3RydWN0b3IoKSkpKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8o
KSkgeworICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXZhbCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJs
ZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXZhbC0+
Y29kZUJsb2NrKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiRXZhbEV4ZWN1dGFibGUgdy9vIENvZGVCbG9j
ayIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9
PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxl
KiBldmFsID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBp
ZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAg
IG91dC5wcmludCgqY29kZUJsb2NrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnBy
aW50KCJQcm9ncmFtRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6
OmluZm8oKSkgeworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYg
KENvZGVCbG9jayogY29kZUJsb2NrID0gZXhlY3V0YWJsZS0+Y29kZUJsb2NrKCkpCisgICAgICAg
ICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91
dC5wcmludCgiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZnVuY3Rpb24g
PSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgIGlmICghZnVuY3Rp
b24tPmVpdGhlckNvZGVCbG9jaygpKQorICAgICAgICBvdXQucHJpbnQoIkZ1bmN0aW9uRXhlY3V0
YWJsZSB3L28gQ29kZUJsb2NrIik7CisgICAgZWxzZSB7CisgICAgICAgIENvbW1hUHJpbnRlciBj
b21tYSgiLyIpOworICAgICAgICBpZiAoZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSkKKyAg
ICAgICAgICAgIG91dC5wcmludChjb21tYSwgKmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkp
OworICAgICAgICBpZiAoZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpKQorICAgICAg
ICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgp
KTsKKyAgICB9Cit9CisKK0NvZGVCbG9ja0hhc2ggRXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IoQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAoreworICAgIGlmICh0aGlzLT5jbGFzc0lu
Zm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpCisgICAgICAgIHJldHVybiBqc0Nhc3Q8
Y29uc3QgTmF0aXZlRXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9yKGtpbmQpOworICAgIAorICAg
IHJldHVybiBqc0Nhc3Q8Y29uc3QgU2NyaXB0RXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9yKGtp
bmQpOworfQorCitDb2RlQmxvY2tIYXNoIE5hdGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAoreworICAgIGlmIChraW5kID09IENvZGVGb3JD
YWxsKQorICAgICAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
Yml0d2lzZV9jYXN0PHNpemVfdD4obV9mdW5jdGlvbikpKTsKKyAgICAKKyAgICBSRUxFQVNFX0FT
U0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgIHJldHVybiBDb2RlQmxvY2tIYXNo
KHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2NvbnN0cnVjdG9y
KSkpOworfQorCitDb2RlQmxvY2tIYXNoIFNjcmlwdEV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAoreworICAgIHJldHVybiBDb2RlQmxvY2tIYXNo
KHNvdXJjZSgpLCBraW5kKTsKK30KKworfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL01vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmNwcAkocmV2aXNp
b24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw2IEBACiAgKi8KIAog
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKIAogI2luY2x1ZGUg
IkJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmgiCiAjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCkBA
IC00MCw0NDQgKzM5LDYgQEAKIAogbmFtZXNwYWNlIEpTQyB7CiAKLWNvbnN0IENsYXNzSW5mbyBF
eGVjdXRhYmxlQmFzZTo6c19pbmZvID0geyAiRXhlY3V0YWJsZSIsIDAsIDAsIENSRUFURV9NRVRI
T0RfVEFCTEUoRXhlY3V0YWJsZUJhc2UpIH07Ci0KLXZvaWQgRXhlY3V0YWJsZUJhc2U6OmRlc3Ry
b3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PEV4ZWN1dGFibGVCYXNlKj4oY2Vs
bCktPkV4ZWN1dGFibGVCYXNlOjp+RXhlY3V0YWJsZUJhc2UoKTsKLX0KLQotdm9pZCBFeGVjdXRh
YmxlQmFzZTo6Y2xlYXJDb2RlKCkKLXsKLSNpZiBFTkFCTEUoSklUKQotICAgIG1faml0Q29kZUZv
ckNhbGwgPSBudWxscHRyOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IG51bGxwdHI7Ci0g
ICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRy
KCk7Ci0gICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2Vt
YmxlckNvZGVQdHIoKTsKLSNlbmRpZgotICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBOVU1f
UEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Ci0gICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0
ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotCi0gICAgaWYgKGNsYXNzSW5mbygpID09
IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJs
ZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1
dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkg
ewotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0
YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suY2xlYXIo
KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suY2xlYXIoKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJv
Z3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVj
dXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+
bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5m
bygpKSB7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUt
Pm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVjdXRhYmxlLT5t
X3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVjdXRh
YmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuY2xlYXIoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICAKLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi0gICAgaWYgKGNsYXNz
SW5mbygpID09IFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFdlYkFz
c2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFi
bGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFy
KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIEFTU0VSVChjbGFzc0lu
Zm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpOwotfQotCi1jb25zdCBDbGFzc0luZm8g
TmF0aXZlRXhlY3V0YWJsZTo6c19pbmZvID0geyAiTmF0aXZlRXhlY3V0YWJsZSIsICZFeGVjdXRh
YmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE5hdGl2ZUV4ZWN1dGFibGUp
IH07Ci0KLU5hdGl2ZUV4ZWN1dGFibGUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZShWTSYgdm0s
IFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwg
UGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3Ry
dWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBO
YXRpdmVFeGVjdXRhYmxlKiBleGVjdXRhYmxlOwotICAgIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51
bGwsIGFsbG9jYXRlQ2VsbDxOYXRpdmVFeGVjdXRhYmxlPih2bS5oZWFwKSkgTmF0aXZlRXhlY3V0
YWJsZSh2bSwgZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBpbnRyaW5zaWMpOwotICAgIGV4ZWN1dGFi
bGUtPmZpbmlzaENyZWF0aW9uKHZtLCBjYWxsVGh1bmssIGNvbnN0cnVjdFRodW5rLCBuYW1lKTsK
LSAgICByZXR1cm4gZXhlY3V0YWJsZTsKLX0KLQotdm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpkZXN0
cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4o
Y2VsbCktPk5hdGl2ZUV4ZWN1dGFibGU6On5OYXRpdmVFeGVjdXRhYmxlKCk7Ci19Ci0KLVN0cnVj
dHVyZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxP
YmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLXsKLSAgICByZXR1cm4gU3RydWN0
dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBT
dHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci19Ci0KLXZvaWQgTmF0aXZlRXhlY3V0YWJsZTo6Zmlu
aXNoQ3JlYXRpb24oVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1Jl
ZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAg
IEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICBtX2ppdENvZGVGb3JDYWxsID0gY2FsbFRo
dW5rOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGNvbnN0cnVjdFRodW5rOwotICAgIG1f
aml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNhbGwtPmFkZHJlc3NG
b3JDYWxsKE11c3RDaGVja0FyaXR5KTsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJp
dHlDaGVjayA9IG1faml0Q29kZUZvckNvbnN0cnVjdC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNr
QXJpdHkpOwotICAgIG1fbmFtZSA9IG5hbWU7Ci19Ci0KLU5hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2
ZUV4ZWN1dGFibGUoVk0mIHZtLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rp
b24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgOiBFeGVjdXRhYmxlQmFz
ZSh2bSwgdm0ubmF0aXZlRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNf
SVNfSE9TVCwgaW50cmluc2ljKQotICAgICwgbV9mdW5jdGlvbihmdW5jdGlvbikKLSAgICAsIG1f
Y29uc3RydWN0b3IoY29uc3RydWN0b3IpCi17Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBTY3JpcHRF
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJTY3JpcHRFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNl
OjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoU2NyaXB0RXhlY3V0YWJsZSkgfTsKLQot
U2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwg
Vk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQs
IERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVu
Y3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMg
aW50cmluc2ljKQotICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHN0cnVjdHVyZSwgTlVNX1BBUkFN
RVRFUlNfTk9UX0NPTVBJTEVELCBpbnRyaW5zaWMpCi0gICAgLCBtX2ZlYXR1cmVzKGlzSW5TdHJp
Y3RDb250ZXh0ID8gU3RyaWN0TW9kZUZlYXR1cmUgOiAwKQotICAgICwgbV9kaWRUcnlUb0VudGVy
SW5Mb29wKGZhbHNlKQotICAgICwgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyhmYWxzZSkKLSAgICAs
IG1fbmV2ZXJJbmxpbmUoZmFsc2UpCi0gICAgLCBtX25ldmVyT3B0aW1pemUoZmFsc2UpCi0gICAg
LCBtX25ldmVyRlRMT3B0aW1pemUoZmFsc2UpCi0gICAgLCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRl
eHQoaXNJbkFycm93RnVuY3Rpb25Db250ZXh0KQotICAgICwgbV9jYW5Vc2VPU1JFeGl0RnV6emlu
Zyh0cnVlKQotICAgICwgbV9kZXJpdmVkQ29udGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KGRlcml2ZWRDb250ZXh0VHlwZSkpCi0gICAgLCBtX2V2YWxDb250ZXh0VHlwZShzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oZXZhbENvbnRleHRUeXBlKSkKLSAgICAsIG1fb3ZlcnJpZGVMaW5lTnVtYmVy
KC0xKQotICAgICwgbV9maXJzdExpbmUoLTEpCi0gICAgLCBtX2xhc3RMaW5lKC0xKQotICAgICwg
bV9zdGFydENvbHVtbihVSU5UX01BWCkKLSAgICAsIG1fZW5kQ29sdW1uKFVJTlRfTUFYKQotICAg
ICwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoVUlOVF9NQVgpCi0gICAgLCBtX3R5cGVQcm9m
aWxpbmdFbmRPZmZzZXQoVUlOVF9NQVgpCi0gICAgLCBtX3NvdXJjZShzb3VyY2UpCi17Ci19Ci0K
LXZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3Rh
dGljX2Nhc3Q8U2NyaXB0RXhlY3V0YWJsZSo+KGNlbGwpLT5TY3JpcHRFeGVjdXRhYmxlOjp+U2Ny
aXB0RXhlY3V0YWJsZSgpOwotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2Rl
KENvZGVCbG9jayogY29kZUJsb2NrKQotewotICAgIGluc3RhbGxDb2RlKCpjb2RlQmxvY2stPnZt
KCksIGNvZGVCbG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxp
emF0aW9uS2luZCgpKTsKLX0KLQotdm9pZCBTY3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZShW
TSYgdm0sIENvZGVCbG9jayogZ2VuZXJpY0NvZGVCbG9jaywgQ29kZVR5cGUgY29kZVR5cGUsIENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsKLSAgICBBU1NFUlQodm0uaGVhcC5pc0RlZmVy
cmVkKCkpOwotICAgIAotICAgIGlmIChnZW5lcmljQ29kZUJsb2NrKQotICAgICAgICBDT0RFQkxP
Q0tfTE9HX0VWRU5UKGdlbmVyaWNDb2RlQmxvY2ssICJpbnN0YWxsQ29kZSIsICgpKTsKLSAgICAK
LSAgICBDb2RlQmxvY2sqIG9sZENvZGVCbG9jayA9IG51bGxwdHI7Ci0gICAgCi0gICAgc3dpdGNo
IChjb2RlVHlwZSkgewotICAgIGNhc2UgR2xvYmFsQ29kZTogewotICAgICAgICBQcm9ncmFtRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwot
ICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxQcm9ncmFt
Q29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0gICAgICAgIAotICAgICAgICBBU1NFUlQo
a2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIAotICAgICAgICBvbGRDb2RlQmxvY2sgPSBl
eGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7Ci0gICAgICAgIGV4ZWN1dGFibGUt
Pm1fcHJvZ3JhbUNvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0g
ICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgTW9kdWxlQ29kZTogewotICAgICAgICBN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVC
bG9jayk7Ci0KLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotCi0gICAgICAg
IG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQo
KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldE1heUJl
TnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAg
Y2FzZSBFdmFsQ29kZTogewotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBFdmFsQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7Ci0g
ICAgICAgIAotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIAot
ICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suZ2V0KCk7
Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRo
aXMsIGNvZGVCbG9jayk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAgICAgCi0gICAgY2Fz
ZSBGdW5jdGlvbkNvZGU6IHsKLSAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBGdW5jdGlvbkNv
ZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihnZW5l
cmljQ29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAg
ICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJs
ZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9j
b2RlQmxvY2tGb3JDYWxsLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAg
ICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQo
KTsKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LnNldE1h
eUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGtpbmQpIHsK
LSAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICBtX2ppdENvZGVGb3JDYWxsID0gZ2VuZXJp
Y0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPmppdENvZGUoKSA6IG51bGxwdHI7Ci0gICAg
ICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0
cigpOwotICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/
IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9D
T01QSUxFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAg
ICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0Nv
ZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0cjsKLSAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3Ry
dWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKLSAgICAgICAgbV9u
dW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2Rl
QmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spIHsKLSAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoZ2VuZXJpY0NvZGVCbG9jay0+b3duZXJFeGVjdXRhYmxlKCkgPT0g
dGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKEpJVENvZGU6OmlzRXhlY3V0YWJsZVNjcmlw
dChnZW5lcmljQ29kZUJsb2NrLT5qaXRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChP
cHRpb25zOjp2ZXJib3NlT1NSKCkpCi0gICAgICAgICAgICBkYXRhTG9nKCJJbnN0YWxsaW5nICIs
ICpnZW5lcmljQ29kZUJsb2NrLCAiXG4iKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh2bS5tX3Bl
ckJ5dGVjb2RlUHJvZmlsZXIpCi0gICAgICAgICAgICB2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIt
PmVuc3VyZUJ5dGVjb2Rlc0ZvcihnZW5lcmljQ29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAg
IGlmIChEZWJ1Z2dlciogZGVidWdnZXIgPSBnZW5lcmljQ29kZUJsb2NrLT5nbG9iYWxPYmplY3Qo
KS0+ZGVidWdnZXIoKSkKLSAgICAgICAgICAgIGRlYnVnZ2VyLT5yZWdpc3RlckNvZGVCbG9jayhn
ZW5lcmljQ29kZUJsb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAob2xkQ29kZUJsb2NrKQotICAgICAg
ICBvbGRDb2RlQmxvY2stPnVubGlua0luY29taW5nQ2FsbHMoKTsKLQotICAgIHZtLmhlYXAud3Jp
dGVCYXJyaWVyKHRoaXMpOwotfQotCi1Db2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld0Nv
ZGVCbG9ja0ZvcigKLSAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIEpTRnVuY3Rpb24q
IGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgSlNPYmplY3QqJiBleGNlcHRpb24pCi17Ci0gICAg
Vk0qIHZtID0gc2NvcGUtPnZtKCk7Ci0gICAgYXV0byB0aHJvd1Njb3BlID0gREVDTEFSRV9USFJP
V19TQ09QRSgqdm0pOwotCi0gICAgQVNTRVJUKHZtLT5oZWFwLmlzRGVmZXJyZWQoKSk7Ci0gICAg
QVNTRVJUKHN0YXJ0Q29sdW1uKCkgIT0gVUlOVF9NQVgpOwotICAgIEFTU0VSVChlbmRDb2x1bW4o
KSAhPSBVSU5UX01BWCk7Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6
OmluZm8oKSkgewotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxF
dmFsRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENv
ZGVGb3JDYWxsKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fZXZhbENv
ZGVCbG9jayk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJl
dHVybiBFdmFsQ29kZUJsb2NrOjpjcmVhdGUodm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBl
eGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAgICAg
ICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpKTsKLSAgICB9Ci0gICAgCi0gICAg
aWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAg
UHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUq
Pih0aGlzKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0g
ICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2spOwot
ICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOwotICAgICAgICByZXR1cm4gUHJvZ3Jh
bUNvZGVCbG9jazo6Y3JlYXRlKHZtLAotICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJs
ZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAotICAgICAgICAgICAg
ZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3Rh
cnRDb2x1bW4oKSk7Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIFJFTEVB
U0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2spOwotICAgICAg
ICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24pOwotICAgICAgICByZXR1cm4gTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jazo6Y3JlYXRlKHZtLAotICAgICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJs
ZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCksIHNjb3BlLAotICAgICAg
ICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNl
KCkuc3RhcnRDb2x1bW4oKSk7Ci0gICAgfQotCi0gICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZv
KCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOwotICAgIFJFTEVBU0VfQVNTRVJUKGZ1
bmN0aW9uKTsKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVu
Y3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUt
PmNvZGVCbG9ja0ZvcihraW5kKSk7Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9
IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKLSAgICBQYXJzZXJFcnJvciBlcnJvcjsKLSAgICBEZWJ1
Z2dlck1vZGUgZGVidWdnZXJNb2RlID0gZ2xvYmFsT2JqZWN0LT5oYXNJbnRlcmFjdGl2ZURlYnVn
Z2VyKCkgPyBEZWJ1Z2dlck9uIDogRGVidWdnZXJPZmY7Ci0gICAgVW5saW5rZWRGdW5jdGlvbkNv
ZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sgPSAKLSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxp
bmtlZEV4ZWN1dGFibGUtPnVubGlua2VkQ29kZUJsb2NrRm9yKAotICAgICAgICAgICAgKnZtLCBl
eGVjdXRhYmxlLT5tX3NvdXJjZSwga2luZCwgZGVidWdnZXJNb2RlLCBlcnJvciwgCi0gICAgICAg
ICAgICBleGVjdXRhYmxlLT5wYXJzZU1vZGUoKSk7Ci0gICAgcmVjb3JkUGFyc2UoCi0gICAgICAg
IGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVjdXRhYmxlLT5mZWF0dXJlcygpLCAKLSAgICAgICAg
ZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmhhc0NhcHR1cmVkVmFyaWFibGVzKCks
IGZpcnN0TGluZSgpLCAKLSAgICAgICAgbGFzdExpbmUoKSwgc3RhcnRDb2x1bW4oKSwgZW5kQ29s
dW1uKCkpOyAKLSAgICBpZiAoIXVubGlua2VkQ29kZUJsb2NrKSB7Ci0gICAgICAgIGV4Y2VwdGlv
biA9IHRocm93RXhjZXB0aW9uKAotICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVj
KCksIHRocm93U2NvcGUsCi0gICAgICAgICAgICBlcnJvci50b0Vycm9yT2JqZWN0KGdsb2JhbE9i
amVjdCwgZXhlY3V0YWJsZS0+bV9zb3VyY2UpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0g
ICAgfQotCi0gICAgU291cmNlUHJvdmlkZXIqIHByb3ZpZGVyID0gZXhlY3V0YWJsZS0+c291cmNl
KCkucHJvdmlkZXIoKTsKLSAgICB1bnNpZ25lZCBzb3VyY2VPZmZzZXQgPSBleGVjdXRhYmxlLT5z
b3VyY2UoKS5zdGFydE9mZnNldCgpOwotICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uID0gZXhlY3V0
YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKTsKLQotICAgIHJldHVybiBGdW5jdGlvbkNvZGVC
bG9jazo6Y3JlYXRlKHZtLAotICAgICAgICBleGVjdXRhYmxlLCB1bmxpbmtlZENvZGVCbG9jaywg
c2NvcGUsIHByb3ZpZGVyLCBzb3VyY2VPZmZzZXQsIHN0YXJ0Q29sdW1uKTsKLX0KLQotQ29kZUJs
b2NrKiBTY3JpcHRFeGVjdXRhYmxlOjpuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcigKLSAgICBD
b2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2
YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ2FsbCk7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEV2YWxDb2RlQmxvY2sqIGJhc2VsaW5l
ID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9jayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+
bV9ldmFsQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIEV2YWxDb2RlQmxv
Y2sqIHJlc3VsdCA9IEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICAgICAgQ29k
ZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAgIHJlc3VsdC0+c2V0
QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAg
ICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZv
KCkpIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0gICAg
ICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyk7Ci0gICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGlj
X2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KAotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9n
cmFtQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgICAgIFByb2dyYW1Db2RlQmxv
Y2sqIHJlc3VsdCA9IFByb2dyYW1Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICAgICAg
Q29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgICAgIHJlc3VsdC0+
c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5lKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsK
LSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6
OmluZm8oKSkgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsK
LSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oCi0g
ICAgICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5l
VmVyc2lvbigpKTsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gTW9k
dWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAgICAgICBDb2RlQmxvY2s6
OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5h
dGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQot
ICAgIFJFTEVBU0VfQVNTRVJUKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5m
bygpKTsKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rp
b25FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lID0g
c3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPigKLSAgICAgICAgZXhlY3V0YWJsZS0+Y29k
ZUJsb2NrRm9yKGtpbmQpLT5iYXNlbGluZVZlcnNpb24oKSk7Ci0gICAgRnVuY3Rpb25Db2RlQmxv
Y2sqIHJlc3VsdCA9IEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKLSAgICAgICAgQ29k
ZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpiYXNlbGluZSk7Ci0gICAgcmVzdWx0LT5zZXRBbHRl
cm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRp
YyB2b2lkIHNldHVwTExJbnQoVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSAgICBM
TEludDo6c2V0RW50cnlwb2ludCh2bSwgY29kZUJsb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0
dXBKSVQoVk0mIHZtLCBDb2RlQmxvY2sqIGNvZGVCbG9jaykKLXsKLSNpZiBFTkFCTEUoSklUKQot
ICAgIENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCA9IEpJVDo6Y29tcGlsZSgmdm0sIGNvZGVCbG9j
aywgSklUQ29tcGlsYXRpb25NdXN0U3VjY2VlZCk7Ci0gICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0
ID09IENvbXBpbGF0aW9uU3VjY2Vzc2Z1bCk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTSh2bSk7
Ci0gICAgVU5VU0VEX1BBUkFNKGNvZGVCbG9jayk7Ci0gICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRG
T1JNKCk7Ci0jZW5kaWYKLX0KLQotSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVG
b3JFeGVjdXRpb25JbXBsKAotICAgIFZNJiB2bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2Nv
cGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3Vs
dENvZGVCbG9jaykKLXsKLSAgICBEZWZlckdDRm9yQVdoaWxlIGRlZmVyR0Modm0uaGVhcCk7Ci0K
LSAgICBpZiAodm0uZ2V0QW5kQ2xlYXJGYWlsTmV4dE5ld0NvZGVCbG9jaygpKQotICAgICAgICBy
ZXR1cm4gY3JlYXRlRXJyb3Ioc2NvcGUtPmdsb2JhbE9iamVjdCgpLT5nbG9iYWxFeGVjKCksIEFT
Q0lJTGl0ZXJhbCgiRm9yY2VkIEZhaWx1cmUiKSk7Ci0KLSAgICBKU09iamVjdCogZXhjZXB0aW9u
ID0gMDsKLSAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG5ld0NvZGVCbG9ja0ZvcihraW5kLCBm
dW5jdGlvbiwgc2NvcGUsIGV4Y2VwdGlvbik7Ci0gICAgcmVzdWx0Q29kZUJsb2NrID0gY29kZUJs
b2NrOwotICAgIGlmICghY29kZUJsb2NrKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGV4Y2Vw
dGlvbik7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb247Ci0gICAgfQotICAgIAotICAgIGlmIChP
cHRpb25zOjp2YWxpZGF0ZUJ5dGVjb2RlKCkpCi0gICAgICAgIGNvZGVCbG9jay0+dmFsaWRhdGUo
KTsKLSAgICAKLSAgICBpZiAoT3B0aW9uczo6dXNlTExJbnQoKSkKLSAgICAgICAgc2V0dXBMTElu
dCh2bSwgY29kZUJsb2NrKTsKLSAgICBlbHNlCi0gICAgICAgIHNldHVwSklUKHZtLCBjb2RlQmxv
Y2spOwotICAgIAotICAgIGluc3RhbGxDb2RlKHZtLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29k
ZVR5cGUoKSwgY29kZUJsb2NrLT5zcGVjaWFsaXphdGlvbktpbmQoKSk7Ci0gICAgcmV0dXJuIG51
bGxwdHI7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBFdmFsRXhlY3V0YWJsZTo6c19pbmZvID0geyAi
RXZhbEV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVU
SE9EX1RBQkxFKEV2YWxFeGVjdXRhYmxlKSB9OwotCi1FdmFsRXhlY3V0YWJsZSogRXZhbEV4ZWN1
dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwg
Ym9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0
VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENv
bnRleHRUeXBlLCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50KiB2YXJpYWJsZXNVbmRlclREWikK
LXsKLSAgICBWTSYgdm0gPSBleGVjLT52bSgpOwotICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RI
Uk9XX1NDT1BFKHZtKTsKLQotICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVj
LT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7Ci0gICAgaWYgKCFnbG9iYWxPYmplY3QtPmV2YWxFbmFi
bGVkKCkpIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZUV2YWxF
cnJvcihleGVjLCBnbG9iYWxPYmplY3QtPmV2YWxEaXNhYmxlZEVycm9yTWVzc2FnZSgpKSk7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8RXZhbEV4ZWN1dGFibGU+KCpleGVjLT5oZWFw
KCkpKSBFdmFsRXhlY3V0YWJsZShleGVjLCBzb3VyY2UsIGlzSW5TdHJpY3RDb250ZXh0LCBkZXJp
dmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSk7
Ci0gICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwotCi0gICAgVW5saW5rZWRFdmFs
Q29kZUJsb2NrKiB1bmxpbmtlZEV2YWxDb2RlID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVFdmFsQ29k
ZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUsIHZhcmlhYmxlc1VuZGVyVERaKTsKLSAgICBpZiAoIXVu
bGlua2VkRXZhbENvZGUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZXhlY3V0YWJsZS0+bV91
bmxpbmtlZEV2YWxDb2RlQmxvY2suc2V0KHZtLCBleGVjdXRhYmxlLCB1bmxpbmtlZEV2YWxDb2Rl
KTsKLQotICAgIHJldHVybiBleGVjdXRhYmxlOwotfQotCi1FdmFsRXhlY3V0YWJsZTo6RXZhbEV4
ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wg
aW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBi
b29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5
cGUpCi0gICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkuZXZhbEV4ZWN1dGFibGVTdHJ1
Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgaW5TdHJpY3RDb250ZXh0LCBkZXJpdmVk
Q29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSwgTm9J
bnRyaW5zaWMpCi17Ci0gICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkg
PT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsKLX0KLQotdm9pZCBFdmFsRXhl
Y3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8RXZhbEV4
ZWN1dGFibGUqPihjZWxsKS0+RXZhbEV4ZWN1dGFibGU6On5FdmFsRXhlY3V0YWJsZSgpOwotfQot
Ci1jb25zdCBDbGFzc0luZm8gUHJvZ3JhbUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlByb2dyYW1F
eGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9U
QUJMRShQcm9ncmFtRXhlY3V0YWJsZSkgfTsKLQotUHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1F
eGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQotICAg
IDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLnByb2dyYW1FeGVjdXRhYmxlU3RydWN0dXJl
LmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJpdmVkQ29udGV4dFR5cGU6Ok5v
bmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIE5vSW50cmluc2ljKQotewotICAgIEFT
U0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291
cmNlVHlwZTo6UHJvZ3JhbSk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAwOwot
ICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0gICAg
aWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxvd1By
b2ZpbGVyKCkpCi0gICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCkt
Pmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFydE9m
ZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKLX0KLQotdm9pZCBQcm9ncmFtRXhlY3V0
YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUV4
ZWN1dGFibGUqPihjZWxsKS0+UHJvZ3JhbUV4ZWN1dGFibGU6On5Qcm9ncmFtRXhlY3V0YWJsZSgp
OwotfQotCiBjb25zdCBDbGFzc0luZm8gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnNfaW5mbyA9
IHsgIk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywg
MCwgQ1JFQVRFX01FVEhPRF9UQUJMRShNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSkgfTsKIAogTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGU6Ok1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSog
ZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQpAQCAtNTExLDE4OCArNzIsNiBAQCB2b2lk
IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTCiAgICAgc3RhdGljX2Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKS0+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6On5N
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpOwogfQogCi1jb25zdCBDbGFzc0luZm8gRnVuY3Rpb25F
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJGdW5jdGlvbkV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0
YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEZ1bmN0aW9uRXhlY3V0YWJsZSkg
fTsKLQotRnVuY3Rpb25FeGVjdXRhYmxlOjpGdW5jdGlvbkV4ZWN1dGFibGUoVk0mIHZtLCBjb25z
dCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtl
ZEV4ZWN1dGFibGUsIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2ln
bmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMp
Ci0gICAgOiBTY3JpcHRFeGVjdXRhYmxlKHZtLmZ1bmN0aW9uRXhlY3V0YWJsZVN0cnVjdHVyZS5n
ZXQoKSwgdm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLT5pc0luU3RyaWN0Q29udGV4dCgp
LCB1bmxpbmtlZEV4ZWN1dGFibGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpLCBmYWxzZSwgRXZhbENv
bnRleHRUeXBlOjpOb25lLCBpbnRyaW5zaWMpCi0gICAgLCBtX3VubGlua2VkRXhlY3V0YWJsZSh2
bSwgdGhpcywgdW5saW5rZWRFeGVjdXRhYmxlKQotewotICAgIFJFTEVBU0VfQVNTRVJUKCFzb3Vy
Y2UuaXNOdWxsKCkpOwotICAgIEFTU0VSVChzb3VyY2UubGVuZ3RoKCkpOwotICAgIG1fZmlyc3RM
aW5lID0gZmlyc3RMaW5lOwotICAgIG1fbGFzdExpbmUgPSBsYXN0TGluZTsKLSAgICBBU1NFUlQo
c3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9N
QVgpOwotICAgIG1fc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKLSAgICBtX2VuZENvbHVtbiA9
IGVuZENvbHVtbjsKLSAgICBtX3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0
YWJsZS0+cGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRP
ZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpOwot
ICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVBy
b2ZpbGluZ0VuZE9mZnNldCgpOwotfQotCi12b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNo
Q3JlYXRpb24oVk0mIHZtKQotewotICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICBt
X3NpbmdsZXRvbkZ1bmN0aW9uLnNldCh2bSwgdGhpcywgSW5mZXJyZWRWYWx1ZTo6Y3JlYXRlKHZt
KSk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkK
LXsKLSAgICBzdGF0aWNfY2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKS0+RnVuY3Rpb25F
eGVjdXRhYmxlOjp+RnVuY3Rpb25FeGVjdXRhYmxlKCk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFy
KiBzYW1wbGluZ0Rlc2NyaXB0aW9uKEpJVENvZGU6OkpJVFR5cGUgaml0VHlwZSkKLXsKLSAgICBz
d2l0Y2ggKGppdFR5cGUpIHsKLSAgICBjYXNlIEpJVENvZGU6OkludGVycHJldGVyVGh1bms6Ci0g
ICAgICAgIHJldHVybiAiSW50ZXJwcmV0ZXIgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgY2Fz
ZSBKSVRDb2RlOjpCYXNlbGluZUpJVDoKLSAgICAgICAgcmV0dXJuICJCYXNlbGluZSBDb21waWxh
dGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkRGR0pJVDoKLSAgICAgICAgcmV0dXJu
ICJERkcgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgY2FzZSBKSVRDb2RlOjpGVExKSVQ6Ci0g
ICAgICAgIHJldHVybiAiRlRMIENvbXBpbGF0aW9uIChUT1RBTCkiOwotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLX0KLQotdm9pZCBFdmFsRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNl
bGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIEV2YWxFeGVjdXRhYmxlKiB0aGlzT2Jq
ZWN0ID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVD
VF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZp
c2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRo
aXNPYmplY3QtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrKTsKLSAgICBpZiAodGhpc09iamVjdC0+
bV9ldmFsQ29kZUJsb2NrKQotICAgICAgICB0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxvY2stPnZp
c2l0V2Vha2x5KHZpc2l0b3IpOwotfQotCi1KU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6OmNo
ZWNrU3ludGF4KEV4ZWNTdGF0ZSogZXhlYykKLXsKLSAgICBQYXJzZXJFcnJvciBlcnJvcjsKLSAg
ICBWTSogdm0gPSAmZXhlYy0+dm0oKTsKLSAgICBKU0dsb2JhbE9iamVjdCogbGV4aWNhbEdsb2Jh
bE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBzdGQ6OnVuaXF1ZV9w
dHI8UHJvZ3JhbU5vZGU+IHByb2dyYW1Ob2RlID0gcGFyc2U8UHJvZ3JhbU5vZGU+KAotICAgICAg
ICB2bSwgbV9zb3VyY2UsIElkZW50aWZpZXIoKSwgSlNQYXJzZXJCdWlsdGluTW9kZTo6Tm90QnVp
bHRpbiwKLSAgICAgICAgSlNQYXJzZXJTdHJpY3RNb2RlOjpOb3RTdHJpY3QsIEpTUGFyc2VyU2Ny
aXB0TW9kZTo6Q2xhc3NpYywgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgU3VwZXJCaW5k
aW5nOjpOb3ROZWVkZWQsIGVycm9yKTsKLSAgICBpZiAocHJvZ3JhbU5vZGUpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIEFTU0VSVChlcnJvci5pc1ZhbGlkKCkpOwotICAgIHJldHVybiBlcnJvci50
b0Vycm9yT2JqZWN0KGxleGljYWxHbG9iYWxPYmplY3QsIG1fc291cmNlKTsKLX0KLQotSlNPYmpl
Y3QqIFByb2dyYW1FeGVjdXRhYmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYgdm0s
IENhbGxGcmFtZSogY2FsbEZyYW1lLCBKU1Njb3BlKiBzY29wZSkKLXsKLSAgICBSRUxFQVNFX0FT
U0VSVChzY29wZSk7Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5n
bG9iYWxPYmplY3QoKTsKLSAgICBSRUxFQVNFX0FTU0VSVChnbG9iYWxPYmplY3QpOwotICAgIEFT
U0VSVCgmZ2xvYmFsT2JqZWN0LT52bSgpID09ICZ2bSk7Ci0KLSAgICBKU09iamVjdCogZXhjZXB0
aW9uID0gMDsKLSAgICBVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2Nr
ID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVQcm9ncmFtQ29kZUJsb2NrKGNhbGxGcmFtZSwgdGhpcywg
JmV4Y2VwdGlvbik7Ci0gICAgaWYgKGV4Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlv
bjsKLQotICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJv
bm1lbnQgPSBnbG9iYWxPYmplY3QtPmdsb2JhbExleGljYWxFbnZpcm9ubWVudCgpOwotICAgIGNv
bnN0IFZhcmlhYmxlRW52aXJvbm1lbnQmIHZhcmlhYmxlRGVjbGFyYXRpb25zID0gdW5saW5rZWRD
b2RlQmxvY2stPnZhcmlhYmxlRGVjbGFyYXRpb25zKCk7Ci0gICAgY29uc3QgVmFyaWFibGVFbnZp
cm9ubWVudCYgbGV4aWNhbERlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5sZXhpY2Fs
RGVjbGFyYXRpb25zKCk7Ci0gICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBubyB2YXJzL2ds
b2JhbCBwcm9wZXJ0aWVzL2xldC9jb25zdCBjYW4gYmUgZHVwbGljYXRlZCBpbiB0aGUgZ2xvYmFs
IHNjb3BlLgotICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlvbiAxNS4xLjggb2YgdGhlIEVT
NiBzcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2lu
ZGV4Lmh0bWwjc2VjLWdsb2JhbGRlY2xhcmF0aW9uaW5zdGFudGlhdGlvbgotICAgIHsKLSAgICAg
ICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7Ci0gICAgICAg
IC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gb2YgInZhciIgYW5kICJsZXQiLyJjb25zdCIvImNs
YXNzIgotICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewot
ICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25zLmNvbnRhaW5zKGVudHJ5LmtleSkp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJp
bmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5
LmdldCgpKSwgIiciKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3
ICJsZXQiLyJjb25zdCIvImNsYXNzIiB3aWxsIHNoYWRvdyBhbnkgcHJlLWV4aXN0aW5nIGdsb2Jh
bCBwcm9wZXJ0eSBuYW1lcywgb3IgInZhciIvImxldCIvImNvbnN0IiB2YXJpYWJsZXMuCi0gICAg
ICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93LgotICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgaWYgKGds
b2JhbE9iamVjdC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgewotICAgICAg
ICAgICAgICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQganVzdCBSZXN0cmljdGVkR2xvYmFs
UHJvcGVydHkgY2FuJ3QgYmUgc2hhZG93ZWQKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNhcnJp
ZWQgb3V0IHNlY3Rpb24gOC4xLjEuNC4xNCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNt
YS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtaGFzcmVzdHJp
Y3RlZGdsb2JhbHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRl
c2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IoZXhlYywgZW50cnkua2V5LmdldCgpLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpICE9IGpzVW5kZWZp
bmVkKCkgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAg
IHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUg
ZHVwbGljYXRlIHZhcmlhYmxlIHRoYXQgc2hhZG93cyBhIGdsb2JhbCBwcm9wZXJ0eTogJyIsIFN0
cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3Bl
cnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoVU5MSUtF
TFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRpb25T
aG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gV2Ugb25seSBhbGxvdyAiY29uc3QiIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgdW5kZXIgdGhp
cyBzZXR0aW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qg
ImxldCIgdmFyaWFibGVzIHRvIGJlIG92ZXJyaWRkZW4gYnkgImNvbnN0IiB2YXJpYWJsZXMuCi0g
ICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzQ29uc3RW
YXJpYWJsZShlbnRyeS5rZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50
YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxl
OiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAidmFyInMgd2lsbCBzaGFkb3cg
YW55IHByZXZpb3VzICJsZXQiLyJjb25zdCIvImNsYXNzIiBuYW1lcy4KLSAgICAgICAgLy8gSXQn
cyBhbiBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAgICAgIGlmICghZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgZW50
cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgIGlmIChnbG9iYWxM
ZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpCi0g
ICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3Ry
aW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5Lmtl
eS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAg
ICBtX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5zZXQodm0sIHRoaXMsIHVubGlua2VkQ29kZUJs
b2NrKTsKLQotICAgIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyIG9wdGltaXplcih2bSwgZ2xv
YmFsT2JqZWN0KTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBudW1iZXJPZkZ1bmN0aW9ucyA9
IHVubGlua2VkQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgaSA8IG51bWJlck9m
RnVuY3Rpb25zOyArK2kpIHsKLSAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlID0gdW5saW5rZWRDb2RlQmxvY2stPmZ1bmN0aW9uRGVj
bChpKTsKLSAgICAgICAgQVNTRVJUKCF1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgp
LmlzRW1wdHkoKSk7Ci0gICAgICAgIGdsb2JhbE9iamVjdC0+YWRkRnVuY3Rpb24oY2FsbEZyYW1l
LCB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpKTsKLSAgICAgICAgaWYgKHZtLnR5
cGVQcm9maWxlcigpIHx8IHZtLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkgewotICAgICAgICAgICAg
dm0uZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3Vy
Y2VJRCgpLCAKLSAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+dHlw
ZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCksIAotICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rp
b25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkpOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7Ci0gICAg
ICAgIEFTU0VSVChlbnRyeS52YWx1ZS5pc1ZhcigpKTsKLSAgICAgICAgZ2xvYmFsT2JqZWN0LT5h
ZGRWYXIoY2FsbEZyYW1lLCBJZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgZW50cnkua2V5LmdldCgp
KSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCog
Z2xvYmFsTGV4aWNhbEVudmlyb25tZW50ID0ganNDYXN0PEpTR2xvYmFsTGV4aWNhbEVudmlyb25t
ZW50Kj4oZ2xvYmFsT2JqZWN0LT5nbG9iYWxTY29wZSgpKTsKLSAgICAgICAgU3ltYm9sVGFibGUq
IHN5bWJvbFRhYmxlID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5zeW1ib2xUYWJsZSgpOwot
ICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJsZS0+bV9sb2NrKTsK
LSAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKLSAgICAg
ICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENv
bnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgewotICAg
ICAgICAgICAgICAgIGlmIChzeW1ib2xUYWJsZS0+Y29udGFpbnMobG9ja2VyLCBlbnRyeS5rZXku
Z2V0KCkpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldCA9IHN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3Bl
T2Zmc2V0KGxvY2tlcik7Ci0gICAgICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IG5ld0VudHJ5KFZh
ck9mZnNldChvZmZzZXQpLCBlbnRyeS52YWx1ZS5pc0NvbnN0KCkgPyBSZWFkT25seSA6IDApOwot
ICAgICAgICAgICAgbmV3RW50cnkucHJlcGFyZVRvV2F0Y2goKTsKLSAgICAgICAgICAgIHN5bWJv
bFRhYmxlLT5hZGQobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCksIG5ld0VudHJ5KTsKLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0ID0gZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5hZGRWYXJpYWJsZXMoMSwganNURFpWYWx1ZSgpKTsKLSAgICAgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKG9mZnNldEZvckFzc2VydCA9PSBvZmZzZXQpOwotICAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFByb2dyYW1FeGVjdXRhYmxlOjp2aXNp
dENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihj
ZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7
Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9y
KTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZFByb2dyYW1Db2Rl
QmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2spCi0gICAgICAg
IHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci19
Ci0KIHZvaWQgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBj
ZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKIHsKICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSogdGhpc09iamVjdCA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOwpA
QCAtNzA0LDE0MyArODMsNCBAQCB2b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENo
aWxkCiAgICAgICAgIHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRX
ZWFrbHkodmlzaXRvcik7CiB9CiAKLUZ1bmN0aW9uQ29kZUJsb2NrKiBGdW5jdGlvbkV4ZWN1dGFi
bGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsK
LSAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0OwotICAgIGlmIChraW5kID09IENvZGVGb3JD
YWxsKQotICAgICAgICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0g
ICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAg
ICBpZiAoIXJlc3VsdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0
PEZ1bmN0aW9uQ29kZUJsb2NrKj4ocmVzdWx0LT5iYXNlbGluZUFsdGVybmF0aXZlKCkpOwotfQot
Ci12b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNs
b3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogdGhpc09iamVj
dCA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JK
RUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6
dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICBpZiAodGhpc09iamVjdC0+
bV9jb2RlQmxvY2tGb3JDYWxsKQotICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNh
bGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdCkKLSAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1
Y3QtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0
LT5tX3VubGlua2VkRXhlY3V0YWJsZSk7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3Qt
Pm1fc2luZ2xldG9uRnVuY3Rpb24pOwotfQotCi1GdW5jdGlvbkV4ZWN1dGFibGUqIEZ1bmN0aW9u
RXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCi0gICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwg
RXhlY1N0YXRlJiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIAotICAgIEpTT2JqZWN0
KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKQotewotICAgIFVubGlua2VkRnVu
Y3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUgPSAKLSAgICAgICAgVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKAotICAgICAgICAgICAgbmFtZSwgZXhl
Yywgc291cmNlLCBleGNlcHRpb24sIG92ZXJyaWRlTGluZU51bWJlcik7Ci0gICAgaWYgKCF1bmxp
bmtlZEV4ZWN1dGFibGUpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgcmV0dXJuIHVu
bGlua2VkRXhlY3V0YWJsZS0+bGluayhleGVjLnZtKCksIHNvdXJjZSwgb3ZlcnJpZGVMaW5lTnVt
YmVyKTsKLX0KLQotI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKLWNvbnN0IENsYXNzSW5mbyBXZWJB
c3NlbWJseUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5RXhlY3V0YWJsZSIsICZF
eGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFdlYkFzc2VtYmx5
RXhlY3V0YWJsZSkgfTsKLQotV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4ZWN1
dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSogbW9k
dWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQotICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZt
LndlYkFzc2VtYmx5RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfTk9U
X0NPTVBJTEVELCBOb0ludHJpbnNpYykKLSAgICAsIG1fc291cmNlKHNvdXJjZSkKLSAgICAsIG1f
bW9kdWxlKHZtLCB0aGlzLCBtb2R1bGUpCi0gICAgLCBtX2Z1bmN0aW9uSW5kZXgoZnVuY3Rpb25J
bmRleCkKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBT
b3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OldlYkFzc2VtYmx5KTsKLX0KLQotdm9pZCBXZWJBc3Nl
bWJseUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0
PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwpLT5XZWJBc3NlbWJseUV4ZWN1dGFibGU6On5X
ZWJBc3NlbWJseUV4ZWN1dGFibGUoKTsKLX0KLQotdm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6
OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAg
ICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlF
eGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2Jq
ZWN0LCBpbmZvKCkpOwotICAgIEV4ZWN1dGFibGVCYXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmpl
Y3QsIHZpc2l0b3IpOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCi0g
ICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRv
cik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlKTsKLX0KLSNlbmRp
ZgotCi12b2lkIEV4ZWN1dGFibGVCYXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Ci17
Ci0gICAgRXhlY3V0YWJsZUJhc2UqIHJlYWxUaGlzID0gY29uc3RfY2FzdDxFeGVjdXRhYmxlQmFz
ZSo+KHRoaXMpOwotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxl
OjppbmZvKCkpIHsKLSAgICAgICAgTmF0aXZlRXhlY3V0YWJsZSogbmF0aXZlID0ganNDYXN0PE5h
dGl2ZUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIG91dC5wcmludCgiTmF0aXZlRXhl
Y3V0YWJsZToiLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5mdW5jdGlv
bigpKSksICIvIiwgUmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+Y29uc3Ry
dWN0b3IoKSkpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBFdmFsRXhlY3V0YWJs
ZSogZXZhbCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgaWYg
KENvZGVCbG9jayogY29kZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCi0gICAgICAgICAgICBv
dXQucHJpbnQoKmNvZGVCbG9jayk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dC5wcmlu
dCgiRXZhbEV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygp
KSB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PFByb2dyYW1FeGVj
dXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBl
dmFsLT5jb2RlQmxvY2soKSkKLSAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCJQcm9ncmFtRXhlY3V0YWJsZSB3L28g
Q29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXhl
Y3V0YWJsZS0+Y29kZUJsb2NrKCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dC5wcmludCgiTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAg
IEZ1bmN0aW9uRXhlY3V0YWJsZSogZnVuY3Rpb24gPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxl
Kj4ocmVhbFRoaXMpOwotICAgIGlmICghZnVuY3Rpb24tPmVpdGhlckNvZGVCbG9jaygpKQotICAg
ICAgICBvdXQucHJpbnQoIkZ1bmN0aW9uRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIENvbW1hUHJpbnRlciBjb21tYSgiLyIpOwotICAgICAgICBpZiAoZnVu
Y3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSkKLSAgICAgICAgICAgIG91dC5wcmludChjb21tYSwg
KmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkpOwotICAgICAgICBpZiAoZnVuY3Rpb24tPmNv
ZGVCbG9ja0ZvckNvbnN0cnVjdCgpKQotICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVu
Y3Rpb24tPmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpKTsKLSAgICB9Ci19Ci0KLUNvZGVCbG9ja0hh
c2ggRXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBj
b25zdAotewotICAgIGlmICh0aGlzLT5jbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjpp
bmZvKCkpCi0gICAgICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgTmF0aXZlRXhlY3V0YWJsZSo+KHRo
aXMpLT5oYXNoRm9yKGtpbmQpOwotICAgIAotICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgU2NyaXB0
RXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9yKGtpbmQpOwotfQotCi1Db2RlQmxvY2tIYXNoIE5h
dGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25z
dAotewotICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICByZXR1cm4gQ29kZUJs
b2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9mdW5j
dGlvbikpKTsKLSAgICAKLSAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1
Y3QpOwotICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3
aXNlX2Nhc3Q8c2l6ZV90PihtX2NvbnN0cnVjdG9yKSkpOwotfQotCi1Db2RlQmxvY2tIYXNoIFNj
cmlwdEV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25z
dAotewotICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHNvdXJjZSgpLCBraW5kKTsKLX0KLQotfQor
fSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9N
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL01vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmgJKHJldmlzaW9uIDIwNzc5MCkJ
KGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5oOjIwNzc5MCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01vZHVsZVByb2dyYW1FeGVjdXRhYmxl
LmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDksIDIwMTAsIDIwMTMtMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjcHJhZ21hIG9uY2UK
KworI2luY2x1ZGUgIkFyaXR5Q2hlY2tNb2RlLmgiCisjaW5jbHVkZSAiQ2FsbERhdGEuaCIKKyNp
bmNsdWRlICJDb2RlQmxvY2tIYXNoLmgiCisjaW5jbHVkZSAiQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZC5oIgorI2luY2x1ZGUgIkNvbXBpbGF0aW9uUmVzdWx0LmgiCisjaW5jbHVkZSAiRXhlY3V0YWJs
ZUluZm8uaCIKKyNpbmNsdWRlICJIYW5kbGVySW5mby5oIgorI2luY2x1ZGUgIkluZmVycmVkVmFs
dWUuaCIKKyNpbmNsdWRlICJKSVRDb2RlLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIK
KyNpbmNsdWRlICJTb3VyY2VDb2RlLmgiCisjaW5jbHVkZSAiVHlwZVNldC5oIgorI2luY2x1ZGUg
IlVubGlua2VkQ29kZUJsb2NrLmgiCisjaW5jbHVkZSAiVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFi
bGUuaCIKKworbmFtZXNwYWNlIEpTQyB7CisKK2NsYXNzIENvZGVCbG9jazsKK2NsYXNzIEV2YWxD
b2RlQmxvY2s7CitjbGFzcyBGdW5jdGlvbkNvZGVCbG9jazsKK2NsYXNzIEpTU2NvcGU7CitjbGFz
cyBKU1dhc21Nb2R1bGU7CitjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitjbGFzcyBNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrOworY2xhc3MgUHJvZ3JhbUNvZGVCbG9jazsKK2NsYXNzIFdlYkFz
c2VtYmx5Q29kZUJsb2NrOworCitlbnVtIENvbXBpbGF0aW9uS2luZCB7IEZpcnN0Q29tcGlsYXRp
b24sIE9wdGltaXppbmdDb21waWxhdGlvbiB9OworCitpbmxpbmUgYm9vbCBpc0NhbGwoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBraW5kKQoreworICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0
KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NsYXNzIEV4ZWN1dGFibGVCYXNlIDogcHVibGlj
IEpTQ2VsbCB7CisgICAgZnJpZW5kIGNsYXNzIEpJVDsKKworcHJvdGVjdGVkOgorICAgIHN0YXRp
YyBjb25zdCBpbnQgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCA9IDA7CisgICAgc3RhdGljIGNvbnN0
IGludCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQgPSAtMTsKKworICAgIEV4ZWN1dGFibGVC
YXNlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIGludCBudW1QYXJhbWV0ZXJzLCBJbnRy
aW5zaWMgaW50cmluc2ljKQorICAgICAgICA6IEpTQ2VsbCh2bSwgc3RydWN0dXJlKQorICAgICAg
ICAsIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwobnVtUGFyYW1ldGVycykKKyAgICAgICAgLCBtX251
bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QobnVtUGFyYW1ldGVycykKKyAgICAgICAgLCBtX2ludHJp
bnNpYyhpbnRyaW5zaWMpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZmluaXNoQ3JlYXRpb24o
Vk0mIHZtKQorICAgIHsKKyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgIH0K
KworcHVibGljOgorICAgIHR5cGVkZWYgSlNDZWxsIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVu
c2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7CisKKyAgICBzdGF0
aWMgY29uc3QgYm9vbCBuZWVkc0Rlc3RydWN0aW9uID0gdHJ1ZTsKKyAgICBzdGF0aWMgdm9pZCBk
ZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBib29sIGlzRXZhbEV4ZWN1dGFibGUo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBFdmFsRXhlY3V0YWJsZVR5
cGU7CisgICAgfQorICAgIGJvb2wgaXNGdW5jdGlvbkV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGVUeXBlOworICAgIH0K
KyAgICBib29sIGlzUHJvZ3JhbUV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIHR5cGUoKSA9PSBQcm9ncmFtRXhlY3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJvb2wgaXNN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09
IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZTsKKyAgICB9CisKKworICAgIGJvb2wgaXNIb3N0
RnVuY3Rpb24oKSBjb25zdAorICAgIHsKKyAgICAgICAgQVNTRVJUKChtX251bVBhcmFtZXRlcnNG
b3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QpID09IChtX251bVBhcmFtZXRlcnNGb3JD
b25zdHJ1Y3QgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkpOworICAgICAgICByZXR1cm4gbV9u
dW1QYXJhbWV0ZXJzRm9yQ2FsbCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUOworICAgIH0KKwor
I2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKKyAgICBib29sIGlzV2ViQXNzZW1ibHlFeGVjdXRhYmxl
KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlKCkgPT0gV2ViQXNzZW1ibHlFeGVj
dXRhYmxlVHlwZTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0
ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUg
cHJvdG8pIHsgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3Rv
LCBUeXBlSW5mbyhDZWxsVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOyB9CisgICAgICAg
IAorICAgIHZvaWQgY2xlYXJDb2RlKCk7CisKKyAgICBERUNMQVJFX0VYUE9SVF9JTkZPOworCitw
cm90ZWN0ZWQ6CisgICAgaW50IG1fbnVtUGFyYW1ldGVyc0ZvckNhbGw7CisgICAgaW50IG1fbnVt
UGFyYW1ldGVyc0ZvckNvbnN0cnVjdDsKKworcHVibGljOgorICAgIFBhc3NSZWZQdHI8SklUQ29k
ZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1faml0
Q29kZUZvckNhbGwpOworICAgICAgICByZXR1cm4gbV9qaXRDb2RlRm9yQ2FsbDsKKyAgICB9CisK
KyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QoKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUKG1faml0Q29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJl
dHVybiBtX2ppdENvZGVGb3JDb25zdHJ1Y3Q7CisgICAgfQorICAgICAgICAKKyAgICBQYXNzUmVm
UHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAg
ICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQg
PT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9y
Q29uc3RydWN0KCk7CisgICAgfQorICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBlbnRy
eXBvaW50Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQXJpdHlDaGVja01vZGUgYXJp
dHkpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgY2FjaGVkIHJlc3VsdC4g
V2Ugb25seSBoYXZlIGl0IGZvciBhcml0eSBjaGVjayBiZWNhdXNlIHdlIHVzZSB0aGUKKyAgICAg
ICAgLy8gbm8tYXJpdHkgZW50cnlwb2ludCBpbiBub24tdmlydHVhbCBjYWxscywgd2hpY2ggd2ls
bCAiY2FjaGUiIHRoaXMgdmFsdWUgZGlyZWN0bHkgaW4KKyAgICAgICAgLy8gbWFjaGluZSBjb2Rl
LgorICAgICAgICBpZiAoYXJpdHkgPT0gTXVzdENoZWNrQXJpdHkpIHsKKyAgICAgICAgICAgIHN3
aXRjaCAoa2luZCkgeworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAg
ICAgICBpZiAoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9IG1faml0Q29kZUZvckNhbGxX
aXRoQXJpdHlDaGVjaykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKKyAg
ICAgICAgICAgICAgICBpZiAoTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9IG1faml0Q29k
ZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPQorICAgICAgICAgICAgZ2Vu
ZXJhdGVkSklUQ29kZUZvcihraW5kKS0+YWRkcmVzc0ZvckNhbGwoYXJpdHkpOworICAgICAgICBp
ZiAoYXJpdHkgPT0gTXVzdENoZWNrQXJpdHkpIHsKKyAgICAgICAgICAgIC8vIENhY2hlIHRoZSBy
ZXN1bHQ7IHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgSklUJ3MgdmlydHVhbCBjYWxsIG9wdGlt
aXphdGlvbnMuCisgICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgICAgIGNhc2Ug
Q29kZUZvckNhbGw6CisgICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNo
ZWNrID0gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBD
b2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdp
dGhBcml0eUNoZWNrID0gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3Rh
dGljIHB0cmRpZmZfdCBvZmZzZXRPZkpJVENvZGVXaXRoQXJpdHlDaGVja0ZvcigKKyAgICAgICAg
Q29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChraW5k
KSB7CisgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgICAgICByZXR1cm4gT0JKRUNU
X09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sp
OworICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICByZXR1cm4gT0JK
RUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJp
dHlDaGVjayk7CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBwdHJkaWZmX3Qg
b2Zmc2V0T2ZOdW1QYXJhbWV0ZXJzRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAg
ICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJu
IE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCk7
CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1
cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDb25z
dHJ1Y3QpOworICAgIH0KKworICAgIGJvb2wgaGFzSklUQ29kZUZvckNhbGwoKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPj0gMDsKKyAgICB9Cisg
ICAgICAgIAorICAgIGJvb2wgaGFzSklUQ29kZUZvckNvbnN0cnVjdCgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID49IDA7CisgICAgfQor
ICAgICAgICAKKyAgICBib29sIGhhc0pJVENvZGVGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAg
ICAgICAgICByZXR1cm4gaGFzSklUQ29kZUZvckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQg
PT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ29uc3Ry
dWN0KCk7CisgICAgfQorCisgICAgLy8gSW50cmluc2ljcyBhcmUgb25seSBmb3IgY2FsbHMsIGN1
cnJlbnRseS4KKyAgICBJbnRyaW5zaWMgaW50cmluc2ljKCkgY29uc3QgeyByZXR1cm4gbV9pbnRy
aW5zaWM7IH0KKyAgICAgICAgCisgICAgSW50cmluc2ljIGludHJpbnNpY0ZvcihDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXNDYWxsKGtpbmQp
KQorICAgICAgICAgICAgcmV0dXJuIGludHJpbnNpYygpOworICAgICAgICByZXR1cm4gTm9JbnRy
aW5zaWM7CisgICAgfQorICAgIAorICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0Owor
ICAgICAgICAKK3Byb3RlY3RlZDoKKyAgICBJbnRyaW5zaWMgbV9pbnRyaW5zaWM7CisgICAgUmVm
UHRyPEpJVENvZGU+IG1faml0Q29kZUZvckNhbGw7CisgICAgUmVmUHRyPEpJVENvZGU+IG1faml0
Q29kZUZvckNvbnN0cnVjdDsKKyAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgbV9qaXRDb2RlRm9y
Q2FsbFdpdGhBcml0eUNoZWNrOworICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVG
b3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjazsKK307CisKK2NsYXNzIE5hdGl2ZUV4ZWN1dGFibGUg
ZmluYWwgOiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgeworICAgIGZyaWVuZCBjbGFzcyBKSVQ7Cisg
ICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoKKyAgICB0eXBl
ZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVj
dHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwor
CisgICAgc3RhdGljIE5hdGl2ZUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYgdm0sIFBhc3NSZWZQdHI8
SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0cjxK
SVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJp
bnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisKKyAgICBzdGF0aWMgdm9pZCBk
ZXN0cm95KEpTQ2VsbCopOworCisgICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFs
aXphdGlvbktpbmQpIGNvbnN0OworCisgICAgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24oKSB7IHJl
dHVybiBtX2Z1bmN0aW9uOyB9CisgICAgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IoKSB7IHJl
dHVybiBtX2NvbnN0cnVjdG9yOyB9CisgICAgICAgIAorICAgIE5hdGl2ZUZ1bmN0aW9uIG5hdGl2
ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAg
IGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCk7
CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1
cm4gY29uc3RydWN0b3IoKTsKKyAgICB9CisgICAgICAgIAorICAgIHN0YXRpYyBwdHJkaWZmX3Qg
b2Zmc2V0T2ZOYXRpdmVGdW5jdGlvbkZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisg
ICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVy
biBPQkpFQ1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9mdW5jdGlvbik7CisgICAgICAg
IEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gT0JKRUNU
X09GRlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUsIG1fY29uc3RydWN0b3IpOworICAgIH0KKworICAg
IHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYsIEpTR2xvYmFsT2JqZWN0Kiwg
SlNWYWx1ZSBwcm90byk7CisgICAgICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKworICAgIGNvbnN0
IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorCitwcm90ZWN0ZWQ6Cisg
ICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYsIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5r
LCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJpbmcmIG5hbWUp
OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKworICAgIE5h
dGl2ZUV4ZWN1dGFibGUoVk0mLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rp
b24gY29uc3RydWN0b3IsIEludHJpbnNpYyk7CisKKyAgICBOYXRpdmVGdW5jdGlvbiBtX2Z1bmN0
aW9uOworICAgIE5hdGl2ZUZ1bmN0aW9uIG1fY29uc3RydWN0b3I7CisKKyAgICBTdHJpbmcgbV9u
YW1lOworfTsKKworY2xhc3MgU2NyaXB0RXhlY3V0YWJsZSA6IHB1YmxpYyBFeGVjdXRhYmxlQmFz
ZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOworICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzOwor
CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKyAgICAgICAgCisgICAgQ29kZUJs
b2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OworCisgICAgY29u
c3QgU291cmNlQ29kZSYgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2U7IH0KKyAgICBp
bnRwdHJfdCBzb3VyY2VJRCgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlLnByb3ZpZGVySUQoKTsg
fQorICAgIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2Uu
cHJvdmlkZXIoKS0+dXJsKCk7IH0KKyAgICBpbnQgZmlyc3RMaW5lKCkgY29uc3QgeyByZXR1cm4g
bV9maXJzdExpbmU7IH0KKyAgICB2b2lkIHNldE92ZXJyaWRlTGluZU51bWJlcihpbnQgb3ZlcnJp
ZGVMaW5lTnVtYmVyKSB7IG1fb3ZlcnJpZGVMaW5lTnVtYmVyID0gb3ZlcnJpZGVMaW5lTnVtYmVy
OyB9CisgICAgYm9vbCBoYXNPdmVycmlkZUxpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX292
ZXJyaWRlTGluZU51bWJlciAhPSAtMTsgfQorICAgIGludCBvdmVycmlkZUxpbmVOdW1iZXIoKSBj
b25zdCB7IHJldHVybiBtX292ZXJyaWRlTGluZU51bWJlcjsgfQorICAgIGludCBsYXN0TGluZSgp
IGNvbnN0IHsgcmV0dXJuIG1fbGFzdExpbmU7IH0KKyAgICB1bnNpZ25lZCBzdGFydENvbHVtbigp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRDb2x1bW47IH0KKyAgICB1bnNpZ25lZCBlbmRDb2x1bW4o
KSBjb25zdCB7IHJldHVybiBtX2VuZENvbHVtbjsgfQorICAgIHVuc2lnbmVkIHR5cGVQcm9maWxp
bmdTdGFydE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
OyB9CisgICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpIGNvbnN0IHsgcmV0dXJu
IG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsgfQorCisgICAgYm9vbCB1c2VzRXZhbCgpIGNvbnN0
IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBFdmFsRmVhdHVyZTsgfQorICAgIGJvb2wgdXNlc0FyZ3Vt
ZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBBcmd1bWVudHNGZWF0dXJlOyB9Cisg
ICAgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9pc0Fycm93
RnVuY3Rpb25Db250ZXh0OyB9CisgICAgYm9vbCBpc1N0cmljdE1vZGUoKSBjb25zdCB7IHJldHVy
biBtX2ZlYXR1cmVzICYgU3RyaWN0TW9kZUZlYXR1cmU7IH0KKyAgICBEZXJpdmVkQ29udGV4dFR5
cGUgZGVyaXZlZENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZl
ZENvbnRleHRUeXBlPihtX2Rlcml2ZWRDb250ZXh0VHlwZSk7IH0KKyAgICBFdmFsQ29udGV4dFR5
cGUgZXZhbENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RXZhbENvbnRl
eHRUeXBlPihtX2V2YWxDb250ZXh0VHlwZSk7IH0KKworICAgIEVDTUFNb2RlIGVjbWFNb2RlKCkg
Y29uc3QgeyByZXR1cm4gaXNTdHJpY3RNb2RlKCkgPyBTdHJpY3RNb2RlIDogTm90U3RyaWN0TW9k
ZTsgfQorICAgICAgICAKKyAgICB2b2lkIHNldE5ldmVySW5saW5lKGJvb2wgdmFsdWUpIHsgbV9u
ZXZlcklubGluZSA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXROZXZlck9wdGltaXplKGJvb2wgdmFs
dWUpIHsgbV9uZXZlck9wdGltaXplID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldE5ldmVyRlRMT3B0
aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyRlRMT3B0aW1pemUgPSB2YWx1ZTsgfQorICAgIHZv
aWQgc2V0RGlkVHJ5VG9FbnRlckluTG9vcChib29sIHZhbHVlKSB7IG1fZGlkVHJ5VG9FbnRlcklu
TG9vcCA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXRDYW5Vc2VPU1JFeGl0RnV6emluZyhib29sIHZh
bHVlKSB7IG1fY2FuVXNlT1NSRXhpdEZ1enppbmcgPSB2YWx1ZTsgfQorICAgIGJvb2wgbmV2ZXJJ
bmxpbmUoKSBjb25zdCB7IHJldHVybiBtX25ldmVySW5saW5lOyB9CisgICAgYm9vbCBuZXZlck9w
dGltaXplKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlck9wdGltaXplOyB9CisgICAgYm9vbCBuZXZl
ckZUTE9wdGltaXplKCkgY29uc3QgeyByZXR1cm4gbV9uZXZlckZUTE9wdGltaXplOyB9CisgICAg
Ym9vbCBkaWRUcnlUb0VudGVySW5Mb29wKCkgY29uc3QgeyByZXR1cm4gbV9kaWRUcnlUb0VudGVy
SW5Mb29wOyB9CisgICAgYm9vbCBpc0lubGluaW5nQ2FuZGlkYXRlKCkgY29uc3QgeyByZXR1cm4g
IW5ldmVySW5saW5lKCk7IH0KKyAgICBib29sIGlzT2tUb09wdGltaXplKCkgY29uc3QgeyByZXR1
cm4gIW5ldmVyT3B0aW1pemUoKTsgfQorICAgIGJvb2wgY2FuVXNlT1NSRXhpdEZ1enppbmcoKSBj
b25zdCB7IHJldHVybiBtX2NhblVzZU9TUkV4aXRGdXp6aW5nOyB9CisgICAgCisgICAgYm9vbCog
YWRkcmVzc09mRGlkVHJ5VG9FbnRlckluTG9vcCgpIHsgcmV0dXJuICZtX2RpZFRyeVRvRW50ZXJJ
bkxvb3A7IH0KKworICAgIENvZGVGZWF0dXJlcyBmZWF0dXJlcygpIGNvbnN0IHsgcmV0dXJuIG1f
ZmVhdHVyZXM7IH0KKyAgICAgICAgCisgICAgREVDTEFSRV9FWFBPUlRfSU5GTzsKKworICAgIHZv
aWQgcmVjb3JkUGFyc2UoQ29kZUZlYXR1cmVzIGZlYXR1cmVzLCBib29sIGhhc0NhcHR1cmVkVmFy
aWFibGVzLCBpbnQgZmlyc3RMaW5lLCBpbnQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1u
LCB1bnNpZ25lZCBlbmRDb2x1bW4pCisgICAgeworICAgICAgICBtX2ZlYXR1cmVzID0gZmVhdHVy
ZXM7CisgICAgICAgIG1faGFzQ2FwdHVyZWRWYXJpYWJsZXMgPSBoYXNDYXB0dXJlZFZhcmlhYmxl
czsKKyAgICAgICAgbV9maXJzdExpbmUgPSBmaXJzdExpbmU7CisgICAgICAgIG1fbGFzdExpbmUg
PSBsYXN0TGluZTsKKyAgICAgICAgQVNTRVJUKHN0YXJ0Q29sdW1uICE9IFVJTlRfTUFYKTsKKyAg
ICAgICAgbV9zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOworICAgICAgICBBU1NFUlQoZW5kQ29s
dW1uICE9IFVJTlRfTUFYKTsKKyAgICAgICAgbV9lbmRDb2x1bW4gPSBlbmRDb2x1bW47CisgICAg
fQorCisgICAgdm9pZCBpbnN0YWxsQ29kZShDb2RlQmxvY2sqKTsKKyAgICB2b2lkIGluc3RhbGxD
b2RlKFZNJiwgQ29kZUJsb2NrKiwgQ29kZVR5cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwor
ICAgIENvZGVCbG9jayogbmV3Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQsIEpT
RnVuY3Rpb24qLCBKU1Njb3BlKiwgSlNPYmplY3QqJiBleGNlcHRpb24pOworICAgIENvZGVCbG9j
ayogbmV3UmVwbGFjZW1lbnRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7CisK
KyAgICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyBhbiBpbnRlcmVzdGluZyBHQyBzdG9yeS4gQ2FsbGVy
cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBhc2tpbmcgdXMgdG8gY3JlYXRlIGEgQ29kZUJsb2NrCisg
ICAgLy8gdGhhdCBpcyBub3QgamV0dGlzb25lZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5z
LiBDYWxsZXJzIGFyZSBlc3NlbnRpYWxseSBhc2tpbmcgZm9yIGEgc3Ryb25nIHJlZmVyZW5jZQor
ICAgIC8vIHRvIHRoZSBDb2RlQmxvY2suIEJlY2F1c2UgdGhlIEV4ZWN1dGFibGUgbWF5IGJlIGFs
bG9jYXRpbmcgdGhlIENvZGVCbG9jaywgd2UgcmVxdWlyZSBjYWxsZXJzIHRvIHBhc3MgaW4KKyAg
ICAvLyB0aGVpciBDb2RlQmxvY2sqJiByZWZlcmVuY2UgYmVjYXVzZSBpdCdzIHNhZmUgZm9yIENv
ZGVCbG9jayB0byBiZSBqZXR0aXNvbmVkIGlmIEV4ZWN1dGFibGUgaXMgdGhlIG9ubHkgdGhpbmcK
KyAgICAvLyB0byBwb2ludCB0byBpdC4gVGhpcyBmb3JjZXMgY2FsbGVycyB0byBoYXZlIGEgQ29k
ZUJsb2NrKiBpbiBhIHJlZ2lzdGVyIG9yIG9uIHRoZSBzdGFjayB0aGF0IHdpbGwgYmUgbWFya2Vk
CisgICAgLy8gYnkgY29uc2VydmF0aXZlIEdDIGlmIGEgR0MgaGFwcGVucyBhZnRlciB3ZSBjcmVh
dGUgdGhlIENvZGVCbG9jay4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhlY3V0YWJsZVR5cGU+
CisgICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb24oVk0mLCBKU0Z1bmN0aW9uKiwgSlNT
Y29wZSosIENvZGVTcGVjaWFsaXphdGlvbktpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9j
ayk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rvcj4gdm9pZCBmb3JFYWNoQ29kZUJs
b2NrKEZ1bmN0b3ImJik7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVC
YXNlOworICAgIEpTT2JqZWN0KiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbChWTSYsIEpTRnVuY3Rp
b24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2NrKiYpOworCitw
cm90ZWN0ZWQ6CisgICAgU2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqLCBWTSYsIGNvbnN0IFNv
dXJjZUNvZGUmLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUsIGJv
b2wgaXNJbkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIEludHJpbnNpYyk7
CisKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKKyAgICB7CisgICAgICAgIEJhc2U6
OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICAgICAgdm0uaGVhcC5hZGRFeGVjdXRhYmxlKHRoaXMp
OyAvLyBCYWxhbmNlZCBieSBIZWFwOjpkZWxldGVVbm1hcmtlZENvbXBpbGVkQ29kZSgpLgorCisj
aWYgRU5BQkxFKENPREVCTE9DS19TQU1QTElORykKKyAgICAgICAgaWYgKFNhbXBsaW5nVG9vbCog
c2FtcGxlciA9IHZtLmludGVycHJldGVyLT5zYW1wbGVyKCkpCisgICAgICAgICAgICBzYW1wbGVy
LT5ub3RpZnlPZlNjb3BlKHZtLCB0aGlzKTsKKyNlbmRpZgorICAgIH0KKworICAgIENvZGVGZWF0
dXJlcyBtX2ZlYXR1cmVzOworICAgIGJvb2wgbV9kaWRUcnlUb0VudGVySW5Mb29wOworICAgIGJv
b2wgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA6IDE7CisgICAgYm9vbCBtX25ldmVySW5saW5lIDog
MTsKKyAgICBib29sIG1fbmV2ZXJPcHRpbWl6ZSA6IDE7CisgICAgYm9vbCBtX25ldmVyRlRMT3B0
aW1pemUgOiAxOworICAgIGJvb2wgbV9pc0Fycm93RnVuY3Rpb25Db250ZXh0IDogMTsKKyAgICBi
b29sIG1fY2FuVXNlT1NSRXhpdEZ1enppbmcgOiAxOworICAgIHVuc2lnbmVkIG1fZGVyaXZlZENv
bnRleHRUeXBlIDogMjsgLy8gRGVyaXZlZENvbnRleHRUeXBlCisgICAgdW5zaWduZWQgbV9ldmFs
Q29udGV4dFR5cGUgOiAyOyAvLyBFdmFsQ29udGV4dFR5cGUKKworICAgIGludCBtX292ZXJyaWRl
TGluZU51bWJlcjsKKyAgICBpbnQgbV9maXJzdExpbmU7CisgICAgaW50IG1fbGFzdExpbmU7Cisg
ICAgdW5zaWduZWQgbV9zdGFydENvbHVtbjsKKyAgICB1bnNpZ25lZCBtX2VuZENvbHVtbjsKKyAg
ICB1bnNpZ25lZCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldDsKKyAgICB1bnNpZ25lZCBtX3R5
cGVQcm9maWxpbmdFbmRPZmZzZXQ7CisgICAgU291cmNlQ29kZSBtX3NvdXJjZTsKK307CisKK2Ns
YXNzIEV2YWxFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAg
IGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRl
ZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVj
dHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwor
CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIEV2YWxDb2RlQmxvY2sq
IGNvZGVCbG9jaygpCisgICAgeworICAgICAgICByZXR1cm4gbV9ldmFsQ29kZUJsb2NrLmdldCgp
OworICAgIH0KKworICAgIHN0YXRpYyBFdmFsRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNTdGF0ZSos
IGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4
dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlLCBjb25z
dCBWYXJpYWJsZUVudmlyb25tZW50Kik7CisKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVy
YXRlZEpJVENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JD
YWxsKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZN
JiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7
CisgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90
bywgVHlwZUluZm8oRXZhbEV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7
CisgICAgfQorICAgICAgICAKKyAgICBERUNMQVJFX0lORk87CisKKyAgICBFeGVjdXRhYmxlSW5m
byBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFs
KCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwg
SlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291
cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dG
dW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIGV2YWxDb250ZXh0VHlwZSgpKTsgfQorCisgICAgdW5z
aWduZWQgbnVtVmFyaWFibGVzKCkgeyByZXR1cm4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2stPm51
bVZhcmlhYmxlcygpOyB9CisgICAgdW5zaWduZWQgbnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCkgeyBy
ZXR1cm4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpOyB9
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZyaWVu
ZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgRXZhbEV4ZWN1dGFibGUoRXhlY1N0YXRl
KiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4
dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlKTsKKwor
ICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKwor
ICAgIFdyaXRlQmFycmllcjxFdmFsQ29kZUJsb2NrPiBtX2V2YWxDb2RlQmxvY2s7CisgICAgV3Jp
dGVCYXJyaWVyPFVubGlua2VkRXZhbENvZGVCbG9jaz4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2s7
Cit9OworCitjbGFzcyBQcm9ncmFtRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVj
dXRhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGlj
OgorICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJl
SXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBQcm9ncmFtRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNT
dGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAgIHsKKyAgICAgICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxQ
cm9ncmFtRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIFByb2dyYW1FeGVjdXRhYmxlKGV4ZWMs
IHNvdXJjZSk7CisgICAgICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKGV4ZWMtPnZtKCkp
OworICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKKyAgICB9CisKKworICAgIEpTT2JqZWN0KiBp
bml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYsIENhbGxGcmFtZSosIEpTU2NvcGUqKTsKKwor
ICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBQcm9ncmFtQ29kZUJsb2Nr
KiBjb2RlQmxvY2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcHJvZ3JhbUNvZGVCbG9jay5n
ZXQoKTsKKyAgICB9CisKKyAgICBKU09iamVjdCogY2hlY2tTeW50YXgoRXhlY1N0YXRlKik7CisK
KyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7CisgICAgfQorICAgICAgICAKKyAg
ICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVj
dCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0
cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhQcm9ncmFt
RXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisgICAgICAg
IAorICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZv
KCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2Rl
KCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1v
ZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlBy
b2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgp
LCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lKTsgfQorCitwcml2YXRlOgorICAgIGZyaWVu
ZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJs
ZTsKKworICAgIFByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUm
KTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3Im
KTsKKworICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2s+IG1fdW5saW5r
ZWRQcm9ncmFtQ29kZUJsb2NrOworICAgIFdyaXRlQmFycmllcjxQcm9ncmFtQ29kZUJsb2NrPiBt
X3Byb2dyYW1Db2RlQmxvY2s7Cit9OworCitjbGFzcyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSBm
aW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRP
ZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBC
YXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0
cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmKTsK
KworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBNb2R1bGVQcm9ncmFt
Q29kZUJsb2NrKiBjb2RlQmxvY2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbW9kdWxlUHJv
Z3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdl
bmVyYXRlZEpJVENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVG
b3JDYWxsKCk7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJl
KFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAg
ICB7CisgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBw
cm90bywgVHlwZUluZm8oTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFn
cyksIGluZm8oKSk7CisgICAgfQorCisgICAgREVDTEFSRV9JTkZPOworCisgICAgRXhlY3V0YWJs
ZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2Vz
RXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5v
bmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6TW9kdWxlLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwg
U291cmNlUGFyc2VNb2RlOjpNb2R1bGVFdmFsdWF0ZU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgp
LCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUp
OyB9CisKKyAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkTW9kdWxl
UHJvZ3JhbUNvZGVCbG9jaygpIHsgcmV0dXJuIG1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJs
b2NrLmdldCgpOyB9CisKKyAgICBTeW1ib2xUYWJsZSogbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xU
YWJsZSgpIHsgcmV0dXJuIG1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5nZXQoKTsgfQor
Citwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBmcmllbmQg
Y2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKKworICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKEV4
ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmKTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hp
bGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKworICAgIFdyaXRlQmFycmllcjxVbmxpbmtl
ZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
OworICAgIFdyaXRlQmFycmllcjxTeW1ib2xUYWJsZT4gbV9tb2R1bGVFbnZpcm9ubWVudFN5bWJv
bFRhYmxlOworICAgIFdyaXRlQmFycmllcjxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrPiBtX21vZHVs
ZVByb2dyYW1Db2RlQmxvY2s7Cit9OworCitjbGFzcyBGdW5jdGlvbkV4ZWN1dGFibGUgZmluYWwg
OiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNzIEpJVDsKKyAgICBm
cmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYg
U2NyaXB0RXhlY3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1
cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKwor
ICAgIHN0YXRpYyBGdW5jdGlvbkV4ZWN1dGFibGUqIGNyZWF0ZSgKKyAgICAgICAgVk0mIHZtLCBj
b25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxp
bmtlZEV4ZWN1dGFibGUsIAorICAgICAgICB1bnNpZ25lZCBmaXJzdExpbmUsIHVuc2lnbmVkIGxh
c3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5z
aWMgaW50cmluc2ljKQorICAgIHsKKyAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8RnVuY3Rpb25FeGVjdXRhYmxlPih2bS5o
ZWFwKSkgRnVuY3Rpb25FeGVjdXRhYmxlKHZtLCBzb3VyY2UsIHVubGlua2VkRXhlY3V0YWJsZSwg
Zmlyc3RMaW5lLCBsYXN0TGluZSwgc3RhcnRDb2x1bW4sIGVuZENvbHVtbiwgaW50cmluc2ljKTsK
KyAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICByZXR1cm4g
ZXhlY3V0YWJsZTsKKyAgICB9CisgICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogZnJvbUds
b2JhbENvZGUoCisgICAgICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUsIEV4ZWNTdGF0ZSYsIGNv
bnN0IFNvdXJjZUNvZGUmLCAKKyAgICAgICAgSlNPYmplY3QqJiBleGNlcHRpb24sIGludCBvdmVy
cmlkZUxpbmVOdW1iZXIpOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKyAg
ICAgICAgCisgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJs
ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUuZ2V0
KCk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyBlaXRoZXIgY2FsbCBvciBjb25zdHJ1Y3QgYnl0
ZWNvZGUuIFRoaXMgY2FuIGJlIGFwcHJvcHJpYXRlCisgICAgLy8gZm9yIGFuc3dlcmluZyBxdWVz
dGlvbnMgdGhhdCB0aGF0IGRvbid0IHZhcnkgYmV0d2VlbiBjYWxsIGFuZCBjb25zdHJ1Y3QgLS0K
KyAgICAvLyBmb3IgZXhhbXBsZSwgYXJndW1lbnRzUmVnaXN0ZXIoKS4KKyAgICBGdW5jdGlvbkNv
ZGVCbG9jayogZWl0aGVyQ29kZUJsb2NrKCkKKyAgICB7CisgICAgICAgIGlmIChtX2NvZGVCbG9j
a0ZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwor
ICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAgfQorICAg
ICAgICAKKyAgICBib29sIGlzR2VuZXJhdGVkRm9yQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAg
ICByZXR1cm4gISFtX2NvZGVCbG9ja0ZvckNhbGw7CisgICAgfQorCisgICAgRnVuY3Rpb25Db2Rl
QmxvY2sqIGNvZGVCbG9ja0ZvckNhbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJs
b2NrRm9yQ2FsbC5nZXQoKTsKKyAgICB9CisKKyAgICBib29sIGlzR2VuZXJhdGVkRm9yQ29uc3Ry
dWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVj
dC5nZXQoKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ29u
c3RydWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5n
ZXQoKTsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3IoQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNh
bGwpCisgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZWRGb3JDYWxsKCk7CisgICAgICAgIEFT
U0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gaXNHZW5lcmF0
ZWRGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisgICAgICAgIAorICAgIEZ1bmN0aW9uQ29kZUJsb2Nr
KiBjb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAg
ICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gY29kZUJsb2Nr
Rm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAg
ICAgICAgcmV0dXJuIGNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpOworICAgIH0KKworICAgIEZ1bmN0
aW9uQ29kZUJsb2NrKiBiYXNlbGluZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
KTsKKyAgICAgICAgCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIHByb2ZpbGVkQ29kZUJsb2NrRm9y
KENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNl
bGluZUNvZGVCbG9ja0ZvcihraW5kKTsKKyAgICB9CisKKyAgICBSZWZQdHI8VHlwZVNldD4gcmV0
dXJuU3RhdGVtZW50VHlwZVNldCgpIAorICAgIHsKKyAgICAgICAgaWYgKCFtX3JldHVyblN0YXRl
bWVudFR5cGVTZXQpCisgICAgICAgICAgICBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQgPSBUeXBl
U2V0OjpjcmVhdGUoKTsKKworICAgICAgICByZXR1cm4gbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0
OworICAgIH0KKyAgICAgICAgCisgICAgRnVuY3Rpb25Nb2RlIGZ1bmN0aW9uTW9kZSgpIHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbk1vZGUoKTsgfQorICAgIGJvb2wgaXNC
dWlsdGluRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNC
dWlsdGluRnVuY3Rpb24oKTsgfQorICAgIENvbnN0cnVjdEFiaWxpdHkgY29uc3RydWN0QWJpbGl0
eSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5jb25zdHJ1Y3RBYmlsaXR5
KCk7IH0KKyAgICBib29sIGlzQ2xhc3MoKSBjb25zdCB7IHJldHVybiAhY2xhc3NTb3VyY2UoKS5p
c051bGwoKTsgfQorICAgIGJvb2wgaXNBcnJvd0Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gcGFy
c2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpBcnJvd0Z1bmN0aW9uTW9kZTsgfQorICAgIGJv
b2wgaXNHZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1v
ZGU6OkdldHRlck1vZGU7IH0KKyAgICBib29sIGlzU2V0dGVyKCkgY29uc3QgeyByZXR1cm4gcGFy
c2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpTZXR0ZXJNb2RlOyB9CisgICAgYm9vbCBpc0dl
bmVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNldChTb3VyY2VQYXJzZU1v
ZGU6OkdlbmVyYXRvckJvZHlNb2RlLCBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvcldyYXBwZXJG
dW5jdGlvbk1vZGUpLmNvbnRhaW5zKHBhcnNlTW9kZSgpKTsgfQorICAgIGJvb2wgaXNNZXRob2Qo
KSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok1ldGhvZE1v
ZGU7IH0KKyAgICBib29sIGhhc0NhbGxlckFuZEFyZ3VtZW50c1Byb3BlcnRpZXMoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgLy8gUGVyIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2Vj
LWZvcmJpZGRlbi1leHRlbnNpb25zLCBvbmx5IHNsb3BweS1tb2RlIG5vbi1idWlsdGluIGZ1bmN0
aW9ucyBpbiBvbGQtc3R5bGUgKHByZS1FUzYpIHN5bnRhY3RpYyBmb3JtcyBjYW4gY29udGFpbgor
ICAgICAgICAvLyAiY2FsbGVyIiBhbmQgImFyZ3VtZW50cyIuCisgICAgICAgIHJldHVybiAhaXNT
dHJpY3RNb2RlKCkgJiYgcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5j
dGlvbk1vZGUgJiYgIWlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7CisgICAgfQorICAgIGJv
b2wgaGFzUHJvdG90eXBlUHJvcGVydHkoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFNv
dXJjZVBhcnNlTW9kZVNldCgKKyAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6Tm9ybWFsRnVu
Y3Rpb25Nb2RlLAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JCb2R5TW9k
ZSwKKyAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9u
TW9kZQorICAgICAgICApLmNvbnRhaW5zKHBhcnNlTW9kZSgpKSB8fCBpc0NsYXNzKCk7CisgICAg
fQorICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJl
dHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCk7IH0KKyAgICBi
b29sIGlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtl
ZEV4ZWN1dGFibGUtPmlzQ2xhc3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7IH0KKyAgICBjb25zdCBJ
ZGVudGlmaWVyJiBuYW1lKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPm5hbWUoKTsg
fQorICAgIGNvbnN0IElkZW50aWZpZXImIGVjbWFOYW1lKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4
ZWN1dGFibGUtPmVjbWFOYW1lKCk7IH0KKyAgICBjb25zdCBJZGVudGlmaWVyJiBpbmZlcnJlZE5h
bWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aW5mZXJyZWROYW1lKCk7IH0KKyAg
ICB1bnNpZ25lZCBwYXJhbWV0ZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVj
dXRhYmxlLT5wYXJhbWV0ZXJDb3VudCgpOyB9IC8vIEV4Y2x1ZGluZyAndGhpcychCisgICAgdW5z
aWduZWQgZnVuY3Rpb25MZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJs
ZS0+ZnVuY3Rpb25MZW5ndGgoKTsgfQorICAgIFNvdXJjZVBhcnNlTW9kZSBwYXJzZU1vZGUoKSBj
b25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+cGFyc2VNb2RlKCk7IH0KKyAgICBK
U1BhcnNlclNjcmlwdE1vZGUgc2NyaXB0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRF
eGVjdXRhYmxlLT5zY3JpcHRNb2RlKCk7IH0KKyAgICBjb25zdCBTb3VyY2VDb2RlJiBjbGFzc1Nv
dXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5jbGFzc1NvdXJjZSgp
OyB9CisKKyAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9y
Jik7CisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7CisgICAgICAgIHJl
dHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8o
RnVuY3Rpb25FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOworICAgIH0K
KworICAgIHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1f
cGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OyB9CisKKyAgICB2b2lkIG92ZXJyaWRlUGFyYW1ldGVyQW5k
VHlwZVByb2ZpbGluZ1N0YXJ0RW5kT2Zmc2V0cyh1bnNpZ25lZCBwYXJhbWV0ZXJzU3RhcnRPZmZz
ZXQsIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2Zp
bGluZ0VuZE9mZnNldCkKKyAgICB7CisgICAgICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0g
cGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OworICAgICAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNl
dCA9IHR5cGVQcm9maWxpbmdTdGFydE9mZnNldDsKKyAgICAgICAgbV90eXBlUHJvZmlsaW5nRW5k
T2Zmc2V0ID0gdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKKyAgICB9CisKKyAgICBERUNMQVJFX0lO
Rk87CisKKyAgICBJbmZlcnJlZFZhbHVlKiBzaW5nbGV0b25GdW5jdGlvbigpIHsgcmV0dXJuIG1f
c2luZ2xldG9uRnVuY3Rpb24uZ2V0KCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mg
RXhlY3V0YWJsZUJhc2U7CisgICAgRnVuY3Rpb25FeGVjdXRhYmxlKAorICAgICAgICBWTSYsIGNv
bnN0IFNvdXJjZUNvZGUmLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSosIHVuc2lnbmVkIGZp
cnN0TGluZSwgCisgICAgICAgIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVt
biwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMpOworICAgIAorICAgIHZvaWQgZmluaXNo
Q3JlYXRpb24oVk0mKTsKKworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworICAg
IAorICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OworICAgIFdyaXRlQmFycmll
cjxVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZT4gbV91bmxpbmtlZEV4ZWN1dGFibGU7CisgICAg
V3JpdGVCYXJyaWVyPEZ1bmN0aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNhbGw7CisgICAg
V3JpdGVCYXJyaWVyPEZ1bmN0aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdDsK
KyAgICBSZWZQdHI8VHlwZVNldD4gbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0OworICAgIFdyaXRl
QmFycmllcjxJbmZlcnJlZFZhbHVlPiBtX3NpbmdsZXRvbkZ1bmN0aW9uOworfTsKKworI2lmIEVO
QUJMRShXRUJBU1NFTUJMWSkKK2NsYXNzIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSBmaW5hbCA6IHB1
YmxpYyBFeGVjdXRhYmxlQmFzZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFz
ZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6
OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBXZWJB
c3NlbWJseUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJj
ZSwgSlNXYXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpCisgICAgewor
ICAgICAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGws
IGFsbG9jYXRlQ2VsbDxXZWJBc3NlbWJseUV4ZWN1dGFibGU+KHZtLmhlYXApKSBXZWJBc3NlbWJs
eUV4ZWN1dGFibGUodm0sIHNvdXJjZSwgbW9kdWxlLCBmdW5jdGlvbkluZGV4KTsKKyAgICAgICAg
ZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICByZXR1cm4gZXhlY3V0YWJs
ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZt
LCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBU
eXBlSW5mbyhXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8o
KSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIERF
Q0xBUkVfSU5GTzsKKworICAgIHZvaWQgcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYpOworCisgICAg
V2ViQXNzZW1ibHlDb2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNhbGwoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZShW
TSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBKU1dhc21Nb2R1bGUqLCB1bnNpZ25lZCBmdW5jdGlvbklu
ZGV4KTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0
b3ImKTsKKworICAgIFNvdXJjZUNvZGUgbV9zb3VyY2U7CisgICAgV3JpdGVCYXJyaWVyPEpTV2Fz
bU1vZHVsZT4gbV9tb2R1bGU7CisgICAgdW5zaWduZWQgbV9mdW5jdGlvbkluZGV4OworCisgICAg
V3JpdGVCYXJyaWVyPFdlYkFzc2VtYmx5Q29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNhbGw7Cit9
OworI2VuZGlmCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4KK0pTT2JqZWN0
KiBTY3JpcHRFeGVjdXRhYmxlOjpwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJiB2bSwgSlNGdW5jdGlv
biogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQs
IENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jaykKK3sKKyAgICBpZiAoaGFzSklUQ29kZUZvcihr
aW5kKSkgeworICAgICAgICBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBFdmFsRXhl
Y3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENv
ZGVCbG9jayo+KGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7Cisg
ICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgUHJvZ3JhbUV4ZWN1
dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2Rl
QmxvY2sqPihqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwor
ICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nh
c3Q8Q29kZUJsb2NrKj4oanNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyktPmNv
ZGVCbG9jaygpKTsKKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBl
LCBGdW5jdGlvbkV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9j
ayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcykt
PmNvZGVCbG9ja0ZvcihraW5kKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFJFTEVBU0Vf
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAg
ICByZXR1cm4gcHJlcGFyZUZvckV4ZWN1dGlvbkltcGwodm0sIGZ1bmN0aW9uLCBzY29wZSwga2lu
ZCwgcmVzdWx0Q29kZUJsb2NrKTsKK30KKworfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01vZHVsZVByb2dyYW1FeGVj
dXRhYmxlLmgJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL01vZHVsZVByb2dyYW1FeGVjdXRhYmxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI1LDQ5MCAr
MjUsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJBcml0eUNoZWNrTW9kZS5oIgot
I2luY2x1ZGUgIkNhbGxEYXRhLmgiCi0jaW5jbHVkZSAiQ29kZUJsb2NrSGFzaC5oIgotI2luY2x1
ZGUgIkNvZGVTcGVjaWFsaXphdGlvbktpbmQuaCIKLSNpbmNsdWRlICJDb21waWxhdGlvblJlc3Vs
dC5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGVJbmZvLmgiCi0jaW5jbHVkZSAiSGFuZGxlckluZm8u
aCIKLSNpbmNsdWRlICJJbmZlcnJlZFZhbHVlLmgiCi0jaW5jbHVkZSAiSklUQ29kZS5oIgotI2lu
Y2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCi0jaW5jbHVkZSAiU291cmNlQ29kZS5oIgotI2luY2x1
ZGUgIlR5cGVTZXQuaCIKLSNpbmNsdWRlICJVbmxpbmtlZENvZGVCbG9jay5oIgotI2luY2x1ZGUg
IlVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLmgiCisjaW5jbHVkZSAiU2NyaXB0RXhlY3V0YWJs
ZS5oIgogCiBuYW1lc3BhY2UgSlNDIHsKIAotY2xhc3MgQ29kZUJsb2NrOwotY2xhc3MgRXZhbENv
ZGVCbG9jazsKLWNsYXNzIEZ1bmN0aW9uQ29kZUJsb2NrOwotY2xhc3MgSlNTY29wZTsKLWNsYXNz
IEpTV2FzbU1vZHVsZTsKLWNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLWNsYXNzIE1vZHVs
ZVByb2dyYW1Db2RlQmxvY2s7Ci1jbGFzcyBQcm9ncmFtQ29kZUJsb2NrOwotY2xhc3MgV2ViQXNz
ZW1ibHlDb2RlQmxvY2s7Ci0KLWVudW0gQ29tcGlsYXRpb25LaW5kIHsgRmlyc3RDb21waWxhdGlv
biwgT3B0aW1pemluZ0NvbXBpbGF0aW9uIH07Ci0KLWlubGluZSBib29sIGlzQ2FsbChDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3Qp
OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotY2xhc3MgRXhlY3V0YWJsZUJhc2UgOiBwdWJsaWMg
SlNDZWxsIHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGlj
IGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19JU19IT1NUID0gMDsKLSAgICBzdGF0aWMgY29uc3Qg
aW50IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCA9IC0xOwotCi0gICAgRXhlY3V0YWJsZUJh
c2UoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50IG51bVBhcmFtZXRlcnMsIEludHJp
bnNpYyBpbnRyaW5zaWMpCi0gICAgICAgIDogSlNDZWxsKHZtLCBzdHJ1Y3R1cmUpCi0gICAgICAg
ICwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0ZXJzKQotICAgICAgICAsIG1fbnVt
UGFyYW1ldGVyc0ZvckNvbnN0cnVjdChudW1QYXJhbWV0ZXJzKQotICAgICAgICAsIG1faW50cmlu
c2ljKGludHJpbnNpYykKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihW
TSYgdm0pCi0gICAgewotICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgfQot
Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKLQotICAgIHN0YXRp
YyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVlOwotICAgIHN0YXRpYyB2b2lkIGRl
c3Ryb3koSlNDZWxsKik7Ci0gICAgICAgIAotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIGJvb2wgaXNFdmFsRXhlY3V0YWJsZSgp
IGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09IEV2YWxFeGVjdXRhYmxlVHlw
ZTsKLSAgICB9Ci0gICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewot
ICAgICAgICByZXR1cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhlY3V0YWJsZVR5cGU7Ci0gICAgfQot
ICAgIGJvb2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1
cm4gdHlwZSgpID09IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0gICAgYm9vbCBpc01v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0g
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwotICAgIH0KLQotCi0gICAgYm9vbCBpc0hvc3RG
dW5jdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQoKG1fbnVtUGFyYW1ldGVyc0Zv
ckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0gKG1fbnVtUGFyYW1ldGVyc0ZvckNv
bnN0cnVjdCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSk7Ci0gICAgICAgIHJldHVybiBtX251
bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Q7Ci0gICAgfQotCi0j
aWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotICAgIGJvb2wgaXNXZWJBc3NlbWJseUV4ZWN1dGFibGUo
KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBXZWJBc3NlbWJseUV4ZWN1
dGFibGVUeXBlOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRl
U3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBw
cm90bykgeyByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8s
IFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7IH0KLSAgICAgICAg
Ci0gICAgdm9pZCBjbGVhckNvZGUoKTsKLQotICAgIERFQ0xBUkVfRVhQT1JUX0lORk87Ci0KLXBy
b3RlY3RlZDoKLSAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbDsKLSAgICBpbnQgbV9udW1Q
YXJhbWV0ZXJzRm9yQ29uc3RydWN0OwotCi1wdWJsaWM6Ci0gICAgUGFzc1JlZlB0cjxKSVRDb2Rl
PiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCi0gICAgewotICAgICAgICBBU1NFUlQobV9qaXRD
b2RlRm9yQ2FsbCk7Ci0gICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDYWxsOwotICAgIH0KLQot
ICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgpCi0g
ICAgewotICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0
dXJuIG1faml0Q29kZUZvckNvbnN0cnVjdDsKLSAgICB9Ci0gICAgICAgIAotICAgIFBhc3NSZWZQ
dHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAg
IHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9
PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JD
b25zdHJ1Y3QoKTsKLSAgICB9Ci0gICAgCi0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIGVudHJ5
cG9pbnRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBBcml0eUNoZWNrTW9kZSBhcml0
eSkKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0LiBX
ZSBvbmx5IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1c2Ugd2UgdXNlIHRoZQotICAgICAg
ICAvLyBuby1hcml0eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0dWFsIGNhbGxzLCB3aGljaCB3aWxs
ICJjYWNoZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBpbgotICAgICAgICAvLyBtYWNoaW5lIGNvZGUu
Ci0gICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAgICAgICAgc3dp
dGNoIChraW5kKSB7Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAg
ICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ2FsbFdp
dGhBcml0eUNoZWNrKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAg
ICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2Rl
Rm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBy
ZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9Ci0gICAgICAgICAgICBnZW5l
cmF0ZWRKSVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2FsbChhcml0eSk7Ci0gICAgICAgIGlm
IChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJl
c3VsdDsgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQncyB2aXJ0dWFsIGNhbGwgb3B0aW1p
emF0aW9ucy4KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBD
b2RlRm9yQ2FsbDoKLSAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hl
Y2sgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENv
ZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0
aEFyaXR5Q2hlY2sgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0
aWMgcHRyZGlmZl90IG9mZnNldE9mSklUQ29kZVdpdGhBcml0eUNoZWNrRm9yKAotICAgICAgICBD
b2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGtpbmQp
IHsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgIHJldHVybiBPQkpFQ1Rf
T0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayk7
Ci0gICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgIHJldHVybiBPQkpF
Q1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0
eUNoZWNrKTsKLSAgICAgICAgfQotICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB0cmRpZmZfdCBv
ZmZzZXRPZk51bVBhcmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAg
IHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4g
T0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKTsK
LSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVy
biBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0
cnVjdCk7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ2FsbCgpIGNvbnN0Ci0gICAg
ewotICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA+PSAwOwotICAgIH0KLSAg
ICAgICAgCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ29uc3RydWN0KCkgY29uc3QKLSAgICB7Ci0g
ICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPj0gMDsKLSAgICB9Ci0g
ICAgICAgIAotICAgIGJvb2wgaGFzSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAg
ICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9
PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDb25zdHJ1
Y3QoKTsKLSAgICB9Ci0KLSAgICAvLyBJbnRyaW5zaWNzIGFyZSBvbmx5IGZvciBjYWxscywgY3Vy
cmVudGx5LgotICAgIEludHJpbnNpYyBpbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBtX2ludHJp
bnNpYzsgfQotICAgICAgICAKLSAgICBJbnRyaW5zaWMgaW50cmluc2ljRm9yKENvZGVTcGVjaWFs
aXphdGlvbktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhbGwoa2luZCkp
Ci0gICAgICAgICAgICByZXR1cm4gaW50cmluc2ljKCk7Ci0gICAgICAgIHJldHVybiBOb0ludHJp
bnNpYzsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7Ci0g
ICAgICAgIAotcHJvdGVjdGVkOgotICAgIEludHJpbnNpYyBtX2ludHJpbnNpYzsKLSAgICBSZWZQ
dHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsKLSAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRD
b2RlRm9yQ29uc3RydWN0OwotICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVGb3JD
YWxsV2l0aEFyaXR5Q2hlY2s7Ci0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1faml0Q29kZUZv
ckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrOwotfTsKLQotY2xhc3MgTmF0aXZlRXhlY3V0YWJsZSBm
aW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7Ci0gICAgZnJpZW5kIGNsYXNzIEpJVDsKLSAg
ICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwotcHVibGljOgotICAgIHR5cGVk
ZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0
dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0K
LSAgICBzdGF0aWMgTmF0aXZlRXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxK
SVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJ
VENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmlu
c2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKTsKLQotICAgIHN0YXRpYyB2b2lkIGRl
c3Ryb3koSlNDZWxsKik7Ci0KLSAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxp
emF0aW9uS2luZCkgY29uc3Q7Ci0KLSAgICBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbigpIHsgcmV0
dXJuIG1fZnVuY3Rpb247IH0KLSAgICBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvcigpIHsgcmV0
dXJuIG1fY29uc3RydWN0b3I7IH0KLSAgICAgICAgCi0gICAgTmF0aXZlRnVuY3Rpb24gbmF0aXZl
RnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAg
aWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsK
LSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVy
biBjb25zdHJ1Y3RvcigpOwotICAgIH0KLSAgICAgICAgCi0gICAgc3RhdGljIHB0cmRpZmZfdCBv
ZmZzZXRPZk5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAg
ICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJu
IE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2Z1bmN0aW9uKTsKLSAgICAgICAg
QVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBPQkpFQ1Rf
T0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9jb25zdHJ1Y3Rvcik7Ci0gICAgfQotCi0gICAg
c3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiwgSlNHbG9iYWxPYmplY3QqLCBK
U1ZhbHVlIHByb3RvKTsKLSAgICAgICAgCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgY29uc3Qg
U3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9Ci0KLXByb3RlY3RlZDoKLSAg
ICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmss
IFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0cmluZyYgbmFtZSk7
Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotCi0gICAgTmF0
aXZlRXhlY3V0YWJsZShWTSYsIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5jdGlv
biBjb25zdHJ1Y3RvciwgSW50cmluc2ljKTsKLQotICAgIE5hdGl2ZUZ1bmN0aW9uIG1fZnVuY3Rp
b247Ci0gICAgTmF0aXZlRnVuY3Rpb24gbV9jb25zdHJ1Y3RvcjsKLQotICAgIFN0cmluZyBtX25h
bWU7Ci19OwotCi1jbGFzcyBTY3JpcHRFeGVjdXRhYmxlIDogcHVibGljIEV4ZWN1dGFibGVCYXNl
IHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0gICAgc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7Ci0K
LSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAgICBDb2RlQmxv
Y2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7Ci0KLSAgICBjb25z
dCBTb3VyY2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZTsgfQotICAgIGlu
dHB0cl90IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2UucHJvdmlkZXJJRCgpOyB9
Ci0gICAgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5w
cm92aWRlcigpLT51cmwoKTsgfQotICAgIGludCBmaXJzdExpbmUoKSBjb25zdCB7IHJldHVybiBt
X2ZpcnN0TGluZTsgfQotICAgIHZvaWQgc2V0T3ZlcnJpZGVMaW5lTnVtYmVyKGludCBvdmVycmlk
ZUxpbmVOdW1iZXIpIHsgbV9vdmVycmlkZUxpbmVOdW1iZXIgPSBvdmVycmlkZUxpbmVOdW1iZXI7
IH0KLSAgICBib29sIGhhc092ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3Zl
cnJpZGVMaW5lTnVtYmVyICE9IC0xOyB9Ci0gICAgaW50IG92ZXJyaWRlTGluZU51bWJlcigpIGNv
bnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyOyB9Ci0gICAgaW50IGxhc3RMaW5lKCkg
Y29uc3QgeyByZXR1cm4gbV9sYXN0TGluZTsgfQotICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uKCkg
Y29uc3QgeyByZXR1cm4gbV9zdGFydENvbHVtbjsgfQotICAgIHVuc2lnbmVkIGVuZENvbHVtbigp
IGNvbnN0IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9Ci0gICAgdW5zaWduZWQgdHlwZVByb2ZpbGlu
Z1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7
IH0KLSAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4g
bV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OyB9Ci0KLSAgICBib29sIHVzZXNFdmFsKCkgY29uc3Qg
eyByZXR1cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0dXJlOyB9Ci0gICAgYm9vbCB1c2VzQXJndW1l
bnRzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEFyZ3VtZW50c0ZlYXR1cmU7IH0KLSAg
ICBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lzQXJyb3dG
dW5jdGlvbkNvbnRleHQ7IH0KLSAgICBib29sIGlzU3RyaWN0TW9kZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZmVhdHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVyZTsgfQotICAgIERlcml2ZWRDb250ZXh0VHlw
ZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVk
Q29udGV4dFR5cGU+KG1fZGVyaXZlZENvbnRleHRUeXBlKTsgfQotICAgIEV2YWxDb250ZXh0VHlw
ZSBldmFsQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFdmFsQ29udGV4
dFR5cGU+KG1fZXZhbENvbnRleHRUeXBlKTsgfQotCi0gICAgRUNNQU1vZGUgZWNtYU1vZGUoKSBj
b25zdCB7IHJldHVybiBpc1N0cmljdE1vZGUoKSA/IFN0cmljdE1vZGUgOiBOb3RTdHJpY3RNb2Rl
OyB9Ci0gICAgICAgIAotICAgIHZvaWQgc2V0TmV2ZXJJbmxpbmUoYm9vbCB2YWx1ZSkgeyBtX25l
dmVySW5saW5lID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldE5ldmVyT3B0aW1pemUoYm9vbCB2YWx1
ZSkgeyBtX25ldmVyT3B0aW1pemUgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0TmV2ZXJGVExPcHRp
bWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJGVExPcHRpbWl6ZSA9IHZhbHVlOyB9Ci0gICAgdm9p
ZCBzZXREaWRUcnlUb0VudGVySW5Mb29wKGJvb2wgdmFsdWUpIHsgbV9kaWRUcnlUb0VudGVySW5M
b29wID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldENhblVzZU9TUkV4aXRGdXp6aW5nKGJvb2wgdmFs
dWUpIHsgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9IHZhbHVlOyB9Ci0gICAgYm9vbCBuZXZlcklu
bGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJbmxpbmU7IH0KLSAgICBib29sIG5ldmVyT3B0
aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyT3B0aW1pemU7IH0KLSAgICBib29sIG5ldmVy
RlRMT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyRlRMT3B0aW1pemU7IH0KLSAgICBi
b29sIGRpZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25zdCB7IHJldHVybiBtX2RpZFRyeVRvRW50ZXJJ
bkxvb3A7IH0KLSAgICBib29sIGlzSW5saW5pbmdDYW5kaWRhdGUoKSBjb25zdCB7IHJldHVybiAh
bmV2ZXJJbmxpbmUoKTsgfQotICAgIGJvb2wgaXNPa1RvT3B0aW1pemUoKSBjb25zdCB7IHJldHVy
biAhbmV2ZXJPcHRpbWl6ZSgpOyB9Ci0gICAgYm9vbCBjYW5Vc2VPU1JFeGl0RnV6emluZygpIGNv
bnN0IHsgcmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1enppbmc7IH0KLSAgICAKLSAgICBib29sKiBh
ZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKCkgeyByZXR1cm4gJm1fZGlkVHJ5VG9FbnRlcklu
TG9vcDsgfQotCi0gICAgQ29kZUZlYXR1cmVzIGZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gbV9m
ZWF0dXJlczsgfQotICAgICAgICAKLSAgICBERUNMQVJFX0VYUE9SVF9JTkZPOwotCi0gICAgdm9p
ZCByZWNvcmRQYXJzZShDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGJvb2wgaGFzQ2FwdHVyZWRWYXJp
YWJsZXMsIGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4s
IHVuc2lnbmVkIGVuZENvbHVtbikKLSAgICB7Ci0gICAgICAgIG1fZmVhdHVyZXMgPSBmZWF0dXJl
czsKLSAgICAgICAgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA9IGhhc0NhcHR1cmVkVmFyaWFibGVz
OwotICAgICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGluZTsKLSAgICAgICAgbV9sYXN0TGluZSA9
IGxhc3RMaW5lOwotICAgICAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAg
ICAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47Ci0gICAgICAgIEFTU0VSVChlbmRDb2x1
bW4gIT0gVUlOVF9NQVgpOwotICAgICAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKLSAgICB9
Ci0KLSAgICB2b2lkIGluc3RhbGxDb2RlKENvZGVCbG9jayopOwotICAgIHZvaWQgaW5zdGFsbENv
ZGUoVk0mLCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7Ci0g
ICAgQ29kZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgSlNG
dW5jdGlvbiosIEpTU2NvcGUqLCBKU09iamVjdComIGV4Y2VwdGlvbik7Ci0gICAgQ29kZUJsb2Nr
KiBuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKLQot
ICAgIC8vIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGludGVyZXN0aW5nIEdDIHN0b3J5LiBDYWxsZXJz
IG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFza2luZyB1cyB0byBjcmVhdGUgYSBDb2RlQmxvY2sKLSAg
ICAvLyB0aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMu
IENhbGxlcnMgYXJlIGVzc2VudGlhbGx5IGFza2luZyBmb3IgYSBzdHJvbmcgcmVmZXJlbmNlCi0g
ICAgLy8gdG8gdGhlIENvZGVCbG9jay4gQmVjYXVzZSB0aGUgRXhlY3V0YWJsZSBtYXkgYmUgYWxs
b2NhdGluZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1aXJlIGNhbGxlcnMgdG8gcGFzcyBpbgotICAg
IC8vIHRoZWlyIENvZGVCbG9jayomIHJlZmVyZW5jZSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgQ29k
ZUJsb2NrIHRvIGJlIGpldHRpc29uZWQgaWYgRXhlY3V0YWJsZSBpcyB0aGUgb25seSB0aGluZwot
ICAgIC8vIHRvIHBvaW50IHRvIGl0LiBUaGlzIGZvcmNlcyBjYWxsZXJzIHRvIGhhdmUgYSBDb2Rl
QmxvY2sqIGluIGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNrIHRoYXQgd2lsbCBiZSBtYXJrZWQK
LSAgICAvLyBieSBjb25zZXJ2YXRpdmUgR0MgaWYgYSBHQyBoYXBwZW5zIGFmdGVyIHdlIGNyZWF0
ZSB0aGUgQ29kZUJsb2NrLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4K
LSAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYsIEpTRnVuY3Rpb24qLCBKU1Nj
b3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2Nr
KTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPiB2b2lkIGZvckVhY2hDb2RlQmxv
Y2soRnVuY3RvciYmKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJh
c2U7Ci0gICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb25JbXBsKFZNJiwgSlNGdW5jdGlv
biosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJik7Ci0KLXBy
b3RlY3RlZDoKLSAgICBTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSosIFZNJiwgY29uc3QgU291
cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9v
bCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSwgSW50cmluc2ljKTsK
LQotICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZtKQotICAgIHsKLSAgICAgICAgQmFzZTo6
ZmluaXNoQ3JlYXRpb24odm0pOwotICAgICAgICB2bS5oZWFwLmFkZEV4ZWN1dGFibGUodGhpcyk7
IC8vIEJhbGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVubWFya2VkQ29tcGlsZWRDb2RlKCkuCi0KLSNp
ZiBFTkFCTEUoQ09ERUJMT0NLX1NBTVBMSU5HKQotICAgICAgICBpZiAoU2FtcGxpbmdUb29sKiBz
YW1wbGVyID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBsZXIoKSkKLSAgICAgICAgICAgIHNhbXBsZXIt
Pm5vdGlmeU9mU2NvcGUodm0sIHRoaXMpOwotI2VuZGlmCi0gICAgfQotCi0gICAgQ29kZUZlYXR1
cmVzIG1fZmVhdHVyZXM7Ci0gICAgYm9vbCBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7Ci0gICAgYm9v
bCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDogMTsKLSAgICBib29sIG1fbmV2ZXJJbmxpbmUgOiAx
OwotICAgIGJvb2wgbV9uZXZlck9wdGltaXplIDogMTsKLSAgICBib29sIG1fbmV2ZXJGVExPcHRp
bWl6ZSA6IDE7Ci0gICAgYm9vbCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQgOiAxOwotICAgIGJv
b2wgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7Ci0gICAgdW5zaWduZWQgbV9kZXJpdmVkQ29u
dGV4dFR5cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4dFR5cGUKLSAgICB1bnNpZ25lZCBtX2V2YWxD
b250ZXh0VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0VHlwZQotCi0gICAgaW50IG1fb3ZlcnJpZGVM
aW5lTnVtYmVyOwotICAgIGludCBtX2ZpcnN0TGluZTsKLSAgICBpbnQgbV9sYXN0TGluZTsKLSAg
ICB1bnNpZ25lZCBtX3N0YXJ0Q29sdW1uOwotICAgIHVuc2lnbmVkIG1fZW5kQ29sdW1uOwotICAg
IHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OwotICAgIHVuc2lnbmVkIG1fdHlw
ZVByb2ZpbGluZ0VuZE9mZnNldDsKLSAgICBTb3VyY2VDb2RlIG1fc291cmNlOwotfTsKLQotY2xh
c3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAg
ZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVm
IFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0
dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0K
LSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgRXZhbENvZGVCbG9jayog
Y29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2V2YWxDb2RlQmxvY2suZ2V0KCk7
Ci0gICAgfQotCi0gICAgc3RhdGljIEV2YWxFeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwg
Y29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0
VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIGNvbnN0
IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJh
dGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNh
bGwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0m
IHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsK
LSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3Rv
LCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsK
LSAgICB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEV4ZWN1dGFibGVJbmZv
IGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwo
KSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBK
U1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3Vy
Y2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1
bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRleHRUeXBlKCkpOyB9Ci0KLSAgICB1bnNp
Z25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVt
VmFyaWFibGVzKCk7IH0KLSAgICB1bnNpZ25lZCBudW1iZXJPZkZ1bmN0aW9uRGVjbHMoKSB7IHJl
dHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IH0K
LQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5k
IGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUq
LCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0
VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUpOwotCi0g
ICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0g
ICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1fZXZhbENvZGVCbG9jazsKLSAgICBXcml0
ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBtX3VubGlua2VkRXZhbENvZGVCbG9jazsK
LX07Ci0KLWNsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1
dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6
Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVu
c2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJ
c0ltbW9ydGFsOwotCi0gICAgc3RhdGljIFByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0
YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi0gICAgewotICAgICAgICBQcm9n
cmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFBy
b2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgUHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywg
c291cmNlKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7
Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLQotCi0gICAgSlNPYmplY3QqIGlu
aXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwgQ2FsbEZyYW1lKiwgSlNTY29wZSopOwotCi0g
ICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAgIFByb2dyYW1Db2RlQmxvY2sq
IGNvZGVCbG9jaygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wcm9ncmFtQ29kZUJsb2NrLmdl
dCgpOwotICAgIH0KLQotICAgIEpTT2JqZWN0KiBjaGVja1N5bnRheChFeGVjU3RhdGUqKTsKLQot
ICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAg
ICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0gICAgICAgIAotICAg
IHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0
KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3Ry
dWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFByb2dyYW1F
eGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLSAgICAgICAg
Ci0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8o
KSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUo
KSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9k
ZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJv
Z3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCks
IGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5k
IGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxl
OwotCi0gICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYp
OwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYp
OwotCi0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtl
ZFByb2dyYW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJyaWVyPFByb2dyYW1Db2RlQmxvY2s+IG1f
cHJvZ3JhbUNvZGVCbG9jazsKLX07Ci0KIGNsYXNzIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZp
bmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewogICAgIGZyaWVuZCBjbGFzcyBMTEludE9m
ZnNldHNFeHRyYWN0b3I7CiBwdWJsaWM6CkBAIC01NTUsMjI0ICs3NSw0IEBAIHByaXZhdGU6CiAg
ICAgV3JpdGVCYXJyaWVyPE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jazsKIH07CiAKLWNsYXNzIEZ1bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBT
Y3JpcHRFeGVjdXRhYmxlIHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFz
cyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVj
dXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0g
QmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGlj
IEZ1bmN0aW9uRXhlY3V0YWJsZSogY3JlYXRlKAotICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJj
ZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0
YWJsZSwgCi0gICAgICAgIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVu
c2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5z
aWMpCi0gICAgewotICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcg
KE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxGdW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5j
dGlvbkV4ZWN1dGFibGUodm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUs
IGxhc3RMaW5lLCBzdGFydENvbHVtbiwgZW5kQ29sdW1uLCBpbnRyaW5zaWMpOwotICAgICAgICBl
eGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxl
OwotICAgIH0KLSAgICBzdGF0aWMgRnVuY3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgK
LSAgICAgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNl
Q29kZSYsIAotICAgICAgICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51
bWJlcik7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAg
ICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKLSAgICB9
Ci0KLSAgICAvLyBSZXR1cm5zIGVpdGhlciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhp
cyBjYW4gYmUgYXBwcm9wcmlhdGUKLSAgICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0
IHRoYXQgZG9uJ3QgdmFyeSBiZXR3ZWVuIGNhbGwgYW5kIGNvbnN0cnVjdCAtLQotICAgIC8vIGZv
ciBleGFtcGxlLCBhcmd1bWVudHNSZWdpc3RlcigpLgotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBl
aXRoZXJDb2RlQmxvY2soKQotICAgIHsKLSAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkK
LSAgICAgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAgIHJl
dHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgICAgIAotICAg
IGJvb2wgaXNHZW5lcmF0ZWRGb3JDYWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAh
IW1fY29kZUJsb2NrRm9yQ2FsbDsKLSAgICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayogY29k
ZUJsb2NrRm9yQ2FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxs
LmdldCgpOwotICAgIH0KLQotICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25z
dAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwot
ICAgIH0KLQotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAg
IH0KLSAgICAgICAgCi0gICAgYm9vbCBpc0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAg
ICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNhbGwoKTsKLSAgICAgICAgQVNTRVJUKGtpbmQg
PT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0
cnVjdCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9j
a0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2lu
ZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7
Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1
cm4gY29kZUJsb2NrRm9yQ29uc3RydWN0KCk7Ci0gICAgfQotCi0gICAgRnVuY3Rpb25Db2RlQmxv
Y2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwotICAgICAg
ICAKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJs
b2NrRm9yKGtpbmQpOwotICAgIH0KLQotICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1l
bnRUeXBlU2V0KCkgCi0gICAgewotICAgICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNl
dCkKLSAgICAgICAgICAgIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0
ZSgpOwotCi0gICAgICAgIHJldHVybiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgfQot
ICAgICAgICAKLSAgICBGdW5jdGlvbk1vZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxp
bmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTW9kZSgpOyB9Ci0gICAgYm9vbCBpc0J1aWx0aW5GdW5j
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5j
dGlvbigpOyB9Ci0gICAgQ29uc3RydWN0QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3Qg
eyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQotICAg
IGJvb2wgaXNDbGFzcygpIGNvbnN0IHsgcmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9
Ci0gICAgYm9vbCBpc0Fycm93RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9
PSBTb3VyY2VQYXJzZU1vZGU6OkFycm93RnVuY3Rpb25Nb2RlOyB9Ci0gICAgYm9vbCBpc0dldHRl
cigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVy
TW9kZTsgfQotICAgIGJvb2wgaXNTZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9
PSBTb3VyY2VQYXJzZU1vZGU6OlNldHRlck1vZGU7IH0KLSAgICBib29sIGlzR2VuZXJhdG9yKCkg
Y29uc3QgeyByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJh
dG9yQm9keU1vZGUsIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9k
ZSkuY29udGFpbnMocGFyc2VNb2RlKCkpOyB9Ci0gICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsg
cmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQotICAg
IGJvb2wgaGFzQ2FsbGVyQW5kQXJndW1lbnRzUHJvcGVydGllcygpIGNvbnN0Ci0gICAgewotICAg
ICAgICAvLyBQZXIgaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVu
LWV4dGVuc2lvbnMsIG9ubHkgc2xvcHB5LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9s
ZC1zdHlsZSAocHJlLUVTNikgc3ludGFjdGljIGZvcm1zIGNhbiBjb250YWluCi0gICAgICAgIC8v
ICJjYWxsZXIiIGFuZCAiYXJndW1lbnRzIi4KLSAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUo
KSAmJiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAm
JiAhaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsKLSAgICB9Ci0gICAgYm9vbCBoYXNQcm90
b3R5cGVQcm9wZXJ0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gU291cmNlUGFyc2VN
b2RlU2V0KAotICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUs
Ci0gICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAotICAgICAg
ICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCi0gICAg
ICAgICkuY29udGFpbnMocGFyc2VNb2RlKCkpIHx8IGlzQ2xhc3MoKTsKLSAgICB9Ci0gICAgRGVy
aXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5s
aW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKTsgfQotICAgIGJvb2wgaXNDbGFz
c0NvbnN0cnVjdG9yRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJs
ZS0+aXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXIm
IG5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9Ci0gICAgY29u
c3QgSWRlbnRpZmllciYgZWNtYU5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+
ZWNtYU5hbWUoKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pbmZlcnJlZE5hbWUoKTsgfQotICAgIHVuc2lnbmVk
IHBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBh
cmFtZXRlckNvdW50KCk7IH0gLy8gRXhjbHVkaW5nICd0aGlzJyEKLSAgICB1bnNpZ25lZCBmdW5j
dGlvbkxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlv
bkxlbmd0aCgpOyB9Ci0gICAgU291cmNlUGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJzZU1vZGUoKTsgfQotICAgIEpTUGFyc2VyU2Ny
aXB0TW9kZSBzY3JpcHRNb2RlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUt
PnNjcmlwdE1vZGUoKTsgfQotICAgIGNvbnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29u
c3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KLQotICAg
IHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKLSAgICBz
dGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVj
dHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4
ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAgdW5z
aWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJz
U3RhcnRPZmZzZXQ7IH0KLQotICAgIHZvaWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmls
aW5nU3RhcnRFbmRPZmZzZXRzKHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWdu
ZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KQotICAgIHsKLSAgICAgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJz
U3RhcnRPZmZzZXQ7Ci0gICAgICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVBy
b2ZpbGluZ1N0YXJ0T2Zmc2V0OwotICAgICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0
eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OwotICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAg
IEluZmVycmVkVmFsdWUqIHNpbmdsZXRvbkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25G
dW5jdGlvbi5nZXQoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxl
QmFzZTsKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUoCi0gICAgICAgIFZNJiwgY29uc3QgU291cmNl
Q29kZSYsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAK
LSAgICAgICAgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25l
ZCBlbmRDb2x1bW4sIEludHJpbnNpYyk7Ci0gICAgCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihW
TSYpOwotCi0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0gICAgCi0gICAgdW5z
aWduZWQgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPFVubGlua2Vk
RnVuY3Rpb25FeGVjdXRhYmxlPiBtX3VubGlua2VkRXhlY3V0YWJsZTsKLSAgICBXcml0ZUJhcnJp
ZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKLSAgICBXcml0ZUJhcnJp
ZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0OwotICAgIFJlZlB0
cjxUeXBlU2V0PiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPElu
ZmVycmVkVmFsdWU+IG1fc2luZ2xldG9uRnVuY3Rpb247Ci19OwotCi0jaWYgRU5BQkxFKFdFQkFT
U0VNQkxZKQotY2xhc3MgV2ViQXNzZW1ibHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1
dGFibGVCYXNlIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0g
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJl
RmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21N
b2R1bGUqIG1vZHVsZSwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCkKLSAgICB7Ci0gICAgICAgIFdl
YkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVD
ZWxsPFdlYkFzc2VtYmx5RXhlY3V0YWJsZT4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJs
ZSh2bSwgc291cmNlLCBtb2R1bGUsIGZ1bmN0aW9uSW5kZXgpOwotICAgICAgICBleGVjdXRhYmxl
LT5maW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0K
LQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFs
T2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1
cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdl
YkFzc2VtYmx5RXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9
Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgREVDTEFSRV9JTkZP
OwotCi0gICAgdm9pZCBwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJik7Ci0KLSAgICBXZWJBc3NlbWJs
eUNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9j
b2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xh
c3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3Qg
U291cmNlQ29kZSYsIEpTV2FzbU1vZHVsZSosIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOwotCi0g
ICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0g
ICAgU291cmNlQ29kZSBtX3NvdXJjZTsKLSAgICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBt
X21vZHVsZTsKLSAgICB1bnNpZ25lZCBtX2Z1bmN0aW9uSW5kZXg7Ci0KLSAgICBXcml0ZUJhcnJp
ZXI8V2ViQXNzZW1ibHlDb2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKLX07Ci0jZW5kaWYK
LQotdGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgotSlNPYmplY3QqIFNjcmlwdEV4
ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlv
biwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2Nr
KiYgcmVzdWx0Q29kZUJsb2NrKQotewotICAgIGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7Ci0g
ICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6
dmFsdWUpCi0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4o
anNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxz
ZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZh
bHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpz
Q2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0gICAgICAgIGVs
c2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGU+Ojp2YWx1ZSkKLSAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxv
Y2sqPihqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkp
OwotICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9u
RXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0
PENvZGVCbG9jayo+KGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2Nr
Rm9yKGtpbmQpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiBw
cmVwYXJlRm9yRXhlY3V0aW9uSW1wbCh2bSwgZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRD
b2RlQmxvY2spOwotfQotCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL05hdGl2ZUV4ZWN1dGFibGUuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL05hdGl2ZUV4ZWN1dGFibGUuY3BwCShyZXZpc2lvbiAy
MDc3OTApCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuY3Bw
OjIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL05hdGl2ZUV4ZWN1dGFi
bGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODQ2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5LCAyMDEwLCAyMDEzLCAyMDE1LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKKworI2luY2x1ZGUgIkJh
dGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmgiCisjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCisjaW5j
bHVkZSAiRGVidWdnZXIuaCIKKyNpbmNsdWRlICJKSVQuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVz
LmgiCisjaW5jbHVkZSAiSlNXYXNtTW9kdWxlLmgiCisjaW5jbHVkZSAiTExJbnRFbnRyeXBvaW50
LmgiCisjaW5jbHVkZSAiUGFyc2VyLmgiCisjaW5jbHVkZSAiVHlwZVByb2ZpbGVyLmgiCisjaW5j
bHVkZSAiVk1JbmxpbmVzLmgiCisjaW5jbHVkZSA8d3RmL0NvbW1hUHJpbnRlci5oPgorCituYW1l
c3BhY2UgSlNDIHsKKworY29uc3QgQ2xhc3NJbmZvIEV4ZWN1dGFibGVCYXNlOjpzX2luZm8gPSB7
ICJFeGVjdXRhYmxlIiwgMCwgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShFeGVjdXRhYmxlQmFzZSkg
fTsKKwordm9pZCBFeGVjdXRhYmxlQmFzZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAg
c3RhdGljX2Nhc3Q8RXhlY3V0YWJsZUJhc2UqPihjZWxsKS0+RXhlY3V0YWJsZUJhc2U6On5FeGVj
dXRhYmxlQmFzZSgpOworfQorCit2b2lkIEV4ZWN1dGFibGVCYXNlOjpjbGVhckNvZGUoKQorewor
I2lmIEVOQUJMRShKSVQpCisgICAgbV9qaXRDb2RlRm9yQ2FsbCA9IG51bGxwdHI7CisgICAgbV9q
aXRDb2RlRm9yQ29uc3RydWN0ID0gbnVsbHB0cjsKKyAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFy
aXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKKyAgICBtX2ppdENvZGVGb3JDb25z
dHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOworI2VuZGlmCisg
ICAgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsK
KyAgICBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09N
UElMRUQ7CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZv
KCkpIHsKKyAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1
bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9j
a0ZvckNhbGwuY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25z
dHJ1Y3QuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4
ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5t
X3VubGlua2VkRXZhbENvZGVCbG9jay5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7
CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1F
eGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9j
ay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9j
ay5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5mbygp
ID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
LmNsZWFyKCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrLmNsZWFyKCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRT
eW1ib2xUYWJsZS5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorI2lmIEVO
QUJMRShXRUJBU1NFTUJMWSkKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gV2ViQXNzZW1ibHlFeGVj
dXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVj
dXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyNlbmRpZgorCisgICAgQVNTRVJUKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6
OmluZm8oKSk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBOYXRpdmVFeGVjdXRhYmxlOjpzX2luZm8g
PSB7ICJOYXRpdmVFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFU
RV9NRVRIT0RfVEFCTEUoTmF0aXZlRXhlY3V0YWJsZSkgfTsKKworTmF0aXZlRXhlY3V0YWJsZSog
TmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxs
VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0
cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNp
YywgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIE5hdGl2ZUV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGU7CisgICAgZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE5hdGl2ZUV4
ZWN1dGFibGU+KHZtLmhlYXApKSBOYXRpdmVFeGVjdXRhYmxlKHZtLCBmdW5jdGlvbiwgY29uc3Ry
dWN0b3IsIGludHJpbnNpYyk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0sIGNh
bGxUaHVuaywgY29uc3RydWN0VGh1bmssIG5hbWUpOworICAgIHJldHVybiBleGVjdXRhYmxlOwor
fQorCit2b2lkIE5hdGl2ZUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAg
IHN0YXRpY19jYXN0PE5hdGl2ZUV4ZWN1dGFibGUqPihjZWxsKS0+TmF0aXZlRXhlY3V0YWJsZTo6
fk5hdGl2ZUV4ZWN1dGFibGUoKTsKK30KKworU3RydWN0dXJlKiBOYXRpdmVFeGVjdXRhYmxlOjpj
cmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1Zh
bHVlIHByb3RvKQoreworICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2Jq
ZWN0LCBwcm90bywgVHlwZUluZm8oQ2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsK
K30KKwordm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIFBhc3NS
ZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRo
dW5rLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0p
OworICAgIG1faml0Q29kZUZvckNhbGwgPSBjYWxsVGh1bms7CisgICAgbV9qaXRDb2RlRm9yQ29u
c3RydWN0ID0gY29uc3RydWN0VGh1bms7CisgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNo
ZWNrID0gbV9qaXRDb2RlRm9yQ2FsbC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOwor
ICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ29u
c3RydWN0LT5hZGRyZXNzRm9yQ2FsbChNdXN0Q2hlY2tBcml0eSk7CisgICAgbV9uYW1lID0gbmFt
ZTsKK30KKworTmF0aXZlRXhlY3V0YWJsZTo6TmF0aXZlRXhlY3V0YWJsZShWTSYgdm0sIE5hdGl2
ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2lj
IGludHJpbnNpYykKKyAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCB2bS5uYXRpdmVFeGVjdXRhYmxl
U3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1FVEVSU19JU19IT1NULCBpbnRyaW5zaWMpCisgICAg
LCBtX2Z1bmN0aW9uKGZ1bmN0aW9uKQorICAgICwgbV9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikK
K3sKK30KKworY29uc3QgQ2xhc3NJbmZvIFNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlNj
cmlwdEV4ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhP
RF9UQUJMRShTY3JpcHRFeGVjdXRhYmxlKSB9OworCitTY3JpcHRFeGVjdXRhYmxlOjpTY3JpcHRF
eGVjdXRhYmxlKFN0cnVjdHVyZSogc3RydWN0dXJlLCBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2
ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0
VHlwZSBldmFsQ29udGV4dFR5cGUsIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgOiBFeGVjdXRh
YmxlQmFzZSh2bSwgc3RydWN0dXJlLCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIGludHJp
bnNpYykKKyAgICAsIG1fZmVhdHVyZXMoaXNJblN0cmljdENvbnRleHQgPyBTdHJpY3RNb2RlRmVh
dHVyZSA6IDApCisgICAgLCBtX2RpZFRyeVRvRW50ZXJJbkxvb3AoZmFsc2UpCisgICAgLCBtX2hh
c0NhcHR1cmVkVmFyaWFibGVzKGZhbHNlKQorICAgICwgbV9uZXZlcklubGluZShmYWxzZSkKKyAg
ICAsIG1fbmV2ZXJPcHRpbWl6ZShmYWxzZSkKKyAgICAsIG1fbmV2ZXJGVExPcHRpbWl6ZShmYWxz
ZSkKKyAgICAsIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dChpc0luQXJyb3dGdW5jdGlvbkNvbnRl
eHQpCisgICAgLCBtX2NhblVzZU9TUkV4aXRGdXp6aW5nKHRydWUpCisgICAgLCBtX2Rlcml2ZWRD
b250ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZGVyaXZlZENvbnRleHRUeXBlKSkKKyAg
ICAsIG1fZXZhbENvbnRleHRUeXBlKHN0YXRpY19jYXN0PHVuc2lnbmVkPihldmFsQ29udGV4dFR5
cGUpKQorICAgICwgbV9vdmVycmlkZUxpbmVOdW1iZXIoLTEpCisgICAgLCBtX2ZpcnN0TGluZSgt
MSkKKyAgICAsIG1fbGFzdExpbmUoLTEpCisgICAgLCBtX3N0YXJ0Q29sdW1uKFVJTlRfTUFYKQor
ICAgICwgbV9lbmRDb2x1bW4oVUlOVF9NQVgpCisgICAgLCBtX3R5cGVQcm9maWxpbmdTdGFydE9m
ZnNldChVSU5UX01BWCkKKyAgICAsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldChVSU5UX01BWCkK
KyAgICAsIG1fc291cmNlKHNvdXJjZSkKK3sKK30KKwordm9pZCBTY3JpcHRFeGVjdXRhYmxlOjpk
ZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRhYmxl
Kj4oY2VsbCktPlNjcmlwdEV4ZWN1dGFibGU6On5TY3JpcHRFeGVjdXRhYmxlKCk7Cit9CisKK3Zv
aWQgU2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFsbENvZGUoQ29kZUJsb2NrKiBjb2RlQmxvY2spCit7
CisgICAgaW5zdGFsbENvZGUoKmNvZGVCbG9jay0+dm0oKSwgY29kZUJsb2NrLCBjb2RlQmxvY2st
PmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lhbGl6YXRpb25LaW5kKCkpOworfQorCit2b2lk
IFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKFZNJiB2bSwgQ29kZUJsb2NrKiBnZW5lcmlj
Q29kZUJsb2NrLCBDb2RlVHlwZSBjb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
KQoreworICAgIEFTU0VSVCh2bS5oZWFwLmlzRGVmZXJyZWQoKSk7CisgICAgCisgICAgaWYgKGdl
bmVyaWNDb2RlQmxvY2spCisgICAgICAgIENPREVCTE9DS19MT0dfRVZFTlQoZ2VuZXJpY0NvZGVC
bG9jaywgImluc3RhbGxDb2RlIiwgKCkpOworICAgIAorICAgIENvZGVCbG9jayogb2xkQ29kZUJs
b2NrID0gbnVsbHB0cjsKKyAgICAKKyAgICBzd2l0Y2ggKGNvZGVUeXBlKSB7CisgICAgY2FzZSBH
bG9iYWxDb2RlOiB7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sq
IGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJs
b2NrKTsKKyAgICAgICAgCisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAg
ICAgICAgCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVC
bG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLnNldE1h
eUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisg
ICAgY2FzZSBNb2R1bGVDb2RlOiB7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBl
eGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAg
ICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PE1vZHVs
ZVByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKworICAgICAgICBBU1NFUlQo
a2luZCA9PSBDb2RlRm9yQ2FsbCk7CisKKyAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJs
ZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgICAgICBleGVjdXRhYmxlLT5t
X21vZHVsZVByb2dyYW1Db2RlQmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2sp
OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEV2YWxDb2RlOiB7CisgICAgICAg
IEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhp
cyk7CisgICAgICAgIEV2YWxDb2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEV2YWxD
b2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIEFTU0VSVChr
aW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4
ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9l
dmFsQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICAgICAgICAKKyAgICBjYXNlIEZ1bmN0aW9uQ29kZTogeworICAgICAg
ICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRh
YmxlKj4odGhpcyk7CisgICAgICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0
aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOworICAgICAgICAK
KyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAg
ICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuZ2V0
KCk7CisgICAgICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuc2V0TWF5QmVO
dWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgQ29kZUZvckNvbnN0cnVjdDoKKyAgICAgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFi
bGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgICAgICAgICAgZXhlY3V0YWJs
ZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3Quc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxv
Y2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAg
fQorICAgIH0KKworICAgIHN3aXRjaCAoa2luZCkgeworICAgIGNhc2UgQ29kZUZvckNhbGw6Cisg
ICAgICAgIG1faml0Q29kZUZvckNhbGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVC
bG9jay0+aml0Q29kZSgpIDogbnVsbHB0cjsKKyAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhB
cml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7CisgICAgICAgIG1fbnVtUGFyYW1l
dGVyc0ZvckNhbGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFy
YW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVj
dCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkgOiBudWxs
cHRyOworICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1hY3Jv
QXNzZW1ibGVyQ29kZVB0cigpOworICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3Qg
PSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDog
TlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAg
ICBpZiAoZ2VuZXJpY0NvZGVCbG9jaykgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChnZW5lcmlj
Q29kZUJsb2NrLT5vd25lckV4ZWN1dGFibGUoKSA9PSB0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQoSklUQ29kZTo6aXNFeGVjdXRhYmxlU2NyaXB0KGdlbmVyaWNDb2RlQmxvY2stPmppdFR5
cGUoKSkpOworICAgICAgICAKKyAgICAgICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VPU1IoKSkKKyAg
ICAgICAgICAgIGRhdGFMb2coIkluc3RhbGxpbmcgIiwgKmdlbmVyaWNDb2RlQmxvY2ssICJcbiIp
OworICAgICAgICAKKyAgICAgICAgaWYgKHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlcikKKyAgICAg
ICAgICAgIHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlci0+ZW5zdXJlQnl0ZWNvZGVzRm9yKGdlbmVy
aWNDb2RlQmxvY2spOworICAgICAgICAKKyAgICAgICAgaWYgKERlYnVnZ2VyKiBkZWJ1Z2dlciA9
IGdlbmVyaWNDb2RlQmxvY2stPmdsb2JhbE9iamVjdCgpLT5kZWJ1Z2dlcigpKQorICAgICAgICAg
ICAgZGVidWdnZXItPnJlZ2lzdGVyQ29kZUJsb2NrKGdlbmVyaWNDb2RlQmxvY2spOworICAgIH0K
KworICAgIGlmIChvbGRDb2RlQmxvY2spCisgICAgICAgIG9sZENvZGVCbG9jay0+dW5saW5rSW5j
b21pbmdDYWxscygpOworCisgICAgdm0uaGVhcC53cml0ZUJhcnJpZXIodGhpcyk7Cit9CisKK0Nv
ZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3Q29kZUJsb2NrRm9yKAorICAgIENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3Bl
LCBKU09iamVjdComIGV4Y2VwdGlvbikKK3sKKyAgICBWTSogdm0gPSBzY29wZS0+dm0oKTsKKyAg
ICBhdXRvIHRocm93U2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKCp2bSk7CisKKyAgICBBU1NF
UlQodm0tPmhlYXAuaXNEZWZlcnJlZCgpKTsKKyAgICBBU1NFUlQoc3RhcnRDb2x1bW4oKSAhPSBV
SU5UX01BWCk7CisgICAgQVNTRVJUKGVuZENvbHVtbigpICE9IFVJTlRfTUFYKTsKKworICAgIGlm
IChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxF
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBSRUxF
QVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrKTsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoIWZ1bmN0aW9uKTsKKyAgICAgICAgcmV0dXJuIEV2YWxDb2RlQmxvY2s6OmNyZWF0
ZSh2bSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFs
Q29kZUJsb2NrLmdldCgpLCBzY29wZSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgp
LnByb3ZpZGVyKCkpOworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3Jh
bUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0
YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNF
X0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4
ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFm
dW5jdGlvbik7CisgICAgICAgIHJldHVybiBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCisg
ICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVC
bG9jay5nZXQoKSwgc2NvcGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92
aWRlcigpLCBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKKyAgICB9CisKKyAg
ICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewor
ICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5k
ID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1f
bW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlv
bik7CisgICAgICAgIHJldHVybiBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCisg
ICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2Uo
KS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKKyAgICB9
CisKKyAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6
OmluZm8oKSk7CisgICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb24pOworICAgIEZ1bmN0aW9uRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsK
KyAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAg
ICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgpOwor
ICAgIFBhcnNlckVycm9yIGVycm9yOworICAgIERlYnVnZ2VyTW9kZSBkZWJ1Z2dlck1vZGUgPSBn
bG9iYWxPYmplY3QtPmhhc0ludGVyYWN0aXZlRGVidWdnZXIoKSA/IERlYnVnZ2VyT24gOiBEZWJ1
Z2dlck9mZjsKKyAgICBVbmxpbmtlZEZ1bmN0aW9uQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9j
ayA9IAorICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+dW5saW5rZWRD
b2RlQmxvY2tGb3IoCisgICAgICAgICAgICAqdm0sIGV4ZWN1dGFibGUtPm1fc291cmNlLCBraW5k
LCBkZWJ1Z2dlck1vZGUsIGVycm9yLCAKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnBhcnNlTW9k
ZSgpKTsKKyAgICByZWNvcmRQYXJzZSgKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4
ZWN1dGFibGUtPmZlYXR1cmVzKCksIAorICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhl
Y3V0YWJsZS0+aGFzQ2FwdHVyZWRWYXJpYWJsZXMoKSwgZmlyc3RMaW5lKCksIAorICAgICAgICBs
YXN0TGluZSgpLCBzdGFydENvbHVtbigpLCBlbmRDb2x1bW4oKSk7IAorICAgIGlmICghdW5saW5r
ZWRDb2RlQmxvY2spIHsKKyAgICAgICAgZXhjZXB0aW9uID0gdGhyb3dFeGNlcHRpb24oCisgICAg
ICAgICAgICBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgdGhyb3dTY29wZSwKKyAgICAgICAg
ICAgIGVycm9yLnRvRXJyb3JPYmplY3QoZ2xvYmFsT2JqZWN0LCBleGVjdXRhYmxlLT5tX3NvdXJj
ZSkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBTb3VyY2VQcm92aWRl
ciogcHJvdmlkZXIgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpOworICAgIHVuc2ln
bmVkIHNvdXJjZU9mZnNldCA9IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0T2Zmc2V0KCk7Cisg
ICAgdW5zaWduZWQgc3RhcnRDb2x1bW4gPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVt
bigpOworCisgICAgcmV0dXJuIEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAg
IGV4ZWN1dGFibGUsIHVubGlua2VkQ29kZUJsb2NrLCBzY29wZSwgcHJvdmlkZXIsIHNvdXJjZU9m
ZnNldCwgc3RhcnRDb2x1bW4pOworfQorCitDb2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5l
d1JlcGxhY2VtZW50Q29kZUJsb2NrRm9yKAorICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2lu
ZCkKK3sKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgewor
ICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgRXZh
bEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsK
KyAgICAgICAgRXZhbENvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJs
b2NrKj4oCisgICAgICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2stPmJhc2VsaW5l
VmVyc2lvbigpKTsKKyAgICAgICAgRXZhbENvZGVCbG9jayogcmVzdWx0ID0gRXZhbENvZGVCbG9j
azo6Y3JlYXRlKHZtKCksCisgICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywg
KmJhc2VsaW5lKTsKKyAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxp
bmUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FT
U0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUHJv
Z3JhbUNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4o
CisgICAgICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVy
c2lvbigpKTsKKyAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gUHJvZ3JhbUNvZGVC
bG9jazo6Y3JlYXRlKHZtKCksCisgICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9j
aywgKmJhc2VsaW5lKTsKKyAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFz
ZWxpbmUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRo
aXMpOworICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19j
YXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPigKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1f
bW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOworICAgICAgICBNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrKiByZXN1bHQgPSBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVh
dGUodm0oKSwKKyAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxp
bmUpOworICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJ
bmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOworICAgIEZ1bmN0aW9uRXhlY3V0
YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAg
ICBGdW5jdGlvbkNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVC
bG9jayo+KAorICAgICAgICBleGVjdXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCktPmJhc2VsaW5l
VmVyc2lvbigpKTsKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0ID0gRnVuY3Rpb25Db2Rl
QmxvY2s6OmNyZWF0ZSh2bSgpLAorICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywg
KmJhc2VsaW5lKTsKKyAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBMTEludChWTSYgdm0s
IENvZGVCbG9jayogY29kZUJsb2NrKQoreworICAgIExMSW50OjpzZXRFbnRyeXBvaW50KHZtLCBj
b2RlQmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzZXR1cEpJVChWTSYgdm0sIENvZGVCbG9jayog
Y29kZUJsb2NrKQoreworI2lmIEVOQUJMRShKSVQpCisgICAgQ29tcGlsYXRpb25SZXN1bHQgcmVz
dWx0ID0gSklUOjpjb21waWxlKCZ2bSwgY29kZUJsb2NrLCBKSVRDb21waWxhdGlvbk11c3RTdWNj
ZWVkKTsKKyAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQgPT0gQ29tcGlsYXRpb25TdWNjZXNzZnVs
KTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHZtKTsKKyAgICBVTlVTRURfUEFSQU0oY29kZUJs
b2NrKTsKKyAgICBVTlJFQUNIQUJMRV9GT1JfUExBVEZPUk0oKTsKKyNlbmRpZgorfQorCitKU09i
amVjdCogU2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoCisgICAgVk0m
IHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXph
dGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQoreworICAgIERlZmVy
R0NGb3JBV2hpbGUgZGVmZXJHQyh2bS5oZWFwKTsKKworICAgIGlmICh2bS5nZXRBbmRDbGVhckZh
aWxOZXh0TmV3Q29kZUJsb2NrKCkpCisgICAgICAgIHJldHVybiBjcmVhdGVFcnJvcihzY29wZS0+
Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMoKSwgQVNDSUlMaXRlcmFsKCJGb3JjZWQgRmFpbHVy
ZSIpKTsKKworICAgIEpTT2JqZWN0KiBleGNlcHRpb24gPSAwOworICAgIENvZGVCbG9jayogY29k
ZUJsb2NrID0gbmV3Q29kZUJsb2NrRm9yKGtpbmQsIGZ1bmN0aW9uLCBzY29wZSwgZXhjZXB0aW9u
KTsKKyAgICByZXN1bHRDb2RlQmxvY2sgPSBjb2RlQmxvY2s7CisgICAgaWYgKCFjb2RlQmxvY2sp
IHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZXhjZXB0aW9uKTsKKyAgICAgICAgcmV0dXJuIGV4
Y2VwdGlvbjsKKyAgICB9CisgICAgCisgICAgaWYgKE9wdGlvbnM6OnZhbGlkYXRlQnl0ZWNvZGUo
KSkKKyAgICAgICAgY29kZUJsb2NrLT52YWxpZGF0ZSgpOworICAgIAorICAgIGlmIChPcHRpb25z
Ojp1c2VMTEludCgpKQorICAgICAgICBzZXR1cExMSW50KHZtLCBjb2RlQmxvY2spOworICAgIGVs
c2UKKyAgICAgICAgc2V0dXBKSVQodm0sIGNvZGVCbG9jayk7CisgICAgCisgICAgaW5zdGFsbENv
ZGUodm0sIGNvZGVCbG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNp
YWxpemF0aW9uS2luZCgpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgQ2xhc3NJ
bmZvIEV2YWxFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJFdmFsRXhlY3V0YWJsZSIsICZTY3JpcHRF
eGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRXZhbEV4ZWN1dGFibGUp
IH07CisKK0V2YWxFeGVjdXRhYmxlKiBFdmFsRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSog
ZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBE
ZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlv
bkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxl
RW52aXJvbm1lbnQqIHZhcmlhYmxlc1VuZGVyVERaKQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZt
KCk7CisgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOworCisgICAgSlNH
bG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsK
KyAgICBpZiAoIWdsb2JhbE9iamVjdC0+ZXZhbEVuYWJsZWQoKSkgeworICAgICAgICB0aHJvd0V4
Y2VwdGlvbihleGVjLCBzY29wZSwgY3JlYXRlRXZhbEVycm9yKGV4ZWMsIGdsb2JhbE9iamVjdC0+
ZXZhbERpc2FibGVkRXJyb3JNZXNzYWdlKCkpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRl
Q2VsbDxFdmFsRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIEV2YWxFeGVjdXRhYmxlKGV4ZWMs
IHNvdXJjZSwgaXNJblN0cmljdENvbnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1
bmN0aW9uQ29udGV4dCwgZXZhbENvbnRleHRUeXBlKTsKKyAgICBleGVjdXRhYmxlLT5maW5pc2hD
cmVhdGlvbih2bSk7CisKKyAgICBVbmxpbmtlZEV2YWxDb2RlQmxvY2sqIHVubGlua2VkRXZhbENv
ZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZUV2YWxDb2RlQmxvY2soZXhlYywgZXhlY3V0YWJsZSwg
dmFyaWFibGVzVW5kZXJURFopOworICAgIGlmICghdW5saW5rZWRFdmFsQ29kZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5zZXQo
dm0sIGV4ZWN1dGFibGUsIHVubGlua2VkRXZhbENvZGUpOworCisgICAgcmV0dXJuIGV4ZWN1dGFi
bGU7Cit9CisKK0V2YWxFeGVjdXRhYmxlOjpFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRD
b250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4
dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSkKKyAgICA6IFNjcmlwdEV4ZWN1dGFi
bGUoZXhlYy0+dm0oKS5ldmFsRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwg
c291cmNlLCBpblN0cmljdENvbnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0
aW9uQ29udGV4dCwgZXZhbENvbnRleHRUeXBlLCBOb0ludHJpbnNpYykKK3sKKyAgICBBU1NFUlQo
c291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5
cGU6OlByb2dyYW0pOworfQorCit2b2lkIEV2YWxFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCog
Y2VsbCkKK3sKKyAgICBzdGF0aWNfY2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpLT5FdmFsRXhl
Y3V0YWJsZTo6fkV2YWxFeGVjdXRhYmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBQcm9ncmFt
RXhlY3V0YWJsZTo6c19pbmZvID0geyAiUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0
YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFByb2dyYW1FeGVjdXRhYmxlKSB9
OworCitQcm9ncmFtRXhlY3V0YWJsZTo6UHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMt
PnZtKCkucHJvZ3JhbUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJj
ZSwgZmFsc2UsIERlcml2ZWRDb250ZXh0VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlw
ZTo6Tm9uZSwgTm9JbnRyaW5zaWMpCit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5z
b3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsKKyAgICBt
X3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IDA7CisgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0ID0gc291cmNlLmxlbmd0aCgpIC0gMTsKKyAgICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmls
ZXIoKSB8fCBleGVjLT52bSgpLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkKKyAgICAgICAgZXhlYy0+
dm0oKS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNv
dXJjZUlEKCksIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRP
ZmZzZXQpOworfQorCit2b2lkIFByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2Vs
bCkKK3sKKyAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Qcm9ncmFt
RXhlY3V0YWJsZTo6flByb2dyYW1FeGVjdXRhYmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6c19pbmZvID0geyAiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKSB9OworCitNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkubW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2
ZWRDb250ZXh0VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRy
aW5zaWMpCit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0g
U291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpNb2R1bGUpOworICAgIG1fdHlwZVByb2ZpbGluZ1N0
YXJ0T2Zmc2V0ID0gMDsKKyAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2UubGVu
Z3RoKCkgLSAxOworICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZt
KCkuY29udHJvbEZsb3dQcm9maWxlcigpKQorICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9uSGFz
RXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Cit9CisKK01v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6Y3JlYXRlKEV4
ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQoreworICAgIEpTR2xvYmFs
T2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAg
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9j
YXRlQ2VsbDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIE1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3Jl
YXRpb24oZXhlYy0+dm0oKSk7CisKKyAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sq
IHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZU1vZHVsZVBy
b2dyYW1Db2RlQmxvY2soZXhlYywgZXhlY3V0YWJsZSk7CisgICAgaWYgKCF1bmxpbmtlZE1vZHVs
ZVByb2dyYW1Db2RlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBleGVjdXRhYmxlLT5t
X3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJs
ZSwgdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZSk7CisKKyAgICBleGVjdXRhYmxlLT5tX21vZHVs
ZUVudmlyb25tZW50U3ltYm9sVGFibGUuc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUsIGpzQ2Fz
dDxTeW1ib2xUYWJsZSo+KHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUtPmNvbnN0YW50UmVnaXN0
ZXIodW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+bW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJs
ZUNvbnN0YW50UmVnaXN0ZXJPZmZzZXQoKSkuZ2V0KCkpLT5jbG9uZVNjb3BlUGFydChleGVjLT52
bSgpKSk7CisKKyAgICByZXR1cm4gZXhlY3V0YWJsZTsKK30KKwordm9pZCBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKS0+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6On5N
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gRnVuY3Rpb25F
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJGdW5jdGlvbkV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0
YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEZ1bmN0aW9uRXhlY3V0YWJsZSkg
fTsKKworRnVuY3Rpb25FeGVjdXRhYmxlOjpGdW5jdGlvbkV4ZWN1dGFibGUoVk0mIHZtLCBjb25z
dCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtl
ZEV4ZWN1dGFibGUsIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2ln
bmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMp
CisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKHZtLmZ1bmN0aW9uRXhlY3V0YWJsZVN0cnVjdHVyZS5n
ZXQoKSwgdm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLT5pc0luU3RyaWN0Q29udGV4dCgp
LCB1bmxpbmtlZEV4ZWN1dGFibGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpLCBmYWxzZSwgRXZhbENv
bnRleHRUeXBlOjpOb25lLCBpbnRyaW5zaWMpCisgICAgLCBtX3VubGlua2VkRXhlY3V0YWJsZSh2
bSwgdGhpcywgdW5saW5rZWRFeGVjdXRhYmxlKQoreworICAgIFJFTEVBU0VfQVNTRVJUKCFzb3Vy
Y2UuaXNOdWxsKCkpOworICAgIEFTU0VSVChzb3VyY2UubGVuZ3RoKCkpOworICAgIG1fZmlyc3RM
aW5lID0gZmlyc3RMaW5lOworICAgIG1fbGFzdExpbmUgPSBsYXN0TGluZTsKKyAgICBBU1NFUlQo
c3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9N
QVgpOworICAgIG1fc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKKyAgICBtX2VuZENvbHVtbiA9
IGVuZENvbHVtbjsKKyAgICBtX3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0
YWJsZS0+cGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCk7CisgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRP
ZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpOwor
ICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVBy
b2ZpbGluZ0VuZE9mZnNldCgpOworfQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNo
Q3JlYXRpb24oVk0mIHZtKQoreworICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICBt
X3NpbmdsZXRvbkZ1bmN0aW9uLnNldCh2bSwgdGhpcywgSW5mZXJyZWRWYWx1ZTo6Y3JlYXRlKHZt
KSk7Cit9CisKK3ZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkK
K3sKKyAgICBzdGF0aWNfY2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKS0+RnVuY3Rpb25F
eGVjdXRhYmxlOjp+RnVuY3Rpb25FeGVjdXRhYmxlKCk7Cit9CisKK2lubGluZSBjb25zdCBjaGFy
KiBzYW1wbGluZ0Rlc2NyaXB0aW9uKEpJVENvZGU6OkpJVFR5cGUgaml0VHlwZSkKK3sKKyAgICBz
d2l0Y2ggKGppdFR5cGUpIHsKKyAgICBjYXNlIEpJVENvZGU6OkludGVycHJldGVyVGh1bms6Cisg
ICAgICAgIHJldHVybiAiSW50ZXJwcmV0ZXIgQ29tcGlsYXRpb24gKFRPVEFMKSI7CisgICAgY2Fz
ZSBKSVRDb2RlOjpCYXNlbGluZUpJVDoKKyAgICAgICAgcmV0dXJuICJCYXNlbGluZSBDb21waWxh
dGlvbiAoVE9UQUwpIjsKKyAgICBjYXNlIEpJVENvZGU6OkRGR0pJVDoKKyAgICAgICAgcmV0dXJu
ICJERkcgQ29tcGlsYXRpb24gKFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpGVExKSVQ6Cisg
ICAgICAgIHJldHVybiAiRlRMIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KK30KKwordm9pZCBFdmFsRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNl
bGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIEV2YWxFeGVjdXRhYmxlKiB0aGlzT2Jq
ZWN0ID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVD
VF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOworICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZp
c2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRo
aXNPYmplY3QtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrKTsKKyAgICBpZiAodGhpc09iamVjdC0+
bV9ldmFsQ29kZUJsb2NrKQorICAgICAgICB0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxvY2stPnZp
c2l0V2Vha2x5KHZpc2l0b3IpOworfQorCitKU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6OmNo
ZWNrU3ludGF4KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBQYXJzZXJFcnJvciBlcnJvcjsKKyAg
ICBWTSogdm0gPSAmZXhlYy0+dm0oKTsKKyAgICBKU0dsb2JhbE9iamVjdCogbGV4aWNhbEdsb2Jh
bE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKKyAgICBzdGQ6OnVuaXF1ZV9w
dHI8UHJvZ3JhbU5vZGU+IHByb2dyYW1Ob2RlID0gcGFyc2U8UHJvZ3JhbU5vZGU+KAorICAgICAg
ICB2bSwgbV9zb3VyY2UsIElkZW50aWZpZXIoKSwgSlNQYXJzZXJCdWlsdGluTW9kZTo6Tm90QnVp
bHRpbiwKKyAgICAgICAgSlNQYXJzZXJTdHJpY3RNb2RlOjpOb3RTdHJpY3QsIEpTUGFyc2VyU2Ny
aXB0TW9kZTo6Q2xhc3NpYywgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgU3VwZXJCaW5k
aW5nOjpOb3ROZWVkZWQsIGVycm9yKTsKKyAgICBpZiAocHJvZ3JhbU5vZGUpCisgICAgICAgIHJl
dHVybiAwOworICAgIEFTU0VSVChlcnJvci5pc1ZhbGlkKCkpOworICAgIHJldHVybiBlcnJvci50
b0Vycm9yT2JqZWN0KGxleGljYWxHbG9iYWxPYmplY3QsIG1fc291cmNlKTsKK30KKworSlNPYmpl
Y3QqIFByb2dyYW1FeGVjdXRhYmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYgdm0s
IENhbGxGcmFtZSogY2FsbEZyYW1lLCBKU1Njb3BlKiBzY29wZSkKK3sKKyAgICBSRUxFQVNFX0FT
U0VSVChzY29wZSk7CisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5n
bG9iYWxPYmplY3QoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChnbG9iYWxPYmplY3QpOworICAgIEFT
U0VSVCgmZ2xvYmFsT2JqZWN0LT52bSgpID09ICZ2bSk7CisKKyAgICBKU09iamVjdCogZXhjZXB0
aW9uID0gMDsKKyAgICBVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2Nr
ID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVQcm9ncmFtQ29kZUJsb2NrKGNhbGxGcmFtZSwgdGhpcywg
JmV4Y2VwdGlvbik7CisgICAgaWYgKGV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlv
bjsKKworICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJv
bm1lbnQgPSBnbG9iYWxPYmplY3QtPmdsb2JhbExleGljYWxFbnZpcm9ubWVudCgpOworICAgIGNv
bnN0IFZhcmlhYmxlRW52aXJvbm1lbnQmIHZhcmlhYmxlRGVjbGFyYXRpb25zID0gdW5saW5rZWRD
b2RlQmxvY2stPnZhcmlhYmxlRGVjbGFyYXRpb25zKCk7CisgICAgY29uc3QgVmFyaWFibGVFbnZp
cm9ubWVudCYgbGV4aWNhbERlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5sZXhpY2Fs
RGVjbGFyYXRpb25zKCk7CisgICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBubyB2YXJzL2ds
b2JhbCBwcm9wZXJ0aWVzL2xldC9jb25zdCBjYW4gYmUgZHVwbGljYXRlZCBpbiB0aGUgZ2xvYmFs
IHNjb3BlLgorICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlvbiAxNS4xLjggb2YgdGhlIEVT
NiBzcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2lu
ZGV4Lmh0bWwjc2VjLWdsb2JhbGRlY2xhcmF0aW9uaW5zdGFudGlhdGlvbgorICAgIHsKKyAgICAg
ICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7CisgICAgICAg
IC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gb2YgInZhciIgYW5kICJsZXQiLyJjb25zdCIvImNs
YXNzIgorICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewor
ICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25zLmNvbnRhaW5zKGVudHJ5LmtleSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJp
bmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5
LmdldCgpKSwgIiciKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3
ICJsZXQiLyJjb25zdCIvImNsYXNzIiB3aWxsIHNoYWRvdyBhbnkgcHJlLWV4aXN0aW5nIGdsb2Jh
bCBwcm9wZXJ0eSBuYW1lcywgb3IgInZhciIvImxldCIvImNvbnN0IiB2YXJpYWJsZXMuCisgICAg
ICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93LgorICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaWYgKGds
b2JhbE9iamVjdC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgeworICAgICAg
ICAgICAgICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQganVzdCBSZXN0cmljdGVkR2xvYmFs
UHJvcGVydHkgY2FuJ3QgYmUgc2hhZG93ZWQKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhcnJp
ZWQgb3V0IHNlY3Rpb24gOC4xLjEuNC4xNCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNt
YS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtaGFzcmVzdHJp
Y3RlZGdsb2JhbHByb3BlcnR5CisgICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRl
c2NyaXB0b3I7CisgICAgICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IoZXhlYywgZW50cnkua2V5LmdldCgpLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpICE9IGpzVW5kZWZp
bmVkKCkgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKCkpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUg
ZHVwbGljYXRlIHZhcmlhYmxlIHRoYXQgc2hhZG93cyBhIGdsb2JhbCBwcm9wZXJ0eTogJyIsIFN0
cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3Bl
cnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoVU5MSUtF
TFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRpb25T
aG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Ly8gV2Ugb25seSBhbGxvdyAiY29uc3QiIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgdW5kZXIgdGhp
cyBzZXR0aW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qg
ImxldCIgdmFyaWFibGVzIHRvIGJlIG92ZXJyaWRkZW4gYnkgImNvbnN0IiB2YXJpYWJsZXMuCisg
ICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzQ29uc3RW
YXJpYWJsZShlbnRyeS5rZXkuZ2V0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50
YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxl
OiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAidmFyInMgd2lsbCBzaGFkb3cg
YW55IHByZXZpb3VzICJsZXQiLyJjb25zdCIvImNsYXNzIiBuYW1lcy4KKyAgICAgICAgLy8gSXQn
cyBhbiBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCisgICAgICAgIGlmICghZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZW50
cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxM
ZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpCisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3Ry
aW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5Lmtl
eS5nZXQoKSksICInIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAg
ICBtX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5zZXQodm0sIHRoaXMsIHVubGlua2VkQ29kZUJs
b2NrKTsKKworICAgIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyIG9wdGltaXplcih2bSwgZ2xv
YmFsT2JqZWN0KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBudW1iZXJPZkZ1bmN0aW9ucyA9
IHVubGlua2VkQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgaSA8IG51bWJlck9m
RnVuY3Rpb25zOyArK2kpIHsKKyAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlID0gdW5saW5rZWRDb2RlQmxvY2stPmZ1bmN0aW9uRGVj
bChpKTsKKyAgICAgICAgQVNTRVJUKCF1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgp
LmlzRW1wdHkoKSk7CisgICAgICAgIGdsb2JhbE9iamVjdC0+YWRkRnVuY3Rpb24oY2FsbEZyYW1l
LCB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpKTsKKyAgICAgICAgaWYgKHZtLnR5
cGVQcm9maWxlcigpIHx8IHZtLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkgeworICAgICAgICAgICAg
dm0uZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3Vy
Y2VJRCgpLCAKKyAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+dHlw
ZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCksIAorICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rp
b25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkpOworICAgICAgICB9CisgICAg
fQorCisgICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7CisgICAg
ICAgIEFTU0VSVChlbnRyeS52YWx1ZS5pc1ZhcigpKTsKKyAgICAgICAgZ2xvYmFsT2JqZWN0LT5h
ZGRWYXIoY2FsbEZyYW1lLCBJZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgZW50cnkua2V5LmdldCgp
KSk7CisgICAgfQorCisgICAgeworICAgICAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCog
Z2xvYmFsTGV4aWNhbEVudmlyb25tZW50ID0ganNDYXN0PEpTR2xvYmFsTGV4aWNhbEVudmlyb25t
ZW50Kj4oZ2xvYmFsT2JqZWN0LT5nbG9iYWxTY29wZSgpKTsKKyAgICAgICAgU3ltYm9sVGFibGUq
IHN5bWJvbFRhYmxlID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5zeW1ib2xUYWJsZSgpOwor
ICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJsZS0+bV9sb2NrKTsK
KyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAg
ICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENv
bnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgeworICAg
ICAgICAgICAgICAgIGlmIChzeW1ib2xUYWJsZS0+Y29udGFpbnMobG9ja2VyLCBlbnRyeS5rZXku
Z2V0KCkpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldCA9IHN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3Bl
T2Zmc2V0KGxvY2tlcik7CisgICAgICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IG5ld0VudHJ5KFZh
ck9mZnNldChvZmZzZXQpLCBlbnRyeS52YWx1ZS5pc0NvbnN0KCkgPyBSZWFkT25seSA6IDApOwor
ICAgICAgICAgICAgbmV3RW50cnkucHJlcGFyZVRvV2F0Y2goKTsKKyAgICAgICAgICAgIHN5bWJv
bFRhYmxlLT5hZGQobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCksIG5ld0VudHJ5KTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0ID0gZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5hZGRWYXJpYWJsZXMoMSwganNURFpWYWx1ZSgpKTsKKyAgICAgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKG9mZnNldEZvckFzc2VydCA9PSBvZmZzZXQpOworICAgICAgICB9
CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIFByb2dyYW1FeGVjdXRhYmxlOjp2aXNp
dENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihj
ZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7
CisgICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9y
KTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZFByb2dyYW1Db2Rl
QmxvY2spOworICAgIGlmICh0aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2spCisgICAgICAg
IHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Cit9
CisKK3ZvaWQgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBj
ZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSogdGhpc09iamVjdCA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOwor
ICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBT
Y3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAg
IHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayk7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlRW52aXJvbm1l
bnRTeW1ib2xUYWJsZSk7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVC
bG9jaykKKyAgICAgICAgdGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLT52aXNp
dFdlYWtseSh2aXNpdG9yKTsKK30KKworRnVuY3Rpb25Db2RlQmxvY2sqIEZ1bmN0aW9uRXhlY3V0
YWJsZTo6YmFzZWxpbmVDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQor
eworICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiByZXN1bHQ7CisgICAgaWYgKGtpbmQgPT0gQ29kZUZv
ckNhbGwpCisgICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICBl
bHNlIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsK
KyAgICAgICAgcmVzdWx0ID0gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAgfQor
ICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihyZXN1bHQtPmJhc2VsaW5lQWx0ZXJuYXRpdmUoKSk7Cit9
CisKK3ZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwg
U2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiB0aGlzT2Jq
ZWN0ID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19P
QkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxl
Ojp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0
LT5tX2NvZGVCbG9ja0ZvckNhbGwpCisgICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9y
Q2FsbC0+dmlzaXRXZWFrbHkodmlzaXRvcik7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJs
b2NrRm9yQ29uc3RydWN0KQorICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNvbnN0
cnVjdC0+dmlzaXRXZWFrbHkodmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmpl
Y3QtPm1fdW5saW5rZWRFeGVjdXRhYmxlKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVj
dC0+bV9zaW5nbGV0b25GdW5jdGlvbik7Cit9CisKK0Z1bmN0aW9uRXhlY3V0YWJsZSogRnVuY3Rp
b25FeGVjdXRhYmxlOjpmcm9tR2xvYmFsQ29kZSgKKyAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1l
LCBFeGVjU3RhdGUmIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgCisgICAgSlNPYmpl
Y3QqJiBleGNlcHRpb24sIGludCBvdmVycmlkZUxpbmVOdW1iZXIpCit7CisgICAgVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSA9IAorICAgICAgICBVbmxpbmtl
ZEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCisgICAgICAgICAgICBuYW1lLCBl
eGVjLCBzb3VyY2UsIGV4Y2VwdGlvbiwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsKKyAgICBpZiAoIXVu
bGlua2VkRXhlY3V0YWJsZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4g
dW5saW5rZWRFeGVjdXRhYmxlLT5saW5rKGV4ZWMudm0oKSwgc291cmNlLCBvdmVycmlkZUxpbmVO
dW1iZXIpOworfQorCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorY29uc3QgQ2xhc3NJbmZvIFdl
YkFzc2VtYmx5RXhlY3V0YWJsZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHlFeGVjdXRhYmxlIiwg
JkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoV2ViQXNzZW1i
bHlFeGVjdXRhYmxlKSB9OworCitXZWJBc3NlbWJseUV4ZWN1dGFibGU6OldlYkFzc2VtYmx5RXhl
Y3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBt
b2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwg
dm0ud2ViQXNzZW1ibHlFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1FVEVSU19O
T1RfQ09NUElMRUQsIE5vSW50cmluc2ljKQorICAgICwgbV9zb3VyY2Uoc291cmNlKQorICAgICwg
bV9tb2R1bGUodm0sIHRoaXMsIG1vZHVsZSkKKyAgICAsIG1fZnVuY3Rpb25JbmRleChmdW5jdGlv
bkluZGV4KQoreworICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09
IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6V2ViQXNzZW1ibHkpOworfQorCit2b2lkIFdlYkFz
c2VtYmx5RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nh
c3Q8V2ViQXNzZW1ibHlFeGVjdXRhYmxlKj4oY2VsbCktPldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6
fldlYkFzc2VtYmx5RXhlY3V0YWJsZSgpOworfQorCit2b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJs
ZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQorewor
ICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxXZWJBc3NlbWJs
eUV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNP
YmplY3QsIGluZm8oKSk7CisgICAgRXhlY3V0YWJsZUJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09i
amVjdCwgdmlzaXRvcik7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbCkK
KyAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdlYWtseSh2aXNp
dG9yKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGUpOworfQorI2Vu
ZGlmCisKK3ZvaWQgRXhlY3V0YWJsZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QK
K3sKKyAgICBFeGVjdXRhYmxlQmFzZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0PEV4ZWN1dGFibGVC
YXNlKj4odGhpcyk7CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFi
bGU6OmluZm8oKSkgeworICAgICAgICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRpdmUgPSBqc0Nhc3Q8
TmF0aXZlRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgb3V0LnByaW50KCJOYXRpdmVF
eGVjdXRhYmxlOiIsIFJhd1BvaW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUtPmZ1bmN0
aW9uKCkpKSwgIi8iLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5jb25z
dHJ1Y3RvcigpKSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChjbGFz
c0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRh
YmxlKiBldmFsID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBp
ZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAg
IG91dC5wcmludCgqY29kZUJsb2NrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnBy
aW50KCJFdmFsRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZv
KCkpIHsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8UHJvZ3JhbUV4
ZWN1dGFibGUqPihyZWFsVGhpcyk7CisgICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9
IGV2YWwtPmNvZGVCbG9jaygpKQorICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJpbnQoIlByb2dyYW1FeGVjdXRhYmxlIHcv
byBDb2RlQmxvY2siKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBl
eGVjdXRhYmxlLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2Nr
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCJNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSB3L28gQ29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisg
ICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFi
bGUqPihyZWFsVGhpcyk7CisgICAgaWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29kZUJsb2NrKCkpCisg
ICAgICAgIG91dC5wcmludCgiRnVuY3Rpb25FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAg
ICBlbHNlIHsKKyAgICAgICAgQ29tbWFQcmludGVyIGNvbW1hKCIvIik7CisgICAgICAgIGlmIChm
dW5jdGlvbi0+Y29kZUJsb2NrRm9yQ2FsbCgpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1h
LCAqZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSk7CisgICAgICAgIGlmIChmdW5jdGlvbi0+
Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsICpm
dW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpOworICAgIH0KK30KKworQ29kZUJsb2Nr
SGFzaCBFeGVjdXRhYmxlQmFzZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
IGNvbnN0Cit7CisgICAgaWYgKHRoaXMtPmNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6
OmluZm8oKSkKKyAgICAgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVFeGVjdXRhYmxlKj4o
dGhpcyktPmhhc2hGb3Ioa2luZCk7CisgICAgCisgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBTY3Jp
cHRFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Cit9CisKK0NvZGVCbG9ja0hhc2gg
TmF0aXZlRXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNv
bnN0Cit7CisgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJldHVybiBDb2Rl
QmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2Z1
bmN0aW9uKSkpOworICAgIAorICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0
cnVjdCk7CisgICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJp
dHdpc2VfY2FzdDxzaXplX3Q+KG1fY29uc3RydWN0b3IpKSk7Cit9CisKK0NvZGVCbG9ja0hhc2gg
U2NyaXB0RXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNv
bnN0Cit7CisgICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc291cmNlKCksIGtpbmQpOworfQorCit9
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9OYXRpdmVFeGVjdXRhYmxlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9OYXRpdmVFeGVj
dXRhYmxlLmNwcAkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvTmF0aXZlRXhlY3V0YWJsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDYg
QEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgog
CiAjaW5jbHVkZSAiQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCIKICNpbmNsdWRlICJDb2Rl
QmxvY2suaCIKQEAgLTQwLDY0ICszOSw2IEBACiAKIG5hbWVzcGFjZSBKU0MgewogCi1jb25zdCBD
bGFzc0luZm8gRXhlY3V0YWJsZUJhc2U6OnNfaW5mbyA9IHsgIkV4ZWN1dGFibGUiLCAwLCAwLCBD
UkVBVEVfTUVUSE9EX1RBQkxFKEV4ZWN1dGFibGVCYXNlKSB9OwotCi12b2lkIEV4ZWN1dGFibGVC
YXNlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxFeGVjdXRhYmxl
QmFzZSo+KGNlbGwpLT5FeGVjdXRhYmxlQmFzZTo6fkV4ZWN1dGFibGVCYXNlKCk7Ci19Ci0KLXZv
aWQgRXhlY3V0YWJsZUJhc2U6OmNsZWFyQ29kZSgpCi17Ci0jaWYgRU5BQkxFKEpJVCkKLSAgICBt
X2ppdENvZGVGb3JDYWxsID0gbnVsbHB0cjsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3QgPSBu
dWxscHRyOwotICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1i
bGVyQ29kZVB0cigpOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0g
TWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0jZW5kaWYKLSAgICBtX251bVBhcmFtZXRlcnNGb3JD
YWxsID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotICAgIG1fbnVtUGFyYW1ldGVyc0Zv
ckNvbnN0cnVjdCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKLQotICAgIGlmIChjbGFz
c0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBGdW5jdGlv
bkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhp
cyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ2FsbC5jbGVhcigpOwotICAg
ICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5jbGVhcigpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxl
OjppbmZvKCkpIHsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8
RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJs
b2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2Nr
LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5m
bygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1
dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAg
ICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4
ZWN1dGFibGUtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0
YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBl
eGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgZXhl
Y3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLmNsZWFyKCk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotICAg
IGlmIChjbGFzc0luZm8oKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAg
ICAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8V2ViQXNzZW1i
bHlFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9y
Q2FsbC5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICBBU1NF
UlQoY2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhlY3V0YWJsZTo6aW5mbygpKTsKLX0KLQogY29uc3Qg
Q2xhc3NJbmZvIE5hdGl2ZUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk5hdGl2ZUV4ZWN1dGFibGUi
LCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShOYXRpdmVF
eGVjdXRhYmxlKSB9OwogCiBOYXRpdmVFeGVjdXRhYmxlKiBOYXRpdmVFeGVjdXRhYmxlOjpjcmVh
dGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZlRnVuY3Rpb24g
ZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5hdGl2ZUZ1bmN0
aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJpbmcmIG5hbWUp
CkBAIC0xMzUsNzAwICs3Niw2IEBAIE5hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUo
Vk0mIHYKIHsKIH0KIAotY29uc3QgQ2xhc3NJbmZvIFNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbyA9
IHsgIlNjcmlwdEV4ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRF
X01FVEhPRF9UQUJMRShTY3JpcHRFeGVjdXRhYmxlKSB9OwotCi1TY3JpcHRFeGVjdXRhYmxlOjpT
Y3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSogc3RydWN0dXJlLCBWTSYgdm0sIGNvbnN0IFNvdXJj
ZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBl
IGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxD
b250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUsIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgOiBF
eGVjdXRhYmxlQmFzZSh2bSwgc3RydWN0dXJlLCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQs
IGludHJpbnNpYykKLSAgICAsIG1fZmVhdHVyZXMoaXNJblN0cmljdENvbnRleHQgPyBTdHJpY3RN
b2RlRmVhdHVyZSA6IDApCi0gICAgLCBtX2RpZFRyeVRvRW50ZXJJbkxvb3AoZmFsc2UpCi0gICAg
LCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzKGZhbHNlKQotICAgICwgbV9uZXZlcklubGluZShmYWxz
ZSkKLSAgICAsIG1fbmV2ZXJPcHRpbWl6ZShmYWxzZSkKLSAgICAsIG1fbmV2ZXJGVExPcHRpbWl6
ZShmYWxzZSkKLSAgICAsIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dChpc0luQXJyb3dGdW5jdGlv
bkNvbnRleHQpCi0gICAgLCBtX2NhblVzZU9TUkV4aXRGdXp6aW5nKHRydWUpCi0gICAgLCBtX2Rl
cml2ZWRDb250ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZGVyaXZlZENvbnRleHRUeXBl
KSkKLSAgICAsIG1fZXZhbENvbnRleHRUeXBlKHN0YXRpY19jYXN0PHVuc2lnbmVkPihldmFsQ29u
dGV4dFR5cGUpKQotICAgICwgbV9vdmVycmlkZUxpbmVOdW1iZXIoLTEpCi0gICAgLCBtX2ZpcnN0
TGluZSgtMSkKLSAgICAsIG1fbGFzdExpbmUoLTEpCi0gICAgLCBtX3N0YXJ0Q29sdW1uKFVJTlRf
TUFYKQotICAgICwgbV9lbmRDb2x1bW4oVUlOVF9NQVgpCi0gICAgLCBtX3R5cGVQcm9maWxpbmdT
dGFydE9mZnNldChVSU5UX01BWCkKLSAgICAsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldChVSU5U
X01BWCkKLSAgICAsIG1fc291cmNlKHNvdXJjZSkKLXsKLX0KLQotdm9pZCBTY3JpcHRFeGVjdXRh
YmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxTY3JpcHRFeGVj
dXRhYmxlKj4oY2VsbCktPlNjcmlwdEV4ZWN1dGFibGU6On5TY3JpcHRFeGVjdXRhYmxlKCk7Ci19
Ci0KLXZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFsbENvZGUoQ29kZUJsb2NrKiBjb2RlQmxv
Y2spCi17Ci0gICAgaW5zdGFsbENvZGUoKmNvZGVCbG9jay0+dm0oKSwgY29kZUJsb2NrLCBjb2Rl
QmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lhbGl6YXRpb25LaW5kKCkpOwotfQot
Ci12b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKFZNJiB2bSwgQ29kZUJsb2NrKiBn
ZW5lcmljQ29kZUJsb2NrLCBDb2RlVHlwZSBjb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCBraW5kKQotewotICAgIEFTU0VSVCh2bS5oZWFwLmlzRGVmZXJyZWQoKSk7Ci0gICAgCi0gICAg
aWYgKGdlbmVyaWNDb2RlQmxvY2spCi0gICAgICAgIENPREVCTE9DS19MT0dfRVZFTlQoZ2VuZXJp
Y0NvZGVCbG9jaywgImluc3RhbGxDb2RlIiwgKCkpOwotICAgIAotICAgIENvZGVCbG9jayogb2xk
Q29kZUJsb2NrID0gbnVsbHB0cjsKLSAgICAKLSAgICBzd2l0Y2ggKGNvZGVUeXBlKSB7Ci0gICAg
Y2FzZSBHbG9iYWxDb2RlOiB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFByb2dyYW1Db2Rl
QmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmlj
Q29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxs
KTsKLSAgICAgICAgCi0gICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fcHJvZ3Jh
bUNvZGVCbG9jay5nZXQoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2Nr
LnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotCi0gICAgY2FzZSBNb2R1bGVDb2RlOiB7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7
Ci0gICAgICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0
PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKLQotICAgICAgICBB
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0KLSAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhl
Y3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAgICAgICBleGVjdXRh
YmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2Rl
QmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEV2YWxDb2RlOiB7Ci0g
ICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxl
Kj4odGhpcyk7Ci0gICAgICAgIEV2YWxDb2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0
PEV2YWxDb2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIEFT
U0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgCi0gICAgICAgIG9sZENvZGVCbG9j
ayA9IGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5nZXQoKTsKLSAgICAgICAgZXhlY3V0YWJs
ZS0+bV9ldmFsQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAKLSAgICBjYXNlIEZ1bmN0aW9uQ29kZTogewot
ICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25F
eGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2sg
PSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOwotICAg
ICAgICAKLSAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgIGNhc2UgQ29kZUZvckNhbGw6
Ci0gICAgICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNh
bGwuZ2V0KCk7Ci0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuc2V0
TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgIG9sZENvZGVCbG9jayA9IGV4
ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgICAgICAgICAgZXhl
Y3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3Quc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBj
b2RlQmxvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7
Ci0gICAgfQotICAgIH0KLQotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgQ29kZUZvckNh
bGw6Ci0gICAgICAgIG1faml0Q29kZUZvckNhbGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJp
Y0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0cjsKLSAgICAgICAgbV9qaXRDb2RlRm9yQ2Fs
bFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0gICAgICAgIG1fbnVt
UGFyYW1ldGVyc0ZvckNhbGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+
bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgIG1faml0Q29kZUZvckNv
bnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkg
OiBudWxscHRyOwotICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9
IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOwotICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDb25z
dHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVy
cygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotICAgICAgICBicmVhazsKLSAgICB9
Ci0KLSAgICBpZiAoZ2VuZXJpY0NvZGVCbG9jaykgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChn
ZW5lcmljQ29kZUJsb2NrLT5vd25lckV4ZWN1dGFibGUoKSA9PSB0aGlzKTsKLSAgICAgICAgUkVM
RUFTRV9BU1NFUlQoSklUQ29kZTo6aXNFeGVjdXRhYmxlU2NyaXB0KGdlbmVyaWNDb2RlQmxvY2st
PmppdFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VPU1Io
KSkKLSAgICAgICAgICAgIGRhdGFMb2coIkluc3RhbGxpbmcgIiwgKmdlbmVyaWNDb2RlQmxvY2ss
ICJcbiIpOwotICAgICAgICAKLSAgICAgICAgaWYgKHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlcikK
LSAgICAgICAgICAgIHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlci0+ZW5zdXJlQnl0ZWNvZGVzRm9y
KGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAgICAKLSAgICAgICAgaWYgKERlYnVnZ2VyKiBkZWJ1
Z2dlciA9IGdlbmVyaWNDb2RlQmxvY2stPmdsb2JhbE9iamVjdCgpLT5kZWJ1Z2dlcigpKQotICAg
ICAgICAgICAgZGVidWdnZXItPnJlZ2lzdGVyQ29kZUJsb2NrKGdlbmVyaWNDb2RlQmxvY2spOwot
ICAgIH0KLQotICAgIGlmIChvbGRDb2RlQmxvY2spCi0gICAgICAgIG9sZENvZGVCbG9jay0+dW5s
aW5rSW5jb21pbmdDYWxscygpOwotCi0gICAgdm0uaGVhcC53cml0ZUJhcnJpZXIodGhpcyk7Ci19
Ci0KLUNvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3Q29kZUJsb2NrRm9yKAotICAgIENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUq
IHNjb3BlLCBKU09iamVjdComIGV4Y2VwdGlvbikKLXsKLSAgICBWTSogdm0gPSBzY29wZS0+dm0o
KTsKLSAgICBhdXRvIHRocm93U2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKCp2bSk7Ci0KLSAg
ICBBU1NFUlQodm0tPmhlYXAuaXNEZWZlcnJlZCgpKTsKLSAgICBBU1NFUlQoc3RhcnRDb2x1bW4o
KSAhPSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVuZENvbHVtbigpICE9IFVJTlRfTUFYKTsKLQot
ICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAg
IEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhp
cyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAg
ICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrKTsKLSAgICAgICAg
UkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAgICAgcmV0dXJuIEV2YWxDb2RlQmxvY2s6
OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5r
ZWRFdmFsQ29kZUJsb2NrLmdldCgpLCBzY29wZSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNv
dXJjZSgpLnByb3ZpZGVyKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0g
UHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBS
RUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgUkVMRUFTRV9BU1NF
UlQoIWV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgICAgIFJFTEVBU0VfQVNT
RVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJldHVybiBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUo
dm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3Jh
bUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2Uo
KS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKLSAgICB9
Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8o
KSkgewotICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2Fz
dDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VS
VChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFi
bGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFm
dW5jdGlvbik7Ci0gICAgICAgIHJldHVybiBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUo
dm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxl
UHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAgICAgICAgICBleGVjdXRhYmxlLT5z
b3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsK
LSAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1
dGFibGU6OmluZm8oKSk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb24pOwotICAgIEZ1bmN0
aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0
aGlzKTsKLSAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQp
KTsKLSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVj
dCgpOwotICAgIFBhcnNlckVycm9yIGVycm9yOwotICAgIERlYnVnZ2VyTW9kZSBkZWJ1Z2dlck1v
ZGUgPSBnbG9iYWxPYmplY3QtPmhhc0ludGVyYWN0aXZlRGVidWdnZXIoKSA/IERlYnVnZ2VyT24g
OiBEZWJ1Z2dlck9mZjsKLSAgICBVbmxpbmtlZEZ1bmN0aW9uQ29kZUJsb2NrKiB1bmxpbmtlZENv
ZGVCbG9jayA9IAotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+dW5s
aW5rZWRDb2RlQmxvY2tGb3IoCi0gICAgICAgICAgICAqdm0sIGV4ZWN1dGFibGUtPm1fc291cmNl
LCBraW5kLCBkZWJ1Z2dlck1vZGUsIGVycm9yLCAKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnBh
cnNlTW9kZSgpKTsKLSAgICByZWNvcmRQYXJzZSgKLSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxp
bmtlZEV4ZWN1dGFibGUtPmZlYXR1cmVzKCksIAotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlu
a2VkRXhlY3V0YWJsZS0+aGFzQ2FwdHVyZWRWYXJpYWJsZXMoKSwgZmlyc3RMaW5lKCksIAotICAg
ICAgICBsYXN0TGluZSgpLCBzdGFydENvbHVtbigpLCBlbmRDb2x1bW4oKSk7IAotICAgIGlmICgh
dW5saW5rZWRDb2RlQmxvY2spIHsKLSAgICAgICAgZXhjZXB0aW9uID0gdGhyb3dFeGNlcHRpb24o
Ci0gICAgICAgICAgICBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgdGhyb3dTY29wZSwKLSAg
ICAgICAgICAgIGVycm9yLnRvRXJyb3JPYmplY3QoZ2xvYmFsT2JqZWN0LCBleGVjdXRhYmxlLT5t
X3NvdXJjZSkpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBTb3VyY2VQ
cm92aWRlciogcHJvdmlkZXIgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpOwotICAg
IHVuc2lnbmVkIHNvdXJjZU9mZnNldCA9IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0T2Zmc2V0
KCk7Ci0gICAgdW5zaWduZWQgc3RhcnRDb2x1bW4gPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFy
dENvbHVtbigpOwotCi0gICAgcmV0dXJuIEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0sCi0g
ICAgICAgIGV4ZWN1dGFibGUsIHVubGlua2VkQ29kZUJsb2NrLCBzY29wZSwgcHJvdmlkZXIsIHNv
dXJjZU9mZnNldCwgc3RhcnRDb2x1bW4pOwotfQotCi1Db2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFi
bGU6Om5ld1JlcGxhY2VtZW50Q29kZUJsb2NrRm9yKAotICAgIENvZGVTcGVjaWFsaXphdGlvbktp
bmQga2luZCkKLXsKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8o
KSkgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAg
ICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0
aGlzKTsKLSAgICAgICAgRXZhbENvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxFdmFs
Q29kZUJsb2NrKj4oCi0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2stPmJh
c2VsaW5lVmVyc2lvbigpKTsKLSAgICAgICAgRXZhbENvZGVCbG9jayogcmVzdWx0ID0gRXZhbENv
ZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRC
bG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwg
YmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBpZiAo
Y2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBSRUxF
QVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAg
ICAgUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJs
b2NrKj4oCi0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2stPmJhc2Vs
aW5lVmVyc2lvbigpKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gUHJvZ3Jh
bUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJz
ZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0o
KSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChj
bGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAg
IFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSo+KHRoaXMpOwotICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0
YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPigKLSAgICAgICAgICAgIGV4ZWN1dGFi
bGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOwotICAgICAg
ICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiByZXN1bHQgPSBNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
OjpjcmVhdGUodm0oKSwKLSAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAq
YmFzZWxpbmUpOwotICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGlu
ZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgUkVMRUFTRV9BU1NFUlQo
Y2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOwotICAgIEZ1bmN0aW9u
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlz
KTsKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxGdW5jdGlv
bkNvZGVCbG9jayo+KAotICAgICAgICBleGVjdXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCktPmJh
c2VsaW5lVmVyc2lvbigpKTsKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0ID0gRnVuY3Rp
b25Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRC
bG9jaywgKmJhc2VsaW5lKTsKLSAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNl
bGluZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBMTEludChW
TSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQotewotICAgIExMSW50OjpzZXRFbnRyeXBvaW50
KHZtLCBjb2RlQmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cEpJVChWTSYgdm0sIENvZGVC
bG9jayogY29kZUJsb2NrKQotewotI2lmIEVOQUJMRShKSVQpCi0gICAgQ29tcGlsYXRpb25SZXN1
bHQgcmVzdWx0ID0gSklUOjpjb21waWxlKCZ2bSwgY29kZUJsb2NrLCBKSVRDb21waWxhdGlvbk11
c3RTdWNjZWVkKTsKLSAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQgPT0gQ29tcGlsYXRpb25TdWNj
ZXNzZnVsKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHZtKTsKLSAgICBVTlVTRURfUEFSQU0o
Y29kZUJsb2NrKTsKLSAgICBVTlJFQUNIQUJMRV9GT1JfUExBVEZPUk0oKTsKLSNlbmRpZgotfQot
Ci1KU09iamVjdCogU2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoCi0g
ICAgVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQotewotICAg
IERlZmVyR0NGb3JBV2hpbGUgZGVmZXJHQyh2bS5oZWFwKTsKLQotICAgIGlmICh2bS5nZXRBbmRD
bGVhckZhaWxOZXh0TmV3Q29kZUJsb2NrKCkpCi0gICAgICAgIHJldHVybiBjcmVhdGVFcnJvcihz
Y29wZS0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMoKSwgQVNDSUlMaXRlcmFsKCJGb3JjZWQg
RmFpbHVyZSIpKTsKLQotICAgIEpTT2JqZWN0KiBleGNlcHRpb24gPSAwOwotICAgIENvZGVCbG9j
ayogY29kZUJsb2NrID0gbmV3Q29kZUJsb2NrRm9yKGtpbmQsIGZ1bmN0aW9uLCBzY29wZSwgZXhj
ZXB0aW9uKTsKLSAgICByZXN1bHRDb2RlQmxvY2sgPSBjb2RlQmxvY2s7Ci0gICAgaWYgKCFjb2Rl
QmxvY2spIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoZXhjZXB0aW9uKTsKLSAgICAgICAgcmV0
dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKE9wdGlvbnM6OnZhbGlkYXRlQnl0
ZWNvZGUoKSkKLSAgICAgICAgY29kZUJsb2NrLT52YWxpZGF0ZSgpOwotICAgIAotICAgIGlmIChP
cHRpb25zOjp1c2VMTEludCgpKQotICAgICAgICBzZXR1cExMSW50KHZtLCBjb2RlQmxvY2spOwot
ICAgIGVsc2UKLSAgICAgICAgc2V0dXBKSVQodm0sIGNvZGVCbG9jayk7Ci0gICAgCi0gICAgaW5z
dGFsbENvZGUodm0sIGNvZGVCbG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2st
PnNwZWNpYWxpemF0aW9uS2luZCgpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3Qg
Q2xhc3NJbmZvIEV2YWxFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJFdmFsRXhlY3V0YWJsZSIsICZT
Y3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRXZhbEV4ZWN1
dGFibGUpIH07Ci0KLUV2YWxFeGVjdXRhYmxlKiBFdmFsRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNT
dGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGlzSW5TdHJpY3RDb250
ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dG
dW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUsIGNvbnN0IFZh
cmlhYmxlRW52aXJvbm1lbnQqIHZhcmlhYmxlc1VuZGVyVERaKQotewotICAgIFZNJiB2bSA9IGV4
ZWMtPnZtKCk7Ci0gICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwotCi0g
ICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmpl
Y3QoKTsKLSAgICBpZiAoIWdsb2JhbE9iamVjdC0+ZXZhbEVuYWJsZWQoKSkgewotICAgICAgICB0
aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3JlYXRlRXZhbEVycm9yKGV4ZWMsIGdsb2JhbE9i
amVjdC0+ZXZhbERpc2FibGVkRXJyb3JNZXNzYWdlKCkpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotCi0gICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFs
bG9jYXRlQ2VsbDxFdmFsRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIEV2YWxFeGVjdXRhYmxl
KGV4ZWMsIHNvdXJjZSwgaXNJblN0cmljdENvbnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNB
cnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRleHRUeXBlKTsKLSAgICBleGVjdXRhYmxlLT5m
aW5pc2hDcmVhdGlvbih2bSk7Ci0KLSAgICBVbmxpbmtlZEV2YWxDb2RlQmxvY2sqIHVubGlua2Vk
RXZhbENvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZUV2YWxDb2RlQmxvY2soZXhlYywgZXhlY3V0
YWJsZSwgdmFyaWFibGVzVW5kZXJURFopOwotICAgIGlmICghdW5saW5rZWRFdmFsQ29kZSkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9j
ay5zZXQodm0sIGV4ZWN1dGFibGUsIHVubGlua2VkRXZhbENvZGUpOwotCi0gICAgcmV0dXJuIGV4
ZWN1dGFibGU7Ci19Ci0KLUV2YWxFeGVjdXRhYmxlOjpFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUq
IGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpblN0cmljdENvbnRleHQsIERl
cml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9u
Q29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSkKLSAgICA6IFNjcmlwdEV4
ZWN1dGFibGUoZXhlYy0+dm0oKS5ldmFsRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+
dm0oKSwgc291cmNlLCBpblN0cmljdENvbnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJv
d0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRleHRUeXBlLCBOb0ludHJpbnNpYykKLXsKLSAgICBB
U1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNv
dXJjZVR5cGU6OlByb2dyYW0pOwotfQotCi12b2lkIEV2YWxFeGVjdXRhYmxlOjpkZXN0cm95KEpT
Q2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpLT5F
dmFsRXhlY3V0YWJsZTo6fkV2YWxFeGVjdXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBQ
cm9ncmFtRXhlY3V0YWJsZTo6c19pbmZvID0geyAiUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0
RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFByb2dyYW1FeGVjdXRh
YmxlKSB9OwotCi1Qcm9ncmFtRXhlY3V0YWJsZTo6UHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRl
KiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi0gICAgOiBTY3JpcHRFeGVjdXRhYmxl
KGV4ZWMtPnZtKCkucHJvZ3JhbUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCks
IHNvdXJjZSwgZmFsc2UsIERlcml2ZWRDb250ZXh0VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250
ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5zaWMpCi17Ci0gICAgQVNTRVJUKHNvdXJjZS5wcm92aWRl
cigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsK
LSAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IDA7Ci0gICAgbV90eXBlUHJvZmlsaW5n
RW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0aCgpIC0gMTsKLSAgICBpZiAoZXhlYy0+dm0oKS50eXBl
UHJvZmlsZXIoKSB8fCBleGVjLT52bSgpLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkKLSAgICAgICAg
ZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJh
bmdlKHNvdXJjZUlEKCksIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxp
bmdFbmRPZmZzZXQpOwotfQotCi12b2lkIFByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2Vs
bCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Q
cm9ncmFtRXhlY3V0YWJsZTo6flByb2dyYW1FeGVjdXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNz
SW5mbyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6c19pbmZvID0geyAiTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RB
QkxFKE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKSB9OwotCi1Nb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZTo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VD
b2RlJiBzb3VyY2UpCi0gICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkubW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2Us
IERlcml2ZWRDb250ZXh0VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwg
Tm9JbnRyaW5zaWMpCi17Ci0gICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBl
KCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpNb2R1bGUpOwotICAgIG1fdHlwZVByb2Zp
bGluZ1N0YXJ0T2Zmc2V0ID0gMDsKLSAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3Vy
Y2UubGVuZ3RoKCkgLSAxOwotICAgIGlmIChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4
ZWMtPnZtKCkuY29udHJvbEZsb3dQcm9maWxlcigpKQotICAgICAgICBleGVjLT52bSgpLmZ1bmN0
aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwg
bV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Ci19
Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6Y3Jl
YXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlKQotewotICAgIEpT
R2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7
Ci0gICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGws
IGFsbG9jYXRlQ2VsbDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSk7Ci0gICAgZXhlY3V0YWJsZS0+Zmlu
aXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7Ci0KLSAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2sqIHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZU1v
ZHVsZVByb2dyYW1Db2RlQmxvY2soZXhlYywgZXhlY3V0YWJsZSk7Ci0gICAgaWYgKCF1bmxpbmtl
ZE1vZHVsZVByb2dyYW1Db2RlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBleGVjdXRh
YmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5zZXQoZXhlYy0+dm0oKSwgZXhl
Y3V0YWJsZSwgdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZSk7Ci0KLSAgICBleGVjdXRhYmxlLT5t
X21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUs
IGpzQ2FzdDxTeW1ib2xUYWJsZSo+KHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUtPmNvbnN0YW50
UmVnaXN0ZXIodW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+bW9kdWxlRW52aXJvbm1lbnRTeW1i
b2xUYWJsZUNvbnN0YW50UmVnaXN0ZXJPZmZzZXQoKSkuZ2V0KCkpLT5jbG9uZVNjb3BlUGFydChl
eGVjLT52bSgpKSk7Ci0KLSAgICByZXR1cm4gZXhlY3V0YWJsZTsKLX0KLQotdm9pZCBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nh
c3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKS0+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGU6On5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgpOwotfQotCi1jb25zdCBDbGFzc0luZm8gRnVu
Y3Rpb25FeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJGdW5jdGlvbkV4ZWN1dGFibGUiLCAmU2NyaXB0
RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEZ1bmN0aW9uRXhlY3V0
YWJsZSkgfTsKLQotRnVuY3Rpb25FeGVjdXRhYmxlOjpGdW5jdGlvbkV4ZWN1dGFibGUoVk0mIHZt
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1
bmxpbmtlZEV4ZWN1dGFibGUsIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUs
IHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRy
aW5zaWMpCi0gICAgOiBTY3JpcHRFeGVjdXRhYmxlKHZtLmZ1bmN0aW9uRXhlY3V0YWJsZVN0cnVj
dHVyZS5nZXQoKSwgdm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLT5pc0luU3RyaWN0Q29u
dGV4dCgpLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpLCBmYWxzZSwg
RXZhbENvbnRleHRUeXBlOjpOb25lLCBpbnRyaW5zaWMpCi0gICAgLCBtX3VubGlua2VkRXhlY3V0
YWJsZSh2bSwgdGhpcywgdW5saW5rZWRFeGVjdXRhYmxlKQotewotICAgIFJFTEVBU0VfQVNTRVJU
KCFzb3VyY2UuaXNOdWxsKCkpOwotICAgIEFTU0VSVChzb3VyY2UubGVuZ3RoKCkpOwotICAgIG1f
Zmlyc3RMaW5lID0gZmlyc3RMaW5lOwotICAgIG1fbGFzdExpbmUgPSBsYXN0TGluZTsKLSAgICBB
U1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAgIEFTU0VSVChlbmRDb2x1bW4gIT0g
VUlOVF9NQVgpOwotICAgIG1fc3RhcnRDb2x1bW4gPSBzdGFydENvbHVtbjsKLSAgICBtX2VuZENv
bHVtbiA9IGVuZENvbHVtbjsKLSAgICBtX3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHVubGlua2Vk
RXhlY3V0YWJsZS0+cGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCk7Ci0gICAgbV90eXBlUHJvZmlsaW5n
U3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNl
dCgpOwotICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+
dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpOwotfQotCi12b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6
ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQotewotICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsK
LSAgICBtX3NpbmdsZXRvbkZ1bmN0aW9uLnNldCh2bSwgdGhpcywgSW5mZXJyZWRWYWx1ZTo6Y3Jl
YXRlKHZtKSk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCog
Y2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKS0+RnVu
Y3Rpb25FeGVjdXRhYmxlOjp+RnVuY3Rpb25FeGVjdXRhYmxlKCk7Ci19Ci0KLWlubGluZSBjb25z
dCBjaGFyKiBzYW1wbGluZ0Rlc2NyaXB0aW9uKEpJVENvZGU6OkpJVFR5cGUgaml0VHlwZSkKLXsK
LSAgICBzd2l0Y2ggKGppdFR5cGUpIHsKLSAgICBjYXNlIEpJVENvZGU6OkludGVycHJldGVyVGh1
bms6Ci0gICAgICAgIHJldHVybiAiSW50ZXJwcmV0ZXIgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0g
ICAgY2FzZSBKSVRDb2RlOjpCYXNlbGluZUpJVDoKLSAgICAgICAgcmV0dXJuICJCYXNlbGluZSBD
b21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkRGR0pJVDoKLSAgICAgICAg
cmV0dXJuICJERkcgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgY2FzZSBKSVRDb2RlOjpGVExK
SVQ6Ci0gICAgICAgIHJldHVybiAiRlRMIENvbXBpbGF0aW9uIChUT1RBTCkiOwotICAgIGRlZmF1
bHQ6Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLX0KLQotdm9pZCBFdmFsRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0Nl
bGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIEV2YWxFeGVjdXRhYmxlKiB0
aGlzT2JqZWN0ID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dD
X09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFi
bGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBl
bmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrKTsKLSAgICBpZiAodGhpc09i
amVjdC0+bV9ldmFsQ29kZUJsb2NrKQotICAgICAgICB0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxv
Y2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotfQotCi1KU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFi
bGU6OmNoZWNrU3ludGF4KEV4ZWNTdGF0ZSogZXhlYykKLXsKLSAgICBQYXJzZXJFcnJvciBlcnJv
cjsKLSAgICBWTSogdm0gPSAmZXhlYy0+dm0oKTsKLSAgICBKU0dsb2JhbE9iamVjdCogbGV4aWNh
bEdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBzdGQ6OnVu
aXF1ZV9wdHI8UHJvZ3JhbU5vZGU+IHByb2dyYW1Ob2RlID0gcGFyc2U8UHJvZ3JhbU5vZGU+KAot
ICAgICAgICB2bSwgbV9zb3VyY2UsIElkZW50aWZpZXIoKSwgSlNQYXJzZXJCdWlsdGluTW9kZTo6
Tm90QnVpbHRpbiwKLSAgICAgICAgSlNQYXJzZXJTdHJpY3RNb2RlOjpOb3RTdHJpY3QsIEpTUGFy
c2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgU3Vw
ZXJCaW5kaW5nOjpOb3ROZWVkZWQsIGVycm9yKTsKLSAgICBpZiAocHJvZ3JhbU5vZGUpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIEFTU0VSVChlcnJvci5pc1ZhbGlkKCkpOwotICAgIHJldHVybiBl
cnJvci50b0Vycm9yT2JqZWN0KGxleGljYWxHbG9iYWxPYmplY3QsIG1fc291cmNlKTsKLX0KLQot
SlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhW
TSYgdm0sIENhbGxGcmFtZSogY2FsbEZyYW1lLCBKU1Njb3BlKiBzY29wZSkKLXsKLSAgICBSRUxF
QVNFX0FTU0VSVChzY29wZSk7Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNj
b3BlLT5nbG9iYWxPYmplY3QoKTsKLSAgICBSRUxFQVNFX0FTU0VSVChnbG9iYWxPYmplY3QpOwot
ICAgIEFTU0VSVCgmZ2xvYmFsT2JqZWN0LT52bSgpID09ICZ2bSk7Ci0KLSAgICBKU09iamVjdCog
ZXhjZXB0aW9uID0gMDsKLSAgICBVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkQ29k
ZUJsb2NrID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVQcm9ncmFtQ29kZUJsb2NrKGNhbGxGcmFtZSwg
dGhpcywgJmV4Y2VwdGlvbik7Ci0gICAgaWYgKGV4Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuIGV4
Y2VwdGlvbjsKLQotICAgIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2Fs
RW52aXJvbm1lbnQgPSBnbG9iYWxPYmplY3QtPmdsb2JhbExleGljYWxFbnZpcm9ubWVudCgpOwot
ICAgIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQmIHZhcmlhYmxlRGVjbGFyYXRpb25zID0gdW5s
aW5rZWRDb2RlQmxvY2stPnZhcmlhYmxlRGVjbGFyYXRpb25zKCk7Ci0gICAgY29uc3QgVmFyaWFi
bGVFbnZpcm9ubWVudCYgbGV4aWNhbERlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5s
ZXhpY2FsRGVjbGFyYXRpb25zKCk7Ci0gICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBubyB2
YXJzL2dsb2JhbCBwcm9wZXJ0aWVzL2xldC9jb25zdCBjYW4gYmUgZHVwbGljYXRlZCBpbiB0aGUg
Z2xvYmFsIHNjb3BlLgotICAgIC8vIFRoaXMgY2FycmllZCBvdXQgc2VjdGlvbiAxNS4xLjggb2Yg
dGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIv
Ni4wL2luZGV4Lmh0bWwjc2VjLWdsb2JhbGRlY2xhcmF0aW9uaW5zdGFudGlhdGlvbgotICAgIHsK
LSAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7Ci0g
ICAgICAgIC8vIENoZWNrIGZvciBpbnRlcnNlY3Rpb24gb2YgInZhciIgYW5kICJsZXQiLyJjb25z
dCIvImNsYXNzIgotICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9u
cykgewotICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25zLmNvbnRhaW5zKGVudHJ5
LmtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1h
a2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50
cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBpZiBh
bnkgbmV3ICJsZXQiLyJjb25zdCIvImNsYXNzIiB3aWxsIHNoYWRvdyBhbnkgcHJlLWV4aXN0aW5n
IGdsb2JhbCBwcm9wZXJ0eSBuYW1lcywgb3IgInZhciIvImxldCIvImNvbnN0IiB2YXJpYWJsZXMu
Ci0gICAgICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93LgotICAgICAg
ICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAg
aWYgKGdsb2JhbE9iamVjdC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgewot
ICAgICAgICAgICAgICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQganVzdCBSZXN0cmljdGVk
R2xvYmFsUHJvcGVydHkgY2FuJ3QgYmUgc2hhZG93ZWQKLSAgICAgICAgICAgICAgICAvLyBUaGlz
IGNhcnJpZWQgb3V0IHNlY3Rpb24gOC4xLjEuNC4xNCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93
d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtaGFz
cmVzdHJpY3RlZGdsb2JhbHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlw
dG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nZXRPd25Qcm9w
ZXJ0eURlc2NyaXB0b3IoZXhlYywgZW50cnkua2V5LmdldCgpLCBkZXNjcmlwdG9yKTsKLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpICE9IGpz
VW5kZWZpbmVkKCkgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKCkpCi0gICAgICAgICAgICAg
ICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBj
cmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlIHRoYXQgc2hhZG93cyBhIGdsb2JhbCBwcm9wZXJ0eTog
JyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhh
c1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAo
VU5MSUtFTFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFy
YXRpb25TaG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgLy8gV2Ugb25seSBhbGxvdyAiY29uc3QiIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgdW5k
ZXIgdGhpcyBzZXR0aW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2Ug
ZG9uJ3QgImxldCIgdmFyaWFibGVzIHRvIGJlIG92ZXJyaWRkZW4gYnkgImNvbnN0IiB2YXJpYWJs
ZXMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlz
Q29uc3RWYXJpYWJsZShlbnRyeS5rZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjcmVh
dGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZh
cmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAidmFyInMgd2lsbCBz
aGFkb3cgYW55IHByZXZpb3VzICJsZXQiLyJjb25zdCIvImNsYXNzIiBuYW1lcy4KLSAgICAgICAg
Ly8gSXQncyBhbiBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAgICAgIGlmICghZ2xv
YmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0
byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgIGlmIChn
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQo
KSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBt
YWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVu
dHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
Ci0KLSAgICBtX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5zZXQodm0sIHRoaXMsIHVubGlua2Vk
Q29kZUJsb2NrKTsKLQotICAgIEJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyIG9wdGltaXplcih2
bSwgZ2xvYmFsT2JqZWN0KTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBudW1iZXJPZkZ1bmN0
aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgaSA8IG51
bWJlck9mRnVuY3Rpb25zOyArK2kpIHsKLSAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFi
bGUqIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlID0gdW5saW5rZWRDb2RlQmxvY2stPmZ1bmN0
aW9uRGVjbChpKTsKLSAgICAgICAgQVNTRVJUKCF1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+
bmFtZSgpLmlzRW1wdHkoKSk7Ci0gICAgICAgIGdsb2JhbE9iamVjdC0+YWRkRnVuY3Rpb24oY2Fs
bEZyYW1lLCB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpKTsKLSAgICAgICAgaWYg
KHZtLnR5cGVQcm9maWxlcigpIHx8IHZtLmNvbnRyb2xGbG93UHJvZmlsZXIoKSkgewotICAgICAg
ICAgICAgdm0uZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5n
ZShzb3VyY2VJRCgpLCAKLSAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJs
ZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCksIAotICAgICAgICAgICAgICAgIHVubGlua2Vk
RnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkpOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7
Ci0gICAgICAgIEFTU0VSVChlbnRyeS52YWx1ZS5pc1ZhcigpKTsKLSAgICAgICAgZ2xvYmFsT2Jq
ZWN0LT5hZGRWYXIoY2FsbEZyYW1lLCBJZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgZW50cnkua2V5
LmdldCgpKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBKU0dsb2JhbExleGljYWxFbnZpcm9u
bWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50ID0ganNDYXN0PEpTR2xvYmFsTGV4aWNhbEVu
dmlyb25tZW50Kj4oZ2xvYmFsT2JqZWN0LT5nbG9iYWxTY29wZSgpKTsKLSAgICAgICAgU3ltYm9s
VGFibGUqIHN5bWJvbFRhYmxlID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5zeW1ib2xUYWJs
ZSgpOwotICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJsZS0+bV9s
b2NrKTsKLSAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsK
LSAgICAgICAgICAgIGlmIChVTkxJS0VMWShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmds
b2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkg
ewotICAgICAgICAgICAgICAgIGlmIChzeW1ib2xUYWJsZS0+Y29udGFpbnMobG9ja2VyLCBlbnRy
eS5rZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldCA9IHN5bWJvbFRhYmxlLT50YWtlTmV4
dFNjb3BlT2Zmc2V0KGxvY2tlcik7Ci0gICAgICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IG5ld0Vu
dHJ5KFZhck9mZnNldChvZmZzZXQpLCBlbnRyeS52YWx1ZS5pc0NvbnN0KCkgPyBSZWFkT25seSA6
IDApOwotICAgICAgICAgICAgbmV3RW50cnkucHJlcGFyZVRvV2F0Y2goKTsKLSAgICAgICAgICAg
IHN5bWJvbFRhYmxlLT5hZGQobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCksIG5ld0VudHJ5KTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0ID0gZ2xv
YmFsTGV4aWNhbEVudmlyb25tZW50LT5hZGRWYXJpYWJsZXMoMSwganNURFpWYWx1ZSgpKTsKLSAg
ICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG9mZnNldEZvckFzc2VydCA9PSBvZmZzZXQpOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFByb2dyYW1FeGVjdXRhYmxl
Ojp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0g
ICAgUHJvZ3JhbUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFi
bGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGlu
Zm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2
aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZFByb2dy
YW1Db2RlQmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2spCi0g
ICAgICAgIHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRv
cik7Ci19Ci0KLXZvaWQgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlND
ZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAgICBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNl
bGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsK
LSAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3Ip
OwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jayk7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlRW52
aXJvbm1lbnRTeW1ib2xUYWJsZSk7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jaykKLSAgICAgICAgdGhpc09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
LT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLX0KLQotRnVuY3Rpb25Db2RlQmxvY2sqIEZ1bmN0aW9u
RXhlY3V0YWJsZTo6YmFzZWxpbmVDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKQotewotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiByZXN1bHQ7Ci0gICAgaWYgKGtpbmQgPT0g
Q29kZUZvckNhbGwpCi0gICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsK
LSAgICBlbHNlIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3Ry
dWN0KTsKLSAgICAgICAgcmVzdWx0ID0gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0g
ICAgfQotICAgIGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihyZXN1bHQtPmJhc2VsaW5lQWx0ZXJuYXRpdmUo
KSk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCog
Y2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiB0
aGlzT2JqZWN0ID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpOwotICAgIEFTU0VS
VF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBTY3JpcHRFeGVj
dXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotICAgIGlmICh0aGlz
T2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCi0gICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJs
b2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0KQotICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0Zv
ckNvbnN0cnVjdC0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRo
aXNPYmplY3QtPm1fdW5saW5rZWRFeGVjdXRhYmxlKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhp
c09iamVjdC0+bV9zaW5nbGV0b25GdW5jdGlvbik7Ci19Ci0KLUZ1bmN0aW9uRXhlY3V0YWJsZSog
RnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xvYmFsQ29kZSgKLSAgICBjb25zdCBJZGVudGlmaWVy
JiBuYW1lLCBFeGVjU3RhdGUmIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgCi0gICAg
SlNPYmplY3QqJiBleGNlcHRpb24sIGludCBvdmVycmlkZUxpbmVOdW1iZXIpCi17Ci0gICAgVW5s
aW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSA9IAotICAgICAgICBV
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCi0gICAgICAgICAgICBu
YW1lLCBleGVjLCBzb3VyY2UsIGV4Y2VwdGlvbiwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsKLSAgICBp
ZiAoIXVubGlua2VkRXhlY3V0YWJsZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBy
ZXR1cm4gdW5saW5rZWRFeGVjdXRhYmxlLT5saW5rKGV4ZWMudm0oKSwgc291cmNlLCBvdmVycmlk
ZUxpbmVOdW1iZXIpOwotfQotCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotY29uc3QgQ2xhc3NJ
bmZvIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHlFeGVjdXRh
YmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoV2Vi
QXNzZW1ibHlFeGVjdXRhYmxlKSB9OwotCi1XZWJBc3NlbWJseUV4ZWN1dGFibGU6OldlYkFzc2Vt
Ymx5RXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9k
dWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpCi0gICAgOiBFeGVjdXRhYmxlQmFz
ZSh2bSwgdm0ud2ViQXNzZW1ibHlFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1F
VEVSU19OT1RfQ09NUElMRUQsIE5vSW50cmluc2ljKQotICAgICwgbV9zb3VyY2Uoc291cmNlKQot
ICAgICwgbV9tb2R1bGUodm0sIHRoaXMsIG1vZHVsZSkKLSAgICAsIG1fZnVuY3Rpb25JbmRleChm
dW5jdGlvbkluZGV4KQotewotICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlw
ZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6V2ViQXNzZW1ibHkpOwotfQotCi12b2lk
IFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3Rh
dGljX2Nhc3Q8V2ViQXNzZW1ibHlFeGVjdXRhYmxlKj4oY2VsbCktPldlYkFzc2VtYmx5RXhlY3V0
YWJsZTo6fldlYkFzc2VtYmx5RXhlY3V0YWJsZSgpOwotfQotCi12b2lkIFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9y
KQotewotICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxXZWJB
c3NlbWJseUV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRT
KHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgRXhlY3V0YWJsZUJhc2U6OnZpc2l0Q2hpbGRyZW4o
dGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9y
Q2FsbCkKLSAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdlYWts
eSh2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGUpOwot
fQotI2VuZGlmCi0KLXZvaWQgRXhlY3V0YWJsZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKLXsKLSAgICBFeGVjdXRhYmxlQmFzZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0PEV4ZWN1
dGFibGVCYXNlKj4odGhpcyk7Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4
ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRpdmUgPSBq
c0Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgb3V0LnByaW50KCJO
YXRpdmVFeGVjdXRhYmxlOiIsIFJhd1BvaW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUt
PmZ1bmN0aW9uKCkpKSwgIi8iLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZl
LT5jb25zdHJ1Y3RvcigpKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlm
IChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEV2YWxF
eGVjdXRhYmxlKiBldmFsID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAg
ICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkKLSAgICAg
ICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
b3V0LnByaW50KCJFdmFsRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxl
OjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8UHJv
Z3JhbUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVC
bG9jayA9IGV2YWwtPmNvZGVCbG9jaygpKQotICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxv
Y2spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXQucHJpbnQoIlByb2dyYW1FeGVjdXRh
YmxlIHcvbyBDb2RlQmxvY2siKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChj
bGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAg
IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxv
Y2sgPSBleGVjdXRhYmxlLT5jb2RlQmxvY2soKSkKLSAgICAgICAgICAgIG91dC5wcmludCgqY29k
ZUJsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCJNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgCi0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5jdGlvbkV4
ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgaWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29kZUJsb2Nr
KCkpCi0gICAgICAgIG91dC5wcmludCgiRnVuY3Rpb25FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2si
KTsKLSAgICBlbHNlIHsKLSAgICAgICAgQ29tbWFQcmludGVyIGNvbW1hKCIvIik7Ci0gICAgICAg
IGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ2FsbCgpKQotICAgICAgICAgICAgb3V0LnByaW50
KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSk7Ci0gICAgICAgIGlmIChmdW5j
dGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoY29t
bWEsICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpOwotICAgIH0KLX0KLQotQ29k
ZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFzZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKHRoaXMtPmNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1
dGFibGU6OmluZm8oKSkKLSAgICAgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVFeGVjdXRh
YmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Ci0gICAgCi0gICAgcmV0dXJuIGpzQ2FzdDxjb25z
dCBTY3JpcHRFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Ci19Ci0KIENvZGVCbG9j
a0hhc2ggTmF0aXZlRXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQpIGNvbnN0CiB7CiAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCkBAIC04MzgsOSArODUs
NCBAQCBDb2RlQmxvY2tIYXNoIE5hdGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IoCiAgICAgcmV0dXJu
IENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+
KG1fY29uc3RydWN0b3IpKSk7CiB9CiAKLUNvZGVCbG9ja0hhc2ggU2NyaXB0RXhlY3V0YWJsZTo6
aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IENvZGVCbG9ja0hhc2goc291cmNlKCksIGtpbmQpOwotfQotCi19Cit9IC8vIG5hbWVzcGFjZSBK
U0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL05hdGl2ZUV4ZWN1dGFibGUu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9OYXRpdmVFeGVj
dXRhYmxlLmgJKHJldmlzaW9uIDIwNzc5MCkJKGZyb20gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvRXhlY3V0YWJsZS5oOjIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL05hdGl2ZUV4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc3OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMy0yMDE2IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiQXJpdHlDaGVja01vZGUuaCIKKyNpbmNs
dWRlICJDYWxsRGF0YS5oIgorI2luY2x1ZGUgIkNvZGVCbG9ja0hhc2guaCIKKyNpbmNsdWRlICJD
b2RlU3BlY2lhbGl6YXRpb25LaW5kLmgiCisjaW5jbHVkZSAiQ29tcGlsYXRpb25SZXN1bHQuaCIK
KyNpbmNsdWRlICJFeGVjdXRhYmxlSW5mby5oIgorI2luY2x1ZGUgIkhhbmRsZXJJbmZvLmgiCisj
aW5jbHVkZSAiSW5mZXJyZWRWYWx1ZS5oIgorI2luY2x1ZGUgIkpJVENvZGUuaCIKKyNpbmNsdWRl
ICJKU0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgIlNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJU
eXBlU2V0LmgiCisjaW5jbHVkZSAiVW5saW5rZWRDb2RlQmxvY2suaCIKKyNpbmNsdWRlICJVbmxp
bmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS5oIgorCituYW1lc3BhY2UgSlNDIHsKKworY2xhc3MgQ29k
ZUJsb2NrOworY2xhc3MgRXZhbENvZGVCbG9jazsKK2NsYXNzIEZ1bmN0aW9uQ29kZUJsb2NrOwor
Y2xhc3MgSlNTY29wZTsKK2NsYXNzIEpTV2FzbU1vZHVsZTsKK2NsYXNzIExMSW50T2Zmc2V0c0V4
dHJhY3RvcjsKK2NsYXNzIE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7CitjbGFzcyBQcm9ncmFtQ29k
ZUJsb2NrOworY2xhc3MgV2ViQXNzZW1ibHlDb2RlQmxvY2s7CisKK2VudW0gQ29tcGlsYXRpb25L
aW5kIHsgRmlyc3RDb21waWxhdGlvbiwgT3B0aW1pemluZ0NvbXBpbGF0aW9uIH07CisKK2lubGlu
ZSBib29sIGlzQ2FsbChDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCit7CisgICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIEFTU0VSVChraW5k
ID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgRXhl
Y3V0YWJsZUJhc2UgOiBwdWJsaWMgSlNDZWxsIHsKKyAgICBmcmllbmQgY2xhc3MgSklUOworCitw
cm90ZWN0ZWQ6CisgICAgc3RhdGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19JU19IT1NUID0g
MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCA9IC0x
OworCisgICAgRXhlY3V0YWJsZUJhc2UoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50
IG51bVBhcmFtZXRlcnMsIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgICAgIDogSlNDZWxsKHZt
LCBzdHJ1Y3R1cmUpCisgICAgICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0
ZXJzKQorICAgICAgICAsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdChudW1QYXJhbWV0ZXJz
KQorICAgICAgICAsIG1faW50cmluc2ljKGludHJpbnNpYykKKyAgICB7CisgICAgfQorCisgICAg
dm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCisgICAgeworICAgICAgICBCYXNlOjpmaW5pc2hD
cmVhdGlvbih2bSk7CisgICAgfQorCitwdWJsaWM6CisgICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsK
KyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1
cmVGbGFnczsKKworICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVl
OworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisgICAgICAgIAorICAgIENvZGVC
bG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKKworICAgIGJv
b2wgaXNFdmFsRXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgp
ID09IEV2YWxFeGVjdXRhYmxlVHlwZTsKKyAgICB9CisgICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0
YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhl
Y3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJvb2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsK
KyAgICB9CisgICAgYm9vbCBpc01vZHVsZVByb2dyYW1FeGVjdXRhYmxlKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0eXBlKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOworICAgIH0K
KworCisgICAgYm9vbCBpc0hvc3RGdW5jdGlvbigpIGNvbnN0CisgICAgeworICAgICAgICBBU1NF
UlQoKG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0g
KG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSk7
CisgICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJT
X0lTX0hPU1Q7CisgICAgfQorCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorICAgIGJvb2wgaXNX
ZWJBc3NlbWJseUV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUo
KSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlOworICAgIH0KKyNlbmRpZgorCisgICAgc3Rh
dGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGds
b2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykgeyByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0s
IGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyks
IGluZm8oKSk7IH0KKyAgICAgICAgCisgICAgdm9pZCBjbGVhckNvZGUoKTsKKworICAgIERFQ0xB
UkVfRVhQT1JUX0lORk87CisKK3Byb3RlY3RlZDoKKyAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9y
Q2FsbDsKKyAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0OworCitwdWJsaWM6Cisg
ICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCisgICAgewor
ICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ2FsbCk7CisgICAgICAgIHJldHVybiBtX2ppdENv
ZGVGb3JDYWxsOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklU
Q29kZUZvckNvbnN0cnVjdCgpCisgICAgeworICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ29u
c3RydWN0KTsKKyAgICAgICAgcmV0dXJuIG1faml0Q29kZUZvckNvbnN0cnVjdDsKKyAgICB9Cisg
ICAgICAgIAorICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2Rl
Rm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwor
ICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJu
IGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisgICAgCisgICAgTWFjcm9B
c3NlbWJsZXJDb2RlUHRyIGVudHJ5cG9pbnRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
LCBBcml0eUNoZWNrTW9kZSBhcml0eSkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhh
dmUgYSBjYWNoZWQgcmVzdWx0LiBXZSBvbmx5IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1
c2Ugd2UgdXNlIHRoZQorICAgICAgICAvLyBuby1hcml0eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0
dWFsIGNhbGxzLCB3aGljaCB3aWxsICJjYWNoZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBpbgorICAg
ICAgICAvLyBtYWNoaW5lIGNvZGUuCisgICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0
eSkgeworICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgICAgICBjYXNlIENvZGVG
b3JDYWxsOgorICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0
ID0gbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrKQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBD
b2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQ
dHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spCisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3Vs
dCA9CisgICAgICAgICAgICBnZW5lcmF0ZWRKSVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2Fs
bChhcml0eSk7CisgICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgeworICAgICAg
ICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdDsgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQn
cyB2aXJ0dWFsIGNhbGwgb3B0aW1pemF0aW9ucy4KKyAgICAgICAgICAgIHN3aXRjaCAoa2luZCkg
eworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAgICAgICBtX2ppdENv
ZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICAgICAgbV9q
aXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisKKyAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mSklUQ29kZVdpdGhBcml0
eUNoZWNrRm9yKAorICAgICAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgewor
ICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAg
ICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZv
ckNhbGxXaXRoQXJpdHlDaGVjayk7CisgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKKyAg
ICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29k
ZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKTsKKyAgICAgICAgfQorICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisg
ICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk51bVBhcmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxp
emF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwp
CisgICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251
bVBhcmFtZXRlcnNGb3JDYWxsKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0
cnVjdCk7CisgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1f
bnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCk7CisgICAgfQorCisgICAgYm9vbCBoYXNKSVRDb2Rl
Rm9yQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9y
Q2FsbCA+PSAwOworICAgIH0KKyAgICAgICAgCisgICAgYm9vbCBoYXNKSVRDb2RlRm9yQ29uc3Ry
dWN0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDb25z
dHJ1Y3QgPj0gMDsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaGFzSklUQ29kZUZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ2FsbCgpOwor
ICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJu
IGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisKKyAgICAvLyBJbnRyaW5zaWNzIGFy
ZSBvbmx5IGZvciBjYWxscywgY3VycmVudGx5LgorICAgIEludHJpbnNpYyBpbnRyaW5zaWMoKSBj
b25zdCB7IHJldHVybiBtX2ludHJpbnNpYzsgfQorICAgICAgICAKKyAgICBJbnRyaW5zaWMgaW50
cmluc2ljRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKKyAgICB7CisgICAg
ICAgIGlmIChpc0NhbGwoa2luZCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmluc2ljKCk7Cisg
ICAgICAgIHJldHVybiBOb0ludHJpbnNpYzsKKyAgICB9CisgICAgCisgICAgdm9pZCBkdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7CisgICAgICAgIAorcHJvdGVjdGVkOgorICAgIEludHJpbnNpYyBt
X2ludHJpbnNpYzsKKyAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsKKyAgICBS
ZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ29uc3RydWN0OworICAgIE1hY3JvQXNzZW1ibGVy
Q29kZVB0ciBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2s7CisgICAgTWFjcm9Bc3NlbWJs
ZXJDb2RlUHRyIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrOworfTsKKworY2xh
c3MgTmF0aXZlRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7CisgICAg
ZnJpZW5kIGNsYXNzIEpJVDsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9y
OworcHVibGljOgorICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKKyAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0
cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMgTmF0aXZlRXhlY3V0YWJsZSogY3JlYXRl
KFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1
bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlv
biBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKTsK
KworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBDb2RlQmxvY2tIYXNo
IGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBOYXRpdmVGdW5j
dGlvbiBmdW5jdGlvbigpIHsgcmV0dXJuIG1fZnVuY3Rpb247IH0KKyAgICBOYXRpdmVGdW5jdGlv
biBjb25zdHJ1Y3RvcigpIHsgcmV0dXJuIG1fY29uc3RydWN0b3I7IH0KKyAgICAgICAgCisgICAg
TmF0aXZlRnVuY3Rpb24gbmF0aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAg
ICByZXR1cm4gZnVuY3Rpb24oKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0
cnVjdCk7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcigpOworICAgIH0KKyAgICAgICAgCisg
ICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFs
aXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxs
KQorICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBt
X2Z1bmN0aW9uKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Cisg
ICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9jb25zdHJ1
Y3Rvcik7CisgICAgfQorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZN
JiwgSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVlIHByb3RvKTsKKyAgICAgICAgCisgICAgREVDTEFS
RV9JTkZPOworCisgICAgY29uc3QgU3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1l
OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgUGFzc1JlZlB0
cjxKSVRDb2RlPiBjYWxsVGh1bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmss
IGNvbnN0IFN0cmluZyYgbmFtZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1
dGFibGVCYXNlOworCisgICAgTmF0aXZlRXhlY3V0YWJsZShWTSYsIE5hdGl2ZUZ1bmN0aW9uIGZ1
bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljKTsKKworICAgIE5h
dGl2ZUZ1bmN0aW9uIG1fZnVuY3Rpb247CisgICAgTmF0aXZlRnVuY3Rpb24gbV9jb25zdHJ1Y3Rv
cjsKKworICAgIFN0cmluZyBtX25hbWU7Cit9OworCitjbGFzcyBTY3JpcHRFeGVjdXRhYmxlIDog
cHVibGljIEV4ZWN1dGFibGVCYXNlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEV4ZWN1dGFibGVC
YXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFz
ZTo6U3RydWN0dXJlRmxhZ3M7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwor
ICAgICAgICAKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCkgY29uc3Q7CisKKyAgICBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7IHJldHVy
biBtX3NvdXJjZTsgfQorICAgIGludHB0cl90IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4gbV9z
b3VyY2UucHJvdmlkZXJJRCgpOyB9CisgICAgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwoKSBjb25z
dCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcigpLT51cmwoKTsgfQorICAgIGludCBmaXJzdExp
bmUoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0TGluZTsgfQorICAgIHZvaWQgc2V0T3ZlcnJpZGVM
aW5lTnVtYmVyKGludCBvdmVycmlkZUxpbmVOdW1iZXIpIHsgbV9vdmVycmlkZUxpbmVOdW1iZXIg
PSBvdmVycmlkZUxpbmVOdW1iZXI7IH0KKyAgICBib29sIGhhc092ZXJyaWRlTGluZU51bWJlcigp
IGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyICE9IC0xOyB9CisgICAgaW50IG92
ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyOyB9
CisgICAgaW50IGxhc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0TGluZTsgfQorICAgIHVu
c2lnbmVkIHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9zdGFydENvbHVtbjsgfQorICAg
IHVuc2lnbmVkIGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9CisgICAg
dW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQ7IH0KKyAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OyB9CisKKyAgICBi
b29sIHVzZXNFdmFsKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0dXJlOyB9
CisgICAgYm9vbCB1c2VzQXJndW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEFy
Z3VtZW50c0ZlYXR1cmU7IH0KKyAgICBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSBjb25z
dCB7IHJldHVybiBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQ7IH0KKyAgICBib29sIGlzU3RyaWN0
TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVyZTsgfQor
ICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxEZXJpdmVkQ29udGV4dFR5cGU+KG1fZGVyaXZlZENvbnRleHRUeXBlKTsg
fQorICAgIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBz
dGF0aWNfY2FzdDxFdmFsQ29udGV4dFR5cGU+KG1fZXZhbENvbnRleHRUeXBlKTsgfQorCisgICAg
RUNNQU1vZGUgZWNtYU1vZGUoKSBjb25zdCB7IHJldHVybiBpc1N0cmljdE1vZGUoKSA/IFN0cmlj
dE1vZGUgOiBOb3RTdHJpY3RNb2RlOyB9CisgICAgICAgIAorICAgIHZvaWQgc2V0TmV2ZXJJbmxp
bmUoYm9vbCB2YWx1ZSkgeyBtX25ldmVySW5saW5lID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldE5l
dmVyT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyT3B0aW1pemUgPSB2YWx1ZTsgfQorICAg
IHZvaWQgc2V0TmV2ZXJGVExPcHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJGVExPcHRpbWl6
ZSA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXREaWRUcnlUb0VudGVySW5Mb29wKGJvb2wgdmFsdWUp
IHsgbV9kaWRUcnlUb0VudGVySW5Mb29wID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldENhblVzZU9T
UkV4aXRGdXp6aW5nKGJvb2wgdmFsdWUpIHsgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9IHZhbHVl
OyB9CisgICAgYm9vbCBuZXZlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJbmxpbmU7
IH0KKyAgICBib29sIG5ldmVyT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyT3B0aW1p
emU7IH0KKyAgICBib29sIG5ldmVyRlRMT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVy
RlRMT3B0aW1pemU7IH0KKyAgICBib29sIGRpZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25zdCB7IHJl
dHVybiBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KKyAgICBib29sIGlzSW5saW5pbmdDYW5kaWRh
dGUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJJbmxpbmUoKTsgfQorICAgIGJvb2wgaXNPa1RvT3B0
aW1pemUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJPcHRpbWl6ZSgpOyB9CisgICAgYm9vbCBjYW5V
c2VPU1JFeGl0RnV6emluZygpIGNvbnN0IHsgcmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1enppbmc7
IH0KKyAgICAKKyAgICBib29sKiBhZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKCkgeyByZXR1
cm4gJm1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQorCisgICAgQ29kZUZlYXR1cmVzIGZlYXR1cmVz
KCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlczsgfQorICAgICAgICAKKyAgICBERUNMQVJFX0VY
UE9SVF9JTkZPOworCisgICAgdm9pZCByZWNvcmRQYXJzZShDb2RlRmVhdHVyZXMgZmVhdHVyZXMs
IGJvb2wgaGFzQ2FwdHVyZWRWYXJpYWJsZXMsIGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSwg
dW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbikKKyAgICB7CisgICAgICAg
IG1fZmVhdHVyZXMgPSBmZWF0dXJlczsKKyAgICAgICAgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA9
IGhhc0NhcHR1cmVkVmFyaWFibGVzOworICAgICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGluZTsK
KyAgICAgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOworICAgICAgICBBU1NFUlQoc3RhcnRDb2x1
bW4gIT0gVUlOVF9NQVgpOworICAgICAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47Cisg
ICAgICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgICAgICBtX2VuZENvbHVt
biA9IGVuZENvbHVtbjsKKyAgICB9CisKKyAgICB2b2lkIGluc3RhbGxDb2RlKENvZGVCbG9jayop
OworICAgIHZvaWQgaW5zdGFsbENvZGUoVk0mLCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwgQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCk7CisgICAgQ29kZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3IoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBKU09iamVjdComIGV4Y2Vw
dGlvbik7CisgICAgQ29kZUJsb2NrKiBuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcihDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGludGVyZXN0
aW5nIEdDIHN0b3J5LiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFza2luZyB1cyB0byBj
cmVhdGUgYSBDb2RlQmxvY2sKKyAgICAvLyB0aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJlZm9yZSB0
aGlzIGZ1bmN0aW9uIHJldHVybnMuIENhbGxlcnMgYXJlIGVzc2VudGlhbGx5IGFza2luZyBmb3Ig
YSBzdHJvbmcgcmVmZXJlbmNlCisgICAgLy8gdG8gdGhlIENvZGVCbG9jay4gQmVjYXVzZSB0aGUg
RXhlY3V0YWJsZSBtYXkgYmUgYWxsb2NhdGluZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1aXJlIGNh
bGxlcnMgdG8gcGFzcyBpbgorICAgIC8vIHRoZWlyIENvZGVCbG9jayomIHJlZmVyZW5jZSBiZWNh
dXNlIGl0J3Mgc2FmZSBmb3IgQ29kZUJsb2NrIHRvIGJlIGpldHRpc29uZWQgaWYgRXhlY3V0YWJs
ZSBpcyB0aGUgb25seSB0aGluZworICAgIC8vIHRvIHBvaW50IHRvIGl0LiBUaGlzIGZvcmNlcyBj
YWxsZXJzIHRvIGhhdmUgYSBDb2RlQmxvY2sqIGluIGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNr
IHRoYXQgd2lsbCBiZSBtYXJrZWQKKyAgICAvLyBieSBjb25zZXJ2YXRpdmUgR0MgaWYgYSBHQyBo
YXBwZW5zIGFmdGVyIHdlIGNyZWF0ZSB0aGUgQ29kZUJsb2NrLgorICAgIHRlbXBsYXRlIDx0eXBl
bmFtZSBFeGVjdXRhYmxlVHlwZT4KKyAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbihW
TSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJs
b2NrKiYgcmVzdWx0Q29kZUJsb2NrKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9y
PiB2b2lkIGZvckVhY2hDb2RlQmxvY2soRnVuY3RvciYmKTsKKworcHJpdmF0ZToKKyAgICBmcmll
bmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRp
b25JbXBsKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5k
LCBDb2RlQmxvY2sqJik7CisKK3Byb3RlY3RlZDoKKyAgICBTY3JpcHRFeGVjdXRhYmxlKFN0cnVj
dHVyZSosIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERl
cml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250
ZXh0VHlwZSwgSW50cmluc2ljKTsKKworICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZtKQor
ICAgIHsKKyAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICB2bS5oZWFw
LmFkZEV4ZWN1dGFibGUodGhpcyk7IC8vIEJhbGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVubWFya2Vk
Q29tcGlsZWRDb2RlKCkuCisKKyNpZiBFTkFCTEUoQ09ERUJMT0NLX1NBTVBMSU5HKQorICAgICAg
ICBpZiAoU2FtcGxpbmdUb29sKiBzYW1wbGVyID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBsZXIoKSkK
KyAgICAgICAgICAgIHNhbXBsZXItPm5vdGlmeU9mU2NvcGUodm0sIHRoaXMpOworI2VuZGlmCisg
ICAgfQorCisgICAgQ29kZUZlYXR1cmVzIG1fZmVhdHVyZXM7CisgICAgYm9vbCBtX2RpZFRyeVRv
RW50ZXJJbkxvb3A7CisgICAgYm9vbCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDogMTsKKyAgICBi
b29sIG1fbmV2ZXJJbmxpbmUgOiAxOworICAgIGJvb2wgbV9uZXZlck9wdGltaXplIDogMTsKKyAg
ICBib29sIG1fbmV2ZXJGVExPcHRpbWl6ZSA6IDE7CisgICAgYm9vbCBtX2lzQXJyb3dGdW5jdGlv
bkNvbnRleHQgOiAxOworICAgIGJvb2wgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7CisgICAg
dW5zaWduZWQgbV9kZXJpdmVkQ29udGV4dFR5cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4dFR5cGUK
KyAgICB1bnNpZ25lZCBtX2V2YWxDb250ZXh0VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0VHlwZQor
CisgICAgaW50IG1fb3ZlcnJpZGVMaW5lTnVtYmVyOworICAgIGludCBtX2ZpcnN0TGluZTsKKyAg
ICBpbnQgbV9sYXN0TGluZTsKKyAgICB1bnNpZ25lZCBtX3N0YXJ0Q29sdW1uOworICAgIHVuc2ln
bmVkIG1fZW5kQ29sdW1uOworICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
OworICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKKyAgICBTb3VyY2VDb2Rl
IG1fc291cmNlOworfTsKKworY2xhc3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2Ny
aXB0RXhlY3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsK
K3B1YmxpYzoKKyAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKKyAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0
cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwor
CisgICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBt
X2V2YWxDb2RlQmxvY2suZ2V0KCk7CisgICAgfQorCisgICAgc3RhdGljIEV2YWxFeGVjdXRhYmxl
KiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENv
bnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBF
dmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKKworICAgIFBhc3NS
ZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4g
Z2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RydWN0dXJl
KiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBK
U1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZt
LCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0cnVj
dHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisgICAgICAgIAorICAgIERFQ0xBUkVfSU5GTzsK
KworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhl
Y3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29u
c3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmlu
ZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29u
dGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRleHRU
eXBlKCkpOyB9CisKKyAgICB1bnNpZ25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3VubGlu
a2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFibGVzKCk7IH0KKyAgICB1bnNpZ25lZCBudW1iZXJP
ZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtYmVy
T2ZGdW5jdGlvbkRlY2xzKCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0
YWJsZUJhc2U7CisgICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7CisKKyAgICBFdmFs
RXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmljdENv
bnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBF
dmFsQ29udGV4dFR5cGUpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwq
LCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1fZXZh
bENvZGVCbG9jazsKKyAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBtX3Vu
bGlua2VkRXZhbENvZGVCbG9jazsKK307CisKK2NsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZpbmFs
IDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNl
dHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7
CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0
dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIFByb2dyYW1FeGVj
dXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2Up
CisgICAgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90
TnVsbCwgYWxsb2NhdGVDZWxsPFByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgUHJv
Z3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNo
Q3JlYXRpb24oZXhlYy0+dm0oKSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0K
KworCisgICAgSlNPYmplY3QqIGluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwgQ2FsbEZy
YW1lKiwgSlNTY29wZSopOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKwor
ICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAgeworICAgICAgICByZXR1cm4g
bV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgIH0KKworICAgIEpTT2JqZWN0KiBjaGVja1N5
bnRheChFeGVjU3RhdGUqKTsKKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklU
Q29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsK
KyAgICB9CisgICAgICAgIAorICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShW
TSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAg
eworICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJv
dG8sIFR5cGVJbmZvKFByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZv
KCkpOworICAgIH0KKyAgICAgICAgCisgICAgREVDTEFSRV9JTkZPOworCisgICAgRXhlY3V0YWJs
ZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2Vz
RXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5v
bmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQs
IFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fy
cm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZyaWVuZCBj
bGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRl
KiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihK
U0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkUHJvZ3Jh
bUNvZGVCbG9jaz4gbV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2s7CisgICAgV3JpdGVCYXJyaWVy
PFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3JhbUNvZGVCbG9jazsKK307CisKK2NsYXNzIE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAg
IGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRl
ZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVj
dHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwor
CisgICAgc3RhdGljIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwg
Y29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsK
KworICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAgeworICAgICAg
ICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgIH0KKworICAgIFBh
c3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAgICByZXR1
cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RydWN0
dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRl
KHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisKKyAgICBERUNMQVJFX0lO
Rk87CisKKyAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJu
IEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2Us
IENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpNb2R1bGUsIFN1cGVy
QmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6Ok1vZHVsZUV2YWx1YXRlTW9kZSwg
ZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2
YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KKworICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKCkgeyByZXR1cm4gbV91bmxpbmtl
ZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7IH0KKworICAgIFN5bWJvbFRhYmxlKiBtb2R1
bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkgeyByZXR1cm4gbV9tb2R1bGVFbnZpcm9ubWVudFN5
bWJvbFRhYmxlLmdldCgpOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFi
bGVCYXNlOworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgTW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAg
c3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAg
V3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlQmxvY2s7CisgICAgV3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxlPiBtX21v
ZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7CisgICAgV3JpdGVCYXJyaWVyPE1vZHVsZVByb2dy
YW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKK307CisKK2NsYXNzIEZ1bmN0
aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmll
bmQgY2xhc3MgSklUOworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Citw
dWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNv
bnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1
Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogY3JlYXRl
KAorICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5j
dGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgCisgICAgICAgIHVuc2lnbmVkIGZp
cnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25l
ZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgeworICAgICAgICBGdW5jdGlv
bkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxGdW5j
dGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5jdGlvbkV4ZWN1dGFibGUodm0sIHNvdXJjZSwg
dW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBzdGFydENvbHVtbiwgZW5k
Q29sdW1uLCBpbnRyaW5zaWMpOworICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2
bSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKyAgICBzdGF0aWMgRnVuY3Rp
b25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgKKyAgICAgICAgY29uc3QgSWRlbnRpZmllciYg
bmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNlQ29kZSYsIAorICAgICAgICBKU09iamVjdCom
IGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcik7CisKKyAgICBzdGF0aWMgdm9pZCBk
ZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJs
ZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3Vu
bGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIGVpdGhlciBj
YWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhpcyBjYW4gYmUgYXBwcm9wcmlhdGUKKyAgICAv
LyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0IHRoYXQgZG9uJ3QgdmFyeSBiZXR3ZWVuIGNh
bGwgYW5kIGNvbnN0cnVjdCAtLQorICAgIC8vIGZvciBleGFtcGxlLCBhcmd1bWVudHNSZWdpc3Rl
cigpLgorICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBlaXRoZXJDb2RlQmxvY2soKQorICAgIHsKKyAg
ICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBtX2NvZGVC
bG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVj
dC5nZXQoKTsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDYWxsKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhIW1fY29kZUJsb2NrRm9yQ2FsbDsKKyAgICB9
CisKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCisgICAgeworICAg
ICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgIH0KKworICAgIGJvb2wg
aXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKworICAgIEZ1bmN0aW9uQ29kZUJs
b2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29k
ZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKyAgICAgICAgCisgICAgYm9vbCBpc0dl
bmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBp
ZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZv
ckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAg
ICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpOworICAgIH0KKyAgICAgICAgCisg
ICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAg
ICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENv
ZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9yQ29uc3RydWN0KCk7
CisgICAgfQorCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9yKENv
ZGVTcGVjaWFsaXphdGlvbktpbmQpOworICAgICAgICAKKyAgICBGdW5jdGlvbkNvZGVCbG9jayog
cHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJsb2NrRm9yKGtpbmQpOworICAgIH0KKworICAg
IFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KCkgCisgICAgeworICAgICAg
ICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCkKKyAgICAgICAgICAgIG1fcmV0dXJuU3Rh
dGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0ZSgpOworCisgICAgICAgIHJldHVybiBtX3Jl
dHVyblN0YXRlbWVudFR5cGVTZXQ7CisgICAgfQorICAgICAgICAKKyAgICBGdW5jdGlvbk1vZGUg
ZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTW9k
ZSgpOyB9CisgICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5s
aW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5jdGlvbigpOyB9CisgICAgQ29uc3RydWN0QWJp
bGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFi
bGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQorICAgIGJvb2wgaXNDbGFzcygpIGNvbnN0IHsgcmV0
dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9CisgICAgYm9vbCBpc0Fycm93RnVuY3Rpb24o
KSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OkFycm93RnVu
Y3Rpb25Nb2RlOyB9CisgICAgYm9vbCBpc0dldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9k
ZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVyTW9kZTsgfQorICAgIGJvb2wgaXNTZXR0ZXIo
KSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OlNldHRlck1v
ZGU7IH0KKyAgICBib29sIGlzR2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gU291cmNlUGFyc2VN
b2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsIFNvdXJjZVBhcnNlTW9k
ZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZSkuY29udGFpbnMocGFyc2VNb2RlKCkpOyB9
CisgICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJj
ZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQorICAgIGJvb2wgaGFzQ2FsbGVyQW5kQXJndW1lbnRz
UHJvcGVydGllcygpIGNvbnN0CisgICAgeworICAgICAgICAvLyBQZXIgaHR0cHM6Ly90YzM5Lmdp
dGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVuLWV4dGVuc2lvbnMsIG9ubHkgc2xvcHB5LW1v
ZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9sZC1zdHlsZSAocHJlLUVTNikgc3ludGFjdGlj
IGZvcm1zIGNhbiBjb250YWluCisgICAgICAgIC8vICJjYWxsZXIiIGFuZCAiYXJndW1lbnRzIi4K
KyAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUoKSAmJiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQ
YXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAmJiAhaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rp
b24oKTsKKyAgICB9CisgICAgYm9vbCBoYXNQcm90b3R5cGVQcm9wZXJ0eSgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KAorICAgICAgICAgICAgU291cmNl
UGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUsCisgICAgICAgICAgICBTb3VyY2VQYXJzZU1v
ZGU6OkdlbmVyYXRvckJvZHlNb2RlLAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5l
cmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCisgICAgICAgICkuY29udGFpbnMocGFyc2VNb2RlKCkp
IHx8IGlzQ2xhc3MoKTsKKyAgICB9CisgICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250
ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29u
dGV4dFR5cGUoKTsgfQorICAgIGJvb2wgaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKSBjb25z
dCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rp
b24oKTsgfQorICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUoKSB7IHJldHVybiBtX3VubGlua2Vk
RXhlY3V0YWJsZS0+bmFtZSgpOyB9CisgICAgY29uc3QgSWRlbnRpZmllciYgZWNtYU5hbWUoKSB7
IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZWNtYU5hbWUoKTsgfQorICAgIGNvbnN0IElk
ZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5p
bmZlcnJlZE5hbWUoKTsgfQorICAgIHVuc2lnbmVkIHBhcmFtZXRlckNvdW50KCkgY29uc3QgeyBy
ZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7IH0gLy8gRXhjbHVk
aW5nICd0aGlzJyEKKyAgICB1bnNpZ25lZCBmdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsgcmV0dXJu
IG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbkxlbmd0aCgpOyB9CisgICAgU291cmNlUGFy
c2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5w
YXJzZU1vZGUoKTsgfQorICAgIEpTUGFyc2VyU2NyaXB0TW9kZSBzY3JpcHRNb2RlKCkgY29uc3Qg
eyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnNjcmlwdE1vZGUoKTsgfQorICAgIGNvbnN0
IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1
dGFibGUtPmNsYXNzU291cmNlKCk7IH0KKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4o
SlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1
Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3Rv
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmpl
Y3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFn
cyksIGluZm8oKSk7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0
KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7IH0KKworICAgIHZvaWQg
b3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmlsaW5nU3RhcnRFbmRPZmZzZXRzKHVuc2lnbmVk
IHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KQorICAgIHsKKyAgICAgICAgbV9wYXJh
bWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7CisgICAgICAgIG1fdHlw
ZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OworICAgICAg
ICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OworICAg
IH0KKworICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEluZmVycmVkVmFsdWUqIHNpbmdsZXRvbkZ1
bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25GdW5jdGlvbi5nZXQoKTsgfQorCitwcml2YXRl
OgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFi
bGUoCisgICAgICAgIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIFVubGlua2VkRnVuY3Rpb25FeGVj
dXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAKKyAgICAgICAgdW5zaWduZWQgbGFzdExpbmUs
IHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyk7Cisg
ICAgCisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYpOworCisgICAgZnJpZW5kIGNsYXNzIFNj
cmlwdEV4ZWN1dGFibGU7CisgICAgCisgICAgdW5zaWduZWQgbV9wYXJhbWV0ZXJzU3RhcnRPZmZz
ZXQ7CisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlPiBtX3VubGlu
a2VkRXhlY3V0YWJsZTsKKyAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29k
ZUJsb2NrRm9yQ2FsbDsKKyAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29k
ZUJsb2NrRm9yQ29uc3RydWN0OworICAgIFJlZlB0cjxUeXBlU2V0PiBtX3JldHVyblN0YXRlbWVu
dFR5cGVTZXQ7CisgICAgV3JpdGVCYXJyaWVyPEluZmVycmVkVmFsdWU+IG1fc2luZ2xldG9uRnVu
Y3Rpb247Cit9OworCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorY2xhc3MgV2ViQXNzZW1ibHlF
eGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKK3B1YmxpYzoKKyAgICB0
eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0
cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFs
OworCisgICAgc3RhdGljIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgY29u
c3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWduZWQgZnVu
Y3Rpb25JbmRleCkKKyAgICB7CisgICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0
YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFdlYkFzc2VtYmx5RXhlY3V0YWJsZT4o
dm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSh2bSwgc291cmNlLCBtb2R1bGUsIGZ1bmN0
aW9uSW5kZXgpOworICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7CisgICAg
ICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNy
ZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFs
dWUgcHJvdG8pCisgICAgeworICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGds
b2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGUsIFN0
cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95
KEpTQ2VsbCopOworCisgICAgREVDTEFSRV9JTkZPOworCisgICAgdm9pZCBwcmVwYXJlRm9yRXhl
Y3V0aW9uKFZNJik7CisKKyAgICBXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2Fs
bCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAg
IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgV2Vi
QXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3QgU291cmNlQ29kZSYsIEpTV2FzbU1vZHVsZSos
IHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJl
bihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgU291cmNlQ29kZSBtX3NvdXJjZTsKKyAg
ICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBtX21vZHVsZTsKKyAgICB1bnNpZ25lZCBtX2Z1
bmN0aW9uSW5kZXg7CisKKyAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlDb2RlQmxvY2s+IG1f
Y29kZUJsb2NrRm9yQ2FsbDsKK307CisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1
dGFibGVUeXBlPgorSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRp
b24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQoreworICAg
IGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7CisgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8RXhl
Y3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICByZXN1bHRD
b2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhp
cyktPmNvZGVCbG9jaygpKTsKKyAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFi
bGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29k
ZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRo
aXMpLT5jb2RlQmxvY2soKSk7CisgICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRh
YmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJl
c3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOworICAgICAgICBlbHNlIGlmIChzdGQ6Omlz
X3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAg
ICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxGdW5jdGlv
bkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJu
IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCh2bSwg
ZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRDb2RlQmxvY2spOworfQorCit9IC8vIG5hbWVz
cGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL05hdGl2ZUV4ZWN1
dGFibGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9OYXRp
dmVFeGVjdXRhYmxlLmgJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL05hdGl2ZUV4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpAQCAtMjUsMjI2ICsy
NSwxMCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkFyaXR5Q2hlY2tNb2RlLmgiCi0j
aW5jbHVkZSAiQ2FsbERhdGEuaCIKLSNpbmNsdWRlICJDb2RlQmxvY2tIYXNoLmgiCi0jaW5jbHVk
ZSAiQ29kZVNwZWNpYWxpemF0aW9uS2luZC5oIgotI2luY2x1ZGUgIkNvbXBpbGF0aW9uUmVzdWx0
LmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZUluZm8uaCIKLSNpbmNsdWRlICJIYW5kbGVySW5mby5o
IgotI2luY2x1ZGUgIkluZmVycmVkVmFsdWUuaCIKLSNpbmNsdWRlICJKSVRDb2RlLmgiCi0jaW5j
bHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKLSNpbmNsdWRlICJTb3VyY2VDb2RlLmgiCi0jaW5jbHVk
ZSAiVHlwZVNldC5oIgotI2luY2x1ZGUgIlVubGlua2VkQ29kZUJsb2NrLmgiCi0jaW5jbHVkZSAi
VW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUuaCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlQmFzZS5o
IgogCiBuYW1lc3BhY2UgSlNDIHsKIAotY2xhc3MgQ29kZUJsb2NrOwotY2xhc3MgRXZhbENvZGVC
bG9jazsKLWNsYXNzIEZ1bmN0aW9uQ29kZUJsb2NrOwotY2xhc3MgSlNTY29wZTsKLWNsYXNzIEpT
V2FzbU1vZHVsZTsKLWNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLWNsYXNzIE1vZHVsZVBy
b2dyYW1Db2RlQmxvY2s7Ci1jbGFzcyBQcm9ncmFtQ29kZUJsb2NrOwotY2xhc3MgV2ViQXNzZW1i
bHlDb2RlQmxvY2s7Ci0KLWVudW0gQ29tcGlsYXRpb25LaW5kIHsgRmlyc3RDb21waWxhdGlvbiwg
T3B0aW1pemluZ0NvbXBpbGF0aW9uIH07Ci0KLWlubGluZSBib29sIGlzQ2FsbChDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotY2xhc3MgRXhlY3V0YWJsZUJhc2UgOiBwdWJsaWMgSlND
ZWxsIHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNv
bnN0IGludCBOVU1fUEFSQU1FVEVSU19JU19IT1NUID0gMDsKLSAgICBzdGF0aWMgY29uc3QgaW50
IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCA9IC0xOwotCi0gICAgRXhlY3V0YWJsZUJhc2Uo
Vk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50IG51bVBhcmFtZXRlcnMsIEludHJpbnNp
YyBpbnRyaW5zaWMpCi0gICAgICAgIDogSlNDZWxsKHZtLCBzdHJ1Y3R1cmUpCi0gICAgICAgICwg
bV9udW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0ZXJzKQotICAgICAgICAsIG1fbnVtUGFy
YW1ldGVyc0ZvckNvbnN0cnVjdChudW1QYXJhbWV0ZXJzKQotICAgICAgICAsIG1faW50cmluc2lj
KGludHJpbnNpYykKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYg
dm0pCi0gICAgewotICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgfQotCi1w
dWJsaWM6Ci0gICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWdu
ZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKLQotICAgIHN0YXRpYyBj
b25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVlOwotICAgIHN0YXRpYyB2b2lkIGRlc3Ry
b3koSlNDZWxsKik7Ci0gICAgICAgIAotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIGJvb2wgaXNFdmFsRXhlY3V0YWJsZSgpIGNv
bnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09IEV2YWxFeGVjdXRhYmxlVHlwZTsK
LSAgICB9Ci0gICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAg
ICAgICByZXR1cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotICAg
IGJvb2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4g
dHlwZSgpID09IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0gICAgYm9vbCBpc01vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwotICAgIH0KLQotCi0gICAgYm9vbCBpc0hvc3RGdW5j
dGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQoKG1fbnVtUGFyYW1ldGVyc0ZvckNh
bGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0gKG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0
cnVjdCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSk7Ci0gICAgICAgIHJldHVybiBtX251bVBh
cmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Q7Ci0gICAgfQotCi0jaWYg
RU5BQkxFKFdFQkFTU0VNQkxZKQotICAgIGJvb2wgaXNXZWJBc3NlbWJseUV4ZWN1dGFibGUoKSBj
b25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFi
bGVUeXBlOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3Ry
dWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90
bykgeyByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5
cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7IH0KLSAgICAgICAgCi0g
ICAgdm9pZCBjbGVhckNvZGUoKTsKLQotICAgIERFQ0xBUkVfRVhQT1JUX0lORk87Ci0KLXByb3Rl
Y3RlZDoKLSAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbDsKLSAgICBpbnQgbV9udW1QYXJh
bWV0ZXJzRm9yQ29uc3RydWN0OwotCi1wdWJsaWM6Ci0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBn
ZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCi0gICAgewotICAgICAgICBBU1NFUlQobV9qaXRDb2Rl
Rm9yQ2FsbCk7Ci0gICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDYWxsOwotICAgIH0KLQotICAg
IFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgpCi0gICAg
ewotICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJu
IG1faml0Q29kZUZvckNvbnN0cnVjdDsKLSAgICB9Ci0gICAgICAgIAotICAgIFBhc3NSZWZQdHI8
SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
Ci0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJl
dHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDb25z
dHJ1Y3QoKTsKLSAgICB9Ci0gICAgCi0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIGVudHJ5cG9p
bnRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBBcml0eUNoZWNrTW9kZSBhcml0eSkK
LSAgICB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0LiBXZSBv
bmx5IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1c2Ugd2UgdXNlIHRoZQotICAgICAgICAv
LyBuby1hcml0eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0dWFsIGNhbGxzLCB3aGljaCB3aWxsICJj
YWNoZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBpbgotICAgICAgICAvLyBtYWNoaW5lIGNvZGUuCi0g
ICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAgICAgICAgc3dpdGNo
IChraW5kKSB7Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgICAg
IGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ2FsbFdpdGhB
cml0eUNoZWNrKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAgICAg
ICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9y
Q29uc3RydWN0V2l0aEFyaXR5Q2hlY2spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9Ci0gICAgICAgICAgICBnZW5lcmF0
ZWRKSVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2FsbChhcml0eSk7Ci0gICAgICAgIGlmIChh
cml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3Vs
dDsgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQncyB2aXJ0dWFsIGNhbGwgb3B0aW1pemF0
aW9ucy4KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBDb2Rl
Rm9yQ2FsbDoKLSAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sg
PSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvZGVG
b3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFy
aXR5Q2hlY2sgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMg
cHRyZGlmZl90IG9mZnNldE9mSklUQ29kZVdpdGhBcml0eUNoZWNrRm9yKAotICAgICAgICBDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGtpbmQpIHsK
LSAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZG
U0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayk7Ci0g
ICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgIHJldHVybiBPQkpFQ1Rf
T0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNo
ZWNrKTsKLSAgICAgICAgfQotICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB0cmRpZmZfdCBvZmZz
ZXRPZk51bVBhcmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsK
LSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gT0JK
RUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKTsKLSAg
ICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBP
QkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVj
dCk7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ2FsbCgpIGNvbnN0Ci0gICAgewot
ICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA+PSAwOwotICAgIH0KLSAgICAg
ICAgCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ29uc3RydWN0KCkgY29uc3QKLSAgICB7Ci0gICAg
ICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPj0gMDsKLSAgICB9Ci0gICAg
ICAgIAotICAgIGJvb2wgaGFzSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
IGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAg
ICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBD
b2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3Qo
KTsKLSAgICB9Ci0KLSAgICAvLyBJbnRyaW5zaWNzIGFyZSBvbmx5IGZvciBjYWxscywgY3VycmVu
dGx5LgotICAgIEludHJpbnNpYyBpbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNp
YzsgfQotICAgICAgICAKLSAgICBJbnRyaW5zaWMgaW50cmluc2ljRm9yKENvZGVTcGVjaWFsaXph
dGlvbktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhbGwoa2luZCkpCi0g
ICAgICAgICAgICByZXR1cm4gaW50cmluc2ljKCk7Ci0gICAgICAgIHJldHVybiBOb0ludHJpbnNp
YzsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7Ci0gICAg
ICAgIAotcHJvdGVjdGVkOgotICAgIEludHJpbnNpYyBtX2ludHJpbnNpYzsKLSAgICBSZWZQdHI8
SklUQ29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsKLSAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2Rl
Rm9yQ29uc3RydWN0OwotICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVGb3JDYWxs
V2l0aEFyaXR5Q2hlY2s7Ci0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1faml0Q29kZUZvckNv
bnN0cnVjdFdpdGhBcml0eUNoZWNrOwotfTsKLQogY2xhc3MgTmF0aXZlRXhlY3V0YWJsZSBmaW5h
bCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7CiAgICAgZnJpZW5kIGNsYXNzIEpJVDsKICAgICBm
cmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwpAQCAtMjk3LDQ4MiArODEsNCBAQCBw
cml2YXRlOgogICAgIFN0cmluZyBtX25hbWU7CiB9OwogCi1jbGFzcyBTY3JpcHRFeGVjdXRhYmxl
IDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFi
bGVCYXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0g
QmFzZTo6U3RydWN0dXJlRmxhZ3M7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCop
OwotICAgICAgICAKLSAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9u
S2luZCkgY29uc3Q7Ci0KLSAgICBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7IHJl
dHVybiBtX3NvdXJjZTsgfQotICAgIGludHB0cl90IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4g
bV9zb3VyY2UucHJvdmlkZXJJRCgpOyB9Ci0gICAgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwoKSBj
b25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcigpLT51cmwoKTsgfQotICAgIGludCBmaXJz
dExpbmUoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0TGluZTsgfQotICAgIHZvaWQgc2V0T3ZlcnJp
ZGVMaW5lTnVtYmVyKGludCBvdmVycmlkZUxpbmVOdW1iZXIpIHsgbV9vdmVycmlkZUxpbmVOdW1i
ZXIgPSBvdmVycmlkZUxpbmVOdW1iZXI7IH0KLSAgICBib29sIGhhc092ZXJyaWRlTGluZU51bWJl
cigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyICE9IC0xOyB9Ci0gICAgaW50
IG92ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVy
OyB9Ci0gICAgaW50IGxhc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0TGluZTsgfQotICAg
IHVuc2lnbmVkIHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9zdGFydENvbHVtbjsgfQot
ICAgIHVuc2lnbmVkIGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9Ci0g
ICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90
eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7IH0KLSAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5k
T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OyB9Ci0KLSAg
ICBib29sIHVzZXNFdmFsKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0dXJl
OyB9Ci0gICAgYm9vbCB1c2VzQXJndW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAm
IEFyZ3VtZW50c0ZlYXR1cmU7IH0KLSAgICBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSBj
b25zdCB7IHJldHVybiBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQ7IH0KLSAgICBib29sIGlzU3Ry
aWN0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVyZTsg
fQotICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkQ29udGV4dFR5cGU+KG1fZGVyaXZlZENvbnRleHRUeXBl
KTsgfQotICAgIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxFdmFsQ29udGV4dFR5cGU+KG1fZXZhbENvbnRleHRUeXBlKTsgfQotCi0g
ICAgRUNNQU1vZGUgZWNtYU1vZGUoKSBjb25zdCB7IHJldHVybiBpc1N0cmljdE1vZGUoKSA/IFN0
cmljdE1vZGUgOiBOb3RTdHJpY3RNb2RlOyB9Ci0gICAgICAgIAotICAgIHZvaWQgc2V0TmV2ZXJJ
bmxpbmUoYm9vbCB2YWx1ZSkgeyBtX25ldmVySW5saW5lID0gdmFsdWU7IH0KLSAgICB2b2lkIHNl
dE5ldmVyT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyT3B0aW1pemUgPSB2YWx1ZTsgfQot
ICAgIHZvaWQgc2V0TmV2ZXJGVExPcHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJGVExPcHRp
bWl6ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXREaWRUcnlUb0VudGVySW5Mb29wKGJvb2wgdmFs
dWUpIHsgbV9kaWRUcnlUb0VudGVySW5Mb29wID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldENhblVz
ZU9TUkV4aXRGdXp6aW5nKGJvb2wgdmFsdWUpIHsgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9IHZh
bHVlOyB9Ci0gICAgYm9vbCBuZXZlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJbmxp
bmU7IH0KLSAgICBib29sIG5ldmVyT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyT3B0
aW1pemU7IH0KLSAgICBib29sIG5ldmVyRlRMT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25l
dmVyRlRMT3B0aW1pemU7IH0KLSAgICBib29sIGRpZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25zdCB7
IHJldHVybiBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KLSAgICBib29sIGlzSW5saW5pbmdDYW5k
aWRhdGUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJJbmxpbmUoKTsgfQotICAgIGJvb2wgaXNPa1Rv
T3B0aW1pemUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJPcHRpbWl6ZSgpOyB9Ci0gICAgYm9vbCBj
YW5Vc2VPU1JFeGl0RnV6emluZygpIGNvbnN0IHsgcmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1enpp
bmc7IH0KLSAgICAKLSAgICBib29sKiBhZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKCkgeyBy
ZXR1cm4gJm1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQotCi0gICAgQ29kZUZlYXR1cmVzIGZlYXR1
cmVzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlczsgfQotICAgICAgICAKLSAgICBERUNMQVJF
X0VYUE9SVF9JTkZPOwotCi0gICAgdm9pZCByZWNvcmRQYXJzZShDb2RlRmVhdHVyZXMgZmVhdHVy
ZXMsIGJvb2wgaGFzQ2FwdHVyZWRWYXJpYWJsZXMsIGludCBmaXJzdExpbmUsIGludCBsYXN0TGlu
ZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbikKLSAgICB7Ci0gICAg
ICAgIG1fZmVhdHVyZXMgPSBmZWF0dXJlczsKLSAgICAgICAgbV9oYXNDYXB0dXJlZFZhcmlhYmxl
cyA9IGhhc0NhcHR1cmVkVmFyaWFibGVzOwotICAgICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGlu
ZTsKLSAgICAgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotICAgICAgICBBU1NFUlQoc3RhcnRD
b2x1bW4gIT0gVUlOVF9NQVgpOwotICAgICAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47
Ci0gICAgICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAgICAgICBtX2VuZENv
bHVtbiA9IGVuZENvbHVtbjsKLSAgICB9Ci0KLSAgICB2b2lkIGluc3RhbGxDb2RlKENvZGVCbG9j
ayopOwotICAgIHZvaWQgaW5zdGFsbENvZGUoVk0mLCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwgQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgQ29kZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3IoQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBKU09iamVjdComIGV4
Y2VwdGlvbik7Ci0gICAgQ29kZUJsb2NrKiBuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kKTsKLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGludGVy
ZXN0aW5nIEdDIHN0b3J5LiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFza2luZyB1cyB0
byBjcmVhdGUgYSBDb2RlQmxvY2sKLSAgICAvLyB0aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJlZm9y
ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIENhbGxlcnMgYXJlIGVzc2VudGlhbGx5IGFza2luZyBm
b3IgYSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgLy8gdG8gdGhlIENvZGVCbG9jay4gQmVjYXVzZSB0
aGUgRXhlY3V0YWJsZSBtYXkgYmUgYWxsb2NhdGluZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1aXJl
IGNhbGxlcnMgdG8gcGFzcyBpbgotICAgIC8vIHRoZWlyIENvZGVCbG9jayomIHJlZmVyZW5jZSBi
ZWNhdXNlIGl0J3Mgc2FmZSBmb3IgQ29kZUJsb2NrIHRvIGJlIGpldHRpc29uZWQgaWYgRXhlY3V0
YWJsZSBpcyB0aGUgb25seSB0aGluZwotICAgIC8vIHRvIHBvaW50IHRvIGl0LiBUaGlzIGZvcmNl
cyBjYWxsZXJzIHRvIGhhdmUgYSBDb2RlQmxvY2sqIGluIGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0
YWNrIHRoYXQgd2lsbCBiZSBtYXJrZWQKLSAgICAvLyBieSBjb25zZXJ2YXRpdmUgR0MgaWYgYSBH
QyBoYXBwZW5zIGFmdGVyIHdlIGNyZWF0ZSB0aGUgQ29kZUJsb2NrLgotICAgIHRlbXBsYXRlIDx0
eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4KLSAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlv
bihWTSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29k
ZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5j
dG9yPiB2b2lkIGZvckVhY2hDb2RlQmxvY2soRnVuY3RvciYmKTsKLQotcHJpdmF0ZToKLSAgICBm
cmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVj
dXRpb25JbXBsKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25L
aW5kLCBDb2RlQmxvY2sqJik7Ci0KLXByb3RlY3RlZDoKLSAgICBTY3JpcHRFeGVjdXRhYmxlKFN0
cnVjdHVyZSosIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQs
IERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxD
b250ZXh0VHlwZSwgSW50cmluc2ljKTsKLQotICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZt
KQotICAgIHsKLSAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgICAgICB2bS5o
ZWFwLmFkZEV4ZWN1dGFibGUodGhpcyk7IC8vIEJhbGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVubWFy
a2VkQ29tcGlsZWRDb2RlKCkuCi0KLSNpZiBFTkFCTEUoQ09ERUJMT0NLX1NBTVBMSU5HKQotICAg
ICAgICBpZiAoU2FtcGxpbmdUb29sKiBzYW1wbGVyID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBsZXIo
KSkKLSAgICAgICAgICAgIHNhbXBsZXItPm5vdGlmeU9mU2NvcGUodm0sIHRoaXMpOwotI2VuZGlm
Ci0gICAgfQotCi0gICAgQ29kZUZlYXR1cmVzIG1fZmVhdHVyZXM7Ci0gICAgYm9vbCBtX2RpZFRy
eVRvRW50ZXJJbkxvb3A7Ci0gICAgYm9vbCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDogMTsKLSAg
ICBib29sIG1fbmV2ZXJJbmxpbmUgOiAxOwotICAgIGJvb2wgbV9uZXZlck9wdGltaXplIDogMTsK
LSAgICBib29sIG1fbmV2ZXJGVExPcHRpbWl6ZSA6IDE7Ci0gICAgYm9vbCBtX2lzQXJyb3dGdW5j
dGlvbkNvbnRleHQgOiAxOwotICAgIGJvb2wgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7Ci0g
ICAgdW5zaWduZWQgbV9kZXJpdmVkQ29udGV4dFR5cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4dFR5
cGUKLSAgICB1bnNpZ25lZCBtX2V2YWxDb250ZXh0VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0VHlw
ZQotCi0gICAgaW50IG1fb3ZlcnJpZGVMaW5lTnVtYmVyOwotICAgIGludCBtX2ZpcnN0TGluZTsK
LSAgICBpbnQgbV9sYXN0TGluZTsKLSAgICB1bnNpZ25lZCBtX3N0YXJ0Q29sdW1uOwotICAgIHVu
c2lnbmVkIG1fZW5kQ29sdW1uOwotICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0OwotICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKLSAgICBTb3VyY2VD
b2RlIG1fc291cmNlOwotfTsKLQotY2xhc3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMg
U2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3Rv
cjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8
IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCop
OwotCi0gICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVy
biBtX2V2YWxDb2RlQmxvY2suZ2V0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIEV2YWxFeGVjdXRh
YmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmlj
dENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
LCBFdmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKLQotICAgIFBh
c3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1
cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0
dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRl
KHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0
cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5G
TzsKLQotICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4g
RXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwg
Q29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVy
QmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVk
Q29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRl
eHRUeXBlKCkpOyB9Ci0KLSAgICB1bnNpZ25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3Vu
bGlua2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFibGVzKCk7IH0KLSAgICB1bnNpZ25lZCBudW1i
ZXJPZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVt
YmVyT2ZGdW5jdGlvbkRlY2xzKCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhl
Y3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBF
dmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmlj
dENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
LCBFdmFsQ29udGV4dFR5cGUpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0Nl
bGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1f
ZXZhbENvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBt
X3VubGlua2VkRXZhbENvZGVCbG9jazsKLX07Ci0KLWNsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZp
bmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9m
ZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJh
c2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3Ry
dWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIFByb2dyYW1F
eGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3Vy
Y2UpCi0gICAgewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAo
Tm90TnVsbCwgYWxsb2NhdGVDZWxsPFByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkg
UHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+Zmlu
aXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAg
IH0KLQotCi0gICAgSlNPYmplY3QqIGluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwgQ2Fs
bEZyYW1lKiwgSlNTY29wZSopOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsK
LQotICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCi0gICAgewotICAgICAgICByZXR1
cm4gbV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAgIH0KLQotICAgIEpTT2JqZWN0KiBjaGVj
a1N5bnRheChFeGVjU3RhdGUqKTsKLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVk
SklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwo
KTsKLSAgICB9Ci0gICAgICAgIAotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVy
ZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0g
ICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwg
cHJvdG8sIFR5cGVJbmZvKFByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBp
bmZvKCkpOwotICAgIH0KLSAgICAgICAgCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgRXhlY3V0
YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1
c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6
Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVk
ZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBp
c0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9
Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIGZyaWVu
ZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwotCi0gICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0
YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJl
bihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkUHJv
Z3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJy
aWVyPFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3JhbUNvZGVCbG9jazsKLX07Ci0KLWNsYXNzIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewot
ICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlw
ZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0
cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFs
OwotCi0gICAgc3RhdGljIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRl
KiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwq
KTsKLQotICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCi0gICAgewotICAg
ICAgICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAgIH0KLQotICAg
IFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICBy
ZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3Ry
dWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3Jl
YXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICBERUNMQVJF
X0lORk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0
dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFs
c2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpNb2R1bGUsIFN1
cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6Ok1vZHVsZUV2YWx1YXRlTW9k
ZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2Us
IEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKCkgeyByZXR1cm4gbV91bmxp
bmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7IH0KLQotICAgIFN5bWJvbFRhYmxlKiBt
b2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkgeyByZXR1cm4gbV9tb2R1bGVFbnZpcm9ubWVu
dFN5bWJvbFRhYmxlLmdldCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1
dGFibGVCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwotCi0gICAgTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0g
ICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0g
ICAgV3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtl
ZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxlPiBt
X21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7Ci0gICAgV3JpdGVCYXJyaWVyPE1vZHVsZVBy
b2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLX07Ci0KLWNsYXNzIEZ1
bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKLSAgICBm
cmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7
Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBT
dHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogY3Jl
YXRlKAotICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgCi0gICAgICAgIHVuc2lnbmVk
IGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNp
Z25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgewotICAgICAgICBGdW5j
dGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxG
dW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5jdGlvbkV4ZWN1dGFibGUodm0sIHNvdXJj
ZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBzdGFydENvbHVtbiwg
ZW5kQ29sdW1uLCBpbnRyaW5zaWMpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlv
bih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLSAgICBzdGF0aWMgRnVu
Y3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgKLSAgICAgICAgY29uc3QgSWRlbnRpZmll
ciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNlQ29kZSYsIAotICAgICAgICBKU09iamVj
dComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcik7Ci0KLSAgICBzdGF0aWMgdm9p
ZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
X3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIGVpdGhl
ciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhpcyBjYW4gYmUgYXBwcm9wcmlhdGUKLSAg
ICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0IHRoYXQgZG9uJ3QgdmFyeSBiZXR3ZWVu
IGNhbGwgYW5kIGNvbnN0cnVjdCAtLQotICAgIC8vIGZvciBleGFtcGxlLCBhcmd1bWVudHNSZWdp
c3RlcigpLgotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBlaXRoZXJDb2RlQmxvY2soKQotICAgIHsK
LSAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBtX2Nv
ZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0
cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDYWxs
KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAhIW1fY29kZUJsb2NrRm9yQ2FsbDsKLSAg
ICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCi0gICAgewot
ICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgIH0KLQotICAgIGJv
b2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJu
IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLQotICAgIEZ1bmN0aW9uQ29k
ZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBp
c0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAg
ICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRl
ZEZvckNhbGwoKTsKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0g
ICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpOwotICAgIH0KLSAgICAgICAg
Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAg
ICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7Ci0gICAgICAgIEFTU0VSVChraW5kID09
IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9yQ29uc3RydWN0
KCk7Ci0gICAgfQotCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9y
KENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwotICAgICAgICAKLSAgICBGdW5jdGlvbkNvZGVCbG9j
ayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJsb2NrRm9yKGtpbmQpOwotICAgIH0KLQot
ICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KCkgCi0gICAgewotICAg
ICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCkKLSAgICAgICAgICAgIG1fcmV0dXJu
U3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0ZSgpOwotCi0gICAgICAgIHJldHVybiBt
X3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgfQotICAgICAgICAKLSAgICBGdW5jdGlvbk1v
ZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9u
TW9kZSgpOyB9Ci0gICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
dW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5jdGlvbigpOyB9Ci0gICAgQ29uc3RydWN0
QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1
dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQotICAgIGJvb2wgaXNDbGFzcygpIGNvbnN0IHsg
cmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9Ci0gICAgYm9vbCBpc0Fycm93RnVuY3Rp
b24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OkFycm93
RnVuY3Rpb25Nb2RlOyB9Ci0gICAgYm9vbCBpc0dldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNl
TW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVyTW9kZTsgfQotICAgIGJvb2wgaXNTZXR0
ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OlNldHRl
ck1vZGU7IH0KLSAgICBib29sIGlzR2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gU291cmNlUGFy
c2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsIFNvdXJjZVBhcnNl
TW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZSkuY29udGFpbnMocGFyc2VNb2RlKCkp
OyB9Ci0gICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNv
dXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQotICAgIGJvb2wgaGFzQ2FsbGVyQW5kQXJndW1l
bnRzUHJvcGVydGllcygpIGNvbnN0Ci0gICAgewotICAgICAgICAvLyBQZXIgaHR0cHM6Ly90YzM5
LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVuLWV4dGVuc2lvbnMsIG9ubHkgc2xvcHB5
LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9sZC1zdHlsZSAocHJlLUVTNikgc3ludGFj
dGljIGZvcm1zIGNhbiBjb250YWluCi0gICAgICAgIC8vICJjYWxsZXIiIGFuZCAiYXJndW1lbnRz
Ii4KLSAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUoKSAmJiBwYXJzZU1vZGUoKSA9PSBTb3Vy
Y2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAmJiAhaXNDbGFzc0NvbnN0cnVjdG9yRnVu
Y3Rpb24oKTsKLSAgICB9Ci0gICAgYm9vbCBoYXNQcm90b3R5cGVQcm9wZXJ0eSgpIGNvbnN0Ci0g
ICAgewotICAgICAgICByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KAotICAgICAgICAgICAgU291
cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUsCi0gICAgICAgICAgICBTb3VyY2VQYXJz
ZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAotICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpH
ZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCi0gICAgICAgICkuY29udGFpbnMocGFyc2VNb2Rl
KCkpIHx8IGlzQ2xhc3MoKTsKLSAgICB9Ci0gICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRD
b250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVk
Q29udGV4dFR5cGUoKTsgfQotICAgIGJvb2wgaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKSBj
b25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNDbGFzc0NvbnN0cnVjdG9yRnVu
Y3Rpb24oKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUoKSB7IHJldHVybiBtX3VubGlu
a2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYgZWNtYU5hbWUo
KSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZWNtYU5hbWUoKTsgfQotICAgIGNvbnN0
IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5pbmZlcnJlZE5hbWUoKTsgfQotICAgIHVuc2lnbmVkIHBhcmFtZXRlckNvdW50KCkgY29uc3Qg
eyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7IH0gLy8gRXhj
bHVkaW5nICd0aGlzJyEKLSAgICB1bnNpZ25lZCBmdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbkxlbmd0aCgpOyB9Ci0gICAgU291cmNl
UGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5wYXJzZU1vZGUoKTsgfQotICAgIEpTUGFyc2VyU2NyaXB0TW9kZSBzY3JpcHRNb2RlKCkgY29u
c3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnNjcmlwdE1vZGUoKTsgfQotICAgIGNv
bnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4
ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KLQotICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRy
ZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVT
dHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHBy
b3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxP
YmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zm
c2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7IH0KLQotICAgIHZv
aWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmlsaW5nU3RhcnRFbmRPZmZzZXRzKHVuc2ln
bmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KQotICAgIHsKLSAgICAgICAgbV9w
YXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7Ci0gICAgICAgIG1f
dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OwotICAg
ICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0Owot
ICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEluZmVycmVkVmFsdWUqIHNpbmdsZXRv
bkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25GdW5jdGlvbi5nZXQoKTsgfQotCi1wcml2
YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBGdW5jdGlvbkV4ZWN1
dGFibGUoCi0gICAgICAgIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIFVubGlua2VkRnVuY3Rpb25F
eGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAKLSAgICAgICAgdW5zaWduZWQgbGFzdExp
bmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyk7
Ci0gICAgCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYpOwotCi0gICAgZnJpZW5kIGNsYXNz
IFNjcmlwdEV4ZWN1dGFibGU7Ci0gICAgCi0gICAgdW5zaWduZWQgbV9wYXJhbWV0ZXJzU3RhcnRP
ZmZzZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlPiBtX3Vu
bGlua2VkRXhlY3V0YWJsZTsKLSAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1f
Y29kZUJsb2NrRm9yQ2FsbDsKLSAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0OwotICAgIFJlZlB0cjxUeXBlU2V0PiBtX3JldHVyblN0YXRl
bWVudFR5cGVTZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPEluZmVycmVkVmFsdWU+IG1fc2luZ2xldG9u
RnVuY3Rpb247Ci19OwotCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotY2xhc3MgV2ViQXNzZW1i
bHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLXB1YmxpYzoKLSAg
ICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk
IFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9y
dGFsOwotCi0gICAgc3RhdGljIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwg
Y29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWduZWQg
ZnVuY3Rpb25JbmRleCkKLSAgICB7Ci0gICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFdlYkFzc2VtYmx5RXhlY3V0YWJs
ZT4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSh2bSwgc291cmNlLCBtb2R1bGUsIGZ1
bmN0aW9uSW5kZXgpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7Ci0g
ICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUq
IGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpT
VmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0s
IGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGUs
IFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0
cm95KEpTQ2VsbCopOwotCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgdm9pZCBwcmVwYXJlRm9y
RXhlY3V0aW9uKFZNJik7Ci0KLSAgICBXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2NrRm9y
Q2FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwot
ICAgIH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAg
V2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3QgU291cmNlQ29kZSYsIEpTV2FzbU1vZHVs
ZSosIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGls
ZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgU291cmNlQ29kZSBtX3NvdXJjZTsK
LSAgICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBtX21vZHVsZTsKLSAgICB1bnNpZ25lZCBt
X2Z1bmN0aW9uSW5kZXg7Ci0KLSAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlDb2RlQmxvY2s+
IG1fY29kZUJsb2NrRm9yQ2FsbDsKLX07Ci0jZW5kaWYKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEV4
ZWN1dGFibGVUeXBlPgotSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVj
dXRpb24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVT
cGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQotewot
ICAgIGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7Ci0gICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8
RXhlY3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1
bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVjdXRhYmxlKj4o
dGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1
dGFibGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAgICAgICAgcmVzdWx0
Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+
KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVj
dXRhYmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKLSAgICAgICAgICAg
IHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNlIGlmIChzdGQ6
OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZhbHVlKQotICAg
ICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxGdW5j
dGlvbkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCh2
bSwgZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRDb2RlQmxvY2spOwotfQotCiB9IC8vIG5h
bWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb2dyYW1F
eGVjdXRhYmxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9Qcm9ncmFtRXhlY3V0YWJsZS5jcHAJKHJldmlzaW9uIDIwNzc5MCkJKGZyb20gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5jcHA6MjA3NzkwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvZ3JhbUV4ZWN1dGFibGUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsODQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEz
LCAyMDE1LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkV4ZWN1dGFibGUuaCIKKworI2luY2x1ZGUgIkJhdGNoZWRUcmFuc2l0aW9uT3B0aW1p
emVyLmgiCisjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCisjaW5jbHVkZSAiRGVidWdnZXIuaCIKKyNp
bmNsdWRlICJKSVQuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisjaW5jbHVkZSAiSlNXYXNt
TW9kdWxlLmgiCisjaW5jbHVkZSAiTExJbnRFbnRyeXBvaW50LmgiCisjaW5jbHVkZSAiUGFyc2Vy
LmgiCisjaW5jbHVkZSAiVHlwZVByb2ZpbGVyLmgiCisjaW5jbHVkZSAiVk1JbmxpbmVzLmgiCisj
aW5jbHVkZSA8d3RmL0NvbW1hUHJpbnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsKKworY29uc3Qg
Q2xhc3NJbmZvIEV4ZWN1dGFibGVCYXNlOjpzX2luZm8gPSB7ICJFeGVjdXRhYmxlIiwgMCwgMCwg
Q1JFQVRFX01FVEhPRF9UQUJMRShFeGVjdXRhYmxlQmFzZSkgfTsKKwordm9pZCBFeGVjdXRhYmxl
QmFzZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8RXhlY3V0YWJs
ZUJhc2UqPihjZWxsKS0+RXhlY3V0YWJsZUJhc2U6On5FeGVjdXRhYmxlQmFzZSgpOworfQorCit2
b2lkIEV4ZWN1dGFibGVCYXNlOjpjbGVhckNvZGUoKQoreworI2lmIEVOQUJMRShKSVQpCisgICAg
bV9qaXRDb2RlRm9yQ2FsbCA9IG51bGxwdHI7CisgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0g
bnVsbHB0cjsKKyAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2Vt
YmxlckNvZGVQdHIoKTsKKyAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9
IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOworI2VuZGlmCisgICAgbV9udW1QYXJhbWV0ZXJzRm9y
Q2FsbCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICBtX251bVBhcmFtZXRlcnNG
b3JDb25zdHJ1Y3QgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7CisKKyAgICBpZiAoY2xh
c3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgRnVuY3Rp
b25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRo
aXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuY2xlYXIoKTsKKyAg
ICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuY2xlYXIoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJs
ZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVC
bG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9j
ay5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChjbGFzc0lu
Zm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFByb2dyYW1FeGVj
dXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Cisg
ICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAgICAgICBl
eGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAg
ZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7CisgICAgICAgIGV4
ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7CisgICAg
ICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5jbGVhcigpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKKyAg
ICBpZiAoY2xhc3NJbmZvKCkgPT0gV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAg
ICAgICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFdlYkFzc2Vt
Ymx5RXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0Zv
ckNhbGwuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgQVNT
RVJUKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSk7Cit9CisKK2NvbnN0
IENsYXNzSW5mbyBOYXRpdmVFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJOYXRpdmVFeGVjdXRhYmxl
IiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTmF0aXZl
RXhlY3V0YWJsZSkgfTsKKworTmF0aXZlRXhlY3V0YWJsZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3Jl
YXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9u
IGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5j
dGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1l
KQoreworICAgIE5hdGl2ZUV4ZWN1dGFibGUqIGV4ZWN1dGFibGU7CisgICAgZXhlY3V0YWJsZSA9
IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE5hdGl2ZUV4ZWN1dGFibGU+KHZtLmhlYXApKSBO
YXRpdmVFeGVjdXRhYmxlKHZtLCBmdW5jdGlvbiwgY29uc3RydWN0b3IsIGludHJpbnNpYyk7Cisg
ICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0sIGNhbGxUaHVuaywgY29uc3RydWN0VGh1
bmssIG5hbWUpOworICAgIHJldHVybiBleGVjdXRhYmxlOworfQorCit2b2lkIE5hdGl2ZUV4ZWN1
dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PE5hdGl2ZUV4
ZWN1dGFibGUqPihjZWxsKS0+TmF0aXZlRXhlY3V0YWJsZTo6fk5hdGl2ZUV4ZWN1dGFibGUoKTsK
K30KKworU3RydWN0dXJlKiBOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZt
LCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQoreworICAgIHJl
dHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8o
Q2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKK30KKwordm9pZCBOYXRpdmVFeGVj
dXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRo
dW5rLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJpbmcmIG5h
bWUpCit7CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgIG1faml0Q29kZUZvckNh
bGwgPSBjYWxsVGh1bms7CisgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gY29uc3RydWN0VGh1
bms7CisgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ2Fs
bC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOworICAgIG1faml0Q29kZUZvckNvbnN0
cnVjdFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0LT5hZGRyZXNzRm9yQ2Fs
bChNdXN0Q2hlY2tBcml0eSk7CisgICAgbV9uYW1lID0gbmFtZTsKK30KKworTmF0aXZlRXhlY3V0
YWJsZTo6TmF0aXZlRXhlY3V0YWJsZShWTSYgdm0sIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBO
YXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYykKKyAgICA6IEV4
ZWN1dGFibGVCYXNlKHZtLCB2bS5uYXRpdmVFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1f
UEFSQU1FVEVSU19JU19IT1NULCBpbnRyaW5zaWMpCisgICAgLCBtX2Z1bmN0aW9uKGZ1bmN0aW9u
KQorICAgICwgbV9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikKK3sKK30KKworY29uc3QgQ2xhc3NJ
bmZvIFNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlNjcmlwdEV4ZWN1dGFibGUiLCAmRXhl
Y3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShTY3JpcHRFeGVjdXRh
YmxlKSB9OworCitTY3JpcHRFeGVjdXRhYmxlOjpTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSog
c3RydWN0dXJlLCBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3Ry
aWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBp
c0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUs
IEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgc3RydWN0dXJl
LCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIGludHJpbnNpYykKKyAgICAsIG1fZmVhdHVy
ZXMoaXNJblN0cmljdENvbnRleHQgPyBTdHJpY3RNb2RlRmVhdHVyZSA6IDApCisgICAgLCBtX2Rp
ZFRyeVRvRW50ZXJJbkxvb3AoZmFsc2UpCisgICAgLCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzKGZh
bHNlKQorICAgICwgbV9uZXZlcklubGluZShmYWxzZSkKKyAgICAsIG1fbmV2ZXJPcHRpbWl6ZShm
YWxzZSkKKyAgICAsIG1fbmV2ZXJGVExPcHRpbWl6ZShmYWxzZSkKKyAgICAsIG1faXNBcnJvd0Z1
bmN0aW9uQ29udGV4dChpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQpCisgICAgLCBtX2NhblVzZU9T
UkV4aXRGdXp6aW5nKHRydWUpCisgICAgLCBtX2Rlcml2ZWRDb250ZXh0VHlwZShzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oZGVyaXZlZENvbnRleHRUeXBlKSkKKyAgICAsIG1fZXZhbENvbnRleHRUeXBl
KHN0YXRpY19jYXN0PHVuc2lnbmVkPihldmFsQ29udGV4dFR5cGUpKQorICAgICwgbV9vdmVycmlk
ZUxpbmVOdW1iZXIoLTEpCisgICAgLCBtX2ZpcnN0TGluZSgtMSkKKyAgICAsIG1fbGFzdExpbmUo
LTEpCisgICAgLCBtX3N0YXJ0Q29sdW1uKFVJTlRfTUFYKQorICAgICwgbV9lbmRDb2x1bW4oVUlO
VF9NQVgpCisgICAgLCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldChVSU5UX01BWCkKKyAgICAs
IG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldChVSU5UX01BWCkKKyAgICAsIG1fc291cmNlKHNvdXJj
ZSkKK3sKK30KKwordm9pZCBTY3JpcHRFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkK
K3sKKyAgICBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRhYmxlKj4oY2VsbCktPlNjcmlwdEV4ZWN1
dGFibGU6On5TY3JpcHRFeGVjdXRhYmxlKCk7Cit9CisKK3ZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6
aW5zdGFsbENvZGUoQ29kZUJsb2NrKiBjb2RlQmxvY2spCit7CisgICAgaW5zdGFsbENvZGUoKmNv
ZGVCbG9jay0+dm0oKSwgY29kZUJsb2NrLCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9j
ay0+c3BlY2lhbGl6YXRpb25LaW5kKCkpOworfQorCit2b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omlu
c3RhbGxDb2RlKFZNJiB2bSwgQ29kZUJsb2NrKiBnZW5lcmljQ29kZUJsb2NrLCBDb2RlVHlwZSBj
b2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQoreworICAgIEFTU0VSVCh2bS5o
ZWFwLmlzRGVmZXJyZWQoKSk7CisgICAgCisgICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spCisgICAg
ICAgIENPREVCTE9DS19MT0dfRVZFTlQoZ2VuZXJpY0NvZGVCbG9jaywgImluc3RhbGxDb2RlIiwg
KCkpOworICAgIAorICAgIENvZGVCbG9jayogb2xkQ29kZUJsb2NrID0gbnVsbHB0cjsKKyAgICAK
KyAgICBzd2l0Y2ggKGNvZGVUeXBlKSB7CisgICAgY2FzZSBHbG9iYWxDb2RlOiB7CisgICAgICAg
IFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxl
Kj4odGhpcyk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19j
YXN0PFByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisgICAg
ICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgCisgICAgICAgIG9sZENv
ZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICAgICAg
ZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29k
ZUJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBNb2R1bGVDb2RlOiB7
CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPihn
ZW5lcmljQ29kZUJsb2NrKTsKKworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7
CisKKyAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrLmdldCgpOworICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxv
Y2suc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICBicmVhazsKKyAg
ICB9CisKKyAgICBjYXNlIEV2YWxDb2RlOiB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVj
dXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIEV2YWxDb2Rl
QmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPihnZW5lcmljQ29k
ZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsK
KyAgICAgICAgCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fZXZhbENvZGVC
bG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLnNldE1heUJl
TnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICAg
ICAKKyAgICBjYXNlIEZ1bmN0aW9uQ29kZTogeworICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAg
IEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVC
bG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChraW5k
KSB7CisgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgICAgICBvbGRDb2RlQmxvY2sg
PSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgICAgICAgICBleGVj
dXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxv
Y2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoK
KyAgICAgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29u
c3RydWN0LmdldCgpOworICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25z
dHJ1Y3Quc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIHN3aXRj
aCAoa2luZCkgeworICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgIG1faml0Q29kZUZvckNh
bGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVs
bHB0cjsKKyAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3Nl
bWJsZXJDb2RlUHRyKCk7CisgICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBnZW5lcmlj
Q29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFN
RVRFUlNfTk9UX0NPTVBJTEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvZGVGb3JDb25z
dHJ1Y3Q6CisgICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxvY2sg
PyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkgOiBudWxscHRyOworICAgICAgICBtX2ppdENv
ZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOwor
ICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8g
Z2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NP
TVBJTEVEOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZ2VuZXJpY0NvZGVCbG9j
aykgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChnZW5lcmljQ29kZUJsb2NrLT5vd25lckV4ZWN1
dGFibGUoKSA9PSB0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoSklUQ29kZTo6aXNFeGVj
dXRhYmxlU2NyaXB0KGdlbmVyaWNDb2RlQmxvY2stPmppdFR5cGUoKSkpOworICAgICAgICAKKyAg
ICAgICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VPU1IoKSkKKyAgICAgICAgICAgIGRhdGFMb2coIklu
c3RhbGxpbmcgIiwgKmdlbmVyaWNDb2RlQmxvY2ssICJcbiIpOworICAgICAgICAKKyAgICAgICAg
aWYgKHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlcikKKyAgICAgICAgICAgIHZtLm1fcGVyQnl0ZWNv
ZGVQcm9maWxlci0+ZW5zdXJlQnl0ZWNvZGVzRm9yKGdlbmVyaWNDb2RlQmxvY2spOworICAgICAg
ICAKKyAgICAgICAgaWYgKERlYnVnZ2VyKiBkZWJ1Z2dlciA9IGdlbmVyaWNDb2RlQmxvY2stPmds
b2JhbE9iamVjdCgpLT5kZWJ1Z2dlcigpKQorICAgICAgICAgICAgZGVidWdnZXItPnJlZ2lzdGVy
Q29kZUJsb2NrKGdlbmVyaWNDb2RlQmxvY2spOworICAgIH0KKworICAgIGlmIChvbGRDb2RlQmxv
Y2spCisgICAgICAgIG9sZENvZGVCbG9jay0+dW5saW5rSW5jb21pbmdDYWxscygpOworCisgICAg
dm0uaGVhcC53cml0ZUJhcnJpZXIodGhpcyk7Cit9CisKK0NvZGVCbG9jayogU2NyaXB0RXhlY3V0
YWJsZTo6bmV3Q29kZUJsb2NrRm9yKAorICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwg
SlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBKU09iamVjdComIGV4Y2VwdGlv
bikKK3sKKyAgICBWTSogdm0gPSBzY29wZS0+dm0oKTsKKyAgICBhdXRvIHRocm93U2NvcGUgPSBE
RUNMQVJFX1RIUk9XX1NDT1BFKCp2bSk7CisKKyAgICBBU1NFUlQodm0tPmhlYXAuaXNEZWZlcnJl
ZCgpKTsKKyAgICBBU1NFUlQoc3RhcnRDb2x1bW4oKSAhPSBVSU5UX01BWCk7CisgICAgQVNTRVJU
KGVuZENvbHVtbigpICE9IFVJTlRfTUFYKTsKKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFs
RXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJs
ZS0+bV9ldmFsQ29kZUJsb2NrKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsK
KyAgICAgICAgcmV0dXJuIEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSwKKyAgICAgICAgICAgIGV4
ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLmdldCgpLCBzY29w
ZSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCkpOworICAgIH0K
KyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkg
eworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFt
RXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVG
b3JDYWxsKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNv
ZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAgIHJl
dHVybiBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgICAgICBleGVjdXRhYmxl
LCBleGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCisg
ICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5z
b3VyY2UoKS5zdGFydENvbHVtbigpKTsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0g
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+
KHRoaXMpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAgIHJldHVybiBN
b2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgICAgICBleGVjdXRhYmxl
LCBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2Nv
cGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRh
YmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FTU0VS
VChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSk7CisgICAgUkVMRUFT
RV9BU1NFUlQoZnVuY3Rpb24pOworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICBSRUxFQVNFX0FTU0VSVCgh
ZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xv
YmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgpOworICAgIFBhcnNlckVycm9yIGVycm9y
OworICAgIERlYnVnZ2VyTW9kZSBkZWJ1Z2dlck1vZGUgPSBnbG9iYWxPYmplY3QtPmhhc0ludGVy
YWN0aXZlRGVidWdnZXIoKSA/IERlYnVnZ2VyT24gOiBEZWJ1Z2dlck9mZjsKKyAgICBVbmxpbmtl
ZEZ1bmN0aW9uQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9jayA9IAorICAgICAgICBleGVjdXRh
YmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+dW5saW5rZWRDb2RlQmxvY2tGb3IoCisgICAgICAg
ICAgICAqdm0sIGV4ZWN1dGFibGUtPm1fc291cmNlLCBraW5kLCBkZWJ1Z2dlck1vZGUsIGVycm9y
LCAKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnBhcnNlTW9kZSgpKTsKKyAgICByZWNvcmRQYXJz
ZSgKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmZlYXR1cmVzKCks
IAorICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+aGFzQ2FwdHVyZWRW
YXJpYWJsZXMoKSwgZmlyc3RMaW5lKCksIAorICAgICAgICBsYXN0TGluZSgpLCBzdGFydENvbHVt
bigpLCBlbmRDb2x1bW4oKSk7IAorICAgIGlmICghdW5saW5rZWRDb2RlQmxvY2spIHsKKyAgICAg
ICAgZXhjZXB0aW9uID0gdGhyb3dFeGNlcHRpb24oCisgICAgICAgICAgICBnbG9iYWxPYmplY3Qt
Pmdsb2JhbEV4ZWMoKSwgdGhyb3dTY29wZSwKKyAgICAgICAgICAgIGVycm9yLnRvRXJyb3JPYmpl
Y3QoZ2xvYmFsT2JqZWN0LCBleGVjdXRhYmxlLT5tX3NvdXJjZSkpOworICAgICAgICByZXR1cm4g
bnVsbHB0cjsKKyAgICB9CisKKyAgICBTb3VyY2VQcm92aWRlciogcHJvdmlkZXIgPSBleGVjdXRh
YmxlLT5zb3VyY2UoKS5wcm92aWRlcigpOworICAgIHVuc2lnbmVkIHNvdXJjZU9mZnNldCA9IGV4
ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0T2Zmc2V0KCk7CisgICAgdW5zaWduZWQgc3RhcnRDb2x1
bW4gPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpOworCisgICAgcmV0dXJuIEZ1
bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgIGV4ZWN1dGFibGUsIHVubGlua2Vk
Q29kZUJsb2NrLCBzY29wZSwgcHJvdmlkZXIsIHNvdXJjZU9mZnNldCwgc3RhcnRDb2x1bW4pOwor
fQorCitDb2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld1JlcGxhY2VtZW50Q29kZUJsb2Nr
Rm9yKAorICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sKKyAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VS
VChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgRXZhbENvZGVCbG9j
ayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oCisgICAgICAgICAgICBl
eGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAgICAg
RXZhbENvZGVCbG9jayogcmVzdWx0ID0gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtKCksCisgICAg
ICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICAgICAg
cmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1
dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JD
YWxsKTsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJv
Z3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxp
bmUgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4oCisgICAgICAgICAgICBleGVjdXRh
YmxlLT5tX3Byb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAgICAgUHJv
Z3JhbUNvZGVCbG9jayogcmVzdWx0ID0gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCisg
ICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICAg
ICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29k
ZUZvckNhbGwpOworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBNb2R1bGVQ
cm9ncmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2sqPigKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ay0+YmFzZWxpbmVWZXJzaW9uKCkpOworICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBy
ZXN1bHQgPSBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKKyAgICAgICAgICAg
IENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOworICAgICAgICByZXN1bHQt
PnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVj
dXRhYmxlOjppbmZvKCkpOworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICBGdW5jdGlvbkNvZGVCbG9jayog
YmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KAorICAgICAgICBleGVj
dXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCktPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICBGdW5j
dGlvbkNvZGVCbG9jayogcmVzdWx0ID0gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAor
ICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICByZXN1
bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7CisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKworc3RhdGljIHZvaWQgc2V0dXBMTEludChWTSYgdm0sIENvZGVCbG9jayogY29kZUJsb2Nr
KQoreworICAgIExMSW50OjpzZXRFbnRyeXBvaW50KHZtLCBjb2RlQmxvY2spOworfQorCitzdGF0
aWMgdm9pZCBzZXR1cEpJVChWTSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQoreworI2lmIEVO
QUJMRShKSVQpCisgICAgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gSklUOjpjb21waWxlKCZ2
bSwgY29kZUJsb2NrLCBKSVRDb21waWxhdGlvbk11c3RTdWNjZWVkKTsKKyAgICBSRUxFQVNFX0FT
U0VSVChyZXN1bHQgPT0gQ29tcGlsYXRpb25TdWNjZXNzZnVsKTsKKyNlbHNlCisgICAgVU5VU0VE
X1BBUkFNKHZtKTsKKyAgICBVTlVTRURfUEFSQU0oY29kZUJsb2NrKTsKKyAgICBVTlJFQUNIQUJM
RV9GT1JfUExBVEZPUk0oKTsKKyNlbmRpZgorfQorCitKU09iamVjdCogU2NyaXB0RXhlY3V0YWJs
ZTo6cHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoCisgICAgVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5j
dGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJs
b2NrKiYgcmVzdWx0Q29kZUJsb2NrKQoreworICAgIERlZmVyR0NGb3JBV2hpbGUgZGVmZXJHQyh2
bS5oZWFwKTsKKworICAgIGlmICh2bS5nZXRBbmRDbGVhckZhaWxOZXh0TmV3Q29kZUJsb2NrKCkp
CisgICAgICAgIHJldHVybiBjcmVhdGVFcnJvcihzY29wZS0+Z2xvYmFsT2JqZWN0KCktPmdsb2Jh
bEV4ZWMoKSwgQVNDSUlMaXRlcmFsKCJGb3JjZWQgRmFpbHVyZSIpKTsKKworICAgIEpTT2JqZWN0
KiBleGNlcHRpb24gPSAwOworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbmV3Q29kZUJsb2Nr
Rm9yKGtpbmQsIGZ1bmN0aW9uLCBzY29wZSwgZXhjZXB0aW9uKTsKKyAgICByZXN1bHRDb2RlQmxv
Y2sgPSBjb2RlQmxvY2s7CisgICAgaWYgKCFjb2RlQmxvY2spIHsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQoZXhjZXB0aW9uKTsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9CisgICAg
CisgICAgaWYgKE9wdGlvbnM6OnZhbGlkYXRlQnl0ZWNvZGUoKSkKKyAgICAgICAgY29kZUJsb2Nr
LT52YWxpZGF0ZSgpOworICAgIAorICAgIGlmIChPcHRpb25zOjp1c2VMTEludCgpKQorICAgICAg
ICBzZXR1cExMSW50KHZtLCBjb2RlQmxvY2spOworICAgIGVsc2UKKyAgICAgICAgc2V0dXBKSVQo
dm0sIGNvZGVCbG9jayk7CisgICAgCisgICAgaW5zdGFsbENvZGUodm0sIGNvZGVCbG9jaywgY29k
ZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsKKyAg
ICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgQ2xhc3NJbmZvIEV2YWxFeGVjdXRhYmxlOjpz
X2luZm8gPSB7ICJFdmFsRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAs
IENSRUFURV9NRVRIT0RfVEFCTEUoRXZhbEV4ZWN1dGFibGUpIH07CisKK0V2YWxFeGVjdXRhYmxl
KiBFdmFsRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29k
ZSYgc291cmNlLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVy
aXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0
VHlwZSBldmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqIHZhcmlhYmxl
c1VuZGVyVERaKQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBzY29wZSA9
IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOworCisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9i
amVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKKyAgICBpZiAoIWdsb2JhbE9iamVj
dC0+ZXZhbEVuYWJsZWQoKSkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwg
Y3JlYXRlRXZhbEVycm9yKGV4ZWMsIGdsb2JhbE9iamVjdC0+ZXZhbERpc2FibGVkRXJyb3JNZXNz
YWdlKCkpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRXZhbEV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxFdmFsRXhlY3V0YWJsZT4o
KmV4ZWMtPmhlYXAoKSkpIEV2YWxFeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSwgaXNJblN0cmljdENv
bnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENv
bnRleHRUeXBlKTsKKyAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7CisKKyAgICBV
bmxpbmtlZEV2YWxDb2RlQmxvY2sqIHVubGlua2VkRXZhbENvZGUgPSBnbG9iYWxPYmplY3QtPmNy
ZWF0ZUV2YWxDb2RlQmxvY2soZXhlYywgZXhlY3V0YWJsZSwgdmFyaWFibGVzVW5kZXJURFopOwor
ICAgIGlmICghdW5saW5rZWRFdmFsQ29kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBleGVj
dXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5zZXQodm0sIGV4ZWN1dGFibGUsIHVubGlu
a2VkRXZhbENvZGUpOworCisgICAgcmV0dXJuIGV4ZWN1dGFibGU7Cit9CisKK0V2YWxFeGVjdXRh
YmxlOjpFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNv
dXJjZSwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29u
dGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2
YWxDb250ZXh0VHlwZSkKKyAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5ldmFsRXhl
Y3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBpblN0cmljdENvbnRl
eHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRl
eHRUeXBlLCBOb0ludHJpbnNpYykKK3sKKyAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNv
dXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOworfQorCit2
b2lkIEV2YWxFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNf
Y2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpLT5FdmFsRXhlY3V0YWJsZTo6fkV2YWxFeGVjdXRh
YmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBQcm9ncmFtRXhlY3V0YWJsZTo6c19pbmZvID0g
eyAiUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVB
VEVfTUVUSE9EX1RBQkxFKFByb2dyYW1FeGVjdXRhYmxlKSB9OworCitQcm9ncmFtRXhlY3V0YWJs
ZTo6UHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkucHJvZ3JhbUV4ZWN1dGFi
bGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2ZWRDb250
ZXh0VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5zaWMp
Cit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNl
UHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsKKyAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9m
ZnNldCA9IDA7CisgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0aCgp
IC0gMTsKKyAgICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52bSgpLmNv
bnRyb2xGbG93UHJvZmlsZXIoKSkKKyAgICAgICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4ZWN1
dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlwZVByb2Zp
bGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQpOworfQorCit2b2lkIFBy
b2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2Fz
dDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Qcm9ncmFtRXhlY3V0YWJsZTo6flByb2dyYW1F
eGVjdXRhYmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZTo6c19pbmZvID0geyAiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJs
ZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
KSB9OworCitNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUo
RXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCisgICAgOiBTY3JpcHRF
eGVjdXRhYmxlKGV4ZWMtPnZtKCkubW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0
KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2ZWRDb250ZXh0VHlwZTo6Tm9uZSwg
ZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5zaWMpCit7CisgICAgQVNTRVJU
KHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VU
eXBlOjpNb2R1bGUpOworICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gMDsKKyAgICBt
X3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2UubGVuZ3RoKCkgLSAxOworICAgIGlmIChl
eGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZtKCkuY29udHJvbEZsb3dQcm9maWxl
cigpKQorICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNl
cnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQs
IG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Cit9CisKK01vZHVsZVByb2dyYW1FeGVjdXRhYmxl
KiBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3Qg
U291cmNlQ29kZSYgc291cmNlKQoreworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Qg
PSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKGV4ZWMs
IHNvdXJjZSk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7CisK
KyAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZU1vZHVsZVByb2dyYW1Db2RlQmxvY2soZXhlYywg
ZXhlY3V0YWJsZSk7CisgICAgaWYgKCF1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlKQorICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKKyAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jay5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwgdW5saW5rZWRNb2R1bGVQcm9n
cmFtQ29kZSk7CisKKyAgICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFi
bGUuc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUsIGpzQ2FzdDxTeW1ib2xUYWJsZSo+KHVubGlu
a2VkTW9kdWxlUHJvZ3JhbUNvZGUtPmNvbnN0YW50UmVnaXN0ZXIodW5saW5rZWRNb2R1bGVQcm9n
cmFtQ29kZS0+bW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZUNvbnN0YW50UmVnaXN0ZXJPZmZz
ZXQoKSkuZ2V0KCkpLT5jbG9uZVNjb3BlUGFydChleGVjLT52bSgpKSk7CisKKyAgICByZXR1cm4g
ZXhlY3V0YWJsZTsKK30KKwordm9pZCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShK
U0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
PihjZWxsKS0+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6On5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gRnVuY3Rpb25FeGVjdXRhYmxlOjpzX2luZm8gPSB7
ICJGdW5jdGlvbkV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVB
VEVfTUVUSE9EX1RBQkxFKEZ1bmN0aW9uRXhlY3V0YWJsZSkgfTsKKworRnVuY3Rpb25FeGVjdXRh
YmxlOjpGdW5jdGlvbkV4ZWN1dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2Us
IFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUsIHVuc2lnbmVk
IGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNp
Z25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgOiBTY3JpcHRFeGVjdXRh
YmxlKHZtLmZ1bmN0aW9uRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgdm0sIHNvdXJjZSwgdW5s
aW5rZWRFeGVjdXRhYmxlLT5pc0luU3RyaWN0Q29udGV4dCgpLCB1bmxpbmtlZEV4ZWN1dGFibGUt
PmRlcml2ZWRDb250ZXh0VHlwZSgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBpbnRy
aW5zaWMpCisgICAgLCBtX3VubGlua2VkRXhlY3V0YWJsZSh2bSwgdGhpcywgdW5saW5rZWRFeGVj
dXRhYmxlKQoreworICAgIFJFTEVBU0VfQVNTRVJUKCFzb3VyY2UuaXNOdWxsKCkpOworICAgIEFT
U0VSVChzb3VyY2UubGVuZ3RoKCkpOworICAgIG1fZmlyc3RMaW5lID0gZmlyc3RMaW5lOworICAg
IG1fbGFzdExpbmUgPSBsYXN0TGluZTsKKyAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9N
QVgpOworICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgIG1fc3RhcnRDb2x1
bW4gPSBzdGFydENvbHVtbjsKKyAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKKyAgICBtX3Bh
cmFtZXRlcnNTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+cGFyYW1ldGVyc1N0YXJ0
T2Zmc2V0KCk7CisgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1
dGFibGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpOworICAgIG1fdHlwZVByb2ZpbGluZ0Vu
ZE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpOwor
fQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQorewor
ICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICBtX3NpbmdsZXRvbkZ1bmN0aW9uLnNl
dCh2bSwgdGhpcywgSW5mZXJyZWRWYWx1ZTo6Y3JlYXRlKHZtKSk7Cit9CisKK3ZvaWQgRnVuY3Rp
b25FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2FzdDxG
dW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKS0+RnVuY3Rpb25FeGVjdXRhYmxlOjp+RnVuY3Rpb25F
eGVjdXRhYmxlKCk7Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBzYW1wbGluZ0Rlc2NyaXB0aW9u
KEpJVENvZGU6OkpJVFR5cGUgaml0VHlwZSkKK3sKKyAgICBzd2l0Y2ggKGppdFR5cGUpIHsKKyAg
ICBjYXNlIEpJVENvZGU6OkludGVycHJldGVyVGh1bms6CisgICAgICAgIHJldHVybiAiSW50ZXJw
cmV0ZXIgQ29tcGlsYXRpb24gKFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpCYXNlbGluZUpJ
VDoKKyAgICAgICAgcmV0dXJuICJCYXNlbGluZSBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAgICBj
YXNlIEpJVENvZGU6OkRGR0pJVDoKKyAgICAgICAgcmV0dXJuICJERkcgQ29tcGlsYXRpb24gKFRP
VEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpGVExKSVQ6CisgICAgICAgIHJldHVybiAiRlRMIENv
bXBpbGF0aW9uIChUT1RBTCkiOworICAgIGRlZmF1bHQ6CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCBFdmFs
RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNp
dG9yKQoreworICAgIEV2YWxFeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEV2YWxFeGVj
dXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0
LCBpbmZvKCkpOworICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVj
dCwgdmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRF
dmFsQ29kZUJsb2NrKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9ldmFsQ29kZUJsb2NrKQorICAg
ICAgICB0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwor
fQorCitKU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6OmNoZWNrU3ludGF4KEV4ZWNTdGF0ZSog
ZXhlYykKK3sKKyAgICBQYXJzZXJFcnJvciBlcnJvcjsKKyAgICBWTSogdm0gPSAmZXhlYy0+dm0o
KTsKKyAgICBKU0dsb2JhbE9iamVjdCogbGV4aWNhbEdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGlj
YWxHbG9iYWxPYmplY3QoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbU5vZGU+IHByb2dy
YW1Ob2RlID0gcGFyc2U8UHJvZ3JhbU5vZGU+KAorICAgICAgICB2bSwgbV9zb3VyY2UsIElkZW50
aWZpZXIoKSwgSlNQYXJzZXJCdWlsdGluTW9kZTo6Tm90QnVpbHRpbiwKKyAgICAgICAgSlNQYXJz
ZXJTdHJpY3RNb2RlOjpOb3RTdHJpY3QsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU291
cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIGVycm9y
KTsKKyAgICBpZiAocHJvZ3JhbU5vZGUpCisgICAgICAgIHJldHVybiAwOworICAgIEFTU0VSVChl
cnJvci5pc1ZhbGlkKCkpOworICAgIHJldHVybiBlcnJvci50b0Vycm9yT2JqZWN0KGxleGljYWxH
bG9iYWxPYmplY3QsIG1fc291cmNlKTsKK30KKworSlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxl
Ojppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYgdm0sIENhbGxGcmFtZSogY2FsbEZyYW1l
LCBKU1Njb3BlKiBzY29wZSkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVChzY29wZSk7CisgICAgSlNH
bG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKKyAgICBS
RUxFQVNFX0FTU0VSVChnbG9iYWxPYmplY3QpOworICAgIEFTU0VSVCgmZ2xvYmFsT2JqZWN0LT52
bSgpID09ICZ2bSk7CisKKyAgICBKU09iamVjdCogZXhjZXB0aW9uID0gMDsKKyAgICBVbmxpbmtl
ZFByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2NrID0gZ2xvYmFsT2JqZWN0LT5jcmVh
dGVQcm9ncmFtQ29kZUJsb2NrKGNhbGxGcmFtZSwgdGhpcywgJmV4Y2VwdGlvbik7CisgICAgaWYg
KGV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAgIEpTR2xvYmFsTGV4
aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQgPSBnbG9iYWxPYmplY3Qt
Pmdsb2JhbExleGljYWxFbnZpcm9ubWVudCgpOworICAgIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1l
bnQmIHZhcmlhYmxlRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPnZhcmlhYmxlRGVj
bGFyYXRpb25zKCk7CisgICAgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCYgbGV4aWNhbERlY2xh
cmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5sZXhpY2FsRGVjbGFyYXRpb25zKCk7CisgICAg
Ly8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBubyB2YXJzL2dsb2JhbCBwcm9wZXJ0aWVzL2xldC9j
b25zdCBjYW4gYmUgZHVwbGljYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorICAgIC8vIFRoaXMg
Y2FycmllZCBvdXQgc2VjdGlvbiAxNS4xLjggb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVj
bWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWdsb2JhbGRl
Y2xhcmF0aW9uaW5zdGFudGlhdGlvbgorICAgIHsKKyAgICAgICAgRXhlY1N0YXRlKiBleGVjID0g
Z2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7CisgICAgICAgIC8vIENoZWNrIGZvciBpbnRlcnNl
Y3Rpb24gb2YgInZhciIgYW5kICJsZXQiLyJjb25zdCIvImNsYXNzIgorICAgICAgICBmb3IgKGF1
dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaWYgKHZhcmlh
YmxlRGVjbGFyYXRpb25zLmNvbnRhaW5zKGVudHJ5LmtleSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBs
aWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJsZXQiLyJjb25zdCIvImNsYXNz
IiB3aWxsIHNoYWRvdyBhbnkgcHJlLWV4aXN0aW5nIGdsb2JhbCBwcm9wZXJ0eSBuYW1lcywgb3Ig
InZhciIvImxldCIvImNvbnN0IiB2YXJpYWJsZXMuCisgICAgICAgIC8vIEl0J3MgYW4gZXJyb3Ig
dG8gaW50cm9kdWNlIGEgc2hhZG93LgorICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNh
bERlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaWYgKGdsb2JhbE9iamVjdC0+aGFzUHJvcGVy
dHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBFUzYg
c3BlYyBzYXlzIHRoYXQganVzdCBSZXN0cmljdGVkR2xvYmFsUHJvcGVydHkgY2FuJ3QgYmUgc2hh
ZG93ZWQKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gOC4xLjEu
NC4xNCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9l
Y21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtaGFzcmVzdHJpY3RlZGdsb2JhbHByb3BlcnR5Cisg
ICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgICAgICAg
ICAgICAgZ2xvYmFsT2JqZWN0LT5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXhlYywgZW50cnku
a2V5LmdldCgpLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpICE9IGpzVW5kZWZpbmVkKCkgJiYgIWRlc2NyaXB0b3Iu
Y29uZmlndXJhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhF
cnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlIHRo
YXQgc2hhZG93cyBhIGdsb2JhbCBwcm9wZXJ0eTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkp
LCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlm
IChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5n
ZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUuaXNDb25z
dCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYmICFpc1N0
cmljdE1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhbGxvdyAiY29u
c3QiIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgdW5kZXIgdGhpcyBzZXR0aW5nLgorICAgICAgICAg
ICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2UgZG9uJ3QgImxldCIgdmFyaWFibGVzIHRvIGJl
IG92ZXJyaWRkZW4gYnkgImNvbnN0IiB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgICAgIGlm
IChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzQ29uc3RWYXJpYWJsZShlbnRyeS5rZXkuZ2V0
KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3Ry
aW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5Lmtl
eS5nZXQoKSksICInIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8g
Q2hlY2sgaWYgYW55IG5ldyAidmFyInMgd2lsbCBzaGFkb3cgYW55IHByZXZpb3VzICJsZXQiLyJj
b25zdCIvImNsYXNzIiBuYW1lcy4KKyAgICAgICAgLy8gSXQncyBhbiBlcnJvciB0byBpbnRyb2R1
Y2UgYSBzaGFkb3cuCisgICAgICAgIGlmICghZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0
aW9ucykgeworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhh
c1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVw
bGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBtX3VubGlua2VkUHJvZ3JhbUNv
ZGVCbG9jay5zZXQodm0sIHRoaXMsIHVubGlua2VkQ29kZUJsb2NrKTsKKworICAgIEJhdGNoZWRU
cmFuc2l0aW9uT3B0aW1pemVyIG9wdGltaXplcih2bSwgZ2xvYmFsT2JqZWN0KTsKKworICAgIGZv
ciAoc2l6ZV90IGkgPSAwLCBudW1iZXJPZkZ1bmN0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5u
dW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgaSA8IG51bWJlck9mRnVuY3Rpb25zOyArK2kpIHsKKyAg
ICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlID0gdW5saW5rZWRDb2RlQmxvY2stPmZ1bmN0aW9uRGVjbChpKTsKKyAgICAgICAgQVNTRVJU
KCF1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAg
IGdsb2JhbE9iamVjdC0+YWRkRnVuY3Rpb24oY2FsbEZyYW1lLCB1bmxpbmtlZEZ1bmN0aW9uRXhl
Y3V0YWJsZS0+bmFtZSgpKTsKKyAgICAgICAgaWYgKHZtLnR5cGVQcm9maWxlcigpIHx8IHZtLmNv
bnRyb2xGbG93UHJvZmlsZXIoKSkgeworICAgICAgICAgICAgdm0uZnVuY3Rpb25IYXNFeGVjdXRl
ZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCAKKyAgICAgICAgICAg
ICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
KCksIAorICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvJiBl
bnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7CisgICAgICAgIEFTU0VSVChlbnRyeS52YWx1
ZS5pc1ZhcigpKTsKKyAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRWYXIoY2FsbEZyYW1lLCBJZGVu
dGlmaWVyOjpmcm9tVWlkKCZ2bSwgZW50cnkua2V5LmdldCgpKSk7CisgICAgfQorCisgICAgewor
ICAgICAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25t
ZW50ID0ganNDYXN0PEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50Kj4oZ2xvYmFsT2JqZWN0LT5n
bG9iYWxTY29wZSgpKTsKKyAgICAgICAgU3ltYm9sVGFibGUqIHN5bWJvbFRhYmxlID0gZ2xvYmFs
TGV4aWNhbEVudmlyb25tZW50LT5zeW1ib2xUYWJsZSgpOworICAgICAgICBDb25jdXJyZW50SklU
TG9ja2VyIGxvY2tlcihzeW1ib2xUYWJsZS0+bV9sb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBl
bnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChVTkxJS0VMWShl
bnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3Vs
ZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChzeW1i
b2xUYWJsZS0+Y29udGFpbnMobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCkpKQorICAgICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNjb3BlT2Zmc2V0
IG9mZnNldCA9IHN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3BlT2Zmc2V0KGxvY2tlcik7CisgICAg
ICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IG5ld0VudHJ5KFZhck9mZnNldChvZmZzZXQpLCBlbnRy
eS52YWx1ZS5pc0NvbnN0KCkgPyBSZWFkT25seSA6IDApOworICAgICAgICAgICAgbmV3RW50cnku
cHJlcGFyZVRvV2F0Y2goKTsKKyAgICAgICAgICAgIHN5bWJvbFRhYmxlLT5hZGQobG9ja2VyLCBl
bnRyeS5rZXkuZ2V0KCksIG5ld0VudHJ5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU2Nv
cGVPZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0ID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5hZGRW
YXJpYWJsZXMoMSwganNURFpWYWx1ZSgpKTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG9m
ZnNldEZvckFzc2VydCA9PSBvZmZzZXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAw
OworfQorCit2b2lkIFByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2Vs
bCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIHRoaXNP
YmplY3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0Nf
T0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJs
ZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFwcGVu
ZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2spOworICAgIGlmICh0aGlz
T2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2spCisgICAgICAgIHRoaXNPYmplY3QtPm1fcHJvZ3Jh
bUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Cit9CisKK3ZvaWQgTW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlz
aXRvcikKK3sKKyAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2Fz
dDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1Rf
SU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNp
dENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlz
T2JqZWN0LT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7CisgICAgdmlzaXRvci5h
cHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZSk7CisgICAg
aWYgKHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jaykKKyAgICAgICAgdGhpc09i
amVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKK30K
KworRnVuY3Rpb25Db2RlQmxvY2sqIEZ1bmN0aW9uRXhlY3V0YWJsZTo6YmFzZWxpbmVDb2RlQmxv
Y2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQoreworICAgIEZ1bmN0aW9uQ29kZUJs
b2NrKiByZXN1bHQ7CisgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJlc3Vs
dCA9IG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmVzdWx0ID0gbV9j
b2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAgfQorICAgIGlmICghcmVzdWx0KQorICAg
ICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sq
PihyZXN1bHQtPmJhc2VsaW5lQWx0ZXJuYXRpdmUoKSk7Cit9CisKK3ZvaWQgRnVuY3Rpb25FeGVj
dXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3Ip
Cit7CisgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEZ1bmN0aW9u
RXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09i
amVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNP
YmplY3QsIHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwp
CisgICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlz
aXRvcik7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0KQorICAg
ICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC0+dmlzaXRXZWFrbHkodmlz
aXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRFeGVjdXRh
YmxlKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9zaW5nbGV0b25GdW5jdGlv
bik7Cit9CisKK0Z1bmN0aW9uRXhlY3V0YWJsZSogRnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xv
YmFsQ29kZSgKKyAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmIGV4ZWMsIGNv
bnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgCisgICAgSlNPYmplY3QqJiBleGNlcHRpb24sIGludCBv
dmVycmlkZUxpbmVOdW1iZXIpCit7CisgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVu
bGlua2VkRXhlY3V0YWJsZSA9IAorICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZTo6
ZnJvbUdsb2JhbENvZGUoCisgICAgICAgICAgICBuYW1lLCBleGVjLCBzb3VyY2UsIGV4Y2VwdGlv
biwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsKKyAgICBpZiAoIXVubGlua2VkRXhlY3V0YWJsZSkKKyAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gdW5saW5rZWRFeGVjdXRhYmxlLT5s
aW5rKGV4ZWMudm0oKSwgc291cmNlLCBvdmVycmlkZUxpbmVOdW1iZXIpOworfQorCisjaWYgRU5B
QkxFKFdFQkFTU0VNQkxZKQorY29uc3QgQ2xhc3NJbmZvIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6
c19pbmZvID0geyAiV2ViQXNzZW1ibHlFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2lu
Zm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoV2ViQXNzZW1ibHlFeGVjdXRhYmxlKSB9OworCitX
ZWJBc3NlbWJseUV4ZWN1dGFibGU6OldlYkFzc2VtYmx5RXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0
IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1bmN0
aW9uSW5kZXgpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0ud2ViQXNzZW1ibHlFeGVjdXRh
YmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIE5vSW50cmlu
c2ljKQorICAgICwgbV9zb3VyY2Uoc291cmNlKQorICAgICwgbV9tb2R1bGUodm0sIHRoaXMsIG1v
ZHVsZSkKKyAgICAsIG1fZnVuY3Rpb25JbmRleChmdW5jdGlvbkluZGV4KQoreworICAgIEFTU0VS
VChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNl
VHlwZTo6V2ViQXNzZW1ibHkpOworfQorCit2b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6ZGVz
dHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8V2ViQXNzZW1ibHlFeGVjdXRh
YmxlKj4oY2VsbCktPldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6fldlYkFzc2VtYmx5RXhlY3V0YWJs
ZSgpOworfQorCit2b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0Nl
bGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIFdlYkFzc2VtYmx5RXhlY3V0
YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPihjZWxsKTsK
KyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAg
RXhlY3V0YWJsZUJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7CisgICAg
aWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbCkKKyAgICAgICAgdGhpc09iamVjdC0+
bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFw
cGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGUpOworfQorI2VuZGlmCisKK3ZvaWQgRXhlY3V0YWJs
ZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBFeGVjdXRhYmxlQmFz
ZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0PEV4ZWN1dGFibGVCYXNlKj4odGhpcyk7CisgICAgCisg
ICAgaWYgKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAg
ICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRpdmUgPSBqc0Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+KHJl
YWxUaGlzKTsKKyAgICAgICAgb3V0LnByaW50KCJOYXRpdmVFeGVjdXRhYmxlOiIsIFJhd1BvaW50
ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUtPmZ1bmN0aW9uKCkpKSwgIi8iLCBSYXdQb2lu
dGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5jb25zdHJ1Y3RvcigpKSkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0
YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PEV2
YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxv
Y2sgPSBldmFsLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2Nr
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCJFdmFsRXhlY3V0YWJsZSB3
L28gQ29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYgKGNs
YXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUHJvZ3Jh
bUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7
CisgICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV2YWwtPmNvZGVCbG9jaygpKQor
ICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBvdXQucHJpbnQoIlByb2dyYW1FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBl
eGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwor
ICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5jb2RlQmxvY2so
KSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgb3V0LnByaW50KCJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSB3L28gQ29kZUJsb2Nr
Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgRnVuY3Rpb25FeGVjdXRhYmxl
KiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihyZWFsVGhpcyk7CisgICAg
aWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29kZUJsb2NrKCkpCisgICAgICAgIG91dC5wcmludCgiRnVu
Y3Rpb25FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAgICBlbHNlIHsKKyAgICAgICAgQ29t
bWFQcmludGVyIGNvbW1hKCIvIik7CisgICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9y
Q2FsbCgpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVCbG9j
a0ZvckNhbGwoKSk7CisgICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0
KCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9y
Q29uc3RydWN0KCkpOworICAgIH0KK30KKworQ29kZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFzZTo6
aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cit7CisgICAgaWYgKHRo
aXMtPmNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkKKyAgICAgICAgcmV0
dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7
CisgICAgCisgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBTY3JpcHRFeGVjdXRhYmxlKj4odGhpcykt
Pmhhc2hGb3Ioa2luZCk7Cit9CisKK0NvZGVCbG9ja0hhc2ggTmF0aXZlRXhlY3V0YWJsZTo6aGFz
aEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cit7CisgICAgaWYgKGtpbmQg
PT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0
PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2Z1bmN0aW9uKSkpOworICAgIAorICAg
IFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgcmV0dXJuIENv
ZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+KG1f
Y29uc3RydWN0b3IpKSk7Cit9CisKK0NvZGVCbG9ja0hhc2ggU2NyaXB0RXhlY3V0YWJsZTo6aGFz
aEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cit7CisgICAgcmV0dXJuIENv
ZGVCbG9ja0hhc2goc291cmNlKCksIGtpbmQpOworfQorCit9CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9Qcm9ncmFtRXhlY3V0YWJsZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvZ3JhbUV4ZWN1dGFibGUuY3BwCShyZXZpc2lv
biAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm9ncmFtRXhlY3V0
YWJsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDYgQEAKICAqLwogCiAjaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogCiAjaW5jbHVkZSAiQmF0Y2hl
ZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCIKICNpbmNsdWRlICJDb2RlQmxvY2suaCIKQEAgLTQwLDQy
NyArMzksNiBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAotY29uc3QgQ2xhc3NJbmZvIEV4ZWN1dGFi
bGVCYXNlOjpzX2luZm8gPSB7ICJFeGVjdXRhYmxlIiwgMCwgMCwgQ1JFQVRFX01FVEhPRF9UQUJM
RShFeGVjdXRhYmxlQmFzZSkgfTsKLQotdm9pZCBFeGVjdXRhYmxlQmFzZTo6ZGVzdHJveShKU0Nl
bGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8RXhlY3V0YWJsZUJhc2UqPihjZWxsKS0+RXhl
Y3V0YWJsZUJhc2U6On5FeGVjdXRhYmxlQmFzZSgpOwotfQotCi12b2lkIEV4ZWN1dGFibGVCYXNl
OjpjbGVhckNvZGUoKQotewotI2lmIEVOQUJMRShKSVQpCi0gICAgbV9qaXRDb2RlRm9yQ2FsbCA9
IG51bGxwdHI7Ci0gICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gbnVsbHB0cjsKLSAgICBtX2pp
dENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKLSAg
ICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29k
ZVB0cigpOwotI2VuZGlmCi0gICAgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9IE5VTV9QQVJBTUVU
RVJTX05PVF9DT01QSUxFRDsKLSAgICBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPSBOVU1f
UEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRnVuY3Rp
b25FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVj
dXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVj
dXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuY2xlYXIoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+
bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAg
ICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4o
dGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5jbGVhcigpOwotICAg
ICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5jbGVhcigpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhl
Y3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxl
ID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUt
Pm1fcHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlu
a2VkUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsK
LSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9tb2R1
bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5r
ZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1f
bW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIAotI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKLSAgICBpZiAoY2xhc3NJbmZvKCkg
PT0gV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgV2ViQXNzZW1ibHlF
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KHRo
aXMpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuY2xlYXIoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgQVNTRVJUKGNsYXNzSW5mbygpID09
IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBOYXRpdmVF
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJOYXRpdmVFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNl
OjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTmF0aXZlRXhlY3V0YWJsZSkgfTsKLQot
TmF0aXZlRXhlY3V0YWJsZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlKFZNJiB2bSwgUGFzc1Jl
ZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVm
UHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3Rvciwg
SW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIE5hdGl2ZUV4
ZWN1dGFibGUqIGV4ZWN1dGFibGU7Ci0gICAgZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxs
b2NhdGVDZWxsPE5hdGl2ZUV4ZWN1dGFibGU+KHZtLmhlYXApKSBOYXRpdmVFeGVjdXRhYmxlKHZt
LCBmdW5jdGlvbiwgY29uc3RydWN0b3IsIGludHJpbnNpYyk7Ci0gICAgZXhlY3V0YWJsZS0+Zmlu
aXNoQ3JlYXRpb24odm0sIGNhbGxUaHVuaywgY29uc3RydWN0VGh1bmssIG5hbWUpOwotICAgIHJl
dHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE5hdGl2ZUV4ZWN1dGFibGU6OmRlc3Ryb3koSlND
ZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PE5hdGl2ZUV4ZWN1dGFibGUqPihjZWxsKS0+
TmF0aXZlRXhlY3V0YWJsZTo6fk5hdGl2ZUV4ZWN1dGFibGUoKTsKLX0KLQotU3RydWN0dXJlKiBO
YXRpdmVFeGVjdXRhYmxlOjpjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotewotICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNy
ZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oQ2VsbFR5cGUsIFN0cnVjdHVy
ZUZsYWdzKSwgaW5mbygpKTsKLX0KLQotdm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpmaW5pc2hDcmVh
dGlvbihWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBQYXNzUmVmUHRyPEpJ
VENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQmFzZTo6
ZmluaXNoQ3JlYXRpb24odm0pOwotICAgIG1faml0Q29kZUZvckNhbGwgPSBjYWxsVGh1bms7Ci0g
ICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gY29uc3RydWN0VGh1bms7Ci0gICAgbV9qaXRDb2Rl
Rm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ2FsbC0+YWRkcmVzc0ZvckNhbGwo
TXVzdENoZWNrQXJpdHkpOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNr
ID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0LT5hZGRyZXNzRm9yQ2FsbChNdXN0Q2hlY2tBcml0eSk7
Ci0gICAgbV9uYW1lID0gbmFtZTsKLX0KLQotTmF0aXZlRXhlY3V0YWJsZTo6TmF0aXZlRXhlY3V0
YWJsZShWTSYgdm0sIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25z
dHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IEV4ZWN1dGFibGVCYXNlKHZtLCB2
bS5uYXRpdmVFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1FVEVSU19JU19IT1NU
LCBpbnRyaW5zaWMpCi0gICAgLCBtX2Z1bmN0aW9uKGZ1bmN0aW9uKQotICAgICwgbV9jb25zdHJ1
Y3Rvcihjb25zdHJ1Y3RvcikKLXsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIFNjcmlwdEV4ZWN1dGFi
bGU6OnNfaW5mbyA9IHsgIlNjcmlwdEV4ZWN1dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5m
bywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShTY3JpcHRFeGVjdXRhYmxlKSB9OwotCi1TY3JpcHRF
eGVjdXRhYmxlOjpTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSogc3RydWN0dXJlLCBWTSYgdm0s
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZl
ZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNv
bnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUsIEludHJpbnNpYyBpbnRyaW5z
aWMpCi0gICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgc3RydWN0dXJlLCBOVU1fUEFSQU1FVEVSU19O
T1RfQ09NUElMRUQsIGludHJpbnNpYykKLSAgICAsIG1fZmVhdHVyZXMoaXNJblN0cmljdENvbnRl
eHQgPyBTdHJpY3RNb2RlRmVhdHVyZSA6IDApCi0gICAgLCBtX2RpZFRyeVRvRW50ZXJJbkxvb3Ao
ZmFsc2UpCi0gICAgLCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzKGZhbHNlKQotICAgICwgbV9uZXZl
cklubGluZShmYWxzZSkKLSAgICAsIG1fbmV2ZXJPcHRpbWl6ZShmYWxzZSkKLSAgICAsIG1fbmV2
ZXJGVExPcHRpbWl6ZShmYWxzZSkKLSAgICAsIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dChpc0lu
QXJyb3dGdW5jdGlvbkNvbnRleHQpCi0gICAgLCBtX2NhblVzZU9TUkV4aXRGdXp6aW5nKHRydWUp
Ci0gICAgLCBtX2Rlcml2ZWRDb250ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZGVyaXZl
ZENvbnRleHRUeXBlKSkKLSAgICAsIG1fZXZhbENvbnRleHRUeXBlKHN0YXRpY19jYXN0PHVuc2ln
bmVkPihldmFsQ29udGV4dFR5cGUpKQotICAgICwgbV9vdmVycmlkZUxpbmVOdW1iZXIoLTEpCi0g
ICAgLCBtX2ZpcnN0TGluZSgtMSkKLSAgICAsIG1fbGFzdExpbmUoLTEpCi0gICAgLCBtX3N0YXJ0
Q29sdW1uKFVJTlRfTUFYKQotICAgICwgbV9lbmRDb2x1bW4oVUlOVF9NQVgpCi0gICAgLCBtX3R5
cGVQcm9maWxpbmdTdGFydE9mZnNldChVSU5UX01BWCkKLSAgICAsIG1fdHlwZVByb2ZpbGluZ0Vu
ZE9mZnNldChVSU5UX01BWCkKLSAgICAsIG1fc291cmNlKHNvdXJjZSkKLXsKLX0KLQotdm9pZCBT
Y3JpcHRFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2Fz
dDxTY3JpcHRFeGVjdXRhYmxlKj4oY2VsbCktPlNjcmlwdEV4ZWN1dGFibGU6On5TY3JpcHRFeGVj
dXRhYmxlKCk7Ci19Ci0KLXZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6aW5zdGFsbENvZGUoQ29kZUJs
b2NrKiBjb2RlQmxvY2spCi17Ci0gICAgaW5zdGFsbENvZGUoKmNvZGVCbG9jay0+dm0oKSwgY29k
ZUJsb2NrLCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+c3BlY2lhbGl6YXRpb25L
aW5kKCkpOwotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKFZNJiB2bSwg
Q29kZUJsb2NrKiBnZW5lcmljQ29kZUJsb2NrLCBDb2RlVHlwZSBjb2RlVHlwZSwgQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kKQotewotICAgIEFTU0VSVCh2bS5oZWFwLmlzRGVmZXJyZWQoKSk7
Ci0gICAgCi0gICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spCi0gICAgICAgIENPREVCTE9DS19MT0df
RVZFTlQoZ2VuZXJpY0NvZGVCbG9jaywgImluc3RhbGxDb2RlIiwgKCkpOwotICAgIAotICAgIENv
ZGVCbG9jayogb2xkQ29kZUJsb2NrID0gbnVsbHB0cjsKLSAgICAKLSAgICBzd2l0Y2ggKGNvZGVU
eXBlKSB7Ci0gICAgY2FzZSBHbG9iYWxDb2RlOiB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAg
IFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PFByb2dyYW1Db2RlQmxv
Y2sqPihnZW5lcmljQ29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIEFTU0VSVChraW5kID09
IENvZGVGb3JDYWxsKTsKLSAgICAgICAgCi0gICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFi
bGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9n
cmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNb2R1bGVDb2RlOiB7Ci0gICAgICAgIE1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9
IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsK
LQotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0KLSAgICAgICAgb2xkQ29k
ZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAg
ICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2suc2V0TWF5QmVOdWxsKHZt
LCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEV2
YWxDb2RlOiB7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2
YWxFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEV2YWxDb2RlQmxvY2sqIGNvZGVCbG9jayA9
IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKLSAgICAgICAg
Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgCi0gICAgICAg
IG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jay5nZXQoKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29k
ZUJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAKLSAgICBjYXNlIEZ1bmN0
aW9uQ29kZTogewotICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nh
c3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEZ1bmN0aW9uQ29kZUJsb2Nr
KiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KGdlbmVyaWNDb2Rl
QmxvY2spOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgIGNhc2Ug
Q29kZUZvckNhbGw6Ci0gICAgICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX2Nv
ZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9j
a0ZvckNhbGwuc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgIG9sZENv
ZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAg
ICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3Quc2V0TWF5QmVOdWxs
KHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLQotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNh
c2UgQ29kZUZvckNhbGw6Ci0gICAgICAgIG1faml0Q29kZUZvckNhbGwgPSBnZW5lcmljQ29kZUJs
b2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0cjsKLSAgICAgICAgbV9q
aXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7Ci0g
ICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJp
Y0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVE
OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgIG1f
aml0Q29kZUZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBnZW5lcmljQ29kZUJsb2Nr
LT5qaXRDb2RlKCkgOiBudWxscHRyOwotICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRo
QXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOwotICAgICAgICBtX251bVBhcmFt
ZXRlcnNGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+
bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotICAgICAgICBi
cmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuZXJpY0NvZGVCbG9jaykgewotICAgICAgICBSRUxF
QVNFX0FTU0VSVChnZW5lcmljQ29kZUJsb2NrLT5vd25lckV4ZWN1dGFibGUoKSA9PSB0aGlzKTsK
LSAgICAgICAgUkVMRUFTRV9BU1NFUlQoSklUQ29kZTo6aXNFeGVjdXRhYmxlU2NyaXB0KGdlbmVy
aWNDb2RlQmxvY2stPmppdFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKE9wdGlvbnM6
OnZlcmJvc2VPU1IoKSkKLSAgICAgICAgICAgIGRhdGFMb2coIkluc3RhbGxpbmcgIiwgKmdlbmVy
aWNDb2RlQmxvY2ssICJcbiIpOwotICAgICAgICAKLSAgICAgICAgaWYgKHZtLm1fcGVyQnl0ZWNv
ZGVQcm9maWxlcikKLSAgICAgICAgICAgIHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlci0+ZW5zdXJl
Qnl0ZWNvZGVzRm9yKGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAgICAKLSAgICAgICAgaWYgKERl
YnVnZ2VyKiBkZWJ1Z2dlciA9IGdlbmVyaWNDb2RlQmxvY2stPmdsb2JhbE9iamVjdCgpLT5kZWJ1
Z2dlcigpKQotICAgICAgICAgICAgZGVidWdnZXItPnJlZ2lzdGVyQ29kZUJsb2NrKGdlbmVyaWND
b2RlQmxvY2spOwotICAgIH0KLQotICAgIGlmIChvbGRDb2RlQmxvY2spCi0gICAgICAgIG9sZENv
ZGVCbG9jay0+dW5saW5rSW5jb21pbmdDYWxscygpOwotCi0gICAgdm0uaGVhcC53cml0ZUJhcnJp
ZXIodGhpcyk7Ci19Ci0KLUNvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJsZTo6bmV3Q29kZUJsb2Nr
Rm9yKAotICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgSlNGdW5jdGlvbiogZnVuY3Rp
b24sIEpTU2NvcGUqIHNjb3BlLCBKU09iamVjdComIGV4Y2VwdGlvbikKLXsKLSAgICBWTSogdm0g
PSBzY29wZS0+dm0oKTsKLSAgICBhdXRvIHRocm93U2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BF
KCp2bSk7Ci0KLSAgICBBU1NFUlQodm0tPmhlYXAuaXNEZWZlcnJlZCgpKTsKLSAgICBBU1NFUlQo
c3RhcnRDb2x1bW4oKSAhPSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVuZENvbHVtbigpICE9IFVJ
TlRfTUFYKTsKLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygp
KSB7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVj
dXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNh
bGwpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2Nr
KTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAgICAgICAgcmV0dXJuIEV2
YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1dGFibGUsIGV4ZWN1dGFi
bGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLmdldCgpLCBzY29wZSwKLSAgICAgICAgICAgIGV4
ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xh
c3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFt
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMp
OwotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAg
UkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgICAg
IFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJldHVybiBQcm9ncmFtQ29kZUJs
b2NrOjpjcmVhdGUodm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3Vu
bGlua2VkUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAgICAgICAgICBleGVjdXRh
YmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVt
bigpKTsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0
YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBS
RUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgUkVMRUFTRV9BU1NF
UlQoIWV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgICAgIFJFTEVB
U0VfQVNTRVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJldHVybiBNb2R1bGVQcm9ncmFtQ29kZUJs
b2NrOjpjcmVhdGUodm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3Vu
bGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAgICAgICAgICBl
eGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFy
dENvbHVtbigpKTsKLSAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChjbGFzc0luZm8oKSA9PSBG
dW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSk7Ci0gICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb24p
OwotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4
ZWN1dGFibGUqPih0aGlzKTsKLSAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+Y29kZUJs
b2NrRm9yKGtpbmQpKTsKLSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gc2NvcGUt
Pmdsb2JhbE9iamVjdCgpOwotICAgIFBhcnNlckVycm9yIGVycm9yOwotICAgIERlYnVnZ2VyTW9k
ZSBkZWJ1Z2dlck1vZGUgPSBnbG9iYWxPYmplY3QtPmhhc0ludGVyYWN0aXZlRGVidWdnZXIoKSA/
IERlYnVnZ2VyT24gOiBEZWJ1Z2dlck9mZjsKLSAgICBVbmxpbmtlZEZ1bmN0aW9uQ29kZUJsb2Nr
KiB1bmxpbmtlZENvZGVCbG9jayA9IAotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhl
Y3V0YWJsZS0+dW5saW5rZWRDb2RlQmxvY2tGb3IoCi0gICAgICAgICAgICAqdm0sIGV4ZWN1dGFi
bGUtPm1fc291cmNlLCBraW5kLCBkZWJ1Z2dlck1vZGUsIGVycm9yLCAKLSAgICAgICAgICAgIGV4
ZWN1dGFibGUtPnBhcnNlTW9kZSgpKTsKLSAgICByZWNvcmRQYXJzZSgKLSAgICAgICAgZXhlY3V0
YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmZlYXR1cmVzKCksIAotICAgICAgICBleGVjdXRh
YmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+aGFzQ2FwdHVyZWRWYXJpYWJsZXMoKSwgZmlyc3RM
aW5lKCksIAotICAgICAgICBsYXN0TGluZSgpLCBzdGFydENvbHVtbigpLCBlbmRDb2x1bW4oKSk7
IAotICAgIGlmICghdW5saW5rZWRDb2RlQmxvY2spIHsKLSAgICAgICAgZXhjZXB0aW9uID0gdGhy
b3dFeGNlcHRpb24oCi0gICAgICAgICAgICBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgdGhy
b3dTY29wZSwKLSAgICAgICAgICAgIGVycm9yLnRvRXJyb3JPYmplY3QoZ2xvYmFsT2JqZWN0LCBl
eGVjdXRhYmxlLT5tX3NvdXJjZSkpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0K
LSAgICBTb3VyY2VQcm92aWRlciogcHJvdmlkZXIgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92
aWRlcigpOwotICAgIHVuc2lnbmVkIHNvdXJjZU9mZnNldCA9IGV4ZWN1dGFibGUtPnNvdXJjZSgp
LnN0YXJ0T2Zmc2V0KCk7Ci0gICAgdW5zaWduZWQgc3RhcnRDb2x1bW4gPSBleGVjdXRhYmxlLT5z
b3VyY2UoKS5zdGFydENvbHVtbigpOwotCi0gICAgcmV0dXJuIEZ1bmN0aW9uQ29kZUJsb2NrOjpj
cmVhdGUodm0sCi0gICAgICAgIGV4ZWN1dGFibGUsIHVubGlua2VkQ29kZUJsb2NrLCBzY29wZSwg
cHJvdmlkZXIsIHNvdXJjZU9mZnNldCwgc3RhcnRDb2x1bW4pOwotfQotCi1Db2RlQmxvY2sqIFNj
cmlwdEV4ZWN1dGFibGU6Om5ld1JlcGxhY2VtZW50Q29kZUJsb2NrRm9yKAotICAgIENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCkKLXsKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1
dGFibGU6OmluZm8oKSkgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JD
YWxsKTsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RXZhbEV4
ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgRXZhbENvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0
aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oCi0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxD
b2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKLSAgICAgICAgRXZhbENvZGVCbG9jayogcmVz
dWx0ID0gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAgICAgICBDb2RlQmxvY2s6
OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5h
dGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAg
ICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewot
ICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0
aGlzKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxQ
cm9ncmFtQ29kZUJsb2NrKj4oCi0gICAgICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2Rl
QmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogcmVz
dWx0ID0gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAgICAgICBDb2RlQmxv
Y2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVzdWx0LT5zZXRBbHRl
cm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0K
LQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygp
KSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAg
ICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBi
YXNlbGluZSA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPigKLSAgICAgICAg
ICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+YmFzZWxpbmVWZXJzaW9u
KCkpOwotICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiByZXN1bHQgPSBNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKLSAgICAgICAgICAgIENvZGVCbG9jazo6Q29weVBh
cnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAgICAgICByZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2
bSgpLCBiYXNlbGluZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgUkVM
RUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpOwot
ICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1
dGFibGUqPih0aGlzKTsKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNf
Y2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KAotICAgICAgICBleGVjdXRhYmxlLT5jb2RlQmxvY2tG
b3Ioa2luZCktPmJhc2VsaW5lVmVyc2lvbigpKTsKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVz
dWx0ID0gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAgICAgICBDb2RlQmxvY2s6
OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICByZXN1bHQtPnNldEFsdGVybmF0aXZl
KCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQg
c2V0dXBMTEludChWTSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQotewotICAgIExMSW50Ojpz
ZXRFbnRyeXBvaW50KHZtLCBjb2RlQmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBzZXR1cEpJVChW
TSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQotewotI2lmIEVOQUJMRShKSVQpCi0gICAgQ29t
cGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gSklUOjpjb21waWxlKCZ2bSwgY29kZUJsb2NrLCBKSVRD
b21waWxhdGlvbk11c3RTdWNjZWVkKTsKLSAgICBSRUxFQVNFX0FTU0VSVChyZXN1bHQgPT0gQ29t
cGlsYXRpb25TdWNjZXNzZnVsKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHZtKTsKLSAgICBV
TlVTRURfUEFSQU0oY29kZUJsb2NrKTsKLSAgICBVTlJFQUNIQUJMRV9GT1JfUExBVEZPUk0oKTsK
LSNlbmRpZgotfQotCi1KU09iamVjdCogU2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFyZUZvckV4ZWN1
dGlvbkltcGwoCi0gICAgVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2Nv
cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJs
b2NrKQotewotICAgIERlZmVyR0NGb3JBV2hpbGUgZGVmZXJHQyh2bS5oZWFwKTsKLQotICAgIGlm
ICh2bS5nZXRBbmRDbGVhckZhaWxOZXh0TmV3Q29kZUJsb2NrKCkpCi0gICAgICAgIHJldHVybiBj
cmVhdGVFcnJvcihzY29wZS0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMoKSwgQVNDSUlMaXRl
cmFsKCJGb3JjZWQgRmFpbHVyZSIpKTsKLQotICAgIEpTT2JqZWN0KiBleGNlcHRpb24gPSAwOwot
ICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbmV3Q29kZUJsb2NrRm9yKGtpbmQsIGZ1bmN0aW9u
LCBzY29wZSwgZXhjZXB0aW9uKTsKLSAgICByZXN1bHRDb2RlQmxvY2sgPSBjb2RlQmxvY2s7Ci0g
ICAgaWYgKCFjb2RlQmxvY2spIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoZXhjZXB0aW9uKTsK
LSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKE9wdGlvbnM6
OnZhbGlkYXRlQnl0ZWNvZGUoKSkKLSAgICAgICAgY29kZUJsb2NrLT52YWxpZGF0ZSgpOwotICAg
IAotICAgIGlmIChPcHRpb25zOjp1c2VMTEludCgpKQotICAgICAgICBzZXR1cExMSW50KHZtLCBj
b2RlQmxvY2spOwotICAgIGVsc2UKLSAgICAgICAgc2V0dXBKSVQodm0sIGNvZGVCbG9jayk7Ci0g
ICAgCi0gICAgaW5zdGFsbENvZGUodm0sIGNvZGVCbG9jaywgY29kZUJsb2NrLT5jb2RlVHlwZSgp
LCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsKLSAgICByZXR1cm4gbnVsbHB0cjsK
LX0KLQotY29uc3QgQ2xhc3NJbmZvIEV2YWxFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJFdmFsRXhl
Y3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFC
TEUoRXZhbEV4ZWN1dGFibGUpIH07Ci0KLUV2YWxFeGVjdXRhYmxlKiBFdmFsRXhlY3V0YWJsZTo6
Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGlz
SW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBi
b29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5
cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqIHZhcmlhYmxlc1VuZGVyVERaKQotewotICAg
IFZNJiB2bSA9IGV4ZWMtPnZtKCk7Ci0gICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NP
UEUodm0pOwotCi0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGlj
YWxHbG9iYWxPYmplY3QoKTsKLSAgICBpZiAoIWdsb2JhbE9iamVjdC0+ZXZhbEVuYWJsZWQoKSkg
ewotICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3JlYXRlRXZhbEVycm9yKGV4
ZWMsIGdsb2JhbE9iamVjdC0+ZXZhbERpc2FibGVkRXJyb3JNZXNzYWdlKCkpKTsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcg
KE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxFdmFsRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIEV2
YWxFeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSwgaXNJblN0cmljdENvbnRleHQsIGRlcml2ZWRDb250
ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRleHRUeXBlKTsKLSAgICBl
eGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7Ci0KLSAgICBVbmxpbmtlZEV2YWxDb2RlQmxv
Y2sqIHVubGlua2VkRXZhbENvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZUV2YWxDb2RlQmxvY2so
ZXhlYywgZXhlY3V0YWJsZSwgdmFyaWFibGVzVW5kZXJURFopOwotICAgIGlmICghdW5saW5rZWRF
dmFsQ29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBleGVjdXRhYmxlLT5tX3VubGlua2Vk
RXZhbENvZGVCbG9jay5zZXQodm0sIGV4ZWN1dGFibGUsIHVubGlua2VkRXZhbENvZGUpOwotCi0g
ICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci19Ci0KLUV2YWxFeGVjdXRhYmxlOjpFdmFsRXhlY3V0YWJs
ZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpblN0cmlj
dENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNB
cnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSkKLSAg
ICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5ldmFsRXhlY3V0YWJsZVN0cnVjdHVyZS5n
ZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBpblN0cmljdENvbnRleHQsIGRlcml2ZWRDb250ZXh0
VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRleHRUeXBlLCBOb0ludHJpbnNp
YykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3Vy
Y2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOwotfQotCi12b2lkIEV2YWxFeGVjdXRhYmxl
OjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxFdmFsRXhlY3V0YWJs
ZSo+KGNlbGwpLT5FdmFsRXhlY3V0YWJsZTo6fkV2YWxFeGVjdXRhYmxlKCk7Ci19Ci0KIGNvbnN0
IENsYXNzSW5mbyBQcm9ncmFtRXhlY3V0YWJsZTo6c19pbmZvID0geyAiUHJvZ3JhbUV4ZWN1dGFi
bGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFBy
b2dyYW1FeGVjdXRhYmxlKSB9OwogCiBQcm9ncmFtRXhlY3V0YWJsZTo6UHJvZ3JhbUV4ZWN1dGFi
bGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCkBAIC00NzgsOTYg
KzU2LDYgQEAgdm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIAogICAgIHN0
YXRpY19jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPlByb2dyYW1FeGVjdXRhYmxlOjp+
UHJvZ3JhbUV4ZWN1dGFibGUoKTsKIH0KIAotY29uc3QgQ2xhc3NJbmZvIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlOjpzX2luZm8gPSB7ICJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3JpcHRF
eGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUpIH07Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICA6
IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVN0cnVj
dHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBl
OjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsKLSAg
ICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRl
clNvdXJjZVR5cGU6Ok1vZHVsZSk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAw
OwotICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0g
ICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxv
d1Byb2ZpbGVyKCkpCi0gICAgICAgIGV4ZWMtPnZtKCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hl
KCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFy
dE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsKLX0KLQotTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGUqIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpjcmVhdGUoRXhlY1N0YXRlKiBleGVj
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi17Ci0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUoZXhlYywgc291cmNlKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52
bSgpKTsKLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlTW9kdWxlUHJvZ3JhbUNvZGVCbG9j
ayhleGVjLCBleGVjdXRhYmxlKTsKLSAgICBpZiAoIXVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUp
Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCB1bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlKTsKLQotICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRT
eW1ib2xUYWJsZS5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwganNDYXN0PFN5bWJvbFRhYmxl
Kj4odW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+Y29uc3RhbnRSZWdpc3Rlcih1bmxpbmtlZE1v
ZHVsZVByb2dyYW1Db2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlQ29uc3RhbnRSZWdp
c3Rlck9mZnNldCgpKS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0KGV4ZWMtPnZtKCkpKTsKLQotICAg
IHJldHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpk
ZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSo+KGNlbGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6fk1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBGdW5jdGlvbkV4ZWN1dGFibGU6OnNf
aW5mbyA9IHsgIkZ1bmN0aW9uRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVjdXRhYmxlKSB9OwotCi1GdW5jdGlv
bkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwg
dW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1
bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IFNjcmlw
dEV4ZWN1dGFibGUodm0uZnVuY3Rpb25FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCB2bSwgc291
cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmlzSW5TdHJpY3RDb250ZXh0KCksIHVubGlua2VkRXhl
Y3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5v
bmUsIGludHJpbnNpYykKLSAgICAsIG1fdW5saW5rZWRFeGVjdXRhYmxlKHZtLCB0aGlzLCB1bmxp
bmtlZEV4ZWN1dGFibGUpCi17Ci0gICAgUkVMRUFTRV9BU1NFUlQoIXNvdXJjZS5pc051bGwoKSk7
Ci0gICAgQVNTRVJUKHNvdXJjZS5sZW5ndGgoKSk7Ci0gICAgbV9maXJzdExpbmUgPSBmaXJzdExp
bmU7Ci0gICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotICAgIEFTU0VSVChzdGFydENvbHVtbiAh
PSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgbV9z
dGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOwotICAgIG1fZW5kQ29sdW1uID0gZW5kQ29sdW1uOwot
ICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0
ZXJzU3RhcnRPZmZzZXQoKTsKLSAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IHVubGlu
a2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCk7Ci0gICAgbV90eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KCk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYg
dm0pCi17Ci0gICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgIG1fc2luZ2xldG9uRnVu
Y3Rpb24uc2V0KHZtLCB0aGlzLCBJbmZlcnJlZFZhbHVlOjpjcmVhdGUodm0pKTsKLX0KLQotdm9p
ZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRp
Y19jYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5GdW5jdGlvbkV4ZWN1dGFibGU6On5G
dW5jdGlvbkV4ZWN1dGFibGUoKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIHNhbXBsaW5nRGVz
Y3JpcHRpb24oSklUQ29kZTo6SklUVHlwZSBqaXRUeXBlKQotewotICAgIHN3aXRjaCAoaml0VHlw
ZSkgewotICAgIGNhc2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJUaHVuazoKLSAgICAgICAgcmV0dXJu
ICJJbnRlcnByZXRlciBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkJh
c2VsaW5lSklUOgotICAgICAgICByZXR1cm4gIkJhc2VsaW5lIENvbXBpbGF0aW9uIChUT1RBTCki
OwotICAgIGNhc2UgSklUQ29kZTo6REZHSklUOgotICAgICAgICByZXR1cm4gIkRGRyBDb21waWxh
dGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkZUTEpJVDoKLSAgICAgICAgcmV0dXJu
ICJGVEwgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi12
b2lkIEV2YWxFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0
b3ImIHZpc2l0b3IpCi17Ci0gICAgRXZhbEV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8
RXZhbEV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRo
aXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0
aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91
bmxpbmtlZEV2YWxDb2RlQmxvY2spOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxv
Y2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fZXZhbENvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlz
aXRvcik7Ci19Ci0KIEpTT2JqZWN0KiBQcm9ncmFtRXhlY3V0YWJsZTo6Y2hlY2tTeW50YXgoRXhl
Y1N0YXRlKiBleGVjKQogewogICAgIFBhcnNlckVycm9yIGVycm9yOwpAQCAtNjkzLDE1NCArMTgx
LDQgQEAgdm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKUwogICAgICAgICB0
aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwogfQog
Ci12b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2Vs
bCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
IHRoaXNPYmplY3QgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKLSAg
ICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2Ny
aXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICB2
aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2spOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZUVudmlyb25tZW50
U3ltYm9sVGFibGUpOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxv
Y2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRX
ZWFrbHkodmlzaXRvcik7Ci19Ci0KLUZ1bmN0aW9uQ29kZUJsb2NrKiBGdW5jdGlvbkV4ZWN1dGFi
bGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsK
LSAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0OwotICAgIGlmIChraW5kID09IENvZGVGb3JD
YWxsKQotICAgICAgICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0g
ICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAg
ICBpZiAoIXJlc3VsdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0
PEZ1bmN0aW9uQ29kZUJsb2NrKj4ocmVzdWx0LT5iYXNlbGluZUFsdGVybmF0aXZlKCkpOwotfQot
Ci12b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNs
b3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogdGhpc09iamVj
dCA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JK
RUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6
dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICBpZiAodGhpc09iamVjdC0+
bV9jb2RlQmxvY2tGb3JDYWxsKQotICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNh
bGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdCkKLSAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1
Y3QtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0
LT5tX3VubGlua2VkRXhlY3V0YWJsZSk7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3Qt
Pm1fc2luZ2xldG9uRnVuY3Rpb24pOwotfQotCi1GdW5jdGlvbkV4ZWN1dGFibGUqIEZ1bmN0aW9u
RXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCi0gICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwg
RXhlY1N0YXRlJiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIAotICAgIEpTT2JqZWN0
KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKQotewotICAgIFVubGlua2VkRnVu
Y3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUgPSAKLSAgICAgICAgVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKAotICAgICAgICAgICAgbmFtZSwgZXhl
Yywgc291cmNlLCBleGNlcHRpb24sIG92ZXJyaWRlTGluZU51bWJlcik7Ci0gICAgaWYgKCF1bmxp
bmtlZEV4ZWN1dGFibGUpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgcmV0dXJuIHVu
bGlua2VkRXhlY3V0YWJsZS0+bGluayhleGVjLnZtKCksIHNvdXJjZSwgb3ZlcnJpZGVMaW5lTnVt
YmVyKTsKLX0KLQotI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKLWNvbnN0IENsYXNzSW5mbyBXZWJB
c3NlbWJseUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5RXhlY3V0YWJsZSIsICZF
eGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFdlYkFzc2VtYmx5
RXhlY3V0YWJsZSkgfTsKLQotV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4ZWN1
dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSogbW9k
dWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQotICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZt
LndlYkFzc2VtYmx5RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfTk9U
X0NPTVBJTEVELCBOb0ludHJpbnNpYykKLSAgICAsIG1fc291cmNlKHNvdXJjZSkKLSAgICAsIG1f
bW9kdWxlKHZtLCB0aGlzLCBtb2R1bGUpCi0gICAgLCBtX2Z1bmN0aW9uSW5kZXgoZnVuY3Rpb25J
bmRleCkKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBT
b3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OldlYkFzc2VtYmx5KTsKLX0KLQotdm9pZCBXZWJBc3Nl
bWJseUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0
PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwpLT5XZWJBc3NlbWJseUV4ZWN1dGFibGU6On5X
ZWJBc3NlbWJseUV4ZWN1dGFibGUoKTsKLX0KLQotdm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6
OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAg
ICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlF
eGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2Jq
ZWN0LCBpbmZvKCkpOwotICAgIEV4ZWN1dGFibGVCYXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmpl
Y3QsIHZpc2l0b3IpOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCi0g
ICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRv
cik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlKTsKLX0KLSNlbmRp
ZgotCi12b2lkIEV4ZWN1dGFibGVCYXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Ci17
Ci0gICAgRXhlY3V0YWJsZUJhc2UqIHJlYWxUaGlzID0gY29uc3RfY2FzdDxFeGVjdXRhYmxlQmFz
ZSo+KHRoaXMpOwotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxl
OjppbmZvKCkpIHsKLSAgICAgICAgTmF0aXZlRXhlY3V0YWJsZSogbmF0aXZlID0ganNDYXN0PE5h
dGl2ZUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIG91dC5wcmludCgiTmF0aXZlRXhl
Y3V0YWJsZToiLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5mdW5jdGlv
bigpKSksICIvIiwgUmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+Y29uc3Ry
dWN0b3IoKSkpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBFdmFsRXhlY3V0YWJs
ZSogZXZhbCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgaWYg
KENvZGVCbG9jayogY29kZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCi0gICAgICAgICAgICBv
dXQucHJpbnQoKmNvZGVCbG9jayk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dC5wcmlu
dCgiRXZhbEV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIAotICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygp
KSB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PFByb2dyYW1FeGVj
dXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBl
dmFsLT5jb2RlQmxvY2soKSkKLSAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCJQcm9ncmFtRXhlY3V0YWJsZSB3L28g
Q29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXhl
Y3V0YWJsZS0+Y29kZUJsb2NrKCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dC5wcmludCgiTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAg
IEZ1bmN0aW9uRXhlY3V0YWJsZSogZnVuY3Rpb24gPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxl
Kj4ocmVhbFRoaXMpOwotICAgIGlmICghZnVuY3Rpb24tPmVpdGhlckNvZGVCbG9jaygpKQotICAg
ICAgICBvdXQucHJpbnQoIkZ1bmN0aW9uRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIENvbW1hUHJpbnRlciBjb21tYSgiLyIpOwotICAgICAgICBpZiAoZnVu
Y3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSkKLSAgICAgICAgICAgIG91dC5wcmludChjb21tYSwg
KmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkpOwotICAgICAgICBpZiAoZnVuY3Rpb24tPmNv
ZGVCbG9ja0ZvckNvbnN0cnVjdCgpKQotICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVu
Y3Rpb24tPmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpKTsKLSAgICB9Ci19Ci0KLUNvZGVCbG9ja0hh
c2ggRXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBj
b25zdAotewotICAgIGlmICh0aGlzLT5jbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjpp
bmZvKCkpCi0gICAgICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgTmF0aXZlRXhlY3V0YWJsZSo+KHRo
aXMpLT5oYXNoRm9yKGtpbmQpOwotICAgIAotICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgU2NyaXB0
RXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9yKGtpbmQpOwotfQotCi1Db2RlQmxvY2tIYXNoIE5h
dGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25z
dAotewotICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICByZXR1cm4gQ29kZUJs
b2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9mdW5j
dGlvbikpKTsKLSAgICAKLSAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1
Y3QpOwotICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3
aXNlX2Nhc3Q8c2l6ZV90PihtX2NvbnN0cnVjdG9yKSkpOwotfQotCi1Db2RlQmxvY2tIYXNoIFNj
cmlwdEV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25z
dAotewotICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHNvdXJjZSgpLCBraW5kKTsKLX0KLQotfQor
fSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Q
cm9ncmFtRXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL1Byb2dyYW1FeGVjdXRhYmxlLmgJKHJldmlzaW9uIDIwNzc5MCkJKGZyb20gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRXhlY3V0YWJsZS5oOjIwNzc5MCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb2dyYW1FeGVjdXRhYmxlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw3NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTMt
MjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkFyaXR5
Q2hlY2tNb2RlLmgiCisjaW5jbHVkZSAiQ2FsbERhdGEuaCIKKyNpbmNsdWRlICJDb2RlQmxvY2tI
YXNoLmgiCisjaW5jbHVkZSAiQ29kZVNwZWNpYWxpemF0aW9uS2luZC5oIgorI2luY2x1ZGUgIkNv
bXBpbGF0aW9uUmVzdWx0LmgiCisjaW5jbHVkZSAiRXhlY3V0YWJsZUluZm8uaCIKKyNpbmNsdWRl
ICJIYW5kbGVySW5mby5oIgorI2luY2x1ZGUgIkluZmVycmVkVmFsdWUuaCIKKyNpbmNsdWRlICJK
SVRDb2RlLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKKyNpbmNsdWRlICJTb3VyY2VD
b2RlLmgiCisjaW5jbHVkZSAiVHlwZVNldC5oIgorI2luY2x1ZGUgIlVubGlua2VkQ29kZUJsb2Nr
LmgiCisjaW5jbHVkZSAiVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUuaCIKKworbmFtZXNwYWNl
IEpTQyB7CisKK2NsYXNzIENvZGVCbG9jazsKK2NsYXNzIEV2YWxDb2RlQmxvY2s7CitjbGFzcyBG
dW5jdGlvbkNvZGVCbG9jazsKK2NsYXNzIEpTU2NvcGU7CitjbGFzcyBKU1dhc21Nb2R1bGU7Citj
bGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitjbGFzcyBNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
OworY2xhc3MgUHJvZ3JhbUNvZGVCbG9jazsKK2NsYXNzIFdlYkFzc2VtYmx5Q29kZUJsb2NrOwor
CitlbnVtIENvbXBpbGF0aW9uS2luZCB7IEZpcnN0Q29tcGlsYXRpb24sIE9wdGltaXppbmdDb21w
aWxhdGlvbiB9OworCitpbmxpbmUgYm9vbCBpc0NhbGwoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKQoreworICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2NsYXNzIEV4ZWN1dGFibGVCYXNlIDogcHVibGljIEpTQ2VsbCB7CisgICAgZnJp
ZW5kIGNsYXNzIEpJVDsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX1BB
UkFNRVRFUlNfSVNfSE9TVCA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVS
U19OT1RfQ09NUElMRUQgPSAtMTsKKworICAgIEV4ZWN1dGFibGVCYXNlKFZNJiB2bSwgU3RydWN0
dXJlKiBzdHJ1Y3R1cmUsIGludCBudW1QYXJhbWV0ZXJzLCBJbnRyaW5zaWMgaW50cmluc2ljKQor
ICAgICAgICA6IEpTQ2VsbCh2bSwgc3RydWN0dXJlKQorICAgICAgICAsIG1fbnVtUGFyYW1ldGVy
c0ZvckNhbGwobnVtUGFyYW1ldGVycykKKyAgICAgICAgLCBtX251bVBhcmFtZXRlcnNGb3JDb25z
dHJ1Y3QobnVtUGFyYW1ldGVycykKKyAgICAgICAgLCBtX2ludHJpbnNpYyhpbnRyaW5zaWMpCisg
ICAgeworICAgIH0KKworICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZtKQorICAgIHsKKyAg
ICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgIH0KKworcHVibGljOgorICAgIHR5
cGVkZWYgSlNDZWxsIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZs
YWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7CisKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVk
c0Rlc3RydWN0aW9uID0gdHJ1ZTsKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwor
ICAgICAgICAKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCkgY29uc3Q7CisKKyAgICBib29sIGlzRXZhbEV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHR5cGUoKSA9PSBFdmFsRXhlY3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJv
b2wgaXNGdW5jdGlvbkV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5
cGUoKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGVUeXBlOworICAgIH0KKyAgICBib29sIGlzUHJvZ3Jh
bUV4ZWN1dGFibGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBQcm9n
cmFtRXhlY3V0YWJsZVR5cGU7CisgICAgfQorICAgIGJvb2wgaXNNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IE1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlVHlwZTsKKyAgICB9CisKKworICAgIGJvb2wgaXNIb3N0RnVuY3Rpb24oKSBjb25zdAor
ICAgIHsKKyAgICAgICAgQVNTRVJUKChtX251bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJB
TUVURVJTX0lTX0hPU1QpID09IChtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPT0gTlVNX1BB
UkFNRVRFUlNfSVNfSE9TVCkpOworICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2Fs
bCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUOworICAgIH0KKworI2lmIEVOQUJMRShXRUJBU1NF
TUJMWSkKKyAgICBib29sIGlzV2ViQXNzZW1ibHlFeGVjdXRhYmxlKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0eXBlKCkgPT0gV2ViQXNzZW1ibHlFeGVjdXRhYmxlVHlwZTsKKyAgICB9
CisjZW5kaWYKKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0s
IEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pIHsgcmV0dXJuIFN0
cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhDZWxsVHlw
ZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOyB9CisgICAgICAgIAorICAgIHZvaWQgY2xlYXJD
b2RlKCk7CisKKyAgICBERUNMQVJFX0VYUE9SVF9JTkZPOworCitwcm90ZWN0ZWQ6CisgICAgaW50
IG1fbnVtUGFyYW1ldGVyc0ZvckNhbGw7CisgICAgaW50IG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0
cnVjdDsKKworcHVibGljOgorICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29k
ZUZvckNhbGwoKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1faml0Q29kZUZvckNhbGwpOworICAg
ICAgICByZXR1cm4gbV9qaXRDb2RlRm9yQ2FsbDsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPEpJ
VENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QoKQorICAgIHsKKyAgICAgICAgQVNT
RVJUKG1faml0Q29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JD
b25zdHJ1Y3Q7CisgICAgfQorICAgICAgICAKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVy
YXRlZEpJVENvZGVGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAg
ICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVk
SklUQ29kZUZvckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVj
dCk7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ29uc3RydWN0KCk7CisgICAg
fQorICAgIAorICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBlbnRyeXBvaW50Rm9yKENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCwgQXJpdHlDaGVja01vZGUgYXJpdHkpCisgICAgeworICAgICAg
ICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgY2FjaGVkIHJlc3VsdC4gV2Ugb25seSBoYXZlIGl0IGZv
ciBhcml0eSBjaGVjayBiZWNhdXNlIHdlIHVzZSB0aGUKKyAgICAgICAgLy8gbm8tYXJpdHkgZW50
cnlwb2ludCBpbiBub24tdmlydHVhbCBjYWxscywgd2hpY2ggd2lsbCAiY2FjaGUiIHRoaXMgdmFs
dWUgZGlyZWN0bHkgaW4KKyAgICAgICAgLy8gbWFjaGluZSBjb2RlLgorICAgICAgICBpZiAoYXJp
dHkgPT0gTXVzdENoZWNrQXJpdHkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAg
ICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAgICAgICBpZiAoTWFjcm9Bc3Nl
bWJsZXJDb2RlUHRyIHJlc3VsdCA9IG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjaykKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKKyAgICAgICAgICAgICAgICBpZiAo
TWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9IG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhB
cml0eUNoZWNrKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1hY3JvQXNz
ZW1ibGVyQ29kZVB0ciByZXN1bHQgPQorICAgICAgICAgICAgZ2VuZXJhdGVkSklUQ29kZUZvcihr
aW5kKS0+YWRkcmVzc0ZvckNhbGwoYXJpdHkpOworICAgICAgICBpZiAoYXJpdHkgPT0gTXVzdENo
ZWNrQXJpdHkpIHsKKyAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQ7IHRoaXMgaXMgbmVj
ZXNzYXJ5IGZvciB0aGUgSklUJ3MgdmlydHVhbCBjYWxsIG9wdGltaXphdGlvbnMuCisgICAgICAg
ICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAg
ICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gcmVzdWx0OworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0Ogor
ICAgICAgICAgICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrID0gcmVz
dWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZz
ZXRPZkpJVENvZGVXaXRoQXJpdHlDaGVja0ZvcigKKyAgICAgICAgQ29kZVNwZWNpYWxpemF0aW9u
S2luZCBraW5kKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2Ug
Q29kZUZvckNhbGw6CisgICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFi
bGVCYXNlLCBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2spOworICAgICAgICBjYXNlIENv
ZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1
dGFibGVCYXNlLCBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayk7CisgICAgICAg
IH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZOdW1QYXJhbWV0
ZXJzRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIGlmIChr
aW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihF
eGVjdXRhYmxlQmFzZSwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCk7CisgICAgICAgIEFTU0VSVChr
aW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9G
KEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QpOworICAgIH0KKwor
ICAgIGJvb2wgaGFzSklUQ29kZUZvckNhbGwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPj0gMDsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2wg
aGFzSklUQ29kZUZvckNvbnN0cnVjdCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9u
dW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID49IDA7CisgICAgfQorICAgICAgICAKKyAgICBib29s
IGhhc0pJVENvZGVGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAorICAgIHsK
KyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gaGFz
SklUQ29kZUZvckNhbGwoKTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVj
dCk7CisgICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ29uc3RydWN0KCk7CisgICAgfQorCisg
ICAgLy8gSW50cmluc2ljcyBhcmUgb25seSBmb3IgY2FsbHMsIGN1cnJlbnRseS4KKyAgICBJbnRy
aW5zaWMgaW50cmluc2ljKCkgY29uc3QgeyByZXR1cm4gbV9pbnRyaW5zaWM7IH0KKyAgICAgICAg
CisgICAgSW50cmluc2ljIGludHJpbnNpY0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
IGNvbnN0CisgICAgeworICAgICAgICBpZiAoaXNDYWxsKGtpbmQpKQorICAgICAgICAgICAgcmV0
dXJuIGludHJpbnNpYygpOworICAgICAgICByZXR1cm4gTm9JbnRyaW5zaWM7CisgICAgfQorICAg
IAorICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OworICAgICAgICAKK3Byb3RlY3Rl
ZDoKKyAgICBJbnRyaW5zaWMgbV9pbnRyaW5zaWM7CisgICAgUmVmUHRyPEpJVENvZGU+IG1faml0
Q29kZUZvckNhbGw7CisgICAgUmVmUHRyPEpJVENvZGU+IG1faml0Q29kZUZvckNvbnN0cnVjdDsK
KyAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNr
OworICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJp
dHlDaGVjazsKK307CisKK2NsYXNzIE5hdGl2ZUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhl
Y3V0YWJsZUJhc2UgeworICAgIGZyaWVuZCBjbGFzcyBKSVQ7CisgICAgZnJpZW5kIGNsYXNzIExM
SW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNl
IEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6
U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIE5hdGl2
ZUV4ZWN1dGFibGUqIGNyZWF0ZShWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5r
LCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RU
aHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNv
bnN0IFN0cmluZyYgbmFtZSk7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwor
CisgICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0
OworCisgICAgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24oKSB7IHJldHVybiBtX2Z1bmN0aW9uOyB9
CisgICAgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IoKSB7IHJldHVybiBtX2NvbnN0cnVjdG9y
OyB9CisgICAgICAgIAorICAgIE5hdGl2ZUZ1bmN0aW9uIG5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVT
cGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVG
b3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCk7CisgICAgICAgIEFTU0VSVChr
aW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gY29uc3RydWN0b3IoKTsK
KyAgICB9CisgICAgICAgIAorICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZOYXRpdmVGdW5j
dGlvbkZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAo
a2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0Yo
TmF0aXZlRXhlY3V0YWJsZSwgbV9mdW5jdGlvbik7CisgICAgICAgIEFTU0VSVChraW5kID09IENv
ZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKE5hdGl2ZUV4
ZWN1dGFibGUsIG1fY29uc3RydWN0b3IpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUq
IGNyZWF0ZVN0cnVjdHVyZShWTSYsIEpTR2xvYmFsT2JqZWN0KiwgSlNWYWx1ZSBwcm90byk7Cisg
ICAgICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKworICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBmaW5pc2hDcmVh
dGlvbihWTSYsIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBQYXNzUmVmUHRyPEpJVENv
ZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJpbmcmIG5hbWUpOworCitwcml2YXRlOgorICAg
IGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKworICAgIE5hdGl2ZUV4ZWN1dGFibGUoVk0m
LCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIElu
dHJpbnNpYyk7CisKKyAgICBOYXRpdmVGdW5jdGlvbiBtX2Z1bmN0aW9uOworICAgIE5hdGl2ZUZ1
bmN0aW9uIG1fY29uc3RydWN0b3I7CisKKyAgICBTdHJpbmcgbV9uYW1lOworfTsKKworY2xhc3Mg
U2NyaXB0RXhlY3V0YWJsZSA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7CitwdWJsaWM6CisgICAg
dHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBT
dHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzOworCisgICAgc3RhdGljIHZvaWQg
ZGVzdHJveShKU0NlbGwqKTsKKyAgICAgICAgCisgICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENv
ZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OworCisgICAgY29uc3QgU291cmNlQ29kZSYgc291
cmNlKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2U7IH0KKyAgICBpbnRwdHJfdCBzb3VyY2VJRCgp
IGNvbnN0IHsgcmV0dXJuIG1fc291cmNlLnByb3ZpZGVySUQoKTsgfQorICAgIGNvbnN0IFN0cmlu
ZyYgc291cmNlVVJMKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2UucHJvdmlkZXIoKS0+dXJsKCk7
IH0KKyAgICBpbnQgZmlyc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9maXJzdExpbmU7IH0KKyAg
ICB2b2lkIHNldE92ZXJyaWRlTGluZU51bWJlcihpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKSB7IG1f
b3ZlcnJpZGVMaW5lTnVtYmVyID0gb3ZlcnJpZGVMaW5lTnVtYmVyOyB9CisgICAgYm9vbCBoYXNP
dmVycmlkZUxpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX292ZXJyaWRlTGluZU51bWJlciAh
PSAtMTsgfQorICAgIGludCBvdmVycmlkZUxpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX292
ZXJyaWRlTGluZU51bWJlcjsgfQorICAgIGludCBsYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1f
bGFzdExpbmU7IH0KKyAgICB1bnNpZ25lZCBzdGFydENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1f
c3RhcnRDb2x1bW47IH0KKyAgICB1bnNpZ25lZCBlbmRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBt
X2VuZENvbHVtbjsgfQorICAgIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpIGNv
bnN0IHsgcmV0dXJuIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OyB9CisgICAgdW5zaWduZWQg
dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZVByb2ZpbGluZ0Vu
ZE9mZnNldDsgfQorCisgICAgYm9vbCB1c2VzRXZhbCgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVy
ZXMgJiBFdmFsRmVhdHVyZTsgfQorICAgIGJvb2wgdXNlc0FyZ3VtZW50cygpIGNvbnN0IHsgcmV0
dXJuIG1fZmVhdHVyZXMgJiBBcmd1bWVudHNGZWF0dXJlOyB9CisgICAgYm9vbCBpc0Fycm93RnVu
Y3Rpb25Db250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9pc0Fycm93RnVuY3Rpb25Db250ZXh0OyB9
CisgICAgYm9vbCBpc1N0cmljdE1vZGUoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzICYgU3Ry
aWN0TW9kZUZlYXR1cmU7IH0KKyAgICBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRU
eXBlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZENvbnRleHRUeXBlPihtX2Rl
cml2ZWRDb250ZXh0VHlwZSk7IH0KKyAgICBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBl
KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RXZhbENvbnRleHRUeXBlPihtX2V2YWxDb250
ZXh0VHlwZSk7IH0KKworICAgIEVDTUFNb2RlIGVjbWFNb2RlKCkgY29uc3QgeyByZXR1cm4gaXNT
dHJpY3RNb2RlKCkgPyBTdHJpY3RNb2RlIDogTm90U3RyaWN0TW9kZTsgfQorICAgICAgICAKKyAg
ICB2b2lkIHNldE5ldmVySW5saW5lKGJvb2wgdmFsdWUpIHsgbV9uZXZlcklubGluZSA9IHZhbHVl
OyB9CisgICAgdm9pZCBzZXROZXZlck9wdGltaXplKGJvb2wgdmFsdWUpIHsgbV9uZXZlck9wdGlt
aXplID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldE5ldmVyRlRMT3B0aW1pemUoYm9vbCB2YWx1ZSkg
eyBtX25ldmVyRlRMT3B0aW1pemUgPSB2YWx1ZTsgfQorICAgIHZvaWQgc2V0RGlkVHJ5VG9FbnRl
ckluTG9vcChib29sIHZhbHVlKSB7IG1fZGlkVHJ5VG9FbnRlckluTG9vcCA9IHZhbHVlOyB9Cisg
ICAgdm9pZCBzZXRDYW5Vc2VPU1JFeGl0RnV6emluZyhib29sIHZhbHVlKSB7IG1fY2FuVXNlT1NS
RXhpdEZ1enppbmcgPSB2YWx1ZTsgfQorICAgIGJvb2wgbmV2ZXJJbmxpbmUoKSBjb25zdCB7IHJl
dHVybiBtX25ldmVySW5saW5lOyB9CisgICAgYm9vbCBuZXZlck9wdGltaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9uZXZlck9wdGltaXplOyB9CisgICAgYm9vbCBuZXZlckZUTE9wdGltaXplKCkgY29u
c3QgeyByZXR1cm4gbV9uZXZlckZUTE9wdGltaXplOyB9CisgICAgYm9vbCBkaWRUcnlUb0VudGVy
SW5Mb29wKCkgY29uc3QgeyByZXR1cm4gbV9kaWRUcnlUb0VudGVySW5Mb29wOyB9CisgICAgYm9v
bCBpc0lubGluaW5nQ2FuZGlkYXRlKCkgY29uc3QgeyByZXR1cm4gIW5ldmVySW5saW5lKCk7IH0K
KyAgICBib29sIGlzT2tUb09wdGltaXplKCkgY29uc3QgeyByZXR1cm4gIW5ldmVyT3B0aW1pemUo
KTsgfQorICAgIGJvb2wgY2FuVXNlT1NSRXhpdEZ1enppbmcoKSBjb25zdCB7IHJldHVybiBtX2Nh
blVzZU9TUkV4aXRGdXp6aW5nOyB9CisgICAgCisgICAgYm9vbCogYWRkcmVzc09mRGlkVHJ5VG9F
bnRlckluTG9vcCgpIHsgcmV0dXJuICZtX2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KKworICAgIENv
ZGVGZWF0dXJlcyBmZWF0dXJlcygpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXM7IH0KKyAgICAg
ICAgCisgICAgREVDTEFSRV9FWFBPUlRfSU5GTzsKKworICAgIHZvaWQgcmVjb3JkUGFyc2UoQ29k
ZUZlYXR1cmVzIGZlYXR1cmVzLCBib29sIGhhc0NhcHR1cmVkVmFyaWFibGVzLCBpbnQgZmlyc3RM
aW5lLCBpbnQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1
bW4pCisgICAgeworICAgICAgICBtX2ZlYXR1cmVzID0gZmVhdHVyZXM7CisgICAgICAgIG1faGFz
Q2FwdHVyZWRWYXJpYWJsZXMgPSBoYXNDYXB0dXJlZFZhcmlhYmxlczsKKyAgICAgICAgbV9maXJz
dExpbmUgPSBmaXJzdExpbmU7CisgICAgICAgIG1fbGFzdExpbmUgPSBsYXN0TGluZTsKKyAgICAg
ICAgQVNTRVJUKHN0YXJ0Q29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICAgICAgbV9zdGFydENvbHVt
biA9IHN0YXJ0Q29sdW1uOworICAgICAgICBBU1NFUlQoZW5kQ29sdW1uICE9IFVJTlRfTUFYKTsK
KyAgICAgICAgbV9lbmRDb2x1bW4gPSBlbmRDb2x1bW47CisgICAgfQorCisgICAgdm9pZCBpbnN0
YWxsQ29kZShDb2RlQmxvY2sqKTsKKyAgICB2b2lkIGluc3RhbGxDb2RlKFZNJiwgQ29kZUJsb2Nr
KiwgQ29kZVR5cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQpOworICAgIENvZGVCbG9jayogbmV3
Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQsIEpTRnVuY3Rpb24qLCBKU1Njb3Bl
KiwgSlNPYmplY3QqJiBleGNlcHRpb24pOworICAgIENvZGVCbG9jayogbmV3UmVwbGFjZW1lbnRD
b2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7CisKKyAgICAvLyBUaGlzIGZ1bmN0
aW9uIGhhcyBhbiBpbnRlcmVzdGluZyBHQyBzdG9yeS4gQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9u
IGFyZSBhc2tpbmcgdXMgdG8gY3JlYXRlIGEgQ29kZUJsb2NrCisgICAgLy8gdGhhdCBpcyBub3Qg
amV0dGlzb25lZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5zLiBDYWxsZXJzIGFyZSBlc3Nl
bnRpYWxseSBhc2tpbmcgZm9yIGEgc3Ryb25nIHJlZmVyZW5jZQorICAgIC8vIHRvIHRoZSBDb2Rl
QmxvY2suIEJlY2F1c2UgdGhlIEV4ZWN1dGFibGUgbWF5IGJlIGFsbG9jYXRpbmcgdGhlIENvZGVC
bG9jaywgd2UgcmVxdWlyZSBjYWxsZXJzIHRvIHBhc3MgaW4KKyAgICAvLyB0aGVpciBDb2RlQmxv
Y2sqJiByZWZlcmVuY2UgYmVjYXVzZSBpdCdzIHNhZmUgZm9yIENvZGVCbG9jayB0byBiZSBqZXR0
aXNvbmVkIGlmIEV4ZWN1dGFibGUgaXMgdGhlIG9ubHkgdGhpbmcKKyAgICAvLyB0byBwb2ludCB0
byBpdC4gVGhpcyBmb3JjZXMgY2FsbGVycyB0byBoYXZlIGEgQ29kZUJsb2NrKiBpbiBhIHJlZ2lz
dGVyIG9yIG9uIHRoZSBzdGFjayB0aGF0IHdpbGwgYmUgbWFya2VkCisgICAgLy8gYnkgY29uc2Vy
dmF0aXZlIEdDIGlmIGEgR0MgaGFwcGVucyBhZnRlciB3ZSBjcmVhdGUgdGhlIENvZGVCbG9jay4K
KyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhlY3V0YWJsZVR5cGU+CisgICAgSlNPYmplY3QqIHBy
ZXBhcmVGb3JFeGVjdXRpb24oVk0mLCBKU0Z1bmN0aW9uKiwgSlNTY29wZSosIENvZGVTcGVjaWFs
aXphdGlvbktpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jayk7CisKKyAgICB0ZW1wbGF0
ZSA8dHlwZW5hbWUgRnVuY3Rvcj4gdm9pZCBmb3JFYWNoQ29kZUJsb2NrKEZ1bmN0b3ImJik7CisK
K3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIEpTT2JqZWN0
KiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbChWTSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2NrKiYpOworCitwcm90ZWN0ZWQ6CisgICAgU2Ny
aXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqLCBWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBib29sIGlz
SW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVuY3Rp
b25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIEludHJpbnNpYyk7CisKKyAgICB2b2lkIGZpbmlz
aENyZWF0aW9uKFZNJiB2bSkKKyAgICB7CisgICAgICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZt
KTsKKyAgICAgICAgdm0uaGVhcC5hZGRFeGVjdXRhYmxlKHRoaXMpOyAvLyBCYWxhbmNlZCBieSBI
ZWFwOjpkZWxldGVVbm1hcmtlZENvbXBpbGVkQ29kZSgpLgorCisjaWYgRU5BQkxFKENPREVCTE9D
S19TQU1QTElORykKKyAgICAgICAgaWYgKFNhbXBsaW5nVG9vbCogc2FtcGxlciA9IHZtLmludGVy
cHJldGVyLT5zYW1wbGVyKCkpCisgICAgICAgICAgICBzYW1wbGVyLT5ub3RpZnlPZlNjb3BlKHZt
LCB0aGlzKTsKKyNlbmRpZgorICAgIH0KKworICAgIENvZGVGZWF0dXJlcyBtX2ZlYXR1cmVzOwor
ICAgIGJvb2wgbV9kaWRUcnlUb0VudGVySW5Mb29wOworICAgIGJvb2wgbV9oYXNDYXB0dXJlZFZh
cmlhYmxlcyA6IDE7CisgICAgYm9vbCBtX25ldmVySW5saW5lIDogMTsKKyAgICBib29sIG1fbmV2
ZXJPcHRpbWl6ZSA6IDE7CisgICAgYm9vbCBtX25ldmVyRlRMT3B0aW1pemUgOiAxOworICAgIGJv
b2wgbV9pc0Fycm93RnVuY3Rpb25Db250ZXh0IDogMTsKKyAgICBib29sIG1fY2FuVXNlT1NSRXhp
dEZ1enppbmcgOiAxOworICAgIHVuc2lnbmVkIG1fZGVyaXZlZENvbnRleHRUeXBlIDogMjsgLy8g
RGVyaXZlZENvbnRleHRUeXBlCisgICAgdW5zaWduZWQgbV9ldmFsQ29udGV4dFR5cGUgOiAyOyAv
LyBFdmFsQ29udGV4dFR5cGUKKworICAgIGludCBtX292ZXJyaWRlTGluZU51bWJlcjsKKyAgICBp
bnQgbV9maXJzdExpbmU7CisgICAgaW50IG1fbGFzdExpbmU7CisgICAgdW5zaWduZWQgbV9zdGFy
dENvbHVtbjsKKyAgICB1bnNpZ25lZCBtX2VuZENvbHVtbjsKKyAgICB1bnNpZ25lZCBtX3R5cGVQ
cm9maWxpbmdTdGFydE9mZnNldDsKKyAgICB1bnNpZ25lZCBtX3R5cGVQcm9maWxpbmdFbmRPZmZz
ZXQ7CisgICAgU291cmNlQ29kZSBtX3NvdXJjZTsKK307CisKK2NsYXNzIEV2YWxFeGVjdXRhYmxl
IGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBMTElu
dE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxl
IEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6
U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIHZvaWQg
ZGVzdHJveShKU0NlbGwqKTsKKworICAgIEV2YWxDb2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAg
eworICAgICAgICByZXR1cm4gbV9ldmFsQ29kZUJsb2NrLmdldCgpOworICAgIH0KKworICAgIHN0
YXRpYyBFdmFsRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUm
LCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJv
d0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlLCBjb25zdCBWYXJpYWJsZUVudmlyb25t
ZW50Kik7CisKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7CisgICAgfQorCisg
ICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7CisgICAgICAgIHJldHVybiBT
dHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oRXZhbEV4
ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAgfQorICAgICAgICAK
KyAgICBERUNMQVJFX0lORk87CisKKyAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygp
IGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgp
LCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2Rl
OjpDbGFzc2ljLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpQcm9n
cmFtTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwg
ZmFsc2UsIGV2YWxDb250ZXh0VHlwZSgpKTsgfQorCisgICAgdW5zaWduZWQgbnVtVmFyaWFibGVz
KCkgeyByZXR1cm4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2stPm51bVZhcmlhYmxlcygpOyB9Cisg
ICAgdW5zaWduZWQgbnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCkgeyByZXR1cm4gbV91bmxpbmtlZEV2
YWxDb2RlQmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpOyB9CisKK3ByaXZhdGU6CisgICAg
ZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVj
dXRhYmxlOworCisgICAgRXZhbEV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29k
ZSYsIGJvb2wgaW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJv
d0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlKTsKKworICAgIHN0YXRpYyB2b2lkIHZp
c2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKworICAgIFdyaXRlQmFycmllcjxF
dmFsQ29kZUJsb2NrPiBtX2V2YWxDb2RlQmxvY2s7CisgICAgV3JpdGVCYXJyaWVyPFVubGlua2Vk
RXZhbENvZGVCbG9jaz4gbV91bmxpbmtlZEV2YWxDb2RlQmxvY2s7Cit9OworCitjbGFzcyBQcm9n
cmFtRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmll
bmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgU2Ny
aXB0RXhlY3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVG
bGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAg
IHN0YXRpYyBQcm9ncmFtRXhlY3V0YWJsZSogY3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3Qg
U291cmNlQ29kZSYgc291cmNlKQorICAgIHsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxQcm9ncmFtRXhlY3V0YWJsZT4o
KmV4ZWMtPmhlYXAoKSkpIFByb2dyYW1FeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSk7CisgICAgICAg
IGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKGV4ZWMtPnZtKCkpOworICAgICAgICByZXR1cm4g
ZXhlY3V0YWJsZTsKKyAgICB9CisKKworICAgIEpTT2JqZWN0KiBpbml0aWFsaXplR2xvYmFsUHJv
cGVydGllcyhWTSYsIENhbGxGcmFtZSosIEpTU2NvcGUqKTsKKworICAgIHN0YXRpYyB2b2lkIGRl
c3Ryb3koSlNDZWxsKik7CisKKyAgICBQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2soKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1fcHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICB9CisKKyAg
ICBKU09iamVjdCogY2hlY2tTeW50YXgoRXhlY1N0YXRlKik7CisKKyAgICBQYXNzUmVmUHRyPEpJ
VENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRl
ZEpJVENvZGVGb3JDYWxsKCk7CisgICAgfQorICAgICAgICAKKyAgICBzdGF0aWMgU3RydWN0dXJl
KiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBK
U1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZt
LCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhQcm9ncmFtRXhlY3V0YWJsZVR5cGUsIFN0
cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisgICAgICAgIAorICAgIERFQ0xBUkVfSU5G
TzsKKworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4g
RXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwg
Q29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVy
QmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVk
Q29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRl
eHRUeXBlOjpOb25lKTsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxl
QmFzZTsKKyAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKKworICAgIFByb2dyYW1F
eGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmKTsKKworICAgIHN0YXRpYyB2
b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKworICAgIFdyaXRlQmFy
cmllcjxVbmxpbmtlZFByb2dyYW1Db2RlQmxvY2s+IG1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2Nr
OworICAgIFdyaXRlQmFycmllcjxQcm9ncmFtQ29kZUJsb2NrPiBtX3Byb2dyYW1Db2RlQmxvY2s7
Cit9OworCitjbGFzcyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3Jp
cHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwor
cHVibGljOgorICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBj
b25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3Ry
dWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSog
Y3JlYXRlKEV4ZWNTdGF0ZSosIGNvbnN0IFNvdXJjZUNvZGUmKTsKKworICAgIHN0YXRpYyB2b2lk
IGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxv
Y2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQo
KTsKKyAgICB9CisKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGUoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7CisgICAgfQor
CisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxP
YmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7CisgICAgICAgIHJldHVy
biBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAg
fQorCisgICAgREVDTEFSRV9JTkZPOworCisgICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUlu
Zm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1v
ZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0
TW9kZTo6TW9kdWxlLCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpN
b2R1bGVFdmFsdWF0ZU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25D
b250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9CisKKyAgICBVbmxpbmtl
ZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaygp
IHsgcmV0dXJuIG1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOyB9CisKKyAg
ICBTeW1ib2xUYWJsZSogbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZSgpIHsgcmV0dXJuIG1f
bW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIGZy
aWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0
YWJsZTsKKworICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNv
dXJjZUNvZGUmKTsKKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xv
dFZpc2l0b3ImKTsKKworICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2s+IG1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOworICAgIFdyaXRlQmFycmll
cjxTeW1ib2xUYWJsZT4gbV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlOworICAgIFdyaXRl
QmFycmllcjxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrPiBtX21vZHVsZVByb2dyYW1Db2RlQmxvY2s7
Cit9OworCitjbGFzcyBGdW5jdGlvbkV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhl
Y3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNzIEpJVDsKKyAgICBmcmllbmQgY2xhc3MgTExJbnRP
ZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgU2NyaXB0RXhlY3V0YWJsZSBC
YXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0
cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBGdW5jdGlv
bkV4ZWN1dGFibGUqIGNyZWF0ZSgKKyAgICAgICAgVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUsIAor
ICAgICAgICB1bnNpZ25lZCBmaXJzdExpbmUsIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBz
dGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAg
IHsKKyAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxs
LCBhbGxvY2F0ZUNlbGw8RnVuY3Rpb25FeGVjdXRhYmxlPih2bS5oZWFwKSkgRnVuY3Rpb25FeGVj
dXRhYmxlKHZtLCBzb3VyY2UsIHVubGlua2VkRXhlY3V0YWJsZSwgZmlyc3RMaW5lLCBsYXN0TGlu
ZSwgc3RhcnRDb2x1bW4sIGVuZENvbHVtbiwgaW50cmluc2ljKTsKKyAgICAgICAgZXhlY3V0YWJs
ZS0+ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKKyAgICB9
CisgICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogZnJvbUdsb2JhbENvZGUoCisgICAgICAg
IGNvbnN0IElkZW50aWZpZXImIG5hbWUsIEV4ZWNTdGF0ZSYsIGNvbnN0IFNvdXJjZUNvZGUmLCAK
KyAgICAgICAgSlNPYmplY3QqJiBleGNlcHRpb24sIGludCBvdmVycmlkZUxpbmVOdW1iZXIpOwor
CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKyAgICAgICAgCisgICAgVW5saW5r
ZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSgpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUuZ2V0KCk7CisgICAgfQorCisgICAg
Ly8gUmV0dXJucyBlaXRoZXIgY2FsbCBvciBjb25zdHJ1Y3QgYnl0ZWNvZGUuIFRoaXMgY2FuIGJl
IGFwcHJvcHJpYXRlCisgICAgLy8gZm9yIGFuc3dlcmluZyBxdWVzdGlvbnMgdGhhdCB0aGF0IGRv
bid0IHZhcnkgYmV0d2VlbiBjYWxsIGFuZCBjb25zdHJ1Y3QgLS0KKyAgICAvLyBmb3IgZXhhbXBs
ZSwgYXJndW1lbnRzUmVnaXN0ZXIoKS4KKyAgICBGdW5jdGlvbkNvZGVCbG9jayogZWl0aGVyQ29k
ZUJsb2NrKCkKKyAgICB7CisgICAgICAgIGlmIChtX2NvZGVCbG9ja0ZvckNhbGwpCisgICAgICAg
ICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgICAgICByZXR1cm4gbV9j
b2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAgfQorICAgICAgICAKKyAgICBib29sIGlz
R2VuZXJhdGVkRm9yQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gISFtX2NvZGVC
bG9ja0ZvckNhbGw7CisgICAgfQorCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0Zv
ckNhbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsK
KyAgICB9CisKKyAgICBib29sIGlzR2VuZXJhdGVkRm9yQ29uc3RydWN0KCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICB9CisK
KyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ29uc3RydWN0KCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICB9CisgICAg
ICAgIAorICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
KQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICBy
ZXR1cm4gaXNHZW5lcmF0ZWRGb3JDYWxsKCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVG
b3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKTsK
KyAgICB9CisgICAgICAgIAorICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3IoQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29k
ZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9yQ2FsbCgpOworICAgICAg
ICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGNvZGVC
bG9ja0ZvckNvbnN0cnVjdCgpOworICAgIH0KKworICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBiYXNl
bGluZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKKyAgICAgICAgCisgICAg
RnVuY3Rpb25Db2RlQmxvY2sqIHByb2ZpbGVkQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlv
bktpbmQga2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNlbGluZUNvZGVCbG9ja0Zvcihr
aW5kKTsKKyAgICB9CisKKyAgICBSZWZQdHI8VHlwZVNldD4gcmV0dXJuU3RhdGVtZW50VHlwZVNl
dCgpIAorICAgIHsKKyAgICAgICAgaWYgKCFtX3JldHVyblN0YXRlbWVudFR5cGVTZXQpCisgICAg
ICAgICAgICBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQgPSBUeXBlU2V0OjpjcmVhdGUoKTsKKwor
ICAgICAgICByZXR1cm4gbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0OworICAgIH0KKyAgICAgICAg
CisgICAgRnVuY3Rpb25Nb2RlIGZ1bmN0aW9uTW9kZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVj
dXRhYmxlLT5mdW5jdGlvbk1vZGUoKTsgfQorICAgIGJvb2wgaXNCdWlsdGluRnVuY3Rpb24oKSBj
b25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNCdWlsdGluRnVuY3Rpb24oKTsg
fQorICAgIENvbnN0cnVjdEFiaWxpdHkgY29uc3RydWN0QWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJu
IG1fdW5saW5rZWRFeGVjdXRhYmxlLT5jb25zdHJ1Y3RBYmlsaXR5KCk7IH0KKyAgICBib29sIGlz
Q2xhc3MoKSBjb25zdCB7IHJldHVybiAhY2xhc3NTb3VyY2UoKS5pc051bGwoKTsgfQorICAgIGJv
b2wgaXNBcnJvd0Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNl
UGFyc2VNb2RlOjpBcnJvd0Z1bmN0aW9uTW9kZTsgfQorICAgIGJvb2wgaXNHZXR0ZXIoKSBjb25z
dCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OkdldHRlck1vZGU7IH0K
KyAgICBib29sIGlzU2V0dGVyKCkgY29uc3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNl
UGFyc2VNb2RlOjpTZXR0ZXJNb2RlOyB9CisgICAgYm9vbCBpc0dlbmVyYXRvcigpIGNvbnN0IHsg
cmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNldChTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlN
b2RlLCBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvcldyYXBwZXJGdW5jdGlvbk1vZGUpLmNvbnRh
aW5zKHBhcnNlTW9kZSgpKTsgfQorICAgIGJvb2wgaXNNZXRob2QoKSBjb25zdCB7IHJldHVybiBw
YXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok1ldGhvZE1vZGU7IH0KKyAgICBib29sIGhh
c0NhbGxlckFuZEFyZ3VtZW50c1Byb3BlcnRpZXMoKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8g
UGVyIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZvcmJpZGRlbi1leHRlbnNp
b25zLCBvbmx5IHNsb3BweS1tb2RlIG5vbi1idWlsdGluIGZ1bmN0aW9ucyBpbiBvbGQtc3R5bGUg
KHByZS1FUzYpIHN5bnRhY3RpYyBmb3JtcyBjYW4gY29udGFpbgorICAgICAgICAvLyAiY2FsbGVy
IiBhbmQgImFyZ3VtZW50cyIuCisgICAgICAgIHJldHVybiAhaXNTdHJpY3RNb2RlKCkgJiYgcGFy
c2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUgJiYgIWlzQ2xh
c3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7CisgICAgfQorICAgIGJvb2wgaGFzUHJvdG90eXBlUHJv
cGVydHkoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFNvdXJjZVBhcnNlTW9kZVNldCgK
KyAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6Tm9ybWFsRnVuY3Rpb25Nb2RlLAorICAgICAg
ICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JCb2R5TW9kZSwKKyAgICAgICAgICAgIFNv
dXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZQorICAgICAgICApLmNv
bnRhaW5zKHBhcnNlTW9kZSgpKSB8fCBpc0NsYXNzKCk7CisgICAgfQorICAgIERlcml2ZWRDb250
ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhl
Y3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCk7IH0KKyAgICBib29sIGlzQ2xhc3NDb25zdHJ1
Y3RvckZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmlzQ2xh
c3NDb25zdHJ1Y3RvckZ1bmN0aW9uKCk7IH0KKyAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lKCkg
eyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPm5hbWUoKTsgfQorICAgIGNvbnN0IElkZW50
aWZpZXImIGVjbWFOYW1lKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmVjbWFOYW1l
KCk7IH0KKyAgICBjb25zdCBJZGVudGlmaWVyJiBpbmZlcnJlZE5hbWUoKSB7IHJldHVybiBtX3Vu
bGlua2VkRXhlY3V0YWJsZS0+aW5mZXJyZWROYW1lKCk7IH0KKyAgICB1bnNpZ25lZCBwYXJhbWV0
ZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJhbWV0ZXJD
b3VudCgpOyB9IC8vIEV4Y2x1ZGluZyAndGhpcychCisgICAgdW5zaWduZWQgZnVuY3Rpb25MZW5n
dGgoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZnVuY3Rpb25MZW5ndGgo
KTsgfQorICAgIFNvdXJjZVBhcnNlTW9kZSBwYXJzZU1vZGUoKSBjb25zdCB7IHJldHVybiBtX3Vu
bGlua2VkRXhlY3V0YWJsZS0+cGFyc2VNb2RlKCk7IH0KKyAgICBKU1BhcnNlclNjcmlwdE1vZGUg
c2NyaXB0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5zY3JpcHRN
b2RlKCk7IH0KKyAgICBjb25zdCBTb3VyY2VDb2RlJiBjbGFzc1NvdXJjZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5jbGFzc1NvdXJjZSgpOyB9CisKKyAgICBzdGF0aWMg
dm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CisgICAgc3RhdGljIFN0
cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9i
amVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNy
ZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oRnVuY3Rpb25FeGVjdXRhYmxl
VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOworICAgIH0KKworICAgIHVuc2lnbmVkIHBh
cmFtZXRlcnNTdGFydE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyYW1ldGVyc1N0YXJ0T2Zm
c2V0OyB9CisKKyAgICB2b2lkIG92ZXJyaWRlUGFyYW1ldGVyQW5kVHlwZVByb2ZpbGluZ1N0YXJ0
RW5kT2Zmc2V0cyh1bnNpZ25lZCBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQsIHVuc2lnbmVkIHR5cGVQ
cm9maWxpbmdTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGluZ0VuZE9mZnNldCkKKyAg
ICB7CisgICAgICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0gcGFyYW1ldGVyc1N0YXJ0T2Zm
c2V0OworICAgICAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCA9IHR5cGVQcm9maWxpbmdT
dGFydE9mZnNldDsKKyAgICAgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gdHlwZVByb2Zp
bGluZ0VuZE9mZnNldDsKKyAgICB9CisKKyAgICBERUNMQVJFX0lORk87CisKKyAgICBJbmZlcnJl
ZFZhbHVlKiBzaW5nbGV0b25GdW5jdGlvbigpIHsgcmV0dXJuIG1fc2luZ2xldG9uRnVuY3Rpb24u
Z2V0KCk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Cisg
ICAgRnVuY3Rpb25FeGVjdXRhYmxlKAorICAgICAgICBWTSYsIGNvbnN0IFNvdXJjZUNvZGUmLCBV
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSosIHVuc2lnbmVkIGZpcnN0TGluZSwgCisgICAgICAg
IHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29s
dW1uLCBJbnRyaW5zaWMpOworICAgIAorICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mKTsKKwor
ICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworICAgIAorICAgIHVuc2lnbmVkIG1f
cGFyYW1ldGVyc1N0YXJ0T2Zmc2V0OworICAgIFdyaXRlQmFycmllcjxVbmxpbmtlZEZ1bmN0aW9u
RXhlY3V0YWJsZT4gbV91bmxpbmtlZEV4ZWN1dGFibGU7CisgICAgV3JpdGVCYXJyaWVyPEZ1bmN0
aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNhbGw7CisgICAgV3JpdGVCYXJyaWVyPEZ1bmN0
aW9uQ29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdDsKKyAgICBSZWZQdHI8VHlwZVNl
dD4gbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0OworICAgIFdyaXRlQmFycmllcjxJbmZlcnJlZFZh
bHVlPiBtX3NpbmdsZXRvbkZ1bmN0aW9uOworfTsKKworI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkK
K2NsYXNzIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFz
ZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOworICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwg
U3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRpYyBXZWJBc3NlbWJseUV4ZWN1dGFibGUq
IGNyZWF0ZShWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBt
b2R1bGUsIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpCisgICAgeworICAgICAgICBXZWJBc3NlbWJs
eUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxXZWJB
c3NlbWJseUV4ZWN1dGFibGU+KHZtLmhlYXApKSBXZWJBc3NlbWJseUV4ZWN1dGFibGUodm0sIHNv
dXJjZSwgbW9kdWxlLCBmdW5jdGlvbkluZGV4KTsKKyAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNo
Q3JlYXRpb24odm0pOworICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTsKKyAgICB9CisKKyAgICBz
dGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVj
dHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhXZWJBc3NlbWJs
eUV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAgfQorCisgICAg
c3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIERFQ0xBUkVfSU5GTzsKKworICAg
IHZvaWQgcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYpOworCisgICAgV2ViQXNzZW1ibHlDb2RlQmxv
Y2sqIGNvZGVCbG9ja0ZvckNhbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2Nr
Rm9yQ2FsbC5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1
dGFibGVCYXNlOworICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZShWTSYsIGNvbnN0IFNvdXJjZUNv
ZGUmLCBKU1dhc21Nb2R1bGUqLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KTsKKworICAgIHN0YXRp
YyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKKworICAgIFNvdXJj
ZUNvZGUgbV9zb3VyY2U7CisgICAgV3JpdGVCYXJyaWVyPEpTV2FzbU1vZHVsZT4gbV9tb2R1bGU7
CisgICAgdW5zaWduZWQgbV9mdW5jdGlvbkluZGV4OworCisgICAgV3JpdGVCYXJyaWVyPFdlYkFz
c2VtYmx5Q29kZUJsb2NrPiBtX2NvZGVCbG9ja0ZvckNhbGw7Cit9OworI2VuZGlmCisKK3RlbXBs
YXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4KK0pTT2JqZWN0KiBTY3JpcHRFeGVjdXRhYmxl
OjpwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJiB2bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2Nv
cGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3Vs
dENvZGVCbG9jaykKK3sKKyAgICBpZiAoaGFzSklUQ29kZUZvcihraW5kKSkgeworICAgICAgICBp
ZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBFdmFsRXhlY3V0YWJsZT46OnZhbHVlKQor
ICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxF
dmFsRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7CisgICAgICAgIGVsc2UgaWYgKHN0
ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAg
ICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8UHJv
Z3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOworICAgICAgICBlbHNlIGlmIChz
dGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlPjo6dmFs
dWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanND
YXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKKyAgICAg
ICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBGdW5jdGlvbkV4ZWN1dGFi
bGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxv
Y2sqPihqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9ja0ZvcihraW5k
KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gcHJlcGFyZUZv
ckV4ZWN1dGlvbkltcGwodm0sIGZ1bmN0aW9uLCBzY29wZSwga2luZCwgcmVzdWx0Q29kZUJsb2Nr
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9Qcm9ncmFtRXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL1Byb2dyYW1FeGVjdXRhYmxlLmgJKHJldmlzaW9uIDIwNzc5MCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb2dyYW1FeGVjdXRhYmxlLmgJKHdvcmtp
bmcgY29weSkKQEAgLTI1LDQzOSArMjUsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRl
ICJBcml0eUNoZWNrTW9kZS5oIgotI2luY2x1ZGUgIkNhbGxEYXRhLmgiCi0jaW5jbHVkZSAiQ29k
ZUJsb2NrSGFzaC5oIgotI2luY2x1ZGUgIkNvZGVTcGVjaWFsaXphdGlvbktpbmQuaCIKLSNpbmNs
dWRlICJDb21waWxhdGlvblJlc3VsdC5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGVJbmZvLmgiCi0j
aW5jbHVkZSAiSGFuZGxlckluZm8uaCIKLSNpbmNsdWRlICJJbmZlcnJlZFZhbHVlLmgiCi0jaW5j
bHVkZSAiSklUQ29kZS5oIgotI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCi0jaW5jbHVkZSAi
U291cmNlQ29kZS5oIgotI2luY2x1ZGUgIlR5cGVTZXQuaCIKLSNpbmNsdWRlICJVbmxpbmtlZENv
ZGVCbG9jay5oIgotI2luY2x1ZGUgIlVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLmgiCisjaW5j
bHVkZSAiU2NyaXB0RXhlY3V0YWJsZS5oIgogCiBuYW1lc3BhY2UgSlNDIHsKIAotY2xhc3MgQ29k
ZUJsb2NrOwotY2xhc3MgRXZhbENvZGVCbG9jazsKLWNsYXNzIEZ1bmN0aW9uQ29kZUJsb2NrOwot
Y2xhc3MgSlNTY29wZTsKLWNsYXNzIEpTV2FzbU1vZHVsZTsKLWNsYXNzIExMSW50T2Zmc2V0c0V4
dHJhY3RvcjsKLWNsYXNzIE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7Ci1jbGFzcyBQcm9ncmFtQ29k
ZUJsb2NrOwotY2xhc3MgV2ViQXNzZW1ibHlDb2RlQmxvY2s7Ci0KLWVudW0gQ29tcGlsYXRpb25L
aW5kIHsgRmlyc3RDb21waWxhdGlvbiwgT3B0aW1pemluZ0NvbXBpbGF0aW9uIH07Ci0KLWlubGlu
ZSBib29sIGlzQ2FsbChDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIEFTU0VSVChraW5k
ID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotY2xhc3MgRXhl
Y3V0YWJsZUJhc2UgOiBwdWJsaWMgSlNDZWxsIHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19JU19IT1NUID0g
MDsKLSAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCA9IC0x
OwotCi0gICAgRXhlY3V0YWJsZUJhc2UoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50
IG51bVBhcmFtZXRlcnMsIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgICAgIDogSlNDZWxsKHZt
LCBzdHJ1Y3R1cmUpCi0gICAgICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0
ZXJzKQotICAgICAgICAsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdChudW1QYXJhbWV0ZXJz
KQotICAgICAgICAsIG1faW50cmluc2ljKGludHJpbnNpYykKLSAgICB7Ci0gICAgfQotCi0gICAg
dm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCi0gICAgewotICAgICAgICBCYXNlOjpmaW5pc2hD
cmVhdGlvbih2bSk7Ci0gICAgfQotCi1wdWJsaWM6Ci0gICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsK
LSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1
cmVGbGFnczsKLQotICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVl
OwotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0gICAgICAgIAotICAgIENvZGVC
bG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIGJv
b2wgaXNFdmFsRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgp
ID09IEV2YWxFeGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0gICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0
YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhl
Y3V0YWJsZVR5cGU7Ci0gICAgfQotICAgIGJvb2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0
Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsK
LSAgICB9Ci0gICAgYm9vbCBpc01vZHVsZVByb2dyYW1FeGVjdXRhYmxlKCkKLSAgICB7Ci0gICAg
ICAgIHJldHVybiB0eXBlKCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwotICAgIH0K
LQotCi0gICAgYm9vbCBpc0hvc3RGdW5jdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NF
UlQoKG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0g
KG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSk7
Ci0gICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJT
X0lTX0hPU1Q7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotICAgIGJvb2wgaXNX
ZWJBc3NlbWJseUV4ZWN1dGFibGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGUo
KSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGVUeXBlOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3Rh
dGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGds
b2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykgeyByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0s
IGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyks
IGluZm8oKSk7IH0KLSAgICAgICAgCi0gICAgdm9pZCBjbGVhckNvZGUoKTsKLQotICAgIERFQ0xB
UkVfRVhQT1JUX0lORk87Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9y
Q2FsbDsKLSAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0OwotCi1wdWJsaWM6Ci0g
ICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCi0gICAgewot
ICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ2FsbCk7Ci0gICAgICAgIHJldHVybiBtX2ppdENv
ZGVGb3JDYWxsOwotICAgIH0KLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklU
Q29kZUZvckNvbnN0cnVjdCgpCi0gICAgewotICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ29u
c3RydWN0KTsKLSAgICAgICAgcmV0dXJuIG1faml0Q29kZUZvckNvbnN0cnVjdDsKLSAgICB9Ci0g
ICAgICAgIAotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2Rl
Rm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwot
ICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJu
IGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1Y3QoKTsKLSAgICB9Ci0gICAgCi0gICAgTWFjcm9B
c3NlbWJsZXJDb2RlUHRyIGVudHJ5cG9pbnRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5k
LCBBcml0eUNoZWNrTW9kZSBhcml0eSkKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIGhh
dmUgYSBjYWNoZWQgcmVzdWx0LiBXZSBvbmx5IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1
c2Ugd2UgdXNlIHRoZQotICAgICAgICAvLyBuby1hcml0eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0
dWFsIGNhbGxzLCB3aGljaCB3aWxsICJjYWNoZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBpbgotICAg
ICAgICAvLyBtYWNoaW5lIGNvZGUuCi0gICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0
eSkgewotICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7Ci0gICAgICAgICAgICBjYXNlIENvZGVG
b3JDYWxsOgotICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0
ID0gbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrKQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBD
b2RlRm9yQ29uc3RydWN0OgotICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQ
dHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spCi0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3Vs
dCA9Ci0gICAgICAgICAgICBnZW5lcmF0ZWRKSVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2Fs
bChhcml0eSk7Ci0gICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAg
ICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdDsgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQn
cyB2aXJ0dWFsIGNhbGwgb3B0aW1pemF0aW9ucy4KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkg
ewotICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgICAgICBtX2ppdENv
ZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgbV9q
aXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mSklUQ29kZVdpdGhBcml0
eUNoZWNrRm9yKAotICAgICAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewot
ICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAg
ICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZv
ckNhbGxXaXRoQXJpdHlDaGVjayk7Ci0gICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAg
ICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29k
ZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrKTsKLSAgICAgICAgfQotICAgICAgICBSRUxFQVNF
X0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0g
ICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk51bVBhcmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxp
emF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwp
Ci0gICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251
bVBhcmFtZXRlcnNGb3JDYWxsKTsKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0
cnVjdCk7Ci0gICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1f
bnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCk7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNKSVRDb2Rl
Rm9yQ2FsbCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9y
Q2FsbCA+PSAwOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ29uc3Ry
dWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDb25z
dHJ1Y3QgPj0gMDsKLSAgICB9Ci0gICAgICAgIAotICAgIGJvb2wgaGFzSklUQ29kZUZvcihDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ2FsbCgpOwot
ICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJu
IGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKTsKLSAgICB9Ci0KLSAgICAvLyBJbnRyaW5zaWNzIGFy
ZSBvbmx5IGZvciBjYWxscywgY3VycmVudGx5LgotICAgIEludHJpbnNpYyBpbnRyaW5zaWMoKSBj
b25zdCB7IHJldHVybiBtX2ludHJpbnNpYzsgfQotICAgICAgICAKLSAgICBJbnRyaW5zaWMgaW50
cmluc2ljRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAg
ICAgIGlmIChpc0NhbGwoa2luZCkpCi0gICAgICAgICAgICByZXR1cm4gaW50cmluc2ljKCk7Ci0g
ICAgICAgIHJldHVybiBOb0ludHJpbnNpYzsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBkdW1wKFBy
aW50U3RyZWFtJikgY29uc3Q7Ci0gICAgICAgIAotcHJvdGVjdGVkOgotICAgIEludHJpbnNpYyBt
X2ludHJpbnNpYzsKLSAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsKLSAgICBS
ZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ29uc3RydWN0OwotICAgIE1hY3JvQXNzZW1ibGVy
Q29kZVB0ciBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2s7Ci0gICAgTWFjcm9Bc3NlbWJs
ZXJDb2RlUHRyIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrOwotfTsKLQotY2xh
c3MgTmF0aXZlRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7Ci0gICAg
ZnJpZW5kIGNsYXNzIEpJVDsKLSAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9y
OwotcHVibGljOgotICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKLSAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0
cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgTmF0aXZlRXhlY3V0YWJsZSogY3JlYXRl
KFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1
bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlv
biBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKTsK
LQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7Ci0KLSAgICBDb2RlQmxvY2tIYXNo
IGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7Ci0KLSAgICBOYXRpdmVGdW5j
dGlvbiBmdW5jdGlvbigpIHsgcmV0dXJuIG1fZnVuY3Rpb247IH0KLSAgICBOYXRpdmVGdW5jdGlv
biBjb25zdHJ1Y3RvcigpIHsgcmV0dXJuIG1fY29uc3RydWN0b3I7IH0KLSAgICAgICAgCi0gICAg
TmF0aXZlRnVuY3Rpb24gbmF0aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAg
ICByZXR1cm4gZnVuY3Rpb24oKTsKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0
cnVjdCk7Ci0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcigpOwotICAgIH0KLSAgICAgICAgCi0g
ICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZk5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFs
aXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxs
KQotICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBt
X2Z1bmN0aW9uKTsKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0g
ICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9jb25zdHJ1
Y3Rvcik7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZN
JiwgSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVlIHByb3RvKTsKLSAgICAgICAgCi0gICAgREVDTEFS
RV9JTkZPOwotCi0gICAgY29uc3QgU3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1l
OyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgUGFzc1JlZlB0
cjxKSVRDb2RlPiBjYWxsVGh1bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmss
IGNvbnN0IFN0cmluZyYgbmFtZSk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1
dGFibGVCYXNlOwotCi0gICAgTmF0aXZlRXhlY3V0YWJsZShWTSYsIE5hdGl2ZUZ1bmN0aW9uIGZ1
bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljKTsKLQotICAgIE5h
dGl2ZUZ1bmN0aW9uIG1fZnVuY3Rpb247Ci0gICAgTmF0aXZlRnVuY3Rpb24gbV9jb25zdHJ1Y3Rv
cjsKLQotICAgIFN0cmluZyBtX25hbWU7Ci19OwotCi1jbGFzcyBTY3JpcHRFeGVjdXRhYmxlIDog
cHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFibGVC
YXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFz
ZTo6U3RydWN0dXJlRmxhZ3M7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwot
ICAgICAgICAKLSAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCkgY29uc3Q7Ci0KLSAgICBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7IHJldHVy
biBtX3NvdXJjZTsgfQotICAgIGludHB0cl90IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4gbV9z
b3VyY2UucHJvdmlkZXJJRCgpOyB9Ci0gICAgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwoKSBjb25z
dCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcigpLT51cmwoKTsgfQotICAgIGludCBmaXJzdExp
bmUoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0TGluZTsgfQotICAgIHZvaWQgc2V0T3ZlcnJpZGVM
aW5lTnVtYmVyKGludCBvdmVycmlkZUxpbmVOdW1iZXIpIHsgbV9vdmVycmlkZUxpbmVOdW1iZXIg
PSBvdmVycmlkZUxpbmVOdW1iZXI7IH0KLSAgICBib29sIGhhc092ZXJyaWRlTGluZU51bWJlcigp
IGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyICE9IC0xOyB9Ci0gICAgaW50IG92
ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyOyB9
Ci0gICAgaW50IGxhc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0TGluZTsgfQotICAgIHVu
c2lnbmVkIHN0YXJ0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gbV9zdGFydENvbHVtbjsgfQotICAg
IHVuc2lnbmVkIGVuZENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9Ci0gICAg
dW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBl
UHJvZmlsaW5nU3RhcnRPZmZzZXQ7IH0KLSAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OyB9Ci0KLSAgICBi
b29sIHVzZXNFdmFsKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0dXJlOyB9
Ci0gICAgYm9vbCB1c2VzQXJndW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEFy
Z3VtZW50c0ZlYXR1cmU7IH0KLSAgICBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSBjb25z
dCB7IHJldHVybiBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQ7IH0KLSAgICBib29sIGlzU3RyaWN0
TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmVhdHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVyZTsgfQot
ICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxEZXJpdmVkQ29udGV4dFR5cGU+KG1fZGVyaXZlZENvbnRleHRUeXBlKTsg
fQotICAgIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBz
dGF0aWNfY2FzdDxFdmFsQ29udGV4dFR5cGU+KG1fZXZhbENvbnRleHRUeXBlKTsgfQotCi0gICAg
RUNNQU1vZGUgZWNtYU1vZGUoKSBjb25zdCB7IHJldHVybiBpc1N0cmljdE1vZGUoKSA/IFN0cmlj
dE1vZGUgOiBOb3RTdHJpY3RNb2RlOyB9Ci0gICAgICAgIAotICAgIHZvaWQgc2V0TmV2ZXJJbmxp
bmUoYm9vbCB2YWx1ZSkgeyBtX25ldmVySW5saW5lID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldE5l
dmVyT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBtX25ldmVyT3B0aW1pemUgPSB2YWx1ZTsgfQotICAg
IHZvaWQgc2V0TmV2ZXJGVExPcHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJGVExPcHRpbWl6
ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXREaWRUcnlUb0VudGVySW5Mb29wKGJvb2wgdmFsdWUp
IHsgbV9kaWRUcnlUb0VudGVySW5Mb29wID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldENhblVzZU9T
UkV4aXRGdXp6aW5nKGJvb2wgdmFsdWUpIHsgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9IHZhbHVl
OyB9Ci0gICAgYm9vbCBuZXZlcklubGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJbmxpbmU7
IH0KLSAgICBib29sIG5ldmVyT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyT3B0aW1p
emU7IH0KLSAgICBib29sIG5ldmVyRlRMT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVy
RlRMT3B0aW1pemU7IH0KLSAgICBib29sIGRpZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25zdCB7IHJl
dHVybiBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7IH0KLSAgICBib29sIGlzSW5saW5pbmdDYW5kaWRh
dGUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJJbmxpbmUoKTsgfQotICAgIGJvb2wgaXNPa1RvT3B0
aW1pemUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJPcHRpbWl6ZSgpOyB9Ci0gICAgYm9vbCBjYW5V
c2VPU1JFeGl0RnV6emluZygpIGNvbnN0IHsgcmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1enppbmc7
IH0KLSAgICAKLSAgICBib29sKiBhZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKCkgeyByZXR1
cm4gJm1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQotCi0gICAgQ29kZUZlYXR1cmVzIGZlYXR1cmVz
KCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlczsgfQotICAgICAgICAKLSAgICBERUNMQVJFX0VY
UE9SVF9JTkZPOwotCi0gICAgdm9pZCByZWNvcmRQYXJzZShDb2RlRmVhdHVyZXMgZmVhdHVyZXMs
IGJvb2wgaGFzQ2FwdHVyZWRWYXJpYWJsZXMsIGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSwg
dW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbikKLSAgICB7Ci0gICAgICAg
IG1fZmVhdHVyZXMgPSBmZWF0dXJlczsKLSAgICAgICAgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA9
IGhhc0NhcHR1cmVkVmFyaWFibGVzOwotICAgICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGluZTsK
LSAgICAgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotICAgICAgICBBU1NFUlQoc3RhcnRDb2x1
bW4gIT0gVUlOVF9NQVgpOwotICAgICAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47Ci0g
ICAgICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAgICAgICBtX2VuZENvbHVt
biA9IGVuZENvbHVtbjsKLSAgICB9Ci0KLSAgICB2b2lkIGluc3RhbGxDb2RlKENvZGVCbG9jayop
OwotICAgIHZvaWQgaW5zdGFsbENvZGUoVk0mLCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwgQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgQ29kZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3IoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBKU09iamVjdComIGV4Y2Vw
dGlvbik7Ci0gICAgQ29kZUJsb2NrKiBuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcihDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kKTsKLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGludGVyZXN0
aW5nIEdDIHN0b3J5LiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFza2luZyB1cyB0byBj
cmVhdGUgYSBDb2RlQmxvY2sKLSAgICAvLyB0aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJlZm9yZSB0
aGlzIGZ1bmN0aW9uIHJldHVybnMuIENhbGxlcnMgYXJlIGVzc2VudGlhbGx5IGFza2luZyBmb3Ig
YSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgLy8gdG8gdGhlIENvZGVCbG9jay4gQmVjYXVzZSB0aGUg
RXhlY3V0YWJsZSBtYXkgYmUgYWxsb2NhdGluZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1aXJlIGNh
bGxlcnMgdG8gcGFzcyBpbgotICAgIC8vIHRoZWlyIENvZGVCbG9jayomIHJlZmVyZW5jZSBiZWNh
dXNlIGl0J3Mgc2FmZSBmb3IgQ29kZUJsb2NrIHRvIGJlIGpldHRpc29uZWQgaWYgRXhlY3V0YWJs
ZSBpcyB0aGUgb25seSB0aGluZwotICAgIC8vIHRvIHBvaW50IHRvIGl0LiBUaGlzIGZvcmNlcyBj
YWxsZXJzIHRvIGhhdmUgYSBDb2RlQmxvY2sqIGluIGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNr
IHRoYXQgd2lsbCBiZSBtYXJrZWQKLSAgICAvLyBieSBjb25zZXJ2YXRpdmUgR0MgaWYgYSBHQyBo
YXBwZW5zIGFmdGVyIHdlIGNyZWF0ZSB0aGUgQ29kZUJsb2NrLgotICAgIHRlbXBsYXRlIDx0eXBl
bmFtZSBFeGVjdXRhYmxlVHlwZT4KLSAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbihW
TSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJs
b2NrKiYgcmVzdWx0Q29kZUJsb2NrKTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9y
PiB2b2lkIGZvckVhY2hDb2RlQmxvY2soRnVuY3RvciYmKTsKLQotcHJpdmF0ZToKLSAgICBmcmll
bmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRp
b25JbXBsKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5k
LCBDb2RlQmxvY2sqJik7Ci0KLXByb3RlY3RlZDoKLSAgICBTY3JpcHRFeGVjdXRhYmxlKFN0cnVj
dHVyZSosIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERl
cml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250
ZXh0VHlwZSwgSW50cmluc2ljKTsKLQotICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZtKQot
ICAgIHsKLSAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgICAgICB2bS5oZWFw
LmFkZEV4ZWN1dGFibGUodGhpcyk7IC8vIEJhbGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVubWFya2Vk
Q29tcGlsZWRDb2RlKCkuCi0KLSNpZiBFTkFCTEUoQ09ERUJMT0NLX1NBTVBMSU5HKQotICAgICAg
ICBpZiAoU2FtcGxpbmdUb29sKiBzYW1wbGVyID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBsZXIoKSkK
LSAgICAgICAgICAgIHNhbXBsZXItPm5vdGlmeU9mU2NvcGUodm0sIHRoaXMpOwotI2VuZGlmCi0g
ICAgfQotCi0gICAgQ29kZUZlYXR1cmVzIG1fZmVhdHVyZXM7Ci0gICAgYm9vbCBtX2RpZFRyeVRv
RW50ZXJJbkxvb3A7Ci0gICAgYm9vbCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDogMTsKLSAgICBi
b29sIG1fbmV2ZXJJbmxpbmUgOiAxOwotICAgIGJvb2wgbV9uZXZlck9wdGltaXplIDogMTsKLSAg
ICBib29sIG1fbmV2ZXJGVExPcHRpbWl6ZSA6IDE7Ci0gICAgYm9vbCBtX2lzQXJyb3dGdW5jdGlv
bkNvbnRleHQgOiAxOwotICAgIGJvb2wgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7Ci0gICAg
dW5zaWduZWQgbV9kZXJpdmVkQ29udGV4dFR5cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4dFR5cGUK
LSAgICB1bnNpZ25lZCBtX2V2YWxDb250ZXh0VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0VHlwZQot
Ci0gICAgaW50IG1fb3ZlcnJpZGVMaW5lTnVtYmVyOwotICAgIGludCBtX2ZpcnN0TGluZTsKLSAg
ICBpbnQgbV9sYXN0TGluZTsKLSAgICB1bnNpZ25lZCBtX3N0YXJ0Q29sdW1uOwotICAgIHVuc2ln
bmVkIG1fZW5kQ29sdW1uOwotICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0
OwotICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKLSAgICBTb3VyY2VDb2Rl
IG1fc291cmNlOwotfTsKLQotY2xhc3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2Ny
aXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsK
LXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0
cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwot
Ci0gICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
X2V2YWxDb2RlQmxvY2suZ2V0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIEV2YWxFeGVjdXRhYmxl
KiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENv
bnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBF
dmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKLQotICAgIFBhc3NS
ZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4g
Z2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJl
KiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBK
U1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZt
LCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0cnVj
dHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5GTzsK
LQotICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhl
Y3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29u
c3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmlu
ZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29u
dGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRleHRU
eXBlKCkpOyB9Ci0KLSAgICB1bnNpZ25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3VubGlu
a2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFibGVzKCk7IH0KLSAgICB1bnNpZ25lZCBudW1iZXJP
ZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtYmVy
T2ZGdW5jdGlvbkRlY2xzKCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0
YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBFdmFs
RXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmljdENv
bnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBF
dmFsQ29udGV4dFR5cGUpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwq
LCBTbG90VmlzaXRvciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1fZXZh
bENvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBtX3Vu
bGlua2VkRXZhbENvZGVCbG9jazsKLX07Ci0KIGNsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZpbmFs
IDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewogICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNl
dHNFeHRyYWN0b3I7CiBwdWJsaWM6CkBAIC01MDksMjcwICs4MCw0IEBAIHByaXZhdGU6CiAgICAg
V3JpdGVCYXJyaWVyPFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3JhbUNvZGVCbG9jazsKIH07CiAK
LWNsYXNzIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1
dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6
Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVu
c2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJ
c0ltbW9ydGFsOwotCi0gICAgc3RhdGljIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUo
RXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJv
eShKU0NlbGwqKTsKLQotICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCi0g
ICAgewotICAgICAgICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAg
IH0KLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewot
ICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0KLSAgICBz
dGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVj
dHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAg
ICBERUNMQVJFX0lORk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNv
bnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBm
YWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpN
b2R1bGUsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6Ok1vZHVsZUV2
YWx1YXRlTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQo
KSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KLQotICAgIFVubGlua2VkTW9kdWxl
UHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKCkgeyByZXR1
cm4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7IH0KLQotICAgIFN5bWJv
bFRhYmxlKiBtb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkgeyByZXR1cm4gbV9tb2R1bGVF
bnZpcm9ubWVudFN5bWJvbFRhYmxlLmdldCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNs
YXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwot
Ci0gICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29k
ZSYpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRv
ciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4g
bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJyaWVyPFN5bWJv
bFRhYmxlPiBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7Ci0gICAgV3JpdGVCYXJyaWVy
PE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLX07Ci0K
LWNsYXNzIEZ1bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxl
IHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNF
eHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0g
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJl
RmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0
YWJsZSogY3JlYXRlKAotICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwg
VW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgCi0gICAgICAg
IHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29s
dW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgewotICAg
ICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9j
YXRlQ2VsbDxGdW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5jdGlvbkV4ZWN1dGFibGUo
dm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBzdGFy
dENvbHVtbiwgZW5kQ29sdW1uLCBpbnRyaW5zaWMpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5p
c2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLSAgICBz
dGF0aWMgRnVuY3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgKLSAgICAgICAgY29uc3Qg
SWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNlQ29kZSYsIAotICAgICAg
ICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcik7Ci0KLSAgICBz
dGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAgICBVbmxpbmtlZEZ1bmN0
aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAg
IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1
cm5zIGVpdGhlciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhpcyBjYW4gYmUgYXBwcm9w
cmlhdGUKLSAgICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0IHRoYXQgZG9uJ3QgdmFy
eSBiZXR3ZWVuIGNhbGwgYW5kIGNvbnN0cnVjdCAtLQotICAgIC8vIGZvciBleGFtcGxlLCBhcmd1
bWVudHNSZWdpc3RlcigpLgotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBlaXRoZXJDb2RlQmxvY2so
KQotICAgIHsKLSAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkKLSAgICAgICAgICAgIHJl
dHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGJvb2wgaXNHZW5lcmF0
ZWRGb3JDYWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAhIW1fY29kZUJsb2NrRm9y
Q2FsbDsKLSAgICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgp
Ci0gICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgIH0K
LQotICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25zdAotICAgIHsKLSAgICAg
ICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLQotICAgIEZ1
bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAgICAgICAgCi0g
ICAgYm9vbCBpc0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAg
ewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBp
c0dlbmVyYXRlZEZvckNhbGwoKTsKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0
cnVjdCk7Ci0gICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpOwotICAgIH0K
LSAgICAgICAgCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvcihDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2Fs
bCkKLSAgICAgICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7Ci0gICAgICAgIEFTU0VS
VChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9y
Q29uc3RydWN0KCk7Ci0gICAgfQotCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lQ29k
ZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwotICAgICAgICAKLSAgICBGdW5jdGlv
bkNvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBr
aW5kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJsb2NrRm9yKGtpbmQpOwot
ICAgIH0KLQotICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KCkgCi0g
ICAgewotICAgICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCkKLSAgICAgICAgICAg
IG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0ZSgpOwotCi0gICAgICAg
IHJldHVybiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgfQotICAgICAgICAKLSAgICBG
dW5jdGlvbk1vZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUt
PmZ1bmN0aW9uTW9kZSgpOyB9Ci0gICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlvbigpIGNvbnN0IHsg
cmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5jdGlvbigpOyB9Ci0gICAg
Q29uc3RydWN0QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gbV91bmxp
bmtlZEV4ZWN1dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQotICAgIGJvb2wgaXNDbGFzcygp
IGNvbnN0IHsgcmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9Ci0gICAgYm9vbCBpc0Fy
cm93RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1v
ZGU6OkFycm93RnVuY3Rpb25Nb2RlOyB9Ci0gICAgYm9vbCBpc0dldHRlcigpIGNvbnN0IHsgcmV0
dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVyTW9kZTsgfQotICAgIGJv
b2wgaXNTZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1v
ZGU6OlNldHRlck1vZGU7IH0KLSAgICBib29sIGlzR2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4g
U291cmNlUGFyc2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsIFNv
dXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZSkuY29udGFpbnMocGFy
c2VNb2RlKCkpOyB9Ci0gICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9k
ZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQotICAgIGJvb2wgaGFzQ2FsbGVy
QW5kQXJndW1lbnRzUHJvcGVydGllcygpIGNvbnN0Ci0gICAgewotICAgICAgICAvLyBQZXIgaHR0
cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVuLWV4dGVuc2lvbnMsIG9u
bHkgc2xvcHB5LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9sZC1zdHlsZSAocHJlLUVT
Nikgc3ludGFjdGljIGZvcm1zIGNhbiBjb250YWluCi0gICAgICAgIC8vICJjYWxsZXIiIGFuZCAi
YXJndW1lbnRzIi4KLSAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUoKSAmJiBwYXJzZU1vZGUo
KSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAmJiAhaXNDbGFzc0NvbnN0
cnVjdG9yRnVuY3Rpb24oKTsKLSAgICB9Ci0gICAgYm9vbCBoYXNQcm90b3R5cGVQcm9wZXJ0eSgp
IGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KAotICAgICAg
ICAgICAgU291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUsCi0gICAgICAgICAgICBT
b3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAotICAgICAgICAgICAgU291cmNlUGFy
c2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCi0gICAgICAgICkuY29udGFpbnMo
cGFyc2VNb2RlKCkpIHx8IGlzQ2xhc3MoKTsKLSAgICB9Ci0gICAgRGVyaXZlZENvbnRleHRUeXBl
IGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5kZXJpdmVkQ29udGV4dFR5cGUoKTsgfQotICAgIGJvb2wgaXNDbGFzc0NvbnN0cnVjdG9yRnVu
Y3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNDbGFzc0NvbnN0
cnVjdG9yRnVuY3Rpb24oKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUoKSB7IHJldHVy
biBtX3VubGlua2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYg
ZWNtYU5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZWNtYU5hbWUoKTsgfQot
ICAgIGNvbnN0IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRF
eGVjdXRhYmxlLT5pbmZlcnJlZE5hbWUoKTsgfQotICAgIHVuc2lnbmVkIHBhcmFtZXRlckNvdW50
KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7
IH0gLy8gRXhjbHVkaW5nICd0aGlzJyEKLSAgICB1bnNpZ25lZCBmdW5jdGlvbkxlbmd0aCgpIGNv
bnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbkxlbmd0aCgpOyB9Ci0g
ICAgU291cmNlUGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRF
eGVjdXRhYmxlLT5wYXJzZU1vZGUoKTsgfQotICAgIEpTUGFyc2VyU2NyaXB0TW9kZSBzY3JpcHRN
b2RlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnNjcmlwdE1vZGUoKTsg
fQotICAgIGNvbnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29uc3QgeyByZXR1cm4gbV91
bmxpbmtlZEV4ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KLQotICAgIHN0YXRpYyB2b2lkIHZp
c2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKLSAgICBzdGF0aWMgU3RydWN0dXJl
KiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBK
U1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZt
LCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4ZWN1dGFibGVUeXBlLCBT
dHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgcGFyYW1ldGVy
c1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7IH0K
LQotICAgIHZvaWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmlsaW5nU3RhcnRFbmRPZmZz
ZXRzKHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGlu
Z1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KQotICAgIHsKLSAg
ICAgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7Ci0g
ICAgICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0OwotICAgICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0eXBlUHJvZmlsaW5nRW5k
T2Zmc2V0OwotICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEluZmVycmVkVmFsdWUq
IHNpbmdsZXRvbkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25GdW5jdGlvbi5nZXQoKTsg
fQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBGdW5j
dGlvbkV4ZWN1dGFibGUoCi0gICAgICAgIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIFVubGlua2Vk
RnVuY3Rpb25FeGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAKLSAgICAgICAgdW5zaWdu
ZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIElu
dHJpbnNpYyk7Ci0gICAgCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYpOwotCi0gICAgZnJp
ZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0gICAgCi0gICAgdW5zaWduZWQgbV9wYXJhbWV0
ZXJzU3RhcnRPZmZzZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlPiBtX3VubGlua2VkRXhlY3V0YWJsZTsKLSAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2Rl
QmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKLSAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2Rl
QmxvY2s+IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0OwotICAgIFJlZlB0cjxUeXBlU2V0PiBtX3Jl
dHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPEluZmVycmVkVmFsdWU+IG1f
c2luZ2xldG9uRnVuY3Rpb247Ci19OwotCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotY2xhc3Mg
V2ViQXNzZW1ibHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLXB1
YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1
cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogY3JlYXRl
KFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwg
dW5zaWduZWQgZnVuY3Rpb25JbmRleCkKLSAgICB7Ci0gICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0
YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFdlYkFzc2VtYmx5
RXhlY3V0YWJsZT4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSh2bSwgc291cmNlLCBt
b2R1bGUsIGZ1bmN0aW9uSW5kZXgpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlv
bih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLQotICAgIHN0YXRpYyBT
dHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpj
cmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdlYkFzc2VtYmx5RXhlY3V0
YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgdm9pZCBw
cmVwYXJlRm9yRXhlY3V0aW9uKFZNJik7Ci0KLSAgICBXZWJBc3NlbWJseUNvZGVCbG9jayogY29k
ZUJsb2NrRm9yQ2FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxs
LmdldCgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJh
c2U7Ci0gICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3QgU291cmNlQ29kZSYsIEpT
V2FzbU1vZHVsZSosIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOwotCi0gICAgc3RhdGljIHZvaWQg
dmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgU291cmNlQ29kZSBt
X3NvdXJjZTsKLSAgICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBtX21vZHVsZTsKLSAgICB1
bnNpZ25lZCBtX2Z1bmN0aW9uSW5kZXg7Ci0KLSAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlD
b2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKLX07Ci0jZW5kaWYKLQotdGVtcGxhdGUgPHR5
cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgotSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBh
cmVGb3JFeGVjdXRpb24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2Nv
cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJs
b2NrKQotewotICAgIGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7Ci0gICAgICAgIGlmIChzdGQ6
OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6dmFsdWUpCi0gICAgICAg
ICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVj
dXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBpZiAoc3RkOjppc19z
YW1lPEV4ZWN1dGFibGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAgICAg
ICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhl
Y3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNf
c2FtZTxFeGVjdXRhYmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKLSAg
ICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNl
IGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZh
bHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpz
Q2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAg
ICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0
aW9uSW1wbCh2bSwgZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRDb2RlQmxvY2spOwotfQot
CiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L1NhbXBsaW5nUHJvZmlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL1NhbXBsaW5nUHJvZmlsZXIuY3BwCShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TYW1wbGluZ1Byb2ZpbGVyLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgIkNhbGxGcmFtZS5oIgogI2luY2x1ZGUg
IkNvZGVCbG9jay5oIgogI2luY2x1ZGUgIkNvZGVCbG9ja1NldC5oIgotI2luY2x1ZGUgIkV4ZWN1
dGFibGUuaCIKICNpbmNsdWRlICJIZWFwSW5saW5lcy5oIgogI2luY2x1ZGUgIkhlYXBJdGVyYXRp
b25TY29wZS5oIgogI2luY2x1ZGUgIkhlYXBVdGlsLmgiCkBAIC00NCw2ICs0Myw3IEBACiAjaW5j
bHVkZSAiTWFya2VkQmxvY2suaCIKICNpbmNsdWRlICJNYXJrZWRCbG9ja1NldC5oIgogI2luY2x1
ZGUgIk1hcmtlZFNwYWNlSW5saW5lcy5oIgorI2luY2x1ZGUgIk5hdGl2ZUV4ZWN1dGFibGUuaCIK
ICNpbmNsdWRlICJQQ1RvQ29kZU9yaWdpbk1hcC5oIgogI2luY2x1ZGUgIlNsb3RWaXNpdG9yLmgi
CiAjaW5jbHVkZSAiU2xvdFZpc2l0b3JJbmxpbmVzLmgiCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9TY3JpcHRFeGVjdXRhYmxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9TY3JpcHRFeGVjdXRhYmxlLmNwcAkocmV2aXNpb24gMjA3
NzkwKQkoZnJvbSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlLmNwcDoy
MDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TY3JpcHRFeGVjdXRhYmxl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSwgMjAxMCwgMjAxMywgMjAxNS0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlLmgiCisKKyNpbmNsdWRlICJCYXRj
aGVkVHJhbnNpdGlvbk9wdGltaXplci5oIgorI2luY2x1ZGUgIkNvZGVCbG9jay5oIgorI2luY2x1
ZGUgIkRlYnVnZ2VyLmgiCisjaW5jbHVkZSAiSklULmgiCisjaW5jbHVkZSAiSlNDSW5saW5lcy5o
IgorI2luY2x1ZGUgIkpTV2FzbU1vZHVsZS5oIgorI2luY2x1ZGUgIkxMSW50RW50cnlwb2ludC5o
IgorI2luY2x1ZGUgIlBhcnNlci5oIgorI2luY2x1ZGUgIlR5cGVQcm9maWxlci5oIgorI2luY2x1
ZGUgIlZNSW5saW5lcy5oIgorI2luY2x1ZGUgPHd0Zi9Db21tYVByaW50ZXIuaD4KKworbmFtZXNw
YWNlIEpTQyB7CisKK2NvbnN0IENsYXNzSW5mbyBFeGVjdXRhYmxlQmFzZTo6c19pbmZvID0geyAi
RXhlY3V0YWJsZSIsIDAsIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRXhlY3V0YWJsZUJhc2UpIH07
CisKK3ZvaWQgRXhlY3V0YWJsZUJhc2U6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0
YXRpY19jYXN0PEV4ZWN1dGFibGVCYXNlKj4oY2VsbCktPkV4ZWN1dGFibGVCYXNlOjp+RXhlY3V0
YWJsZUJhc2UoKTsKK30KKwordm9pZCBFeGVjdXRhYmxlQmFzZTo6Y2xlYXJDb2RlKCkKK3sKKyNp
ZiBFTkFCTEUoSklUKQorICAgIG1faml0Q29kZUZvckNhbGwgPSBudWxscHRyOworICAgIG1faml0
Q29kZUZvckNvbnN0cnVjdCA9IG51bGxwdHI7CisgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0
eUNoZWNrID0gTWFjcm9Bc3NlbWJsZXJDb2RlUHRyKCk7CisgICAgbV9qaXRDb2RlRm9yQ29uc3Ry
dWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKKyNlbmRpZgorICAg
IG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Cisg
ICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJ
TEVEOworCisgICAgaWYgKGNsYXNzSW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygp
KSB7CisgICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5j
dGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tG
b3JDYWxsLmNsZWFyKCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3Ry
dWN0LmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJsZSog
ZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVj
dXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91
bmxpbmtlZEV2YWxDb2RlQmxvY2suY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewor
ICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhl
Y3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2su
Y2xlYXIoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2su
Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9
PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
Kj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5j
bGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVC
bG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50U3lt
Ym9sVGFibGUuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyNpZiBFTkFC
TEUoV0VCQVNTRU1CTFkpCisgICAgaWYgKGNsYXNzSW5mbygpID09IFdlYkFzc2VtYmx5RXhlY3V0
YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJs
ZSA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgZXhlY3V0
YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisjZW5kaWYKKworICAgIEFTU0VSVChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjpp
bmZvKCkpOworfQorCitjb25zdCBDbGFzc0luZm8gTmF0aXZlRXhlY3V0YWJsZTo6c19pbmZvID0g
eyAiTmF0aXZlRXhlY3V0YWJsZSIsICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVf
TUVUSE9EX1RBQkxFKE5hdGl2ZUV4ZWN1dGFibGUpIH07CisKK05hdGl2ZUV4ZWN1dGFibGUqIE5h
dGl2ZUV4ZWN1dGFibGU6OmNyZWF0ZShWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRo
dW5rLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1
Y3RUaHVuaywgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMs
IGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBOYXRpdmVFeGVjdXRhYmxlKiBleGVjdXRhYmxl
OworICAgIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxOYXRpdmVFeGVj
dXRhYmxlPih2bS5oZWFwKSkgTmF0aXZlRXhlY3V0YWJsZSh2bSwgZnVuY3Rpb24sIGNvbnN0cnVj
dG9yLCBpbnRyaW5zaWMpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtLCBjYWxs
VGh1bmssIGNvbnN0cnVjdFRodW5rLCBuYW1lKTsKKyAgICByZXR1cm4gZXhlY3V0YWJsZTsKK30K
Kwordm9pZCBOYXRpdmVFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBz
dGF0aWNfY2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4oY2VsbCktPk5hdGl2ZUV4ZWN1dGFibGU6On5O
YXRpdmVFeGVjdXRhYmxlKCk7Cit9CisKK1N0cnVjdHVyZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3Jl
YXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1
ZSBwcm90bykKK3sKKyAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVj
dCwgcHJvdG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Cit9
CisKK3ZvaWQgTmF0aXZlRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBQYXNzUmVm
UHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVu
aywgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsK
KyAgICBtX2ppdENvZGVGb3JDYWxsID0gY2FsbFRodW5rOworICAgIG1faml0Q29kZUZvckNvbnN0
cnVjdCA9IGNvbnN0cnVjdFRodW5rOworICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVj
ayA9IG1faml0Q29kZUZvckNhbGwtPmFkZHJlc3NGb3JDYWxsKE11c3RDaGVja0FyaXR5KTsKKyAg
ICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNvbnN0
cnVjdC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOworICAgIG1fbmFtZSA9IG5hbWU7
Cit9CisKK05hdGl2ZUV4ZWN1dGFibGU6Ok5hdGl2ZUV4ZWN1dGFibGUoVk0mIHZtLCBOYXRpdmVG
dW5jdGlvbiBmdW5jdGlvbiwgTmF0aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBp
bnRyaW5zaWMpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0ubmF0aXZlRXhlY3V0YWJsZVN0
cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCwgaW50cmluc2ljKQorICAgICwg
bV9mdW5jdGlvbihmdW5jdGlvbikKKyAgICAsIG1fY29uc3RydWN0b3IoY29uc3RydWN0b3IpCit7
Cit9CisKK2NvbnN0IENsYXNzSW5mbyBTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJTY3Jp
cHRFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0Rf
VEFCTEUoU2NyaXB0RXhlY3V0YWJsZSkgfTsKKworU2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0RXhl
Y3V0YWJsZShTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVk
Q29udGV4dFR5cGUsIGJvb2wgaXNJbkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5
cGUgZXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMgaW50cmluc2ljKQorICAgIDogRXhlY3V0YWJs
ZUJhc2Uodm0sIHN0cnVjdHVyZSwgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVELCBpbnRyaW5z
aWMpCisgICAgLCBtX2ZlYXR1cmVzKGlzSW5TdHJpY3RDb250ZXh0ID8gU3RyaWN0TW9kZUZlYXR1
cmUgOiAwKQorICAgICwgbV9kaWRUcnlUb0VudGVySW5Mb29wKGZhbHNlKQorICAgICwgbV9oYXND
YXB0dXJlZFZhcmlhYmxlcyhmYWxzZSkKKyAgICAsIG1fbmV2ZXJJbmxpbmUoZmFsc2UpCisgICAg
LCBtX25ldmVyT3B0aW1pemUoZmFsc2UpCisgICAgLCBtX25ldmVyRlRMT3B0aW1pemUoZmFsc2Up
CisgICAgLCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQoaXNJbkFycm93RnVuY3Rpb25Db250ZXh0
KQorICAgICwgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyh0cnVlKQorICAgICwgbV9kZXJpdmVkQ29u
dGV4dFR5cGUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRlcml2ZWRDb250ZXh0VHlwZSkpCisgICAg
LCBtX2V2YWxDb250ZXh0VHlwZShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZXZhbENvbnRleHRUeXBl
KSkKKyAgICAsIG1fb3ZlcnJpZGVMaW5lTnVtYmVyKC0xKQorICAgICwgbV9maXJzdExpbmUoLTEp
CisgICAgLCBtX2xhc3RMaW5lKC0xKQorICAgICwgbV9zdGFydENvbHVtbihVSU5UX01BWCkKKyAg
ICAsIG1fZW5kQ29sdW1uKFVJTlRfTUFYKQorICAgICwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZz
ZXQoVUlOVF9NQVgpCisgICAgLCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQoVUlOVF9NQVgpCisg
ICAgLCBtX3NvdXJjZShzb3VyY2UpCit7Cit9CisKK3ZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6ZGVz
dHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8U2NyaXB0RXhlY3V0YWJsZSo+
KGNlbGwpLT5TY3JpcHRFeGVjdXRhYmxlOjp+U2NyaXB0RXhlY3V0YWJsZSgpOworfQorCit2b2lk
IFNjcmlwdEV4ZWN1dGFibGU6Omluc3RhbGxDb2RlKENvZGVCbG9jayogY29kZUJsb2NrKQorewor
ICAgIGluc3RhbGxDb2RlKCpjb2RlQmxvY2stPnZtKCksIGNvZGVCbG9jaywgY29kZUJsb2NrLT5j
b2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsKK30KKwordm9pZCBT
Y3JpcHRFeGVjdXRhYmxlOjppbnN0YWxsQ29kZShWTSYgdm0sIENvZGVCbG9jayogZ2VuZXJpY0Nv
ZGVCbG9jaywgQ29kZVR5cGUgY29kZVR5cGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkK
K3sKKyAgICBBU1NFUlQodm0uaGVhcC5pc0RlZmVycmVkKCkpOworICAgIAorICAgIGlmIChnZW5l
cmljQ29kZUJsb2NrKQorICAgICAgICBDT0RFQkxPQ0tfTE9HX0VWRU5UKGdlbmVyaWNDb2RlQmxv
Y2ssICJpbnN0YWxsQ29kZSIsICgpKTsKKyAgICAKKyAgICBDb2RlQmxvY2sqIG9sZENvZGVCbG9j
ayA9IG51bGxwdHI7CisgICAgCisgICAgc3dpdGNoIChjb2RlVHlwZSkgeworICAgIGNhc2UgR2xv
YmFsQ29kZTogeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2Fz
dDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBQcm9ncmFtQ29kZUJsb2NrKiBj
b2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9j
ayk7CisgICAgICAgIAorICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAg
ICAgIAorICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxv
Y2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5zZXRNYXlC
ZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAg
IGNhc2UgTW9kdWxlQ29kZTogeworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAg
ICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxNb2R1bGVQ
cm9ncmFtQ29kZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisKKyAgICAgICAgQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNhbGwpOworCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUt
Pm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9t
b2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBFdmFsQ29kZTogeworICAgICAgICBF
dmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMp
OworICAgICAgICBFdmFsQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxFdmFsQ29k
ZUJsb2NrKj4oZ2VuZXJpY0NvZGVCbG9jayk7CisgICAgICAgIAorICAgICAgICBBU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIAorICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVj
dXRhYmxlLT5tX2V2YWxDb2RlQmxvY2suZ2V0KCk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fZXZh
bENvZGVCbG9jay5zZXRNYXlCZU51bGwodm0sIHRoaXMsIGNvZGVCbG9jayk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyAgICAgICAgCisgICAgY2FzZSBGdW5jdGlvbkNvZGU6IHsKKyAgICAgICAg
RnVuY3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJs
ZSo+KHRoaXMpOworICAgICAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrID0gc3RhdGlj
X2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisg
ICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAg
ICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmdldCgp
OworICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLnNldE1heUJlTnVs
bCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICBvbGRDb2RlQmxvY2sgPSBleGVjdXRhYmxl
LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUt
Pm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2Nr
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0K
KyAgICB9CisKKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICBjYXNlIENvZGVGb3JDYWxsOgorICAg
ICAgICBtX2ppdENvZGVGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxv
Y2stPmppdENvZGUoKSA6IG51bGxwdHI7CisgICAgICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJp
dHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOworICAgICAgICBtX251bVBhcmFtZXRl
cnNGb3JDYWxsID0gZ2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFt
ZXRlcnMoKSA6IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3Qg
PSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0
cjsKKyAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fz
c2VtYmxlckNvZGVQdHIoKTsKKyAgICAgICAgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID0g
Z2VuZXJpY0NvZGVCbG9jayA/IGdlbmVyaWNDb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSA6IE5V
TV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg
aWYgKGdlbmVyaWNDb2RlQmxvY2spIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZ2VuZXJpY0Nv
ZGVCbG9jay0+b3duZXJFeGVjdXRhYmxlKCkgPT0gdGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNT
RVJUKEpJVENvZGU6OmlzRXhlY3V0YWJsZVNjcmlwdChnZW5lcmljQ29kZUJsb2NrLT5qaXRUeXBl
KCkpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChPcHRpb25zOjp2ZXJib3NlT1NSKCkpCisgICAg
ICAgICAgICBkYXRhTG9nKCJJbnN0YWxsaW5nICIsICpnZW5lcmljQ29kZUJsb2NrLCAiXG4iKTsK
KyAgICAgICAgCisgICAgICAgIGlmICh2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpCisgICAgICAg
ICAgICB2bS5tX3BlckJ5dGVjb2RlUHJvZmlsZXItPmVuc3VyZUJ5dGVjb2Rlc0ZvcihnZW5lcmlj
Q29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIGlmIChEZWJ1Z2dlciogZGVidWdnZXIgPSBn
ZW5lcmljQ29kZUJsb2NrLT5nbG9iYWxPYmplY3QoKS0+ZGVidWdnZXIoKSkKKyAgICAgICAgICAg
IGRlYnVnZ2VyLT5yZWdpc3RlckNvZGVCbG9jayhnZW5lcmljQ29kZUJsb2NrKTsKKyAgICB9CisK
KyAgICBpZiAob2xkQ29kZUJsb2NrKQorICAgICAgICBvbGRDb2RlQmxvY2stPnVubGlua0luY29t
aW5nQ2FsbHMoKTsKKworICAgIHZtLmhlYXAud3JpdGVCYXJyaWVyKHRoaXMpOworfQorCitDb2Rl
QmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld0NvZGVCbG9ja0ZvcigKKyAgICBDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQsIEpTRnVuY3Rpb24qIGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwg
SlNPYmplY3QqJiBleGNlcHRpb24pCit7CisgICAgVk0qIHZtID0gc2NvcGUtPnZtKCk7CisgICAg
YXV0byB0aHJvd1Njb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSgqdm0pOworCisgICAgQVNTRVJU
KHZtLT5oZWFwLmlzRGVmZXJyZWQoKSk7CisgICAgQVNTRVJUKHN0YXJ0Q29sdW1uKCkgIT0gVUlO
VF9NQVgpOworICAgIEFTU0VSVChlbmRDb2x1bW4oKSAhPSBVSU5UX01BWCk7CisKKyAgICBpZiAo
Y2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHRoaXMpOworICAg
ICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAgIHJldHVybiBFdmFsQ29kZUJsb2NrOjpjcmVhdGUo
dm0sCisgICAgICAgICAgICBleGVjdXRhYmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENv
ZGVCbG9jay5nZXQoKSwgc2NvcGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5w
cm92aWRlcigpKTsKKyAgICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1F
eGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVj
dXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2spOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVu
Y3Rpb24pOworICAgICAgICByZXR1cm4gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAg
ICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxv
Y2suZ2V0KCksIHNjb3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlk
ZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKSk7CisgICAgfQorCisgICAg
aWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAg
ICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9
PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFleGVjdXRhYmxlLT5tX21v
ZHVsZVByb2dyYW1Db2RlQmxvY2spOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZnVuY3Rpb24p
OworICAgICAgICByZXR1cm4gTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAg
ICAgICAgICAgZXhlY3V0YWJsZSwgZXhlY3V0YWJsZS0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1D
b2RlQmxvY2suZ2V0KCksIHNjb3BlLAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+c291cmNlKCku
cHJvdmlkZXIoKSwgZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4oKSk7CisgICAgfQor
CisgICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjpp
bmZvKCkpOworICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uKTsKKyAgICBGdW5jdGlvbkV4ZWN1
dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7Cisg
ICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPmNvZGVCbG9ja0ZvcihraW5kKSk7CisgICAg
SlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKKyAg
ICBQYXJzZXJFcnJvciBlcnJvcjsKKyAgICBEZWJ1Z2dlck1vZGUgZGVidWdnZXJNb2RlID0gZ2xv
YmFsT2JqZWN0LT5oYXNJbnRlcmFjdGl2ZURlYnVnZ2VyKCkgPyBEZWJ1Z2dlck9uIDogRGVidWdn
ZXJPZmY7CisgICAgVW5saW5rZWRGdW5jdGlvbkNvZGVCbG9jayogdW5saW5rZWRDb2RlQmxvY2sg
PSAKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPnVubGlua2VkQ29k
ZUJsb2NrRm9yKAorICAgICAgICAgICAgKnZtLCBleGVjdXRhYmxlLT5tX3NvdXJjZSwga2luZCwg
ZGVidWdnZXJNb2RlLCBlcnJvciwgCisgICAgICAgICAgICBleGVjdXRhYmxlLT5wYXJzZU1vZGUo
KSk7CisgICAgcmVjb3JkUGFyc2UoCisgICAgICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFeGVj
dXRhYmxlLT5mZWF0dXJlcygpLCAKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1
dGFibGUtPmhhc0NhcHR1cmVkVmFyaWFibGVzKCksIGZpcnN0TGluZSgpLCAKKyAgICAgICAgbGFz
dExpbmUoKSwgc3RhcnRDb2x1bW4oKSwgZW5kQ29sdW1uKCkpOyAKKyAgICBpZiAoIXVubGlua2Vk
Q29kZUJsb2NrKSB7CisgICAgICAgIGV4Y2VwdGlvbiA9IHRocm93RXhjZXB0aW9uKAorICAgICAg
ICAgICAgZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCksIHRocm93U2NvcGUsCisgICAgICAgICAg
ICBlcnJvci50b0Vycm9yT2JqZWN0KGdsb2JhbE9iamVjdCwgZXhlY3V0YWJsZS0+bV9zb3VyY2Up
KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgU291cmNlUHJvdmlkZXIq
IHByb3ZpZGVyID0gZXhlY3V0YWJsZS0+c291cmNlKCkucHJvdmlkZXIoKTsKKyAgICB1bnNpZ25l
ZCBzb3VyY2VPZmZzZXQgPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydE9mZnNldCgpOworICAg
IHVuc2lnbmVkIHN0YXJ0Q29sdW1uID0gZXhlY3V0YWJsZS0+c291cmNlKCkuc3RhcnRDb2x1bW4o
KTsKKworICAgIHJldHVybiBGdW5jdGlvbkNvZGVCbG9jazo6Y3JlYXRlKHZtLAorICAgICAgICBl
eGVjdXRhYmxlLCB1bmxpbmtlZENvZGVCbG9jaywgc2NvcGUsIHByb3ZpZGVyLCBzb3VyY2VPZmZz
ZXQsIHN0YXJ0Q29sdW1uKTsKK30KKworQ29kZUJsb2NrKiBTY3JpcHRFeGVjdXRhYmxlOjpuZXdS
ZXBsYWNlbWVudENvZGVCbG9ja0ZvcigKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQp
Cit7CisgICAgaWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAg
ICAgICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIEV2YWxF
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7Cisg
ICAgICAgIEV2YWxDb2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8RXZhbENvZGVCbG9j
ayo+KAorICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLT5iYXNlbGluZVZl
cnNpb24oKSk7CisgICAgICAgIEV2YWxDb2RlQmxvY2sqIHJlc3VsdCA9IEV2YWxDb2RlQmxvY2s6
OmNyZWF0ZSh2bSgpLAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpi
YXNlbGluZSk7CisgICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2VsaW5l
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgaWYgKGNsYXNzSW5m
bygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVj
dXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFByb2dy
YW1Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUNvZGVCbG9jayo+KAor
ICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLT5iYXNlbGluZVZlcnNp
b24oKSk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIHJlc3VsdCA9IFByb2dyYW1Db2RlQmxv
Y2s6OmNyZWF0ZSh2bSgpLAorICAgICAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ss
ICpiYXNlbGluZSk7CisgICAgICAgIHJlc3VsdC0+c2V0QWx0ZXJuYXRpdmUoKnZtKCksIGJhc2Vs
aW5lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNF
X0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlz
KTsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2Fz
dDxNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKj4oCisgICAgICAgICAgICBleGVjdXRhYmxlLT5tX21v
ZHVsZVByb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAgICAgTW9kdWxl
UHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRl
KHZtKCksCisgICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5l
KTsKKyAgICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUKGNsYXNzSW5m
bygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAg
RnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxv
Y2sqPigKKyAgICAgICAgZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpLT5iYXNlbGluZVZl
cnNpb24oKSk7CisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIHJlc3VsdCA9IEZ1bmN0aW9uQ29kZUJs
b2NrOjpjcmVhdGUodm0oKSwKKyAgICAgICAgQ29kZUJsb2NrOjpDb3B5UGFyc2VkQmxvY2ssICpi
YXNlbGluZSk7CisgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwor
ICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwTExJbnQoVk0mIHZtLCBD
b2RlQmxvY2sqIGNvZGVCbG9jaykKK3sKKyAgICBMTEludDo6c2V0RW50cnlwb2ludCh2bSwgY29k
ZUJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBKSVQoVk0mIHZtLCBDb2RlQmxvY2sqIGNv
ZGVCbG9jaykKK3sKKyNpZiBFTkFCTEUoSklUKQorICAgIENvbXBpbGF0aW9uUmVzdWx0IHJlc3Vs
dCA9IEpJVDo6Y29tcGlsZSgmdm0sIGNvZGVCbG9jaywgSklUQ29tcGlsYXRpb25NdXN0U3VjY2Vl
ZCk7CisgICAgUkVMRUFTRV9BU1NFUlQocmVzdWx0ID09IENvbXBpbGF0aW9uU3VjY2Vzc2Z1bCk7
CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTSh2bSk7CisgICAgVU5VU0VEX1BBUkFNKGNvZGVCbG9j
ayk7CisgICAgVU5SRUFDSEFCTEVfRk9SX1BMQVRGT1JNKCk7CisjZW5kaWYKK30KKworSlNPYmpl
Y3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb25JbXBsKAorICAgIFZNJiB2
bSwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQsIENvZGVCbG9jayomIHJlc3VsdENvZGVCbG9jaykKK3sKKyAgICBEZWZlckdD
Rm9yQVdoaWxlIGRlZmVyR0Modm0uaGVhcCk7CisKKyAgICBpZiAodm0uZ2V0QW5kQ2xlYXJGYWls
TmV4dE5ld0NvZGVCbG9jaygpKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3Ioc2NvcGUtPmds
b2JhbE9iamVjdCgpLT5nbG9iYWxFeGVjKCksIEFTQ0lJTGl0ZXJhbCgiRm9yY2VkIEZhaWx1cmUi
KSk7CisKKyAgICBKU09iamVjdCogZXhjZXB0aW9uID0gMDsKKyAgICBDb2RlQmxvY2sqIGNvZGVC
bG9jayA9IG5ld0NvZGVCbG9ja0ZvcihraW5kLCBmdW5jdGlvbiwgc2NvcGUsIGV4Y2VwdGlvbik7
CisgICAgcmVzdWx0Q29kZUJsb2NrID0gY29kZUJsb2NrOworICAgIGlmICghY29kZUJsb2NrKSB7
CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGV4Y2VwdGlvbik7CisgICAgICAgIHJldHVybiBleGNl
cHRpb247CisgICAgfQorICAgIAorICAgIGlmIChPcHRpb25zOjp2YWxpZGF0ZUJ5dGVjb2RlKCkp
CisgICAgICAgIGNvZGVCbG9jay0+dmFsaWRhdGUoKTsKKyAgICAKKyAgICBpZiAoT3B0aW9uczo6
dXNlTExJbnQoKSkKKyAgICAgICAgc2V0dXBMTEludCh2bSwgY29kZUJsb2NrKTsKKyAgICBlbHNl
CisgICAgICAgIHNldHVwSklUKHZtLCBjb2RlQmxvY2spOworICAgIAorICAgIGluc3RhbGxDb2Rl
KHZtLCBjb2RlQmxvY2ssIGNvZGVCbG9jay0+Y29kZVR5cGUoKSwgY29kZUJsb2NrLT5zcGVjaWFs
aXphdGlvbktpbmQoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IENsYXNzSW5m
byBFdmFsRXhlY3V0YWJsZTo6c19pbmZvID0geyAiRXZhbEV4ZWN1dGFibGUiLCAmU2NyaXB0RXhl
Y3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEV2YWxFeGVjdXRhYmxlKSB9
OworCitFdmFsRXhlY3V0YWJsZSogRXZhbEV4ZWN1dGFibGU6OmNyZWF0ZShFeGVjU3RhdGUqIGV4
ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVy
aXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25D
b250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBjb25zdCBWYXJpYWJsZUVu
dmlyb25tZW50KiB2YXJpYWJsZXNVbmRlclREWikKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgp
OworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKworICAgIEpTR2xv
YmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7Cisg
ICAgaWYgKCFnbG9iYWxPYmplY3QtPmV2YWxFbmFibGVkKCkpIHsKKyAgICAgICAgdGhyb3dFeGNl
cHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZUV2YWxFcnJvcihleGVjLCBnbG9iYWxPYmplY3QtPmV2
YWxEaXNhYmxlZEVycm9yTWVzc2FnZSgpKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwor
ICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNl
bGw8RXZhbEV4ZWN1dGFibGU+KCpleGVjLT5oZWFwKCkpKSBFdmFsRXhlY3V0YWJsZShleGVjLCBz
b3VyY2UsIGlzSW5TdHJpY3RDb250ZXh0LCBkZXJpdmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5j
dGlvbkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3Jl
YXRpb24odm0pOworCisgICAgVW5saW5rZWRFdmFsQ29kZUJsb2NrKiB1bmxpbmtlZEV2YWxDb2Rl
ID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVFdmFsQ29kZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUsIHZh
cmlhYmxlc1VuZGVyVERaKTsKKyAgICBpZiAoIXVubGlua2VkRXZhbENvZGUpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2suc2V0KHZt
LCBleGVjdXRhYmxlLCB1bmxpbmtlZEV2YWxDb2RlKTsKKworICAgIHJldHVybiBleGVjdXRhYmxl
OworfQorCitFdmFsRXhlY3V0YWJsZTo6RXZhbEV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBj
b25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29u
dGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQs
IEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxl
KGV4ZWMtPnZtKCkuZXZhbEV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNv
dXJjZSwgaW5TdHJpY3RDb250ZXh0LCBkZXJpdmVkQ29udGV4dFR5cGUsIGlzQXJyb3dGdW5jdGlv
bkNvbnRleHQsIGV2YWxDb250ZXh0VHlwZSwgTm9JbnRyaW5zaWMpCit7CisgICAgQVNTRVJUKHNv
dXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBl
OjpQcm9ncmFtKTsKK30KKwordm9pZCBFdmFsRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNl
bGwpCit7CisgICAgc3RhdGljX2Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihjZWxsKS0+RXZhbEV4ZWN1
dGFibGU6On5FdmFsRXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gUHJvZ3JhbUV4
ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlByb2dyYW1FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFi
bGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShQcm9ncmFtRXhlY3V0YWJsZSkgfTsK
KworUHJvZ3JhbUV4ZWN1dGFibGU6OlByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywg
Y29uc3QgU291cmNlQ29kZSYgc291cmNlKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52
bSgpLnByb2dyYW1FeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2Us
IGZhbHNlLCBEZXJpdmVkQ29udGV4dFR5cGU6Ok5vbmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6
Ok5vbmUsIE5vSW50cmluc2ljKQoreworICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291
cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291cmNlVHlwZTo6UHJvZ3JhbSk7CisgICAgbV90
eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSAwOworICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNl
dCA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7CisgICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVy
KCkgfHwgZXhlYy0+dm0oKS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpCisgICAgICAgIGV4ZWMtPnZt
KCkuZnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3Vy
Y2VJRCgpLCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zm
c2V0KTsKK30KKwordm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwp
Cit7CisgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKS0+UHJvZ3JhbUV4
ZWN1dGFibGU6On5Qcm9ncmFtRXhlY3V0YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIk1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
IiwgJlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZSkgfTsKKworTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6Ok1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291
cmNlKQorICAgIDogU2NyaXB0RXhlY3V0YWJsZShleGVjLT52bSgpLm1vZHVsZVByb2dyYW1FeGVj
dXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVjLT52bSgpLCBzb3VyY2UsIGZhbHNlLCBEZXJpdmVk
Q29udGV4dFR5cGU6Ok5vbmUsIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIE5vSW50cmlu
c2ljKQoreworICAgIEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNv
dXJjZVByb3ZpZGVyU291cmNlVHlwZTo6TW9kdWxlKTsKKyAgICBtX3R5cGVQcm9maWxpbmdTdGFy
dE9mZnNldCA9IDA7CisgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0
aCgpIC0gMTsKKyAgICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52bSgp
LmNvbnRyb2xGbG93UHJvZmlsZXIoKSkKKyAgICAgICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4
ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlwZVBy
b2ZpbGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQpOworfQorCitNb2R1
bGVQcm9ncmFtRXhlY3V0YWJsZSogTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmNyZWF0ZShFeGVj
U3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKK3sKKyAgICBKU0dsb2JhbE9i
amVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOworICAgIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0
ZUNlbGw8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+KCpleGVjLT5oZWFwKCkpKSBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZShleGVjLCBzb3VyY2UpOworICAgIGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0
aW9uKGV4ZWMtPnZtKCkpOworCisgICAgVW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1
bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrKGV4ZWMsIGV4ZWN1dGFibGUpOworICAgIGlmICghdW5saW5rZWRNb2R1bGVQ
cm9ncmFtQ29kZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgZXhlY3V0YWJsZS0+bV91
bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUs
IHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUpOworCisgICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVF
bnZpcm9ubWVudFN5bWJvbFRhYmxlLnNldChleGVjLT52bSgpLCBleGVjdXRhYmxlLCBqc0Nhc3Q8
U3ltYm9sVGFibGUqPih1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlLT5jb25zdGFudFJlZ2lzdGVy
KHVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUtPm1vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGVD
b25zdGFudFJlZ2lzdGVyT2Zmc2V0KCkpLmdldCgpKS0+Y2xvbmVTY29wZVBhcnQoZXhlYy0+dm0o
KSkpOworCisgICAgcmV0dXJuIGV4ZWN1dGFibGU7Cit9CisKK3ZvaWQgTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCktPk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp+TW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUoKTsKK30KKworY29uc3QgQ2xhc3NJbmZvIEZ1bmN0aW9uRXhl
Y3V0YWJsZTo6c19pbmZvID0geyAiRnVuY3Rpb25FeGVjdXRhYmxlIiwgJlNjcmlwdEV4ZWN1dGFi
bGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShGdW5jdGlvbkV4ZWN1dGFibGUpIH07
CisKK0Z1bmN0aW9uRXhlY3V0YWJsZTo6RnVuY3Rpb25FeGVjdXRhYmxlKFZNJiB2bSwgY29uc3Qg
U291cmNlQ29kZSYgc291cmNlLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRF
eGVjdXRhYmxlLCB1bnNpZ25lZCBmaXJzdExpbmUsIHVuc2lnbmVkIGxhc3RMaW5lLCB1bnNpZ25l
ZCBzdGFydENvbHVtbiwgdW5zaWduZWQgZW5kQ29sdW1uLCBJbnRyaW5zaWMgaW50cmluc2ljKQor
ICAgIDogU2NyaXB0RXhlY3V0YWJsZSh2bS5mdW5jdGlvbkV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0
KCksIHZtLCBzb3VyY2UsIHVubGlua2VkRXhlY3V0YWJsZS0+aXNJblN0cmljdENvbnRleHQoKSwg
dW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKSwgZmFsc2UsIEV2YWxDb250
ZXh0VHlwZTo6Tm9uZSwgaW50cmluc2ljKQorICAgICwgbV91bmxpbmtlZEV4ZWN1dGFibGUodm0s
IHRoaXMsIHVubGlua2VkRXhlY3V0YWJsZSkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVCghc291cmNl
LmlzTnVsbCgpKTsKKyAgICBBU1NFUlQoc291cmNlLmxlbmd0aCgpKTsKKyAgICBtX2ZpcnN0TGlu
ZSA9IGZpcnN0TGluZTsKKyAgICBtX2xhc3RMaW5lID0gbGFzdExpbmU7CisgICAgQVNTRVJUKHN0
YXJ0Q29sdW1uICE9IFVJTlRfTUFYKTsKKyAgICBBU1NFUlQoZW5kQ29sdW1uICE9IFVJTlRfTUFY
KTsKKyAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47CisgICAgbV9lbmRDb2x1bW4gPSBl
bmRDb2x1bW47CisgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFi
bGUtPnBhcmFtZXRlcnNTdGFydE9mZnNldCgpOworICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0ID0gdW5saW5rZWRFeGVjdXRhYmxlLT50eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKTsKKyAg
ICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFibGUtPnR5cGVQcm9m
aWxpbmdFbmRPZmZzZXQoKTsKK30KKwordm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmZpbmlzaENy
ZWF0aW9uKFZNJiB2bSkKK3sKKyAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7CisgICAgbV9z
aW5nbGV0b25GdW5jdGlvbi5zZXQodm0sIHRoaXMsIEluZmVycmVkVmFsdWU6OmNyZWF0ZSh2bSkp
OworfQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7
CisgICAgc3RhdGljX2Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oY2VsbCktPkZ1bmN0aW9uRXhl
Y3V0YWJsZTo6fkZ1bmN0aW9uRXhlY3V0YWJsZSgpOworfQorCitpbmxpbmUgY29uc3QgY2hhciog
c2FtcGxpbmdEZXNjcmlwdGlvbihKSVRDb2RlOjpKSVRUeXBlIGppdFR5cGUpCit7CisgICAgc3dp
dGNoIChqaXRUeXBlKSB7CisgICAgY2FzZSBKSVRDb2RlOjpJbnRlcnByZXRlclRodW5rOgorICAg
ICAgICByZXR1cm4gIkludGVycHJldGVyIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGNhc2Ug
SklUQ29kZTo6QmFzZWxpbmVKSVQ6CisgICAgICAgIHJldHVybiAiQmFzZWxpbmUgQ29tcGlsYXRp
b24gKFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpERkdKSVQ6CisgICAgICAgIHJldHVybiAi
REZHIENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGNhc2UgSklUQ29kZTo6RlRMSklUOgorICAg
ICAgICByZXR1cm4gIkZUTCBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAgICBkZWZhdWx0OgorICAg
ICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9Cit9CisKK3ZvaWQgRXZhbEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxs
LCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBFdmFsRXhlY3V0YWJsZSogdGhpc09iamVj
dCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1Rf
SU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNp
dENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlz
T2JqZWN0LT5tX3VubGlua2VkRXZhbENvZGVCbG9jayk7CisgICAgaWYgKHRoaXNPYmplY3QtPm1f
ZXZhbENvZGVCbG9jaykKKyAgICAgICAgdGhpc09iamVjdC0+bV9ldmFsQ29kZUJsb2NrLT52aXNp
dFdlYWtseSh2aXNpdG9yKTsKK30KKworSlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxlOjpjaGVj
a1N5bnRheChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgUGFyc2VyRXJyb3IgZXJyb3I7CisgICAg
Vk0qIHZtID0gJmV4ZWMtPnZtKCk7CisgICAgSlNHbG9iYWxPYmplY3QqIGxleGljYWxHbG9iYWxP
YmplY3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgc3RkOjp1bmlxdWVfcHRy
PFByb2dyYW1Ob2RlPiBwcm9ncmFtTm9kZSA9IHBhcnNlPFByb2dyYW1Ob2RlPigKKyAgICAgICAg
dm0sIG1fc291cmNlLCBJZGVudGlmaWVyKCksIEpTUGFyc2VyQnVpbHRpbk1vZGU6Ok5vdEJ1aWx0
aW4sCisgICAgICAgIEpTUGFyc2VyU3RyaWN0TW9kZTo6Tm90U3RyaWN0LCBKU1BhcnNlclNjcmlw
dE1vZGU6OkNsYXNzaWMsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIFN1cGVyQmluZGlu
Zzo6Tm90TmVlZGVkLCBlcnJvcik7CisgICAgaWYgKHByb2dyYW1Ob2RlKQorICAgICAgICByZXR1
cm4gMDsKKyAgICBBU1NFUlQoZXJyb3IuaXNWYWxpZCgpKTsKKyAgICByZXR1cm4gZXJyb3IudG9F
cnJvck9iamVjdChsZXhpY2FsR2xvYmFsT2JqZWN0LCBtX3NvdXJjZSk7Cit9CisKK0pTT2JqZWN0
KiBQcm9ncmFtRXhlY3V0YWJsZTo6aW5pdGlhbGl6ZUdsb2JhbFByb3BlcnRpZXMoVk0mIHZtLCBD
YWxsRnJhbWUqIGNhbGxGcmFtZSwgSlNTY29wZSogc2NvcGUpCit7CisgICAgUkVMRUFTRV9BU1NF
UlQoc2NvcGUpOworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBzY29wZS0+Z2xv
YmFsT2JqZWN0KCk7CisgICAgUkVMRUFTRV9BU1NFUlQoZ2xvYmFsT2JqZWN0KTsKKyAgICBBU1NF
UlQoJmdsb2JhbE9iamVjdC0+dm0oKSA9PSAmdm0pOworCisgICAgSlNPYmplY3QqIGV4Y2VwdGlv
biA9IDA7CisgICAgVW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9jayA9
IGdsb2JhbE9iamVjdC0+Y3JlYXRlUHJvZ3JhbUNvZGVCbG9jayhjYWxsRnJhbWUsIHRoaXMsICZl
eGNlcHRpb24pOworICAgIGlmIChleGNlcHRpb24pCisgICAgICAgIHJldHVybiBleGNlcHRpb247
CisKKyAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25t
ZW50ID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQoKTsKKyAgICBjb25z
dCBWYXJpYWJsZUVudmlyb25tZW50JiB2YXJpYWJsZURlY2xhcmF0aW9ucyA9IHVubGlua2VkQ29k
ZUJsb2NrLT52YXJpYWJsZURlY2xhcmF0aW9ucygpOworICAgIGNvbnN0IFZhcmlhYmxlRW52aXJv
bm1lbnQmIGxleGljYWxEZWNsYXJhdGlvbnMgPSB1bmxpbmtlZENvZGVCbG9jay0+bGV4aWNhbERl
Y2xhcmF0aW9ucygpOworICAgIC8vIFRoZSBFUzYgc3BlYyBzYXlzIHRoYXQgbm8gdmFycy9nbG9i
YWwgcHJvcGVydGllcy9sZXQvY29uc3QgY2FuIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIGdsb2JhbCBz
Y29wZS4KKyAgICAvLyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gMTUuMS44IG9mIHRoZSBFUzYg
c3BlYzogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRl
eC5odG1sI3NlYy1nbG9iYWxkZWNsYXJhdGlvbmluc3RhbnRpYXRpb24KKyAgICB7CisgICAgICAg
IEV4ZWNTdGF0ZSogZXhlYyA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpOworICAgICAgICAv
LyBDaGVjayBmb3IgaW50ZXJzZWN0aW9uIG9mICJ2YXIiIGFuZCAibGV0Ii8iY29uc3QiLyJjbGFz
cyIKKyAgICAgICAgZm9yIChhdXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAg
ICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9ucy5jb250YWlucyhlbnRyeS5rZXkpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5n
KCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5n
ZXQoKSksICInIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYW55IG5ldyAi
bGV0Ii8iY29uc3QiLyJjbGFzcyIgd2lsbCBzaGFkb3cgYW55IHByZS1leGlzdGluZyBnbG9iYWwg
cHJvcGVydHkgbmFtZXMsIG9yICJ2YXIiLyJsZXQiLyJjb25zdCIgdmFyaWFibGVzLgorICAgICAg
ICAvLyBJdCdzIGFuIGVycm9yIHRvIGludHJvZHVjZSBhIHNoYWRvdy4KKyAgICAgICAgZm9yIChh
dXRvJiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChnbG9i
YWxPYmplY3QtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpIHsKKyAgICAgICAg
ICAgICAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0aGF0IGp1c3QgUmVzdHJpY3RlZEdsb2JhbFBy
b3BlcnR5IGNhbid0IGJlIHNoYWRvd2VkCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXJyaWVk
IG91dCBzZWN0aW9uIDguMS4xLjQuMTQgb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVjbWEt
aW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWhhc3Jlc3RyaWN0
ZWRnbG9iYWxwcm9wZXJ0eQorICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNj
cmlwdG9yOworICAgICAgICAgICAgICAgIGdsb2JhbE9iamVjdC0+Z2V0T3duUHJvcGVydHlEZXNj
cmlwdG9yKGV4ZWMsIGVudHJ5LmtleS5nZXQoKSwgZGVzY3JpcHRvcik7CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IudmFsdWUoKSAhPSBqc1VuZGVmaW5l
ZCgpICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1
cGxpY2F0ZSB2YXJpYWJsZSB0aGF0IHNoYWRvd3MgYSBnbG9iYWwgcHJvcGVydHk6ICciLCBTdHJp
bmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5oYXNQcm9wZXJ0
eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKFVOTElLRUxZ
KGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0uZ2xvYmFsQ29uc3RSZWRlY2xhcmF0aW9uU2hv
dWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8v
IFdlIG9ubHkgYWxsb3cgImNvbnN0IiBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIHVuZGVyIHRoaXMg
c2V0dGluZy4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHdlIGRvbid0ICJs
ZXQiIHZhcmlhYmxlcyB0byBiZSBvdmVycmlkZGVuIGJ5ICJjb25zdCIgdmFyaWFibGVzLgorICAg
ICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0NvbnN0VmFy
aWFibGUoZW50cnkua2V5LmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4
RXJyb3IoZXhlYywgbWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTog
JyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIGFueSBuZXcgInZhciJzIHdpbGwgc2hhZG93IGFu
eSBwcmV2aW91cyAibGV0Ii8iY29uc3QiLyJjbGFzcyIgbmFtZXMuCisgICAgICAgIC8vIEl0J3Mg
YW4gZXJyb3IgdG8gaW50cm9kdWNlIGEgc2hhZG93LgorICAgICAgICBpZiAoIWdsb2JhbExleGlj
YWxFbnZpcm9ubWVudC0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGVudHJ5
IDogdmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKQorICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywgbWFrZVN0cmlu
ZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhlbnRyeS5rZXku
Z2V0KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAg
bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suc2V0KHZtLCB0aGlzLCB1bmxpbmtlZENvZGVCbG9j
ayk7CisKKyAgICBCYXRjaGVkVHJhbnNpdGlvbk9wdGltaXplciBvcHRpbWl6ZXIodm0sIGdsb2Jh
bE9iamVjdCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgbnVtYmVyT2ZGdW5jdGlvbnMgPSB1
bmxpbmtlZENvZGVCbG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IGkgPCBudW1iZXJPZkZ1
bmN0aW9uczsgKytpKSB7CisgICAgICAgIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxp
bmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSA9IHVubGlua2VkQ29kZUJsb2NrLT5mdW5jdGlvbkRlY2wo
aSk7CisgICAgICAgIEFTU0VSVCghdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPm5hbWUoKS5p
c0VtcHR5KCkpOworICAgICAgICBnbG9iYWxPYmplY3QtPmFkZEZ1bmN0aW9uKGNhbGxGcmFtZSwg
dW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPm5hbWUoKSk7CisgICAgICAgIGlmICh2bS50eXBl
UHJvZmlsZXIoKSB8fCB2bS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpIHsKKyAgICAgICAgICAgIHZt
LmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNl
SUQoKSwgCisgICAgICAgICAgICAgICAgdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUtPnR5cGVQ
cm9maWxpbmdTdGFydE9mZnNldCgpLCAKKyAgICAgICAgICAgICAgICB1bmxpbmtlZEZ1bmN0aW9u
RXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGZvciAoYXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9ucykgeworICAgICAg
ICBBU1NFUlQoZW50cnkudmFsdWUuaXNWYXIoKSk7CisgICAgICAgIGdsb2JhbE9iamVjdC0+YWRk
VmFyKGNhbGxGcmFtZSwgSWRlbnRpZmllcjo6ZnJvbVVpZCgmdm0sIGVudHJ5LmtleS5nZXQoKSkp
OworICAgIH0KKworICAgIHsKKyAgICAgICAgSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGds
b2JhbExleGljYWxFbnZpcm9ubWVudCA9IGpzQ2FzdDxKU0dsb2JhbExleGljYWxFbnZpcm9ubWVu
dCo+KGdsb2JhbE9iamVjdC0+Z2xvYmFsU2NvcGUoKSk7CisgICAgICAgIFN5bWJvbFRhYmxlKiBz
eW1ib2xUYWJsZSA9IGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+c3ltYm9sVGFibGUoKTsKKyAg
ICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7Cisg
ICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7CisgICAgICAg
ICAgICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUuaXNDb25zdCgpICYmICF2bS5nbG9iYWxDb25z
dFJlZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYmICFpc1N0cmljdE1vZGUoKSkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoc3ltYm9sVGFibGUtPmNvbnRhaW5zKGxvY2tlciwgZW50cnkua2V5Lmdl
dCgpKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBTY29wZU9mZnNldCBvZmZzZXQgPSBzeW1ib2xUYWJsZS0+dGFrZU5leHRTY29wZU9m
ZnNldChsb2NrZXIpOworICAgICAgICAgICAgU3ltYm9sVGFibGVFbnRyeSBuZXdFbnRyeShWYXJP
ZmZzZXQob2Zmc2V0KSwgZW50cnkudmFsdWUuaXNDb25zdCgpID8gUmVhZE9ubHkgOiAwKTsKKyAg
ICAgICAgICAgIG5ld0VudHJ5LnByZXBhcmVUb1dhdGNoKCk7CisgICAgICAgICAgICBzeW1ib2xU
YWJsZS0+YWRkKGxvY2tlciwgZW50cnkua2V5LmdldCgpLCBuZXdFbnRyeSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldEZvckFzc2VydCA9IGdsb2JhbExleGlj
YWxFbnZpcm9ubWVudC0+YWRkVmFyaWFibGVzKDEsIGpzVERaVmFsdWUoKSk7CisgICAgICAgICAg
ICBSRUxFQVNFX0FTU0VSVChvZmZzZXRGb3JBc3NlcnQgPT0gb2Zmc2V0KTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRD
aGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIFByb2dy
YW1FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2Vs
bCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwor
ICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7
CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRQcm9ncmFtQ29kZUJs
b2NrKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9wcm9ncmFtQ29kZUJsb2NrKQorICAgICAgICB0
aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworfQor
Cit2b2lkIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2Vs
bCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
IHRoaXNPYmplY3QgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKKyAg
ICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2Ny
aXB0RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICB2
aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2spOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZUVudmlyb25tZW50
U3ltYm9sVGFibGUpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxv
Y2spCisgICAgICAgIHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+dmlzaXRX
ZWFrbHkodmlzaXRvcik7Cit9CisKK0Z1bmN0aW9uQ29kZUJsb2NrKiBGdW5jdGlvbkV4ZWN1dGFi
bGU6OmJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sK
KyAgICBGdW5jdGlvbkNvZGVCbG9jayogcmVzdWx0OworICAgIGlmIChraW5kID09IENvZGVGb3JD
YWxsKQorICAgICAgICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgZWxz
ZSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Cisg
ICAgICAgIHJlc3VsdCA9IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKyAg
ICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PEZ1bmN0aW9uQ29kZUJsb2NrKj4ocmVzdWx0LT5iYXNlbGluZUFsdGVybmF0aXZlKCkpOworfQor
Cit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNs
b3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogdGhpc09iamVj
dCA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JK
RUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0YWJsZTo6
dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICBpZiAodGhpc09iamVjdC0+
bV9jb2RlQmxvY2tGb3JDYWxsKQorICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNh
bGwtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9j
a0ZvckNvbnN0cnVjdCkKKyAgICAgICAgdGhpc09iamVjdC0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1
Y3QtPnZpc2l0V2Vha2x5KHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0
LT5tX3VubGlua2VkRXhlY3V0YWJsZSk7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3Qt
Pm1fc2luZ2xldG9uRnVuY3Rpb24pOworfQorCitGdW5jdGlvbkV4ZWN1dGFibGUqIEZ1bmN0aW9u
RXhlY3V0YWJsZTo6ZnJvbUdsb2JhbENvZGUoCisgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwg
RXhlY1N0YXRlJiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIAorICAgIEpTT2JqZWN0
KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKQoreworICAgIFVubGlua2VkRnVu
Y3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUgPSAKKyAgICAgICAgVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKAorICAgICAgICAgICAgbmFtZSwgZXhl
Yywgc291cmNlLCBleGNlcHRpb24sIG92ZXJyaWRlTGluZU51bWJlcik7CisgICAgaWYgKCF1bmxp
bmtlZEV4ZWN1dGFibGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIHVu
bGlua2VkRXhlY3V0YWJsZS0+bGluayhleGVjLnZtKCksIHNvdXJjZSwgb3ZlcnJpZGVMaW5lTnVt
YmVyKTsKK30KKworI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKK2NvbnN0IENsYXNzSW5mbyBXZWJB
c3NlbWJseUV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5RXhlY3V0YWJsZSIsICZF
eGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFdlYkFzc2VtYmx5
RXhlY3V0YWJsZSkgfTsKKworV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpXZWJBc3NlbWJseUV4ZWN1
dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1vZHVsZSogbW9k
dWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQorICAgIDogRXhlY3V0YWJsZUJhc2Uodm0sIHZt
LndlYkFzc2VtYmx5RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BBUkFNRVRFUlNfTk9U
X0NPTVBJTEVELCBOb0ludHJpbnNpYykKKyAgICAsIG1fc291cmNlKHNvdXJjZSkKKyAgICAsIG1f
bW9kdWxlKHZtLCB0aGlzLCBtb2R1bGUpCisgICAgLCBtX2Z1bmN0aW9uSW5kZXgoZnVuY3Rpb25J
bmRleCkKK3sKKyAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBT
b3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OldlYkFzc2VtYmx5KTsKK30KKwordm9pZCBXZWJBc3Nl
bWJseUV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0
PFdlYkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwpLT5XZWJBc3NlbWJseUV4ZWN1dGFibGU6On5X
ZWJBc3NlbWJseUV4ZWN1dGFibGUoKTsKK30KKwordm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6
OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAg
ICBXZWJBc3NlbWJseUV4ZWN1dGFibGUqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8V2ViQXNzZW1ibHlF
eGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2Jq
ZWN0LCBpbmZvKCkpOworICAgIEV4ZWN1dGFibGVCYXNlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmpl
Y3QsIHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCisg
ICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRv
cik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlKTsKK30KKyNlbmRp
ZgorCit2b2lkIEV4ZWN1dGFibGVCYXNlOjpkdW1wKFByaW50U3RyZWFtJiBvdXQpIGNvbnN0Cit7
CisgICAgRXhlY3V0YWJsZUJhc2UqIHJlYWxUaGlzID0gY29uc3RfY2FzdDxFeGVjdXRhYmxlQmFz
ZSo+KHRoaXMpOworICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxl
OjppbmZvKCkpIHsKKyAgICAgICAgTmF0aXZlRXhlY3V0YWJsZSogbmF0aXZlID0ganNDYXN0PE5h
dGl2ZUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7CisgICAgICAgIG91dC5wcmludCgiTmF0aXZlRXhl
Y3V0YWJsZToiLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5mdW5jdGlv
bigpKSksICIvIiwgUmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2ZS0+Y29uc3Ry
dWN0b3IoKSkpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBFdmFsRXhlY3V0YWJs
ZSogZXZhbCA9IGpzQ2FzdDxFdmFsRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYg
KENvZGVCbG9jayogY29kZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCisgICAgICAgICAgICBv
dXQucHJpbnQoKmNvZGVCbG9jayk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmlu
dCgiRXZhbEV4ZWN1dGFibGUgdy9vIENvZGVCbG9jayIpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygp
KSB7CisgICAgICAgIFByb2dyYW1FeGVjdXRhYmxlKiBldmFsID0ganNDYXN0PFByb2dyYW1FeGVj
dXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBl
dmFsLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCJQcm9ncmFtRXhlY3V0YWJsZSB3L28g
Q29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBNb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSo+KHJlYWxUaGlzKTsKKyAgICAgICAgaWYgKENvZGVCbG9jayogY29kZUJsb2NrID0gZXhl
Y3V0YWJsZS0+Y29kZUJsb2NrKCkpCisgICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVCbG9jayk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dC5wcmludCgiTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUgdy9vIENvZGVCbG9jayIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAg
IEZ1bmN0aW9uRXhlY3V0YWJsZSogZnVuY3Rpb24gPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxl
Kj4ocmVhbFRoaXMpOworICAgIGlmICghZnVuY3Rpb24tPmVpdGhlckNvZGVCbG9jaygpKQorICAg
ICAgICBvdXQucHJpbnQoIkZ1bmN0aW9uRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7CisgICAg
ZWxzZSB7CisgICAgICAgIENvbW1hUHJpbnRlciBjb21tYSgiLyIpOworICAgICAgICBpZiAoZnVu
Y3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSkKKyAgICAgICAgICAgIG91dC5wcmludChjb21tYSwg
KmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkpOworICAgICAgICBpZiAoZnVuY3Rpb24tPmNv
ZGVCbG9ja0ZvckNvbnN0cnVjdCgpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVu
Y3Rpb24tPmNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpKTsKKyAgICB9Cit9CisKK0NvZGVCbG9ja0hh
c2ggRXhlY3V0YWJsZUJhc2U6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBj
b25zdAoreworICAgIGlmICh0aGlzLT5jbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjpp
bmZvKCkpCisgICAgICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgTmF0aXZlRXhlY3V0YWJsZSo+KHRo
aXMpLT5oYXNoRm9yKGtpbmQpOworICAgIAorICAgIHJldHVybiBqc0Nhc3Q8Y29uc3QgU2NyaXB0
RXhlY3V0YWJsZSo+KHRoaXMpLT5oYXNoRm9yKGtpbmQpOworfQorCitDb2RlQmxvY2tIYXNoIE5h
dGl2ZUV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25z
dAoreworICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICByZXR1cm4gQ29kZUJs
b2NrSGFzaChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9mdW5j
dGlvbikpKTsKKyAgICAKKyAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1
Y3QpOworICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3
aXNlX2Nhc3Q8c2l6ZV90PihtX2NvbnN0cnVjdG9yKSkpOworfQorCitDb2RlQmxvY2tIYXNoIFNj
cmlwdEV4ZWN1dGFibGU6Omhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25z
dAoreworICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHNvdXJjZSgpLCBraW5kKTsKK30KKworfQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU2NyaXB0RXhlY3V0YWJsZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU2NyaXB0RXhlY3V0
YWJsZS5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1NjcmlwdEV4ZWN1dGFibGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw2IEBA
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKIAog
I2luY2x1ZGUgIkJhdGNoZWRUcmFuc2l0aW9uT3B0aW1pemVyLmgiCiAjaW5jbHVkZSAiQ29kZUJs
b2NrLmgiCkBAIC00MCwxMDEgKzM5LDYgQEAKIAogbmFtZXNwYWNlIEpTQyB7CiAKLWNvbnN0IENs
YXNzSW5mbyBFeGVjdXRhYmxlQmFzZTo6c19pbmZvID0geyAiRXhlY3V0YWJsZSIsIDAsIDAsIENS
RUFURV9NRVRIT0RfVEFCTEUoRXhlY3V0YWJsZUJhc2UpIH07Ci0KLXZvaWQgRXhlY3V0YWJsZUJh
c2U6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PEV4ZWN1dGFibGVC
YXNlKj4oY2VsbCktPkV4ZWN1dGFibGVCYXNlOjp+RXhlY3V0YWJsZUJhc2UoKTsKLX0KLQotdm9p
ZCBFeGVjdXRhYmxlQmFzZTo6Y2xlYXJDb2RlKCkKLXsKLSNpZiBFTkFCTEUoSklUKQotICAgIG1f
aml0Q29kZUZvckNhbGwgPSBudWxscHRyOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IG51
bGxwdHI7Ci0gICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJs
ZXJDb2RlUHRyKCk7Ci0gICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2sgPSBN
YWNyb0Fzc2VtYmxlckNvZGVQdHIoKTsKLSNlbmRpZgotICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNh
bGwgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Ci0gICAgbV9udW1QYXJhbWV0ZXJzRm9y
Q29uc3RydWN0ID0gTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEOwotCi0gICAgaWYgKGNsYXNz
SW5mbygpID09IEZ1bmN0aW9uRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEZ1bmN0aW9u
RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlz
KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDYWxsLmNsZWFyKCk7Ci0gICAg
ICAgIGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmNsZWFyKCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6
OmluZm8oKSkgewotICAgICAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxF
dmFsRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxv
Y2suY2xlYXIoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2su
Y2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFtRXhlY3V0
YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAg
ICAgICBleGVjdXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgZXhl
Y3V0YWJsZS0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2suY2xlYXIoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4
ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVj
dXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAg
ICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuY2xlYXIoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi0gICAg
aWYgKGNsYXNzSW5mbygpID09IFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAg
ICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxXZWJBc3NlbWJs
eUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JD
YWxsLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIEFTU0VS
VChjbGFzc0luZm8oKSA9PSBOYXRpdmVFeGVjdXRhYmxlOjppbmZvKCkpOwotfQotCi1jb25zdCBD
bGFzc0luZm8gTmF0aXZlRXhlY3V0YWJsZTo6c19pbmZvID0geyAiTmF0aXZlRXhlY3V0YWJsZSIs
ICZFeGVjdXRhYmxlQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE5hdGl2ZUV4
ZWN1dGFibGUpIH07Ci0KLU5hdGl2ZUV4ZWN1dGFibGUqIE5hdGl2ZUV4ZWN1dGFibGU6OmNyZWF0
ZShWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5rLCBOYXRpdmVGdW5jdGlvbiBm
dW5jdGlvbiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgTmF0aXZlRnVuY3Rp
b24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMsIGNvbnN0IFN0cmluZyYgbmFtZSkK
LXsKLSAgICBOYXRpdmVFeGVjdXRhYmxlKiBleGVjdXRhYmxlOwotICAgIGV4ZWN1dGFibGUgPSBu
ZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxOYXRpdmVFeGVjdXRhYmxlPih2bS5oZWFwKSkgTmF0
aXZlRXhlY3V0YWJsZSh2bSwgZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBpbnRyaW5zaWMpOwotICAg
IGV4ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtLCBjYWxsVGh1bmssIGNvbnN0cnVjdFRodW5r
LCBuYW1lKTsKLSAgICByZXR1cm4gZXhlY3V0YWJsZTsKLX0KLQotdm9pZCBOYXRpdmVFeGVjdXRh
YmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxOYXRpdmVFeGVj
dXRhYmxlKj4oY2VsbCktPk5hdGl2ZUV4ZWN1dGFibGU6On5OYXRpdmVFeGVjdXRhYmxlKCk7Ci19
Ci0KLVN0cnVjdHVyZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRlU3RydWN0dXJlKFZNJiB2bSwg
SlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKLXsKLSAgICByZXR1
cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKENl
bGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci19Ci0KLXZvaWQgTmF0aXZlRXhlY3V0
YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVu
aywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3RyaW5nJiBuYW1l
KQotewotICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICBtX2ppdENvZGVGb3JDYWxs
ID0gY2FsbFRodW5rOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGNvbnN0cnVjdFRodW5r
OwotICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNhbGwt
PmFkZHJlc3NGb3JDYWxsKE11c3RDaGVja0FyaXR5KTsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1
Y3RXaXRoQXJpdHlDaGVjayA9IG1faml0Q29kZUZvckNvbnN0cnVjdC0+YWRkcmVzc0ZvckNhbGwo
TXVzdENoZWNrQXJpdHkpOwotICAgIG1fbmFtZSA9IG5hbWU7Ci19Ci0KLU5hdGl2ZUV4ZWN1dGFi
bGU6Ok5hdGl2ZUV4ZWN1dGFibGUoVk0mIHZtLCBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiwgTmF0
aXZlRnVuY3Rpb24gY29uc3RydWN0b3IsIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgOiBFeGVj
dXRhYmxlQmFzZSh2bSwgdm0ubmF0aXZlRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgTlVNX1BB
UkFNRVRFUlNfSVNfSE9TVCwgaW50cmluc2ljKQotICAgICwgbV9mdW5jdGlvbihmdW5jdGlvbikK
LSAgICAsIG1fY29uc3RydWN0b3IoY29uc3RydWN0b3IpCi17Ci19Ci0KIGNvbnN0IENsYXNzSW5m
byBTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJTY3JpcHRFeGVjdXRhYmxlIiwgJkV4ZWN1
dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoU2NyaXB0RXhlY3V0YWJs
ZSkgfTsKIAogU2NyaXB0RXhlY3V0YWJsZTo6U2NyaXB0RXhlY3V0YWJsZShTdHJ1Y3R1cmUqIHN0
cnVjdHVyZSwgVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmlj
dENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNJ
bkFycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlLCBJ
bnRyaW5zaWMgaW50cmluc2ljKQpAQCAtNDI1LDQyMiArMzI5LDkgQEAgSlNPYmplY3QqIFNjcmlw
dEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1jb25z
dCBDbGFzc0luZm8gRXZhbEV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIkV2YWxFeGVjdXRhYmxlIiwg
JlNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShFdmFsRXhl
Y3V0YWJsZSkgfTsKLQotRXZhbEV4ZWN1dGFibGUqIEV2YWxFeGVjdXRhYmxlOjpjcmVhdGUoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIGJvb2wgaXNJblN0cmljdENv
bnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUsIGJvb2wgaXNBcnJv
d0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxDb250ZXh0VHlwZSwgY29uc3Qg
VmFyaWFibGVFbnZpcm9ubWVudCogdmFyaWFibGVzVW5kZXJURFopCi17Ci0gICAgVk0mIHZtID0g
ZXhlYy0+dm0oKTsKLSAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0K
LSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9i
amVjdCgpOwotICAgIGlmICghZ2xvYmFsT2JqZWN0LT5ldmFsRW5hYmxlZCgpKSB7Ci0gICAgICAg
IHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBjcmVhdGVFdmFsRXJyb3IoZXhlYywgZ2xvYmFs
T2JqZWN0LT5ldmFsRGlzYWJsZWRFcnJvck1lc3NhZ2UoKSkpOwotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBFdmFsRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwg
YWxsb2NhdGVDZWxsPEV2YWxFeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgRXZhbEV4ZWN1dGFi
bGUoZXhlYywgc291cmNlLCBpc0luU3RyaWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBp
c0Fycm93RnVuY3Rpb25Db250ZXh0LCBldmFsQ29udGV4dFR5cGUpOwotICAgIGV4ZWN1dGFibGUt
PmZpbmlzaENyZWF0aW9uKHZtKTsKLQotICAgIFVubGlua2VkRXZhbENvZGVCbG9jayogdW5saW5r
ZWRFdmFsQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRlRXZhbENvZGVCbG9jayhleGVjLCBleGVj
dXRhYmxlLCB2YXJpYWJsZXNVbmRlclREWik7Ci0gICAgaWYgKCF1bmxpbmtlZEV2YWxDb2RlKQot
ICAgICAgICByZXR1cm4gMDsKLQotICAgIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJs
b2NrLnNldCh2bSwgZXhlY3V0YWJsZSwgdW5saW5rZWRFdmFsQ29kZSk7Ci0KLSAgICByZXR1cm4g
ZXhlY3V0YWJsZTsKLX0KLQotRXZhbEV4ZWN1dGFibGU6OkV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0
ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBib29sIGluU3RyaWN0Q29udGV4dCwg
RGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rp
b25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUgZXZhbENvbnRleHRUeXBlKQotICAgIDogU2NyaXB0
RXhlY3V0YWJsZShleGVjLT52bSgpLmV2YWxFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBleGVj
LT52bSgpLCBzb3VyY2UsIGluU3RyaWN0Q29udGV4dCwgZGVyaXZlZENvbnRleHRUeXBlLCBpc0Fy
cm93RnVuY3Rpb25Db250ZXh0LCBldmFsQ29udGV4dFR5cGUsIE5vSW50cmluc2ljKQotewotICAg
IEFTU0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVy
U291cmNlVHlwZTo6UHJvZ3JhbSk7Ci19Ci0KLXZvaWQgRXZhbEV4ZWN1dGFibGU6OmRlc3Ryb3ko
SlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PEV2YWxFeGVjdXRhYmxlKj4oY2VsbCkt
PkV2YWxFeGVjdXRhYmxlOjp+RXZhbEV4ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xhc3NJbmZv
IFByb2dyYW1FeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJQcm9ncmFtRXhlY3V0YWJsZSIsICZTY3Jp
cHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoUHJvZ3JhbUV4ZWN1
dGFibGUpIH07Ci0KLVByb2dyYW1FeGVjdXRhYmxlOjpQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3Rh
dGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFi
bGUoZXhlYy0+dm0oKS5wcm9ncmFtRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0o
KSwgc291cmNlLCBmYWxzZSwgRGVyaXZlZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENv
bnRleHRUeXBlOjpOb25lLCBOb0ludHJpbnNpYykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3Zp
ZGVyKCktPnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0p
OwotICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gMDsKLSAgICBtX3R5cGVQcm9maWxp
bmdFbmRPZmZzZXQgPSBzb3VyY2UubGVuZ3RoKCkgLSAxOwotICAgIGlmIChleGVjLT52bSgpLnR5
cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZtKCkuY29udHJvbEZsb3dQcm9maWxlcigpKQotICAgICAg
ICBleGVjLT52bSgpLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRVbmV4ZWN1dGVk
UmFuZ2Uoc291cmNlSUQoKSwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1fdHlwZVByb2Zp
bGluZ0VuZE9mZnNldCk7Ci19Ci0KLXZvaWQgUHJvZ3JhbUV4ZWN1dGFibGU6OmRlc3Ryb3koSlND
ZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4oY2VsbCkt
PlByb2dyYW1FeGVjdXRhYmxlOjp+UHJvZ3JhbUV4ZWN1dGFibGUoKTsKLX0KLQotY29uc3QgQ2xh
c3NJbmZvIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0Rf
VEFCTEUoTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUpIH07Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlOjpNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJj
ZUNvZGUmIHNvdXJjZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5tb2R1bGVQ
cm9ncmFtRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBmYWxz
ZSwgRGVyaXZlZENvbnRleHRUeXBlOjpOb25lLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25l
LCBOb0ludHJpbnNpYykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJjZVR5
cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6Ok1vZHVsZSk7Ci0gICAgbV90eXBlUHJv
ZmlsaW5nU3RhcnRPZmZzZXQgPSAwOwotICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHNv
dXJjZS5sZW5ndGgoKSAtIDE7Ci0gICAgaWYgKGV4ZWMtPnZtKCkudHlwZVByb2ZpbGVyKCkgfHwg
ZXhlYy0+dm0oKS5jb250cm9sRmxvd1Byb2ZpbGVyKCkpCi0gICAgICAgIGV4ZWMtPnZtKCkuZnVu
Y3Rpb25IYXNFeGVjdXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgp
LCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldCwgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KTsK
LX0KLQotTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjpj
cmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi17Ci0gICAg
SlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3Qo
KTsKLSAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVs
bCwgYWxsb2NhdGVDZWxsPE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkg
TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKLSAgICBleGVjdXRhYmxlLT5m
aW5pc2hDcmVhdGlvbihleGVjLT52bSgpKTsKLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZSA9IGdsb2JhbE9iamVjdC0+Y3JlYXRl
TW9kdWxlUHJvZ3JhbUNvZGVCbG9jayhleGVjLCBleGVjdXRhYmxlKTsKLSAgICBpZiAoIXVubGlu
a2VkTW9kdWxlUHJvZ3JhbUNvZGUpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIGV4ZWN1
dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLnNldChleGVjLT52bSgpLCBl
eGVjdXRhYmxlLCB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlKTsKLQotICAgIGV4ZWN1dGFibGUt
Pm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJs
ZSwganNDYXN0PFN5bWJvbFRhYmxlKj4odW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZS0+Y29uc3Rh
bnRSZWdpc3Rlcih1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlLT5tb2R1bGVFbnZpcm9ubWVudFN5
bWJvbFRhYmxlQ29uc3RhbnRSZWdpc3Rlck9mZnNldCgpKS5nZXQoKSktPmNsb25lU2NvcGVQYXJ0
KGV4ZWMtPnZtKCkpKTsKLQotICAgIHJldHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNf
Y2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Nb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZTo6fk1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBG
dW5jdGlvbkV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIkZ1bmN0aW9uRXhlY3V0YWJsZSIsICZTY3Jp
cHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRnVuY3Rpb25FeGVj
dXRhYmxlKSB9OwotCi1GdW5jdGlvbkV4ZWN1dGFibGU6OkZ1bmN0aW9uRXhlY3V0YWJsZShWTSYg
dm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUq
IHVubGlua2VkRXhlY3V0YWJsZSwgdW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGlu
ZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGlu
dHJpbnNpYykKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUodm0uZnVuY3Rpb25FeGVjdXRhYmxlU3Ry
dWN0dXJlLmdldCgpLCB2bSwgc291cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmlzSW5TdHJpY3RD
b250ZXh0KCksIHVubGlua2VkRXhlY3V0YWJsZS0+ZGVyaXZlZENvbnRleHRUeXBlKCksIGZhbHNl
LCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUsIGludHJpbnNpYykKLSAgICAsIG1fdW5saW5rZWRFeGVj
dXRhYmxlKHZtLCB0aGlzLCB1bmxpbmtlZEV4ZWN1dGFibGUpCi17Ci0gICAgUkVMRUFTRV9BU1NF
UlQoIXNvdXJjZS5pc051bGwoKSk7Ci0gICAgQVNTRVJUKHNvdXJjZS5sZW5ndGgoKSk7Ci0gICAg
bV9maXJzdExpbmUgPSBmaXJzdExpbmU7Ci0gICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotICAg
IEFTU0VSVChzdGFydENvbHVtbiAhPSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVuZENvbHVtbiAh
PSBVSU5UX01BWCk7Ci0gICAgbV9zdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOwotICAgIG1fZW5k
Q29sdW1uID0gZW5kQ29sdW1uOwotICAgIG1fcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0ID0gdW5saW5r
ZWRFeGVjdXRhYmxlLT5wYXJhbWV0ZXJzU3RhcnRPZmZzZXQoKTsKLSAgICBtX3R5cGVQcm9maWxp
bmdTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0KCk7Ci0gICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gdW5saW5rZWRFeGVjdXRhYmxl
LT50eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRhYmxl
OjpmaW5pc2hDcmVhdGlvbihWTSYgdm0pCi17Ci0gICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0p
OwotICAgIG1fc2luZ2xldG9uRnVuY3Rpb24uc2V0KHZtLCB0aGlzLCBJbmZlcnJlZFZhbHVlOjpj
cmVhdGUodm0pKTsKLX0KLQotdm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxs
KiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KGNlbGwpLT5G
dW5jdGlvbkV4ZWN1dGFibGU6On5GdW5jdGlvbkV4ZWN1dGFibGUoKTsKLX0KLQotaW5saW5lIGNv
bnN0IGNoYXIqIHNhbXBsaW5nRGVzY3JpcHRpb24oSklUQ29kZTo6SklUVHlwZSBqaXRUeXBlKQot
ewotICAgIHN3aXRjaCAoaml0VHlwZSkgewotICAgIGNhc2UgSklUQ29kZTo6SW50ZXJwcmV0ZXJU
aHVuazoKLSAgICAgICAgcmV0dXJuICJJbnRlcnByZXRlciBDb21waWxhdGlvbiAoVE9UQUwpIjsK
LSAgICBjYXNlIEpJVENvZGU6OkJhc2VsaW5lSklUOgotICAgICAgICByZXR1cm4gIkJhc2VsaW5l
IENvbXBpbGF0aW9uIChUT1RBTCkiOwotICAgIGNhc2UgSklUQ29kZTo6REZHSklUOgotICAgICAg
ICByZXR1cm4gIkRGRyBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNlIEpJVENvZGU6OkZU
TEpJVDoKLSAgICAgICAgcmV0dXJuICJGVEwgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgZGVm
YXVsdDoKLSAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotfQotCi12b2lkIEV2YWxFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpT
Q2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgRXZhbEV4ZWN1dGFibGUq
IHRoaXNPYmplY3QgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRf
R0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0
YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFw
cGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZEV2YWxDb2RlQmxvY2spOwotICAgIGlmICh0aGlz
T2JqZWN0LT5tX2V2YWxDb2RlQmxvY2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fZXZhbENvZGVC
bG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci19Ci0KLUpTT2JqZWN0KiBQcm9ncmFtRXhlY3V0
YWJsZTo6Y2hlY2tTeW50YXgoRXhlY1N0YXRlKiBleGVjKQotewotICAgIFBhcnNlckVycm9yIGVy
cm9yOwotICAgIFZNKiB2bSA9ICZleGVjLT52bSgpOwotICAgIEpTR2xvYmFsT2JqZWN0KiBsZXhp
Y2FsR2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIHN0ZDo6
dW5pcXVlX3B0cjxQcm9ncmFtTm9kZT4gcHJvZ3JhbU5vZGUgPSBwYXJzZTxQcm9ncmFtTm9kZT4o
Ci0gICAgICAgIHZtLCBtX3NvdXJjZSwgSWRlbnRpZmllcigpLCBKU1BhcnNlckJ1aWx0aW5Nb2Rl
OjpOb3RCdWlsdGluLAotICAgICAgICBKU1BhcnNlclN0cmljdE1vZGU6Ok5vdFN0cmljdCwgSlNQ
YXJzZXJTY3JpcHRNb2RlOjpDbGFzc2ljLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBT
dXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgZXJyb3IpOwotICAgIGlmIChwcm9ncmFtTm9kZSkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgQVNTRVJUKGVycm9yLmlzVmFsaWQoKSk7Ci0gICAgcmV0dXJu
IGVycm9yLnRvRXJyb3JPYmplY3QobGV4aWNhbEdsb2JhbE9iamVjdCwgbV9zb3VyY2UpOwotfQot
Ci1KU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6OmluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVz
KFZNJiB2bSwgQ2FsbEZyYW1lKiBjYWxsRnJhbWUsIEpTU2NvcGUqIHNjb3BlKQotewotICAgIFJF
TEVBU0VfQVNTRVJUKHNjb3BlKTsKLSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0g
c2NvcGUtPmdsb2JhbE9iamVjdCgpOwotICAgIFJFTEVBU0VfQVNTRVJUKGdsb2JhbE9iamVjdCk7
Ci0gICAgQVNTRVJUKCZnbG9iYWxPYmplY3QtPnZtKCkgPT0gJnZtKTsKLQotICAgIEpTT2JqZWN0
KiBleGNlcHRpb24gPSAwOwotICAgIFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRD
b2RlQmxvY2sgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZVByb2dyYW1Db2RlQmxvY2soY2FsbEZyYW1l
LCB0aGlzLCAmZXhjZXB0aW9uKTsKLSAgICBpZiAoZXhjZXB0aW9uKQotICAgICAgICByZXR1cm4g
ZXhjZXB0aW9uOwotCi0gICAgSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQqIGdsb2JhbExleGlj
YWxFbnZpcm9ubWVudCA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsTGV4aWNhbEVudmlyb25tZW50KCk7
Ci0gICAgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCYgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSB1
bmxpbmtlZENvZGVCbG9jay0+dmFyaWFibGVEZWNsYXJhdGlvbnMoKTsKLSAgICBjb25zdCBWYXJp
YWJsZUVudmlyb25tZW50JiBsZXhpY2FsRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2st
PmxleGljYWxEZWNsYXJhdGlvbnMoKTsKLSAgICAvLyBUaGUgRVM2IHNwZWMgc2F5cyB0aGF0IG5v
IHZhcnMvZ2xvYmFsIHByb3BlcnRpZXMvbGV0L2NvbnN0IGNhbiBiZSBkdXBsaWNhdGVkIGluIHRo
ZSBnbG9iYWwgc2NvcGUuCi0gICAgLy8gVGhpcyBjYXJyaWVkIG91dCBzZWN0aW9uIDE1LjEuOCBv
ZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2
Mi82LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsZGVjbGFyYXRpb25pbnN0YW50aWF0aW9uCi0gICAg
ewotICAgICAgICBFeGVjU3RhdGUqIGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsK
LSAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyc2VjdGlvbiBvZiAidmFyIiBhbmQgImxldCIvImNv
bnN0Ii8iY2xhc3MiCi0gICAgICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRp
b25zKSB7Ci0gICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbnMuY29udGFpbnMoZW50
cnkua2V5KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU3ludGF4RXJyb3IoZXhlYywg
bWFrZVN0cmluZygiQ2FuJ3QgY3JlYXRlIGR1cGxpY2F0ZSB2YXJpYWJsZTogJyIsIFN0cmluZyhl
bnRyeS5rZXkuZ2V0KCkpLCAiJyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGlm
IGFueSBuZXcgImxldCIvImNvbnN0Ii8iY2xhc3MiIHdpbGwgc2hhZG93IGFueSBwcmUtZXhpc3Rp
bmcgZ2xvYmFsIHByb3BlcnR5IG5hbWVzLCBvciAidmFyIi8ibGV0Ii8iY29uc3QiIHZhcmlhYmxl
cy4KLSAgICAgICAgLy8gSXQncyBhbiBlcnJvciB0byBpbnRyb2R1Y2UgYSBzaGFkb3cuCi0gICAg
ICAgIGZvciAoYXV0byYgZW50cnkgOiBsZXhpY2FsRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAg
ICBpZiAoZ2xvYmFsT2JqZWN0LT5oYXNQcm9wZXJ0eShleGVjLCBlbnRyeS5rZXkuZ2V0KCkpKSB7
Ci0gICAgICAgICAgICAgICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBqdXN0IFJlc3RyaWN0
ZWRHbG9iYWxQcm9wZXJ0eSBjYW4ndCBiZSBzaGFkb3dlZAotICAgICAgICAgICAgICAgIC8vIFRo
aXMgY2FycmllZCBvdXQgc2VjdGlvbiA4LjEuMS40LjE0IG9mIHRoZSBFUzYgc3BlYzogaHR0cDov
L3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1o
YXNyZXN0cmljdGVkZ2xvYmFscHJvcGVydHkKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2Ny
aXB0b3IgZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICBnbG9iYWxPYmplY3QtPmdldE93blBy
b3BlcnR5RGVzY3JpcHRvcihleGVjLCBlbnRyeS5rZXkuZ2V0KCksIGRlc2NyaXB0b3IpOwotICAg
ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKCkgIT0g
anNVbmRlZmluZWQoKSAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUoKSkKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0
IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGUgdGhhdCBzaGFkb3dzIGEgZ2xvYmFsIHByb3BlcnR5
OiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+
aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgewotICAgICAgICAgICAgICAgIGlm
IChVTkxJS0VMWShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNs
YXJhdGlvblNob3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgewotICAgICAgICAgICAg
ICAgICAgICAvLyBXZSBvbmx5IGFsbG93ICJjb25zdCIgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyB1
bmRlciB0aGlzIHNldHRpbmcuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCB3
ZSBkb24ndCAibGV0IiB2YXJpYWJsZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSAiY29uc3QiIHZhcmlh
Ymxlcy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+
aXNDb25zdFZhcmlhYmxlKGVudHJ5LmtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNy
ZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUg
dmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJ2YXIicyB3aWxs
IHNoYWRvdyBhbnkgcHJldmlvdXMgImxldCIvImNvbnN0Ii8iY2xhc3MiIG5hbWVzLgotICAgICAg
ICAvLyBJdCdzIGFuIGVycm9yIHRvIGludHJvZHVjZSBhIHNoYWRvdy4KLSAgICAgICAgaWYgKCFn
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChh
dXRvJiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGdsb2JhbExleGljYWxFbnZpcm9ubWVudC0+aGFzUHJvcGVydHkoZXhlYywgZW50cnkua2V5Lmdl
dCgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMs
IG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmco
ZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
Ci0KLQotICAgIG1fdW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrLnNldCh2bSwgdGhpcywgdW5saW5r
ZWRDb2RlQmxvY2spOwotCi0gICAgQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIgb3B0aW1pemVy
KHZtLCBnbG9iYWxPYmplY3QpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDAsIG51bWJlck9mRnVu
Y3Rpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpOyBpIDwg
bnVtYmVyT2ZGdW5jdGlvbnM7ICsraSkgewotICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZSogdW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUgPSB1bmxpbmtlZENvZGVCbG9jay0+ZnVu
Y3Rpb25EZWNsKGkpOwotICAgICAgICBBU1NFUlQoIXVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxl
LT5uYW1lKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRGdW5jdGlvbihj
YWxsRnJhbWUsIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT5uYW1lKCkpOwotICAgICAgICBp
ZiAodm0udHlwZVByb2ZpbGVyKCkgfHwgdm0uY29udHJvbEZsb3dQcm9maWxlcigpKSB7Ci0gICAg
ICAgICAgICB2bS5mdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJh
bmdlKHNvdXJjZUlEKCksIAotICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlLT50eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQoKSwgCi0gICAgICAgICAgICAgICAgdW5saW5r
ZWRGdW5jdGlvbkV4ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8mIGVudHJ5IDogdmFyaWFibGVEZWNsYXJhdGlvbnMp
IHsKLSAgICAgICAgQVNTRVJUKGVudHJ5LnZhbHVlLmlzVmFyKCkpOwotICAgICAgICBnbG9iYWxP
YmplY3QtPmFkZFZhcihjYWxsRnJhbWUsIElkZW50aWZpZXI6OmZyb21VaWQoJnZtLCBlbnRyeS5r
ZXkuZ2V0KCkpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEpTR2xvYmFsTGV4aWNhbEVudmly
b25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQgPSBqc0Nhc3Q8SlNHbG9iYWxMZXhpY2Fs
RW52aXJvbm1lbnQqPihnbG9iYWxPYmplY3QtPmdsb2JhbFNjb3BlKCkpOwotICAgICAgICBTeW1i
b2xUYWJsZSogc3ltYm9sVGFibGUgPSBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPnN5bWJvbFRh
YmxlKCk7Ci0gICAgICAgIENvbmN1cnJlbnRKSVRMb2NrZXIgbG9ja2VyKHN5bWJvbFRhYmxlLT5t
X2xvY2spOwotICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykg
ewotICAgICAgICAgICAgaWYgKFVOTElLRUxZKGVudHJ5LnZhbHVlLmlzQ29uc3QoKSAmJiAhdm0u
Z2xvYmFsQ29uc3RSZWRlY2xhcmF0aW9uU2hvdWxkVGhyb3coKSAmJiAhaXNTdHJpY3RNb2RlKCkp
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN5bWJvbFRhYmxlLT5jb250YWlucyhsb2NrZXIsIGVu
dHJ5LmtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0ID0gc3ltYm9sVGFibGUtPnRha2VO
ZXh0U2NvcGVPZmZzZXQobG9ja2VyKTsKLSAgICAgICAgICAgIFN5bWJvbFRhYmxlRW50cnkgbmV3
RW50cnkoVmFyT2Zmc2V0KG9mZnNldCksIGVudHJ5LnZhbHVlLmlzQ29uc3QoKSA/IFJlYWRPbmx5
IDogMCk7Ci0gICAgICAgICAgICBuZXdFbnRyeS5wcmVwYXJlVG9XYXRjaCgpOwotICAgICAgICAg
ICAgc3ltYm9sVGFibGUtPmFkZChsb2NrZXIsIGVudHJ5LmtleS5nZXQoKSwgbmV3RW50cnkpOwot
ICAgICAgICAgICAgCi0gICAgICAgICAgICBTY29wZU9mZnNldCBvZmZzZXRGb3JBc3NlcnQgPSBn
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmFkZFZhcmlhYmxlcygxLCBqc1REWlZhbHVlKCkpOwot
ICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQob2Zmc2V0Rm9yQXNzZXJ0ID09IG9mZnNldCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUHJvZ3JhbUV4ZWN1dGFi
bGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsK
LSAgICBQcm9ncmFtRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxQcm9ncmFtRXhlY3V0
YWJsZSo+KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwg
aW5mbygpKTsKLSAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmplY3Qs
IHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3VubGlua2VkUHJv
Z3JhbUNvZGVCbG9jayk7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNvZGVCbG9jaykK
LSAgICAgICAgdGhpc09iamVjdC0+bV9wcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNp
dG9yKTsKLX0KLQotdm9pZCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihK
U0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQotewotICAgIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4o
Y2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkp
OwotICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRv
cik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGVF
bnZpcm9ubWVudFN5bWJvbFRhYmxlKTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9tb2R1bGVQcm9n
cmFtQ29kZUJsb2NrKQotICAgICAgICB0aGlzT2JqZWN0LT5tX21vZHVsZVByb2dyYW1Db2RlQmxv
Y2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotfQotCi1GdW5jdGlvbkNvZGVCbG9jayogRnVuY3Rp
b25FeGVjdXRhYmxlOjpiYXNlbGluZUNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCi17Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIHJlc3VsdDsKLSAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgcmVzdWx0ID0gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgp
OwotICAgIGVsc2UgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDb25z
dHJ1Y3QpOwotICAgICAgICByZXN1bHQgPSBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsK
LSAgICB9Ci0gICAgaWYgKCFyZXN1bHQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBz
dGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KHJlc3VsdC0+YmFzZWxpbmVBbHRlcm5hdGl2
ZSgpKTsKLX0KLQotdm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxs
KiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRvcikKLXsKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUq
IHRoaXNPYmplY3QgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4oY2VsbCk7Ci0gICAgQVNT
RVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBpbmZvKCkpOwotICAgIFNjcmlwdEV4
ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Ci0gICAgaWYgKHRo
aXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbCkKLSAgICAgICAgdGhpc09iamVjdC0+bV9jb2Rl
QmxvY2tGb3JDYWxsLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLSAgICBpZiAodGhpc09iamVjdC0+
bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QpCi0gICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2Nr
Rm9yQ29uc3RydWN0LT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgm
dGhpc09iamVjdC0+bV91bmxpbmtlZEV4ZWN1dGFibGUpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0
aGlzT2JqZWN0LT5tX3NpbmdsZXRvbkZ1bmN0aW9uKTsKLX0KLQotRnVuY3Rpb25FeGVjdXRhYmxl
KiBGdW5jdGlvbkV4ZWN1dGFibGU6OmZyb21HbG9iYWxDb2RlKAotICAgIGNvbnN0IElkZW50aWZp
ZXImIG5hbWUsIEV4ZWNTdGF0ZSYgZXhlYywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCAKLSAg
ICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcikKLXsKLSAgICBV
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlID0gCi0gICAgICAg
IFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xvYmFsQ29kZSgKLSAgICAgICAgICAg
IG5hbWUsIGV4ZWMsIHNvdXJjZSwgZXhjZXB0aW9uLCBvdmVycmlkZUxpbmVOdW1iZXIpOwotICAg
IGlmICghdW5saW5rZWRFeGVjdXRhYmxlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAg
IHJldHVybiB1bmxpbmtlZEV4ZWN1dGFibGUtPmxpbmsoZXhlYy52bSgpLCBzb3VyY2UsIG92ZXJy
aWRlTGluZU51bWJlcik7Ci19Ci0KLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi1jb25zdCBDbGFz
c0luZm8gV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJXZWJBc3NlbWJseUV4ZWN1
dGFibGUiLCAmRXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShX
ZWJBc3NlbWJseUV4ZWN1dGFibGUpIH07Ci0KLVdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6V2ViQXNz
ZW1ibHlFeGVjdXRhYmxlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21N
b2R1bGUqIG1vZHVsZSwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCkKLSAgICA6IEV4ZWN1dGFibGVC
YXNlKHZtLCB2bS53ZWJBc3NlbWJseUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIE5VTV9QQVJB
TUVURVJTX05PVF9DT01QSUxFRCwgTm9JbnRyaW5zaWMpCi0gICAgLCBtX3NvdXJjZShzb3VyY2Up
Ci0gICAgLCBtX21vZHVsZSh2bSwgdGhpcywgbW9kdWxlKQotICAgICwgbV9mdW5jdGlvbkluZGV4
KGZ1bmN0aW9uSW5kZXgpCi17Ci0gICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VU
eXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpXZWJBc3NlbWJseSk7Ci19Ci0KLXZv
aWQgV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBz
dGF0aWNfY2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPihjZWxsKS0+V2ViQXNzZW1ibHlFeGVj
dXRhYmxlOjp+V2ViQXNzZW1ibHlFeGVjdXRhYmxlKCk7Ci19Ci0KLXZvaWQgV2ViQXNzZW1ibHlF
eGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0
b3IpCi17Ci0gICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PFdl
YkFzc2VtYmx5RXhlY3V0YWJsZSo+KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJ
VFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBFeGVjdXRhYmxlQmFzZTo6dmlzaXRDaGlsZHJl
bih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9jb2RlQmxvY2tG
b3JDYWxsKQotICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwtPnZpc2l0V2Vh
a2x5KHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX21vZHVsZSk7
Ci19Ci0jZW5kaWYKLQotdm9pZCBFeGVjdXRhYmxlQmFzZTo6ZHVtcChQcmludFN0cmVhbSYgb3V0
KSBjb25zdAotewotICAgIEV4ZWN1dGFibGVCYXNlKiByZWFsVGhpcyA9IGNvbnN0X2Nhc3Q8RXhl
Y3V0YWJsZUJhc2UqPih0aGlzKTsKLSAgICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTmF0aXZl
RXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIE5hdGl2ZUV4ZWN1dGFibGUqIG5hdGl2ZSA9
IGpzQ2FzdDxOYXRpdmVFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBvdXQucHJpbnQo
Ik5hdGl2ZUV4ZWN1dGFibGU6IiwgUmF3UG9pbnRlcihiaXR3aXNlX2Nhc3Q8dm9pZCo+KG5hdGl2
ZS0+ZnVuY3Rpb24oKSkpLCAiLyIsIFJhd1BvaW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRp
dmUtPmNvbnN0cnVjdG9yKCkpKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAg
aWYgKGNsYXNzSW5mbygpID09IEV2YWxFeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRXZh
bEV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0g
ICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV2YWwtPmNvZGVCbG9jaygpKQotICAg
ICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBvdXQucHJpbnQoIkV2YWxFeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFi
bGU6OmluZm8oKSkgewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXZhbCA9IGpzQ2FzdDxQ
cm9ncmFtRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgaWYgKENvZGVCbG9jayogY29k
ZUJsb2NrID0gZXZhbC0+Y29kZUJsb2NrKCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoKmNvZGVC
bG9jayk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dC5wcmludCgiUHJvZ3JhbUV4ZWN1
dGFibGUgdy9vIENvZGVCbG9jayIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYg
KGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAg
ICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVC
bG9jayA9IGV4ZWN1dGFibGUtPmNvZGVCbG9jaygpKQotICAgICAgICAgICAgb3V0LnByaW50KCpj
b2RlQmxvY2spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXQucHJpbnQoIk1vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICAKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uID0ganNDYXN0PEZ1bmN0aW9u
RXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICBpZiAoIWZ1bmN0aW9uLT5laXRoZXJDb2RlQmxv
Y2soKSkKLSAgICAgICAgb3V0LnByaW50KCJGdW5jdGlvbkV4ZWN1dGFibGUgdy9vIENvZGVCbG9j
ayIpOwotICAgIGVsc2UgewotICAgICAgICBDb21tYVByaW50ZXIgY29tbWEoIi8iKTsKLSAgICAg
ICAgaWYgKGZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDYWxsKCkpCi0gICAgICAgICAgICBvdXQucHJp
bnQoY29tbWEsICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ2FsbCgpKTsKLSAgICAgICAgaWYgKGZ1
bmN0aW9uLT5jb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKSkKLSAgICAgICAgICAgIG91dC5wcmludChj
b21tYSwgKmZ1bmN0aW9uLT5jb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKSk7Ci0gICAgfQotfQotCi1D
b2RlQmxvY2tIYXNoIEV4ZWN1dGFibGVCYXNlOjpoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktp
bmQga2luZCkgY29uc3QKLXsKLSAgICBpZiAodGhpcy0+Y2xhc3NJbmZvKCkgPT0gTmF0aXZlRXhl
Y3V0YWJsZTo6aW5mbygpKQotICAgICAgICByZXR1cm4ganNDYXN0PGNvbnN0IE5hdGl2ZUV4ZWN1
dGFibGUqPih0aGlzKS0+aGFzaEZvcihraW5kKTsKLSAgICAKLSAgICByZXR1cm4ganNDYXN0PGNv
bnN0IFNjcmlwdEV4ZWN1dGFibGUqPih0aGlzKS0+aGFzaEZvcihraW5kKTsKLX0KLQotQ29kZUJs
b2NrSGFzaCBOYXRpdmVFeGVjdXRhYmxlOjpoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQg
a2luZCkgY29uc3QKLXsKLSAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgcmV0
dXJuIENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXpl
X3Q+KG1fZnVuY3Rpb24pKSk7Ci0gICAgCi0gICAgUkVMRUFTRV9BU1NFUlQoa2luZCA9PSBDb2Rl
Rm9yQ29uc3RydWN0KTsKLSAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oYml0d2lzZV9jYXN0PHNpemVfdD4obV9jb25zdHJ1Y3RvcikpKTsKLX0KLQogQ29kZUJs
b2NrSGFzaCBTY3JpcHRFeGVjdXRhYmxlOjpoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQg
a2luZCkgY29uc3QKIHsKICAgICByZXR1cm4gQ29kZUJsb2NrSGFzaChzb3VyY2UoKSwga2luZCk7
CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvU2NyaXB0RXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL1NjcmlwdEV4ZWN1dGFibGUuaAkocmV2aXNpb24gMjA3NzkwKQkoZnJv
bSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlLmg6MjA3NzkwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU2NyaXB0RXhlY3V0YWJsZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEw
LCAyMDEzLTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRl
ICJBcml0eUNoZWNrTW9kZS5oIgorI2luY2x1ZGUgIkNhbGxEYXRhLmgiCisjaW5jbHVkZSAiQ29k
ZUJsb2NrSGFzaC5oIgorI2luY2x1ZGUgIkNvZGVTcGVjaWFsaXphdGlvbktpbmQuaCIKKyNpbmNs
dWRlICJDb21waWxhdGlvblJlc3VsdC5oIgorI2luY2x1ZGUgIkV4ZWN1dGFibGVJbmZvLmgiCisj
aW5jbHVkZSAiSGFuZGxlckluZm8uaCIKKyNpbmNsdWRlICJJbmZlcnJlZFZhbHVlLmgiCisjaW5j
bHVkZSAiSklUQ29kZS5oIgorI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCisjaW5jbHVkZSAi
U291cmNlQ29kZS5oIgorI2luY2x1ZGUgIlR5cGVTZXQuaCIKKyNpbmNsdWRlICJVbmxpbmtlZENv
ZGVCbG9jay5oIgorI2luY2x1ZGUgIlVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLmgiCisKK25h
bWVzcGFjZSBKU0MgeworCitjbGFzcyBDb2RlQmxvY2s7CitjbGFzcyBFdmFsQ29kZUJsb2NrOwor
Y2xhc3MgRnVuY3Rpb25Db2RlQmxvY2s7CitjbGFzcyBKU1Njb3BlOworY2xhc3MgSlNXYXNtTW9k
dWxlOworY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworY2xhc3MgTW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jazsKK2NsYXNzIFByb2dyYW1Db2RlQmxvY2s7CitjbGFzcyBXZWJBc3NlbWJseUNvZGVC
bG9jazsKKworZW51bSBDb21waWxhdGlvbktpbmQgeyBGaXJzdENvbXBpbGF0aW9uLCBPcHRpbWl6
aW5nQ29tcGlsYXRpb24gfTsKKworaW5saW5lIGJvb2wgaXNDYWxsKENvZGVTcGVjaWFsaXphdGlv
bktpbmQga2luZCkKK3sKKyAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitjbGFzcyBFeGVjdXRhYmxlQmFzZSA6IHB1YmxpYyBKU0NlbGwgewor
ICAgIGZyaWVuZCBjbGFzcyBKSVQ7CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgY29uc3QgaW50
IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX1BB
UkFNRVRFUlNfTk9UX0NPTVBJTEVEID0gLTE7CisKKyAgICBFeGVjdXRhYmxlQmFzZShWTSYgdm0s
IFN0cnVjdHVyZSogc3RydWN0dXJlLCBpbnQgbnVtUGFyYW1ldGVycywgSW50cmluc2ljIGludHJp
bnNpYykKKyAgICAgICAgOiBKU0NlbGwodm0sIHN0cnVjdHVyZSkKKyAgICAgICAgLCBtX251bVBh
cmFtZXRlcnNGb3JDYWxsKG51bVBhcmFtZXRlcnMpCisgICAgICAgICwgbV9udW1QYXJhbWV0ZXJz
Rm9yQ29uc3RydWN0KG51bVBhcmFtZXRlcnMpCisgICAgICAgICwgbV9pbnRyaW5zaWMoaW50cmlu
c2ljKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKKyAg
ICB7CisgICAgICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICB9CisKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIEpTQ2VsbCBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1
Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzOworCisgICAgc3RhdGljIGNvbnN0IGJv
b2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRydWU7CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0Nl
bGwqKTsKKyAgICAgICAgCisgICAgQ29kZUJsb2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXph
dGlvbktpbmQpIGNvbnN0OworCisgICAgYm9vbCBpc0V2YWxFeGVjdXRhYmxlKCkgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiB0eXBlKCkgPT0gRXZhbEV4ZWN1dGFibGVUeXBlOworICAgIH0K
KyAgICBib29sIGlzRnVuY3Rpb25FeGVjdXRhYmxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiB0eXBlKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlVHlwZTsKKyAgICB9CisgICAgYm9vbCBp
c1Byb2dyYW1FeGVjdXRhYmxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlKCkg
PT0gUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOworICAgIH0KKyAgICBib29sIGlzTW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZVR5cGU7CisgICAgfQorCisKKyAgICBib29sIGlzSG9zdEZ1bmN0aW9uKCkg
Y29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVCgobV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9PSBO
VU1fUEFSQU1FVEVSU19JU19IT1NUKSA9PSAobV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID09
IE5VTV9QQVJBTUVURVJTX0lTX0hPU1QpKTsKKyAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVy
c0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVDsKKyAgICB9CisKKyNpZiBFTkFCTEUo
V0VCQVNTRU1CTFkpCisgICAgYm9vbCBpc1dlYkFzc2VtYmx5RXhlY3V0YWJsZSgpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGU7
CisgICAgfQorI2VuZGlmCisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUo
Vk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKSB7IHJl
dHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8o
Q2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsgfQorICAgICAgICAKKyAgICB2b2lk
IGNsZWFyQ29kZSgpOworCisgICAgREVDTEFSRV9FWFBPUlRfSU5GTzsKKworcHJvdGVjdGVkOgor
ICAgIGludCBtX251bVBhcmFtZXRlcnNGb3JDYWxsOworICAgIGludCBtX251bVBhcmFtZXRlcnNG
b3JDb25zdHJ1Y3Q7CisKK3B1YmxpYzoKKyAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRl
ZEpJVENvZGVGb3JDYWxsKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2ppdENvZGVGb3JDYWxs
KTsKKyAgICAgICAgcmV0dXJuIG1faml0Q29kZUZvckNhbGw7CisgICAgfQorCisgICAgUGFzc1Jl
ZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ29uc3RydWN0KCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2ppdENvZGVGb3JDb25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gbV9qaXRD
b2RlRm9yQ29uc3RydWN0OworICAgIH0KKyAgICAgICAgCisgICAgUGFzc1JlZlB0cjxKSVRDb2Rl
PiBnZW5lcmF0ZWRKSVRDb2RlRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7
CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIGdl
bmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JD
b25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgp
OworICAgIH0KKyAgICAKKyAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgZW50cnlwb2ludEZvcihD
b2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQsIEFyaXR5Q2hlY2tNb2RlIGFyaXR5KQorICAgIHsK
KyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNhY2hlZCByZXN1bHQuIFdlIG9ubHkgaGF2
ZSBpdCBmb3IgYXJpdHkgY2hlY2sgYmVjYXVzZSB3ZSB1c2UgdGhlCisgICAgICAgIC8vIG5vLWFy
aXR5IGVudHJ5cG9pbnQgaW4gbm9uLXZpcnR1YWwgY2FsbHMsIHdoaWNoIHdpbGwgImNhY2hlIiB0
aGlzIHZhbHVlIGRpcmVjdGx5IGluCisgICAgICAgIC8vIG1hY2hpbmUgY29kZS4KKyAgICAgICAg
aWYgKGFyaXR5ID09IE11c3RDaGVja0FyaXR5KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGtpbmQp
IHsKKyAgICAgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgICAgICAgICAgaWYgKE1h
Y3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPSBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hl
Y2spCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICAg
ICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1bHQgPSBtX2ppdENvZGVGb3JDb25zdHJ1
Y3RXaXRoQXJpdHlDaGVjaykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBN
YWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0KKyAgICAgICAgICAgIGdlbmVyYXRlZEpJVENv
ZGVGb3Ioa2luZCktPmFkZHJlc3NGb3JDYWxsKGFyaXR5KTsKKyAgICAgICAgaWYgKGFyaXR5ID09
IE11c3RDaGVja0FyaXR5KSB7CisgICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0OyB0aGlz
IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIEpJVCdzIHZpcnR1YWwgY2FsbCBvcHRpbWl6YXRpb25zLgor
ICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxs
OgorICAgICAgICAgICAgICAgIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IHJlc3Vs
dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0
cnVjdDoKKyAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVj
ayA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBwdHJkaWZm
X3Qgb2Zmc2V0T2ZKSVRDb2RlV2l0aEFyaXR5Q2hlY2tGb3IoCisgICAgICAgIENvZGVTcGVjaWFs
aXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAg
ICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihF
eGVjdXRhYmxlQmFzZSwgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrKTsKKyAgICAgICAg
Y2FzZSBDb2RlRm9yQ29uc3RydWN0OgorICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRP
RihFeGVjdXRhYmxlQmFzZSwgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spOwor
ICAgICAgICB9CisgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
IHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTnVt
UGFyYW1ldGVyc0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAg
ICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZG
U0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwpOworICAgICAgICBB
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIE9CSkVDVF9P
RkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0KTsKKyAg
ICB9CisKKyAgICBib29sIGhhc0pJVENvZGVGb3JDYWxsKCkgY29uc3QKKyAgICB7CisgICAgICAg
IHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDYWxsID49IDA7CisgICAgfQorICAgICAgICAKKyAg
ICBib29sIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCA+PSAwOworICAgIH0KKyAgICAgICAgCisg
ICAgYm9vbCBoYXNKSVRDb2RlRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0
dXJuIGhhc0pJVENvZGVGb3JDYWxsKCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JD
b25zdHJ1Y3QpOworICAgICAgICByZXR1cm4gaGFzSklUQ29kZUZvckNvbnN0cnVjdCgpOworICAg
IH0KKworICAgIC8vIEludHJpbnNpY3MgYXJlIG9ubHkgZm9yIGNhbGxzLCBjdXJyZW50bHkuCisg
ICAgSW50cmluc2ljIGludHJpbnNpYygpIGNvbnN0IHsgcmV0dXJuIG1faW50cmluc2ljOyB9Cisg
ICAgICAgIAorICAgIEludHJpbnNpYyBpbnRyaW5zaWNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCBraW5kKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzQ2FsbChraW5kKSkKKyAgICAgICAg
ICAgIHJldHVybiBpbnRyaW5zaWMoKTsKKyAgICAgICAgcmV0dXJuIE5vSW50cmluc2ljOworICAg
IH0KKyAgICAKKyAgICB2b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKKyAgICAgICAgCitw
cm90ZWN0ZWQ6CisgICAgSW50cmluc2ljIG1faW50cmluc2ljOworICAgIFJlZlB0cjxKSVRDb2Rl
PiBtX2ppdENvZGVGb3JDYWxsOworICAgIFJlZlB0cjxKSVRDb2RlPiBtX2ppdENvZGVGb3JDb25z
dHJ1Y3Q7CisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1faml0Q29kZUZvckNhbGxXaXRoQXJp
dHlDaGVjazsKKyAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgbV9qaXRDb2RlRm9yQ29uc3RydWN0
V2l0aEFyaXR5Q2hlY2s7Cit9OworCitjbGFzcyBOYXRpdmVFeGVjdXRhYmxlIGZpbmFsIDogcHVi
bGljIEV4ZWN1dGFibGVCYXNlIHsKKyAgICBmcmllbmQgY2xhc3MgSklUOworICAgIGZyaWVuZCBj
bGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBFeGVjdXRh
YmxlQmFzZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9
IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRp
YyBOYXRpdmVFeGVjdXRhYmxlKiBjcmVhdGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNh
bGxUaHVuaywgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29u
c3RydWN0VGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmlu
c2ljLCBjb25zdCBTdHJpbmcmIG5hbWUpOworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0Nl
bGwqKTsKKworICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
KSBjb25zdDsKKworICAgIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uKCkgeyByZXR1cm4gbV9mdW5j
dGlvbjsgfQorICAgIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yKCkgeyByZXR1cm4gbV9jb25z
dHJ1Y3RvcjsgfQorICAgICAgICAKKyAgICBOYXRpdmVGdW5jdGlvbiBuYXRpdmVGdW5jdGlvbkZv
cihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9
PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpOworICAgICAgICBB
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVj
dG9yKCk7CisgICAgfQorICAgICAgICAKKyAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTmF0
aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAg
ICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gT0JKRUNUX09G
RlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUsIG1fZnVuY3Rpb24pOworICAgICAgICBBU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihO
YXRpdmVFeGVjdXRhYmxlLCBtX2NvbnN0cnVjdG9yKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3Ry
dWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUgcHJv
dG8pOworICAgICAgICAKKyAgICBERUNMQVJFX0lORk87CisKKyAgICBjb25zdCBTdHJpbmcmIG5h
bWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgZmlu
aXNoQ3JlYXRpb24oVk0mLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0
cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVuaywgY29uc3QgU3RyaW5nJiBuYW1lKTsKKworcHJpdmF0
ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisKKyAgICBOYXRpdmVFeGVjdXRh
YmxlKFZNJiwgTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVj
dG9yLCBJbnRyaW5zaWMpOworCisgICAgTmF0aXZlRnVuY3Rpb24gbV9mdW5jdGlvbjsKKyAgICBO
YXRpdmVGdW5jdGlvbiBtX2NvbnN0cnVjdG9yOworCisgICAgU3RyaW5nIG1fbmFtZTsKK307CisK
K2NsYXNzIFNjcmlwdEV4ZWN1dGFibGUgOiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgeworcHVibGlj
OgorICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKKworICAgIHN0YXRp
YyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisgICAgICAgIAorICAgIENvZGVCbG9ja0hhc2ggaGFz
aEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKKworICAgIGNvbnN0IFNvdXJjZUNv
ZGUmIHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlOyB9CisgICAgaW50cHRyX3Qgc291
cmNlSUQoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRlcklEKCk7IH0KKyAgICBjb25z
dCBTdHJpbmcmIHNvdXJjZVVSTCgpIGNvbnN0IHsgcmV0dXJuIG1fc291cmNlLnByb3ZpZGVyKCkt
PnVybCgpOyB9CisgICAgaW50IGZpcnN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmlyc3RMaW5l
OyB9CisgICAgdm9pZCBzZXRPdmVycmlkZUxpbmVOdW1iZXIoaW50IG92ZXJyaWRlTGluZU51bWJl
cikgeyBtX292ZXJyaWRlTGluZU51bWJlciA9IG92ZXJyaWRlTGluZU51bWJlcjsgfQorICAgIGJv
b2wgaGFzT3ZlcnJpZGVMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9vdmVycmlkZUxpbmVO
dW1iZXIgIT0gLTE7IH0KKyAgICBpbnQgb3ZlcnJpZGVMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1
cm4gbV9vdmVycmlkZUxpbmVOdW1iZXI7IH0KKyAgICBpbnQgbGFzdExpbmUoKSBjb25zdCB7IHJl
dHVybiBtX2xhc3RMaW5lOyB9CisgICAgdW5zaWduZWQgc3RhcnRDb2x1bW4oKSBjb25zdCB7IHJl
dHVybiBtX3N0YXJ0Q29sdW1uOyB9CisgICAgdW5zaWduZWQgZW5kQ29sdW1uKCkgY29uc3QgeyBy
ZXR1cm4gbV9lbmRDb2x1bW47IH0KKyAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nU3RhcnRPZmZz
ZXQoKSBjb25zdCB7IHJldHVybiBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldDsgfQorICAgIHVu
c2lnbmVkIHR5cGVQcm9maWxpbmdFbmRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3R5cGVQcm9m
aWxpbmdFbmRPZmZzZXQ7IH0KKworICAgIGJvb2wgdXNlc0V2YWwoKSBjb25zdCB7IHJldHVybiBt
X2ZlYXR1cmVzICYgRXZhbEZlYXR1cmU7IH0KKyAgICBib29sIHVzZXNBcmd1bWVudHMoKSBjb25z
dCB7IHJldHVybiBtX2ZlYXR1cmVzICYgQXJndW1lbnRzRmVhdHVyZTsgfQorICAgIGJvb2wgaXNB
cnJvd0Z1bmN0aW9uQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1faXNBcnJvd0Z1bmN0aW9uQ29u
dGV4dDsgfQorICAgIGJvb2wgaXNTdHJpY3RNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJl
cyAmIFN0cmljdE1vZGVGZWF0dXJlOyB9CisgICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRD
b250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWRDb250ZXh0VHlw
ZT4obV9kZXJpdmVkQ29udGV4dFR5cGUpOyB9CisgICAgRXZhbENvbnRleHRUeXBlIGV2YWxDb250
ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEV2YWxDb250ZXh0VHlwZT4obV9l
dmFsQ29udGV4dFR5cGUpOyB9CisKKyAgICBFQ01BTW9kZSBlY21hTW9kZSgpIGNvbnN0IHsgcmV0
dXJuIGlzU3RyaWN0TW9kZSgpID8gU3RyaWN0TW9kZSA6IE5vdFN0cmljdE1vZGU7IH0KKyAgICAg
ICAgCisgICAgdm9pZCBzZXROZXZlcklubGluZShib29sIHZhbHVlKSB7IG1fbmV2ZXJJbmxpbmUg
PSB2YWx1ZTsgfQorICAgIHZvaWQgc2V0TmV2ZXJPcHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2
ZXJPcHRpbWl6ZSA9IHZhbHVlOyB9CisgICAgdm9pZCBzZXROZXZlckZUTE9wdGltaXplKGJvb2wg
dmFsdWUpIHsgbV9uZXZlckZUTE9wdGltaXplID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldERpZFRy
eVRvRW50ZXJJbkxvb3AoYm9vbCB2YWx1ZSkgeyBtX2RpZFRyeVRvRW50ZXJJbkxvb3AgPSB2YWx1
ZTsgfQorICAgIHZvaWQgc2V0Q2FuVXNlT1NSRXhpdEZ1enppbmcoYm9vbCB2YWx1ZSkgeyBtX2Nh
blVzZU9TUkV4aXRGdXp6aW5nID0gdmFsdWU7IH0KKyAgICBib29sIG5ldmVySW5saW5lKCkgY29u
c3QgeyByZXR1cm4gbV9uZXZlcklubGluZTsgfQorICAgIGJvb2wgbmV2ZXJPcHRpbWl6ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fbmV2ZXJPcHRpbWl6ZTsgfQorICAgIGJvb2wgbmV2ZXJGVExPcHRpbWl6
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJGVExPcHRpbWl6ZTsgfQorICAgIGJvb2wgZGlkVHJ5
VG9FbnRlckluTG9vcCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlkVHJ5VG9FbnRlckluTG9vcDsgfQor
ICAgIGJvb2wgaXNJbmxpbmluZ0NhbmRpZGF0ZSgpIGNvbnN0IHsgcmV0dXJuICFuZXZlcklubGlu
ZSgpOyB9CisgICAgYm9vbCBpc09rVG9PcHRpbWl6ZSgpIGNvbnN0IHsgcmV0dXJuICFuZXZlck9w
dGltaXplKCk7IH0KKyAgICBib29sIGNhblVzZU9TUkV4aXRGdXp6aW5nKCkgY29uc3QgeyByZXR1
cm4gbV9jYW5Vc2VPU1JFeGl0RnV6emluZzsgfQorICAgIAorICAgIGJvb2wqIGFkZHJlc3NPZkRp
ZFRyeVRvRW50ZXJJbkxvb3AoKSB7IHJldHVybiAmbV9kaWRUcnlUb0VudGVySW5Mb29wOyB9CisK
KyAgICBDb2RlRmVhdHVyZXMgZmVhdHVyZXMoKSBjb25zdCB7IHJldHVybiBtX2ZlYXR1cmVzOyB9
CisgICAgICAgIAorICAgIERFQ0xBUkVfRVhQT1JUX0lORk87CisKKyAgICB2b2lkIHJlY29yZFBh
cnNlKENvZGVGZWF0dXJlcyBmZWF0dXJlcywgYm9vbCBoYXNDYXB0dXJlZFZhcmlhYmxlcywgaW50
IGZpcnN0TGluZSwgaW50IGxhc3RMaW5lLCB1bnNpZ25lZCBzdGFydENvbHVtbiwgdW5zaWduZWQg
ZW5kQ29sdW1uKQorICAgIHsKKyAgICAgICAgbV9mZWF0dXJlcyA9IGZlYXR1cmVzOworICAgICAg
ICBtX2hhc0NhcHR1cmVkVmFyaWFibGVzID0gaGFzQ2FwdHVyZWRWYXJpYWJsZXM7CisgICAgICAg
IG1fZmlyc3RMaW5lID0gZmlyc3RMaW5lOworICAgICAgICBtX2xhc3RMaW5lID0gbGFzdExpbmU7
CisgICAgICAgIEFTU0VSVChzdGFydENvbHVtbiAhPSBVSU5UX01BWCk7CisgICAgICAgIG1fc3Rh
cnRDb2x1bW4gPSBzdGFydENvbHVtbjsKKyAgICAgICAgQVNTRVJUKGVuZENvbHVtbiAhPSBVSU5U
X01BWCk7CisgICAgICAgIG1fZW5kQ29sdW1uID0gZW5kQ29sdW1uOworICAgIH0KKworICAgIHZv
aWQgaW5zdGFsbENvZGUoQ29kZUJsb2NrKik7CisgICAgdm9pZCBpbnN0YWxsQ29kZShWTSYsIENv
ZGVCbG9jayosIENvZGVUeXBlLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKKyAgICBDb2RlQmxv
Y2sqIG5ld0NvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBKU0Z1bmN0aW9uKiwg
SlNTY29wZSosIEpTT2JqZWN0KiYgZXhjZXB0aW9uKTsKKyAgICBDb2RlQmxvY2sqIG5ld1JlcGxh
Y2VtZW50Q29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOworCisgICAgLy8gVGhp
cyBmdW5jdGlvbiBoYXMgYW4gaW50ZXJlc3RpbmcgR0Mgc3RvcnkuIENhbGxlcnMgb2YgdGhpcyBm
dW5jdGlvbiBhcmUgYXNraW5nIHVzIHRvIGNyZWF0ZSBhIENvZGVCbG9jaworICAgIC8vIHRoYXQg
aXMgbm90IGpldHRpc29uZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gQ2FsbGVycyBh
cmUgZXNzZW50aWFsbHkgYXNraW5nIGZvciBhIHN0cm9uZyByZWZlcmVuY2UKKyAgICAvLyB0byB0
aGUgQ29kZUJsb2NrLiBCZWNhdXNlIHRoZSBFeGVjdXRhYmxlIG1heSBiZSBhbGxvY2F0aW5nIHRo
ZSBDb2RlQmxvY2ssIHdlIHJlcXVpcmUgY2FsbGVycyB0byBwYXNzIGluCisgICAgLy8gdGhlaXIg
Q29kZUJsb2NrKiYgcmVmZXJlbmNlIGJlY2F1c2UgaXQncyBzYWZlIGZvciBDb2RlQmxvY2sgdG8g
YmUgamV0dGlzb25lZCBpZiBFeGVjdXRhYmxlIGlzIHRoZSBvbmx5IHRoaW5nCisgICAgLy8gdG8g
cG9pbnQgdG8gaXQuIFRoaXMgZm9yY2VzIGNhbGxlcnMgdG8gaGF2ZSBhIENvZGVCbG9jayogaW4g
YSByZWdpc3RlciBvciBvbiB0aGUgc3RhY2sgdGhhdCB3aWxsIGJlIG1hcmtlZAorICAgIC8vIGJ5
IGNvbnNlcnZhdGl2ZSBHQyBpZiBhIEdDIGhhcHBlbnMgYWZ0ZXIgd2UgY3JlYXRlIHRoZSBDb2Rl
QmxvY2suCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgorICAgIEpTT2Jq
ZWN0KiBwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJiwgSlNGdW5jdGlvbiosIEpTU2NvcGUqLCBDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2spOworCisgICAg
dGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3I+IHZvaWQgZm9yRWFjaENvZGVCbG9jayhGdW5jdG9y
JiYpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBK
U09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoVk0mLCBKU0Z1bmN0aW9uKiwgSlNTY29w
ZSosIENvZGVTcGVjaWFsaXphdGlvbktpbmQsIENvZGVCbG9jayomKTsKKworcHJvdGVjdGVkOgor
ICAgIFNjcmlwdEV4ZWN1dGFibGUoU3RydWN0dXJlKiwgVk0mLCBjb25zdCBTb3VyY2VDb2RlJiwg
Ym9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzSW5BcnJv
d0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlLCBJbnRyaW5zaWMpOworCisgICAgdm9p
ZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0pCisgICAgeworICAgICAgICBCYXNlOjpmaW5pc2hDcmVh
dGlvbih2bSk7CisgICAgICAgIHZtLmhlYXAuYWRkRXhlY3V0YWJsZSh0aGlzKTsgLy8gQmFsYW5j
ZWQgYnkgSGVhcDo6ZGVsZXRlVW5tYXJrZWRDb21waWxlZENvZGUoKS4KKworI2lmIEVOQUJMRShD
T0RFQkxPQ0tfU0FNUExJTkcpCisgICAgICAgIGlmIChTYW1wbGluZ1Rvb2wqIHNhbXBsZXIgPSB2
bS5pbnRlcnByZXRlci0+c2FtcGxlcigpKQorICAgICAgICAgICAgc2FtcGxlci0+bm90aWZ5T2ZT
Y29wZSh2bSwgdGhpcyk7CisjZW5kaWYKKyAgICB9CisKKyAgICBDb2RlRmVhdHVyZXMgbV9mZWF0
dXJlczsKKyAgICBib29sIG1fZGlkVHJ5VG9FbnRlckluTG9vcDsKKyAgICBib29sIG1faGFzQ2Fw
dHVyZWRWYXJpYWJsZXMgOiAxOworICAgIGJvb2wgbV9uZXZlcklubGluZSA6IDE7CisgICAgYm9v
bCBtX25ldmVyT3B0aW1pemUgOiAxOworICAgIGJvb2wgbV9uZXZlckZUTE9wdGltaXplIDogMTsK
KyAgICBib29sIG1faXNBcnJvd0Z1bmN0aW9uQ29udGV4dCA6IDE7CisgICAgYm9vbCBtX2NhblVz
ZU9TUkV4aXRGdXp6aW5nIDogMTsKKyAgICB1bnNpZ25lZCBtX2Rlcml2ZWRDb250ZXh0VHlwZSA6
IDI7IC8vIERlcml2ZWRDb250ZXh0VHlwZQorICAgIHVuc2lnbmVkIG1fZXZhbENvbnRleHRUeXBl
IDogMjsgLy8gRXZhbENvbnRleHRUeXBlCisKKyAgICBpbnQgbV9vdmVycmlkZUxpbmVOdW1iZXI7
CisgICAgaW50IG1fZmlyc3RMaW5lOworICAgIGludCBtX2xhc3RMaW5lOworICAgIHVuc2lnbmVk
IG1fc3RhcnRDb2x1bW47CisgICAgdW5zaWduZWQgbV9lbmRDb2x1bW47CisgICAgdW5zaWduZWQg
bV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7CisgICAgdW5zaWduZWQgbV90eXBlUHJvZmlsaW5n
RW5kT2Zmc2V0OworICAgIFNvdXJjZUNvZGUgbV9zb3VyY2U7Cit9OworCitjbGFzcyBFdmFsRXhl
Y3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xh
c3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5cGVkZWYgU2NyaXB0RXhl
Y3V0YWJsZSBCYXNlOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9
IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKKworICAgIHN0YXRp
YyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBFdmFsQ29kZUJsb2NrKiBjb2RlQmxvY2so
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZXZhbENvZGVCbG9jay5nZXQoKTsKKyAgICB9CisK
KyAgICBzdGF0aWMgRXZhbEV4ZWN1dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqLCBjb25zdCBTb3Vy
Y2VDb2RlJiwgYm9vbCBpc0luU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlLCBib29s
IGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSwgY29uc3QgVmFyaWFibGVF
bnZpcm9ubWVudCopOworCisgICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2Rl
KCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOworICAg
IH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xv
YmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAgICBy
ZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZv
KEV2YWxFeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOworICAgIH0KKyAg
ICAgICAgCisgICAgREVDTEFSRV9JTkZPOworCisgICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJs
ZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmlj
dE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2Ny
aXB0TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9k
ZTo6UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250
ZXh0KCksIGZhbHNlLCBldmFsQ29udGV4dFR5cGUoKSk7IH0KKworICAgIHVuc2lnbmVkIG51bVZh
cmlhYmxlcygpIHsgcmV0dXJuIG1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLT5udW1WYXJpYWJsZXMo
KTsgfQorICAgIHVuc2lnbmVkIG51bWJlck9mRnVuY3Rpb25EZWNscygpIHsgcmV0dXJuIG1fdW5s
aW5rZWRFdmFsQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgfQorCitwcml2YXRl
OgorICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKKyAgICBmcmllbmQgY2xhc3MgU2Ny
aXB0RXhlY3V0YWJsZTsKKworICAgIEV2YWxFeGVjdXRhYmxlKEV4ZWNTdGF0ZSosIGNvbnN0IFNv
dXJjZUNvZGUmLCBib29sIGluU3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlLCBib29s
IGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSk7CisKKyAgICBzdGF0aWMg
dm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CisKKyAgICBXcml0ZUJh
cnJpZXI8RXZhbENvZGVCbG9jaz4gbV9ldmFsQ29kZUJsb2NrOworICAgIFdyaXRlQmFycmllcjxV
bmxpbmtlZEV2YWxDb2RlQmxvY2s+IG1fdW5saW5rZWRFdmFsQ29kZUJsb2NrOworfTsKKworY2xh
c3MgUHJvZ3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Cisg
ICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoKKyAgICB0eXBl
ZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3Ry
dWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7
CisKKyAgICBzdGF0aWMgUHJvZ3JhbUV4ZWN1dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSkKKyAgICB7CisgICAgICAgIFByb2dyYW1FeGVjdXRh
YmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8UHJvZ3JhbUV4ZWN1
dGFibGU+KCpleGVjLT5oZWFwKCkpKSBQcm9ncmFtRXhlY3V0YWJsZShleGVjLCBzb3VyY2UpOwor
ICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbihleGVjLT52bSgpKTsKKyAgICAgICAg
cmV0dXJuIGV4ZWN1dGFibGU7CisgICAgfQorCisKKyAgICBKU09iamVjdCogaW5pdGlhbGl6ZUds
b2JhbFByb3BlcnRpZXMoVk0mLCBDYWxsRnJhbWUqLCBKU1Njb3BlKik7CisKKyAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAgUHJvZ3JhbUNvZGVCbG9jayogY29kZUJsb2Nr
KCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3Byb2dyYW1Db2RlQmxvY2suZ2V0KCk7CisgICAg
fQorCisgICAgSlNPYmplY3QqIGNoZWNrU3ludGF4KEV4ZWNTdGF0ZSopOworCisgICAgUGFzc1Jl
ZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBn
ZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOworICAgIH0KKyAgICAgICAgCisgICAgc3RhdGljIFN0
cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9i
amVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNy
ZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oUHJvZ3JhbUV4ZWN1dGFibGVU
eXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAgfQorICAgICAgICAKKyAgICBERUNM
QVJFX0lORk87CisKKyAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsg
cmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwg
ZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpDbGFzc2lj
LCBTdXBlckJpbmRpbmc6Ok5vdE5lZWRlZCwgU291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwg
ZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2
YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhl
Y3V0YWJsZUJhc2U7CisgICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7CisKKyAgICBQ
cm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7CisKKyAgICBz
dGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CisKKyAgICBX
cml0ZUJhcnJpZXI8VW5saW5rZWRQcm9ncmFtQ29kZUJsb2NrPiBtX3VubGlua2VkUHJvZ3JhbUNv
ZGVCbG9jazsKKyAgICBXcml0ZUJhcnJpZXI8UHJvZ3JhbUNvZGVCbG9jaz4gbV9wcm9ncmFtQ29k
ZUJsb2NrOworfTsKKworY2xhc3MgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUgZmluYWwgOiBwdWJs
aWMgU2NyaXB0RXhlY3V0YWJsZSB7CisgICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJh
Y3RvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFn
cyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMgTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUqIGNyZWF0ZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJik7CisKKyAgICBzdGF0
aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayog
Y29kZUJsb2NrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX21vZHVsZVByb2dyYW1Db2RlQmxv
Y2suZ2V0KCk7CisgICAgfQorCisgICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRD
b2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwor
ICAgIH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpT
R2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAg
ICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJ
bmZvKE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkp
OworICAgIH0KKworICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1
dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNT
dHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNl
clNjcmlwdE1vZGU6Ok1vZHVsZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNl
TW9kZTo6TW9kdWxlRXZhbHVhdGVNb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1
bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lKTsgfQorCisgICAg
VW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiB1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2soKSB7IHJldHVybiBtX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsg
fQorCisgICAgU3ltYm9sVGFibGUqIG1vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUoKSB7IHJl
dHVybiBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUuZ2V0KCk7IH0KKworcHJpdmF0ZToK
KyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgZnJpZW5kIGNsYXNzIFNjcmlw
dEV4ZWN1dGFibGU7CisKKyAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBj
b25zdCBTb3VyY2VDb2RlJik7CisKKyAgICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2Vs
bCosIFNsb3RWaXNpdG9yJik7CisKKyAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrPiBtX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKKyAgICBXcml0
ZUJhcnJpZXI8U3ltYm9sVGFibGU+IG1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZTsKKyAg
ICBXcml0ZUJhcnJpZXI8TW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV9tb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrOworfTsKKworY2xhc3MgRnVuY3Rpb25FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNj
cmlwdEV4ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBKSVQ7CisgICAgZnJpZW5kIGNsYXNz
IExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1
dGFibGUgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBC
YXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMg
RnVuY3Rpb25FeGVjdXRhYmxlKiBjcmVhdGUoCisgICAgICAgIFZNJiB2bSwgY29uc3QgU291cmNl
Q29kZSYgc291cmNlLCBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRh
YmxlLCAKKyAgICAgICAgdW5zaWduZWQgZmlyc3RMaW5lLCB1bnNpZ25lZCBsYXN0TGluZSwgdW5z
aWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVkIGVuZENvbHVtbiwgSW50cmluc2ljIGludHJpbnNp
YykKKyAgICB7CisgICAgICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAo
Tm90TnVsbCwgYWxsb2NhdGVDZWxsPEZ1bmN0aW9uRXhlY3V0YWJsZT4odm0uaGVhcCkpIEZ1bmN0
aW9uRXhlY3V0YWJsZSh2bSwgc291cmNlLCB1bmxpbmtlZEV4ZWN1dGFibGUsIGZpcnN0TGluZSwg
bGFzdExpbmUsIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4sIGludHJpbnNpYyk7CisgICAgICAgIGV4
ZWN1dGFibGUtPmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7
CisgICAgfQorICAgIHN0YXRpYyBGdW5jdGlvbkV4ZWN1dGFibGUqIGZyb21HbG9iYWxDb2RlKAor
ICAgICAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmLCBjb25zdCBTb3VyY2VD
b2RlJiwgCisgICAgICAgIEpTT2JqZWN0KiYgZXhjZXB0aW9uLCBpbnQgb3ZlcnJpZGVMaW5lTnVt
YmVyKTsKKworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisgICAgICAgIAorICAg
IFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLmdldCgpOworICAgIH0K
KworICAgIC8vIFJldHVybnMgZWl0aGVyIGNhbGwgb3IgY29uc3RydWN0IGJ5dGVjb2RlLiBUaGlz
IGNhbiBiZSBhcHByb3ByaWF0ZQorICAgIC8vIGZvciBhbnN3ZXJpbmcgcXVlc3Rpb25zIHRoYXQg
dGhhdCBkb24ndCB2YXJ5IGJldHdlZW4gY2FsbCBhbmQgY29uc3RydWN0IC0tCisgICAgLy8gZm9y
IGV4YW1wbGUsIGFyZ3VtZW50c1JlZ2lzdGVyKCkuCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGVp
dGhlckNvZGVCbG9jaygpCisgICAgeworICAgICAgICBpZiAobV9jb2RlQmxvY2tGb3JDYWxsKQor
ICAgICAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICAgICAgcmV0
dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOworICAgIH0KKyAgICAgICAgCisgICAg
Ym9vbCBpc0dlbmVyYXRlZEZvckNhbGwoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICEh
bV9jb2RlQmxvY2tGb3JDYWxsOworICAgIH0KKworICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2Rl
QmxvY2tGb3JDYWxsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwu
Z2V0KCk7CisgICAgfQorCisgICAgYm9vbCBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Cisg
ICAgfQorCisgICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvckNvbnN0cnVjdCgpCisg
ICAgeworICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAg
fQorICAgICAgICAKKyAgICBib29sIGlzR2VuZXJhdGVkRm9yKENvZGVTcGVjaWFsaXphdGlvbktp
bmQga2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAg
ICAgICAgcmV0dXJuIGlzR2VuZXJhdGVkRm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2luZCA9
PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVkRm9yQ29uc3Ry
dWN0KCk7CisgICAgfQorICAgICAgICAKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2Nr
Rm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5k
ID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0dXJuIGNvZGVCbG9ja0ZvckNhbGwoKTsK
KyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVy
biBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbkNvZGVCbG9j
ayogYmFzZWxpbmVDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7CisgICAgICAg
IAorICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9ja0ZvcihDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gYmFzZWxpbmVDb2RlQmxv
Y2tGb3Ioa2luZCk7CisgICAgfQorCisgICAgUmVmUHRyPFR5cGVTZXQ+IHJldHVyblN0YXRlbWVu
dFR5cGVTZXQoKSAKKyAgICB7CisgICAgICAgIGlmICghbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0
KQorICAgICAgICAgICAgbV9yZXR1cm5TdGF0ZW1lbnRUeXBlU2V0ID0gVHlwZVNldDo6Y3JlYXRl
KCk7CisKKyAgICAgICAgcmV0dXJuIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldDsKKyAgICB9Cisg
ICAgICAgIAorICAgIEZ1bmN0aW9uTW9kZSBmdW5jdGlvbk1vZGUoKSB7IHJldHVybiBtX3VubGlu
a2VkRXhlY3V0YWJsZS0+ZnVuY3Rpb25Nb2RlKCk7IH0KKyAgICBib29sIGlzQnVpbHRpbkZ1bmN0
aW9uKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmlzQnVpbHRpbkZ1bmN0
aW9uKCk7IH0KKyAgICBDb25zdHJ1Y3RBYmlsaXR5IGNvbnN0cnVjdEFiaWxpdHkoKSBjb25zdCB7
IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+Y29uc3RydWN0QWJpbGl0eSgpOyB9CisgICAg
Ym9vbCBpc0NsYXNzKCkgY29uc3QgeyByZXR1cm4gIWNsYXNzU291cmNlKCkuaXNOdWxsKCk7IH0K
KyAgICBib29sIGlzQXJyb3dGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09
IFNvdXJjZVBhcnNlTW9kZTo6QXJyb3dGdW5jdGlvbk1vZGU7IH0KKyAgICBib29sIGlzR2V0dGVy
KCkgY29uc3QgeyByZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpHZXR0ZXJN
b2RlOyB9CisgICAgYm9vbCBpc1NldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09
IFNvdXJjZVBhcnNlTW9kZTo6U2V0dGVyTW9kZTsgfQorICAgIGJvb2wgaXNHZW5lcmF0b3IoKSBj
b25zdCB7IHJldHVybiBTb3VyY2VQYXJzZU1vZGVTZXQoU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0
b3JCb2R5TW9kZSwgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2Rl
KS5jb250YWlucyhwYXJzZU1vZGUoKSk7IH0KKyAgICBib29sIGlzTWV0aG9kKCkgY29uc3QgeyBy
ZXR1cm4gcGFyc2VNb2RlKCkgPT0gU291cmNlUGFyc2VNb2RlOjpNZXRob2RNb2RlOyB9CisgICAg
Ym9vbCBoYXNDYWxsZXJBbmRBcmd1bWVudHNQcm9wZXJ0aWVzKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIC8vIFBlciBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3JiaWRkZW4t
ZXh0ZW5zaW9ucywgb25seSBzbG9wcHktbW9kZSBub24tYnVpbHRpbiBmdW5jdGlvbnMgaW4gb2xk
LXN0eWxlIChwcmUtRVM2KSBzeW50YWN0aWMgZm9ybXMgY2FuIGNvbnRhaW4KKyAgICAgICAgLy8g
ImNhbGxlciIgYW5kICJhcmd1bWVudHMiLgorICAgICAgICByZXR1cm4gIWlzU3RyaWN0TW9kZSgp
ICYmIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6Tm9ybWFsRnVuY3Rpb25Nb2RlICYm
ICFpc0NsYXNzQ29uc3RydWN0b3JGdW5jdGlvbigpOworICAgIH0KKyAgICBib29sIGhhc1Byb3Rv
dHlwZVByb3BlcnR5KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBTb3VyY2VQYXJzZU1v
ZGVTZXQoCisgICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSwK
KyAgICAgICAgICAgIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsCisgICAgICAg
ICAgICBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvcldyYXBwZXJGdW5jdGlvbk1vZGUKKyAgICAg
ICAgKS5jb250YWlucyhwYXJzZU1vZGUoKSkgfHwgaXNDbGFzcygpOworICAgIH0KKyAgICBEZXJp
dmVkQ29udGV4dFR5cGUgZGVyaXZlZENvbnRleHRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV91bmxp
bmtlZEV4ZWN1dGFibGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpOyB9CisgICAgYm9vbCBpc0NsYXNz
Q29uc3RydWN0b3JGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5pc0NsYXNzQ29uc3RydWN0b3JGdW5jdGlvbigpOyB9CisgICAgY29uc3QgSWRlbnRpZmllciYg
bmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5uYW1lKCk7IH0KKyAgICBjb25z
dCBJZGVudGlmaWVyJiBlY21hTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5l
Y21hTmFtZSgpOyB9CisgICAgY29uc3QgSWRlbnRpZmllciYgaW5mZXJyZWROYW1lKCkgeyByZXR1
cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmluZmVycmVkTmFtZSgpOyB9CisgICAgdW5zaWduZWQg
cGFyYW1ldGVyQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+cGFy
YW1ldGVyQ291bnQoKTsgfSAvLyBFeGNsdWRpbmcgJ3RoaXMnIQorICAgIHVuc2lnbmVkIGZ1bmN0
aW9uTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9u
TGVuZ3RoKCk7IH0KKyAgICBTb3VyY2VQYXJzZU1vZGUgcGFyc2VNb2RlKCkgY29uc3QgeyByZXR1
cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcnNlTW9kZSgpOyB9CisgICAgSlNQYXJzZXJTY3Jp
cHRNb2RlIHNjcmlwdE1vZGUoKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+
c2NyaXB0TW9kZSgpOyB9CisgICAgY29uc3QgU291cmNlQ29kZSYgY2xhc3NTb3VyY2UoKSBjb25z
dCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+Y2xhc3NTb3VyY2UoKTsgfQorCisgICAg
c3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworICAgIHN0
YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBn
bG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAgICByZXR1cm4gU3RydWN0
dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKEZ1bmN0aW9uRXhl
Y3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKKyAgICB9CisKKyAgICB1bnNp
Z25lZCBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3BhcmFtZXRlcnNT
dGFydE9mZnNldDsgfQorCisgICAgdm9pZCBvdmVycmlkZVBhcmFtZXRlckFuZFR5cGVQcm9maWxp
bmdTdGFydEVuZE9mZnNldHModW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0LCB1bnNpZ25l
ZCB0eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIHVuc2lnbmVkIHR5cGVQcm9maWxpbmdFbmRPZmZz
ZXQpCisgICAgeworICAgICAgICBtX3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHBhcmFtZXRlcnNT
dGFydE9mZnNldDsKKyAgICAgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSB0eXBlUHJv
ZmlsaW5nU3RhcnRPZmZzZXQ7CisgICAgICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCA9IHR5
cGVQcm9maWxpbmdFbmRPZmZzZXQ7CisgICAgfQorCisgICAgREVDTEFSRV9JTkZPOworCisgICAg
SW5mZXJyZWRWYWx1ZSogc2luZ2xldG9uRnVuY3Rpb24oKSB7IHJldHVybiBtX3NpbmdsZXRvbkZ1
bmN0aW9uLmdldCgpOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVC
YXNlOworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSgKKyAgICAgICAgVk0mLCBjb25zdCBTb3VyY2VD
b2RlJiwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqLCB1bnNpZ25lZCBmaXJzdExpbmUsIAor
ICAgICAgICB1bnNpZ25lZCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2lnbmVk
IGVuZENvbHVtbiwgSW50cmluc2ljKTsKKyAgICAKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZN
Jik7CisKKyAgICBmcmllbmQgY2xhc3MgU2NyaXB0RXhlY3V0YWJsZTsKKyAgICAKKyAgICB1bnNp
Z25lZCBtX3BhcmFtZXRlcnNTdGFydE9mZnNldDsKKyAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGU+IG1fdW5saW5rZWRFeGVjdXRhYmxlOworICAgIFdyaXRlQmFycmll
cjxGdW5jdGlvbkNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOworICAgIFdyaXRlQmFycmll
cjxGdW5jdGlvbkNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3Q7CisgICAgUmVmUHRy
PFR5cGVTZXQ+IG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldDsKKyAgICBXcml0ZUJhcnJpZXI8SW5m
ZXJyZWRWYWx1ZT4gbV9zaW5nbGV0b25GdW5jdGlvbjsKK307CisKKyNpZiBFTkFCTEUoV0VCQVNT
RU1CTFkpCitjbGFzcyBXZWJBc3NlbWJseUV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgRXhlY3V0
YWJsZUJhc2UgeworcHVibGljOgorICAgIHR5cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKKyAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVG
bGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CisKKyAgICBzdGF0aWMgV2ViQXNzZW1ibHlFeGVj
dXRhYmxlKiBjcmVhdGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIEpTV2FzbU1v
ZHVsZSogbW9kdWxlLCB1bnNpZ25lZCBmdW5jdGlvbkluZGV4KQorICAgIHsKKyAgICAgICAgV2Vi
QXNzZW1ibHlFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNl
bGw8V2ViQXNzZW1ibHlFeGVjdXRhYmxlPih2bS5oZWFwKSkgV2ViQXNzZW1ibHlFeGVjdXRhYmxl
KHZtLCBzb3VyY2UsIG1vZHVsZSwgZnVuY3Rpb25JbmRleCk7CisgICAgICAgIGV4ZWN1dGFibGUt
PmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7CisgICAgfQor
CisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxP
YmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykKKyAgICB7CisgICAgICAgIHJldHVy
biBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oV2Vi
QXNzZW1ibHlFeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOworICAgIH0K
KworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBERUNMQVJFX0lORk87
CisKKyAgICB2b2lkIHByZXBhcmVGb3JFeGVjdXRpb24oVk0mKTsKKworICAgIFdlYkFzc2VtYmx5
Q29kZUJsb2NrKiBjb2RlQmxvY2tGb3JDYWxsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2Nv
ZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBFeGVjdXRhYmxlQmFzZTsKKyAgICBXZWJBc3NlbWJseUV4ZWN1dGFibGUoVk0mLCBjb25zdCBT
b3VyY2VDb2RlJiwgSlNXYXNtTW9kdWxlKiwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCk7CisKKyAg
ICBzdGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CisKKyAg
ICBTb3VyY2VDb2RlIG1fc291cmNlOworICAgIFdyaXRlQmFycmllcjxKU1dhc21Nb2R1bGU+IG1f
bW9kdWxlOworICAgIHVuc2lnbmVkIG1fZnVuY3Rpb25JbmRleDsKKworICAgIFdyaXRlQmFycmll
cjxXZWJBc3NlbWJseUNvZGVCbG9jaz4gbV9jb2RlQmxvY2tGb3JDYWxsOworfTsKKyNlbmRpZgor
Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXhlY3V0YWJsZVR5cGU+CitKU09iamVjdCogU2NyaXB0RXhl
Y3V0YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbihWTSYgdm0sIEpTRnVuY3Rpb24qIGZ1bmN0aW9u
LCBKU1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBDb2RlQmxvY2sq
JiByZXN1bHRDb2RlQmxvY2spCit7CisgICAgaWYgKGhhc0pJVENvZGVGb3Ioa2luZCkpIHsKKyAg
ICAgICAgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRXZhbEV4ZWN1dGFibGU+Ojp2
YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihq
c0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOworICAgICAgICBlbHNl
IGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIFByb2dyYW1FeGVjdXRhYmxlPjo6dmFs
dWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanND
YXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKKyAgICAgICAgZWxz
ZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9j
ayo+KGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7
CisgICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRnVuY3Rpb25F
eGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8
Q29kZUJsb2NrKj4oanNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2tG
b3Ioa2luZCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHBy
ZXBhcmVGb3JFeGVjdXRpb25JbXBsKHZtLCBmdW5jdGlvbiwgc2NvcGUsIGtpbmQsIHJlc3VsdENv
ZGVCbG9jayk7Cit9CisKK30gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvU2NyaXB0RXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL1NjcmlwdEV4ZWN1dGFibGUuaAkocmV2aXNpb24gMjA3Nzkw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU2NyaXB0RXhlY3V0YWJsZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yNSwyNzggKzI1LDEwIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5j
bHVkZSAiQXJpdHlDaGVja01vZGUuaCIKLSNpbmNsdWRlICJDYWxsRGF0YS5oIgotI2luY2x1ZGUg
IkNvZGVCbG9ja0hhc2guaCIKLSNpbmNsdWRlICJDb2RlU3BlY2lhbGl6YXRpb25LaW5kLmgiCi0j
aW5jbHVkZSAiQ29tcGlsYXRpb25SZXN1bHQuaCIKLSNpbmNsdWRlICJFeGVjdXRhYmxlSW5mby5o
IgotI2luY2x1ZGUgIkhhbmRsZXJJbmZvLmgiCi0jaW5jbHVkZSAiSW5mZXJyZWRWYWx1ZS5oIgot
I2luY2x1ZGUgIkpJVENvZGUuaCIKLSNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgotI2luY2x1
ZGUgIlNvdXJjZUNvZGUuaCIKLSNpbmNsdWRlICJUeXBlU2V0LmgiCi0jaW5jbHVkZSAiVW5saW5r
ZWRDb2RlQmxvY2suaCIKLSNpbmNsdWRlICJVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS5oIgor
I2luY2x1ZGUgIkV4ZWN1dGFibGVCYXNlLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCi1jbGFzcyBD
b2RlQmxvY2s7Ci1jbGFzcyBFdmFsQ29kZUJsb2NrOwotY2xhc3MgRnVuY3Rpb25Db2RlQmxvY2s7
Ci1jbGFzcyBKU1Njb3BlOwotY2xhc3MgSlNXYXNtTW9kdWxlOwotY2xhc3MgTExJbnRPZmZzZXRz
RXh0cmFjdG9yOwotY2xhc3MgTW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLWNsYXNzIFByb2dyYW1D
b2RlQmxvY2s7Ci1jbGFzcyBXZWJBc3NlbWJseUNvZGVCbG9jazsKLQotZW51bSBDb21waWxhdGlv
bktpbmQgeyBGaXJzdENvbXBpbGF0aW9uLCBPcHRpbWl6aW5nQ29tcGlsYXRpb24gfTsKLQotaW5s
aW5lIGJvb2wgaXNDYWxsKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsKLSAgICBpZiAo
a2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1jbGFzcyBF
eGVjdXRhYmxlQmFzZSA6IHB1YmxpYyBKU0NlbGwgewotICAgIGZyaWVuZCBjbGFzcyBKSVQ7Ci0K
LXByb3RlY3RlZDoKLSAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Qg
PSAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQgTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJTEVEID0g
LTE7Ci0KLSAgICBFeGVjdXRhYmxlQmFzZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBp
bnQgbnVtUGFyYW1ldGVycywgSW50cmluc2ljIGludHJpbnNpYykKLSAgICAgICAgOiBKU0NlbGwo
dm0sIHN0cnVjdHVyZSkKLSAgICAgICAgLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKG51bVBhcmFt
ZXRlcnMpCi0gICAgICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0KG51bVBhcmFtZXRl
cnMpCi0gICAgICAgICwgbV9pbnRyaW5zaWMoaW50cmluc2ljKQotICAgIHsKLSAgICB9Ci0KLSAg
ICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiB2bSkKLSAgICB7Ci0gICAgICAgIEJhc2U6OmZpbmlz
aENyZWF0aW9uKHZtKTsKLSAgICB9Ci0KLXB1YmxpYzoKLSAgICB0eXBlZGVmIEpTQ2VsbCBCYXNl
OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVj
dHVyZUZsYWdzOwotCi0gICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRy
dWU7Ci0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLSAgICAgICAgCi0gICAgQ29k
ZUJsb2NrSGFzaCBoYXNoRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpIGNvbnN0OwotCi0gICAg
Ym9vbCBpc0V2YWxFeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBl
KCkgPT0gRXZhbEV4ZWN1dGFibGVUeXBlOwotICAgIH0KLSAgICBib29sIGlzRnVuY3Rpb25FeGVj
dXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gRnVuY3Rpb25F
eGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0gICAgYm9vbCBpc1Byb2dyYW1FeGVjdXRhYmxlKCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGVUeXBl
OwotICAgIH0KLSAgICBib29sIGlzTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIHR5cGUoKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVR5cGU7Ci0gICAg
fQotCi0KLSAgICBib29sIGlzSG9zdEZ1bmN0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEFT
U0VSVCgobV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSA9
PSAobV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0ID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Qp
KTsKLSAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRF
UlNfSVNfSE9TVDsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCi0gICAgYm9vbCBp
c1dlYkFzc2VtYmx5RXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlw
ZSgpID09IFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBz
dGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKSB7IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2
bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oQ2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdz
KSwgaW5mbygpKTsgfQotICAgICAgICAKLSAgICB2b2lkIGNsZWFyQ29kZSgpOwotCi0gICAgREVD
TEFSRV9FWFBPUlRfSU5GTzsKLQotcHJvdGVjdGVkOgotICAgIGludCBtX251bVBhcmFtZXRlcnNG
b3JDYWxsOwotICAgIGludCBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3Q7Ci0KLXB1YmxpYzoK
LSAgICBQYXNzUmVmUHRyPEpJVENvZGU+IGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCkKLSAgICB7
Ci0gICAgICAgIEFTU0VSVChtX2ppdENvZGVGb3JDYWxsKTsKLSAgICAgICAgcmV0dXJuIG1faml0
Q29kZUZvckNhbGw7Ci0gICAgfQotCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRK
SVRDb2RlRm9yQ29uc3RydWN0KCkKLSAgICB7Ci0gICAgICAgIEFTU0VSVChtX2ppdENvZGVGb3JD
b25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gbV9qaXRDb2RlRm9yQ29uc3RydWN0OwotICAgIH0K
LSAgICAgICAgCi0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yKENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0gICAgICAgIGlmIChraW5kID09IENv
ZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDYWxsKCk7
Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1
cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgpOwotICAgIH0KLSAgICAKLSAgICBNYWNy
b0Fzc2VtYmxlckNvZGVQdHIgZW50cnlwb2ludEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQsIEFyaXR5Q2hlY2tNb2RlIGFyaXR5KQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgd2Ug
aGF2ZSBhIGNhY2hlZCByZXN1bHQuIFdlIG9ubHkgaGF2ZSBpdCBmb3IgYXJpdHkgY2hlY2sgYmVj
YXVzZSB3ZSB1c2UgdGhlCi0gICAgICAgIC8vIG5vLWFyaXR5IGVudHJ5cG9pbnQgaW4gbm9uLXZp
cnR1YWwgY2FsbHMsIHdoaWNoIHdpbGwgImNhY2hlIiB0aGlzIHZhbHVlIGRpcmVjdGx5IGluCi0g
ICAgICAgIC8vIG1hY2hpbmUgY29kZS4KLSAgICAgICAgaWYgKGFyaXR5ID09IE11c3RDaGVja0Fy
aXR5KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgQ29k
ZUZvckNhbGw6Ci0gICAgICAgICAgICAgICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29kZVB0ciByZXN1
bHQgPSBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2spCi0gICAgICAgICAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNl
IENvZGVGb3JDb25zdHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgaWYgKE1hY3JvQXNzZW1ibGVyQ29k
ZVB0ciByZXN1bHQgPSBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjaykKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVz
dWx0ID0KLSAgICAgICAgICAgIGdlbmVyYXRlZEpJVENvZGVGb3Ioa2luZCktPmFkZHJlc3NGb3JD
YWxsKGFyaXR5KTsKLSAgICAgICAgaWYgKGFyaXR5ID09IE11c3RDaGVja0FyaXR5KSB7Ci0gICAg
ICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0OyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIEpJ
VCdzIHZpcnR1YWwgY2FsbCBvcHRpbWl6YXRpb25zLgotICAgICAgICAgICAgc3dpdGNoIChraW5k
KSB7Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgICAgIG1faml0
Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgICAgICBt
X2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IHJlc3VsdDsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVz
dWx0OwotICAgIH0KLQotICAgIHN0YXRpYyBwdHJkaWZmX3Qgb2Zmc2V0T2ZKSVRDb2RlV2l0aEFy
aXR5Q2hlY2tGb3IoCi0gICAgICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7
Ci0gICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAg
ICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9qaXRDb2Rl
Rm9yQ2FsbFdpdGhBcml0eUNoZWNrKTsKLSAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0Ogot
ICAgICAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwgbV9qaXRD
b2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spOwotICAgICAgICB9Ci0gICAgICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAK
LSAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTnVtUGFyYW1ldGVyc0ZvcihDb2RlU3BlY2lh
bGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2Fs
bCkKLSAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1f
bnVtUGFyYW1ldGVyc0ZvckNhbGwpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29u
c3RydWN0KTsKLSAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihFeGVjdXRhYmxlQmFzZSwg
bV9udW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0KTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0pJVENv
ZGVGb3JDYWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNG
b3JDYWxsID49IDA7Ci0gICAgfQotICAgICAgICAKLSAgICBib29sIGhhc0pJVENvZGVGb3JDb25z
dHJ1Y3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbnVtUGFyYW1ldGVyc0ZvckNv
bnN0cnVjdCA+PSAwOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yKENv
ZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChraW5k
ID09IENvZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDYWxsKCk7
Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1
cm4gaGFzSklUQ29kZUZvckNvbnN0cnVjdCgpOwotICAgIH0KLQotICAgIC8vIEludHJpbnNpY3Mg
YXJlIG9ubHkgZm9yIGNhbGxzLCBjdXJyZW50bHkuCi0gICAgSW50cmluc2ljIGludHJpbnNpYygp
IGNvbnN0IHsgcmV0dXJuIG1faW50cmluc2ljOyB9Ci0gICAgICAgIAotICAgIEludHJpbnNpYyBp
bnRyaW5zaWNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKSBjb25zdAotICAgIHsKLSAg
ICAgICAgaWYgKGlzQ2FsbChraW5kKSkKLSAgICAgICAgICAgIHJldHVybiBpbnRyaW5zaWMoKTsK
LSAgICAgICAgcmV0dXJuIE5vSW50cmluc2ljOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGR1bXAo
UHJpbnRTdHJlYW0mKSBjb25zdDsKLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgSW50cmluc2lj
IG1faW50cmluc2ljOwotICAgIFJlZlB0cjxKSVRDb2RlPiBtX2ppdENvZGVGb3JDYWxsOwotICAg
IFJlZlB0cjxKSVRDb2RlPiBtX2ppdENvZGVGb3JDb25zdHJ1Y3Q7Ci0gICAgTWFjcm9Bc3NlbWJs
ZXJDb2RlUHRyIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjazsKLSAgICBNYWNyb0Fzc2Vt
YmxlckNvZGVQdHIgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2s7Ci19OwotCi1j
bGFzcyBOYXRpdmVFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLSAg
ICBmcmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0
b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBFeGVjdXRhYmxlQmFzZSBCYXNlOwotICAgIHN0YXRp
YyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0cnVjdHVyZUZsYWdzIHwg
U3RydWN0dXJlSXNJbW1vcnRhbDsKLQotICAgIHN0YXRpYyBOYXRpdmVFeGVjdXRhYmxlKiBjcmVh
dGUoVk0mIHZtLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNhbGxUaHVuaywgTmF0aXZlRnVuY3Rpb24g
ZnVuY3Rpb24sIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIE5hdGl2ZUZ1bmN0
aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMgaW50cmluc2ljLCBjb25zdCBTdHJpbmcmIG5hbWUp
OwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAgIENvZGVCbG9ja0hh
c2ggaGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIE5hdGl2ZUZ1
bmN0aW9uIGZ1bmN0aW9uKCkgeyByZXR1cm4gbV9mdW5jdGlvbjsgfQotICAgIE5hdGl2ZUZ1bmN0
aW9uIGNvbnN0cnVjdG9yKCkgeyByZXR1cm4gbV9jb25zdHJ1Y3RvcjsgfQotICAgICAgICAKLSAg
ICBOYXRpdmVGdW5jdGlvbiBuYXRpdmVGdW5jdGlvbkZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAg
ICAgIHJldHVybiBmdW5jdGlvbigpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29u
c3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKCk7Ci0gICAgfQotICAgICAgICAK
LSAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mTmF0aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNp
YWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNh
bGwpCi0gICAgICAgICAgICByZXR1cm4gT0JKRUNUX09GRlNFVE9GKE5hdGl2ZUV4ZWN1dGFibGUs
IG1fZnVuY3Rpb24pOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsK
LSAgICAgICAgcmV0dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2NvbnN0
cnVjdG9yKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUo
Vk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUgcHJvdG8pOwotICAgICAgICAKLSAgICBERUNM
QVJFX0lORk87Ci0KLSAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25h
bWU7IH0KLQotcHJvdGVjdGVkOgotICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mLCBQYXNzUmVm
UHRyPEpJVENvZGU+IGNhbGxUaHVuaywgUGFzc1JlZlB0cjxKSVRDb2RlPiBjb25zdHJ1Y3RUaHVu
aywgY29uc3QgU3RyaW5nJiBuYW1lKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhl
Y3V0YWJsZUJhc2U7Ci0KLSAgICBOYXRpdmVFeGVjdXRhYmxlKFZNJiwgTmF0aXZlRnVuY3Rpb24g
ZnVuY3Rpb24sIE5hdGl2ZUZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBJbnRyaW5zaWMpOwotCi0gICAg
TmF0aXZlRnVuY3Rpb24gbV9mdW5jdGlvbjsKLSAgICBOYXRpdmVGdW5jdGlvbiBtX2NvbnN0cnVj
dG9yOwotCi0gICAgU3RyaW5nIG1fbmFtZTsKLX07Ci0KIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGUg
OiBwdWJsaWMgRXhlY3V0YWJsZUJhc2UgewogcHVibGljOgogICAgIHR5cGVkZWYgRXhlY3V0YWJs
ZUJhc2UgQmFzZTsKQEAgLTQxNCwzNjUgKzE0Niw0IEBAIHByb3RlY3RlZDoKICAgICBTb3VyY2VD
b2RlIG1fc291cmNlOwogfTsKIAotY2xhc3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMg
U2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3Rv
cjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0
aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8
IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCop
OwotCi0gICAgRXZhbENvZGVCbG9jayogY29kZUJsb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVy
biBtX2V2YWxDb2RlQmxvY2suZ2V0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIEV2YWxFeGVjdXRh
YmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmlj
dENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
LCBFdmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKLQotICAgIFBh
c3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1
cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0
dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRl
KHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0
cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5G
TzsKLQotICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4g
RXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwg
Q29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVy
QmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVk
Q29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRl
eHRUeXBlKCkpOyB9Ci0KLSAgICB1bnNpZ25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3Vu
bGlua2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFibGVzKCk7IH0KLSAgICB1bnNpZ25lZCBudW1i
ZXJPZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVt
YmVyT2ZGdW5jdGlvbkRlY2xzKCk7IH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhl
Y3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBF
dmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmlj
dENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
LCBFdmFsQ29udGV4dFR5cGUpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0Nl
bGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1f
ZXZhbENvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBt
X3VubGlua2VkRXZhbENvZGVCbG9jazsKLX07Ci0KLWNsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZp
bmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9m
ZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJh
c2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3Ry
dWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIFByb2dyYW1F
eGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3Vy
Y2UpCi0gICAgewotICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAo
Tm90TnVsbCwgYWxsb2NhdGVDZWxsPFByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkg
UHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNlKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+Zmlu
aXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAg
IH0KLQotCi0gICAgSlNPYmplY3QqIGluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwgQ2Fs
bEZyYW1lKiwgSlNTY29wZSopOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsK
LQotICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCi0gICAgewotICAgICAgICByZXR1
cm4gbV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAgIH0KLQotICAgIEpTT2JqZWN0KiBjaGVj
a1N5bnRheChFeGVjU3RhdGUqKTsKLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVk
SklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwo
KTsKLSAgICB9Ci0gICAgICAgIAotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVy
ZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0g
ICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwg
cHJvdG8sIFR5cGVJbmZvKFByb2dyYW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBp
bmZvKCkpOwotICAgIH0KLSAgICAgICAgCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgRXhlY3V0
YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1
c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6
Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVk
ZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBp
c0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9
Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIGZyaWVu
ZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwotCi0gICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0
YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJl
bihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkUHJv
Z3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJy
aWVyPFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3JhbUNvZGVCbG9jazsKLX07Ci0KLWNsYXNzIE1v
ZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewot
ICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlw
ZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0
cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFs
OwotCi0gICAgc3RhdGljIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRl
KiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwq
KTsKLQotICAgIE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCi0gICAgewotICAg
ICAgICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmdldCgpOwotICAgIH0KLQotICAg
IFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICBy
ZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3Ry
dWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3Jl
YXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICBERUNMQVJF
X0lORk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0
dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFs
c2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpNb2R1bGUsIFN1
cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJzZU1vZGU6Ok1vZHVsZUV2YWx1YXRlTW9k
ZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2Us
IEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KLQotICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKCkgeyByZXR1cm4gbV91bmxp
bmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0KCk7IH0KLQotICAgIFN5bWJvbFRhYmxlKiBt
b2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkgeyByZXR1cm4gbV9tb2R1bGVFbnZpcm9ubWVu
dFN5bWJvbFRhYmxlLmdldCgpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1
dGFibGVCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwotCi0gICAgTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0g
ICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0g
ICAgV3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtl
ZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxlPiBt
X21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7Ci0gICAgV3JpdGVCYXJyaWVyPE1vZHVsZVBy
b2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jazsKLX07Ci0KLWNsYXNzIEZ1
bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKLSAgICBm
cmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7
Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBT
dHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogY3Jl
YXRlKAotICAgICAgICBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRG
dW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhlY3V0YWJsZSwgCi0gICAgICAgIHVuc2lnbmVk
IGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNp
Z25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgewotICAgICAgICBGdW5j
dGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxG
dW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBGdW5jdGlvbkV4ZWN1dGFibGUodm0sIHNvdXJj
ZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBzdGFydENvbHVtbiwg
ZW5kQ29sdW1uLCBpbnRyaW5zaWMpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlv
bih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLSAgICBzdGF0aWMgRnVu
Y3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29kZSgKLSAgICAgICAgY29uc3QgSWRlbnRpZmll
ciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291cmNlQ29kZSYsIAotICAgICAgICBKU09iamVj
dComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGluZU51bWJlcik7Ci0KLSAgICBzdGF0aWMgdm9p
ZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBt
X3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIGVpdGhl
ciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4gVGhpcyBjYW4gYmUgYXBwcm9wcmlhdGUKLSAg
ICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0aGF0IHRoYXQgZG9uJ3QgdmFyeSBiZXR3ZWVu
IGNhbGwgYW5kIGNvbnN0cnVjdCAtLQotICAgIC8vIGZvciBleGFtcGxlLCBhcmd1bWVudHNSZWdp
c3RlcigpLgotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBlaXRoZXJDb2RlQmxvY2soKQotICAgIHsK
LSAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBtX2Nv
ZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0
cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDYWxs
KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAhIW1fY29kZUJsb2NrRm9yQ2FsbDsKLSAg
ICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCi0gICAgewot
ICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwotICAgIH0KLQotICAgIGJv
b2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJu
IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLQotICAgIEZ1bmN0aW9uQ29k
ZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBp
c0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAg
ICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRl
ZEZvckNhbGwoKTsKLSAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0g
ICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNvbnN0cnVjdCgpOwotICAgIH0KLSAgICAgICAg
Ci0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25L
aW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAg
ICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxsKCk7Ci0gICAgICAgIEFTU0VSVChraW5kID09
IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9yQ29uc3RydWN0
KCk7Ci0gICAgfQotCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9y
KENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwotICAgICAgICAKLSAgICBGdW5jdGlvbkNvZGVCbG9j
ayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29kZUJsb2NrRm9yKGtpbmQpOwotICAgIH0KLQot
ICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KCkgCi0gICAgewotICAg
ICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCkKLSAgICAgICAgICAgIG1fcmV0dXJu
U3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNyZWF0ZSgpOwotCi0gICAgICAgIHJldHVybiBt
X3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgfQotICAgICAgICAKLSAgICBGdW5jdGlvbk1v
ZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9u
TW9kZSgpOyB9Ci0gICAgYm9vbCBpc0J1aWx0aW5GdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
dW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5GdW5jdGlvbigpOyB9Ci0gICAgQ29uc3RydWN0
QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1
dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQotICAgIGJvb2wgaXNDbGFzcygpIGNvbnN0IHsg
cmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgpOyB9Ci0gICAgYm9vbCBpc0Fycm93RnVuY3Rp
b24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OkFycm93
RnVuY3Rpb25Nb2RlOyB9Ci0gICAgYm9vbCBpc0dldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNl
TW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0dGVyTW9kZTsgfQotICAgIGJvb2wgaXNTZXR0
ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OlNldHRl
ck1vZGU7IH0KLSAgICBib29sIGlzR2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gU291cmNlUGFy
c2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsIFNvdXJjZVBhcnNl
TW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9uTW9kZSkuY29udGFpbnMocGFyc2VNb2RlKCkp
OyB9Ci0gICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNv
dXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQotICAgIGJvb2wgaGFzQ2FsbGVyQW5kQXJndW1l
bnRzUHJvcGVydGllcygpIGNvbnN0Ci0gICAgewotICAgICAgICAvLyBQZXIgaHR0cHM6Ly90YzM5
LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlkZGVuLWV4dGVuc2lvbnMsIG9ubHkgc2xvcHB5
LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGluIG9sZC1zdHlsZSAocHJlLUVTNikgc3ludGFj
dGljIGZvcm1zIGNhbiBjb250YWluCi0gICAgICAgIC8vICJjYWxsZXIiIGFuZCAiYXJndW1lbnRz
Ii4KLSAgICAgICAgcmV0dXJuICFpc1N0cmljdE1vZGUoKSAmJiBwYXJzZU1vZGUoKSA9PSBTb3Vy
Y2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9kZSAmJiAhaXNDbGFzc0NvbnN0cnVjdG9yRnVu
Y3Rpb24oKTsKLSAgICB9Ci0gICAgYm9vbCBoYXNQcm90b3R5cGVQcm9wZXJ0eSgpIGNvbnN0Ci0g
ICAgewotICAgICAgICByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KAotICAgICAgICAgICAgU291
cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1vZGUsCi0gICAgICAgICAgICBTb3VyY2VQYXJz
ZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAotICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpH
ZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCi0gICAgICAgICkuY29udGFpbnMocGFyc2VNb2Rl
KCkpIHx8IGlzQ2xhc3MoKTsKLSAgICB9Ci0gICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRD
b250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVk
Q29udGV4dFR5cGUoKTsgfQotICAgIGJvb2wgaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKSBj
b25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+aXNDbGFzc0NvbnN0cnVjdG9yRnVu
Y3Rpb24oKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXImIG5hbWUoKSB7IHJldHVybiBtX3VubGlu
a2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9Ci0gICAgY29uc3QgSWRlbnRpZmllciYgZWNtYU5hbWUo
KSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+ZWNtYU5hbWUoKTsgfQotICAgIGNvbnN0
IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5pbmZlcnJlZE5hbWUoKTsgfQotICAgIHVuc2lnbmVkIHBhcmFtZXRlckNvdW50KCkgY29uc3Qg
eyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7IH0gLy8gRXhj
bHVkaW5nICd0aGlzJyEKLSAgICB1bnNpZ25lZCBmdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5jdGlvbkxlbmd0aCgpOyB9Ci0gICAgU291cmNl
UGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxl
LT5wYXJzZU1vZGUoKTsgfQotICAgIEpTUGFyc2VyU2NyaXB0TW9kZSBzY3JpcHRNb2RlKCkgY29u
c3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPnNjcmlwdE1vZGUoKTsgfQotICAgIGNv
bnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4
ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KLQotICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRy
ZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVT
dHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHBy
b3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxP
YmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlvbkV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zm
c2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7IH0KLQotICAgIHZv
aWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJvZmlsaW5nU3RhcnRFbmRPZmZzZXRzKHVuc2ln
bmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KQotICAgIHsKLSAgICAgICAgbV9w
YXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7Ci0gICAgICAgIG1f
dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OwotICAg
ICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0Owot
ICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEluZmVycmVkVmFsdWUqIHNpbmdsZXRv
bkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0b25GdW5jdGlvbi5nZXQoKTsgfQotCi1wcml2
YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRhYmxlQmFzZTsKLSAgICBGdW5jdGlvbkV4ZWN1
dGFibGUoCi0gICAgICAgIFZNJiwgY29uc3QgU291cmNlQ29kZSYsIFVubGlua2VkRnVuY3Rpb25F
eGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5lLCAKLSAgICAgICAgdW5zaWduZWQgbGFzdExp
bmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyk7
Ci0gICAgCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYpOwotCi0gICAgZnJpZW5kIGNsYXNz
IFNjcmlwdEV4ZWN1dGFibGU7Ci0gICAgCi0gICAgdW5zaWduZWQgbV9wYXJhbWV0ZXJzU3RhcnRP
ZmZzZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlPiBtX3Vu
bGlua2VkRXhlY3V0YWJsZTsKLSAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1f
Y29kZUJsb2NrRm9yQ2FsbDsKLSAgICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1f
Y29kZUJsb2NrRm9yQ29uc3RydWN0OwotICAgIFJlZlB0cjxUeXBlU2V0PiBtX3JldHVyblN0YXRl
bWVudFR5cGVTZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPEluZmVycmVkVmFsdWU+IG1fc2luZ2xldG9u
RnVuY3Rpb247Ci19OwotCi0jaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQotY2xhc3MgV2ViQXNzZW1i
bHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLXB1YmxpYzoKLSAg
ICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk
IFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9y
dGFsOwotCi0gICAgc3RhdGljIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwg
Y29uc3QgU291cmNlQ29kZSYgc291cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWduZWQg
ZnVuY3Rpb25JbmRleCkKLSAgICB7Ci0gICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFdlYkFzc2VtYmx5RXhlY3V0YWJs
ZT4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSh2bSwgc291cmNlLCBtb2R1bGUsIGZ1
bmN0aW9uSW5kZXgpOwotICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7Ci0g
ICAgICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJ1Y3R1cmUq
IGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpT
VmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0s
IGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGUs
IFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0
cm95KEpTQ2VsbCopOwotCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgdm9pZCBwcmVwYXJlRm9y
RXhlY3V0aW9uKFZNJik7Ci0KLSAgICBXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2NrRm9y
Q2FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOwot
ICAgIH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAg
V2ViQXNzZW1ibHlFeGVjdXRhYmxlKFZNJiwgY29uc3QgU291cmNlQ29kZSYsIEpTV2FzbU1vZHVs
ZSosIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXgpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGls
ZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgU291cmNlQ29kZSBtX3NvdXJjZTsK
LSAgICBXcml0ZUJhcnJpZXI8SlNXYXNtTW9kdWxlPiBtX21vZHVsZTsKLSAgICB1bnNpZ25lZCBt
X2Z1bmN0aW9uSW5kZXg7Ci0KLSAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlDb2RlQmxvY2s+
IG1fY29kZUJsb2NrRm9yQ2FsbDsKLX07Ci0jZW5kaWYKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEV4
ZWN1dGFibGVUeXBlPgotSlNPYmplY3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVj
dXRpb24oVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVT
cGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQotewot
ICAgIGlmIChoYXNKSVRDb2RlRm9yKGtpbmQpKSB7Ci0gICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8
RXhlY3V0YWJsZVR5cGUsIEV2YWxFeGVjdXRhYmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1
bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVjdXRhYmxlKj4o
dGhpcyktPmNvZGVCbG9jaygpKTsKLSAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1
dGFibGVUeXBlLCBQcm9ncmFtRXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAgICAgICAgcmVzdWx0
Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+
KHRoaXMpLT5jb2RlQmxvY2soKSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVj
dXRhYmxlVHlwZSwgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKLSAgICAgICAgICAg
IHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9kdWxlUHJvZ3Jh
bUV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAgICAgICBlbHNlIGlmIChzdGQ6
OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZhbHVlKQotICAg
ICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxGdW5j
dGlvbkV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0
dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCh2
bSwgZnVuY3Rpb24sIHNjb3BlLCBraW5kLCByZXN1bHRDb2RlQmxvY2spOwotfQotCiB9IC8vIG5h
bWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0cmluZ0Nv
bnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9TdHJpbmdDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL1N0cmluZ0NvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgIlN0cmluZ0NvbnN0cnVjdG9yLmgiCiAKICNpbmNs
dWRlICJFcnJvci5oIgotI2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKICNpbmNsdWRlICJKSVRDb2Rl
LmgiCiAjaW5jbHVkZSAiSlNGdW5jdGlvbi5oIgogI2luY2x1ZGUgIkpTR2xvYmFsT2JqZWN0Lmgi
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJpbmdQcm90b3R5cGUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0cmluZ1Byb3Rv
dHlwZS5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1N0cmluZ1Byb3RvdHlwZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDcgKzI3LDYgQEAK
ICNpbmNsdWRlICJCdXR0ZXJmbHlJbmxpbmVzLmgiCiAjaW5jbHVkZSAiQ2FjaGVkQ2FsbC5oIgog
I2luY2x1ZGUgIkVycm9yLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogI2luY2x1ZGUgIklu
dGxPYmplY3QuaCIKICNpbmNsdWRlICJKU0FycmF5LmgiCiAjaW5jbHVkZSAiSlNDQnVpbHRpbnMu
aCIKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0
YWJsZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvV2Vi
QXNzZW1ibHlFeGVjdXRhYmxlLmNwcAkocmV2aXNpb24gMjA3NzkwKQkoZnJvbSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRhYmxlLmNwcDoyMDc3OTApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9XZWJBc3NlbWJseUV4ZWN1dGFibGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsODQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAy
MDEzLCAyMDE1LTIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkV4ZWN1dGFibGUuaCIKKworI2luY2x1ZGUgIkJhdGNoZWRUcmFuc2l0aW9uT3B0
aW1pemVyLmgiCisjaW5jbHVkZSAiQ29kZUJsb2NrLmgiCisjaW5jbHVkZSAiRGVidWdnZXIuaCIK
KyNpbmNsdWRlICJKSVQuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisjaW5jbHVkZSAiSlNX
YXNtTW9kdWxlLmgiCisjaW5jbHVkZSAiTExJbnRFbnRyeXBvaW50LmgiCisjaW5jbHVkZSAiUGFy
c2VyLmgiCisjaW5jbHVkZSAiVHlwZVByb2ZpbGVyLmgiCisjaW5jbHVkZSAiVk1JbmxpbmVzLmgi
CisjaW5jbHVkZSA8d3RmL0NvbW1hUHJpbnRlci5oPgorCituYW1lc3BhY2UgSlNDIHsKKworY29u
c3QgQ2xhc3NJbmZvIEV4ZWN1dGFibGVCYXNlOjpzX2luZm8gPSB7ICJFeGVjdXRhYmxlIiwgMCwg
MCwgQ1JFQVRFX01FVEhPRF9UQUJMRShFeGVjdXRhYmxlQmFzZSkgfTsKKwordm9pZCBFeGVjdXRh
YmxlQmFzZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8RXhlY3V0
YWJsZUJhc2UqPihjZWxsKS0+RXhlY3V0YWJsZUJhc2U6On5FeGVjdXRhYmxlQmFzZSgpOworfQor
Cit2b2lkIEV4ZWN1dGFibGVCYXNlOjpjbGVhckNvZGUoKQoreworI2lmIEVOQUJMRShKSVQpCisg
ICAgbV9qaXRDb2RlRm9yQ2FsbCA9IG51bGxwdHI7CisgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0
ID0gbnVsbHB0cjsKKyAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fz
c2VtYmxlckNvZGVQdHIoKTsKKyAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVj
ayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOworI2VuZGlmCisgICAgbV9udW1QYXJhbWV0ZXJz
Rm9yQ2FsbCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKKyAgICBtX251bVBhcmFtZXRl
cnNGb3JDb25zdHJ1Y3QgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7CisKKyAgICBpZiAo
Y2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgRnVu
Y3Rpb25FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+
KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuY2xlYXIoKTsK
KyAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuY2xlYXIoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0
YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganND
YXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENv
ZGVCbG9jay5jbGVhcigpOworICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVC
bG9jay5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChjbGFz
c0luZm8oKSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFByb2dyYW1F
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7
CisgICAgICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAgICAg
ICBleGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAg
ICAgZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7CisgICAgICAg
IGV4ZWN1dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Cisg
ICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5jbGVhcigp
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkK
KyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjppbmZvKCkpIHsK
KyAgICAgICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFdlYkFz
c2VtYmx5RXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9j
a0ZvckNhbGwuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAg
QVNTRVJUKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSk7Cit9CisKK2Nv
bnN0IENsYXNzSW5mbyBOYXRpdmVFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJOYXRpdmVFeGVjdXRh
YmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTmF0
aXZlRXhlY3V0YWJsZSkgfTsKKworTmF0aXZlRXhlY3V0YWJsZSogTmF0aXZlRXhlY3V0YWJsZTo6
Y3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0
aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVG
dW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBu
YW1lKQoreworICAgIE5hdGl2ZUV4ZWN1dGFibGUqIGV4ZWN1dGFibGU7CisgICAgZXhlY3V0YWJs
ZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE5hdGl2ZUV4ZWN1dGFibGU+KHZtLmhlYXAp
KSBOYXRpdmVFeGVjdXRhYmxlKHZtLCBmdW5jdGlvbiwgY29uc3RydWN0b3IsIGludHJpbnNpYyk7
CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0sIGNhbGxUaHVuaywgY29uc3RydWN0
VGh1bmssIG5hbWUpOworICAgIHJldHVybiBleGVjdXRhYmxlOworfQorCit2b2lkIE5hdGl2ZUV4
ZWN1dGFibGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQoreworICAgIHN0YXRpY19jYXN0PE5hdGl2
ZUV4ZWN1dGFibGUqPihjZWxsKS0+TmF0aXZlRXhlY3V0YWJsZTo6fk5hdGl2ZUV4ZWN1dGFibGUo
KTsKK30KKworU3RydWN0dXJlKiBOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGVTdHJ1Y3R1cmUoVk0m
IHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQoreworICAg
IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUlu
Zm8oQ2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKK30KKwordm9pZCBOYXRpdmVF
eGVjdXRhYmxlOjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2Fs
bFRodW5rLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJpbmcm
IG5hbWUpCit7CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgIG1faml0Q29kZUZv
ckNhbGwgPSBjYWxsVGh1bms7CisgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gY29uc3RydWN0
VGh1bms7CisgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9y
Q2FsbC0+YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOworICAgIG1faml0Q29kZUZvckNv
bnN0cnVjdFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0LT5hZGRyZXNzRm9y
Q2FsbChNdXN0Q2hlY2tBcml0eSk7CisgICAgbV9uYW1lID0gbmFtZTsKK30KKworTmF0aXZlRXhl
Y3V0YWJsZTo6TmF0aXZlRXhlY3V0YWJsZShWTSYgdm0sIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9u
LCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYykKKyAgICA6
IEV4ZWN1dGFibGVCYXNlKHZtLCB2bS5uYXRpdmVFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBO
VU1fUEFSQU1FVEVSU19JU19IT1NULCBpbnRyaW5zaWMpCisgICAgLCBtX2Z1bmN0aW9uKGZ1bmN0
aW9uKQorICAgICwgbV9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikKK3sKK30KKworY29uc3QgQ2xh
c3NJbmZvIFNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlNjcmlwdEV4ZWN1dGFibGUiLCAm
RXhlY3V0YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShTY3JpcHRFeGVj
dXRhYmxlKSB9OworCitTY3JpcHRFeGVjdXRhYmxlOjpTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVy
ZSogc3RydWN0dXJlLCBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0lu
U3RyaWN0Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9v
bCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5
cGUsIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgc3RydWN0
dXJlLCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIGludHJpbnNpYykKKyAgICAsIG1fZmVh
dHVyZXMoaXNJblN0cmljdENvbnRleHQgPyBTdHJpY3RNb2RlRmVhdHVyZSA6IDApCisgICAgLCBt
X2RpZFRyeVRvRW50ZXJJbkxvb3AoZmFsc2UpCisgICAgLCBtX2hhc0NhcHR1cmVkVmFyaWFibGVz
KGZhbHNlKQorICAgICwgbV9uZXZlcklubGluZShmYWxzZSkKKyAgICAsIG1fbmV2ZXJPcHRpbWl6
ZShmYWxzZSkKKyAgICAsIG1fbmV2ZXJGVExPcHRpbWl6ZShmYWxzZSkKKyAgICAsIG1faXNBcnJv
d0Z1bmN0aW9uQ29udGV4dChpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQpCisgICAgLCBtX2NhblVz
ZU9TUkV4aXRGdXp6aW5nKHRydWUpCisgICAgLCBtX2Rlcml2ZWRDb250ZXh0VHlwZShzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4oZGVyaXZlZENvbnRleHRUeXBlKSkKKyAgICAsIG1fZXZhbENvbnRleHRU
eXBlKHN0YXRpY19jYXN0PHVuc2lnbmVkPihldmFsQ29udGV4dFR5cGUpKQorICAgICwgbV9vdmVy
cmlkZUxpbmVOdW1iZXIoLTEpCisgICAgLCBtX2ZpcnN0TGluZSgtMSkKKyAgICAsIG1fbGFzdExp
bmUoLTEpCisgICAgLCBtX3N0YXJ0Q29sdW1uKFVJTlRfTUFYKQorICAgICwgbV9lbmRDb2x1bW4o
VUlOVF9NQVgpCisgICAgLCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldChVSU5UX01BWCkKKyAg
ICAsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldChVSU5UX01BWCkKKyAgICAsIG1fc291cmNlKHNv
dXJjZSkKK3sKK30KKwordm9pZCBTY3JpcHRFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2Vs
bCkKK3sKKyAgICBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRhYmxlKj4oY2VsbCktPlNjcmlwdEV4
ZWN1dGFibGU6On5TY3JpcHRFeGVjdXRhYmxlKCk7Cit9CisKK3ZvaWQgU2NyaXB0RXhlY3V0YWJs
ZTo6aW5zdGFsbENvZGUoQ29kZUJsb2NrKiBjb2RlQmxvY2spCit7CisgICAgaW5zdGFsbENvZGUo
KmNvZGVCbG9jay0+dm0oKSwgY29kZUJsb2NrLCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVC
bG9jay0+c3BlY2lhbGl6YXRpb25LaW5kKCkpOworfQorCit2b2lkIFNjcmlwdEV4ZWN1dGFibGU6
Omluc3RhbGxDb2RlKFZNJiB2bSwgQ29kZUJsb2NrKiBnZW5lcmljQ29kZUJsb2NrLCBDb2RlVHlw
ZSBjb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQoreworICAgIEFTU0VSVCh2
bS5oZWFwLmlzRGVmZXJyZWQoKSk7CisgICAgCisgICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spCisg
ICAgICAgIENPREVCTE9DS19MT0dfRVZFTlQoZ2VuZXJpY0NvZGVCbG9jaywgImluc3RhbGxDb2Rl
IiwgKCkpOworICAgIAorICAgIENvZGVCbG9jayogb2xkQ29kZUJsb2NrID0gbnVsbHB0cjsKKyAg
ICAKKyAgICBzd2l0Y2ggKGNvZGVUeXBlKSB7CisgICAgY2FzZSBHbG9iYWxDb2RlOiB7CisgICAg
ICAgIFByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRh
YmxlKj4odGhpcyk7CisgICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRp
Y19jYXN0PFByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKKyAgICAgICAgCisg
ICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgCisgICAgICAgIG9s
ZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKKyAgICAg
ICAgZXhlY3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywg
Y29kZUJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBNb2R1bGVDb2Rl
OiB7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0
PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIE1vZHVsZVByb2dyYW1D
b2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sq
PihnZW5lcmljQ29kZUJsb2NrKTsKKworICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2Fs
bCk7CisKKyAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFt
Q29kZUJsb2NrLmdldCgpOworICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2Rl
QmxvY2suc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICBjYXNlIEV2YWxDb2RlOiB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBl
eGVjdXRhYmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIEV2YWxD
b2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPihnZW5lcmlj
Q29kZUJsb2NrKTsKKyAgICAgICAgCisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxs
KTsKKyAgICAgICAgCisgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fZXZhbENv
ZGVCbG9jay5nZXQoKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLnNldE1h
eUJlTnVsbCh2bSwgdGhpcywgY29kZUJsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
ICAgICAKKyAgICBjYXNlIEZ1bmN0aW9uQ29kZTogeworICAgICAgICBGdW5jdGlvbkV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7CisgICAg
ICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNv
ZGVCbG9jayo+KGdlbmVyaWNDb2RlQmxvY2spOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChr
aW5kKSB7CisgICAgICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgICAgICBvbGRDb2RlQmxv
Y2sgPSBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7CisgICAgICAgICAgICBl
eGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2Rl
QmxvY2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVj
dDoKKyAgICAgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9y
Q29uc3RydWN0LmdldCgpOworICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JD
b25zdHJ1Y3Quc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIHN3
aXRjaCAoa2luZCkgeworICAgIGNhc2UgQ29kZUZvckNhbGw6CisgICAgICAgIG1faml0Q29kZUZv
ckNhbGwgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDog
bnVsbHB0cjsKKyAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9B
c3NlbWJsZXJDb2RlUHRyKCk7CisgICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBnZW5l
cmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BB
UkFNRVRFUlNfTk9UX0NPTVBJTEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvZGVGb3JD
b25zdHJ1Y3Q6CisgICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxv
Y2sgPyBnZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkgOiBudWxscHRyOworICAgICAgICBtX2pp
dENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigp
OworICAgICAgICBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2Nr
ID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9U
X0NPTVBJTEVEOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZ2VuZXJpY0NvZGVC
bG9jaykgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChnZW5lcmljQ29kZUJsb2NrLT5vd25lckV4
ZWN1dGFibGUoKSA9PSB0aGlzKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoSklUQ29kZTo6aXNF
eGVjdXRhYmxlU2NyaXB0KGdlbmVyaWNDb2RlQmxvY2stPmppdFR5cGUoKSkpOworICAgICAgICAK
KyAgICAgICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VPU1IoKSkKKyAgICAgICAgICAgIGRhdGFMb2co
Ikluc3RhbGxpbmcgIiwgKmdlbmVyaWNDb2RlQmxvY2ssICJcbiIpOworICAgICAgICAKKyAgICAg
ICAgaWYgKHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlcikKKyAgICAgICAgICAgIHZtLm1fcGVyQnl0
ZWNvZGVQcm9maWxlci0+ZW5zdXJlQnl0ZWNvZGVzRm9yKGdlbmVyaWNDb2RlQmxvY2spOworICAg
ICAgICAKKyAgICAgICAgaWYgKERlYnVnZ2VyKiBkZWJ1Z2dlciA9IGdlbmVyaWNDb2RlQmxvY2st
Pmdsb2JhbE9iamVjdCgpLT5kZWJ1Z2dlcigpKQorICAgICAgICAgICAgZGVidWdnZXItPnJlZ2lz
dGVyQ29kZUJsb2NrKGdlbmVyaWNDb2RlQmxvY2spOworICAgIH0KKworICAgIGlmIChvbGRDb2Rl
QmxvY2spCisgICAgICAgIG9sZENvZGVCbG9jay0+dW5saW5rSW5jb21pbmdDYWxscygpOworCisg
ICAgdm0uaGVhcC53cml0ZUJhcnJpZXIodGhpcyk7Cit9CisKK0NvZGVCbG9jayogU2NyaXB0RXhl
Y3V0YWJsZTo6bmV3Q29kZUJsb2NrRm9yKAorICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2lu
ZCwgSlNGdW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBKU09iamVjdComIGV4Y2Vw
dGlvbikKK3sKKyAgICBWTSogdm0gPSBzY29wZS0+dm0oKTsKKyAgICBhdXRvIHRocm93U2NvcGUg
PSBERUNMQVJFX1RIUk9XX1NDT1BFKCp2bSk7CisKKyAgICBBU1NFUlQodm0tPmhlYXAuaXNEZWZl
cnJlZCgpKTsKKyAgICBBU1NFUlQoc3RhcnRDb2x1bW4oKSAhPSBVSU5UX01BWCk7CisgICAgQVNT
RVJUKGVuZENvbHVtbigpICE9IFVJTlRfTUFYKTsKKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBF
dmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7CisgICAgICAgIFJFTEVBU0VfQVNT
RVJUKGtpbmQgPT0gQ29kZUZvckNhbGwpOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0
YWJsZS0+bV9ldmFsQ29kZUJsb2NrKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9u
KTsKKyAgICAgICAgcmV0dXJuIEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSwKKyAgICAgICAgICAg
IGV4ZWN1dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLmdldCgpLCBz
Y29wZSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCkpOworICAg
IH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8o
KSkgeworICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9n
cmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENv
ZGVGb3JDYWxsKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fcHJvZ3Jh
bUNvZGVCbG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAg
IHJldHVybiBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgICAgICBleGVjdXRh
YmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUs
CisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxl
LT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKKyAgICB9CisKKyAgICBpZiAoY2xhc3NJbmZvKCkg
PT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJs
ZSo+KHRoaXMpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsK
KyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVC
bG9jayk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7CisgICAgICAgIHJldHVy
biBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgICAgICBleGVjdXRh
YmxlLCBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwg
c2NvcGUsCisgICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVj
dXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FT
U0VSVChjbGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSk7CisgICAgUkVM
RUFTRV9BU1NFUlQoZnVuY3Rpb24pOworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJs
ZSA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICBSRUxFQVNFX0FTU0VS
VCghZXhlY3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAgICBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgpOworICAgIFBhcnNlckVycm9yIGVy
cm9yOworICAgIERlYnVnZ2VyTW9kZSBkZWJ1Z2dlck1vZGUgPSBnbG9iYWxPYmplY3QtPmhhc0lu
dGVyYWN0aXZlRGVidWdnZXIoKSA/IERlYnVnZ2VyT24gOiBEZWJ1Z2dlck9mZjsKKyAgICBVbmxp
bmtlZEZ1bmN0aW9uQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9jayA9IAorICAgICAgICBleGVj
dXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+dW5saW5rZWRDb2RlQmxvY2tGb3IoCisgICAg
ICAgICAgICAqdm0sIGV4ZWN1dGFibGUtPm1fc291cmNlLCBraW5kLCBkZWJ1Z2dlck1vZGUsIGVy
cm9yLCAKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPnBhcnNlTW9kZSgpKTsKKyAgICByZWNvcmRQ
YXJzZSgKKyAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmZlYXR1cmVz
KCksIAorICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+aGFzQ2FwdHVy
ZWRWYXJpYWJsZXMoKSwgZmlyc3RMaW5lKCksIAorICAgICAgICBsYXN0TGluZSgpLCBzdGFydENv
bHVtbigpLCBlbmRDb2x1bW4oKSk7IAorICAgIGlmICghdW5saW5rZWRDb2RlQmxvY2spIHsKKyAg
ICAgICAgZXhjZXB0aW9uID0gdGhyb3dFeGNlcHRpb24oCisgICAgICAgICAgICBnbG9iYWxPYmpl
Y3QtPmdsb2JhbEV4ZWMoKSwgdGhyb3dTY29wZSwKKyAgICAgICAgICAgIGVycm9yLnRvRXJyb3JP
YmplY3QoZ2xvYmFsT2JqZWN0LCBleGVjdXRhYmxlLT5tX3NvdXJjZSkpOworICAgICAgICByZXR1
cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBTb3VyY2VQcm92aWRlciogcHJvdmlkZXIgPSBleGVj
dXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpOworICAgIHVuc2lnbmVkIHNvdXJjZU9mZnNldCA9
IGV4ZWN1dGFibGUtPnNvdXJjZSgpLnN0YXJ0T2Zmc2V0KCk7CisgICAgdW5zaWduZWQgc3RhcnRD
b2x1bW4gPSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpOworCisgICAgcmV0dXJu
IEZ1bmN0aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0sCisgICAgICAgIGV4ZWN1dGFibGUsIHVubGlu
a2VkQ29kZUJsb2NrLCBzY29wZSwgcHJvdmlkZXIsIHNvdXJjZU9mZnNldCwgc3RhcnRDb2x1bW4p
OworfQorCitDb2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld1JlcGxhY2VtZW50Q29kZUJs
b2NrRm9yKAorICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKK3sKKyAgICBpZiAoY2xh
c3NJbmZvKCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FT
U0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKKyAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgRXZhbENvZGVC
bG9jayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oCisgICAgICAgICAg
ICBleGVjdXRhYmxlLT5tX2V2YWxDb2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAg
ICAgRXZhbENvZGVCbG9jayogcmVzdWx0ID0gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtKCksCisg
ICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICAg
ICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4
ZWN1dGFibGU6OmluZm8oKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVG
b3JDYWxsKTsKKyAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8
UHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogYmFz
ZWxpbmUgPSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4oCisgICAgICAgICAgICBleGVj
dXRhYmxlLT5tX3Byb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICAgICAg
UHJvZ3JhbUNvZGVCbG9jayogcmVzdWx0ID0gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCks
CisgICAgICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAg
ICAgICAgcmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0g
Q29kZUZvckNhbGwpOworICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJs
ZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOworICAgICAgICBNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1D
b2RlQmxvY2sqPigKKyAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVC
bG9jay0+YmFzZWxpbmVWZXJzaW9uKCkpOworICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2Nr
KiByZXN1bHQgPSBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKKyAgICAgICAg
ICAgIENvZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOworICAgICAgICByZXN1
bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7CisgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfQorCisgICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25F
eGVjdXRhYmxlOjppbmZvKCkpOworICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9
IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKKyAgICBGdW5jdGlvbkNvZGVCbG9j
ayogYmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KAorICAgICAgICBl
eGVjdXRhYmxlLT5jb2RlQmxvY2tGb3Ioa2luZCktPmJhc2VsaW5lVmVyc2lvbigpKTsKKyAgICBG
dW5jdGlvbkNvZGVCbG9jayogcmVzdWx0ID0gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSgp
LAorICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKKyAgICBy
ZXN1bHQtPnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKworc3RhdGljIHZvaWQgc2V0dXBMTEludChWTSYgdm0sIENvZGVCbG9jayogY29kZUJs
b2NrKQoreworICAgIExMSW50OjpzZXRFbnRyeXBvaW50KHZtLCBjb2RlQmxvY2spOworfQorCitz
dGF0aWMgdm9pZCBzZXR1cEpJVChWTSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQoreworI2lm
IEVOQUJMRShKSVQpCisgICAgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gSklUOjpjb21waWxl
KCZ2bSwgY29kZUJsb2NrLCBKSVRDb21waWxhdGlvbk11c3RTdWNjZWVkKTsKKyAgICBSRUxFQVNF
X0FTU0VSVChyZXN1bHQgPT0gQ29tcGlsYXRpb25TdWNjZXNzZnVsKTsKKyNlbHNlCisgICAgVU5V
U0VEX1BBUkFNKHZtKTsKKyAgICBVTlVTRURfUEFSQU0oY29kZUJsb2NrKTsKKyAgICBVTlJFQUNI
QUJMRV9GT1JfUExBVEZPUk0oKTsKKyNlbmRpZgorfQorCitKU09iamVjdCogU2NyaXB0RXhlY3V0
YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoCisgICAgVk0mIHZtLCBKU0Z1bmN0aW9uKiBm
dW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29k
ZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQoreworICAgIERlZmVyR0NGb3JBV2hpbGUgZGVmZXJH
Qyh2bS5oZWFwKTsKKworICAgIGlmICh2bS5nZXRBbmRDbGVhckZhaWxOZXh0TmV3Q29kZUJsb2Nr
KCkpCisgICAgICAgIHJldHVybiBjcmVhdGVFcnJvcihzY29wZS0+Z2xvYmFsT2JqZWN0KCktPmds
b2JhbEV4ZWMoKSwgQVNDSUlMaXRlcmFsKCJGb3JjZWQgRmFpbHVyZSIpKTsKKworICAgIEpTT2Jq
ZWN0KiBleGNlcHRpb24gPSAwOworICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbmV3Q29kZUJs
b2NrRm9yKGtpbmQsIGZ1bmN0aW9uLCBzY29wZSwgZXhjZXB0aW9uKTsKKyAgICByZXN1bHRDb2Rl
QmxvY2sgPSBjb2RlQmxvY2s7CisgICAgaWYgKCFjb2RlQmxvY2spIHsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoZXhjZXB0aW9uKTsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9Cisg
ICAgCisgICAgaWYgKE9wdGlvbnM6OnZhbGlkYXRlQnl0ZWNvZGUoKSkKKyAgICAgICAgY29kZUJs
b2NrLT52YWxpZGF0ZSgpOworICAgIAorICAgIGlmIChPcHRpb25zOjp1c2VMTEludCgpKQorICAg
ICAgICBzZXR1cExMSW50KHZtLCBjb2RlQmxvY2spOworICAgIGVsc2UKKyAgICAgICAgc2V0dXBK
SVQodm0sIGNvZGVCbG9jayk7CisgICAgCisgICAgaW5zdGFsbENvZGUodm0sIGNvZGVCbG9jaywg
Y29kZUJsb2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsK
KyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgQ2xhc3NJbmZvIEV2YWxFeGVjdXRhYmxl
OjpzX2luZm8gPSB7ICJFdmFsRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoRXZhbEV4ZWN1dGFibGUpIH07CisKK0V2YWxFeGVjdXRh
YmxlKiBFdmFsRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNl
Q29kZSYgc291cmNlLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUg
ZGVyaXZlZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250
ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqIHZhcmlh
Ymxlc1VuZGVyVERaKQoreworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBzY29w
ZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOworCisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKKyAgICBpZiAoIWdsb2JhbE9i
amVjdC0+ZXZhbEVuYWJsZWQoKSkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29w
ZSwgY3JlYXRlRXZhbEVycm9yKGV4ZWMsIGdsb2JhbE9iamVjdC0+ZXZhbERpc2FibGVkRXJyb3JN
ZXNzYWdlKCkpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRXZhbEV4ZWN1dGFi
bGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxFdmFsRXhlY3V0YWJs
ZT4oKmV4ZWMtPmhlYXAoKSkpIEV2YWxFeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSwgaXNJblN0cmlj
dENvbnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZh
bENvbnRleHRUeXBlKTsKKyAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7CisKKyAg
ICBVbmxpbmtlZEV2YWxDb2RlQmxvY2sqIHVubGlua2VkRXZhbENvZGUgPSBnbG9iYWxPYmplY3Qt
PmNyZWF0ZUV2YWxDb2RlQmxvY2soZXhlYywgZXhlY3V0YWJsZSwgdmFyaWFibGVzVW5kZXJURFop
OworICAgIGlmICghdW5saW5rZWRFdmFsQ29kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBl
eGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5zZXQodm0sIGV4ZWN1dGFibGUsIHVu
bGlua2VkRXZhbENvZGUpOworCisgICAgcmV0dXJuIGV4ZWN1dGFibGU7Cit9CisKK0V2YWxFeGVj
dXRhYmxlOjpFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZSwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVk
Q29udGV4dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBl
IGV2YWxDb250ZXh0VHlwZSkKKyAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5ldmFs
RXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBpblN0cmljdENv
bnRleHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENv
bnRleHRUeXBlLCBOb0ludHJpbnNpYykKK3sKKyAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCkt
PnNvdXJjZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOworfQor
Cit2b2lkIEV2YWxFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0
aWNfY2FzdDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpLT5FdmFsRXhlY3V0YWJsZTo6fkV2YWxFeGVj
dXRhYmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBQcm9ncmFtRXhlY3V0YWJsZTo6c19pbmZv
ID0geyAiUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBD
UkVBVEVfTUVUSE9EX1RBQkxFKFByb2dyYW1FeGVjdXRhYmxlKSB9OworCitQcm9ncmFtRXhlY3V0
YWJsZTo6UHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2Rl
JiBzb3VyY2UpCisgICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkucHJvZ3JhbUV4ZWN1
dGFibGVTdHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2ZWRD
b250ZXh0VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5z
aWMpCit7CisgICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291
cmNlUHJvdmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsKKyAgICBtX3R5cGVQcm9maWxpbmdTdGFy
dE9mZnNldCA9IDA7CisgICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0
aCgpIC0gMTsKKyAgICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52bSgp
LmNvbnRyb2xGbG93UHJvZmlsZXIoKSkKKyAgICAgICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4
ZWN1dGVkQ2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlwZVBy
b2ZpbGluZ1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQpOworfQorCit2b2lk
IFByb2dyYW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNf
Y2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Qcm9ncmFtRXhlY3V0YWJsZTo6flByb2dy
YW1FeGVjdXRhYmxlKCk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBNb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZTo6c19pbmZvID0geyAiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0
YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKSB9OworCitNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCisgICAgOiBTY3Jp
cHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkubW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVTdHJ1Y3R1cmUu
Z2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2ZWRDb250ZXh0VHlwZTo6Tm9u
ZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5zaWMpCit7CisgICAgQVNT
RVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3Vy
Y2VUeXBlOjpNb2R1bGUpOworICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gMDsKKyAg
ICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2UubGVuZ3RoKCkgLSAxOworICAgIGlm
IChleGVjLT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZtKCkuY29udHJvbEZsb3dQcm9m
aWxlcigpKQorICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5p
bnNlcnRVbmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZz
ZXQsIG1fdHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Cit9CisKK01vZHVsZVByb2dyYW1FeGVjdXRh
YmxlKiBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29u
c3QgU291cmNlQ29kZSYgc291cmNlKQoreworICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmpl
Y3QgPSBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7CisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1
dGFibGUqIGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKGV4
ZWMsIHNvdXJjZSk7CisgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7
CisKKyAgICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkTW9kdWxlUHJv
Z3JhbUNvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZU1vZHVsZVByb2dyYW1Db2RlQmxvY2soZXhl
YywgZXhlY3V0YWJsZSk7CisgICAgaWYgKCF1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlKQorICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJv
Z3JhbUNvZGVCbG9jay5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwgdW5saW5rZWRNb2R1bGVQ
cm9ncmFtQ29kZSk7CisKKyAgICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9s
VGFibGUuc2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUsIGpzQ2FzdDxTeW1ib2xUYWJsZSo+KHVu
bGlua2VkTW9kdWxlUHJvZ3JhbUNvZGUtPmNvbnN0YW50UmVnaXN0ZXIodW5saW5rZWRNb2R1bGVQ
cm9ncmFtQ29kZS0+bW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZUNvbnN0YW50UmVnaXN0ZXJP
ZmZzZXQoKSkuZ2V0KCkpLT5jbG9uZVNjb3BlUGFydChleGVjLT52bSgpKSk7CisKKyAgICByZXR1
cm4gZXhlY3V0YWJsZTsKK30KKwordm9pZCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJv
eShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFi
bGUqPihjZWxsKS0+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6On5Nb2R1bGVQcm9ncmFtRXhlY3V0
YWJsZSgpOworfQorCitjb25zdCBDbGFzc0luZm8gRnVuY3Rpb25FeGVjdXRhYmxlOjpzX2luZm8g
PSB7ICJGdW5jdGlvbkV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBD
UkVBVEVfTUVUSE9EX1RBQkxFKEZ1bmN0aW9uRXhlY3V0YWJsZSkgfTsKKworRnVuY3Rpb25FeGVj
dXRhYmxlOjpGdW5jdGlvbkV4ZWN1dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3Vy
Y2UsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUsIHVuc2ln
bmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1
bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCisgICAgOiBTY3JpcHRFeGVj
dXRhYmxlKHZtLmZ1bmN0aW9uRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgdm0sIHNvdXJjZSwg
dW5saW5rZWRFeGVjdXRhYmxlLT5pc0luU3RyaWN0Q29udGV4dCgpLCB1bmxpbmtlZEV4ZWN1dGFi
bGUtPmRlcml2ZWRDb250ZXh0VHlwZSgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBp
bnRyaW5zaWMpCisgICAgLCBtX3VubGlua2VkRXhlY3V0YWJsZSh2bSwgdGhpcywgdW5saW5rZWRF
eGVjdXRhYmxlKQoreworICAgIFJFTEVBU0VfQVNTRVJUKCFzb3VyY2UuaXNOdWxsKCkpOworICAg
IEFTU0VSVChzb3VyY2UubGVuZ3RoKCkpOworICAgIG1fZmlyc3RMaW5lID0gZmlyc3RMaW5lOwor
ICAgIG1fbGFzdExpbmUgPSBsYXN0TGluZTsKKyAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlO
VF9NQVgpOworICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOworICAgIG1fc3RhcnRD
b2x1bW4gPSBzdGFydENvbHVtbjsKKyAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKKyAgICBt
X3BhcmFtZXRlcnNTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+cGFyYW1ldGVyc1N0
YXJ0T2Zmc2V0KCk7CisgICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4
ZWN1dGFibGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpOworICAgIG1fdHlwZVByb2ZpbGlu
Z0VuZE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgp
OworfQorCit2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQor
eworICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKKyAgICBtX3NpbmdsZXRvbkZ1bmN0aW9u
LnNldCh2bSwgdGhpcywgSW5mZXJyZWRWYWx1ZTo6Y3JlYXRlKHZtKSk7Cit9CisKK3ZvaWQgRnVu
Y3Rpb25FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKK3sKKyAgICBzdGF0aWNfY2Fz
dDxGdW5jdGlvbkV4ZWN1dGFibGUqPihjZWxsKS0+RnVuY3Rpb25FeGVjdXRhYmxlOjp+RnVuY3Rp
b25FeGVjdXRhYmxlKCk7Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBzYW1wbGluZ0Rlc2NyaXB0
aW9uKEpJVENvZGU6OkpJVFR5cGUgaml0VHlwZSkKK3sKKyAgICBzd2l0Y2ggKGppdFR5cGUpIHsK
KyAgICBjYXNlIEpJVENvZGU6OkludGVycHJldGVyVGh1bms6CisgICAgICAgIHJldHVybiAiSW50
ZXJwcmV0ZXIgQ29tcGlsYXRpb24gKFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpCYXNlbGlu
ZUpJVDoKKyAgICAgICAgcmV0dXJuICJCYXNlbGluZSBDb21waWxhdGlvbiAoVE9UQUwpIjsKKyAg
ICBjYXNlIEpJVENvZGU6OkRGR0pJVDoKKyAgICAgICAgcmV0dXJuICJERkcgQ29tcGlsYXRpb24g
KFRPVEFMKSI7CisgICAgY2FzZSBKSVRDb2RlOjpGVExKSVQ6CisgICAgICAgIHJldHVybiAiRlRM
IENvbXBpbGF0aW9uIChUT1RBTCkiOworICAgIGRlZmF1bHQ6CisgICAgICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCBF
dmFsRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2
aXNpdG9yKQoreworICAgIEV2YWxFeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEV2YWxF
eGVjdXRhYmxlKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2Jq
ZWN0LCBpbmZvKCkpOworICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09i
amVjdCwgdmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5r
ZWRFdmFsQ29kZUJsb2NrKTsKKyAgICBpZiAodGhpc09iamVjdC0+bV9ldmFsQ29kZUJsb2NrKQor
ICAgICAgICB0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3Ip
OworfQorCitKU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6OmNoZWNrU3ludGF4KEV4ZWNTdGF0
ZSogZXhlYykKK3sKKyAgICBQYXJzZXJFcnJvciBlcnJvcjsKKyAgICBWTSogdm0gPSAmZXhlYy0+
dm0oKTsKKyAgICBKU0dsb2JhbE9iamVjdCogbGV4aWNhbEdsb2JhbE9iamVjdCA9IGV4ZWMtPmxl
eGljYWxHbG9iYWxPYmplY3QoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbU5vZGU+IHBy
b2dyYW1Ob2RlID0gcGFyc2U8UHJvZ3JhbU5vZGU+KAorICAgICAgICB2bSwgbV9zb3VyY2UsIElk
ZW50aWZpZXIoKSwgSlNQYXJzZXJCdWlsdGluTW9kZTo6Tm90QnVpbHRpbiwKKyAgICAgICAgSlNQ
YXJzZXJTdHJpY3RNb2RlOjpOb3RTdHJpY3QsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywg
U291cmNlUGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIGVy
cm9yKTsKKyAgICBpZiAocHJvZ3JhbU5vZGUpCisgICAgICAgIHJldHVybiAwOworICAgIEFTU0VS
VChlcnJvci5pc1ZhbGlkKCkpOworICAgIHJldHVybiBlcnJvci50b0Vycm9yT2JqZWN0KGxleGlj
YWxHbG9iYWxPYmplY3QsIG1fc291cmNlKTsKK30KKworSlNPYmplY3QqIFByb2dyYW1FeGVjdXRh
YmxlOjppbml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYgdm0sIENhbGxGcmFtZSogY2FsbEZy
YW1lLCBKU1Njb3BlKiBzY29wZSkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVChzY29wZSk7CisgICAg
SlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKKyAg
ICBSRUxFQVNFX0FTU0VSVChnbG9iYWxPYmplY3QpOworICAgIEFTU0VSVCgmZ2xvYmFsT2JqZWN0
LT52bSgpID09ICZ2bSk7CisKKyAgICBKU09iamVjdCogZXhjZXB0aW9uID0gMDsKKyAgICBVbmxp
bmtlZFByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2NrID0gZ2xvYmFsT2JqZWN0LT5j
cmVhdGVQcm9ncmFtQ29kZUJsb2NrKGNhbGxGcmFtZSwgdGhpcywgJmV4Y2VwdGlvbik7CisgICAg
aWYgKGV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAgIEpTR2xvYmFs
TGV4aWNhbEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQgPSBnbG9iYWxPYmpl
Y3QtPmdsb2JhbExleGljYWxFbnZpcm9ubWVudCgpOworICAgIGNvbnN0IFZhcmlhYmxlRW52aXJv
bm1lbnQmIHZhcmlhYmxlRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPnZhcmlhYmxl
RGVjbGFyYXRpb25zKCk7CisgICAgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCYgbGV4aWNhbERl
Y2xhcmF0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5sZXhpY2FsRGVjbGFyYXRpb25zKCk7Cisg
ICAgLy8gVGhlIEVTNiBzcGVjIHNheXMgdGhhdCBubyB2YXJzL2dsb2JhbCBwcm9wZXJ0aWVzL2xl
dC9jb25zdCBjYW4gYmUgZHVwbGljYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorICAgIC8vIFRo
aXMgY2FycmllZCBvdXQgc2VjdGlvbiAxNS4xLjggb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3
LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWdsb2Jh
bGRlY2xhcmF0aW9uaW5zdGFudGlhdGlvbgorICAgIHsKKyAgICAgICAgRXhlY1N0YXRlKiBleGVj
ID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7CisgICAgICAgIC8vIENoZWNrIGZvciBpbnRl
cnNlY3Rpb24gb2YgInZhciIgYW5kICJsZXQiLyJjb25zdCIvImNsYXNzIgorICAgICAgICBmb3Ig
KGF1dG8mIGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaWYgKHZh
cmlhYmxlRGVjbGFyYXRpb25zLmNvbnRhaW5zKGVudHJ5LmtleSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBk
dXBsaWNhdGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJsZXQiLyJjb25zdCIvImNs
YXNzIiB3aWxsIHNoYWRvdyBhbnkgcHJlLWV4aXN0aW5nIGdsb2JhbCBwcm9wZXJ0eSBuYW1lcywg
b3IgInZhciIvImxldCIvImNvbnN0IiB2YXJpYWJsZXMuCisgICAgICAgIC8vIEl0J3MgYW4gZXJy
b3IgdG8gaW50cm9kdWNlIGEgc2hhZG93LgorICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4
aWNhbERlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgaWYgKGdsb2JhbE9iamVjdC0+aGFzUHJv
cGVydHkoZXhlYywgZW50cnkua2V5LmdldCgpKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBF
UzYgc3BlYyBzYXlzIHRoYXQganVzdCBSZXN0cmljdGVkR2xvYmFsUHJvcGVydHkgY2FuJ3QgYmUg
c2hhZG93ZWQKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gOC4x
LjEuNC4xNCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9y
Zy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtaGFzcmVzdHJpY3RlZGdsb2JhbHByb3BlcnR5
CisgICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgICAg
ICAgICAgICAgZ2xvYmFsT2JqZWN0LT5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXhlYywgZW50
cnkua2V5LmdldCgpLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSgpICE9IGpzVW5kZWZpbmVkKCkgJiYgIWRlc2NyaXB0
b3IuY29uZmlndXJhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50
YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxl
IHRoYXQgc2hhZG93cyBhIGdsb2JhbCBwcm9wZXJ0eTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0
KCkpLCAiJyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
IGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5Lmtl
eS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUuaXND
b25zdCgpICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYmICFp
c1N0cmljdE1vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhbGxvdyAi
Y29uc3QiIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgdW5kZXIgdGhpcyBzZXR0aW5nLgorICAgICAg
ICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2UgZG9uJ3QgImxldCIgdmFyaWFibGVzIHRv
IGJlIG92ZXJyaWRkZW4gYnkgImNvbnN0IiB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgICAg
IGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzQ29uc3RWYXJpYWJsZShlbnRyeS5rZXku
Z2V0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtl
U3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5
LmtleS5nZXQoKSksICInIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
Ly8gQ2hlY2sgaWYgYW55IG5ldyAidmFyInMgd2lsbCBzaGFkb3cgYW55IHByZXZpb3VzICJsZXQi
LyJjb25zdCIvImNsYXNzIiBuYW1lcy4KKyAgICAgICAgLy8gSXQncyBhbiBlcnJvciB0byBpbnRy
b2R1Y2UgYSBzaGFkb3cuCisgICAgICAgIGlmICghZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5p
c0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xh
cmF0aW9ucykgeworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQt
Pmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUg
ZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBtX3VubGlua2VkUHJvZ3Jh
bUNvZGVCbG9jay5zZXQodm0sIHRoaXMsIHVubGlua2VkQ29kZUJsb2NrKTsKKworICAgIEJhdGNo
ZWRUcmFuc2l0aW9uT3B0aW1pemVyIG9wdGltaXplcih2bSwgZ2xvYmFsT2JqZWN0KTsKKworICAg
IGZvciAoc2l6ZV90IGkgPSAwLCBudW1iZXJPZkZ1bmN0aW9ucyA9IHVubGlua2VkQ29kZUJsb2Nr
LT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMoKTsgaSA8IG51bWJlck9mRnVuY3Rpb25zOyArK2kpIHsK
KyAgICAgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRnVuY3Rpb25FeGVj
dXRhYmxlID0gdW5saW5rZWRDb2RlQmxvY2stPmZ1bmN0aW9uRGVjbChpKTsKKyAgICAgICAgQVNT
RVJUKCF1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7CisgICAg
ICAgIGdsb2JhbE9iamVjdC0+YWRkRnVuY3Rpb24oY2FsbEZyYW1lLCB1bmxpbmtlZEZ1bmN0aW9u
RXhlY3V0YWJsZS0+bmFtZSgpKTsKKyAgICAgICAgaWYgKHZtLnR5cGVQcm9maWxlcigpIHx8IHZt
LmNvbnRyb2xGbG93UHJvZmlsZXIoKSkgeworICAgICAgICAgICAgdm0uZnVuY3Rpb25IYXNFeGVj
dXRlZENhY2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCAKKyAgICAgICAg
ICAgICAgICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0KCksIAorICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBl
UHJvZmlsaW5nRW5kT2Zmc2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRv
JiBlbnRyeSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7CisgICAgICAgIEFTU0VSVChlbnRyeS52
YWx1ZS5pc1ZhcigpKTsKKyAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRWYXIoY2FsbEZyYW1lLCBJ
ZGVudGlmaWVyOjpmcm9tVWlkKCZ2bSwgZW50cnkua2V5LmdldCgpKSk7CisgICAgfQorCisgICAg
eworICAgICAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmly
b25tZW50ID0ganNDYXN0PEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50Kj4oZ2xvYmFsT2JqZWN0
LT5nbG9iYWxTY29wZSgpKTsKKyAgICAgICAgU3ltYm9sVGFibGUqIHN5bWJvbFRhYmxlID0gZ2xv
YmFsTGV4aWNhbEVudmlyb25tZW50LT5zeW1ib2xUYWJsZSgpOworICAgICAgICBDb25jdXJyZW50
SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJsZS0+bV9sb2NrKTsKKyAgICAgICAgZm9yIChhdXRv
JiBlbnRyeSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChVTkxJS0VM
WShlbnRyeS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNo
b3VsZFRocm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChz
eW1ib2xUYWJsZS0+Y29udGFpbnMobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCkpKQorICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNjb3BlT2Zm
c2V0IG9mZnNldCA9IHN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3BlT2Zmc2V0KGxvY2tlcik7Cisg
ICAgICAgICAgICBTeW1ib2xUYWJsZUVudHJ5IG5ld0VudHJ5KFZhck9mZnNldChvZmZzZXQpLCBl
bnRyeS52YWx1ZS5pc0NvbnN0KCkgPyBSZWFkT25seSA6IDApOworICAgICAgICAgICAgbmV3RW50
cnkucHJlcGFyZVRvV2F0Y2goKTsKKyAgICAgICAgICAgIHN5bWJvbFRhYmxlLT5hZGQobG9ja2Vy
LCBlbnRyeS5rZXkuZ2V0KCksIG5ld0VudHJ5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
U2NvcGVPZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0ID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5h
ZGRWYXJpYWJsZXMoMSwganNURFpWYWx1ZSgpKTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
KG9mZnNldEZvckFzc2VydCA9PSBvZmZzZXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVy
biAwOworfQorCit2b2lkIFByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCog
Y2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIHRo
aXNPYmplY3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKKyAgICBBU1NFUlRf
R0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7CisgICAgU2NyaXB0RXhlY3V0
YWJsZTo6dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKKyAgICB2aXNpdG9yLmFw
cGVuZCgmdGhpc09iamVjdC0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2spOworICAgIGlmICh0
aGlzT2JqZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2spCisgICAgICAgIHRoaXNPYmplY3QtPm1fcHJv
Z3JhbUNvZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Cit9CisKK3ZvaWQgTW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYg
dmlzaXRvcikKK3sKKyAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpz
Q2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpF
Q1RfSU5IRVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2
aXNpdENoaWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOworICAgIHZpc2l0b3IuYXBwZW5kKCZ0
aGlzT2JqZWN0LT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7CisgICAgdmlzaXRv
ci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZSk7Cisg
ICAgaWYgKHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jaykKKyAgICAgICAgdGhp
c09iamVjdC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsK
K30KKworRnVuY3Rpb25Db2RlQmxvY2sqIEZ1bmN0aW9uRXhlY3V0YWJsZTo6YmFzZWxpbmVDb2Rl
QmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQoreworICAgIEZ1bmN0aW9uQ29k
ZUJsb2NrKiByZXN1bHQ7CisgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJl
c3VsdCA9IG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmVzdWx0ID0g
bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7CisgICAgfQorICAgIGlmICghcmVzdWx0KQor
ICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxv
Y2sqPihyZXN1bHQtPmJhc2VsaW5lQWx0ZXJuYXRpdmUoKSk7Cit9CisKK3ZvaWQgRnVuY3Rpb25F
eGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0
b3IpCit7CisgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEZ1bmN0
aW9uRXhlY3V0YWJsZSo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhp
c09iamVjdCwgaW5mbygpKTsKKyAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRo
aXNPYmplY3QsIHZpc2l0b3IpOworICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNh
bGwpCisgICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHko
dmlzaXRvcik7CisgICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0KQor
ICAgICAgICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC0+dmlzaXRXZWFrbHko
dmlzaXRvcik7CisgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRFeGVj
dXRhYmxlKTsKKyAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9zaW5nbGV0b25GdW5j
dGlvbik7Cit9CisKK0Z1bmN0aW9uRXhlY3V0YWJsZSogRnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9t
R2xvYmFsQ29kZSgKKyAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmIGV4ZWMs
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgCisgICAgSlNPYmplY3QqJiBleGNlcHRpb24sIGlu
dCBvdmVycmlkZUxpbmVOdW1iZXIpCit7CisgICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUq
IHVubGlua2VkRXhlY3V0YWJsZSA9IAorICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJs
ZTo6ZnJvbUdsb2JhbENvZGUoCisgICAgICAgICAgICBuYW1lLCBleGVjLCBzb3VyY2UsIGV4Y2Vw
dGlvbiwgb3ZlcnJpZGVMaW5lTnVtYmVyKTsKKyAgICBpZiAoIXVubGlua2VkRXhlY3V0YWJsZSkK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gdW5saW5rZWRFeGVjdXRhYmxl
LT5saW5rKGV4ZWMudm0oKSwgc291cmNlLCBvdmVycmlkZUxpbmVOdW1iZXIpOworfQorCisjaWYg
RU5BQkxFKFdFQkFTU0VNQkxZKQorY29uc3QgQ2xhc3NJbmZvIFdlYkFzc2VtYmx5RXhlY3V0YWJs
ZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHlFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpz
X2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoV2ViQXNzZW1ibHlFeGVjdXRhYmxlKSB9Owor
CitXZWJBc3NlbWJseUV4ZWN1dGFibGU6OldlYkFzc2VtYmx5RXhlY3V0YWJsZShWTSYgdm0sIGNv
bnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgSlNXYXNtTW9kdWxlKiBtb2R1bGUsIHVuc2lnbmVkIGZ1
bmN0aW9uSW5kZXgpCisgICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgdm0ud2ViQXNzZW1ibHlFeGVj
dXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIE5vSW50
cmluc2ljKQorICAgICwgbV9zb3VyY2Uoc291cmNlKQorICAgICwgbV9tb2R1bGUodm0sIHRoaXMs
IG1vZHVsZSkKKyAgICAsIG1fZnVuY3Rpb25JbmRleChmdW5jdGlvbkluZGV4KQoreworICAgIEFT
U0VSVChzb3VyY2UucHJvdmlkZXIoKS0+c291cmNlVHlwZSgpID09IFNvdXJjZVByb3ZpZGVyU291
cmNlVHlwZTo6V2ViQXNzZW1ibHkpOworfQorCit2b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6
ZGVzdHJveShKU0NlbGwqIGNlbGwpCit7CisgICAgc3RhdGljX2Nhc3Q8V2ViQXNzZW1ibHlFeGVj
dXRhYmxlKj4oY2VsbCktPldlYkFzc2VtYmx5RXhlY3V0YWJsZTo6fldlYkFzc2VtYmx5RXhlY3V0
YWJsZSgpOworfQorCit2b2lkIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihK
U0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIFdlYkFzc2VtYmx5RXhl
Y3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxXZWJBc3NlbWJseUV4ZWN1dGFibGUqPihjZWxs
KTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Cisg
ICAgRXhlY3V0YWJsZUJhc2U6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwgdmlzaXRvcik7Cisg
ICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbCkKKyAgICAgICAgdGhpc09iamVj
dC0+bV9jb2RlQmxvY2tGb3JDYWxsLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKKyAgICB2aXNpdG9y
LmFwcGVuZCgmdGhpc09iamVjdC0+bV9tb2R1bGUpOworfQorI2VuZGlmCisKK3ZvaWQgRXhlY3V0
YWJsZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkgY29uc3QKK3sKKyAgICBFeGVjdXRhYmxl
QmFzZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0PEV4ZWN1dGFibGVCYXNlKj4odGhpcyk7CisgICAg
CisgICAgaWYgKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkgeworICAg
ICAgICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRpdmUgPSBqc0Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+
KHJlYWxUaGlzKTsKKyAgICAgICAgb3V0LnByaW50KCJOYXRpdmVFeGVjdXRhYmxlOiIsIFJhd1Bv
aW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUtPmZ1bmN0aW9uKCkpKSwgIi8iLCBSYXdQ
b2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZlLT5jb25zdHJ1Y3RvcigpKSkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhl
Y3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIEV2YWxFeGVjdXRhYmxlKiBldmFsID0ganNDYXN0
PEV2YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2Rl
QmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJs
b2NrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50KCJFdmFsRXhlY3V0YWJs
ZSB3L28gQ29kZUJsb2NrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgaWYg
KGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxlOjppbmZvKCkpIHsKKyAgICAgICAgUHJv
Z3JhbUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihyZWFsVGhp
cyk7CisgICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGV2YWwtPmNvZGVCbG9jaygp
KQorICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxvY2spOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBvdXQucHJpbnQoIlByb2dyYW1FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7CisgICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
KiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMp
OworICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBleGVjdXRhYmxlLT5jb2RlQmxv
Y2soKSkKKyAgICAgICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgb3V0LnByaW50KCJNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSB3L28gQ29kZUJs
b2NrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgRnVuY3Rpb25FeGVjdXRh
YmxlKiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Cisg
ICAgaWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29kZUJsb2NrKCkpCisgICAgICAgIG91dC5wcmludCgi
RnVuY3Rpb25FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2siKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
Q29tbWFQcmludGVyIGNvbW1hKCIvIik7CisgICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2Nr
Rm9yQ2FsbCgpKQorICAgICAgICAgICAgb3V0LnByaW50KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVC
bG9ja0ZvckNhbGwoKSk7CisgICAgICAgIGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3Ry
dWN0KCkpCisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWEsICpmdW5jdGlvbi0+Y29kZUJsb2Nr
Rm9yQ29uc3RydWN0KCkpOworICAgIH0KK30KKworQ29kZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFz
ZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cit7CisgICAgaWYg
KHRoaXMtPmNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSkKKyAgICAgICAg
cmV0dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2lu
ZCk7CisgICAgCisgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBTY3JpcHRFeGVjdXRhYmxlKj4odGhp
cyktPmhhc2hGb3Ioa2luZCk7Cit9CisKK0NvZGVCbG9ja0hhc2ggTmF0aXZlRXhlY3V0YWJsZTo6
aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cit7CisgICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgIHJldHVybiBDb2RlQmxvY2tIYXNoKHN0YXRpY19j
YXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90PihtX2Z1bmN0aW9uKSkpOworICAgIAor
ICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgcmV0dXJu
IENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+
KG1fY29uc3RydWN0b3IpKSk7Cit9CisKK0NvZGVCbG9ja0hhc2ggU2NyaXB0RXhlY3V0YWJsZTo6
aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNvbnN0Cit7CisgICAgcmV0dXJu
IENvZGVCbG9ja0hhc2goc291cmNlKCksIGtpbmQpOworfQorCit9CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9XZWJBc3NlbWJseUV4ZWN1dGFibGUuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0YWJsZS5j
cHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1dl
YkFzc2VtYmx5RXhlY3V0YWJsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDYgQEAK
ICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRXhlY3V0YWJsZS5oIgogCiAj
aW5jbHVkZSAiQmF0Y2hlZFRyYW5zaXRpb25PcHRpbWl6ZXIuaCIKICNpbmNsdWRlICJDb2RlQmxv
Y2suaCIKQEAgLTQwLDcxMCArMzksNiBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAotY29uc3QgQ2xh
c3NJbmZvIEV4ZWN1dGFibGVCYXNlOjpzX2luZm8gPSB7ICJFeGVjdXRhYmxlIiwgMCwgMCwgQ1JF
QVRFX01FVEhPRF9UQUJMRShFeGVjdXRhYmxlQmFzZSkgfTsKLQotdm9pZCBFeGVjdXRhYmxlQmFz
ZTo6ZGVzdHJveShKU0NlbGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8RXhlY3V0YWJsZUJh
c2UqPihjZWxsKS0+RXhlY3V0YWJsZUJhc2U6On5FeGVjdXRhYmxlQmFzZSgpOwotfQotCi12b2lk
IEV4ZWN1dGFibGVCYXNlOjpjbGVhckNvZGUoKQotewotI2lmIEVOQUJMRShKSVQpCi0gICAgbV9q
aXRDb2RlRm9yQ2FsbCA9IG51bGxwdHI7Ci0gICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gbnVs
bHB0cjsKLSAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBNYWNyb0Fzc2VtYmxl
ckNvZGVQdHIoKTsKLSAgICBtX2ppdENvZGVGb3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1h
Y3JvQXNzZW1ibGVyQ29kZVB0cigpOwotI2VuZGlmCi0gICAgbV9udW1QYXJhbWV0ZXJzRm9yQ2Fs
bCA9IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRDsKLSAgICBtX251bVBhcmFtZXRlcnNGb3JD
b25zdHJ1Y3QgPSBOVU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQ7Ci0KLSAgICBpZiAoY2xhc3NJ
bmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAgICAgRnVuY3Rpb25F
eGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMp
OwotICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuY2xlYXIoKTsKLSAgICAg
ICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1Y3QuY2xlYXIoKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6
aW5mbygpKSB7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PEV2
YWxFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9j
ay5jbGVhcigpOwotICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5j
bGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc0luZm8o
KSA9PSBQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFByb2dyYW1FeGVjdXRh
YmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAg
ICAgIGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICBleGVj
dXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5jbGVhcigpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE1vZHVsZVByb2dyYW1FeGVjdXRh
YmxlOjppbmZvKCkpIHsKLSAgICAgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFi
bGUgPSBqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgZXhl
Y3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAgIGV4ZWN1
dGFibGUtPm1fdW5saW5rZWRNb2R1bGVQcm9ncmFtQ29kZUJsb2NrLmNsZWFyKCk7Ci0gICAgICAg
IGV4ZWN1dGFibGUtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZS5jbGVhcigpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIAotI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKLSAgICBp
ZiAoY2xhc3NJbmZvKCkgPT0gV2ViQXNzZW1ibHlFeGVjdXRhYmxlOjppbmZvKCkpIHsKLSAgICAg
ICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFdlYkFzc2VtYmx5
RXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBleGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNh
bGwuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgQVNTRVJU
KGNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1dGFibGU6OmluZm8oKSk7Ci19Ci0KLWNvbnN0IENs
YXNzSW5mbyBOYXRpdmVFeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJOYXRpdmVFeGVjdXRhYmxlIiwg
JkV4ZWN1dGFibGVCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoTmF0aXZlRXhl
Y3V0YWJsZSkgfTsKLQotTmF0aXZlRXhlY3V0YWJsZSogTmF0aXZlRXhlY3V0YWJsZTo6Y3JlYXRl
KFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1
bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlv
biBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKQot
ewotICAgIE5hdGl2ZUV4ZWN1dGFibGUqIGV4ZWN1dGFibGU7Ci0gICAgZXhlY3V0YWJsZSA9IG5l
dyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPE5hdGl2ZUV4ZWN1dGFibGU+KHZtLmhlYXApKSBOYXRp
dmVFeGVjdXRhYmxlKHZtLCBmdW5jdGlvbiwgY29uc3RydWN0b3IsIGludHJpbnNpYyk7Ci0gICAg
ZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24odm0sIGNhbGxUaHVuaywgY29uc3RydWN0VGh1bmss
IG5hbWUpOwotICAgIHJldHVybiBleGVjdXRhYmxlOwotfQotCi12b2lkIE5hdGl2ZUV4ZWN1dGFi
bGU6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQotewotICAgIHN0YXRpY19jYXN0PE5hdGl2ZUV4ZWN1
dGFibGUqPihjZWxsKS0+TmF0aXZlRXhlY3V0YWJsZTo6fk5hdGl2ZUV4ZWN1dGFibGUoKTsKLX0K
LQotU3RydWN0dXJlKiBOYXRpdmVFeGVjdXRhYmxlOjpjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBK
U0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotewotICAgIHJldHVy
biBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90bywgVHlwZUluZm8oQ2Vs
bFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLX0KLQotdm9pZCBOYXRpdmVFeGVjdXRh
YmxlOjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIFBhc3NSZWZQdHI8SklUQ29kZT4gY2FsbFRodW5r
LCBQYXNzUmVmUHRyPEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBjb25zdCBTdHJpbmcmIG5hbWUp
Ci17Ci0gICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwotICAgIG1faml0Q29kZUZvckNhbGwg
PSBjYWxsVGh1bms7Ci0gICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0ID0gY29uc3RydWN0VGh1bms7
Ci0gICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ2FsbC0+
YWRkcmVzc0ZvckNhbGwoTXVzdENoZWNrQXJpdHkpOwotICAgIG1faml0Q29kZUZvckNvbnN0cnVj
dFdpdGhBcml0eUNoZWNrID0gbV9qaXRDb2RlRm9yQ29uc3RydWN0LT5hZGRyZXNzRm9yQ2FsbChN
dXN0Q2hlY2tBcml0eSk7Ci0gICAgbV9uYW1lID0gbmFtZTsKLX0KLQotTmF0aXZlRXhlY3V0YWJs
ZTo6TmF0aXZlRXhlY3V0YWJsZShWTSYgdm0sIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRp
dmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGludHJpbnNpYykKLSAgICA6IEV4ZWN1
dGFibGVCYXNlKHZtLCB2bS5uYXRpdmVFeGVjdXRhYmxlU3RydWN0dXJlLmdldCgpLCBOVU1fUEFS
QU1FVEVSU19JU19IT1NULCBpbnRyaW5zaWMpCi0gICAgLCBtX2Z1bmN0aW9uKGZ1bmN0aW9uKQot
ICAgICwgbV9jb25zdHJ1Y3Rvcihjb25zdHJ1Y3RvcikKLXsKLX0KLQotY29uc3QgQ2xhc3NJbmZv
IFNjcmlwdEV4ZWN1dGFibGU6OnNfaW5mbyA9IHsgIlNjcmlwdEV4ZWN1dGFibGUiLCAmRXhlY3V0
YWJsZUJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShTY3JpcHRFeGVjdXRhYmxl
KSB9OwotCi1TY3JpcHRFeGVjdXRhYmxlOjpTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSogc3Ry
dWN0dXJlLCBWTSYgdm0sIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgYm9vbCBpc0luU3RyaWN0
Q29udGV4dCwgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0lu
QXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSBldmFsQ29udGV4dFR5cGUsIElu
dHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgOiBFeGVjdXRhYmxlQmFzZSh2bSwgc3RydWN0dXJlLCBO
VU1fUEFSQU1FVEVSU19OT1RfQ09NUElMRUQsIGludHJpbnNpYykKLSAgICAsIG1fZmVhdHVyZXMo
aXNJblN0cmljdENvbnRleHQgPyBTdHJpY3RNb2RlRmVhdHVyZSA6IDApCi0gICAgLCBtX2RpZFRy
eVRvRW50ZXJJbkxvb3AoZmFsc2UpCi0gICAgLCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzKGZhbHNl
KQotICAgICwgbV9uZXZlcklubGluZShmYWxzZSkKLSAgICAsIG1fbmV2ZXJPcHRpbWl6ZShmYWxz
ZSkKLSAgICAsIG1fbmV2ZXJGVExPcHRpbWl6ZShmYWxzZSkKLSAgICAsIG1faXNBcnJvd0Z1bmN0
aW9uQ29udGV4dChpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQpCi0gICAgLCBtX2NhblVzZU9TUkV4
aXRGdXp6aW5nKHRydWUpCi0gICAgLCBtX2Rlcml2ZWRDb250ZXh0VHlwZShzdGF0aWNfY2FzdDx1
bnNpZ25lZD4oZGVyaXZlZENvbnRleHRUeXBlKSkKLSAgICAsIG1fZXZhbENvbnRleHRUeXBlKHN0
YXRpY19jYXN0PHVuc2lnbmVkPihldmFsQ29udGV4dFR5cGUpKQotICAgICwgbV9vdmVycmlkZUxp
bmVOdW1iZXIoLTEpCi0gICAgLCBtX2ZpcnN0TGluZSgtMSkKLSAgICAsIG1fbGFzdExpbmUoLTEp
Ci0gICAgLCBtX3N0YXJ0Q29sdW1uKFVJTlRfTUFYKQotICAgICwgbV9lbmRDb2x1bW4oVUlOVF9N
QVgpCi0gICAgLCBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNldChVSU5UX01BWCkKLSAgICAsIG1f
dHlwZVByb2ZpbGluZ0VuZE9mZnNldChVSU5UX01BWCkKLSAgICAsIG1fc291cmNlKHNvdXJjZSkK
LXsKLX0KLQotdm9pZCBTY3JpcHRFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsK
LSAgICBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRhYmxlKj4oY2VsbCktPlNjcmlwdEV4ZWN1dGFi
bGU6On5TY3JpcHRFeGVjdXRhYmxlKCk7Ci19Ci0KLXZvaWQgU2NyaXB0RXhlY3V0YWJsZTo6aW5z
dGFsbENvZGUoQ29kZUJsb2NrKiBjb2RlQmxvY2spCi17Ci0gICAgaW5zdGFsbENvZGUoKmNvZGVC
bG9jay0+dm0oKSwgY29kZUJsb2NrLCBjb2RlQmxvY2stPmNvZGVUeXBlKCksIGNvZGVCbG9jay0+
c3BlY2lhbGl6YXRpb25LaW5kKCkpOwotfQotCi12b2lkIFNjcmlwdEV4ZWN1dGFibGU6Omluc3Rh
bGxDb2RlKFZNJiB2bSwgQ29kZUJsb2NrKiBnZW5lcmljQ29kZUJsb2NrLCBDb2RlVHlwZSBjb2Rl
VHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotewotICAgIEFTU0VSVCh2bS5oZWFw
LmlzRGVmZXJyZWQoKSk7Ci0gICAgCi0gICAgaWYgKGdlbmVyaWNDb2RlQmxvY2spCi0gICAgICAg
IENPREVCTE9DS19MT0dfRVZFTlQoZ2VuZXJpY0NvZGVCbG9jaywgImluc3RhbGxDb2RlIiwgKCkp
OwotICAgIAotICAgIENvZGVCbG9jayogb2xkQ29kZUJsb2NrID0gbnVsbHB0cjsKLSAgICAKLSAg
ICBzd2l0Y2ggKGNvZGVUeXBlKSB7Ci0gICAgY2FzZSBHbG9iYWxDb2RlOiB7Ci0gICAgICAgIFBy
b2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4o
dGhpcyk7Ci0gICAgICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0
PFByb2dyYW1Db2RlQmxvY2sqPihnZW5lcmljQ29kZUJsb2NrKTsKLSAgICAgICAgCi0gICAgICAg
IEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgCi0gICAgICAgIG9sZENvZGVC
bG9jayA9IGV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVCbG9jay5nZXQoKTsKLSAgICAgICAgZXhl
Y3V0YWJsZS0+bV9wcm9ncmFtQ29kZUJsb2NrLnNldE1heUJlTnVsbCh2bSwgdGhpcywgY29kZUJs
b2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBNb2R1bGVDb2RlOiB7Ci0g
ICAgICAgIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqPihnZW5l
cmljQ29kZUJsb2NrKTsKLQotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2RlRm9yQ2FsbCk7Ci0K
LSAgICAgICAgb2xkQ29kZUJsb2NrID0gZXhlY3V0YWJsZS0+bV9tb2R1bGVQcm9ncmFtQ29kZUJs
b2NrLmdldCgpOwotICAgICAgICBleGVjdXRhYmxlLT5tX21vZHVsZVByb2dyYW1Db2RlQmxvY2su
c2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICBicmVhazsKLSAgICB9
Ci0KLSAgICBjYXNlIEV2YWxDb2RlOiB7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRh
YmxlID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEV2YWxDb2RlQmxv
Y2sqIGNvZGVCbG9jayA9IHN0YXRpY19jYXN0PEV2YWxDb2RlQmxvY2sqPihnZW5lcmljQ29kZUJs
b2NrKTsKLSAgICAgICAgCi0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAg
ICAgICAgCi0gICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fZXZhbENvZGVCbG9j
ay5nZXQoKTsKLSAgICAgICAgZXhlY3V0YWJsZS0+bV9ldmFsQ29kZUJsb2NrLnNldE1heUJlTnVs
bCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICAgICAK
LSAgICBjYXNlIEZ1bmN0aW9uQ29kZTogewotICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBqc0Nhc3Q8RnVuY3Rpb25FeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIEZ1
bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9j
ayo+KGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChraW5kKSB7
Ci0gICAgICAgIGNhc2UgQ29kZUZvckNhbGw6Ci0gICAgICAgICAgICBvbGRDb2RlQmxvY2sgPSBl
eGVjdXRhYmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAgICAgICBleGVjdXRh
YmxlLT5tX2NvZGVCbG9ja0ZvckNhbGwuc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2sp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAg
ICAgICAgICAgIG9sZENvZGVCbG9jayA9IGV4ZWN1dGFibGUtPm1fY29kZUJsb2NrRm9yQ29uc3Ry
dWN0LmdldCgpOwotICAgICAgICAgICAgZXhlY3V0YWJsZS0+bV9jb2RlQmxvY2tGb3JDb25zdHJ1
Y3Quc2V0TWF5QmVOdWxsKHZtLCB0aGlzLCBjb2RlQmxvY2spOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLQotICAgIHN3aXRjaCAo
a2luZCkgewotICAgIGNhc2UgQ29kZUZvckNhbGw6Ci0gICAgICAgIG1faml0Q29kZUZvckNhbGwg
PSBnZW5lcmljQ29kZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+aml0Q29kZSgpIDogbnVsbHB0
cjsKLSAgICAgICAgbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0eUNoZWNrID0gTWFjcm9Bc3NlbWJs
ZXJDb2RlUHRyKCk7Ci0gICAgICAgIG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwgPSBnZW5lcmljQ29k
ZUJsb2NrID8gZ2VuZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRF
UlNfTk9UX0NPTVBJTEVEOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENvZGVGb3JDb25zdHJ1
Y3Q6Ci0gICAgICAgIG1faml0Q29kZUZvckNvbnN0cnVjdCA9IGdlbmVyaWNDb2RlQmxvY2sgPyBn
ZW5lcmljQ29kZUJsb2NrLT5qaXRDb2RlKCkgOiBudWxscHRyOwotICAgICAgICBtX2ppdENvZGVG
b3JDb25zdHJ1Y3RXaXRoQXJpdHlDaGVjayA9IE1hY3JvQXNzZW1ibGVyQ29kZVB0cigpOwotICAg
ICAgICBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPSBnZW5lcmljQ29kZUJsb2NrID8gZ2Vu
ZXJpY0NvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpIDogTlVNX1BBUkFNRVRFUlNfTk9UX0NPTVBJ
TEVEOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuZXJpY0NvZGVCbG9jaykg
ewotICAgICAgICBSRUxFQVNFX0FTU0VSVChnZW5lcmljQ29kZUJsb2NrLT5vd25lckV4ZWN1dGFi
bGUoKSA9PSB0aGlzKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoSklUQ29kZTo6aXNFeGVjdXRh
YmxlU2NyaXB0KGdlbmVyaWNDb2RlQmxvY2stPmppdFR5cGUoKSkpOwotICAgICAgICAKLSAgICAg
ICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VPU1IoKSkKLSAgICAgICAgICAgIGRhdGFMb2coIkluc3Rh
bGxpbmcgIiwgKmdlbmVyaWNDb2RlQmxvY2ssICJcbiIpOwotICAgICAgICAKLSAgICAgICAgaWYg
KHZtLm1fcGVyQnl0ZWNvZGVQcm9maWxlcikKLSAgICAgICAgICAgIHZtLm1fcGVyQnl0ZWNvZGVQ
cm9maWxlci0+ZW5zdXJlQnl0ZWNvZGVzRm9yKGdlbmVyaWNDb2RlQmxvY2spOwotICAgICAgICAK
LSAgICAgICAgaWYgKERlYnVnZ2VyKiBkZWJ1Z2dlciA9IGdlbmVyaWNDb2RlQmxvY2stPmdsb2Jh
bE9iamVjdCgpLT5kZWJ1Z2dlcigpKQotICAgICAgICAgICAgZGVidWdnZXItPnJlZ2lzdGVyQ29k
ZUJsb2NrKGdlbmVyaWNDb2RlQmxvY2spOwotICAgIH0KLQotICAgIGlmIChvbGRDb2RlQmxvY2sp
Ci0gICAgICAgIG9sZENvZGVCbG9jay0+dW5saW5rSW5jb21pbmdDYWxscygpOwotCi0gICAgdm0u
aGVhcC53cml0ZUJhcnJpZXIodGhpcyk7Ci19Ci0KLUNvZGVCbG9jayogU2NyaXB0RXhlY3V0YWJs
ZTo6bmV3Q29kZUJsb2NrRm9yKAotICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgSlNG
dW5jdGlvbiogZnVuY3Rpb24sIEpTU2NvcGUqIHNjb3BlLCBKU09iamVjdComIGV4Y2VwdGlvbikK
LXsKLSAgICBWTSogdm0gPSBzY29wZS0+dm0oKTsKLSAgICBhdXRvIHRocm93U2NvcGUgPSBERUNM
QVJFX1RIUk9XX1NDT1BFKCp2bSk7Ci0KLSAgICBBU1NFUlQodm0tPmhlYXAuaXNEZWZlcnJlZCgp
KTsKLSAgICBBU1NFUlQoc3RhcnRDb2x1bW4oKSAhPSBVSU5UX01BWCk7Ci0gICAgQVNTRVJUKGVu
ZENvbHVtbigpICE9IFVJTlRfTUFYKTsKLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBFdmFsRXhl
Y3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEV2YWxFeGVjdXRhYmxlKiBleGVjdXRhYmxlID0g
anNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNhbGwpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVCghZXhlY3V0YWJsZS0+
bV9ldmFsQ29kZUJsb2NrKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZ1bmN0aW9uKTsKLSAg
ICAgICAgcmV0dXJuIEV2YWxDb2RlQmxvY2s6OmNyZWF0ZSh2bSwKLSAgICAgICAgICAgIGV4ZWN1
dGFibGUsIGV4ZWN1dGFibGUtPm1fdW5saW5rZWRFdmFsQ29kZUJsb2NrLmdldCgpLCBzY29wZSwK
LSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnNvdXJjZSgpLnByb3ZpZGVyKCkpOwotICAgIH0KLSAg
ICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewot
ICAgICAgICBQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxQcm9ncmFtRXhl
Y3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JD
YWxsKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fcHJvZ3JhbUNvZGVC
bG9jayk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJldHVy
biBQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBl
eGVjdXRhYmxlLT5tX3VubGlua2VkUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUsCi0gICAg
ICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxlLT5zb3Vy
Y2UoKS5zdGFydENvbHVtbigpKTsKLSAgICB9Ci0KLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gTW9k
dWxlUHJvZ3JhbUV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRo
aXMpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoIWV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7
Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKCFmdW5jdGlvbik7Ci0gICAgICAgIHJldHVybiBNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0sCi0gICAgICAgICAgICBleGVjdXRhYmxlLCBl
eGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jay5nZXQoKSwgc2NvcGUs
Ci0gICAgICAgICAgICBleGVjdXRhYmxlLT5zb3VyY2UoKS5wcm92aWRlcigpLCBleGVjdXRhYmxl
LT5zb3VyY2UoKS5zdGFydENvbHVtbigpKTsKLSAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChj
bGFzc0luZm8oKSA9PSBGdW5jdGlvbkV4ZWN1dGFibGU6OmluZm8oKSk7Ci0gICAgUkVMRUFTRV9B
U1NFUlQoZnVuY3Rpb24pOwotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICBSRUxFQVNFX0FTU0VSVCghZXhl
Y3V0YWJsZS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKLSAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFs
T2JqZWN0ID0gc2NvcGUtPmdsb2JhbE9iamVjdCgpOwotICAgIFBhcnNlckVycm9yIGVycm9yOwot
ICAgIERlYnVnZ2VyTW9kZSBkZWJ1Z2dlck1vZGUgPSBnbG9iYWxPYmplY3QtPmhhc0ludGVyYWN0
aXZlRGVidWdnZXIoKSA/IERlYnVnZ2VyT24gOiBEZWJ1Z2dlck9mZjsKLSAgICBVbmxpbmtlZEZ1
bmN0aW9uQ29kZUJsb2NrKiB1bmxpbmtlZENvZGVCbG9jayA9IAotICAgICAgICBleGVjdXRhYmxl
LT5tX3VubGlua2VkRXhlY3V0YWJsZS0+dW5saW5rZWRDb2RlQmxvY2tGb3IoCi0gICAgICAgICAg
ICAqdm0sIGV4ZWN1dGFibGUtPm1fc291cmNlLCBraW5kLCBkZWJ1Z2dlck1vZGUsIGVycm9yLCAK
LSAgICAgICAgICAgIGV4ZWN1dGFibGUtPnBhcnNlTW9kZSgpKTsKLSAgICByZWNvcmRQYXJzZSgK
LSAgICAgICAgZXhlY3V0YWJsZS0+bV91bmxpbmtlZEV4ZWN1dGFibGUtPmZlYXR1cmVzKCksIAot
ICAgICAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkRXhlY3V0YWJsZS0+aGFzQ2FwdHVyZWRWYXJp
YWJsZXMoKSwgZmlyc3RMaW5lKCksIAotICAgICAgICBsYXN0TGluZSgpLCBzdGFydENvbHVtbigp
LCBlbmRDb2x1bW4oKSk7IAotICAgIGlmICghdW5saW5rZWRDb2RlQmxvY2spIHsKLSAgICAgICAg
ZXhjZXB0aW9uID0gdGhyb3dFeGNlcHRpb24oCi0gICAgICAgICAgICBnbG9iYWxPYmplY3QtPmds
b2JhbEV4ZWMoKSwgdGhyb3dTY29wZSwKLSAgICAgICAgICAgIGVycm9yLnRvRXJyb3JPYmplY3Qo
Z2xvYmFsT2JqZWN0LCBleGVjdXRhYmxlLT5tX3NvdXJjZSkpOwotICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLSAgICB9Ci0KLSAgICBTb3VyY2VQcm92aWRlciogcHJvdmlkZXIgPSBleGVjdXRhYmxl
LT5zb3VyY2UoKS5wcm92aWRlcigpOwotICAgIHVuc2lnbmVkIHNvdXJjZU9mZnNldCA9IGV4ZWN1
dGFibGUtPnNvdXJjZSgpLnN0YXJ0T2Zmc2V0KCk7Ci0gICAgdW5zaWduZWQgc3RhcnRDb2x1bW4g
PSBleGVjdXRhYmxlLT5zb3VyY2UoKS5zdGFydENvbHVtbigpOwotCi0gICAgcmV0dXJuIEZ1bmN0
aW9uQ29kZUJsb2NrOjpjcmVhdGUodm0sCi0gICAgICAgIGV4ZWN1dGFibGUsIHVubGlua2VkQ29k
ZUJsb2NrLCBzY29wZSwgcHJvdmlkZXIsIHNvdXJjZU9mZnNldCwgc3RhcnRDb2x1bW4pOwotfQot
Ci1Db2RlQmxvY2sqIFNjcmlwdEV4ZWN1dGFibGU6Om5ld1JlcGxhY2VtZW50Q29kZUJsb2NrRm9y
KAotICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLXsKLSAgICBpZiAoY2xhc3NJbmZv
KCkgPT0gRXZhbEV4ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChr
aW5kID09IENvZGVGb3JDYWxsKTsKLSAgICAgICAgRXZhbEV4ZWN1dGFibGUqIGV4ZWN1dGFibGUg
PSBqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgRXZhbENvZGVCbG9jayog
YmFzZWxpbmUgPSBzdGF0aWNfY2FzdDxFdmFsQ29kZUJsb2NrKj4oCi0gICAgICAgICAgICBleGVj
dXRhYmxlLT5tX2V2YWxDb2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKLSAgICAgICAgRXZh
bENvZGVCbG9jayogcmVzdWx0ID0gRXZhbENvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAgICAg
ICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAgcmVz
dWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4gcmVz
dWx0OwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NJbmZvKCkgPT0gUHJvZ3JhbUV4ZWN1dGFi
bGU6OmluZm8oKSkgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChraW5kID09IENvZGVGb3JDYWxs
KTsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBqc0Nhc3Q8UHJvZ3Jh
bUV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICAgICAgUHJvZ3JhbUNvZGVCbG9jayogYmFzZWxpbmUg
PSBzdGF0aWNfY2FzdDxQcm9ncmFtQ29kZUJsb2NrKj4oCi0gICAgICAgICAgICBleGVjdXRhYmxl
LT5tX3Byb2dyYW1Db2RlQmxvY2stPmJhc2VsaW5lVmVyc2lvbigpKTsKLSAgICAgICAgUHJvZ3Jh
bUNvZGVCbG9jayogcmVzdWx0ID0gUHJvZ3JhbUNvZGVCbG9jazo6Y3JlYXRlKHZtKCksCi0gICAg
ICAgICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICAgICAg
cmVzdWx0LT5zZXRBbHRlcm5hdGl2ZSgqdm0oKSwgYmFzZWxpbmUpOwotICAgICAgICByZXR1cm4g
cmVzdWx0OwotICAgIH0KLQotICAgIGlmIChjbGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNhbGwpOwotICAgICAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpz
Q2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpOwotICAgICAgICBNb2R1bGVQcm9n
cmFtQ29kZUJsb2NrKiBiYXNlbGluZSA9IHN0YXRpY19jYXN0PE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2sqPigKLSAgICAgICAgICAgIGV4ZWN1dGFibGUtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jay0+
YmFzZWxpbmVWZXJzaW9uKCkpOwotICAgICAgICBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrKiByZXN1
bHQgPSBNb2R1bGVQcm9ncmFtQ29kZUJsb2NrOjpjcmVhdGUodm0oKSwKLSAgICAgICAgICAgIENv
ZGVCbG9jazo6Q29weVBhcnNlZEJsb2NrLCAqYmFzZWxpbmUpOwotICAgICAgICByZXN1bHQtPnNl
dEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0g
ICAgfQotCi0gICAgUkVMRUFTRV9BU1NFUlQoY2xhc3NJbmZvKCkgPT0gRnVuY3Rpb25FeGVjdXRh
YmxlOjppbmZvKCkpOwotICAgIEZ1bmN0aW9uRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IGpzQ2Fz
dDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlzKTsKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogYmFz
ZWxpbmUgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkNvZGVCbG9jayo+KAotICAgICAgICBleGVjdXRh
YmxlLT5jb2RlQmxvY2tGb3Ioa2luZCktPmJhc2VsaW5lVmVyc2lvbigpKTsKLSAgICBGdW5jdGlv
bkNvZGVCbG9jayogcmVzdWx0ID0gRnVuY3Rpb25Db2RlQmxvY2s6OmNyZWF0ZSh2bSgpLAotICAg
ICAgICBDb2RlQmxvY2s6OkNvcHlQYXJzZWRCbG9jaywgKmJhc2VsaW5lKTsKLSAgICByZXN1bHQt
PnNldEFsdGVybmF0aXZlKCp2bSgpLCBiYXNlbGluZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotc3RhdGljIHZvaWQgc2V0dXBMTEludChWTSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQot
ewotICAgIExMSW50OjpzZXRFbnRyeXBvaW50KHZtLCBjb2RlQmxvY2spOwotfQotCi1zdGF0aWMg
dm9pZCBzZXR1cEpJVChWTSYgdm0sIENvZGVCbG9jayogY29kZUJsb2NrKQotewotI2lmIEVOQUJM
RShKSVQpCi0gICAgQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0ID0gSklUOjpjb21waWxlKCZ2bSwg
Y29kZUJsb2NrLCBKSVRDb21waWxhdGlvbk11c3RTdWNjZWVkKTsKLSAgICBSRUxFQVNFX0FTU0VS
VChyZXN1bHQgPT0gQ29tcGlsYXRpb25TdWNjZXNzZnVsKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BB
UkFNKHZtKTsKLSAgICBVTlVTRURfUEFSQU0oY29kZUJsb2NrKTsKLSAgICBVTlJFQUNIQUJMRV9G
T1JfUExBVEZPUk0oKTsKLSNlbmRpZgotfQotCi1KU09iamVjdCogU2NyaXB0RXhlY3V0YWJsZTo6
cHJlcGFyZUZvckV4ZWN1dGlvbkltcGwoCi0gICAgVk0mIHZtLCBKU0Z1bmN0aW9uKiBmdW5jdGlv
biwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCwgQ29kZUJsb2Nr
KiYgcmVzdWx0Q29kZUJsb2NrKQotewotICAgIERlZmVyR0NGb3JBV2hpbGUgZGVmZXJHQyh2bS5o
ZWFwKTsKLQotICAgIGlmICh2bS5nZXRBbmRDbGVhckZhaWxOZXh0TmV3Q29kZUJsb2NrKCkpCi0g
ICAgICAgIHJldHVybiBjcmVhdGVFcnJvcihzY29wZS0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4
ZWMoKSwgQVNDSUlMaXRlcmFsKCJGb3JjZWQgRmFpbHVyZSIpKTsKLQotICAgIEpTT2JqZWN0KiBl
eGNlcHRpb24gPSAwOwotICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbmV3Q29kZUJsb2NrRm9y
KGtpbmQsIGZ1bmN0aW9uLCBzY29wZSwgZXhjZXB0aW9uKTsKLSAgICByZXN1bHRDb2RlQmxvY2sg
PSBjb2RlQmxvY2s7Ci0gICAgaWYgKCFjb2RlQmxvY2spIHsKLSAgICAgICAgUkVMRUFTRV9BU1NF
UlQoZXhjZXB0aW9uKTsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgCi0g
ICAgaWYgKE9wdGlvbnM6OnZhbGlkYXRlQnl0ZWNvZGUoKSkKLSAgICAgICAgY29kZUJsb2NrLT52
YWxpZGF0ZSgpOwotICAgIAotICAgIGlmIChPcHRpb25zOjp1c2VMTEludCgpKQotICAgICAgICBz
ZXR1cExMSW50KHZtLCBjb2RlQmxvY2spOwotICAgIGVsc2UKLSAgICAgICAgc2V0dXBKSVQodm0s
IGNvZGVCbG9jayk7Ci0gICAgCi0gICAgaW5zdGFsbENvZGUodm0sIGNvZGVCbG9jaywgY29kZUJs
b2NrLT5jb2RlVHlwZSgpLCBjb2RlQmxvY2stPnNwZWNpYWxpemF0aW9uS2luZCgpKTsKLSAgICBy
ZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3QgQ2xhc3NJbmZvIEV2YWxFeGVjdXRhYmxlOjpzX2lu
Zm8gPSB7ICJFdmFsRXhlY3V0YWJsZSIsICZTY3JpcHRFeGVjdXRhYmxlOjpzX2luZm8sIDAsIENS
RUFURV9NRVRIT0RfVEFCTEUoRXZhbEV4ZWN1dGFibGUpIH07Ci0KLUV2YWxFeGVjdXRhYmxlKiBF
dmFsRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291cmNlQ29kZSYg
c291cmNlLCBib29sIGlzSW5TdHJpY3RDb250ZXh0LCBEZXJpdmVkQ29udGV4dFR5cGUgZGVyaXZl
ZENvbnRleHRUeXBlLCBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlw
ZSBldmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqIHZhcmlhYmxlc1Vu
ZGVyVERaKQotewotICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7Ci0gICAgYXV0byBzY29wZSA9IERF
Q0xBUkVfVEhST1dfU0NPUEUodm0pOwotCi0gICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVj
dCA9IGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKTsKLSAgICBpZiAoIWdsb2JhbE9iamVjdC0+
ZXZhbEVuYWJsZWQoKSkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3Jl
YXRlRXZhbEVycm9yKGV4ZWMsIGdsb2JhbE9iamVjdC0+ZXZhbERpc2FibGVkRXJyb3JNZXNzYWdl
KCkpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRXZhbEV4ZWN1dGFibGUqIGV4
ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxFdmFsRXhlY3V0YWJsZT4oKmV4
ZWMtPmhlYXAoKSkpIEV2YWxFeGVjdXRhYmxlKGV4ZWMsIHNvdXJjZSwgaXNJblN0cmljdENvbnRl
eHQsIGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRl
eHRUeXBlKTsKLSAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7Ci0KLSAgICBVbmxp
bmtlZEV2YWxDb2RlQmxvY2sqIHVubGlua2VkRXZhbENvZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0
ZUV2YWxDb2RlQmxvY2soZXhlYywgZXhlY3V0YWJsZSwgdmFyaWFibGVzVW5kZXJURFopOwotICAg
IGlmICghdW5saW5rZWRFdmFsQ29kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBleGVjdXRh
YmxlLT5tX3VubGlua2VkRXZhbENvZGVCbG9jay5zZXQodm0sIGV4ZWN1dGFibGUsIHVubGlua2Vk
RXZhbENvZGUpOwotCi0gICAgcmV0dXJuIGV4ZWN1dGFibGU7Ci19Ci0KLUV2YWxFeGVjdXRhYmxl
OjpFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJj
ZSwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSBkZXJpdmVkQ29udGV4
dFR5cGUsIGJvb2wgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgRXZhbENvbnRleHRUeXBlIGV2YWxD
b250ZXh0VHlwZSkKLSAgICA6IFNjcmlwdEV4ZWN1dGFibGUoZXhlYy0+dm0oKS5ldmFsRXhlY3V0
YWJsZVN0cnVjdHVyZS5nZXQoKSwgZXhlYy0+dm0oKSwgc291cmNlLCBpblN0cmljdENvbnRleHQs
IGRlcml2ZWRDb250ZXh0VHlwZSwgaXNBcnJvd0Z1bmN0aW9uQ29udGV4dCwgZXZhbENvbnRleHRU
eXBlLCBOb0ludHJpbnNpYykKLXsKLSAgICBBU1NFUlQoc291cmNlLnByb3ZpZGVyKCktPnNvdXJj
ZVR5cGUoKSA9PSBTb3VyY2VQcm92aWRlclNvdXJjZVR5cGU6OlByb2dyYW0pOwotfQotCi12b2lk
IEV2YWxFeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2Fz
dDxFdmFsRXhlY3V0YWJsZSo+KGNlbGwpLT5FdmFsRXhlY3V0YWJsZTo6fkV2YWxFeGVjdXRhYmxl
KCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBQcm9ncmFtRXhlY3V0YWJsZTo6c19pbmZvID0geyAi
UHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVf
TUVUSE9EX1RBQkxFKFByb2dyYW1FeGVjdXRhYmxlKSB9OwotCi1Qcm9ncmFtRXhlY3V0YWJsZTo6
UHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3Vy
Y2UpCi0gICAgOiBTY3JpcHRFeGVjdXRhYmxlKGV4ZWMtPnZtKCkucHJvZ3JhbUV4ZWN1dGFibGVT
dHJ1Y3R1cmUuZ2V0KCksIGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2ZWRDb250ZXh0
VHlwZTo6Tm9uZSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5zaWMpCi17
Ci0gICAgQVNTRVJUKHNvdXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJv
dmlkZXJTb3VyY2VUeXBlOjpQcm9ncmFtKTsKLSAgICBtX3R5cGVQcm9maWxpbmdTdGFydE9mZnNl
dCA9IDA7Ci0gICAgbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0ID0gc291cmNlLmxlbmd0aCgpIC0g
MTsKLSAgICBpZiAoZXhlYy0+dm0oKS50eXBlUHJvZmlsZXIoKSB8fCBleGVjLT52bSgpLmNvbnRy
b2xGbG93UHJvZmlsZXIoKSkKLSAgICAgICAgZXhlYy0+dm0oKS5mdW5jdGlvbkhhc0V4ZWN1dGVk
Q2FjaGUoKS0+aW5zZXJ0VW5leGVjdXRlZFJhbmdlKHNvdXJjZUlEKCksIG1fdHlwZVByb2ZpbGlu
Z1N0YXJ0T2Zmc2V0LCBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQpOwotfQotCi12b2lkIFByb2dy
YW1FeGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxQ
cm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpLT5Qcm9ncmFtRXhlY3V0YWJsZTo6flByb2dyYW1FeGVj
dXRhYmxlKCk7Ci19Ci0KLWNvbnN0IENsYXNzSW5mbyBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6
c19pbmZvID0geyAiTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6
c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKSB9
OwotCi1Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi0gICAgOiBTY3JpcHRFeGVj
dXRhYmxlKGV4ZWMtPnZtKCkubW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVTdHJ1Y3R1cmUuZ2V0KCks
IGV4ZWMtPnZtKCksIHNvdXJjZSwgZmFsc2UsIERlcml2ZWRDb250ZXh0VHlwZTo6Tm9uZSwgZmFs
c2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSwgTm9JbnRyaW5zaWMpCi17Ci0gICAgQVNTRVJUKHNv
dXJjZS5wcm92aWRlcigpLT5zb3VyY2VUeXBlKCkgPT0gU291cmNlUHJvdmlkZXJTb3VyY2VUeXBl
OjpNb2R1bGUpOwotICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gMDsKLSAgICBtX3R5
cGVQcm9maWxpbmdFbmRPZmZzZXQgPSBzb3VyY2UubGVuZ3RoKCkgLSAxOwotICAgIGlmIChleGVj
LT52bSgpLnR5cGVQcm9maWxlcigpIHx8IGV4ZWMtPnZtKCkuY29udHJvbEZsb3dQcm9maWxlcigp
KQotICAgICAgICBleGVjLT52bSgpLmZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZSgpLT5pbnNlcnRV
bmV4ZWN1dGVkUmFuZ2Uoc291cmNlSUQoKSwgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQsIG1f
dHlwZVByb2ZpbGluZ0VuZE9mZnNldCk7Ci19Ci0KLU1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6Y3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgU291
cmNlQ29kZSYgc291cmNlKQotewotICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSBl
eGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0KCk7Ci0gICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUq
IGV4ZWN1dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxNb2R1bGVQcm9ncmFtRXhl
Y3V0YWJsZT4oKmV4ZWMtPmhlYXAoKSkpIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKGV4ZWMsIHNv
dXJjZSk7Ci0gICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7Ci0KLSAg
ICBVbmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2sqIHVubGlua2VkTW9kdWxlUHJvZ3JhbUNv
ZGUgPSBnbG9iYWxPYmplY3QtPmNyZWF0ZU1vZHVsZVByb2dyYW1Db2RlQmxvY2soZXhlYywgZXhl
Y3V0YWJsZSk7Ci0gICAgaWYgKCF1bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlKQotICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKLSAgICBleGVjdXRhYmxlLT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNv
ZGVCbG9jay5zZXQoZXhlYy0+dm0oKSwgZXhlY3V0YWJsZSwgdW5saW5rZWRNb2R1bGVQcm9ncmFt
Q29kZSk7Ci0KLSAgICBleGVjdXRhYmxlLT5tX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGUu
c2V0KGV4ZWMtPnZtKCksIGV4ZWN1dGFibGUsIGpzQ2FzdDxTeW1ib2xUYWJsZSo+KHVubGlua2Vk
TW9kdWxlUHJvZ3JhbUNvZGUtPmNvbnN0YW50UmVnaXN0ZXIodW5saW5rZWRNb2R1bGVQcm9ncmFt
Q29kZS0+bW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZUNvbnN0YW50UmVnaXN0ZXJPZmZzZXQo
KSkuZ2V0KCkpLT5jbG9uZVNjb3BlUGFydChleGVjLT52bSgpKSk7Ci0KLSAgICByZXR1cm4gZXhl
Y3V0YWJsZTsKLX0KLQotdm9pZCBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6ZGVzdHJveShKU0Nl
bGwqIGNlbGwpCi17Ci0gICAgc3RhdGljX2Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPihj
ZWxsKS0+TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGU6On5Nb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSgp
OwotfQotCi1jb25zdCBDbGFzc0luZm8gRnVuY3Rpb25FeGVjdXRhYmxlOjpzX2luZm8gPSB7ICJG
dW5jdGlvbkV4ZWN1dGFibGUiLCAmU2NyaXB0RXhlY3V0YWJsZTo6c19pbmZvLCAwLCBDUkVBVEVf
TUVUSE9EX1RBQkxFKEZ1bmN0aW9uRXhlY3V0YWJsZSkgfTsKLQotRnVuY3Rpb25FeGVjdXRhYmxl
OjpGdW5jdGlvbkV4ZWN1dGFibGUoVk0mIHZtLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIFVu
bGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiB1bmxpbmtlZEV4ZWN1dGFibGUsIHVuc2lnbmVkIGZp
cnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25l
ZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRyaW5zaWMpCi0gICAgOiBTY3JpcHRFeGVjdXRhYmxl
KHZtLmZ1bmN0aW9uRXhlY3V0YWJsZVN0cnVjdHVyZS5nZXQoKSwgdm0sIHNvdXJjZSwgdW5saW5r
ZWRFeGVjdXRhYmxlLT5pc0luU3RyaWN0Q29udGV4dCgpLCB1bmxpbmtlZEV4ZWN1dGFibGUtPmRl
cml2ZWRDb250ZXh0VHlwZSgpLCBmYWxzZSwgRXZhbENvbnRleHRUeXBlOjpOb25lLCBpbnRyaW5z
aWMpCi0gICAgLCBtX3VubGlua2VkRXhlY3V0YWJsZSh2bSwgdGhpcywgdW5saW5rZWRFeGVjdXRh
YmxlKQotewotICAgIFJFTEVBU0VfQVNTRVJUKCFzb3VyY2UuaXNOdWxsKCkpOwotICAgIEFTU0VS
VChzb3VyY2UubGVuZ3RoKCkpOwotICAgIG1fZmlyc3RMaW5lID0gZmlyc3RMaW5lOwotICAgIG1f
bGFzdExpbmUgPSBsYXN0TGluZTsKLSAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgp
OwotICAgIEFTU0VSVChlbmRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAgIG1fc3RhcnRDb2x1bW4g
PSBzdGFydENvbHVtbjsKLSAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKLSAgICBtX3BhcmFt
ZXRlcnNTdGFydE9mZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+cGFyYW1ldGVyc1N0YXJ0T2Zm
c2V0KCk7Ci0gICAgbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQgPSB1bmxpbmtlZEV4ZWN1dGFi
bGUtPnR5cGVQcm9maWxpbmdTdGFydE9mZnNldCgpOwotICAgIG1fdHlwZVByb2ZpbGluZ0VuZE9m
ZnNldCA9IHVubGlua2VkRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ0VuZE9mZnNldCgpOwotfQot
Ci12b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtKQotewotICAg
IEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKLSAgICBtX3NpbmdsZXRvbkZ1bmN0aW9uLnNldCh2
bSwgdGhpcywgSW5mZXJyZWRWYWx1ZTo6Y3JlYXRlKHZtKSk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25F
eGVjdXRhYmxlOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKLXsKLSAgICBzdGF0aWNfY2FzdDxGdW5j
dGlvbkV4ZWN1dGFibGUqPihjZWxsKS0+RnVuY3Rpb25FeGVjdXRhYmxlOjp+RnVuY3Rpb25FeGVj
dXRhYmxlKCk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBzYW1wbGluZ0Rlc2NyaXB0aW9uKEpJ
VENvZGU6OkpJVFR5cGUgaml0VHlwZSkKLXsKLSAgICBzd2l0Y2ggKGppdFR5cGUpIHsKLSAgICBj
YXNlIEpJVENvZGU6OkludGVycHJldGVyVGh1bms6Ci0gICAgICAgIHJldHVybiAiSW50ZXJwcmV0
ZXIgQ29tcGlsYXRpb24gKFRPVEFMKSI7Ci0gICAgY2FzZSBKSVRDb2RlOjpCYXNlbGluZUpJVDoK
LSAgICAgICAgcmV0dXJuICJCYXNlbGluZSBDb21waWxhdGlvbiAoVE9UQUwpIjsKLSAgICBjYXNl
IEpJVENvZGU6OkRGR0pJVDoKLSAgICAgICAgcmV0dXJuICJERkcgQ29tcGlsYXRpb24gKFRPVEFM
KSI7Ci0gICAgY2FzZSBKSVRDb2RlOjpGVExKSVQ6Ci0gICAgICAgIHJldHVybiAiRlRMIENvbXBp
bGF0aW9uIChUT1RBTCkiOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUX05P
VF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotdm9pZCBFdmFsRXhl
Y3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9y
KQotewotICAgIEV2YWxFeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEV2YWxFeGVjdXRh
YmxlKj4oY2VsbCk7Ci0gICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCBp
bmZvKCkpOwotICAgIFNjcmlwdEV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4odGhpc09iamVjdCwg
dmlzaXRvcik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRFdmFs
Q29kZUJsb2NrKTsKLSAgICBpZiAodGhpc09iamVjdC0+bV9ldmFsQ29kZUJsb2NrKQotICAgICAg
ICB0aGlzT2JqZWN0LT5tX2V2YWxDb2RlQmxvY2stPnZpc2l0V2Vha2x5KHZpc2l0b3IpOwotfQot
Ci1KU09iamVjdCogUHJvZ3JhbUV4ZWN1dGFibGU6OmNoZWNrU3ludGF4KEV4ZWNTdGF0ZSogZXhl
YykKLXsKLSAgICBQYXJzZXJFcnJvciBlcnJvcjsKLSAgICBWTSogdm0gPSAmZXhlYy0+dm0oKTsK
LSAgICBKU0dsb2JhbE9iamVjdCogbGV4aWNhbEdsb2JhbE9iamVjdCA9IGV4ZWMtPmxleGljYWxH
bG9iYWxPYmplY3QoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbU5vZGU+IHByb2dyYW1O
b2RlID0gcGFyc2U8UHJvZ3JhbU5vZGU+KAotICAgICAgICB2bSwgbV9zb3VyY2UsIElkZW50aWZp
ZXIoKSwgSlNQYXJzZXJCdWlsdGluTW9kZTo6Tm90QnVpbHRpbiwKLSAgICAgICAgSlNQYXJzZXJT
dHJpY3RNb2RlOjpOb3RTdHJpY3QsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xhc3NpYywgU291cmNl
UGFyc2VNb2RlOjpQcm9ncmFtTW9kZSwgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIGVycm9yKTsK
LSAgICBpZiAocHJvZ3JhbU5vZGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIEFTU0VSVChlcnJv
ci5pc1ZhbGlkKCkpOwotICAgIHJldHVybiBlcnJvci50b0Vycm9yT2JqZWN0KGxleGljYWxHbG9i
YWxPYmplY3QsIG1fc291cmNlKTsKLX0KLQotSlNPYmplY3QqIFByb2dyYW1FeGVjdXRhYmxlOjpp
bml0aWFsaXplR2xvYmFsUHJvcGVydGllcyhWTSYgdm0sIENhbGxGcmFtZSogY2FsbEZyYW1lLCBK
U1Njb3BlKiBzY29wZSkKLXsKLSAgICBSRUxFQVNFX0FTU0VSVChzY29wZSk7Ci0gICAgSlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHNjb3BlLT5nbG9iYWxPYmplY3QoKTsKLSAgICBSRUxF
QVNFX0FTU0VSVChnbG9iYWxPYmplY3QpOwotICAgIEFTU0VSVCgmZ2xvYmFsT2JqZWN0LT52bSgp
ID09ICZ2bSk7Ci0KLSAgICBKU09iamVjdCogZXhjZXB0aW9uID0gMDsKLSAgICBVbmxpbmtlZFBy
b2dyYW1Db2RlQmxvY2sqIHVubGlua2VkQ29kZUJsb2NrID0gZ2xvYmFsT2JqZWN0LT5jcmVhdGVQ
cm9ncmFtQ29kZUJsb2NrKGNhbGxGcmFtZSwgdGhpcywgJmV4Y2VwdGlvbik7Ci0gICAgaWYgKGV4
Y2VwdGlvbikKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLQotICAgIEpTR2xvYmFsTGV4aWNh
bEVudmlyb25tZW50KiBnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQgPSBnbG9iYWxPYmplY3QtPmds
b2JhbExleGljYWxFbnZpcm9ubWVudCgpOwotICAgIGNvbnN0IFZhcmlhYmxlRW52aXJvbm1lbnQm
IHZhcmlhYmxlRGVjbGFyYXRpb25zID0gdW5saW5rZWRDb2RlQmxvY2stPnZhcmlhYmxlRGVjbGFy
YXRpb25zKCk7Ci0gICAgY29uc3QgVmFyaWFibGVFbnZpcm9ubWVudCYgbGV4aWNhbERlY2xhcmF0
aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5sZXhpY2FsRGVjbGFyYXRpb25zKCk7Ci0gICAgLy8g
VGhlIEVTNiBzcGVjIHNheXMgdGhhdCBubyB2YXJzL2dsb2JhbCBwcm9wZXJ0aWVzL2xldC9jb25z
dCBjYW4gYmUgZHVwbGljYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgotICAgIC8vIFRoaXMgY2Fy
cmllZCBvdXQgc2VjdGlvbiAxNS4xLjggb2YgdGhlIEVTNiBzcGVjOiBodHRwOi8vd3d3LmVjbWEt
aW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLWdsb2JhbGRlY2xh
cmF0aW9uaW5zdGFudGlhdGlvbgotICAgIHsKLSAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xv
YmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7Ci0gICAgICAgIC8vIENoZWNrIGZvciBpbnRlcnNlY3Rp
b24gb2YgInZhciIgYW5kICJsZXQiLyJjb25zdCIvImNsYXNzIgotICAgICAgICBmb3IgKGF1dG8m
IGVudHJ5IDogbGV4aWNhbERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgaWYgKHZhcmlhYmxl
RGVjbGFyYXRpb25zLmNvbnRhaW5zKGVudHJ5LmtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGNyZWF0ZVN5bnRheEVycm9yKGV4ZWMsIG1ha2VTdHJpbmcoIkNhbid0IGNyZWF0ZSBkdXBsaWNh
dGUgdmFyaWFibGU6ICciLCBTdHJpbmcoZW50cnkua2V5LmdldCgpKSwgIiciKSk7Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyBDaGVjayBpZiBhbnkgbmV3ICJsZXQiLyJjb25zdCIvImNsYXNzIiB3
aWxsIHNoYWRvdyBhbnkgcHJlLWV4aXN0aW5nIGdsb2JhbCBwcm9wZXJ0eSBuYW1lcywgb3IgInZh
ciIvImxldCIvImNvbnN0IiB2YXJpYWJsZXMuCi0gICAgICAgIC8vIEl0J3MgYW4gZXJyb3IgdG8g
aW50cm9kdWNlIGEgc2hhZG93LgotICAgICAgICBmb3IgKGF1dG8mIGVudHJ5IDogbGV4aWNhbERl
Y2xhcmF0aW9ucykgewotICAgICAgICAgICAgaWYgKGdsb2JhbE9iamVjdC0+aGFzUHJvcGVydHko
ZXhlYywgZW50cnkua2V5LmdldCgpKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBFUzYgc3Bl
YyBzYXlzIHRoYXQganVzdCBSZXN0cmljdGVkR2xvYmFsUHJvcGVydHkgY2FuJ3QgYmUgc2hhZG93
ZWQKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNhcnJpZWQgb3V0IHNlY3Rpb24gOC4xLjEuNC4x
NCBvZiB0aGUgRVM2IHNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21h
LTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtaGFzcmVzdHJpY3RlZGdsb2JhbHByb3BlcnR5Ci0gICAg
ICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAg
ICAgZ2xvYmFsT2JqZWN0LT5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXhlYywgZW50cnkua2V5
LmdldCgpLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBp
ZiAoZGVzY3JpcHRvci52YWx1ZSgpICE9IGpzVW5kZWZpbmVkKCkgJiYgIWRlc2NyaXB0b3IuY29u
ZmlndXJhYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJv
cihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlIHRoYXQg
c2hhZG93cyBhIGdsb2JhbCBwcm9wZXJ0eTogJyIsIFN0cmluZyhlbnRyeS5rZXkuZ2V0KCkpLCAi
JyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChn
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1Byb3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQo
KSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoVU5MSUtFTFkoZW50cnkudmFsdWUuaXNDb25zdCgp
ICYmICF2bS5nbG9iYWxDb25zdFJlZGVjbGFyYXRpb25TaG91bGRUaHJvdygpICYmICFpc1N0cmlj
dE1vZGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhbGxvdyAiY29uc3Qi
IGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgdW5kZXIgdGhpcyBzZXR0aW5nLgotICAgICAgICAgICAg
ICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2UgZG9uJ3QgImxldCIgdmFyaWFibGVzIHRvIGJlIG92
ZXJyaWRkZW4gYnkgImNvbnN0IiB2YXJpYWJsZXMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChn
bG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmlzQ29uc3RWYXJpYWJsZShlbnRyeS5rZXkuZ2V0KCkp
KQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5n
KCJDYW4ndCBjcmVhdGUgZHVwbGljYXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5n
ZXQoKSksICInIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hl
Y2sgaWYgYW55IG5ldyAidmFyInMgd2lsbCBzaGFkb3cgYW55IHByZXZpb3VzICJsZXQiLyJjb25z
dCIvImNsYXNzIiBuYW1lcy4KLSAgICAgICAgLy8gSXQncyBhbiBlcnJvciB0byBpbnRyb2R1Y2Ug
YSBzaGFkb3cuCi0gICAgICAgIGlmICghZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgZW50cnkgOiB2YXJpYWJsZURlY2xhcmF0aW9u
cykgewotICAgICAgICAgICAgICAgIGlmIChnbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQtPmhhc1By
b3BlcnR5KGV4ZWMsIGVudHJ5LmtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVy
biBjcmVhdGVTeW50YXhFcnJvcihleGVjLCBtYWtlU3RyaW5nKCJDYW4ndCBjcmVhdGUgZHVwbGlj
YXRlIHZhcmlhYmxlOiAnIiwgU3RyaW5nKGVudHJ5LmtleS5nZXQoKSksICInIikpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBtX3VubGlua2VkUHJvZ3JhbUNvZGVC
bG9jay5zZXQodm0sIHRoaXMsIHVubGlua2VkQ29kZUJsb2NrKTsKLQotICAgIEJhdGNoZWRUcmFu
c2l0aW9uT3B0aW1pemVyIG9wdGltaXplcih2bSwgZ2xvYmFsT2JqZWN0KTsKLQotICAgIGZvciAo
c2l6ZV90IGkgPSAwLCBudW1iZXJPZkZ1bmN0aW9ucyA9IHVubGlua2VkQ29kZUJsb2NrLT5udW1i
ZXJPZkZ1bmN0aW9uRGVjbHMoKTsgaSA8IG51bWJlck9mRnVuY3Rpb25zOyArK2kpIHsKLSAgICAg
ICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxl
ID0gdW5saW5rZWRDb2RlQmxvY2stPmZ1bmN0aW9uRGVjbChpKTsKLSAgICAgICAgQVNTRVJUKCF1
bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7Ci0gICAgICAgIGds
b2JhbE9iamVjdC0+YWRkRnVuY3Rpb24oY2FsbEZyYW1lLCB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZS0+bmFtZSgpKTsKLSAgICAgICAgaWYgKHZtLnR5cGVQcm9maWxlcigpIHx8IHZtLmNvbnRy
b2xGbG93UHJvZmlsZXIoKSkgewotICAgICAgICAgICAgdm0uZnVuY3Rpb25IYXNFeGVjdXRlZENh
Y2hlKCktPmluc2VydFVuZXhlY3V0ZWRSYW5nZShzb3VyY2VJRCgpLCAKLSAgICAgICAgICAgICAg
ICB1bmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZS0+dHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0KCks
IAotICAgICAgICAgICAgICAgIHVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlLT50eXBlUHJvZmls
aW5nRW5kT2Zmc2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBlbnRy
eSA6IHZhcmlhYmxlRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgIEFTU0VSVChlbnRyeS52YWx1ZS5p
c1ZhcigpKTsKLSAgICAgICAgZ2xvYmFsT2JqZWN0LT5hZGRWYXIoY2FsbEZyYW1lLCBJZGVudGlm
aWVyOjpmcm9tVWlkKCZ2bSwgZW50cnkua2V5LmdldCgpKSk7Ci0gICAgfQotCi0gICAgewotICAg
ICAgICBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudCogZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50
ID0ganNDYXN0PEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50Kj4oZ2xvYmFsT2JqZWN0LT5nbG9i
YWxTY29wZSgpKTsKLSAgICAgICAgU3ltYm9sVGFibGUqIHN5bWJvbFRhYmxlID0gZ2xvYmFsTGV4
aWNhbEVudmlyb25tZW50LT5zeW1ib2xUYWJsZSgpOwotICAgICAgICBDb25jdXJyZW50SklUTG9j
a2VyIGxvY2tlcihzeW1ib2xUYWJsZS0+bV9sb2NrKTsKLSAgICAgICAgZm9yIChhdXRvJiBlbnRy
eSA6IGxleGljYWxEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChVTkxJS0VMWShlbnRy
eS52YWx1ZS5pc0NvbnN0KCkgJiYgIXZtLmdsb2JhbENvbnN0UmVkZWNsYXJhdGlvblNob3VsZFRo
cm93KCkgJiYgIWlzU3RyaWN0TW9kZSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChzeW1ib2xU
YWJsZS0+Y29udGFpbnMobG9ja2VyLCBlbnRyeS5rZXkuZ2V0KCkpKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9m
ZnNldCA9IHN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3BlT2Zmc2V0KGxvY2tlcik7Ci0gICAgICAg
ICAgICBTeW1ib2xUYWJsZUVudHJ5IG5ld0VudHJ5KFZhck9mZnNldChvZmZzZXQpLCBlbnRyeS52
YWx1ZS5pc0NvbnN0KCkgPyBSZWFkT25seSA6IDApOwotICAgICAgICAgICAgbmV3RW50cnkucHJl
cGFyZVRvV2F0Y2goKTsKLSAgICAgICAgICAgIHN5bWJvbFRhYmxlLT5hZGQobG9ja2VyLCBlbnRy
eS5rZXkuZ2V0KCksIG5ld0VudHJ5KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2NvcGVP
ZmZzZXQgb2Zmc2V0Rm9yQXNzZXJ0ID0gZ2xvYmFsTGV4aWNhbEVudmlyb25tZW50LT5hZGRWYXJp
YWJsZXMoMSwganNURFpWYWx1ZSgpKTsKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKG9mZnNl
dEZvckFzc2VydCA9PSBvZmZzZXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwot
fQotCi12b2lkIFByb2dyYW1FeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwg
U2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17Ci0gICAgUHJvZ3JhbUV4ZWN1dGFibGUqIHRoaXNPYmpl
Y3QgPSBqc0Nhc3Q8UHJvZ3JhbUV4ZWN1dGFibGUqPihjZWxsKTsKLSAgICBBU1NFUlRfR0NfT0JK
RUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsIGluZm8oKSk7Ci0gICAgU2NyaXB0RXhlY3V0YWJsZTo6
dmlzaXRDaGlsZHJlbih0aGlzT2JqZWN0LCB2aXNpdG9yKTsKLSAgICB2aXNpdG9yLmFwcGVuZCgm
dGhpc09iamVjdC0+bV91bmxpbmtlZFByb2dyYW1Db2RlQmxvY2spOwotICAgIGlmICh0aGlzT2Jq
ZWN0LT5tX3Byb2dyYW1Db2RlQmxvY2spCi0gICAgICAgIHRoaXNPYmplY3QtPm1fcHJvZ3JhbUNv
ZGVCbG9jay0+dmlzaXRXZWFrbHkodmlzaXRvcik7Ci19Ci0KLXZvaWQgTW9kdWxlUHJvZ3JhbUV4
ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlzaXRv
cikKLXsKLSAgICBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSogdGhpc09iamVjdCA9IGpzQ2FzdDxN
b2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5I
RVJJVFModGhpc09iamVjdCwgaW5mbygpKTsKLSAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENo
aWxkcmVuKHRoaXNPYmplY3QsIHZpc2l0b3IpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2Jq
ZWN0LT5tX3VubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayk7Ci0gICAgdmlzaXRvci5hcHBl
bmQoJnRoaXNPYmplY3QtPm1fbW9kdWxlRW52aXJvbm1lbnRTeW1ib2xUYWJsZSk7Ci0gICAgaWYg
KHRoaXNPYmplY3QtPm1fbW9kdWxlUHJvZ3JhbUNvZGVCbG9jaykKLSAgICAgICAgdGhpc09iamVj
dC0+bV9tb2R1bGVQcm9ncmFtQ29kZUJsb2NrLT52aXNpdFdlYWtseSh2aXNpdG9yKTsKLX0KLQot
RnVuY3Rpb25Db2RlQmxvY2sqIEZ1bmN0aW9uRXhlY3V0YWJsZTo6YmFzZWxpbmVDb2RlQmxvY2tG
b3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotewotICAgIEZ1bmN0aW9uQ29kZUJsb2Nr
KiByZXN1bHQ7Ci0gICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgIHJlc3VsdCA9
IG1fY29kZUJsb2NrRm9yQ2FsbC5nZXQoKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUkVMRUFTRV9B
U1NFUlQoa2luZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmVzdWx0ID0gbV9jb2Rl
QmxvY2tGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgfQotICAgIGlmICghcmVzdWx0KQotICAgICAg
ICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RnVuY3Rpb25Db2RlQmxvY2sqPihy
ZXN1bHQtPmJhc2VsaW5lQWx0ZXJuYXRpdmUoKSk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25FeGVjdXRh
YmxlOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCi17
Ci0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEZ1bmN0aW9uRXhl
Y3V0YWJsZSo+KGNlbGwpOwotICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVj
dCwgaW5mbygpKTsKLSAgICBTY3JpcHRFeGVjdXRhYmxlOjp2aXNpdENoaWxkcmVuKHRoaXNPYmpl
Y3QsIHZpc2l0b3IpOwotICAgIGlmICh0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNhbGwpCi0g
ICAgICAgIHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ2FsbC0+dmlzaXRXZWFrbHkodmlzaXRv
cik7Ci0gICAgaWYgKHRoaXNPYmplY3QtPm1fY29kZUJsb2NrRm9yQ29uc3RydWN0KQotICAgICAg
ICB0aGlzT2JqZWN0LT5tX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC0+dmlzaXRXZWFrbHkodmlzaXRv
cik7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fdW5saW5rZWRFeGVjdXRhYmxl
KTsKLSAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9zaW5nbGV0b25GdW5jdGlvbik7
Ci19Ci0KLUZ1bmN0aW9uRXhlY3V0YWJsZSogRnVuY3Rpb25FeGVjdXRhYmxlOjpmcm9tR2xvYmFs
Q29kZSgKLSAgICBjb25zdCBJZGVudGlmaWVyJiBuYW1lLCBFeGVjU3RhdGUmIGV4ZWMsIGNvbnN0
IFNvdXJjZUNvZGUmIHNvdXJjZSwgCi0gICAgSlNPYmplY3QqJiBleGNlcHRpb24sIGludCBvdmVy
cmlkZUxpbmVOdW1iZXIpCi17Ci0gICAgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlu
a2VkRXhlY3V0YWJsZSA9IAotICAgICAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZTo6ZnJv
bUdsb2JhbENvZGUoCi0gICAgICAgICAgICBuYW1lLCBleGVjLCBzb3VyY2UsIGV4Y2VwdGlvbiwg
b3ZlcnJpZGVMaW5lTnVtYmVyKTsKLSAgICBpZiAoIXVubGlua2VkRXhlY3V0YWJsZSkKLSAgICAg
ICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICByZXR1cm4gdW5saW5rZWRFeGVjdXRhYmxlLT5saW5r
KGV4ZWMudm0oKSwgc291cmNlLCBvdmVycmlkZUxpbmVOdW1iZXIpOwotfQotCiAjaWYgRU5BQkxF
KFdFQkFTU0VNQkxZKQogY29uc3QgQ2xhc3NJbmZvIFdlYkFzc2VtYmx5RXhlY3V0YWJsZTo6c19p
bmZvID0geyAiV2ViQXNzZW1ibHlFeGVjdXRhYmxlIiwgJkV4ZWN1dGFibGVCYXNlOjpzX2luZm8s
IDAsIENSRUFURV9NRVRIT0RfVEFCTEUoV2ViQXNzZW1ibHlFeGVjdXRhYmxlKSB9OwogCkBAIC03
NzIsNzUgKzY3LDQgQEAgdm9pZCBXZWJBc3NlbWJseUV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZQog
fQogI2VuZGlmCiAKLXZvaWQgRXhlY3V0YWJsZUJhc2U6OmR1bXAoUHJpbnRTdHJlYW0mIG91dCkg
Y29uc3QKLXsKLSAgICBFeGVjdXRhYmxlQmFzZSogcmVhbFRoaXMgPSBjb25zdF9jYXN0PEV4ZWN1
dGFibGVCYXNlKj4odGhpcyk7Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IE5hdGl2ZUV4
ZWN1dGFibGU6OmluZm8oKSkgewotICAgICAgICBOYXRpdmVFeGVjdXRhYmxlKiBuYXRpdmUgPSBq
c0Nhc3Q8TmF0aXZlRXhlY3V0YWJsZSo+KHJlYWxUaGlzKTsKLSAgICAgICAgb3V0LnByaW50KCJO
YXRpdmVFeGVjdXRhYmxlOiIsIFJhd1BvaW50ZXIoYml0d2lzZV9jYXN0PHZvaWQqPihuYXRpdmUt
PmZ1bmN0aW9uKCkpKSwgIi8iLCBSYXdQb2ludGVyKGJpdHdpc2VfY2FzdDx2b2lkKj4obmF0aXZl
LT5jb25zdHJ1Y3RvcigpKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlm
IChjbGFzc0luZm8oKSA9PSBFdmFsRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAgIEV2YWxF
eGVjdXRhYmxlKiBldmFsID0ganNDYXN0PEV2YWxFeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAg
ICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBldmFsLT5jb2RlQmxvY2soKSkKLSAgICAg
ICAgICAgIG91dC5wcmludCgqY29kZUJsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
b3V0LnByaW50KCJFdmFsRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNsYXNzSW5mbygpID09IFByb2dyYW1FeGVjdXRhYmxl
OjppbmZvKCkpIHsKLSAgICAgICAgUHJvZ3JhbUV4ZWN1dGFibGUqIGV2YWwgPSBqc0Nhc3Q8UHJv
Z3JhbUV4ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgICAgIGlmIChDb2RlQmxvY2sqIGNvZGVC
bG9jayA9IGV2YWwtPmNvZGVCbG9jaygpKQotICAgICAgICAgICAgb3V0LnByaW50KCpjb2RlQmxv
Y2spOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXQucHJpbnQoIlByb2dyYW1FeGVjdXRh
YmxlIHcvbyBDb2RlQmxvY2siKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChj
bGFzc0luZm8oKSA9PSBNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZTo6aW5mbygpKSB7Ci0gICAgICAg
IE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlKiBleGVjdXRhYmxlID0ganNDYXN0PE1vZHVsZVByb2dy
YW1FeGVjdXRhYmxlKj4ocmVhbFRoaXMpOwotICAgICAgICBpZiAoQ29kZUJsb2NrKiBjb2RlQmxv
Y2sgPSBleGVjdXRhYmxlLT5jb2RlQmxvY2soKSkKLSAgICAgICAgICAgIG91dC5wcmludCgqY29k
ZUJsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LnByaW50KCJNb2R1bGVQcm9n
cmFtRXhlY3V0YWJsZSB3L28gQ29kZUJsb2NrIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgCi0gICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbiA9IGpzQ2FzdDxGdW5jdGlvbkV4
ZWN1dGFibGUqPihyZWFsVGhpcyk7Ci0gICAgaWYgKCFmdW5jdGlvbi0+ZWl0aGVyQ29kZUJsb2Nr
KCkpCi0gICAgICAgIG91dC5wcmludCgiRnVuY3Rpb25FeGVjdXRhYmxlIHcvbyBDb2RlQmxvY2si
KTsKLSAgICBlbHNlIHsKLSAgICAgICAgQ29tbWFQcmludGVyIGNvbW1hKCIvIik7Ci0gICAgICAg
IGlmIChmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ2FsbCgpKQotICAgICAgICAgICAgb3V0LnByaW50
KGNvbW1hLCAqZnVuY3Rpb24tPmNvZGVCbG9ja0ZvckNhbGwoKSk7Ci0gICAgICAgIGlmIChmdW5j
dGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpCi0gICAgICAgICAgICBvdXQucHJpbnQoY29t
bWEsICpmdW5jdGlvbi0+Y29kZUJsb2NrRm9yQ29uc3RydWN0KCkpOwotICAgIH0KLX0KLQotQ29k
ZUJsb2NrSGFzaCBFeGVjdXRhYmxlQmFzZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpIGNvbnN0Ci17Ci0gICAgaWYgKHRoaXMtPmNsYXNzSW5mbygpID09IE5hdGl2ZUV4ZWN1
dGFibGU6OmluZm8oKSkKLSAgICAgICAgcmV0dXJuIGpzQ2FzdDxjb25zdCBOYXRpdmVFeGVjdXRh
YmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Ci0gICAgCi0gICAgcmV0dXJuIGpzQ2FzdDxjb25z
dCBTY3JpcHRFeGVjdXRhYmxlKj4odGhpcyktPmhhc2hGb3Ioa2luZCk7Ci19Ci0KLUNvZGVCbG9j
a0hhc2ggTmF0aXZlRXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQpIGNvbnN0Ci17Ci0gICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgIHJldHVy
biBDb2RlQmxvY2tIYXNoKHN0YXRpY19jYXN0PHVuc2lnbmVkPihiaXR3aXNlX2Nhc3Q8c2l6ZV90
PihtX2Z1bmN0aW9uKSkpOwotICAgIAotICAgIFJFTEVBU0VfQVNTRVJUKGtpbmQgPT0gQ29kZUZv
ckNvbnN0cnVjdCk7Ci0gICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc3RhdGljX2Nhc3Q8dW5zaWdu
ZWQ+KGJpdHdpc2VfY2FzdDxzaXplX3Q+KG1fY29uc3RydWN0b3IpKSk7Ci19Ci0KLUNvZGVCbG9j
a0hhc2ggU2NyaXB0RXhlY3V0YWJsZTo6aGFzaEZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtp
bmQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvZGVCbG9ja0hhc2goc291cmNlKCksIGtpbmQpOwot
fQotCi19Cit9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0YWJsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0YWJsZS5oCShyZXZpc2lvbiAyMDc3
OTApCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFibGUuaDoyMDc3
OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9XZWJBc3NlbWJseUV4ZWN1dGFi
bGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc3OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSwgMjAxMCwgMjAxMy0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNwcmFnbWEgb25j
ZQorCisjaW5jbHVkZSAiQXJpdHlDaGVja01vZGUuaCIKKyNpbmNsdWRlICJDYWxsRGF0YS5oIgor
I2luY2x1ZGUgIkNvZGVCbG9ja0hhc2guaCIKKyNpbmNsdWRlICJDb2RlU3BlY2lhbGl6YXRpb25L
aW5kLmgiCisjaW5jbHVkZSAiQ29tcGlsYXRpb25SZXN1bHQuaCIKKyNpbmNsdWRlICJFeGVjdXRh
YmxlSW5mby5oIgorI2luY2x1ZGUgIkhhbmRsZXJJbmZvLmgiCisjaW5jbHVkZSAiSW5mZXJyZWRW
YWx1ZS5oIgorI2luY2x1ZGUgIkpJVENvZGUuaCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5o
IgorI2luY2x1ZGUgIlNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJUeXBlU2V0LmgiCisjaW5jbHVk
ZSAiVW5saW5rZWRDb2RlQmxvY2suaCIKKyNpbmNsdWRlICJVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0
YWJsZS5oIgorCituYW1lc3BhY2UgSlNDIHsKKworY2xhc3MgQ29kZUJsb2NrOworY2xhc3MgRXZh
bENvZGVCbG9jazsKK2NsYXNzIEZ1bmN0aW9uQ29kZUJsb2NrOworY2xhc3MgSlNTY29wZTsKK2Ns
YXNzIEpTV2FzbU1vZHVsZTsKK2NsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK2NsYXNzIE1v
ZHVsZVByb2dyYW1Db2RlQmxvY2s7CitjbGFzcyBQcm9ncmFtQ29kZUJsb2NrOworY2xhc3MgV2Vi
QXNzZW1ibHlDb2RlQmxvY2s7CisKK2VudW0gQ29tcGlsYXRpb25LaW5kIHsgRmlyc3RDb21waWxh
dGlvbiwgT3B0aW1pemluZ0NvbXBpbGF0aW9uIH07CisKK2lubGluZSBib29sIGlzQ2FsbChDb2Rl
U3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCit7CisgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwp
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1
Y3QpOworICAgIHJldHVybiBmYWxzZTsKK30KKworY2xhc3MgRXhlY3V0YWJsZUJhc2UgOiBwdWJs
aWMgSlNDZWxsIHsKKyAgICBmcmllbmQgY2xhc3MgSklUOworCitwcm90ZWN0ZWQ6CisgICAgc3Rh
dGljIGNvbnN0IGludCBOVU1fUEFSQU1FVEVSU19JU19IT1NUID0gMDsKKyAgICBzdGF0aWMgY29u
c3QgaW50IE5VTV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCA9IC0xOworCisgICAgRXhlY3V0YWJs
ZUJhc2UoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50IG51bVBhcmFtZXRlcnMsIElu
dHJpbnNpYyBpbnRyaW5zaWMpCisgICAgICAgIDogSlNDZWxsKHZtLCBzdHJ1Y3R1cmUpCisgICAg
ICAgICwgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0ZXJzKQorICAgICAgICAsIG1f
bnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdChudW1QYXJhbWV0ZXJzKQorICAgICAgICAsIG1faW50
cmluc2ljKGludHJpbnNpYykKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBmaW5pc2hDcmVhdGlv
bihWTSYgdm0pCisgICAgeworICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7CisgICAg
fQorCitwdWJsaWM6CisgICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsKKyAgICBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKKworICAgIHN0
YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVlOworICAgIHN0YXRpYyB2b2lk
IGRlc3Ryb3koSlNDZWxsKik7CisgICAgICAgIAorICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihD
b2RlU3BlY2lhbGl6YXRpb25LaW5kKSBjb25zdDsKKworICAgIGJvb2wgaXNFdmFsRXhlY3V0YWJs
ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdHlwZSgpID09IEV2YWxFeGVjdXRhYmxl
VHlwZTsKKyAgICB9CisgICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0YWJsZSgpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhlY3V0YWJsZVR5cGU7CisgICAg
fQorICAgIGJvb2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gdHlwZSgpID09IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsKKyAgICB9CisgICAgYm9vbCBp
c01vZHVsZVByb2dyYW1FeGVjdXRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlKCkg
PT0gTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGVUeXBlOworICAgIH0KKworCisgICAgYm9vbCBpc0hv
c3RGdW5jdGlvbigpIGNvbnN0CisgICAgeworICAgICAgICBBU1NFUlQoKG1fbnVtUGFyYW1ldGVy
c0ZvckNhbGwgPT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0gKG1fbnVtUGFyYW1ldGVyc0Zv
ckNvbnN0cnVjdCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSk7CisgICAgICAgIHJldHVybiBt
X251bVBhcmFtZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Q7CisgICAgfQor
CisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorICAgIGJvb2wgaXNXZWJBc3NlbWJseUV4ZWN1dGFi
bGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBXZWJBc3NlbWJseUV4
ZWN1dGFibGVUeXBlOworICAgIH0KKyNlbmRpZgorCisgICAgc3RhdGljIFN0cnVjdHVyZSogY3Jl
YXRlU3RydWN0dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1
ZSBwcm90bykgeyByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJv
dG8sIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7IH0KKyAgICAg
ICAgCisgICAgdm9pZCBjbGVhckNvZGUoKTsKKworICAgIERFQ0xBUkVfRVhQT1JUX0lORk87CisK
K3Byb3RlY3RlZDoKKyAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbDsKKyAgICBpbnQgbV9u
dW1QYXJhbWV0ZXJzRm9yQ29uc3RydWN0OworCitwdWJsaWM6CisgICAgUGFzc1JlZlB0cjxKSVRD
b2RlPiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCisgICAgeworICAgICAgICBBU1NFUlQobV9q
aXRDb2RlRm9yQ2FsbCk7CisgICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDYWxsOworICAgIH0K
KworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgp
CisgICAgeworICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAg
cmV0dXJuIG1faml0Q29kZUZvckNvbnN0cnVjdDsKKyAgICB9CisgICAgICAgIAorICAgIFBhc3NS
ZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAg
ICAgIHJldHVybiBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVG
b3JDb25zdHJ1Y3QoKTsKKyAgICB9CisgICAgCisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIGVu
dHJ5cG9pbnRGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBBcml0eUNoZWNrTW9kZSBh
cml0eSkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0
LiBXZSBvbmx5IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1c2Ugd2UgdXNlIHRoZQorICAg
ICAgICAvLyBuby1hcml0eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0dWFsIGNhbGxzLCB3aGljaCB3
aWxsICJjYWNoZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBpbgorICAgICAgICAvLyBtYWNoaW5lIGNv
ZGUuCisgICAgICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgeworICAgICAgICAgICAg
c3dpdGNoIChraW5kKSB7CisgICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgorICAgICAgICAg
ICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ2Fs
bFdpdGhBcml0eUNoZWNrKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0Ogor
ICAgICAgICAgICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRD
b2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5Q2hlY2spCisgICAgICAgICAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9CisgICAgICAgICAgICBn
ZW5lcmF0ZWRKSVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2FsbChhcml0eSk7CisgICAgICAg
IGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgeworICAgICAgICAgICAgLy8gQ2FjaGUgdGhl
IHJlc3VsdDsgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQncyB2aXJ0dWFsIGNhbGwgb3B0
aW1pemF0aW9ucy4KKyAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAgICAgICAgY2Fz
ZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5
Q2hlY2sgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNl
IENvZGVGb3JDb25zdHJ1Y3Q6CisgICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0
V2l0aEFyaXR5Q2hlY2sgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBz
dGF0aWMgcHRyZGlmZl90IG9mZnNldE9mSklUQ29kZVdpdGhBcml0eUNoZWNrRm9yKAorICAgICAg
ICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGtp
bmQpIHsKKyAgICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKKyAgICAgICAgICAgIHJldHVybiBPQkpF
Q1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVj
ayk7CisgICAgICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKKyAgICAgICAgICAgIHJldHVybiBP
QkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhB
cml0eUNoZWNrKTsKKyAgICAgICAgfQorICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHB0cmRpZmZf
dCBvZmZzZXRPZk51bVBhcmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQor
ICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1
cm4gT0JKRUNUX09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDYWxs
KTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJl
dHVybiBPQkpFQ1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNv
bnN0cnVjdCk7CisgICAgfQorCisgICAgYm9vbCBoYXNKSVRDb2RlRm9yQ2FsbCgpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA+PSAwOworICAgIH0K
KyAgICAgICAgCisgICAgYm9vbCBoYXNKSVRDb2RlRm9yQ29uc3RydWN0KCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPj0gMDsKKyAgICB9
CisgICAgICAgIAorICAgIGJvb2wgaGFzSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAg
ICAgICAgICAgIHJldHVybiBoYXNKSVRDb2RlRm9yQ2FsbCgpOworICAgICAgICBBU1NFUlQoa2lu
ZCA9PSBDb2RlRm9yQ29uc3RydWN0KTsKKyAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDb25z
dHJ1Y3QoKTsKKyAgICB9CisKKyAgICAvLyBJbnRyaW5zaWNzIGFyZSBvbmx5IGZvciBjYWxscywg
Y3VycmVudGx5LgorICAgIEludHJpbnNpYyBpbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBtX2lu
dHJpbnNpYzsgfQorICAgICAgICAKKyAgICBJbnRyaW5zaWMgaW50cmluc2ljRm9yKENvZGVTcGVj
aWFsaXphdGlvbktpbmQga2luZCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpc0NhbGwoa2lu
ZCkpCisgICAgICAgICAgICByZXR1cm4gaW50cmluc2ljKCk7CisgICAgICAgIHJldHVybiBOb0lu
dHJpbnNpYzsKKyAgICB9CisgICAgCisgICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7
CisgICAgICAgIAorcHJvdGVjdGVkOgorICAgIEludHJpbnNpYyBtX2ludHJpbnNpYzsKKyAgICBS
ZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsKKyAgICBSZWZQdHI8SklUQ29kZT4gbV9q
aXRDb2RlRm9yQ29uc3RydWN0OworICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVG
b3JDYWxsV2l0aEFyaXR5Q2hlY2s7CisgICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1faml0Q29k
ZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNrOworfTsKKworY2xhc3MgTmF0aXZlRXhlY3V0YWJs
ZSBmaW5hbCA6IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7CisgICAgZnJpZW5kIGNsYXNzIEpJVDsK
KyAgICBmcmllbmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOworcHVibGljOgorICAgIHR5
cGVkZWYgRXhlY3V0YWJsZUJhc2UgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3Ry
dWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7
CisKKyAgICBzdGF0aWMgTmF0aXZlRXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0
cjxKSVRDb2RlPiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRy
PEpJVENvZGU+IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50
cmluc2ljIGludHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKTsKKworICAgIHN0YXRpYyB2b2lk
IGRlc3Ryb3koSlNDZWxsKik7CisKKyAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNp
YWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbigpIHsg
cmV0dXJuIG1fZnVuY3Rpb247IH0KKyAgICBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvcigpIHsg
cmV0dXJuIG1fY29uc3RydWN0b3I7IH0KKyAgICAgICAgCisgICAgTmF0aXZlRnVuY3Rpb24gbmF0
aXZlRnVuY3Rpb25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAg
ICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24o
KTsKKyAgICAgICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJl
dHVybiBjb25zdHJ1Y3RvcigpOworICAgIH0KKyAgICAgICAgCisgICAgc3RhdGljIHB0cmRpZmZf
dCBvZmZzZXRPZk5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkK
KyAgICB7CisgICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQorICAgICAgICAgICAgcmV0
dXJuIE9CSkVDVF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2Z1bmN0aW9uKTsKKyAgICAg
ICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBPQkpF
Q1RfT0ZGU0VUT0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9jb25zdHJ1Y3Rvcik7CisgICAgfQorCisg
ICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiwgSlNHbG9iYWxPYmplY3Qq
LCBKU1ZhbHVlIHByb3RvKTsKKyAgICAgICAgCisgICAgREVDTEFSRV9JTkZPOworCisgICAgY29u
c3QgU3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisKK3Byb3RlY3RlZDoK
KyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1
bmssIFBhc3NSZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0cmluZyYgbmFt
ZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworCisgICAg
TmF0aXZlRXhlY3V0YWJsZShWTSYsIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5j
dGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljKTsKKworICAgIE5hdGl2ZUZ1bmN0aW9uIG1fZnVu
Y3Rpb247CisgICAgTmF0aXZlRnVuY3Rpb24gbV9jb25zdHJ1Y3RvcjsKKworICAgIFN0cmluZyBt
X25hbWU7Cit9OworCitjbGFzcyBTY3JpcHRFeGVjdXRhYmxlIDogcHVibGljIEV4ZWN1dGFibGVC
YXNlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7
CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworICAgICAgICAKKyAgICBDb2Rl
QmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7CisKKyAgICBj
b25zdCBTb3VyY2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZTsgfQorICAg
IGludHB0cl90IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2UucHJvdmlkZXJJRCgp
OyB9CisgICAgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3NvdXJj
ZS5wcm92aWRlcigpLT51cmwoKTsgfQorICAgIGludCBmaXJzdExpbmUoKSBjb25zdCB7IHJldHVy
biBtX2ZpcnN0TGluZTsgfQorICAgIHZvaWQgc2V0T3ZlcnJpZGVMaW5lTnVtYmVyKGludCBvdmVy
cmlkZUxpbmVOdW1iZXIpIHsgbV9vdmVycmlkZUxpbmVOdW1iZXIgPSBvdmVycmlkZUxpbmVOdW1i
ZXI7IH0KKyAgICBib29sIGhhc092ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1f
b3ZlcnJpZGVMaW5lTnVtYmVyICE9IC0xOyB9CisgICAgaW50IG92ZXJyaWRlTGluZU51bWJlcigp
IGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyOyB9CisgICAgaW50IGxhc3RMaW5l
KCkgY29uc3QgeyByZXR1cm4gbV9sYXN0TGluZTsgfQorICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1u
KCkgY29uc3QgeyByZXR1cm4gbV9zdGFydENvbHVtbjsgfQorICAgIHVuc2lnbmVkIGVuZENvbHVt
bigpIGNvbnN0IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9CisgICAgdW5zaWduZWQgdHlwZVByb2Zp
bGluZ1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZz
ZXQ7IH0KKyAgICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1
cm4gbV90eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OyB9CisKKyAgICBib29sIHVzZXNFdmFsKCkgY29u
c3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0dXJlOyB9CisgICAgYm9vbCB1c2VzQXJn
dW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEFyZ3VtZW50c0ZlYXR1cmU7IH0K
KyAgICBib29sIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lzQXJy
b3dGdW5jdGlvbkNvbnRleHQ7IH0KKyAgICBib29sIGlzU3RyaWN0TW9kZSgpIGNvbnN0IHsgcmV0
dXJuIG1fZmVhdHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVyZTsgfQorICAgIERlcml2ZWRDb250ZXh0
VHlwZSBkZXJpdmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxEZXJp
dmVkQ29udGV4dFR5cGU+KG1fZGVyaXZlZENvbnRleHRUeXBlKTsgfQorICAgIEV2YWxDb250ZXh0
VHlwZSBldmFsQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFdmFsQ29u
dGV4dFR5cGU+KG1fZXZhbENvbnRleHRUeXBlKTsgfQorCisgICAgRUNNQU1vZGUgZWNtYU1vZGUo
KSBjb25zdCB7IHJldHVybiBpc1N0cmljdE1vZGUoKSA/IFN0cmljdE1vZGUgOiBOb3RTdHJpY3RN
b2RlOyB9CisgICAgICAgIAorICAgIHZvaWQgc2V0TmV2ZXJJbmxpbmUoYm9vbCB2YWx1ZSkgeyBt
X25ldmVySW5saW5lID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldE5ldmVyT3B0aW1pemUoYm9vbCB2
YWx1ZSkgeyBtX25ldmVyT3B0aW1pemUgPSB2YWx1ZTsgfQorICAgIHZvaWQgc2V0TmV2ZXJGVExP
cHRpbWl6ZShib29sIHZhbHVlKSB7IG1fbmV2ZXJGVExPcHRpbWl6ZSA9IHZhbHVlOyB9CisgICAg
dm9pZCBzZXREaWRUcnlUb0VudGVySW5Mb29wKGJvb2wgdmFsdWUpIHsgbV9kaWRUcnlUb0VudGVy
SW5Mb29wID0gdmFsdWU7IH0KKyAgICB2b2lkIHNldENhblVzZU9TUkV4aXRGdXp6aW5nKGJvb2wg
dmFsdWUpIHsgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9IHZhbHVlOyB9CisgICAgYm9vbCBuZXZl
cklubGluZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJbmxpbmU7IH0KKyAgICBib29sIG5ldmVy
T3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyT3B0aW1pemU7IH0KKyAgICBib29sIG5l
dmVyRlRMT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyRlRMT3B0aW1pemU7IH0KKyAg
ICBib29sIGRpZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25zdCB7IHJldHVybiBtX2RpZFRyeVRvRW50
ZXJJbkxvb3A7IH0KKyAgICBib29sIGlzSW5saW5pbmdDYW5kaWRhdGUoKSBjb25zdCB7IHJldHVy
biAhbmV2ZXJJbmxpbmUoKTsgfQorICAgIGJvb2wgaXNPa1RvT3B0aW1pemUoKSBjb25zdCB7IHJl
dHVybiAhbmV2ZXJPcHRpbWl6ZSgpOyB9CisgICAgYm9vbCBjYW5Vc2VPU1JFeGl0RnV6emluZygp
IGNvbnN0IHsgcmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1enppbmc7IH0KKyAgICAKKyAgICBib29s
KiBhZGRyZXNzT2ZEaWRUcnlUb0VudGVySW5Mb29wKCkgeyByZXR1cm4gJm1fZGlkVHJ5VG9FbnRl
ckluTG9vcDsgfQorCisgICAgQ29kZUZlYXR1cmVzIGZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4g
bV9mZWF0dXJlczsgfQorICAgICAgICAKKyAgICBERUNMQVJFX0VYUE9SVF9JTkZPOworCisgICAg
dm9pZCByZWNvcmRQYXJzZShDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGJvb2wgaGFzQ2FwdHVyZWRW
YXJpYWJsZXMsIGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1
bW4sIHVuc2lnbmVkIGVuZENvbHVtbikKKyAgICB7CisgICAgICAgIG1fZmVhdHVyZXMgPSBmZWF0
dXJlczsKKyAgICAgICAgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA9IGhhc0NhcHR1cmVkVmFyaWFi
bGVzOworICAgICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGluZTsKKyAgICAgICAgbV9sYXN0TGlu
ZSA9IGxhc3RMaW5lOworICAgICAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOwor
ICAgICAgICBtX3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47CisgICAgICAgIEFTU0VSVChlbmRD
b2x1bW4gIT0gVUlOVF9NQVgpOworICAgICAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKKyAg
ICB9CisKKyAgICB2b2lkIGluc3RhbGxDb2RlKENvZGVCbG9jayopOworICAgIHZvaWQgaW5zdGFs
bENvZGUoVk0mLCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7
CisgICAgQ29kZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCwg
SlNGdW5jdGlvbiosIEpTU2NvcGUqLCBKU09iamVjdComIGV4Y2VwdGlvbik7CisgICAgQ29kZUJs
b2NrKiBuZXdSZXBsYWNlbWVudENvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsK
KworICAgIC8vIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGludGVyZXN0aW5nIEdDIHN0b3J5LiBDYWxs
ZXJzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGFza2luZyB1cyB0byBjcmVhdGUgYSBDb2RlQmxvY2sK
KyAgICAvLyB0aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVy
bnMuIENhbGxlcnMgYXJlIGVzc2VudGlhbGx5IGFza2luZyBmb3IgYSBzdHJvbmcgcmVmZXJlbmNl
CisgICAgLy8gdG8gdGhlIENvZGVCbG9jay4gQmVjYXVzZSB0aGUgRXhlY3V0YWJsZSBtYXkgYmUg
YWxsb2NhdGluZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1aXJlIGNhbGxlcnMgdG8gcGFzcyBpbgor
ICAgIC8vIHRoZWlyIENvZGVCbG9jayomIHJlZmVyZW5jZSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3Ig
Q29kZUJsb2NrIHRvIGJlIGpldHRpc29uZWQgaWYgRXhlY3V0YWJsZSBpcyB0aGUgb25seSB0aGlu
ZworICAgIC8vIHRvIHBvaW50IHRvIGl0LiBUaGlzIGZvcmNlcyBjYWxsZXJzIHRvIGhhdmUgYSBD
b2RlQmxvY2sqIGluIGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNrIHRoYXQgd2lsbCBiZSBtYXJr
ZWQKKyAgICAvLyBieSBjb25zZXJ2YXRpdmUgR0MgaWYgYSBHQyBoYXBwZW5zIGFmdGVyIHdlIGNy
ZWF0ZSB0aGUgQ29kZUJsb2NrLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlw
ZT4KKyAgICBKU09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYsIEpTRnVuY3Rpb24qLCBK
U1Njb3BlKiwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJs
b2NrKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPiB2b2lkIGZvckVhY2hDb2Rl
QmxvY2soRnVuY3RvciYmKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJs
ZUJhc2U7CisgICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb25JbXBsKFZNJiwgSlNGdW5j
dGlvbiosIEpTU2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJik7CisK
K3Byb3RlY3RlZDoKKyAgICBTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSosIFZNJiwgY29uc3Qg
U291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwg
Ym9vbCBpc0luQXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSwgSW50cmluc2lj
KTsKKworICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZtKQorICAgIHsKKyAgICAgICAgQmFz
ZTo6ZmluaXNoQ3JlYXRpb24odm0pOworICAgICAgICB2bS5oZWFwLmFkZEV4ZWN1dGFibGUodGhp
cyk7IC8vIEJhbGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVubWFya2VkQ29tcGlsZWRDb2RlKCkuCisK
KyNpZiBFTkFCTEUoQ09ERUJMT0NLX1NBTVBMSU5HKQorICAgICAgICBpZiAoU2FtcGxpbmdUb29s
KiBzYW1wbGVyID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBsZXIoKSkKKyAgICAgICAgICAgIHNhbXBs
ZXItPm5vdGlmeU9mU2NvcGUodm0sIHRoaXMpOworI2VuZGlmCisgICAgfQorCisgICAgQ29kZUZl
YXR1cmVzIG1fZmVhdHVyZXM7CisgICAgYm9vbCBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7CisgICAg
Ym9vbCBtX2hhc0NhcHR1cmVkVmFyaWFibGVzIDogMTsKKyAgICBib29sIG1fbmV2ZXJJbmxpbmUg
OiAxOworICAgIGJvb2wgbV9uZXZlck9wdGltaXplIDogMTsKKyAgICBib29sIG1fbmV2ZXJGVExP
cHRpbWl6ZSA6IDE7CisgICAgYm9vbCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQgOiAxOworICAg
IGJvb2wgbV9jYW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7CisgICAgdW5zaWduZWQgbV9kZXJpdmVk
Q29udGV4dFR5cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4dFR5cGUKKyAgICB1bnNpZ25lZCBtX2V2
YWxDb250ZXh0VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0VHlwZQorCisgICAgaW50IG1fb3ZlcnJp
ZGVMaW5lTnVtYmVyOworICAgIGludCBtX2ZpcnN0TGluZTsKKyAgICBpbnQgbV9sYXN0TGluZTsK
KyAgICB1bnNpZ25lZCBtX3N0YXJ0Q29sdW1uOworICAgIHVuc2lnbmVkIG1fZW5kQ29sdW1uOwor
ICAgIHVuc2lnbmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OworICAgIHVuc2lnbmVkIG1f
dHlwZVByb2ZpbGluZ0VuZE9mZnNldDsKKyAgICBTb3VyY2VDb2RlIG1fc291cmNlOworfTsKKwor
Y2xhc3MgRXZhbEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Cisg
ICAgZnJpZW5kIGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKK3B1YmxpYzoKKyAgICB0eXBl
ZGVmIFNjcmlwdEV4ZWN1dGFibGUgQmFzZTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3Ry
dWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7
CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAgRXZhbENvZGVCbG9j
ayogY29kZUJsb2NrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2V2YWxDb2RlQmxvY2suZ2V0
KCk7CisgICAgfQorCisgICAgc3RhdGljIEV2YWxFeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRl
KiwgY29uc3QgU291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250
ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIGNv
bnN0IFZhcmlhYmxlRW52aXJvbm1lbnQqKTsKKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2Vu
ZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZv
ckNhbGwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUo
Vk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHBy
b3RvLCBUeXBlSW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygp
KTsKKyAgICB9CisgICAgICAgIAorICAgIERFQ0xBUkVfSU5GTzsKKworICAgIEV4ZWN1dGFibGVJ
bmZvIGV4ZWN1dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2
YWwoKSwgaXNTdHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25l
LCBKU1BhcnNlclNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBT
b3VyY2VQYXJzZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJv
d0Z1bmN0aW9uQ29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRleHRUeXBlKCkpOyB9CisKKyAgICB1
bnNpZ25lZCBudW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+
bnVtVmFyaWFibGVzKCk7IH0KKyAgICB1bnNpZ25lZCBudW1iZXJPZkZ1bmN0aW9uRGVjbHMoKSB7
IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7
IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgZnJp
ZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7CisKKyAgICBFdmFsRXhlY3V0YWJsZShFeGVjU3Rh
dGUqLCBjb25zdCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250
ZXh0VHlwZSwgYm9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUpOwor
CisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwor
CisgICAgV3JpdGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1fZXZhbENvZGVCbG9jazsKKyAgICBX
cml0ZUJhcnJpZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBtX3VubGlua2VkRXZhbENvZGVCbG9j
azsKK307CisKK2NsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4
ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJs
aWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1
cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIFByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCisgICAgeworICAgICAgICBQ
cm9ncmFtRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxs
PFByb2dyYW1FeGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgUHJvZ3JhbUV4ZWN1dGFibGUoZXhl
Yywgc291cmNlKTsKKyAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0o
KSk7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKworCisgICAgSlNPYmplY3Qq
IGluaXRpYWxpemVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwgQ2FsbEZyYW1lKiwgSlNTY29wZSopOwor
CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIFByb2dyYW1Db2RlQmxv
Y2sqIGNvZGVCbG9jaygpCisgICAgeworICAgICAgICByZXR1cm4gbV9wcm9ncmFtQ29kZUJsb2Nr
LmdldCgpOworICAgIH0KKworICAgIEpTT2JqZWN0KiBjaGVja1N5bnRheChFeGVjU3RhdGUqKTsK
KworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAg
ICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKKyAgICB9CisgICAgICAgIAor
ICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2Jq
ZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAgeworICAgICAgICByZXR1cm4g
U3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFByb2dy
YW1FeGVjdXRhYmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOworICAgIH0KKyAgICAg
ICAgCisgICAgREVDTEFSRV9JTkZPOworCisgICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUlu
Zm8oKSBjb25zdCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1v
ZGUoKSwgZmFsc2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0
TW9kZTo6Q2xhc3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6
UHJvZ3JhbU1vZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0
KCksIGZhbHNlLCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9CisKK3ByaXZhdGU6CisgICAgZnJp
ZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRh
YmxlOworCisgICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29k
ZSYpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRv
ciYpOworCisgICAgV3JpdGVCYXJyaWVyPFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxp
bmtlZFByb2dyYW1Db2RlQmxvY2s7CisgICAgV3JpdGVCYXJyaWVyPFByb2dyYW1Db2RlQmxvY2s+
IG1fcHJvZ3JhbUNvZGVCbG9jazsKK307CisKK2NsYXNzIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxl
IGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUgeworICAgIGZyaWVuZCBjbGFzcyBMTElu
dE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxl
IEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6
U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIE1vZHVs
ZVByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYp
OworCisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKKworICAgIE1vZHVsZVByb2dy
YW1Db2RlQmxvY2sqIGNvZGVCbG9jaygpCisgICAgeworICAgICAgICByZXR1cm4gbV9tb2R1bGVQ
cm9ncmFtQ29kZUJsb2NrLmdldCgpOworICAgIH0KKworICAgIFBhc3NSZWZQdHI8SklUQ29kZT4g
Z2VuZXJhdGVkSklUQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29k
ZUZvckNhbGwoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1
cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3Qs
IHByb3RvLCBUeXBlSW5mbyhNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZs
YWdzKSwgaW5mbygpKTsKKyAgICB9CisKKyAgICBERUNMQVJFX0lORk87CisKKyAgICBFeGVjdXRh
YmxlSW5mbyBleGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVz
ZXNFdmFsKCksIGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6
Tm9uZSwgSlNQYXJzZXJTY3JpcHRNb2RlOjpNb2R1bGUsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVk
LCBTb3VyY2VQYXJzZU1vZGU6Ok1vZHVsZUV2YWx1YXRlTW9kZSwgZGVyaXZlZENvbnRleHRUeXBl
KCksIGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9u
ZSk7IH0KKworICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1
bGVQcm9ncmFtQ29kZUJsb2NrKCkgeyByZXR1cm4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2Rl
QmxvY2suZ2V0KCk7IH0KKworICAgIFN5bWJvbFRhYmxlKiBtb2R1bGVFbnZpcm9ubWVudFN5bWJv
bFRhYmxlKCkgeyByZXR1cm4gbV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLmdldCgpOyB9
CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOworICAgIGZyaWVu
ZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOworCisgICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUo
RXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRD
aGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworCisgICAgV3JpdGVCYXJyaWVyPFVubGlu
a2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2s7CisgICAgV3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxlPiBtX21vZHVsZUVudmlyb25tZW50U3lt
Ym9sVGFibGU7CisgICAgV3JpdGVCYXJyaWVyPE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fbW9k
dWxlUHJvZ3JhbUNvZGVCbG9jazsKK307CisKK2NsYXNzIEZ1bmN0aW9uRXhlY3V0YWJsZSBmaW5h
bCA6IHB1YmxpYyBTY3JpcHRFeGVjdXRhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgSklUOworICAg
IGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7CitwdWJsaWM6CisgICAgdHlwZWRl
ZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVj
dHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwor
CisgICAgc3RhdGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogY3JlYXRlKAorICAgICAgICBWTSYgdm0s
IGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVu
bGlua2VkRXhlY3V0YWJsZSwgCisgICAgICAgIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQg
bGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJp
bnNpYyBpbnRyaW5zaWMpCisgICAgeworICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1
dGFibGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxGdW5jdGlvbkV4ZWN1dGFibGU+KHZt
LmhlYXApKSBGdW5jdGlvbkV4ZWN1dGFibGUodm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxl
LCBmaXJzdExpbmUsIGxhc3RMaW5lLCBzdGFydENvbHVtbiwgZW5kQ29sdW1uLCBpbnRyaW5zaWMp
OworICAgICAgICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7CisgICAgICAgIHJldHVy
biBleGVjdXRhYmxlOworICAgIH0KKyAgICBzdGF0aWMgRnVuY3Rpb25FeGVjdXRhYmxlKiBmcm9t
R2xvYmFsQ29kZSgKKyAgICAgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiwg
Y29uc3QgU291cmNlQ29kZSYsIAorICAgICAgICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92
ZXJyaWRlTGluZU51bWJlcik7CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwor
ICAgICAgICAKKyAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRh
YmxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS5n
ZXQoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIGVpdGhlciBjYWxsIG9yIGNvbnN0cnVjdCBi
eXRlY29kZS4gVGhpcyBjYW4gYmUgYXBwcm9wcmlhdGUKKyAgICAvLyBmb3IgYW5zd2VyaW5nIHF1
ZXN0aW9ucyB0aGF0IHRoYXQgZG9uJ3QgdmFyeSBiZXR3ZWVuIGNhbGwgYW5kIGNvbnN0cnVjdCAt
LQorICAgIC8vIGZvciBleGFtcGxlLCBhcmd1bWVudHNSZWdpc3RlcigpLgorICAgIEZ1bmN0aW9u
Q29kZUJsb2NrKiBlaXRoZXJDb2RlQmxvY2soKQorICAgIHsKKyAgICAgICAgaWYgKG1fY29kZUJs
b2NrRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7
CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKKyAgICB9Cisg
ICAgICAgIAorICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDYWxsKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIHJldHVybiAhIW1fY29kZUJsb2NrRm9yQ2FsbDsKKyAgICB9CisKKyAgICBGdW5jdGlvbkNv
ZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCisgICAgeworICAgICAgICByZXR1cm4gbV9jb2Rl
QmxvY2tGb3JDYWxsLmdldCgpOworICAgIH0KKworICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDb25z
dHJ1Y3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3Ry
dWN0LmdldCgpOworICAgIH0KKworICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3JD
b25zdHJ1Y3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0
LmdldCgpOworICAgIH0KKyAgICAgICAgCisgICAgYm9vbCBpc0dlbmVyYXRlZEZvcihDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9y
Q2FsbCkKKyAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNhbGwoKTsKKyAgICAgICAg
QVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7CisgICAgICAgIHJldHVybiBpc0dlbmVy
YXRlZEZvckNvbnN0cnVjdCgpOworICAgIH0KKyAgICAgICAgCisgICAgRnVuY3Rpb25Db2RlQmxv
Y2sqIGNvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCisgICAgeworICAg
ICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKKyAgICAgICAgICAgIHJldHVybiBjb2RlQmxv
Y2tGb3JDYWxsKCk7CisgICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwor
ICAgICAgICByZXR1cm4gY29kZUJsb2NrRm9yQ29uc3RydWN0KCk7CisgICAgfQorCisgICAgRnVu
Y3Rpb25Db2RlQmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktp
bmQpOworICAgICAgICAKKyAgICBGdW5jdGlvbkNvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2tG
b3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJh
c2VsaW5lQ29kZUJsb2NrRm9yKGtpbmQpOworICAgIH0KKworICAgIFJlZlB0cjxUeXBlU2V0PiBy
ZXR1cm5TdGF0ZW1lbnRUeXBlU2V0KCkgCisgICAgeworICAgICAgICBpZiAoIW1fcmV0dXJuU3Rh
dGVtZW50VHlwZVNldCkKKyAgICAgICAgICAgIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCA9IFR5
cGVTZXQ6OmNyZWF0ZSgpOworCisgICAgICAgIHJldHVybiBtX3JldHVyblN0YXRlbWVudFR5cGVT
ZXQ7CisgICAgfQorICAgICAgICAKKyAgICBGdW5jdGlvbk1vZGUgZnVuY3Rpb25Nb2RlKCkgeyBy
ZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTW9kZSgpOyB9CisgICAgYm9vbCBp
c0J1aWx0aW5GdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5p
c0J1aWx0aW5GdW5jdGlvbigpOyB9CisgICAgQ29uc3RydWN0QWJpbGl0eSBjb25zdHJ1Y3RBYmls
aXR5KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNvbnN0cnVjdEFiaWxp
dHkoKTsgfQorICAgIGJvb2wgaXNDbGFzcygpIGNvbnN0IHsgcmV0dXJuICFjbGFzc1NvdXJjZSgp
LmlzTnVsbCgpOyB9CisgICAgYm9vbCBpc0Fycm93RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBw
YXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OkFycm93RnVuY3Rpb25Nb2RlOyB9CisgICAg
Ym9vbCBpc0dldHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNl
TW9kZTo6R2V0dGVyTW9kZTsgfQorICAgIGJvb2wgaXNTZXR0ZXIoKSBjb25zdCB7IHJldHVybiBw
YXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6OlNldHRlck1vZGU7IH0KKyAgICBib29sIGlz
R2VuZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KFNvdXJjZVBhcnNl
TW9kZTo6R2VuZXJhdG9yQm9keU1vZGUsIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBl
ckZ1bmN0aW9uTW9kZSkuY29udGFpbnMocGFyc2VNb2RlKCkpOyB9CisgICAgYm9vbCBpc01ldGhv
ZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6TWV0aG9k
TW9kZTsgfQorICAgIGJvb2wgaGFzQ2FsbGVyQW5kQXJndW1lbnRzUHJvcGVydGllcygpIGNvbnN0
CisgICAgeworICAgICAgICAvLyBQZXIgaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNz
ZWMtZm9yYmlkZGVuLWV4dGVuc2lvbnMsIG9ubHkgc2xvcHB5LW1vZGUgbm9uLWJ1aWx0aW4gZnVu
Y3Rpb25zIGluIG9sZC1zdHlsZSAocHJlLUVTNikgc3ludGFjdGljIGZvcm1zIGNhbiBjb250YWlu
CisgICAgICAgIC8vICJjYWxsZXIiIGFuZCAiYXJndW1lbnRzIi4KKyAgICAgICAgcmV0dXJuICFp
c1N0cmljdE1vZGUoKSAmJiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1
bmN0aW9uTW9kZSAmJiAhaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsKKyAgICB9CisgICAg
Ym9vbCBoYXNQcm90b3R5cGVQcm9wZXJ0eSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
U291cmNlUGFyc2VNb2RlU2V0KAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpOb3JtYWxG
dW5jdGlvbk1vZGUsCisgICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlN
b2RlLAorICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rp
b25Nb2RlCisgICAgICAgICkuY29udGFpbnMocGFyc2VNb2RlKCkpIHx8IGlzQ2xhc3MoKTsKKyAg
ICB9CisgICAgRGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKTsgfQorICAg
IGJvb2wgaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlu
a2VkRXhlY3V0YWJsZS0+aXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsgfQorICAgIGNvbnN0
IElkZW50aWZpZXImIG5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+bmFtZSgp
OyB9CisgICAgY29uc3QgSWRlbnRpZmllciYgZWNtYU5hbWUoKSB7IHJldHVybiBtX3VubGlua2Vk
RXhlY3V0YWJsZS0+ZWNtYU5hbWUoKTsgfQorICAgIGNvbnN0IElkZW50aWZpZXImIGluZmVycmVk
TmFtZSgpIHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pbmZlcnJlZE5hbWUoKTsgfQor
ICAgIHVuc2lnbmVkIHBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4
ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7IH0gLy8gRXhjbHVkaW5nICd0aGlzJyEKKyAgICB1
bnNpZ25lZCBmdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRh
YmxlLT5mdW5jdGlvbkxlbmd0aCgpOyB9CisgICAgU291cmNlUGFyc2VNb2RlIHBhcnNlTW9kZSgp
IGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJzZU1vZGUoKTsgfQorICAg
IEpTUGFyc2VyU2NyaXB0TW9kZSBzY3JpcHRNb2RlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtl
ZEV4ZWN1dGFibGUtPnNjcmlwdE1vZGUoKTsgfQorICAgIGNvbnN0IFNvdXJjZUNvZGUmIGNsYXNz
U291cmNlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNsYXNzU291cmNl
KCk7IH0KKworICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0
b3ImKTsKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5m
byhGdW5jdGlvbkV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CisgICAg
fQorCisgICAgdW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4g
bV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7IH0KKworICAgIHZvaWQgb3ZlcnJpZGVQYXJhbWV0ZXJB
bmRUeXBlUHJvZmlsaW5nU3RhcnRFbmRPZmZzZXRzKHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9m
ZnNldCwgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0eXBlUHJv
ZmlsaW5nRW5kT2Zmc2V0KQorICAgIHsKKyAgICAgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQg
PSBwYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7CisgICAgICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zm
c2V0ID0gdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OworICAgICAgICBtX3R5cGVQcm9maWxpbmdF
bmRPZmZzZXQgPSB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OworICAgIH0KKworICAgIERFQ0xBUkVf
SU5GTzsKKworICAgIEluZmVycmVkVmFsdWUqIHNpbmdsZXRvbkZ1bmN0aW9uKCkgeyByZXR1cm4g
bV9zaW5nbGV0b25GdW5jdGlvbi5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFz
cyBFeGVjdXRhYmxlQmFzZTsKKyAgICBGdW5jdGlvbkV4ZWN1dGFibGUoCisgICAgICAgIFZNJiwg
Y29uc3QgU291cmNlQ29kZSYsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiwgdW5zaWduZWQg
Zmlyc3RMaW5lLCAKKyAgICAgICAgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29s
dW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyk7CisgICAgCisgICAgdm9pZCBmaW5p
c2hDcmVhdGlvbihWTSYpOworCisgICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Cisg
ICAgCisgICAgdW5zaWduZWQgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7CisgICAgV3JpdGVCYXJy
aWVyPFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlPiBtX3VubGlua2VkRXhlY3V0YWJsZTsKKyAg
ICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKKyAg
ICBXcml0ZUJhcnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0
OworICAgIFJlZlB0cjxUeXBlU2V0PiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7CisgICAgV3Jp
dGVCYXJyaWVyPEluZmVycmVkVmFsdWU+IG1fc2luZ2xldG9uRnVuY3Rpb247Cit9OworCisjaWYg
RU5BQkxFKFdFQkFTU0VNQkxZKQorY2xhc3MgV2ViQXNzZW1ibHlFeGVjdXRhYmxlIGZpbmFsIDog
cHVibGljIEV4ZWN1dGFibGVCYXNlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEV4ZWN1dGFibGVC
YXNlIEJhc2U7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFz
ZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOworCisgICAgc3RhdGljIFdl
YkFzc2VtYmx5RXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgc291
cmNlLCBKU1dhc21Nb2R1bGUqIG1vZHVsZSwgdW5zaWduZWQgZnVuY3Rpb25JbmRleCkKKyAgICB7
CisgICAgICAgIFdlYkFzc2VtYmx5RXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVs
bCwgYWxsb2NhdGVDZWxsPFdlYkFzc2VtYmx5RXhlY3V0YWJsZT4odm0uaGVhcCkpIFdlYkFzc2Vt
Ymx5RXhlY3V0YWJsZSh2bSwgc291cmNlLCBtb2R1bGUsIGZ1bmN0aW9uSW5kZXgpOworICAgICAg
ICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7CisgICAgICAgIHJldHVybiBleGVjdXRh
YmxlOworICAgIH0KKworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYg
dm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCisgICAgewor
ICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8s
IFR5cGVJbmZvKFdlYkFzc2VtYmx5RXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5m
bygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOworCisgICAg
REVDTEFSRV9JTkZPOworCisgICAgdm9pZCBwcmVwYXJlRm9yRXhlY3V0aW9uKFZNJik7CisKKyAg
ICBXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2NrRm9yQ2FsbCgpCisgICAgeworICAgICAg
ICByZXR1cm4gbV9jb2RlQmxvY2tGb3JDYWxsLmdldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7CisgICAgV2ViQXNzZW1ibHlFeGVjdXRhYmxl
KFZNJiwgY29uc3QgU291cmNlQ29kZSYsIEpTV2FzbU1vZHVsZSosIHVuc2lnbmVkIGZ1bmN0aW9u
SW5kZXgpOworCisgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90Vmlz
aXRvciYpOworCisgICAgU291cmNlQ29kZSBtX3NvdXJjZTsKKyAgICBXcml0ZUJhcnJpZXI8SlNX
YXNtTW9kdWxlPiBtX21vZHVsZTsKKyAgICB1bnNpZ25lZCBtX2Z1bmN0aW9uSW5kZXg7CisKKyAg
ICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlDb2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsK
K307CisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIEV4ZWN1dGFibGVUeXBlPgorSlNPYmpl
Y3QqIFNjcmlwdEV4ZWN1dGFibGU6OnByZXBhcmVGb3JFeGVjdXRpb24oVk0mIHZtLCBKU0Z1bmN0
aW9uKiBmdW5jdGlvbiwgSlNTY29wZSogc2NvcGUsIENvZGVTcGVjaWFsaXphdGlvbktpbmQga2lu
ZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKQoreworICAgIGlmIChoYXNKSVRDb2RlRm9y
KGtpbmQpKSB7CisgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIEV2YWxF
eGVjdXRhYmxlPjo6dmFsdWUpCisgICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8
Q29kZUJsb2NrKj4oanNDYXN0PEV2YWxFeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsK
KyAgICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBQcm9ncmFtRXhl
Y3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0PENv
ZGVCbG9jayo+KGpzQ2FzdDxQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2RlQmxvY2soKSk7
CisgICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgTW9kdWxlUHJv
Z3JhbUV4ZWN1dGFibGU+Ojp2YWx1ZSkKKyAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpz
Q2FzdDxDb2RlQmxvY2sqPihqc0Nhc3Q8TW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUqPih0aGlzKS0+
Y29kZUJsb2NrKCkpOworICAgICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5
cGUsIEZ1bmN0aW9uRXhlY3V0YWJsZT46OnZhbHVlKQorICAgICAgICAgICAgcmVzdWx0Q29kZUJs
b2NrID0ganNDYXN0PENvZGVCbG9jayo+KGpzQ2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPih0aGlz
KS0+Y29kZUJsb2NrRm9yKGtpbmQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQor
ICAgIHJldHVybiBwcmVwYXJlRm9yRXhlY3V0aW9uSW1wbCh2bSwgZnVuY3Rpb24sIHNjb3BlLCBr
aW5kLCByZXN1bHRDb2RlQmxvY2spOworfQorCit9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0YWJsZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1dlYkFzc2VtYmx5RXhlY3V0
YWJsZS5oCShyZXZpc2lvbiAyMDc3OTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9XZWJBc3NlbWJseUV4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpAQCAtMjUsNjk0ICsyNSwx
MCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkFyaXR5Q2hlY2tNb2RlLmgiCi0jaW5j
bHVkZSAiQ2FsbERhdGEuaCIKLSNpbmNsdWRlICJDb2RlQmxvY2tIYXNoLmgiCi0jaW5jbHVkZSAi
Q29kZVNwZWNpYWxpemF0aW9uS2luZC5oIgotI2luY2x1ZGUgIkNvbXBpbGF0aW9uUmVzdWx0Lmgi
Ci0jaW5jbHVkZSAiRXhlY3V0YWJsZUluZm8uaCIKLSNpbmNsdWRlICJIYW5kbGVySW5mby5oIgot
I2luY2x1ZGUgIkluZmVycmVkVmFsdWUuaCIKLSNpbmNsdWRlICJKSVRDb2RlLmgiCi0jaW5jbHVk
ZSAiSlNHbG9iYWxPYmplY3QuaCIKLSNpbmNsdWRlICJTb3VyY2VDb2RlLmgiCi0jaW5jbHVkZSAi
VHlwZVNldC5oIgotI2luY2x1ZGUgIlVubGlua2VkQ29kZUJsb2NrLmgiCi0jaW5jbHVkZSAiVW5s
aW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUuaCIKKyNpbmNsdWRlICJFeGVjdXRhYmxlQmFzZS5oIgog
CiBuYW1lc3BhY2UgSlNDIHsKIAotY2xhc3MgQ29kZUJsb2NrOwotY2xhc3MgRXZhbENvZGVCbG9j
azsKLWNsYXNzIEZ1bmN0aW9uQ29kZUJsb2NrOwotY2xhc3MgSlNTY29wZTsKLWNsYXNzIEpTV2Fz
bU1vZHVsZTsKLWNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLWNsYXNzIE1vZHVsZVByb2dy
YW1Db2RlQmxvY2s7Ci1jbGFzcyBQcm9ncmFtQ29kZUJsb2NrOwotY2xhc3MgV2ViQXNzZW1ibHlD
b2RlQmxvY2s7Ci0KLWVudW0gQ29tcGlsYXRpb25LaW5kIHsgRmlyc3RDb21waWxhdGlvbiwgT3B0
aW1pemluZ0NvbXBpbGF0aW9uIH07Ci0KLWlubGluZSBib29sIGlzQ2FsbChDb2RlU3BlY2lhbGl6
YXRpb25LaW5kIGtpbmQpCi17Ci0gICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotY2xhc3MgRXhlY3V0YWJsZUJhc2UgOiBwdWJsaWMgSlNDZWxs
IHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNvbnN0
IGludCBOVU1fUEFSQU1FVEVSU19JU19IT1NUID0gMDsKLSAgICBzdGF0aWMgY29uc3QgaW50IE5V
TV9QQVJBTUVURVJTX05PVF9DT01QSUxFRCA9IC0xOwotCi0gICAgRXhlY3V0YWJsZUJhc2UoVk0m
IHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgaW50IG51bVBhcmFtZXRlcnMsIEludHJpbnNpYyBp
bnRyaW5zaWMpCi0gICAgICAgIDogSlNDZWxsKHZtLCBzdHJ1Y3R1cmUpCi0gICAgICAgICwgbV9u
dW1QYXJhbWV0ZXJzRm9yQ2FsbChudW1QYXJhbWV0ZXJzKQotICAgICAgICAsIG1fbnVtUGFyYW1l
dGVyc0ZvckNvbnN0cnVjdChudW1QYXJhbWV0ZXJzKQotICAgICAgICAsIG1faW50cmluc2ljKGlu
dHJpbnNpYykKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYgdm0p
Ci0gICAgewotICAgICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgfQotCi1wdWJs
aWM6Ci0gICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQg
U3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKLQotICAgIHN0YXRpYyBjb25z
dCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0cnVlOwotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3ko
SlNDZWxsKik7Ci0gICAgICAgIAotICAgIENvZGVCbG9ja0hhc2ggaGFzaEZvcihDb2RlU3BlY2lh
bGl6YXRpb25LaW5kKSBjb25zdDsKLQotICAgIGJvb2wgaXNFdmFsRXhlY3V0YWJsZSgpIGNvbnN0
Ci0gICAgewotICAgICAgICByZXR1cm4gdHlwZSgpID09IEV2YWxFeGVjdXRhYmxlVHlwZTsKLSAg
ICB9Ci0gICAgYm9vbCBpc0Z1bmN0aW9uRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAg
ICByZXR1cm4gdHlwZSgpID09IEZ1bmN0aW9uRXhlY3V0YWJsZVR5cGU7Ci0gICAgfQotICAgIGJv
b2wgaXNQcm9ncmFtRXhlY3V0YWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdHlw
ZSgpID09IFByb2dyYW1FeGVjdXRhYmxlVHlwZTsKLSAgICB9Ci0gICAgYm9vbCBpc01vZHVsZVBy
b2dyYW1FeGVjdXRhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0eXBlKCkgPT0gTW9kdWxl
UHJvZ3JhbUV4ZWN1dGFibGVUeXBlOwotICAgIH0KLQotCi0gICAgYm9vbCBpc0hvc3RGdW5jdGlv
bigpIGNvbnN0Ci0gICAgewotICAgICAgICBBU1NFUlQoKG1fbnVtUGFyYW1ldGVyc0ZvckNhbGwg
PT0gTlVNX1BBUkFNRVRFUlNfSVNfSE9TVCkgPT0gKG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVj
dCA9PSBOVU1fUEFSQU1FVEVSU19JU19IT1NUKSk7Ci0gICAgICAgIHJldHVybiBtX251bVBhcmFt
ZXRlcnNGb3JDYWxsID09IE5VTV9QQVJBTUVURVJTX0lTX0hPU1Q7Ci0gICAgfQotCi0jaWYgRU5B
QkxFKFdFQkFTU0VNQkxZKQotICAgIGJvb2wgaXNXZWJBc3NlbWJseUV4ZWN1dGFibGUoKSBjb25z
dAotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGUoKSA9PSBXZWJBc3NlbWJseUV4ZWN1dGFibGVU
eXBlOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0
dXJlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90bykg
eyByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJ
bmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7IH0KLSAgICAgICAgCi0gICAg
dm9pZCBjbGVhckNvZGUoKTsKLQotICAgIERFQ0xBUkVfRVhQT1JUX0lORk87Ci0KLXByb3RlY3Rl
ZDoKLSAgICBpbnQgbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbDsKLSAgICBpbnQgbV9udW1QYXJhbWV0
ZXJzRm9yQ29uc3RydWN0OwotCi1wdWJsaWM6Ci0gICAgUGFzc1JlZlB0cjxKSVRDb2RlPiBnZW5l
cmF0ZWRKSVRDb2RlRm9yQ2FsbCgpCi0gICAgewotICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9y
Q2FsbCk7Ci0gICAgICAgIHJldHVybiBtX2ppdENvZGVGb3JDYWxsOwotICAgIH0KLQotICAgIFBh
c3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvckNvbnN0cnVjdCgpCi0gICAgewot
ICAgICAgICBBU1NFUlQobV9qaXRDb2RlRm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIG1f
aml0Q29kZUZvckNvbnN0cnVjdDsKLSAgICB9Ci0gICAgICAgIAotICAgIFBhc3NSZWZQdHI8SklU
Q29kZT4gZ2VuZXJhdGVkSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0g
ICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVy
biBnZW5lcmF0ZWRKSVRDb2RlRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2Rl
Rm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEpJVENvZGVGb3JDb25zdHJ1
Y3QoKTsKLSAgICB9Ci0gICAgCi0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIGVudHJ5cG9pbnRG
b3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBBcml0eUNoZWNrTW9kZSBhcml0eSkKLSAg
ICB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0LiBXZSBvbmx5
IGhhdmUgaXQgZm9yIGFyaXR5IGNoZWNrIGJlY2F1c2Ugd2UgdXNlIHRoZQotICAgICAgICAvLyBu
by1hcml0eSBlbnRyeXBvaW50IGluIG5vbi12aXJ0dWFsIGNhbGxzLCB3aGljaCB3aWxsICJjYWNo
ZSIgdGhpcyB2YWx1ZSBkaXJlY3RseSBpbgotICAgICAgICAvLyBtYWNoaW5lIGNvZGUuCi0gICAg
ICAgIGlmIChhcml0eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAgICAgICAgc3dpdGNoIChr
aW5kKSB7Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JDYWxsOgotICAgICAgICAgICAgICAgIGlm
IChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ2FsbFdpdGhBcml0
eUNoZWNrKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb2RlRm9yQ29uc3RydWN0OgotICAgICAgICAg
ICAgICAgIGlmIChNYWNyb0Fzc2VtYmxlckNvZGVQdHIgcmVzdWx0ID0gbV9qaXRDb2RlRm9yQ29u
c3RydWN0V2l0aEFyaXR5Q2hlY2spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIHJlc3VsdCA9Ci0gICAgICAgICAgICBnZW5lcmF0ZWRK
SVRDb2RlRm9yKGtpbmQpLT5hZGRyZXNzRm9yQ2FsbChhcml0eSk7Ci0gICAgICAgIGlmIChhcml0
eSA9PSBNdXN0Q2hlY2tBcml0eSkgewotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdDsg
dGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBKSVQncyB2aXJ0dWFsIGNhbGwgb3B0aW1pemF0aW9u
cy4KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBDb2RlRm9y
Q2FsbDoKLSAgICAgICAgICAgICAgICBtX2ppdENvZGVGb3JDYWxsV2l0aEFyaXR5Q2hlY2sgPSBy
ZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvZGVGb3JD
b25zdHJ1Y3Q6Ci0gICAgICAgICAgICAgICAgbV9qaXRDb2RlRm9yQ29uc3RydWN0V2l0aEFyaXR5
Q2hlY2sgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHRy
ZGlmZl90IG9mZnNldE9mSklUQ29kZVdpdGhBcml0eUNoZWNrRm9yKAotICAgICAgICBDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAg
ICAgICAgY2FzZSBDb2RlRm9yQ2FsbDoKLSAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VU
T0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNhbGxXaXRoQXJpdHlDaGVjayk7Ci0gICAg
ICAgIGNhc2UgQ29kZUZvckNvbnN0cnVjdDoKLSAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfT0ZG
U0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1faml0Q29kZUZvckNvbnN0cnVjdFdpdGhBcml0eUNoZWNr
KTsKLSAgICAgICAgfQotICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRP
Zk51bVBhcmFtZXRlcnNGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAg
ICAgICAgaWYgKGtpbmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gT0JKRUNU
X09GRlNFVE9GKEV4ZWN1dGFibGVCYXNlLCBtX251bVBhcmFtZXRlcnNGb3JDYWxsKTsKLSAgICAg
ICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBPQkpF
Q1RfT0ZGU0VUT0YoRXhlY3V0YWJsZUJhc2UsIG1fbnVtUGFyYW1ldGVyc0ZvckNvbnN0cnVjdCk7
Ci0gICAgfQotCi0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ2FsbCgpIGNvbnN0Ci0gICAgewotICAg
ICAgICByZXR1cm4gbV9udW1QYXJhbWV0ZXJzRm9yQ2FsbCA+PSAwOwotICAgIH0KLSAgICAgICAg
Ci0gICAgYm9vbCBoYXNKSVRDb2RlRm9yQ29uc3RydWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAg
IHJldHVybiBtX251bVBhcmFtZXRlcnNGb3JDb25zdHJ1Y3QgPj0gMDsKLSAgICB9Ci0gICAgICAg
IAotICAgIGJvb2wgaGFzSklUQ29kZUZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpIGNv
bnN0Ci0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAg
IHJldHVybiBoYXNKSVRDb2RlRm9yQ2FsbCgpOwotICAgICAgICBBU1NFUlQoa2luZCA9PSBDb2Rl
Rm9yQ29uc3RydWN0KTsKLSAgICAgICAgcmV0dXJuIGhhc0pJVENvZGVGb3JDb25zdHJ1Y3QoKTsK
LSAgICB9Ci0KLSAgICAvLyBJbnRyaW5zaWNzIGFyZSBvbmx5IGZvciBjYWxscywgY3VycmVudGx5
LgotICAgIEludHJpbnNpYyBpbnRyaW5zaWMoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpYzsg
fQotICAgICAgICAKLSAgICBJbnRyaW5zaWMgaW50cmluc2ljRm9yKENvZGVTcGVjaWFsaXphdGlv
bktpbmQga2luZCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpc0NhbGwoa2luZCkpCi0gICAg
ICAgICAgICByZXR1cm4gaW50cmluc2ljKCk7Ci0gICAgICAgIHJldHVybiBOb0ludHJpbnNpYzsK
LSAgICB9Ci0gICAgCi0gICAgdm9pZCBkdW1wKFByaW50U3RyZWFtJikgY29uc3Q7Ci0gICAgICAg
IAotcHJvdGVjdGVkOgotICAgIEludHJpbnNpYyBtX2ludHJpbnNpYzsKLSAgICBSZWZQdHI8SklU
Q29kZT4gbV9qaXRDb2RlRm9yQ2FsbDsKLSAgICBSZWZQdHI8SklUQ29kZT4gbV9qaXRDb2RlRm9y
Q29uc3RydWN0OwotICAgIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtX2ppdENvZGVGb3JDYWxsV2l0
aEFyaXR5Q2hlY2s7Ci0gICAgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1faml0Q29kZUZvckNvbnN0
cnVjdFdpdGhBcml0eUNoZWNrOwotfTsKLQotY2xhc3MgTmF0aXZlRXhlY3V0YWJsZSBmaW5hbCA6
IHB1YmxpYyBFeGVjdXRhYmxlQmFzZSB7Ci0gICAgZnJpZW5kIGNsYXNzIEpJVDsKLSAgICBmcmll
bmQgY2xhc3MgTExJbnRPZmZzZXRzRXh0cmFjdG9yOwotcHVibGljOgotICAgIHR5cGVkZWYgRXhl
Y3V0YWJsZUJhc2UgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxh
Z3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBz
dGF0aWMgTmF0aXZlRXhlY3V0YWJsZSogY3JlYXRlKFZNJiB2bSwgUGFzc1JlZlB0cjxKSVRDb2Rl
PiBjYWxsVGh1bmssIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBQYXNzUmVmUHRyPEpJVENvZGU+
IGNvbnN0cnVjdFRodW5rLCBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvciwgSW50cmluc2ljIGlu
dHJpbnNpYywgY29uc3QgU3RyaW5nJiBuYW1lKTsKLQotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3ko
SlNDZWxsKik7Ci0KLSAgICBDb2RlQmxvY2tIYXNoIGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9u
S2luZCkgY29uc3Q7Ci0KLSAgICBOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbigpIHsgcmV0dXJuIG1f
ZnVuY3Rpb247IH0KLSAgICBOYXRpdmVGdW5jdGlvbiBjb25zdHJ1Y3RvcigpIHsgcmV0dXJuIG1f
Y29uc3RydWN0b3I7IH0KLSAgICAgICAgCi0gICAgTmF0aXZlRnVuY3Rpb24gbmF0aXZlRnVuY3Rp
b25Gb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgaWYgKGtp
bmQgPT0gQ29kZUZvckNhbGwpCi0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKTsKLSAgICAg
ICAgQVNTRVJUKGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBjb25z
dHJ1Y3RvcigpOwotICAgIH0KLSAgICAgICAgCi0gICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRP
Zk5hdGl2ZUZ1bmN0aW9uRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0g
ICAgICAgIGlmIChraW5kID09IENvZGVGb3JDYWxsKQotICAgICAgICAgICAgcmV0dXJuIE9CSkVD
VF9PRkZTRVRPRihOYXRpdmVFeGVjdXRhYmxlLCBtX2Z1bmN0aW9uKTsKLSAgICAgICAgQVNTRVJU
KGtpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBPQkpFQ1RfT0ZGU0VU
T0YoTmF0aXZlRXhlY3V0YWJsZSwgbV9jb25zdHJ1Y3Rvcik7Ci0gICAgfQotCi0gICAgc3RhdGlj
IFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiwgSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVl
IHByb3RvKTsKLSAgICAgICAgCi0gICAgREVDTEFSRV9JTkZPOwotCi0gICAgY29uc3QgU3RyaW5n
JiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lk
IGZpbmlzaENyZWF0aW9uKFZNJiwgUGFzc1JlZlB0cjxKSVRDb2RlPiBjYWxsVGh1bmssIFBhc3NS
ZWZQdHI8SklUQ29kZT4gY29uc3RydWN0VGh1bmssIGNvbnN0IFN0cmluZyYgbmFtZSk7Ci0KLXBy
aXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotCi0gICAgTmF0aXZlRXhl
Y3V0YWJsZShWTSYsIE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uLCBOYXRpdmVGdW5jdGlvbiBjb25z
dHJ1Y3RvciwgSW50cmluc2ljKTsKLQotICAgIE5hdGl2ZUZ1bmN0aW9uIG1fZnVuY3Rpb247Ci0g
ICAgTmF0aXZlRnVuY3Rpb24gbV9jb25zdHJ1Y3RvcjsKLQotICAgIFN0cmluZyBtX25hbWU7Ci19
OwotCi1jbGFzcyBTY3JpcHRFeGVjdXRhYmxlIDogcHVibGljIEV4ZWN1dGFibGVCYXNlIHsKLXB1
YmxpYzoKLSAgICB0eXBlZGVmIEV4ZWN1dGFibGVCYXNlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3M7Ci0KLSAgICBz
dGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAKLSAgICBDb2RlQmxvY2tIYXNo
IGhhc2hGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCkgY29uc3Q7Ci0KLSAgICBjb25zdCBTb3Vy
Y2VDb2RlJiBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZTsgfQotICAgIGludHB0cl90
IHNvdXJjZUlEKCkgY29uc3QgeyByZXR1cm4gbV9zb3VyY2UucHJvdmlkZXJJRCgpOyB9Ci0gICAg
Y29uc3QgU3RyaW5nJiBzb3VyY2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3NvdXJjZS5wcm92aWRl
cigpLT51cmwoKTsgfQotICAgIGludCBmaXJzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0
TGluZTsgfQotICAgIHZvaWQgc2V0T3ZlcnJpZGVMaW5lTnVtYmVyKGludCBvdmVycmlkZUxpbmVO
dW1iZXIpIHsgbV9vdmVycmlkZUxpbmVOdW1iZXIgPSBvdmVycmlkZUxpbmVOdW1iZXI7IH0KLSAg
ICBib29sIGhhc092ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGVM
aW5lTnVtYmVyICE9IC0xOyB9Ci0gICAgaW50IG92ZXJyaWRlTGluZU51bWJlcigpIGNvbnN0IHsg
cmV0dXJuIG1fb3ZlcnJpZGVMaW5lTnVtYmVyOyB9Ci0gICAgaW50IGxhc3RMaW5lKCkgY29uc3Qg
eyByZXR1cm4gbV9sYXN0TGluZTsgfQotICAgIHVuc2lnbmVkIHN0YXJ0Q29sdW1uKCkgY29uc3Qg
eyByZXR1cm4gbV9zdGFydENvbHVtbjsgfQotICAgIHVuc2lnbmVkIGVuZENvbHVtbigpIGNvbnN0
IHsgcmV0dXJuIG1fZW5kQ29sdW1uOyB9Ci0gICAgdW5zaWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0
T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBlUHJvZmlsaW5nU3RhcnRPZmZzZXQ7IH0KLSAg
ICB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV90eXBl
UHJvZmlsaW5nRW5kT2Zmc2V0OyB9Ci0KLSAgICBib29sIHVzZXNFdmFsKCkgY29uc3QgeyByZXR1
cm4gbV9mZWF0dXJlcyAmIEV2YWxGZWF0dXJlOyB9Ci0gICAgYm9vbCB1c2VzQXJndW1lbnRzKCkg
Y29uc3QgeyByZXR1cm4gbV9mZWF0dXJlcyAmIEFyZ3VtZW50c0ZlYXR1cmU7IH0KLSAgICBib29s
IGlzQXJyb3dGdW5jdGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2lzQXJyb3dGdW5jdGlv
bkNvbnRleHQ7IH0KLSAgICBib29sIGlzU3RyaWN0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmVh
dHVyZXMgJiBTdHJpY3RNb2RlRmVhdHVyZTsgfQotICAgIERlcml2ZWRDb250ZXh0VHlwZSBkZXJp
dmVkQ29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkQ29udGV4
dFR5cGU+KG1fZGVyaXZlZENvbnRleHRUeXBlKTsgfQotICAgIEV2YWxDb250ZXh0VHlwZSBldmFs
Q29udGV4dFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxFdmFsQ29udGV4dFR5cGU+
KG1fZXZhbENvbnRleHRUeXBlKTsgfQotCi0gICAgRUNNQU1vZGUgZWNtYU1vZGUoKSBjb25zdCB7
IHJldHVybiBpc1N0cmljdE1vZGUoKSA/IFN0cmljdE1vZGUgOiBOb3RTdHJpY3RNb2RlOyB9Ci0g
ICAgICAgIAotICAgIHZvaWQgc2V0TmV2ZXJJbmxpbmUoYm9vbCB2YWx1ZSkgeyBtX25ldmVySW5s
aW5lID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldE5ldmVyT3B0aW1pemUoYm9vbCB2YWx1ZSkgeyBt
X25ldmVyT3B0aW1pemUgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0TmV2ZXJGVExPcHRpbWl6ZShi
b29sIHZhbHVlKSB7IG1fbmV2ZXJGVExPcHRpbWl6ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXRE
aWRUcnlUb0VudGVySW5Mb29wKGJvb2wgdmFsdWUpIHsgbV9kaWRUcnlUb0VudGVySW5Mb29wID0g
dmFsdWU7IH0KLSAgICB2b2lkIHNldENhblVzZU9TUkV4aXRGdXp6aW5nKGJvb2wgdmFsdWUpIHsg
bV9jYW5Vc2VPU1JFeGl0RnV6emluZyA9IHZhbHVlOyB9Ci0gICAgYm9vbCBuZXZlcklubGluZSgp
IGNvbnN0IHsgcmV0dXJuIG1fbmV2ZXJJbmxpbmU7IH0KLSAgICBib29sIG5ldmVyT3B0aW1pemUo
KSBjb25zdCB7IHJldHVybiBtX25ldmVyT3B0aW1pemU7IH0KLSAgICBib29sIG5ldmVyRlRMT3B0
aW1pemUoKSBjb25zdCB7IHJldHVybiBtX25ldmVyRlRMT3B0aW1pemU7IH0KLSAgICBib29sIGRp
ZFRyeVRvRW50ZXJJbkxvb3AoKSBjb25zdCB7IHJldHVybiBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7
IH0KLSAgICBib29sIGlzSW5saW5pbmdDYW5kaWRhdGUoKSBjb25zdCB7IHJldHVybiAhbmV2ZXJJ
bmxpbmUoKTsgfQotICAgIGJvb2wgaXNPa1RvT3B0aW1pemUoKSBjb25zdCB7IHJldHVybiAhbmV2
ZXJPcHRpbWl6ZSgpOyB9Ci0gICAgYm9vbCBjYW5Vc2VPU1JFeGl0RnV6emluZygpIGNvbnN0IHsg
cmV0dXJuIG1fY2FuVXNlT1NSRXhpdEZ1enppbmc7IH0KLSAgICAKLSAgICBib29sKiBhZGRyZXNz
T2ZEaWRUcnlUb0VudGVySW5Mb29wKCkgeyByZXR1cm4gJm1fZGlkVHJ5VG9FbnRlckluTG9vcDsg
fQotCi0gICAgQ29kZUZlYXR1cmVzIGZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gbV9mZWF0dXJl
czsgfQotICAgICAgICAKLSAgICBERUNMQVJFX0VYUE9SVF9JTkZPOwotCi0gICAgdm9pZCByZWNv
cmRQYXJzZShDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGJvb2wgaGFzQ2FwdHVyZWRWYXJpYWJsZXMs
IGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSwgdW5zaWduZWQgc3RhcnRDb2x1bW4sIHVuc2ln
bmVkIGVuZENvbHVtbikKLSAgICB7Ci0gICAgICAgIG1fZmVhdHVyZXMgPSBmZWF0dXJlczsKLSAg
ICAgICAgbV9oYXNDYXB0dXJlZFZhcmlhYmxlcyA9IGhhc0NhcHR1cmVkVmFyaWFibGVzOwotICAg
ICAgICBtX2ZpcnN0TGluZSA9IGZpcnN0TGluZTsKLSAgICAgICAgbV9sYXN0TGluZSA9IGxhc3RM
aW5lOwotICAgICAgICBBU1NFUlQoc3RhcnRDb2x1bW4gIT0gVUlOVF9NQVgpOwotICAgICAgICBt
X3N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47Ci0gICAgICAgIEFTU0VSVChlbmRDb2x1bW4gIT0g
VUlOVF9NQVgpOwotICAgICAgICBtX2VuZENvbHVtbiA9IGVuZENvbHVtbjsKLSAgICB9Ci0KLSAg
ICB2b2lkIGluc3RhbGxDb2RlKENvZGVCbG9jayopOwotICAgIHZvaWQgaW5zdGFsbENvZGUoVk0m
LCBDb2RlQmxvY2sqLCBDb2RlVHlwZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgQ29k
ZUJsb2NrKiBuZXdDb2RlQmxvY2tGb3IoQ29kZVNwZWNpYWxpemF0aW9uS2luZCwgSlNGdW5jdGlv
biosIEpTU2NvcGUqLCBKU09iamVjdComIGV4Y2VwdGlvbik7Ci0gICAgQ29kZUJsb2NrKiBuZXdS
ZXBsYWNlbWVudENvZGVCbG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKLQotICAgIC8v
IFRoaXMgZnVuY3Rpb24gaGFzIGFuIGludGVyZXN0aW5nIEdDIHN0b3J5LiBDYWxsZXJzIG9mIHRo
aXMgZnVuY3Rpb24gYXJlIGFza2luZyB1cyB0byBjcmVhdGUgYSBDb2RlQmxvY2sKLSAgICAvLyB0
aGF0IGlzIG5vdCBqZXR0aXNvbmVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIENhbGxl
cnMgYXJlIGVzc2VudGlhbGx5IGFza2luZyBmb3IgYSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgLy8g
dG8gdGhlIENvZGVCbG9jay4gQmVjYXVzZSB0aGUgRXhlY3V0YWJsZSBtYXkgYmUgYWxsb2NhdGlu
ZyB0aGUgQ29kZUJsb2NrLCB3ZSByZXF1aXJlIGNhbGxlcnMgdG8gcGFzcyBpbgotICAgIC8vIHRo
ZWlyIENvZGVCbG9jayomIHJlZmVyZW5jZSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgQ29kZUJsb2Nr
IHRvIGJlIGpldHRpc29uZWQgaWYgRXhlY3V0YWJsZSBpcyB0aGUgb25seSB0aGluZwotICAgIC8v
IHRvIHBvaW50IHRvIGl0LiBUaGlzIGZvcmNlcyBjYWxsZXJzIHRvIGhhdmUgYSBDb2RlQmxvY2sq
IGluIGEgcmVnaXN0ZXIgb3Igb24gdGhlIHN0YWNrIHRoYXQgd2lsbCBiZSBtYXJrZWQKLSAgICAv
LyBieSBjb25zZXJ2YXRpdmUgR0MgaWYgYSBHQyBoYXBwZW5zIGFmdGVyIHdlIGNyZWF0ZSB0aGUg
Q29kZUJsb2NrLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeGVjdXRhYmxlVHlwZT4KLSAgICBK
U09iamVjdCogcHJlcGFyZUZvckV4ZWN1dGlvbihWTSYsIEpTRnVuY3Rpb24qLCBKU1Njb3BlKiwg
Q29kZVNwZWNpYWxpemF0aW9uS2luZCwgQ29kZUJsb2NrKiYgcmVzdWx0Q29kZUJsb2NrKTsKLQot
ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yPiB2b2lkIGZvckVhY2hDb2RlQmxvY2soRnVu
Y3RvciYmKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0g
ICAgSlNPYmplY3QqIHByZXBhcmVGb3JFeGVjdXRpb25JbXBsKFZNJiwgSlNGdW5jdGlvbiosIEpT
U2NvcGUqLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kLCBDb2RlQmxvY2sqJik7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBTY3JpcHRFeGVjdXRhYmxlKFN0cnVjdHVyZSosIFZNJiwgY29uc3QgU291cmNlQ29k
ZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwgYm9vbCBpc0lu
QXJyb3dGdW5jdGlvbkNvbnRleHQsIEV2YWxDb250ZXh0VHlwZSwgSW50cmluc2ljKTsKLQotICAg
IHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mIHZtKQotICAgIHsKLSAgICAgICAgQmFzZTo6ZmluaXNo
Q3JlYXRpb24odm0pOwotICAgICAgICB2bS5oZWFwLmFkZEV4ZWN1dGFibGUodGhpcyk7IC8vIEJh
bGFuY2VkIGJ5IEhlYXA6OmRlbGV0ZVVubWFya2VkQ29tcGlsZWRDb2RlKCkuCi0KLSNpZiBFTkFC
TEUoQ09ERUJMT0NLX1NBTVBMSU5HKQotICAgICAgICBpZiAoU2FtcGxpbmdUb29sKiBzYW1wbGVy
ID0gdm0uaW50ZXJwcmV0ZXItPnNhbXBsZXIoKSkKLSAgICAgICAgICAgIHNhbXBsZXItPm5vdGlm
eU9mU2NvcGUodm0sIHRoaXMpOwotI2VuZGlmCi0gICAgfQotCi0gICAgQ29kZUZlYXR1cmVzIG1f
ZmVhdHVyZXM7Ci0gICAgYm9vbCBtX2RpZFRyeVRvRW50ZXJJbkxvb3A7Ci0gICAgYm9vbCBtX2hh
c0NhcHR1cmVkVmFyaWFibGVzIDogMTsKLSAgICBib29sIG1fbmV2ZXJJbmxpbmUgOiAxOwotICAg
IGJvb2wgbV9uZXZlck9wdGltaXplIDogMTsKLSAgICBib29sIG1fbmV2ZXJGVExPcHRpbWl6ZSA6
IDE7Ci0gICAgYm9vbCBtX2lzQXJyb3dGdW5jdGlvbkNvbnRleHQgOiAxOwotICAgIGJvb2wgbV9j
YW5Vc2VPU1JFeGl0RnV6emluZyA6IDE7Ci0gICAgdW5zaWduZWQgbV9kZXJpdmVkQ29udGV4dFR5
cGUgOiAyOyAvLyBEZXJpdmVkQ29udGV4dFR5cGUKLSAgICB1bnNpZ25lZCBtX2V2YWxDb250ZXh0
VHlwZSA6IDI7IC8vIEV2YWxDb250ZXh0VHlwZQotCi0gICAgaW50IG1fb3ZlcnJpZGVMaW5lTnVt
YmVyOwotICAgIGludCBtX2ZpcnN0TGluZTsKLSAgICBpbnQgbV9sYXN0TGluZTsKLSAgICB1bnNp
Z25lZCBtX3N0YXJ0Q29sdW1uOwotICAgIHVuc2lnbmVkIG1fZW5kQ29sdW1uOwotICAgIHVuc2ln
bmVkIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OwotICAgIHVuc2lnbmVkIG1fdHlwZVByb2Zp
bGluZ0VuZE9mZnNldDsKLSAgICBTb3VyY2VDb2RlIG1fc291cmNlOwotfTsKLQotY2xhc3MgRXZh
bEV4ZWN1dGFibGUgZmluYWwgOiBwdWJsaWMgU2NyaXB0RXhlY3V0YWJsZSB7Ci0gICAgZnJpZW5k
IGNsYXNzIExMSW50T2Zmc2V0c0V4dHJhY3RvcjsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFNjcmlw
dEV4ZWN1dGFibGUgQmFzZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxh
Z3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7Ci0KLSAgICBz
dGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotCi0gICAgRXZhbENvZGVCbG9jayogY29kZUJs
b2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2V2YWxDb2RlQmxvY2suZ2V0KCk7Ci0gICAg
fQotCi0gICAgc3RhdGljIEV2YWxFeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3Qg
U291cmNlQ29kZSYsIGJvb2wgaXNJblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwg
Ym9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUsIGNvbnN0IFZhcmlh
YmxlRW52aXJvbm1lbnQqKTsKLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklU
Q29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsK
LSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBK
U0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBl
SW5mbyhFdmFsRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKLSAgICB9
Ci0gICAgICAgIAotICAgIERFQ0xBUkVfSU5GTzsKLQotICAgIEV4ZWN1dGFibGVJbmZvIGV4ZWN1
dGFibGVJbmZvKCkgY29uc3QgeyByZXR1cm4gRXhlY3V0YWJsZUluZm8odXNlc0V2YWwoKSwgaXNT
dHJpY3RNb2RlKCksIGZhbHNlLCBmYWxzZSwgQ29uc3RydWN0b3JLaW5kOjpOb25lLCBKU1BhcnNl
clNjcmlwdE1vZGU6OkNsYXNzaWMsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQYXJz
ZU1vZGU6OlByb2dyYW1Nb2RlLCBkZXJpdmVkQ29udGV4dFR5cGUoKSwgaXNBcnJvd0Z1bmN0aW9u
Q29udGV4dCgpLCBmYWxzZSwgZXZhbENvbnRleHRUeXBlKCkpOyB9Ci0KLSAgICB1bnNpZ25lZCBu
dW1WYXJpYWJsZXMoKSB7IHJldHVybiBtX3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtVmFyaWFi
bGVzKCk7IH0KLSAgICB1bnNpZ25lZCBudW1iZXJPZkZ1bmN0aW9uRGVjbHMoKSB7IHJldHVybiBt
X3VubGlua2VkRXZhbENvZGVCbG9jay0+bnVtYmVyT2ZGdW5jdGlvbkRlY2xzKCk7IH0KLQotcHJp
dmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRXhlY3V0YWJsZUJhc2U7Ci0gICAgZnJpZW5kIGNsYXNz
IFNjcmlwdEV4ZWN1dGFibGU7Ci0KLSAgICBFdmFsRXhlY3V0YWJsZShFeGVjU3RhdGUqLCBjb25z
dCBTb3VyY2VDb2RlJiwgYm9vbCBpblN0cmljdENvbnRleHQsIERlcml2ZWRDb250ZXh0VHlwZSwg
Ym9vbCBpc0Fycm93RnVuY3Rpb25Db250ZXh0LCBFdmFsQ29udGV4dFR5cGUpOwotCi0gICAgc3Rh
dGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgV3Jp
dGVCYXJyaWVyPEV2YWxDb2RlQmxvY2s+IG1fZXZhbENvZGVCbG9jazsKLSAgICBXcml0ZUJhcnJp
ZXI8VW5saW5rZWRFdmFsQ29kZUJsb2NrPiBtX3VubGlua2VkRXZhbENvZGVCbG9jazsKLX07Ci0K
LWNsYXNzIFByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIFNjcmlwdEV4ZWN1dGFibGUg
ewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAg
dHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk
IFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9y
dGFsOwotCi0gICAgc3RhdGljIFByb2dyYW1FeGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiBl
eGVjLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UpCi0gICAgewotICAgICAgICBQcm9ncmFtRXhl
Y3V0YWJsZSogZXhlY3V0YWJsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFByb2dyYW1F
eGVjdXRhYmxlPigqZXhlYy0+aGVhcCgpKSkgUHJvZ3JhbUV4ZWN1dGFibGUoZXhlYywgc291cmNl
KTsKLSAgICAgICAgZXhlY3V0YWJsZS0+ZmluaXNoQ3JlYXRpb24oZXhlYy0+dm0oKSk7Ci0gICAg
ICAgIHJldHVybiBleGVjdXRhYmxlOwotICAgIH0KLQotCi0gICAgSlNPYmplY3QqIGluaXRpYWxp
emVHbG9iYWxQcm9wZXJ0aWVzKFZNJiwgQ2FsbEZyYW1lKiwgSlNTY29wZSopOwotCi0gICAgc3Rh
dGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAgIFByb2dyYW1Db2RlQmxvY2sqIGNvZGVC
bG9jaygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wcm9ncmFtQ29kZUJsb2NrLmdldCgpOwot
ICAgIH0KLQotICAgIEpTT2JqZWN0KiBjaGVja1N5bnRheChFeGVjU3RhdGUqKTsKLQotICAgIFBh
c3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVkSklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1
cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHN0YXRp
YyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9i
YWxPYmplY3QsIEpTVmFsdWUgcHJvdG8pCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJl
OjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG8sIFR5cGVJbmZvKFByb2dyYW1FeGVjdXRh
YmxlVHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwotICAgIH0KLSAgICAgICAgCi0gICAg
REVDTEFSRV9JTkZPOwotCi0gICAgRXhlY3V0YWJsZUluZm8gZXhlY3V0YWJsZUluZm8oKSBjb25z
dCB7IHJldHVybiBFeGVjdXRhYmxlSW5mbyh1c2VzRXZhbCgpLCBpc1N0cmljdE1vZGUoKSwgZmFs
c2UsIGZhbHNlLCBDb25zdHJ1Y3RvcktpbmQ6Ok5vbmUsIEpTUGFyc2VyU2NyaXB0TW9kZTo6Q2xh
c3NpYywgU3VwZXJCaW5kaW5nOjpOb3ROZWVkZWQsIFNvdXJjZVBhcnNlTW9kZTo6UHJvZ3JhbU1v
ZGUsIGRlcml2ZWRDb250ZXh0VHlwZSgpLCBpc0Fycm93RnVuY3Rpb25Db250ZXh0KCksIGZhbHNl
LCBFdmFsQ29udGV4dFR5cGU6Ok5vbmUpOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNz
IEV4ZWN1dGFibGVCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTY3JpcHRFeGVjdXRhYmxlOwotCi0g
ICAgUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0g
ICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0g
ICAgV3JpdGVCYXJyaWVyPFVubGlua2VkUHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZFByb2dy
YW1Db2RlQmxvY2s7Ci0gICAgV3JpdGVCYXJyaWVyPFByb2dyYW1Db2RlQmxvY2s+IG1fcHJvZ3Jh
bUNvZGVCbG9jazsKLX07Ci0KLWNsYXNzIE1vZHVsZVByb2dyYW1FeGVjdXRhYmxlIGZpbmFsIDog
cHVibGljIFNjcmlwdEV4ZWN1dGFibGUgewotICAgIGZyaWVuZCBjbGFzcyBMTEludE9mZnNldHNF
eHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRFeGVjdXRhYmxlIEJhc2U7Ci0g
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJl
RmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3RhdGljIE1vZHVsZVByb2dyYW1F
eGVjdXRhYmxlKiBjcmVhdGUoRXhlY1N0YXRlKiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAg
c3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKLQotICAgIE1vZHVsZVByb2dyYW1Db2RlQmxv
Y2sqIGNvZGVCbG9jaygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9tb2R1bGVQcm9ncmFtQ29k
ZUJsb2NrLmdldCgpOwotICAgIH0KLQotICAgIFBhc3NSZWZQdHI8SklUQ29kZT4gZ2VuZXJhdGVk
SklUQ29kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkSklUQ29kZUZvckNhbGwo
KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZt
LCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBU
eXBlSW5mbyhNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZVR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5m
bygpKTsKLSAgICB9Ci0KLSAgICBERUNMQVJFX0lORk87Ci0KLSAgICBFeGVjdXRhYmxlSW5mbyBl
eGVjdXRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGVJbmZvKHVzZXNFdmFsKCks
IGlzU3RyaWN0TW9kZSgpLCBmYWxzZSwgZmFsc2UsIENvbnN0cnVjdG9yS2luZDo6Tm9uZSwgSlNQ
YXJzZXJTY3JpcHRNb2RlOjpNb2R1bGUsIFN1cGVyQmluZGluZzo6Tm90TmVlZGVkLCBTb3VyY2VQ
YXJzZU1vZGU6Ok1vZHVsZUV2YWx1YXRlTW9kZSwgZGVyaXZlZENvbnRleHRUeXBlKCksIGlzQXJy
b3dGdW5jdGlvbkNvbnRleHQoKSwgZmFsc2UsIEV2YWxDb250ZXh0VHlwZTo6Tm9uZSk7IH0KLQot
ICAgIFVubGlua2VkTW9kdWxlUHJvZ3JhbUNvZGVCbG9jayogdW5saW5rZWRNb2R1bGVQcm9ncmFt
Q29kZUJsb2NrKCkgeyByZXR1cm4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2suZ2V0
KCk7IH0KLQotICAgIFN5bWJvbFRhYmxlKiBtb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlKCkg
eyByZXR1cm4gbV9tb2R1bGVFbnZpcm9ubWVudFN5bWJvbFRhYmxlLmdldCgpOyB9Ci0KLXByaXZh
dGU6Ci0gICAgZnJpZW5kIGNsYXNzIEV4ZWN1dGFibGVCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBT
Y3JpcHRFeGVjdXRhYmxlOwotCi0gICAgTW9kdWxlUHJvZ3JhbUV4ZWN1dGFibGUoRXhlY1N0YXRl
KiwgY29uc3QgU291cmNlQ29kZSYpOwotCi0gICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihK
U0NlbGwqLCBTbG90VmlzaXRvciYpOwotCi0gICAgV3JpdGVCYXJyaWVyPFVubGlua2VkTW9kdWxl
UHJvZ3JhbUNvZGVCbG9jaz4gbV91bmxpbmtlZE1vZHVsZVByb2dyYW1Db2RlQmxvY2s7Ci0gICAg
V3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxlPiBtX21vZHVsZUVudmlyb25tZW50U3ltYm9sVGFibGU7
Ci0gICAgV3JpdGVCYXJyaWVyPE1vZHVsZVByb2dyYW1Db2RlQmxvY2s+IG1fbW9kdWxlUHJvZ3Jh
bUNvZGVCbG9jazsKLX07Ci0KLWNsYXNzIEZ1bmN0aW9uRXhlY3V0YWJsZSBmaW5hbCA6IHB1Ymxp
YyBTY3JpcHRFeGVjdXRhYmxlIHsKLSAgICBmcmllbmQgY2xhc3MgSklUOwotICAgIGZyaWVuZCBj
bGFzcyBMTEludE9mZnNldHNFeHRyYWN0b3I7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBTY3JpcHRF
eGVjdXRhYmxlIEJhc2U7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdz
ID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1cmVJc0ltbW9ydGFsOwotCi0gICAgc3Rh
dGljIEZ1bmN0aW9uRXhlY3V0YWJsZSogY3JlYXRlKAotICAgICAgICBWTSYgdm0sIGNvbnN0IFNv
dXJjZUNvZGUmIHNvdXJjZSwgVW5saW5rZWRGdW5jdGlvbkV4ZWN1dGFibGUqIHVubGlua2VkRXhl
Y3V0YWJsZSwgCi0gICAgICAgIHVuc2lnbmVkIGZpcnN0TGluZSwgdW5zaWduZWQgbGFzdExpbmUs
IHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNpZ25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyBpbnRy
aW5zaWMpCi0gICAgewotICAgICAgICBGdW5jdGlvbkV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSBu
ZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxGdW5jdGlvbkV4ZWN1dGFibGU+KHZtLmhlYXApKSBG
dW5jdGlvbkV4ZWN1dGFibGUodm0sIHNvdXJjZSwgdW5saW5rZWRFeGVjdXRhYmxlLCBmaXJzdExp
bmUsIGxhc3RMaW5lLCBzdGFydENvbHVtbiwgZW5kQ29sdW1uLCBpbnRyaW5zaWMpOwotICAgICAg
ICBleGVjdXRhYmxlLT5maW5pc2hDcmVhdGlvbih2bSk7Ci0gICAgICAgIHJldHVybiBleGVjdXRh
YmxlOwotICAgIH0KLSAgICBzdGF0aWMgRnVuY3Rpb25FeGVjdXRhYmxlKiBmcm9tR2xvYmFsQ29k
ZSgKLSAgICAgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSwgRXhlY1N0YXRlJiwgY29uc3QgU291
cmNlQ29kZSYsIAotICAgICAgICBKU09iamVjdComIGV4Y2VwdGlvbiwgaW50IG92ZXJyaWRlTGlu
ZU51bWJlcik7Ci0KLSAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwotICAgICAgICAK
LSAgICBVbmxpbmtlZEZ1bmN0aW9uRXhlY3V0YWJsZSogdW5saW5rZWRFeGVjdXRhYmxlKCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS5nZXQoKTsKLSAg
ICB9Ci0KLSAgICAvLyBSZXR1cm5zIGVpdGhlciBjYWxsIG9yIGNvbnN0cnVjdCBieXRlY29kZS4g
VGhpcyBjYW4gYmUgYXBwcm9wcmlhdGUKLSAgICAvLyBmb3IgYW5zd2VyaW5nIHF1ZXN0aW9ucyB0
aGF0IHRoYXQgZG9uJ3QgdmFyeSBiZXR3ZWVuIGNhbGwgYW5kIGNvbnN0cnVjdCAtLQotICAgIC8v
IGZvciBleGFtcGxlLCBhcmd1bWVudHNSZWdpc3RlcigpLgotICAgIEZ1bmN0aW9uQ29kZUJsb2Nr
KiBlaXRoZXJDb2RlQmxvY2soKQotICAgIHsKLSAgICAgICAgaWYgKG1fY29kZUJsb2NrRm9yQ2Fs
bCkKLSAgICAgICAgICAgIHJldHVybiBtX2NvZGVCbG9ja0ZvckNhbGwuZ2V0KCk7Ci0gICAgICAg
IHJldHVybiBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5nZXQoKTsKLSAgICB9Ci0gICAgICAgIAot
ICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDYWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVy
biAhIW1fY29kZUJsb2NrRm9yQ2FsbDsKLSAgICB9Ci0KLSAgICBGdW5jdGlvbkNvZGVCbG9jayog
Y29kZUJsb2NrRm9yQ2FsbCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2tGb3JD
YWxsLmdldCgpOwotICAgIH0KLQotICAgIGJvb2wgaXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSBj
b25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgp
OwotICAgIH0KLQotICAgIEZ1bmN0aW9uQ29kZUJsb2NrKiBjb2RlQmxvY2tGb3JDb25zdHJ1Y3Qo
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrRm9yQ29uc3RydWN0LmdldCgpOwot
ICAgIH0KLSAgICAgICAgCi0gICAgYm9vbCBpc0dlbmVyYXRlZEZvcihDb2RlU3BlY2lhbGl6YXRp
b25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAg
ICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNhbGwoKTsKLSAgICAgICAgQVNTRVJUKGtp
bmQgPT0gQ29kZUZvckNvbnN0cnVjdCk7Ci0gICAgICAgIHJldHVybiBpc0dlbmVyYXRlZEZvckNv
bnN0cnVjdCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgRnVuY3Rpb25Db2RlQmxvY2sqIGNvZGVC
bG9ja0ZvcihDb2RlU3BlY2lhbGl6YXRpb25LaW5kIGtpbmQpCi0gICAgewotICAgICAgICBpZiAo
a2luZCA9PSBDb2RlRm9yQ2FsbCkKLSAgICAgICAgICAgIHJldHVybiBjb2RlQmxvY2tGb3JDYWxs
KCk7Ci0gICAgICAgIEFTU0VSVChraW5kID09IENvZGVGb3JDb25zdHJ1Y3QpOwotICAgICAgICBy
ZXR1cm4gY29kZUJsb2NrRm9yQ29uc3RydWN0KCk7Ci0gICAgfQotCi0gICAgRnVuY3Rpb25Db2Rl
QmxvY2sqIGJhc2VsaW5lQ29kZUJsb2NrRm9yKENvZGVTcGVjaWFsaXphdGlvbktpbmQpOwotICAg
ICAgICAKLSAgICBGdW5jdGlvbkNvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2tGb3IoQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBraW5kKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29k
ZUJsb2NrRm9yKGtpbmQpOwotICAgIH0KLQotICAgIFJlZlB0cjxUeXBlU2V0PiByZXR1cm5TdGF0
ZW1lbnRUeXBlU2V0KCkgCi0gICAgewotICAgICAgICBpZiAoIW1fcmV0dXJuU3RhdGVtZW50VHlw
ZVNldCkKLSAgICAgICAgICAgIG1fcmV0dXJuU3RhdGVtZW50VHlwZVNldCA9IFR5cGVTZXQ6OmNy
ZWF0ZSgpOwotCi0gICAgICAgIHJldHVybiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAg
fQotICAgICAgICAKLSAgICBGdW5jdGlvbk1vZGUgZnVuY3Rpb25Nb2RlKCkgeyByZXR1cm4gbV91
bmxpbmtlZEV4ZWN1dGFibGUtPmZ1bmN0aW9uTW9kZSgpOyB9Ci0gICAgYm9vbCBpc0J1aWx0aW5G
dW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pc0J1aWx0aW5G
dW5jdGlvbigpOyB9Ci0gICAgQ29uc3RydWN0QWJpbGl0eSBjb25zdHJ1Y3RBYmlsaXR5KCkgY29u
c3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNvbnN0cnVjdEFiaWxpdHkoKTsgfQot
ICAgIGJvb2wgaXNDbGFzcygpIGNvbnN0IHsgcmV0dXJuICFjbGFzc1NvdXJjZSgpLmlzTnVsbCgp
OyB9Ci0gICAgYm9vbCBpc0Fycm93RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUo
KSA9PSBTb3VyY2VQYXJzZU1vZGU6OkFycm93RnVuY3Rpb25Nb2RlOyB9Ci0gICAgYm9vbCBpc0dl
dHRlcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6R2V0
dGVyTW9kZTsgfQotICAgIGJvb2wgaXNTZXR0ZXIoKSBjb25zdCB7IHJldHVybiBwYXJzZU1vZGUo
KSA9PSBTb3VyY2VQYXJzZU1vZGU6OlNldHRlck1vZGU7IH0KLSAgICBib29sIGlzR2VuZXJhdG9y
KCkgY29uc3QgeyByZXR1cm4gU291cmNlUGFyc2VNb2RlU2V0KFNvdXJjZVBhcnNlTW9kZTo6R2Vu
ZXJhdG9yQm9keU1vZGUsIFNvdXJjZVBhcnNlTW9kZTo6R2VuZXJhdG9yV3JhcHBlckZ1bmN0aW9u
TW9kZSkuY29udGFpbnMocGFyc2VNb2RlKCkpOyB9Ci0gICAgYm9vbCBpc01ldGhvZCgpIGNvbnN0
IHsgcmV0dXJuIHBhcnNlTW9kZSgpID09IFNvdXJjZVBhcnNlTW9kZTo6TWV0aG9kTW9kZTsgfQot
ICAgIGJvb2wgaGFzQ2FsbGVyQW5kQXJndW1lbnRzUHJvcGVydGllcygpIGNvbnN0Ci0gICAgewot
ICAgICAgICAvLyBQZXIgaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yYmlk
ZGVuLWV4dGVuc2lvbnMsIG9ubHkgc2xvcHB5LW1vZGUgbm9uLWJ1aWx0aW4gZnVuY3Rpb25zIGlu
IG9sZC1zdHlsZSAocHJlLUVTNikgc3ludGFjdGljIGZvcm1zIGNhbiBjb250YWluCi0gICAgICAg
IC8vICJjYWxsZXIiIGFuZCAiYXJndW1lbnRzIi4KLSAgICAgICAgcmV0dXJuICFpc1N0cmljdE1v
ZGUoKSAmJiBwYXJzZU1vZGUoKSA9PSBTb3VyY2VQYXJzZU1vZGU6Ok5vcm1hbEZ1bmN0aW9uTW9k
ZSAmJiAhaXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsKLSAgICB9Ci0gICAgYm9vbCBoYXNQ
cm90b3R5cGVQcm9wZXJ0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gU291cmNlUGFy
c2VNb2RlU2V0KAotICAgICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpOb3JtYWxGdW5jdGlvbk1v
ZGUsCi0gICAgICAgICAgICBTb3VyY2VQYXJzZU1vZGU6OkdlbmVyYXRvckJvZHlNb2RlLAotICAg
ICAgICAgICAgU291cmNlUGFyc2VNb2RlOjpHZW5lcmF0b3JXcmFwcGVyRnVuY3Rpb25Nb2RlCi0g
ICAgICAgICkuY29udGFpbnMocGFyc2VNb2RlKCkpIHx8IGlzQ2xhc3MoKTsKLSAgICB9Ci0gICAg
RGVyaXZlZENvbnRleHRUeXBlIGRlcml2ZWRDb250ZXh0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1f
dW5saW5rZWRFeGVjdXRhYmxlLT5kZXJpdmVkQ29udGV4dFR5cGUoKTsgfQotICAgIGJvb2wgaXND
bGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0
YWJsZS0+aXNDbGFzc0NvbnN0cnVjdG9yRnVuY3Rpb24oKTsgfQotICAgIGNvbnN0IElkZW50aWZp
ZXImIG5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJsZS0+bmFtZSgpOyB9Ci0gICAg
Y29uc3QgSWRlbnRpZmllciYgZWNtYU5hbWUoKSB7IHJldHVybiBtX3VubGlua2VkRXhlY3V0YWJs
ZS0+ZWNtYU5hbWUoKTsgfQotICAgIGNvbnN0IElkZW50aWZpZXImIGluZmVycmVkTmFtZSgpIHsg
cmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5pbmZlcnJlZE5hbWUoKTsgfQotICAgIHVuc2ln
bmVkIHBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUt
PnBhcmFtZXRlckNvdW50KCk7IH0gLy8gRXhjbHVkaW5nICd0aGlzJyEKLSAgICB1bnNpZ25lZCBm
dW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5mdW5j
dGlvbkxlbmd0aCgpOyB9Ci0gICAgU291cmNlUGFyc2VNb2RlIHBhcnNlTW9kZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdW5saW5rZWRFeGVjdXRhYmxlLT5wYXJzZU1vZGUoKTsgfQotICAgIEpTUGFyc2Vy
U2NyaXB0TW9kZSBzY3JpcHRNb2RlKCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFi
bGUtPnNjcmlwdE1vZGUoKTsgfQotICAgIGNvbnN0IFNvdXJjZUNvZGUmIGNsYXNzU291cmNlKCkg
Y29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNsYXNzU291cmNlKCk7IH0KLQot
ICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKLSAg
ICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mIHZtLCBKU0dsb2JhbE9iamVj
dCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIHByb3RvKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN0
cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvLCBUeXBlSW5mbyhGdW5jdGlv
bkV4ZWN1dGFibGVUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7Ci0gICAgfQotCi0gICAg
dW5zaWduZWQgcGFyYW1ldGVyc1N0YXJ0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0
ZXJzU3RhcnRPZmZzZXQ7IH0KLQotICAgIHZvaWQgb3ZlcnJpZGVQYXJhbWV0ZXJBbmRUeXBlUHJv
ZmlsaW5nU3RhcnRFbmRPZmZzZXRzKHVuc2lnbmVkIHBhcmFtZXRlcnNTdGFydE9mZnNldCwgdW5z
aWduZWQgdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0LCB1bnNpZ25lZCB0eXBlUHJvZmlsaW5nRW5k
T2Zmc2V0KQotICAgIHsKLSAgICAgICAgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQgPSBwYXJhbWV0
ZXJzU3RhcnRPZmZzZXQ7Ci0gICAgICAgIG1fdHlwZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0ID0gdHlw
ZVByb2ZpbGluZ1N0YXJ0T2Zmc2V0OwotICAgICAgICBtX3R5cGVQcm9maWxpbmdFbmRPZmZzZXQg
PSB0eXBlUHJvZmlsaW5nRW5kT2Zmc2V0OwotICAgIH0KLQotICAgIERFQ0xBUkVfSU5GTzsKLQot
ICAgIEluZmVycmVkVmFsdWUqIHNpbmdsZXRvbkZ1bmN0aW9uKCkgeyByZXR1cm4gbV9zaW5nbGV0
b25GdW5jdGlvbi5nZXQoKTsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFeGVjdXRh
YmxlQmFzZTsKLSAgICBGdW5jdGlvbkV4ZWN1dGFibGUoCi0gICAgICAgIFZNJiwgY29uc3QgU291
cmNlQ29kZSYsIFVubGlua2VkRnVuY3Rpb25FeGVjdXRhYmxlKiwgdW5zaWduZWQgZmlyc3RMaW5l
LCAKLSAgICAgICAgdW5zaWduZWQgbGFzdExpbmUsIHVuc2lnbmVkIHN0YXJ0Q29sdW1uLCB1bnNp
Z25lZCBlbmRDb2x1bW4sIEludHJpbnNpYyk7Ci0gICAgCi0gICAgdm9pZCBmaW5pc2hDcmVhdGlv
bihWTSYpOwotCi0gICAgZnJpZW5kIGNsYXNzIFNjcmlwdEV4ZWN1dGFibGU7Ci0gICAgCi0gICAg
dW5zaWduZWQgbV9wYXJhbWV0ZXJzU3RhcnRPZmZzZXQ7Ci0gICAgV3JpdGVCYXJyaWVyPFVubGlu
a2VkRnVuY3Rpb25FeGVjdXRhYmxlPiBtX3VubGlua2VkRXhlY3V0YWJsZTsKLSAgICBXcml0ZUJh
cnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ2FsbDsKLSAgICBXcml0ZUJh
cnJpZXI8RnVuY3Rpb25Db2RlQmxvY2s+IG1fY29kZUJsb2NrRm9yQ29uc3RydWN0OwotICAgIFJl
ZlB0cjxUeXBlU2V0PiBtX3JldHVyblN0YXRlbWVudFR5cGVTZXQ7Ci0gICAgV3JpdGVCYXJyaWVy
PEluZmVycmVkVmFsdWU+IG1fc2luZ2xldG9uRnVuY3Rpb247Ci19OwotCiAjaWYgRU5BQkxFKFdF
QkFTU0VNQkxZKQogY2xhc3MgV2ViQXNzZW1ibHlFeGVjdXRhYmxlIGZpbmFsIDogcHVibGljIEV4
ZWN1dGFibGVCYXNlIHsKIHB1YmxpYzoKQEAgLTc1NiwyMyArNzIsNCBAQCBwcml2YXRlOgogfTsK
ICNlbmRpZgogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRXhlY3V0YWJsZVR5cGU+Ci1KU09iamVjdCog
U2NyaXB0RXhlY3V0YWJsZTo6cHJlcGFyZUZvckV4ZWN1dGlvbihWTSYgdm0sIEpTRnVuY3Rpb24q
IGZ1bmN0aW9uLCBKU1Njb3BlKiBzY29wZSwgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBraW5kLCBD
b2RlQmxvY2sqJiByZXN1bHRDb2RlQmxvY2spCi17Ci0gICAgaWYgKGhhc0pJVENvZGVGb3Ioa2lu
ZCkpIHsKLSAgICAgICAgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwgRXZhbEV4ZWN1
dGFibGU+Ojp2YWx1ZSkKLSAgICAgICAgICAgIHJlc3VsdENvZGVCbG9jayA9IGpzQ2FzdDxDb2Rl
QmxvY2sqPihqc0Nhc3Q8RXZhbEV4ZWN1dGFibGUqPih0aGlzKS0+Y29kZUJsb2NrKCkpOwotICAg
ICAgICBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8RXhlY3V0YWJsZVR5cGUsIFByb2dyYW1FeGVjdXRh
YmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sgPSBqc0Nhc3Q8Q29kZUJs
b2NrKj4oanNDYXN0PFByb2dyYW1FeGVjdXRhYmxlKj4odGhpcyktPmNvZGVCbG9jaygpKTsKLSAg
ICAgICAgZWxzZSBpZiAoc3RkOjppc19zYW1lPEV4ZWN1dGFibGVUeXBlLCBNb2R1bGVQcm9ncmFt
RXhlY3V0YWJsZT46OnZhbHVlKQotICAgICAgICAgICAgcmVzdWx0Q29kZUJsb2NrID0ganNDYXN0
PENvZGVCbG9jayo+KGpzQ2FzdDxNb2R1bGVQcm9ncmFtRXhlY3V0YWJsZSo+KHRoaXMpLT5jb2Rl
QmxvY2soKSk7Ci0gICAgICAgIGVsc2UgaWYgKHN0ZDo6aXNfc2FtZTxFeGVjdXRhYmxlVHlwZSwg
RnVuY3Rpb25FeGVjdXRhYmxlPjo6dmFsdWUpCi0gICAgICAgICAgICByZXN1bHRDb2RlQmxvY2sg
PSBqc0Nhc3Q8Q29kZUJsb2NrKj4oanNDYXN0PEZ1bmN0aW9uRXhlY3V0YWJsZSo+KHRoaXMpLT5j
b2RlQmxvY2tGb3Ioa2luZCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAg
cmV0dXJuIHByZXBhcmVGb3JFeGVjdXRpb25JbXBsKHZtLCBmdW5jdGlvbiwgc2NvcGUsIGtpbmQs
IHJlc3VsdENvZGVCbG9jayk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNl
L1dlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxv
ZwkocmV2aXNpb24gMjA3NzkwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTYtMTAtMjcgIEdlb2ZmcmV5IEdhcmVuICA8Z2dh
cmVuQGFwcGxlLmNvbT4KKworICAgICAgICBPbmUgZmlsZSBwZXIgY2xhc3MgZm9yIEV4ZWN1dGFi
bGUuaC8uY3BwCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNjQwOTkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBObyBuZXcgdGVzdHMgKE9PUFMhKS4KKworICAgICAgICAqIEZvcndhcmRpbmdIZWFkZXJzL3J1
bnRpbWUvRXhlY3V0YWJsZS5oOiBSZW1vdmVkLgorICAgICAgICAqIEZvcndhcmRpbmdIZWFkZXJz
L3J1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3Jl
L0ZvcndhcmRpbmdIZWFkZXJzL3J1bnRpbWUvRXhlY3V0YWJsZS5oLgorICAgICAgICAqIGJpbmRp
bmdzL2pzL0pTTGF6eUV2ZW50TGlzdGVuZXIuY3BwOgorICAgICAgICAqIGJpbmRpbmdzL2pzL0pT
TWFpblRocmVhZEV4ZWNTdGF0ZUluc3RydW1lbnRhdGlvbi5oOgorCiAyMDE2LTEwLTI0ICBSeWFu
IEhhZGRhZCAgPHJ5YW5oYWRkYWRAYXBwbGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJv
bGxpbmcgb3V0IHIyMDc3ODMuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9Gb3J3YXJkaW5nSGVhZGVy
cy9ydW50aW1lL0V4ZWN1dGFibGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Gb3J3
YXJkaW5nSGVhZGVycy9ydW50aW1lL0V4ZWN1dGFibGUuaAkocmV2aXNpb24gMjA3NzkwKQorKysg
U291cmNlL1dlYkNvcmUvRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9FeGVjdXRhYmxlLmgJKG5v
bmV4aXN0ZW50KQpAQCAtMSw0ICswLDAgQEAKLSNpZm5kZWYgV2ViQ29yZV9GV0RfRXhlY3V0YWJs
ZV9oCi0jZGVmaW5lIFdlYkNvcmVfRldEX0V4ZWN1dGFibGVfaAotI2luY2x1ZGUgPEphdmFTY3Jp
cHRDb3JlL0V4ZWN1dGFibGUuaD4KLSNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvRm9yd2Fy
ZGluZ0hlYWRlcnMvcnVudGltZS9GdW5jdGlvbkV4ZWN1dGFibGUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9Gb3J3YXJkaW5nSGVhZGVycy9ydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJs
ZS5oCShyZXZpc2lvbiAyMDc3OTApCShmcm9tIFNvdXJjZS9XZWJDb3JlL0ZvcndhcmRpbmdIZWFk
ZXJzL3J1bnRpbWUvRXhlY3V0YWJsZS5oOjIwNzc5MCkKKysrIFNvdXJjZS9XZWJDb3JlL0Zvcndh
cmRpbmdIZWFkZXJzL3J1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0IEBACisjaWZuZGVmIFdlYkNvcmVfRldEX0V4ZWN1dGFibGVfaAorI2RlZmlu
ZSBXZWJDb3JlX0ZXRF9FeGVjdXRhYmxlX2gKKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9FeGVj
dXRhYmxlLmg+CisjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL0ZvcndhcmRpbmdIZWFkZXJz
L3J1bnRpbWUvRnVuY3Rpb25FeGVjdXRhYmxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9GdW5jdGlvbkV4ZWN1dGFibGUuaAkocmV2aXNp
b24gMjA3NzkwKQorKysgU291cmNlL1dlYkNvcmUvRm9yd2FyZGluZ0hlYWRlcnMvcnVudGltZS9G
dW5jdGlvbkV4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpAQCAtMSw0ICsxLDQgQEAKLSNpZm5k
ZWYgV2ViQ29yZV9GV0RfRXhlY3V0YWJsZV9oCi0jZGVmaW5lIFdlYkNvcmVfRldEX0V4ZWN1dGFi
bGVfaAotI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0V4ZWN1dGFibGUuaD4KKyNpZm5kZWYgV2Vi
Q29yZV9GV0RfRnVuY3Rpb25FeGVjdXRhYmxlX2gKKyNkZWZpbmUgV2ViQ29yZV9GV0RfRnVuY3Rp
b25FeGVjdXRhYmxlX2gKKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9GdW5jdGlvbkV4ZWN1dGFi
bGUuaD4KICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvSlNMYXp5RXZl
bnRMaXN0ZW5lci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMv
SlNMYXp5RXZlbnRMaXN0ZW5lci5jcHAJKHJldmlzaW9uIDIwNzc5MCkKKysrIFNvdXJjZS9XZWJD
b3JlL2JpbmRpbmdzL2pzL0pTTGF6eUV2ZW50TGlzdGVuZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJKU05vZGUuaCIK
ICNpbmNsdWRlICJTY3JpcHRDb250cm9sbGVyLmgiCi0jaW5jbHVkZSA8cnVudGltZS9FeGVjdXRh
YmxlLmg+CiAjaW5jbHVkZSA8cnVudGltZS9GdW5jdGlvbkNvbnN0cnVjdG9yLmg+CiAjaW5jbHVk
ZSA8cnVudGltZS9JZGVudGlmaWVySW5saW5lcy5oPgogI2luY2x1ZGUgPHd0Zi9OZXZlckRlc3Ry
b3llZC5oPgpJbmRleDogU291cmNlL1dlYkNvcmUvYmluZGluZ3MvanMvSlNNYWluVGhyZWFkRXhl
Y1N0YXRlSW5zdHJ1bWVudGF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3MvanMvSlNNYWluVGhyZWFkRXhlY1N0YXRlSW5zdHJ1bWVudGF0aW9uLmgJKHJldmlzaW9u
IDIwNzc5MCkKKysrIFNvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTTWFpblRocmVhZEV4ZWNT
dGF0ZUluc3RydW1lbnRhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsyOSw3IEBACiAK
ICNpbmNsdWRlICJJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKICNpbmNsdWRlICJKU01haW5U
aHJlYWRFeGVjU3RhdGUuaCIKLSNpbmNsdWRlIDxydW50aW1lL0V4ZWN1dGFibGUuaD4KKyNpbmNs
dWRlIDxydW50aW1lL0Z1bmN0aW9uRXhlY3V0YWJsZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAK
</data>
<flag name="review"
          id="316024"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
      

    </bug>

</bugzilla>