<?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>7978</bug_id>
          
          <creation_ts>2006-03-25 04:38:44 -0800</creation_ts>
          <short_desc>Split dom_elementimpl.* into multiple files (one per class)</short_desc>
          <delta_ts>2006-03-25 14:18:49 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P4</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>37552</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-03-25 04:38:44 -0800</bug_when>
    <thetext>Split dom_elementimpl.* into multiple files (one per class)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>37573</commentid>
    <comment_count>1</comment_count>
      <attachid>7298</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-03-25 13:59:50 -0800</bug_when>
    <thetext>Created attachment 7298
Split dom_elementimpl.* into multiple files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>37575</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-03-25 14:02:50 -0800</bug_when>
    <thetext>*** Bug 7977 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>37577</commentid>
    <comment_count>3</comment_count>
      <attachid>7298</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2006-03-25 14:10:12 -0800</bug_when>
    <thetext>Comment on attachment 7298
Split dom_elementimpl.* into multiple files.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>37578</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-03-25 14:18:49 -0800</bug_when>
    <thetext>Maciej and I chatted about this on irc and decided it was OK to land this &quot;so suddenly&quot;, as the likelyhood of breaking any outstanding patches was low.  If I did happen to break your patch, I&apos;m happy to help you fix it.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>7298</attachid>
            <date>2006-03-25 13:59:50 -0800</date>
            <delta_ts>2006-03-25 14:10:12 -0800</delta_ts>
            <desc>Split dom_elementimpl.* into multiple files.</desc>
            <filename>split.patch</filename>
            <type>text/plain</type>
            <size>633536</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL3hibC94YmxfdG9rZW5pemVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94
YmwveGJsX3Rva2VuaXplci5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga2h0bWwveGJsL3hibF90
b2tlbml6ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw2IEBACiAjaWZuZGVmIEtI
VE1MX05PX1hCTAogCiAjaW5jbHVkZSAiZG9tL2RvbV9ub2RlLmgiCi0jaW5jbHVkZSAiZG9tX2Vs
ZW1lbnRpbXBsLmgiCiAKICNpbmNsdWRlICJ4YmxfdG9rZW5pemVyLmgiCiAjaW5jbHVkZSAieGJs
X2RvY2ltcGwuaCIKSW5kZXg6IGtodG1sL3hibC94YmxfYmluZGluZ19tYW5hZ2VyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBraHRtbC94YmwveGJsX2JpbmRpbmdfbWFuYWdlci5jcHAJKHJldmlzaW9uIDEz
NDc3KQorKysga2h0bWwveGJsL3hibF9iaW5kaW5nX21hbmFnZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yOCw3ICsyOCw2IEBACiAjaWZuZGVmIEtIVE1MX05PX1hCTAogCiAjaW5jbHVkZSAiZG9t
X2RvY2ltcGwuaCIKLSNpbmNsdWRlICJkb21fZWxlbWVudGltcGwuaCIKICNpbmNsdWRlICJyZW5k
ZXJpbmcvcmVuZGVyX3N0eWxlLmgiCiAjaW5jbHVkZSAieGJsX2JpbmRpbmdfbWFuYWdlci5oIgog
I2luY2x1ZGUgInhibF9iaW5kaW5nLmgiCkluZGV4OiBraHRtbC9lY21hL2tqc192aWV3cy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0ga2h0bWwvZWNtYS9ranNfdmlld3MuY3BwCShyZXZpc2lvbiAxMzQ3NykK
KysrIGtodG1sL2VjbWEva2pzX3ZpZXdzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTUgKzI0
LDEyIEBACiAjaW5jbHVkZSAia2pzX2Nzcy5oIgogCiAjaW5jbHVkZSAiQWJzdHJhY3RWaWV3Lmgi
CisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAi
Y3NzL2Nzc19zdHlsZXNoZWV0aW1wbC5oIgogI2luY2x1ZGUgImNzcy9jc3NfcnVsZWltcGwuaCIK
IAotdXNpbmcgV2ViQ29yZTo6QWJzdHJhY3RWaWV3OwotdXNpbmcgV2ViQ29yZTo6RG9jdW1lbnQ7
Ci11c2luZyBXZWJDb3JlOjpFbGVtZW50OwotdXNpbmcgV2ViQ29yZTo6Tm9kZTsKLXVzaW5nIFdl
YkNvcmU6OkNTU1J1bGVMaXN0OwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKICNpbmNsdWRl
ICJranNfdmlld3MubHV0LmgiCiAKSW5kZXg6IGtodG1sL2VjbWEva2pzX3dpbmRvdy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga2h0bWwvZWNtYS9ranNfd2luZG93LmNwcAkocmV2aXNpb24gMTM0NzcpCisr
KyBraHRtbC9lY21hL2tqc193aW5kb3cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw2ICsyMiw3
IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAia2pzX3dpbmRvdy5oIgogCisjaW5j
bHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKICNpbmNsdWRlICJGcmFt
ZS5oIgogI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgpAQCAtNDUsNyArNDYsNiBAQAogI2luY2x1ZGUg
ImNzc19ydWxlaW1wbC5oIgogI2luY2x1ZGUgImNzc19zdHlsZXNoZWV0aW1wbC5oIgogI2luY2x1
ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogI2lu
Y2x1ZGUgImh0bWxlZGl0aW5nLmgiCiAjaW5jbHVkZSAia2h0bWxfc2V0dGluZ3MuaCIKICNpbmNs
dWRlICJranNfY3NzLmgiCkBAIC03OTUsMTEgKzc5NSwxMCBAQCBKU1ZhbHVlICpXaW5kb3c6Omdl
dFZhbHVlUHJvcGVydHkoRXhlY1N0CiAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKICNlbmRp
ZgogICAgIGNhc2UgRnJhbWVFbGVtZW50OgotICAgICAgaWYgKERvY3VtZW50ICpkb2MgPSBtX2Zy
YW1lLT5kb2N1bWVudCgpKQotICAgICAgICBpZiAoRWxlbWVudCAqZmUgPSBkb2MtPm93bmVyRWxl
bWVudCgpKQotICAgICAgICAgIGlmIChjaGVja05vZGVTZWN1cml0eShleGVjLCBmZSkpIHsKKyAg
ICAgIGlmIChEb2N1bWVudCogZG9jID0gbV9mcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgaWYg
KEVsZW1lbnQqIGZlID0gZG9jLT5vd25lckVsZW1lbnQoKSkKKyAgICAgICAgICBpZiAoY2hlY2tO
b2RlU2VjdXJpdHkoZXhlYywgZmUpKQogICAgICAgICAgICAgcmV0dXJuIHRvSlMoZXhlYywgZmUp
OwotICAgICAgICAgIH0KICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwogICAgfQogCkluZGV4
OiBwbGF0Zm9ybS9XaWRnZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9XaWRnZXQuaAkocmV2
aXNpb24gMTM0NzcpCisrKyBwbGF0Zm9ybS9XaWRnZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMTU5
LDkgKzE1OSw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogfQogCi11c2luZyBXZWJDb3JlOjpJ
bnRQb2ludDsgLy8gcmVtb3ZlIHdoZW4gd2UgbW92ZSBldmVyeXRoaW5nIGludG8gdGhlIFdlYkNv
cmUgbmFtZXNwYWNlCi11c2luZyBXZWJDb3JlOjpJbnRSZWN0OyAvLyByZW1vdmUgd2hlbiB3ZSBt
b3ZlIGV2ZXJ5dGhpbmcgaW50byB0aGUgV2ViQ29yZSBuYW1lc3BhY2UKLXVzaW5nIFdlYkNvcmU6
OkludFNpemU7IC8vIHJlbW92ZSB3aGVuIHdlIG1vdmUgZXZlcnl0aGluZyBpbnRvIHRoZSBXZWJD
b3JlIG5hbWVzcGFjZQotdXNpbmcgV2ViQ29yZTo6V2lkZ2V0OyAvLyByZW1vdmUgd2hlbiB3ZSBt
b3ZlIGV2ZXJ5dGhpbmcgaW50byB0aGUgV2ViQ29yZSBuYW1lc3BhY2UKK3VzaW5nIFdlYkNvcmU6
OkludFBvaW50OyAvLyBGSVhNRTogcmVtb3ZlIHdoZW4gd2UgbW92ZSBldmVyeXRoaW5nIGludG8g
dGhlIFdlYkNvcmUgbmFtZXNwYWNlCit1c2luZyBXZWJDb3JlOjpJbnRSZWN0OyAvLyBGSVhNRTog
cmVtb3ZlIHdoZW4gd2UgbW92ZSBldmVyeXRoaW5nIGludG8gdGhlIFdlYkNvcmUgbmFtZXNwYWNl
Cit1c2luZyBXZWJDb3JlOjpJbnRTaXplOyAvLyBGSVhNRTogcmVtb3ZlIHdoZW4gd2UgbW92ZSBl
dmVyeXRoaW5nIGludG8gdGhlIFdlYkNvcmUgbmFtZXNwYWNlCit1c2luZyBXZWJDb3JlOjpXaWRn
ZXQ7IC8vIEZJWE1FOiByZW1vdmUgd2hlbiB3ZSBtb3ZlIGV2ZXJ5dGhpbmcgaW50byB0aGUgV2Vi
Q29yZSBuYW1lc3BhY2UKIAogI2VuZGlmCkluZGV4OiBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5l
cmF0b3JKUy5wbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JK
Uy5wbQkocmV2aXNpb24gMTM0NzcpCisrKyBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JK
Uy5wbQkod29ya2luZyBjb3B5KQpAQCAtMTQ2LDExICsxNDYsMTAgQEAgc3ViIEFkZEluY2x1ZGVz
Rm9yVHlwZQogICAgICAgJHR5cGUgZXEgIkNoYXJhY3RlckRhdGEiIG9yCiAgICAgICAkdHlwZSBl
cSAiQ2FudmFzUGF0dGVybiIgb3IKICAgICAgICR0eXBlIGVxICJSYW5nZSIgb3IKLSAgICAgICR0
eXBlIGVxICJEb2N1bWVudEZyYWdtZW50IikgeworICAgICAgJHR5cGUgZXEgIkRvY3VtZW50RnJh
Z21lbnQiIG9yCisgICAgICAkdHlwZSBlcSAiQXR0ciIgb3IKKyAgICAgICR0eXBlIGVxICJFbGVt
ZW50IikgewogICAgICRpbXBsSW5jbHVkZXN7IiR7dHlwZX0uaCJ9ID0gMTsKLSAgfSBlbHNpZiAo
JHR5cGUgZXEgIkF0dHIiIG9yCi0gICAgICAgICAgICR0eXBlIGVxICJFbGVtZW50IikgewotICAg
ICRpbXBsSW5jbHVkZXN7ImRvbV9lbGVtZW50aW1wbC5oIn0gPSAxOwogICB9IGVsc2lmICgkdHlw
ZSBlcSAiQ1NTU3R5bGVTaGVldCIgb3IgJHR5cGUgZXEgIlN0eWxlU2hlZXQiKSB7CiAgICAgJGlt
cGxJbmNsdWRlc3siY3NzX3N0eWxlc2hlZXRpbXBsLmgifSA9IDE7CiAgIH0gZWxzaWYgKCR0eXBl
IGVxICJIVE1MRG9jdW1lbnQiKSB7CkluZGV4OiBiaW5kaW5ncy9vYmpjL0RPTS5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBiaW5kaW5ncy9vYmpjL0RPTS5tbQkocmV2aXNpb24gMTM0NzcpCisrKyBiaW5kaW5n
cy9vYmpjL0RPTS5tbQkod29ya2luZyBjb3B5KQpAQCAtNDksNyArNDksNiBAQAogI2ltcG9ydCAi
UmFuZ2UuaCIKICNpbXBvcnQgImRvbTJfdHJhdmVyc2FsaW1wbC5oIgogI2ltcG9ydCAiQWJzdHJh
Y3RWaWV3LmgiCi0jaW1wb3J0ICJkb21fZWxlbWVudGltcGwuaCIKICNpbXBvcnQgImRvbV94bWxp
bXBsLmgiCiAjaW1wb3J0ICJIVE1MTmFtZXMuaCIKICNpbXBvcnQgIlJlbmRlckltYWdlLmgiCklu
ZGV4OiBiaW5kaW5ncy9vYmpjL0RPTUhUTUwubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYmluZGluZ3Mvb2Jq
Yy9ET01IVE1MLm1tCShyZXZpc2lvbiAxMzQ3NykKKysrIGJpbmRpbmdzL29iamMvRE9NSFRNTC5t
bQkod29ya2luZyBjb3B5KQpAQCAtNTEsNyArNTEsNiBAQAogI2ltcG9ydCAiSFRNTEJhc2VGb250
RWxlbWVudC5oIgogI2ltcG9ydCAiaHRtbF9vYmplY3RpbXBsLmgiCiAjaW1wb3J0ICJodG1sX3Rh
YmxlaW1wbC5oIgotI2ltcG9ydCAiZG9tX2VsZW1lbnRpbXBsLmgiCiAjaW1wb3J0ICJDb250YWlu
ZXJOb2RlLmgiCiAjaW1wb3J0ICJOYW1lTm9kZUxpc3QuaCIKICNpbXBvcnQgIm1hcmt1cC5oIgpJ
bmRleDogaHRtbC9IVE1MVG9rZW5pemVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MVG9rZW5p
emVyLmgJKHJldmlzaW9uIDEzNDc3KQorKysgaHRtbC9IVE1MVG9rZW5pemVyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgSFRNTFRPS0VOSVpFUl9ICiAKICNpbmNs
dWRlICJDYWNoZWRPYmplY3RDbGllbnQuaCIKKyNpbmNsdWRlICJOYW1lZE1hcHBlZEF0dHJNYXAu
aCIKICNpbmNsdWRlICJTZWdtZW50ZWRTdHJpbmcuaCIKICNpbmNsdWRlICJUaW1lci5oIgogI2lu
Y2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKQEAgLTQ1LDcgKzQ2LDYgQEAgY2xhc3MgRG9jdW1lbnRG
cmFnbWVudDsKIGNsYXNzIERvY3VtZW50OwogY2xhc3MgRnJhbWVWaWV3OwogY2xhc3MgSFRNTFBh
cnNlcjsKLWNsYXNzIE5hbWVkTWFwcGVkQXR0ck1hcDsKIGNsYXNzIE5vZGU7CiAKIC8qKgpJbmRl
eDogaHRtbC9odG1sX2Jhc2VpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL2h0bWxfYmFzZWlt
cGwuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGh0bWwvaHRtbF9iYXNlaW1wbC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNs
dWRlICJsb2FkZXIuaCIKICNpbmNsdWRlICJyZW5kZXJfZnJhbWVzLmgiCisjaW5jbHVkZSAiTWFw
cGVkQXR0cmlidXRlLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApJbmRleDogaHRtbC9IVE1M
RWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTEVsZW1lbnQuaAkocmV2aXNpb24gMTM0
NzcpCisrKyBodG1sL0hUTUxFbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI1LDcgKzI1LDcg
QEAKICNpZm5kZWYgSFRNTEVsZW1lbnRJbXBsX0gKICNkZWZpbmUgSFRNTEVsZW1lbnRJbXBsX0gK
IAotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgorI2luY2x1ZGUgIlN0eWxlZEVsZW1lbnQu
aCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyT2JqZWN0
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24g
MTM0NzkpCisrKyByZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNsdWRlICJEb2N1
bWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAj
aW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKQEAgLTQzLDcgKzQ0LDYg
QEAKICNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCiAjaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rvci5o
IgogI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1w
bC5oIgogI2luY2x1ZGUgIlBvc2l0aW9uLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5j
bHVkZSAiUmVuZGVyQXJlbmEuaCIKSW5kZXg6IHJlbmRlcmluZy9iaWRpLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSByZW5kZXJpbmcvYmlkaS5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgcmVuZGVyaW5nL2Jp
ZGkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiY29uZmln
LmgiCiAjaW5jbHVkZSAiYmlkaS5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAi
RWxlbWVudC5oIgogI2luY2x1ZGUgImJyZWFrX2xpbmVzLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3
LmgiCiAjaW5jbHVkZSA8a3htbGNvcmUvQWx3YXlzSW5saW5lLmg+CkluZGV4OiByZW5kZXJpbmcv
UmVuZGVyVGhlbWVNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFj
Lm1tCShyZXZpc2lvbiAxMzQ3NykKKysrIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbQkod29y
a2luZyBjb3B5KQpAQCAtMjYsNyArMjYsNiBAQAogI2ltcG9ydCAiRnJhbWVWaWV3LmgiCiAjaW1w
b3J0ICJGb3VuZGF0aW9uRXh0cmFzLmgiCiAjaW1wb3J0ICJjc3NzdHlsZXNlbGVjdG9yLmgiCi0j
aW1wb3J0ICJkb21fZWxlbWVudGltcGwuaCIKICNpbXBvcnQgIkZvbnQuaCIKICNpbXBvcnQgIlJl
bmRlckNhbnZhcy5oIgogI2ltcG9ydCAicmVuZGVyX3N0eWxlLmgiCkluZGV4OiByZW5kZXJpbmcv
UmVuZGVyQ2FudmFzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyQ2FudmFzLmNw
cAkocmV2aXNpb24gMTM0NzcpCisrKyByZW5kZXJpbmcvUmVuZGVyQ2FudmFzLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5oIgogCiAj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiRnJh
bWVWaWV3LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVy
TGF5ZXIuaCIKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJDb250YWluZXIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIHJlbmRlcmluZy9SZW5kZXJDb250YWluZXIuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIHJl
bmRlcmluZy9SZW5kZXJDb250YWluZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw2
IEBACiAvLyBGb3IgYWNjZXNzaWJpbGl0eQogI2luY2x1ZGUgIkFjY2Vzc2liaWxpdHlPYmplY3RD
YWNoZS5oIiAKIAotdXNpbmcgV2ViQ29yZTo6UG9zaXRpb247CiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKIFJlbmRlckNvbnRhaW5lcjo6UmVuZGVyQ29udGFpbmVyKFdlYkNvcmU6Ok5vZGUqIG5vZGUp
CkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX3JlcGxhY2VkLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5k
ZXJpbmcvcmVuZGVyX3JlcGxhY2VkLmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyByZW5kZXJpbmcv
cmVuZGVyX3JlcGxhY2VkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsNyBAQAogI2lu
Y2x1ZGUgInJlbmRlcl9yZXBsYWNlZC5oIgogCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIgLy8gIyMj
IHJlbW92ZSBkZXBlbmRlbmN5CisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkV2ZW50
TmFtZXMuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUZXh0RmllbGQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IHJlbmRlcmluZy9SZW5kZXJUZXh0RmllbGQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIHJlbmRl
cmluZy9SZW5kZXJUZXh0RmllbGQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw2IEBA
CiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgog
I2luY2x1ZGUgIkhUTUxUZXh0RmllbGRJbm5lckVsZW1lbnQuaCIKLSNpbmNsdWRlICJkb21fZWxl
bWVudGltcGwuaCIKICNpbmNsdWRlICJTZWxlY3Rpb25Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAi
VmlzaWJsZVBvc2l0aW9uLmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCkluZGV4OiByZW5k
ZXJpbmcvUmVuZGVyQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJCbG9j
ay5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAK
ICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJG
cmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgpJbmRleDogZG9tL0Fic3RyYWN0Vmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0Fic3Ry
YWN0Vmlldy5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgZG9tL0Fic3RyYWN0Vmlldy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI1LDkgKzI1LDkgQEAKICNpbmNsdWRlICJBYnN0cmFjdFZpZXcuaCIK
IAogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUg
IkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oIgogI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0
b3IuaCIKLSNpbmNsdWRlICJkb21fZWxlbWVudGltcGwuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCkluZGV4OiBkb20vTWFwcGVkQXR0cmlidXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL01hcHBl
ZEF0dHJpYnV0ZS5oCShyZXZpc2lvbiAxMzQ3NykKKysrIGRvbS9NYXBwZWRBdHRyaWJ1dGUuaAko
d29ya2luZyBjb3B5KQpAQCAtMjQsMTkgKzI0LDExIEBACiAgKgogICovCiAKLSNpZm5kZWYgRE9N
X0VMRU1FTlRJTVBMX0gKLSNkZWZpbmUgRE9NX0VMRU1FTlRJTVBMX0gKKyNpZm5kZWYgTWFwcGVk
QXR0cmlidXRlX2gKKyNkZWZpbmUgTWFwcGVkQXR0cmlidXRlX2gKIAotI2luY2x1ZGUgIkF0b21p
Y1N0cmluZ0xpc3QuaCIKLSNpbmNsdWRlICJDb250YWluZXJOb2RlLmgiCi0jaW5jbHVkZSAiTmFt
ZWROb2RlTWFwLmgiCi0jaW5jbHVkZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmlu
Z0ltcGwuaCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCi0KLSNpZiBfX09CSkNfXwotI2Rl
ZmluZSBpZCBpZF9BVk9JRF9LRVlXT1JECi0jZW5kaWYKKyNpbmNsdWRlICJBdHRyaWJ1dGUuaCIK
KyNpbmNsdWRlICJDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKQEAgLTQ2LDMxNSArMzgsNiBAQCBjbGFzcyBDU1NTdHlsZVNlbGVjdG9yOwog
Y2xhc3MgRWxlbWVudDsKIGNsYXNzIE5hbWVkQXR0ck1hcDsKIAotLy8gdGhpcyBoYXMgbm8gY291
bnRlcnBhcnQgaW4gRE9NLCBwdXJlbHkgaW50ZXJuYWwKLS8vIHJlcHJlc2VudGF0aW9uIG9mIHRo
ZSBub2RldmFsdWUgb2YgYW4gQXR0ci4KLS8vIHRoZSBhY3R1YWwgQXR0ciAoQXR0cikgd2l0aCBp
dHMgdmFsdWUgYXMgdGV4dGNoaWxkCi0vLyBpcyBvbmx5IGFsbG9jYXRlZCBvbiBkZW1hbmQgYnkg
dGhlIERPTSBiaW5kaW5ncy4KLS8vIEFueSB1c2Ugb2YgQXR0ciBpbnNpZGUga2h0bWwgc2hvdWxk
IGJlIGF2b2lkZWQuCi1jbGFzcyBBdHRyaWJ1dGUgOiBwdWJsaWMgU2hhcmVkPEF0dHJpYnV0ZT4g
ewotICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNsYXNzIEVsZW1l
bnQ7Ci0gICAgZnJpZW5kIGNsYXNzIEF0dHI7Ci0KLXB1YmxpYzoKLSAgICAvLyBudWxsIHZhbHVl
IGlzIGZvcmJpZGRlbiAhCi0gICAgQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUs
IGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpCi0gICAgICAgIDogbV9uYW1lKG5hbWUpLCBtX3Zh
bHVlKHZhbHVlKSwgbV9pbXBsKDApCi0gICAge30KLSAgICAKLSAgICBBdHRyaWJ1dGUoY29uc3Qg
QXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKQotICAgICAgICA6
IG1fbmFtZShudWxsQXRvbSwgbmFtZSwgbnVsbEF0b20pLCBtX3ZhbHVlKHZhbHVlKSwgbV9pbXBs
KDApCi0gICAge30KLQotICAgIHZpcnR1YWwgfkF0dHJpYnV0ZSgpIHsgfQotICAgIAotICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9Ci0gICAg
Y29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJldHVybiBtX25hbWUucHJlZml4
KCk7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJu
IG1fbmFtZS5sb2NhbE5hbWUoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNl
VVJJKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lLm5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgCi0gICAg
Y29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQotICAg
IAotICAgIEF0dHIqIGF0dHIoKSBjb25zdCB7IHJldHVybiBtX2ltcGw7IH0KLSAgICBQYXNzUmVm
UHRyPEF0dHI+IGNyZWF0ZUF0dHJJZk5lZWRlZChFbGVtZW50KiBlKTsKLQotICAgIGJvb2wgaXNO
dWxsKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZS5pc051bGwoKTsgfQotICAgIGJvb2wgaXNFbXB0
eSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWUuaXNFbXB0eSgpOyB9Ci0gICAgCi0gICAgdmlydHVh
bCBBdHRyaWJ1dGUqIGNsb25lKGJvb2wgcHJlc2VydmVEZWNsPXRydWUpIGNvbnN0OwotCi0gICAg
Ly8gQW4gZXh0ZW5zaW9uIHRvIGdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZm9yIHByZXNlbnRh
dGlvbmFsIGF0dHJpYnV0ZXMuCi0gICAgdmlydHVhbCBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWYWx1
ZShjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKSB7IG1fdmFsdWUgPSB2YWx1ZTsgfQotICAgIHZv
aWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KSB7IG1fbmFtZS5zZXRQcmVm
aXgocHJlZml4KTsgfQotCi0gICAgUXVhbGlmaWVkTmFtZSBtX25hbWU7Ci0gICAgQXRvbWljU3Ry
aW5nIG1fdmFsdWU7Ci0gICAgQXR0ciogbV9pbXBsOwotfTsKLQotLy8gQXR0ciBjYW4gaGF2ZSBU
ZXh0IGFuZCBFbnRpdHlSZWZlcmVuY2UgY2hpbGRyZW4KLS8vIHRoZXJlZm9yZSBpdCBoYXMgdG8g
YmUgYSBmdWxsYmxvd24gTm9kZS4gVGhlIHBsYW4KLS8vIGlzIHRvIGR5bmFtaWNhbGx5IGFsbG9j
YXRlIGEgdGV4dGNoaWxkIGFuZCBzdG9yZSB0aGUKLS8vIHJlc3VsdGluZyBub2RldmFsdWUgaW4g
dGhlIEF0dHJpYnV0ZSB1cG9uCi0vLyBkZXN0cnVjdGlvbi4gaG93ZXZlciwgdGhpcyBpcyBub3Qg
eWV0IGltcGxlbWVudGVkLgotY2xhc3MgQXR0ciA6IHB1YmxpYyBDb250YWluZXJOb2RlIHsKLSAg
ICBmcmllbmQgY2xhc3MgTmFtZWRBdHRyTWFwOwotCi1wdWJsaWM6Ci0gICAgQXR0cihFbGVtZW50
KiwgRG9jdW1lbnQqLCBBdHRyaWJ1dGUqKTsKLSAgICB+QXR0cigpOwotCi0gICAgLy8gQ2FsbCB0
aGlzIGFmdGVyIGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yIHNvIHRoZQotICAgIC8vIEF0dHIgbm9k
ZSBpc24ndCBmbG9hdGluZyB3aGVuIHdlIGFwcGVuZCB0aGUgdGV4dCBub2RlLgotICAgIHZvaWQg
Y3JlYXRlVGV4dENoaWxkKCk7Ci0gICAgCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVz
IGZvciBBdHRyCi0gICAgU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBxdWFsaWZpZWROYW1l
KCkudG9TdHJpbmcoKTsgfQotICAgIGJvb2wgc3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gbV9z
cGVjaWZpZWQ7IH0KLSAgICBFbGVtZW50KiBvd25lckVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBt
X2VsZW1lbnQ7IH0KLQotICAgIFN0cmluZyB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXR0cmli
dXRlLT52YWx1ZSgpOyB9Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmLCBFeGNlcHRp
b25Db2RlJik7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gcGFyZW50IGNs
YXNzZXMKLSAgICB2aXJ0dWFsIFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwg
Tm9kZVR5cGUgbm9kZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgbG9jYWxOYW1lKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5h
bWVzcGFjZVVSSSgpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVm
aXgoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmlu
ZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVWYWx1ZSgpIGNv
bnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJiwgRXhjZXB0
aW9uQ29kZSYpOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBk
ZWVwKTsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICB2aXJ0
dWFsIGJvb2wgaXNBdHRyaWJ1dGVOb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZp
cnR1YWwgYm9vbCBjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlKTsKLQotICAgIHZpcnR1YWwgdm9p
ZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIFN0cmluZyB0b1N0cmluZygpIGNvbnN0
OwotCi0gICAgQXR0cmlidXRlKiBhdHRyKCkgY29uc3QgeyByZXR1cm4gbV9hdHRyaWJ1dGUuZ2V0
KCk7IH0KLSAgICBjb25zdCBRdWFsaWZpZWROYW1lJiBxdWFsaWZpZWROYW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9hdHRyaWJ1dGUtPm5hbWUoKTsgfQotCi0gICAgLy8gQW4gZXh0ZW5zaW9uIHRvIGdl
dCBwcmVzZW50YXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgYXR0cmlidXRlcy4KLSAgICBDU1NTdHls
ZURlY2xhcmF0aW9uKiBzdHlsZSgpIHsgcmV0dXJuIG1fYXR0cmlidXRlLT5zdHlsZSgpOyB9Ci0K
LXByaXZhdGU6Ci0gICAgRWxlbWVudCogbV9lbGVtZW50OwotICAgIFJlZlB0cjxBdHRyaWJ1dGU+
IG1fYXR0cmlidXRlOwotICAgIGludCBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZDsKLX07Ci0KLWNs
YXNzIEVsZW1lbnQgOiBwdWJsaWMgQ29udGFpbmVyTm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNzIERv
Y3VtZW50OwotICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNsYXNz
IEF0dHI7Ci0gICAgZnJpZW5kIGNsYXNzIE5vZGU7Ci0gICAgZnJpZW5kIGNsYXNzIENTU1N0eWxl
U2VsZWN0b3I7Ci1wdWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdO
YW1lLCBEb2N1bWVudCAqZG9jKTsKLSAgICB+RWxlbWVudCgpOwotCi0gICAgLy8gVXNlZCB0byBx
dWlja2x5IGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGhhcyBhIGdpdmVuIENT
UyBjbGFzcy4KLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIGdldENsYXNzTGlz
dCgpIGNvbnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0SURBdHRyaWJ1dGUoKSBjb25z
dDsKLSAgICBib29sIGhhc0F0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25z
dDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWRO
YW1lJiBuYW1lKSBjb25zdDsKLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWRO
YW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQg
cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUm
KTsKLQotICAgIGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNBdHRy
aWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBib29sIGhhc0F0dHJpYnV0ZU5T
KGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29u
c3Q7Ci0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcm
IG5hbWUpIGNvbnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0cmlidXRlTlMoY29u
c3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdDsK
LQotICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5n
JiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgc2V0QXR0cmlidXRlTlMoY29uc3Qg
U3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzY3JvbGxJbnRvVmll
dyAoYm9vbCBhbGlnblRvVG9wKTsKLSAgICB2b2lkIHNjcm9sbEludG9WaWV3SWZOZWVkZWQoYm9v
bCBjZW50ZXJJZk5lZWRlZCk7Ci0KLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJp
bmcgJm5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKTsKLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZU5T
KGNvbnN0IFN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhj
ZXB0aW9uQ29kZSYpOwotCi0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2RlKGNv
bnN0IFN0cmluZyYgbmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2Rl
TlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKTsK
LSAgICBQYXNzUmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGUoQXR0ciosIEV4Y2VwdGlvbkNv
ZGUmKTsKLSAgICBQYXNzUmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyKiBuZXdB
dHRyLCBFeGNlcHRpb25Db2RlJiBlYykgeyByZXR1cm4gc2V0QXR0cmlidXRlTm9kZShuZXdBdHRy
LCBlYyk7IH0KLSAgICBQYXNzUmVmUHRyPEF0dHI+IHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0cios
IEV4Y2VwdGlvbkNvZGUmKTsKLSAgICAKLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24g
KnN0eWxlKCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUoKSBj
b25zdCB7IHJldHVybiBtX3RhZ05hbWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVGFnTmFtZShj
b25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubWF0
Y2hlcyh0YWdOYW1lKTsgfQotICAgIAotICAgIC8vIEEgZmFzdCBmdW5jdGlvbiBmb3IgY2hlY2tp
bmcgdGhlIGxvY2FsIG5hbWUgYWdhaW5zdCBhbm90aGVyIGF0b21pYyBzdHJpbmcuCi0gICAgYm9v
bCBoYXNMb2NhbE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4g
bV90YWdOYW1lLmxvY2FsTmFtZSgpID09IG90aGVyOyB9Ci0gICAgYm9vbCBoYXNMb2NhbE5hbWUo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2Nh
bE5hbWUoKSA9PSBvdGhlci5sb2NhbE5hbWUoKTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBBdG9t
aWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUo
KTsgfQotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJl
dHVybiBtX3RhZ05hbWUucHJlZml4KCk7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNv
bnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZpcnR1YWwg
Y29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX3RhZ05h
bWUubmFtZXNwYWNlVVJJKCk7IH0KLSAgICAKLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVu
IGZyb20gIHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBOb2RlVHlwZSBub2RlVHlwZSgpIGNv
bnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBkZWVwKTsK
LSAgICB2aXJ0dWFsIFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBp
c0VsZW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgdm9pZCBp
bnNlcnRlZEludG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3Vt
ZW50KCk7Ci0KLSAgICAvLyBjb252ZW5pZW5jZSBtZXRob2RzIHdoaWNoIGlnbm9yZSBleGNlcHRp
b25zCi0gICAgdm9pZCBzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29u
c3QgU3RyaW5nJiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIE5hbWVkQXR0ck1hcCAqYXR0cmlidXRl
cygpIGNvbnN0OwotICAgIE5hbWVkQXR0ck1hcCogYXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBj
b25zdDsKLQotICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhdHRyaWJ1
dGUgaXMgYWRkZWQsIGNoYW5nZWQgb3IgcmVtb3ZlZC4KLSAgICB2aXJ0dWFsIHZvaWQgYXR0cmli
dXRlQ2hhbmdlZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZhbHNlKSB7
fQotCi0gICAgLy8gbm90IHBhcnQgb2YgdGhlIERPTQotICAgIHZvaWQgc2V0QXR0cmlidXRlTWFw
KE5hbWVkQXR0ck1hcCopOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9w
ZXJ0aWVzKGNvbnN0IEVsZW1lbnQgKnNvdXJjZSkge30KLSAgICAKLSAgICAvLyBTdGF0ZSBvZiB0
aGUgZWxlbWVudC4KLSAgICB2aXJ0dWFsIERlcHJlY2F0ZWRTdHJpbmcgc3RhdGUoKSB7IHJldHVy
biBEZXByZWNhdGVkU3RyaW5nOjpudWxsOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7
Ci0gICAgdmlydHVhbCBSZW5kZXJTdHlsZSAqY3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5kZXJP
YmplY3QgKnBhcmVudCk7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICosIFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNT
dHlsZSggU3R5bGVDaGFuZ2UgPSBOb0NoYW5nZSApOwotCi0gICAgdmlydHVhbCBib29sIGNoaWxk
VHlwZUFsbG93ZWQoTm9kZVR5cGUpOwotIAotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjcmVhdGVB
dHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpOwot
ICAgIAotICAgIHZvaWQgZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7
Ci0gICAgdm9pZCBkaXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RXZlbnQpIHsg
fQotCi0gICAgdmlydHVhbCBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKLQotICAgIHZpcnR1YWwg
Ym9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotICAgICAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgZm9jdXMoKTsKLSAgICB2b2lkIGJsdXIoKTsKLSAgICAKLSNpZiAhTkRF
QlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRl
ZFN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGZvcm1hdEZvckRlYnVn
Z2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKLSNlbmRpZgotCi1wcm90
ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAg
IFN0cmluZyBvcGVuVGFnU3RhcnRUb1N0cmluZygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZv
aWQgdXBkYXRlSWQoY29uc3QgQXRvbWljU3RyaW5nJiBvbGRJZCwgY29uc3QgQXRvbWljU3RyaW5n
JiBuZXdJZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRl
ZCgpIGNvbnN0IHt9Ci0KLXByb3RlY3RlZDogLy8gbWVtYmVyIHZhcmlhYmxlcwotICAgIG11dGFi
bGUgUmVmUHRyPE5hbWVkQXR0ck1hcD4gbmFtZWRBdHRyTWFwOwotICAgIFF1YWxpZmllZE5hbWUg
bV90YWdOYW1lOwotfTsKLQotLy8gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQK
LWNsYXNzIE5hbWVkQXR0ck1hcCA6IHB1YmxpYyBOYW1lZE5vZGVNYXAgewotICAgIGZyaWVuZCBj
bGFzcyBFbGVtZW50OwotcHVibGljOgotICAgIE5hbWVkQXR0ck1hcChFbGVtZW50ICplKTsKLSAg
ICB2aXJ0dWFsIH5OYW1lZEF0dHJNYXAoKTsKLSAgICBOYW1lZEF0dHJNYXAoY29uc3QgTmFtZWRB
dHRyTWFwJik7Ci0gICAgTmFtZWRBdHRyTWFwICZvcGVyYXRvciA9KGNvbnN0IE5hbWVkQXR0ck1h
cCAmb3RoZXIpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBOYW1lZE5v
ZGVNYXAKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW0oY29uc3Qg
U3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3Zl
TmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmly
dHVhbCBQYXNzUmVmUHRyPE5vZGU+IGdldE5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNw
YWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNz
UmVmUHRyPE5vZGU+IHJlbW92ZU5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJ
LCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVh
bCBQYXNzUmVmUHRyPE5vZGU+IGdldE5hbWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
KSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVtKGNv
bnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8Tm9kZT4gc2V0TmFtZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29kZSYpOwot
Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGl0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0
OwotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbjsgfQotCi0gICAgLy8g
T3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIEF0dHJpYnV0ZSogYXR0cmlidXRl
SXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXR0cnMgPyBhdHRyc1tpbmRleF0g
OiAwOyB9Ci0gICAgQXR0cmlidXRlKiBnZXRBdHRyaWJ1dGVJdGVtKGNvbnN0IFF1YWxpZmllZE5h
bWUmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1JlYWRPbmx5KCkgeyByZXR1cm4g
ZWxlbWVudCA/IGVsZW1lbnQtPmlzUmVhZE9ubHkoKSA6IGZhbHNlOyB9Ci0KLSAgICAvLyB1c2Vk
IGR1cmluZyBwYXJzaW5nOiBvbmx5IGluc2VydHMgaWYgbm90IGFscmVhZHkgdGhlcmUKLSAgICAv
LyBubyBlcnJvciBjaGVja2luZyEKLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZShBdHRyaWJ1dGUq
IG5ld0F0dHJpYnV0ZSkgewotICAgICAgICBhc3NlcnQoIWVsZW1lbnQpOwotICAgICAgICBpZiAo
IWdldEF0dHJpYnV0ZUl0ZW0obmV3QXR0cmlidXRlLT5uYW1lKCkpKQotICAgICAgICAgICAgYWRk
QXR0cmlidXRlKG5ld0F0dHJpYnV0ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5ld0F0
dHJpYnV0ZS0+ZGVyZWYoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNNYXBwZWRBdHRy
aWJ1dGVNYXAoKSBjb25zdDsKLQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgaWQoKSBjb25zdCB7
IHJldHVybiBtX2lkOyB9Ci0gICAgdm9pZCBzZXRJRChjb25zdCBBdG9taWNTdHJpbmcmIF9pZCkg
eyBtX2lkID0gX2lkOyB9Ci0gICAgCi0gICAgYm9vbCBtYXBzRXF1aXZhbGVudChjb25zdCBOYW1l
ZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIC8vIHRoaXMgbWV0
aG9kIGlzIGludGVybmFsLCBkb2VzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFsbAotICAgIHZvaWQg
YWRkQXR0cmlidXRlKEF0dHJpYnV0ZSogbmV3QXR0cmlidXRlKTsKLSAgICAvLyB0aGlzIG1ldGhv
ZCBpcyBpbnRlcm5hbCwgZG9lcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwKLSAgICB2b2lkIHJl
bW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKTsKLSAgICB2aXJ0dWFsIHZv
aWQgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgdm9pZCBkZXRhY2hGcm9tRWxlbWVudCgpOwotCi0g
ICAgRWxlbWVudCAqZWxlbWVudDsKLSAgICBBdHRyaWJ1dGUgKiphdHRyczsKLSAgICB1bnNpZ25l
ZCBsZW47Ci0gICAgQXRvbWljU3RyaW5nIG1faWQ7Ci19OwotCi0vLyBXaGVuIGFkZGluZyBuZXcg
ZW50cmllcywgbWFrZSBzdXJlIHRvIGtlZXAgZUxhc3RFbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBs
aXN0LgotZW51bSBNYXBwZWRBdHRyaWJ1dGVFbnRyeSB7IGVOb25lLCBlVW5pdmVyc2FsLCBlUGVy
c2lzdGVudCwgZVJlcGxhY2VkLCBlQmxvY2ssIGVIUiwgZVVub3JkZXJlZExpc3QsIGVMaXN0SXRl
bSwKLSAgICBlVGFibGUsIGVDZWxsLCBlQ2FwdGlvbiwgZUJETywgZVByZSwgZUxhc3RFbnRyeSB9
OwotCi1jbGFzcyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiA6IHB1YmxpYyBDU1NNdXRh
YmxlU3R5bGVEZWNsYXJhdGlvbiB7Ci1wdWJsaWM6Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb24oQ1NTUnVsZSAqcGFyZW50UnVsZSkKLSAgICA6IENTU011dGFibGVTdHlsZURlY2xh
cmF0aW9uKHBhcmVudFJ1bGUpLCBtX2VudHJ5VHlwZShlTm9uZSksIG1fYXR0ck5hbWUoYW55UU5h
bWUoKSkKLSAgICB7fQotICAgIAotICAgIHZpcnR1YWwgfkNTU01hcHBlZEF0dHJpYnV0ZURlY2xh
cmF0aW9uKCk7Ci0KLSAgICB2b2lkIHNldE1hcHBlZFN0YXRlKE1hcHBlZEF0dHJpYnV0ZUVudHJ5
IHR5cGUsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFs
KQotICAgIHsKLSAgICAgICAgbV9lbnRyeVR5cGUgPSB0eXBlOwotICAgICAgICBtX2F0dHJOYW1l
ID0gbmFtZTsKLSAgICAgICAgbV9hdHRyVmFsdWUgPSB2YWw7Ci0gICAgfQotCi1wcml2YXRlOgot
ICAgIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IG1fZW50cnlUeXBlOwotICAgIFF1YWxpZmllZE5hbWUg
bV9hdHRyTmFtZTsKLSAgICBBdG9taWNTdHJpbmcgbV9hdHRyVmFsdWU7Ci19OwotCiBjbGFzcyBN
YXBwZWRBdHRyaWJ1dGUgOiBwdWJsaWMgQXR0cmlidXRlCiB7CiBwdWJsaWM6CkBAIC0zNzksODIg
KzYyLDYgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRp
b24+IG1fc3R5bGVEZWNsOwogfTsKIAotY2xhc3MgTmFtZWRNYXBwZWRBdHRyTWFwIDogcHVibGlj
IE5hbWVkQXR0ck1hcAotewotcHVibGljOgotICAgIE5hbWVkTWFwcGVkQXR0ck1hcChFbGVtZW50
ICplKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICAKLSAgICB2
aXJ0dWFsIGJvb2wgaXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgcGFyc2VDbGFzc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIGNsYXNzQXR0cik7Ci0g
ICAgY29uc3QgQXRvbWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3QgeyByZXR1cm4g
Jm1fY2xhc3NMaXN0OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGhhc01hcHBlZEF0dHJpYnV0
ZXMoKSBjb25zdCB7IHJldHVybiBtX21hcHBlZEF0dHJpYnV0ZUNvdW50ID4gMDsgfQotICAgIHZv
aWQgZGVjbFJlbW92ZWQoKSB7IG1fbWFwcGVkQXR0cmlidXRlQ291bnQtLTsgfQotICAgIHZvaWQg
ZGVjbEFkZGVkKCkgeyBtX21hcHBlZEF0dHJpYnV0ZUNvdW50Kys7IH0KLSAgICAKLSAgICBib29s
IG1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0
OwotICAgIGludCBkZWNsQ291bnQoKSBjb25zdDsKLQotICAgIE1hcHBlZEF0dHJpYnV0ZSogYXR0
cmlidXRlSXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLSAgICB7IHJldHVybiBhdHRycyA/IHN0
YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+KGF0dHJzW2luZGV4XSkgOiAwOyB9Ci0gICAgCi1w
cml2YXRlOgotICAgIEF0b21pY1N0cmluZ0xpc3QgbV9jbGFzc0xpc3Q7Ci0gICAgaW50IG1fbWFw
cGVkQXR0cmlidXRlQ291bnQ7Ci19OwotCi1jbGFzcyBTdHlsZWRFbGVtZW50IDogcHVibGljIEVs
ZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBTdHlsZWRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUm
IHRhZ05hbWUsIERvY3VtZW50ICpkb2MpOwotICAgIHZpcnR1YWwgflN0eWxlZEVsZW1lbnQoKTsK
LQotICAgIHZpcnR1YWwgYm9vbCBpc1N0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9Ci0KLSAgICBOYW1lZE1hcHBlZEF0dHJNYXAqIG1hcHBlZEF0dHJpYnV0ZXMoKSB7IHJldHVy
biBzdGF0aWNfY2FzdDxOYW1lZE1hcHBlZEF0dHJNYXAqPihuYW1lZEF0dHJNYXAuZ2V0KCkpOyB9
Ci0gICAgY29uc3QgTmFtZWRNYXBwZWRBdHRyTWFwKiBtYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3Qg
eyByZXR1cm4gc3RhdGljX2Nhc3Q8TmFtZWRNYXBwZWRBdHRyTWFwKj4obmFtZWRBdHRyTWFwLmdl
dCgpKTsgfQotICAgIGJvb2wgaGFzTWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG5h
bWVkQXR0ck1hcCAmJiBtYXBwZWRBdHRyaWJ1dGVzKCktPmhhc01hcHBlZEF0dHJpYnV0ZXMoKTsg
fQotICAgIGJvb2wgaXNNYXBwZWRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkg
Y29uc3QgeyBNYXBwZWRBdHRyaWJ1dGVFbnRyeSByZXMgPSBlTm9uZTsgbWFwVG9FbnRyeShuYW1l
LCByZXMpOyByZXR1cm4gcmVzICE9IGVOb25lOyB9Ci0KLSAgICB2b2lkIGFkZENTU0xlbmd0aChN
YXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSk7Ci0gICAg
dm9pZCBhZGRDU1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3Qg
U3RyaW5nICZ2YWx1ZSk7Ci0gICAgdm9pZCBhZGRDU1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUq
IGF0dHIsIGludCBpZCwgaW50IHZhbHVlKTsKLSAgICB2b2lkIGFkZENTU1N0cmluZ1Byb3BlcnR5
KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlLCBDU1NQ
cmltaXRpdmVWYWx1ZTo6VW5pdFR5cGVzID0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcp
OwotICAgIHZvaWQgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGlu
dCBpZCwgY29uc3QgU3RyaW5nICZVUkwpOwotICAgIHZvaWQgYWRkQ1NTQ29sb3IoTWFwcGVkQXR0
cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmYyk7Ci0gICAgdm9pZCBjcmVhdGVN
YXBwZWREZWNsKE1hcHBlZEF0dHJpYnV0ZSogYXR0cik7Ci0gICAgCi0gICAgc3RhdGljIENTU01h
cHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0
dHJpYnV0ZUVudHJ5IHR5cGUsIEF0dHJpYnV0ZSogYXR0cik7Ci0gICAgc3RhdGljIHZvaWQgc2V0
TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0eXBlLCBBdHRyaWJ1dGUq
IGF0dHIsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsKTsKLSAgICBzdGF0aWMg
dm9pZCByZW1vdmVNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUs
IGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIGF0dHJW
YWx1ZSk7Ci0gICAgCi0gICAgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGlubGluZVN0eWxl
RGVjbCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lU3R5bGVEZWNsLmdldCgpOyB9Ci0gICAgdmly
dHVhbCBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxl
RGVjbCgpOwotICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRJbmxpbmVTdHlsZURl
Y2woKTsKLSAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSgpOwotICAgIHZvaWQgY3JlYXRl
SW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgdm9pZCBkZXN0cm95SW5saW5lU3R5bGVEZWNsKCk7Ci0g
ICAgdm9pZCBpbnZhbGlkYXRlU3R5bGVBdHRyaWJ1dGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgY29u
c3QgQXRvbWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2
b2lkIGF0dHJpYnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRyLCBib29sIHByZXNlcnZlRGVjbHMg
PSBmYWxzZSk7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0
dHJpYnV0ZSogYXR0cik7Ci0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlm
aWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Owot
ICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IEF0dHJpYnV0ZSogY3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0
cmluZ0ltcGwqIHZhbHVlKTsKLQotcHJvdGVjdGVkOgotICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5
bGVEZWNsYXJhdGlvbj4gbV9pbmxpbmVTdHlsZURlY2w7Ci0gICAgbXV0YWJsZSBib29sIG1faXNT
dHlsZUF0dHJpYnV0ZVZhbGlkIDogMTsKLSAgICBtdXRhYmxlIGJvb2wgbV9zeW5jaHJvbml6aW5n
U3R5bGVBdHRyaWJ1dGUgOiAxOwotfTsKLQogfSAvL25hbWVzcGFjZQogCi0jdW5kZWYgaWQKLQog
I2VuZGlmCkluZGV4OiBkb20vUG9zaXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9Qb3NpdGlv
bi5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgZG9tL1Bvc2l0aW9uLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIlBvc2l0aW9uLmgiCiAKICNpbmNsdWRlICJE
b2N1bWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94
LmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIkRlcHJlY2F0ZWRTdHJpbmcuaCIK
QEAgLTM1LDcgKzM2LDYgQEAKICNpbmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCiAjaW5jbHVkZSAi
UmFuZ2UuaCIKICNpbmNsdWRlICJBYnN0cmFjdFZpZXcuaCIKLSNpbmNsdWRlICJkb21fZWxlbWVu
dGltcGwuaCIKICNpbmNsdWRlICJodG1sZWRpdGluZy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgogI2luY2x1ZGUgIlJlbmRlckZsb3cuaCIKSW5kZXg6IGRvbS9OYW1lZE1hcHBlZEF0dHJNYXAu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGRvbS9OYW1lZE1hcHBlZEF0dHJNYXAuY3BwCShyZXZpc2lvbiAx
MzQ3NykKKysrIGRvbS9OYW1lZE1hcHBlZEF0dHJNYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
MiwxMTkzICsyMiwxOSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBV
U0EuCiAgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJOYW1lZE1hcHBlZEF0dHJN
YXAuaCIKIAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5o
IgotCi0jaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5j
bHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgImNzc19zdHlsZXNoZWV0aW1wbC5oIgotI2luY2x1ZGUg
ImNzc192YWx1ZWltcGwuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVk
ZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2lu
Y2x1ZGUgImRvbV94bWxpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAi
SFRNTFBhcnNlci5oIgotI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5oIgotI2luY2x1ZGUgPHF0ZXh0
c3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotdXNpbmcgbmFtZXNwYWNlIEhUTUxO
YW1lczsKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleSB7Ci0gICAgdWludDE2X3QgdHlwZTsK
LSAgICBTdHJpbmdJbXBsKiBuYW1lOwotICAgIFN0cmluZ0ltcGwqIHZhbHVlOwotICAgIE1hcHBl
ZEF0dHJpYnV0ZUtleShNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0LCBTdHJpbmdJbXBsKiBuLCBTdHJp
bmdJbXBsKiB2KQotICAgICAgICA6IHR5cGUodCksIG5hbWUobiksIHZhbHVlKHYpIHsgfQotfTsK
LQotc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFwcGVkQXR0cmlidXRlS2V5
JiBhLCBjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGIpCi0gICAgeyByZXR1cm4gYS50eXBlID09
IGIudHlwZSAmJiBhLm5hbWUgPT0gYi5uYW1lICYmIGEudmFsdWUgPT0gYi52YWx1ZTsgfSAKLQot
c3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0cyB7Ci0gICAgdHlwZWRlZiBNYXBwZWRBdHRy
aWJ1dGVLZXkgVHJhaXRUeXBlOwotICAgIHN0YXRpYyBjb25zdCBib29sIGVtcHR5VmFsdWVJc1pl
cm8gPSB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSBmYWxz
ZTsKLSAgICBzdGF0aWMgTWFwcGVkQXR0cmlidXRlS2V5IGVtcHR5VmFsdWUoKSB7IHJldHVybiBN
YXBwZWRBdHRyaWJ1dGVLZXkoZU5vbmUsIDAsIDApOyB9Ci0gICAgc3RhdGljIE1hcHBlZEF0dHJp
YnV0ZUtleSBkZWxldGVkVmFsdWUoKSB7IHJldHVybiBNYXBwZWRBdHRyaWJ1dGVLZXkoZUxhc3RF
bnRyeSwgMCwgMCk7IH0KLX07Ci0KLXN0cnVjdCBNYXBwZWRBdHRyaWJ1dGVIYXNoIHsKLSAgICBz
dGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmKTsKLSAgICBzdGF0
aWMgYm9vbCBlcXVhbChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGEsIGNvbnN0IE1hcHBlZEF0
dHJpYnV0ZUtleSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci19OwotCi10eXBlZGVmIEhhc2hNYXA8
TWFwcGVkQXR0cmlidXRlS2V5LCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiosIE1hcHBl
ZEF0dHJpYnV0ZUhhc2gsIE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0cz4gTWFwcGVkQXR0cmlidXRl
RGVjbHM7Ci0KLXN0YXRpYyBNYXBwZWRBdHRyaWJ1dGVEZWNscyogbWFwcGVkQXR0cmlidXRlRGVj
bHMgPSAwOwotCi1BdHRyaWJ1dGUqIEF0dHJpYnV0ZTo6Y2xvbmUoYm9vbCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbmV3IEF0dHJpYnV0ZShtX25hbWUsIG1fdmFsdWUpOwotfQotCi1QYXNzUmVmUHRy
PEF0dHI+IEF0dHJpYnV0ZTo6Y3JlYXRlQXR0cklmTmVlZGVkKEVsZW1lbnQqIGUpCi17Ci0gICAg
UmVmUHRyPEF0dHI+IHIobV9pbXBsKTsKLSAgICBpZiAoIXIpIHsKLSAgICAgICAgciA9IG5ldyBB
dHRyKGUsIGUtPmdldERvY3VtZW50KCksIHRoaXMpOwotICAgICAgICByLT5jcmVhdGVUZXh0Q2hp
bGQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwotfQotCi1BdHRyOjpBdHRyKEVs
ZW1lbnQqIGVsZW1lbnQsIERvY3VtZW50KiBkb2NQdHIsIEF0dHJpYnV0ZSogYSkKLSAgICA6IENv
bnRhaW5lck5vZGUoZG9jUHRyKSwKLSAgICAgIG1fZWxlbWVudChlbGVtZW50KSwKLSAgICAgIG1f
YXR0cmlidXRlKGEpLAotICAgICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQoMCkKLXsKLSAgICBh
c3NlcnQoIW1fYXR0cmlidXRlLT5tX2ltcGwpOwotICAgIG1fYXR0cmlidXRlLT5tX2ltcGwgPSB0
aGlzOwotICAgIG1fc3BlY2lmaWVkID0gdHJ1ZTsKLX0KLQotQXR0cjo6fkF0dHIoKQotewotICAg
IGFzc2VydChtX2F0dHJpYnV0ZS0+bV9pbXBsID09IHRoaXMpOwotICAgIG1fYXR0cmlidXRlLT5t
X2ltcGwgPSAwOwotfQotCi12b2lkIEF0dHI6OmNyZWF0ZVRleHRDaGlsZCgpCi17Ci0gICAgYXNz
ZXJ0KHJlZkNvdW50KCkpOwotICAgIGlmICghbV9hdHRyaWJ1dGUtPnZhbHVlKCkuaXNFbXB0eSgp
KSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBtX2lnbm9yZUNoaWxk
cmVuQ2hhbmdlZCsrOwotICAgICAgICBhcHBlbmRDaGlsZChnZXREb2N1bWVudCgpLT5jcmVhdGVU
ZXh0Tm9kZShtX2F0dHJpYnV0ZS0+dmFsdWUoKS5pbXBsKCkpLCBlYyk7Ci0gICAgICAgIG1faWdu
b3JlQ2hpbGRyZW5DaGFuZ2VkLS07Ci0gICAgfQotfQotCi1TdHJpbmcgQXR0cjo6bm9kZU5hbWUo
KSBjb25zdAotewotICAgIHJldHVybiBuYW1lKCk7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEF0dHI6
Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQVRUUklCVVRFX05PREU7Ci19Ci0KLWNv
bnN0IEF0b21pY1N0cmluZyYgQXR0cjo6bG9jYWxOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9hdHRyaWJ1dGUtPmxvY2FsTmFtZSgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEF0dHI6
Om5hbWVzcGFjZVVSSSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXR0cmlidXRlLT5uYW1lc3Bh
Y2VVUkkoKTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBBdHRyOjpwcmVmaXgoKSBjb25zdAot
ewotICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+cHJlZml4KCk7Ci19Ci0KLXZvaWQgQXR0cjo6c2V0
UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgY2hlY2tTZXRQcmVmaXgoX3ByZWZpeCwgZWMpOwotICAgIGlmIChlYykKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgbV9hdHRyaWJ1dGUtPnNldFByZWZpeChfcHJlZml4KTsKLX0KLQotU3Ry
aW5nIEF0dHI6Om5vZGVWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlKCk7Ci19Ci0K
LXZvaWQgQXR0cjo6c2V0VmFsdWUoIGNvbnN0IFN0cmluZyYgdiwgRXhjZXB0aW9uQ29kZSYgZWMp
Ci17Ci0gICAgZWMgPSAwOwotCi0gICAgLy8gZG8gbm90IGludGVycHJldGUgZW50aXRpZXMgaW4g
dGhlIHN0cmluZywgaXRzIGxpdGVyYWwhCi0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dF
RF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKGlzUmVhZE9u
bHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vICMjIyB3aGF0IHRvIGRvIG9uIDAgPwotICAgIGlm
ICh2LmlzTnVsbCgpKSB7Ci0gICAgICAgIGVjID0gRE9NU1RSSU5HX1NJWkVfRVJSOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGUgPSAwOwotICAgIG1faWdub3JlQ2hpbGRyZW5D
aGFuZ2VkKys7Ci0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGlsZChnZXREb2N1
bWVudCgpLT5jcmVhdGVUZXh0Tm9kZSh2LmltcGwoKSksIGUpOwotICAgIG1faWdub3JlQ2hpbGRy
ZW5DaGFuZ2VkLS07Ci0gICAgCi0gICAgbV9hdHRyaWJ1dGUtPnNldFZhbHVlKHYuaW1wbCgpKTsK
LSAgICBpZiAobV9lbGVtZW50KQotICAgICAgICBtX2VsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQo
bV9hdHRyaWJ1dGUuZ2V0KCkpOwotfQotCi12b2lkIEF0dHI6OnNldE5vZGVWYWx1ZShjb25zdCBT
dHJpbmcmIHYsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIC8vIE5PX01PRElGSUNBVElPTl9B
TExPV0VEX0VSUjogdGFrZW4gY2FyZSBvZiBieSBzZXRWYWx1ZSgpCi0gICAgc2V0VmFsdWUodiwg
ZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IEF0dHI6OmNsb25lTm9kZShib29sIC8qZGVlcCov
KQotewotICAgIFJlZlB0cjxBdHRyPiBjbG9uZSA9IG5ldyBBdHRyKDAsIGdldERvY3VtZW50KCks
IG1fYXR0cmlidXRlLT5jbG9uZSgpKTsKLSAgICBjbG9uZUNoaWxkTm9kZXMoY2xvbmUuZ2V0KCkp
OwotICAgIHJldHVybiBjbG9uZS5yZWxlYXNlKCk7Ci19Ci0KLS8vIERPTSBTZWN0aW9uIDEuMS4x
Ci1ib29sIEF0dHI6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0
Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBURVhUX05PREU6Ci0gICAgICAgIGNhc2UgRU5USVRZ
X1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEF0dHI6OmNo
aWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgTm9kZTo6Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0g
ICAgaWYgKG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkID4gMCkKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgaW5jbHVkZSBlbnRpdHkgcmVmZXJlbmNlcyBpbiB0
aGUgdmFsdWUKLSAgICAKLSAgICBTdHJpbmcgdmFsID0gIiI7Ci0gICAgZm9yIChOb2RlICpuID0g
Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAobi0+
aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFsICs9IHN0YXRpY19jYXN0PFRleHQgKj4obikt
PmRhdGEoKTsKLSAgICB9Ci0gICAgCi0gICAgbV9hdHRyaWJ1dGUtPnNldFZhbHVlKHZhbC5pbXBs
KCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAgICAgIG1fZWxlbWVudC0+YXR0cmlidXRlQ2hh
bmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0KLVN0cmluZyBBdHRyOjp0b1N0cmluZygpIGNv
bnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdDsKLQotICAgIHJlc3VsdCArPSBub2RlTmFtZSgpOwot
Ci0gICAgLy8gRklYTUU6IHN1YnN0aXR1dGUgZW50aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMgb2Yg
IiBvciAnIC0tCi0gICAgLy8gbWF5YmUgZWFzaWVyIHRvIGp1c3QgdXNlIHRleHQgdmFsdWUgYW5k
IGlnbm9yZSBleGlzdGluZwotICAgIC8vIGVudGl0eSByZWZzPwotCi0gICAgaWYgKGZpcnN0Q2hp
bGQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPVwiIjsKLQotICAgICAgICBmb3Ig
KE5vZGUgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxk
LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQtPnRvU3RyaW5n
KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCArPSAiXCIiOwotICAgIH0K
LQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmbmRl
ZiBOREVCVUcKLXN0cnVjdCBFbGVtZW50SW1wbENvdW50ZXIgCi17IAotICAgIHN0YXRpYyBpbnQg
Y291bnQ7IAotICAgIH5FbGVtZW50SW1wbENvdW50ZXIoKSB7IC8qIGlmIChjb3VudCAhPSAwKSBm
cHJpbnRmKHN0ZGVyciwgIkxFQUs6ICVkIEVsZW1lbnRcbiIsIGNvdW50KTsgKi8gfSAKLX07Ci1p
bnQgRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLXN0YXRpYyBFbGVtZW50SW1wbENvdW50ZXIg
ZWxlbWVudEltcGxDb3VudGVyOwotI2VuZGlmIE5ERUJVRwotCi1FbGVtZW50OjpFbGVtZW50KGNv
bnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lLCBEb2N1bWVudCAqZG9jKQotICAgIDogQ29udGFpbmVy
Tm9kZShkb2MpLCBtX3RhZ05hbWUocU5hbWUpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgICsrRWxl
bWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRpZgotfQotCi1FbGVtZW50Ojp+RWxlbWVudCgp
Ci17Ci0jaWZuZGVmIE5ERUJVRwotICAgIC0tRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNl
bmRpZgotICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZGV0YWNo
RnJvbUVsZW1lbnQoKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBFbGVtZW50OjpjbG9uZU5vZGUo
Ym9vbCBkZWVwKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIFJlZlB0cjxFbGVt
ZW50PiBjbG9uZSA9IGdldERvY3VtZW50KCktPmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkko
KSwgbm9kZU5hbWUoKSwgZWMpOwotICAgIGFzc2VydCghZWMpOwotICAgIAotICAgIC8vIGNsb25l
IGF0dHJpYnV0ZXMKLSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAqY2xvbmUtPmF0dHJp
YnV0ZXMoKSA9ICpuYW1lZEF0dHJNYXA7Ci0KLSAgICBjbG9uZS0+Y29weU5vbkF0dHJpYnV0ZVBy
b3BlcnRpZXModGhpcyk7Ci0gICAgCi0gICAgaWYgKGRlZXApCi0gICAgICAgIGNsb25lQ2hpbGRO
b2RlcyhjbG9uZS5nZXQoKSk7Ci0KLSAgICByZXR1cm4gY2xvbmUucmVsZWFzZSgpOwotfQotCi12
b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBF
eGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIG5h
bWVkQXR0ck1hcC0+cmVtb3ZlTmFtZWRJdGVtKG5hbWUsIGVjKTsKLSAgICAgICAgaWYgKGVjID09
IE5PVF9GT1VORF9FUlIpCi0gICAgICAgICAgICBlYyA9IDA7Ci0gICAgfQotfQotCi12b2lkIEVs
ZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIHNldEF0dHJpYnV0
ZShuYW1lLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0KLQotLy8gVmlydHVhbCBmdW5jdGlvbiwgZGVm
aW5lZCBpbiBiYXNlIGNsYXNzLgotTmFtZWRBdHRyTWFwICpFbGVtZW50OjphdHRyaWJ1dGVzKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gYXR0cmlidXRlcyhmYWxzZSk7Ci19Ci0KLU5hbWVkQXR0ck1h
cCogRWxlbWVudDo6YXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBjb25zdAotewotICAgIHVwZGF0
ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKTsKLSAgICBpZiAoIXJlYWRvbmx5ICYmICFuYW1lZEF0
dHJNYXApCi0gICAgICAgIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpOwotICAgIHJldHVybiBuYW1lZEF0
dHJNYXAuZ2V0KCk7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEVsZW1lbnQ6Om5vZGVUeXBlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gRUxFTUVOVF9OT0RFOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmdM
aXN0KiBFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBjb25zdAotewotICAgIHJldHVybiAwOwotfQot
Ci1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldElEQXR0cmlidXRlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFwLT5pZCgpIDogbnVsbEF0b207
Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5h
bWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZU5TKG5hbWUubmFtZXNwYWNlVVJJ
KCksIG5hbWUubG9jYWxOYW1lKCkpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6
OmdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIGlm
IChuYW1lID09IHN0eWxlQXR0cikKLSAgICAgICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRl
ZCgpOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgaWYgKEF0dHJpYnV0ZSogYSA9
IG5hbWVkQXR0ck1hcC0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKSkKLSAgICAgICAgICAgIHJldHVy
biBhLT52YWx1ZSgpOwotCi0gICAgcmV0dXJuIG51bGxBdG9tOwotfQotCi12b2lkIEVsZW1lbnQ6
OnNjcm9sbEludG9WaWV3KGJvb2wgYWxpZ25Ub1RvcCkgCi17Ci0gICAgSW50UmVjdCBib3VuZHMg
PSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIC8v
IEFsaWduIHRvIHRoZSB0b3AgLyBib3R0b20gYW5kIHRvIHRoZSBjbG9zZXN0IGVkZ2UuCi0gICAg
ICAgIGlmIChhbGlnblRvVG9wKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5
ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0Vk
Z2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnblRvcEFsd2F5cyk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zp
c2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxh
eWVyOjpnQWxpZ25Cb3R0b21BbHdheXMpOwotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpzY3Jv
bGxJbnRvVmlld0lmTmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQpCi17Ci0gICAgSW50UmVjdCBi
b3VuZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAg
ICAgIGlmIChjZW50ZXJJZk5lZWRlZCkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2lu
Z0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWdu
Q2VudGVySWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25DZW50ZXJJZk5lZWRlZCk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9s
bFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQs
IFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCk7Ci0gICAgfQotfQotCi1zdGF0aWMg
aW5saW5lIGJvb2wgaW5IVE1MRG9jdW1lbnQoY29uc3QgRWxlbWVudCogZSkKLXsKLSAgICByZXR1
cm4gZSAmJiBlLT5nZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpOwotfQotCi1jb25zdCBB
dG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNv
bnN0Ci17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFt
ZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUo
bnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7Ci19Ci0KLWNvbnN0IEF0b21p
Y1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VV
UkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNl
VVJJLmltcGwoKSkpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAg
IGlmICghRG9jdW1lbnQ6OmlzVmFsaWROYW1lKG5hbWUpKSB7Ci0gICAgICAgIGVjID0gSU5WQUxJ
RF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZyBsb2Nh
bE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAg
c2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51
bGxBdG9tKSwgdmFsdWUuaW1wbCgpLCBlYyk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlLCBFeGNlcHRp
b25Db2RlJiBlYykKLXsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVu
dCgpLT5pbmNET01UcmVlVmVyc2lvbigpOwotCi0gICAgLy8gYWxsb2NhdGUgYXR0cmlidXRlbWFw
IGlmIG5lY2Vzc2FyeQotICAgIEF0dHJpYnV0ZSogb2xkID0gYXR0cmlidXRlcyhmYWxzZSktPmdl
dEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9F
UlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKG5hbWVkQXR0ck1h
cC0+aXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURf
RVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gaWRBdHRyKQot
ICAgICAgICB1cGRhdGVJZChvbGQgPyBvbGQtPnZhbHVlKCkgOiBudWxsQXRvbSwgdmFsdWUpOwot
ICAgIAotICAgIGlmIChvbGQgJiYgIXZhbHVlKQotICAgICAgICBuYW1lZEF0dHJNYXAtPnJlbW92
ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICBlbHNlIGlmICghb2xkICYmIHZhbHVlKQotICAgICAgICBu
YW1lZEF0dHJNYXAtPmFkZEF0dHJpYnV0ZShjcmVhdGVBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTsK
LSAgICBlbHNlIGlmIChvbGQgJiYgdmFsdWUpIHsKLSAgICAgICAgb2xkLT5zZXRWYWx1ZSh2YWx1
ZSk7Ci0gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQob2xkKTsKLSAgICB9Ci19Ci0KLUF0dHJpYnV0
ZSogRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0
cmluZ0ltcGwqIHZhbHVlKQotewotICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG5hbWUsIHZhbHVl
KTsKLX0KLQotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGVNYXAoTmFtZWRBdHRyTWFwKiBsaXN0
KQotewotICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPmluY0RP
TVRyZWVWZXJzaW9uKCk7Ci0KLSAgICAvLyBJZiBzZXR0aW5nIHRoZSB3aG9sZSBtYXAgY2hhbmdl
cyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwgdXBkYXRlSWQuCi0KLSAgICBBdHRy
aWJ1dGUgKm9sZElkID0gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFwLT5nZXRBdHRyaWJ1dGVJ
dGVtKGlkQXR0cikgOiAwOwotICAgIEF0dHJpYnV0ZSAqbmV3SWQgPSBsaXN0ID8gbGlzdC0+Z2V0
QXR0cmlidXRlSXRlbShpZEF0dHIpIDogMDsKLQotICAgIGlmIChvbGRJZCB8fCBuZXdJZCkKLSAg
ICAgICAgdXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/
IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAg
ICAgICAgbmFtZWRBdHRyTWFwLT5lbGVtZW50ID0gMDsKLQotICAgIG5hbWVkQXR0ck1hcCA9IGxp
c3Q7Ci0KLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZWxl
bWVudCA9IHRoaXM7Ci0gICAgICAgIHVuc2lnbmVkIGxlbiA9IG5hbWVkQXR0ck1hcC0+bGVuZ3Ro
KCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAg
ICAgIGF0dHJpYnV0ZUNoYW5nZWQobmFtZWRBdHRyTWFwLT5hdHRyc1tpXSk7Ci0gICAgICAgIC8v
IEZJWE1FOiBXaGF0IGFib3V0IGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGluIHRoZSBvbGQgbWFwIHRo
YXQgYXJlIG5vdCBpbiB0aGUgbmV3IG1hcD8KLSAgICB9Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFz
QXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgp
OwotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgJiYgbmFtZWRBdHRyTWFwLT5sZW5ndGgoKSA+IDA7
Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1f
dGFnTmFtZS50b1N0cmluZygpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldFByZWZpeChjb25zdCBB
dG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGNoZWNrU2V0
UHJlZml4KF9wcmVmaXgsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybjsKLQotICAg
IG1fdGFnTmFtZS5zZXRQcmVmaXgoX3ByZWZpeCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6Y3JlYXRl
QXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICBuYW1lZEF0dHJNYXAgPSBuZXcgTmFtZWRBdHRy
TWFwKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KHRoaXMpKTsKLX0KLQotYm9vbCBFbGVtZW50Ojppc1VS
TEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1SZW5kZXJTdHlsZSAqRWxlbWVudDo6Y3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5kZXJP
YmplY3QgKnBhcmVudFJlbmRlcmVyKQotewotICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5zdHls
ZVNlbGVjdG9yKCktPmNyZWF0ZVN0eWxlRm9yRWxlbWVudCh0aGlzKTsKLX0KLQotUmVuZGVyT2Jq
ZWN0ICpFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0
eWxlICpzdHlsZSkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkg
PT0gdGhpcyAmJiBzdHlsZS0+ZGlzcGxheSgpID09IE5PTkUpIHsKLSAgICAgICAgLy8gSWdub3Jl
IGRpc3BsYXk6IG5vbmUgb24gcm9vdCBlbGVtZW50cy4gIEZvcmNlIGEgZGlzcGxheSBvZiBibG9j
ayBpbiB0aGF0IGNhc2UuCi0gICAgICAgIFJlbmRlckJsb2NrKiByZXN1bHQgPSBuZXcgKGFyZW5h
KSBSZW5kZXJCbG9jayh0aGlzKTsKLSAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0LT5zZXRTdHls
ZShzdHlsZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBSZW5k
ZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci19Ci0KLQotdm9pZCBFbGVtZW50
OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgLy8gbmVlZCB0byBkbyBzdXBlcmNsYXNz
IHByb2Nlc3NpbmcgZmlyc3Qgc28gaW5Eb2N1bWVudCgpIGlzIHRydWUKLSAgICAvLyBieSB0aGUg
dGltZSB3ZSByZWFjaCB1cGRhdGVJZAotICAgIENvbnRhaW5lck5vZGU6Omluc2VydGVkSW50b0Rv
Y3VtZW50KCk7Ci0KLSAgICBpZiAoaGFzSUQoKSkgewotICAgICAgICBOYW1lZEF0dHJNYXAqIGF0
dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICAgICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgICAg
ICBBdHRyaWJ1dGUqIGlkSXRlbSA9IGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0g
ICAgICAgICAgICBpZiAoaWRJdGVtICYmICFpZEl0ZW0tPmlzTnVsbCgpKQotICAgICAgICAgICAg
ICAgIHVwZGF0ZUlkKG51bGxBdG9tLCBpZEl0ZW0tPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAg
fQotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmICho
YXNJRCgpKSB7Ci0gICAgICAgIE5hbWVkQXR0ck1hcCogYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUp
OwotICAgICAgICBpZiAoYXR0cnMpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSogaWRJdGVtID0g
YXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLSAgICAgICAgICAgIGlmIChpZEl0ZW0g
JiYgIWlkSXRlbS0+aXNOdWxsKCkpCi0gICAgICAgICAgICAgICAgdXBkYXRlSWQoaWRJdGVtLT52
YWx1ZSgpLCBudWxsQXRvbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDb250YWluZXJOb2Rl
OjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6YXR0YWNoKCkKLXsK
LSNpZiBTUEVFRF9ERUJVRyA8IDEKLSAgICBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCk7Ci0jZW5k
aWYKLSAgICBDb250YWluZXJOb2RlOjphdHRhY2goKTsKLX0KLQotdm9pZCBFbGVtZW50OjpyZWNh
bGNTdHlsZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkKLXsKLSAgICAvLyAjIyMgc2hvdWxkIGdvIGF3
YXkgYW5kIGJlIGRvbmUgaW4gcmVuZGVyb2JqZWN0Ci0gICAgUmVuZGVyU3R5bGUqIF9zdHlsZSA9
IHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5zdHlsZSgpIDogMDsKLSAgICBib29sIGhhc1BhcmVu
dFJlbmRlcmVyID0gcGFyZW50KCkgPyBwYXJlbnQoKS0+cmVuZGVyZXIoKSA6IGZhbHNlOwotICAg
IAotICAgIGlmICggaGFzUGFyZW50UmVuZGVyZXIgJiYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IGNo
YW5nZWQoKSkgKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlICpuZXdTdHlsZSA9IGdldERvY3VtZW50
KCktPnN0eWxlU2VsZWN0b3IoKS0+Y3JlYXRlU3R5bGVGb3JFbGVtZW50KHRoaXMpOwotICAgICAg
ICBTdHlsZUNoYW5nZSBjaCA9IGRpZmYoIF9zdHlsZSwgbmV3U3R5bGUgKTsKLSAgICAgICAgaWYg
KGNoID09IERldGFjaCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkKCkpIGRldGFjaCgpOwot
ICAgICAgICAgICAgLy8gIyMjIFN1Ym9wdGltYWwuIFN0eWxlIGdldHMgY2FsY3VsYXRlZCBhZ2Fp
bi4KLSAgICAgICAgICAgIGF0dGFjaCgpOwotICAgICAgICAgICAgLy8gYXR0YWNoIHJlY2FsdWxh
dGVzIHRoZSBzdHlsZSBmb3IgYWxsIGNoaWxkcmVuLiBObyBuZWVkIHRvIGRvIGl0IHR3aWNlLgot
ICAgICAgICAgICAgc2V0Q2hhbmdlZCggZmFsc2UgKTsKLSAgICAgICAgICAgIHNldEhhc0NoYW5n
ZWRDaGlsZCggZmFsc2UgKTsKLSAgICAgICAgICAgIG5ld1N0eWxlLT5kZXJlZihnZXREb2N1bWVu
dCgpLT5yZW5kZXJBcmVuYSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg
ICAgICBlbHNlIGlmIChjaCAhPSBOb0NoYW5nZSkgewotICAgICAgICAgICAgaWYgKHJlbmRlcmVy
KCkgJiYgbmV3U3R5bGUpCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0U3R5bGUobmV3
U3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoYW5nZWQoKSAmJiByZW5kZXJl
cigpICYmIG5ld1N0eWxlICYmIChnZXREb2N1bWVudCgpLT51c2VzU2libGluZ1J1bGVzKCkgfHwg
Z2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygpKSkgewotICAgICAgICAgICAgLy8g
QWx0aG91Z2ggbm8gY2hhbmdlIG9jY3VycmVkLCB3ZSB1c2UgdGhlIG5ldyBzdHlsZSBzbyB0aGF0
IHRoZSBjb3VzaW4gc3R5bGUgc2hhcmluZyBjb2RlIHdvbid0IGdldAotICAgICAgICAgICAgLy8g
Zm9vbGVkIGludG8gYmVsaWV2aW5nIHRoaXMgc3R5bGUgaXMgdGhlIHNhbWUuICBUaGlzIGlzIG9u
bHkgbmVjZXNzYXJ5IGlmIHRoZSBkb2N1bWVudCBhY3R1YWxseSB1c2VzCi0gICAgICAgICAgICAv
LyBzaWJsaW5nL2Rlc2NlbmRhbnQgcnVsZXMsIHNpbmNlIG90aGVyd2lzZSBpdCBpc24ndCBwb3Nz
aWJsZSBmb3IgYW5jZXN0b3Igc3R5bGVzIHRvIGFmZmVjdCBzaGFyaW5nIG9mCi0gICAgICAgICAg
ICAvLyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldFN0eWxlSW50ZXJu
YWwobmV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3U3R5bGUtPmRlcmVmKGdldERv
Y3VtZW50KCktPnJlbmRlckFyZW5hKCkpOwotCi0gICAgICAgIGlmICggY2hhbmdlICE9IEZvcmNl
KSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygp
KQotICAgICAgICAgICAgICAgIGNoYW5nZSA9IEZvcmNlOwotICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIGNoYW5nZSA9IGNoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChO
b2RlICpuID0gZmFzdEZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAg
ICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IG4tPmlzVGV4dE5vZGUoKSB8fCBuLT5oYXND
aGFuZ2VkQ2hpbGQoKSB8fCBuLT5jaGFuZ2VkKCkpCi0gICAgICAgICAgICBuLT5yZWNhbGNTdHls
ZShjaGFuZ2UpOwotICAgIH0KLQotICAgIHNldENoYW5nZWQoIGZhbHNlICk7Ci0gICAgc2V0SGFz
Q2hhbmdlZENoaWxkKCBmYWxzZSApOwotfQotCi1ib29sIEVsZW1lbnQ6OmNoaWxkVHlwZUFsbG93
ZWQoTm9kZVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBF
TEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgVEVYVF9OT0RFOgotICAgICAgICBjYXNlIENPTU1F
TlRfTk9ERToKLSAgICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAg
ICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVO
Q0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12
b2lkIEVsZW1lbnQ6OmRpc3BhdGNoQXR0clJlbW92YWxFdmVudChBdHRyaWJ1dGUqKQotewotICAg
IGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSNpZiAwCi0gICAgaWYgKCFnZXRE
b2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnQ6OkRPTUFUVFJNT0RJRklFRF9MSVNU
RU5FUikpCi0gICAgICAgIHJldHVybjsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBk
aXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50KERPTUF0dHJNb2RpZmllZEV2ZW50LCB0cnVl
LCBmYWxzZSwgYXR0ciwgYXR0ci0+dmFsdWUoKSwKLSAgICAgICAgYXR0ci0+dmFsdWUoKSwgZ2V0
RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0aW9uRXZlbnQ6OlJFTU9WQUwp
LCBlYyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBFbGVtZW50OjpkaXNwYXRjaEF0dHJBZGRpdGlvbkV2
ZW50KEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRk
ZW4oKSk7Ci0jaWYgMAotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKERv
Y3VtZW50OjpET01BVFRSTU9ESUZJRURfTElTVEVORVIpKQotICAgICAgICByZXR1cm47Ci0gICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVu
dChET01BdHRyTW9kaWZpZWRFdmVudCwgdHJ1ZSwgZmFsc2UsIGF0dHIsIGF0dHItPnZhbHVlKCks
Ci0gICAgICAgIGF0dHItPnZhbHVlKCksZ2V0RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQo
KSksIE11dGF0aW9uRXZlbnQ6OkFERElUSU9OKSwgZWMpOwotI2VuZGlmCi19Ci0KLVN0cmluZyBF
bGVtZW50OjpvcGVuVGFnU3RhcnRUb1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3Vs
dCA9ICI8IiArIG5vZGVOYW1lKCk7Ci0KLSAgICBOYW1lZEF0dHJNYXAgKmF0dHJNYXAgPSBhdHRy
aWJ1dGVzKHRydWUpOwotCi0gICAgaWYgKGF0dHJNYXApIHsKLSAgICAgICAgdW5zaWduZWQgbnVt
QXR0cnMgPSBhdHRyTWFwLT5sZW5ndGgoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG51bUF0dHJzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAiICI7Ci0KLSAgICAg
ICAgICAgIEF0dHJpYnV0ZSAqYXR0cmlidXRlID0gYXR0ck1hcC0+YXR0cmlidXRlSXRlbShpKTsK
LSAgICAgICAgICAgIHJlc3VsdCArPSBhdHRyaWJ1dGUtPm5hbWUoKS50b1N0cmluZygpOwotICAg
ICAgICAgICAgaWYgKCFhdHRyaWJ1dGUtPnZhbHVlKCkuaXNOdWxsKCkpIHsKLSAgICAgICAgICAg
ICAgICByZXN1bHQgKz0gIj1cIiI7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHN1YnN0aXR1
dGUgZW50aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMgb2YgIiBvciAnCi0gICAgICAgICAgICAgICAg
cmVzdWx0ICs9IGF0dHJpYnV0ZS0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0g
IlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojp0b1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5n
IHJlc3VsdCA9IG9wZW5UYWdTdGFydFRvU3RyaW5nKCk7Ci0KLSAgICBpZiAoaGFzQ2hpbGROb2Rl
cygpKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPiI7Ci0KLSAgICAgICAgZm9yIChOb2RlICpjaGls
ZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxp
bmcoKSkgewotICAgICAgICAgICAgcmVzdWx0ICs9IGNoaWxkLT50b1N0cmluZygpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgcmVzdWx0ICs9ICI8LyI7Ci0gICAgICAgIHJlc3VsdCArPSBub2RlTmFt
ZSgpOwotICAgICAgICByZXN1bHQgKz0gIj4iOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3Vs
dCArPSAiIC8+IjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVsZW1l
bnQ6OnVwZGF0ZUlkKGNvbnN0IEF0b21pY1N0cmluZyYgb2xkSWQsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmV3SWQpCi17Ci0gICAgaWYgKCFpbkRvY3VtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGlmIChvbGRJZCA9PSBuZXdJZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnQq
IGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFvbGRJZC5pc0VtcHR5KCkpCi0gICAgICAg
IGRvYy0+cmVtb3ZlRWxlbWVudEJ5SWQob2xkSWQsIHRoaXMpOwotICAgIGlmICghbmV3SWQuaXNF
bXB0eSgpKQotICAgICAgICBkb2MtPmFkZEVsZW1lbnRCeUlkKG5ld0lkLCB0aGlzKTsKLX0KLQot
I2lmbmRlZiBOREVCVUcKLXZvaWQgRWxlbWVudDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBE
ZXByZWNhdGVkU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlm
TmVlZGVkKCk7Ci0gICAgaWYgKG5hbWVkQXR0ck1hcCkgewotICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbmFtZWRBdHRyTWFwLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBB
dHRyaWJ1dGUgKmF0dHIgPSBuYW1lZEF0dHJNYXAtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAg
ICAgICAqc3RyZWFtIDw8ICIgIiA8PCBhdHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuZGVwcmVjYXRl
ZFN0cmluZygpLmFzY2lpKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIj1cIiIgPDwgYXR0ci0+
dmFsdWUoKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSA8PCAiXCIiOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgQ29udGFpbmVyTm9kZTo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNlbmRpZgot
Ci0jaWZuZGVmIE5ERUJVRwotdm9pZCBFbGVtZW50Ojpmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpi
dWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0OwotICAg
IFN0cmluZyBzOwotICAgIAotICAgIHMgPSBub2RlTmFtZSgpOwotICAgIGlmIChzLmxlbmd0aCgp
ID4gMCkgewotICAgICAgICByZXN1bHQgKz0gczsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgcyA9
IGdldEF0dHJpYnV0ZShpZEF0dHIpOwotICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAgICAg
ICBpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiOyAiOwot
ICAgICAgICByZXN1bHQgKz0gImlkPSI7Ci0gICAgICAgIHJlc3VsdCArPSBzOwotICAgIH0KLSAg
ICAgICAgICAKLSAgICBzID0gZ2V0QXR0cmlidXRlKGNsYXNzQXR0cik7Ci0gICAgaWYgKHMubGVu
Z3RoKCkgPiAwKSB7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAg
ICAgcmVzdWx0ICs9ICI7ICI7Ci0gICAgICAgIHJlc3VsdCArPSAiY2xhc3M9IjsKLSAgICAgICAg
cmVzdWx0ICs9IHM7Ci0gICAgfQotICAgICAgICAgIAotICAgIHN0cm5jcHkoYnVmZmVyLCByZXN1
bHQuZGVwcmVjYXRlZFN0cmluZygpLmxhdGluMSgpLCBsZW5ndGggLSAxKTsKLX0KLSNlbmRpZgot
Ci1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OnNldEF0dHJpYnV0ZU5vZGUoQXR0ciAqYXR0ciwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgQVNTRVJUKGF0dHIpOwotICAgIHJldHVybiBzdGF0
aWNfcG9pbnRlcl9jYXN0PEF0dHI+KGF0dHJpYnV0ZXMoZmFsc2UpLT5zZXROYW1lZEl0ZW0oYXR0
ciwgZWMpKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGVO
b2RlKEF0dHIgKmF0dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghYXR0ciB8fCBh
dHRyLT5vd25lckVsZW1lbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VS
UjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChnZXREb2N1bWVudCgpICE9IGF0
dHItPmdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRy
aWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAg
cmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMtPnJlbW92ZU5hbWVkSXRlbShh
dHRyLT5xdWFsaWZpZWROYW1lKCksIGVjKSk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmli
dXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVk
TmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3Ry
aW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlmICghRG9jdW1lbnQ6OnBhcnNlUXVhbGlmaWVk
TmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSkpIHsKLSAgICAgICAgZWMgPSBJ
TlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0QXR0
cmlidXRlKFF1YWxpZmllZE5hbWUocHJlZml4LmltcGwoKSwgbG9jYWxOYW1lLmltcGwoKSwgbmFt
ZXNwYWNlVVJJLmltcGwoKSksIHZhbHVlLmltcGwoKSwgZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6
OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQot
ewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93
ZXIoKSA6IG5hbWU7Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20s
IGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJl
bW92ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcm
IGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1
YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBs
KCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6Z2V0QXR0cmlidXRlTm9k
ZShjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJp
YnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3Ry
aW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFt
ZTsKLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRyPihhdHRycy0+Z2V0TmFtZWRJ
dGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSkp
OwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OmdldEF0dHJpYnV0ZU5vZGVOUyhjb25z
dCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpCi17Ci0gICAg
TmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4o
YXR0cnMtPmdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1w
bCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSkpOwotfQotCi1ib29sIEVsZW1lbnQ6Omhhc0F0dHJp
YnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRy
cyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUu
bG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKFF1YWxp
ZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7Ci19Ci0KLWJv
b2wgRWxlbWVudDo6aGFzQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNv
bnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMg
PSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICByZXR1cm4gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oUXVhbGlmaWVkTmFtZShudWxs
QXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1DU1NT
dHlsZURlY2xhcmF0aW9uICpFbGVtZW50OjpzdHlsZSgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0K
LXZvaWQgRWxlbWVudDo6Zm9jdXMoKQotewotICAgIERvY3VtZW50KiBkb2MgPSBnZXREb2N1bWVu
dCgpOwotICAgIGRvYy0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsK
LSAgICAgICAgZG9jLT5zZXRGb2N1c05vZGUodGhpcyk7Ci0gICAgICAgIGlmIChyb290RWRpdGFi
bGVFbGVtZW50KCkgPT0gdGhpcykgewotICAgICAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBy
ZXN0b3JlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgdGhlcmUgaXMgb25lLCBpbnN0ZWFkIG9m
IGFsd2F5cyBzZWxlY3RpbmcgYWxsLgotICAgICAgICAgICAgaWYgKGRvYy0+ZnJhbWUoKS0+c2Vs
ZWN0Q29udGVudHNPZk5vZGUodGhpcykpCi0gICAgICAgICAgICAgICAgZG9jLT5mcmFtZSgpLT5y
ZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlcigpICYmICFyZW5k
ZXJlcigpLT5pc1dpZGdldCgpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5
ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShnZXRSZWN0KCkpOwotICAgIH0KLX0KLQotdm9pZCBF
bGVtZW50OjpibHVyKCkKLXsKLSAgICBEb2N1bWVudCogZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAg
ICBpZiAoZG9jLT5mb2N1c05vZGUoKSA9PSB0aGlzKQotICAgICAgICBkb2MtPnNldEZvY3VzTm9k
ZSgwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OYW1lZEF0dHJNYXA6Ok5hbWVkQXR0
ck1hcChFbGVtZW50ICplKQotICAgIDogZWxlbWVudChlKQotICAgICwgYXR0cnMoMCkKLSAgICAs
IGxlbigwKQotewotfQotCi1OYW1lZEF0dHJNYXA6On5OYW1lZEF0dHJNYXAoKQotewotICAgIE5h
bWVkQXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCk7IC8vIHZpcnR1YWwgbWV0aG9kLCBzbyBxdWFs
aWZ5IGp1c3QgdG8gYmUgZXhwbGljaXQKLX0KLQotYm9vbCBOYW1lZEF0dHJNYXA6OmlzTWFwcGVk
QXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVBhc3NSZWZQ
dHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1lKSBj
b25zdAotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudChlbGVtZW50KSA/
IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGdldE5hbWVkSXRlbShRdWFsaWZpZWRO
YW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRvbSkpOwotfQotCi1QYXNzUmVm
UHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6Z2V0TmFtZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBuYW1l
c3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIHJldHVybiBn
ZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFt
ZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6
cmVtb3ZlTmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KGVsZW1lbnQpID8gbmFtZS5s
b3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5hbWUo
bnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQotCi1QYXNzUmVm
UHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBu
YW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxv
Y2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQ
dHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYg
bmFtZSkgY29uc3QKLXsKLSAgICBBdHRyaWJ1dGUqIGEgPSBnZXRBdHRyaWJ1dGVJdGVtKG5hbWUp
OwotICAgIGlmICghYSkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gYS0+Y3JlYXRlQXR0cklmTmVl
ZGVkKGVsZW1lbnQpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6c2V0TmFt
ZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFlbGVtZW50
KSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBt
YXAgaXMgcmVhZG9ubHkuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5P
X01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0g
ICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgYXJnIHdhcyBjcmVhdGVkIGZyb20g
YSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGlzIG1hcC4K
LSAgICBpZiAoYXJnLT5nZXREb2N1bWVudCgpICE9IGVsZW1lbnQtPmdldERvY3VtZW50KCkpIHsK
LSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLQotICAgIC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhyb3cgYSBISUVSQVJDSFlfUkVR
VUVTVF9FUlJPUiBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBub24tYXR0cmlidXRlIG5vZGUKLSAg
ICBpZiAoIWFyZy0+aXNBdHRyaWJ1dGVOb2RlKCkpIHsKLSAgICAgICAgZWMgPSBISUVSQVJDSFlf
UkVRVUVTVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBBdHRyICphdHRyID0g
c3RhdGljX2Nhc3Q8QXR0cio+KGFyZyk7Ci0KLSAgICBBdHRyaWJ1dGUqIGEgPSBhdHRyLT5hdHRy
KCk7Ci0gICAgQXR0cmlidXRlKiBvbGQgPSBnZXRBdHRyaWJ1dGVJdGVtKGEtPm5hbWUoKSk7Ci0g
ICAgaWYgKG9sZCA9PSBhKQotICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGU+KGFyZyk7IC8vIHdl
IGtub3cgYWJvdXQgaXQgYWxyZWFkeQotCi0gICAgLy8gSU5VU0VfQVRUUklCVVRFX0VSUjogUmFp
c2VkIGlmIGFyZyBpcyBhbiBBdHRyIHRoYXQgaXMgYWxyZWFkeSBhbiBhdHRyaWJ1dGUgb2YgYW5v
dGhlciBFbGVtZW50IG9iamVjdC4KLSAgICAvLyBUaGUgRE9NIHVzZXIgbXVzdCBleHBsaWNpdGx5
IGNsb25lIEF0dHIgbm9kZXMgdG8gcmUtdXNlIHRoZW0gaW4gb3RoZXIgZWxlbWVudHMuCi0gICAg
aWYgKGF0dHItPm93bmVyRWxlbWVudCgpKSB7Ci0gICAgICAgIGVjID0gSU5VU0VfQVRUUklCVVRF
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGEtPm5hbWUoKSA9PSBp
ZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlkKG9sZCA/IG9sZC0+dmFsdWUoKSA6IG51
bGxBdG9tLCBhLT52YWx1ZSgpKTsKLQotICAgIC8vICMjIyBzbGlnaHRseSBpbmVmZmljaWVudCAt
IHJlc2l6ZXMgYXR0cmlidXRlIGFycmF5IHR3aWNlLgotICAgIFJlZlB0cjxOb2RlPiByOwotICAg
IGlmIChvbGQpIHsKLSAgICAgICAgciA9IG9sZC0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQp
OwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUoYS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICBhZGRB
dHRyaWJ1dGUoYSk7Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwotfQotCi0vLyBUaGUgRE9NMiBz
cGVjIGRvZXNuJ3Qgc2F5IHRoYXQgcmVtb3ZlQXR0cmlidXRlW05TXSB0aHJvd3MgTk9UX0ZPVU5E
X0VSUgotLy8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIGJ1dCBhdCB0aGlzIGxldmVs
IHdlIGhhdmUgdG8gdGhyb3cgTk9UX0ZPVU5EX0VSUgotLy8gYmVjYXVzZSBvZiByZW1vdmVOYW1l
ZEl0ZW0sIHJlbW92ZU5hbWVkSXRlbU5TLCBhbmQgcmVtb3ZlQXR0cmlidXRlTm9kZS4KLVBhc3NS
ZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpyZW1vdmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVk
TmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8gIyMjIHNob3VsZCB0aGlz
IHJlYWxseSBiZSByYWlzZWQgd2hlbiB0aGUgYXR0cmlidXRlIHRvIHJlbW92ZSBpc24ndCB0aGVy
ZSBhdCBhbGw/Ci0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hl
biB0aGUgbm9kZSBpcyByZWFkb25seQotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAg
ZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLQotICAgIEF0dHJpYnV0ZSogYSA9IGdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0gICAgaWYg
KCFhKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotCi0gICAgUmVmUHRyPE5vZGU+IHIgPSBhLT5jcmVhdGVBdHRySWZOZWVkZWQoZWxlbWVu
dCk7Ci0KLSAgICBpZiAobmFtZSA9PSBpZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlk
KGEtPnZhbHVlKCksIG51bGxBdG9tKTsKLQotICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAg
ICByZXR1cm4gci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFw
OjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdAotewotICAgIGlmIChpbmRleCA+PSBsZW4p
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGF0dHJzW2luZGV4XS0+Y3JlYXRlQXR0
cklmTmVlZGVkKGVsZW1lbnQpOwotfQotCi1BdHRyaWJ1dGUqIE5hbWVkQXR0ck1hcDo6Z2V0QXR0
cmlidXRlSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgICBpZiAoYXR0cnNbaV0tPm5h
bWUoKS5tYXRjaGVzKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGF0dHJzW2ldOwotICAgIH0K
LSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOYW1lZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygp
Ci17Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBs
ZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGF0dHJzW2ldLT5tX2ltcGwpCi0gICAgICAgICAg
ICAgICAgYXR0cnNbaV0tPm1faW1wbC0+bV9lbGVtZW50ID0gMDsKLSAgICAgICAgICAgIGF0dHJz
W2ldLT5kZXJlZigpOwotICAgICAgICB9Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAg
ICAgYXR0cnMgPSAwOwotICAgIH0KLSAgICBsZW4gPSAwOwotfQotCi12b2lkIE5hbWVkQXR0ck1h
cDo6ZGV0YWNoRnJvbUVsZW1lbnQoKQotewotICAgIC8vIHdlIGFsbG93IGEgTmFtZWRBdHRyTWFw
IHcvbyBhbiBlbGVtZW50IGluIGNhc2Ugc29tZW9uZSBzdGlsbCBoYXMgYSByZWZlcmVuY2UKLSAg
ICAvLyB0byBpZiBhZnRlciB0aGUgZWxlbWVudCBnZXRzIGRlbGV0ZWQgLSBidXQgdGhlIG1hcCBp
cyBub3cgaW52YWxpZAotICAgIGVsZW1lbnQgPSAwOwotICAgIGNsZWFyQXR0cmlidXRlcygpOwot
fQotCi1OYW1lZEF0dHJNYXAmIE5hbWVkQXR0ck1hcDo6b3BlcmF0b3I9KGNvbnN0IE5hbWVkQXR0
ck1hcCYgb3RoZXIpCi17Ci0gICAgLy8gY2xvbmUgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIG90aGVy
IG1hcCwgYnV0IGF0dGFjaCB0byBvdXIgZWxlbWVudAotICAgIGlmICghZWxlbWVudCkKLSAgICAg
ICAgcmV0dXJuICp0aGlzOwotCi0gICAgLy8gSWYgYXNzaWduaW5nIHRoZSBtYXAgY2hhbmdlcyB0
aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwKLSAgICAvLyB1cGRhdGVJZC4KLQotICAg
IEF0dHJpYnV0ZSAqb2xkSWQgPSBnZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0gICAgQXR0cmli
dXRlICpuZXdJZCA9IG90aGVyLmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLQotICAgIGlmIChv
bGRJZCB8fCBuZXdJZCkKLSAgICAgICAgZWxlbWVudC0+dXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+
dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwot
Ci0gICAgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgbGVuID0gb3RoZXIubGVuOwotICAgIGF0dHJz
ID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKGxlbiAqIHNpemVvZihBdHRy
aWJ1dGUgKikpKTsKLQotICAgIC8vIGZpcnN0IGluaXRpYWxpemUgYXR0cnMgdmVjdG9yLCB0aGVu
IGNhbGwgYXR0cmlidXRlQ2hhbmdlZCBvbiBpdAotICAgIC8vIHRoaXMgYWxsb3dzIGF0dHJpYnV0
ZUNoYW5nZWQgdG8gdXNlIGdldEF0dHJpYnV0ZQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBsZW47IGkrKykgewotICAgICAgICBhdHRyc1tpXSA9IG90aGVyLmF0dHJzW2ldLT5jbG9uZSgp
OwotICAgICAgICBhdHRyc1tpXS0+cmVmKCk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMg
aXMgd2FzdGVmdWwuICBUaGUgY2xhc3MgbGlzdCBjb3VsZCBiZSBwcmVzZXJ2ZWQgb24gYSBjb3B5
LCBhbmQgd2UKLSAgICAvLyB3b3VsZG4ndCBoYXZlIHRvIHdhc3RlIHRpbWUgcmVwYXJzaW5nIHRo
ZSBhdHRyaWJ1dGUuCi0gICAgLy8gVGhlIGRlcml2ZWQgY2xhc3MsIEhUTUxOYW1lZEF0dHJNYXAs
IHdoaWNoIG1hbmFnZXMgYSBwYXJzZWQgY2xhc3MgbGlzdCBmb3IgdGhlIENMQVNTIGF0dHJpYnV0
ZSwKLSAgICAvLyB3aWxsIHVwZGF0ZSBpdHMgbWVtYmVyIHZhcmlhYmxlIHdoZW4gcGFyc2UgYXR0
cmlidXRlIGlzIGNhbGxlZC4KLSAgICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykK
LSAgICAgICAgZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChhdHRyc1tpXSwgdHJ1ZSk7Ci0KLSAg
ICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjphZGRBdHRyaWJ1dGUoQXR0
cmlidXRlICphdHRyaWJ1dGUpCi17Ci0gICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxp
c3QKLSAgICBBdHRyaWJ1dGUgKipuZXdBdHRycyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZSAqKj4o
ZmFzdE1hbGxvYygobGVuICsgMSkgKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0gICAgaWYgKGF0
dHJzKSB7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAg
IG5ld0F0dHJzW2ldID0gYXR0cnNbaV07Ci0gICAgICBmYXN0RnJlZShhdHRycyk7Ci0gICAgfQot
ICAgIGF0dHJzID0gbmV3QXR0cnM7Ci0gICAgYXR0cnNbbGVuKytdID0gYXR0cmlidXRlOwotICAg
IGF0dHJpYnV0ZS0+cmVmKCk7Ci0KLSAgICBBdHRyICogY29uc3QgYXR0ciA9IGF0dHJpYnV0ZS0+
bV9pbXBsOwotICAgIGlmIChhdHRyKQotICAgICAgICBhdHRyLT5tX2VsZW1lbnQgPSBlbGVtZW50
OwotCi0gICAgLy8gTm90aWZ5IHRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSBoYXMgYmVl
biBhZGRlZCwgYW5kIGRpc3BhdGNoIGFwcHJvcHJpYXRlIG11dGF0aW9uIGV2ZW50cwotICAgIC8v
IE5vdGUgdGhhdCBlbGVtZW50IG1heSBiZSBudWxsIGhlcmUgaWYgd2UgYXJlIGNhbGxlZCBmcm9t
IGluc2VydEF0dHIoKSBkdXJpbmcgcGFyc2luZwotICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAg
IFJlZlB0cjxBdHRyaWJ1dGU+IGEgPSBhdHRyaWJ1dGU7Ci0gICAgICAgIGVsZW1lbnQtPmF0dHJp
YnV0ZUNoYW5nZWQoYS5nZXQoKSk7Ci0gICAgICAgIC8vIEJlY2F1c2Ugb2Ygb3VyIHVwZGF0ZVN0
eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBzdHlsZSBtb2RpZmljYXRpb24gZXZlbnRzIGFyZSBuZXZl
ciBzZW50IGF0IHRoZSByaWdodCB0aW1lLCBzbyBkb24ndCBib3RoZXIgc2VuZGluZyB0aGVtLgot
ICAgICAgICBpZiAoYS0+bmFtZSgpICE9IHN0eWxlQXR0cikgewotICAgICAgICAgICAgZWxlbWVu
dC0+ZGlzcGF0Y2hBdHRyQWRkaXRpb25FdmVudChhLmdldCgpKTsKLSAgICAgICAgICAgIGVsZW1l
bnQtPmRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoZmFsc2UpOwotICAgICAgICB9Ci0gICAg
fQotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIG5hbWUpCi17Ci0gICAgdW5zaWduZWQgaW5kZXggPSBsZW4rMTsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgIGlmIChhdHRyc1tpXS0+bmFtZSgp
Lm1hdGNoZXMobmFtZSkpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0KLSAgICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm47Ci0KLSAgICAv
LyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0Ci0gICAgQXR0cmlidXRlKiBhdHRy
ID0gYXR0cnNbaW5kZXhdOwotICAgIGlmIChhdHRyc1tpbmRleF0tPm1faW1wbCkKLSAgICAgICAg
YXR0cnNbaW5kZXhdLT5tX2ltcGwtPm1fZWxlbWVudCA9IDA7Ci0gICAgaWYgKGxlbiA9PSAxKSB7
Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSAwOwotICAgICAgICBs
ZW4gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEF0dHJpYnV0ZSAqKm5ld0F0dHJzID0gc3Rh
dGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKChsZW4gLSAxKSAqIHNpemVvZihBdHRy
aWJ1dGUgKikpKTsKLSAgICAgICAgdW5zaWduZWQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8
IHVuc2lnbmVkKGluZGV4KTsgaSsrKQotICAgICAgICAgICAgbmV3QXR0cnNbaV0gPSBhdHRyc1tp
XTsKLSAgICAgICAgbGVuLS07Ci0gICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspCi0gICAgICAg
ICAgICBuZXdBdHRyc1tpXSA9IGF0dHJzW2krMV07Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsK
LSAgICAgICAgYXR0cnMgPSBuZXdBdHRyczsKLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhlIGVs
ZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAvLyBkaXNwYXRj
aCBhcHByb3ByaWF0ZSBtdXRhdGlvbiBldmVudHMKLSAgICBpZiAoZWxlbWVudCAmJiAhYXR0ci0+
bV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICBBdG9taWNTdHJpbmcgdmFsdWUgPSBhdHRyLT5t
X3ZhbHVlOwotICAgICAgICBhdHRyLT5tX3ZhbHVlID0gbnVsbEF0b207Ci0gICAgICAgIGVsZW1l
bnQtPmF0dHJpYnV0ZUNoYW5nZWQoYXR0cik7Ci0gICAgICAgIGF0dHItPm1fdmFsdWUgPSB2YWx1
ZTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hB
dHRyUmVtb3ZhbEV2ZW50KGF0dHIpOwotICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFN1YnRyZWVN
b2RpZmllZEV2ZW50KGZhbHNlKTsKLSAgICB9Ci0gICAgYXR0ci0+ZGVyZWYoKTsKLX0KLQotYm9v
bCBOYW1lZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkQXR0ck1hcCogb3RoZXJN
YXApIGNvbnN0Ci17Ci0gICAgaWYgKCFvdGhlck1hcCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIAotICAgIGlmIChsZW5ndGgoKSAhPSBvdGhlck1hcC0+bGVuZ3RoKCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoKCk7
IGkrKykgewotICAgICAgICBBdHRyaWJ1dGUgKmF0dHIgPSBhdHRyaWJ1dGVJdGVtKGkpOwotICAg
ICAgICBBdHRyaWJ1dGUgKm90aGVyQXR0ciA9IG90aGVyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGF0
dHItPm5hbWUoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKCFvdGhlckF0dHIgfHwgYXR0
ci0+dmFsdWUoKSAhPSBvdGhlckF0dHItPnZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIFN0eWxlZCBFbGVtZW50IGFuZCBNYXBwZWQgQXR0cmlidXRlIElt
cGxlbWVudGF0aW9uCi0KLUNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uOjp+Q1NTTWFwcGVk
QXR0cmlidXRlRGVjbGFyYXRpb24oKQotewotICAgIGlmIChtX2VudHJ5VHlwZSAhPSBlUGVyc2lz
dGVudCkKLSAgICAgICAgU3R5bGVkRWxlbWVudDo6cmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVjbCht
X2VudHJ5VHlwZSwgbV9hdHRyTmFtZSwgbV9hdHRyVmFsdWUpOwotfQotCi1DU1NNYXBwZWRBdHRy
aWJ1dGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6Z2V0TWFwcGVkQXR0cmlidXRlRGVjbChN
YXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUsIEF0dHJpYnV0ZSogYXR0cikKLXsKLSAgICBp
ZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4g
bWFwcGVkQXR0cmlidXRlRGVjbHMtPmdldChNYXBwZWRBdHRyaWJ1dGVLZXkoZW50cnlUeXBlLCBh
dHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuaW1wbCgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSkpOwot
fQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OnNldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0
cmlidXRlRW50cnkgZW50cnlUeXBlLCBBdHRyaWJ1dGUqIGF0dHIsIENTU01hcHBlZEF0dHJpYnV0
ZURlY2xhcmF0aW9uKiBkZWNsKQotewotICAgIGlmICghbWFwcGVkQXR0cmlidXRlRGVjbHMpCi0g
ICAgICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzID0gbmV3IE1hcHBlZEF0dHJpYnV0ZURlY2xzOwot
ICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzLT5zZXQoTWFwcGVkQXR0cmlidXRlS2V5KGVudHJ5VHlw
ZSwgYXR0ci0+bmFtZSgpLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0ci0+dmFsdWUoKS5pbXBsKCkp
LCBkZWNsKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpyZW1vdmVNYXBwZWRBdHRyaWJ1dGVE
ZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5h
bWUsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0clZhbHVlKQotewotICAgIGlmICghbWFwcGVkQXR0
cmlidXRlRGVjbHMpCi0gICAgICAgIHJldHVybjsKLSAgICBtYXBwZWRBdHRyaWJ1dGVEZWNscy0+
cmVtb3ZlKE1hcHBlZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0dHJOYW1lLmxvY2FsTmFtZSgp
LmltcGwoKSwgYXR0clZhbHVlLmltcGwoKSkpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6Omlu
dmFsaWRhdGVTdHlsZUF0dHJpYnV0ZSgpCi17Ci0gICAgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQg
PSBmYWxzZTsKLX0KKyNpbmNsdWRlICJEb2N1bWVudC5oIgogCi12b2lkIFN0eWxlZEVsZW1lbnQ6
OnVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBjb25zdAotewotICAgIGlmICghbV9pc1N0
eWxlQXR0cmlidXRlVmFsaWQpIHsKLSAgICAgICAgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQgPSB0
cnVlOwotICAgICAgICBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IHRydWU7Ci0gICAg
ICAgIGlmIChtX2lubGluZVN0eWxlRGVjbCkKLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8U3R5bGVk
RWxlbWVudCo+KHRoaXMpLT5zZXRBdHRyaWJ1dGUoc3R5bGVBdHRyLCBtX2lubGluZVN0eWxlRGVj
bC0+Y3NzVGV4dCgpKTsKLSAgICAgICAgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUgPSBm
YWxzZTsKLSAgICB9Ci19CituYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUF0dHJpYnV0ZSogTWFwcGVk
QXR0cmlidXRlOjpjbG9uZShib29sIHByZXNlcnZlRGVjbCkgY29uc3QKK05hbWVkTWFwcGVkQXR0
ck1hcDo6TmFtZWRNYXBwZWRBdHRyTWFwKEVsZW1lbnQgKmUpCisgICAgOiBOYW1lZEF0dHJNYXAo
ZSkKKyAgICAsIG1fbWFwcGVkQXR0cmlidXRlQ291bnQoMCkKIHsKLSAgICByZXR1cm4gbmV3IE1h
cHBlZEF0dHJpYnV0ZShuYW1lKCksIHZhbHVlKCksIHByZXNlcnZlRGVjbCA/IG1fc3R5bGVEZWNs
LmdldCgpIDogMCk7CiB9CiAKLU5hbWVkTWFwcGVkQXR0ck1hcDo6TmFtZWRNYXBwZWRBdHRyTWFw
KEVsZW1lbnQgKmUpCi06TmFtZWRBdHRyTWFwKGUpLCBtX21hcHBlZEF0dHJpYnV0ZUNvdW50KDAp
Ci17fQotCiB2b2lkIE5hbWVkTWFwcGVkQXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCkKIHsKICAg
ICBtX2NsYXNzTGlzdC5jbGVhcigpOwpAQCAtMTI5NCwzNjUgKzEyMCw0IEBAIHZvaWQgTmFtZWRN
YXBwZWRBdHRyTWFwOjpwYXJzZUNsYXNzQXR0cmkKICAgICB9CiB9CiAKLVN0eWxlZEVsZW1lbnQ6
OlN0eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRG9jdW1lbnQgKmRvYykK
LSAgICA6IEVsZW1lbnQobmFtZSwgZG9jKQotewotICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlk
ID0gdHJ1ZTsKLSAgICBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwotfQot
Ci1TdHlsZWRFbGVtZW50Ojp+U3R5bGVkRWxlbWVudCgpCi17Ci0gICAgZGVzdHJveUlubGluZVN0
eWxlRGVjbCgpOwotfQotCi1BdHRyaWJ1dGUqIFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0
ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSkKLXsKLSAgICBy
ZXR1cm4gbmV3IE1hcHBlZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5bGVk
RWxlbWVudDo6Y3JlYXRlSW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBtX2lubGluZVN0eWxlRGVj
bCA9IG5ldyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjsKLSAgICBtX2lubGluZVN0eWxlRGVj
bC0+c2V0UGFyZW50KGdldERvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICBtX2lubGlu
ZVN0eWxlRGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0U3Ry
aWN0UGFyc2luZyghZ2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpOwotfQotCi12b2lkIFN0
eWxlZEVsZW1lbnQ6OmRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKQotewotICAgIGlmIChtX2lubGlu
ZVN0eWxlRGVjbCkgewotICAgICAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0Tm9kZSgwKTsKLSAg
ICAgICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgbV9pbmxpbmVT
dHlsZURlY2wgPSAwOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphdHRyaWJ1dGVD
aGFuZ2VkKEF0dHJpYnV0ZSogYXR0ciwgYm9vbCBwcmVzZXJ2ZURlY2xzKQotewotICAgIE1hcHBl
ZEF0dHJpYnV0ZSogbWFwcGVkQXR0ciA9IHN0YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+KGF0
dHIpOwotICAgIGlmIChtYXBwZWRBdHRyLT5kZWNsKCkgJiYgIXByZXNlcnZlRGVjbHMpIHsKLSAg
ICAgICAgbWFwcGVkQXR0ci0+c2V0RGVjbCgwKTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAg
ICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5k
ZWNsUmVtb3ZlZCgpOwotICAgIH0KLQotICAgIGJvb2wgY2hlY2tEZWNsID0gdHJ1ZTsKLSAgICBN
YXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeTsKLSAgICBib29sIG5lZWRUb1BhcnNlID0gbWFwVG9F
bnRyeShhdHRyLT5uYW1lKCksIGVudHJ5KTsKLSAgICBpZiAocHJlc2VydmVEZWNscykgewotICAg
ICAgICBpZiAobWFwcGVkQXR0ci0+ZGVjbCgpKSB7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7
Ci0gICAgICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgICAgIG1hcHBlZEF0
dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVja0RlY2wgPSBmYWxzZTsK
LSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghYXR0ci0+aXNOdWxsKCkgJiYgZW50cnkg
IT0gZU5vbmUpIHsKLSAgICAgICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wg
PSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVudHJ5LCBhdHRyKTsKLSAgICAgICAgaWYgKGRlY2wp
IHsKLSAgICAgICAgICAgIG1hcHBlZEF0dHItPnNldERlY2woZGVjbCk7Ci0gICAgICAgICAgICBz
ZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAg
ICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVja0Rl
Y2wgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZWVkVG9QYXJzZSA9IHRy
dWU7Ci0gICAgfQotCi0gICAgaWYgKG5lZWRUb1BhcnNlKQotICAgICAgICBwYXJzZU1hcHBlZEF0
dHJpYnV0ZShtYXBwZWRBdHRyKTsKLSAgICAKLSAgICBpZiAoY2hlY2tEZWNsICYmIG1hcHBlZEF0
dHItPmRlY2woKSkgewotICAgICAgICAvLyBBZGQgdGhlIGRlY2wgdG8gdGhlIHRhYmxlIGluIHRo
ZSBhcHByb3ByaWF0ZSBzcG90LgotICAgICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVudHJ5
LCBhdHRyLCBtYXBwZWRBdHRyLT5kZWNsKCkpOwotICAgICAgICBtYXBwZWRBdHRyLT5kZWNsKCkt
PnNldE1hcHBlZFN0YXRlKGVudHJ5LCBhdHRyLT5uYW1lKCksIGF0dHItPnZhbHVlKCkpOwotICAg
ICAgICBtYXBwZWRBdHRyLT5kZWNsKCktPnNldFBhcmVudCgwKTsKLSAgICAgICAgbWFwcGVkQXR0
ci0+ZGVjbCgpLT5zZXROb2RlKDApOwotICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAg
ICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5kZWNsQWRkZWQoKTsKLSAgICB9Ci19Ci0KLWJvb2wg
U3R5bGVkRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICByZXN1bHQgPSBlTm9u
ZTsKLSAgICBpZiAoYXR0ck5hbWUgPT0gc3R5bGVBdHRyKQotICAgICAgICByZXR1cm4gIW1fc3lu
Y2hyb25pemluZ1N0eWxlQXR0cmlidXRlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0
eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikK
LXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGlkQXR0cikgewotICAgICAgICAvLyB1bmlxdWUg
aWQKLSAgICAgICAgc2V0SGFzSUQoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKG5hbWVk
QXR0ck1hcCkgewotICAgICAgICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKQotICAgICAgICAgICAg
ICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQobnVsbEF0b20pOwotICAgICAgICAgICAgZWxzZSBpZiAo
Z2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkgJiYgIWF0dHItPnZhbHVlKCkuaW1wbCgpLT5p
c0xvd2VyKCkpCi0gICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChBdG9taWNTdHJp
bmcoYXR0ci0+dmFsdWUoKS5kb21TdHJpbmcoKS5sb3dlcigpKSk7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChhdHRyLT52YWx1ZSgpKTsKLSAg
ICAgICAgfQotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gY2xhc3NBdHRyKSB7Ci0gICAgICAgIC8vIGNsYXNzCi0gICAgICAgIHNldEhhc0NsYXNz
KCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgICAg
ICBtYXBwZWRBdHRyaWJ1dGVzKCktPnBhcnNlQ2xhc3NBdHRyaWJ1dGUoYXR0ci0+dmFsdWUoKSk7
Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBz
dHlsZUF0dHIpIHsKLSAgICAgICAgc2V0SGFzU3R5bGUoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAg
ICAgaWYgKGF0dHItPmlzTnVsbCgpKQotICAgICAgICAgICAgZGVzdHJveUlubGluZVN0eWxlRGVj
bCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnZXRJbmxpbmVTdHlsZURlY2woKS0+cGFy
c2VEZWNsYXJhdGlvbihhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgbV9pc1N0eWxlQXR0cmlidXRl
VmFsaWQgPSB0cnVlOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfQotfQotCi12b2lkIFN0
eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0Ci17Ci0gICAgbmFtZWRBdHRy
TWFwID0gbmV3IE5hbWVkTWFwcGVkQXR0ck1hcChjb25zdF9jYXN0PFN0eWxlZEVsZW1lbnQqPih0
aGlzKSk7Ci19Ci0KLUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50Ojpn
ZXRJbmxpbmVTdHlsZURlY2woKQotewotICAgIGlmICghbV9pbmxpbmVTdHlsZURlY2wpCi0gICAg
ICAgIGNyZWF0ZUlubGluZVN0eWxlRGVjbCgpOwotICAgIHJldHVybiBtX2lubGluZVN0eWxlRGVj
bC5nZXQoKTsKLX0KLQotQ1NTU3R5bGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6c3R5bGUo
KQotewotICAgIHJldHVybiBnZXRJbmxpbmVTdHlsZURlY2woKTsKLX0KLQotQ1NTTXV0YWJsZVN0
eWxlRGVjbGFyYXRpb24qIFN0eWxlZEVsZW1lbnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURl
Y2woKQotewotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmdMaXN0KiBTdHls
ZWRFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lZEF0dHJN
YXAgPyBtYXBwZWRBdHRyaWJ1dGVzKCktPmdldENsYXNzTGlzdCgpIDogMDsKLX0KLQotc3RhdGlj
IGlubGluZSBib29sIGlzSGV4RGlnaXQoIGNvbnN0IFFDaGFyICZjICkgewotICAgIHJldHVybiAo
IGMgPj0gJzAnICYmIGMgPD0gJzknICkgfHwKLSAgICAgICAgICAgKCBjID49ICdhJyAmJiBjIDw9
ICdmJyApIHx8Ci0gICAgICAgICAgICggYyA+PSAnQScgJiYgYyA8PSAnRicgKTsKLX0KLQotc3Rh
dGljIGlubGluZSBpbnQgdG9IZXgoIGNvbnN0IFFDaGFyICZjICkgewotICAgIHJldHVybiAoIChj
ID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAtICcwJykK
LSAgICAgICAgICAgICA6ICggKCBjID49ICdhJyAmJiBjIDw9ICdmJyApCi0gICAgICAgICAgICAg
ICAgID8gKGMudW5pY29kZSgpIC0gJ2EnICsgMTApCi0gICAgICAgICAgICAgICAgIDogKCAoIGMg
Pj0gJ0EnICYmIGMgPD0gJ0YnICkKLSAgICAgICAgICAgICAgICAgICAgID8gKGMudW5pY29kZSgp
IC0gJ0EnICsgMTApCi0gICAgICAgICAgICAgICAgICAgICA6IC0xICkgKSApOwotfQotCi12b2lk
IFN0eWxlZEVsZW1lbnQ6OmFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50
IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVh
dGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIHZh
bHVlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NTUHJvcGVydHkoTWFw
cGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGludCB2YWx1ZSkKLXsKLSAgICBpZiAoIWF0dHIt
PmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldFBy
b3BlcnR5KGlkLCB2YWx1ZSwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENT
U1N0cmluZ1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJp
bmcgJnZhbHVlLCBDU1NQcmltaXRpdmVWYWx1ZTo6VW5pdFR5cGVzIHR5cGUpCi17Ci0gICAgaWYg
KCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgp
LT5zZXRTdHJpbmdQcm9wZXJ0eShpZCwgdmFsdWUsIHR5cGUsIGZhbHNlKTsKLX0KLQotdm9pZCBT
dHlsZWRFbGVtZW50OjphZGRDU1NJbWFnZVByb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwg
aW50IGlkLCBjb25zdCBTdHJpbmcgJlVSTCkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3Jl
YXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldEltYWdlUHJvcGVydHko
aWQsIFVSTCwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0xlbmd0aChN
YXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICAvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IHNwaW4gdXAgdGhlIENTUyBwYXJz
ZXIsIGJ1dCBzaG91bGQgaW5zdGVhZCBqdXN0IGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QKLSAgICAv
LyBsZW5ndGggdW5pdCBhbmQgbWFrZSB0aGUgYXBwcm9wcmlhdGUgcGFyc2VkIHZhbHVlLgotICAg
IGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotCi0gICAgLy8gc3Ry
aXAgYXR0cmlidXRlIGdhcmJhZ2UuLgotICAgIFN0cmluZ0ltcGwqIHYgPSB2YWx1ZS5pbXBsKCk7
Ci0gICAgaWYgKHYpIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGwgPSAwOwotICAgICAgICAKLSAg
ICAgICAgd2hpbGUgKGwgPCB2LT5sZW5ndGgoKSAmJiAoKnYpW2xdLnVuaWNvZGUoKSA8PSAnICcp
Ci0gICAgICAgICAgICBsKys7Ci0gICAgICAgIAotICAgICAgICBmb3IgKDsgbCA8IHYtPmxlbmd0
aCgpOyBsKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2MgPSAoKnYpW2xdLmxhdGluMSgpOwotICAg
ICAgICAgICAgaWYgKGNjID4gJzknIHx8IChjYyA8ICcwJyAmJiBjYyAhPSAnKicgJiYgY2MgIT0g
JyUnICYmIGNjICE9ICcuJykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQot
ICAgICAgICBpZiAobCAhPSB2LT5sZW5ndGgoKSkgewotICAgICAgICAgICAgYXR0ci0+ZGVjbCgp
LT5zZXRMZW5ndGhQcm9wZXJ0eShpZCwgdi0+c3Vic3RyaW5nKDAsIGwpLCBmYWxzZSk7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgYXR0ci0+ZGVjbCgp
LT5zZXRMZW5ndGhQcm9wZXJ0eShpZCwgdmFsdWUsIGZhbHNlKTsKLX0KLQotLyogY29sb3IgcGFy
c2luZyB0aGF0IHRyaWVzIHRvIG1hdGNoIGFzIGNsb3NlIGFzIHBvc3NpYmxlIElFIDYuICovCi12
b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0NvbG9yKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50
IGlkLCBjb25zdCBTdHJpbmcgJmMpCi17Ci0gICAgLy8gdGhpcyBpcyB0aGUgb25seSBjYXNlIG5v
IGNvbG9yIGdldHMgYXBwbGllZCBpbiBJRS4KLSAgICBpZiAoICFjLmxlbmd0aCgpICkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0
cik7Ci0gICAgCi0gICAgaWYgKGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIGMsIGZhbHNl
KSApCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBEZXByZWNhdGVkU3RyaW5nIGNvbG9yID0g
Yy5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAgLy8gbm90IHNvbWV0aGluZyB0aGF0IGZpdHMgdGhl
IHNwZWNzLgotICAgIAotICAgIC8vIHdlJ3JlIGVtdWxhdGluZyBJRXMgY29sb3IgcGFyc2VyIGhl
cmUuIEl0IG1hcHMgdHJhbnNwYXJlbnQgdG8gYmxhY2ssIG90aGVyd2lzZSBpdCB0cmllcyB0byBi
dWlsZCBhIHJnYiB2YWx1ZQotICAgIC8vIG91dCBvZiBldmVyeWh0aW5nIHlvdSBwdXQgaW4uIFRo
ZSBhbGdvcml0aG0gaXMgZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCwgYnV0IHNlZW1zIHRvIHdv
cmsgZm9yIGFsbCB0ZXN0IGNhc2VzIEkgaGF2ZS4KLSAgICAKLSAgICAvLyB0aGUgbGVuZ3RoIG9m
IHRoZSBjb2xvciB2YWx1ZSBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0Ci0gICAgLy8gbXVsdGlw
bGUgb2YgMy4gZWFjaCBwYXJ0IG9mIHRoZSByZ2IgdHJpcGxlIHRoZW4gZ2V0cyBvbmUgdGhpcmQK
LSAgICAvLyBvZiB0aGUgbGVuZ3RoLgotICAgIC8vCi0gICAgLy8gRWFjaCB0cmlwbGV0IGlzIHBh
cnNlZCBieXRlIGJ5IGJ5dGUsIG1hcHBpbmcKLSAgICAvLyBlYWNoIG51bWJlciB0byBhIGhleCB2
YWx1ZSAoMC05YS1mQS1GIHRvIHRoZWlyIHZhbHVlcwotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSB0
byAwKS4KLSAgICAvLwotICAgIC8vIFRoZSBoaWdoZXN0IG5vbiB6ZXJvIGRpZ2l0IGluIGFsbCB0
cmlwbGV0cyBpcyByZW1lbWJlcmVkLCBhbmQKLSAgICAvLyB1c2VkIGFzIGEgbm9ybWFsaXphdGlv
biBwb2ludCB0byBub3JtYWxpemUgdG8gdmFsdWVzIGJldHdlZW4gMAotICAgIC8vIGFuZCAyNTUu
Ci0gICAgCi0gICAgaWYgKCBjb2xvci5sb3dlcigpICE9ICJ0cmFuc3BhcmVudCIgKSB7Ci0gICAg
ICAgIGlmICggY29sb3JbMF0gPT0gJyMnICkKLSAgICAgICAgICAgIGNvbG9yLnJlbW92ZSggMCwg
IDEgKTsKLSAgICAgICAgaW50IGJhc2ljTGVuZ3RoID0gKGNvbG9yLmxlbmd0aCgpICsgMikgLyAz
OwotICAgICAgICBpZiAoIGJhc2ljTGVuZ3RoID4gMSApIHsKLSAgICAgICAgICAgIC8vIElFIGln
bm9yZXMgY29sb3JzIHdpdGggdGhyZWUgZGlnaXRzIG9yIGxlc3MKLSAgICAgICAgICAgIGludCBj
b2xvcnNbM10gPSB7IDAsIDAsIDAgfTsKLSAgICAgICAgICAgIGludCBjb21wb25lbnQgPSAwOwot
ICAgICAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgICAgICBpbnQgbWF4RGlnaXQgPSBiYXNp
Y0xlbmd0aC0xOwotICAgICAgICAgICAgd2hpbGUgKCBjb21wb25lbnQgPCAzICkgewotICAgICAg
ICAgICAgICAgIC8vIHNlYXJjaCBmb3J3YXJkIGZvciBkaWdpdHMgaW4gdGhlIHN0cmluZwotICAg
ICAgICAgICAgICAgIGludCBudW1EaWdpdHMgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICgg
cG9zIDwgKGludCljb2xvci5sZW5ndGgoKSAmJiBudW1EaWdpdHMgPCBiYXNpY0xlbmd0aCApIHsK
LSAgICAgICAgICAgICAgICAgICAgaW50IGhleCA9IHRvSGV4KCBjb2xvcltwb3NdICk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbG9yc1tjb21wb25lbnRdID0gKGNvbG9yc1tjb21wb25lbnRdIDw8
IDQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGhleCA+IDAgKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50XSArPSBoZXg7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBtYXhEaWdpdCA9IGtNaW4oIG1heERpZ2l0LCBudW1EaWdpdHMgKTsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBudW1EaWdpdHMrKzsKLSAgICAgICAgICAg
ICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxl
ICggbnVtRGlnaXRzKysgPCBiYXNpY0xlbmd0aCApCi0gICAgICAgICAgICAgICAgICAgIGNvbG9y
c1tjb21wb25lbnRdIDw8PSA0OwotICAgICAgICAgICAgICAgIGNvbXBvbmVudCsrOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgbWF4RGlnaXQgPSBiYXNpY0xlbmd0aCAtIG1heERpZ2l0Owot
ICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBub3JtYWxpemUgdG8gMDAtZmYuIFRoZSBoaWdo
ZXN0IGZpbGxlZCBkaWdpdCBjb3VudHMsIG1pbmltdW0gaXMgMiBkaWdpdHMKLSAgICAgICAgICAg
IG1heERpZ2l0IC09IDI7Ci0gICAgICAgICAgICBjb2xvcnNbMF0gPj49IDQqbWF4RGlnaXQ7Ci0g
ICAgICAgICAgICBjb2xvcnNbMV0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICBjb2xvcnNb
Ml0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICAvLyBhc3NlcnQoIGNvbG9yc1swXSA8IDB4
MTAwICYmIGNvbG9yc1sxXSA8IDB4MTAwICYmIGNvbG9yc1syXSA8IDB4MTAwICk7Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIGNvbG9yLnNwcmludGYoIiMlMDJ4JTAyeCUwMngiLCBjb2xvcnNb
MF0sIGNvbG9yc1sxXSwgY29sb3JzWzJdICk7Ci0gICAgICAgICAgICBpZiAoIGF0dHItPmRlY2wo
KS0+c2V0UHJvcGVydHkoaWQsIFN0cmluZyhjb2xvciksIGZhbHNlKSApCi0gICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGF0dHItPmRlY2woKS0+c2V0UHJvcGVy
dHkoaWQsIENTU19WQUxfQkxBQ0ssIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50Ojpj
cmVhdGVNYXBwZWREZWNsKE1hcHBlZEF0dHJpYnV0ZSogYXR0cikKLXsKLSAgICBDU1NNYXBwZWRB
dHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbigwKTsKLSAgICBhdHRyLT5zZXREZWNsKGRlY2wpOwotICAgIGRlY2wtPnNldFBhcmVudChn
ZXREb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgZGVjbC0+c2V0Tm9kZSh0aGlzKTsK
LSAgICBkZWNsLT5zZXRTdHJpY3RQYXJzaW5nKGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJpYnV0ZXMg
YXJlIGp1c3QgYWx3YXlzIHF1aXJreS4KLX0KLQotLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRyYXJ5
IHN0YXJ0IHZhbHVlIHRvIGF2b2lkIG1hcHBpbmcgYWxsIDAncyB0byBhbGwgMCdzCi0vLyBvciBh
bnl0aGluZyBsaWtlIHRoYXQuCi1jb25zdCB1bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsKLQot
Ly8gUGF1bCBIc2llaCdzIFN1cGVyRmFzdEhhc2gKLS8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25r
ZXlzLmNvbS9xZWQvaGFzaC5odG1sCi11bnNpZ25lZCBNYXBwZWRBdHRyaWJ1dGVIYXNoOjpoYXNo
KGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYga2V5KQotewotICAgIHVpbnQzMl90IGhhc2ggPSBQ
SEk7Ci0gICAgdWludDMyX3QgdG1wOwotCi0gICAgY29uc3QgdWludDE2X3QqIHA7Ci0KLSAgICBw
ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZrZXkubmFtZSk7Ci0gICAgaGFz
aCArPSBwWzBdOwotICAgIHRtcCA9IChwWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgaGFzaCA9ICho
YXNoIDw8IDE2KSBeIHRtcDsKLSAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAgYXNzZXJ0KHNp
emVvZihrZXkubmFtZSkgPT0gNCB8fCBzaXplb2Yoa2V5Lm5hbWUpID09IDgpOwotICAgIGlmIChz
aXplb2Yoa2V5Lm5hbWUpID09IDgpIHsKLSAgICAgICAgcCArPSAyOwotICAgICAgICBoYXNoICs9
IHBbMF07Ci0gICAgICAgIHRtcCA9IChwWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgICAgIGhhc2gg
PSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAgICB9
Ci0KLSAgICBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZrZXkudmFsdWUp
OwotICAgIGhhc2ggKz0gcFswXTsKLSAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAg
IGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgaGFzaCArPSBoYXNoID4+IDExOwotICAg
IGFzc2VydChzaXplb2Yoa2V5LnZhbHVlKSA9PSA0IHx8IHNpemVvZihrZXkudmFsdWUpID09IDgp
OwotICAgIGlmIChzaXplb2Yoa2V5LnZhbHVlKSA9PSA4KSB7Ci0gICAgICAgIHAgKz0gMjsKLSAg
ICAgICAgaGFzaCArPSBwWzBdOwotICAgICAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwot
ICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgICAgICBoYXNoICs9IGhhc2gg
Pj4gMTE7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGVuZCBjYXNlCi0gICAgaGFzaCArPSBrZXku
dHlwZTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMTE7Ci0gICAgaGFzaCArPSBoYXNoID4+IDE3Owot
Ci0gICAgLy8gRm9yY2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cwotICAgIGhhc2gg
Xj0gaGFzaCA8PCAzOwotICAgIGhhc2ggKz0gaGFzaCA+PiA1OwotICAgIGhhc2ggXj0gaGFzaCA8
PCAyOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMTA7Ci0K
LSAgICAvLyBUaGlzIGF2b2lkcyBldmVyIHJldHVybmluZyBhIGhhc2ggY29kZSBvZiAwLCBzaW5j
ZSB0aGF0IGlzIHVzZWQgdG8KLSAgICAvLyBzaWduYWwgImhhc2ggbm90IGNvbXB1dGVkIHlldCIs
IHVzaW5nIGEgdmFsdWUgdGhhdCBpcyBsaWtlbHkgdG8gYmUKLSAgICAvLyBlZmZlY3RpdmVseSB0
aGUgc2FtZSBhcyAwIHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBtYXNrZWQKLSAgICBpZiAoaGFzaCA9
PSAwKQotICAgICAgICBoYXNoID0gMHg4MDAwMDAwMDsKLQotICAgIHJldHVybiBoYXNoOwotfQot
CiB9CkluZGV4OiBkb20vTmFtZWRBdHRyTWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vTmFtZWRB
dHRyTWFwLmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBkb20vTmFtZWRBdHRyTWFwLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjIsODQyICsyMiwyMiBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBN
QSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
ImRvbV9lbGVtZW50aW1wbC5oIgorI2luY2x1ZGUgIk5hbWVkQXR0ck1hcC5oIgogCisjaW5jbHVk
ZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiRnJh
bWUuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgi
Ci0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3Iu
aCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNp
bXBsLmgiCi0jaW5jbHVkZSAiZG9tX3htbGltcGwuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIK
LSNpbmNsdWRlICJIVE1MUGFyc2VyLmgiCi0jaW5jbHVkZSAiUmVuZGVyQ2FudmFzLmgiCi0jaW5j
bHVkZSA8cXRleHRzdHJlYW0uaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1l
c3BhY2UgSFRNTE5hbWVzOwogCi1zdHJ1Y3QgTWFwcGVkQXR0cmlidXRlS2V5IHsKLSAgICB1aW50
MTZfdCB0eXBlOwotICAgIFN0cmluZ0ltcGwqIG5hbWU7Ci0gICAgU3RyaW5nSW1wbCogdmFsdWU7
Ci0gICAgTWFwcGVkQXR0cmlidXRlS2V5KE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHQsIFN0cmluZ0lt
cGwqIG4sIFN0cmluZ0ltcGwqIHYpCi0gICAgICAgIDogdHlwZSh0KSwgbmFtZShuKSwgdmFsdWUo
dikgeyB9Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXBwZWRB
dHRyaWJ1dGVLZXkmIGEsIGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYgYikKLSAgICB7IHJldHVy
biBhLnR5cGUgPT0gYi50eXBlICYmIGEubmFtZSA9PSBiLm5hbWUgJiYgYS52YWx1ZSA9PSBiLnZh
bHVlOyB9IAotCi1zdHJ1Y3QgTWFwcGVkQXR0cmlidXRlS2V5VHJhaXRzIHsKLSAgICB0eXBlZGVm
IE1hcHBlZEF0dHJpYnV0ZUtleSBUcmFpdFR5cGU7Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgZW1w
dHlWYWx1ZUlzWmVybyA9IHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVj
dGlvbiA9IGZhbHNlOwotICAgIHN0YXRpYyBNYXBwZWRBdHRyaWJ1dGVLZXkgZW1wdHlWYWx1ZSgp
IHsgcmV0dXJuIE1hcHBlZEF0dHJpYnV0ZUtleShlTm9uZSwgMCwgMCk7IH0KLSAgICBzdGF0aWMg
TWFwcGVkQXR0cmlidXRlS2V5IGRlbGV0ZWRWYWx1ZSgpIHsgcmV0dXJuIE1hcHBlZEF0dHJpYnV0
ZUtleShlTGFzdEVudHJ5LCAwLCAwKTsgfQotfTsKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUhh
c2ggewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYp
OwotICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYgYSwgY29u
c3QgTWFwcGVkQXR0cmlidXRlS2V5JiBiKSB7IHJldHVybiBhID09IGI7IH0KLX07Ci0KLXR5cGVk
ZWYgSGFzaE1hcDxNYXBwZWRBdHRyaWJ1dGVLZXksIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0
aW9uKiwgTWFwcGVkQXR0cmlidXRlSGFzaCwgTWFwcGVkQXR0cmlidXRlS2V5VHJhaXRzPiBNYXBw
ZWRBdHRyaWJ1dGVEZWNsczsKLQotc3RhdGljIE1hcHBlZEF0dHJpYnV0ZURlY2xzKiBtYXBwZWRB
dHRyaWJ1dGVEZWNscyA9IDA7Ci0KLUF0dHJpYnV0ZSogQXR0cmlidXRlOjpjbG9uZShib29sKSBj
b25zdAotewotICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG1fbmFtZSwgbV92YWx1ZSk7Ci19Ci0K
LVBhc3NSZWZQdHI8QXR0cj4gQXR0cmlidXRlOjpjcmVhdGVBdHRySWZOZWVkZWQoRWxlbWVudCog
ZSkKLXsKLSAgICBSZWZQdHI8QXR0cj4gcihtX2ltcGwpOwotICAgIGlmICghcikgewotICAgICAg
ICByID0gbmV3IEF0dHIoZSwgZS0+Z2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0gICAgICAgIHItPmNy
ZWF0ZVRleHRDaGlsZCgpOwotICAgIH0KLSAgICByZXR1cm4gci5yZWxlYXNlKCk7Ci19Ci0KLUF0
dHI6OkF0dHIoRWxlbWVudCogZWxlbWVudCwgRG9jdW1lbnQqIGRvY1B0ciwgQXR0cmlidXRlKiBh
KQotICAgIDogQ29udGFpbmVyTm9kZShkb2NQdHIpLAotICAgICAgbV9lbGVtZW50KGVsZW1lbnQp
LAotICAgICAgbV9hdHRyaWJ1dGUoYSksCi0gICAgICBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZCgw
KQotewotICAgIGFzc2VydCghbV9hdHRyaWJ1dGUtPm1faW1wbCk7Ci0gICAgbV9hdHRyaWJ1dGUt
Pm1faW1wbCA9IHRoaXM7Ci0gICAgbV9zcGVjaWZpZWQgPSB0cnVlOwotfQotCi1BdHRyOjp+QXR0
cigpCi17Ci0gICAgYXNzZXJ0KG1fYXR0cmlidXRlLT5tX2ltcGwgPT0gdGhpcyk7Ci0gICAgbV9h
dHRyaWJ1dGUtPm1faW1wbCA9IDA7Ci19Ci0KLXZvaWQgQXR0cjo6Y3JlYXRlVGV4dENoaWxkKCkK
LXsKLSAgICBhc3NlcnQocmVmQ291bnQoKSk7Ci0gICAgaWYgKCFtX2F0dHJpYnV0ZS0+dmFsdWUo
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIG1f
aWdub3JlQ2hpbGRyZW5DaGFuZ2VkKys7Ci0gICAgICAgIGFwcGVuZENoaWxkKGdldERvY3VtZW50
KCktPmNyZWF0ZVRleHROb2RlKG1fYXR0cmlidXRlLT52YWx1ZSgpLmltcGwoKSksIGVjKTsKLSAg
ICAgICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQtLTsKLSAgICB9Ci19Ci0KLVN0cmluZyBBdHRy
Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWUoKTsKLX0KLQotTm9kZTo6Tm9k
ZVR5cGUgQXR0cjo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBBVFRSSUJVVEVfTk9E
RTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBBdHRyOjpsb2NhbE5hbWUoKSBjb25zdAotewot
ICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+bG9jYWxOYW1lKCk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0
cmluZyYgQXR0cjo6bmFtZXNwYWNlVVJJKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hdHRyaWJ1
dGUtPm5hbWVzcGFjZVVSSSgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEF0dHI6OnByZWZp
eCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXR0cmlidXRlLT5wcmVmaXgoKTsKLX0KLQotdm9p
ZCBBdHRyOjpzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBFeGNlcHRpb25D
b2RlJiBlYykKLXsKLSAgICBjaGVja1NldFByZWZpeChfcHJlZml4LCBlYyk7Ci0gICAgaWYgKGVj
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2F0dHJpYnV0ZS0+c2V0UHJlZml4KF9wcmVmaXgp
OwotfQotCi1TdHJpbmcgQXR0cjo6bm9kZVZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmFs
dWUoKTsKLX0KLQotdm9pZCBBdHRyOjpzZXRWYWx1ZSggY29uc3QgU3RyaW5nJiB2LCBFeGNlcHRp
b25Db2RlJiBlYykKLXsKLSAgICBlYyA9IDA7Ci0KLSAgICAvLyBkbyBub3QgaW50ZXJwcmV0ZSBl
bnRpdGllcyBpbiB0aGUgc3RyaW5nLCBpdHMgbGl0ZXJhbCEKLQotICAgIC8vIE5PX01PRElGSUNB
VElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkKLSAgICBp
ZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURf
RVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gIyMjIHdoYXQgdG8gZG8gb24g
MCA/Ci0gICAgaWYgKHYuaXNOdWxsKCkpIHsKLSAgICAgICAgZWMgPSBET01TVFJJTkdfU0laRV9F
UlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgZSA9IDA7Ci0gICAgbV9pZ25v
cmVDaGlsZHJlbkNoYW5nZWQrKzsKLSAgICByZW1vdmVDaGlsZHJlbigpOwotICAgIGFwcGVuZENo
aWxkKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKHYuaW1wbCgpKSwgZSk7Ci0gICAgbV9p
Z25vcmVDaGlsZHJlbkNoYW5nZWQtLTsKLSAgICAKLSAgICBtX2F0dHJpYnV0ZS0+c2V0VmFsdWUo
di5pbXBsKCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAgICAgIG1fZWxlbWVudC0+YXR0cmli
dXRlQ2hhbmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0KLXZvaWQgQXR0cjo6c2V0Tm9kZVZh
bHVlKGNvbnN0IFN0cmluZyYgdiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8gTk9fTU9E
SUZJQ0FUSU9OX0FMTE9XRURfRVJSOiB0YWtlbiBjYXJlIG9mIGJ5IHNldFZhbHVlKCkKLSAgICBz
ZXRWYWx1ZSh2LCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gQXR0cjo6Y2xvbmVOb2RlKGJv
b2wgLypkZWVwKi8pCi17Ci0gICAgUmVmUHRyPEF0dHI+IGNsb25lID0gbmV3IEF0dHIoMCwgZ2V0
RG9jdW1lbnQoKSwgbV9hdHRyaWJ1dGUtPmNsb25lKCkpOwotICAgIGNsb25lQ2hpbGROb2Rlcyhj
bG9uZS5nZXQoKSk7Ci0gICAgcmV0dXJuIGNsb25lLnJlbGVhc2UoKTsKLX0KLQotLy8gRE9NIFNl
Y3Rpb24gMS4xLjEKLWJvb2wgQXR0cjo6Y2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSB0eXBlKQot
ewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIFRFWFRfTk9ERToKLSAgICAgICAg
Y2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZv
aWQgQXR0cjo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBOb2RlOjpjaGlsZHJlbkNoYW5nZWQo
KTsKLSAgICAKLSAgICBpZiAobV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQgPiAwKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBpbmNsdWRlIGVudGl0eSByZWZl
cmVuY2VzIGluIHRoZSB2YWx1ZQotICAgIAotICAgIFN0cmluZyB2YWwgPSAiIjsKLSAgICBmb3Ig
KE5vZGUgKm4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKSB7Ci0gICAg
ICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB2YWwgKz0gc3RhdGljX2Nhc3Q8
VGV4dCAqPihuKS0+ZGF0YSgpOwotICAgIH0KLSAgICAKLSAgICBtX2F0dHJpYnV0ZS0+c2V0VmFs
dWUodmFsLmltcGwoKSk7Ci0gICAgaWYgKG1fZWxlbWVudCkKLSAgICAgICAgbV9lbGVtZW50LT5h
dHRyaWJ1dGVDaGFuZ2VkKG1fYXR0cmlidXRlLmdldCgpKTsKLX0KLQotU3RyaW5nIEF0dHI6OnRv
U3RyaW5nKCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0OwotCi0gICAgcmVzdWx0ICs9IG5v
ZGVOYW1lKCk7Ci0KLSAgICAvLyBGSVhNRTogc3Vic3RpdHV0ZSBlbnRpdGllcyBmb3IgYW55IGlu
c3RhbmNlcyBvZiAiIG9yICcgLS0KLSAgICAvLyBtYXliZSBlYXNpZXIgdG8ganVzdCB1c2UgdGV4
dCB2YWx1ZSBhbmQgaWdub3JlIGV4aXN0aW5nCi0gICAgLy8gZW50aXR5IHJlZnM/Ci0KLSAgICBp
ZiAoZmlyc3RDaGlsZCgpICE9IE5VTEwpIHsKLSAgICAgICAgcmVzdWx0ICs9ICI9XCIiOwotCi0g
ICAgICAgIGZvciAoTm9kZSAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkICE9IE5VTEw7IGNo
aWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSBjaGls
ZC0+dG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0ICs9ICJc
IiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi0jaWZuZGVmIE5ERUJVRwotc3RydWN0IEVsZW1lbnRJbXBsQ291bnRlciAKLXsgCi0gICAg
c3RhdGljIGludCBjb3VudDsgCi0gICAgfkVsZW1lbnRJbXBsQ291bnRlcigpIHsgLyogaWYgKGNv
dW50ICE9IDApIGZwcmludGYoc3RkZXJyLCAiTEVBSzogJWQgRWxlbWVudFxuIiwgY291bnQpOyAq
LyB9IAotfTsKLWludCBFbGVtZW50SW1wbENvdW50ZXI6OmNvdW50Owotc3RhdGljIEVsZW1lbnRJ
bXBsQ291bnRlciBlbGVtZW50SW1wbENvdW50ZXI7Ci0jZW5kaWYgTkRFQlVHCi0KLUVsZW1lbnQ6
OkVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUsIERvY3VtZW50ICpkb2MpCi0gICAg
OiBDb250YWluZXJOb2RlKGRvYyksIG1fdGFnTmFtZShxTmFtZSkKLXsKLSNpZm5kZWYgTkRFQlVH
Ci0gICAgKytFbGVtZW50SW1wbENvdW50ZXI6OmNvdW50OwotI2VuZGlmCi19Ci0KLUVsZW1lbnQ6
On5FbGVtZW50KCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgLS1FbGVtZW50SW1wbENvdW50ZXI6
OmNvdW50OwotI2VuZGlmCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgbmFtZWRBdHRy
TWFwLT5kZXRhY2hGcm9tRWxlbWVudCgpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IEVsZW1lbnQ6
OmNsb25lTm9kZShib29sIGRlZXApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAg
UmVmUHRyPEVsZW1lbnQ+IGNsb25lID0gZ2V0RG9jdW1lbnQoKS0+Y3JlYXRlRWxlbWVudE5TKG5h
bWVzcGFjZVVSSSgpLCBub2RlTmFtZSgpLCBlYyk7Ci0gICAgYXNzZXJ0KCFlYyk7Ci0gICAgCi0g
ICAgLy8gY2xvbmUgYXR0cmlidXRlcwotICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgICpj
bG9uZS0+YXR0cmlidXRlcygpID0gKm5hbWVkQXR0ck1hcDsKLQotICAgIGNsb25lLT5jb3B5Tm9u
QXR0cmlidXRlUHJvcGVydGllcyh0aGlzKTsKLSAgICAKLSAgICBpZiAoZGVlcCkKLSAgICAgICAg
Y2xvbmVDaGlsZE5vZGVzKGNsb25lLmdldCgpKTsKLQotICAgIHJldHVybiBjbG9uZS5yZWxlYXNl
KCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5h
bWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmIChuYW1lZEF0dHJNYXApIHsK
LSAgICAgICAgbmFtZWRBdHRyTWFwLT5yZW1vdmVOYW1lZEl0ZW0obmFtZSwgZWMpOwotICAgICAg
ICBpZiAoZWMgPT0gTk9UX0ZPVU5EX0VSUikKLSAgICAgICAgICAgIGVjID0gMDsKLSAgICB9Ci19
Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUs
IGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAg
c2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLmltcGwoKSwgZWMpOwotfQotCi0vLyBWaXJ0dWFsIGZ1
bmN0aW9uLCBkZWZpbmVkIGluIGJhc2UgY2xhc3MuCi1OYW1lZEF0dHJNYXAgKkVsZW1lbnQ6OmF0
dHJpYnV0ZXMoKSBjb25zdAotewotICAgIHJldHVybiBhdHRyaWJ1dGVzKGZhbHNlKTsKLX0KLQot
TmFtZWRBdHRyTWFwKiBFbGVtZW50OjphdHRyaWJ1dGVzKGJvb2wgcmVhZG9ubHkpIGNvbnN0Ci17
Ci0gICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotICAgIGlmICghcmVhZG9ubHkg
JiYgIW5hbWVkQXR0ck1hcCkKLSAgICAgICAgY3JlYXRlQXR0cmlidXRlTWFwKCk7Ci0gICAgcmV0
dXJuIG5hbWVkQXR0ck1hcC5nZXQoKTsKLX0KLQotTm9kZTo6Tm9kZVR5cGUgRWxlbWVudDo6bm9k
ZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBFTEVNRU5UX05PREU7Ci19Ci0KLWNvbnN0IEF0
b21pY1N0cmluZ0xpc3QqIEVsZW1lbnQ6OmdldENsYXNzTGlzdCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0SURBdHRyaWJ1dGUo
KSBjb25zdAotewotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgPyBuYW1lZEF0dHJNYXAtPmlkKCkg
OiBudWxsQXRvbTsKLX0KLQotYm9vbCBFbGVtZW50OjpoYXNBdHRyaWJ1dGUoY29uc3QgUXVhbGlm
aWVkTmFtZSYgbmFtZSkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQXR0cmlidXRlTlMobmFtZS5u
YW1lc3BhY2VVUkkoKSwgbmFtZS5sb2NhbE5hbWUoKSk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmlu
ZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0
Ci17Ci0gICAgaWYgKG5hbWUgPT0gc3R5bGVBdHRyKQotICAgICAgICB1cGRhdGVTdHlsZUF0dHJp
YnV0ZUlmTmVlZGVkKCk7Ci0KLSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICBpZiAoQXR0
cmlidXRlKiBhID0gbmFtZWRBdHRyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKG5hbWUpKQotICAgICAg
ICAgICAgcmV0dXJuIGEtPnZhbHVlKCk7Ci0KLSAgICByZXR1cm4gbnVsbEF0b207Ci19Ci0KLXZv
aWQgRWxlbWVudDo6c2Nyb2xsSW50b1ZpZXcoYm9vbCBhbGlnblRvVG9wKSAKLXsKLSAgICBJbnRS
ZWN0IGJvdW5kcyA9IHRoaXMtPmdldFJlY3QoKTsgICAgCi0gICAgaWYgKHJlbmRlcmVyKCkpIHsK
LSAgICAgICAgLy8gQWxpZ24gdG8gdGhlIHRvcCAvIGJvdHRvbSBhbmQgdG8gdGhlIGNsb3Nlc3Qg
ZWRnZS4KLSAgICAgICAgaWYgKGFsaWduVG9Ub3ApCi0gICAgICAgICAgICByZW5kZXJlcigpLT5l
bmNsb3NpbmdMYXllcigpLT5zY3JvbGxSZWN0VG9WaXNpYmxlKGJvdW5kcywgUmVuZGVyTGF5ZXI6
OmdBbGlnblRvRWRnZUlmTmVlZGVkLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9wQWx3YXlzKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Ny
b2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRl
ZCwgUmVuZGVyTGF5ZXI6OmdBbGlnbkJvdHRvbUFsd2F5cyk7Ci0gICAgfQotfQotCi12b2lkIEVs
ZW1lbnQ6OnNjcm9sbEludG9WaWV3SWZOZWVkZWQoYm9vbCBjZW50ZXJJZk5lZWRlZCkKLXsKLSAg
ICBJbnRSZWN0IGJvdW5kcyA9IHRoaXMtPmdldFJlY3QoKTsgICAgCi0gICAgaWYgKHJlbmRlcmVy
KCkpIHsKLSAgICAgICAgaWYgKGNlbnRlcklmTmVlZGVkKQotICAgICAgICAgICAgcmVuZGVyZXIo
KS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxh
eWVyOjpnQWxpZ25DZW50ZXJJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnbkNlbnRlcklmTmVl
ZGVkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5
ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0Vk
Z2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnblRvRWRnZUlmTmVlZGVkKTsKLSAgICB9Ci19
Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBpbkhUTUxEb2N1bWVudChjb25zdCBFbGVtZW50KiBlKQog
ewogICAgIHJldHVybiBlICYmIGUtPmdldERvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCk7CiB9
CiAKLWNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRlKGNvbnN0IFN0cmlu
ZyYgbmFtZSkgY29uc3QKLXsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1lbnQo
dGhpcykgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUXVh
bGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVsbEF0b20pKTsKLX0KLQot
Y29uc3QgQXRvbWljU3RyaW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcm
IG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgp
LCBuYW1lc3BhY2VVUkkuaW1wbCgpKSk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRl
KGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYg
ZWMpCi17Ci0gICAgaWYgKCFEb2N1bWVudDo6aXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAg
ZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
U3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDog
bmFtZTsKLSAgICBzZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1l
LmltcGwoKSwgbnVsbEF0b20pLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0KLQotdm9pZCBFbGVtZW50
OjpzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFs
dWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAg
IGdldERvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7Ci0KLSAgICAvLyBhbGxvY2F0ZSBh
dHRyaWJ1dGVtYXAgaWYgbmVjZXNzYXJ5Ci0gICAgQXR0cmlidXRlKiBvbGQgPSBhdHRyaWJ1dGVz
KGZhbHNlKS0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKTsKLQotICAgIC8vIE5PX01PRElGSUNBVElP
Tl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkKLSAgICBpZiAo
bmFtZWRBdHRyTWFwLT5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJ
T05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9
PSBpZEF0dHIpCi0gICAgICAgIHVwZGF0ZUlkKG9sZCA/IG9sZC0+dmFsdWUoKSA6IG51bGxBdG9t
LCB2YWx1ZSk7Ci0gICAgCi0gICAgaWYgKG9sZCAmJiAhdmFsdWUpCi0gICAgICAgIG5hbWVkQXR0
ck1hcC0+cmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgIGVsc2UgaWYgKCFvbGQgJiYgdmFsdWUp
Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+YWRkQXR0cmlidXRlKGNyZWF0ZUF0dHJpYnV0ZShuYW1l
LCB2YWx1ZSkpOwotICAgIGVsc2UgaWYgKG9sZCAmJiB2YWx1ZSkgewotICAgICAgICBvbGQtPnNl
dFZhbHVlKHZhbHVlKTsKLSAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChvbGQpOwotICAgIH0KLX0K
LQotQXR0cmlidXRlKiBFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFt
ZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpCi17Ci0gICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUo
bmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZU1hcChOYW1lZEF0
dHJNYXAqIGxpc3QpCi17Ci0gICAgaWYgKGluRG9jdW1lbnQoKSkKLSAgICAgICAgZ2V0RG9jdW1l
bnQoKS0+aW5jRE9NVHJlZVZlcnNpb24oKTsKLQotICAgIC8vIElmIHNldHRpbmcgdGhlIHdob2xl
IG1hcCBjaGFuZ2VzIHRoZSBpZCBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8gY2FsbCB1cGRhdGVJZC4K
LQotICAgIEF0dHJpYnV0ZSAqb2xkSWQgPSBuYW1lZEF0dHJNYXAgPyBuYW1lZEF0dHJNYXAtPmdl
dEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKSA6IDA7Ci0gICAgQXR0cmlidXRlICpuZXdJZCA9IGxpc3Qg
PyBsaXN0LT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cikgOiAwOwotCi0gICAgaWYgKG9sZElkIHx8
IG5ld0lkKQotICAgICAgICB1cGRhdGVJZChvbGRJZCA/IG9sZElkLT52YWx1ZSgpIDogbnVsbEF0
b20sIG5ld0lkID8gbmV3SWQtPnZhbHVlKCkgOiBudWxsQXRvbSk7Ci0KLSAgICBpZiAobmFtZWRB
dHRyTWFwKQotICAgICAgICBuYW1lZEF0dHJNYXAtPmVsZW1lbnQgPSAwOwotCi0gICAgbmFtZWRB
dHRyTWFwID0gbGlzdDsKLQotICAgIGlmIChuYW1lZEF0dHJNYXApIHsKLSAgICAgICAgbmFtZWRB
dHRyTWFwLT5lbGVtZW50ID0gdGhpczsKLSAgICAgICAgdW5zaWduZWQgbGVuID0gbmFtZWRBdHRy
TWFwLT5sZW5ndGgoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsr
KQotICAgICAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lZEF0dHJNYXAtPmF0dHJzW2ldKTsK
LSAgICAgICAgLy8gRklYTUU6IFdoYXQgYWJvdXQgYXR0cmlidXRlcyB0aGF0IHdlcmUgaW4gdGhl
IG9sZCBtYXAgdGhhdCBhcmUgbm90IGluIHRoZSBuZXcgbWFwPwotICAgIH0KLX0KLQotYm9vbCBF
bGVtZW50OjpoYXNBdHRyaWJ1dGVzKCkgY29uc3QKLXsKLSAgICB1cGRhdGVTdHlsZUF0dHJpYnV0
ZUlmTmVlZGVkKCk7Ci0gICAgcmV0dXJuIG5hbWVkQXR0ck1hcCAmJiBuYW1lZEF0dHJNYXAtPmxl
bmd0aCgpID4gMDsKLX0KLQotU3RyaW5nIEVsZW1lbnQ6Om5vZGVOYW1lKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV90YWdOYW1lLnRvU3RyaW5nKCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0UHJl
Zml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0g
ICAgY2hlY2tTZXRQcmVmaXgoX3ByZWZpeCwgZWMpOwotICAgIGlmIChlYykKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgbV90YWdOYW1lLnNldFByZWZpeChfcHJlZml4KTsKLX0KLQotdm9pZCBFbGVt
ZW50OjpjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIG5hbWVkQXR0ck1hcCA9IG5l
dyBOYW1lZEF0dHJNYXAoY29uc3RfY2FzdDxFbGVtZW50Kj4odGhpcykpOwotfQotCi1ib29sIEVs
ZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLVJlbmRlclN0eWxlICpFbGVtZW50OjpjcmVhdGVTdHlsZUZvclJlbmRl
cmVyKFJlbmRlck9iamVjdCAqcGFyZW50UmVuZGVyZXIpCi17Ci0gICAgcmV0dXJuIGdldERvY3Vt
ZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Y3JlYXRlU3R5bGVGb3JFbGVtZW50KHRoaXMpOwotfQot
Ci1SZW5kZXJPYmplY3QgKkVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVu
YSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIGlmIChnZXREb2N1bWVudCgpLT5kb2N1bWVu
dEVsZW1lbnQoKSA9PSB0aGlzICYmIHN0eWxlLT5kaXNwbGF5KCkgPT0gTk9ORSkgewotICAgICAg
ICAvLyBJZ25vcmUgZGlzcGxheTogbm9uZSBvbiByb290IGVsZW1lbnRzLiAgRm9yY2UgYSBkaXNw
bGF5IG9mIGJsb2NrIGluIHRoYXQgY2FzZS4KLSAgICAgICAgUmVuZGVyQmxvY2sqIHJlc3VsdCA9
IG5ldyAoYXJlbmEpIFJlbmRlckJsb2NrKHRoaXMpOwotICAgICAgICBpZiAocmVzdWx0KSByZXN1
bHQtPnNldFN0eWxlKHN0eWxlKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAg
cmV0dXJuIFJlbmRlck9iamVjdDo6Y3JlYXRlT2JqZWN0KHRoaXMsIHN0eWxlKTsKLX0KLQotCi12
b2lkIEVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICAvLyBuZWVkIHRvIGRv
IHN1cGVyY2xhc3MgcHJvY2Vzc2luZyBmaXJzdCBzbyBpbkRvY3VtZW50KCkgaXMgdHJ1ZQotICAg
IC8vIGJ5IHRoZSB0aW1lIHdlIHJlYWNoIHVwZGF0ZUlkCi0gICAgQ29udGFpbmVyTm9kZTo6aW5z
ZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLQotICAgIGlmIChoYXNJRCgpKSB7Ci0gICAgICAgIE5hbWVk
QXR0ck1hcCogYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgICAgICBpZiAoYXR0cnMpIHsK
LSAgICAgICAgICAgIEF0dHJpYnV0ZSogaWRJdGVtID0gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0o
aWRBdHRyKTsKLSAgICAgICAgICAgIGlmIChpZEl0ZW0gJiYgIWlkSXRlbS0+aXNOdWxsKCkpCi0g
ICAgICAgICAgICAgICAgdXBkYXRlSWQobnVsbEF0b20sIGlkSXRlbS0+dmFsdWUoKSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRWxlbWVudDo6cmVtb3ZlZEZyb21Eb2N1bWVudCgpCi17
Ci0gICAgaWYgKGhhc0lEKCkpIHsKLSAgICAgICAgTmFtZWRBdHRyTWFwKiBhdHRycyA9IGF0dHJp
YnV0ZXModHJ1ZSk7Ci0gICAgICAgIGlmIChhdHRycykgewotICAgICAgICAgICAgQXR0cmlidXRl
KiBpZEl0ZW0gPSBhdHRycy0+Z2V0QXR0cmlidXRlSXRlbShpZEF0dHIpOwotICAgICAgICAgICAg
aWYgKGlkSXRlbSAmJiAhaWRJdGVtLT5pc051bGwoKSkKLSAgICAgICAgICAgICAgICB1cGRhdGVJ
ZChpZEl0ZW0tPnZhbHVlKCksIG51bGxBdG9tKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENv
bnRhaW5lck5vZGU6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLX0KLQotdm9pZCBFbGVtZW50Ojph
dHRhY2goKQotewotI2lmIFNQRUVEX0RFQlVHIDwgMQotICAgIGNyZWF0ZVJlbmRlcmVySWZOZWVk
ZWQoKTsKLSNlbmRpZgotICAgIENvbnRhaW5lck5vZGU6OmF0dGFjaCgpOwotfQotCi12b2lkIEVs
ZW1lbnQ6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaGFuZ2UgKQotewotICAgIC8vICMjIyBz
aG91bGQgZ28gYXdheSBhbmQgYmUgZG9uZSBpbiByZW5kZXJvYmplY3QKLSAgICBSZW5kZXJTdHls
ZSogX3N0eWxlID0gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPnN0eWxlKCkgOiAwOwotICAgIGJv
b2wgaGFzUGFyZW50UmVuZGVyZXIgPSBwYXJlbnQoKSA/IHBhcmVudCgpLT5yZW5kZXJlcigpIDog
ZmFsc2U7Ci0gICAgCi0gICAgaWYgKCBoYXNQYXJlbnRSZW5kZXJlciAmJiAoY2hhbmdlID49IElu
aGVyaXQgfHwgY2hhbmdlZCgpKSApIHsKLSAgICAgICAgUmVuZGVyU3R5bGUgKm5ld1N0eWxlID0g
Z2V0RG9jdW1lbnQoKS0+c3R5bGVTZWxlY3RvcigpLT5jcmVhdGVTdHlsZUZvckVsZW1lbnQodGhp
cyk7Ci0gICAgICAgIFN0eWxlQ2hhbmdlIGNoID0gZGlmZiggX3N0eWxlLCBuZXdTdHlsZSApOwot
ICAgICAgICBpZiAoY2ggPT0gRGV0YWNoKSB7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWQoKSkg
ZGV0YWNoKCk7Ci0gICAgICAgICAgICAvLyAjIyMgU3Vib3B0aW1hbC4gU3R5bGUgZ2V0cyBjYWxj
dWxhdGVkIGFnYWluLgotICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgICAgICAvLyBhdHRh
Y2ggcmVjYWx1bGF0ZXMgdGhlIHN0eWxlIGZvciBhbGwgY2hpbGRyZW4uIE5vIG5lZWQgdG8gZG8g
aXQgdHdpY2UuCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCBmYWxzZSApOwotICAgICAgICAgICAg
c2V0SGFzQ2hhbmdlZENoaWxkKCBmYWxzZSApOwotICAgICAgICAgICAgbmV3U3R5bGUtPmRlcmVm
KGdldERvY3VtZW50KCktPnJlbmRlckFyZW5hKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoICE9IE5vQ2hhbmdlKSB7Ci0gICAgICAgICAgICBp
ZiAocmVuZGVyZXIoKSAmJiBuZXdTdHlsZSkKLSAgICAgICAgICAgICAgICByZW5kZXJlcigpLT5z
ZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hhbmdlZCgp
ICYmIHJlbmRlcmVyKCkgJiYgbmV3U3R5bGUgJiYgKGdldERvY3VtZW50KCktPnVzZXNTaWJsaW5n
UnVsZXMoKSB8fCBnZXREb2N1bWVudCgpLT51c2VzRGVzY2VuZGFudFJ1bGVzKCkpKSB7Ci0gICAg
ICAgICAgICAvLyBBbHRob3VnaCBubyBjaGFuZ2Ugb2NjdXJyZWQsIHdlIHVzZSB0aGUgbmV3IHN0
eWxlIHNvIHRoYXQgdGhlIGNvdXNpbiBzdHlsZSBzaGFyaW5nIGNvZGUgd29uJ3QgZ2V0Ci0gICAg
ICAgICAgICAvLyBmb29sZWQgaW50byBiZWxpZXZpbmcgdGhpcyBzdHlsZSBpcyB0aGUgc2FtZS4g
IFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgdGhlIGRvY3VtZW50IGFjdHVhbGx5IHVzZXMKLSAg
ICAgICAgICAgIC8vIHNpYmxpbmcvZGVzY2VuZGFudCBydWxlcywgc2luY2Ugb3RoZXJ3aXNlIGl0
IGlzbid0IHBvc3NpYmxlIGZvciBhbmNlc3RvciBzdHlsZXMgdG8gYWZmZWN0IHNoYXJpbmcgb2YK
LSAgICAgICAgICAgIC8vIGRlc2NlbmRhbnRzLgotICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0
U3R5bGVJbnRlcm5hbChuZXdTdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXdTdHlsZS0+
ZGVyZWYoZ2V0RG9jdW1lbnQoKS0+cmVuZGVyQXJlbmEoKSk7Ci0KLSAgICAgICAgaWYgKCBjaGFu
Z2UgIT0gRm9yY2UpIHsKLSAgICAgICAgICAgIGlmIChnZXREb2N1bWVudCgpLT51c2VzRGVzY2Vu
ZGFudFJ1bGVzKCkpCi0gICAgICAgICAgICAgICAgY2hhbmdlID0gRm9yY2U7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgY2hhbmdlID0gY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBmb3IgKE5vZGUgKm4gPSBmYXN0Rmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxp
bmcoKSkgewotICAgICAgICBpZiAoY2hhbmdlID49IEluaGVyaXQgfHwgbi0+aXNUZXh0Tm9kZSgp
IHx8IG4tPmhhc0NoYW5nZWRDaGlsZCgpIHx8IG4tPmNoYW5nZWQoKSkKLSAgICAgICAgICAgIG4t
PnJlY2FsY1N0eWxlKGNoYW5nZSk7Ci0gICAgfQotCi0gICAgc2V0Q2hhbmdlZCggZmFsc2UgKTsK
LSAgICBzZXRIYXNDaGFuZ2VkQ2hpbGQoIGZhbHNlICk7Ci19Ci0KLWJvb2wgRWxlbWVudDo6Y2hp
bGRUeXBlQWxsb3dlZChOb2RlVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAg
ICAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBURVhUX05PREU6Ci0gICAgICAg
IGNhc2UgQ09NTUVOVF9OT0RFOgotICAgICAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05f
Tk9ERToKLSAgICAgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgRU5U
SVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci19Ci0KLXZvaWQgRWxlbWVudDo6ZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KEF0dHJpYnV0
ZSopCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVuKCkpOwotI2lmIDAKLSAg
ICBpZiAoIWdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudDo6RE9NQVRUUk1P
RElGSUVEX0xJU1RFTkVSKSkKLSAgICAgICAgcmV0dXJuOwotICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgIGRpc3BhdGNoRXZlbnQobmV3IE11dGF0aW9uRXZlbnQoRE9NQXR0ck1vZGlmaWVk
RXZlbnQsIHRydWUsIGZhbHNlLCBhdHRyLCBhdHRyLT52YWx1ZSgpLAotICAgICAgICBhdHRyLT52
YWx1ZSgpLCBnZXREb2N1bWVudCgpLT5hdHRyTmFtZShhdHRyLT5pZCgpKSwgTXV0YXRpb25FdmVu
dDo6UkVNT1ZBTCksIGVjKTsKLSNlbmRpZgotfQotCi12b2lkIEVsZW1lbnQ6OmRpc3BhdGNoQXR0
ckFkZGl0aW9uRXZlbnQoQXR0cmlidXRlICphdHRyKQotewotICAgIGFzc2VydCghZXZlbnREaXNw
YXRjaEZvcmJpZGRlbigpKTsKLSNpZiAwCi0gICAgaWYgKCFnZXREb2N1bWVudCgpLT5oYXNMaXN0
ZW5lclR5cGUoRG9jdW1lbnQ6OkRPTUFUVFJNT0RJRklFRF9MSVNURU5FUikpCi0gICAgICAgIHJl
dHVybjsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBkaXNwYXRjaEV2ZW50KG5ldyBN
dXRhdGlvbkV2ZW50KERPTUF0dHJNb2RpZmllZEV2ZW50LCB0cnVlLCBmYWxzZSwgYXR0ciwgYXR0
ci0+dmFsdWUoKSwKLSAgICAgICAgYXR0ci0+dmFsdWUoKSxnZXREb2N1bWVudCgpLT5hdHRyTmFt
ZShhdHRyLT5pZCgpKSwgTXV0YXRpb25FdmVudDo6QURESVRJT04pLCBlYyk7Ci0jZW5kaWYKLX0K
LQotU3RyaW5nIEVsZW1lbnQ6Om9wZW5UYWdTdGFydFRvU3RyaW5nKCkgY29uc3QKLXsKLSAgICBT
dHJpbmcgcmVzdWx0ID0gIjwiICsgbm9kZU5hbWUoKTsKLQotICAgIE5hbWVkQXR0ck1hcCAqYXR0
ck1hcCA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0KLSAgICBpZiAoYXR0ck1hcCkgewotICAgICAgICB1
bnNpZ25lZCBudW1BdHRycyA9IGF0dHJNYXAtPmxlbmd0aCgpOwotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbnVtQXR0cnM7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ICs9ICIg
IjsKLQotICAgICAgICAgICAgQXR0cmlidXRlICphdHRyaWJ1dGUgPSBhdHRyTWFwLT5hdHRyaWJ1
dGVJdGVtKGkpOwotICAgICAgICAgICAgcmVzdWx0ICs9IGF0dHJpYnV0ZS0+bmFtZSgpLnRvU3Ry
aW5nKCk7Ci0gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZS0+dmFsdWUoKS5pc051bGwoKSkgewot
ICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiPVwiIjsKLSAgICAgICAgICAgICAgICAvLyBGSVhN
RTogc3Vic3RpdHV0ZSBlbnRpdGllcyBmb3IgYW55IGluc3RhbmNlcyBvZiAiIG9yICcKLSAgICAg
ICAgICAgICAgICByZXN1bHQgKz0gYXR0cmlidXRlLT52YWx1ZSgpOwotICAgICAgICAgICAgICAg
IHJlc3VsdCArPSAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQotU3RyaW5nIEVsZW1lbnQ6OnRvU3RyaW5nKCkgY29uc3QKLXsK
LSAgICBTdHJpbmcgcmVzdWx0ID0gb3BlblRhZ1N0YXJ0VG9TdHJpbmcoKTsKLQotICAgIGlmICho
YXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgcmVzdWx0ICs9ICI+IjsKLQotICAgICAgICBmb3Ig
KE5vZGUgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxk
LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQtPnRvU3RyaW5n
KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgKz0gIjwvIjsKLSAgICAgICAgcmVzdWx0
ICs9IG5vZGVOYW1lKCk7Ci0gICAgICAgIHJlc3VsdCArPSAiPiI7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgcmVzdWx0ICs9ICIgLz4iOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0K
LXZvaWQgRWxlbWVudDo6dXBkYXRlSWQoY29uc3QgQXRvbWljU3RyaW5nJiBvbGRJZCwgY29uc3Qg
QXRvbWljU3RyaW5nJiBuZXdJZCkKLXsKLSAgICBpZiAoIWluRG9jdW1lbnQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaWYgKG9sZElkID09IG5ld0lkKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBEb2N1bWVudCogZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoIW9sZElkLmlzRW1wdHko
KSkKLSAgICAgICAgZG9jLT5yZW1vdmVFbGVtZW50QnlJZChvbGRJZCwgdGhpcyk7Ci0gICAgaWYg
KCFuZXdJZC5pc0VtcHR5KCkpCi0gICAgICAgIGRvYy0+YWRkRWxlbWVudEJ5SWQobmV3SWQsIHRo
aXMpOwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBFbGVtZW50OjpkdW1wKFFUZXh0U3RyZWFt
ICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kKSBjb25zdAotewotICAgIHVwZGF0ZVN0eWxl
QXR0cmlidXRlSWZOZWVkZWQoKTsKLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYW1lZEF0dHJNYXAtPmxlbmd0aCgpOyBpKyspIHsKLSAg
ICAgICAgICAgIEF0dHJpYnV0ZSAqYXR0ciA9IG5hbWVkQXR0ck1hcC0+YXR0cmlidXRlSXRlbShp
KTsKLSAgICAgICAgICAgICpzdHJlYW0gPDwgIiAiIDw8IGF0dHItPm5hbWUoKS5sb2NhbE5hbWUo
KS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKQotICAgICAgICAgICAgICAgICAgICA8PCAiPVwi
IiA8PCBhdHRyLT52YWx1ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpIDw8ICJcIiI7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBDb250YWluZXJOb2RlOjpkdW1wKHN0cmVhbSxpbmQpOwot
fQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIEVsZW1lbnQ6OmZvcm1hdEZvckRlYnVn
Z2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAotewotICAgIFN0cmluZyBy
ZXN1bHQ7Ci0gICAgU3RyaW5nIHM7Ci0gICAgCi0gICAgcyA9IG5vZGVOYW1lKCk7Ci0gICAgaWYg
KHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHJlc3VsdCArPSBzOwotICAgIH0KLSAgICAgICAg
ICAKLSAgICBzID0gZ2V0QXR0cmlidXRlKGlkQXR0cik7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPiAw
KSB7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmVzdWx0
ICs9ICI7ICI7Ci0gICAgICAgIHJlc3VsdCArPSAiaWQ9IjsKLSAgICAgICAgcmVzdWx0ICs9IHM7
Ci0gICAgfQotICAgICAgICAgIAotICAgIHMgPSBnZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKTsKLSAg
ICBpZiAocy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDAp
Ci0gICAgICAgICAgICByZXN1bHQgKz0gIjsgIjsKLSAgICAgICAgcmVzdWx0ICs9ICJjbGFzcz0i
OwotICAgICAgICByZXN1bHQgKz0gczsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgc3RybmNweShi
dWZmZXIsIHJlc3VsdC5kZXByZWNhdGVkU3RyaW5nKCkubGF0aW4xKCksIGxlbmd0aCAtIDEpOwot
fQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6c2V0QXR0cmlidXRlTm9kZShB
dHRyICphdHRyLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBBU1NFUlQoYXR0cik7Ci0gICAg
cmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cmlidXRlcyhmYWxzZSktPnNldE5h
bWVkSXRlbShhdHRyLCBlYykpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OnJlbW92
ZUF0dHJpYnV0ZU5vZGUoQXR0ciAqYXR0ciwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYg
KCFhdHRyIHx8IGF0dHItPm93bmVyRWxlbWVudCgpICE9IHRoaXMpIHsKLSAgICAgICAgZWMgPSBO
T1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGdldERvY3Vt
ZW50KCkgIT0gYXR0ci0+Z2V0RG9jdW1lbnQoKSkgewotICAgICAgICBlYyA9IFdST05HX0RPQ1VN
RU5UX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgTmFtZWRBdHRyTWFwICph
dHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRyPihhdHRycy0+cmVtb3Zl
TmFtZWRJdGVtKGF0dHItPnF1YWxpZmllZE5hbWUoKSwgZWMpKTsKLX0KLQotdm9pZCBFbGVtZW50
OjpzZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5n
JiBxdWFsaWZpZWROYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICBTdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgaWYgKCFEb2N1bWVudDo6cGFy
c2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lKSkgewotICAg
ICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICBzZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShwcmVmaXguaW1wbCgpLCBsb2NhbE5hbWUu
aW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSwgdmFsdWUuaW1wbCgpLCBlYyk7Ci19Ci0KLXZv
aWQgRWxlbWVudDo6cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9u
Q29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMp
ID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZW1vdmVBdHRyaWJ1dGUoUXVhbGlmaWVkTmFt
ZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVsbEF0b20pLCBlYyk7Ci19Ci0KLXZvaWQg
RWxlbWVudDo6cmVtb3ZlQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNv
bnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICByZW1vdmVB
dHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNw
YWNlVVJJLmltcGwoKSksIGVjKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpnZXRB
dHRyaWJ1dGVOb2RlKGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBOYW1lZEF0dHJNYXAgKmF0
dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBpZiAoIWF0dHJzKQotICAgICAgICByZXR1cm4g
MDsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1lbnQodGhpcykgPyBuYW1lLmxv
d2VyKCkgOiBuYW1lOwotICAgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9jYXN0PEF0dHI+KGF0dHJz
LT5nZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwg
bnVsbEF0b20pKSk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6Z2V0QXR0cmlidXRl
Tm9kZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFt
ZSkKLXsKLSAgICBOYW1lZEF0dHJNYXAgKmF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBp
ZiAoIWF0dHJzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJf
Y2FzdDxBdHRyPihhdHRycy0+Z2V0TmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxv
Y2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpKSk7Ci19Ci0KLWJvb2wgRWxlbWVu
dDo6aGFzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3QKLXsKLSAgICBOYW1lZEF0
dHJNYXAgKmF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBpZiAoIWF0dHJzKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRo
aXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gYXR0cnMtPmdldEF0dHJpYnV0
ZUl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVsbEF0b20p
KTsKLX0KLQotYm9vbCBFbGVtZW50OjpoYXNBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVz
cGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0Ci17Ci0gICAgTmFtZWRBdHRy
TWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBhdHRycy0+Z2V0QXR0cmlidXRlSXRlbShRdWFsaWZp
ZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSk7
Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb24gKkVsZW1lbnQ6OnN0eWxlKCkKLXsKLSAgICByZXR1
cm4gMDsKLX0KLQotdm9pZCBFbGVtZW50Ojpmb2N1cygpCi17Ci0gICAgRG9jdW1lbnQqIGRvYyA9
IGdldERvY3VtZW50KCk7Ci0gICAgZG9jLT51cGRhdGVMYXlvdXQoKTsKLSAgICBpZiAoaXNGb2N1
c2FibGUoKSkgewotICAgICAgICBkb2MtPnNldEZvY3VzTm9kZSh0aGlzKTsKLSAgICAgICAgaWYg
KHJvb3RFZGl0YWJsZUVsZW1lbnQoKSA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTog
d2Ugc2hvdWxkIHJlc3RvcmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvbiBpZiB0aGVyZSBpcyBvbmUs
IGluc3RlYWQgb2YgYWx3YXlzIHNlbGVjdGluZyBhbGwuCi0gICAgICAgICAgICBpZiAoZG9jLT5m
cmFtZSgpLT5zZWxlY3RDb250ZW50c09mTm9kZSh0aGlzKSkKLSAgICAgICAgICAgICAgICBkb2Mt
PmZyYW1lKCktPnJldmVhbFNlbGVjdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcmVy
KCkgJiYgIXJlbmRlcmVyKCktPmlzV2lkZ2V0KCkpCi0gICAgICAgICAgICByZW5kZXJlcigpLT5l
bmNsb3NpbmdMYXllcigpLT5zY3JvbGxSZWN0VG9WaXNpYmxlKGdldFJlY3QoKSk7Ci0gICAgfQot
fQotCi12b2lkIEVsZW1lbnQ6OmJsdXIoKQotewotICAgIERvY3VtZW50KiBkb2MgPSBnZXREb2N1
bWVudCgpOwotICAgIGlmIChkb2MtPmZvY3VzTm9kZSgpID09IHRoaXMpCi0gICAgICAgIGRvYy0+
c2V0Rm9jdXNOb2RlKDApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIE5hbWVkQXR0ck1h
cDo6TmFtZWRBdHRyTWFwKEVsZW1lbnQgKmUpCiAgICAgOiBlbGVtZW50KGUpCiAgICAgLCBhdHRy
cygwKQpAQCAtMTE1NCw1MDUgKzMzNCw0IEBAIGJvb2wgTmFtZWRBdHRyTWFwOjptYXBzRXF1aXZh
bGVudChjb25zdCAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSBTdHlsZWQgRWxlbWVudCBhbmQgTWFwcGVkIEF0dHJpYnV0ZSBJbXBsZW1l
bnRhdGlvbgotCi1DU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbjo6fkNTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKCkKLXsKLSAgICBpZiAobV9lbnRyeVR5cGUgIT0gZVBlcnNpc3RlbnQp
Ci0gICAgICAgIFN0eWxlZEVsZW1lbnQ6OnJlbW92ZU1hcHBlZEF0dHJpYnV0ZURlY2wobV9lbnRy
eVR5cGUsIG1fYXR0ck5hbWUsIG1fYXR0clZhbHVlKTsKLX0KLQotQ1NTTWFwcGVkQXR0cmlidXRl
RGVjbGFyYXRpb24qIFN0eWxlZEVsZW1lbnQ6OmdldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVk
QXR0cmlidXRlRW50cnkgZW50cnlUeXBlLCBBdHRyaWJ1dGUqIGF0dHIpCi17Ci0gICAgaWYgKCFt
YXBwZWRBdHRyaWJ1dGVEZWNscykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG1hcHBl
ZEF0dHJpYnV0ZURlY2xzLT5nZXQoTWFwcGVkQXR0cmlidXRlS2V5KGVudHJ5VHlwZSwgYXR0ci0+
bmFtZSgpLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0ci0+dmFsdWUoKS5pbXBsKCkpKTsKLX0KLQot
dm9pZCBTdHlsZWRFbGVtZW50OjpzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0
ZUVudHJ5IGVudHJ5VHlwZSwgQXR0cmlidXRlKiBhdHRyLCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNs
YXJhdGlvbiogZGVjbCkKLXsKLSAgICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAgICAg
ICBtYXBwZWRBdHRyaWJ1dGVEZWNscyA9IG5ldyBNYXBwZWRBdHRyaWJ1dGVEZWNsczsKLSAgICBt
YXBwZWRBdHRyaWJ1dGVEZWNscy0+c2V0KE1hcHBlZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0
dHItPm5hbWUoKS5sb2NhbE5hbWUoKS5pbXBsKCksIGF0dHItPnZhbHVlKCkuaW1wbCgpKSwgZGVj
bCk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6cmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVjbChN
YXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBj
b25zdCBBdG9taWNTdHJpbmcmIGF0dHJWYWx1ZSkKLXsKLSAgICBpZiAoIW1hcHBlZEF0dHJpYnV0
ZURlY2xzKQotICAgICAgICByZXR1cm47Ci0gICAgbWFwcGVkQXR0cmlidXRlRGVjbHMtPnJlbW92
ZShNYXBwZWRBdHRyaWJ1dGVLZXkoZW50cnlUeXBlLCBhdHRyTmFtZS5sb2NhbE5hbWUoKS5pbXBs
KCksIGF0dHJWYWx1ZS5pbXBsKCkpKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjppbnZhbGlk
YXRlU3R5bGVBdHRyaWJ1dGUoKQotewotICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gZmFs
c2U7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6dXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRl
ZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCkgewotICAgICAg
ICBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCA9IHRydWU7Ci0gICAgICAgIG1fc3luY2hyb25pemlu
Z1N0eWxlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1faW5saW5lU3R5bGVEZWNsKQot
ICAgICAgICAgICAgY29uc3RfY2FzdDxTdHlsZWRFbGVtZW50Kj4odGhpcyktPnNldEF0dHJpYnV0
ZShzdHlsZUF0dHIsIG1faW5saW5lU3R5bGVEZWNsLT5jc3NUZXh0KCkpOwotICAgICAgICBtX3N5
bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgIH0KLX0KLQotQXR0cmlidXRl
KiBNYXBwZWRBdHRyaWJ1dGU6OmNsb25lKGJvb2wgcHJlc2VydmVEZWNsKSBjb25zdAotewotICAg
IHJldHVybiBuZXcgTWFwcGVkQXR0cmlidXRlKG5hbWUoKSwgdmFsdWUoKSwgcHJlc2VydmVEZWNs
ID8gbV9zdHlsZURlY2wuZ2V0KCkgOiAwKTsKLX0KLQotTmFtZWRNYXBwZWRBdHRyTWFwOjpOYW1l
ZE1hcHBlZEF0dHJNYXAoRWxlbWVudCAqZSkKLTpOYW1lZEF0dHJNYXAoZSksIG1fbWFwcGVkQXR0
cmlidXRlQ291bnQoMCkKLXt9Ci0KLXZvaWQgTmFtZWRNYXBwZWRBdHRyTWFwOjpjbGVhckF0dHJp
YnV0ZXMoKQotewotICAgIG1fY2xhc3NMaXN0LmNsZWFyKCk7Ci0gICAgbV9tYXBwZWRBdHRyaWJ1
dGVDb3VudCA9IDA7Ci0gICAgTmFtZWRBdHRyTWFwOjpjbGVhckF0dHJpYnV0ZXMoKTsKLX0KLQot
Ym9vbCBOYW1lZE1hcHBlZEF0dHJNYXA6OmlzTWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IE5hbWVkTWFwcGVkQXR0ck1hcDo6ZGVjbENvdW50
KCkgY29uc3QKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbGVuZ3RoKCk7IGkrKykgewotICAgICAgICBNYXBwZWRBdHRyaWJ1dGUqIGF0dHIgPSBh
dHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICBpZiAoYXR0ci0+ZGVjbCgpKQotICAgICAgICAgICAg
cmVzdWx0Kys7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWJvb2wgTmFtZWRNYXBw
ZWRBdHRyTWFwOjptYXBzRXF1aXZhbGVudChjb25zdCBOYW1lZE1hcHBlZEF0dHJNYXAqIG90aGVy
TWFwKSBjb25zdAotewotICAgIC8vIFRoZSAjIG9mIGRlY2xzIG11c3QgbWF0Y2guCi0gICAgaWYg
KGRlY2xDb3VudCgpICE9IG90aGVyTWFwLT5kZWNsQ291bnQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIC8vIFRoZSB2YWx1ZXMgZm9yIGVhY2ggZGVjbCBtdXN0IG1hdGNoLgot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIE1h
cHBlZEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgIGlmIChhdHRy
LT5kZWNsKCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSogb3RoZXJBdHRyID0gb3RoZXJNYXAt
PmdldEF0dHJpYnV0ZUl0ZW0oYXR0ci0+bmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghb3RoZXJB
dHRyIHx8IChhdHRyLT52YWx1ZSgpICE9IG90aGVyQXR0ci0+dmFsdWUoKSkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwot
fQotCi1pbmxpbmUgc3RhdGljIGJvb2wgaXNDbGFzc1doaXRlc3BhY2UoUUNoYXIgYykKLXsKLSAg
ICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdCc7
Ci19Ci0KLXZvaWQgTmFtZWRNYXBwZWRBdHRyTWFwOjpwYXJzZUNsYXNzQXR0cmlidXRlKGNvbnN0
IFN0cmluZyYgY2xhc3NTdHIpCi17Ci0gICAgbV9jbGFzc0xpc3QuY2xlYXIoKTsKLSAgICBpZiAo
IWVsZW1lbnQtPmhhc0NsYXNzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBTdHJpbmcg
Y2xhc3NBdHRyID0gZWxlbWVudC0+Z2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkgPyAKLSAg
ICAgICAgKGNsYXNzU3RyLmltcGwoKS0+aXNMb3dlcigpID8gY2xhc3NTdHIgOiBTdHJpbmcoY2xh
c3NTdHIuaW1wbCgpLT5sb3dlcigpKSkgOgotICAgICAgICBjbGFzc1N0cjsKLSAgICAKLSAgICBB
dG9taWNTdHJpbmdMaXN0KiBjdXJyID0gMDsKLSAgICAKLSAgICBjb25zdCBRQ2hhciogc3RyID0g
Y2xhc3NBdHRyLnVuaWNvZGUoKTsKLSAgICBpbnQgbGVuZ3RoID0gY2xhc3NBdHRyLmxlbmd0aCgp
OwotICAgIGludCBzUG9zID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHdoaWxl
IChzUG9zIDwgbGVuZ3RoICYmIGlzQ2xhc3NXaGl0ZXNwYWNlKHN0cltzUG9zXSkpCi0gICAgICAg
ICAgICArK3NQb3M7Ci0gICAgICAgIGlmIChzUG9zID49IGxlbmd0aCkKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBpbnQgZVBvcyA9IHNQb3MgKyAxOwotICAgICAgICB3aGlsZSAoZVBvcyA8
IGxlbmd0aCAmJiAhaXNDbGFzc1doaXRlc3BhY2Uoc3RyW2VQb3NdKSkKLSAgICAgICAgICAgICsr
ZVBvczsKLSAgICAgICAgaWYgKGN1cnIpIHsKLSAgICAgICAgICAgIGN1cnItPnNldE5leHQobmV3
IEF0b21pY1N0cmluZ0xpc3QoQXRvbWljU3RyaW5nKHN0ciArIHNQb3MsIGVQb3MgLSBzUG9zKSkp
OwotICAgICAgICAgICAgY3VyciA9IGN1cnItPm5leHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGlmIChzUG9zID09IDAgJiYgZVBvcyA9PSBsZW5ndGgpIHsKLSAgICAgICAgICAg
ICAgICBtX2NsYXNzTGlzdC5zZXRTdHJpbmcoQXRvbWljU3RyaW5nKGNsYXNzQXR0cikpOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9jbGFzc0xp
c3Quc2V0U3RyaW5nKEF0b21pY1N0cmluZyhzdHIgKyBzUG9zLCBlUG9zIC0gc1BvcykpOwotICAg
ICAgICAgICAgY3VyciA9ICZtX2NsYXNzTGlzdDsKLSAgICAgICAgfQotICAgICAgICBzUG9zID0g
ZVBvcyArIDE7Ci0gICAgfQotfQotCi1TdHlsZWRFbGVtZW50OjpTdHlsZWRFbGVtZW50KGNvbnN0
IFF1YWxpZmllZE5hbWUmIG5hbWUsIERvY3VtZW50ICpkb2MpCi0gICAgOiBFbGVtZW50KG5hbWUs
IGRvYykKLXsKLSAgICBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCA9IHRydWU7Ci0gICAgbV9zeW5j
aHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUgPSBmYWxzZTsKLX0KLQotU3R5bGVkRWxlbWVudDo6flN0
eWxlZEVsZW1lbnQoKQotewotICAgIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLX0KLQotQXR0
cmlidXRlKiBTdHlsZWRFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFt
ZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpCi17Ci0gICAgcmV0dXJuIG5ldyBNYXBwZWRBdHRy
aWJ1dGUobmFtZSwgdmFsdWUpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUlubGlu
ZVN0eWxlRGVjbCgpCi17Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wgPSBuZXcgQ1NTTXV0YWJsZVN0
eWxlRGVjbGFyYXRpb247Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldFBhcmVudChnZXREb2N1
bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldE5vZGUo
dGhpcyk7Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldFN0cmljdFBhcnNpbmcoIWdldERvY3Vt
ZW50KCktPmluQ29tcGF0TW9kZSgpKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpkZXN0cm95
SW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBpZiAobV9pbmxpbmVTdHlsZURlY2wpIHsKLSAgICAg
ICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldE5vZGUoMCk7Ci0gICAgICAgIG1faW5saW5lU3R5bGVE
ZWNsLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIG1faW5saW5lU3R5bGVEZWNsID0gMDsKLSAgICB9
Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YXR0cmlidXRlQ2hhbmdlZChBdHRyaWJ1dGUqIGF0
dHIsIGJvb2wgcHJlc2VydmVEZWNscykKLXsKLSAgICBNYXBwZWRBdHRyaWJ1dGUqIG1hcHBlZEF0
dHIgPSBzdGF0aWNfY2FzdDxNYXBwZWRBdHRyaWJ1dGUqPihhdHRyKTsKLSAgICBpZiAobWFwcGVk
QXR0ci0+ZGVjbCgpICYmICFwcmVzZXJ2ZURlY2xzKSB7Ci0gICAgICAgIG1hcHBlZEF0dHItPnNl
dERlY2woMCk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1h
cCkKLSAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbFJlbW92ZWQoKTsKLSAgICB9
Ci0KLSAgICBib29sIGNoZWNrRGVjbCA9IHRydWU7Ci0gICAgTWFwcGVkQXR0cmlidXRlRW50cnkg
ZW50cnk7Ci0gICAgYm9vbCBuZWVkVG9QYXJzZSA9IG1hcFRvRW50cnkoYXR0ci0+bmFtZSgpLCBl
bnRyeSk7Ci0gICAgaWYgKHByZXNlcnZlRGVjbHMpIHsKLSAgICAgICAgaWYgKG1hcHBlZEF0dHIt
PmRlY2woKSkgewotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKG5h
bWVkQXR0ck1hcCkKLSAgICAgICAgICAgICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPmRlY2xBZGRl
ZCgpOwotICAgICAgICAgICAgY2hlY2tEZWNsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgZWxzZSBpZiAoIWF0dHItPmlzTnVsbCgpICYmIGVudHJ5ICE9IGVOb25lKSB7Ci0gICAgICAg
IENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gZ2V0TWFwcGVkQXR0cmlidXRl
RGVjbChlbnRyeSwgYXR0cik7Ci0gICAgICAgIGlmIChkZWNsKSB7Ci0gICAgICAgICAgICBtYXBw
ZWRBdHRyLT5zZXREZWNsKGRlY2wpOwotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAg
ICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgICAgICAgICBtYXBwZWRBdHRyaWJ1dGVz
KCktPmRlY2xBZGRlZCgpOwotICAgICAgICAgICAgY2hlY2tEZWNsID0gZmFsc2U7Ci0gICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgbmVlZFRvUGFyc2UgPSB0cnVlOwotICAgIH0KLQotICAgIGlm
IChuZWVkVG9QYXJzZSkKLSAgICAgICAgcGFyc2VNYXBwZWRBdHRyaWJ1dGUobWFwcGVkQXR0cik7
Ci0gICAgCi0gICAgaWYgKGNoZWNrRGVjbCAmJiBtYXBwZWRBdHRyLT5kZWNsKCkpIHsKLSAgICAg
ICAgLy8gQWRkIHRoZSBkZWNsIHRvIHRoZSB0YWJsZSBpbiB0aGUgYXBwcm9wcmlhdGUgc3BvdC4K
LSAgICAgICAgc2V0TWFwcGVkQXR0cmlidXRlRGVjbChlbnRyeSwgYXR0ciwgbWFwcGVkQXR0ci0+
ZGVjbCgpKTsKLSAgICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgpLT5zZXRNYXBwZWRTdGF0ZShlbnRy
eSwgYXR0ci0+bmFtZSgpLCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgbWFwcGVkQXR0ci0+ZGVj
bCgpLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIG1hcHBlZEF0dHItPmRlY2woKS0+c2V0Tm9kZSgw
KTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0
ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgfQotfQotCi1ib29sIFN0eWxlZEVsZW1lbnQ6Om1hcFRv
RW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5
JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgcmVzdWx0ID0gZU5vbmU7Ci0gICAgaWYgKGF0dHJOYW1l
ID09IHN0eWxlQXR0cikKLSAgICAgICAgcmV0dXJuICFtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJp
YnV0ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSBpZEF0dHIpIHsKLSAgICAgICAgLy8gdW5pcXVlIGlkCi0gICAgICAgIHNldEhhc0lE
KCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJNYXApIHsKLSAgICAgICAg
ICAgIGlmIChhdHRyLT5pc051bGwoKSkKLSAgICAgICAgICAgICAgICBuYW1lZEF0dHJNYXAtPnNl
dElEKG51bGxBdG9tKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGdldERvY3VtZW50KCktPmluQ29t
cGF0TW9kZSgpICYmICFhdHRyLT52YWx1ZSgpLmltcGwoKS0+aXNMb3dlcigpKQotICAgICAgICAg
ICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQoQXRvbWljU3RyaW5nKGF0dHItPnZhbHVlKCkuZG9t
U3RyaW5nKCkubG93ZXIoKSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG5h
bWVkQXR0ck1hcC0+c2V0SUQoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0
Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNsYXNzQXR0cikgewot
ICAgICAgICAvLyBjbGFzcwotICAgICAgICBzZXRIYXNDbGFzcyghYXR0ci0+aXNOdWxsKCkpOwot
ICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygp
LT5wYXJzZUNsYXNzQXR0cmlidXRlKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBzZXRDaGFuZ2Vk
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc3R5bGVBdHRyKSB7Ci0gICAgICAg
IHNldEhhc1N0eWxlKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAgIGlmIChhdHRyLT5pc051bGwo
KSkKLSAgICAgICAgICAgIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgZ2V0SW5saW5lU3R5bGVEZWNsKCktPnBhcnNlRGVjbGFyYXRpb24oYXR0ci0+
dmFsdWUoKSk7Ci0gICAgICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsKLSAgICAg
ICAgc2V0Q2hhbmdlZCgpOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpjcmVhdGVB
dHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIG5hbWVkQXR0ck1hcCA9IG5ldyBOYW1lZE1hcHBl
ZEF0dHJNYXAoY29uc3RfY2FzdDxTdHlsZWRFbGVtZW50Kj4odGhpcykpOwotfQotCi1DU1NNdXRh
YmxlU3R5bGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6Z2V0SW5saW5lU3R5bGVEZWNsKCkK
LXsKLSAgICBpZiAoIW1faW5saW5lU3R5bGVEZWNsKQotICAgICAgICBjcmVhdGVJbmxpbmVTdHls
ZURlY2woKTsKLSAgICByZXR1cm4gbV9pbmxpbmVTdHlsZURlY2wuZ2V0KCk7Ci19Ci0KLUNTU1N0
eWxlRGVjbGFyYXRpb24qIFN0eWxlZEVsZW1lbnQ6OnN0eWxlKCkKLXsKLSAgICByZXR1cm4gZ2V0
SW5saW5lU3R5bGVEZWNsKCk7Ci19Ci0KLUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBTdHls
ZWRFbGVtZW50OjphZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCkKLXsKLSAgICByZXR1cm4g
MDsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nTGlzdCogU3R5bGVkRWxlbWVudDo6Z2V0Q2xhc3NM
aXN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZWRBdHRyTWFwID8gbWFwcGVkQXR0cmlidXRl
cygpLT5nZXRDbGFzc0xpc3QoKSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0hleERp
Z2l0KCBjb25zdCBRQ2hhciAmYyApIHsKLSAgICByZXR1cm4gKCBjID49ICcwJyAmJiBjIDw9ICc5
JyApIHx8Ci0gICAgICAgICAgICggYyA+PSAnYScgJiYgYyA8PSAnZicgKSB8fAotICAgICAgICAg
ICAoIGMgPj0gJ0EnICYmIGMgPD0gJ0YnICk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRvSGV4
KCBjb25zdCBRQ2hhciAmYyApIHsKLSAgICByZXR1cm4gKCAoYyA+PSAnMCcgJiYgYyA8PSAnOScp
Ci0gICAgICAgICAgICAgPyAoYy51bmljb2RlKCkgLSAnMCcpCi0gICAgICAgICAgICAgOiAoICgg
YyA+PSAnYScgJiYgYyA8PSAnZicgKQotICAgICAgICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAt
ICdhJyArIDEwKQotICAgICAgICAgICAgICAgICA6ICggKCBjID49ICdBJyAmJiBjIDw9ICdGJyAp
Ci0gICAgICAgICAgICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAtICdBJyArIDEwKQotICAgICAg
ICAgICAgICAgICAgICAgOiAtMSApICkgKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRD
U1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsK
LSAgICBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCB2YWx1ZSwgZmFsc2UpOwotfQotCi12
b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwg
aW50IGlkLCBpbnQgdmFsdWUpCi17Ci0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBl
ZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRQcm9wZXJ0eShpZCwgdmFsdWUsIGZh
bHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NTdHJpbmdQcm9wZXJ0eShNYXBw
ZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSwgQ1NTUHJpbWl0
aXZlVmFsdWU6OlVuaXRUeXBlcyB0eXBlKQotewotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVh
dGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0dHItPmRlY2woKS0+c2V0U3RyaW5nUHJvcGVydHko
aWQsIHZhbHVlLCB0eXBlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NT
SW1hZ2VQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5n
ICZVUkwpCi17Ci0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7
Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRJbWFnZVByb3BlcnR5KGlkLCBVUkwsIGZhbHNlKTsKLX0K
LQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NMZW5ndGgoTWFwcGVkQXR0cmlidXRlKiBhdHRy
LCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgZnVu
Y3Rpb24gc2hvdWxkIG5vdCBzcGluIHVwIHRoZSBDU1MgcGFyc2VyLCBidXQgc2hvdWxkIGluc3Rl
YWQganVzdCBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0Ci0gICAgLy8gbGVuZ3RoIHVuaXQgYW5kIG1h
a2UgdGhlIGFwcHJvcHJpYXRlIHBhcnNlZCB2YWx1ZS4KLSAgICBpZiAoIWF0dHItPmRlY2woKSkg
Y3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLQotICAgIC8vIHN0cmlwIGF0dHJpYnV0ZSBnYXJiYWdl
Li4KLSAgICBTdHJpbmdJbXBsKiB2ID0gdmFsdWUuaW1wbCgpOwotICAgIGlmICh2KSB7Ci0gICAg
ICAgIHVuc2lnbmVkIGludCBsID0gMDsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChsIDwgdi0+
bGVuZ3RoKCkgJiYgKCp2KVtsXS51bmljb2RlKCkgPD0gJyAnKQotICAgICAgICAgICAgbCsrOwot
ICAgICAgICAKLSAgICAgICAgZm9yICg7IGwgPCB2LT5sZW5ndGgoKTsgbCsrKSB7Ci0gICAgICAg
ICAgICBjaGFyIGNjID0gKCp2KVtsXS5sYXRpbjEoKTsKLSAgICAgICAgICAgIGlmIChjYyA+ICc5
JyB8fCAoY2MgPCAnMCcgJiYgY2MgIT0gJyonICYmIGNjICE9ICclJyAmJiBjYyAhPSAnLicpKQot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGwgIT0gdi0+
bGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGF0dHItPmRlY2woKS0+c2V0TGVuZ3RoUHJvcGVydHko
aWQsIHYtPnN1YnN0cmluZygwLCBsKSwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgfQotICAgIAotICAgIGF0dHItPmRlY2woKS0+c2V0TGVuZ3RoUHJvcGVydHko
aWQsIHZhbHVlLCBmYWxzZSk7Ci19Ci0KLS8qIGNvbG9yIHBhcnNpbmcgdGhhdCB0cmllcyB0byBt
YXRjaCBhcyBjbG9zZSBhcyBwb3NzaWJsZSBJRSA2LiAqLwotdm9pZCBTdHlsZWRFbGVtZW50Ojph
ZGRDU1NDb2xvcihNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZj
KQotewotICAgIC8vIHRoaXMgaXMgdGhlIG9ubHkgY2FzZSBubyBjb2xvciBnZXRzIGFwcGxpZWQg
aW4gSUUuCi0gICAgaWYgKCAhYy5sZW5ndGgoKSApCi0gICAgICAgIHJldHVybjsKLQotICAgIGlm
ICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIAotICAgIGlmIChh
dHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCBjLCBmYWxzZSkgKQotICAgICAgICByZXR1cm47
Ci0gICAgCi0gICAgRGVwcmVjYXRlZFN0cmluZyBjb2xvciA9IGMuZGVwcmVjYXRlZFN0cmluZygp
OwotICAgIC8vIG5vdCBzb21ldGhpbmcgdGhhdCBmaXRzIHRoZSBzcGVjcy4KLSAgICAKLSAgICAv
LyB3ZSdyZSBlbXVsYXRpbmcgSUVzIGNvbG9yIHBhcnNlciBoZXJlLiBJdCBtYXBzIHRyYW5zcGFy
ZW50IHRvIGJsYWNrLCBvdGhlcndpc2UgaXQgdHJpZXMgdG8gYnVpbGQgYSByZ2IgdmFsdWUKLSAg
ICAvLyBvdXQgb2YgZXZlcnlodGluZyB5b3UgcHV0IGluLiBUaGUgYWxnb3JpdGhtIGlzIGV4cGVy
aW1lbnRhbGx5IGRldGVybWluZWQsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBhbGwgdGVzdCBjYXNl
cyBJIGhhdmUuCi0gICAgCi0gICAgLy8gdGhlIGxlbmd0aCBvZiB0aGUgY29sb3IgdmFsdWUgaXMg
cm91bmRlZCB1cCB0byB0aGUgbmV4dAotICAgIC8vIG11bHRpcGxlIG9mIDMuIGVhY2ggcGFydCBv
ZiB0aGUgcmdiIHRyaXBsZSB0aGVuIGdldHMgb25lIHRoaXJkCi0gICAgLy8gb2YgdGhlIGxlbmd0
aC4KLSAgICAvLwotICAgIC8vIEVhY2ggdHJpcGxldCBpcyBwYXJzZWQgYnl0ZSBieSBieXRlLCBt
YXBwaW5nCi0gICAgLy8gZWFjaCBudW1iZXIgdG8gYSBoZXggdmFsdWUgKDAtOWEtZkEtRiB0byB0
aGVpciB2YWx1ZXMKLSAgICAvLyBldmVyeXRoaW5nIGVsc2UgdG8gMCkuCi0gICAgLy8KLSAgICAv
LyBUaGUgaGlnaGVzdCBub24gemVybyBkaWdpdCBpbiBhbGwgdHJpcGxldHMgaXMgcmVtZW1iZXJl
ZCwgYW5kCi0gICAgLy8gdXNlZCBhcyBhIG5vcm1hbGl6YXRpb24gcG9pbnQgdG8gbm9ybWFsaXpl
IHRvIHZhbHVlcyBiZXR3ZWVuIDAKLSAgICAvLyBhbmQgMjU1LgotICAgIAotICAgIGlmICggY29s
b3IubG93ZXIoKSAhPSAidHJhbnNwYXJlbnQiICkgewotICAgICAgICBpZiAoIGNvbG9yWzBdID09
ICcjJyApCi0gICAgICAgICAgICBjb2xvci5yZW1vdmUoIDAsICAxICk7Ci0gICAgICAgIGludCBi
YXNpY0xlbmd0aCA9IChjb2xvci5sZW5ndGgoKSArIDIpIC8gMzsKLSAgICAgICAgaWYgKCBiYXNp
Y0xlbmd0aCA+IDEgKSB7Ci0gICAgICAgICAgICAvLyBJRSBpZ25vcmVzIGNvbG9ycyB3aXRoIHRo
cmVlIGRpZ2l0cyBvciBsZXNzCi0gICAgICAgICAgICBpbnQgY29sb3JzWzNdID0geyAwLCAwLCAw
IH07Ci0gICAgICAgICAgICBpbnQgY29tcG9uZW50ID0gMDsKLSAgICAgICAgICAgIGludCBwb3Mg
PSAwOwotICAgICAgICAgICAgaW50IG1heERpZ2l0ID0gYmFzaWNMZW5ndGgtMTsKLSAgICAgICAg
ICAgIHdoaWxlICggY29tcG9uZW50IDwgMyApIHsKLSAgICAgICAgICAgICAgICAvLyBzZWFyY2gg
Zm9yd2FyZCBmb3IgZGlnaXRzIGluIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAgICBpbnQgbnVt
RGlnaXRzID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoIHBvcyA8IChpbnQpY29sb3IubGVu
Z3RoKCkgJiYgbnVtRGlnaXRzIDwgYmFzaWNMZW5ndGggKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGludCBoZXggPSB0b0hleCggY29sb3JbcG9zXSApOwotICAgICAgICAgICAgICAgICAgICBjb2xv
cnNbY29tcG9uZW50XSA9IChjb2xvcnNbY29tcG9uZW50XSA8PCA0KTsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKCBoZXggPiAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzW2Nv
bXBvbmVudF0gKz0gaGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGlnaXQgPSBrTWlu
KCBtYXhEaWdpdCwgbnVtRGlnaXRzICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgbnVtRGlnaXRzKys7Ci0gICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIG51bURpZ2l0cysrIDwgYmFz
aWNMZW5ndGggKQotICAgICAgICAgICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50XSA8PD0gNDsK
LSAgICAgICAgICAgICAgICBjb21wb25lbnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IG1heERpZ2l0ID0gYmFzaWNMZW5ndGggLSBtYXhEaWdpdDsKLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgLy8gbm9ybWFsaXplIHRvIDAwLWZmLiBUaGUgaGlnaGVzdCBmaWxsZWQgZGlnaXQgY291
bnRzLCBtaW5pbXVtIGlzIDIgZGlnaXRzCi0gICAgICAgICAgICBtYXhEaWdpdCAtPSAyOwotICAg
ICAgICAgICAgY29sb3JzWzBdID4+PSA0Km1heERpZ2l0OwotICAgICAgICAgICAgY29sb3JzWzFd
ID4+PSA0Km1heERpZ2l0OwotICAgICAgICAgICAgY29sb3JzWzJdID4+PSA0Km1heERpZ2l0Owot
ICAgICAgICAgICAgLy8gYXNzZXJ0KCBjb2xvcnNbMF0gPCAweDEwMCAmJiBjb2xvcnNbMV0gPCAw
eDEwMCAmJiBjb2xvcnNbMl0gPCAweDEwMCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBj
b2xvci5zcHJpbnRmKCIjJTAyeCUwMnglMDJ4IiwgY29sb3JzWzBdLCBjb2xvcnNbMV0sIGNvbG9y
c1syXSApOwotICAgICAgICAgICAgaWYgKCBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCBT
dHJpbmcoY29sb3IpLCBmYWxzZSkgKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotICAgIH0KLSAgICBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCBDU1NfVkFMX0JMQUNL
LCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6Y3JlYXRlTWFwcGVkRGVjbChNYXBw
ZWRBdHRyaWJ1dGUqIGF0dHIpCi17Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24q
IGRlY2wgPSBuZXcgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgYXR0ci0+
c2V0RGVjbChkZWNsKTsKLSAgICBkZWNsLT5zZXRQYXJlbnQoZ2V0RG9jdW1lbnQoKS0+ZWxlbWVu
dFNoZWV0KCkpOwotICAgIGRlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgZGVjbC0+c2V0U3RyaWN0
UGFyc2luZyhmYWxzZSk7IC8vIE1hcHBlZCBhdHRyaWJ1dGVzIGFyZSBqdXN0IGFsd2F5cyBxdWly
a3kuCi19Ci0KLS8vIEdvbGRlbiByYXRpbyAtIGFyYml0cmFyeSBzdGFydCB2YWx1ZSB0byBhdm9p
ZCBtYXBwaW5nIGFsbCAwJ3MgdG8gYWxsIDAncwotLy8gb3IgYW55dGhpbmcgbGlrZSB0aGF0Lgot
Y29uc3QgdW5zaWduZWQgUEhJID0gMHg5ZTM3NzliOVU7Ci0KLS8vIFBhdWwgSHNpZWgncyBTdXBl
ckZhc3RIYXNoCi0vLyBodHRwOi8vd3d3LmF6aWxsaW9ubW9ua2V5cy5jb20vcWVkL2hhc2guaHRt
bAotdW5zaWduZWQgTWFwcGVkQXR0cmlidXRlSGFzaDo6aGFzaChjb25zdCBNYXBwZWRBdHRyaWJ1
dGVLZXkmIGtleSkKLXsKLSAgICB1aW50MzJfdCBoYXNoID0gUEhJOwotICAgIHVpbnQzMl90IHRt
cDsKLQotICAgIGNvbnN0IHVpbnQxNl90KiBwOwotCi0gICAgcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgdWludDE2X3QqPigma2V5Lm5hbWUpOwotICAgIGhhc2ggKz0gcFswXTsKLSAgICB0bXAg
PSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgIGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0g
ICAgaGFzaCArPSBoYXNoID4+IDExOwotICAgIGFzc2VydChzaXplb2Yoa2V5Lm5hbWUpID09IDQg
fHwgc2l6ZW9mKGtleS5uYW1lKSA9PSA4KTsKLSAgICBpZiAoc2l6ZW9mKGtleS5uYW1lKSA9PSA4
KSB7Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgaGFzaCArPSBwWzBdOwotICAgICAgICB0bXAg
PSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1w
OwotICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAgfQotCi0gICAgcCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QqPigma2V5LnZhbHVlKTsKLSAgICBoYXNoICs9IHBbMF07
Ci0gICAgdG1wID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAgICBoYXNoID0gKGhhc2ggPDwgMTYp
IF4gdG1wOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAgICBhc3NlcnQoc2l6ZW9mKGtleS52
YWx1ZSkgPT0gNCB8fCBzaXplb2Yoa2V5LnZhbHVlKSA9PSA4KTsKLSAgICBpZiAoc2l6ZW9mKGtl
eS52YWx1ZSkgPT0gOCkgewotICAgICAgICBwICs9IDI7Ci0gICAgICAgIGhhc2ggKz0gcFswXTsK
LSAgICAgICAgdG1wID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAgICAgICAgaGFzaCA9IChoYXNo
IDw8IDE2KSBeIHRtcDsKLSAgICAgICAgaGFzaCArPSBoYXNoID4+IDExOwotICAgIH0KLQotICAg
IC8vIEhhbmRsZSBlbmQgY2FzZQotICAgIGhhc2ggKz0ga2V5LnR5cGU7Ci0gICAgaGFzaCBePSBo
YXNoIDw8IDExOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxNzsKLQotICAgIC8vIEZvcmNlICJhdmFs
YW5jaGluZyIgb2YgZmluYWwgMTI3IGJpdHMKLSAgICBoYXNoIF49IGhhc2ggPDwgMzsKLSAgICBo
YXNoICs9IGhhc2ggPj4gNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMjsKLSAgICBoYXNoICs9IGhh
c2ggPj4gMTU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDEwOwotCi0gICAgLy8gVGhpcyBhdm9pZHMg
ZXZlciByZXR1cm5pbmcgYSBoYXNoIGNvZGUgb2YgMCwgc2luY2UgdGhhdCBpcyB1c2VkIHRvCi0g
ICAgLy8gc2lnbmFsICJoYXNoIG5vdCBjb21wdXRlZCB5ZXQiLCB1c2luZyBhIHZhbHVlIHRoYXQg
aXMgbGlrZWx5IHRvIGJlCi0gICAgLy8gZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgMCB3aGVuIHRo
ZSBsb3cgYml0cyBhcmUgbWFza2VkCi0gICAgaWYgKGhhc2ggPT0gMCkKLSAgICAgICAgaGFzaCA9
IDB4ODAwMDAwMDA7Ci0KLSAgICByZXR1cm4gaGFzaDsKLX0KLQogfQpJbmRleDogZG9tL1N0eWxl
ZEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9TdHlsZWRFbGVtZW50LmNwcAkocmV2aXNp
b24gMTM0NzcpCisrKyBkb20vU3R5bGVkRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIy
LDIzICsyMiwxNCBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkg
VGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0Eu
CiAgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5o
IgorI2luY2x1ZGUgIlN0eWxlZEVsZW1lbnQuaCIKIAotI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUu
aCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIlRleHQuaCIKICNpbmNsdWRlICJjc3Nf
c3R5bGVzaGVldGltcGwuaCIKICNpbmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCi0jaW5jbHVkZSAi
Y3Nzc3R5bGVzZWxlY3Rvci5oIgogI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKLSNpbmNs
dWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJkb21feG1saW1wbC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFBh
cnNlci5oIgotI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5oIgotI2luY2x1ZGUgPHF0ZXh0c3RyZWFt
Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNzIsMTA5NiArNjMsNiBAQCB0eXBlZGVm
IEhhc2hNYXA8TWFwcGVkQXR0cmlidXRlS2V5LCBDU1NNCiAKIHN0YXRpYyBNYXBwZWRBdHRyaWJ1
dGVEZWNscyogbWFwcGVkQXR0cmlidXRlRGVjbHMgPSAwOwogCi1BdHRyaWJ1dGUqIEF0dHJpYnV0
ZTo6Y2xvbmUoYm9vbCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZShtX25hbWUs
IG1fdmFsdWUpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEF0dHJpYnV0ZTo6Y3JlYXRlQXR0cklm
TmVlZGVkKEVsZW1lbnQqIGUpCi17Ci0gICAgUmVmUHRyPEF0dHI+IHIobV9pbXBsKTsKLSAgICBp
ZiAoIXIpIHsKLSAgICAgICAgciA9IG5ldyBBdHRyKGUsIGUtPmdldERvY3VtZW50KCksIHRoaXMp
OwotICAgICAgICByLT5jcmVhdGVUZXh0Q2hpbGQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHIucmVs
ZWFzZSgpOwotfQotCi1BdHRyOjpBdHRyKEVsZW1lbnQqIGVsZW1lbnQsIERvY3VtZW50KiBkb2NQ
dHIsIEF0dHJpYnV0ZSogYSkKLSAgICA6IENvbnRhaW5lck5vZGUoZG9jUHRyKSwKLSAgICAgIG1f
ZWxlbWVudChlbGVtZW50KSwKLSAgICAgIG1fYXR0cmlidXRlKGEpLAotICAgICAgbV9pZ25vcmVD
aGlsZHJlbkNoYW5nZWQoMCkKLXsKLSAgICBhc3NlcnQoIW1fYXR0cmlidXRlLT5tX2ltcGwpOwot
ICAgIG1fYXR0cmlidXRlLT5tX2ltcGwgPSB0aGlzOwotICAgIG1fc3BlY2lmaWVkID0gdHJ1ZTsK
LX0KLQotQXR0cjo6fkF0dHIoKQotewotICAgIGFzc2VydChtX2F0dHJpYnV0ZS0+bV9pbXBsID09
IHRoaXMpOwotICAgIG1fYXR0cmlidXRlLT5tX2ltcGwgPSAwOwotfQotCi12b2lkIEF0dHI6OmNy
ZWF0ZVRleHRDaGlsZCgpCi17Ci0gICAgYXNzZXJ0KHJlZkNvdW50KCkpOwotICAgIGlmICghbV9h
dHRyaWJ1dGUtPnZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgICAgICBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZCsrOwotICAgICAgICBhcHBlbmRD
aGlsZChnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZShtX2F0dHJpYnV0ZS0+dmFsdWUoKS5p
bXBsKCkpLCBlYyk7Ci0gICAgICAgIG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkLS07Ci0gICAgfQot
fQotCi1TdHJpbmcgQXR0cjo6bm9kZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lKCk7
Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEF0dHI6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gQVRUUklCVVRFX05PREU7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgQXR0cjo6bG9jYWxO
YW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hdHRyaWJ1dGUtPmxvY2FsTmFtZSgpOwotfQot
Ci1jb25zdCBBdG9taWNTdHJpbmcmIEF0dHI6Om5hbWVzcGFjZVVSSSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fYXR0cmlidXRlLT5uYW1lc3BhY2VVUkkoKTsKLX0KLQotY29uc3QgQXRvbWljU3Ry
aW5nJiBBdHRyOjpwcmVmaXgoKSBjb25zdAotewotICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+cHJl
Zml4KCk7Ci19Ci0KLXZvaWQgQXR0cjo6c2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3By
ZWZpeCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgY2hlY2tTZXRQcmVmaXgoX3ByZWZpeCwg
ZWMpOwotICAgIGlmIChlYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9hdHRyaWJ1dGUtPnNl
dFByZWZpeChfcHJlZml4KTsKLX0KLQotU3RyaW5nIEF0dHI6Om5vZGVWYWx1ZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIHZhbHVlKCk7Ci19Ci0KLXZvaWQgQXR0cjo6c2V0VmFsdWUoIGNvbnN0IFN0
cmluZyYgdiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgZWMgPSAwOwotCi0gICAgLy8gZG8g
bm90IGludGVycHJldGUgZW50aXRpZXMgaW4gdGhlIHN0cmluZywgaXRzIGxpdGVyYWwhCi0KLSAg
ICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlz
IHJlYWRvbmx5Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElG
SUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vICMj
IyB3aGF0IHRvIGRvIG9uIDAgPwotICAgIGlmICh2LmlzTnVsbCgpKSB7Ci0gICAgICAgIGVjID0g
RE9NU1RSSU5HX1NJWkVfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGUg
PSAwOwotICAgIG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkKys7Ci0gICAgcmVtb3ZlQ2hpbGRyZW4o
KTsKLSAgICBhcHBlbmRDaGlsZChnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZSh2LmltcGwo
KSksIGUpOwotICAgIG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkLS07Ci0gICAgCi0gICAgbV9hdHRy
aWJ1dGUtPnNldFZhbHVlKHYuaW1wbCgpKTsKLSAgICBpZiAobV9lbGVtZW50KQotICAgICAgICBt
X2VsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQobV9hdHRyaWJ1dGUuZ2V0KCkpOwotfQotCi12b2lk
IEF0dHI6OnNldE5vZGVWYWx1ZShjb25zdCBTdHJpbmcmIHYsIEV4Y2VwdGlvbkNvZGUmIGVjKQot
ewotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogdGFrZW4gY2FyZSBvZiBieSBz
ZXRWYWx1ZSgpCi0gICAgc2V0VmFsdWUodiwgZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IEF0
dHI6OmNsb25lTm9kZShib29sIC8qZGVlcCovKQotewotICAgIFJlZlB0cjxBdHRyPiBjbG9uZSA9
IG5ldyBBdHRyKDAsIGdldERvY3VtZW50KCksIG1fYXR0cmlidXRlLT5jbG9uZSgpKTsKLSAgICBj
bG9uZUNoaWxkTm9kZXMoY2xvbmUuZ2V0KCkpOwotICAgIHJldHVybiBjbG9uZS5yZWxlYXNlKCk7
Ci19Ci0KLS8vIERPTSBTZWN0aW9uIDEuMS4xCi1ib29sIEF0dHI6OmNoaWxkVHlwZUFsbG93ZWQo
Tm9kZVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBURVhU
X05PREU6Ci0gICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotfQotCi12b2lkIEF0dHI6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgTm9kZTo6
Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0gICAgaWYgKG1faWdub3JlQ2hpbGRyZW5DaGFuZ2Vk
ID4gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgaW5j
bHVkZSBlbnRpdHkgcmVmZXJlbmNlcyBpbiB0aGUgdmFsdWUKLSAgICAKLSAgICBTdHJpbmcgdmFs
ID0gIiI7Ci0gICAgZm9yIChOb2RlICpuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNp
YmxpbmcoKSkgewotICAgICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFs
ICs9IHN0YXRpY19jYXN0PFRleHQgKj4obiktPmRhdGEoKTsKLSAgICB9Ci0gICAgCi0gICAgbV9h
dHRyaWJ1dGUtPnNldFZhbHVlKHZhbC5pbXBsKCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAg
ICAgIG1fZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0K
LVN0cmluZyBBdHRyOjp0b1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdDsKLQot
ICAgIHJlc3VsdCArPSBub2RlTmFtZSgpOwotCi0gICAgLy8gRklYTUU6IHN1YnN0aXR1dGUgZW50
aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMgb2YgIiBvciAnIC0tCi0gICAgLy8gbWF5YmUgZWFzaWVy
IHRvIGp1c3QgdXNlIHRleHQgdmFsdWUgYW5kIGlnbm9yZSBleGlzdGluZwotICAgIC8vIGVudGl0
eSByZWZzPwotCi0gICAgaWYgKGZpcnN0Q2hpbGQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlc3Vs
dCArPSAiPVwiIjsKLQotICAgICAgICBmb3IgKE5vZGUgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBj
aGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAg
ICByZXN1bHQgKz0gY2hpbGQtPnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIHJlc3VsdCArPSAiXCIiOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmbmRlZiBOREVCVUcKLXN0cnVjdCBFbGVtZW50SW1wbENv
dW50ZXIgCi17IAotICAgIHN0YXRpYyBpbnQgY291bnQ7IAotICAgIH5FbGVtZW50SW1wbENvdW50
ZXIoKSB7IC8qIGlmIChjb3VudCAhPSAwKSBmcHJpbnRmKHN0ZGVyciwgIkxFQUs6ICVkIEVsZW1l
bnRcbiIsIGNvdW50KTsgKi8gfSAKLX07Ci1pbnQgRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsK
LXN0YXRpYyBFbGVtZW50SW1wbENvdW50ZXIgZWxlbWVudEltcGxDb3VudGVyOwotI2VuZGlmIE5E
RUJVRwotCi1FbGVtZW50OjpFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lLCBEb2N1
bWVudCAqZG9jKQotICAgIDogQ29udGFpbmVyTm9kZShkb2MpLCBtX3RhZ05hbWUocU5hbWUpCi17
Ci0jaWZuZGVmIE5ERUJVRwotICAgICsrRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRp
ZgotfQotCi1FbGVtZW50Ojp+RWxlbWVudCgpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIC0tRWxl
bWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRpZgotICAgIGlmIChuYW1lZEF0dHJNYXApCi0g
ICAgICAgIG5hbWVkQXR0ck1hcC0+ZGV0YWNoRnJvbUVsZW1lbnQoKTsKLX0KLQotUGFzc1JlZlB0
cjxOb2RlPiBFbGVtZW50OjpjbG9uZU5vZGUoYm9vbCBkZWVwKQotewotICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwotICAgIFJlZlB0cjxFbGVtZW50PiBjbG9uZSA9IGdldERvY3VtZW50KCktPmNy
ZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkkoKSwgbm9kZU5hbWUoKSwgZWMpOwotICAgIGFzc2Vy
dCghZWMpOwotICAgIAotICAgIC8vIGNsb25lIGF0dHJpYnV0ZXMKLSAgICBpZiAobmFtZWRBdHRy
TWFwKQotICAgICAgICAqY2xvbmUtPmF0dHJpYnV0ZXMoKSA9ICpuYW1lZEF0dHJNYXA7Ci0KLSAg
ICBjbG9uZS0+Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXModGhpcyk7Ci0gICAgCi0gICAgaWYg
KGRlZXApCi0gICAgICAgIGNsb25lQ2hpbGROb2RlcyhjbG9uZS5nZXQoKSk7Ci0KLSAgICByZXR1
cm4gY2xvbmUucmVsZWFzZSgpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZShj
b25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAo
bmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+cmVtb3ZlTmFtZWRJdGVtKG5h
bWUsIGVjKTsKLSAgICAgICAgaWYgKGVjID09IE5PVF9GT1VORF9FUlIpCi0gICAgICAgICAgICBl
YyA9IDA7Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBRdWFs
aWZpZWROYW1lJiBuYW1lLCBjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwotICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0K
LQotLy8gVmlydHVhbCBmdW5jdGlvbiwgZGVmaW5lZCBpbiBiYXNlIGNsYXNzLgotTmFtZWRBdHRy
TWFwICpFbGVtZW50OjphdHRyaWJ1dGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0cmlidXRl
cyhmYWxzZSk7Ci19Ci0KLU5hbWVkQXR0ck1hcCogRWxlbWVudDo6YXR0cmlidXRlcyhib29sIHJl
YWRvbmx5KSBjb25zdAotewotICAgIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKTsKLSAg
ICBpZiAoIXJlYWRvbmx5ICYmICFuYW1lZEF0dHJNYXApCi0gICAgICAgIGNyZWF0ZUF0dHJpYnV0
ZU1hcCgpOwotICAgIHJldHVybiBuYW1lZEF0dHJNYXAuZ2V0KCk7Ci19Ci0KLU5vZGU6Ok5vZGVU
eXBlIEVsZW1lbnQ6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gRUxFTUVOVF9OT0RF
OwotfQotCi1jb25zdCBBdG9taWNTdHJpbmdMaXN0KiBFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBj
b25zdAotewotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6
OmdldElEQXR0cmlidXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZWRBdHRyTWFwID8gbmFt
ZWRBdHRyTWFwLT5pZCgpIDogbnVsbEF0b207Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0F0
dHJpYnV0ZU5TKG5hbWUubmFtZXNwYWNlVVJJKCksIG5hbWUubG9jYWxOYW1lKCkpOwotfQotCi1j
b25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWRO
YW1lJiBuYW1lKSBjb25zdAotewotICAgIGlmIChuYW1lID09IHN0eWxlQXR0cikKLSAgICAgICAg
dXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkK
LSAgICAgICAgaWYgKEF0dHJpYnV0ZSogYSA9IG5hbWVkQXR0ck1hcC0+Z2V0QXR0cmlidXRlSXRl
bShuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBhLT52YWx1ZSgpOwotCi0gICAgcmV0dXJuIG51
bGxBdG9tOwotfQotCi12b2lkIEVsZW1lbnQ6OnNjcm9sbEludG9WaWV3KGJvb2wgYWxpZ25Ub1Rv
cCkgCi17Ci0gICAgSW50UmVjdCBib3VuZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlm
IChyZW5kZXJlcigpKSB7Ci0gICAgICAgIC8vIEFsaWduIHRvIHRoZSB0b3AgLyBib3R0b20gYW5k
IHRvIHRoZSBjbG9zZXN0IGVkZ2UuCi0gICAgICAgIGlmIChhbGlnblRvVG9wKQotICAgICAgICAg
ICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3Vu
ZHMsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGln
blRvcEFsd2F5cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xv
c2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0Fs
aWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25Cb3R0b21BbHdheXMpOwotICAg
IH0KLX0KLQotdm9pZCBFbGVtZW50OjpzY3JvbGxJbnRvVmlld0lmTmVlZGVkKGJvb2wgY2VudGVy
SWZOZWVkZWQpCi17Ci0gICAgSW50UmVjdCBib3VuZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAot
ICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmIChjZW50ZXJJZk5lZWRlZCkKLSAgICAg
ICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUo
Ym91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduQ2VudGVySWZOZWVkZWQsIFJlbmRlckxheWVyOjpn
QWxpZ25DZW50ZXJJZk5lZWRlZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbmRlcmVy
KCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJM
YXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5l
ZWRlZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5IVE1MRG9jdW1lbnQoY29u
c3QgRWxlbWVudCogZSkKLXsKLSAgICByZXR1cm4gZSAmJiBlLT5nZXREb2N1bWVudCgpLT5pc0hU
TUxEb2N1bWVudCgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJp
YnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9
IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51
bGxBdG9tKSk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRl
TlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwg
bG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi12b2lkIEVsZW1l
bnQ6OnNldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUs
IEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghRG9jdW1lbnQ6OmlzVmFsaWROYW1lKG5h
bWUpKSB7Ci0gICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/
IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgc2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVs
bEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgdmFsdWUuaW1wbCgpLCBlYyk7Ci19
Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUs
IFN0cmluZ0ltcGwqIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoaW5Eb2N1
bWVudCgpKQotICAgICAgICBnZXREb2N1bWVudCgpLT5pbmNET01UcmVlVmVyc2lvbigpOwotCi0g
ICAgLy8gYWxsb2NhdGUgYXR0cmlidXRlbWFwIGlmIG5lY2Vzc2FyeQotICAgIEF0dHJpYnV0ZSog
b2xkID0gYXR0cmlidXRlcyhmYWxzZSktPmdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0KLSAgICAv
LyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJl
YWRvbmx5Ci0gICAgaWYgKG5hbWVkQXR0ck1hcC0+aXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVj
ID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgaWYgKG5hbWUgPT0gaWRBdHRyKQotICAgICAgICB1cGRhdGVJZChvbGQgPyBvbGQtPnZh
bHVlKCkgOiBudWxsQXRvbSwgdmFsdWUpOwotICAgIAotICAgIGlmIChvbGQgJiYgIXZhbHVlKQot
ICAgICAgICBuYW1lZEF0dHJNYXAtPnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICBlbHNlIGlm
ICghb2xkICYmIHZhbHVlKQotICAgICAgICBuYW1lZEF0dHJNYXAtPmFkZEF0dHJpYnV0ZShjcmVh
dGVBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTsKLSAgICBlbHNlIGlmIChvbGQgJiYgdmFsdWUpIHsK
LSAgICAgICAgb2xkLT5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQo
b2xkKTsKLSAgICB9Ci19Ci0KLUF0dHJpYnV0ZSogRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlKGNv
bnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlKQotewotICAgIHJldHVy
biBuZXcgQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBFbGVtZW50OjpzZXRBdHRy
aWJ1dGVNYXAoTmFtZWRBdHRyTWFwKiBsaXN0KQotewotICAgIGlmIChpbkRvY3VtZW50KCkpCi0g
ICAgICAgIGdldERvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7Ci0KLSAgICAvLyBJZiBz
ZXR0aW5nIHRoZSB3aG9sZSBtYXAgY2hhbmdlcyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRv
IGNhbGwgdXBkYXRlSWQuCi0KLSAgICBBdHRyaWJ1dGUgKm9sZElkID0gbmFtZWRBdHRyTWFwID8g
bmFtZWRBdHRyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cikgOiAwOwotICAgIEF0dHJpYnV0
ZSAqbmV3SWQgPSBsaXN0ID8gbGlzdC0+Z2V0QXR0cmlidXRlSXRlbShpZEF0dHIpIDogMDsKLQot
ICAgIGlmIChvbGRJZCB8fCBuZXdJZCkKLSAgICAgICAgdXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+
dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwot
Ci0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgbmFtZWRBdHRyTWFwLT5lbGVtZW50ID0g
MDsKLQotICAgIG5hbWVkQXR0ck1hcCA9IGxpc3Q7Ci0KLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7
Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZWxlbWVudCA9IHRoaXM7Ci0gICAgICAgIHVuc2lnbmVk
IGxlbiA9IG5hbWVkQXR0ck1hcC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQobmFtZWRBdHRy
TWFwLT5hdHRyc1tpXSk7Ci0gICAgICAgIC8vIEZJWE1FOiBXaGF0IGFib3V0IGF0dHJpYnV0ZXMg
dGhhdCB3ZXJlIGluIHRoZSBvbGQgbWFwIHRoYXQgYXJlIG5vdCBpbiB0aGUgbmV3IG1hcD8KLSAg
ICB9Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgdXBk
YXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgJiYg
bmFtZWRBdHRyTWFwLT5sZW5ndGgoKSA+IDA7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojpub2RlTmFt
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fdGFnTmFtZS50b1N0cmluZygpOwotfQotCi12b2lk
IEVsZW1lbnQ6OnNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIGNoZWNrU2V0UHJlZml4KF9wcmVmaXgsIGVjKTsKLSAgICBpZiAo
ZWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGFnTmFtZS5zZXRQcmVmaXgoX3ByZWZpeCk7
Ci19Ci0KLXZvaWQgRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICBu
YW1lZEF0dHJNYXAgPSBuZXcgTmFtZWRBdHRyTWFwKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KHRoaXMp
KTsKLX0KLQotYm9vbCBFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJTdHlsZSAqRWxlbWVudDo6Y3Jl
YXRlU3R5bGVGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QgKnBhcmVudFJlbmRlcmVyKQotewotICAg
IHJldHVybiBnZXREb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmNyZWF0ZVN0eWxlRm9yRWxl
bWVudCh0aGlzKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihS
ZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBpZiAoZ2V0RG9j
dW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gdGhpcyAmJiBzdHlsZS0+ZGlzcGxheSgpID09
IE5PTkUpIHsKLSAgICAgICAgLy8gSWdub3JlIGRpc3BsYXk6IG5vbmUgb24gcm9vdCBlbGVtZW50
cy4gIEZvcmNlIGEgZGlzcGxheSBvZiBibG9jayBpbiB0aGF0IGNhc2UuCi0gICAgICAgIFJlbmRl
ckJsb2NrKiByZXN1bHQgPSBuZXcgKGFyZW5hKSBSZW5kZXJCbG9jayh0aGlzKTsKLSAgICAgICAg
aWYgKHJlc3VsdCkgcmVzdWx0LT5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAgIHJldHVybiByZXN1
bHQ7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBz
dHlsZSk7Ci19Ci0KLQotdm9pZCBFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0g
ICAgLy8gbmVlZCB0byBkbyBzdXBlcmNsYXNzIHByb2Nlc3NpbmcgZmlyc3Qgc28gaW5Eb2N1bWVu
dCgpIGlzIHRydWUKLSAgICAvLyBieSB0aGUgdGltZSB3ZSByZWFjaCB1cGRhdGVJZAotICAgIENv
bnRhaW5lck5vZGU6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0KLSAgICBpZiAoaGFzSUQoKSkg
ewotICAgICAgICBOYW1lZEF0dHJNYXAqIGF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICAg
ICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUqIGlkSXRlbSA9IGF0dHJzLT5n
ZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0gICAgICAgICAgICBpZiAoaWRJdGVtICYmICFpZEl0
ZW0tPmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIHVwZGF0ZUlkKG51bGxBdG9tLCBpZEl0ZW0t
PnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZWRG
cm9tRG9jdW1lbnQoKQotewotICAgIGlmIChoYXNJRCgpKSB7Ci0gICAgICAgIE5hbWVkQXR0ck1h
cCogYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgICAgICBpZiAoYXR0cnMpIHsKLSAgICAg
ICAgICAgIEF0dHJpYnV0ZSogaWRJdGVtID0gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRy
KTsKLSAgICAgICAgICAgIGlmIChpZEl0ZW0gJiYgIWlkSXRlbS0+aXNOdWxsKCkpCi0gICAgICAg
ICAgICAgICAgdXBkYXRlSWQoaWRJdGVtLT52YWx1ZSgpLCBudWxsQXRvbSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBDb250YWluZXJOb2RlOjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0K
LXZvaWQgRWxlbWVudDo6YXR0YWNoKCkKLXsKLSNpZiBTUEVFRF9ERUJVRyA8IDEKLSAgICBjcmVh
dGVSZW5kZXJlcklmTmVlZGVkKCk7Ci0jZW5kaWYKLSAgICBDb250YWluZXJOb2RlOjphdHRhY2go
KTsKLX0KLQotdm9pZCBFbGVtZW50OjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkK
LXsKLSAgICAvLyAjIyMgc2hvdWxkIGdvIGF3YXkgYW5kIGJlIGRvbmUgaW4gcmVuZGVyb2JqZWN0
Ci0gICAgUmVuZGVyU3R5bGUqIF9zdHlsZSA9IHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5zdHls
ZSgpIDogMDsKLSAgICBib29sIGhhc1BhcmVudFJlbmRlcmVyID0gcGFyZW50KCkgPyBwYXJlbnQo
KS0+cmVuZGVyZXIoKSA6IGZhbHNlOwotICAgIAotICAgIGlmICggaGFzUGFyZW50UmVuZGVyZXIg
JiYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IGNoYW5nZWQoKSkgKSB7Ci0gICAgICAgIFJlbmRlclN0
eWxlICpuZXdTdHlsZSA9IGdldERvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Y3JlYXRlU3R5
bGVGb3JFbGVtZW50KHRoaXMpOwotICAgICAgICBTdHlsZUNoYW5nZSBjaCA9IGRpZmYoIF9zdHls
ZSwgbmV3U3R5bGUgKTsKLSAgICAgICAgaWYgKGNoID09IERldGFjaCkgewotICAgICAgICAgICAg
aWYgKGF0dGFjaGVkKCkpIGRldGFjaCgpOwotICAgICAgICAgICAgLy8gIyMjIFN1Ym9wdGltYWwu
IFN0eWxlIGdldHMgY2FsY3VsYXRlZCBhZ2Fpbi4KLSAgICAgICAgICAgIGF0dGFjaCgpOwotICAg
ICAgICAgICAgLy8gYXR0YWNoIHJlY2FsdWxhdGVzIHRoZSBzdHlsZSBmb3IgYWxsIGNoaWxkcmVu
LiBObyBuZWVkIHRvIGRvIGl0IHR3aWNlLgotICAgICAgICAgICAgc2V0Q2hhbmdlZCggZmFsc2Ug
KTsKLSAgICAgICAgICAgIHNldEhhc0NoYW5nZWRDaGlsZCggZmFsc2UgKTsKLSAgICAgICAgICAg
IG5ld1N0eWxlLT5kZXJlZihnZXREb2N1bWVudCgpLT5yZW5kZXJBcmVuYSgpKTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaCAhPSBOb0NoYW5nZSkg
ewotICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgbmV3U3R5bGUpCi0gICAgICAgICAgICAg
ICAgcmVuZGVyZXIoKS0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGVs
c2UgaWYgKGNoYW5nZWQoKSAmJiByZW5kZXJlcigpICYmIG5ld1N0eWxlICYmIChnZXREb2N1bWVu
dCgpLT51c2VzU2libGluZ1J1bGVzKCkgfHwgZ2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRS
dWxlcygpKSkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggbm8gY2hhbmdlIG9jY3VycmVkLCB3
ZSB1c2UgdGhlIG5ldyBzdHlsZSBzbyB0aGF0IHRoZSBjb3VzaW4gc3R5bGUgc2hhcmluZyBjb2Rl
IHdvbid0IGdldAotICAgICAgICAgICAgLy8gZm9vbGVkIGludG8gYmVsaWV2aW5nIHRoaXMgc3R5
bGUgaXMgdGhlIHNhbWUuICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHRoZSBkb2N1bWVudCBh
Y3R1YWxseSB1c2VzCi0gICAgICAgICAgICAvLyBzaWJsaW5nL2Rlc2NlbmRhbnQgcnVsZXMsIHNp
bmNlIG90aGVyd2lzZSBpdCBpc24ndCBwb3NzaWJsZSBmb3IgYW5jZXN0b3Igc3R5bGVzIHRvIGFm
ZmVjdCBzaGFyaW5nIG9mCi0gICAgICAgICAgICAvLyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAg
IHJlbmRlcmVyKCktPnNldFN0eWxlSW50ZXJuYWwobmV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgbmV3U3R5bGUtPmRlcmVmKGdldERvY3VtZW50KCktPnJlbmRlckFyZW5hKCkpOwotCi0g
ICAgICAgIGlmICggY2hhbmdlICE9IEZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RG9jdW1l
bnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygpKQotICAgICAgICAgICAgICAgIGNoYW5nZSA9IEZv
cmNlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNoYW5nZSA9IGNoOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChOb2RlICpuID0gZmFzdEZpcnN0Q2hpbGQoKTsgbjsg
biA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8
IG4tPmlzVGV4dE5vZGUoKSB8fCBuLT5oYXNDaGFuZ2VkQ2hpbGQoKSB8fCBuLT5jaGFuZ2VkKCkp
Ci0gICAgICAgICAgICBuLT5yZWNhbGNTdHlsZShjaGFuZ2UpOwotICAgIH0KLQotICAgIHNldENo
YW5nZWQoIGZhbHNlICk7Ci0gICAgc2V0SGFzQ2hhbmdlZENoaWxkKCBmYWxzZSApOwotfQotCi1i
b29sIEVsZW1lbnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0
Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgVEVY
VF9OT0RFOgotICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBQUk9DRVNT
SU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgot
ICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OmRpc3BhdGNoQXR0clJlbW92
YWxFdmVudChBdHRyaWJ1dGUqKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRl
bigpKTsKLSNpZiAwCi0gICAgaWYgKCFnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9j
dW1lbnQ6OkRPTUFUVFJNT0RJRklFRF9MSVNURU5FUikpCi0gICAgICAgIHJldHVybjsKLSAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBkaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50
KERPTUF0dHJNb2RpZmllZEV2ZW50LCB0cnVlLCBmYWxzZSwgYXR0ciwgYXR0ci0+dmFsdWUoKSwK
LSAgICAgICAgYXR0ci0+dmFsdWUoKSwgZ2V0RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQo
KSksIE11dGF0aW9uRXZlbnQ6OlJFTU9WQUwpLCBlYyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBFbGVt
ZW50OjpkaXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBh
c3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0jaWYgMAotICAgIGlmICghZ2V0RG9j
dW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50OjpET01BVFRSTU9ESUZJRURfTElTVEVO
RVIpKQotICAgICAgICByZXR1cm47Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgZGlz
cGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudChET01BdHRyTW9kaWZpZWRFdmVudCwgdHJ1ZSwg
ZmFsc2UsIGF0dHIsIGF0dHItPnZhbHVlKCksCi0gICAgICAgIGF0dHItPnZhbHVlKCksZ2V0RG9j
dW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0aW9uRXZlbnQ6OkFERElUSU9OKSwg
ZWMpOwotI2VuZGlmCi19Ci0KLVN0cmluZyBFbGVtZW50OjpvcGVuVGFnU3RhcnRUb1N0cmluZygp
IGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICI8IiArIG5vZGVOYW1lKCk7Ci0KLSAgICBO
YW1lZEF0dHJNYXAgKmF0dHJNYXAgPSBhdHRyaWJ1dGVzKHRydWUpOwotCi0gICAgaWYgKGF0dHJN
YXApIHsKLSAgICAgICAgdW5zaWduZWQgbnVtQXR0cnMgPSBhdHRyTWFwLT5sZW5ndGgoKTsKLSAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUF0dHJzOyBpKyspIHsKLSAgICAgICAg
ICAgIHJlc3VsdCArPSAiICI7Ci0KLSAgICAgICAgICAgIEF0dHJpYnV0ZSAqYXR0cmlidXRlID0g
YXR0ck1hcC0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgIHJlc3VsdCArPSBhdHRyaWJ1
dGUtPm5hbWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUtPnZhbHVl
KCkuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gIj1cIiI7Ci0gICAgICAg
ICAgICAgICAgLy8gRklYTUU6IHN1YnN0aXR1dGUgZW50aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMg
b2YgIiBvciAnCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGF0dHJpYnV0ZS0+dmFsdWUoKTsK
LSAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojp0b1N0
cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG9wZW5UYWdTdGFydFRvU3RyaW5n
KCk7Ci0KLSAgICBpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPiI7
Ci0KLSAgICAgICAgZm9yIChOb2RlICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gTlVM
TDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgcmVzdWx0ICs9
IGNoaWxkLT50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ICs9ICI8LyI7
Ci0gICAgICAgIHJlc3VsdCArPSBub2RlTmFtZSgpOwotICAgICAgICByZXN1bHQgKz0gIj4iOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiIC8+IjsKLSAgICB9Ci0KLSAgICByZXR1
cm4gcmVzdWx0OwotfQotCi12b2lkIEVsZW1lbnQ6OnVwZGF0ZUlkKGNvbnN0IEF0b21pY1N0cmlu
ZyYgb2xkSWQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmV3SWQpCi17Ci0gICAgaWYgKCFpbkRvY3Vt
ZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChvbGRJZCA9PSBuZXdJZCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnQqIGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYg
KCFvbGRJZC5pc0VtcHR5KCkpCi0gICAgICAgIGRvYy0+cmVtb3ZlRWxlbWVudEJ5SWQob2xkSWQs
IHRoaXMpOwotICAgIGlmICghbmV3SWQuaXNFbXB0eSgpKQotICAgICAgICBkb2MtPmFkZEVsZW1l
bnRCeUlkKG5ld0lkLCB0aGlzKTsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgRWxlbWVudDo6
ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBEZXByZWNhdGVkU3RyaW5nIGluZCkgY29uc3QKLXsK
LSAgICB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCk7Ci0gICAgaWYgKG5hbWVkQXR0ck1h
cCkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZWRBdHRyTWFwLT5sZW5n
dGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgKmF0dHIgPSBuYW1lZEF0dHJNYXAt
PmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAqc3RyZWFtIDw8ICIgIiA8PCBhdHRyLT5u
YW1lKCkubG9jYWxOYW1lKCkuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCkKLSAgICAgICAgICAg
ICAgICAgICAgPDwgIj1cIiIgPDwgYXR0ci0+dmFsdWUoKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNj
aWkoKSA8PCAiXCIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGFpbmVyTm9kZTo6ZHVt
cChzdHJlYW0saW5kKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBFbGVtZW50
Ojpmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3QK
LXsKLSAgICBTdHJpbmcgcmVzdWx0OwotICAgIFN0cmluZyBzOwotICAgIAotICAgIHMgPSBub2Rl
TmFtZSgpOwotICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gczsK
LSAgICB9Ci0gICAgICAgICAgCi0gICAgcyA9IGdldEF0dHJpYnV0ZShpZEF0dHIpOwotICAgIGlm
IChzLmxlbmd0aCgpID4gMCkgewotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkKLSAg
ICAgICAgICAgIHJlc3VsdCArPSAiOyAiOwotICAgICAgICByZXN1bHQgKz0gImlkPSI7Ci0gICAg
ICAgIHJlc3VsdCArPSBzOwotICAgIH0KLSAgICAgICAgICAKLSAgICBzID0gZ2V0QXR0cmlidXRl
KGNsYXNzQXR0cik7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGlmIChyZXN1
bHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmVzdWx0ICs9ICI7ICI7Ci0gICAgICAgIHJl
c3VsdCArPSAiY2xhc3M9IjsKLSAgICAgICAgcmVzdWx0ICs9IHM7Ci0gICAgfQotICAgICAgICAg
IAotICAgIHN0cm5jcHkoYnVmZmVyLCByZXN1bHQuZGVwcmVjYXRlZFN0cmluZygpLmxhdGluMSgp
LCBsZW5ndGggLSAxKTsKLX0KLSNlbmRpZgotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OnNl
dEF0dHJpYnV0ZU5vZGUoQXR0ciAqYXR0ciwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgQVNT
RVJUKGF0dHIpOwotICAgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9jYXN0PEF0dHI+KGF0dHJpYnV0
ZXMoZmFsc2UpLT5zZXROYW1lZEl0ZW0oYXR0ciwgZWMpKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRy
PiBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIgKmF0dHIsIEV4Y2VwdGlvbkNvZGUm
IGVjKQotewotICAgIGlmICghYXR0ciB8fCBhdHRyLT5vd25lckVsZW1lbnQoKSAhPSB0aGlzKSB7
Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIGlmIChnZXREb2N1bWVudCgpICE9IGF0dHItPmdldERvY3VtZW50KCkpIHsKLSAgICAgICAg
ZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAg
IE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMp
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0
cj4oYXR0cnMtPnJlbW92ZU5hbWVkSXRlbShhdHRyLT5xdWFsaWZpZWROYW1lKCksIGVjKSk7Ci19
Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VV
UkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhj
ZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlm
ICghRG9jdW1lbnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxv
Y2FsTmFtZSkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgc2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUocHJlZml4Lmlt
cGwoKSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSksIHZhbHVlLmltcGwo
KSwgZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcm
IG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhU
TUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmVtb3ZlQXR0cmli
dXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwg
ZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYg
bmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMp
Ci17Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFt
ZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0
cj4gRWxlbWVudDo6Z2V0QXR0cmlidXRlTm9kZShjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAg
TmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50
KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJf
Y2FzdDxBdHRyPihhdHRycy0+Z2V0TmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxv
Y2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSkpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1l
bnQ6OmdldEF0dHJpYnV0ZU5vZGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3Qg
U3RyaW5nJiBsb2NhbE5hbWUpCi17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0
ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJu
IHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMtPmdldE5hbWVkSXRlbShRdWFsaWZpZWRO
YW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSkpOwot
fQotCi1ib29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0
Ci17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYg
KCFhdHRycykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBp
bkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGF0
dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5p
bXBsKCksIG51bGxBdG9tKSk7Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlTlMoY29u
c3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAot
ewotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICgh
YXR0cnMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYXR0cnMtPmdldEF0dHJp
YnV0ZUl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNw
YWNlVVJJLmltcGwoKSkpOwotfQotCi1DU1NTdHlsZURlY2xhcmF0aW9uICpFbGVtZW50OjpzdHls
ZSgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRWxlbWVudDo6Zm9jdXMoKQotewotICAg
IERvY3VtZW50KiBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGRvYy0+dXBkYXRlTGF5b3V0KCk7
Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgZG9jLT5zZXRGb2N1c05vZGUodGhp
cyk7Ci0gICAgICAgIGlmIChyb290RWRpdGFibGVFbGVtZW50KCkgPT0gdGhpcykgewotICAgICAg
ICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCByZXN0b3JlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24g
aWYgdGhlcmUgaXMgb25lLCBpbnN0ZWFkIG9mIGFsd2F5cyBzZWxlY3RpbmcgYWxsLgotICAgICAg
ICAgICAgaWYgKGRvYy0+ZnJhbWUoKS0+c2VsZWN0Q29udGVudHNPZk5vZGUodGhpcykpCi0gICAg
ICAgICAgICAgICAgZG9jLT5mcmFtZSgpLT5yZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAgICAgfSBl
bHNlIGlmIChyZW5kZXJlcigpICYmICFyZW5kZXJlcigpLT5pc1dpZGdldCgpKQotICAgICAgICAg
ICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShnZXRS
ZWN0KCkpOwotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpibHVyKCkKLXsKLSAgICBEb2N1bWVu
dCogZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jLT5mb2N1c05vZGUoKSA9PSB0aGlz
KQotICAgICAgICBkb2MtPnNldEZvY3VzTm9kZSgwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1OYW1lZEF0dHJNYXA6Ok5hbWVkQXR0ck1hcChFbGVtZW50ICplKQotICAgIDogZWxlbWVu
dChlKQotICAgICwgYXR0cnMoMCkKLSAgICAsIGxlbigwKQotewotfQotCi1OYW1lZEF0dHJNYXA6
On5OYW1lZEF0dHJNYXAoKQotewotICAgIE5hbWVkQXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCk7
IC8vIHZpcnR1YWwgbWV0aG9kLCBzbyBxdWFsaWZ5IGp1c3QgdG8gYmUgZXhwbGljaXQKLX0KLQot
Ym9vbCBOYW1lZEF0dHJNYXA6OmlzTWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1l
ZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1lKSBjb25zdAotewotICAgIFN0cmluZyBsb2NhbE5hbWUg
PSBpbkhUTUxEb2N1bWVudChlbGVtZW50KSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0
dXJuIGdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgp
LCBudWxsQXRvbSkpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6Z2V0TmFt
ZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxO
YW1lKSBjb25zdAotewotICAgIHJldHVybiBnZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxs
QXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1QYXNz
UmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVtKGNvbnN0IFN0cmluZyYg
bmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRN
TERvY3VtZW50KGVsZW1lbnQpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gcmVt
b3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51
bGxBdG9tKSwgZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3Zl
TmFtZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9j
YWxOYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVt
KFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5p
bXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1l
ZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QKLXsKLSAgICBBdHRyaWJ1dGUq
IGEgPSBnZXRBdHRyaWJ1dGVJdGVtKG5hbWUpOwotICAgIGlmICghYSkgcmV0dXJuIDA7Ci0KLSAg
ICByZXR1cm4gYS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotfQotCi1QYXNzUmVmUHRy
PE5vZGU+IE5hbWVkQXR0ck1hcDo6c2V0TmFtZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29k
ZSYgZWMpCi17Ci0gICAgaWYgKCFlbGVtZW50KSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VS
UjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FM
TE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtYXAgaXMgcmVhZG9ubHkuCi0gICAgaWYgKGlzUmVh
ZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlz
ZWQgaWYgYXJnIHdhcyBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUg
b25lIHRoYXQgY3JlYXRlZCB0aGlzIG1hcC4KLSAgICBpZiAoYXJnLT5nZXREb2N1bWVudCgpICE9
IGVsZW1lbnQtPmdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9F
UlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5vdCBtZW50aW9uZWQgaW4g
c3BlYzogdGhyb3cgYSBISUVSQVJDSFlfUkVRVUVTVF9FUlJPUiBpZiB0aGUgdXNlciBwYXNzZXMg
aW4gYSBub24tYXR0cmlidXRlIG5vZGUKLSAgICBpZiAoIWFyZy0+aXNBdHRyaWJ1dGVOb2RlKCkp
IHsKLSAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgIHJldHVybiAw
OwotICAgIH0KLSAgICBBdHRyICphdHRyID0gc3RhdGljX2Nhc3Q8QXR0cio+KGFyZyk7Ci0KLSAg
ICBBdHRyaWJ1dGUqIGEgPSBhdHRyLT5hdHRyKCk7Ci0gICAgQXR0cmlidXRlKiBvbGQgPSBnZXRB
dHRyaWJ1dGVJdGVtKGEtPm5hbWUoKSk7Ci0gICAgaWYgKG9sZCA9PSBhKQotICAgICAgICByZXR1
cm4gUmVmUHRyPE5vZGU+KGFyZyk7IC8vIHdlIGtub3cgYWJvdXQgaXQgYWxyZWFkeQotCi0gICAg
Ly8gSU5VU0VfQVRUUklCVVRFX0VSUjogUmFpc2VkIGlmIGFyZyBpcyBhbiBBdHRyIHRoYXQgaXMg
YWxyZWFkeSBhbiBhdHRyaWJ1dGUgb2YgYW5vdGhlciBFbGVtZW50IG9iamVjdC4KLSAgICAvLyBU
aGUgRE9NIHVzZXIgbXVzdCBleHBsaWNpdGx5IGNsb25lIEF0dHIgbm9kZXMgdG8gcmUtdXNlIHRo
ZW0gaW4gb3RoZXIgZWxlbWVudHMuCi0gICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKSB7Ci0g
ICAgICAgIGVjID0gSU5VU0VfQVRUUklCVVRFX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotCi0gICAgaWYgKGEtPm5hbWUoKSA9PSBpZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0
ZUlkKG9sZCA/IG9sZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBhLT52YWx1ZSgpKTsKLQotICAgIC8v
ICMjIyBzbGlnaHRseSBpbmVmZmljaWVudCAtIHJlc2l6ZXMgYXR0cmlidXRlIGFycmF5IHR3aWNl
LgotICAgIFJlZlB0cjxOb2RlPiByOwotICAgIGlmIChvbGQpIHsKLSAgICAgICAgciA9IG9sZC0+
Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUoYS0+
bmFtZSgpKTsKLSAgICB9Ci0KLSAgICBhZGRBdHRyaWJ1dGUoYSk7Ci0gICAgcmV0dXJuIHIucmVs
ZWFzZSgpOwotfQotCi0vLyBUaGUgRE9NMiBzcGVjIGRvZXNuJ3Qgc2F5IHRoYXQgcmVtb3ZlQXR0
cmlidXRlW05TXSB0aHJvd3MgTk9UX0ZPVU5EX0VSUgotLy8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBu
b3QgZm91bmQsIGJ1dCBhdCB0aGlzIGxldmVsIHdlIGhhdmUgdG8gdGhyb3cgTk9UX0ZPVU5EX0VS
UgotLy8gYmVjYXVzZSBvZiByZW1vdmVOYW1lZEl0ZW0sIHJlbW92ZU5hbWVkSXRlbU5TLCBhbmQg
cmVtb3ZlQXR0cmlidXRlTm9kZS4KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpyZW1v
dmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMp
Ci17Ci0gICAgLy8gIyMjIHNob3VsZCB0aGlzIHJlYWxseSBiZSByYWlzZWQgd2hlbiB0aGUgYXR0
cmlidXRlIHRvIHJlbW92ZSBpc24ndCB0aGVyZSBhdCBhbGw/Ci0gICAgLy8gTk9fTU9ESUZJQ0FU
SU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seQotICAgIGlm
IChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9F
UlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEF0dHJpYnV0ZSogYSA9IGdldEF0
dHJpYnV0ZUl0ZW0obmFtZSk7Ci0gICAgaWYgKCFhKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5E
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUmVmUHRyPE5vZGU+IHIgPSBh
LT5jcmVhdGVBdHRySWZOZWVkZWQoZWxlbWVudCk7Ci0KLSAgICBpZiAobmFtZSA9PSBpZEF0dHIp
Ci0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlkKGEtPnZhbHVlKCksIG51bGxBdG9tKTsKLQotICAg
IHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICByZXR1cm4gci5yZWxlYXNlKCk7Ci19Ci0KLVBh
c3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25z
dAotewotICAgIGlmIChpbmRleCA+PSBsZW4pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0
dXJuIGF0dHJzW2luZGV4XS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotfQotCi1BdHRy
aWJ1dGUqIE5hbWVkQXR0ck1hcDo6Z2V0QXR0cmlidXRlSXRlbShjb25zdCBRdWFsaWZpZWROYW1l
JiBuYW1lKSBjb25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkg
ewotICAgICAgICBpZiAoYXR0cnNbaV0tPm5hbWUoKS5tYXRjaGVzKG5hbWUpKQotICAgICAgICAg
ICAgcmV0dXJuIGF0dHJzW2ldOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOYW1l
ZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygpCi17Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGF0
dHJzW2ldLT5tX2ltcGwpCi0gICAgICAgICAgICAgICAgYXR0cnNbaV0tPm1faW1wbC0+bV9lbGVt
ZW50ID0gMDsKLSAgICAgICAgICAgIGF0dHJzW2ldLT5kZXJlZigpOwotICAgICAgICB9Ci0gICAg
ICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSAwOwotICAgIH0KLSAgICBsZW4g
PSAwOwotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6ZGV0YWNoRnJvbUVsZW1lbnQoKQotewotICAg
IC8vIHdlIGFsbG93IGEgTmFtZWRBdHRyTWFwIHcvbyBhbiBlbGVtZW50IGluIGNhc2Ugc29tZW9u
ZSBzdGlsbCBoYXMgYSByZWZlcmVuY2UKLSAgICAvLyB0byBpZiBhZnRlciB0aGUgZWxlbWVudCBn
ZXRzIGRlbGV0ZWQgLSBidXQgdGhlIG1hcCBpcyBub3cgaW52YWxpZAotICAgIGVsZW1lbnQgPSAw
OwotICAgIGNsZWFyQXR0cmlidXRlcygpOwotfQotCi1OYW1lZEF0dHJNYXAmIE5hbWVkQXR0ck1h
cDo6b3BlcmF0b3I9KGNvbnN0IE5hbWVkQXR0ck1hcCYgb3RoZXIpCi17Ci0gICAgLy8gY2xvbmUg
YWxsIGF0dHJpYnV0ZXMgaW4gdGhlIG90aGVyIG1hcCwgYnV0IGF0dGFjaCB0byBvdXIgZWxlbWVu
dAotICAgIGlmICghZWxlbWVudCkKLSAgICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgLy8gSWYg
YXNzaWduaW5nIHRoZSBtYXAgY2hhbmdlcyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNh
bGwKLSAgICAvLyB1cGRhdGVJZC4KLQotICAgIEF0dHJpYnV0ZSAqb2xkSWQgPSBnZXRBdHRyaWJ1
dGVJdGVtKGlkQXR0cik7Ci0gICAgQXR0cmlidXRlICpuZXdJZCA9IG90aGVyLmdldEF0dHJpYnV0
ZUl0ZW0oaWRBdHRyKTsKLQotICAgIGlmIChvbGRJZCB8fCBuZXdJZCkKLSAgICAgICAgZWxlbWVu
dC0+dXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/IG5l
d0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwotCi0gICAgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAg
bGVuID0gb3RoZXIubGVuOwotICAgIGF0dHJzID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihm
YXN0TWFsbG9jKGxlbiAqIHNpemVvZihBdHRyaWJ1dGUgKikpKTsKLQotICAgIC8vIGZpcnN0IGlu
aXRpYWxpemUgYXR0cnMgdmVjdG9yLCB0aGVuIGNhbGwgYXR0cmlidXRlQ2hhbmdlZCBvbiBpdAot
ICAgIC8vIHRoaXMgYWxsb3dzIGF0dHJpYnV0ZUNoYW5nZWQgdG8gdXNlIGdldEF0dHJpYnV0ZQot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBhdHRyc1tp
XSA9IG90aGVyLmF0dHJzW2ldLT5jbG9uZSgpOwotICAgICAgICBhdHRyc1tpXS0+cmVmKCk7Ci0g
ICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgd2FzdGVmdWwuICBUaGUgY2xhc3MgbGlzdCBj
b3VsZCBiZSBwcmVzZXJ2ZWQgb24gYSBjb3B5LCBhbmQgd2UKLSAgICAvLyB3b3VsZG4ndCBoYXZl
IHRvIHdhc3RlIHRpbWUgcmVwYXJzaW5nIHRoZSBhdHRyaWJ1dGUuCi0gICAgLy8gVGhlIGRlcml2
ZWQgY2xhc3MsIEhUTUxOYW1lZEF0dHJNYXAsIHdoaWNoIG1hbmFnZXMgYSBwYXJzZWQgY2xhc3Mg
bGlzdCBmb3IgdGhlIENMQVNTIGF0dHJpYnV0ZSwKLSAgICAvLyB3aWxsIHVwZGF0ZSBpdHMgbWVt
YmVyIHZhcmlhYmxlIHdoZW4gcGFyc2UgYXR0cmlidXRlIGlzIGNhbGxlZC4KLSAgICBmb3IodW5z
aWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgZWxlbWVudC0+YXR0cmlidXRlQ2hh
bmdlZChhdHRyc1tpXSwgdHJ1ZSk7Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgTmFt
ZWRBdHRyTWFwOjphZGRBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyaWJ1dGUpCi17Ci0gICAgLy8g
QWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3QKLSAgICBBdHRyaWJ1dGUgKipuZXdBdHRycyA9
IHN0YXRpY19jYXN0PEF0dHJpYnV0ZSAqKj4oZmFzdE1hbGxvYygobGVuICsgMSkgKiBzaXplb2Yo
QXR0cmlidXRlICopKSk7Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIG5ld0F0dHJzW2ldID0gYXR0cnNbaV07Ci0gICAg
ICBmYXN0RnJlZShhdHRycyk7Ci0gICAgfQotICAgIGF0dHJzID0gbmV3QXR0cnM7Ci0gICAgYXR0
cnNbbGVuKytdID0gYXR0cmlidXRlOwotICAgIGF0dHJpYnV0ZS0+cmVmKCk7Ci0KLSAgICBBdHRy
ICogY29uc3QgYXR0ciA9IGF0dHJpYnV0ZS0+bV9pbXBsOwotICAgIGlmIChhdHRyKQotICAgICAg
ICBhdHRyLT5tX2VsZW1lbnQgPSBlbGVtZW50OwotCi0gICAgLy8gTm90aWZ5IHRoZSBlbGVtZW50
IHRoYXQgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCwgYW5kIGRpc3BhdGNoIGFwcHJvcHJp
YXRlIG11dGF0aW9uIGV2ZW50cwotICAgIC8vIE5vdGUgdGhhdCBlbGVtZW50IG1heSBiZSBudWxs
IGhlcmUgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIGluc2VydEF0dHIoKSBkdXJpbmcgcGFyc2luZwot
ICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgIFJlZlB0cjxBdHRyaWJ1dGU+IGEgPSBhdHRyaWJ1
dGU7Ci0gICAgICAgIGVsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQoYS5nZXQoKSk7Ci0gICAgICAg
IC8vIEJlY2F1c2Ugb2Ygb3VyIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBzdHlsZSBt
b2RpZmljYXRpb24gZXZlbnRzIGFyZSBuZXZlciBzZW50IGF0IHRoZSByaWdodCB0aW1lLCBzbyBk
b24ndCBib3RoZXIgc2VuZGluZyB0aGVtLgotICAgICAgICBpZiAoYS0+bmFtZSgpICE9IHN0eWxl
QXR0cikgewotICAgICAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hBdHRyQWRkaXRpb25FdmVudChh
LmdldCgpKTsKLSAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZl
bnQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6cmVt
b3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpCi17Ci0gICAgdW5zaWduZWQg
aW5kZXggPSBsZW4rMTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpCi0g
ICAgICAgIGlmIChhdHRyc1tpXS0+bmFtZSgpLm1hdGNoZXMobmFtZSkpIHsKLSAgICAgICAgICAg
IGluZGV4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBpZiAoaW5k
ZXggPj0gbGVuKSByZXR1cm47Ci0KLSAgICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRo
ZSBsaXN0Ci0gICAgQXR0cmlidXRlKiBhdHRyID0gYXR0cnNbaW5kZXhdOwotICAgIGlmIChhdHRy
c1tpbmRleF0tPm1faW1wbCkKLSAgICAgICAgYXR0cnNbaW5kZXhdLT5tX2ltcGwtPm1fZWxlbWVu
dCA9IDA7Ci0gICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAg
ICAgICAgYXR0cnMgPSAwOwotICAgICAgICBsZW4gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IEF0dHJpYnV0ZSAqKm5ld0F0dHJzID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFs
bG9jKChsZW4gLSAxKSAqIHNpemVvZihBdHRyaWJ1dGUgKikpKTsKLSAgICAgICAgdW5zaWduZWQg
aTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHVuc2lnbmVkKGluZGV4KTsgaSsrKQotICAgICAg
ICAgICAgbmV3QXR0cnNbaV0gPSBhdHRyc1tpXTsKLSAgICAgICAgbGVuLS07Ci0gICAgICAgIGZv
ciAoOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICBuZXdBdHRyc1tpXSA9IGF0dHJzW2krMV07
Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSBuZXdBdHRyczsKLSAg
ICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhlIGVsZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlIGhhcyBi
ZWVuIHJlbW92ZWQKLSAgICAvLyBkaXNwYXRjaCBhcHByb3ByaWF0ZSBtdXRhdGlvbiBldmVudHMK
LSAgICBpZiAoZWxlbWVudCAmJiAhYXR0ci0+bV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICBB
dG9taWNTdHJpbmcgdmFsdWUgPSBhdHRyLT5tX3ZhbHVlOwotICAgICAgICBhdHRyLT5tX3ZhbHVl
ID0gbnVsbEF0b207Ci0gICAgICAgIGVsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQoYXR0cik7Ci0g
ICAgICAgIGF0dHItPm1fdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQpIHsK
LSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KGF0dHIpOwotICAgICAg
ICBlbGVtZW50LT5kaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KGZhbHNlKTsKLSAgICB9Ci0g
ICAgYXR0ci0+ZGVyZWYoKTsKLX0KLQotYm9vbCBOYW1lZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50
KGNvbnN0IE5hbWVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0Ci17Ci0gICAgaWYgKCFvdGhlck1h
cCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChsZW5ndGgoKSAhPSBvdGhl
ck1hcC0+bGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoKCk7IGkrKykgewotICAgICAgICBBdHRyaWJ1dGUgKmF0
dHIgPSBhdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICBBdHRyaWJ1dGUgKm90aGVyQXR0ciA9IG90
aGVyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGF0dHItPm5hbWUoKSk7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgaWYgKCFvdGhlckF0dHIgfHwgYXR0ci0+dmFsdWUoKSAhPSBvdGhlckF0dHItPnZhbHVl
KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0
cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0eWxlZCBFbGVt
ZW50IGFuZCBNYXBwZWQgQXR0cmlidXRlIEltcGxlbWVudGF0aW9uCi0KLUNTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uOjp+Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oKQotewotICAg
IGlmIChtX2VudHJ5VHlwZSAhPSBlUGVyc2lzdGVudCkKLSAgICAgICAgU3R5bGVkRWxlbWVudDo6
cmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVjbChtX2VudHJ5VHlwZSwgbV9hdHRyTmFtZSwgbV9hdHRy
VmFsdWUpOwotfQotCiBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVu
dDo6Z2V0TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUs
IEF0dHJpYnV0ZSogYXR0cikKIHsKICAgICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQpAQCAt
MTIwMCwxMDAgKzEwMSwxMSBAQCB2b2lkIFN0eWxlZEVsZW1lbnQ6OnVwZGF0ZVN0eWxlQXR0cmli
dXRlCiAgICAgfQogfQogCi1BdHRyaWJ1dGUqIE1hcHBlZEF0dHJpYnV0ZTo6Y2xvbmUoYm9vbCBw
cmVzZXJ2ZURlY2wpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5ldyBNYXBwZWRBdHRyaWJ1dGUobmFt
ZSgpLCB2YWx1ZSgpLCBwcmVzZXJ2ZURlY2wgPyBtX3N0eWxlRGVjbC5nZXQoKSA6IDApOwotfQot
Ci1OYW1lZE1hcHBlZEF0dHJNYXA6Ok5hbWVkTWFwcGVkQXR0ck1hcChFbGVtZW50ICplKQotOk5h
bWVkQXR0ck1hcChlKSwgbV9tYXBwZWRBdHRyaWJ1dGVDb3VudCgwKQote30KLQotdm9pZCBOYW1l
ZE1hcHBlZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygpCi17Ci0gICAgbV9jbGFzc0xpc3QuY2xl
YXIoKTsKLSAgICBtX21hcHBlZEF0dHJpYnV0ZUNvdW50ID0gMDsKLSAgICBOYW1lZEF0dHJNYXA6
OmNsZWFyQXR0cmlidXRlcygpOwotfQotCi1ib29sIE5hbWVkTWFwcGVkQXR0ck1hcDo6aXNNYXBw
ZWRBdHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgTmFt
ZWRNYXBwZWRBdHRyTWFwOjpkZWNsQ291bnQoKSBjb25zdAotewotICAgIGludCByZXN1bHQgPSAw
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAg
IE1hcHBlZEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgIGlmIChh
dHRyLT5kZWNsKCkpCi0gICAgICAgICAgICByZXN1bHQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJl
c3VsdDsKLX0KLQotYm9vbCBOYW1lZE1hcHBlZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0
IE5hbWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0Ci17Ci0gICAgLy8gVGhlICMgb2Yg
ZGVjbHMgbXVzdCBtYXRjaC4KLSAgICBpZiAoZGVjbENvdW50KCkgIT0gb3RoZXJNYXAtPmRlY2xD
b3VudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgLy8gVGhlIHZhbHVlcyBm
b3IgZWFjaCBkZWNsIG11c3QgbWF0Y2guCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxl
bmd0aCgpOyBpKyspIHsKLSAgICAgICAgTWFwcGVkQXR0cmlidXRlKiBhdHRyID0gYXR0cmlidXRl
SXRlbShpKTsKLSAgICAgICAgaWYgKGF0dHItPmRlY2woKSkgewotICAgICAgICAgICAgQXR0cmli
dXRlKiBvdGhlckF0dHIgPSBvdGhlck1hcC0+Z2V0QXR0cmlidXRlSXRlbShhdHRyLT5uYW1lKCkp
OwotICAgICAgICAgICAgaWYgKCFvdGhlckF0dHIgfHwgKGF0dHItPnZhbHVlKCkgIT0gb3RoZXJB
dHRyLT52YWx1ZSgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIGlubGluZSBzdGF0aWMgYm9vbCBpc0NsYXNz
V2hpdGVzcGFjZShRQ2hhciBjKQogewogICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdccicg
fHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JzsKIH0KIAotdm9pZCBOYW1lZE1hcHBlZEF0dHJNYXA6
OnBhcnNlQ2xhc3NBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBjbGFzc1N0cikKLXsKLSAgICBtX2Ns
YXNzTGlzdC5jbGVhcigpOwotICAgIGlmICghZWxlbWVudC0+aGFzQ2xhc3MoKSkKLSAgICAgICAg
cmV0dXJuOwotICAgIAotICAgIFN0cmluZyBjbGFzc0F0dHIgPSBlbGVtZW50LT5nZXREb2N1bWVu
dCgpLT5pbkNvbXBhdE1vZGUoKSA/IAotICAgICAgICAoY2xhc3NTdHIuaW1wbCgpLT5pc0xvd2Vy
KCkgPyBjbGFzc1N0ciA6IFN0cmluZyhjbGFzc1N0ci5pbXBsKCktPmxvd2VyKCkpKSA6Ci0gICAg
ICAgIGNsYXNzU3RyOwotICAgIAotICAgIEF0b21pY1N0cmluZ0xpc3QqIGN1cnIgPSAwOwotICAg
IAotICAgIGNvbnN0IFFDaGFyKiBzdHIgPSBjbGFzc0F0dHIudW5pY29kZSgpOwotICAgIGludCBs
ZW5ndGggPSBjbGFzc0F0dHIubGVuZ3RoKCk7Ci0gICAgaW50IHNQb3MgPSAwOwotCi0gICAgd2hp
bGUgKHRydWUpIHsKLSAgICAgICAgd2hpbGUgKHNQb3MgPCBsZW5ndGggJiYgaXNDbGFzc1doaXRl
c3BhY2Uoc3RyW3NQb3NdKSkKLSAgICAgICAgICAgICsrc1BvczsKLSAgICAgICAgaWYgKHNQb3Mg
Pj0gbGVuZ3RoKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGludCBlUG9zID0gc1BvcyAr
IDE7Ci0gICAgICAgIHdoaWxlIChlUG9zIDwgbGVuZ3RoICYmICFpc0NsYXNzV2hpdGVzcGFjZShz
dHJbZVBvc10pKQotICAgICAgICAgICAgKytlUG9zOwotICAgICAgICBpZiAoY3VycikgewotICAg
ICAgICAgICAgY3Vyci0+c2V0TmV4dChuZXcgQXRvbWljU3RyaW5nTGlzdChBdG9taWNTdHJpbmco
c3RyICsgc1BvcywgZVBvcyAtIHNQb3MpKSk7Ci0gICAgICAgICAgICBjdXJyID0gY3Vyci0+bmV4
dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNQb3MgPT0gMCAmJiBlUG9z
ID09IGxlbmd0aCkgewotICAgICAgICAgICAgICAgIG1fY2xhc3NMaXN0LnNldFN0cmluZyhBdG9t
aWNTdHJpbmcoY2xhc3NBdHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBtX2NsYXNzTGlzdC5zZXRTdHJpbmcoQXRvbWljU3RyaW5nKHN0ciAr
IHNQb3MsIGVQb3MgLSBzUG9zKSk7Ci0gICAgICAgICAgICBjdXJyID0gJm1fY2xhc3NMaXN0Owot
ICAgICAgICB9Ci0gICAgICAgIHNQb3MgPSBlUG9zICsgMTsKLSAgICB9Ci19Ci0KIFN0eWxlZEVs
ZW1lbnQ6OlN0eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRG9jdW1lbnQg
KmRvYykKICAgICA6IEVsZW1lbnQobmFtZSwgZG9jKQogewpJbmRleDogZG9tL0F0dHIuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBkb20vQXR0ci5oCShyZXZpc2lvbiAxMzQ3NykKKysrIGRvbS9BdHRyLmgJKHdv
cmtpbmcgY29weSkKQEAgLTI0LDgyICsyNCwyNyBAQAogICoKICAqLwogCi0jaWZuZGVmIERPTV9F
TEVNRU5USU1QTF9ICi0jZGVmaW5lIERPTV9FTEVNRU5USU1QTF9ICisjaWZuZGVmIEF0dHJfaAor
I2RlZmluZSBBdHRyX2gKIAotI2luY2x1ZGUgIkF0b21pY1N0cmluZ0xpc3QuaCIKICNpbmNsdWRl
ICJDb250YWluZXJOb2RlLmgiCi0jaW5jbHVkZSAiTmFtZWROb2RlTWFwLmgiCi0jaW5jbHVkZSAi
UXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKLSNpbmNsdWRlICJjc3Nf
dmFsdWVpbXBsLmgiCi0KLSNpZiBfX09CSkNfXwotI2RlZmluZSBpZCBpZF9BVk9JRF9LRVlXT1JE
Ci0jZW5kaWYKKyNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
Ci1jbGFzcyBBdHRyOwotY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWNsYXNzIENTU1N0eWxl
U2VsZWN0b3I7Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgTmFtZWRBdHRyTWFwOwogCiAvLyB0aGlz
IGhhcyBubyBjb3VudGVycGFydCBpbiBET00sIHB1cmVseSBpbnRlcm5hbAogLy8gcmVwcmVzZW50
YXRpb24gb2YgdGhlIG5vZGV2YWx1ZSBvZiBhbiBBdHRyLgogLy8gdGhlIGFjdHVhbCBBdHRyIChB
dHRyKSB3aXRoIGl0cyB2YWx1ZSBhcyB0ZXh0Y2hpbGQKIC8vIGlzIG9ubHkgYWxsb2NhdGVkIG9u
IGRlbWFuZCBieSB0aGUgRE9NIGJpbmRpbmdzLgogLy8gQW55IHVzZSBvZiBBdHRyIGluc2lkZSBr
aHRtbCBzaG91bGQgYmUgYXZvaWRlZC4KLWNsYXNzIEF0dHJpYnV0ZSA6IHB1YmxpYyBTaGFyZWQ8
QXR0cmlidXRlPiB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsKLSAgICBmcmllbmQg
Y2xhc3MgRWxlbWVudDsKLSAgICBmcmllbmQgY2xhc3MgQXR0cjsKLQotcHVibGljOgotICAgIC8v
IG51bGwgdmFsdWUgaXMgZm9yYmlkZGVuICEKLSAgICBBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVk
TmFtZSYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkKLSAgICAgICAgOiBtX25hbWUo
bmFtZSksIG1fdmFsdWUodmFsdWUpLCBtX2ltcGwoMCkKLSAgICB7fQotICAgIAotICAgIEF0dHJp
YnV0ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUp
Ci0gICAgICAgIDogbV9uYW1lKG51bGxBdG9tLCBuYW1lLCBudWxsQXRvbSksIG1fdmFsdWUodmFs
dWUpLCBtX2ltcGwoMCkKLSAgICB7fQotCi0gICAgdmlydHVhbCB+QXR0cmlidXRlKCkgeyB9Ci0g
ICAgCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFs
dWU7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1f
bmFtZS5wcmVmaXgoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKCkgY29u
c3QgeyByZXR1cm4gbV9uYW1lLmxvY2FsTmFtZSgpOyB9Ci0gICAgY29uc3QgQXRvbWljU3RyaW5n
JiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX25hbWUubmFtZXNwYWNlVVJJKCk7IH0K
LSAgICAKLSAgICBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9u
YW1lOyB9Ci0gICAgCi0gICAgQXR0ciogYXR0cigpIGNvbnN0IHsgcmV0dXJuIG1faW1wbDsgfQot
ICAgIFBhc3NSZWZQdHI8QXR0cj4gY3JlYXRlQXR0cklmTmVlZGVkKEVsZW1lbnQqIGUpOwotCi0g
ICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlLmlzTnVsbCgpOyB9Ci0gICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZS5pc0VtcHR5KCk7IH0KLSAgICAK
LSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSogY2xvbmUoYm9vbCBwcmVzZXJ2ZURlY2w9dHJ1ZSkgY29u
c3Q7Ci0KLSAgICAvLyBBbiBleHRlbnNpb24gdG8gZ2V0IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBm
b3IgcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcy4KLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFy
YXRpb24qIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIAotcHJpdmF0ZToKLSAgICB2
b2lkIHNldFZhbHVlKGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVl
OyB9Ci0gICAgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgpIHsgbV9u
YW1lLnNldFByZWZpeChwcmVmaXgpOyB9Ci0KLSAgICBRdWFsaWZpZWROYW1lIG1fbmFtZTsKLSAg
ICBBdG9taWNTdHJpbmcgbV92YWx1ZTsKLSAgICBBdHRyKiBtX2ltcGw7Ci19OwogCiAvLyBBdHRy
IGNhbiBoYXZlIFRleHQgYW5kIEVudGl0eVJlZmVyZW5jZSBjaGlsZHJlbgogLy8gdGhlcmVmb3Jl
IGl0IGhhcyB0byBiZSBhIGZ1bGxibG93biBOb2RlLiBUaGUgcGxhbgogLy8gaXMgdG8gZHluYW1p
Y2FsbHkgYWxsb2NhdGUgYSB0ZXh0Y2hpbGQgYW5kIHN0b3JlIHRoZQogLy8gcmVzdWx0aW5nIG5v
ZGV2YWx1ZSBpbiB0aGUgQXR0cmlidXRlIHVwb24KIC8vIGRlc3RydWN0aW9uLiBob3dldmVyLCB0
aGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKIGNsYXNzIEF0dHIgOiBwdWJsaWMgQ29udGFp
bmVyTm9kZSB7CiAgICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsKIApAQCAtMTUwLDMxMSAr
OTUsNiBAQCBwcml2YXRlOgogICAgIGludCBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZDsKIH07CiAK
LWNsYXNzIEVsZW1lbnQgOiBwdWJsaWMgQ29udGFpbmVyTm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNz
IERvY3VtZW50OwotICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNs
YXNzIEF0dHI7Ci0gICAgZnJpZW5kIGNsYXNzIE5vZGU7Ci0gICAgZnJpZW5kIGNsYXNzIENTU1N0
eWxlU2VsZWN0b3I7Ci1wdWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lLCBEb2N1bWVudCAqZG9jKTsKLSAgICB+RWxlbWVudCgpOwotCi0gICAgLy8gVXNlZCB0
byBxdWlja2x5IGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGhhcyBhIGdpdmVu
IENTUyBjbGFzcy4KLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIGdldENsYXNz
TGlzdCgpIGNvbnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0SURBdHRyaWJ1dGUoKSBj
b25zdDsKLSAgICBib29sIGhhc0F0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBj
b25zdDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZp
ZWROYW1lJiBuYW1lKSBjb25zdDsKLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZp
ZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZv
aWQgcmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNv
ZGUmKTsKLQotICAgIGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNB
dHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBib29sIGhhc0F0dHJpYnV0
ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkg
Y29uc3Q7Ci0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBTdHJp
bmcmIG5hbWUpIGNvbnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0cmlidXRlTlMo
Y29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25z
dDsKLQotICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgc2V0QXR0cmlidXRlTlMoY29u
c3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29u
c3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzY3JvbGxJbnRv
VmlldyAoYm9vbCBhbGlnblRvVG9wKTsKLSAgICB2b2lkIHNjcm9sbEludG9WaWV3SWZOZWVkZWQo
Ym9vbCBjZW50ZXJJZk5lZWRlZCk7Ci0KLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBT
dHJpbmcgJm5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKTsKLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0
ZU5TKGNvbnN0IFN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwg
RXhjZXB0aW9uQ29kZSYpOwotCi0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2Rl
KGNvbnN0IFN0cmluZyYgbmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVO
b2RlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1l
KTsKLSAgICBQYXNzUmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGUoQXR0ciosIEV4Y2VwdGlv
bkNvZGUmKTsKLSAgICBQYXNzUmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyKiBu
ZXdBdHRyLCBFeGNlcHRpb25Db2RlJiBlYykgeyByZXR1cm4gc2V0QXR0cmlidXRlTm9kZShuZXdB
dHRyLCBlYyk7IH0KLSAgICBQYXNzUmVmUHRyPEF0dHI+IHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0
ciosIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICAKLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRp
b24gKnN0eWxlKCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUo
KSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVGFnTmFt
ZShjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUu
bWF0Y2hlcyh0YWdOYW1lKTsgfQotICAgIAotICAgIC8vIEEgZmFzdCBmdW5jdGlvbiBmb3IgY2hl
Y2tpbmcgdGhlIGxvY2FsIG5hbWUgYWdhaW5zdCBhbm90aGVyIGF0b21pYyBzdHJpbmcuCi0gICAg
Ym9vbCBoYXNMb2NhbE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1
cm4gbV90YWdOYW1lLmxvY2FsTmFtZSgpID09IG90aGVyOyB9Ci0gICAgYm9vbCBoYXNMb2NhbE5h
bWUoY29uc3QgUXVhbGlmaWVkTmFtZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5s
b2NhbE5hbWUoKSA9PSBvdGhlci5sb2NhbE5hbWUoKTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBB
dG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5h
bWUoKTsgfQotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7
IHJldHVybiBtX3RhZ05hbWUucHJlZml4KCk7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4
KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZpcnR1
YWwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX3Rh
Z05hbWUubmFtZXNwYWNlVVJJKCk7IH0KLSAgICAKLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlk
ZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBOb2RlVHlwZSBub2RlVHlwZSgp
IGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBkZWVw
KTsKLSAgICB2aXJ0dWFsIFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9v
bCBpc0VsZW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgdm9p
ZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURv
Y3VtZW50KCk7Ci0KLSAgICAvLyBjb252ZW5pZW5jZSBtZXRob2RzIHdoaWNoIGlnbm9yZSBleGNl
cHRpb25zCi0gICAgdm9pZCBzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIE5hbWVkQXR0ck1hcCAqYXR0cmli
dXRlcygpIGNvbnN0OwotICAgIE5hbWVkQXR0ck1hcCogYXR0cmlidXRlcyhib29sIHJlYWRvbmx5
KSBjb25zdDsKLQotICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhdHRy
aWJ1dGUgaXMgYWRkZWQsIGNoYW5nZWQgb3IgcmVtb3ZlZC4KLSAgICB2aXJ0dWFsIHZvaWQgYXR0
cmlidXRlQ2hhbmdlZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZhbHNl
KSB7fQotCi0gICAgLy8gbm90IHBhcnQgb2YgdGhlIERPTQotICAgIHZvaWQgc2V0QXR0cmlidXRl
TWFwKE5hbWVkQXR0ck1hcCopOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQ
cm9wZXJ0aWVzKGNvbnN0IEVsZW1lbnQgKnNvdXJjZSkge30KLSAgICAKLSAgICAvLyBTdGF0ZSBv
ZiB0aGUgZWxlbWVudC4KLSAgICB2aXJ0dWFsIERlcHJlY2F0ZWRTdHJpbmcgc3RhdGUoKSB7IHJl
dHVybiBEZXByZWNhdGVkU3RyaW5nOjpudWxsOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNo
KCk7Ci0gICAgdmlydHVhbCBSZW5kZXJTdHlsZSAqY3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5k
ZXJPYmplY3QgKnBhcmVudCk7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hICosIFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCByZWNh
bGNTdHlsZSggU3R5bGVDaGFuZ2UgPSBOb0NoYW5nZSApOwotCi0gICAgdmlydHVhbCBib29sIGNo
aWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUpOwotIAotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjcmVh
dGVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUp
OwotICAgIAotICAgIHZvaWQgZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KEF0dHJpYnV0ZSAqYXR0
cik7Ci0gICAgdm9pZCBkaXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RXZlbnQp
IHsgfQotCi0gICAgdmlydHVhbCBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKLQotICAgIHZpcnR1
YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotICAgICAgICAK
LSAgICB2aXJ0dWFsIHZvaWQgZm9jdXMoKTsKLSAgICB2b2lkIGJsdXIoKTsKLSAgICAKLSNpZiAh
TkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVj
YXRlZFN0cmluZyBpbmQgPSAiIikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGZvcm1hdEZvckRl
YnVnZ2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKLSNlbmRpZgotCi1w
cm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0Owot
ICAgIFN0cmluZyBvcGVuVGFnU3RhcnRUb1N0cmluZygpIGNvbnN0OwotCi1wcml2YXRlOgotICAg
IHZvaWQgdXBkYXRlSWQoY29uc3QgQXRvbWljU3RyaW5nJiBvbGRJZCwgY29uc3QgQXRvbWljU3Ry
aW5nJiBuZXdJZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5l
ZWRlZCgpIGNvbnN0IHt9Ci0KLXByb3RlY3RlZDogLy8gbWVtYmVyIHZhcmlhYmxlcwotICAgIG11
dGFibGUgUmVmUHRyPE5hbWVkQXR0ck1hcD4gbmFtZWRBdHRyTWFwOwotICAgIFF1YWxpZmllZE5h
bWUgbV90YWdOYW1lOwotfTsKLQotLy8gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1l
bnQKLWNsYXNzIE5hbWVkQXR0ck1hcCA6IHB1YmxpYyBOYW1lZE5vZGVNYXAgewotICAgIGZyaWVu
ZCBjbGFzcyBFbGVtZW50OwotcHVibGljOgotICAgIE5hbWVkQXR0ck1hcChFbGVtZW50ICplKTsK
LSAgICB2aXJ0dWFsIH5OYW1lZEF0dHJNYXAoKTsKLSAgICBOYW1lZEF0dHJNYXAoY29uc3QgTmFt
ZWRBdHRyTWFwJik7Ci0gICAgTmFtZWRBdHRyTWFwICZvcGVyYXRvciA9KGNvbnN0IE5hbWVkQXR0
ck1hcCAmb3RoZXIpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBOYW1l
ZE5vZGVNYXAKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW0oY29u
c3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVt
b3ZlTmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAg
dmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGdldE5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFt
ZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQ
YXNzUmVmUHRyPE5vZGU+IHJlbW92ZU5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNl
VVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmly
dHVhbCBQYXNzUmVmUHRyPE5vZGU+IGdldE5hbWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBu
YW1lKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVt
KGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8Tm9kZT4gc2V0TmFtZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29kZSYp
OwotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGl0ZW0odW5zaWduZWQgaW5kZXgpIGNv
bnN0OwotICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbjsgfQotCi0gICAg
Ly8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIEF0dHJpYnV0ZSogYXR0cmli
dXRlSXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXR0cnMgPyBhdHRyc1tpbmRl
eF0gOiAwOyB9Ci0gICAgQXR0cmlidXRlKiBnZXRBdHRyaWJ1dGVJdGVtKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1JlYWRPbmx5KCkgeyByZXR1
cm4gZWxlbWVudCA/IGVsZW1lbnQtPmlzUmVhZE9ubHkoKSA6IGZhbHNlOyB9Ci0KLSAgICAvLyB1
c2VkIGR1cmluZyBwYXJzaW5nOiBvbmx5IGluc2VydHMgaWYgbm90IGFscmVhZHkgdGhlcmUKLSAg
ICAvLyBubyBlcnJvciBjaGVja2luZyEKLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZShBdHRyaWJ1
dGUqIG5ld0F0dHJpYnV0ZSkgewotICAgICAgICBhc3NlcnQoIWVsZW1lbnQpOwotICAgICAgICBp
ZiAoIWdldEF0dHJpYnV0ZUl0ZW0obmV3QXR0cmlidXRlLT5uYW1lKCkpKQotICAgICAgICAgICAg
YWRkQXR0cmlidXRlKG5ld0F0dHJpYnV0ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5l
d0F0dHJpYnV0ZS0+ZGVyZWYoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNNYXBwZWRB
dHRyaWJ1dGVNYXAoKSBjb25zdDsKLQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgaWQoKSBjb25z
dCB7IHJldHVybiBtX2lkOyB9Ci0gICAgdm9pZCBzZXRJRChjb25zdCBBdG9taWNTdHJpbmcmIF9p
ZCkgeyBtX2lkID0gX2lkOyB9Ci0gICAgCi0gICAgYm9vbCBtYXBzRXF1aXZhbGVudChjb25zdCBO
YW1lZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIC8vIHRoaXMg
bWV0aG9kIGlzIGludGVybmFsLCBkb2VzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFsbAotICAgIHZv
aWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZSogbmV3QXR0cmlidXRlKTsKLSAgICAvLyB0aGlzIG1l
dGhvZCBpcyBpbnRlcm5hbCwgZG9lcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwKLSAgICB2b2lk
IHJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKTsKLSAgICB2aXJ0dWFs
IHZvaWQgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgdm9pZCBkZXRhY2hGcm9tRWxlbWVudCgpOwot
Ci0gICAgRWxlbWVudCAqZWxlbWVudDsKLSAgICBBdHRyaWJ1dGUgKiphdHRyczsKLSAgICB1bnNp
Z25lZCBsZW47Ci0gICAgQXRvbWljU3RyaW5nIG1faWQ7Ci19OwotCi0vLyBXaGVuIGFkZGluZyBu
ZXcgZW50cmllcywgbWFrZSBzdXJlIHRvIGtlZXAgZUxhc3RFbnRyeSBhdCB0aGUgZW5kIG9mIHRo
ZSBsaXN0LgotZW51bSBNYXBwZWRBdHRyaWJ1dGVFbnRyeSB7IGVOb25lLCBlVW5pdmVyc2FsLCBl
UGVyc2lzdGVudCwgZVJlcGxhY2VkLCBlQmxvY2ssIGVIUiwgZVVub3JkZXJlZExpc3QsIGVMaXN0
SXRlbSwKLSAgICBlVGFibGUsIGVDZWxsLCBlQ2FwdGlvbiwgZUJETywgZVByZSwgZUxhc3RFbnRy
eSB9OwotCi1jbGFzcyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiA6IHB1YmxpYyBDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbiB7Ci1wdWJsaWM6Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRl
RGVjbGFyYXRpb24oQ1NTUnVsZSAqcGFyZW50UnVsZSkKLSAgICA6IENTU011dGFibGVTdHlsZURl
Y2xhcmF0aW9uKHBhcmVudFJ1bGUpLCBtX2VudHJ5VHlwZShlTm9uZSksIG1fYXR0ck5hbWUoYW55
UU5hbWUoKSkKLSAgICB7fQotICAgIAotICAgIHZpcnR1YWwgfkNTU01hcHBlZEF0dHJpYnV0ZURl
Y2xhcmF0aW9uKCk7Ci0KLSAgICB2b2lkIHNldE1hcHBlZFN0YXRlKE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5IHR5cGUsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYg
dmFsKQotICAgIHsKLSAgICAgICAgbV9lbnRyeVR5cGUgPSB0eXBlOwotICAgICAgICBtX2F0dHJO
YW1lID0gbmFtZTsKLSAgICAgICAgbV9hdHRyVmFsdWUgPSB2YWw7Ci0gICAgfQotCi1wcml2YXRl
OgotICAgIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IG1fZW50cnlUeXBlOwotICAgIFF1YWxpZmllZE5h
bWUgbV9hdHRyTmFtZTsKLSAgICBBdG9taWNTdHJpbmcgbV9hdHRyVmFsdWU7Ci19OwotCi1jbGFz
cyBNYXBwZWRBdHRyaWJ1dGUgOiBwdWJsaWMgQXR0cmlidXRlCi17Ci1wdWJsaWM6Ci0gICAgTWFw
cGVkQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgdmFsdWUsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gMCkKLSAgICA6
IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSksIG1fc3R5bGVEZWNsKGRlY2wpCi0gICAgewotICAgIH0K
LQotICAgIE1hcHBlZEF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0
b21pY1N0cmluZyYgdmFsdWUsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0g
MCkKLSAgICA6IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSksIG1fc3R5bGVEZWNsKGRlY2wpCi0gICAg
ewotICAgIH0KLQotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjbG9uZShib29sIHByZXNlcnZlRGVj
bD10cnVlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3N0eWxlRGVjbC5nZXQoKTsgfQotCi0gICAgQ1NTTWFwcGVkQXR0
cmlidXRlRGVjbGFyYXRpb24qIGRlY2woKSBjb25zdCB7IHJldHVybiBtX3N0eWxlRGVjbC5nZXQo
KTsgfQotICAgIHZvaWQgc2V0RGVjbChDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVj
bCkgeyBtX3N0eWxlRGVjbCA9IGRlY2w7IH0KLQotcHJpdmF0ZToKLSAgICBSZWZQdHI8Q1NTTWFw
cGVkQXR0cmlidXRlRGVjbGFyYXRpb24+IG1fc3R5bGVEZWNsOwotfTsKLQotY2xhc3MgTmFtZWRN
YXBwZWRBdHRyTWFwIDogcHVibGljIE5hbWVkQXR0ck1hcAotewotcHVibGljOgotICAgIE5hbWVk
TWFwcGVkQXR0ck1hcChFbGVtZW50ICplKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJp
YnV0ZXMoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBj
b25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VDbGFzc0F0dHJpYnV0ZShjb25zdCBT
dHJpbmcmIGNsYXNzQXR0cik7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NM
aXN0KCkgY29uc3QgeyByZXR1cm4gJm1fY2xhc3NMaXN0OyB9Ci0gICAgCi0gICAgdmlydHVhbCBi
b29sIGhhc01hcHBlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtX21hcHBlZEF0dHJpYnV0
ZUNvdW50ID4gMDsgfQotICAgIHZvaWQgZGVjbFJlbW92ZWQoKSB7IG1fbWFwcGVkQXR0cmlidXRl
Q291bnQtLTsgfQotICAgIHZvaWQgZGVjbEFkZGVkKCkgeyBtX21hcHBlZEF0dHJpYnV0ZUNvdW50
Kys7IH0KLSAgICAKLSAgICBib29sIG1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0
ck1hcCogb3RoZXJNYXApIGNvbnN0OwotICAgIGludCBkZWNsQ291bnQoKSBjb25zdDsKLQotICAg
IE1hcHBlZEF0dHJpYnV0ZSogYXR0cmlidXRlSXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLSAg
ICB7IHJldHVybiBhdHRycyA/IHN0YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+KGF0dHJzW2lu
ZGV4XSkgOiAwOyB9Ci0gICAgCi1wcml2YXRlOgotICAgIEF0b21pY1N0cmluZ0xpc3QgbV9jbGFz
c0xpc3Q7Ci0gICAgaW50IG1fbWFwcGVkQXR0cmlidXRlQ291bnQ7Ci19OwotCi1jbGFzcyBTdHls
ZWRFbGVtZW50IDogcHVibGljIEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBTdHlsZWRFbGVtZW50
KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MpOwotICAgIHZpcnR1
YWwgflN0eWxlZEVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1N0eWxlZEVsZW1lbnQo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBOYW1lZE1hcHBlZEF0dHJNYXAqIG1hcHBl
ZEF0dHJpYnV0ZXMoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxOYW1lZE1hcHBlZEF0dHJNYXAqPihu
YW1lZEF0dHJNYXAuZ2V0KCkpOyB9Ci0gICAgY29uc3QgTmFtZWRNYXBwZWRBdHRyTWFwKiBtYXBw
ZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8TmFtZWRNYXBwZWRBdHRy
TWFwKj4obmFtZWRBdHRyTWFwLmdldCgpKTsgfQotICAgIGJvb2wgaGFzTWFwcGVkQXR0cmlidXRl
cygpIGNvbnN0IHsgcmV0dXJuIG5hbWVkQXR0ck1hcCAmJiBtYXBwZWRBdHRyaWJ1dGVzKCktPmhh
c01hcHBlZEF0dHJpYnV0ZXMoKTsgfQotICAgIGJvb2wgaXNNYXBwZWRBdHRyaWJ1dGUoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QgeyBNYXBwZWRBdHRyaWJ1dGVFbnRyeSByZXMgPSBl
Tm9uZTsgbWFwVG9FbnRyeShuYW1lLCByZXMpOyByZXR1cm4gcmVzICE9IGVOb25lOyB9Ci0KLSAg
ICB2b2lkIGFkZENTU0xlbmd0aChNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3Qg
U3RyaW5nICZ2YWx1ZSk7Ci0gICAgdm9pZCBhZGRDU1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUq
IGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSk7Ci0gICAgdm9pZCBhZGRDU1NQcm9w
ZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgaW50IHZhbHVlKTsKLSAgICB2b2lk
IGFkZENTU1N0cmluZ1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25z
dCBTdHJpbmcgJnZhbHVlLCBDU1NQcmltaXRpdmVWYWx1ZTo6VW5pdFR5cGVzID0gQ1NTUHJpbWl0
aXZlVmFsdWU6OkNTU19TVFJJTkcpOwotICAgIHZvaWQgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShNYXBw
ZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZVUkwpOwotICAgIHZvaWQg
YWRkQ1NTQ29sb3IoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAm
Yyk7Ci0gICAgdm9pZCBjcmVhdGVNYXBwZWREZWNsKE1hcHBlZEF0dHJpYnV0ZSogYXR0cik7Ci0g
ICAgCi0gICAgc3RhdGljIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBnZXRNYXBwZWRB
dHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIEF0dHJpYnV0ZSogYXR0cik7
Ci0gICAgc3RhdGljIHZvaWQgc2V0TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVF
bnRyeSB0eXBlLCBBdHRyaWJ1dGUqIGF0dHIsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9u
KiBkZWNsKTsKLSAgICBzdGF0aWMgdm9pZCByZW1vdmVNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBl
ZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBjb25z
dCBBdG9taWNTdHJpbmcmIGF0dHJWYWx1ZSk7Ci0gICAgCi0gICAgQ1NTTXV0YWJsZVN0eWxlRGVj
bGFyYXRpb24qIGlubGluZVN0eWxlRGVjbCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lU3R5bGVE
ZWNsLmdldCgpOyB9Ci0gICAgdmlydHVhbCBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogYWRk
aXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpOwotICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0
aW9uKiBnZXRJbmxpbmVTdHlsZURlY2woKTsKLSAgICBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHls
ZSgpOwotICAgIHZvaWQgY3JlYXRlSW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgdm9pZCBkZXN0cm95
SW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgdm9pZCBpbnZhbGlkYXRlU3R5bGVBdHRyaWJ1dGUoKTsK
LSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0Owot
ICAgIAotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGF0dHJpYnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRy
LCBib29sIHByZXNlcnZlRGVjbHMgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSogYXR0cik7Ci0gICAgdmlydHVhbCBib29sIG1h
cFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBdHRyaWJ1dGVNYXAo
KSBjb25zdDsKLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSogY3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1
YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlKTsKLQotcHJvdGVjdGVkOgotICAg
IFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbj4gbV9pbmxpbmVTdHlsZURlY2w7Ci0g
ICAgbXV0YWJsZSBib29sIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkIDogMTsKLSAgICBtdXRhYmxl
IGJvb2wgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUgOiAxOwotfTsKLQogfSAvL25hbWVz
cGFjZQogCi0jdW5kZWYgaWQKLQogI2VuZGlmCkluZGV4OiBkb20vZG9tX2VsZW1lbnRpbXBsLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gZG9tL2RvbV9lbGVtZW50aW1wbC5oCShyZXZpc2lvbiAxMzQ3NykKKysr
IGRvbS9kb21fZWxlbWVudGltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMSw0NjAgKzAsMCBAQAot
LyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBET00gaW1wbGVtZW50YXRpb24gZm9yIEtE
RS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykK
LSAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykK
LSAqICAgICAgICAgICAoQykgMjAwMSBQZXRlciBLZWxseSAocG1rQHBvc3QuY29tKQotICogICAg
ICAgICAgIChDKSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJp
Z2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCi0gKgot
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3Vp
dGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICovCi0KLSNpZm5k
ZWYgRE9NX0VMRU1FTlRJTVBMX0gKLSNkZWZpbmUgRE9NX0VMRU1FTlRJTVBMX0gKLQotI2luY2x1
ZGUgIkF0b21pY1N0cmluZ0xpc3QuaCIKLSNpbmNsdWRlICJDb250YWluZXJOb2RlLmgiCi0jaW5j
bHVkZSAiTmFtZWROb2RlTWFwLmgiCi0jaW5jbHVkZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1
ZGUgIlN0cmluZ0ltcGwuaCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCi0KLSNpZiBfX09C
SkNfXwotI2RlZmluZSBpZCBpZF9BVk9JRF9LRVlXT1JECi0jZW5kaWYKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotCi1jbGFzcyBBdHRyOwotY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWNsYXNz
IENTU1N0eWxlU2VsZWN0b3I7Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgTmFtZWRBdHRyTWFwOwot
Ci0vLyB0aGlzIGhhcyBubyBjb3VudGVycGFydCBpbiBET00sIHB1cmVseSBpbnRlcm5hbAotLy8g
cmVwcmVzZW50YXRpb24gb2YgdGhlIG5vZGV2YWx1ZSBvZiBhbiBBdHRyLgotLy8gdGhlIGFjdHVh
bCBBdHRyIChBdHRyKSB3aXRoIGl0cyB2YWx1ZSBhcyB0ZXh0Y2hpbGQKLS8vIGlzIG9ubHkgYWxs
b2NhdGVkIG9uIGRlbWFuZCBieSB0aGUgRE9NIGJpbmRpbmdzLgotLy8gQW55IHVzZSBvZiBBdHRy
IGluc2lkZSBraHRtbCBzaG91bGQgYmUgYXZvaWRlZC4KLWNsYXNzIEF0dHJpYnV0ZSA6IHB1Ymxp
YyBTaGFyZWQ8QXR0cmlidXRlPiB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsKLSAg
ICBmcmllbmQgY2xhc3MgRWxlbWVudDsKLSAgICBmcmllbmQgY2xhc3MgQXR0cjsKLQotcHVibGlj
OgotICAgIC8vIG51bGwgdmFsdWUgaXMgZm9yYmlkZGVuICEKLSAgICBBdHRyaWJ1dGUoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkKLSAgICAgICAg
OiBtX25hbWUobmFtZSksIG1fdmFsdWUodmFsdWUpLCBtX2ltcGwoMCkKLSAgICB7fQotICAgIAot
ICAgIEF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgdmFsdWUpCi0gICAgICAgIDogbV9uYW1lKG51bGxBdG9tLCBuYW1lLCBudWxsQXRvbSksIG1f
dmFsdWUodmFsdWUpLCBtX2ltcGwoMCkKLSAgICB7fQotCi0gICAgdmlydHVhbCB+QXR0cmlidXRl
KCkgeyB9Ci0gICAgCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fdmFsdWU7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0IHsg
cmV0dXJuIG1fbmFtZS5wcmVmaXgoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxO
YW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lLmxvY2FsTmFtZSgpOyB9Ci0gICAgY29uc3QgQXRv
bWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX25hbWUubmFtZXNwYWNl
VVJJKCk7IH0KLSAgICAKLSAgICBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9uYW1lOyB9Ci0gICAgCi0gICAgQXR0ciogYXR0cigpIGNvbnN0IHsgcmV0dXJuIG1f
aW1wbDsgfQotICAgIFBhc3NSZWZQdHI8QXR0cj4gY3JlYXRlQXR0cklmTmVlZGVkKEVsZW1lbnQq
IGUpOwotCi0gICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlLmlzTnVsbCgp
OyB9Ci0gICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZS5pc0VtcHR5KCk7
IH0KLSAgICAKLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSogY2xvbmUoYm9vbCBwcmVzZXJ2ZURlY2w9
dHJ1ZSkgY29uc3Q7Ci0KLSAgICAvLyBBbiBleHRlbnNpb24gdG8gZ2V0IHRoZSBzdHlsZSBpbmZv
cm1hdGlvbiBmb3IgcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcy4KLSAgICB2aXJ0dWFsIENTU1N0
eWxlRGVjbGFyYXRpb24qIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIAotcHJpdmF0
ZToKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpIHsgbV92YWx1
ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nJiBwcmVm
aXgpIHsgbV9uYW1lLnNldFByZWZpeChwcmVmaXgpOyB9Ci0KLSAgICBRdWFsaWZpZWROYW1lIG1f
bmFtZTsKLSAgICBBdG9taWNTdHJpbmcgbV92YWx1ZTsKLSAgICBBdHRyKiBtX2ltcGw7Ci19Owot
Ci0vLyBBdHRyIGNhbiBoYXZlIFRleHQgYW5kIEVudGl0eVJlZmVyZW5jZSBjaGlsZHJlbgotLy8g
dGhlcmVmb3JlIGl0IGhhcyB0byBiZSBhIGZ1bGxibG93biBOb2RlLiBUaGUgcGxhbgotLy8gaXMg
dG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgYSB0ZXh0Y2hpbGQgYW5kIHN0b3JlIHRoZQotLy8gcmVz
dWx0aW5nIG5vZGV2YWx1ZSBpbiB0aGUgQXR0cmlidXRlIHVwb24KLS8vIGRlc3RydWN0aW9uLiBo
b3dldmVyLCB0aGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi1jbGFzcyBBdHRyIDogcHVibGlj
IENvbnRhaW5lck5vZGUgewotICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0KLXB1Ymxp
YzoKLSAgICBBdHRyKEVsZW1lbnQqLCBEb2N1bWVudCosIEF0dHJpYnV0ZSopOwotICAgIH5BdHRy
KCk7Ci0KLSAgICAvLyBDYWxsIHRoaXMgYWZ0ZXIgY2FsbGluZyB0aGUgY29uc3RydWN0b3Igc28g
dGhlCi0gICAgLy8gQXR0ciBub2RlIGlzbid0IGZsb2F0aW5nIHdoZW4gd2UgYXBwZW5kIHRoZSB0
ZXh0IG5vZGUuCi0gICAgdm9pZCBjcmVhdGVUZXh0Q2hpbGQoKTsKLSAgICAKLSAgICAvLyBET00g
bWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIEF0dHIKLSAgICBTdHJpbmcgbmFtZSgpIGNvbnN0IHsg
cmV0dXJuIHF1YWxpZmllZE5hbWUoKS50b1N0cmluZygpOyB9Ci0gICAgYm9vbCBzcGVjaWZpZWQo
KSBjb25zdCB7IHJldHVybiBtX3NwZWNpZmllZDsgfQotICAgIEVsZW1lbnQqIG93bmVyRWxlbWVu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotCi0gICAgU3RyaW5nIHZhbHVlKCkgY29u
c3QgeyByZXR1cm4gbV9hdHRyaWJ1dGUtPnZhbHVlKCk7IH0KLSAgICB2b2lkIHNldFZhbHVlKGNv
bnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJy
aWRkZW4gZnJvbSBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVOYW1lKCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlVHlwZSBub2RlVHlwZSgpIGNvbnN0OwotICAgIHZpcnR1
YWwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNv
bnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25z
dCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVm
aXgoY29uc3QgQXRvbWljU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVhbCBT
dHJpbmcgbm9kZVZhbHVlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldE5vZGVWYWx1ZShj
b25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5v
ZGU+IGNsb25lTm9kZShib29sIGRlZXApOwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBh
cnQgb2YgRE9NKQotICAgIHZpcnR1YWwgYm9vbCBpc0F0dHJpYnV0ZU5vZGUoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUp
OwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgU3Ry
aW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICBBdHRyaWJ1dGUqIGF0dHIoKSBjb25zdCB7IHJl
dHVybiBtX2F0dHJpYnV0ZS5nZXQoKTsgfQotICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIHF1YWxp
ZmllZE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2F0dHJpYnV0ZS0+bmFtZSgpOyB9Ci0KLSAgICAv
LyBBbiBleHRlbnNpb24gdG8gZ2V0IHByZXNlbnRhdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhdHRy
aWJ1dGVzLgotICAgIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKCkgeyByZXR1cm4gbV9hdHRy
aWJ1dGUtPnN0eWxlKCk7IH0KLQotcHJpdmF0ZToKLSAgICBFbGVtZW50KiBtX2VsZW1lbnQ7Ci0g
ICAgUmVmUHRyPEF0dHJpYnV0ZT4gbV9hdHRyaWJ1dGU7Ci0gICAgaW50IG1faWdub3JlQ2hpbGRy
ZW5DaGFuZ2VkOwotfTsKLQotY2xhc3MgRWxlbWVudCA6IHB1YmxpYyBDb250YWluZXJOb2RlIHsK
LSAgICBmcmllbmQgY2xhc3MgRG9jdW1lbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1h
cDsKLSAgICBmcmllbmQgY2xhc3MgQXR0cjsKLSAgICBmcmllbmQgY2xhc3MgTm9kZTsKLSAgICBm
cmllbmQgY2xhc3MgQ1NTU3R5bGVTZWxlY3RvcjsKLXB1YmxpYzoKLSAgICBFbGVtZW50KGNvbnN0
IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MpOwotICAgIH5FbGVtZW50KCk7
Ci0KLSAgICAvLyBVc2VkIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFuIGVs
ZW1lbnQgaGFzIGEgZ2l2ZW4gQ1NTIGNsYXNzLgotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3Ry
aW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBn
ZXRJREF0dHJpYnV0ZSgpIGNvbnN0OwotICAgIGJvb2wgaGFzQXR0cmlidXRlKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIHZvaWQgc2V0QXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlLCBFeGNlcHRp
b25Db2RlJik7Ci0gICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYg
bmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgYm9vbCBoYXNBdHRyaWJ1dGVzKCkgY29uc3Q7
Ci0KLSAgICBib29sIGhhc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0OwotICAg
IGJvb2wgaGFzQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0
cmluZyYgbG9jYWxOYW1lKSBjb25zdDsKLQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0
cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5n
JiBnZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5n
JiBsb2NhbE5hbWUpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRBdHRyaWJ1dGUoY29uc3QgU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBz
ZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBx
dWFsaWZpZWROYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAg
ICB2b2lkIHNjcm9sbEludG9WaWV3IChib29sIGFsaWduVG9Ub3ApOwotICAgIHZvaWQgc2Nyb2xs
SW50b1ZpZXdJZk5lZWRlZChib29sIGNlbnRlcklmTmVlZGVkKTsKLQotICAgIHZvaWQgcmVtb3Zl
QXR0cmlidXRlKGNvbnN0IFN0cmluZyAmbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpOwotICAgIHZv
aWQgcmVtb3ZlQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0IFN0
cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBQYXNzUmVmUHRyPEF0dHI+
IGdldEF0dHJpYnV0ZU5vZGUoY29uc3QgU3RyaW5nJiBuYW1lKTsKLSAgICBQYXNzUmVmUHRyPEF0
dHI+IGdldEF0dHJpYnV0ZU5vZGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3Qg
U3RyaW5nJiBsb2NhbE5hbWUpOwotICAgIFBhc3NSZWZQdHI8QXR0cj4gc2V0QXR0cmlidXRlTm9k
ZShBdHRyKiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIFBhc3NSZWZQdHI8QXR0cj4gc2V0QXR0cmli
dXRlTm9kZU5TKEF0dHIqIG5ld0F0dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKSB7IHJldHVybiBzZXRB
dHRyaWJ1dGVOb2RlKG5ld0F0dHIsIGVjKTsgfQotICAgIFBhc3NSZWZQdHI8QXR0cj4gcmVtb3Zl
QXR0cmlidXRlTm9kZShBdHRyKiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIAotICAgIHZpcnR1YWwg
Q1NTU3R5bGVEZWNsYXJhdGlvbiAqc3R5bGUoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgUXVhbGlm
aWVkTmFtZSYgdGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZTsgfQotICAgIHZpcnR1
YWwgYm9vbCBoYXNUYWdOYW1lKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUpIGNvbnN0IHsg
cmV0dXJuIG1fdGFnTmFtZS5tYXRjaGVzKHRhZ05hbWUpOyB9Ci0gICAgCi0gICAgLy8gQSBmYXN0
IGZ1bmN0aW9uIGZvciBjaGVja2luZyB0aGUgbG9jYWwgbmFtZSBhZ2FpbnN0IGFub3RoZXIgYXRv
bWljIHN0cmluZy4KLSAgICBib29sIGhhc0xvY2FsTmFtZShjb25zdCBBdG9taWNTdHJpbmcmIG90
aGVyKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubG9jYWxOYW1lKCkgPT0gb3RoZXI7IH0KLSAg
ICBib29sIGhhc0xvY2FsTmFtZShjb25zdCBRdWFsaWZpZWROYW1lJiBvdGhlcikgY29uc3QgeyBy
ZXR1cm4gbV90YWdOYW1lLmxvY2FsTmFtZSgpID09IG90aGVyLmxvY2FsTmFtZSgpOyB9Ci0KLSAg
ICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKCkgY29uc3QgeyByZXR1cm4g
bV90YWdOYW1lLmxvY2FsTmFtZSgpOyB9Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcm
IHByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5wcmVmaXgoKTsgfQotICAgIHZpcnR1
YWwgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBFeGNlcHRpb25D
b2RlJik7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSgpIGNv
bnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5uYW1lc3BhY2VVUkkoKTsgfQotICAgIAotICAgIC8vIERP
TSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFsIE5v
ZGVUeXBlIG5vZGVUeXBlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGNs
b25lTm9kZShib29sIGRlZXApOwotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVOYW1lKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBib29sIGlzRWxlbWVudE5vZGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
Ci0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2
b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAgIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMg
d2hpY2ggaWdub3JlIGV4Y2VwdGlvbnMKLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBRdWFs
aWZpZWROYW1lJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKLQotICAgIHZpcnR1YWwgTmFt
ZWRBdHRyTWFwICphdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gICAgTmFtZWRBdHRyTWFwKiBhdHRyaWJ1
dGVzKGJvb2wgcmVhZG9ubHkpIGNvbnN0OwotCi0gICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVk
IHdoZW5ldmVyIGFuIGF0dHJpYnV0ZSBpcyBhZGRlZCwgY2hhbmdlZCBvciByZW1vdmVkLgotICAg
IHZpcnR1YWwgdm9pZCBhdHRyaWJ1dGVDaGFuZ2VkKEF0dHJpYnV0ZSogYXR0ciwgYm9vbCBwcmVz
ZXJ2ZURlY2xzID0gZmFsc2UpIHt9Ci0KLSAgICAvLyBub3QgcGFydCBvZiB0aGUgRE9NCi0gICAg
dm9pZCBzZXRBdHRyaWJ1dGVNYXAoTmFtZWRBdHRyTWFwKik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudCAqc291cmNlKSB7fQotICAg
IAotICAgIC8vIFN0YXRlIG9mIHRoZSBlbGVtZW50LgotICAgIHZpcnR1YWwgRGVwcmVjYXRlZFN0
cmluZyBzdGF0ZSgpIHsgcmV0dXJuIERlcHJlY2F0ZWRTdHJpbmc6Om51bGw7IH0KLQotICAgIHZp
cnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIFJlbmRlclN0eWxlICpjcmVhdGVTdHls
ZUZvclJlbmRlcmVyKFJlbmRlck9iamVjdCAqcGFyZW50KTsKLSAgICB2aXJ0dWFsIFJlbmRlck9i
amVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwgUmVuZGVyU3R5bGUgKik7Ci0gICAg
dmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSA9IE5vQ2hhbmdlICk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgY2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSk7Ci0gCi0gICAgdmlydHVh
bCBBdHRyaWJ1dGUqIGNyZWF0ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBT
dHJpbmdJbXBsKiB2YWx1ZSk7Ci0gICAgCi0gICAgdm9pZCBkaXNwYXRjaEF0dHJSZW1vdmFsRXZl
bnQoQXR0cmlidXRlICphdHRyKTsKLSAgICB2b2lkIGRpc3BhdGNoQXR0ckFkZGl0aW9uRXZlbnQo
QXR0cmlidXRlICphdHRyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24oYm9v
bCBzZW5kVG9BbnlFdmVudCkgeyB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyB0b1N0cmluZygpIGNv
bnN0OwotCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cikg
Y29uc3Q7Ci0gICAgICAgIAotICAgIHZpcnR1YWwgdm9pZCBmb2N1cygpOwotICAgIHZvaWQgYmx1
cigpOwotICAgIAotI2lmICFOREVCVUcKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVh
bSAqc3RyZWFtLCBEZXByZWNhdGVkU3RyaW5nIGluZCA9ICIiKSBjb25zdDsKLSAgICB2aXJ0dWFs
IHZvaWQgZm9ybWF0Rm9yRGVidWdnZXIoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsZW5ndGgpIGNv
bnN0OwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQXR0cmli
dXRlTWFwKCkgY29uc3Q7Ci0gICAgU3RyaW5nIG9wZW5UYWdTdGFydFRvU3RyaW5nKCkgY29uc3Q7
Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCB1cGRhdGVJZChjb25zdCBBdG9taWNTdHJpbmcmIG9sZElk
LCBjb25zdCBBdG9taWNTdHJpbmcmIG5ld0lkKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVT
dHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCkgY29uc3Qge30KLQotcHJvdGVjdGVkOiAvLyBtZW1iZXIg
dmFyaWFibGVzCi0gICAgbXV0YWJsZSBSZWZQdHI8TmFtZWRBdHRyTWFwPiBuYW1lZEF0dHJNYXA7
Ci0gICAgUXVhbGlmaWVkTmFtZSBtX3RhZ05hbWU7Ci19OwotCi0vLyB0aGUgbWFwIG9mIGF0dHJp
YnV0ZXMgb2YgYW4gZWxlbWVudAotY2xhc3MgTmFtZWRBdHRyTWFwIDogcHVibGljIE5hbWVkTm9k
ZU1hcCB7Ci0gICAgZnJpZW5kIGNsYXNzIEVsZW1lbnQ7Ci1wdWJsaWM6Ci0gICAgTmFtZWRBdHRy
TWFwKEVsZW1lbnQgKmUpOwotICAgIHZpcnR1YWwgfk5hbWVkQXR0ck1hcCgpOwotICAgIE5hbWVk
QXR0ck1hcChjb25zdCBOYW1lZEF0dHJNYXAmKTsKLSAgICBOYW1lZEF0dHJNYXAgJm9wZXJhdG9y
ID0oY29uc3QgTmFtZWRBdHRyTWFwICZvdGhlcik7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0
dHJpYnV0ZXMgZm9yIE5hbWVkTm9kZU1hcAotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+
IGdldE5hbWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFz
c1JlZlB0cjxOb2RlPiByZW1vdmVOYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1lLCBFeGNlcHRp
b25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVtTlMo
Y29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25z
dDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVtTlMoY29uc3Qg
U3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25D
b2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVtKGNvbnN0
IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2Rl
PiByZW1vdmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29k
ZSYpOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBzZXROYW1lZEl0ZW0oTm9kZSogYXJn
LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gaXRlbSh1
bnNpZ25lZCBpbmRleCkgY29uc3Q7Ci0gICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1
cm4gbGVuOyB9Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAg
QXR0cmlidXRlKiBhdHRyaWJ1dGVJdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBh
dHRycyA/IGF0dHJzW2luZGV4XSA6IDA7IH0KLSAgICBBdHRyaWJ1dGUqIGdldEF0dHJpYnV0ZUl0
ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlz
UmVhZE9ubHkoKSB7IHJldHVybiBlbGVtZW50ID8gZWxlbWVudC0+aXNSZWFkT25seSgpIDogZmFs
c2U7IH0KLQotICAgIC8vIHVzZWQgZHVyaW5nIHBhcnNpbmc6IG9ubHkgaW5zZXJ0cyBpZiBub3Qg
YWxyZWFkeSB0aGVyZQotICAgIC8vIG5vIGVycm9yIGNoZWNraW5nIQotICAgIHZvaWQgaW5zZXJ0
QXR0cmlidXRlKEF0dHJpYnV0ZSogbmV3QXR0cmlidXRlKSB7Ci0gICAgICAgIGFzc2VydCghZWxl
bWVudCk7Ci0gICAgICAgIGlmICghZ2V0QXR0cmlidXRlSXRlbShuZXdBdHRyaWJ1dGUtPm5hbWUo
KSkpCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUobmV3QXR0cmlidXRlKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgbmV3QXR0cmlidXRlLT5kZXJlZigpOwotICAgIH0KLQotICAgIHZpcnR1
YWwgYm9vbCBpc01hcHBlZEF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotCi0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBpZCgpIGNvbnN0IHsgcmV0dXJuIG1faWQ7IH0KLSAgICB2b2lkIHNldElEKGNvbnN0
IEF0b21pY1N0cmluZyYgX2lkKSB7IG1faWQgPSBfaWQ7IH0KLSAgICAKLSAgICBib29sIG1hcHNF
cXVpdmFsZW50KGNvbnN0IE5hbWVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0OwotCi1wcm90ZWN0
ZWQ6Ci0gICAgLy8gdGhpcyBtZXRob2QgaXMgaW50ZXJuYWwsIGRvZXMgbm8gZXJyb3IgY2hlY2tp
bmcgYXQgYWxsCi0gICAgdm9pZCBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlKiBuZXdBdHRyaWJ1dGUp
OwotICAgIC8vIHRoaXMgbWV0aG9kIGlzIGludGVybmFsLCBkb2VzIG5vIGVycm9yIGNoZWNraW5n
IGF0IGFsbAotICAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5h
bWUpOwotICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICB2b2lkIGRldGFj
aEZyb21FbGVtZW50KCk7Ci0KLSAgICBFbGVtZW50ICplbGVtZW50OwotICAgIEF0dHJpYnV0ZSAq
KmF0dHJzOwotICAgIHVuc2lnbmVkIGxlbjsKLSAgICBBdG9taWNTdHJpbmcgbV9pZDsKLX07Ci0K
LS8vIFdoZW4gYWRkaW5nIG5ldyBlbnRyaWVzLCBtYWtlIHN1cmUgdG8ga2VlcCBlTGFzdEVudHJ5
IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCi1lbnVtIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHsgZU5v
bmUsIGVVbml2ZXJzYWwsIGVQZXJzaXN0ZW50LCBlUmVwbGFjZWQsIGVCbG9jaywgZUhSLCBlVW5v
cmRlcmVkTGlzdCwgZUxpc3RJdGVtLAotICAgIGVUYWJsZSwgZUNlbGwsIGVDYXB0aW9uLCBlQkRP
LCBlUHJlLCBlTGFzdEVudHJ5IH07Ci0KLWNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0
aW9uIDogcHVibGljIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uIHsKLXB1YmxpYzoKLSAgICBD
U1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihDU1NSdWxlICpwYXJlbnRSdWxlKQotICAgIDog
Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24ocGFyZW50UnVsZSksIG1fZW50cnlUeXBlKGVOb25l
KSwgbV9hdHRyTmFtZShhbnlRTmFtZSgpKQotICAgIHt9Ci0gICAgCi0gICAgdmlydHVhbCB+Q1NT
TWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgIHZvaWQgc2V0TWFwcGVkU3RhdGUo
TWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29u
c3QgQXRvbWljU3RyaW5nJiB2YWwpCi0gICAgewotICAgICAgICBtX2VudHJ5VHlwZSA9IHR5cGU7
Ci0gICAgICAgIG1fYXR0ck5hbWUgPSBuYW1lOwotICAgICAgICBtX2F0dHJWYWx1ZSA9IHZhbDsK
LSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgTWFwcGVkQXR0cmlidXRlRW50cnkgbV9lbnRyeVR5cGU7
Ci0gICAgUXVhbGlmaWVkTmFtZSBtX2F0dHJOYW1lOwotICAgIEF0b21pY1N0cmluZyBtX2F0dHJW
YWx1ZTsKLX07Ci0KLWNsYXNzIE1hcHBlZEF0dHJpYnV0ZSA6IHB1YmxpYyBBdHRyaWJ1dGUKLXsK
LXB1YmxpYzoKLSAgICBNYXBwZWRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwg
Y29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSwgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24q
IGRlY2wgPSAwKQotICAgIDogQXR0cmlidXRlKG5hbWUsIHZhbHVlKSwgbV9zdHlsZURlY2woZGVj
bCkKLSAgICB7Ci0gICAgfQotCi0gICAgTWFwcGVkQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSwgQ1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb24qIGRlY2wgPSAwKQotICAgIDogQXR0cmlidXRlKG5hbWUsIHZhbHVlKSwgbV9zdHls
ZURlY2woZGVjbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBBdHRyaWJ1dGUqIGNsb25l
KGJvb2wgcHJlc2VydmVEZWNsPXRydWUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBDU1NTdHlsZURl
Y2xhcmF0aW9uKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVEZWNsLmdldCgpOyB9Ci0K
LSAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCgpIGNvbnN0IHsgcmV0dXJu
IG1fc3R5bGVEZWNsLmdldCgpOyB9Ci0gICAgdm9pZCBzZXREZWNsKENTU01hcHBlZEF0dHJpYnV0
ZURlY2xhcmF0aW9uKiBkZWNsKSB7IG1fc3R5bGVEZWNsID0gZGVjbDsgfQotCi1wcml2YXRlOgot
ICAgIFJlZlB0cjxDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbj4gbV9zdHlsZURlY2w7Ci19
OwotCi1jbGFzcyBOYW1lZE1hcHBlZEF0dHJNYXAgOiBwdWJsaWMgTmFtZWRBdHRyTWFwCi17Ci1w
dWJsaWM6Ci0gICAgTmFtZWRNYXBwZWRBdHRyTWFwKEVsZW1lbnQgKmUpOwotCi0gICAgdmlydHVh
bCB2b2lkIGNsZWFyQXR0cmlidXRlcygpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc01hcHBl
ZEF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBwYXJzZUNsYXNz
QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgY2xhc3NBdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJp
bmdMaXN0KiBnZXRDbGFzc0xpc3QoKSBjb25zdCB7IHJldHVybiAmbV9jbGFzc0xpc3Q7IH0KLSAg
ICAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzTWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJu
IG1fbWFwcGVkQXR0cmlidXRlQ291bnQgPiAwOyB9Ci0gICAgdm9pZCBkZWNsUmVtb3ZlZCgpIHsg
bV9tYXBwZWRBdHRyaWJ1dGVDb3VudC0tOyB9Ci0gICAgdm9pZCBkZWNsQWRkZWQoKSB7IG1fbWFw
cGVkQXR0cmlidXRlQ291bnQrKzsgfQotICAgIAotICAgIGJvb2wgbWFwc0VxdWl2YWxlbnQoY29u
c3QgTmFtZWRNYXBwZWRBdHRyTWFwKiBvdGhlck1hcCkgY29uc3Q7Ci0gICAgaW50IGRlY2xDb3Vu
dCgpIGNvbnN0OwotCi0gICAgTWFwcGVkQXR0cmlidXRlKiBhdHRyaWJ1dGVJdGVtKHVuc2lnbmVk
IGluZGV4KSBjb25zdAotICAgIHsgcmV0dXJuIGF0dHJzID8gc3RhdGljX2Nhc3Q8TWFwcGVkQXR0
cmlidXRlKj4oYXR0cnNbaW5kZXhdKSA6IDA7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgQXRvbWlj
U3RyaW5nTGlzdCBtX2NsYXNzTGlzdDsKLSAgICBpbnQgbV9tYXBwZWRBdHRyaWJ1dGVDb3VudDsK
LX07Ci0KLWNsYXNzIFN0eWxlZEVsZW1lbnQgOiBwdWJsaWMgRWxlbWVudAotewotcHVibGljOgot
ICAgIFN0eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQg
KmRvYyk7Ci0gICAgdmlydHVhbCB+U3R5bGVkRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBib29s
IGlzU3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIE5hbWVkTWFw
cGVkQXR0ck1hcCogbWFwcGVkQXR0cmlidXRlcygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE5hbWVk
TWFwcGVkQXR0ck1hcCo+KG5hbWVkQXR0ck1hcC5nZXQoKSk7IH0KLSAgICBjb25zdCBOYW1lZE1h
cHBlZEF0dHJNYXAqIG1hcHBlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2Fz
dDxOYW1lZE1hcHBlZEF0dHJNYXAqPihuYW1lZEF0dHJNYXAuZ2V0KCkpOyB9Ci0gICAgYm9vbCBo
YXNNYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbmFtZWRBdHRyTWFwICYmIG1hcHBl
ZEF0dHJpYnV0ZXMoKS0+aGFzTWFwcGVkQXR0cmlidXRlcygpOyB9Ci0gICAgYm9vbCBpc01hcHBl
ZEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdCB7IE1hcHBlZEF0dHJp
YnV0ZUVudHJ5IHJlcyA9IGVOb25lOyBtYXBUb0VudHJ5KG5hbWUsIHJlcyk7IHJldHVybiByZXMg
IT0gZU5vbmU7IH0KLQotICAgIHZvaWQgYWRkQ1NTTGVuZ3RoKE1hcHBlZEF0dHJpYnV0ZSogYXR0
ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKTsKLSAgICB2b2lkIGFkZENTU1Byb3BlcnR5
KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKTsKLSAg
ICB2b2lkIGFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBpbnQg
dmFsdWUpOwotICAgIHZvaWQgYWRkQ1NTU3RyaW5nUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBh
dHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUsIENTU1ByaW1pdGl2ZVZhbHVlOjpVbml0
VHlwZXMgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1NUUklORyk7Ci0gICAgdm9pZCBhZGRDU1NJ
bWFnZVByb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcg
JlVSTCk7Ci0gICAgdm9pZCBhZGRDU1NDb2xvcihNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBp
ZCwgY29uc3QgU3RyaW5nICZjKTsKLSAgICB2b2lkIGNyZWF0ZU1hcHBlZERlY2woTWFwcGVkQXR0
cmlidXRlKiBhdHRyKTsKLSAgICAKLSAgICBzdGF0aWMgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFy
YXRpb24qIGdldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwg
QXR0cmlidXRlKiBhdHRyKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNs
KE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIEF0dHJpYnV0ZSogYXR0ciwgQ1NTTWFwcGVkQXR0
cmlidXRlRGVjbGFyYXRpb24qIGRlY2wpOwotICAgIHN0YXRpYyB2b2lkIHJlbW92ZU1hcHBlZEF0
dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgY29uc3QgUXVhbGlmaWVkTmFt
ZSYgYXR0ck5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0clZhbHVlKTsKLSAgICAKLSAgICBD
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogaW5saW5lU3R5bGVEZWNsKCkgY29uc3QgeyByZXR1
cm4gbV9pbmxpbmVTdHlsZURlY2wuZ2V0KCk7IH0KLSAgICB2aXJ0dWFsIENTU011dGFibGVTdHls
ZURlY2xhcmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCk7Ci0gICAgQ1NTTXV0
YWJsZVN0eWxlRGVjbGFyYXRpb24qIGdldElubGluZVN0eWxlRGVjbCgpOwotICAgIENTU1N0eWxl
RGVjbGFyYXRpb24qIHN0eWxlKCk7Ci0gICAgdm9pZCBjcmVhdGVJbmxpbmVTdHlsZURlY2woKTsK
LSAgICB2b2lkIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLSAgICB2b2lkIGludmFsaWRhdGVT
dHlsZUF0dHJpYnV0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlm
TmVlZGVkKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmdMaXN0
KiBnZXRDbGFzc0xpc3QoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0cmlidXRlQ2hhbmdl
ZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZhbHNlKTsKLSAgICB2aXJ0
dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKiBhdHRyKTsKLSAg
ICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGNy
ZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjcmVhdGVB
dHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpOwot
Ci1wcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtX2lu
bGluZVN0eWxlRGVjbDsKLSAgICBtdXRhYmxlIGJvb2wgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQg
OiAxOwotICAgIG11dGFibGUgYm9vbCBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA6IDE7
Ci19OwotCi19IC8vbmFtZXNwYWNlCi0KLSN1bmRlZiBpZAotCi0jZW5kaWYKSW5kZXg6IGRvbS9E
b2N1bWVudFR5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9Eb2N1bWVudFR5cGUuY3BwCShyZXZp
c2lvbiAxMzQ3NykKKysrIGRvbS9Eb2N1bWVudFR5cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Nyw2ICsyNyw3IEBACiAKICNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbi5oIgogI2luY2x1ZGUg
IkRvY3VtZW50LmgiCisjaW5jbHVkZSAiTmFtZWROb2RlTWFwLmgiCiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIApJbmRleDogZG9tL0V2ZW50TmFtZXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9FdmVu
dE5hbWVzLmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBkb20vRXZlbnROYW1lcy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI5LDkgKzI5LDYgQEAKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5j
bHVkZSAiU3RhdGljQ29uc3RydWN0b3JzLmgiCiAKLXVzaW5nIFdlYkNvcmU6OkF0b21pY1N0cmlu
ZzsKLXVzaW5nIFdlYkNvcmU6Om51bGxBdG9tOwotCiBuYW1lc3BhY2UgV2ViQ29yZSB7IG5hbWVz
cGFjZSBFdmVudE5hbWVzIHsKIAogI2RlZmluZSBERUZJTkVfRVZFTlRfR0xPQkFMKG5hbWUpIFwK
SW5kZXg6IGRvbS9OYW1lZE1hcHBlZEF0dHJNYXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vTmFtZWRN
YXBwZWRBdHRyTWFwLmgJKHJldmlzaW9uIDEzNDc3KQorKysgZG9tL05hbWVkTWFwcGVkQXR0ck1h
cC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNCwzNjEgKzI0LDE1IEBACiAgKgogICovCiAKLSNpZm5k
ZWYgRE9NX0VMRU1FTlRJTVBMX0gKLSNkZWZpbmUgRE9NX0VMRU1FTlRJTVBMX0gKKyNpZm5kZWYg
TmFtZWRNYXBwZWRBdHRyTWFwX2gKKyNkZWZpbmUgTmFtZWRNYXBwZWRBdHRyTWFwX2gKIAorI2lu
Y2x1ZGUgIk5hbWVkQXR0ck1hcC5oIgogI2luY2x1ZGUgIkF0b21pY1N0cmluZ0xpc3QuaCIKLSNp
bmNsdWRlICJDb250YWluZXJOb2RlLmgiCi0jaW5jbHVkZSAiTmFtZWROb2RlTWFwLmgiCi0jaW5j
bHVkZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKLSNpbmNsdWRl
ICJjc3NfdmFsdWVpbXBsLmgiCi0KLSNpZiBfX09CSkNfXwotI2RlZmluZSBpZCBpZF9BVk9JRF9L
RVlXT1JECi0jZW5kaWYKKyNpbmNsdWRlICJNYXBwZWRBdHRyaWJ1dGUuaCIKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCi1jbGFzcyBBdHRyOwotY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWNs
YXNzIENTU1N0eWxlU2VsZWN0b3I7Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgTmFtZWRBdHRyTWFw
OwotCi0vLyB0aGlzIGhhcyBubyBjb3VudGVycGFydCBpbiBET00sIHB1cmVseSBpbnRlcm5hbAot
Ly8gcmVwcmVzZW50YXRpb24gb2YgdGhlIG5vZGV2YWx1ZSBvZiBhbiBBdHRyLgotLy8gdGhlIGFj
dHVhbCBBdHRyIChBdHRyKSB3aXRoIGl0cyB2YWx1ZSBhcyB0ZXh0Y2hpbGQKLS8vIGlzIG9ubHkg
YWxsb2NhdGVkIG9uIGRlbWFuZCBieSB0aGUgRE9NIGJpbmRpbmdzLgotLy8gQW55IHVzZSBvZiBB
dHRyIGluc2lkZSBraHRtbCBzaG91bGQgYmUgYXZvaWRlZC4KLWNsYXNzIEF0dHJpYnV0ZSA6IHB1
YmxpYyBTaGFyZWQ8QXR0cmlidXRlPiB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsK
LSAgICBmcmllbmQgY2xhc3MgRWxlbWVudDsKLSAgICBmcmllbmQgY2xhc3MgQXR0cjsKLQotcHVi
bGljOgotICAgIC8vIG51bGwgdmFsdWUgaXMgZm9yYmlkZGVuICEKLSAgICBBdHRyaWJ1dGUoY29u
c3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkKLSAgICAg
ICAgOiBtX25hbWUobmFtZSksIG1fdmFsdWUodmFsdWUpLCBtX2ltcGwoMCkKLSAgICB7fQotICAg
IAotICAgIEF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0
cmluZyYgdmFsdWUpCi0gICAgICAgIDogbV9uYW1lKG51bGxBdG9tLCBuYW1lLCBudWxsQXRvbSks
IG1fdmFsdWUodmFsdWUpLCBtX2ltcGwoMCkKLSAgICB7fQotCi0gICAgdmlydHVhbCB+QXR0cmli
dXRlKCkgeyB9Ci0gICAgCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWU7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0
IHsgcmV0dXJuIG1fbmFtZS5wcmVmaXgoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9j
YWxOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lLmxvY2FsTmFtZSgpOyB9Ci0gICAgY29uc3Qg
QXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX25hbWUubmFtZXNw
YWNlVVJJKCk7IH0KLSAgICAKLSAgICBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKCkgY29uc3Qg
eyByZXR1cm4gbV9uYW1lOyB9Ci0gICAgCi0gICAgQXR0ciogYXR0cigpIGNvbnN0IHsgcmV0dXJu
IG1faW1wbDsgfQotICAgIFBhc3NSZWZQdHI8QXR0cj4gY3JlYXRlQXR0cklmTmVlZGVkKEVsZW1l
bnQqIGUpOwotCi0gICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlLmlzTnVs
bCgpOyB9Ci0gICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZS5pc0VtcHR5
KCk7IH0KLSAgICAKLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSogY2xvbmUoYm9vbCBwcmVzZXJ2ZURl
Y2w9dHJ1ZSkgY29uc3Q7Ci0KLSAgICAvLyBBbiBleHRlbnNpb24gdG8gZ2V0IHRoZSBzdHlsZSBp
bmZvcm1hdGlvbiBmb3IgcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcy4KLSAgICB2aXJ0dWFsIENT
U1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIAotcHJp
dmF0ZToKLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpIHsgbV92
YWx1ZSA9IHZhbHVlOyB9Ci0gICAgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nJiBw
cmVmaXgpIHsgbV9uYW1lLnNldFByZWZpeChwcmVmaXgpOyB9Ci0KLSAgICBRdWFsaWZpZWROYW1l
IG1fbmFtZTsKLSAgICBBdG9taWNTdHJpbmcgbV92YWx1ZTsKLSAgICBBdHRyKiBtX2ltcGw7Ci19
OwotCi0vLyBBdHRyIGNhbiBoYXZlIFRleHQgYW5kIEVudGl0eVJlZmVyZW5jZSBjaGlsZHJlbgot
Ly8gdGhlcmVmb3JlIGl0IGhhcyB0byBiZSBhIGZ1bGxibG93biBOb2RlLiBUaGUgcGxhbgotLy8g
aXMgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgYSB0ZXh0Y2hpbGQgYW5kIHN0b3JlIHRoZQotLy8g
cmVzdWx0aW5nIG5vZGV2YWx1ZSBpbiB0aGUgQXR0cmlidXRlIHVwb24KLS8vIGRlc3RydWN0aW9u
LiBob3dldmVyLCB0aGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi1jbGFzcyBBdHRyIDogcHVi
bGljIENvbnRhaW5lck5vZGUgewotICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0KLXB1
YmxpYzoKLSAgICBBdHRyKEVsZW1lbnQqLCBEb2N1bWVudCosIEF0dHJpYnV0ZSopOwotICAgIH5B
dHRyKCk7Ci0KLSAgICAvLyBDYWxsIHRoaXMgYWZ0ZXIgY2FsbGluZyB0aGUgY29uc3RydWN0b3Ig
c28gdGhlCi0gICAgLy8gQXR0ciBub2RlIGlzbid0IGZsb2F0aW5nIHdoZW4gd2UgYXBwZW5kIHRo
ZSB0ZXh0IG5vZGUuCi0gICAgdm9pZCBjcmVhdGVUZXh0Q2hpbGQoKTsKLSAgICAKLSAgICAvLyBE
T00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIEF0dHIKLSAgICBTdHJpbmcgbmFtZSgpIGNvbnN0
IHsgcmV0dXJuIHF1YWxpZmllZE5hbWUoKS50b1N0cmluZygpOyB9Ci0gICAgYm9vbCBzcGVjaWZp
ZWQoKSBjb25zdCB7IHJldHVybiBtX3NwZWNpZmllZDsgfQotICAgIEVsZW1lbnQqIG93bmVyRWxl
bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotCi0gICAgU3RyaW5nIHZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gbV9hdHRyaWJ1dGUtPnZhbHVlKCk7IH0KLSAgICB2b2lkIHNldFZhbHVl
KGNvbnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92
ZXJyaWRkZW4gZnJvbSBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVOYW1l
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlVHlwZSBub2RlVHlwZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBj
b25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRQ
cmVmaXgoY29uc3QgQXRvbWljU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVh
bCBTdHJpbmcgbm9kZVZhbHVlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldE5vZGVWYWx1
ZShjb25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PE5vZGU+IGNsb25lTm9kZShib29sIGRlZXApOwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90
IHBhcnQgb2YgRE9NKQotICAgIHZpcnR1YWwgYm9vbCBpc0F0dHJpYnV0ZU5vZGUoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5
cGUpOwotCi0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwg
U3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICBBdHRyaWJ1dGUqIGF0dHIoKSBjb25zdCB7
IHJldHVybiBtX2F0dHJpYnV0ZS5nZXQoKTsgfQotICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIHF1
YWxpZmllZE5hbWUoKSBjb25zdCB7IHJldHVybiBtX2F0dHJpYnV0ZS0+bmFtZSgpOyB9Ci0KLSAg
ICAvLyBBbiBleHRlbnNpb24gdG8gZ2V0IHByZXNlbnRhdGlvbmFsIGluZm9ybWF0aW9uIGZvciBh
dHRyaWJ1dGVzLgotICAgIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKCkgeyByZXR1cm4gbV9h
dHRyaWJ1dGUtPnN0eWxlKCk7IH0KLQotcHJpdmF0ZToKLSAgICBFbGVtZW50KiBtX2VsZW1lbnQ7
Ci0gICAgUmVmUHRyPEF0dHJpYnV0ZT4gbV9hdHRyaWJ1dGU7Ci0gICAgaW50IG1faWdub3JlQ2hp
bGRyZW5DaGFuZ2VkOwotfTsKLQotY2xhc3MgRWxlbWVudCA6IHB1YmxpYyBDb250YWluZXJOb2Rl
IHsKLSAgICBmcmllbmQgY2xhc3MgRG9jdW1lbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0
ck1hcDsKLSAgICBmcmllbmQgY2xhc3MgQXR0cjsKLSAgICBmcmllbmQgY2xhc3MgTm9kZTsKLSAg
ICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVTZWxlY3RvcjsKLXB1YmxpYzoKLSAgICBFbGVtZW50KGNv
bnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MpOwotICAgIH5FbGVtZW50
KCk7Ci0KLSAgICAvLyBVc2VkIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFu
IGVsZW1lbnQgaGFzIGEgZ2l2ZW4gQ1NTIGNsYXNzLgotICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5n
JiBnZXRJREF0dHJpYnV0ZSgpIGNvbnN0OwotICAgIGJvb2wgaGFzQXR0cmlidXRlKGNvbnN0IFF1
YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0
cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIHZvaWQgc2V0QXR0
cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlLCBFeGNl
cHRpb25Db2RlJik7Ci0gICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFt
ZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgYm9vbCBoYXNBdHRyaWJ1dGVzKCkgY29u
c3Q7Ci0KLSAgICBib29sIGhhc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Owot
ICAgIGJvb2wgaGFzQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0
IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdDsKLQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0
QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBnZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3Ry
aW5nJiBsb2NhbE5hbWUpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRBdHRyaWJ1dGUoY29uc3QgU3Ry
aW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9p
ZCBzZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5n
JiBxdWFsaWZpZWROYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25Db2RlJik7Ci0K
LSAgICB2b2lkIHNjcm9sbEludG9WaWV3IChib29sIGFsaWduVG9Ub3ApOwotICAgIHZvaWQgc2Ny
b2xsSW50b1ZpZXdJZk5lZWRlZChib29sIGNlbnRlcklmTmVlZGVkKTsKLQotICAgIHZvaWQgcmVt
b3ZlQXR0cmlidXRlKGNvbnN0IFN0cmluZyAmbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpOwotICAg
IHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0
IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBQYXNzUmVmUHRyPEF0
dHI+IGdldEF0dHJpYnV0ZU5vZGUoY29uc3QgU3RyaW5nJiBuYW1lKTsKLSAgICBQYXNzUmVmUHRy
PEF0dHI+IGdldEF0dHJpYnV0ZU5vZGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29u
c3QgU3RyaW5nJiBsb2NhbE5hbWUpOwotICAgIFBhc3NSZWZQdHI8QXR0cj4gc2V0QXR0cmlidXRl
Tm9kZShBdHRyKiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIFBhc3NSZWZQdHI8QXR0cj4gc2V0QXR0
cmlidXRlTm9kZU5TKEF0dHIqIG5ld0F0dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKSB7IHJldHVybiBz
ZXRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIsIGVjKTsgfQotICAgIFBhc3NSZWZQdHI8QXR0cj4gcmVt
b3ZlQXR0cmlidXRlTm9kZShBdHRyKiwgRXhjZXB0aW9uQ29kZSYpOwotICAgIAotICAgIHZpcnR1
YWwgQ1NTU3R5bGVEZWNsYXJhdGlvbiAqc3R5bGUoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgUXVh
bGlmaWVkTmFtZSYgdGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZTsgfQotICAgIHZp
cnR1YWwgYm9vbCBoYXNUYWdOYW1lKGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUpIGNvbnN0
IHsgcmV0dXJuIG1fdGFnTmFtZS5tYXRjaGVzKHRhZ05hbWUpOyB9Ci0gICAgCi0gICAgLy8gQSBm
YXN0IGZ1bmN0aW9uIGZvciBjaGVja2luZyB0aGUgbG9jYWwgbmFtZSBhZ2FpbnN0IGFub3RoZXIg
YXRvbWljIHN0cmluZy4KLSAgICBib29sIGhhc0xvY2FsTmFtZShjb25zdCBBdG9taWNTdHJpbmcm
IG90aGVyKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubG9jYWxOYW1lKCkgPT0gb3RoZXI7IH0K
LSAgICBib29sIGhhc0xvY2FsTmFtZShjb25zdCBRdWFsaWZpZWROYW1lJiBvdGhlcikgY29uc3Qg
eyByZXR1cm4gbV90YWdOYW1lLmxvY2FsTmFtZSgpID09IG90aGVyLmxvY2FsTmFtZSgpOyB9Ci0K
LSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKCkgY29uc3QgeyByZXR1
cm4gbV90YWdOYW1lLmxvY2FsTmFtZSgpOyB9Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJp
bmcmIHByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5wcmVmaXgoKTsgfQotICAgIHZp
cnR1YWwgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBFeGNlcHRp
b25Db2RlJik7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSgp
IGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5uYW1lc3BhY2VVUkkoKTsgfQotICAgIAotICAgIC8v
IERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSAgcGFyZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFs
IE5vZGVUeXBlIG5vZGVUeXBlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+
IGNsb25lTm9kZShib29sIGRlZXApOwotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVOYW1lKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBib29sIGlzRWxlbWVudE5vZGUoKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9Ci0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVh
bCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAgIC8vIGNvbnZlbmllbmNlIG1ldGhv
ZHMgd2hpY2ggaWdub3JlIGV4Y2VwdGlvbnMKLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBR
dWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKLQotICAgIHZpcnR1YWwg
TmFtZWRBdHRyTWFwICphdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gICAgTmFtZWRBdHRyTWFwKiBhdHRy
aWJ1dGVzKGJvb2wgcmVhZG9ubHkpIGNvbnN0OwotCi0gICAgLy8gVGhpcyBtZXRob2QgaXMgY2Fs
bGVkIHdoZW5ldmVyIGFuIGF0dHJpYnV0ZSBpcyBhZGRlZCwgY2hhbmdlZCBvciByZW1vdmVkLgot
ICAgIHZpcnR1YWwgdm9pZCBhdHRyaWJ1dGVDaGFuZ2VkKEF0dHJpYnV0ZSogYXR0ciwgYm9vbCBw
cmVzZXJ2ZURlY2xzID0gZmFsc2UpIHt9Ci0KLSAgICAvLyBub3QgcGFydCBvZiB0aGUgRE9NCi0g
ICAgdm9pZCBzZXRBdHRyaWJ1dGVNYXAoTmFtZWRBdHRyTWFwKik7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgY29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMoY29uc3QgRWxlbWVudCAqc291cmNlKSB7fQot
ICAgIAotICAgIC8vIFN0YXRlIG9mIHRoZSBlbGVtZW50LgotICAgIHZpcnR1YWwgRGVwcmVjYXRl
ZFN0cmluZyBzdGF0ZSgpIHsgcmV0dXJuIERlcHJlY2F0ZWRTdHJpbmc6Om51bGw7IH0KLQotICAg
IHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIFJlbmRlclN0eWxlICpjcmVhdGVT
dHlsZUZvclJlbmRlcmVyKFJlbmRlck9iamVjdCAqcGFyZW50KTsKLSAgICB2aXJ0dWFsIFJlbmRl
ck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwgUmVuZGVyU3R5bGUgKik7Ci0g
ICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSA9IE5vQ2hhbmdlICk7Ci0K
LSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSk7Ci0gCi0gICAgdmly
dHVhbCBBdHRyaWJ1dGUqIGNyZWF0ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
LCBTdHJpbmdJbXBsKiB2YWx1ZSk7Ci0gICAgCi0gICAgdm9pZCBkaXNwYXRjaEF0dHJSZW1vdmFs
RXZlbnQoQXR0cmlidXRlICphdHRyKTsKLSAgICB2b2lkIGRpc3BhdGNoQXR0ckFkZGl0aW9uRXZl
bnQoQXR0cmlidXRlICphdHRyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhY2Nlc3NLZXlBY3Rpb24o
Ym9vbCBzZW5kVG9BbnlFdmVudCkgeyB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyB0b1N0cmluZygp
IGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0
cikgY29uc3Q7Ci0gICAgICAgIAotICAgIHZpcnR1YWwgdm9pZCBmb2N1cygpOwotICAgIHZvaWQg
Ymx1cigpOwotICAgIAotI2lmICFOREVCVUcKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0
cmVhbSAqc3RyZWFtLCBEZXByZWNhdGVkU3RyaW5nIGluZCA9ICIiKSBjb25zdDsKLSAgICB2aXJ0
dWFsIHZvaWQgZm9ybWF0Rm9yRGVidWdnZXIoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsZW5ndGgp
IGNvbnN0OwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQXR0
cmlidXRlTWFwKCkgY29uc3Q7Ci0gICAgU3RyaW5nIG9wZW5UYWdTdGFydFRvU3RyaW5nKCkgY29u
c3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCB1cGRhdGVJZChjb25zdCBBdG9taWNTdHJpbmcmIG9s
ZElkLCBjb25zdCBBdG9taWNTdHJpbmcmIG5ld0lkKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRh
dGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCkgY29uc3Qge30KLQotcHJvdGVjdGVkOiAvLyBtZW1i
ZXIgdmFyaWFibGVzCi0gICAgbXV0YWJsZSBSZWZQdHI8TmFtZWRBdHRyTWFwPiBuYW1lZEF0dHJN
YXA7Ci0gICAgUXVhbGlmaWVkTmFtZSBtX3RhZ05hbWU7Ci19OwotCi0vLyB0aGUgbWFwIG9mIGF0
dHJpYnV0ZXMgb2YgYW4gZWxlbWVudAotY2xhc3MgTmFtZWRBdHRyTWFwIDogcHVibGljIE5hbWVk
Tm9kZU1hcCB7Ci0gICAgZnJpZW5kIGNsYXNzIEVsZW1lbnQ7Ci1wdWJsaWM6Ci0gICAgTmFtZWRB
dHRyTWFwKEVsZW1lbnQgKmUpOwotICAgIHZpcnR1YWwgfk5hbWVkQXR0ck1hcCgpOwotICAgIE5h
bWVkQXR0ck1hcChjb25zdCBOYW1lZEF0dHJNYXAmKTsKLSAgICBOYW1lZEF0dHJNYXAgJm9wZXJh
dG9yID0oY29uc3QgTmFtZWRBdHRyTWFwICZvdGhlcik7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAm
IGF0dHJpYnV0ZXMgZm9yIE5hbWVkTm9kZU1hcAotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5v
ZGU+IGdldE5hbWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxOb2RlPiByZW1vdmVOYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1lLCBFeGNl
cHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVt
TlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBj
b25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVtTlMoY29u
c3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRp
b25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVtKGNv
bnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxO
b2RlPiByZW1vdmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9u
Q29kZSYpOwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBzZXROYW1lZEl0ZW0oTm9kZSog
YXJnLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gaXRl
bSh1bnNpZ25lZCBpbmRleCkgY29uc3Q7Ci0gICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyBy
ZXR1cm4gbGVuOyB9Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0g
ICAgQXR0cmlidXRlKiBhdHRyaWJ1dGVJdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVy
biBhdHRycyA/IGF0dHJzW2luZGV4XSA6IDA7IH0KLSAgICBBdHRyaWJ1dGUqIGdldEF0dHJpYnV0
ZUl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29s
IGlzUmVhZE9ubHkoKSB7IHJldHVybiBlbGVtZW50ID8gZWxlbWVudC0+aXNSZWFkT25seSgpIDog
ZmFsc2U7IH0KLQotICAgIC8vIHVzZWQgZHVyaW5nIHBhcnNpbmc6IG9ubHkgaW5zZXJ0cyBpZiBu
b3QgYWxyZWFkeSB0aGVyZQotICAgIC8vIG5vIGVycm9yIGNoZWNraW5nIQotICAgIHZvaWQgaW5z
ZXJ0QXR0cmlidXRlKEF0dHJpYnV0ZSogbmV3QXR0cmlidXRlKSB7Ci0gICAgICAgIGFzc2VydCgh
ZWxlbWVudCk7Ci0gICAgICAgIGlmICghZ2V0QXR0cmlidXRlSXRlbShuZXdBdHRyaWJ1dGUtPm5h
bWUoKSkpCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUobmV3QXR0cmlidXRlKTsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgbmV3QXR0cmlidXRlLT5kZXJlZigpOwotICAgIH0KLQotICAgIHZp
cnR1YWwgYm9vbCBpc01hcHBlZEF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotCi0gICAgY29uc3QgQXRv
bWljU3RyaW5nJiBpZCgpIGNvbnN0IHsgcmV0dXJuIG1faWQ7IH0KLSAgICB2b2lkIHNldElEKGNv
bnN0IEF0b21pY1N0cmluZyYgX2lkKSB7IG1faWQgPSBfaWQ7IH0KLSAgICAKLSAgICBib29sIG1h
cHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0OwotCi1wcm90
ZWN0ZWQ6Ci0gICAgLy8gdGhpcyBtZXRob2QgaXMgaW50ZXJuYWwsIGRvZXMgbm8gZXJyb3IgY2hl
Y2tpbmcgYXQgYWxsCi0gICAgdm9pZCBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlKiBuZXdBdHRyaWJ1
dGUpOwotICAgIC8vIHRoaXMgbWV0aG9kIGlzIGludGVybmFsLCBkb2VzIG5vIGVycm9yIGNoZWNr
aW5nIGF0IGFsbAotICAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUpOwotICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICB2b2lkIGRl
dGFjaEZyb21FbGVtZW50KCk7Ci0KLSAgICBFbGVtZW50ICplbGVtZW50OwotICAgIEF0dHJpYnV0
ZSAqKmF0dHJzOwotICAgIHVuc2lnbmVkIGxlbjsKLSAgICBBdG9taWNTdHJpbmcgbV9pZDsKLX07
Ci0KLS8vIFdoZW4gYWRkaW5nIG5ldyBlbnRyaWVzLCBtYWtlIHN1cmUgdG8ga2VlcCBlTGFzdEVu
dHJ5IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCi1lbnVtIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHsg
ZU5vbmUsIGVVbml2ZXJzYWwsIGVQZXJzaXN0ZW50LCBlUmVwbGFjZWQsIGVCbG9jaywgZUhSLCBl
VW5vcmRlcmVkTGlzdCwgZUxpc3RJdGVtLAotICAgIGVUYWJsZSwgZUNlbGwsIGVDYXB0aW9uLCBl
QkRPLCBlUHJlLCBlTGFzdEVudHJ5IH07Ci0KLWNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xh
cmF0aW9uIDogcHVibGljIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uIHsKLXB1YmxpYzoKLSAg
ICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihDU1NSdWxlICpwYXJlbnRSdWxlKQotICAg
IDogQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24ocGFyZW50UnVsZSksIG1fZW50cnlUeXBlKGVO
b25lKSwgbV9hdHRyTmFtZShhbnlRTmFtZSgpKQotICAgIHt9Ci0gICAgCi0gICAgdmlydHVhbCB+
Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgIHZvaWQgc2V0TWFwcGVkU3Rh
dGUoTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwg
Y29uc3QgQXRvbWljU3RyaW5nJiB2YWwpCi0gICAgewotICAgICAgICBtX2VudHJ5VHlwZSA9IHR5
cGU7Ci0gICAgICAgIG1fYXR0ck5hbWUgPSBuYW1lOwotICAgICAgICBtX2F0dHJWYWx1ZSA9IHZh
bDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgTWFwcGVkQXR0cmlidXRlRW50cnkgbV9lbnRyeVR5
cGU7Ci0gICAgUXVhbGlmaWVkTmFtZSBtX2F0dHJOYW1lOwotICAgIEF0b21pY1N0cmluZyBtX2F0
dHJWYWx1ZTsKLX07Ci0KLWNsYXNzIE1hcHBlZEF0dHJpYnV0ZSA6IHB1YmxpYyBBdHRyaWJ1dGUK
LXsKLXB1YmxpYzoKLSAgICBNYXBwZWRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFt
ZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSwgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRp
b24qIGRlY2wgPSAwKQotICAgIDogQXR0cmlidXRlKG5hbWUsIHZhbHVlKSwgbV9zdHlsZURlY2wo
ZGVjbCkKLSAgICB7Ci0gICAgfQotCi0gICAgTWFwcGVkQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0
cmluZyYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSwgQ1NTTWFwcGVkQXR0cmlidXRl
RGVjbGFyYXRpb24qIGRlY2wgPSAwKQotICAgIDogQXR0cmlidXRlKG5hbWUsIHZhbHVlKSwgbV9z
dHlsZURlY2woZGVjbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBBdHRyaWJ1dGUqIGNs
b25lKGJvb2wgcHJlc2VydmVEZWNsPXRydWUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBDU1NTdHls
ZURlY2xhcmF0aW9uKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVEZWNsLmdldCgpOyB9
Ci0KLSAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCgpIGNvbnN0IHsgcmV0
dXJuIG1fc3R5bGVEZWNsLmdldCgpOyB9Ci0gICAgdm9pZCBzZXREZWNsKENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKiBkZWNsKSB7IG1fc3R5bGVEZWNsID0gZGVjbDsgfQotCi1wcml2YXRl
OgotICAgIFJlZlB0cjxDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbj4gbV9zdHlsZURlY2w7
Ci19OwotCiBjbGFzcyBOYW1lZE1hcHBlZEF0dHJNYXAgOiBwdWJsaWMgTmFtZWRBdHRyTWFwCiB7
CiBwdWJsaWM6CkBAIC00MDYsNTUgKzYwLDYgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9tYXBwZWRB
dHRyaWJ1dGVDb3VudDsKIH07CiAKLWNsYXNzIFN0eWxlZEVsZW1lbnQgOiBwdWJsaWMgRWxlbWVu
dAotewotcHVibGljOgotICAgIFN0eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFn
TmFtZSwgRG9jdW1lbnQgKmRvYyk7Ci0gICAgdmlydHVhbCB+U3R5bGVkRWxlbWVudCgpOwotCi0g
ICAgdmlydHVhbCBib29sIGlzU3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0K
LQotICAgIE5hbWVkTWFwcGVkQXR0ck1hcCogbWFwcGVkQXR0cmlidXRlcygpIHsgcmV0dXJuIHN0
YXRpY19jYXN0PE5hbWVkTWFwcGVkQXR0ck1hcCo+KG5hbWVkQXR0ck1hcC5nZXQoKSk7IH0KLSAg
ICBjb25zdCBOYW1lZE1hcHBlZEF0dHJNYXAqIG1hcHBlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJl
dHVybiBzdGF0aWNfY2FzdDxOYW1lZE1hcHBlZEF0dHJNYXAqPihuYW1lZEF0dHJNYXAuZ2V0KCkp
OyB9Ci0gICAgYm9vbCBoYXNNYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbmFtZWRB
dHRyTWFwICYmIG1hcHBlZEF0dHJpYnV0ZXMoKS0+aGFzTWFwcGVkQXR0cmlidXRlcygpOyB9Ci0g
ICAgYm9vbCBpc01hcHBlZEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25z
dCB7IE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHJlcyA9IGVOb25lOyBtYXBUb0VudHJ5KG5hbWUsIHJl
cyk7IHJldHVybiByZXMgIT0gZU5vbmU7IH0KLQotICAgIHZvaWQgYWRkQ1NTTGVuZ3RoKE1hcHBl
ZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKTsKLSAgICB2b2lk
IGFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJp
bmcgJnZhbHVlKTsKLSAgICB2b2lkIGFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0
ciwgaW50IGlkLCBpbnQgdmFsdWUpOwotICAgIHZvaWQgYWRkQ1NTU3RyaW5nUHJvcGVydHkoTWFw
cGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUsIENTU1ByaW1p
dGl2ZVZhbHVlOjpVbml0VHlwZXMgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1NUUklORyk7Ci0g
ICAgdm9pZCBhZGRDU1NJbWFnZVByb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlk
LCBjb25zdCBTdHJpbmcgJlVSTCk7Ci0gICAgdm9pZCBhZGRDU1NDb2xvcihNYXBwZWRBdHRyaWJ1
dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZjKTsKLSAgICB2b2lkIGNyZWF0ZU1hcHBl
ZERlY2woTWFwcGVkQXR0cmlidXRlKiBhdHRyKTsKLSAgICAKLSAgICBzdGF0aWMgQ1NTTWFwcGVk
QXR0cmlidXRlRGVjbGFyYXRpb24qIGdldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmli
dXRlRW50cnkgdHlwZSwgQXR0cmlidXRlKiBhdHRyKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRNYXBw
ZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIEF0dHJpYnV0ZSogYXR0
ciwgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wpOwotICAgIHN0YXRpYyB2b2lk
IHJlbW92ZU1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgY29u
c3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0clZhbHVl
KTsKLSAgICAKLSAgICBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogaW5saW5lU3R5bGVEZWNs
KCkgY29uc3QgeyByZXR1cm4gbV9pbmxpbmVTdHlsZURlY2wuZ2V0KCk7IH0KLSAgICB2aXJ0dWFs
IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNs
KCk7Ci0gICAgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGdldElubGluZVN0eWxlRGVjbCgp
OwotICAgIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKCk7Ci0gICAgdm9pZCBjcmVhdGVJbmxp
bmVTdHlsZURlY2woKTsKLSAgICB2b2lkIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLSAgICB2
b2lkIGludmFsaWRhdGVTdHlsZUF0dHJpYnV0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVT
dHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBjb25zdCBB
dG9taWNTdHJpbmdMaXN0KiBnZXRDbGFzc0xpc3QoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQg
YXR0cmlidXRlQ2hhbmdlZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZh
bHNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlKiBhdHRyKTsKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWRO
YW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAg
dmlydHVhbCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAgIHZpcnR1YWwgQXR0
cmlidXRlKiBjcmVhdGVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5n
SW1wbCogdmFsdWUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURl
Y2xhcmF0aW9uPiBtX2lubGluZVN0eWxlRGVjbDsKLSAgICBtdXRhYmxlIGJvb2wgbV9pc1N0eWxl
QXR0cmlidXRlVmFsaWQgOiAxOwotICAgIG11dGFibGUgYm9vbCBtX3N5bmNocm9uaXppbmdTdHls
ZUF0dHJpYnV0ZSA6IDE7Ci19OwotCiB9IC8vbmFtZXNwYWNlCiAKLSN1bmRlZiBpZAotCiAjZW5k
aWYKSW5kZXg6IGRvbS9Ob2RlTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL05vZGVMaXN0LmNw
cAkocmV2aXNpb24gMTM0NzcpCisrKyBkb20vTm9kZUxpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiTm9kZUxpc3QuaCIKIAogI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIk5vZGUuaCIKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewpJbmRleDogZG9tL1N0eWxlZEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBk
b20vU3R5bGVkRWxlbWVudC5oCShyZXZpc2lvbiAxMzQ3NykKKysrIGRvbS9TdHlsZWRFbGVtZW50
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI0LDM4NyArMjQsMTcgQEAKICAqCiAgKi8KIAotI2lmbmRl
ZiBET01fRUxFTUVOVElNUExfSAotI2RlZmluZSBET01fRUxFTUVOVElNUExfSAorI2lmbmRlZiBT
dHlsZWRFbGVtZW50X2gKKyNkZWZpbmUgU3R5bGVkRWxlbWVudF9oCiAKLSNpbmNsdWRlICJBdG9t
aWNTdHJpbmdMaXN0LmgiCi0jaW5jbHVkZSAiQ29udGFpbmVyTm9kZS5oIgotI2luY2x1ZGUgIk5h
bWVkTm9kZU1hcC5oIgotI2luY2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKLSNpbmNsdWRlICJTdHJp
bmdJbXBsLmgiCi0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgotCi0jaWYgX19PQkpDX18KLSNk
ZWZpbmUgaWQgaWRfQVZPSURfS0VZV09SRAotI2VuZGlmCisjaW5jbHVkZSAiRWxlbWVudC5oIgor
I2luY2x1ZGUgIk1hcHBlZEF0dHJpYnV0ZUVudHJ5LmgiCisjaW5jbHVkZSAiTmFtZWRNYXBwZWRB
dHRyTWFwLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQXR0cjsKLWNsYXNzIENT
U1N0eWxlRGVjbGFyYXRpb247Ci1jbGFzcyBDU1NTdHlsZVNlbGVjdG9yOwotY2xhc3MgRWxlbWVu
dDsKLWNsYXNzIE5hbWVkQXR0ck1hcDsKLQotLy8gdGhpcyBoYXMgbm8gY291bnRlcnBhcnQgaW4g
RE9NLCBwdXJlbHkgaW50ZXJuYWwKLS8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RldmFsdWUg
b2YgYW4gQXR0ci4KLS8vIHRoZSBhY3R1YWwgQXR0ciAoQXR0cikgd2l0aCBpdHMgdmFsdWUgYXMg
dGV4dGNoaWxkCi0vLyBpcyBvbmx5IGFsbG9jYXRlZCBvbiBkZW1hbmQgYnkgdGhlIERPTSBiaW5k
aW5ncy4KLS8vIEFueSB1c2Ugb2YgQXR0ciBpbnNpZGUga2h0bWwgc2hvdWxkIGJlIGF2b2lkZWQu
Ci1jbGFzcyBBdHRyaWJ1dGUgOiBwdWJsaWMgU2hhcmVkPEF0dHJpYnV0ZT4gewotICAgIGZyaWVu
ZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNsYXNzIEVsZW1lbnQ7Ci0gICAgZnJp
ZW5kIGNsYXNzIEF0dHI7Ci0KLXB1YmxpYzoKLSAgICAvLyBudWxsIHZhbHVlIGlzIGZvcmJpZGRl
biAhCi0gICAgQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21p
Y1N0cmluZyYgdmFsdWUpCi0gICAgICAgIDogbV9uYW1lKG5hbWUpLCBtX3ZhbHVlKHZhbHVlKSwg
bV9pbXBsKDApCi0gICAge30KLSAgICAKLSAgICBBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5n
JiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKQotICAgICAgICA6IG1fbmFtZShudWxs
QXRvbSwgbmFtZSwgbnVsbEF0b20pLCBtX3ZhbHVlKHZhbHVlKSwgbV9pbXBsKDApCi0gICAge30K
LQotICAgIHZpcnR1YWwgfkF0dHJpYnV0ZSgpIHsgfQotICAgIAotICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9Ci0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJldHVybiBtX25hbWUucHJlZml4KCk7IH0KLSAgICBj
b25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZS5sb2Nh
bE5hbWUoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29uc3Qg
eyByZXR1cm4gbV9uYW1lLm5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgCi0gICAgY29uc3QgUXVhbGlm
aWVkTmFtZSYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQotICAgIAotICAgIEF0dHIq
IGF0dHIoKSBjb25zdCB7IHJldHVybiBtX2ltcGw7IH0KLSAgICBQYXNzUmVmUHRyPEF0dHI+IGNy
ZWF0ZUF0dHJJZk5lZWRlZChFbGVtZW50KiBlKTsKLQotICAgIGJvb2wgaXNOdWxsKCkgY29uc3Qg
eyByZXR1cm4gbV92YWx1ZS5pc051bGwoKTsgfQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWUuaXNFbXB0eSgpOyB9Ci0gICAgCi0gICAgdmlydHVhbCBBdHRyaWJ1dGUq
IGNsb25lKGJvb2wgcHJlc2VydmVEZWNsPXRydWUpIGNvbnN0OwotCi0gICAgLy8gQW4gZXh0ZW5z
aW9uIHRvIGdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZm9yIHByZXNlbnRhdGlvbmFsIGF0dHJp
YnV0ZXMuCi0gICAgdmlydHVhbCBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSgpIGNvbnN0IHsg
cmV0dXJuIDA7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBBdG9t
aWNTdHJpbmcmIHZhbHVlKSB7IG1fdmFsdWUgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0UHJlZml4
KGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KSB7IG1fbmFtZS5zZXRQcmVmaXgocHJlZml4KTsg
fQotCi0gICAgUXVhbGlmaWVkTmFtZSBtX25hbWU7Ci0gICAgQXRvbWljU3RyaW5nIG1fdmFsdWU7
Ci0gICAgQXR0ciogbV9pbXBsOwotfTsKLQotLy8gQXR0ciBjYW4gaGF2ZSBUZXh0IGFuZCBFbnRp
dHlSZWZlcmVuY2UgY2hpbGRyZW4KLS8vIHRoZXJlZm9yZSBpdCBoYXMgdG8gYmUgYSBmdWxsYmxv
d24gTm9kZS4gVGhlIHBsYW4KLS8vIGlzIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgdGV4dGNo
aWxkIGFuZCBzdG9yZSB0aGUKLS8vIHJlc3VsdGluZyBub2RldmFsdWUgaW4gdGhlIEF0dHJpYnV0
ZSB1cG9uCi0vLyBkZXN0cnVjdGlvbi4gaG93ZXZlciwgdGhpcyBpcyBub3QgeWV0IGltcGxlbWVu
dGVkLgotY2xhc3MgQXR0ciA6IHB1YmxpYyBDb250YWluZXJOb2RlIHsKLSAgICBmcmllbmQgY2xh
c3MgTmFtZWRBdHRyTWFwOwotCi1wdWJsaWM6Ci0gICAgQXR0cihFbGVtZW50KiwgRG9jdW1lbnQq
LCBBdHRyaWJ1dGUqKTsKLSAgICB+QXR0cigpOwotCi0gICAgLy8gQ2FsbCB0aGlzIGFmdGVyIGNh
bGxpbmcgdGhlIGNvbnN0cnVjdG9yIHNvIHRoZQotICAgIC8vIEF0dHIgbm9kZSBpc24ndCBmbG9h
dGluZyB3aGVuIHdlIGFwcGVuZCB0aGUgdGV4dCBub2RlLgotICAgIHZvaWQgY3JlYXRlVGV4dENo
aWxkKCk7Ci0gICAgCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBBdHRyCi0g
ICAgU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBxdWFsaWZpZWROYW1lKCkudG9TdHJpbmco
KTsgfQotICAgIGJvb2wgc3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gbV9zcGVjaWZpZWQ7IH0K
LSAgICBFbGVtZW50KiBvd25lckVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQ7IH0K
LQotICAgIFN0cmluZyB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXR0cmlidXRlLT52YWx1ZSgp
OyB9Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0K
LSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gcGFyZW50IGNsYXNzZXMKLSAgICB2
aXJ0dWFsIFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZVR5cGUgbm9k
ZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1l
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSgp
IGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdDsK
LSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyYsIEV4Y2VwdGlv
bkNvZGUmKTsKLQotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVWYWx1ZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBkZWVwKTsKLQotICAg
IC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICB2aXJ0dWFsIGJvb2wgaXNB
dHRyaWJ1dGVOb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBj
aGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNo
YW5nZWQoKTsKLSAgICB2aXJ0dWFsIFN0cmluZyB0b1N0cmluZygpIGNvbnN0OwotCi0gICAgQXR0
cmlidXRlKiBhdHRyKCkgY29uc3QgeyByZXR1cm4gbV9hdHRyaWJ1dGUuZ2V0KCk7IH0KLSAgICBj
b25zdCBRdWFsaWZpZWROYW1lJiBxdWFsaWZpZWROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9hdHRy
aWJ1dGUtPm5hbWUoKTsgfQotCi0gICAgLy8gQW4gZXh0ZW5zaW9uIHRvIGdldCBwcmVzZW50YXRp
b25hbCBpbmZvcm1hdGlvbiBmb3IgYXR0cmlidXRlcy4KLSAgICBDU1NTdHlsZURlY2xhcmF0aW9u
KiBzdHlsZSgpIHsgcmV0dXJuIG1fYXR0cmlidXRlLT5zdHlsZSgpOyB9Ci0KLXByaXZhdGU6Ci0g
ICAgRWxlbWVudCogbV9lbGVtZW50OwotICAgIFJlZlB0cjxBdHRyaWJ1dGU+IG1fYXR0cmlidXRl
OwotICAgIGludCBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZDsKLX07Ci0KLWNsYXNzIEVsZW1lbnQg
OiBwdWJsaWMgQ29udGFpbmVyTm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNzIERvY3VtZW50OwotICAg
IGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNsYXNzIEF0dHI7Ci0gICAg
ZnJpZW5kIGNsYXNzIE5vZGU7Ci0gICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2VsZWN0b3I7Ci1w
dWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVu
dCAqZG9jKTsKLSAgICB+RWxlbWVudCgpOwotCi0gICAgLy8gVXNlZCB0byBxdWlja2x5IGRldGVy
bWluZSB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGhhcyBhIGdpdmVuIENTUyBjbGFzcy4KLSAg
ICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIGdldENsYXNzTGlzdCgpIGNvbnN0Owot
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0SURBdHRyaWJ1dGUoKSBjb25zdDsKLSAgICBib29s
IGhhc0F0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdDsKLSAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBj
b25zdDsKLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBT
dHJpbmdJbXBsKiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgcmVtb3ZlQXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIGJv
b2wgaGFzQXR0cmlidXRlcygpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNBdHRyaWJ1dGUoY29uc3Qg
U3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBib29sIGhhc0F0dHJpYnV0ZU5TKGNvbnN0IFN0cmlu
ZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3Q7Ci0KLSAgICBj
b25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0
OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBu
YW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdDsKLQotICAgIHZvaWQg
c2V0QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhj
ZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgc2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1l
c3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1
ZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzY3JvbGxJbnRvVmlldyAoYm9vbCBhbGln
blRvVG9wKTsKLSAgICB2b2lkIHNjcm9sbEludG9WaWV3SWZOZWVkZWQoYm9vbCBjZW50ZXJJZk5l
ZWRlZCk7Ci0KLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcgJm5hbWUsIEV4
Y2VwdGlvbkNvZGUmIGVjKTsKLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0cmlu
ZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYp
OwotCi0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2RlKGNvbnN0IFN0cmluZyYg
bmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2RlTlMoY29uc3QgU3Ry
aW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKTsKLSAgICBQYXNzUmVm
UHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGUoQXR0ciosIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICBQ
YXNzUmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyKiBuZXdBdHRyLCBFeGNlcHRp
b25Db2RlJiBlYykgeyByZXR1cm4gc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyLCBlYyk7IH0KLSAg
ICBQYXNzUmVmUHRyPEF0dHI+IHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciosIEV4Y2VwdGlvbkNv
ZGUmKTsKLSAgICAKLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24gKnN0eWxlKCk7Ci0K
LSAgICB2aXJ0dWFsIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUoKSBjb25zdCB7IHJldHVy
biBtX3RhZ05hbWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVGFnTmFtZShjb25zdCBRdWFsaWZp
ZWROYW1lJiB0YWdOYW1lKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubWF0Y2hlcyh0YWdOYW1l
KTsgfQotICAgIAotICAgIC8vIEEgZmFzdCBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgdGhlIGxvY2Fs
IG5hbWUgYWdhaW5zdCBhbm90aGVyIGF0b21pYyBzdHJpbmcuCi0gICAgYm9vbCBoYXNMb2NhbE5h
bWUoY29uc3QgQXRvbWljU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gbV90YWdOYW1lLmxv
Y2FsTmFtZSgpID09IG90aGVyOyB9Ci0gICAgYm9vbCBoYXNMb2NhbE5hbWUoY29uc3QgUXVhbGlm
aWVkTmFtZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKSA9PSBv
dGhlci5sb2NhbE5hbWUoKTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIGxv
Y2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKTsgfQotICAgIHZp
cnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJldHVybiBtX3RhZ05h
bWUucHJlZml4KCk7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0
cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubmFtZXNwYWNl
VVJJKCk7IH0KLSAgICAKLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVu
dCBjbGFzc2VzCi0gICAgdmlydHVhbCBOb2RlVHlwZSBub2RlVHlwZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBkZWVwKTsKLSAgICB2aXJ0dWFs
IFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VsZW1lbnROb2Rl
KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9E
b2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0KLSAg
ICAvLyBjb252ZW5pZW5jZSBtZXRob2RzIHdoaWNoIGlnbm9yZSBleGNlcHRpb25zCi0gICAgdm9p
ZCBzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIE5hbWVkQXR0ck1hcCAqYXR0cmlidXRlcygpIGNvbnN0Owot
ICAgIE5hbWVkQXR0ck1hcCogYXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBjb25zdDsKLQotICAg
IC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhdHRyaWJ1dGUgaXMgYWRkZWQs
IGNoYW5nZWQgb3IgcmVtb3ZlZC4KLSAgICB2aXJ0dWFsIHZvaWQgYXR0cmlidXRlQ2hhbmdlZChB
dHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZhbHNlKSB7fQotCi0gICAgLy8g
bm90IHBhcnQgb2YgdGhlIERPTQotICAgIHZvaWQgc2V0QXR0cmlidXRlTWFwKE5hbWVkQXR0ck1h
cCopOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNvbnN0
IEVsZW1lbnQgKnNvdXJjZSkge30KLSAgICAKLSAgICAvLyBTdGF0ZSBvZiB0aGUgZWxlbWVudC4K
LSAgICB2aXJ0dWFsIERlcHJlY2F0ZWRTdHJpbmcgc3RhdGUoKSB7IHJldHVybiBEZXByZWNhdGVk
U3RyaW5nOjpudWxsOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmlydHVh
bCBSZW5kZXJTdHlsZSAqY3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QgKnBhcmVu
dCk7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
ICosIFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVD
aGFuZ2UgPSBOb0NoYW5nZSApOwotCi0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQo
Tm9kZVR5cGUpOwotIAotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjcmVhdGVBdHRyaWJ1dGUoY29u
c3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpOwotICAgIAotICAgIHZv
aWQgZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7Ci0gICAgdm9pZCBk
aXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RXZlbnQpIHsgfQotCi0gICAgdmly
dHVhbCBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0
dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFsIHZv
aWQgZm9jdXMoKTsKLSAgICB2b2lkIGJsdXIoKTsKLSAgICAKLSNpZiAhTkRFQlVHCi0gICAgdmly
dHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRlZFN0cmluZyBpbmQg
PSAiIikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGZvcm1hdEZvckRlYnVnZ2VyKGNoYXIgKmJ1
ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKLSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gICAg
dmlydHVhbCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAgIFN0cmluZyBvcGVu
VGFnU3RhcnRUb1N0cmluZygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZvaWQgdXBkYXRlSWQo
Y29uc3QgQXRvbWljU3RyaW5nJiBvbGRJZCwgY29uc3QgQXRvbWljU3RyaW5nJiBuZXdJZCk7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0IHt9
Ci0KLXByb3RlY3RlZDogLy8gbWVtYmVyIHZhcmlhYmxlcwotICAgIG11dGFibGUgUmVmUHRyPE5h
bWVkQXR0ck1hcD4gbmFtZWRBdHRyTWFwOwotICAgIFF1YWxpZmllZE5hbWUgbV90YWdOYW1lOwot
fTsKLQotLy8gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQKLWNsYXNzIE5hbWVk
QXR0ck1hcCA6IHB1YmxpYyBOYW1lZE5vZGVNYXAgewotICAgIGZyaWVuZCBjbGFzcyBFbGVtZW50
OwotcHVibGljOgotICAgIE5hbWVkQXR0ck1hcChFbGVtZW50ICplKTsKLSAgICB2aXJ0dWFsIH5O
YW1lZEF0dHJNYXAoKTsKLSAgICBOYW1lZEF0dHJNYXAoY29uc3QgTmFtZWRBdHRyTWFwJik7Ci0g
ICAgTmFtZWRBdHRyTWFwICZvcGVyYXRvciA9KGNvbnN0IE5hbWVkQXR0ck1hcCAmb3RoZXIpOwot
Ci0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBOYW1lZE5vZGVNYXAKLQotICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1l
KSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVtKGNv
bnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVhbCBQYXNzUmVm
UHRyPE5vZGU+IGdldE5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25z
dCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+
IHJlbW92ZU5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJp
bmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRy
PE5vZGU+IGdldE5hbWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVtKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9k
ZT4gc2V0TmFtZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVh
bCBQYXNzUmVmUHRyPE5vZGU+IGl0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0OwotICAgIHVuc2ln
bmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbjsgfQotCi0gICAgLy8gT3RoZXIgbWV0aG9k
cyAobm90IHBhcnQgb2YgRE9NKQotICAgIEF0dHJpYnV0ZSogYXR0cmlidXRlSXRlbSh1bnNpZ25l
ZCBpbmRleCkgY29uc3QgeyByZXR1cm4gYXR0cnMgPyBhdHRyc1tpbmRleF0gOiAwOyB9Ci0gICAg
QXR0cmlidXRlKiBnZXRBdHRyaWJ1dGVJdGVtKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNv
bnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1JlYWRPbmx5KCkgeyByZXR1cm4gZWxlbWVudCA/IGVs
ZW1lbnQtPmlzUmVhZE9ubHkoKSA6IGZhbHNlOyB9Ci0KLSAgICAvLyB1c2VkIGR1cmluZyBwYXJz
aW5nOiBvbmx5IGluc2VydHMgaWYgbm90IGFscmVhZHkgdGhlcmUKLSAgICAvLyBubyBlcnJvciBj
aGVja2luZyEKLSAgICB2b2lkIGluc2VydEF0dHJpYnV0ZShBdHRyaWJ1dGUqIG5ld0F0dHJpYnV0
ZSkgewotICAgICAgICBhc3NlcnQoIWVsZW1lbnQpOwotICAgICAgICBpZiAoIWdldEF0dHJpYnV0
ZUl0ZW0obmV3QXR0cmlidXRlLT5uYW1lKCkpKQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKG5l
d0F0dHJpYnV0ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5ld0F0dHJpYnV0ZS0+ZGVy
ZWYoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBj
b25zdDsKLQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgaWQoKSBjb25zdCB7IHJldHVybiBtX2lk
OyB9Ci0gICAgdm9pZCBzZXRJRChjb25zdCBBdG9taWNTdHJpbmcmIF9pZCkgeyBtX2lkID0gX2lk
OyB9Ci0gICAgCi0gICAgYm9vbCBtYXBzRXF1aXZhbGVudChjb25zdCBOYW1lZEF0dHJNYXAqIG90
aGVyTWFwKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIC8vIHRoaXMgbWV0aG9kIGlzIGludGVy
bmFsLCBkb2VzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFsbAotICAgIHZvaWQgYWRkQXR0cmlidXRl
KEF0dHJpYnV0ZSogbmV3QXR0cmlidXRlKTsKLSAgICAvLyB0aGlzIG1ldGhvZCBpcyBpbnRlcm5h
bCwgZG9lcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwKLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0
ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdHRy
aWJ1dGVzKCk7Ci0gICAgdm9pZCBkZXRhY2hGcm9tRWxlbWVudCgpOwotCi0gICAgRWxlbWVudCAq
ZWxlbWVudDsKLSAgICBBdHRyaWJ1dGUgKiphdHRyczsKLSAgICB1bnNpZ25lZCBsZW47Ci0gICAg
QXRvbWljU3RyaW5nIG1faWQ7Ci19OwotCi0vLyBXaGVuIGFkZGluZyBuZXcgZW50cmllcywgbWFr
ZSBzdXJlIHRvIGtlZXAgZUxhc3RFbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgotZW51bSBN
YXBwZWRBdHRyaWJ1dGVFbnRyeSB7IGVOb25lLCBlVW5pdmVyc2FsLCBlUGVyc2lzdGVudCwgZVJl
cGxhY2VkLCBlQmxvY2ssIGVIUiwgZVVub3JkZXJlZExpc3QsIGVMaXN0SXRlbSwKLSAgICBlVGFi
bGUsIGVDZWxsLCBlQ2FwdGlvbiwgZUJETywgZVByZSwgZUxhc3RFbnRyeSB9OwotCi1jbGFzcyBD
U1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiA6IHB1YmxpYyBDU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbiB7Ci1wdWJsaWM6Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oQ1NT
UnVsZSAqcGFyZW50UnVsZSkKLSAgICA6IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKHBhcmVu
dFJ1bGUpLCBtX2VudHJ5VHlwZShlTm9uZSksIG1fYXR0ck5hbWUoYW55UU5hbWUoKSkKLSAgICB7
fQotICAgIAotICAgIHZpcnR1YWwgfkNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0K
LSAgICB2b2lkIHNldE1hcHBlZFN0YXRlKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIGNvbnN0
IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsKQotICAgIHsKLSAg
ICAgICAgbV9lbnRyeVR5cGUgPSB0eXBlOwotICAgICAgICBtX2F0dHJOYW1lID0gbmFtZTsKLSAg
ICAgICAgbV9hdHRyVmFsdWUgPSB2YWw7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIE1hcHBlZEF0
dHJpYnV0ZUVudHJ5IG1fZW50cnlUeXBlOwotICAgIFF1YWxpZmllZE5hbWUgbV9hdHRyTmFtZTsK
LSAgICBBdG9taWNTdHJpbmcgbV9hdHRyVmFsdWU7Ci19OwotCi1jbGFzcyBNYXBwZWRBdHRyaWJ1
dGUgOiBwdWJsaWMgQXR0cmlidXRlCi17Ci1wdWJsaWM6Ci0gICAgTWFwcGVkQXR0cmlidXRlKGNv
bnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUsIENTU01h
cHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gMCkKLSAgICA6IEF0dHJpYnV0ZShuYW1l
LCB2YWx1ZSksIG1fc3R5bGVEZWNsKGRlY2wpCi0gICAgewotICAgIH0KLQotICAgIE1hcHBlZEF0
dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFs
dWUsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gMCkKLSAgICA6IEF0dHJp
YnV0ZShuYW1lLCB2YWx1ZSksIG1fc3R5bGVEZWNsKGRlY2wpCi0gICAgewotICAgIH0KLQotICAg
IHZpcnR1YWwgQXR0cmlidXRlKiBjbG9uZShib29sIHByZXNlcnZlRGVjbD10cnVlKSBjb25zdDsK
LQotICAgIHZpcnR1YWwgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSBjb25zdCB7IHJldHVy
biBtX3N0eWxlRGVjbC5nZXQoKTsgfQotCi0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRp
b24qIGRlY2woKSBjb25zdCB7IHJldHVybiBtX3N0eWxlRGVjbC5nZXQoKTsgfQotICAgIHZvaWQg
c2V0RGVjbChDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCkgeyBtX3N0eWxlRGVj
bCA9IGRlY2w7IH0KLQotcHJpdmF0ZToKLSAgICBSZWZQdHI8Q1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb24+IG1fc3R5bGVEZWNsOwotfTsKLQotY2xhc3MgTmFtZWRNYXBwZWRBdHRyTWFwIDog
cHVibGljIE5hbWVkQXR0ck1hcAotewotcHVibGljOgotICAgIE5hbWVkTWFwcGVkQXR0ck1hcChF
bGVtZW50ICplKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgaXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VDbGFzc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIGNsYXNzQXR0
cik7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3QgeyBy
ZXR1cm4gJm1fY2xhc3NMaXN0OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGhhc01hcHBlZEF0
dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtX21hcHBlZEF0dHJpYnV0ZUNvdW50ID4gMDsgfQot
ICAgIHZvaWQgZGVjbFJlbW92ZWQoKSB7IG1fbWFwcGVkQXR0cmlidXRlQ291bnQtLTsgfQotICAg
IHZvaWQgZGVjbEFkZGVkKCkgeyBtX21hcHBlZEF0dHJpYnV0ZUNvdW50Kys7IH0KLSAgICAKLSAg
ICBib29sIG1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXAp
IGNvbnN0OwotICAgIGludCBkZWNsQ291bnQoKSBjb25zdDsKLQotICAgIE1hcHBlZEF0dHJpYnV0
ZSogYXR0cmlidXRlSXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLSAgICB7IHJldHVybiBhdHRy
cyA/IHN0YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+KGF0dHJzW2luZGV4XSkgOiAwOyB9Ci0g
ICAgCi1wcml2YXRlOgotICAgIEF0b21pY1N0cmluZ0xpc3QgbV9jbGFzc0xpc3Q7Ci0gICAgaW50
IG1fbWFwcGVkQXR0cmlidXRlQ291bnQ7Ci19OworY2xhc3MgQ1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb247CitjbGFzcyBNYXBwZWRBdHRyaWJ1dGU7CiAKIGNsYXNzIFN0eWxlZEVsZW1lbnQg
OiBwdWJsaWMgRWxlbWVudAogewpAQCAtNDU1LDYgKzg1LDQgQEAgcHJvdGVjdGVkOgogCiB9IC8v
bmFtZXNwYWNlCiAKLSN1bmRlZiBpZAotCiAjZW5kaWYKSW5kZXg6IGRvbS9ET01JbXBsZW1lbnRh
dGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0RPTUltcGxlbWVudGF0aW9uLmNwcAkocmV2aXNp
b24gMTM0NzcpCisrKyBkb20vRE9NSW1wbGVtZW50YXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiRE9NSW1wbGVtZW50YXRpb24uaCIKIAogI2luY2x1
ZGUgIkRvY3VtZW50VHlwZS5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJFeGNl
cHRpb25Db2RlLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlICJjc3Nf
c3R5bGVzaGVldGltcGwuaCIKSW5kZXg6IGRvbS9FbGVtZW50LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9t
L0VsZW1lbnQuaAkocmV2aXNpb24gMTM0NzcpCisrKyBkb20vRWxlbWVudC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0yNCwxMzEgKzI0LDE3IEBACiAgKgogICovCiAKLSNpZm5kZWYgRE9NX0VMRU1FTlRJ
TVBMX0gKLSNkZWZpbmUgRE9NX0VMRU1FTlRJTVBMX0gKKyNpZm5kZWYgRWxlbWVudF9oCisjZGVm
aW5lIEVsZW1lbnRfaAogCi0jaW5jbHVkZSAiQXRvbWljU3RyaW5nTGlzdC5oIgogI2luY2x1ZGUg
IkNvbnRhaW5lck5vZGUuaCIKLSNpbmNsdWRlICJOYW1lZE5vZGVNYXAuaCIKKyNpbmNsdWRlICJB
dHRyLmgiCiAjaW5jbHVkZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmluZ0ltcGwu
aCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCi0KLSNpZiBfX09CSkNfXwotI2RlZmluZSBp
ZCBpZF9BVk9JRF9LRVlXT1JECi0jZW5kaWYKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFz
cyBBdHRyOwotY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWNsYXNzIENTU1N0eWxlU2VsZWN0
b3I7Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgTmFtZWRBdHRyTWFwOwotCi0vLyB0aGlzIGhhcyBu
byBjb3VudGVycGFydCBpbiBET00sIHB1cmVseSBpbnRlcm5hbAotLy8gcmVwcmVzZW50YXRpb24g
b2YgdGhlIG5vZGV2YWx1ZSBvZiBhbiBBdHRyLgotLy8gdGhlIGFjdHVhbCBBdHRyIChBdHRyKSB3
aXRoIGl0cyB2YWx1ZSBhcyB0ZXh0Y2hpbGQKLS8vIGlzIG9ubHkgYWxsb2NhdGVkIG9uIGRlbWFu
ZCBieSB0aGUgRE9NIGJpbmRpbmdzLgotLy8gQW55IHVzZSBvZiBBdHRyIGluc2lkZSBraHRtbCBz
aG91bGQgYmUgYXZvaWRlZC4KLWNsYXNzIEF0dHJpYnV0ZSA6IHB1YmxpYyBTaGFyZWQ8QXR0cmli
dXRlPiB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsKLSAgICBmcmllbmQgY2xhc3Mg
RWxlbWVudDsKLSAgICBmcmllbmQgY2xhc3MgQXR0cjsKLQotcHVibGljOgotICAgIC8vIG51bGwg
dmFsdWUgaXMgZm9yYmlkZGVuICEKLSAgICBBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYg
bmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkKLSAgICAgICAgOiBtX25hbWUobmFtZSks
IG1fdmFsdWUodmFsdWUpLCBtX2ltcGwoMCkKLSAgICB7fQotICAgIAotICAgIEF0dHJpYnV0ZShj
b25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpCi0gICAg
ICAgIDogbV9uYW1lKG51bGxBdG9tLCBuYW1lLCBudWxsQXRvbSksIG1fdmFsdWUodmFsdWUpLCBt
X2ltcGwoMCkKLSAgICB7fQotCi0gICAgdmlydHVhbCB+QXR0cmlidXRlKCkgeyB9Ci0gICAgCi0g
ICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0K
LSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZS5w
cmVmaXgoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9uYW1lLmxvY2FsTmFtZSgpOyB9Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1l
c3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX25hbWUubmFtZXNwYWNlVVJJKCk7IH0KLSAgICAK
LSAgICBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9
Ci0gICAgCi0gICAgQXR0ciogYXR0cigpIGNvbnN0IHsgcmV0dXJuIG1faW1wbDsgfQotICAgIFBh
c3NSZWZQdHI8QXR0cj4gY3JlYXRlQXR0cklmTmVlZGVkKEVsZW1lbnQqIGUpOwotCi0gICAgYm9v
bCBpc051bGwoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlLmlzTnVsbCgpOyB9Ci0gICAgYm9vbCBp
c0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZS5pc0VtcHR5KCk7IH0KLSAgICAKLSAgICB2
aXJ0dWFsIEF0dHJpYnV0ZSogY2xvbmUoYm9vbCBwcmVzZXJ2ZURlY2w9dHJ1ZSkgY29uc3Q7Ci0K
LSAgICAvLyBBbiBleHRlbnNpb24gdG8gZ2V0IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBmb3IgcHJl
c2VudGF0aW9uYWwgYXR0cmlidXRlcy4KLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24q
IHN0eWxlKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIAotcHJpdmF0ZToKLSAgICB2b2lkIHNl
dFZhbHVlKGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9Ci0g
ICAgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgpIHsgbV9uYW1lLnNl
dFByZWZpeChwcmVmaXgpOyB9Ci0KLSAgICBRdWFsaWZpZWROYW1lIG1fbmFtZTsKLSAgICBBdG9t
aWNTdHJpbmcgbV92YWx1ZTsKLSAgICBBdHRyKiBtX2ltcGw7Ci19OwotCi0vLyBBdHRyIGNhbiBo
YXZlIFRleHQgYW5kIEVudGl0eVJlZmVyZW5jZSBjaGlsZHJlbgotLy8gdGhlcmVmb3JlIGl0IGhh
cyB0byBiZSBhIGZ1bGxibG93biBOb2RlLiBUaGUgcGxhbgotLy8gaXMgdG8gZHluYW1pY2FsbHkg
YWxsb2NhdGUgYSB0ZXh0Y2hpbGQgYW5kIHN0b3JlIHRoZQotLy8gcmVzdWx0aW5nIG5vZGV2YWx1
ZSBpbiB0aGUgQXR0cmlidXRlIHVwb24KLS8vIGRlc3RydWN0aW9uLiBob3dldmVyLCB0aGlzIGlz
IG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi1jbGFzcyBBdHRyIDogcHVibGljIENvbnRhaW5lck5vZGUg
ewotICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0KLXB1YmxpYzoKLSAgICBBdHRyKEVs
ZW1lbnQqLCBEb2N1bWVudCosIEF0dHJpYnV0ZSopOwotICAgIH5BdHRyKCk7Ci0KLSAgICAvLyBD
YWxsIHRoaXMgYWZ0ZXIgY2FsbGluZyB0aGUgY29uc3RydWN0b3Igc28gdGhlCi0gICAgLy8gQXR0
ciBub2RlIGlzbid0IGZsb2F0aW5nIHdoZW4gd2UgYXBwZW5kIHRoZSB0ZXh0IG5vZGUuCi0gICAg
dm9pZCBjcmVhdGVUZXh0Q2hpbGQoKTsKLSAgICAKLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJp
YnV0ZXMgZm9yIEF0dHIKLSAgICBTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHF1YWxpZmll
ZE5hbWUoKS50b1N0cmluZygpOyB9Ci0gICAgYm9vbCBzcGVjaWZpZWQoKSBjb25zdCB7IHJldHVy
biBtX3NwZWNpZmllZDsgfQotICAgIEVsZW1lbnQqIG93bmVyRWxlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIG1fZWxlbWVudDsgfQotCi0gICAgU3RyaW5nIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9h
dHRyaWJ1dGUtPnZhbHVlKCk7IH0KLSAgICB2b2lkIHNldFZhbHVlKGNvbnN0IFN0cmluZyYsIEV4
Y2VwdGlvbkNvZGUmKTsKLQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSBwYXJl
bnQgY2xhc3NlcwotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVOYW1lKCkgY29uc3Q7Ci0gICAgdmly
dHVhbCBOb2RlVHlwZSBub2RlVHlwZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZXNwYWNlVVJJKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcm
IHByZWZpeCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVmaXgoY29uc3QgQXRvbWlj
U3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdmlydHVhbCBTdHJpbmcgbm9kZVZhbHVl
KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldE5vZGVWYWx1ZShjb25zdCBTdHJpbmcmLCBF
eGNlcHRpb25Db2RlJik7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGNsb25lTm9kZShi
b29sIGRlZXApOwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAg
IHZpcnR1YWwgYm9vbCBpc0F0dHJpYnV0ZU5vZGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0g
ICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUpOwotCi0gICAgdmlydHVh
bCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIHZpcnR1YWwgU3RyaW5nIHRvU3RyaW5nKCkg
Y29uc3Q7Ci0KLSAgICBBdHRyaWJ1dGUqIGF0dHIoKSBjb25zdCB7IHJldHVybiBtX2F0dHJpYnV0
ZS5nZXQoKTsgfQotICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIHF1YWxpZmllZE5hbWUoKSBjb25z
dCB7IHJldHVybiBtX2F0dHJpYnV0ZS0+bmFtZSgpOyB9Ci0KLSAgICAvLyBBbiBleHRlbnNpb24g
dG8gZ2V0IHByZXNlbnRhdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhdHRyaWJ1dGVzLgotICAgIENT
U1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKCkgeyByZXR1cm4gbV9hdHRyaWJ1dGUtPnN0eWxlKCk7
IH0KLQotcHJpdmF0ZToKLSAgICBFbGVtZW50KiBtX2VsZW1lbnQ7Ci0gICAgUmVmUHRyPEF0dHJp
YnV0ZT4gbV9hdHRyaWJ1dGU7Ci0gICAgaW50IG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkOwotfTsK
K2NsYXNzIEF0b21pY1N0cmluZ0xpc3Q7CitjbGFzcyBBdHRyaWJ1dGU7CiAKIGNsYXNzIEVsZW1l
bnQgOiBwdWJsaWMgQ29udGFpbmVyTm9kZSB7CiAgICAgZnJpZW5kIGNsYXNzIERvY3VtZW50OwpA
QCAtMjcwLDE5MSArMTU2LDYgQEAgcHJvdGVjdGVkOiAvLyBtZW1iZXIgdmFyaWFibGVzCiAgICAg
UXVhbGlmaWVkTmFtZSBtX3RhZ05hbWU7CiB9OwogCi0vLyB0aGUgbWFwIG9mIGF0dHJpYnV0ZXMg
b2YgYW4gZWxlbWVudAotY2xhc3MgTmFtZWRBdHRyTWFwIDogcHVibGljIE5hbWVkTm9kZU1hcCB7
Ci0gICAgZnJpZW5kIGNsYXNzIEVsZW1lbnQ7Ci1wdWJsaWM6Ci0gICAgTmFtZWRBdHRyTWFwKEVs
ZW1lbnQgKmUpOwotICAgIHZpcnR1YWwgfk5hbWVkQXR0ck1hcCgpOwotICAgIE5hbWVkQXR0ck1h
cChjb25zdCBOYW1lZEF0dHJNYXAmKTsKLSAgICBOYW1lZEF0dHJNYXAgJm9wZXJhdG9yID0oY29u
c3QgTmFtZWRBdHRyTWFwICZvdGhlcik7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJpYnV0
ZXMgZm9yIE5hbWVkTm9kZU1hcAotCi0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGdldE5h
bWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxOb2RlPiByZW1vdmVOYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1lLCBFeGNlcHRpb25Db2Rl
Jik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVtTlMoY29uc3Qg
U3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gcmVtb3ZlTmFtZWRJdGVtTlMoY29uc3QgU3RyaW5n
JiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJik7
Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVtKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiByZW1v
dmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOwot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBzZXROYW1lZEl0ZW0oTm9kZSogYXJnLCBFeGNl
cHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gaXRlbSh1bnNpZ25l
ZCBpbmRleCkgY29uc3Q7Ci0gICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVu
OyB9Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgQXR0cmli
dXRlKiBhdHRyaWJ1dGVJdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiBhdHRycyA/
IGF0dHJzW2luZGV4XSA6IDA7IH0KLSAgICBBdHRyaWJ1dGUqIGdldEF0dHJpYnV0ZUl0ZW0oY29u
c3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzUmVhZE9u
bHkoKSB7IHJldHVybiBlbGVtZW50ID8gZWxlbWVudC0+aXNSZWFkT25seSgpIDogZmFsc2U7IH0K
LQotICAgIC8vIHVzZWQgZHVyaW5nIHBhcnNpbmc6IG9ubHkgaW5zZXJ0cyBpZiBub3QgYWxyZWFk
eSB0aGVyZQotICAgIC8vIG5vIGVycm9yIGNoZWNraW5nIQotICAgIHZvaWQgaW5zZXJ0QXR0cmli
dXRlKEF0dHJpYnV0ZSogbmV3QXR0cmlidXRlKSB7Ci0gICAgICAgIGFzc2VydCghZWxlbWVudCk7
Ci0gICAgICAgIGlmICghZ2V0QXR0cmlidXRlSXRlbShuZXdBdHRyaWJ1dGUtPm5hbWUoKSkpCi0g
ICAgICAgICAgICBhZGRBdHRyaWJ1dGUobmV3QXR0cmlidXRlKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgbmV3QXR0cmlidXRlLT5kZXJlZigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9v
bCBpc01hcHBlZEF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotCi0gICAgY29uc3QgQXRvbWljU3RyaW5n
JiBpZCgpIGNvbnN0IHsgcmV0dXJuIG1faWQ7IH0KLSAgICB2b2lkIHNldElEKGNvbnN0IEF0b21p
Y1N0cmluZyYgX2lkKSB7IG1faWQgPSBfaWQ7IH0KLSAgICAKLSAgICBib29sIG1hcHNFcXVpdmFs
ZW50KGNvbnN0IE5hbWVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgLy8gdGhpcyBtZXRob2QgaXMgaW50ZXJuYWwsIGRvZXMgbm8gZXJyb3IgY2hlY2tpbmcgYXQg
YWxsCi0gICAgdm9pZCBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlKiBuZXdBdHRyaWJ1dGUpOwotICAg
IC8vIHRoaXMgbWV0aG9kIGlzIGludGVybmFsLCBkb2VzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFs
bAotICAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpOwot
ICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICB2b2lkIGRldGFjaEZyb21F
bGVtZW50KCk7Ci0KLSAgICBFbGVtZW50ICplbGVtZW50OwotICAgIEF0dHJpYnV0ZSAqKmF0dHJz
OwotICAgIHVuc2lnbmVkIGxlbjsKLSAgICBBdG9taWNTdHJpbmcgbV9pZDsKLX07Ci0KLS8vIFdo
ZW4gYWRkaW5nIG5ldyBlbnRyaWVzLCBtYWtlIHN1cmUgdG8ga2VlcCBlTGFzdEVudHJ5IGF0IHRo
ZSBlbmQgb2YgdGhlIGxpc3QuCi1lbnVtIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHsgZU5vbmUsIGVV
bml2ZXJzYWwsIGVQZXJzaXN0ZW50LCBlUmVwbGFjZWQsIGVCbG9jaywgZUhSLCBlVW5vcmRlcmVk
TGlzdCwgZUxpc3RJdGVtLAotICAgIGVUYWJsZSwgZUNlbGwsIGVDYXB0aW9uLCBlQkRPLCBlUHJl
LCBlTGFzdEVudHJ5IH07Ci0KLWNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIDog
cHVibGljIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uIHsKLXB1YmxpYzoKLSAgICBDU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihDU1NSdWxlICpwYXJlbnRSdWxlKQotICAgIDogQ1NTTXV0
YWJsZVN0eWxlRGVjbGFyYXRpb24ocGFyZW50UnVsZSksIG1fZW50cnlUeXBlKGVOb25lKSwgbV9h
dHRyTmFtZShhbnlRTmFtZSgpKQotICAgIHt9Ci0gICAgCi0gICAgdmlydHVhbCB+Q1NTTWFwcGVk
QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgIHZvaWQgc2V0TWFwcGVkU3RhdGUoTWFwcGVk
QXR0cmlidXRlRW50cnkgdHlwZSwgY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgQXRv
bWljU3RyaW5nJiB2YWwpCi0gICAgewotICAgICAgICBtX2VudHJ5VHlwZSA9IHR5cGU7Ci0gICAg
ICAgIG1fYXR0ck5hbWUgPSBuYW1lOwotICAgICAgICBtX2F0dHJWYWx1ZSA9IHZhbDsKLSAgICB9
Ci0KLXByaXZhdGU6Ci0gICAgTWFwcGVkQXR0cmlidXRlRW50cnkgbV9lbnRyeVR5cGU7Ci0gICAg
UXVhbGlmaWVkTmFtZSBtX2F0dHJOYW1lOwotICAgIEF0b21pY1N0cmluZyBtX2F0dHJWYWx1ZTsK
LX07Ci0KLWNsYXNzIE1hcHBlZEF0dHJpYnV0ZSA6IHB1YmxpYyBBdHRyaWJ1dGUKLXsKLXB1Ymxp
YzoKLSAgICBNYXBwZWRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3Qg
QXRvbWljU3RyaW5nJiB2YWx1ZSwgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wg
PSAwKQotICAgIDogQXR0cmlidXRlKG5hbWUsIHZhbHVlKSwgbV9zdHlsZURlY2woZGVjbCkKLSAg
ICB7Ci0gICAgfQotCi0gICAgTWFwcGVkQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYgbmFt
ZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSwgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRp
b24qIGRlY2wgPSAwKQotICAgIDogQXR0cmlidXRlKG5hbWUsIHZhbHVlKSwgbV9zdHlsZURlY2wo
ZGVjbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBBdHRyaWJ1dGUqIGNsb25lKGJvb2wg
cHJlc2VydmVEZWNsPXRydWUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBDU1NTdHlsZURlY2xhcmF0
aW9uKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVEZWNsLmdldCgpOyB9Ci0KLSAgICBD
U1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5
bGVEZWNsLmdldCgpOyB9Ci0gICAgdm9pZCBzZXREZWNsKENTU01hcHBlZEF0dHJpYnV0ZURlY2xh
cmF0aW9uKiBkZWNsKSB7IG1fc3R5bGVEZWNsID0gZGVjbDsgfQotCi1wcml2YXRlOgotICAgIFJl
ZlB0cjxDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbj4gbV9zdHlsZURlY2w7Ci19OwotCi1j
bGFzcyBOYW1lZE1hcHBlZEF0dHJNYXAgOiBwdWJsaWMgTmFtZWRBdHRyTWFwCi17Ci1wdWJsaWM6
Ci0gICAgTmFtZWRNYXBwZWRBdHRyTWFwKEVsZW1lbnQgKmUpOwotCi0gICAgdmlydHVhbCB2b2lk
IGNsZWFyQXR0cmlidXRlcygpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc01hcHBlZEF0dHJp
YnV0ZU1hcCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBwYXJzZUNsYXNzQXR0cmli
dXRlKGNvbnN0IFN0cmluZyYgY2xhc3NBdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmdMaXN0
KiBnZXRDbGFzc0xpc3QoKSBjb25zdCB7IHJldHVybiAmbV9jbGFzc0xpc3Q7IH0KLSAgICAKLSAg
ICB2aXJ0dWFsIGJvb2wgaGFzTWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fbWFw
cGVkQXR0cmlidXRlQ291bnQgPiAwOyB9Ci0gICAgdm9pZCBkZWNsUmVtb3ZlZCgpIHsgbV9tYXBw
ZWRBdHRyaWJ1dGVDb3VudC0tOyB9Ci0gICAgdm9pZCBkZWNsQWRkZWQoKSB7IG1fbWFwcGVkQXR0
cmlidXRlQ291bnQrKzsgfQotICAgIAotICAgIGJvb2wgbWFwc0VxdWl2YWxlbnQoY29uc3QgTmFt
ZWRNYXBwZWRBdHRyTWFwKiBvdGhlck1hcCkgY29uc3Q7Ci0gICAgaW50IGRlY2xDb3VudCgpIGNv
bnN0OwotCi0gICAgTWFwcGVkQXR0cmlidXRlKiBhdHRyaWJ1dGVJdGVtKHVuc2lnbmVkIGluZGV4
KSBjb25zdAotICAgIHsgcmV0dXJuIGF0dHJzID8gc3RhdGljX2Nhc3Q8TWFwcGVkQXR0cmlidXRl
Kj4oYXR0cnNbaW5kZXhdKSA6IDA7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgQXRvbWljU3RyaW5n
TGlzdCBtX2NsYXNzTGlzdDsKLSAgICBpbnQgbV9tYXBwZWRBdHRyaWJ1dGVDb3VudDsKLX07Ci0K
LWNsYXNzIFN0eWxlZEVsZW1lbnQgOiBwdWJsaWMgRWxlbWVudAotewotcHVibGljOgotICAgIFN0
eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYyk7
Ci0gICAgdmlydHVhbCB+U3R5bGVkRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBib29sIGlzU3R5
bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIE5hbWVkTWFwcGVkQXR0
ck1hcCogbWFwcGVkQXR0cmlidXRlcygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE5hbWVkTWFwcGVk
QXR0ck1hcCo+KG5hbWVkQXR0ck1hcC5nZXQoKSk7IH0KLSAgICBjb25zdCBOYW1lZE1hcHBlZEF0
dHJNYXAqIG1hcHBlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxOYW1l
ZE1hcHBlZEF0dHJNYXAqPihuYW1lZEF0dHJNYXAuZ2V0KCkpOyB9Ci0gICAgYm9vbCBoYXNNYXBw
ZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbmFtZWRBdHRyTWFwICYmIG1hcHBlZEF0dHJp
YnV0ZXMoKS0+aGFzTWFwcGVkQXR0cmlidXRlcygpOyB9Ci0gICAgYm9vbCBpc01hcHBlZEF0dHJp
YnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdCB7IE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5IHJlcyA9IGVOb25lOyBtYXBUb0VudHJ5KG5hbWUsIHJlcyk7IHJldHVybiByZXMgIT0gZU5v
bmU7IH0KLQotICAgIHZvaWQgYWRkQ1NTTGVuZ3RoKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50
IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKTsKLSAgICB2b2lkIGFkZENTU1Byb3BlcnR5KE1hcHBl
ZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKTsKLSAgICB2b2lk
IGFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBpbnQgdmFsdWUp
OwotICAgIHZvaWQgYWRkQ1NTU3RyaW5nUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBp
bnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUsIENTU1ByaW1pdGl2ZVZhbHVlOjpVbml0VHlwZXMg
PSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1NUUklORyk7Ci0gICAgdm9pZCBhZGRDU1NJbWFnZVBy
b3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJlVSTCk7
Ci0gICAgdm9pZCBhZGRDU1NDb2xvcihNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29u
c3QgU3RyaW5nICZjKTsKLSAgICB2b2lkIGNyZWF0ZU1hcHBlZERlY2woTWFwcGVkQXR0cmlidXRl
KiBhdHRyKTsKLSAgICAKLSAgICBzdGF0aWMgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24q
IGdldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgQXR0cmli
dXRlKiBhdHRyKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBl
ZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIEF0dHJpYnV0ZSogYXR0ciwgQ1NTTWFwcGVkQXR0cmlidXRl
RGVjbGFyYXRpb24qIGRlY2wpOwotICAgIHN0YXRpYyB2b2lkIHJlbW92ZU1hcHBlZEF0dHJpYnV0
ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0clZhbHVlKTsKLSAgICAKLSAgICBDU1NNdXRh
YmxlU3R5bGVEZWNsYXJhdGlvbiogaW5saW5lU3R5bGVEZWNsKCkgY29uc3QgeyByZXR1cm4gbV9p
bmxpbmVTdHlsZURlY2wuZ2V0KCk7IH0KLSAgICB2aXJ0dWFsIENTU011dGFibGVTdHlsZURlY2xh
cmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCk7Ci0gICAgQ1NTTXV0YWJsZVN0
eWxlRGVjbGFyYXRpb24qIGdldElubGluZVN0eWxlRGVjbCgpOwotICAgIENTU1N0eWxlRGVjbGFy
YXRpb24qIHN0eWxlKCk7Ci0gICAgdm9pZCBjcmVhdGVJbmxpbmVTdHlsZURlY2woKTsKLSAgICB2
b2lkIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLSAgICB2b2lkIGludmFsaWRhdGVTdHlsZUF0
dHJpYnV0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVk
KCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmdMaXN0KiBnZXRD
bGFzc0xpc3QoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgYXR0cmlidXRlQ2hhbmdlZChBdHRy
aWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKiBhdHRyKTsKLSAgICB2aXJ0
dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVk
QXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGNyZWF0ZUF0
dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjcmVhdGVBdHRyaWJ1
dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpOwotCi1wcm90
ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtX2lubGluZVN0
eWxlRGVjbDsKLSAgICBtdXRhYmxlIGJvb2wgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQgOiAxOwot
ICAgIG11dGFibGUgYm9vbCBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA6IDE7Ci19Owot
CiB9IC8vbmFtZXNwYWNlCiAKLSN1bmRlZiBpZAotCiAjZW5kaWYKSW5kZXg6IGRvbS9FdmVudFRh
cmdldE5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9FdmVudFRhcmdldE5vZGUuY3BwCShyZXZp
c2lvbiAxMzQ3NykKKysrIGRvbS9FdmVudFRhcmdldE5vZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiRXZlbnRUYXJnZXROb2RlLmgiCiAKICNpbmNsdWRl
ICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJFdmVudExpc3Rl
bmVyLmgiCiAjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCkluZGV4
OiBkb20vQXR0cmlidXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0F0dHJpYnV0ZS5oCShyZXZpc2lv
biAxMzQ3NykKKysrIGRvbS9BdHRyaWJ1dGUuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsMjcgKzI0
LDE2IEBACiAgKgogICovCiAKLSNpZm5kZWYgRE9NX0VMRU1FTlRJTVBMX0gKLSNkZWZpbmUgRE9N
X0VMRU1FTlRJTVBMX0gKKyNpZm5kZWYgQXR0cmlidXRlX2gKKyNkZWZpbmUgQXR0cmlidXRlX2gK
IAotI2luY2x1ZGUgIkF0b21pY1N0cmluZ0xpc3QuaCIKLSNpbmNsdWRlICJDb250YWluZXJOb2Rl
LmgiCi0jaW5jbHVkZSAiTmFtZWROb2RlTWFwLmgiCisjaW5jbHVkZSAiU2hhcmVkLmgiCiAjaW5j
bHVkZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKLSNpbmNsdWRl
ICJjc3NfdmFsdWVpbXBsLmgiCi0KLSNpZiBfX09CSkNfXwotI2RlZmluZSBpZCBpZF9BVk9JRF9L
RVlXT1JECi0jZW5kaWYKKyNpbmNsdWRlIDxreG1sY29yZS9QYXNzUmVmUHRyLmg+CiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQXR0cjsKIGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb247
Ci1jbGFzcyBDU1NTdHlsZVNlbGVjdG9yOwotY2xhc3MgRWxlbWVudDsKLWNsYXNzIE5hbWVkQXR0
ck1hcDsKIAogLy8gdGhpcyBoYXMgbm8gY291bnRlcnBhcnQgaW4gRE9NLCBwdXJlbHkgaW50ZXJu
YWwKIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RldmFsdWUgb2YgYW4gQXR0ci4KQEAgLTk1
LDM2NiArODQsNiBAQCBwcml2YXRlOgogICAgIEF0dHIqIG1faW1wbDsKIH07CiAKLS8vIEF0dHIg
Y2FuIGhhdmUgVGV4dCBhbmQgRW50aXR5UmVmZXJlbmNlIGNoaWxkcmVuCi0vLyB0aGVyZWZvcmUg
aXQgaGFzIHRvIGJlIGEgZnVsbGJsb3duIE5vZGUuIFRoZSBwbGFuCi0vLyBpcyB0byBkeW5hbWlj
YWxseSBhbGxvY2F0ZSBhIHRleHRjaGlsZCBhbmQgc3RvcmUgdGhlCi0vLyByZXN1bHRpbmcgbm9k
ZXZhbHVlIGluIHRoZSBBdHRyaWJ1dGUgdXBvbgotLy8gZGVzdHJ1Y3Rpb24uIGhvd2V2ZXIsIHRo
aXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KLWNsYXNzIEF0dHIgOiBwdWJsaWMgQ29udGFpbmVy
Tm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsKLQotcHVibGljOgotICAgIEF0
dHIoRWxlbWVudCosIERvY3VtZW50KiwgQXR0cmlidXRlKik7Ci0gICAgfkF0dHIoKTsKLQotICAg
IC8vIENhbGwgdGhpcyBhZnRlciBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciBzbyB0aGUKLSAgICAv
LyBBdHRyIG5vZGUgaXNuJ3QgZmxvYXRpbmcgd2hlbiB3ZSBhcHBlbmQgdGhlIHRleHQgbm9kZS4K
LSAgICB2b2lkIGNyZWF0ZVRleHRDaGlsZCgpOwotICAgIAotICAgIC8vIERPTSBtZXRob2RzICYg
YXR0cmlidXRlcyBmb3IgQXR0cgotICAgIFN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gcXVh
bGlmaWVkTmFtZSgpLnRvU3RyaW5nKCk7IH0KLSAgICBib29sIHNwZWNpZmllZCgpIGNvbnN0IHsg
cmV0dXJuIG1fc3BlY2lmaWVkOyB9Ci0gICAgRWxlbWVudCogb3duZXJFbGVtZW50KCkgY29uc3Qg
eyByZXR1cm4gbV9lbGVtZW50OyB9Ci0KLSAgICBTdHJpbmcgdmFsdWUoKSBjb25zdCB7IHJldHVy
biBtX2F0dHJpYnV0ZS0+dmFsdWUoKTsgfQotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5n
JiwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9t
IHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBTdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIE5vZGVUeXBlIG5vZGVUeXBlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBB
dG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0
cmluZyYgcHJlZml4KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFByZWZpeChjb25zdCBB
dG9taWNTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBub2Rl
VmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Tm9kZVZhbHVlKGNvbnN0IFN0cmlu
ZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gY2xvbmVO
b2RlKGJvb2wgZGVlcCk7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00p
Ci0gICAgdmlydHVhbCBib29sIGlzQXR0cmlidXRlTm9kZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSk7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgdG9TdHJp
bmcoKSBjb25zdDsKLQotICAgIEF0dHJpYnV0ZSogYXR0cigpIGNvbnN0IHsgcmV0dXJuIG1fYXR0
cmlidXRlLmdldCgpOyB9Ci0gICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgcXVhbGlmaWVkTmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYXR0cmlidXRlLT5uYW1lKCk7IH0KLQotICAgIC8vIEFuIGV4dGVu
c2lvbiB0byBnZXQgcHJlc2VudGF0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGF0dHJpYnV0ZXMuCi0g
ICAgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSB7IHJldHVybiBtX2F0dHJpYnV0ZS0+c3R5
bGUoKTsgfQotCi1wcml2YXRlOgotICAgIEVsZW1lbnQqIG1fZWxlbWVudDsKLSAgICBSZWZQdHI8
QXR0cmlidXRlPiBtX2F0dHJpYnV0ZTsKLSAgICBpbnQgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQ7
Ci19OwotCi1jbGFzcyBFbGVtZW50IDogcHVibGljIENvbnRhaW5lck5vZGUgewotICAgIGZyaWVu
ZCBjbGFzcyBEb2N1bWVudDsKLSAgICBmcmllbmQgY2xhc3MgTmFtZWRBdHRyTWFwOwotICAgIGZy
aWVuZCBjbGFzcyBBdHRyOwotICAgIGZyaWVuZCBjbGFzcyBOb2RlOwotICAgIGZyaWVuZCBjbGFz
cyBDU1NTdHlsZVNlbGVjdG9yOwotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3QgUXVhbGlmaWVk
TmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkVsZW1lbnQoKTsKLQotICAgIC8v
IFVzZWQgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBoYXMg
YSBnaXZlbiBDU1MgY2xhc3MuCi0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmdMaXN0KiBn
ZXRDbGFzc0xpc3QoKSBjb25zdDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldElEQXR0cmli
dXRlKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYg
bmFtZSkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBnZXRBdHRyaWJ1dGUoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBdHRyaWJ1dGUoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsK
LSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNl
cHRpb25Db2RlJik7Ci0KLSAgICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdDsKLQotICAgIGJv
b2wgaGFzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgYm9vbCBoYXNB
dHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2Nh
bE5hbWUpIGNvbnN0OwotCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBnZXRBdHRyaWJ1dGUoY29u
c3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJp
YnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFt
ZSkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2b2lkIHNldEF0dHJpYnV0
ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIHF1YWxpZmllZE5h
bWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZvaWQgc2Ny
b2xsSW50b1ZpZXcgKGJvb2wgYWxpZ25Ub1RvcCk7Ci0gICAgdm9pZCBzY3JvbGxJbnRvVmlld0lm
TmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQpOwotCi0gICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUo
Y29uc3QgU3RyaW5nICZuYW1lLCBFeGNlcHRpb25Db2RlJiBlYyk7Ci0gICAgdm9pZCByZW1vdmVB
dHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2Nh
bE5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIFBhc3NSZWZQdHI8QXR0cj4gZ2V0QXR0cmli
dXRlTm9kZShjb25zdCBTdHJpbmcmIG5hbWUpOwotICAgIFBhc3NSZWZQdHI8QXR0cj4gZ2V0QXR0
cmlidXRlTm9kZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxv
Y2FsTmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIqLCBF
eGNlcHRpb25Db2RlJik7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBzZXRBdHRyaWJ1dGVOb2RlTlMo
QXR0ciogbmV3QXR0ciwgRXhjZXB0aW9uQ29kZSYgZWMpIHsgcmV0dXJuIHNldEF0dHJpYnV0ZU5v
ZGUobmV3QXR0ciwgZWMpOyB9Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiByZW1vdmVBdHRyaWJ1dGVO
b2RlKEF0dHIqLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgCi0gICAgdmlydHVhbCBDU1NTdHlsZURl
Y2xhcmF0aW9uICpzdHlsZSgpOwotCi0gICAgdmlydHVhbCBjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbV90YWdOYW1lOyB9Ci0gICAgdmlydHVhbCBib29sIGhh
c1RhZ05hbWUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSkgY29uc3QgeyByZXR1cm4gbV90
YWdOYW1lLm1hdGNoZXModGFnTmFtZSk7IH0KLSAgICAKLSAgICAvLyBBIGZhc3QgZnVuY3Rpb24g
Zm9yIGNoZWNraW5nIHRoZSBsb2NhbCBuYW1lIGFnYWluc3QgYW5vdGhlciBhdG9taWMgc3RyaW5n
LgotICAgIGJvb2wgaGFzTG9jYWxOYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKSA9PSBvdGhlcjsgfQotICAgIGJvb2wgaGFz
TG9jYWxOYW1lKGNvbnN0IFF1YWxpZmllZE5hbWUmIG90aGVyKSBjb25zdCB7IHJldHVybiBtX3Rh
Z05hbWUubG9jYWxOYW1lKCkgPT0gb3RoZXIubG9jYWxOYW1lKCk7IH0KLQotICAgIHZpcnR1YWwg
Y29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUu
bG9jYWxOYW1lKCk7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KCkg
Y29uc3QgeyByZXR1cm4gbV90YWdOYW1lLnByZWZpeCgpOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNl
dFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2VwdGlvbkNvZGUmKTsKLSAg
ICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29uc3QgeyByZXR1
cm4gbV90YWdOYW1lLm5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgCi0gICAgLy8gRE9NIG1ldGhvZHMg
b3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgTm9kZVR5cGUgbm9k
ZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gY2xvbmVOb2RlKGJv
b2wgZGVlcCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgaXNFbGVtZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0
dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotCi0gICAgLy8gY29udmVuaWVuY2UgbWV0aG9kcyB3aGljaCBpZ25v
cmUgZXhjZXB0aW9ucwotICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpOwotCi0gICAgdmlydHVhbCBOYW1lZEF0dHJNYXAg
KmF0dHJpYnV0ZXMoKSBjb25zdDsKLSAgICBOYW1lZEF0dHJNYXAqIGF0dHJpYnV0ZXMoYm9vbCBy
ZWFkb25seSkgY29uc3Q7Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIg
YW4gYXR0cmlidXRlIGlzIGFkZGVkLCBjaGFuZ2VkIG9yIHJlbW92ZWQuCi0gICAgdmlydHVhbCB2
b2lkIGF0dHJpYnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRyLCBib29sIHByZXNlcnZlRGVjbHMg
PSBmYWxzZSkge30KLQotICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBET00KLSAgICB2b2lkIHNldEF0
dHJpYnV0ZU1hcChOYW1lZEF0dHJNYXAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjb3B5Tm9uQXR0
cmlidXRlUHJvcGVydGllcyhjb25zdCBFbGVtZW50ICpzb3VyY2UpIHt9Ci0gICAgCi0gICAgLy8g
U3RhdGUgb2YgdGhlIGVsZW1lbnQuCi0gICAgdmlydHVhbCBEZXByZWNhdGVkU3RyaW5nIHN0YXRl
KCkgeyByZXR1cm4gRGVwcmVjYXRlZFN0cmluZzo6bnVsbDsgfQotCi0gICAgdmlydHVhbCB2b2lk
IGF0dGFjaCgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUgKmNyZWF0ZVN0eWxlRm9yUmVuZGVy
ZXIoUmVuZGVyT2JqZWN0ICpwYXJlbnQpOwotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVh
dGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlID0gTm9DaGFuZ2UgKTsKLQotICAgIHZpcnR1YWwg
Ym9vbCBjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlKTsKLSAKLSAgICB2aXJ0dWFsIEF0dHJpYnV0
ZSogY3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwq
IHZhbHVlKTsKLSAgICAKLSAgICB2b2lkIGRpc3BhdGNoQXR0clJlbW92YWxFdmVudChBdHRyaWJ1
dGUgKmF0dHIpOwotICAgIHZvaWQgZGlzcGF0Y2hBdHRyQWRkaXRpb25FdmVudChBdHRyaWJ1dGUg
KmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0Fu
eUV2ZW50KSB7IH0KLQotICAgIHZpcnR1YWwgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdDsKLSAg
ICAgICAgCi0gICAgdmlydHVhbCB2b2lkIGZvY3VzKCk7Ci0gICAgdm9pZCBibHVyKCk7Ci0gICAg
Ci0jaWYgIU5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0s
IERlcHJlY2F0ZWRTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBmb3Jt
YXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7Ci0jZW5k
aWYKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBdHRyaWJ1dGVNYXAoKSBj
b25zdDsKLSAgICBTdHJpbmcgb3BlblRhZ1N0YXJ0VG9TdHJpbmcoKSBjb25zdDsKLQotcHJpdmF0
ZToKLSAgICB2b2lkIHVwZGF0ZUlkKGNvbnN0IEF0b21pY1N0cmluZyYgb2xkSWQsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmV3SWQpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0eWxlQXR0cmli
dXRlSWZOZWVkZWQoKSBjb25zdCB7fQotCi1wcm90ZWN0ZWQ6IC8vIG1lbWJlciB2YXJpYWJsZXMK
LSAgICBtdXRhYmxlIFJlZlB0cjxOYW1lZEF0dHJNYXA+IG5hbWVkQXR0ck1hcDsKLSAgICBRdWFs
aWZpZWROYW1lIG1fdGFnTmFtZTsKLX07Ci0KLS8vIHRoZSBtYXAgb2YgYXR0cmlidXRlcyBvZiBh
biBlbGVtZW50Ci1jbGFzcyBOYW1lZEF0dHJNYXAgOiBwdWJsaWMgTmFtZWROb2RlTWFwIHsKLSAg
ICBmcmllbmQgY2xhc3MgRWxlbWVudDsKLXB1YmxpYzoKLSAgICBOYW1lZEF0dHJNYXAoRWxlbWVu
dCAqZSk7Ci0gICAgdmlydHVhbCB+TmFtZWRBdHRyTWFwKCk7Ci0gICAgTmFtZWRBdHRyTWFwKGNv
bnN0IE5hbWVkQXR0ck1hcCYpOwotICAgIE5hbWVkQXR0ck1hcCAmb3BlcmF0b3IgPShjb25zdCBO
YW1lZEF0dHJNYXAgJm90aGVyKTsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBm
b3IgTmFtZWROb2RlTWFwCi0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJ
dGVtKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5v
ZGU+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsK
LQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW1OUyhjb25zdCBTdHJp
bmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0OwotICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxOb2RlPiByZW1vdmVOYW1lZEl0ZW1OUyhjb25zdCBTdHJpbmcmIG5h
bWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVk
TmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IHJlbW92ZU5h
bWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2RlJik7Ci0gICAg
dmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IHNldE5hbWVkSXRlbShOb2RlKiBhcmcsIEV4Y2VwdGlv
bkNvZGUmKTsKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBpdGVtKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBsZW47IH0K
LQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICBBdHRyaWJ1dGUq
IGF0dHJpYnV0ZUl0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0dHJzID8gYXR0
cnNbaW5kZXhdIDogMDsgfQotICAgIEF0dHJpYnV0ZSogZ2V0QXR0cmlidXRlSXRlbShjb25zdCBR
dWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgp
IHsgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50LT5pc1JlYWRPbmx5KCkgOiBmYWxzZTsgfQotCi0g
ICAgLy8gdXNlZCBkdXJpbmcgcGFyc2luZzogb25seSBpbnNlcnRzIGlmIG5vdCBhbHJlYWR5IHRo
ZXJlCi0gICAgLy8gbm8gZXJyb3IgY2hlY2tpbmchCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUo
QXR0cmlidXRlKiBuZXdBdHRyaWJ1dGUpIHsKLSAgICAgICAgYXNzZXJ0KCFlbGVtZW50KTsKLSAg
ICAgICAgaWYgKCFnZXRBdHRyaWJ1dGVJdGVtKG5ld0F0dHJpYnV0ZS0+bmFtZSgpKSkKLSAgICAg
ICAgICAgIGFkZEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUpOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBuZXdBdHRyaWJ1dGUtPmRlcmVmKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlz
TWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGlk
KCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQotICAgIHZvaWQgc2V0SUQoY29uc3QgQXRvbWljU3Ry
aW5nJiBfaWQpIHsgbV9pZCA9IF9pZDsgfQotICAgIAotICAgIGJvb2wgbWFwc0VxdWl2YWxlbnQo
Y29uc3QgTmFtZWRBdHRyTWFwKiBvdGhlck1hcCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICAv
LyB0aGlzIG1ldGhvZCBpcyBpbnRlcm5hbCwgZG9lcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwK
LSAgICB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUqIG5ld0F0dHJpYnV0ZSk7Ci0gICAgLy8g
dGhpcyBtZXRob2QgaXMgaW50ZXJuYWwsIGRvZXMgbm8gZXJyb3IgY2hlY2tpbmcgYXQgYWxsCi0g
ICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSk7Ci0gICAg
dmlydHVhbCB2b2lkIGNsZWFyQXR0cmlidXRlcygpOwotICAgIHZvaWQgZGV0YWNoRnJvbUVsZW1l
bnQoKTsKLQotICAgIEVsZW1lbnQgKmVsZW1lbnQ7Ci0gICAgQXR0cmlidXRlICoqYXR0cnM7Ci0g
ICAgdW5zaWduZWQgbGVuOwotICAgIEF0b21pY1N0cmluZyBtX2lkOwotfTsKLQotLy8gV2hlbiBh
ZGRpbmcgbmV3IGVudHJpZXMsIG1ha2Ugc3VyZSB0byBrZWVwIGVMYXN0RW50cnkgYXQgdGhlIGVu
ZCBvZiB0aGUgbGlzdC4KLWVudW0gTWFwcGVkQXR0cmlidXRlRW50cnkgeyBlTm9uZSwgZVVuaXZl
cnNhbCwgZVBlcnNpc3RlbnQsIGVSZXBsYWNlZCwgZUJsb2NrLCBlSFIsIGVVbm9yZGVyZWRMaXN0
LCBlTGlzdEl0ZW0sCi0gICAgZVRhYmxlLCBlQ2VsbCwgZUNhcHRpb24sIGVCRE8sIGVQcmUsIGVM
YXN0RW50cnkgfTsKLQotY2xhc3MgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24gOiBwdWJs
aWMgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24gewotcHVibGljOgotICAgIENTU01hcHBlZEF0
dHJpYnV0ZURlY2xhcmF0aW9uKENTU1J1bGUgKnBhcmVudFJ1bGUpCi0gICAgOiBDU1NNdXRhYmxl
U3R5bGVEZWNsYXJhdGlvbihwYXJlbnRSdWxlKSwgbV9lbnRyeVR5cGUoZU5vbmUpLCBtX2F0dHJO
YW1lKGFueVFOYW1lKCkpCi0gICAge30KLSAgICAKLSAgICB2aXJ0dWFsIH5DU1NNYXBwZWRBdHRy
aWJ1dGVEZWNsYXJhdGlvbigpOwotCi0gICAgdm9pZCBzZXRNYXBwZWRTdGF0ZShNYXBwZWRBdHRy
aWJ1dGVFbnRyeSB0eXBlLCBjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBBdG9taWNT
dHJpbmcmIHZhbCkKLSAgICB7Ci0gICAgICAgIG1fZW50cnlUeXBlID0gdHlwZTsKLSAgICAgICAg
bV9hdHRyTmFtZSA9IG5hbWU7Ci0gICAgICAgIG1fYXR0clZhbHVlID0gdmFsOwotICAgIH0KLQot
cHJpdmF0ZToKLSAgICBNYXBwZWRBdHRyaWJ1dGVFbnRyeSBtX2VudHJ5VHlwZTsKLSAgICBRdWFs
aWZpZWROYW1lIG1fYXR0ck5hbWU7Ci0gICAgQXRvbWljU3RyaW5nIG1fYXR0clZhbHVlOwotfTsK
LQotY2xhc3MgTWFwcGVkQXR0cmlidXRlIDogcHVibGljIEF0dHJpYnV0ZQotewotcHVibGljOgot
ICAgIE1hcHBlZEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBBdG9t
aWNTdHJpbmcmIHZhbHVlLCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9IDAp
Ci0gICAgOiBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpLCBtX3N0eWxlRGVjbChkZWNsKQotICAgIHsK
LSAgICB9Ci0KLSAgICBNYXBwZWRBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBj
b25zdCBBdG9taWNTdHJpbmcmIHZhbHVlLCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiog
ZGVjbCA9IDApCi0gICAgOiBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpLCBtX3N0eWxlRGVjbChkZWNs
KQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSogY2xvbmUoYm9vbCBwcmVz
ZXJ2ZURlY2w9dHJ1ZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24q
IHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZURlY2wuZ2V0KCk7IH0KLQotICAgIENTU01h
cHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZURl
Y2wuZ2V0KCk7IH0KLSAgICB2b2lkIHNldERlY2woQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRp
b24qIGRlY2wpIHsgbV9zdHlsZURlY2wgPSBkZWNsOyB9Ci0KLXByaXZhdGU6Ci0gICAgUmVmUHRy
PENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uPiBtX3N0eWxlRGVjbDsKLX07Ci0KLWNsYXNz
IE5hbWVkTWFwcGVkQXR0ck1hcCA6IHB1YmxpYyBOYW1lZEF0dHJNYXAKLXsKLXB1YmxpYzoKLSAg
ICBOYW1lZE1hcHBlZEF0dHJNYXAoRWxlbWVudCAqZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xl
YXJBdHRyaWJ1dGVzKCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzTWFwcGVkQXR0cmlidXRl
TWFwKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHBhcnNlQ2xhc3NBdHRyaWJ1dGUo
Y29uc3QgU3RyaW5nJiBjbGFzc0F0dHIpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIGdl
dENsYXNzTGlzdCgpIGNvbnN0IHsgcmV0dXJuICZtX2NsYXNzTGlzdDsgfQotICAgIAotICAgIHZp
cnR1YWwgYm9vbCBoYXNNYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbV9tYXBwZWRB
dHRyaWJ1dGVDb3VudCA+IDA7IH0KLSAgICB2b2lkIGRlY2xSZW1vdmVkKCkgeyBtX21hcHBlZEF0
dHJpYnV0ZUNvdW50LS07IH0KLSAgICB2b2lkIGRlY2xBZGRlZCgpIHsgbV9tYXBwZWRBdHRyaWJ1
dGVDb3VudCsrOyB9Ci0gICAgCi0gICAgYm9vbCBtYXBzRXF1aXZhbGVudChjb25zdCBOYW1lZE1h
cHBlZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdDsKLSAgICBpbnQgZGVjbENvdW50KCkgY29uc3Q7
Ci0KLSAgICBNYXBwZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZUl0ZW0odW5zaWduZWQgaW5kZXgpIGNv
bnN0Ci0gICAgeyByZXR1cm4gYXR0cnMgPyBzdGF0aWNfY2FzdDxNYXBwZWRBdHRyaWJ1dGUqPihh
dHRyc1tpbmRleF0pIDogMDsgfQotICAgIAotcHJpdmF0ZToKLSAgICBBdG9taWNTdHJpbmdMaXN0
IG1fY2xhc3NMaXN0OwotICAgIGludCBtX21hcHBlZEF0dHJpYnV0ZUNvdW50OwotfTsKLQotY2xh
c3MgU3R5bGVkRWxlbWVudCA6IHB1YmxpYyBFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgU3R5bGVk
RWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jKTsKLSAg
ICB2aXJ0dWFsIH5TdHlsZWRFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHlsZWRF
bGVtZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgTmFtZWRNYXBwZWRBdHRyTWFw
KiBtYXBwZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8TmFtZWRNYXBwZWRBdHRy
TWFwKj4obmFtZWRBdHRyTWFwLmdldCgpKTsgfQotICAgIGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1h
cCogbWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PE5hbWVkTWFw
cGVkQXR0ck1hcCo+KG5hbWVkQXR0ck1hcC5nZXQoKSk7IH0KLSAgICBib29sIGhhc01hcHBlZEF0
dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBuYW1lZEF0dHJNYXAgJiYgbWFwcGVkQXR0cmlidXRl
cygpLT5oYXNNYXBwZWRBdHRyaWJ1dGVzKCk7IH0KLSAgICBib29sIGlzTWFwcGVkQXR0cmlidXRl
KGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0IHsgTWFwcGVkQXR0cmlidXRlRW50cnkg
cmVzID0gZU5vbmU7IG1hcFRvRW50cnkobmFtZSwgcmVzKTsgcmV0dXJuIHJlcyAhPSBlTm9uZTsg
fQotCi0gICAgdm9pZCBhZGRDU1NMZW5ndGgoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQs
IGNvbnN0IFN0cmluZyAmdmFsdWUpOwotICAgIHZvaWQgYWRkQ1NTUHJvcGVydHkoTWFwcGVkQXR0
cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUpOwotICAgIHZvaWQgYWRk
Q1NTUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGludCB2YWx1ZSk7Ci0g
ICAgdm9pZCBhZGRDU1NTdHJpbmdQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBp
ZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWU6OlVuaXRUeXBlcyA9IENT
U1ByaW1pdGl2ZVZhbHVlOjpDU1NfU1RSSU5HKTsKLSAgICB2b2lkIGFkZENTU0ltYWdlUHJvcGVy
dHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmVVJMKTsKLSAg
ICB2b2lkIGFkZENTU0NvbG9yKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBT
dHJpbmcgJmMpOwotICAgIHZvaWQgY3JlYXRlTWFwcGVkRGVjbChNYXBwZWRBdHRyaWJ1dGUqIGF0
dHIpOwotICAgIAotICAgIHN0YXRpYyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZ2V0
TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0eXBlLCBBdHRyaWJ1dGUq
IGF0dHIpOwotICAgIHN0YXRpYyB2b2lkIHNldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0
cmlidXRlRW50cnkgdHlwZSwgQXR0cmlidXRlKiBhdHRyLCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNs
YXJhdGlvbiogZGVjbCk7Ci0gICAgc3RhdGljIHZvaWQgcmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVj
bChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0eXBlLCBjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFt
ZSwgY29uc3QgQXRvbWljU3RyaW5nJiBhdHRyVmFsdWUpOwotICAgIAotICAgIENTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uKiBpbmxpbmVTdHlsZURlY2woKSBjb25zdCB7IHJldHVybiBtX2lubGlu
ZVN0eWxlRGVjbC5nZXQoKTsgfQotICAgIHZpcnR1YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b24qIGFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKTsKLSAgICBDU1NNdXRhYmxlU3R5bGVE
ZWNsYXJhdGlvbiogZ2V0SW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgQ1NTU3R5bGVEZWNsYXJhdGlv
biogc3R5bGUoKTsKLSAgICB2b2lkIGNyZWF0ZUlubGluZVN0eWxlRGVjbCgpOwotICAgIHZvaWQg
ZGVzdHJveUlubGluZVN0eWxlRGVjbCgpOwotICAgIHZvaWQgaW52YWxpZGF0ZVN0eWxlQXR0cmli
dXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBj
b25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIGdldENsYXNz
TGlzdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBhdHRyaWJ1dGVDaGFuZ2VkKEF0dHJpYnV0
ZSogYXR0ciwgYm9vbCBwcmVzZXJ2ZURlY2xzID0gZmFsc2UpOwotICAgIHZpcnR1YWwgdm9pZCBw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIpOwotICAgIHZpcnR1YWwg
Ym9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRy
aWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQXR0cmli
dXRlTWFwKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBBdHRyaWJ1dGUqIGNyZWF0ZUF0dHJpYnV0ZShj
b25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSk7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+IG1faW5saW5lU3R5bGVE
ZWNsOwotICAgIG11dGFibGUgYm9vbCBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCA6IDE7Ci0gICAg
bXV0YWJsZSBib29sIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlIDogMTsKLX07Ci0KIH0g
Ly9uYW1lc3BhY2UKIAotI3VuZGVmIGlkCi0KICNlbmRpZgpJbmRleDogZG9tL0NTU01hcHBlZEF0
dHJpYnV0ZURlY2xhcmF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0NTU01hcHBlZEF0dHJpYnV0
ZURlY2xhcmF0aW9uLmgJKHJldmlzaW9uIDEzNDc3KQorKysgZG9tL0NTU01hcHBlZEF0dHJpYnV0
ZURlY2xhcmF0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTI0LDMxNiArMjQsMTQgQEAKICAqCiAg
Ki8KIAotI2lmbmRlZiBET01fRUxFTUVOVElNUExfSAotI2RlZmluZSBET01fRUxFTUVOVElNUExf
SAorI2lmbmRlZiBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbl9oCisjZGVmaW5lIENTU01h
cHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uX2gKIAotI2luY2x1ZGUgIkF0b21pY1N0cmluZ0xpc3Qu
aCIKLSNpbmNsdWRlICJDb250YWluZXJOb2RlLmgiCi0jaW5jbHVkZSAiTmFtZWROb2RlTWFwLmgi
Ci0jaW5jbHVkZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKICNp
bmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCi0KLSNpZiBfX09CSkNfXwotI2RlZmluZSBpZCBpZF9B
Vk9JRF9LRVlXT1JECi0jZW5kaWYKKyNpbmNsdWRlICJNYXBwZWRBdHRyaWJ1dGVFbnRyeS5oIgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEF0dHI7Ci1jbGFzcyBDU1NTdHlsZURlY2xh
cmF0aW9uOwotY2xhc3MgQ1NTU3R5bGVTZWxlY3RvcjsKLWNsYXNzIEVsZW1lbnQ7Ci1jbGFzcyBO
YW1lZEF0dHJNYXA7Ci0KLS8vIHRoaXMgaGFzIG5vIGNvdW50ZXJwYXJ0IGluIERPTSwgcHVyZWx5
IGludGVybmFsCi0vLyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbm9kZXZhbHVlIG9mIGFuIEF0dHIu
Ci0vLyB0aGUgYWN0dWFsIEF0dHIgKEF0dHIpIHdpdGggaXRzIHZhbHVlIGFzIHRleHRjaGlsZAot
Ly8gaXMgb25seSBhbGxvY2F0ZWQgb24gZGVtYW5kIGJ5IHRoZSBET00gYmluZGluZ3MuCi0vLyBB
bnkgdXNlIG9mIEF0dHIgaW5zaWRlIGtodG1sIHNob3VsZCBiZSBhdm9pZGVkLgotY2xhc3MgQXR0
cmlidXRlIDogcHVibGljIFNoYXJlZDxBdHRyaWJ1dGU+IHsKLSAgICBmcmllbmQgY2xhc3MgTmFt
ZWRBdHRyTWFwOwotICAgIGZyaWVuZCBjbGFzcyBFbGVtZW50OwotICAgIGZyaWVuZCBjbGFzcyBB
dHRyOwotCi1wdWJsaWM6Ci0gICAgLy8gbnVsbCB2YWx1ZSBpcyBmb3JiaWRkZW4gIQotICAgIEF0
dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZh
bHVlKQotICAgICAgICA6IG1fbmFtZShuYW1lKSwgbV92YWx1ZSh2YWx1ZSksIG1faW1wbCgwKQot
ICAgIHt9Ci0gICAgCi0gICAgQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29u
c3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkKLSAgICAgICAgOiBtX25hbWUobnVsbEF0b20sIG5hbWUs
IG51bGxBdG9tKSwgbV92YWx1ZSh2YWx1ZSksIG1faW1wbCgwKQotICAgIHt9Ci0KLSAgICB2aXJ0
dWFsIH5BdHRyaWJ1dGUoKSB7IH0KLSAgICAKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVl
KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHJl
Zml4KCkgY29uc3QgeyByZXR1cm4gbV9uYW1lLnByZWZpeCgpOyB9Ci0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWUubG9jYWxOYW1lKCk7IH0K
LSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVSSSgpIGNvbnN0IHsgcmV0dXJuIG1f
bmFtZS5uYW1lc3BhY2VVUkkoKTsgfQotICAgIAotICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5h
bWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KLSAgICAKLSAgICBBdHRyKiBhdHRyKCkgY29u
c3QgeyByZXR1cm4gbV9pbXBsOyB9Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBjcmVhdGVBdHRySWZO
ZWVkZWQoRWxlbWVudCogZSk7Ci0KLSAgICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIG1f
dmFsdWUuaXNOdWxsKCk7IH0KLSAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3Zh
bHVlLmlzRW1wdHkoKTsgfQotICAgIAotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjbG9uZShib29s
IHByZXNlcnZlRGVjbD10cnVlKSBjb25zdDsKLQotICAgIC8vIEFuIGV4dGVuc2lvbiB0byBnZXQg
dGhlIHN0eWxlIGluZm9ybWF0aW9uIGZvciBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzLgotICAg
IHZpcnR1YWwgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSBjb25zdCB7IHJldHVybiAwOyB9
Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgQXRvbWljU3RyaW5nJiB2
YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0KLSAgICB2b2lkIHNldFByZWZpeChjb25zdCBBdG9t
aWNTdHJpbmcmIHByZWZpeCkgeyBtX25hbWUuc2V0UHJlZml4KHByZWZpeCk7IH0KLQotICAgIFF1
YWxpZmllZE5hbWUgbV9uYW1lOwotICAgIEF0b21pY1N0cmluZyBtX3ZhbHVlOwotICAgIEF0dHIq
IG1faW1wbDsKLX07Ci0KLS8vIEF0dHIgY2FuIGhhdmUgVGV4dCBhbmQgRW50aXR5UmVmZXJlbmNl
IGNoaWxkcmVuCi0vLyB0aGVyZWZvcmUgaXQgaGFzIHRvIGJlIGEgZnVsbGJsb3duIE5vZGUuIFRo
ZSBwbGFuCi0vLyBpcyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIHRleHRjaGlsZCBhbmQgc3Rv
cmUgdGhlCi0vLyByZXN1bHRpbmcgbm9kZXZhbHVlIGluIHRoZSBBdHRyaWJ1dGUgdXBvbgotLy8g
ZGVzdHJ1Y3Rpb24uIGhvd2V2ZXIsIHRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KLWNsYXNz
IEF0dHIgOiBwdWJsaWMgQ29udGFpbmVyTm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0
ck1hcDsKLQotcHVibGljOgotICAgIEF0dHIoRWxlbWVudCosIERvY3VtZW50KiwgQXR0cmlidXRl
Kik7Ci0gICAgfkF0dHIoKTsKLQotICAgIC8vIENhbGwgdGhpcyBhZnRlciBjYWxsaW5nIHRoZSBj
b25zdHJ1Y3RvciBzbyB0aGUKLSAgICAvLyBBdHRyIG5vZGUgaXNuJ3QgZmxvYXRpbmcgd2hlbiB3
ZSBhcHBlbmQgdGhlIHRleHQgbm9kZS4KLSAgICB2b2lkIGNyZWF0ZVRleHRDaGlsZCgpOwotICAg
IAotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgQXR0cgotICAgIFN0cmluZyBu
YW1lKCkgY29uc3QgeyByZXR1cm4gcXVhbGlmaWVkTmFtZSgpLnRvU3RyaW5nKCk7IH0KLSAgICBi
b29sIHNwZWNpZmllZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3BlY2lmaWVkOyB9Ci0gICAgRWxlbWVu
dCogb3duZXJFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9Ci0KLSAgICBTdHJp
bmcgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2F0dHJpYnV0ZS0+dmFsdWUoKTsgfQotICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgLy8gRE9N
IG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tIHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBTdHJp
bmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVUeXBlIG5vZGVUeXBlKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KCkgY29uc3Q7Ci0gICAgdmlydHVh
bCB2b2lkIHNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0K
LSAgICB2aXJ0dWFsIFN0cmluZyBub2RlVmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQg
c2V0Tm9kZVZhbHVlKGNvbnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8Tm9kZT4gY2xvbmVOb2RlKGJvb2wgZGVlcCk7Ci0KLSAgICAvLyBPdGhlciBt
ZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlzQXR0cmlidXRlTm9k
ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRUeXBlQWxs
b3dlZChOb2RlVHlwZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0g
ICAgdmlydHVhbCBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKLQotICAgIEF0dHJpYnV0ZSogYXR0
cigpIGNvbnN0IHsgcmV0dXJuIG1fYXR0cmlidXRlLmdldCgpOyB9Ci0gICAgY29uc3QgUXVhbGlm
aWVkTmFtZSYgcXVhbGlmaWVkTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXR0cmlidXRlLT5uYW1l
KCk7IH0KLQotICAgIC8vIEFuIGV4dGVuc2lvbiB0byBnZXQgcHJlc2VudGF0aW9uYWwgaW5mb3Jt
YXRpb24gZm9yIGF0dHJpYnV0ZXMuCi0gICAgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSB7
IHJldHVybiBtX2F0dHJpYnV0ZS0+c3R5bGUoKTsgfQotCi1wcml2YXRlOgotICAgIEVsZW1lbnQq
IG1fZWxlbWVudDsKLSAgICBSZWZQdHI8QXR0cmlidXRlPiBtX2F0dHJpYnV0ZTsKLSAgICBpbnQg
bV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQ7Ci19OwotCi1jbGFzcyBFbGVtZW50IDogcHVibGljIENv
bnRhaW5lck5vZGUgewotICAgIGZyaWVuZCBjbGFzcyBEb2N1bWVudDsKLSAgICBmcmllbmQgY2xh
c3MgTmFtZWRBdHRyTWFwOwotICAgIGZyaWVuZCBjbGFzcyBBdHRyOwotICAgIGZyaWVuZCBjbGFz
cyBOb2RlOwotICAgIGZyaWVuZCBjbGFzcyBDU1NTdHlsZVNlbGVjdG9yOwotcHVibGljOgotICAg
IEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYyk7Ci0g
ICAgfkVsZW1lbnQoKTsKLQotICAgIC8vIFVzZWQgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhl
ciBvciBub3QgYW4gZWxlbWVudCBoYXMgYSBnaXZlbiBDU1MgY2xhc3MuCi0gICAgdmlydHVhbCBj
b25zdCBBdG9taWNTdHJpbmdMaXN0KiBnZXRDbGFzc0xpc3QoKSBjb25zdDsKLSAgICBjb25zdCBB
dG9taWNTdHJpbmcmIGdldElEQXR0cmlidXRlKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNBdHRyaWJ1
dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBnZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCog
dmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBR
dWFsaWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBib29sIGhhc0F0dHJp
YnV0ZXMoKSBjb25zdDsKLQotICAgIGJvb2wgaGFzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFt
ZSkgY29uc3Q7Ci0gICAgYm9vbCBoYXNBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFj
ZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0OwotCi0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBnZXRBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJ
LCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldEF0dHJpYnV0
ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUm
KTsKLSAgICB2b2lkIHNldEF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBj
b25zdCBTdHJpbmcmIHF1YWxpZmllZE5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlv
bkNvZGUmKTsKLQotICAgIHZvaWQgc2Nyb2xsSW50b1ZpZXcgKGJvb2wgYWxpZ25Ub1RvcCk7Ci0g
ICAgdm9pZCBzY3JvbGxJbnRvVmlld0lmTmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQpOwotCi0g
ICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoY29uc3QgU3RyaW5nICZuYW1lLCBFeGNlcHRpb25Db2Rl
JiBlYyk7Ci0gICAgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcgJm5hbWVzcGFj
ZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIFBh
c3NSZWZQdHI8QXR0cj4gZ2V0QXR0cmlidXRlTm9kZShjb25zdCBTdHJpbmcmIG5hbWUpOwotICAg
IFBhc3NSZWZQdHI8QXR0cj4gZ2V0QXR0cmlidXRlTm9kZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNw
YWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBz
ZXRBdHRyaWJ1dGVOb2RlKEF0dHIqLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgUGFzc1JlZlB0cjxB
dHRyPiBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciogbmV3QXR0ciwgRXhjZXB0aW9uQ29kZSYgZWMp
IHsgcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGUobmV3QXR0ciwgZWMpOyB9Ci0gICAgUGFzc1JlZlB0
cjxBdHRyPiByZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIqLCBFeGNlcHRpb25Db2RlJik7Ci0gICAg
Ci0gICAgdmlydHVhbCBDU1NTdHlsZURlY2xhcmF0aW9uICpzdHlsZSgpOwotCi0gICAgdmlydHVh
bCBjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbV90YWdOYW1l
OyB9Ci0gICAgdmlydHVhbCBib29sIGhhc1RhZ05hbWUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFn
TmFtZSkgY29uc3QgeyByZXR1cm4gbV90YWdOYW1lLm1hdGNoZXModGFnTmFtZSk7IH0KLSAgICAK
LSAgICAvLyBBIGZhc3QgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBsb2NhbCBuYW1lIGFnYWlu
c3QgYW5vdGhlciBhdG9taWMgc3RyaW5nLgotICAgIGJvb2wgaGFzTG9jYWxOYW1lKGNvbnN0IEF0
b21pY1N0cmluZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKSA9
PSBvdGhlcjsgfQotICAgIGJvb2wgaGFzTG9jYWxOYW1lKGNvbnN0IFF1YWxpZmllZE5hbWUmIG90
aGVyKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubG9jYWxOYW1lKCkgPT0gb3RoZXIubG9jYWxO
YW1lKCk7IH0KLQotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBj
b25zdCB7IHJldHVybiBtX3RhZ05hbWUubG9jYWxOYW1lKCk7IH0KLSAgICB2aXJ0dWFsIGNvbnN0
IEF0b21pY1N0cmluZyYgcHJlZml4KCkgY29uc3QgeyByZXR1cm4gbV90YWdOYW1lLnByZWZpeCgp
OyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVm
aXgsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFt
ZXNwYWNlVVJJKCkgY29uc3QgeyByZXR1cm4gbV90YWdOYW1lLm5hbWVzcGFjZVVSSSgpOyB9Ci0g
ICAgCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3Nlcwot
ICAgIHZpcnR1YWwgTm9kZVR5cGUgbm9kZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NS
ZWZQdHI8Tm9kZT4gY2xvbmVOb2RlKGJvb2wgZGVlcCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgbm9k
ZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNFbGVtZW50Tm9kZSgpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsK
LSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotCi0gICAgLy8gY29udmVu
aWVuY2UgbWV0aG9kcyB3aGljaCBpZ25vcmUgZXhjZXB0aW9ucwotICAgIHZvaWQgc2V0QXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpOwotCi0g
ICAgdmlydHVhbCBOYW1lZEF0dHJNYXAgKmF0dHJpYnV0ZXMoKSBjb25zdDsKLSAgICBOYW1lZEF0
dHJNYXAqIGF0dHJpYnV0ZXMoYm9vbCByZWFkb25seSkgY29uc3Q7Ci0KLSAgICAvLyBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gYXR0cmlidXRlIGlzIGFkZGVkLCBjaGFuZ2VkIG9y
IHJlbW92ZWQuCi0gICAgdmlydHVhbCB2b2lkIGF0dHJpYnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBh
dHRyLCBib29sIHByZXNlcnZlRGVjbHMgPSBmYWxzZSkge30KLQotICAgIC8vIG5vdCBwYXJ0IG9m
IHRoZSBET00KLSAgICB2b2lkIHNldEF0dHJpYnV0ZU1hcChOYW1lZEF0dHJNYXAqKTsKLQotICAg
IHZpcnR1YWwgdm9pZCBjb3B5Tm9uQXR0cmlidXRlUHJvcGVydGllcyhjb25zdCBFbGVtZW50ICpz
b3VyY2UpIHt9Ci0gICAgCi0gICAgLy8gU3RhdGUgb2YgdGhlIGVsZW1lbnQuCi0gICAgdmlydHVh
bCBEZXByZWNhdGVkU3RyaW5nIHN0YXRlKCkgeyByZXR1cm4gRGVwcmVjYXRlZFN0cmluZzo6bnVs
bDsgfQotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5
bGUgKmNyZWF0ZVN0eWxlRm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0ICpwYXJlbnQpOwotICAgIHZp
cnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJT
dHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlID0gTm9D
aGFuZ2UgKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlKTsK
LSAKLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSogY3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmll
ZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlKTsKLSAgICAKLSAgICB2b2lkIGRpc3BhdGNo
QXR0clJlbW92YWxFdmVudChBdHRyaWJ1dGUgKmF0dHIpOwotICAgIHZvaWQgZGlzcGF0Y2hBdHRy
QWRkaXRpb25FdmVudChBdHRyaWJ1dGUgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vz
c0tleUFjdGlvbihib29sIHNlbmRUb0FueUV2ZW50KSB7IH0KLQotICAgIHZpcnR1YWwgU3RyaW5n
IHRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0
cmlidXRlICphdHRyKSBjb25zdDsKLSAgICAgICAgCi0gICAgdmlydHVhbCB2b2lkIGZvY3VzKCk7
Ci0gICAgdm9pZCBibHVyKCk7Ci0gICAgCi0jaWYgIU5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBk
dW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kID0gIiIpIGNvbnN0
OwotICAgIHZpcnR1YWwgdm9pZCBmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2ln
bmVkIGxlbmd0aCkgY29uc3Q7Ci0jZW5kaWYKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9p
ZCBjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICBTdHJpbmcgb3BlblRhZ1N0YXJ0VG9T
dHJpbmcoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHVwZGF0ZUlkKGNvbnN0IEF0b21p
Y1N0cmluZyYgb2xkSWQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmV3SWQpOwotCi0gICAgdmlydHVh
bCB2b2lkIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBjb25zdCB7fQotCi1wcm90ZWN0
ZWQ6IC8vIG1lbWJlciB2YXJpYWJsZXMKLSAgICBtdXRhYmxlIFJlZlB0cjxOYW1lZEF0dHJNYXA+
IG5hbWVkQXR0ck1hcDsKLSAgICBRdWFsaWZpZWROYW1lIG1fdGFnTmFtZTsKLX07Ci0KLS8vIHRo
ZSBtYXAgb2YgYXR0cmlidXRlcyBvZiBhbiBlbGVtZW50Ci1jbGFzcyBOYW1lZEF0dHJNYXAgOiBw
dWJsaWMgTmFtZWROb2RlTWFwIHsKLSAgICBmcmllbmQgY2xhc3MgRWxlbWVudDsKLXB1YmxpYzoK
LSAgICBOYW1lZEF0dHJNYXAoRWxlbWVudCAqZSk7Ci0gICAgdmlydHVhbCB+TmFtZWRBdHRyTWFw
KCk7Ci0gICAgTmFtZWRBdHRyTWFwKGNvbnN0IE5hbWVkQXR0ck1hcCYpOwotICAgIE5hbWVkQXR0
ck1hcCAmb3BlcmF0b3IgPShjb25zdCBOYW1lZEF0dHJNYXAgJm90aGVyKTsKLQotICAgIC8vIERP
TSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgTmFtZWROb2RlTWFwCi0KLSAgICB2aXJ0dWFsIFBh
c3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0g
ICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBTdHJpbmcm
IG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBn
ZXROYW1lZEl0ZW1OUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBs
b2NhbE5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiByZW1vdmVOYW1l
ZEl0ZW1OUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5h
bWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXRO
YW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQ
YXNzUmVmUHRyPE5vZGU+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
LCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IHNldE5hbWVk
SXRlbShOb2RlKiBhcmcsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0
cjxOb2RlPiBpdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKLSAgICB1bnNpZ25lZCBsZW5ndGgo
KSBjb25zdCB7IHJldHVybiBsZW47IH0KLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0
IG9mIERPTSkKLSAgICBBdHRyaWJ1dGUqIGF0dHJpYnV0ZUl0ZW0odW5zaWduZWQgaW5kZXgpIGNv
bnN0IHsgcmV0dXJuIGF0dHJzID8gYXR0cnNbaW5kZXhdIDogMDsgfQotICAgIEF0dHJpYnV0ZSog
Z2V0QXR0cmlidXRlSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdDsKLSAgICB2
aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgpIHsgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50LT5pc1Jl
YWRPbmx5KCkgOiBmYWxzZTsgfQotCi0gICAgLy8gdXNlZCBkdXJpbmcgcGFyc2luZzogb25seSBp
bnNlcnRzIGlmIG5vdCBhbHJlYWR5IHRoZXJlCi0gICAgLy8gbm8gZXJyb3IgY2hlY2tpbmchCi0g
ICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUoQXR0cmlidXRlKiBuZXdBdHRyaWJ1dGUpIHsKLSAgICAg
ICAgYXNzZXJ0KCFlbGVtZW50KTsKLSAgICAgICAgaWYgKCFnZXRBdHRyaWJ1dGVJdGVtKG5ld0F0
dHJpYnV0ZS0+bmFtZSgpKSkKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXdBdHRyaWJ1dGUtPmRlcmVmKCk7Ci0gICAg
fQotCi0gICAgdmlydHVhbCBib29sIGlzTWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3Q7Ci0KLSAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGlkKCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQotICAgIHZv
aWQgc2V0SUQoY29uc3QgQXRvbWljU3RyaW5nJiBfaWQpIHsgbV9pZCA9IF9pZDsgfQotICAgIAot
ICAgIGJvb2wgbWFwc0VxdWl2YWxlbnQoY29uc3QgTmFtZWRBdHRyTWFwKiBvdGhlck1hcCkgY29u
c3Q7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyB0aGlzIG1ldGhvZCBpcyBpbnRlcm5hbCwgZG9lcyBu
byBlcnJvciBjaGVja2luZyBhdCBhbGwKLSAgICB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUq
IG5ld0F0dHJpYnV0ZSk7Ci0gICAgLy8gdGhpcyBtZXRob2QgaXMgaW50ZXJuYWwsIGRvZXMgbm8g
ZXJyb3IgY2hlY2tpbmcgYXQgYWxsCi0gICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoY29uc3QgUXVh
bGlmaWVkTmFtZSYgbmFtZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNsZWFyQXR0cmlidXRlcygpOwot
ICAgIHZvaWQgZGV0YWNoRnJvbUVsZW1lbnQoKTsKLQotICAgIEVsZW1lbnQgKmVsZW1lbnQ7Ci0g
ICAgQXR0cmlidXRlICoqYXR0cnM7Ci0gICAgdW5zaWduZWQgbGVuOwotICAgIEF0b21pY1N0cmlu
ZyBtX2lkOwotfTsKLQotLy8gV2hlbiBhZGRpbmcgbmV3IGVudHJpZXMsIG1ha2Ugc3VyZSB0byBr
ZWVwIGVMYXN0RW50cnkgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLWVudW0gTWFwcGVkQXR0cmli
dXRlRW50cnkgeyBlTm9uZSwgZVVuaXZlcnNhbCwgZVBlcnNpc3RlbnQsIGVSZXBsYWNlZCwgZUJs
b2NrLCBlSFIsIGVVbm9yZGVyZWRMaXN0LCBlTGlzdEl0ZW0sCi0gICAgZVRhYmxlLCBlQ2VsbCwg
ZUNhcHRpb24sIGVCRE8sIGVQcmUsIGVMYXN0RW50cnkgfTsKLQogY2xhc3MgQ1NTTWFwcGVkQXR0
cmlidXRlRGVjbGFyYXRpb24gOiBwdWJsaWMgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24gewog
cHVibGljOgogICAgIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKENTU1J1bGUgKnBhcmVu
dFJ1bGUpCkBAIC0zNTUsMTA2ICs1Myw2IEBAIHByaXZhdGU6CiAgICAgQXRvbWljU3RyaW5nIG1f
YXR0clZhbHVlOwogfTsKIAotY2xhc3MgTWFwcGVkQXR0cmlidXRlIDogcHVibGljIEF0dHJpYnV0
ZQotewotcHVibGljOgotICAgIE1hcHBlZEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBu
YW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlLCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbiogZGVjbCA9IDApCi0gICAgOiBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpLCBtX3N0eWxlRGVj
bChkZWNsKQotICAgIHsKLSAgICB9Ci0KLSAgICBNYXBwZWRBdHRyaWJ1dGUoY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlLCBDU1NNYXBwZWRBdHRyaWJ1
dGVEZWNsYXJhdGlvbiogZGVjbCA9IDApCi0gICAgOiBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpLCBt
X3N0eWxlRGVjbChkZWNsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSog
Y2xvbmUoYm9vbCBwcmVzZXJ2ZURlY2w9dHJ1ZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIENTU1N0
eWxlRGVjbGFyYXRpb24qIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZURlY2wuZ2V0KCk7
IH0KLQotICAgIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdHlsZURlY2wuZ2V0KCk7IH0KLSAgICB2b2lkIHNldERlY2woQ1NTTWFwcGVkQXR0
cmlidXRlRGVjbGFyYXRpb24qIGRlY2wpIHsgbV9zdHlsZURlY2wgPSBkZWNsOyB9Ci0KLXByaXZh
dGU6Ci0gICAgUmVmUHRyPENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uPiBtX3N0eWxlRGVj
bDsKLX07Ci0KLWNsYXNzIE5hbWVkTWFwcGVkQXR0ck1hcCA6IHB1YmxpYyBOYW1lZEF0dHJNYXAK
LXsKLXB1YmxpYzoKLSAgICBOYW1lZE1hcHBlZEF0dHJNYXAoRWxlbWVudCAqZSk7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlz
TWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3Q7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHBhcnNl
Q2xhc3NBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBjbGFzc0F0dHIpOwotICAgIGNvbnN0IEF0b21p
Y1N0cmluZ0xpc3QqIGdldENsYXNzTGlzdCgpIGNvbnN0IHsgcmV0dXJuICZtX2NsYXNzTGlzdDsg
fQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBoYXNNYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9tYXBwZWRBdHRyaWJ1dGVDb3VudCA+IDA7IH0KLSAgICB2b2lkIGRlY2xSZW1vdmVk
KCkgeyBtX21hcHBlZEF0dHJpYnV0ZUNvdW50LS07IH0KLSAgICB2b2lkIGRlY2xBZGRlZCgpIHsg
bV9tYXBwZWRBdHRyaWJ1dGVDb3VudCsrOyB9Ci0gICAgCi0gICAgYm9vbCBtYXBzRXF1aXZhbGVu
dChjb25zdCBOYW1lZE1hcHBlZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdDsKLSAgICBpbnQgZGVj
bENvdW50KCkgY29uc3Q7Ci0KLSAgICBNYXBwZWRBdHRyaWJ1dGUqIGF0dHJpYnV0ZUl0ZW0odW5z
aWduZWQgaW5kZXgpIGNvbnN0Ci0gICAgeyByZXR1cm4gYXR0cnMgPyBzdGF0aWNfY2FzdDxNYXBw
ZWRBdHRyaWJ1dGUqPihhdHRyc1tpbmRleF0pIDogMDsgfQotICAgIAotcHJpdmF0ZToKLSAgICBB
dG9taWNTdHJpbmdMaXN0IG1fY2xhc3NMaXN0OwotICAgIGludCBtX21hcHBlZEF0dHJpYnV0ZUNv
dW50OwotfTsKLQotY2xhc3MgU3R5bGVkRWxlbWVudCA6IHB1YmxpYyBFbGVtZW50Ci17Ci1wdWJs
aWM6Ci0gICAgU3R5bGVkRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudCAqZG9jKTsKLSAgICB2aXJ0dWFsIH5TdHlsZWRFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFs
IGJvb2wgaXNTdHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgTmFt
ZWRNYXBwZWRBdHRyTWFwKiBtYXBwZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8
TmFtZWRNYXBwZWRBdHRyTWFwKj4obmFtZWRBdHRyTWFwLmdldCgpKTsgfQotICAgIGNvbnN0IE5h
bWVkTWFwcGVkQXR0ck1hcCogbWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PE5hbWVkTWFwcGVkQXR0ck1hcCo+KG5hbWVkQXR0ck1hcC5nZXQoKSk7IH0KLSAgICBi
b29sIGhhc01hcHBlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBuYW1lZEF0dHJNYXAgJiYg
bWFwcGVkQXR0cmlidXRlcygpLT5oYXNNYXBwZWRBdHRyaWJ1dGVzKCk7IH0KLSAgICBib29sIGlz
TWFwcGVkQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0IHsgTWFwcGVk
QXR0cmlidXRlRW50cnkgcmVzID0gZU5vbmU7IG1hcFRvRW50cnkobmFtZSwgcmVzKTsgcmV0dXJu
IHJlcyAhPSBlTm9uZTsgfQotCi0gICAgdm9pZCBhZGRDU1NMZW5ndGgoTWFwcGVkQXR0cmlidXRl
KiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUpOwotICAgIHZvaWQgYWRkQ1NTUHJv
cGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUp
OwotICAgIHZvaWQgYWRkQ1NTUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQs
IGludCB2YWx1ZSk7Ci0gICAgdm9pZCBhZGRDU1NTdHJpbmdQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1
dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWU6
OlVuaXRUeXBlcyA9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfU1RSSU5HKTsKLSAgICB2b2lkIGFk
ZENTU0ltYWdlUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0
cmluZyAmVVJMKTsKLSAgICB2b2lkIGFkZENTU0NvbG9yKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwg
aW50IGlkLCBjb25zdCBTdHJpbmcgJmMpOwotICAgIHZvaWQgY3JlYXRlTWFwcGVkRGVjbChNYXBw
ZWRBdHRyaWJ1dGUqIGF0dHIpOwotICAgIAotICAgIHN0YXRpYyBDU1NNYXBwZWRBdHRyaWJ1dGVE
ZWNsYXJhdGlvbiogZ2V0TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0
eXBlLCBBdHRyaWJ1dGUqIGF0dHIpOwotICAgIHN0YXRpYyB2b2lkIHNldE1hcHBlZEF0dHJpYnV0
ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgdHlwZSwgQXR0cmlidXRlKiBhdHRyLCBDU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCk7Ci0gICAgc3RhdGljIHZvaWQgcmVtb3ZlTWFw
cGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0eXBlLCBjb25zdCBRdWFsaWZp
ZWROYW1lJiBhdHRyTmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiBhdHRyVmFsdWUpOwotICAgIAot
ICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBpbmxpbmVTdHlsZURlY2woKSBjb25zdCB7
IHJldHVybiBtX2lubGluZVN0eWxlRGVjbC5nZXQoKTsgfQotICAgIHZpcnR1YWwgQ1NTTXV0YWJs
ZVN0eWxlRGVjbGFyYXRpb24qIGFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKTsKLSAgICBD
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogZ2V0SW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgQ1NT
U3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKTsKLSAgICB2b2lkIGNyZWF0ZUlubGluZVN0eWxlRGVj
bCgpOwotICAgIHZvaWQgZGVzdHJveUlubGluZVN0eWxlRGVjbCgpOwotICAgIHZvaWQgaW52YWxp
ZGF0ZVN0eWxlQXR0cmlidXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0eWxlQXR0cmli
dXRlSWZOZWVkZWQoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmlu
Z0xpc3QqIGdldENsYXNzTGlzdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBhdHRyaWJ1dGVD
aGFuZ2VkKEF0dHJpYnV0ZSogYXR0ciwgYm9vbCBwcmVzZXJ2ZURlY2xzID0gZmFsc2UpOwotICAg
IHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIp
OwotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJO
YW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZv
aWQgY3JlYXRlQXR0cmlidXRlTWFwKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBBdHRyaWJ1dGUqIGNy
ZWF0ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1
ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+
IG1faW5saW5lU3R5bGVEZWNsOwotICAgIG11dGFibGUgYm9vbCBtX2lzU3R5bGVBdHRyaWJ1dGVW
YWxpZCA6IDE7Ci0gICAgbXV0YWJsZSBib29sIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRl
IDogMTsKLX07Ci0KIH0gLy9uYW1lc3BhY2UKIAotI3VuZGVmIGlkCi0KICNlbmRpZgpJbmRleDog
ZG9tL05hbWVOb2RlTGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL05hbWVOb2RlTGlzdC5jcHAJ
KHJldmlzaW9uIDEzNDc3KQorKysgZG9tL05hbWVOb2RlTGlzdC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI0LDggKzI0LDggQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIk5hbWVO
b2RlTGlzdC5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogCisjaW5jbHVkZSAiRWxl
bWVudC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogCiB1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKQEAgLTM0LDcgKzM0LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1lc3Bh
Y2UgSFRNTE5hbWVzOwogCi1OYW1lTm9kZUxpc3Q6Ok5hbWVOb2RlTGlzdChOb2RlICpuLCBjb25z
dCBTdHJpbmcgJnQgKQorTmFtZU5vZGVMaXN0OjpOYW1lTm9kZUxpc3QoTm9kZSAqbiwgY29uc3Qg
U3RyaW5nICZ0KQogICA6IE5vZGVMaXN0KG4pLCBub2RlTmFtZSh0KQogewogfQpAQCAtNDQsMTQg
KzQ0LDE0IEBAIHVuc2lnbmVkIE5hbWVOb2RlTGlzdDo6bGVuZ3RoKCkgY29uc3QKICAgICByZXR1
cm4gcmVjdXJzaXZlTGVuZ3RoKCk7CiB9CiAKLU5vZGUgKk5hbWVOb2RlTGlzdDo6aXRlbSAoIHVu
c2lnbmVkIGluZGV4ICkgY29uc3QKK05vZGUgKk5hbWVOb2RlTGlzdDo6aXRlbSAodW5zaWduZWQg
aW5kZXgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIHJlY3Vyc2l2ZUl0ZW0oIGluZGV4ICk7CisgICAg
cmV0dXJuIHJlY3Vyc2l2ZUl0ZW0oaW5kZXgpOwogfQogCiBib29sIE5hbWVOb2RlTGlzdDo6bm9k
ZU1hdGNoZXMoTm9kZSAqdGVzdE5vZGUpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0
PEVsZW1lbnQgKj4odGVzdE5vZGUpLT5nZXRBdHRyaWJ1dGUobmFtZUF0dHIpID09IG5vZGVOYW1l
OworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50Kj4odGVzdE5vZGUpLT5nZXRBdHRyaWJ1
dGUobmFtZUF0dHIpID09IG5vZGVOYW1lOwogfQogCiB9CkluZGV4OiBkb20vRG9jdW1lbnQuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBkb20vRG9jdW1lbnQuaAkocmV2aXNpb24gMTM0NzcpCisrKyBkb20vRG9j
dW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTMgKzI2LDE0IEBACiAjaWZuZGVmIERPTV9E
b2N1bWVudEltcGxfaAogI2RlZmluZSBET01fRG9jdW1lbnRJbXBsX2gKIAorI2luY2x1ZGUgIkF0
dHIuaCIKICNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkNvbnRhaW5lck5vZGUuaCIKICNp
bmNsdWRlICJEb2N1bWVudE1hcmtlci5oIgogI2luY2x1ZGUgIlNoYXJlZC5oIgogI2luY2x1ZGUg
IlRpbWVyLmgiCiAjaW5jbHVkZSAiZGVjb2Rlci5oIgogI2luY2x1ZGUgImRvbTJfdHJhdmVyc2Fs
aW1wbC5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogI2luY2x1ZGUgPEtVUkwuaD4K
ICNpbmNsdWRlIDxreG1sY29yZS9IYXNoQ291bnRlZFNldC5oPgogI2luY2x1ZGUgPGt4bWxjb3Jl
L0hhc2hNYXAuaD4KQEAgLTUxLDggKzUyLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAg
Y2xhc3MgQWNjZXNzaWJpbGl0eU9iamVjdENhY2hlOwogICAgIGNsYXNzIEFic3RyYWN0VmlldzsK
LSAgICBjbGFzcyBBdHRyOwogICAgIGNsYXNzIENEQVRBU2VjdGlvbjsKKyAgICBjbGFzcyBDU1NT
dHlsZURlY2xhcmF0aW9uOwogICAgIGNsYXNzIENTU1N0eWxlU2VsZWN0b3I7CiAgICAgY2xhc3Mg
Q1NTU3R5bGVTaGVldDsKICAgICBjbGFzcyBDb21tZW50OwpJbmRleDogZG9tL0VsZW1lbnQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGRvbS9FbGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBkb20v
RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDI2MCArMjIsMzAgQEAKICAqIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMz
MCwKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCi0KICNpbmNsdWRlICJjb25m
aWcuaCIKLSNpbmNsdWRlICJkb21fZWxlbWVudGltcGwuaCIKKyNpbmNsdWRlICJFbGVtZW50Lmgi
CiAKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVjdG9yLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIK
ICNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCisjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hl
ZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgImNzc3N0eWxl
c2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiZG9t
Ml9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAiZG9tX3htbGltcGwuaCIKLSNpbmNsdWRlICJIVE1M
TmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MUGFyc2VyLmgiCi0jaW5jbHVkZSAiUmVuZGVyQ2FudmFz
LmgiCi0jaW5jbHVkZSA8cXRleHRzdHJlYW0uaD4KKyNpbmNsdWRlICJodG1sbmFtZXMuaCIKKyNp
bmNsdWRlICJOYW1lZEF0dHJNYXAuaCIKKyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgorI2luY2x1
ZGUgIktXUVRleHRTdHJlYW0uaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1l
c3BhY2UgSFRNTE5hbWVzOwogCi1zdHJ1Y3QgTWFwcGVkQXR0cmlidXRlS2V5IHsKLSAgICB1aW50
MTZfdCB0eXBlOwotICAgIFN0cmluZ0ltcGwqIG5hbWU7Ci0gICAgU3RyaW5nSW1wbCogdmFsdWU7
Ci0gICAgTWFwcGVkQXR0cmlidXRlS2V5KE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHQsIFN0cmluZ0lt
cGwqIG4sIFN0cmluZ0ltcGwqIHYpCi0gICAgICAgIDogdHlwZSh0KSwgbmFtZShuKSwgdmFsdWUo
dikgeyB9Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXBwZWRB
dHRyaWJ1dGVLZXkmIGEsIGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYgYikKLSAgICB7IHJldHVy
biBhLnR5cGUgPT0gYi50eXBlICYmIGEubmFtZSA9PSBiLm5hbWUgJiYgYS52YWx1ZSA9PSBiLnZh
bHVlOyB9IAotCi1zdHJ1Y3QgTWFwcGVkQXR0cmlidXRlS2V5VHJhaXRzIHsKLSAgICB0eXBlZGVm
IE1hcHBlZEF0dHJpYnV0ZUtleSBUcmFpdFR5cGU7Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgZW1w
dHlWYWx1ZUlzWmVybyA9IHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVj
dGlvbiA9IGZhbHNlOwotICAgIHN0YXRpYyBNYXBwZWRBdHRyaWJ1dGVLZXkgZW1wdHlWYWx1ZSgp
IHsgcmV0dXJuIE1hcHBlZEF0dHJpYnV0ZUtleShlTm9uZSwgMCwgMCk7IH0KLSAgICBzdGF0aWMg
TWFwcGVkQXR0cmlidXRlS2V5IGRlbGV0ZWRWYWx1ZSgpIHsgcmV0dXJuIE1hcHBlZEF0dHJpYnV0
ZUtleShlTGFzdEVudHJ5LCAwLCAwKTsgfQotfTsKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUhh
c2ggewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYp
OwotICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYgYSwgY29u
c3QgTWFwcGVkQXR0cmlidXRlS2V5JiBiKSB7IHJldHVybiBhID09IGI7IH0KLX07Ci0KLXR5cGVk
ZWYgSGFzaE1hcDxNYXBwZWRBdHRyaWJ1dGVLZXksIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0
aW9uKiwgTWFwcGVkQXR0cmlidXRlSGFzaCwgTWFwcGVkQXR0cmlidXRlS2V5VHJhaXRzPiBNYXBw
ZWRBdHRyaWJ1dGVEZWNsczsKLQotc3RhdGljIE1hcHBlZEF0dHJpYnV0ZURlY2xzKiBtYXBwZWRB
dHRyaWJ1dGVEZWNscyA9IDA7Ci0KLUF0dHJpYnV0ZSogQXR0cmlidXRlOjpjbG9uZShib29sKSBj
b25zdAotewotICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG1fbmFtZSwgbV92YWx1ZSk7Ci19Ci0K
LVBhc3NSZWZQdHI8QXR0cj4gQXR0cmlidXRlOjpjcmVhdGVBdHRySWZOZWVkZWQoRWxlbWVudCog
ZSkKLXsKLSAgICBSZWZQdHI8QXR0cj4gcihtX2ltcGwpOwotICAgIGlmICghcikgewotICAgICAg
ICByID0gbmV3IEF0dHIoZSwgZS0+Z2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0gICAgICAgIHItPmNy
ZWF0ZVRleHRDaGlsZCgpOwotICAgIH0KLSAgICByZXR1cm4gci5yZWxlYXNlKCk7Ci19Ci0KLUF0
dHI6OkF0dHIoRWxlbWVudCogZWxlbWVudCwgRG9jdW1lbnQqIGRvY1B0ciwgQXR0cmlidXRlKiBh
KQotICAgIDogQ29udGFpbmVyTm9kZShkb2NQdHIpLAotICAgICAgbV9lbGVtZW50KGVsZW1lbnQp
LAotICAgICAgbV9hdHRyaWJ1dGUoYSksCi0gICAgICBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZCgw
KQotewotICAgIGFzc2VydCghbV9hdHRyaWJ1dGUtPm1faW1wbCk7Ci0gICAgbV9hdHRyaWJ1dGUt
Pm1faW1wbCA9IHRoaXM7Ci0gICAgbV9zcGVjaWZpZWQgPSB0cnVlOwotfQotCi1BdHRyOjp+QXR0
cigpCi17Ci0gICAgYXNzZXJ0KG1fYXR0cmlidXRlLT5tX2ltcGwgPT0gdGhpcyk7Ci0gICAgbV9h
dHRyaWJ1dGUtPm1faW1wbCA9IDA7Ci19Ci0KLXZvaWQgQXR0cjo6Y3JlYXRlVGV4dENoaWxkKCkK
LXsKLSAgICBhc3NlcnQocmVmQ291bnQoKSk7Ci0gICAgaWYgKCFtX2F0dHJpYnV0ZS0+dmFsdWUo
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIG1f
aWdub3JlQ2hpbGRyZW5DaGFuZ2VkKys7Ci0gICAgICAgIGFwcGVuZENoaWxkKGdldERvY3VtZW50
KCktPmNyZWF0ZVRleHROb2RlKG1fYXR0cmlidXRlLT52YWx1ZSgpLmltcGwoKSksIGVjKTsKLSAg
ICAgICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQtLTsKLSAgICB9Ci19Ci0KLVN0cmluZyBBdHRy
Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWUoKTsKLX0KLQotTm9kZTo6Tm9k
ZVR5cGUgQXR0cjo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBBVFRSSUJVVEVfTk9E
RTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBBdHRyOjpsb2NhbE5hbWUoKSBjb25zdAotewot
ICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+bG9jYWxOYW1lKCk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0
cmluZyYgQXR0cjo6bmFtZXNwYWNlVVJJKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hdHRyaWJ1
dGUtPm5hbWVzcGFjZVVSSSgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEF0dHI6OnByZWZp
eCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXR0cmlidXRlLT5wcmVmaXgoKTsKLX0KLQotdm9p
ZCBBdHRyOjpzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBFeGNlcHRpb25D
b2RlJiBlYykKLXsKLSAgICBjaGVja1NldFByZWZpeChfcHJlZml4LCBlYyk7Ci0gICAgaWYgKGVj
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2F0dHJpYnV0ZS0+c2V0UHJlZml4KF9wcmVmaXgp
OwotfQotCi1TdHJpbmcgQXR0cjo6bm9kZVZhbHVlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmFs
dWUoKTsKLX0KLQotdm9pZCBBdHRyOjpzZXRWYWx1ZSggY29uc3QgU3RyaW5nJiB2LCBFeGNlcHRp
b25Db2RlJiBlYykKLXsKLSAgICBlYyA9IDA7Ci0KLSAgICAvLyBkbyBub3QgaW50ZXJwcmV0ZSBl
bnRpdGllcyBpbiB0aGUgc3RyaW5nLCBpdHMgbGl0ZXJhbCEKLQotICAgIC8vIE5PX01PRElGSUNB
VElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkKLSAgICBp
ZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURf
RVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gIyMjIHdoYXQgdG8gZG8gb24g
MCA/Ci0gICAgaWYgKHYuaXNOdWxsKCkpIHsKLSAgICAgICAgZWMgPSBET01TVFJJTkdfU0laRV9F
UlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgZSA9IDA7Ci0gICAgbV9pZ25v
cmVDaGlsZHJlbkNoYW5nZWQrKzsKLSAgICByZW1vdmVDaGlsZHJlbigpOwotICAgIGFwcGVuZENo
aWxkKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKHYuaW1wbCgpKSwgZSk7Ci0gICAgbV9p
Z25vcmVDaGlsZHJlbkNoYW5nZWQtLTsKLSAgICAKLSAgICBtX2F0dHJpYnV0ZS0+c2V0VmFsdWUo
di5pbXBsKCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAgICAgIG1fZWxlbWVudC0+YXR0cmli
dXRlQ2hhbmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0KLXZvaWQgQXR0cjo6c2V0Tm9kZVZh
bHVlKGNvbnN0IFN0cmluZyYgdiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8gTk9fTU9E
SUZJQ0FUSU9OX0FMTE9XRURfRVJSOiB0YWtlbiBjYXJlIG9mIGJ5IHNldFZhbHVlKCkKLSAgICBz
ZXRWYWx1ZSh2LCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gQXR0cjo6Y2xvbmVOb2RlKGJv
b2wgLypkZWVwKi8pCi17Ci0gICAgUmVmUHRyPEF0dHI+IGNsb25lID0gbmV3IEF0dHIoMCwgZ2V0
RG9jdW1lbnQoKSwgbV9hdHRyaWJ1dGUtPmNsb25lKCkpOwotICAgIGNsb25lQ2hpbGROb2Rlcyhj
bG9uZS5nZXQoKSk7Ci0gICAgcmV0dXJuIGNsb25lLnJlbGVhc2UoKTsKLX0KLQotLy8gRE9NIFNl
Y3Rpb24gMS4xLjEKLWJvb2wgQXR0cjo6Y2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSB0eXBlKQot
ewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIFRFWFRfTk9ERToKLSAgICAgICAg
Y2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZv
aWQgQXR0cjo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBOb2RlOjpjaGlsZHJlbkNoYW5nZWQo
KTsKLSAgICAKLSAgICBpZiAobV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQgPiAwKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBpbmNsdWRlIGVudGl0eSByZWZl
cmVuY2VzIGluIHRoZSB2YWx1ZQotICAgIAotICAgIFN0cmluZyB2YWwgPSAiIjsKLSAgICBmb3Ig
KE5vZGUgKm4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKSB7Ci0gICAg
ICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB2YWwgKz0gc3RhdGljX2Nhc3Q8
VGV4dCAqPihuKS0+ZGF0YSgpOwotICAgIH0KLSAgICAKLSAgICBtX2F0dHJpYnV0ZS0+c2V0VmFs
dWUodmFsLmltcGwoKSk7Ci0gICAgaWYgKG1fZWxlbWVudCkKLSAgICAgICAgbV9lbGVtZW50LT5h
dHRyaWJ1dGVDaGFuZ2VkKG1fYXR0cmlidXRlLmdldCgpKTsKLX0KLQotU3RyaW5nIEF0dHI6OnRv
U3RyaW5nKCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0OwotCi0gICAgcmVzdWx0ICs9IG5v
ZGVOYW1lKCk7Ci0KLSAgICAvLyBGSVhNRTogc3Vic3RpdHV0ZSBlbnRpdGllcyBmb3IgYW55IGlu
c3RhbmNlcyBvZiAiIG9yICcgLS0KLSAgICAvLyBtYXliZSBlYXNpZXIgdG8ganVzdCB1c2UgdGV4
dCB2YWx1ZSBhbmQgaWdub3JlIGV4aXN0aW5nCi0gICAgLy8gZW50aXR5IHJlZnM/Ci0KLSAgICBp
ZiAoZmlyc3RDaGlsZCgpICE9IE5VTEwpIHsKLSAgICAgICAgcmVzdWx0ICs9ICI9XCIiOwotCi0g
ICAgICAgIGZvciAoTm9kZSAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkICE9IE5VTEw7IGNo
aWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSBjaGls
ZC0+dG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0ICs9ICJc
IiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi0jaWZuZGVmIE5ERUJVRwotc3RydWN0IEVsZW1lbnRJbXBsQ291bnRlciAKLXsgCi0gICAg
c3RhdGljIGludCBjb3VudDsgCi0gICAgfkVsZW1lbnRJbXBsQ291bnRlcigpIHsgLyogaWYgKGNv
dW50ICE9IDApIGZwcmludGYoc3RkZXJyLCAiTEVBSzogJWQgRWxlbWVudFxuIiwgY291bnQpOyAq
LyB9IAotfTsKLWludCBFbGVtZW50SW1wbENvdW50ZXI6OmNvdW50Owotc3RhdGljIEVsZW1lbnRJ
bXBsQ291bnRlciBlbGVtZW50SW1wbENvdW50ZXI7Ci0jZW5kaWYgTkRFQlVHCi0KIEVsZW1lbnQ6
OkVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUsIERvY3VtZW50ICpkb2MpCiAgICAg
OiBDb250YWluZXJOb2RlKGRvYyksIG1fdGFnTmFtZShxTmFtZSkKIHsKLSNpZm5kZWYgTkRFQlVH
Ci0gICAgKytFbGVtZW50SW1wbENvdW50ZXI6OmNvdW50OwotI2VuZGlmCiB9CiAKIEVsZW1lbnQ6
On5FbGVtZW50KCkKIHsKLSNpZm5kZWYgTkRFQlVHCi0gICAgLS1FbGVtZW50SW1wbENvdW50ZXI6
OmNvdW50OwotI2VuZGlmCiAgICAgaWYgKG5hbWVkQXR0ck1hcCkKICAgICAgICAgbmFtZWRBdHRy
TWFwLT5kZXRhY2hGcm9tRWxlbWVudCgpOwogfQpAQCAtODU2LDgwMyArNjI2LDQgQEAgdm9pZCBF
bGVtZW50OjpibHVyKCkKICAgICAgICAgZG9jLT5zZXRGb2N1c05vZGUoMCk7CiB9CiAKLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotTmFtZWRBdHRyTWFwOjpOYW1lZEF0dHJNYXAoRWxlbWVudCAqZSkK
LSAgICA6IGVsZW1lbnQoZSkKLSAgICAsIGF0dHJzKDApCi0gICAgLCBsZW4oMCkKLXsKLX0KLQot
TmFtZWRBdHRyTWFwOjp+TmFtZWRBdHRyTWFwKCkKLXsKLSAgICBOYW1lZEF0dHJNYXA6OmNsZWFy
QXR0cmlidXRlcygpOyAvLyB2aXJ0dWFsIG1ldGhvZCwgc28gcXVhbGlmeSBqdXN0IHRvIGJlIGV4
cGxpY2l0Ci19Ci0KLWJvb2wgTmFtZWRBdHRyTWFwOjppc01hcHBlZEF0dHJpYnV0ZU1hcCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0
ck1hcDo6Z2V0TmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3QKLXsKLSAgICBTdHJp
bmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1lbnQoZWxlbWVudCkgPyBuYW1lLmxvd2VyKCkgOiBu
YW1lOwotICAgIHJldHVybiBnZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9j
YWxOYW1lLmltcGwoKSwgbnVsbEF0b20pKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0
dHJNYXA6OmdldE5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBT
dHJpbmcmIGxvY2FsTmFtZSkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0TmFtZWRJdGVtKFF1YWxp
ZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkp
KTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OnJlbW92ZU5hbWVkSXRlbShj
b25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIFN0cmluZyBsb2Nh
bE5hbWUgPSBpbkhUTUxEb2N1bWVudChlbGVtZW50KSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0g
ICAgcmV0dXJuIHJlbW92ZU5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5h
bWUuaW1wbCgpLCBudWxsQXRvbSksIGVjKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0
dHJNYXA6OnJlbW92ZU5hbWVkSXRlbU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25z
dCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgcmV0dXJuIHJl
bW92ZU5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBu
YW1lc3BhY2VVUkkuaW1wbCgpKSwgZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0
ck1hcDo6Z2V0TmFtZWRJdGVtKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0Ci17Ci0g
ICAgQXR0cmlidXRlKiBhID0gZ2V0QXR0cmlidXRlSXRlbShuYW1lKTsKLSAgICBpZiAoIWEpIHJl
dHVybiAwOwotCi0gICAgcmV0dXJuIGEtPmNyZWF0ZUF0dHJJZk5lZWRlZChlbGVtZW50KTsKLX0K
LQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OnNldE5hbWVkSXRlbShOb2RlKiBhcmcs
IEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghZWxlbWVudCkgewotICAgICAgICBlYyA9
IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5PX01P
RElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbWFwIGlzIHJlYWRvbmx5Lgot
ICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxM
T1dFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIFdST05HX0RPQ1VN
RU5UX0VSUjogUmFpc2VkIGlmIGFyZyB3YXMgY3JlYXRlZCBmcm9tIGEgZGlmZmVyZW50IGRvY3Vt
ZW50IHRoYW4gdGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhpcyBtYXAuCi0gICAgaWYgKGFyZy0+Z2V0
RG9jdW1lbnQoKSAhPSBlbGVtZW50LT5nZXREb2N1bWVudCgpKSB7Ci0gICAgICAgIGVjID0gV1JP
TkdfRE9DVU1FTlRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOb3Qg
bWVudGlvbmVkIGluIHNwZWM6IHRocm93IGEgSElFUkFSQ0hZX1JFUVVFU1RfRVJST1IgaWYgdGhl
IHVzZXIgcGFzc2VzIGluIGEgbm9uLWF0dHJpYnV0ZSBub2RlCi0gICAgaWYgKCFhcmctPmlzQXR0
cmlidXRlTm9kZSgpKSB7Ci0gICAgICAgIGVjID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAg
ICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQXR0ciAqYXR0ciA9IHN0YXRpY19jYXN0PEF0dHIq
PihhcmcpOwotCi0gICAgQXR0cmlidXRlKiBhID0gYXR0ci0+YXR0cigpOwotICAgIEF0dHJpYnV0
ZSogb2xkID0gZ2V0QXR0cmlidXRlSXRlbShhLT5uYW1lKCkpOwotICAgIGlmIChvbGQgPT0gYSkK
LSAgICAgICAgcmV0dXJuIFJlZlB0cjxOb2RlPihhcmcpOyAvLyB3ZSBrbm93IGFib3V0IGl0IGFs
cmVhZHkKLQotICAgIC8vIElOVVNFX0FUVFJJQlVURV9FUlI6IFJhaXNlZCBpZiBhcmcgaXMgYW4g
QXR0ciB0aGF0IGlzIGFscmVhZHkgYW4gYXR0cmlidXRlIG9mIGFub3RoZXIgRWxlbWVudCBvYmpl
Y3QuCi0gICAgLy8gVGhlIERPTSB1c2VyIG11c3QgZXhwbGljaXRseSBjbG9uZSBBdHRyIG5vZGVz
IHRvIHJlLXVzZSB0aGVtIGluIG90aGVyIGVsZW1lbnRzLgotICAgIGlmIChhdHRyLT5vd25lckVs
ZW1lbnQoKSkgewotICAgICAgICBlYyA9IElOVVNFX0FUVFJJQlVURV9FUlI7Ci0gICAgICAgIHJl
dHVybiAwOwotICAgIH0KLQotICAgIGlmIChhLT5uYW1lKCkgPT0gaWRBdHRyKQotICAgICAgICBl
bGVtZW50LT51cGRhdGVJZChvbGQgPyBvbGQtPnZhbHVlKCkgOiBudWxsQXRvbSwgYS0+dmFsdWUo
KSk7Ci0KLSAgICAvLyAjIyMgc2xpZ2h0bHkgaW5lZmZpY2llbnQgLSByZXNpemVzIGF0dHJpYnV0
ZSBhcnJheSB0d2ljZS4KLSAgICBSZWZQdHI8Tm9kZT4gcjsKLSAgICBpZiAob2xkKSB7Ci0gICAg
ICAgIHIgPSBvbGQtPmNyZWF0ZUF0dHJJZk5lZWRlZChlbGVtZW50KTsKLSAgICAgICAgcmVtb3Zl
QXR0cmlidXRlKGEtPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgYWRkQXR0cmlidXRlKGEpOwotICAg
IHJldHVybiByLnJlbGVhc2UoKTsKLX0KLQotLy8gVGhlIERPTTIgc3BlYyBkb2Vzbid0IHNheSB0
aGF0IHJlbW92ZUF0dHJpYnV0ZVtOU10gdGhyb3dzIE5PVF9GT1VORF9FUlIKLS8vIGlmIHRoZSBh
dHRyaWJ1dGUgaXMgbm90IGZvdW5kLCBidXQgYXQgdGhpcyBsZXZlbCB3ZSBoYXZlIHRvIHRocm93
IE5PVF9GT1VORF9FUlIKLS8vIGJlY2F1c2Ugb2YgcmVtb3ZlTmFtZWRJdGVtLCByZW1vdmVOYW1l
ZEl0ZW1OUywgYW5kIHJlbW92ZUF0dHJpYnV0ZU5vZGUuCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVk
QXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVtKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2Vw
dGlvbkNvZGUmIGVjKQotewotICAgIC8vICMjIyBzaG91bGQgdGhpcyByZWFsbHkgYmUgcmFpc2Vk
IHdoZW4gdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUgaXNuJ3QgdGhlcmUgYXQgYWxsPwotICAgIC8v
IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVh
ZG9ubHkKLSAgICBpZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FU
SU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBBdHRyaWJ1
dGUqIGEgPSBnZXRBdHRyaWJ1dGVJdGVtKG5hbWUpOwotICAgIGlmICghYSkgewotICAgICAgICBl
YyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIFJlZlB0
cjxOb2RlPiByID0gYS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotCi0gICAgaWYgKG5h
bWUgPT0gaWRBdHRyKQotICAgICAgICBlbGVtZW50LT51cGRhdGVJZChhLT52YWx1ZSgpLCBudWxs
QXRvbSk7Ci0KLSAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgcmV0dXJuIHIucmVsZWFz
ZSgpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6aXRlbSAoIHVuc2lnbmVk
IGluZGV4ICkgY29uc3QKLXsKLSAgICBpZiAoaW5kZXggPj0gbGVuKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHJldHVybiBhdHRyc1tpbmRleF0tPmNyZWF0ZUF0dHJJZk5lZWRlZChlbGVtZW50
KTsKLX0KLQotQXR0cmlidXRlKiBOYW1lZEF0dHJNYXA6OmdldEF0dHJpYnV0ZUl0ZW0oY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbGVuOyArK2kpIHsKLSAgICAgICAgaWYgKGF0dHJzW2ldLT5uYW1lKCkubWF0Y2hlcyhuYW1l
KSkKLSAgICAgICAgICAgIHJldHVybiBhdHRyc1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19
Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjpjbGVhckF0dHJpYnV0ZXMoKQotewotICAgIGlmIChhdHRy
cykgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAg
ICAgICAgIGlmIChhdHRyc1tpXS0+bV9pbXBsKQotICAgICAgICAgICAgICAgIGF0dHJzW2ldLT5t
X2ltcGwtPm1fZWxlbWVudCA9IDA7Ci0gICAgICAgICAgICBhdHRyc1tpXS0+ZGVyZWYoKTsKLSAg
ICAgICAgfQotICAgICAgICBmYXN0RnJlZShhdHRycyk7Ci0gICAgICAgIGF0dHJzID0gMDsKLSAg
ICB9Ci0gICAgbGVuID0gMDsKLX0KLQotdm9pZCBOYW1lZEF0dHJNYXA6OmRldGFjaEZyb21FbGVt
ZW50KCkKLXsKLSAgICAvLyB3ZSBhbGxvdyBhIE5hbWVkQXR0ck1hcCB3L28gYW4gZWxlbWVudCBp
biBjYXNlIHNvbWVvbmUgc3RpbGwgaGFzIGEgcmVmZXJlbmNlCi0gICAgLy8gdG8gaWYgYWZ0ZXIg
dGhlIGVsZW1lbnQgZ2V0cyBkZWxldGVkIC0gYnV0IHRoZSBtYXAgaXMgbm93IGludmFsaWQKLSAg
ICBlbGVtZW50ID0gMDsKLSAgICBjbGVhckF0dHJpYnV0ZXMoKTsKLX0KLQotTmFtZWRBdHRyTWFw
JiBOYW1lZEF0dHJNYXA6Om9wZXJhdG9yPShjb25zdCBOYW1lZEF0dHJNYXAmIG90aGVyKQotewot
ICAgIC8vIGNsb25lIGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBvdGhlciBtYXAsIGJ1dCBhdHRhY2gg
dG8gb3VyIGVsZW1lbnQKLSAgICBpZiAoIWVsZW1lbnQpCi0gICAgICAgIHJldHVybiAqdGhpczsK
LQotICAgIC8vIElmIGFzc2lnbmluZyB0aGUgbWFwIGNoYW5nZXMgdGhlIGlkIGF0dHJpYnV0ZSwg
d2UgbmVlZCB0byBjYWxsCi0gICAgLy8gdXBkYXRlSWQuCi0KLSAgICBBdHRyaWJ1dGUgKm9sZElk
ID0gZ2V0QXR0cmlidXRlSXRlbShpZEF0dHIpOwotICAgIEF0dHJpYnV0ZSAqbmV3SWQgPSBvdGhl
ci5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0KLSAgICBpZiAob2xkSWQgfHwgbmV3SWQpCi0g
ICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlkKG9sZElkID8gb2xkSWQtPnZhbHVlKCkgOiBudWxsQXRv
bSwgbmV3SWQgPyBuZXdJZC0+dmFsdWUoKSA6IG51bGxBdG9tKTsKLQotICAgIGNsZWFyQXR0cmli
dXRlcygpOwotICAgIGxlbiA9IG90aGVyLmxlbjsKLSAgICBhdHRycyA9IHN0YXRpY19jYXN0PEF0
dHJpYnV0ZSAqKj4oZmFzdE1hbGxvYyhsZW4gKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0KLSAg
ICAvLyBmaXJzdCBpbml0aWFsaXplIGF0dHJzIHZlY3RvciwgdGhlbiBjYWxsIGF0dHJpYnV0ZUNo
YW5nZWQgb24gaXQKLSAgICAvLyB0aGlzIGFsbG93cyBhdHRyaWJ1dGVDaGFuZ2VkIHRvIHVzZSBn
ZXRBdHRyaWJ1dGUKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAg
ICAgICAgYXR0cnNbaV0gPSBvdGhlci5hdHRyc1tpXS0+Y2xvbmUoKTsKLSAgICAgICAgYXR0cnNb
aV0tPnJlZigpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHdhc3RlZnVsLiAgVGhl
IGNsYXNzIGxpc3QgY291bGQgYmUgcHJlc2VydmVkIG9uIGEgY29weSwgYW5kIHdlCi0gICAgLy8g
d291bGRuJ3QgaGF2ZSB0byB3YXN0ZSB0aW1lIHJlcGFyc2luZyB0aGUgYXR0cmlidXRlLgotICAg
IC8vIFRoZSBkZXJpdmVkIGNsYXNzLCBIVE1MTmFtZWRBdHRyTWFwLCB3aGljaCBtYW5hZ2VzIGEg
cGFyc2VkIGNsYXNzIGxpc3QgZm9yIHRoZSBDTEFTUyBhdHRyaWJ1dGUsCi0gICAgLy8gd2lsbCB1
cGRhdGUgaXRzIG1lbWJlciB2YXJpYWJsZSB3aGVuIHBhcnNlIGF0dHJpYnV0ZSBpcyBjYWxsZWQu
Ci0gICAgZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIGVsZW1lbnQt
PmF0dHJpYnV0ZUNoYW5nZWQoYXR0cnNbaV0sIHRydWUpOwotCi0gICAgcmV0dXJuICp0aGlzOwot
fQotCi12b2lkIE5hbWVkQXR0ck1hcDo6YWRkQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cmlidXRl
KQotewotICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0Ci0gICAgQXR0cmlidXRl
ICoqbmV3QXR0cnMgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGUgKio+KGZhc3RNYWxsb2MoKGxlbiAr
IDEpICogc2l6ZW9mKEF0dHJpYnV0ZSAqKSkpOwotICAgIGlmIChhdHRycykgewotICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICBuZXdBdHRyc1tpXSA9IGF0
dHJzW2ldOwotICAgICAgZmFzdEZyZWUoYXR0cnMpOwotICAgIH0KLSAgICBhdHRycyA9IG5ld0F0
dHJzOwotICAgIGF0dHJzW2xlbisrXSA9IGF0dHJpYnV0ZTsKLSAgICBhdHRyaWJ1dGUtPnJlZigp
OwotCi0gICAgQXR0ciAqIGNvbnN0IGF0dHIgPSBhdHRyaWJ1dGUtPm1faW1wbDsKLSAgICBpZiAo
YXR0cikKLSAgICAgICAgYXR0ci0+bV9lbGVtZW50ID0gZWxlbWVudDsKLQotICAgIC8vIE5vdGlm
eSB0aGUgZWxlbWVudCB0aGF0IHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4gYWRkZWQsIGFuZCBkaXNw
YXRjaCBhcHByb3ByaWF0ZSBtdXRhdGlvbiBldmVudHMKLSAgICAvLyBOb3RlIHRoYXQgZWxlbWVu
dCBtYXkgYmUgbnVsbCBoZXJlIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSBpbnNlcnRBdHRyKCkgZHVy
aW5nIHBhcnNpbmcKLSAgICBpZiAoZWxlbWVudCkgewotICAgICAgICBSZWZQdHI8QXR0cmlidXRl
PiBhID0gYXR0cmlidXRlOwotICAgICAgICBlbGVtZW50LT5hdHRyaWJ1dGVDaGFuZ2VkKGEuZ2V0
KCkpOwotICAgICAgICAvLyBCZWNhdXNlIG9mIG91ciB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVl
ZGVkKCkgc3R5bGUgbW9kaWZpY2F0aW9uIGV2ZW50cyBhcmUgbmV2ZXIgc2VudCBhdCB0aGUgcmln
aHQgdGltZSwgc28gZG9uJ3QgYm90aGVyIHNlbmRpbmcgdGhlbS4KLSAgICAgICAgaWYgKGEtPm5h
bWUoKSAhPSBzdHlsZUF0dHIpIHsKLSAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoQXR0ckFk
ZGl0aW9uRXZlbnQoYS5nZXQoKSk7Ci0gICAgICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFN1YnRy
ZWVNb2RpZmllZEV2ZW50KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBOYW1l
ZEF0dHJNYXA6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKQotewot
ICAgIHVuc2lnbmVkIGluZGV4ID0gbGVuKzE7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGxlbjsgKytpKQotICAgICAgICBpZiAoYXR0cnNbaV0tPm5hbWUoKS5tYXRjaGVzKG5hbWUpKSB7
Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
Ci0gICAgaWYgKGluZGV4ID49IGxlbikgcmV0dXJuOwotCi0gICAgLy8gUmVtb3ZlIHRoZSBhdHRy
aWJ1dGUgZnJvbSB0aGUgbGlzdAotICAgIEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJzW2luZGV4XTsK
LSAgICBpZiAoYXR0cnNbaW5kZXhdLT5tX2ltcGwpCi0gICAgICAgIGF0dHJzW2luZGV4XS0+bV9p
bXBsLT5tX2VsZW1lbnQgPSAwOwotICAgIGlmIChsZW4gPT0gMSkgewotICAgICAgICBmYXN0RnJl
ZShhdHRycyk7Ci0gICAgICAgIGF0dHJzID0gMDsKLSAgICAgICAgbGVuID0gMDsKLSAgICB9IGVs
c2UgewotICAgICAgICBBdHRyaWJ1dGUgKipuZXdBdHRycyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0
ZSAqKj4oZmFzdE1hbGxvYygobGVuIC0gMSkgKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0gICAg
ICAgIHVuc2lnbmVkIGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB1bnNpZ25lZChpbmRleCk7
IGkrKykKLSAgICAgICAgICAgIG5ld0F0dHJzW2ldID0gYXR0cnNbaV07Ci0gICAgICAgIGxlbi0t
OwotICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgbmV3QXR0cnNbaV0g
PSBhdHRyc1tpKzFdOwotICAgICAgICBmYXN0RnJlZShhdHRycyk7Ci0gICAgICAgIGF0dHJzID0g
bmV3QXR0cnM7Ci0gICAgfQotCi0gICAgLy8gTm90aWZ5IHRoZSBlbGVtZW50IHRoYXQgdGhlIGF0
dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkCi0gICAgLy8gZGlzcGF0Y2ggYXBwcm9wcmlhdGUgbXV0
YXRpb24gZXZlbnRzCi0gICAgaWYgKGVsZW1lbnQgJiYgIWF0dHItPm1fdmFsdWUuaXNOdWxsKCkp
IHsKLSAgICAgICAgQXRvbWljU3RyaW5nIHZhbHVlID0gYXR0ci0+bV92YWx1ZTsKLSAgICAgICAg
YXR0ci0+bV92YWx1ZSA9IG51bGxBdG9tOwotICAgICAgICBlbGVtZW50LT5hdHRyaWJ1dGVDaGFu
Z2VkKGF0dHIpOwotICAgICAgICBhdHRyLT5tX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIGlm
IChlbGVtZW50KSB7Ci0gICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoQXR0clJlbW92YWxFdmVudChh
dHRyKTsKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudChmYWxz
ZSk7Ci0gICAgfQotICAgIGF0dHItPmRlcmVmKCk7Ci19Ci0KLWJvb2wgTmFtZWRBdHRyTWFwOjpt
YXBzRXF1aXZhbGVudChjb25zdCBOYW1lZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdAotewotICAg
IGlmICghb3RoZXJNYXApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobGVu
Z3RoKCkgIT0gb3RoZXJNYXAtPmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAg
QXR0cmlidXRlICphdHRyID0gYXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgQXR0cmlidXRlICpv
dGhlckF0dHIgPSBvdGhlck1hcC0+Z2V0QXR0cmlidXRlSXRlbShhdHRyLT5uYW1lKCkpOwotICAg
ICAgICAgICAgCi0gICAgICAgIGlmICghb3RoZXJBdHRyIHx8IGF0dHItPnZhbHVlKCkgIT0gb3Ro
ZXJBdHRyLT52YWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSBTdHlsZWQgRWxlbWVudCBhbmQgTWFwcGVkIEF0dHJpYnV0ZSBJbXBsZW1lbnRhdGlvbgotCi1D
U1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbjo6fkNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0
aW9uKCkKLXsKLSAgICBpZiAobV9lbnRyeVR5cGUgIT0gZVBlcnNpc3RlbnQpCi0gICAgICAgIFN0
eWxlZEVsZW1lbnQ6OnJlbW92ZU1hcHBlZEF0dHJpYnV0ZURlY2wobV9lbnRyeVR5cGUsIG1fYXR0
ck5hbWUsIG1fYXR0clZhbHVlKTsKLX0KLQotQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24q
IFN0eWxlZEVsZW1lbnQ6OmdldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50
cnkgZW50cnlUeXBlLCBBdHRyaWJ1dGUqIGF0dHIpCi17Ci0gICAgaWYgKCFtYXBwZWRBdHRyaWJ1
dGVEZWNscykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG1hcHBlZEF0dHJpYnV0ZURl
Y2xzLT5nZXQoTWFwcGVkQXR0cmlidXRlS2V5KGVudHJ5VHlwZSwgYXR0ci0+bmFtZSgpLmxvY2Fs
TmFtZSgpLmltcGwoKSwgYXR0ci0+dmFsdWUoKS5pbXBsKCkpKTsKLX0KLQotdm9pZCBTdHlsZWRF
bGVtZW50OjpzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5
VHlwZSwgQXR0cmlidXRlKiBhdHRyLCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVj
bCkKLXsKLSAgICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAgICAgICBtYXBwZWRBdHRy
aWJ1dGVEZWNscyA9IG5ldyBNYXBwZWRBdHRyaWJ1dGVEZWNsczsKLSAgICBtYXBwZWRBdHRyaWJ1
dGVEZWNscy0+c2V0KE1hcHBlZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0dHItPm5hbWUoKS5s
b2NhbE5hbWUoKS5pbXBsKCksIGF0dHItPnZhbHVlKCkuaW1wbCgpKSwgZGVjbCk7Ci19Ci0KLXZv
aWQgU3R5bGVkRWxlbWVudDo6cmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1
dGVFbnRyeSBlbnRyeVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBjb25zdCBBdG9taWNT
dHJpbmcmIGF0dHJWYWx1ZSkKLXsKLSAgICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAg
ICAgICByZXR1cm47Ci0gICAgbWFwcGVkQXR0cmlidXRlRGVjbHMtPnJlbW92ZShNYXBwZWRBdHRy
aWJ1dGVLZXkoZW50cnlUeXBlLCBhdHRyTmFtZS5sb2NhbE5hbWUoKS5pbXBsKCksIGF0dHJWYWx1
ZS5pbXBsKCkpKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjppbnZhbGlkYXRlU3R5bGVBdHRy
aWJ1dGUoKQotewotICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gZmFsc2U7Ci19Ci0KLXZv
aWQgU3R5bGVkRWxlbWVudDo6dXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0Ci17
Ci0gICAgaWYgKCFtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCkgewotICAgICAgICBtX2lzU3R5bGVB
dHRyaWJ1dGVWYWxpZCA9IHRydWU7Ci0gICAgICAgIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmli
dXRlID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1faW5saW5lU3R5bGVEZWNsKQotICAgICAgICAgICAg
Y29uc3RfY2FzdDxTdHlsZWRFbGVtZW50Kj4odGhpcyktPnNldEF0dHJpYnV0ZShzdHlsZUF0dHIs
IG1faW5saW5lU3R5bGVEZWNsLT5jc3NUZXh0KCkpOwotICAgICAgICBtX3N5bmNocm9uaXppbmdT
dHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgIH0KLX0KLQotQXR0cmlidXRlKiBNYXBwZWRBdHRy
aWJ1dGU6OmNsb25lKGJvb2wgcHJlc2VydmVEZWNsKSBjb25zdAotewotICAgIHJldHVybiBuZXcg
TWFwcGVkQXR0cmlidXRlKG5hbWUoKSwgdmFsdWUoKSwgcHJlc2VydmVEZWNsID8gbV9zdHlsZURl
Y2wuZ2V0KCkgOiAwKTsKLX0KLQotTmFtZWRNYXBwZWRBdHRyTWFwOjpOYW1lZE1hcHBlZEF0dHJN
YXAoRWxlbWVudCAqZSkKLTpOYW1lZEF0dHJNYXAoZSksIG1fbWFwcGVkQXR0cmlidXRlQ291bnQo
MCkKLXt9Ci0KLXZvaWQgTmFtZWRNYXBwZWRBdHRyTWFwOjpjbGVhckF0dHJpYnV0ZXMoKQotewot
ICAgIG1fY2xhc3NMaXN0LmNsZWFyKCk7Ci0gICAgbV9tYXBwZWRBdHRyaWJ1dGVDb3VudCA9IDA7
Ci0gICAgTmFtZWRBdHRyTWFwOjpjbGVhckF0dHJpYnV0ZXMoKTsKLX0KLQotYm9vbCBOYW1lZE1h
cHBlZEF0dHJNYXA6OmlzTWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotaW50IE5hbWVkTWFwcGVkQXR0ck1hcDo6ZGVjbENvdW50KCkgY29uc3QKLXsK
LSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3Ro
KCk7IGkrKykgewotICAgICAgICBNYXBwZWRBdHRyaWJ1dGUqIGF0dHIgPSBhdHRyaWJ1dGVJdGVt
KGkpOwotICAgICAgICBpZiAoYXR0ci0+ZGVjbCgpKQotICAgICAgICAgICAgcmVzdWx0Kys7Ci0g
ICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWJvb2wgTmFtZWRNYXBwZWRBdHRyTWFwOjpt
YXBzRXF1aXZhbGVudChjb25zdCBOYW1lZE1hcHBlZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdAot
ewotICAgIC8vIFRoZSAjIG9mIGRlY2xzIG11c3QgbWF0Y2guCi0gICAgaWYgKGRlY2xDb3VudCgp
ICE9IG90aGVyTWFwLT5kZWNsQ291bnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAot
ICAgIC8vIFRoZSB2YWx1ZXMgZm9yIGVhY2ggZGVjbCBtdXN0IG1hdGNoLgotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIE1hcHBlZEF0dHJpYnV0
ZSogYXR0ciA9IGF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkpIHsK
LSAgICAgICAgICAgIEF0dHJpYnV0ZSogb3RoZXJBdHRyID0gb3RoZXJNYXAtPmdldEF0dHJpYnV0
ZUl0ZW0oYXR0ci0+bmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghb3RoZXJBdHRyIHx8IChhdHRy
LT52YWx1ZSgpICE9IG90aGVyQXR0ci0+dmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUg
c3RhdGljIGJvb2wgaXNDbGFzc1doaXRlc3BhY2UoUUNoYXIgYykKLXsKLSAgICByZXR1cm4gYyA9
PSAnICcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdCc7Ci19Ci0KLXZvaWQg
TmFtZWRNYXBwZWRBdHRyTWFwOjpwYXJzZUNsYXNzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgY2xh
c3NTdHIpCi17Ci0gICAgbV9jbGFzc0xpc3QuY2xlYXIoKTsKLSAgICBpZiAoIWVsZW1lbnQtPmhh
c0NsYXNzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBTdHJpbmcgY2xhc3NBdHRyID0g
ZWxlbWVudC0+Z2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkgPyAKLSAgICAgICAgKGNsYXNz
U3RyLmltcGwoKS0+aXNMb3dlcigpID8gY2xhc3NTdHIgOiBTdHJpbmcoY2xhc3NTdHIuaW1wbCgp
LT5sb3dlcigpKSkgOgotICAgICAgICBjbGFzc1N0cjsKLSAgICAKLSAgICBBdG9taWNTdHJpbmdM
aXN0KiBjdXJyID0gMDsKLSAgICAKLSAgICBjb25zdCBRQ2hhciogc3RyID0gY2xhc3NBdHRyLnVu
aWNvZGUoKTsKLSAgICBpbnQgbGVuZ3RoID0gY2xhc3NBdHRyLmxlbmd0aCgpOwotICAgIGludCBz
UG9zID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHdoaWxlIChzUG9zIDwgbGVu
Z3RoICYmIGlzQ2xhc3NXaGl0ZXNwYWNlKHN0cltzUG9zXSkpCi0gICAgICAgICAgICArK3NQb3M7
Ci0gICAgICAgIGlmIChzUG9zID49IGxlbmd0aCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBpbnQgZVBvcyA9IHNQb3MgKyAxOwotICAgICAgICB3aGlsZSAoZVBvcyA8IGxlbmd0aCAmJiAh
aXNDbGFzc1doaXRlc3BhY2Uoc3RyW2VQb3NdKSkKLSAgICAgICAgICAgICsrZVBvczsKLSAgICAg
ICAgaWYgKGN1cnIpIHsKLSAgICAgICAgICAgIGN1cnItPnNldE5leHQobmV3IEF0b21pY1N0cmlu
Z0xpc3QoQXRvbWljU3RyaW5nKHN0ciArIHNQb3MsIGVQb3MgLSBzUG9zKSkpOwotICAgICAgICAg
ICAgY3VyciA9IGN1cnItPm5leHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlm
IChzUG9zID09IDAgJiYgZVBvcyA9PSBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBtX2NsYXNz
TGlzdC5zZXRTdHJpbmcoQXRvbWljU3RyaW5nKGNsYXNzQXR0cikpOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9jbGFzc0xpc3Quc2V0U3RyaW5n
KEF0b21pY1N0cmluZyhzdHIgKyBzUG9zLCBlUG9zIC0gc1BvcykpOwotICAgICAgICAgICAgY3Vy
ciA9ICZtX2NsYXNzTGlzdDsKLSAgICAgICAgfQotICAgICAgICBzUG9zID0gZVBvcyArIDE7Ci0g
ICAgfQotfQotCi1TdHlsZWRFbGVtZW50OjpTdHlsZWRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5h
bWUmIG5hbWUsIERvY3VtZW50ICpkb2MpCi0gICAgOiBFbGVtZW50KG5hbWUsIGRvYykKLXsKLSAg
ICBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCA9IHRydWU7Ci0gICAgbV9zeW5jaHJvbml6aW5nU3R5
bGVBdHRyaWJ1dGUgPSBmYWxzZTsKLX0KLQotU3R5bGVkRWxlbWVudDo6flN0eWxlZEVsZW1lbnQo
KQotewotICAgIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLX0KLQotQXR0cmlidXRlKiBTdHls
ZWRFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3Ry
aW5nSW1wbCogdmFsdWUpCi17Ci0gICAgcmV0dXJuIG5ldyBNYXBwZWRBdHRyaWJ1dGUobmFtZSwg
dmFsdWUpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUlubGluZVN0eWxlRGVjbCgp
Ci17Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wgPSBuZXcgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b247Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldFBhcmVudChnZXREb2N1bWVudCgpLT5lbGVt
ZW50U2hlZXQoKSk7Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAg
bV9pbmxpbmVTdHlsZURlY2wtPnNldFN0cmljdFBhcnNpbmcoIWdldERvY3VtZW50KCktPmluQ29t
cGF0TW9kZSgpKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpkZXN0cm95SW5saW5lU3R5bGVE
ZWNsKCkKLXsKLSAgICBpZiAobV9pbmxpbmVTdHlsZURlY2wpIHsKLSAgICAgICAgbV9pbmxpbmVT
dHlsZURlY2wtPnNldE5vZGUoMCk7Ci0gICAgICAgIG1faW5saW5lU3R5bGVEZWNsLT5zZXRQYXJl
bnQoMCk7Ci0gICAgICAgIG1faW5saW5lU3R5bGVEZWNsID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQg
U3R5bGVkRWxlbWVudDo6YXR0cmlidXRlQ2hhbmdlZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJl
c2VydmVEZWNscykKLXsKLSAgICBNYXBwZWRBdHRyaWJ1dGUqIG1hcHBlZEF0dHIgPSBzdGF0aWNf
Y2FzdDxNYXBwZWRBdHRyaWJ1dGUqPihhdHRyKTsKLSAgICBpZiAobWFwcGVkQXR0ci0+ZGVjbCgp
ICYmICFwcmVzZXJ2ZURlY2xzKSB7Ci0gICAgICAgIG1hcHBlZEF0dHItPnNldERlY2woMCk7Ci0g
ICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAg
ICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbFJlbW92ZWQoKTsKLSAgICB9Ci0KLSAgICBib29s
IGNoZWNrRGVjbCA9IHRydWU7Ci0gICAgTWFwcGVkQXR0cmlidXRlRW50cnkgZW50cnk7Ci0gICAg
Ym9vbCBuZWVkVG9QYXJzZSA9IG1hcFRvRW50cnkoYXR0ci0+bmFtZSgpLCBlbnRyeSk7Ci0gICAg
aWYgKHByZXNlcnZlRGVjbHMpIHsKLSAgICAgICAgaWYgKG1hcHBlZEF0dHItPmRlY2woKSkgewot
ICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkK
LSAgICAgICAgICAgICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPmRlY2xBZGRlZCgpOwotICAgICAg
ICAgICAgY2hlY2tEZWNsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAo
IWF0dHItPmlzTnVsbCgpICYmIGVudHJ5ICE9IGVOb25lKSB7Ci0gICAgICAgIENTU01hcHBlZEF0
dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gZ2V0TWFwcGVkQXR0cmlidXRlRGVjbChlbnRyeSwg
YXR0cik7Ci0gICAgICAgIGlmIChkZWNsKSB7Ci0gICAgICAgICAgICBtYXBwZWRBdHRyLT5zZXRE
ZWNsKGRlY2wpOwotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKG5h
bWVkQXR0ck1hcCkKLSAgICAgICAgICAgICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPmRlY2xBZGRl
ZCgpOwotICAgICAgICAgICAgY2hlY2tEZWNsID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZQotICAg
ICAgICAgICAgbmVlZFRvUGFyc2UgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChuZWVkVG9QYXJz
ZSkKLSAgICAgICAgcGFyc2VNYXBwZWRBdHRyaWJ1dGUobWFwcGVkQXR0cik7Ci0gICAgCi0gICAg
aWYgKGNoZWNrRGVjbCAmJiBtYXBwZWRBdHRyLT5kZWNsKCkpIHsKLSAgICAgICAgLy8gQWRkIHRo
ZSBkZWNsIHRvIHRoZSB0YWJsZSBpbiB0aGUgYXBwcm9wcmlhdGUgc3BvdC4KLSAgICAgICAgc2V0
TWFwcGVkQXR0cmlidXRlRGVjbChlbnRyeSwgYXR0ciwgbWFwcGVkQXR0ci0+ZGVjbCgpKTsKLSAg
ICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgpLT5zZXRNYXBwZWRTdGF0ZShlbnRyeSwgYXR0ci0+bmFt
ZSgpLCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgpLT5zZXRQYXJl
bnQoMCk7Ci0gICAgICAgIG1hcHBlZEF0dHItPmRlY2woKS0+c2V0Tm9kZSgwKTsKLSAgICAgICAg
aWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbEFk
ZGVkKCk7Ci0gICAgfQotfQotCi1ib29sIFN0eWxlZEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNv
bnN0Ci17Ci0gICAgcmVzdWx0ID0gZU5vbmU7Ci0gICAgaWYgKGF0dHJOYW1lID09IHN0eWxlQXR0
cikKLSAgICAgICAgcmV0dXJuICFtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZTsKLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBpZEF0
dHIpIHsKLSAgICAgICAgLy8gdW5pcXVlIGlkCi0gICAgICAgIHNldEhhc0lEKCFhdHRyLT5pc051
bGwoKSk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJNYXApIHsKLSAgICAgICAgICAgIGlmIChhdHRy
LT5pc051bGwoKSkKLSAgICAgICAgICAgICAgICBuYW1lZEF0dHJNYXAtPnNldElEKG51bGxBdG9t
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGdldERvY3VtZW50KCktPmluQ29tcGF0TW9kZSgpICYm
ICFhdHRyLT52YWx1ZSgpLmltcGwoKS0+aXNMb3dlcigpKQotICAgICAgICAgICAgICAgIG5hbWVk
QXR0ck1hcC0+c2V0SUQoQXRvbWljU3RyaW5nKGF0dHItPnZhbHVlKCkuZG9tU3RyaW5nKCkubG93
ZXIoKSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG5hbWVkQXR0ck1hcC0+
c2V0SUQoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q2hhbmdlZCgpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNsYXNzQXR0cikgewotICAgICAgICAvLyBj
bGFzcwotICAgICAgICBzZXRIYXNDbGFzcyghYXR0ci0+aXNOdWxsKCkpOwotICAgICAgICBpZiAo
bmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5wYXJzZUNsYXNz
QXR0cmlidXRlKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc3R5bGVBdHRyKSB7Ci0gICAgICAgIHNldEhhc1N0eWxl
KCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAgIGlmIChhdHRyLT5pc051bGwoKSkKLSAgICAgICAg
ICAgIGRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
Z2V0SW5saW5lU3R5bGVEZWNsKCktPnBhcnNlRGVjbGFyYXRpb24oYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgc2V0Q2hhbmdl
ZCgpOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGVNYXAo
KSBjb25zdAotewotICAgIG5hbWVkQXR0ck1hcCA9IG5ldyBOYW1lZE1hcHBlZEF0dHJNYXAoY29u
c3RfY2FzdDxTdHlsZWRFbGVtZW50Kj4odGhpcykpOwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbiogU3R5bGVkRWxlbWVudDo6Z2V0SW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBpZiAo
IW1faW5saW5lU3R5bGVEZWNsKQotICAgICAgICBjcmVhdGVJbmxpbmVTdHlsZURlY2woKTsKLSAg
ICByZXR1cm4gbV9pbmxpbmVTdHlsZURlY2wuZ2V0KCk7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRp
b24qIFN0eWxlZEVsZW1lbnQ6OnN0eWxlKCkKLXsKLSAgICByZXR1cm4gZ2V0SW5saW5lU3R5bGVE
ZWNsKCk7Ci19Ci0KLUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50Ojph
ZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotY29u
c3QgQXRvbWljU3RyaW5nTGlzdCogU3R5bGVkRWxlbWVudDo6Z2V0Q2xhc3NMaXN0KCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbmFtZWRBdHRyTWFwID8gbWFwcGVkQXR0cmlidXRlcygpLT5nZXRDbGFz
c0xpc3QoKSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0hleERpZ2l0KCBjb25zdCBR
Q2hhciAmYyApIHsKLSAgICByZXR1cm4gKCBjID49ICcwJyAmJiBjIDw9ICc5JyApIHx8Ci0gICAg
ICAgICAgICggYyA+PSAnYScgJiYgYyA8PSAnZicgKSB8fAotICAgICAgICAgICAoIGMgPj0gJ0En
ICYmIGMgPD0gJ0YnICk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRvSGV4KCBjb25zdCBRQ2hh
ciAmYyApIHsKLSAgICByZXR1cm4gKCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAg
ICAgPyAoYy51bmljb2RlKCkgLSAnMCcpCi0gICAgICAgICAgICAgOiAoICggYyA+PSAnYScgJiYg
YyA8PSAnZicgKQotICAgICAgICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAtICdhJyArIDEwKQot
ICAgICAgICAgICAgICAgICA6ICggKCBjID49ICdBJyAmJiBjIDw9ICdGJyApCi0gICAgICAgICAg
ICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAtICdBJyArIDEwKQotICAgICAgICAgICAgICAgICAg
ICAgOiAtMSApICkgKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NQcm9wZXJ0eShN
YXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5k
ZWNsKCktPnNldFByb3BlcnR5KGlkLCB2YWx1ZSwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVs
ZW1lbnQ6OmFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBpbnQg
dmFsdWUpCi17Ci0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7
Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRQcm9wZXJ0eShpZCwgdmFsdWUsIGZhbHNlKTsKLX0KLQot
dm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NTdHJpbmdQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUq
IGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWU6OlVu
aXRUeXBlcyB0eXBlKQotewotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNs
KGF0dHIpOwotICAgIGF0dHItPmRlY2woKS0+c2V0U3RyaW5nUHJvcGVydHkoaWQsIHZhbHVlLCB0
eXBlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NTSW1hZ2VQcm9wZXJ0
eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZVUkwpCi17Ci0g
ICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+
ZGVjbCgpLT5zZXRJbWFnZVByb3BlcnR5KGlkLCBVUkwsIGZhbHNlKTsKLX0KLQotdm9pZCBTdHls
ZWRFbGVtZW50OjphZGRDU1NMZW5ndGgoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gc2hvdWxk
IG5vdCBzcGluIHVwIHRoZSBDU1MgcGFyc2VyLCBidXQgc2hvdWxkIGluc3RlYWQganVzdCBmaWd1
cmUgb3V0IHRoZSBjb3JyZWN0Ci0gICAgLy8gbGVuZ3RoIHVuaXQgYW5kIG1ha2UgdGhlIGFwcHJv
cHJpYXRlIHBhcnNlZCB2YWx1ZS4KLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVk
RGVjbChhdHRyKTsKLQotICAgIC8vIHN0cmlwIGF0dHJpYnV0ZSBnYXJiYWdlLi4KLSAgICBTdHJp
bmdJbXBsKiB2ID0gdmFsdWUuaW1wbCgpOwotICAgIGlmICh2KSB7Ci0gICAgICAgIHVuc2lnbmVk
IGludCBsID0gMDsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChsIDwgdi0+bGVuZ3RoKCkgJiYg
KCp2KVtsXS51bmljb2RlKCkgPD0gJyAnKQotICAgICAgICAgICAgbCsrOwotICAgICAgICAKLSAg
ICAgICAgZm9yICg7IGwgPCB2LT5sZW5ndGgoKTsgbCsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNj
ID0gKCp2KVtsXS5sYXRpbjEoKTsKLSAgICAgICAgICAgIGlmIChjYyA+ICc5JyB8fCAoY2MgPCAn
MCcgJiYgY2MgIT0gJyonICYmIGNjICE9ICclJyAmJiBjYyAhPSAnLicpKQotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGwgIT0gdi0+bGVuZ3RoKCkpIHsK
LSAgICAgICAgICAgIGF0dHItPmRlY2woKS0+c2V0TGVuZ3RoUHJvcGVydHkoaWQsIHYtPnN1YnN0
cmluZygwLCBsKSwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAg
fQotICAgIAotICAgIGF0dHItPmRlY2woKS0+c2V0TGVuZ3RoUHJvcGVydHkoaWQsIHZhbHVlLCBm
YWxzZSk7Ci19Ci0KLS8qIGNvbG9yIHBhcnNpbmcgdGhhdCB0cmllcyB0byBtYXRjaCBhcyBjbG9z
ZSBhcyBwb3NzaWJsZSBJRSA2LiAqLwotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NDb2xvcihN
YXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZjKQotewotICAgIC8v
IHRoaXMgaXMgdGhlIG9ubHkgY2FzZSBubyBjb2xvciBnZXRzIGFwcGxpZWQgaW4gSUUuCi0gICAg
aWYgKCAhYy5sZW5ndGgoKSApCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghYXR0ci0+ZGVj
bCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIAotICAgIGlmIChhdHRyLT5kZWNsKCkt
PnNldFByb3BlcnR5KGlkLCBjLCBmYWxzZSkgKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAg
RGVwcmVjYXRlZFN0cmluZyBjb2xvciA9IGMuZGVwcmVjYXRlZFN0cmluZygpOwotICAgIC8vIG5v
dCBzb21ldGhpbmcgdGhhdCBmaXRzIHRoZSBzcGVjcy4KLSAgICAKLSAgICAvLyB3ZSdyZSBlbXVs
YXRpbmcgSUVzIGNvbG9yIHBhcnNlciBoZXJlLiBJdCBtYXBzIHRyYW5zcGFyZW50IHRvIGJsYWNr
LCBvdGhlcndpc2UgaXQgdHJpZXMgdG8gYnVpbGQgYSByZ2IgdmFsdWUKLSAgICAvLyBvdXQgb2Yg
ZXZlcnlodGluZyB5b3UgcHV0IGluLiBUaGUgYWxnb3JpdGhtIGlzIGV4cGVyaW1lbnRhbGx5IGRl
dGVybWluZWQsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBhbGwgdGVzdCBjYXNlcyBJIGhhdmUuCi0g
ICAgCi0gICAgLy8gdGhlIGxlbmd0aCBvZiB0aGUgY29sb3IgdmFsdWUgaXMgcm91bmRlZCB1cCB0
byB0aGUgbmV4dAotICAgIC8vIG11bHRpcGxlIG9mIDMuIGVhY2ggcGFydCBvZiB0aGUgcmdiIHRy
aXBsZSB0aGVuIGdldHMgb25lIHRoaXJkCi0gICAgLy8gb2YgdGhlIGxlbmd0aC4KLSAgICAvLwot
ICAgIC8vIEVhY2ggdHJpcGxldCBpcyBwYXJzZWQgYnl0ZSBieSBieXRlLCBtYXBwaW5nCi0gICAg
Ly8gZWFjaCBudW1iZXIgdG8gYSBoZXggdmFsdWUgKDAtOWEtZkEtRiB0byB0aGVpciB2YWx1ZXMK
LSAgICAvLyBldmVyeXRoaW5nIGVsc2UgdG8gMCkuCi0gICAgLy8KLSAgICAvLyBUaGUgaGlnaGVz
dCBub24gemVybyBkaWdpdCBpbiBhbGwgdHJpcGxldHMgaXMgcmVtZW1iZXJlZCwgYW5kCi0gICAg
Ly8gdXNlZCBhcyBhIG5vcm1hbGl6YXRpb24gcG9pbnQgdG8gbm9ybWFsaXplIHRvIHZhbHVlcyBi
ZXR3ZWVuIDAKLSAgICAvLyBhbmQgMjU1LgotICAgIAotICAgIGlmICggY29sb3IubG93ZXIoKSAh
PSAidHJhbnNwYXJlbnQiICkgewotICAgICAgICBpZiAoIGNvbG9yWzBdID09ICcjJyApCi0gICAg
ICAgICAgICBjb2xvci5yZW1vdmUoIDAsICAxICk7Ci0gICAgICAgIGludCBiYXNpY0xlbmd0aCA9
IChjb2xvci5sZW5ndGgoKSArIDIpIC8gMzsKLSAgICAgICAgaWYgKCBiYXNpY0xlbmd0aCA+IDEg
KSB7Ci0gICAgICAgICAgICAvLyBJRSBpZ25vcmVzIGNvbG9ycyB3aXRoIHRocmVlIGRpZ2l0cyBv
ciBsZXNzCi0gICAgICAgICAgICBpbnQgY29sb3JzWzNdID0geyAwLCAwLCAwIH07Ci0gICAgICAg
ICAgICBpbnQgY29tcG9uZW50ID0gMDsKLSAgICAgICAgICAgIGludCBwb3MgPSAwOwotICAgICAg
ICAgICAgaW50IG1heERpZ2l0ID0gYmFzaWNMZW5ndGgtMTsKLSAgICAgICAgICAgIHdoaWxlICgg
Y29tcG9uZW50IDwgMyApIHsKLSAgICAgICAgICAgICAgICAvLyBzZWFyY2ggZm9yd2FyZCBmb3Ig
ZGlnaXRzIGluIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAgICBpbnQgbnVtRGlnaXRzID0gMDsK
LSAgICAgICAgICAgICAgICB3aGlsZSAoIHBvcyA8IChpbnQpY29sb3IubGVuZ3RoKCkgJiYgbnVt
RGlnaXRzIDwgYmFzaWNMZW5ndGggKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBoZXggPSB0
b0hleCggY29sb3JbcG9zXSApOwotICAgICAgICAgICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50
XSA9IChjb2xvcnNbY29tcG9uZW50XSA8PCA0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBo
ZXggPiAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzW2NvbXBvbmVudF0gKz0g
aGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGlnaXQgPSBrTWluKCBtYXhEaWdpdCwg
bnVtRGlnaXRzICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
bnVtRGlnaXRzKys7Ci0gICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIG51bURpZ2l0cysrIDwgYmFzaWNMZW5ndGggKQot
ICAgICAgICAgICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50XSA8PD0gNDsKLSAgICAgICAgICAg
ICAgICBjb21wb25lbnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heERpZ2l0ID0g
YmFzaWNMZW5ndGggLSBtYXhEaWdpdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbm9y
bWFsaXplIHRvIDAwLWZmLiBUaGUgaGlnaGVzdCBmaWxsZWQgZGlnaXQgY291bnRzLCBtaW5pbXVt
IGlzIDIgZGlnaXRzCi0gICAgICAgICAgICBtYXhEaWdpdCAtPSAyOwotICAgICAgICAgICAgY29s
b3JzWzBdID4+PSA0Km1heERpZ2l0OwotICAgICAgICAgICAgY29sb3JzWzFdID4+PSA0Km1heERp
Z2l0OwotICAgICAgICAgICAgY29sb3JzWzJdID4+PSA0Km1heERpZ2l0OwotICAgICAgICAgICAg
Ly8gYXNzZXJ0KCBjb2xvcnNbMF0gPCAweDEwMCAmJiBjb2xvcnNbMV0gPCAweDEwMCAmJiBjb2xv
cnNbMl0gPCAweDEwMCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb2xvci5zcHJpbnRm
KCIjJTAyeCUwMnglMDJ4IiwgY29sb3JzWzBdLCBjb2xvcnNbMV0sIGNvbG9yc1syXSApOwotICAg
ICAgICAgICAgaWYgKCBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCBTdHJpbmcoY29sb3Ip
LCBmYWxzZSkgKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAg
ICBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCBDU1NfVkFMX0JMQUNLLCBmYWxzZSk7Ci19
Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6Y3JlYXRlTWFwcGVkRGVjbChNYXBwZWRBdHRyaWJ1dGUq
IGF0dHIpCi17Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBuZXcg
Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgYXR0ci0+c2V0RGVjbChkZWNs
KTsKLSAgICBkZWNsLT5zZXRQYXJlbnQoZ2V0RG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0KCkpOwot
ICAgIGRlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgZGVjbC0+c2V0U3RyaWN0UGFyc2luZyhmYWxz
ZSk7IC8vIE1hcHBlZCBhdHRyaWJ1dGVzIGFyZSBqdXN0IGFsd2F5cyBxdWlya3kuCi19Ci0KLS8v
IEdvbGRlbiByYXRpbyAtIGFyYml0cmFyeSBzdGFydCB2YWx1ZSB0byBhdm9pZCBtYXBwaW5nIGFs
bCAwJ3MgdG8gYWxsIDAncwotLy8gb3IgYW55dGhpbmcgbGlrZSB0aGF0LgotY29uc3QgdW5zaWdu
ZWQgUEhJID0gMHg5ZTM3NzliOVU7Ci0KLS8vIFBhdWwgSHNpZWgncyBTdXBlckZhc3RIYXNoCi0v
LyBodHRwOi8vd3d3LmF6aWxsaW9ubW9ua2V5cy5jb20vcWVkL2hhc2guaHRtbAotdW5zaWduZWQg
TWFwcGVkQXR0cmlidXRlSGFzaDo6aGFzaChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGtleSkK
LXsKLSAgICB1aW50MzJfdCBoYXNoID0gUEhJOwotICAgIHVpbnQzMl90IHRtcDsKLQotICAgIGNv
bnN0IHVpbnQxNl90KiBwOwotCi0gICAgcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2
X3QqPigma2V5Lm5hbWUpOwotICAgIGhhc2ggKz0gcFswXTsKLSAgICB0bXAgPSAocFsxXSA8PCAx
MSkgXiBoYXNoOwotICAgIGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgaGFzaCArPSBo
YXNoID4+IDExOwotICAgIGFzc2VydChzaXplb2Yoa2V5Lm5hbWUpID09IDQgfHwgc2l6ZW9mKGtl
eS5uYW1lKSA9PSA4KTsKLSAgICBpZiAoc2l6ZW9mKGtleS5uYW1lKSA9PSA4KSB7Ci0gICAgICAg
IHAgKz0gMjsKLSAgICAgICAgaGFzaCArPSBwWzBdOwotICAgICAgICB0bXAgPSAocFsxXSA8PCAx
MSkgXiBoYXNoOwotICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgICAgICBo
YXNoICs9IGhhc2ggPj4gMTE7Ci0gICAgfQotCi0gICAgcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgdWludDE2X3QqPigma2V5LnZhbHVlKTsKLSAgICBoYXNoICs9IHBbMF07Ci0gICAgdG1wID0g
KHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAg
IGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAgICBhc3NlcnQoc2l6ZW9mKGtleS52YWx1ZSkgPT0gNCB8
fCBzaXplb2Yoa2V5LnZhbHVlKSA9PSA4KTsKLSAgICBpZiAoc2l6ZW9mKGtleS52YWx1ZSkgPT0g
OCkgewotICAgICAgICBwICs9IDI7Ci0gICAgICAgIGhhc2ggKz0gcFswXTsKLSAgICAgICAgdG1w
ID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAgICAgICAgaGFzaCA9IChoYXNoIDw8IDE2KSBeIHRt
cDsKLSAgICAgICAgaGFzaCArPSBoYXNoID4+IDExOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBl
bmQgY2FzZQotICAgIGhhc2ggKz0ga2V5LnR5cGU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDExOwot
ICAgIGhhc2ggKz0gaGFzaCA+PiAxNzsKLQotICAgIC8vIEZvcmNlICJhdmFsYW5jaGluZyIgb2Yg
ZmluYWwgMTI3IGJpdHMKLSAgICBoYXNoIF49IGhhc2ggPDwgMzsKLSAgICBoYXNoICs9IGhhc2gg
Pj4gNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMjsKLSAgICBoYXNoICs9IGhhc2ggPj4gMTU7Ci0g
ICAgaGFzaCBePSBoYXNoIDw8IDEwOwotCi0gICAgLy8gVGhpcyBhdm9pZHMgZXZlciByZXR1cm5p
bmcgYSBoYXNoIGNvZGUgb2YgMCwgc2luY2UgdGhhdCBpcyB1c2VkIHRvCi0gICAgLy8gc2lnbmFs
ICJoYXNoIG5vdCBjb21wdXRlZCB5ZXQiLCB1c2luZyBhIHZhbHVlIHRoYXQgaXMgbGlrZWx5IHRv
IGJlCi0gICAgLy8gZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgMCB3aGVuIHRoZSBsb3cgYml0cyBh
cmUgbWFza2VkCi0gICAgaWYgKGhhc2ggPT0gMCkKLSAgICAgICAgaGFzaCA9IDB4ODAwMDAwMDA7
Ci0KLSAgICByZXR1cm4gaGFzaDsKLX0KLQogfQpJbmRleDogZG9tL01hcHBlZEF0dHJpYnV0ZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gZG9tL01hcHBlZEF0dHJpYnV0ZS5jcHAJKHJldmlzaW9uIDEzNDc3
KQorKysgZG9tL01hcHBlZEF0dHJpYnV0ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDE2Mzcg
KzIyLDE0IEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1w
bGUgUGxhY2UgLSBTdWl0ZSAzMzAsCiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAq
LwotCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiZG9tX2VsZW1lbnRpbXBsLmgiCi0K
LSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRl
ICJUZXh0LmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3Nz
X3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJD
U1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVk
ZSAiZG9tX3htbGltcGwuaCIKLSNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJIVE1M
UGFyc2VyLmgiCi0jaW5jbHVkZSAiUmVuZGVyQ2FudmFzLmgiCi0jaW5jbHVkZSA8cXRleHRzdHJl
YW0uaD4KKyNpbmNsdWRlICJNYXBwZWRBdHRyaWJ1dGUuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1zdHJ1Y3QgTWFwcGVkQXR0cmlidXRl
S2V5IHsKLSAgICB1aW50MTZfdCB0eXBlOwotICAgIFN0cmluZ0ltcGwqIG5hbWU7Ci0gICAgU3Ry
aW5nSW1wbCogdmFsdWU7Ci0gICAgTWFwcGVkQXR0cmlidXRlS2V5KE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5IHQsIFN0cmluZ0ltcGwqIG4sIFN0cmluZ0ltcGwqIHYpCi0gICAgICAgIDogdHlwZSh0KSwg
bmFtZShuKSwgdmFsdWUodikgeyB9Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGEsIGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYg
YikKLSAgICB7IHJldHVybiBhLnR5cGUgPT0gYi50eXBlICYmIGEubmFtZSA9PSBiLm5hbWUgJiYg
YS52YWx1ZSA9PSBiLnZhbHVlOyB9IAotCi1zdHJ1Y3QgTWFwcGVkQXR0cmlidXRlS2V5VHJhaXRz
IHsKLSAgICB0eXBlZGVmIE1hcHBlZEF0dHJpYnV0ZUtleSBUcmFpdFR5cGU7Ci0gICAgc3RhdGlj
IGNvbnN0IGJvb2wgZW1wdHlWYWx1ZUlzWmVybyA9IHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IGJv
b2wgbmVlZHNEZXN0cnVjdGlvbiA9IGZhbHNlOwotICAgIHN0YXRpYyBNYXBwZWRBdHRyaWJ1dGVL
ZXkgZW1wdHlWYWx1ZSgpIHsgcmV0dXJuIE1hcHBlZEF0dHJpYnV0ZUtleShlTm9uZSwgMCwgMCk7
IH0KLSAgICBzdGF0aWMgTWFwcGVkQXR0cmlidXRlS2V5IGRlbGV0ZWRWYWx1ZSgpIHsgcmV0dXJu
IE1hcHBlZEF0dHJpYnV0ZUtleShlTGFzdEVudHJ5LCAwLCAwKTsgfQotfTsKLQotc3RydWN0IE1h
cHBlZEF0dHJpYnV0ZUhhc2ggewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IE1hcHBl
ZEF0dHJpYnV0ZUtleSYpOwotICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IE1hcHBlZEF0dHJp
YnV0ZUtleSYgYSwgY29uc3QgTWFwcGVkQXR0cmlidXRlS2V5JiBiKSB7IHJldHVybiBhID09IGI7
IH0KLX07Ci0KLXR5cGVkZWYgSGFzaE1hcDxNYXBwZWRBdHRyaWJ1dGVLZXksIENTU01hcHBlZEF0
dHJpYnV0ZURlY2xhcmF0aW9uKiwgTWFwcGVkQXR0cmlidXRlSGFzaCwgTWFwcGVkQXR0cmlidXRl
S2V5VHJhaXRzPiBNYXBwZWRBdHRyaWJ1dGVEZWNsczsKLQotc3RhdGljIE1hcHBlZEF0dHJpYnV0
ZURlY2xzKiBtYXBwZWRBdHRyaWJ1dGVEZWNscyA9IDA7Ci0KLUF0dHJpYnV0ZSogQXR0cmlidXRl
OjpjbG9uZShib29sKSBjb25zdAotewotICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG1fbmFtZSwg
bV92YWx1ZSk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gQXR0cmlidXRlOjpjcmVhdGVBdHRySWZO
ZWVkZWQoRWxlbWVudCogZSkKLXsKLSAgICBSZWZQdHI8QXR0cj4gcihtX2ltcGwpOwotICAgIGlm
ICghcikgewotICAgICAgICByID0gbmV3IEF0dHIoZSwgZS0+Z2V0RG9jdW1lbnQoKSwgdGhpcyk7
Ci0gICAgICAgIHItPmNyZWF0ZVRleHRDaGlsZCgpOwotICAgIH0KLSAgICByZXR1cm4gci5yZWxl
YXNlKCk7Ci19Ci0KLUF0dHI6OkF0dHIoRWxlbWVudCogZWxlbWVudCwgRG9jdW1lbnQqIGRvY1B0
ciwgQXR0cmlidXRlKiBhKQotICAgIDogQ29udGFpbmVyTm9kZShkb2NQdHIpLAotICAgICAgbV9l
bGVtZW50KGVsZW1lbnQpLAotICAgICAgbV9hdHRyaWJ1dGUoYSksCi0gICAgICBtX2lnbm9yZUNo
aWxkcmVuQ2hhbmdlZCgwKQotewotICAgIGFzc2VydCghbV9hdHRyaWJ1dGUtPm1faW1wbCk7Ci0g
ICAgbV9hdHRyaWJ1dGUtPm1faW1wbCA9IHRoaXM7Ci0gICAgbV9zcGVjaWZpZWQgPSB0cnVlOwot
fQotCi1BdHRyOjp+QXR0cigpCi17Ci0gICAgYXNzZXJ0KG1fYXR0cmlidXRlLT5tX2ltcGwgPT0g
dGhpcyk7Ci0gICAgbV9hdHRyaWJ1dGUtPm1faW1wbCA9IDA7Ci19Ci0KLXZvaWQgQXR0cjo6Y3Jl
YXRlVGV4dENoaWxkKCkKLXsKLSAgICBhc3NlcnQocmVmQ291bnQoKSk7Ci0gICAgaWYgKCFtX2F0
dHJpYnV0ZS0+dmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7Ci0gICAgICAgIG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkKys7Ci0gICAgICAgIGFwcGVuZENo
aWxkKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKG1fYXR0cmlidXRlLT52YWx1ZSgpLmlt
cGwoKSksIGVjKTsKLSAgICAgICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQtLTsKLSAgICB9Ci19
Ci0KLVN0cmluZyBBdHRyOjpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWUoKTsK
LX0KLQotTm9kZTo6Tm9kZVR5cGUgQXR0cjo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJldHVy
biBBVFRSSUJVVEVfTk9ERTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBBdHRyOjpsb2NhbE5h
bWUoKSBjb25zdAotewotICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+bG9jYWxOYW1lKCk7Ci19Ci0K
LWNvbnN0IEF0b21pY1N0cmluZyYgQXR0cjo6bmFtZXNwYWNlVVJJKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV9hdHRyaWJ1dGUtPm5hbWVzcGFjZVVSSSgpOwotfQotCi1jb25zdCBBdG9taWNTdHJp
bmcmIEF0dHI6OnByZWZpeCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXR0cmlidXRlLT5wcmVm
aXgoKTsKLX0KLQotdm9pZCBBdHRyOjpzZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJl
Zml4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBjaGVja1NldFByZWZpeChfcHJlZml4LCBl
Yyk7Ci0gICAgaWYgKGVjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2F0dHJpYnV0ZS0+c2V0
UHJlZml4KF9wcmVmaXgpOwotfQotCi1TdHJpbmcgQXR0cjo6bm9kZVZhbHVlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gdmFsdWUoKTsKLX0KLQotdm9pZCBBdHRyOjpzZXRWYWx1ZSggY29uc3QgU3Ry
aW5nJiB2LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBlYyA9IDA7Ci0KLSAgICAvLyBkbyBu
b3QgaW50ZXJwcmV0ZSBlbnRpdGllcyBpbiB0aGUgc3RyaW5nLCBpdHMgbGl0ZXJhbCEKLQotICAg
IC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMg
cmVhZG9ubHkKLSAgICBpZiAoaXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJ
Q0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gIyMj
IHdoYXQgdG8gZG8gb24gMCA/Ci0gICAgaWYgKHYuaXNOdWxsKCkpIHsKLSAgICAgICAgZWMgPSBE
T01TVFJJTkdfU0laRV9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgZSA9
IDA7Ci0gICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQrKzsKLSAgICByZW1vdmVDaGlsZHJlbigp
OwotICAgIGFwcGVuZENoaWxkKGdldERvY3VtZW50KCktPmNyZWF0ZVRleHROb2RlKHYuaW1wbCgp
KSwgZSk7Ci0gICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQtLTsKLSAgICAKLSAgICBtX2F0dHJp
YnV0ZS0+c2V0VmFsdWUodi5pbXBsKCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAgICAgIG1f
ZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0KLXZvaWQg
QXR0cjo6c2V0Tm9kZVZhbHVlKGNvbnN0IFN0cmluZyYgdiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiB0YWtlbiBjYXJlIG9mIGJ5IHNl
dFZhbHVlKCkKLSAgICBzZXRWYWx1ZSh2LCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gQXR0
cjo6Y2xvbmVOb2RlKGJvb2wgLypkZWVwKi8pCi17Ci0gICAgUmVmUHRyPEF0dHI+IGNsb25lID0g
bmV3IEF0dHIoMCwgZ2V0RG9jdW1lbnQoKSwgbV9hdHRyaWJ1dGUtPmNsb25lKCkpOwotICAgIGNs
b25lQ2hpbGROb2RlcyhjbG9uZS5nZXQoKSk7Ci0gICAgcmV0dXJuIGNsb25lLnJlbGVhc2UoKTsK
LX0KLQotLy8gRE9NIFNlY3Rpb24gMS4xLjEKLWJvb2wgQXR0cjo6Y2hpbGRUeXBlQWxsb3dlZChO
b2RlVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIFRFWFRf
Tk9ERToKLSAgICAgICAgY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci19Ci0KLXZvaWQgQXR0cjo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBOb2RlOjpj
aGlsZHJlbkNoYW5nZWQoKTsKLSAgICAKLSAgICBpZiAobV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQg
PiAwKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gRklYTUU6IFdlIHNob3VsZCBpbmNs
dWRlIGVudGl0eSByZWZlcmVuY2VzIGluIHRoZSB2YWx1ZQotICAgIAotICAgIFN0cmluZyB2YWwg
PSAiIjsKLSAgICBmb3IgKE5vZGUgKm4gPSBmaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2li
bGluZygpKSB7Ci0gICAgICAgIGlmIChuLT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICB2YWwg
Kz0gc3RhdGljX2Nhc3Q8VGV4dCAqPihuKS0+ZGF0YSgpOwotICAgIH0KLSAgICAKLSAgICBtX2F0
dHJpYnV0ZS0+c2V0VmFsdWUodmFsLmltcGwoKSk7Ci0gICAgaWYgKG1fZWxlbWVudCkKLSAgICAg
ICAgbV9lbGVtZW50LT5hdHRyaWJ1dGVDaGFuZ2VkKG1fYXR0cmlidXRlLmdldCgpKTsKLX0KLQot
U3RyaW5nIEF0dHI6OnRvU3RyaW5nKCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0OwotCi0g
ICAgcmVzdWx0ICs9IG5vZGVOYW1lKCk7Ci0KLSAgICAvLyBGSVhNRTogc3Vic3RpdHV0ZSBlbnRp
dGllcyBmb3IgYW55IGluc3RhbmNlcyBvZiAiIG9yICcgLS0KLSAgICAvLyBtYXliZSBlYXNpZXIg
dG8ganVzdCB1c2UgdGV4dCB2YWx1ZSBhbmQgaWdub3JlIGV4aXN0aW5nCi0gICAgLy8gZW50aXR5
IHJlZnM/Ci0KLSAgICBpZiAoZmlyc3RDaGlsZCgpICE9IE5VTEwpIHsKLSAgICAgICAgcmVzdWx0
ICs9ICI9XCIiOwotCi0gICAgICAgIGZvciAoTm9kZSAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNo
aWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAg
IHJlc3VsdCArPSBjaGlsZC0+dG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgcmVzdWx0ICs9ICJcIiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi0jaWZuZGVmIE5ERUJVRwotc3RydWN0IEVsZW1lbnRJbXBsQ291
bnRlciAKLXsgCi0gICAgc3RhdGljIGludCBjb3VudDsgCi0gICAgfkVsZW1lbnRJbXBsQ291bnRl
cigpIHsgLyogaWYgKGNvdW50ICE9IDApIGZwcmludGYoc3RkZXJyLCAiTEVBSzogJWQgRWxlbWVu
dFxuIiwgY291bnQpOyAqLyB9IAotfTsKLWludCBFbGVtZW50SW1wbENvdW50ZXI6OmNvdW50Owot
c3RhdGljIEVsZW1lbnRJbXBsQ291bnRlciBlbGVtZW50SW1wbENvdW50ZXI7Ci0jZW5kaWYgTkRF
QlVHCi0KLUVsZW1lbnQ6OkVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgcU5hbWUsIERvY3Vt
ZW50ICpkb2MpCi0gICAgOiBDb250YWluZXJOb2RlKGRvYyksIG1fdGFnTmFtZShxTmFtZSkKLXsK
LSNpZm5kZWYgTkRFQlVHCi0gICAgKytFbGVtZW50SW1wbENvdW50ZXI6OmNvdW50OwotI2VuZGlm
Ci19Ci0KLUVsZW1lbnQ6On5FbGVtZW50KCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgLS1FbGVt
ZW50SW1wbENvdW50ZXI6OmNvdW50OwotI2VuZGlmCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAg
ICAgICAgbmFtZWRBdHRyTWFwLT5kZXRhY2hGcm9tRWxlbWVudCgpOwotfQotCi1QYXNzUmVmUHRy
PE5vZGU+IEVsZW1lbnQ6OmNsb25lTm9kZShib29sIGRlZXApCi17Ci0gICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgUmVmUHRyPEVsZW1lbnQ+IGNsb25lID0gZ2V0RG9jdW1lbnQoKS0+Y3Jl
YXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSgpLCBub2RlTmFtZSgpLCBlYyk7Ci0gICAgYXNzZXJ0
KCFlYyk7Ci0gICAgCi0gICAgLy8gY2xvbmUgYXR0cmlidXRlcwotICAgIGlmIChuYW1lZEF0dHJN
YXApCi0gICAgICAgICpjbG9uZS0+YXR0cmlidXRlcygpID0gKm5hbWVkQXR0ck1hcDsKLQotICAg
IGNsb25lLT5jb3B5Tm9uQXR0cmlidXRlUHJvcGVydGllcyh0aGlzKTsKLSAgICAKLSAgICBpZiAo
ZGVlcCkKLSAgICAgICAgY2xvbmVDaGlsZE5vZGVzKGNsb25lLmdldCgpKTsKLQotICAgIHJldHVy
biBjbG9uZS5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6cmVtb3ZlQXR0cmlidXRlKGNv
bnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmIChu
YW1lZEF0dHJNYXApIHsKLSAgICAgICAgbmFtZWRBdHRyTWFwLT5yZW1vdmVOYW1lZEl0ZW0obmFt
ZSwgZWMpOwotICAgICAgICBpZiAoZWMgPT0gTk9UX0ZPVU5EX0VSUikKLSAgICAgICAgICAgIGVj
ID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIG5hbWUsIGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLmltcGwoKSwgZWMpOwotfQot
Ci0vLyBWaXJ0dWFsIGZ1bmN0aW9uLCBkZWZpbmVkIGluIGJhc2UgY2xhc3MuCi1OYW1lZEF0dHJN
YXAgKkVsZW1lbnQ6OmF0dHJpYnV0ZXMoKSBjb25zdAotewotICAgIHJldHVybiBhdHRyaWJ1dGVz
KGZhbHNlKTsKLX0KLQotTmFtZWRBdHRyTWFwKiBFbGVtZW50OjphdHRyaWJ1dGVzKGJvb2wgcmVh
ZG9ubHkpIGNvbnN0Ci17Ci0gICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotICAg
IGlmICghcmVhZG9ubHkgJiYgIW5hbWVkQXR0ck1hcCkKLSAgICAgICAgY3JlYXRlQXR0cmlidXRl
TWFwKCk7Ci0gICAgcmV0dXJuIG5hbWVkQXR0ck1hcC5nZXQoKTsKLX0KLQotTm9kZTo6Tm9kZVR5
cGUgRWxlbWVudDo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBFTEVNRU5UX05PREU7
Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIEVsZW1lbnQ6OmdldENsYXNzTGlzdCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6
Z2V0SURBdHRyaWJ1dGUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgPyBuYW1l
ZEF0dHJNYXAtPmlkKCkgOiBudWxsQXRvbTsKLX0KLQotYm9vbCBFbGVtZW50OjpoYXNBdHRyaWJ1
dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QKLXsKLSAgICByZXR1cm4gaGFzQXR0
cmlidXRlTlMobmFtZS5uYW1lc3BhY2VVUkkoKSwgbmFtZS5sb2NhbE5hbWUoKSk7Ci19Ci0KLWNv
bnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5h
bWUmIG5hbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG5hbWUgPT0gc3R5bGVBdHRyKQotICAgICAgICB1
cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCk7Ci0KLSAgICBpZiAobmFtZWRBdHRyTWFwKQot
ICAgICAgICBpZiAoQXR0cmlidXRlKiBhID0gbmFtZWRBdHRyTWFwLT5nZXRBdHRyaWJ1dGVJdGVt
KG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGEtPnZhbHVlKCk7Ci0KLSAgICByZXR1cm4gbnVs
bEF0b207Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2Nyb2xsSW50b1ZpZXcoYm9vbCBhbGlnblRvVG9w
KSAKLXsKLSAgICBJbnRSZWN0IGJvdW5kcyA9IHRoaXMtPmdldFJlY3QoKTsgICAgCi0gICAgaWYg
KHJlbmRlcmVyKCkpIHsKLSAgICAgICAgLy8gQWxpZ24gdG8gdGhlIHRvcCAvIGJvdHRvbSBhbmQg
dG8gdGhlIGNsb3Nlc3QgZWRnZS4KLSAgICAgICAgaWYgKGFsaWduVG9Ub3ApCi0gICAgICAgICAg
ICByZW5kZXJlcigpLT5lbmNsb3NpbmdMYXllcigpLT5zY3JvbGxSZWN0VG9WaXNpYmxlKGJvdW5k
cywgUmVuZGVyTGF5ZXI6OmdBbGlnblRvRWRnZUlmTmVlZGVkLCBSZW5kZXJMYXllcjo6Z0FsaWdu
VG9wQWx3YXlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9z
aW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxheWVyOjpnQWxp
Z25Ub0VkZ2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnbkJvdHRvbUFsd2F5cyk7Ci0gICAg
fQotfQotCi12b2lkIEVsZW1lbnQ6OnNjcm9sbEludG9WaWV3SWZOZWVkZWQoYm9vbCBjZW50ZXJJ
Zk5lZWRlZCkKLXsKLSAgICBJbnRSZWN0IGJvdW5kcyA9IHRoaXMtPmdldFJlY3QoKTsgICAgCi0g
ICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgaWYgKGNlbnRlcklmTmVlZGVkKQotICAgICAg
ICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShi
b3VuZHMsIFJlbmRlckxheWVyOjpnQWxpZ25DZW50ZXJJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdB
bGlnbkNlbnRlcklmTmVlZGVkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVuZGVyZXIo
KS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxh
eWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnblRvRWRnZUlmTmVl
ZGVkKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpbkhUTUxEb2N1bWVudChjb25z
dCBFbGVtZW50KiBlKQotewotICAgIHJldHVybiBlICYmIGUtPmdldERvY3VtZW50KCktPmlzSFRN
TERvY3VtZW50KCk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmli
dXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3QKLXsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0g
aW5IVE1MRG9jdW1lbnQodGhpcykgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVs
bEF0b20pKTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGVO
Uyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBs
b2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSk7Ci19Ci0KLXZvaWQgRWxlbWVu
dDo6c2V0QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFEb2N1bWVudDo6aXNWYWxpZE5hbWUobmFt
ZSkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8g
bmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICBzZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxs
QXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVsbEF0b20pLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0K
LQotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwg
U3RyaW5nSW1wbCogdmFsdWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmIChpbkRvY3Vt
ZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7Ci0KLSAg
ICAvLyBhbGxvY2F0ZSBhdHRyaWJ1dGVtYXAgaWYgbmVjZXNzYXJ5Ci0gICAgQXR0cmlidXRlKiBv
bGQgPSBhdHRyaWJ1dGVzKGZhbHNlKS0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKTsKLQotICAgIC8v
IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVh
ZG9ubHkKLSAgICBpZiAobmFtZWRBdHRyTWFwLT5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZWMg
PSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBpZiAobmFtZSA9PSBpZEF0dHIpCi0gICAgICAgIHVwZGF0ZUlkKG9sZCA/IG9sZC0+dmFs
dWUoKSA6IG51bGxBdG9tLCB2YWx1ZSk7Ci0gICAgCi0gICAgaWYgKG9sZCAmJiAhdmFsdWUpCi0g
ICAgICAgIG5hbWVkQXR0ck1hcC0+cmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgIGVsc2UgaWYg
KCFvbGQgJiYgdmFsdWUpCi0gICAgICAgIG5hbWVkQXR0ck1hcC0+YWRkQXR0cmlidXRlKGNyZWF0
ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOwotICAgIGVsc2UgaWYgKG9sZCAmJiB2YWx1ZSkgewot
ICAgICAgICBvbGQtPnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChv
bGQpOwotICAgIH0KLX0KLQotQXR0cmlidXRlKiBFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGUoY29u
c3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpCi17Ci0gICAgcmV0dXJu
IG5ldyBBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJp
YnV0ZU1hcChOYW1lZEF0dHJNYXAqIGxpc3QpCi17Ci0gICAgaWYgKGluRG9jdW1lbnQoKSkKLSAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+aW5jRE9NVHJlZVZlcnNpb24oKTsKLQotICAgIC8vIElmIHNl
dHRpbmcgdGhlIHdob2xlIG1hcCBjaGFuZ2VzIHRoZSBpZCBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8g
Y2FsbCB1cGRhdGVJZC4KLQotICAgIEF0dHJpYnV0ZSAqb2xkSWQgPSBuYW1lZEF0dHJNYXAgPyBu
YW1lZEF0dHJNYXAtPmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKSA6IDA7Ci0gICAgQXR0cmlidXRl
ICpuZXdJZCA9IGxpc3QgPyBsaXN0LT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cikgOiAwOwotCi0g
ICAgaWYgKG9sZElkIHx8IG5ld0lkKQotICAgICAgICB1cGRhdGVJZChvbGRJZCA/IG9sZElkLT52
YWx1ZSgpIDogbnVsbEF0b20sIG5ld0lkID8gbmV3SWQtPnZhbHVlKCkgOiBudWxsQXRvbSk7Ci0K
LSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICBuYW1lZEF0dHJNYXAtPmVsZW1lbnQgPSAw
OwotCi0gICAgbmFtZWRBdHRyTWFwID0gbGlzdDsKLQotICAgIGlmIChuYW1lZEF0dHJNYXApIHsK
LSAgICAgICAgbmFtZWRBdHRyTWFwLT5lbGVtZW50ID0gdGhpczsKLSAgICAgICAgdW5zaWduZWQg
bGVuID0gbmFtZWRBdHRyTWFwLT5sZW5ndGgoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lZEF0dHJN
YXAtPmF0dHJzW2ldKTsKLSAgICAgICAgLy8gRklYTUU6IFdoYXQgYWJvdXQgYXR0cmlidXRlcyB0
aGF0IHdlcmUgaW4gdGhlIG9sZCBtYXAgdGhhdCBhcmUgbm90IGluIHRoZSBuZXcgbWFwPwotICAg
IH0KLX0KLQotYm9vbCBFbGVtZW50OjpoYXNBdHRyaWJ1dGVzKCkgY29uc3QKLXsKLSAgICB1cGRh
dGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCk7Ci0gICAgcmV0dXJuIG5hbWVkQXR0ck1hcCAmJiBu
YW1lZEF0dHJNYXAtPmxlbmd0aCgpID4gMDsKLX0KLQotU3RyaW5nIEVsZW1lbnQ6Om5vZGVOYW1l
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90YWdOYW1lLnRvU3RyaW5nKCk7Ci19Ci0KLXZvaWQg
RWxlbWVudDo6c2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9u
Q29kZSYgZWMpCi17Ci0gICAgY2hlY2tTZXRQcmVmaXgoX3ByZWZpeCwgZWMpOwotICAgIGlmIChl
YykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV90YWdOYW1lLnNldFByZWZpeChfcHJlZml4KTsK
LX0KLQotdm9pZCBFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIG5h
bWVkQXR0ck1hcCA9IG5ldyBOYW1lZEF0dHJNYXAoY29uc3RfY2FzdDxFbGVtZW50Kj4odGhpcykp
OwotfQotCi1ib29sIEVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cikgY29u
c3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJlbmRlclN0eWxlICpFbGVtZW50OjpjcmVh
dGVTdHlsZUZvclJlbmRlcmVyKFJlbmRlck9iamVjdCAqcGFyZW50UmVuZGVyZXIpCi17Ci0gICAg
cmV0dXJuIGdldERvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Y3JlYXRlU3R5bGVGb3JFbGVt
ZW50KHRoaXMpOwotfQotCi1SZW5kZXJPYmplY3QgKkVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIGlmIChnZXREb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSB0aGlzICYmIHN0eWxlLT5kaXNwbGF5KCkgPT0g
Tk9ORSkgewotICAgICAgICAvLyBJZ25vcmUgZGlzcGxheTogbm9uZSBvbiByb290IGVsZW1lbnRz
LiAgRm9yY2UgYSBkaXNwbGF5IG9mIGJsb2NrIGluIHRoYXQgY2FzZS4KLSAgICAgICAgUmVuZGVy
QmxvY2sqIHJlc3VsdCA9IG5ldyAoYXJlbmEpIFJlbmRlckJsb2NrKHRoaXMpOwotICAgICAgICBp
ZiAocmVzdWx0KSByZXN1bHQtPnNldFN0eWxlKHN0eWxlKTsKLSAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlck9iamVjdDo6Y3JlYXRlT2JqZWN0KHRoaXMsIHN0
eWxlKTsKLX0KLQotCi12b2lkIEVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAg
ICAvLyBuZWVkIHRvIGRvIHN1cGVyY2xhc3MgcHJvY2Vzc2luZyBmaXJzdCBzbyBpbkRvY3VtZW50
KCkgaXMgdHJ1ZQotICAgIC8vIGJ5IHRoZSB0aW1lIHdlIHJlYWNoIHVwZGF0ZUlkCi0gICAgQ29u
dGFpbmVyTm9kZTo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLQotICAgIGlmIChoYXNJRCgpKSB7
Ci0gICAgICAgIE5hbWVkQXR0ck1hcCogYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgICAg
ICBpZiAoYXR0cnMpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSogaWRJdGVtID0gYXR0cnMtPmdl
dEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLSAgICAgICAgICAgIGlmIChpZEl0ZW0gJiYgIWlkSXRl
bS0+aXNOdWxsKCkpCi0gICAgICAgICAgICAgICAgdXBkYXRlSWQobnVsbEF0b20sIGlkSXRlbS0+
dmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRWxlbWVudDo6cmVtb3ZlZEZy
b21Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGhhc0lEKCkpIHsKLSAgICAgICAgTmFtZWRBdHRyTWFw
KiBhdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgICAgIGlmIChhdHRycykgewotICAgICAg
ICAgICAgQXR0cmlidXRlKiBpZEl0ZW0gPSBhdHRycy0+Z2V0QXR0cmlidXRlSXRlbShpZEF0dHIp
OwotICAgICAgICAgICAgaWYgKGlkSXRlbSAmJiAhaWRJdGVtLT5pc051bGwoKSkKLSAgICAgICAg
ICAgICAgICB1cGRhdGVJZChpZEl0ZW0tPnZhbHVlKCksIG51bGxBdG9tKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIENvbnRhaW5lck5vZGU6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLX0KLQot
dm9pZCBFbGVtZW50OjphdHRhY2goKQotewotI2lmIFNQRUVEX0RFQlVHIDwgMQotICAgIGNyZWF0
ZVJlbmRlcmVySWZOZWVkZWQoKTsKLSNlbmRpZgotICAgIENvbnRhaW5lck5vZGU6OmF0dGFjaCgp
OwotfQotCi12b2lkIEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaGFuZ2UgKQot
ewotICAgIC8vICMjIyBzaG91bGQgZ28gYXdheSBhbmQgYmUgZG9uZSBpbiByZW5kZXJvYmplY3QK
LSAgICBSZW5kZXJTdHlsZSogX3N0eWxlID0gcmVuZGVyZXIoKSA/IHJlbmRlcmVyKCktPnN0eWxl
KCkgOiAwOwotICAgIGJvb2wgaGFzUGFyZW50UmVuZGVyZXIgPSBwYXJlbnQoKSA/IHBhcmVudCgp
LT5yZW5kZXJlcigpIDogZmFsc2U7Ci0gICAgCi0gICAgaWYgKCBoYXNQYXJlbnRSZW5kZXJlciAm
JiAoY2hhbmdlID49IEluaGVyaXQgfHwgY2hhbmdlZCgpKSApIHsKLSAgICAgICAgUmVuZGVyU3R5
bGUgKm5ld1N0eWxlID0gZ2V0RG9jdW1lbnQoKS0+c3R5bGVTZWxlY3RvcigpLT5jcmVhdGVTdHls
ZUZvckVsZW1lbnQodGhpcyk7Ci0gICAgICAgIFN0eWxlQ2hhbmdlIGNoID0gZGlmZiggX3N0eWxl
LCBuZXdTdHlsZSApOwotICAgICAgICBpZiAoY2ggPT0gRGV0YWNoKSB7Ci0gICAgICAgICAgICBp
ZiAoYXR0YWNoZWQoKSkgZGV0YWNoKCk7Ci0gICAgICAgICAgICAvLyAjIyMgU3Vib3B0aW1hbC4g
U3R5bGUgZ2V0cyBjYWxjdWxhdGVkIGFnYWluLgotICAgICAgICAgICAgYXR0YWNoKCk7Ci0gICAg
ICAgICAgICAvLyBhdHRhY2ggcmVjYWx1bGF0ZXMgdGhlIHN0eWxlIGZvciBhbGwgY2hpbGRyZW4u
IE5vIG5lZWQgdG8gZG8gaXQgdHdpY2UuCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKCBmYWxzZSAp
OwotICAgICAgICAgICAgc2V0SGFzQ2hhbmdlZENoaWxkKCBmYWxzZSApOwotICAgICAgICAgICAg
bmV3U3R5bGUtPmRlcmVmKGdldERvY3VtZW50KCktPnJlbmRlckFyZW5hKCkpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoICE9IE5vQ2hhbmdlKSB7
Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiBuZXdTdHlsZSkKLSAgICAgICAgICAgICAg
ICByZW5kZXJlcigpLT5zZXRTdHlsZShuZXdTdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxz
ZSBpZiAoY2hhbmdlZCgpICYmIHJlbmRlcmVyKCkgJiYgbmV3U3R5bGUgJiYgKGdldERvY3VtZW50
KCktPnVzZXNTaWJsaW5nUnVsZXMoKSB8fCBnZXREb2N1bWVudCgpLT51c2VzRGVzY2VuZGFudFJ1
bGVzKCkpKSB7Ci0gICAgICAgICAgICAvLyBBbHRob3VnaCBubyBjaGFuZ2Ugb2NjdXJyZWQsIHdl
IHVzZSB0aGUgbmV3IHN0eWxlIHNvIHRoYXQgdGhlIGNvdXNpbiBzdHlsZSBzaGFyaW5nIGNvZGUg
d29uJ3QgZ2V0Ci0gICAgICAgICAgICAvLyBmb29sZWQgaW50byBiZWxpZXZpbmcgdGhpcyBzdHls
ZSBpcyB0aGUgc2FtZS4gIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgdGhlIGRvY3VtZW50IGFj
dHVhbGx5IHVzZXMKLSAgICAgICAgICAgIC8vIHNpYmxpbmcvZGVzY2VuZGFudCBydWxlcywgc2lu
Y2Ugb3RoZXJ3aXNlIGl0IGlzbid0IHBvc3NpYmxlIGZvciBhbmNlc3RvciBzdHlsZXMgdG8gYWZm
ZWN0IHNoYXJpbmcgb2YKLSAgICAgICAgICAgIC8vIGRlc2NlbmRhbnRzLgotICAgICAgICAgICAg
cmVuZGVyZXIoKS0+c2V0U3R5bGVJbnRlcm5hbChuZXdTdHlsZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBuZXdTdHlsZS0+ZGVyZWYoZ2V0RG9jdW1lbnQoKS0+cmVuZGVyQXJlbmEoKSk7Ci0KLSAg
ICAgICAgaWYgKCBjaGFuZ2UgIT0gRm9yY2UpIHsKLSAgICAgICAgICAgIGlmIChnZXREb2N1bWVu
dCgpLT51c2VzRGVzY2VuZGFudFJ1bGVzKCkpCi0gICAgICAgICAgICAgICAgY2hhbmdlID0gRm9y
Y2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY2hhbmdlID0gY2g7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKE5vZGUgKm4gPSBmYXN0Rmlyc3RDaGlsZCgpOyBuOyBu
ID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoY2hhbmdlID49IEluaGVyaXQgfHwg
bi0+aXNUZXh0Tm9kZSgpIHx8IG4tPmhhc0NoYW5nZWRDaGlsZCgpIHx8IG4tPmNoYW5nZWQoKSkK
LSAgICAgICAgICAgIG4tPnJlY2FsY1N0eWxlKGNoYW5nZSk7Ci0gICAgfQotCi0gICAgc2V0Q2hh
bmdlZCggZmFsc2UgKTsKLSAgICBzZXRIYXNDaGFuZ2VkQ2hpbGQoIGZhbHNlICk7Ci19Ci0KLWJv
b2wgRWxlbWVudDo6Y2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSB0eXBlKQotewotICAgIHN3aXRj
aCAodHlwZSkgewotICAgICAgICBjYXNlIEVMRU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBURVhU
X05PREU6Ci0gICAgICAgIGNhc2UgQ09NTUVOVF9OT0RFOgotICAgICAgICBjYXNlIFBST0NFU1NJ
TkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgY2FzZSBDREFUQV9TRUNUSU9OX05PREU6Ci0g
ICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgRWxlbWVudDo6ZGlzcGF0Y2hBdHRyUmVtb3Zh
bEV2ZW50KEF0dHJpYnV0ZSopCi17Ci0gICAgYXNzZXJ0KCFldmVudERpc3BhdGNoRm9yYmlkZGVu
KCkpOwotI2lmIDAKLSAgICBpZiAoIWdldERvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShEb2N1
bWVudDo6RE9NQVRUUk1PRElGSUVEX0xJU1RFTkVSKSkKLSAgICAgICAgcmV0dXJuOwotICAgIEV4
Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGRpc3BhdGNoRXZlbnQobmV3IE11dGF0aW9uRXZlbnQo
RE9NQXR0ck1vZGlmaWVkRXZlbnQsIHRydWUsIGZhbHNlLCBhdHRyLCBhdHRyLT52YWx1ZSgpLAot
ICAgICAgICBhdHRyLT52YWx1ZSgpLCBnZXREb2N1bWVudCgpLT5hdHRyTmFtZShhdHRyLT5pZCgp
KSwgTXV0YXRpb25FdmVudDo6UkVNT1ZBTCksIGVjKTsKLSNlbmRpZgotfQotCi12b2lkIEVsZW1l
bnQ6OmRpc3BhdGNoQXR0ckFkZGl0aW9uRXZlbnQoQXR0cmlidXRlICphdHRyKQotewotICAgIGFz
c2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSNpZiAwCi0gICAgaWYgKCFnZXREb2N1
bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnQ6OkRPTUFUVFJNT0RJRklFRF9MSVNURU5F
UikpCi0gICAgICAgIHJldHVybjsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBkaXNw
YXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50KERPTUF0dHJNb2RpZmllZEV2ZW50LCB0cnVlLCBm
YWxzZSwgYXR0ciwgYXR0ci0+dmFsdWUoKSwKLSAgICAgICAgYXR0ci0+dmFsdWUoKSxnZXREb2N1
bWVudCgpLT5hdHRyTmFtZShhdHRyLT5pZCgpKSwgTXV0YXRpb25FdmVudDo6QURESVRJT04pLCBl
Yyk7Ci0jZW5kaWYKLX0KLQotU3RyaW5nIEVsZW1lbnQ6Om9wZW5UYWdTdGFydFRvU3RyaW5nKCkg
Y29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0ID0gIjwiICsgbm9kZU5hbWUoKTsKLQotICAgIE5h
bWVkQXR0ck1hcCAqYXR0ck1hcCA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0KLSAgICBpZiAoYXR0ck1h
cCkgewotICAgICAgICB1bnNpZ25lZCBudW1BdHRycyA9IGF0dHJNYXAtPmxlbmd0aCgpOwotICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQXR0cnM7IGkrKykgewotICAgICAgICAg
ICAgcmVzdWx0ICs9ICIgIjsKLQotICAgICAgICAgICAgQXR0cmlidXRlICphdHRyaWJ1dGUgPSBh
dHRyTWFwLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgcmVzdWx0ICs9IGF0dHJpYnV0
ZS0+bmFtZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZS0+dmFsdWUo
KS5pc051bGwoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiPVwiIjsKLSAgICAgICAg
ICAgICAgICAvLyBGSVhNRTogc3Vic3RpdHV0ZSBlbnRpdGllcyBmb3IgYW55IGluc3RhbmNlcyBv
ZiAiIG9yICcKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gYXR0cmlidXRlLT52YWx1ZSgpOwot
ICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3RyaW5nIEVsZW1lbnQ6OnRvU3Ry
aW5nKCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0ID0gb3BlblRhZ1N0YXJ0VG9TdHJpbmco
KTsKLQotICAgIGlmIChoYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgcmVzdWx0ICs9ICI+IjsK
LQotICAgICAgICBmb3IgKE5vZGUgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBOVUxM
OyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0g
Y2hpbGQtPnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgKz0gIjwvIjsK
LSAgICAgICAgcmVzdWx0ICs9IG5vZGVOYW1lKCk7Ci0gICAgICAgIHJlc3VsdCArPSAiPiI7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgLz4iOwotICAgIH0KLQotICAgIHJldHVy
biByZXN1bHQ7Ci19Ci0KLXZvaWQgRWxlbWVudDo6dXBkYXRlSWQoY29uc3QgQXRvbWljU3RyaW5n
JiBvbGRJZCwgY29uc3QgQXRvbWljU3RyaW5nJiBuZXdJZCkKLXsKLSAgICBpZiAoIWluRG9jdW1l
bnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG9sZElkID09IG5ld0lkKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBEb2N1bWVudCogZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAo
IW9sZElkLmlzRW1wdHkoKSkKLSAgICAgICAgZG9jLT5yZW1vdmVFbGVtZW50QnlJZChvbGRJZCwg
dGhpcyk7Ci0gICAgaWYgKCFuZXdJZC5pc0VtcHR5KCkpCi0gICAgICAgIGRvYy0+YWRkRWxlbWVu
dEJ5SWQobmV3SWQsIHRoaXMpOwotfQotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBFbGVtZW50Ojpk
dW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kKSBjb25zdAotewot
ICAgIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKTsKLSAgICBpZiAobmFtZWRBdHRyTWFw
KSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYW1lZEF0dHJNYXAtPmxlbmd0
aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSAqYXR0ciA9IG5hbWVkQXR0ck1hcC0+
YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgICpzdHJlYW0gPDwgIiAiIDw8IGF0dHItPm5h
bWUoKS5sb2NhbE5hbWUoKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKQotICAgICAgICAgICAg
ICAgICAgICA8PCAiPVwiIiA8PCBhdHRyLT52YWx1ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2Np
aSgpIDw8ICJcIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDb250YWluZXJOb2RlOjpkdW1w
KHN0cmVhbSxpbmQpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIEVsZW1lbnQ6
OmZvcm1hdEZvckRlYnVnZ2VyKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAot
ewotICAgIFN0cmluZyByZXN1bHQ7Ci0gICAgU3RyaW5nIHM7Ci0gICAgCi0gICAgcyA9IG5vZGVO
YW1lKCk7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHJlc3VsdCArPSBzOwot
ICAgIH0KLSAgICAgICAgICAKLSAgICBzID0gZ2V0QXR0cmlidXRlKGlkQXR0cik7Ci0gICAgaWYg
KHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKQotICAg
ICAgICAgICAgcmVzdWx0ICs9ICI7ICI7Ci0gICAgICAgIHJlc3VsdCArPSAiaWQ9IjsKLSAgICAg
ICAgcmVzdWx0ICs9IHM7Ci0gICAgfQotICAgICAgICAgIAotICAgIHMgPSBnZXRBdHRyaWJ1dGUo
Y2xhc3NBdHRyKTsKLSAgICBpZiAocy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgaWYgKHJlc3Vs
dC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXN1bHQgKz0gIjsgIjsKLSAgICAgICAgcmVz
dWx0ICs9ICJjbGFzcz0iOwotICAgICAgICByZXN1bHQgKz0gczsKLSAgICB9Ci0gICAgICAgICAg
Ci0gICAgc3RybmNweShidWZmZXIsIHJlc3VsdC5kZXByZWNhdGVkU3RyaW5nKCkubGF0aW4xKCks
IGxlbmd0aCAtIDEpOwotfQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6c2V0
QXR0cmlidXRlTm9kZShBdHRyICphdHRyLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBBU1NF
UlQoYXR0cik7Ci0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cmlidXRl
cyhmYWxzZSktPnNldE5hbWVkSXRlbShhdHRyLCBlYykpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+
IEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciAqYXR0ciwgRXhjZXB0aW9uQ29kZSYg
ZWMpCi17Ci0gICAgaWYgKCFhdHRyIHx8IGF0dHItPm93bmVyRWxlbWVudCgpICE9IHRoaXMpIHsK
LSAgICAgICAgZWMgPSBOT1RfRk9VTkRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0g
ICAgaWYgKGdldERvY3VtZW50KCkgIT0gYXR0ci0+Z2V0RG9jdW1lbnQoKSkgewotICAgICAgICBl
YyA9IFdST05HX0RPQ1VNRU5UX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAg
TmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRy
PihhdHRycy0+cmVtb3ZlTmFtZWRJdGVtKGF0dHItPnF1YWxpZmllZE5hbWUoKSwgZWMpKTsKLX0K
LQotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVS
SSwgY29uc3QgU3RyaW5nJiBxdWFsaWZpZWROYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNl
cHRpb25Db2RlJiBlYykKLXsKLSAgICBTdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgaWYg
KCFEb2N1bWVudDo6cGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9j
YWxOYW1lKSkgewotICAgICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBzZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShwcmVmaXguaW1w
bCgpLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSwgdmFsdWUuaW1wbCgp
LCBlYyk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFN0cmluZyYg
bmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRN
TERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZW1vdmVBdHRyaWJ1
dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVsbEF0b20pLCBl
Yyk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6cmVtb3ZlQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBu
YW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICByZW1vdmVBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1l
LmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSksIGVjKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRy
PiBFbGVtZW50OjpnZXRBdHRyaWJ1dGVOb2RlKGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBO
YW1lZEF0dHJNYXAgKmF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBpZiAoIWF0dHJzKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1lbnQo
dGhpcykgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9j
YXN0PEF0dHI+KGF0dHJzLT5nZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9j
YWxOYW1lLmltcGwoKSwgbnVsbEF0b20pKSk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVu
dDo6Z2V0QXR0cmlidXRlTm9kZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBT
dHJpbmcmIGxvY2FsTmFtZSkKLXsKLSAgICBOYW1lZEF0dHJNYXAgKmF0dHJzID0gYXR0cmlidXRl
cyh0cnVlKTsKLSAgICBpZiAoIWF0dHJzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4g
c3RhdGljX3BvaW50ZXJfY2FzdDxBdHRyPihhdHRycy0+Z2V0TmFtZWRJdGVtKFF1YWxpZmllZE5h
bWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpKSk7Ci19
Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3QK
LXsKLSAgICBOYW1lZEF0dHJNYXAgKmF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBpZiAo
IWF0dHJzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGlu
SFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gYXR0
cnMtPmdldEF0dHJpYnV0ZUl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmlt
cGwoKSwgbnVsbEF0b20pKTsKLX0KLQotYm9vbCBFbGVtZW50OjpoYXNBdHRyaWJ1dGVOUyhjb25z
dCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0Ci17
Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFh
dHRycykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBhdHRycy0+Z2V0QXR0cmli
dXRlSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3Bh
Y2VVUkkuaW1wbCgpKSk7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb24gKkVsZW1lbnQ6OnN0eWxl
KCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBFbGVtZW50Ojpmb2N1cygpCi17Ci0gICAg
RG9jdW1lbnQqIGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgZG9jLT51cGRhdGVMYXlvdXQoKTsK
LSAgICBpZiAoaXNGb2N1c2FibGUoKSkgewotICAgICAgICBkb2MtPnNldEZvY3VzTm9kZSh0aGlz
KTsKLSAgICAgICAgaWYgKHJvb3RFZGl0YWJsZUVsZW1lbnQoKSA9PSB0aGlzKSB7Ci0gICAgICAg
ICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIHJlc3RvcmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvbiBp
ZiB0aGVyZSBpcyBvbmUsIGluc3RlYWQgb2YgYWx3YXlzIHNlbGVjdGluZyBhbGwuCi0gICAgICAg
ICAgICBpZiAoZG9jLT5mcmFtZSgpLT5zZWxlY3RDb250ZW50c09mTm9kZSh0aGlzKSkKLSAgICAg
ICAgICAgICAgICBkb2MtPmZyYW1lKCktPnJldmVhbFNlbGVjdGlvbigpOwotICAgICAgICB9IGVs
c2UgaWYgKHJlbmRlcmVyKCkgJiYgIXJlbmRlcmVyKCktPmlzV2lkZ2V0KCkpCi0gICAgICAgICAg
ICByZW5kZXJlcigpLT5lbmNsb3NpbmdMYXllcigpLT5zY3JvbGxSZWN0VG9WaXNpYmxlKGdldFJl
Y3QoKSk7Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OmJsdXIoKQotewotICAgIERvY3VtZW50
KiBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGlmIChkb2MtPmZvY3VzTm9kZSgpID09IHRoaXMp
Ci0gICAgICAgIGRvYy0+c2V0Rm9jdXNOb2RlKDApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLU5hbWVkQXR0ck1hcDo6TmFtZWRBdHRyTWFwKEVsZW1lbnQgKmUpCi0gICAgOiBlbGVtZW50
KGUpCi0gICAgLCBhdHRycygwKQotICAgICwgbGVuKDApCi17Ci19Ci0KLU5hbWVkQXR0ck1hcDo6
fk5hbWVkQXR0ck1hcCgpCi17Ci0gICAgTmFtZWRBdHRyTWFwOjpjbGVhckF0dHJpYnV0ZXMoKTsg
Ly8gdmlydHVhbCBtZXRob2QsIHNvIHF1YWxpZnkganVzdCB0byBiZSBleHBsaWNpdAotfQotCi1i
b29sIE5hbWVkQXR0ck1hcDo6aXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OmdldE5hbWVk
SXRlbShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9
IGluSFRNTERvY3VtZW50KGVsZW1lbnQpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1
cm4gZ2V0TmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCks
IG51bGxBdG9tKSk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1l
ZEl0ZW1OUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5h
bWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxB
dG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSk7Ci19Ci0KLVBhc3NS
ZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpyZW1vdmVOYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBu
YW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1M
RG9jdW1lbnQoZWxlbWVudCkgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJldHVybiByZW1v
dmVOYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVs
bEF0b20pLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpyZW1vdmVO
YW1lZEl0ZW1OUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2Nh
bE5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIHJldHVybiByZW1vdmVOYW1lZEl0ZW0o
UXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmlt
cGwoKSksIGVjKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OmdldE5hbWVk
SXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIEF0dHJpYnV0ZSog
YSA9IGdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0gICAgaWYgKCFhKSByZXR1cm4gMDsKLQotICAg
IHJldHVybiBhLT5jcmVhdGVBdHRySWZOZWVkZWQoZWxlbWVudCk7Ci19Ci0KLVBhc3NSZWZQdHI8
Tm9kZT4gTmFtZWRBdHRyTWFwOjpzZXROYW1lZEl0ZW0oTm9kZSogYXJnLCBFeGNlcHRpb25Db2Rl
JiBlYykKLXsKLSAgICBpZiAoIWVsZW1lbnQpIHsKLSAgICAgICAgZWMgPSBOT1RfRk9VTkRfRVJS
OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxM
T1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1hcCBpcyByZWFkb25seS4KLSAgICBpZiAoaXNSZWFk
T25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAg
ICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNl
ZCBpZiBhcmcgd2FzIGNyZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBkb2N1bWVudCB0aGFuIHRoZSBv
bmUgdGhhdCBjcmVhdGVkIHRoaXMgbWFwLgotICAgIGlmIChhcmctPmdldERvY3VtZW50KCkgIT0g
ZWxlbWVudC0+Z2V0RG9jdW1lbnQoKSkgewotICAgICAgICBlYyA9IFdST05HX0RPQ1VNRU5UX0VS
UjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gTm90IG1lbnRpb25lZCBpbiBz
cGVjOiB0aHJvdyBhIEhJRVJBUkNIWV9SRVFVRVNUX0VSUk9SIGlmIHRoZSB1c2VyIHBhc3NlcyBp
biBhIG5vbi1hdHRyaWJ1dGUgbm9kZQotICAgIGlmICghYXJnLT5pc0F0dHJpYnV0ZU5vZGUoKSkg
ewotICAgICAgICBlYyA9IEhJRVJBUkNIWV9SRVFVRVNUX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgfQotICAgIEF0dHIgKmF0dHIgPSBzdGF0aWNfY2FzdDxBdHRyKj4oYXJnKTsKLQotICAg
IEF0dHJpYnV0ZSogYSA9IGF0dHItPmF0dHIoKTsKLSAgICBBdHRyaWJ1dGUqIG9sZCA9IGdldEF0
dHJpYnV0ZUl0ZW0oYS0+bmFtZSgpKTsKLSAgICBpZiAob2xkID09IGEpCi0gICAgICAgIHJldHVy
biBSZWZQdHI8Tm9kZT4oYXJnKTsgLy8gd2Uga25vdyBhYm91dCBpdCBhbHJlYWR5Ci0KLSAgICAv
LyBJTlVTRV9BVFRSSUJVVEVfRVJSOiBSYWlzZWQgaWYgYXJnIGlzIGFuIEF0dHIgdGhhdCBpcyBh
bHJlYWR5IGFuIGF0dHJpYnV0ZSBvZiBhbm90aGVyIEVsZW1lbnQgb2JqZWN0LgotICAgIC8vIFRo
ZSBET00gdXNlciBtdXN0IGV4cGxpY2l0bHkgY2xvbmUgQXR0ciBub2RlcyB0byByZS11c2UgdGhl
bSBpbiBvdGhlciBlbGVtZW50cy4KLSAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpIHsKLSAg
ICAgICAgZWMgPSBJTlVTRV9BVFRSSUJVVEVfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9
Ci0KLSAgICBpZiAoYS0+bmFtZSgpID09IGlkQXR0cikKLSAgICAgICAgZWxlbWVudC0+dXBkYXRl
SWQob2xkID8gb2xkLT52YWx1ZSgpIDogbnVsbEF0b20sIGEtPnZhbHVlKCkpOwotCi0gICAgLy8g
IyMjIHNsaWdodGx5IGluZWZmaWNpZW50IC0gcmVzaXplcyBhdHRyaWJ1dGUgYXJyYXkgdHdpY2Uu
Ci0gICAgUmVmUHRyPE5vZGU+IHI7Ci0gICAgaWYgKG9sZCkgewotICAgICAgICByID0gb2xkLT5j
cmVhdGVBdHRySWZOZWVkZWQoZWxlbWVudCk7Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZShhLT5u
YW1lKCkpOwotICAgIH0KLQotICAgIGFkZEF0dHJpYnV0ZShhKTsKLSAgICByZXR1cm4gci5yZWxl
YXNlKCk7Ci19Ci0KLS8vIFRoZSBET00yIHNwZWMgZG9lc24ndCBzYXkgdGhhdCByZW1vdmVBdHRy
aWJ1dGVbTlNdIHRocm93cyBOT1RfRk9VTkRfRVJSCi0vLyBpZiB0aGUgYXR0cmlidXRlIGlzIG5v
dCBmb3VuZCwgYnV0IGF0IHRoaXMgbGV2ZWwgd2UgaGF2ZSB0byB0aHJvdyBOT1RfRk9VTkRfRVJS
Ci0vLyBiZWNhdXNlIG9mIHJlbW92ZU5hbWVkSXRlbSwgcmVtb3ZlTmFtZWRJdGVtTlMsIGFuZCBy
ZW1vdmVBdHRyaWJ1dGVOb2RlLgotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OnJlbW92
ZU5hbWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICAvLyAjIyMgc2hvdWxkIHRoaXMgcmVhbGx5IGJlIHJhaXNlZCB3aGVuIHRoZSBhdHRy
aWJ1dGUgdG8gcmVtb3ZlIGlzbid0IHRoZXJlIGF0IGFsbD8KLSAgICAvLyBOT19NT0RJRklDQVRJ
T05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYg
KGlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VS
UjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQXR0cmlidXRlKiBhID0gZ2V0QXR0
cmlidXRlSXRlbShuYW1lKTsKLSAgICBpZiAoIWEpIHsKLSAgICAgICAgZWMgPSBOT1RfRk9VTkRf
RVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBSZWZQdHI8Tm9kZT4gciA9IGEt
PmNyZWF0ZUF0dHJJZk5lZWRlZChlbGVtZW50KTsKLQotICAgIGlmIChuYW1lID09IGlkQXR0cikK
LSAgICAgICAgZWxlbWVudC0+dXBkYXRlSWQoYS0+dmFsdWUoKSwgbnVsbEF0b20pOwotCi0gICAg
cmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgIHJldHVybiByLnJlbGVhc2UoKTsKLX0KLQotUGFz
c1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6Oml0ZW0gKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0
Ci17Ci0gICAgaWYgKGluZGV4ID49IGxlbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1
cm4gYXR0cnNbaW5kZXhdLT5jcmVhdGVBdHRySWZOZWVkZWQoZWxlbWVudCk7Ci19Ci0KLUF0dHJp
YnV0ZSogTmFtZWRBdHRyTWFwOjpnZXRBdHRyaWJ1dGVJdGVtKGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUpIGNvbnN0Ci17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgKytpKSB7
Ci0gICAgICAgIGlmIChhdHRyc1tpXS0+bmFtZSgpLm1hdGNoZXMobmFtZSkpCi0gICAgICAgICAg
ICByZXR1cm4gYXR0cnNbaV07Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5hbWVk
QXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCkKLXsKLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYXR0
cnNbaV0tPm1faW1wbCkKLSAgICAgICAgICAgICAgICBhdHRyc1tpXS0+bV9pbXBsLT5tX2VsZW1l
bnQgPSAwOwotICAgICAgICAgICAgYXR0cnNbaV0tPmRlcmVmKCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgZmFzdEZyZWUoYXR0cnMpOwotICAgICAgICBhdHRycyA9IDA7Ci0gICAgfQotICAgIGxlbiA9
IDA7Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjpkZXRhY2hGcm9tRWxlbWVudCgpCi17Ci0gICAg
Ly8gd2UgYWxsb3cgYSBOYW1lZEF0dHJNYXAgdy9vIGFuIGVsZW1lbnQgaW4gY2FzZSBzb21lb25l
IHN0aWxsIGhhcyBhIHJlZmVyZW5jZQotICAgIC8vIHRvIGlmIGFmdGVyIHRoZSBlbGVtZW50IGdl
dHMgZGVsZXRlZCAtIGJ1dCB0aGUgbWFwIGlzIG5vdyBpbnZhbGlkCi0gICAgZWxlbWVudCA9IDA7
Ci0gICAgY2xlYXJBdHRyaWJ1dGVzKCk7Ci19Ci0KLU5hbWVkQXR0ck1hcCYgTmFtZWRBdHRyTWFw
OjpvcGVyYXRvcj0oY29uc3QgTmFtZWRBdHRyTWFwJiBvdGhlcikKLXsKLSAgICAvLyBjbG9uZSBh
bGwgYXR0cmlidXRlcyBpbiB0aGUgb3RoZXIgbWFwLCBidXQgYXR0YWNoIHRvIG91ciBlbGVtZW50
Ci0gICAgaWYgKCFlbGVtZW50KQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0KLSAgICAvLyBJZiBh
c3NpZ25pbmcgdGhlIG1hcCBjaGFuZ2VzIHRoZSBpZCBhdHRyaWJ1dGUsIHdlIG5lZWQgdG8gY2Fs
bAotICAgIC8vIHVwZGF0ZUlkLgotCi0gICAgQXR0cmlidXRlICpvbGRJZCA9IGdldEF0dHJpYnV0
ZUl0ZW0oaWRBdHRyKTsKLSAgICBBdHRyaWJ1dGUgKm5ld0lkID0gb3RoZXIuZ2V0QXR0cmlidXRl
SXRlbShpZEF0dHIpOwotCi0gICAgaWYgKG9sZElkIHx8IG5ld0lkKQotICAgICAgICBlbGVtZW50
LT51cGRhdGVJZChvbGRJZCA/IG9sZElkLT52YWx1ZSgpIDogbnVsbEF0b20sIG5ld0lkID8gbmV3
SWQtPnZhbHVlKCkgOiBudWxsQXRvbSk7Ci0KLSAgICBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICBs
ZW4gPSBvdGhlci5sZW47Ci0gICAgYXR0cnMgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGUgKio+KGZh
c3RNYWxsb2MobGVuICogc2l6ZW9mKEF0dHJpYnV0ZSAqKSkpOwotCi0gICAgLy8gZmlyc3QgaW5p
dGlhbGl6ZSBhdHRycyB2ZWN0b3IsIHRoZW4gY2FsbCBhdHRyaWJ1dGVDaGFuZ2VkIG9uIGl0Ci0g
ICAgLy8gdGhpcyBhbGxvd3MgYXR0cmlidXRlQ2hhbmdlZCB0byB1c2UgZ2V0QXR0cmlidXRlCi0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGF0dHJzW2ld
ID0gb3RoZXIuYXR0cnNbaV0tPmNsb25lKCk7Ci0gICAgICAgIGF0dHJzW2ldLT5yZWYoKTsKLSAg
ICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyB3YXN0ZWZ1bC4gIFRoZSBjbGFzcyBsaXN0IGNv
dWxkIGJlIHByZXNlcnZlZCBvbiBhIGNvcHksIGFuZCB3ZQotICAgIC8vIHdvdWxkbid0IGhhdmUg
dG8gd2FzdGUgdGltZSByZXBhcnNpbmcgdGhlIGF0dHJpYnV0ZS4KLSAgICAvLyBUaGUgZGVyaXZl
ZCBjbGFzcywgSFRNTE5hbWVkQXR0ck1hcCwgd2hpY2ggbWFuYWdlcyBhIHBhcnNlZCBjbGFzcyBs
aXN0IGZvciB0aGUgQ0xBU1MgYXR0cmlidXRlLAotICAgIC8vIHdpbGwgdXBkYXRlIGl0cyBtZW1i
ZXIgdmFyaWFibGUgd2hlbiBwYXJzZSBhdHRyaWJ1dGUgaXMgY2FsbGVkLgotICAgIGZvcih1bnNp
Z25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICBlbGVtZW50LT5hdHRyaWJ1dGVDaGFu
Z2VkKGF0dHJzW2ldLCB0cnVlKTsKLQotICAgIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCBOYW1l
ZEF0dHJNYXA6OmFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHJpYnV0ZSkKLXsKLSAgICAvLyBB
ZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgbGlzdAotICAgIEF0dHJpYnV0ZSAqKm5ld0F0dHJzID0g
c3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKChsZW4gKyAxKSAqIHNpemVvZihB
dHRyaWJ1dGUgKikpKTsKLSAgICBpZiAoYXR0cnMpIHsKLSAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgbmV3QXR0cnNbaV0gPSBhdHRyc1tpXTsKLSAgICAg
IGZhc3RGcmVlKGF0dHJzKTsKLSAgICB9Ci0gICAgYXR0cnMgPSBuZXdBdHRyczsKLSAgICBhdHRy
c1tsZW4rK10gPSBhdHRyaWJ1dGU7Ci0gICAgYXR0cmlidXRlLT5yZWYoKTsKLQotICAgIEF0dHIg
KiBjb25zdCBhdHRyID0gYXR0cmlidXRlLT5tX2ltcGw7Ci0gICAgaWYgKGF0dHIpCi0gICAgICAg
IGF0dHItPm1fZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLSAgICAvLyBOb3RpZnkgdGhlIGVsZW1lbnQg
dGhhdCB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIGFkZGVkLCBhbmQgZGlzcGF0Y2ggYXBwcm9wcmlh
dGUgbXV0YXRpb24gZXZlbnRzCi0gICAgLy8gTm90ZSB0aGF0IGVsZW1lbnQgbWF5IGJlIG51bGwg
aGVyZSBpZiB3ZSBhcmUgY2FsbGVkIGZyb20gaW5zZXJ0QXR0cigpIGR1cmluZyBwYXJzaW5nCi0g
ICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgUmVmUHRyPEF0dHJpYnV0ZT4gYSA9IGF0dHJpYnV0
ZTsKLSAgICAgICAgZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChhLmdldCgpKTsKLSAgICAgICAg
Ly8gQmVjYXVzZSBvZiBvdXIgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIHN0eWxlIG1v
ZGlmaWNhdGlvbiBldmVudHMgYXJlIG5ldmVyIHNlbnQgYXQgdGhlIHJpZ2h0IHRpbWUsIHNvIGRv
bid0IGJvdGhlciBzZW5kaW5nIHRoZW0uCi0gICAgICAgIGlmIChhLT5uYW1lKCkgIT0gc3R5bGVB
dHRyKSB7Ci0gICAgICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KGEu
Z2V0KCkpOwotICAgICAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVu
dChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjpyZW1v
dmVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkKLXsKLSAgICB1bnNpZ25lZCBp
bmRleCA9IGxlbisxOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkKLSAg
ICAgICAgaWYgKGF0dHJzW2ldLT5uYW1lKCkubWF0Y2hlcyhuYW1lKSkgewotICAgICAgICAgICAg
aW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGlmIChpbmRl
eCA+PSBsZW4pIHJldHVybjsKLQotICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20gdGhl
IGxpc3QKLSAgICBBdHRyaWJ1dGUqIGF0dHIgPSBhdHRyc1tpbmRleF07Ci0gICAgaWYgKGF0dHJz
W2luZGV4XS0+bV9pbXBsKQotICAgICAgICBhdHRyc1tpbmRleF0tPm1faW1wbC0+bV9lbGVtZW50
ID0gMDsKLSAgICBpZiAobGVuID09IDEpIHsKLSAgICAgICAgZmFzdEZyZWUoYXR0cnMpOwotICAg
ICAgICBhdHRycyA9IDA7Ci0gICAgICAgIGxlbiA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
QXR0cmlidXRlICoqbmV3QXR0cnMgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGUgKio+KGZhc3RNYWxs
b2MoKGxlbiAtIDEpICogc2l6ZW9mKEF0dHJpYnV0ZSAqKSkpOwotICAgICAgICB1bnNpZ25lZCBp
OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdW5zaWduZWQoaW5kZXgpOyBpKyspCi0gICAgICAg
ICAgICBuZXdBdHRyc1tpXSA9IGF0dHJzW2ldOwotICAgICAgICBsZW4tLTsKLSAgICAgICAgZm9y
ICg7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIG5ld0F0dHJzW2ldID0gYXR0cnNbaSsxXTsK
LSAgICAgICAgZmFzdEZyZWUoYXR0cnMpOwotICAgICAgICBhdHRycyA9IG5ld0F0dHJzOwotICAg
IH0KLQotICAgIC8vIE5vdGlmeSB0aGUgZWxlbWVudCB0aGF0IHRoZSBhdHRyaWJ1dGUgaGFzIGJl
ZW4gcmVtb3ZlZAotICAgIC8vIGRpc3BhdGNoIGFwcHJvcHJpYXRlIG11dGF0aW9uIGV2ZW50cwot
ICAgIGlmIChlbGVtZW50ICYmICFhdHRyLT5tX3ZhbHVlLmlzTnVsbCgpKSB7Ci0gICAgICAgIEF0
b21pY1N0cmluZyB2YWx1ZSA9IGF0dHItPm1fdmFsdWU7Ci0gICAgICAgIGF0dHItPm1fdmFsdWUg
PSBudWxsQXRvbTsKLSAgICAgICAgZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChhdHRyKTsKLSAg
ICAgICAgYXR0ci0+bV92YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgICBpZiAoZWxlbWVudCkgewot
ICAgICAgICBlbGVtZW50LT5kaXNwYXRjaEF0dHJSZW1vdmFsRXZlbnQoYXR0cik7Ci0gICAgICAg
IGVsZW1lbnQtPmRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoZmFsc2UpOwotICAgIH0KLSAg
ICBhdHRyLT5kZXJlZigpOwotfQotCi1ib29sIE5hbWVkQXR0ck1hcDo6bWFwc0VxdWl2YWxlbnQo
Y29uc3QgTmFtZWRBdHRyTWFwKiBvdGhlck1hcCkgY29uc3QKLXsKLSAgICBpZiAoIW90aGVyTWFw
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKGxlbmd0aCgpICE9IG90aGVy
TWFwLT5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIEF0dHJpYnV0ZSAqYXR0
ciA9IGF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgIEF0dHJpYnV0ZSAqb3RoZXJBdHRyID0gb3Ro
ZXJNYXAtPmdldEF0dHJpYnV0ZUl0ZW0oYXR0ci0+bmFtZSgpKTsKLSAgICAgICAgICAgIAotICAg
ICAgICBpZiAoIW90aGVyQXR0ciB8fCBhdHRyLT52YWx1ZSgpICE9IG90aGVyQXR0ci0+dmFsdWUo
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3R5bGVkIEVsZW1l
bnQgYW5kIE1hcHBlZCBBdHRyaWJ1dGUgSW1wbGVtZW50YXRpb24KLQotQ1NTTWFwcGVkQXR0cmli
dXRlRGVjbGFyYXRpb246On5DU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi17Ci0gICAg
aWYgKG1fZW50cnlUeXBlICE9IGVQZXJzaXN0ZW50KQotICAgICAgICBTdHlsZWRFbGVtZW50Ojpy
ZW1vdmVNYXBwZWRBdHRyaWJ1dGVEZWNsKG1fZW50cnlUeXBlLCBtX2F0dHJOYW1lLCBtX2F0dHJW
YWx1ZSk7Ci19Ci0KLUNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50
OjpnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5VHlwZSwg
QXR0cmlidXRlKiBhdHRyKQotewotICAgIGlmICghbWFwcGVkQXR0cmlidXRlRGVjbHMpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIHJldHVybiBtYXBwZWRBdHRyaWJ1dGVEZWNscy0+Z2V0KE1hcHBl
ZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0dHItPm5hbWUoKS5sb2NhbE5hbWUoKS5pbXBsKCks
IGF0dHItPnZhbHVlKCkuaW1wbCgpKSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6c2V0TWFw
cGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUsIEF0dHJpYnV0
ZSogYXR0ciwgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wpCi17Ci0gICAgaWYg
KCFtYXBwZWRBdHRyaWJ1dGVEZWNscykKLSAgICAgICAgbWFwcGVkQXR0cmlidXRlRGVjbHMgPSBu
ZXcgTWFwcGVkQXR0cmlidXRlRGVjbHM7Ci0gICAgbWFwcGVkQXR0cmlidXRlRGVjbHMtPnNldChN
YXBwZWRBdHRyaWJ1dGVLZXkoZW50cnlUeXBlLCBhdHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuaW1w
bCgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSksIGRlY2wpOwotfQotCi12b2lkIFN0eWxlZEVsZW1l
bnQ6OnJlbW92ZU1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgZW50cnlU
eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiBhdHRyVmFs
dWUpCi17Ci0gICAgaWYgKCFtYXBwZWRBdHRyaWJ1dGVEZWNscykKLSAgICAgICAgcmV0dXJuOwot
ICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzLT5yZW1vdmUoTWFwcGVkQXR0cmlidXRlS2V5KGVudHJ5
VHlwZSwgYXR0ck5hbWUubG9jYWxOYW1lKCkuaW1wbCgpLCBhdHRyVmFsdWUuaW1wbCgpKSk7Ci19
Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6aW52YWxpZGF0ZVN0eWxlQXR0cmlidXRlKCkKLXsKLSAg
ICBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCA9IGZhbHNlOwotfQotCi12b2lkIFN0eWxlZEVsZW1l
bnQ6OnVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBjb25zdAotewotICAgIGlmICghbV9p
c1N0eWxlQXR0cmlidXRlVmFsaWQpIHsKLSAgICAgICAgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQg
PSB0cnVlOwotICAgICAgICBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IHRydWU7Ci0g
ICAgICAgIGlmIChtX2lubGluZVN0eWxlRGVjbCkKLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8U3R5
bGVkRWxlbWVudCo+KHRoaXMpLT5zZXRBdHRyaWJ1dGUoc3R5bGVBdHRyLCBtX2lubGluZVN0eWxl
RGVjbC0+Y3NzVGV4dCgpKTsKLSAgICAgICAgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUg
PSBmYWxzZTsKLSAgICB9Ci19Ci0KIEF0dHJpYnV0ZSogTWFwcGVkQXR0cmlidXRlOjpjbG9uZShi
b29sIHByZXNlcnZlRGVjbCkgY29uc3QKIHsKICAgICByZXR1cm4gbmV3IE1hcHBlZEF0dHJpYnV0
ZShuYW1lKCksIHZhbHVlKCksIHByZXNlcnZlRGVjbCA/IG1fc3R5bGVEZWNsLmdldCgpIDogMCk7
CiB9CiAKLU5hbWVkTWFwcGVkQXR0ck1hcDo6TmFtZWRNYXBwZWRBdHRyTWFwKEVsZW1lbnQgKmUp
Ci06TmFtZWRBdHRyTWFwKGUpLCBtX21hcHBlZEF0dHJpYnV0ZUNvdW50KDApCi17fQotCi12b2lk
IE5hbWVkTWFwcGVkQXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCkKLXsKLSAgICBtX2NsYXNzTGlz
dC5jbGVhcigpOwotICAgIG1fbWFwcGVkQXR0cmlidXRlQ291bnQgPSAwOwotICAgIE5hbWVkQXR0
ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCk7Ci19Ci0KLWJvb2wgTmFtZWRNYXBwZWRBdHRyTWFwOjpp
c01hcHBlZEF0dHJpYnV0ZU1hcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWlu
dCBOYW1lZE1hcHBlZEF0dHJNYXA6OmRlY2xDb3VudCgpIGNvbnN0Ci17Ci0gICAgaW50IHJlc3Vs
dCA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aCgpOyBpKyspIHsKLSAg
ICAgICAgTWFwcGVkQXR0cmlidXRlKiBhdHRyID0gYXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAg
aWYgKGF0dHItPmRlY2woKSkKLSAgICAgICAgICAgIHJlc3VsdCsrOwotICAgIH0KLSAgICByZXR1
cm4gcmVzdWx0OwotfQotCi1ib29sIE5hbWVkTWFwcGVkQXR0ck1hcDo6bWFwc0VxdWl2YWxlbnQo
Y29uc3QgTmFtZWRNYXBwZWRBdHRyTWFwKiBvdGhlck1hcCkgY29uc3QKLXsKLSAgICAvLyBUaGUg
IyBvZiBkZWNscyBtdXN0IG1hdGNoLgotICAgIGlmIChkZWNsQ291bnQoKSAhPSBvdGhlck1hcC0+
ZGVjbENvdW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAvLyBUaGUgdmFs
dWVzIGZvciBlYWNoIGRlY2wgbXVzdCBtYXRjaC4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbGVuZ3RoKCk7IGkrKykgewotICAgICAgICBNYXBwZWRBdHRyaWJ1dGUqIGF0dHIgPSBhdHRy
aWJ1dGVJdGVtKGkpOwotICAgICAgICBpZiAoYXR0ci0+ZGVjbCgpKSB7Ci0gICAgICAgICAgICBB
dHRyaWJ1dGUqIG90aGVyQXR0ciA9IG90aGVyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGF0dHItPm5h
bWUoKSk7Ci0gICAgICAgICAgICBpZiAoIW90aGVyQXR0ciB8fCAoYXR0ci0+dmFsdWUoKSAhPSBv
dGhlckF0dHItPnZhbHVlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW5saW5lIHN0YXRpYyBib29sIGlz
Q2xhc3NXaGl0ZXNwYWNlKFFDaGFyIGMpCi17Ci0gICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0g
J1xyJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHQnOwotfQotCi12b2lkIE5hbWVkTWFwcGVkQXR0
ck1hcDo6cGFyc2VDbGFzc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIGNsYXNzU3RyKQotewotICAg
IG1fY2xhc3NMaXN0LmNsZWFyKCk7Ci0gICAgaWYgKCFlbGVtZW50LT5oYXNDbGFzcygpKQotICAg
ICAgICByZXR1cm47Ci0gICAgCi0gICAgU3RyaW5nIGNsYXNzQXR0ciA9IGVsZW1lbnQtPmdldERv
Y3VtZW50KCktPmluQ29tcGF0TW9kZSgpID8gCi0gICAgICAgIChjbGFzc1N0ci5pbXBsKCktPmlz
TG93ZXIoKSA/IGNsYXNzU3RyIDogU3RyaW5nKGNsYXNzU3RyLmltcGwoKS0+bG93ZXIoKSkpIDoK
LSAgICAgICAgY2xhc3NTdHI7Ci0gICAgCi0gICAgQXRvbWljU3RyaW5nTGlzdCogY3VyciA9IDA7
Ci0gICAgCi0gICAgY29uc3QgUUNoYXIqIHN0ciA9IGNsYXNzQXR0ci51bmljb2RlKCk7Ci0gICAg
aW50IGxlbmd0aCA9IGNsYXNzQXR0ci5sZW5ndGgoKTsKLSAgICBpbnQgc1BvcyA9IDA7Ci0KLSAg
ICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB3aGlsZSAoc1BvcyA8IGxlbmd0aCAmJiBpc0NsYXNz
V2hpdGVzcGFjZShzdHJbc1Bvc10pKQotICAgICAgICAgICAgKytzUG9zOwotICAgICAgICBpZiAo
c1BvcyA+PSBsZW5ndGgpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaW50IGVQb3MgPSBz
UG9zICsgMTsKLSAgICAgICAgd2hpbGUgKGVQb3MgPCBsZW5ndGggJiYgIWlzQ2xhc3NXaGl0ZXNw
YWNlKHN0cltlUG9zXSkpCi0gICAgICAgICAgICArK2VQb3M7Ci0gICAgICAgIGlmIChjdXJyKSB7
Ci0gICAgICAgICAgICBjdXJyLT5zZXROZXh0KG5ldyBBdG9taWNTdHJpbmdMaXN0KEF0b21pY1N0
cmluZyhzdHIgKyBzUG9zLCBlUG9zIC0gc1BvcykpKTsKLSAgICAgICAgICAgIGN1cnIgPSBjdXJy
LT5uZXh0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc1BvcyA9PSAwICYm
IGVQb3MgPT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgbV9jbGFzc0xpc3Quc2V0U3RyaW5n
KEF0b21pY1N0cmluZyhjbGFzc0F0dHIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIG1fY2xhc3NMaXN0LnNldFN0cmluZyhBdG9taWNTdHJpbmco
c3RyICsgc1BvcywgZVBvcyAtIHNQb3MpKTsKLSAgICAgICAgICAgIGN1cnIgPSAmbV9jbGFzc0xp
c3Q7Ci0gICAgICAgIH0KLSAgICAgICAgc1BvcyA9IGVQb3MgKyAxOwotICAgIH0KLX0KLQotU3R5
bGVkRWxlbWVudDo6U3R5bGVkRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBEb2N1
bWVudCAqZG9jKQotICAgIDogRWxlbWVudChuYW1lLCBkb2MpCi17Ci0gICAgbV9pc1N0eWxlQXR0
cmlidXRlVmFsaWQgPSB0cnVlOwotICAgIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlID0g
ZmFsc2U7Ci19Ci0KLVN0eWxlZEVsZW1lbnQ6On5TdHlsZWRFbGVtZW50KCkKLXsKLSAgICBkZXN0
cm95SW5saW5lU3R5bGVEZWNsKCk7Ci19Ci0KLUF0dHJpYnV0ZSogU3R5bGVkRWxlbWVudDo6Y3Jl
YXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVl
KQotewotICAgIHJldHVybiBuZXcgTWFwcGVkQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLX0KLQot
dm9pZCBTdHlsZWRFbGVtZW50OjpjcmVhdGVJbmxpbmVTdHlsZURlY2woKQotewotICAgIG1faW5s
aW5lU3R5bGVEZWNsID0gbmV3IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uOwotICAgIG1faW5s
aW5lU3R5bGVEZWNsLT5zZXRQYXJlbnQoZ2V0RG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0KCkpOwot
ICAgIG1faW5saW5lU3R5bGVEZWNsLT5zZXROb2RlKHRoaXMpOwotICAgIG1faW5saW5lU3R5bGVE
ZWNsLT5zZXRTdHJpY3RQYXJzaW5nKCFnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSk7Ci19
Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6ZGVzdHJveUlubGluZVN0eWxlRGVjbCgpCi17Ci0gICAg
aWYgKG1faW5saW5lU3R5bGVEZWNsKSB7Ci0gICAgICAgIG1faW5saW5lU3R5bGVEZWNsLT5zZXRO
b2RlKDApOwotICAgICAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0UGFyZW50KDApOwotICAgICAg
ICBtX2lubGluZVN0eWxlRGVjbCA9IDA7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6
OmF0dHJpYnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRyLCBib29sIHByZXNlcnZlRGVjbHMpCi17
Ci0gICAgTWFwcGVkQXR0cmlidXRlKiBtYXBwZWRBdHRyID0gc3RhdGljX2Nhc3Q8TWFwcGVkQXR0
cmlidXRlKj4oYXR0cik7Ci0gICAgaWYgKG1hcHBlZEF0dHItPmRlY2woKSAmJiAhcHJlc2VydmVE
ZWNscykgewotICAgICAgICBtYXBwZWRBdHRyLT5zZXREZWNsKDApOwotICAgICAgICBzZXRDaGFu
Z2VkKCk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgICAgICBtYXBwZWRBdHRy
aWJ1dGVzKCktPmRlY2xSZW1vdmVkKCk7Ci0gICAgfQotCi0gICAgYm9vbCBjaGVja0RlY2wgPSB0
cnVlOwotICAgIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5OwotICAgIGJvb2wgbmVlZFRvUGFy
c2UgPSBtYXBUb0VudHJ5KGF0dHItPm5hbWUoKSwgZW50cnkpOwotICAgIGlmIChwcmVzZXJ2ZURl
Y2xzKSB7Ci0gICAgICAgIGlmIChtYXBwZWRBdHRyLT5kZWNsKCkpIHsKLSAgICAgICAgICAgIHNl
dENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgICAgICAg
ICAgbWFwcGVkQXR0cmlidXRlcygpLT5kZWNsQWRkZWQoKTsKLSAgICAgICAgICAgIGNoZWNrRGVj
bCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCFhdHRyLT5pc051bGwo
KSAmJiBlbnRyeSAhPSBlTm9uZSkgewotICAgICAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbiogZGVjbCA9IGdldE1hcHBlZEF0dHJpYnV0ZURlY2woZW50cnksIGF0dHIpOwotICAgICAg
ICBpZiAoZGVjbCkgewotICAgICAgICAgICAgbWFwcGVkQXR0ci0+c2V0RGVjbChkZWNsKTsKLSAg
ICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIGlmIChuYW1lZEF0dHJNYXApCi0g
ICAgICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5kZWNsQWRkZWQoKTsKLSAgICAgICAg
ICAgIGNoZWNrRGVjbCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG5lZWRU
b1BhcnNlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobmVlZFRvUGFyc2UpCi0gICAgICAgIHBh
cnNlTWFwcGVkQXR0cmlidXRlKG1hcHBlZEF0dHIpOwotICAgIAotICAgIGlmIChjaGVja0RlY2wg
JiYgbWFwcGVkQXR0ci0+ZGVjbCgpKSB7Ci0gICAgICAgIC8vIEFkZCB0aGUgZGVjbCB0byB0aGUg
dGFibGUgaW4gdGhlIGFwcHJvcHJpYXRlIHNwb3QuCi0gICAgICAgIHNldE1hcHBlZEF0dHJpYnV0
ZURlY2woZW50cnksIGF0dHIsIG1hcHBlZEF0dHItPmRlY2woKSk7Ci0gICAgICAgIG1hcHBlZEF0
dHItPmRlY2woKS0+c2V0TWFwcGVkU3RhdGUoZW50cnksIGF0dHItPm5hbWUoKSwgYXR0ci0+dmFs
dWUoKSk7Ci0gICAgICAgIG1hcHBlZEF0dHItPmRlY2woKS0+c2V0UGFyZW50KDApOwotICAgICAg
ICBtYXBwZWRBdHRyLT5kZWNsKCktPnNldE5vZGUoMCk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJN
YXApCi0gICAgICAgICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPmRlY2xBZGRlZCgpOwotICAgIH0K
LX0KLQotYm9vbCBTdHlsZWRFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUm
IGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIHJl
c3VsdCA9IGVOb25lOwotICAgIGlmIChhdHRyTmFtZSA9PSBzdHlsZUF0dHIpCi0gICAgICAgIHJl
dHVybiAhbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1dGU7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gaWRBdHRyKSB7Ci0gICAgICAg
IC8vIHVuaXF1ZSBpZAotICAgICAgICBzZXRIYXNJRCghYXR0ci0+aXNOdWxsKCkpOwotICAgICAg
ICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgICAgICBpZiAoYXR0ci0+aXNOdWxsKCkpCi0g
ICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChudWxsQXRvbSk7Ci0gICAgICAgICAg
ICBlbHNlIGlmIChnZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSAmJiAhYXR0ci0+dmFsdWUo
KS5pbXBsKCktPmlzTG93ZXIoKSkKLSAgICAgICAgICAgICAgICBuYW1lZEF0dHJNYXAtPnNldElE
KEF0b21pY1N0cmluZyhhdHRyLT52YWx1ZSgpLmRvbVN0cmluZygpLmxvd2VyKCkpKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuYW1lZEF0dHJNYXAtPnNldElEKGF0dHItPnZh
bHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBjbGFzc0F0dHIpIHsKLSAgICAgICAgLy8gY2xhc3MKLSAgICAgICAg
c2V0SGFzQ2xhc3MoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkK
LSAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+cGFyc2VDbGFzc0F0dHJpYnV0ZShhdHRy
LT52YWx1ZSgpKTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IHN0eWxlQXR0cikgewotICAgICAgICBzZXRIYXNTdHlsZSghYXR0ci0+aXNOdWxs
KCkpOwotICAgICAgICBpZiAoYXR0ci0+aXNOdWxsKCkpCi0gICAgICAgICAgICBkZXN0cm95SW5s
aW5lU3R5bGVEZWNsKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdldElubGluZVN0eWxl
RGVjbCgpLT5wYXJzZURlY2xhcmF0aW9uKGF0dHItPnZhbHVlKCkpOwotICAgICAgICBtX2lzU3R5
bGVBdHRyaWJ1dGVWYWxpZCA9IHRydWU7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9Ci19
Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAg
ICBuYW1lZEF0dHJNYXAgPSBuZXcgTmFtZWRNYXBwZWRBdHRyTWFwKGNvbnN0X2Nhc3Q8U3R5bGVk
RWxlbWVudCo+KHRoaXMpKTsKLX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIFN0eWxl
ZEVsZW1lbnQ6OmdldElubGluZVN0eWxlRGVjbCgpCi17Ci0gICAgaWYgKCFtX2lubGluZVN0eWxl
RGVjbCkKLSAgICAgICAgY3JlYXRlSW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgcmV0dXJuIG1faW5s
aW5lU3R5bGVEZWNsLmdldCgpOwotfQotCi1DU1NTdHlsZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVt
ZW50OjpzdHlsZSgpCi17Ci0gICAgcmV0dXJuIGdldElubGluZVN0eWxlRGVjbCgpOwotfQotCi1D
U1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6YWRkaXRpb25hbEF0dHJp
YnV0ZVN0eWxlRGVjbCgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmlu
Z0xpc3QqIFN0eWxlZEVsZW1lbnQ6OmdldENsYXNzTGlzdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG5hbWVkQXR0ck1hcCA/IG1hcHBlZEF0dHJpYnV0ZXMoKS0+Z2V0Q2xhc3NMaXN0KCkgOiAwOwot
fQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNIZXhEaWdpdCggY29uc3QgUUNoYXIgJmMgKSB7Ci0g
ICAgcmV0dXJuICggYyA+PSAnMCcgJiYgYyA8PSAnOScgKSB8fAotICAgICAgICAgICAoIGMgPj0g
J2EnICYmIGMgPD0gJ2YnICkgfHwKLSAgICAgICAgICAgKCBjID49ICdBJyAmJiBjIDw9ICdGJyAp
OwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0b0hleCggY29uc3QgUUNoYXIgJmMgKSB7Ci0gICAg
cmV0dXJuICggKGMgPj0gJzAnICYmIGMgPD0gJzknKQotICAgICAgICAgICAgID8gKGMudW5pY29k
ZSgpIC0gJzAnKQotICAgICAgICAgICAgIDogKCAoIGMgPj0gJ2EnICYmIGMgPD0gJ2YnICkKLSAg
ICAgICAgICAgICAgICAgPyAoYy51bmljb2RlKCkgLSAnYScgKyAxMCkKLSAgICAgICAgICAgICAg
ICAgOiAoICggYyA+PSAnQScgJiYgYyA8PSAnRicgKQotICAgICAgICAgICAgICAgICAgICAgPyAo
Yy51bmljb2RlKCkgLSAnQScgKyAxMCkKLSAgICAgICAgICAgICAgICAgICAgIDogLTEgKSApICk7
Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NTUHJvcGVydHkoTWFwcGVkQXR0cmlidXRl
KiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgaWYgKCFhdHRyLT5k
ZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRQcm9w
ZXJ0eShpZCwgdmFsdWUsIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NQ
cm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgaW50IHZhbHVlKQotewotICAg
IGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0dHItPmRl
Y2woKS0+c2V0UHJvcGVydHkoaWQsIHZhbHVlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxl
bWVudDo6YWRkQ1NTU3RyaW5nUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQs
IGNvbnN0IFN0cmluZyAmdmFsdWUsIENTU1ByaW1pdGl2ZVZhbHVlOjpVbml0VHlwZXMgdHlwZSkK
LXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBh
dHRyLT5kZWNsKCktPnNldFN0cmluZ1Byb3BlcnR5KGlkLCB2YWx1ZSwgdHlwZSwgZmFsc2UpOwot
fQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0ltYWdlUHJvcGVydHkoTWFwcGVkQXR0cmli
dXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmVVJMKQotewotICAgIGlmICghYXR0ci0+
ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0dHItPmRlY2woKS0+c2V0SW1h
Z2VQcm9wZXJ0eShpZCwgVVJMLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRk
Q1NTTGVuZ3RoKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIC8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3Qgc3BpbiB1cCB0
aGUgQ1NTIHBhcnNlciwgYnV0IHNob3VsZCBpbnN0ZWFkIGp1c3QgZmlndXJlIG91dCB0aGUgY29y
cmVjdAotICAgIC8vIGxlbmd0aCB1bml0IGFuZCBtYWtlIHRoZSBhcHByb3ByaWF0ZSBwYXJzZWQg
dmFsdWUuCi0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0K
LSAgICAvLyBzdHJpcCBhdHRyaWJ1dGUgZ2FyYmFnZS4uCi0gICAgU3RyaW5nSW1wbCogdiA9IHZh
bHVlLmltcGwoKTsKLSAgICBpZiAodikgewotICAgICAgICB1bnNpZ25lZCBpbnQgbCA9IDA7Ci0g
ICAgICAgIAotICAgICAgICB3aGlsZSAobCA8IHYtPmxlbmd0aCgpICYmICgqdilbbF0udW5pY29k
ZSgpIDw9ICcgJykKLSAgICAgICAgICAgIGwrKzsKLSAgICAgICAgCi0gICAgICAgIGZvciAoOyBs
IDwgdi0+bGVuZ3RoKCk7IGwrKykgewotICAgICAgICAgICAgY2hhciBjYyA9ICgqdilbbF0ubGF0
aW4xKCk7Ci0gICAgICAgICAgICBpZiAoY2MgPiAnOScgfHwgKGNjIDwgJzAnICYmIGNjICE9ICcq
JyAmJiBjYyAhPSAnJScgJiYgY2MgIT0gJy4nKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmIChsICE9IHYtPmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBh
dHRyLT5kZWNsKCktPnNldExlbmd0aFByb3BlcnR5KGlkLCB2LT5zdWJzdHJpbmcoMCwgbCksIGZh
bHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBh
dHRyLT5kZWNsKCktPnNldExlbmd0aFByb3BlcnR5KGlkLCB2YWx1ZSwgZmFsc2UpOwotfQotCi0v
KiBjb2xvciBwYXJzaW5nIHRoYXQgdHJpZXMgdG8gbWF0Y2ggYXMgY2xvc2UgYXMgcG9zc2libGUg
SUUgNi4gKi8KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NTQ29sb3IoTWFwcGVkQXR0cmlidXRl
KiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmYykKLXsKLSAgICAvLyB0aGlzIGlzIHRoZSBv
bmx5IGNhc2Ugbm8gY29sb3IgZ2V0cyBhcHBsaWVkIGluIElFLgotICAgIGlmICggIWMubGVuZ3Ro
KCkgKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFw
cGVkRGVjbChhdHRyKTsKLSAgICAKLSAgICBpZiAoYXR0ci0+ZGVjbCgpLT5zZXRQcm9wZXJ0eShp
ZCwgYywgZmFsc2UpICkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIERlcHJlY2F0ZWRTdHJp
bmcgY29sb3IgPSBjLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAvLyBub3Qgc29tZXRoaW5nIHRo
YXQgZml0cyB0aGUgc3BlY3MuCi0gICAgCi0gICAgLy8gd2UncmUgZW11bGF0aW5nIElFcyBjb2xv
ciBwYXJzZXIgaGVyZS4gSXQgbWFwcyB0cmFuc3BhcmVudCB0byBibGFjaywgb3RoZXJ3aXNlIGl0
IHRyaWVzIHRvIGJ1aWxkIGEgcmdiIHZhbHVlCi0gICAgLy8gb3V0IG9mIGV2ZXJ5aHRpbmcgeW91
IHB1dCBpbi4gVGhlIGFsZ29yaXRobSBpcyBleHBlcmltZW50YWxseSBkZXRlcm1pbmVkLCBidXQg
c2VlbXMgdG8gd29yayBmb3IgYWxsIHRlc3QgY2FzZXMgSSBoYXZlLgotICAgIAotICAgIC8vIHRo
ZSBsZW5ndGggb2YgdGhlIGNvbG9yIHZhbHVlIGlzIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKLSAg
ICAvLyBtdWx0aXBsZSBvZiAzLiBlYWNoIHBhcnQgb2YgdGhlIHJnYiB0cmlwbGUgdGhlbiBnZXRz
IG9uZSB0aGlyZAotICAgIC8vIG9mIHRoZSBsZW5ndGguCi0gICAgLy8KLSAgICAvLyBFYWNoIHRy
aXBsZXQgaXMgcGFyc2VkIGJ5dGUgYnkgYnl0ZSwgbWFwcGluZwotICAgIC8vIGVhY2ggbnVtYmVy
IHRvIGEgaGV4IHZhbHVlICgwLTlhLWZBLUYgdG8gdGhlaXIgdmFsdWVzCi0gICAgLy8gZXZlcnl0
aGluZyBlbHNlIHRvIDApLgotICAgIC8vCi0gICAgLy8gVGhlIGhpZ2hlc3Qgbm9uIHplcm8gZGln
aXQgaW4gYWxsIHRyaXBsZXRzIGlzIHJlbWVtYmVyZWQsIGFuZAotICAgIC8vIHVzZWQgYXMgYSBu
b3JtYWxpemF0aW9uIHBvaW50IHRvIG5vcm1hbGl6ZSB0byB2YWx1ZXMgYmV0d2VlbiAwCi0gICAg
Ly8gYW5kIDI1NS4KLSAgICAKLSAgICBpZiAoIGNvbG9yLmxvd2VyKCkgIT0gInRyYW5zcGFyZW50
IiApIHsKLSAgICAgICAgaWYgKCBjb2xvclswXSA9PSAnIycgKQotICAgICAgICAgICAgY29sb3Iu
cmVtb3ZlKCAwLCAgMSApOwotICAgICAgICBpbnQgYmFzaWNMZW5ndGggPSAoY29sb3IubGVuZ3Ro
KCkgKyAyKSAvIDM7Ci0gICAgICAgIGlmICggYmFzaWNMZW5ndGggPiAxICkgewotICAgICAgICAg
ICAgLy8gSUUgaWdub3JlcyBjb2xvcnMgd2l0aCB0aHJlZSBkaWdpdHMgb3IgbGVzcwotICAgICAg
ICAgICAgaW50IGNvbG9yc1szXSA9IHsgMCwgMCwgMCB9OwotICAgICAgICAgICAgaW50IGNvbXBv
bmVudCA9IDA7Ci0gICAgICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgICAgIGludCBtYXhE
aWdpdCA9IGJhc2ljTGVuZ3RoLTE7Ci0gICAgICAgICAgICB3aGlsZSAoIGNvbXBvbmVudCA8IDMg
KSB7Ci0gICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvcndhcmQgZm9yIGRpZ2l0cyBpbiB0aGUg
c3RyaW5nCi0gICAgICAgICAgICAgICAgaW50IG51bURpZ2l0cyA9IDA7Ci0gICAgICAgICAgICAg
ICAgd2hpbGUgKCBwb3MgPCAoaW50KWNvbG9yLmxlbmd0aCgpICYmIG51bURpZ2l0cyA8IGJhc2lj
TGVuZ3RoICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaGV4ID0gdG9IZXgoIGNvbG9yW3Bv
c10gKTsKLSAgICAgICAgICAgICAgICAgICAgY29sb3JzW2NvbXBvbmVudF0gPSAoY29sb3JzW2Nv
bXBvbmVudF0gPDwgNCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggaGV4ID4gMCApIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1tjb21wb25lbnRdICs9IGhleDsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG1heERpZ2l0ID0ga01pbiggbWF4RGlnaXQsIG51bURpZ2l0cyApOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG51bURpZ2l0cysrOwot
ICAgICAgICAgICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgd2hpbGUgKCBudW1EaWdpdHMrKyA8IGJhc2ljTGVuZ3RoICkKLSAgICAgICAgICAgICAg
ICAgICAgY29sb3JzW2NvbXBvbmVudF0gPDw9IDQ7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50
Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhEaWdpdCA9IGJhc2ljTGVuZ3RoIC0g
bWF4RGlnaXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0byAwMC1m
Zi4gVGhlIGhpZ2hlc3QgZmlsbGVkIGRpZ2l0IGNvdW50cywgbWluaW11bSBpcyAyIGRpZ2l0cwot
ICAgICAgICAgICAgbWF4RGlnaXQgLT0gMjsKLSAgICAgICAgICAgIGNvbG9yc1swXSA+Pj0gNCpt
YXhEaWdpdDsKLSAgICAgICAgICAgIGNvbG9yc1sxXSA+Pj0gNCptYXhEaWdpdDsKLSAgICAgICAg
ICAgIGNvbG9yc1syXSA+Pj0gNCptYXhEaWdpdDsKLSAgICAgICAgICAgIC8vIGFzc2VydCggY29s
b3JzWzBdIDwgMHgxMDAgJiYgY29sb3JzWzFdIDwgMHgxMDAgJiYgY29sb3JzWzJdIDwgMHgxMDAg
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29sb3Iuc3ByaW50ZigiIyUwMnglMDJ4JTAy
eCIsIGNvbG9yc1swXSwgY29sb3JzWzFdLCBjb2xvcnNbMl0gKTsKLSAgICAgICAgICAgIGlmICgg
YXR0ci0+ZGVjbCgpLT5zZXRQcm9wZXJ0eShpZCwgU3RyaW5nKGNvbG9yKSwgZmFsc2UpICkKLSAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXR0ci0+ZGVjbCgp
LT5zZXRQcm9wZXJ0eShpZCwgQ1NTX1ZBTF9CTEFDSywgZmFsc2UpOwotfQotCi12b2lkIFN0eWxl
ZEVsZW1lbnQ6OmNyZWF0ZU1hcHBlZERlY2woTWFwcGVkQXR0cmlidXRlKiBhdHRyKQotewotICAg
IENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gbmV3IENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKDApOwotICAgIGF0dHItPnNldERlY2woZGVjbCk7Ci0gICAgZGVjbC0+
c2V0UGFyZW50KGdldERvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICBkZWNsLT5zZXRO
b2RlKHRoaXMpOwotICAgIGRlY2wtPnNldFN0cmljdFBhcnNpbmcoZmFsc2UpOyAvLyBNYXBwZWQg
YXR0cmlidXRlcyBhcmUganVzdCBhbHdheXMgcXVpcmt5LgotfQotCi0vLyBHb2xkZW4gcmF0aW8g
LSBhcmJpdHJhcnkgc3RhcnQgdmFsdWUgdG8gYXZvaWQgbWFwcGluZyBhbGwgMCdzIHRvIGFsbCAw
J3MKLS8vIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4KLWNvbnN0IHVuc2lnbmVkIFBISSA9IDB4OWUz
Nzc5YjlVOwotCi0vLyBQYXVsIEhzaWVoJ3MgU3VwZXJGYXN0SGFzaAotLy8gaHR0cDovL3d3dy5h
emlsbGlvbm1vbmtleXMuY29tL3FlZC9oYXNoLmh0bWwKLXVuc2lnbmVkIE1hcHBlZEF0dHJpYnV0
ZUhhc2g6Omhhc2goY29uc3QgTWFwcGVkQXR0cmlidXRlS2V5JiBrZXkpCi17Ci0gICAgdWludDMy
X3QgaGFzaCA9IFBISTsKLSAgICB1aW50MzJfdCB0bXA7Ci0KLSAgICBjb25zdCB1aW50MTZfdCog
cDsKLQotICAgIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4oJmtleS5uYW1l
KTsKLSAgICBoYXNoICs9IHBbMF07Ci0gICAgdG1wID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAg
ICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAg
ICBhc3NlcnQoc2l6ZW9mKGtleS5uYW1lKSA9PSA0IHx8IHNpemVvZihrZXkubmFtZSkgPT0gOCk7
Ci0gICAgaWYgKHNpemVvZihrZXkubmFtZSkgPT0gOCkgewotICAgICAgICBwICs9IDI7Ci0gICAg
ICAgIGhhc2ggKz0gcFswXTsKLSAgICAgICAgdG1wID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAg
ICAgICAgaGFzaCA9IChoYXNoIDw8IDE2KSBeIHRtcDsKLSAgICAgICAgaGFzaCArPSBoYXNoID4+
IDExOwotICAgIH0KLQotICAgIHAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4o
JmtleS52YWx1ZSk7Ci0gICAgaGFzaCArPSBwWzBdOwotICAgIHRtcCA9IChwWzFdIDw8IDExKSBe
IGhhc2g7Ci0gICAgaGFzaCA9IChoYXNoIDw8IDE2KSBeIHRtcDsKLSAgICBoYXNoICs9IGhhc2gg
Pj4gMTE7Ci0gICAgYXNzZXJ0KHNpemVvZihrZXkudmFsdWUpID09IDQgfHwgc2l6ZW9mKGtleS52
YWx1ZSkgPT0gOCk7Ci0gICAgaWYgKHNpemVvZihrZXkudmFsdWUpID09IDgpIHsKLSAgICAgICAg
cCArPSAyOwotICAgICAgICBoYXNoICs9IHBbMF07Ci0gICAgICAgIHRtcCA9IChwWzFdIDw8IDEx
KSBeIGhhc2g7Ci0gICAgICAgIGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgICAgIGhh
c2ggKz0gaGFzaCA+PiAxMTsKLSAgICB9Ci0KLSAgICAvLyBIYW5kbGUgZW5kIGNhc2UKLSAgICBo
YXNoICs9IGtleS50eXBlOwotICAgIGhhc2ggXj0gaGFzaCA8PCAxMTsKLSAgICBoYXNoICs9IGhh
c2ggPj4gMTc7Ci0KLSAgICAvLyBGb3JjZSAiYXZhbGFuY2hpbmciIG9mIGZpbmFsIDEyNyBiaXRz
Ci0gICAgaGFzaCBePSBoYXNoIDw8IDM7Ci0gICAgaGFzaCArPSBoYXNoID4+IDU7Ci0gICAgaGFz
aCBePSBoYXNoIDw8IDI7Ci0gICAgaGFzaCArPSBoYXNoID4+IDE1OwotICAgIGhhc2ggXj0gaGFz
aCA8PCAxMDsKLQotICAgIC8vIFRoaXMgYXZvaWRzIGV2ZXIgcmV0dXJuaW5nIGEgaGFzaCBjb2Rl
IG9mIDAsIHNpbmNlIHRoYXQgaXMgdXNlZCB0bwotICAgIC8vIHNpZ25hbCAiaGFzaCBub3QgY29t
cHV0ZWQgeWV0IiwgdXNpbmcgYSB2YWx1ZSB0aGF0IGlzIGxpa2VseSB0byBiZQotICAgIC8vIGVm
ZmVjdGl2ZWx5IHRoZSBzYW1lIGFzIDAgd2hlbiB0aGUgbG93IGJpdHMgYXJlIG1hc2tlZAotICAg
IGlmIChoYXNoID09IDApCi0gICAgICAgIGhhc2ggPSAweDgwMDAwMDAwOwotCi0gICAgcmV0dXJu
IGhhc2g7Ci19Ci0KIH0KSW5kZXg6IGRvbS9BdHRyaWJ1dGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRv
bS9BdHRyaWJ1dGUuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGRvbS9BdHRyaWJ1dGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yMiw1NiArMjIsMTQgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3Rvbiwg
TUEgMDIxMTEtMTMwNywgVVNBLgogICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJkb21fZWxlbWVudGltcGwuaCIKKyNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKIAotI2luY2x1ZGUg
IkV4Y2VwdGlvbkNvZGUuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIlRleHQuaCIK
LSNpbmNsdWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBs
LmgiCi0jaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5
d29yZHMuaCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJkb21feG1s
aW1wbC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgotI2luY2x1ZGUgIkhUTUxQYXJzZXIuaCIK
LSNpbmNsdWRlICJSZW5kZXJDYW52YXMuaCIKLSNpbmNsdWRlIDxxdGV4dHN0cmVhbS5oPgorI2lu
Y2x1ZGUgIkF0dHIuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0
ZUtleSB7Ci0gICAgdWludDE2X3QgdHlwZTsKLSAgICBTdHJpbmdJbXBsKiBuYW1lOwotICAgIFN0
cmluZ0ltcGwqIHZhbHVlOwotICAgIE1hcHBlZEF0dHJpYnV0ZUtleShNYXBwZWRBdHRyaWJ1dGVF
bnRyeSB0LCBTdHJpbmdJbXBsKiBuLCBTdHJpbmdJbXBsKiB2KQotICAgICAgICA6IHR5cGUodCks
IG5hbWUobiksIHZhbHVlKHYpIHsgfQotfTsKLQotc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9y
PT0oY29uc3QgTWFwcGVkQXR0cmlidXRlS2V5JiBhLCBjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkm
IGIpCi0gICAgeyByZXR1cm4gYS50eXBlID09IGIudHlwZSAmJiBhLm5hbWUgPT0gYi5uYW1lICYm
IGEudmFsdWUgPT0gYi52YWx1ZTsgfSAKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0
cyB7Ci0gICAgdHlwZWRlZiBNYXBwZWRBdHRyaWJ1dGVLZXkgVHJhaXRUeXBlOwotICAgIHN0YXRp
YyBjb25zdCBib29sIGVtcHR5VmFsdWVJc1plcm8gPSB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBi
b29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSBmYWxzZTsKLSAgICBzdGF0aWMgTWFwcGVkQXR0cmlidXRl
S2V5IGVtcHR5VmFsdWUoKSB7IHJldHVybiBNYXBwZWRBdHRyaWJ1dGVLZXkoZU5vbmUsIDAsIDAp
OyB9Ci0gICAgc3RhdGljIE1hcHBlZEF0dHJpYnV0ZUtleSBkZWxldGVkVmFsdWUoKSB7IHJldHVy
biBNYXBwZWRBdHRyaWJ1dGVLZXkoZUxhc3RFbnRyeSwgMCwgMCk7IH0KLX07Ci0KLXN0cnVjdCBN
YXBwZWRBdHRyaWJ1dGVIYXNoIHsKLSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBNYXBw
ZWRBdHRyaWJ1dGVLZXkmKTsKLSAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBNYXBwZWRBdHRy
aWJ1dGVLZXkmIGEsIGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYgYikgeyByZXR1cm4gYSA9PSBi
OyB9Ci19OwotCi10eXBlZGVmIEhhc2hNYXA8TWFwcGVkQXR0cmlidXRlS2V5LCBDU1NNYXBwZWRB
dHRyaWJ1dGVEZWNsYXJhdGlvbiosIE1hcHBlZEF0dHJpYnV0ZUhhc2gsIE1hcHBlZEF0dHJpYnV0
ZUtleVRyYWl0cz4gTWFwcGVkQXR0cmlidXRlRGVjbHM7Ci0KLXN0YXRpYyBNYXBwZWRBdHRyaWJ1
dGVEZWNscyogbWFwcGVkQXR0cmlidXRlRGVjbHMgPSAwOwotCiBBdHRyaWJ1dGUqIEF0dHJpYnV0
ZTo6Y2xvbmUoYm9vbCkgY29uc3QKIHsKICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZShtX25hbWUs
IG1fdmFsdWUpOwpAQCAtODcsMTU3MiArNDUsNCBAQCBQYXNzUmVmUHRyPEF0dHI+IEF0dHJpYnV0
ZTo6Y3JlYXRlQXR0cklmCiAgICAgcmV0dXJuIHIucmVsZWFzZSgpOwogfQogCi1BdHRyOjpBdHRy
KEVsZW1lbnQqIGVsZW1lbnQsIERvY3VtZW50KiBkb2NQdHIsIEF0dHJpYnV0ZSogYSkKLSAgICA6
IENvbnRhaW5lck5vZGUoZG9jUHRyKSwKLSAgICAgIG1fZWxlbWVudChlbGVtZW50KSwKLSAgICAg
IG1fYXR0cmlidXRlKGEpLAotICAgICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQoMCkKLXsKLSAg
ICBhc3NlcnQoIW1fYXR0cmlidXRlLT5tX2ltcGwpOwotICAgIG1fYXR0cmlidXRlLT5tX2ltcGwg
PSB0aGlzOwotICAgIG1fc3BlY2lmaWVkID0gdHJ1ZTsKLX0KLQotQXR0cjo6fkF0dHIoKQotewot
ICAgIGFzc2VydChtX2F0dHJpYnV0ZS0+bV9pbXBsID09IHRoaXMpOwotICAgIG1fYXR0cmlidXRl
LT5tX2ltcGwgPSAwOwotfQotCi12b2lkIEF0dHI6OmNyZWF0ZVRleHRDaGlsZCgpCi17Ci0gICAg
YXNzZXJ0KHJlZkNvdW50KCkpOwotICAgIGlmICghbV9hdHRyaWJ1dGUtPnZhbHVlKCkuaXNFbXB0
eSgpKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBtX2lnbm9yZUNo
aWxkcmVuQ2hhbmdlZCsrOwotICAgICAgICBhcHBlbmRDaGlsZChnZXREb2N1bWVudCgpLT5jcmVh
dGVUZXh0Tm9kZShtX2F0dHJpYnV0ZS0+dmFsdWUoKS5pbXBsKCkpLCBlYyk7Ci0gICAgICAgIG1f
aWdub3JlQ2hpbGRyZW5DaGFuZ2VkLS07Ci0gICAgfQotfQotCi1TdHJpbmcgQXR0cjo6bm9kZU5h
bWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lKCk7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEF0
dHI6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQVRUUklCVVRFX05PREU7Ci19Ci0K
LWNvbnN0IEF0b21pY1N0cmluZyYgQXR0cjo6bG9jYWxOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9hdHRyaWJ1dGUtPmxvY2FsTmFtZSgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEF0
dHI6Om5hbWVzcGFjZVVSSSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXR0cmlidXRlLT5uYW1l
c3BhY2VVUkkoKTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBBdHRyOjpwcmVmaXgoKSBjb25z
dAotewotICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+cHJlZml4KCk7Ci19Ci0KLXZvaWQgQXR0cjo6
c2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYgZWMp
Ci17Ci0gICAgY2hlY2tTZXRQcmVmaXgoX3ByZWZpeCwgZWMpOwotICAgIGlmIChlYykKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgbV9hdHRyaWJ1dGUtPnNldFByZWZpeChfcHJlZml4KTsKLX0KLQot
U3RyaW5nIEF0dHI6Om5vZGVWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlKCk7Ci19
Ci0KLXZvaWQgQXR0cjo6c2V0VmFsdWUoIGNvbnN0IFN0cmluZyYgdiwgRXhjZXB0aW9uQ29kZSYg
ZWMpCi17Ci0gICAgZWMgPSAwOwotCi0gICAgLy8gZG8gbm90IGludGVycHJldGUgZW50aXRpZXMg
aW4gdGhlIHN0cmluZywgaXRzIGxpdGVyYWwhCi0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxM
T1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKGlzUmVh
ZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vICMjIyB3aGF0IHRvIGRvIG9uIDAgPwotICAg
IGlmICh2LmlzTnVsbCgpKSB7Ci0gICAgICAgIGVjID0gRE9NU1RSSU5HX1NJWkVfRVJSOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGUgPSAwOwotICAgIG1faWdub3JlQ2hpbGRy
ZW5DaGFuZ2VkKys7Ci0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBhcHBlbmRDaGlsZChnZXRE
b2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZSh2LmltcGwoKSksIGUpOwotICAgIG1faWdub3JlQ2hp
bGRyZW5DaGFuZ2VkLS07Ci0gICAgCi0gICAgbV9hdHRyaWJ1dGUtPnNldFZhbHVlKHYuaW1wbCgp
KTsKLSAgICBpZiAobV9lbGVtZW50KQotICAgICAgICBtX2VsZW1lbnQtPmF0dHJpYnV0ZUNoYW5n
ZWQobV9hdHRyaWJ1dGUuZ2V0KCkpOwotfQotCi12b2lkIEF0dHI6OnNldE5vZGVWYWx1ZShjb25z
dCBTdHJpbmcmIHYsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIC8vIE5PX01PRElGSUNBVElP
Tl9BTExPV0VEX0VSUjogdGFrZW4gY2FyZSBvZiBieSBzZXRWYWx1ZSgpCi0gICAgc2V0VmFsdWUo
diwgZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IEF0dHI6OmNsb25lTm9kZShib29sIC8qZGVl
cCovKQotewotICAgIFJlZlB0cjxBdHRyPiBjbG9uZSA9IG5ldyBBdHRyKDAsIGdldERvY3VtZW50
KCksIG1fYXR0cmlidXRlLT5jbG9uZSgpKTsKLSAgICBjbG9uZUNoaWxkTm9kZXMoY2xvbmUuZ2V0
KCkpOwotICAgIHJldHVybiBjbG9uZS5yZWxlYXNlKCk7Ci19Ci0KLS8vIERPTSBTZWN0aW9uIDEu
MS4xCi1ib29sIEF0dHI6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkKLXsKLSAgICBz
d2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBURVhUX05PREU6Ci0gICAgICAgIGNhc2UgRU5U
SVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEF0dHI6
OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgTm9kZTo6Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAg
Ci0gICAgaWYgKG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkID4gMCkKLSAgICAgICAgcmV0dXJuOwot
ICAgIAotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgaW5jbHVkZSBlbnRpdHkgcmVmZXJlbmNlcyBp
biB0aGUgdmFsdWUKLSAgICAKLSAgICBTdHJpbmcgdmFsID0gIiI7Ci0gICAgZm9yIChOb2RlICpu
ID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAo
bi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFsICs9IHN0YXRpY19jYXN0PFRleHQgKj4o
biktPmRhdGEoKTsKLSAgICB9Ci0gICAgCi0gICAgbV9hdHRyaWJ1dGUtPnNldFZhbHVlKHZhbC5p
bXBsKCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAgICAgIG1fZWxlbWVudC0+YXR0cmlidXRl
Q2hhbmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0KLVN0cmluZyBBdHRyOjp0b1N0cmluZygp
IGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdDsKLQotICAgIHJlc3VsdCArPSBub2RlTmFtZSgp
OwotCi0gICAgLy8gRklYTUU6IHN1YnN0aXR1dGUgZW50aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMg
b2YgIiBvciAnIC0tCi0gICAgLy8gbWF5YmUgZWFzaWVyIHRvIGp1c3QgdXNlIHRleHQgdmFsdWUg
YW5kIGlnbm9yZSBleGlzdGluZwotICAgIC8vIGVudGl0eSByZWZzPwotCi0gICAgaWYgKGZpcnN0
Q2hpbGQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPVwiIjsKLQotICAgICAgICBm
b3IgKE5vZGUgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNo
aWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQtPnRvU3Ry
aW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCArPSAiXCIiOwotICAg
IH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lm
bmRlZiBOREVCVUcKLXN0cnVjdCBFbGVtZW50SW1wbENvdW50ZXIgCi17IAotICAgIHN0YXRpYyBp
bnQgY291bnQ7IAotICAgIH5FbGVtZW50SW1wbENvdW50ZXIoKSB7IC8qIGlmIChjb3VudCAhPSAw
KSBmcHJpbnRmKHN0ZGVyciwgIkxFQUs6ICVkIEVsZW1lbnRcbiIsIGNvdW50KTsgKi8gfSAKLX07
Ci1pbnQgRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLXN0YXRpYyBFbGVtZW50SW1wbENvdW50
ZXIgZWxlbWVudEltcGxDb3VudGVyOwotI2VuZGlmIE5ERUJVRwotCi1FbGVtZW50OjpFbGVtZW50
KGNvbnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lLCBEb2N1bWVudCAqZG9jKQotICAgIDogQ29udGFp
bmVyTm9kZShkb2MpLCBtX3RhZ05hbWUocU5hbWUpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgICsr
RWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRpZgotfQotCi1FbGVtZW50Ojp+RWxlbWVu
dCgpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIC0tRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsK
LSNlbmRpZgotICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZGV0
YWNoRnJvbUVsZW1lbnQoKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBFbGVtZW50OjpjbG9uZU5v
ZGUoYm9vbCBkZWVwKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIFJlZlB0cjxF
bGVtZW50PiBjbG9uZSA9IGdldERvY3VtZW50KCktPmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VV
UkkoKSwgbm9kZU5hbWUoKSwgZWMpOwotICAgIGFzc2VydCghZWMpOwotICAgIAotICAgIC8vIGNs
b25lIGF0dHJpYnV0ZXMKLSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAqY2xvbmUtPmF0
dHJpYnV0ZXMoKSA9ICpuYW1lZEF0dHJNYXA7Ci0KLSAgICBjbG9uZS0+Y29weU5vbkF0dHJpYnV0
ZVByb3BlcnRpZXModGhpcyk7Ci0gICAgCi0gICAgaWYgKGRlZXApCi0gICAgICAgIGNsb25lQ2hp
bGROb2RlcyhjbG9uZS5nZXQoKSk7Ci0KLSAgICByZXR1cm4gY2xvbmUucmVsZWFzZSgpOwotfQot
Ci12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAg
IG5hbWVkQXR0ck1hcC0+cmVtb3ZlTmFtZWRJdGVtKG5hbWUsIGVjKTsKLSAgICAgICAgaWYgKGVj
ID09IE5PVF9GT1VORF9FUlIpCi0gICAgICAgICAgICBlYyA9IDA7Ci0gICAgfQotfQotCi12b2lk
IEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIHNldEF0dHJp
YnV0ZShuYW1lLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0KLQotLy8gVmlydHVhbCBmdW5jdGlvbiwg
ZGVmaW5lZCBpbiBiYXNlIGNsYXNzLgotTmFtZWRBdHRyTWFwICpFbGVtZW50OjphdHRyaWJ1dGVz
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0cmlidXRlcyhmYWxzZSk7Ci19Ci0KLU5hbWVkQXR0
ck1hcCogRWxlbWVudDo6YXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBjb25zdAotewotICAgIHVw
ZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKTsKLSAgICBpZiAoIXJlYWRvbmx5ICYmICFuYW1l
ZEF0dHJNYXApCi0gICAgICAgIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpOwotICAgIHJldHVybiBuYW1l
ZEF0dHJNYXAuZ2V0KCk7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEVsZW1lbnQ6Om5vZGVUeXBlKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gRUxFTUVOVF9OT0RFOwotfQotCi1jb25zdCBBdG9taWNTdHJp
bmdMaXN0KiBFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBjb25zdAotewotICAgIHJldHVybiAwOwot
fQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldElEQXR0cmlidXRlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFwLT5pZCgpIDogbnVsbEF0
b207Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZU5TKG5hbWUubmFtZXNwYWNl
VVJJKCksIG5hbWUubG9jYWxOYW1lKCkpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1l
bnQ6OmdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAg
IGlmIChuYW1lID09IHN0eWxlQXR0cikKLSAgICAgICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5l
ZWRlZCgpOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgaWYgKEF0dHJpYnV0ZSog
YSA9IG5hbWVkQXR0ck1hcC0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKSkKLSAgICAgICAgICAgIHJl
dHVybiBhLT52YWx1ZSgpOwotCi0gICAgcmV0dXJuIG51bGxBdG9tOwotfQotCi12b2lkIEVsZW1l
bnQ6OnNjcm9sbEludG9WaWV3KGJvb2wgYWxpZ25Ub1RvcCkgCi17Ci0gICAgSW50UmVjdCBib3Vu
ZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAg
IC8vIEFsaWduIHRvIHRoZSB0b3AgLyBib3R0b20gYW5kIHRvIHRoZSBjbG9zZXN0IGVkZ2UuCi0g
ICAgICAgIGlmIChhbGlnblRvVG9wKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5n
TGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxheWVyOjpnQWxpZ25U
b0VkZ2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnblRvcEFsd2F5cyk7Ci0gICAgICAgIGVs
c2UKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RU
b1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQsIFJlbmRl
ckxheWVyOjpnQWxpZ25Cb3R0b21BbHdheXMpOwotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50Ojpz
Y3JvbGxJbnRvVmlld0lmTmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQpCi17Ci0gICAgSW50UmVj
dCBib3VuZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0g
ICAgICAgIGlmIChjZW50ZXJJZk5lZWRlZCkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xv
c2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0Fs
aWduQ2VudGVySWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25DZW50ZXJJZk5lZWRlZCk7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNj
cm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVk
ZWQsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCk7Ci0gICAgfQotfQotCi1zdGF0
aWMgaW5saW5lIGJvb2wgaW5IVE1MRG9jdW1lbnQoY29uc3QgRWxlbWVudCogZSkKLXsKLSAgICBy
ZXR1cm4gZSAmJiBlLT5nZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpOwotfQotCi1jb25z
dCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUp
IGNvbnN0Ci17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8g
bmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKFF1YWxpZmllZE5h
bWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7Ci19Ci0KLWNvbnN0IEF0
b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3Bh
Y2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNw
YWNlVVJJLmltcGwoKSkpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBT
dHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewot
ICAgIGlmICghRG9jdW1lbnQ6OmlzVmFsaWROYW1lKG5hbWUpKSB7Ci0gICAgICAgIGVjID0gSU5W
QUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZyBs
b2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0g
ICAgc2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCks
IG51bGxBdG9tKSwgdmFsdWUuaW1wbCgpLCBlYyk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0
cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlLCBFeGNl
cHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1
bWVudCgpLT5pbmNET01UcmVlVmVyc2lvbigpOwotCi0gICAgLy8gYWxsb2NhdGUgYXR0cmlidXRl
bWFwIGlmIG5lY2Vzc2FyeQotICAgIEF0dHJpYnV0ZSogb2xkID0gYXR0cmlidXRlcyhmYWxzZSkt
PmdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dF
RF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKG5hbWVkQXR0
ck1hcC0+aXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9X
RURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gaWRBdHRy
KQotICAgICAgICB1cGRhdGVJZChvbGQgPyBvbGQtPnZhbHVlKCkgOiBudWxsQXRvbSwgdmFsdWUp
OwotICAgIAotICAgIGlmIChvbGQgJiYgIXZhbHVlKQotICAgICAgICBuYW1lZEF0dHJNYXAtPnJl
bW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICBlbHNlIGlmICghb2xkICYmIHZhbHVlKQotICAgICAg
ICBuYW1lZEF0dHJNYXAtPmFkZEF0dHJpYnV0ZShjcmVhdGVBdHRyaWJ1dGUobmFtZSwgdmFsdWUp
KTsKLSAgICBlbHNlIGlmIChvbGQgJiYgdmFsdWUpIHsKLSAgICAgICAgb2xkLT5zZXRWYWx1ZSh2
YWx1ZSk7Ci0gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQob2xkKTsKLSAgICB9Ci19Ci0KLUF0dHJp
YnV0ZSogRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUs
IFN0cmluZ0ltcGwqIHZhbHVlKQotewotICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG5hbWUsIHZh
bHVlKTsKLX0KLQotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGVNYXAoTmFtZWRBdHRyTWFwKiBs
aXN0KQotewotICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPmlu
Y0RPTVRyZWVWZXJzaW9uKCk7Ci0KLSAgICAvLyBJZiBzZXR0aW5nIHRoZSB3aG9sZSBtYXAgY2hh
bmdlcyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwgdXBkYXRlSWQuCi0KLSAgICBB
dHRyaWJ1dGUgKm9sZElkID0gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFwLT5nZXRBdHRyaWJ1
dGVJdGVtKGlkQXR0cikgOiAwOwotICAgIEF0dHJpYnV0ZSAqbmV3SWQgPSBsaXN0ID8gbGlzdC0+
Z2V0QXR0cmlidXRlSXRlbShpZEF0dHIpIDogMDsKLQotICAgIGlmIChvbGRJZCB8fCBuZXdJZCkK
LSAgICAgICAgdXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJ
ZCA/IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkK
LSAgICAgICAgbmFtZWRBdHRyTWFwLT5lbGVtZW50ID0gMDsKLQotICAgIG5hbWVkQXR0ck1hcCA9
IGxpc3Q7Ci0KLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+
ZWxlbWVudCA9IHRoaXM7Ci0gICAgICAgIHVuc2lnbmVkIGxlbiA9IG5hbWVkQXR0ck1hcC0+bGVu
Z3RoKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAg
ICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQobmFtZWRBdHRyTWFwLT5hdHRyc1tpXSk7Ci0gICAgICAg
IC8vIEZJWE1FOiBXaGF0IGFib3V0IGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGluIHRoZSBvbGQgbWFw
IHRoYXQgYXJlIG5vdCBpbiB0aGUgbmV3IG1hcD8KLSAgICB9Ci19Ci0KLWJvb2wgRWxlbWVudDo6
aGFzQXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRl
ZCgpOwotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgJiYgbmFtZWRBdHRyTWFwLT5sZW5ndGgoKSA+
IDA7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fdGFnTmFtZS50b1N0cmluZygpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldFByZWZpeChjb25z
dCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGNoZWNr
U2V0UHJlZml4KF9wcmVmaXgsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIG1fdGFnTmFtZS5zZXRQcmVmaXgoX3ByZWZpeCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6Y3Jl
YXRlQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICBuYW1lZEF0dHJNYXAgPSBuZXcgTmFtZWRB
dHRyTWFwKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KHRoaXMpKTsKLX0KLQotYm9vbCBFbGVtZW50Ojpp
c1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi1SZW5kZXJTdHlsZSAqRWxlbWVudDo6Y3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5k
ZXJPYmplY3QgKnBhcmVudFJlbmRlcmVyKQotewotICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5z
dHlsZVNlbGVjdG9yKCktPmNyZWF0ZVN0eWxlRm9yRWxlbWVudCh0aGlzKTsKLX0KLQotUmVuZGVy
T2JqZWN0ICpFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRl
clN0eWxlICpzdHlsZSkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50
KCkgPT0gdGhpcyAmJiBzdHlsZS0+ZGlzcGxheSgpID09IE5PTkUpIHsKLSAgICAgICAgLy8gSWdu
b3JlIGRpc3BsYXk6IG5vbmUgb24gcm9vdCBlbGVtZW50cy4gIEZvcmNlIGEgZGlzcGxheSBvZiBi
bG9jayBpbiB0aGF0IGNhc2UuCi0gICAgICAgIFJlbmRlckJsb2NrKiByZXN1bHQgPSBuZXcgKGFy
ZW5hKSBSZW5kZXJCbG9jayh0aGlzKTsKLSAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0LT5zZXRT
dHlsZShzdHlsZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBS
ZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci19Ci0KLQotdm9pZCBFbGVt
ZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgLy8gbmVlZCB0byBkbyBzdXBlcmNs
YXNzIHByb2Nlc3NpbmcgZmlyc3Qgc28gaW5Eb2N1bWVudCgpIGlzIHRydWUKLSAgICAvLyBieSB0
aGUgdGltZSB3ZSByZWFjaCB1cGRhdGVJZAotICAgIENvbnRhaW5lck5vZGU6Omluc2VydGVkSW50
b0RvY3VtZW50KCk7Ci0KLSAgICBpZiAoaGFzSUQoKSkgewotICAgICAgICBOYW1lZEF0dHJNYXAq
IGF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICAgICAgaWYgKGF0dHJzKSB7Ci0gICAgICAg
ICAgICBBdHRyaWJ1dGUqIGlkSXRlbSA9IGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7
Ci0gICAgICAgICAgICBpZiAoaWRJdGVtICYmICFpZEl0ZW0tPmlzTnVsbCgpKQotICAgICAgICAg
ICAgICAgIHVwZGF0ZUlkKG51bGxBdG9tLCBpZEl0ZW0tPnZhbHVlKCkpOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlm
IChoYXNJRCgpKSB7Ci0gICAgICAgIE5hbWVkQXR0ck1hcCogYXR0cnMgPSBhdHRyaWJ1dGVzKHRy
dWUpOwotICAgICAgICBpZiAoYXR0cnMpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSogaWRJdGVt
ID0gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLSAgICAgICAgICAgIGlmIChpZEl0
ZW0gJiYgIWlkSXRlbS0+aXNOdWxsKCkpCi0gICAgICAgICAgICAgICAgdXBkYXRlSWQoaWRJdGVt
LT52YWx1ZSgpLCBudWxsQXRvbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDb250YWluZXJO
b2RlOjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6YXR0YWNoKCkK
LXsKLSNpZiBTUEVFRF9ERUJVRyA8IDEKLSAgICBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCk7Ci0j
ZW5kaWYKLSAgICBDb250YWluZXJOb2RlOjphdHRhY2goKTsKLX0KLQotdm9pZCBFbGVtZW50Ojpy
ZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkKLXsKLSAgICAvLyAjIyMgc2hvdWxkIGdv
IGF3YXkgYW5kIGJlIGRvbmUgaW4gcmVuZGVyb2JqZWN0Ci0gICAgUmVuZGVyU3R5bGUqIF9zdHls
ZSA9IHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5zdHlsZSgpIDogMDsKLSAgICBib29sIGhhc1Bh
cmVudFJlbmRlcmVyID0gcGFyZW50KCkgPyBwYXJlbnQoKS0+cmVuZGVyZXIoKSA6IGZhbHNlOwot
ICAgIAotICAgIGlmICggaGFzUGFyZW50UmVuZGVyZXIgJiYgKGNoYW5nZSA+PSBJbmhlcml0IHx8
IGNoYW5nZWQoKSkgKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlICpuZXdTdHlsZSA9IGdldERvY3Vt
ZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Y3JlYXRlU3R5bGVGb3JFbGVtZW50KHRoaXMpOwotICAg
ICAgICBTdHlsZUNoYW5nZSBjaCA9IGRpZmYoIF9zdHlsZSwgbmV3U3R5bGUgKTsKLSAgICAgICAg
aWYgKGNoID09IERldGFjaCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkKCkpIGRldGFjaCgp
OwotICAgICAgICAgICAgLy8gIyMjIFN1Ym9wdGltYWwuIFN0eWxlIGdldHMgY2FsY3VsYXRlZCBh
Z2Fpbi4KLSAgICAgICAgICAgIGF0dGFjaCgpOwotICAgICAgICAgICAgLy8gYXR0YWNoIHJlY2Fs
dWxhdGVzIHRoZSBzdHlsZSBmb3IgYWxsIGNoaWxkcmVuLiBObyBuZWVkIHRvIGRvIGl0IHR3aWNl
LgotICAgICAgICAgICAgc2V0Q2hhbmdlZCggZmFsc2UgKTsKLSAgICAgICAgICAgIHNldEhhc0No
YW5nZWRDaGlsZCggZmFsc2UgKTsKLSAgICAgICAgICAgIG5ld1N0eWxlLT5kZXJlZihnZXREb2N1
bWVudCgpLT5yZW5kZXJBcmVuYSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgICAgICBlbHNlIGlmIChjaCAhPSBOb0NoYW5nZSkgewotICAgICAgICAgICAgaWYgKHJlbmRl
cmVyKCkgJiYgbmV3U3R5bGUpCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0U3R5bGUo
bmV3U3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoYW5nZWQoKSAmJiByZW5k
ZXJlcigpICYmIG5ld1N0eWxlICYmIChnZXREb2N1bWVudCgpLT51c2VzU2libGluZ1J1bGVzKCkg
fHwgZ2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygpKSkgewotICAgICAgICAgICAg
Ly8gQWx0aG91Z2ggbm8gY2hhbmdlIG9jY3VycmVkLCB3ZSB1c2UgdGhlIG5ldyBzdHlsZSBzbyB0
aGF0IHRoZSBjb3VzaW4gc3R5bGUgc2hhcmluZyBjb2RlIHdvbid0IGdldAotICAgICAgICAgICAg
Ly8gZm9vbGVkIGludG8gYmVsaWV2aW5nIHRoaXMgc3R5bGUgaXMgdGhlIHNhbWUuICBUaGlzIGlz
IG9ubHkgbmVjZXNzYXJ5IGlmIHRoZSBkb2N1bWVudCBhY3R1YWxseSB1c2VzCi0gICAgICAgICAg
ICAvLyBzaWJsaW5nL2Rlc2NlbmRhbnQgcnVsZXMsIHNpbmNlIG90aGVyd2lzZSBpdCBpc24ndCBw
b3NzaWJsZSBmb3IgYW5jZXN0b3Igc3R5bGVzIHRvIGFmZmVjdCBzaGFyaW5nIG9mCi0gICAgICAg
ICAgICAvLyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldFN0eWxlSW50
ZXJuYWwobmV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3U3R5bGUtPmRlcmVmKGdl
dERvY3VtZW50KCktPnJlbmRlckFyZW5hKCkpOwotCi0gICAgICAgIGlmICggY2hhbmdlICE9IEZv
cmNlKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxl
cygpKQotICAgICAgICAgICAgICAgIGNoYW5nZSA9IEZvcmNlOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIGNoYW5nZSA9IGNoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9y
IChOb2RlICpuID0gZmFzdEZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsK
LSAgICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IG4tPmlzVGV4dE5vZGUoKSB8fCBuLT5o
YXNDaGFuZ2VkQ2hpbGQoKSB8fCBuLT5jaGFuZ2VkKCkpCi0gICAgICAgICAgICBuLT5yZWNhbGNT
dHlsZShjaGFuZ2UpOwotICAgIH0KLQotICAgIHNldENoYW5nZWQoIGZhbHNlICk7Ci0gICAgc2V0
SGFzQ2hhbmdlZENoaWxkKCBmYWxzZSApOwotfQotCi1ib29sIEVsZW1lbnQ6OmNoaWxkVHlwZUFs
bG93ZWQoTm9kZVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2Fz
ZSBFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgVEVYVF9OT0RFOgotICAgICAgICBjYXNlIENP
TU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0g
ICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBjYXNlIEVOVElUWV9SRUZF
UkVOQ0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQot
Ci12b2lkIEVsZW1lbnQ6OmRpc3BhdGNoQXR0clJlbW92YWxFdmVudChBdHRyaWJ1dGUqKQotewot
ICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSNpZiAwCi0gICAgaWYgKCFn
ZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnQ6OkRPTUFUVFJNT0RJRklFRF9M
SVNURU5FUikpCi0gICAgICAgIHJldHVybjsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAg
ICBkaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50KERPTUF0dHJNb2RpZmllZEV2ZW50LCB0
cnVlLCBmYWxzZSwgYXR0ciwgYXR0ci0+dmFsdWUoKSwKLSAgICAgICAgYXR0ci0+dmFsdWUoKSwg
Z2V0RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0aW9uRXZlbnQ6OlJFTU9W
QUwpLCBlYyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBFbGVtZW50OjpkaXNwYXRjaEF0dHJBZGRpdGlv
bkV2ZW50KEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3Ji
aWRkZW4oKSk7Ci0jaWYgMAotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBl
KERvY3VtZW50OjpET01BVFRSTU9ESUZJRURfTElTVEVORVIpKQotICAgICAgICByZXR1cm47Ci0g
ICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25F
dmVudChET01BdHRyTW9kaWZpZWRFdmVudCwgdHJ1ZSwgZmFsc2UsIGF0dHIsIGF0dHItPnZhbHVl
KCksCi0gICAgICAgIGF0dHItPnZhbHVlKCksZ2V0RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+
aWQoKSksIE11dGF0aW9uRXZlbnQ6OkFERElUSU9OKSwgZWMpOwotI2VuZGlmCi19Ci0KLVN0cmlu
ZyBFbGVtZW50OjpvcGVuVGFnU3RhcnRUb1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJl
c3VsdCA9ICI8IiArIG5vZGVOYW1lKCk7Ci0KLSAgICBOYW1lZEF0dHJNYXAgKmF0dHJNYXAgPSBh
dHRyaWJ1dGVzKHRydWUpOwotCi0gICAgaWYgKGF0dHJNYXApIHsKLSAgICAgICAgdW5zaWduZWQg
bnVtQXR0cnMgPSBhdHRyTWFwLT5sZW5ndGgoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG51bUF0dHJzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAiICI7Ci0KLSAg
ICAgICAgICAgIEF0dHJpYnV0ZSAqYXR0cmlidXRlID0gYXR0ck1hcC0+YXR0cmlidXRlSXRlbShp
KTsKLSAgICAgICAgICAgIHJlc3VsdCArPSBhdHRyaWJ1dGUtPm5hbWUoKS50b1N0cmluZygpOwot
ICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUtPnZhbHVlKCkuaXNOdWxsKCkpIHsKLSAgICAgICAg
ICAgICAgICByZXN1bHQgKz0gIj1cIiI7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHN1YnN0
aXR1dGUgZW50aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMgb2YgIiBvciAnCi0gICAgICAgICAgICAg
ICAgcmVzdWx0ICs9IGF0dHJpYnV0ZS0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQg
Kz0gIlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBy
ZXN1bHQ7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojp0b1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3Ry
aW5nIHJlc3VsdCA9IG9wZW5UYWdTdGFydFRvU3RyaW5nKCk7Ci0KLSAgICBpZiAoaGFzQ2hpbGRO
b2RlcygpKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPiI7Ci0KLSAgICAgICAgZm9yIChOb2RlICpj
aGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNp
YmxpbmcoKSkgewotICAgICAgICAgICAgcmVzdWx0ICs9IGNoaWxkLT50b1N0cmluZygpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ICs9ICI8LyI7Ci0gICAgICAgIHJlc3VsdCArPSBub2Rl
TmFtZSgpOwotICAgICAgICByZXN1bHQgKz0gIj4iOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJl
c3VsdCArPSAiIC8+IjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVs
ZW1lbnQ6OnVwZGF0ZUlkKGNvbnN0IEF0b21pY1N0cmluZyYgb2xkSWQsIGNvbnN0IEF0b21pY1N0
cmluZyYgbmV3SWQpCi17Ci0gICAgaWYgKCFpbkRvY3VtZW50KCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGlmIChvbGRJZCA9PSBuZXdJZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1l
bnQqIGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFvbGRJZC5pc0VtcHR5KCkpCi0gICAg
ICAgIGRvYy0+cmVtb3ZlRWxlbWVudEJ5SWQob2xkSWQsIHRoaXMpOwotICAgIGlmICghbmV3SWQu
aXNFbXB0eSgpKQotICAgICAgICBkb2MtPmFkZEVsZW1lbnRCeUlkKG5ld0lkLCB0aGlzKTsKLX0K
LQotI2lmbmRlZiBOREVCVUcKLXZvaWQgRWxlbWVudDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFt
LCBEZXByZWNhdGVkU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICB1cGRhdGVTdHlsZUF0dHJpYnV0
ZUlmTmVlZGVkKCk7Ci0gICAgaWYgKG5hbWVkQXR0ck1hcCkgewotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbmFtZWRBdHRyTWFwLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAg
ICBBdHRyaWJ1dGUgKmF0dHIgPSBuYW1lZEF0dHJNYXAtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAg
ICAgICAgICAqc3RyZWFtIDw8ICIgIiA8PCBhdHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuZGVwcmVj
YXRlZFN0cmluZygpLmFzY2lpKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIj1cIiIgPDwgYXR0
ci0+dmFsdWUoKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSA8PCAiXCIiOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgQ29udGFpbmVyTm9kZTo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNlbmRp
ZgotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBFbGVtZW50Ojpmb3JtYXRGb3JEZWJ1Z2dlcihjaGFy
ICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0Owot
ICAgIFN0cmluZyBzOwotICAgIAotICAgIHMgPSBub2RlTmFtZSgpOwotICAgIGlmIChzLmxlbmd0
aCgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gczsKLSAgICB9Ci0gICAgICAgICAgCi0gICAg
cyA9IGdldEF0dHJpYnV0ZShpZEF0dHIpOwotICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAg
ICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiOyAi
OwotICAgICAgICByZXN1bHQgKz0gImlkPSI7Ci0gICAgICAgIHJlc3VsdCArPSBzOwotICAgIH0K
LSAgICAgICAgICAKLSAgICBzID0gZ2V0QXR0cmlidXRlKGNsYXNzQXR0cik7Ci0gICAgaWYgKHMu
bGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKQotICAgICAg
ICAgICAgcmVzdWx0ICs9ICI7ICI7Ci0gICAgICAgIHJlc3VsdCArPSAiY2xhc3M9IjsKLSAgICAg
ICAgcmVzdWx0ICs9IHM7Ci0gICAgfQotICAgICAgICAgIAotICAgIHN0cm5jcHkoYnVmZmVyLCBy
ZXN1bHQuZGVwcmVjYXRlZFN0cmluZygpLmxhdGluMSgpLCBsZW5ndGggLSAxKTsKLX0KLSNlbmRp
ZgotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OnNldEF0dHJpYnV0ZU5vZGUoQXR0ciAqYXR0
ciwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgQVNTRVJUKGF0dHIpOwotICAgIHJldHVybiBz
dGF0aWNfcG9pbnRlcl9jYXN0PEF0dHI+KGF0dHJpYnV0ZXMoZmFsc2UpLT5zZXROYW1lZEl0ZW0o
YXR0ciwgZWMpKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1
dGVOb2RlKEF0dHIgKmF0dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghYXR0ciB8
fCBhdHRyLT5vd25lckVsZW1lbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5E
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChnZXREb2N1bWVudCgpICE9
IGF0dHItPmdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7
Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBh
dHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMtPnJlbW92ZU5hbWVkSXRl
bShhdHRyLT5xdWFsaWZpZWROYW1lKCksIGVjKSk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0
cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlm
aWVkTmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAg
U3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlmICghRG9jdW1lbnQ6OnBhcnNlUXVhbGlm
aWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSkpIHsKLSAgICAgICAgZWMg
PSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0
QXR0cmlidXRlKFF1YWxpZmllZE5hbWUocHJlZml4LmltcGwoKSwgbG9jYWxOYW1lLmltcGwoKSwg
bmFtZXNwYWNlVVJJLmltcGwoKSksIHZhbHVlLmltcGwoKSwgZWMpOwotfQotCi12b2lkIEVsZW1l
bnQ6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVj
KQotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUu
bG93ZXIoKSA6IG5hbWU7Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0
b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6
OnJlbW92ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJp
bmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgcmVtb3ZlQXR0cmlidXRl
KFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5p
bXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6Z2V0QXR0cmlidXRl
Tm9kZShjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0
dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
U3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDog
bmFtZTsKLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRyPihhdHRycy0+Z2V0TmFt
ZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9t
KSkpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OmdldEF0dHJpYnV0ZU5vZGVOUyhj
b25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpCi17Ci0g
ICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRy
cykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0
cj4oYXR0cnMtPmdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUu
aW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSkpOwotfQotCi1ib29sIEVsZW1lbnQ6Omhhc0F0
dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAgTmFtZWRBdHRyTWFwICph
dHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5h
bWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKFF1
YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7Ci19Ci0K
LWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkks
IGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIE5hbWVkQXR0ck1hcCAqYXR0
cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICByZXR1cm4gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oUXVhbGlmaWVkTmFtZShu
dWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1D
U1NTdHlsZURlY2xhcmF0aW9uICpFbGVtZW50OjpzdHlsZSgpCi17Ci0gICAgcmV0dXJuIDA7Ci19
Ci0KLXZvaWQgRWxlbWVudDo6Zm9jdXMoKQotewotICAgIERvY3VtZW50KiBkb2MgPSBnZXREb2N1
bWVudCgpOwotICAgIGRvYy0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkp
IHsKLSAgICAgICAgZG9jLT5zZXRGb2N1c05vZGUodGhpcyk7Ci0gICAgICAgIGlmIChyb290RWRp
dGFibGVFbGVtZW50KCkgPT0gdGhpcykgewotICAgICAgICAgICAgLy8gRklYTUU6IHdlIHNob3Vs
ZCByZXN0b3JlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgdGhlcmUgaXMgb25lLCBpbnN0ZWFk
IG9mIGFsd2F5cyBzZWxlY3RpbmcgYWxsLgotICAgICAgICAgICAgaWYgKGRvYy0+ZnJhbWUoKS0+
c2VsZWN0Q29udGVudHNPZk5vZGUodGhpcykpCi0gICAgICAgICAgICAgICAgZG9jLT5mcmFtZSgp
LT5yZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlcigpICYmICFy
ZW5kZXJlcigpLT5pc1dpZGdldCgpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5n
TGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShnZXRSZWN0KCkpOwotICAgIH0KLX0KLQotdm9p
ZCBFbGVtZW50OjpibHVyKCkKLXsKLSAgICBEb2N1bWVudCogZG9jID0gZ2V0RG9jdW1lbnQoKTsK
LSAgICBpZiAoZG9jLT5mb2N1c05vZGUoKSA9PSB0aGlzKQotICAgICAgICBkb2MtPnNldEZvY3Vz
Tm9kZSgwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OYW1lZEF0dHJNYXA6Ok5hbWVk
QXR0ck1hcChFbGVtZW50ICplKQotICAgIDogZWxlbWVudChlKQotICAgICwgYXR0cnMoMCkKLSAg
ICAsIGxlbigwKQotewotfQotCi1OYW1lZEF0dHJNYXA6On5OYW1lZEF0dHJNYXAoKQotewotICAg
IE5hbWVkQXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCk7IC8vIHZpcnR1YWwgbWV0aG9kLCBzbyBx
dWFsaWZ5IGp1c3QgdG8gYmUgZXhwbGljaXQKLX0KLQotYm9vbCBOYW1lZEF0dHJNYXA6OmlzTWFw
cGVkQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVBhc3NS
ZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1l
KSBjb25zdAotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudChlbGVtZW50
KSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGdldE5hbWVkSXRlbShRdWFsaWZp
ZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRvbSkpOwotfQotCi1QYXNz
UmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6Z2V0TmFtZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBu
YW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIHJldHVy
biBnZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwg
bmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1h
cDo6cmVtb3ZlTmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMp
Ci17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KGVsZW1lbnQpID8gbmFt
ZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5h
bWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQotCi1QYXNz
UmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVtTlMoY29uc3QgU3RyaW5n
JiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJiBl
YykKLXsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20s
IGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NS
ZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFt
ZSYgbmFtZSkgY29uc3QKLXsKLSAgICBBdHRyaWJ1dGUqIGEgPSBnZXRBdHRyaWJ1dGVJdGVtKG5h
bWUpOwotICAgIGlmICghYSkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gYS0+Y3JlYXRlQXR0cklm
TmVlZGVkKGVsZW1lbnQpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6c2V0
TmFtZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFlbGVt
ZW50KSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhp
cyBtYXAgaXMgcmVhZG9ubHkuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9
IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
Ci0gICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgYXJnIHdhcyBjcmVhdGVkIGZy
b20gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGlzIG1h
cC4KLSAgICBpZiAoYXJnLT5nZXREb2N1bWVudCgpICE9IGVsZW1lbnQtPmdldERvY3VtZW50KCkp
IHsKLSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLQotICAgIC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhyb3cgYSBISUVSQVJDSFlf
UkVRVUVTVF9FUlJPUiBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBub24tYXR0cmlidXRlIG5vZGUK
LSAgICBpZiAoIWFyZy0+aXNBdHRyaWJ1dGVOb2RlKCkpIHsKLSAgICAgICAgZWMgPSBISUVSQVJD
SFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBBdHRyICphdHRy
ID0gc3RhdGljX2Nhc3Q8QXR0cio+KGFyZyk7Ci0KLSAgICBBdHRyaWJ1dGUqIGEgPSBhdHRyLT5h
dHRyKCk7Ci0gICAgQXR0cmlidXRlKiBvbGQgPSBnZXRBdHRyaWJ1dGVJdGVtKGEtPm5hbWUoKSk7
Ci0gICAgaWYgKG9sZCA9PSBhKQotICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGU+KGFyZyk7IC8v
IHdlIGtub3cgYWJvdXQgaXQgYWxyZWFkeQotCi0gICAgLy8gSU5VU0VfQVRUUklCVVRFX0VSUjog
UmFpc2VkIGlmIGFyZyBpcyBhbiBBdHRyIHRoYXQgaXMgYWxyZWFkeSBhbiBhdHRyaWJ1dGUgb2Yg
YW5vdGhlciBFbGVtZW50IG9iamVjdC4KLSAgICAvLyBUaGUgRE9NIHVzZXIgbXVzdCBleHBsaWNp
dGx5IGNsb25lIEF0dHIgbm9kZXMgdG8gcmUtdXNlIHRoZW0gaW4gb3RoZXIgZWxlbWVudHMuCi0g
ICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKSB7Ci0gICAgICAgIGVjID0gSU5VU0VfQVRUUklC
VVRFX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGEtPm5hbWUoKSA9
PSBpZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlkKG9sZCA/IG9sZC0+dmFsdWUoKSA6
IG51bGxBdG9tLCBhLT52YWx1ZSgpKTsKLQotICAgIC8vICMjIyBzbGlnaHRseSBpbmVmZmljaWVu
dCAtIHJlc2l6ZXMgYXR0cmlidXRlIGFycmF5IHR3aWNlLgotICAgIFJlZlB0cjxOb2RlPiByOwot
ICAgIGlmIChvbGQpIHsKLSAgICAgICAgciA9IG9sZC0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1l
bnQpOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUoYS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICBh
ZGRBdHRyaWJ1dGUoYSk7Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwotfQotCi0vLyBUaGUgRE9N
MiBzcGVjIGRvZXNuJ3Qgc2F5IHRoYXQgcmVtb3ZlQXR0cmlidXRlW05TXSB0aHJvd3MgTk9UX0ZP
VU5EX0VSUgotLy8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIGJ1dCBhdCB0aGlzIGxl
dmVsIHdlIGhhdmUgdG8gdGhyb3cgTk9UX0ZPVU5EX0VSUgotLy8gYmVjYXVzZSBvZiByZW1vdmVO
YW1lZEl0ZW0sIHJlbW92ZU5hbWVkSXRlbU5TLCBhbmQgcmVtb3ZlQXR0cmlidXRlTm9kZS4KLVBh
c3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpyZW1vdmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlm
aWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8gIyMjIHNob3VsZCB0
aGlzIHJlYWxseSBiZSByYWlzZWQgd2hlbiB0aGUgYXR0cmlidXRlIHRvIHJlbW92ZSBpc24ndCB0
aGVyZSBhdCBhbGw/Ci0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQg
d2hlbiB0aGUgbm9kZSBpcyByZWFkb25seQotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAg
ICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLQotICAgIEF0dHJpYnV0ZSogYSA9IGdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0gICAg
aWYgKCFhKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgfQotCi0gICAgUmVmUHRyPE5vZGU+IHIgPSBhLT5jcmVhdGVBdHRySWZOZWVkZWQoZWxl
bWVudCk7Ci0KLSAgICBpZiAobmFtZSA9PSBpZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0
ZUlkKGEtPnZhbHVlKCksIG51bGxBdG9tKTsKLQotICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsK
LSAgICByZXR1cm4gci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRy
TWFwOjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdAotewotICAgIGlmIChpbmRleCA+PSBs
ZW4pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGF0dHJzW2luZGV4XS0+Y3JlYXRl
QXR0cklmTmVlZGVkKGVsZW1lbnQpOwotfQotCi1BdHRyaWJ1dGUqIE5hbWVkQXR0ck1hcDo6Z2V0
QXR0cmlidXRlSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgICBpZiAoYXR0cnNbaV0t
Pm5hbWUoKS5tYXRjaGVzKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGF0dHJzW2ldOwotICAg
IH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOYW1lZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRl
cygpCi17Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGF0dHJzW2ldLT5tX2ltcGwpCi0gICAgICAg
ICAgICAgICAgYXR0cnNbaV0tPm1faW1wbC0+bV9lbGVtZW50ID0gMDsKLSAgICAgICAgICAgIGF0
dHJzW2ldLT5kZXJlZigpOwotICAgICAgICB9Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAg
ICAgICAgYXR0cnMgPSAwOwotICAgIH0KLSAgICBsZW4gPSAwOwotfQotCi12b2lkIE5hbWVkQXR0
ck1hcDo6ZGV0YWNoRnJvbUVsZW1lbnQoKQotewotICAgIC8vIHdlIGFsbG93IGEgTmFtZWRBdHRy
TWFwIHcvbyBhbiBlbGVtZW50IGluIGNhc2Ugc29tZW9uZSBzdGlsbCBoYXMgYSByZWZlcmVuY2UK
LSAgICAvLyB0byBpZiBhZnRlciB0aGUgZWxlbWVudCBnZXRzIGRlbGV0ZWQgLSBidXQgdGhlIG1h
cCBpcyBub3cgaW52YWxpZAotICAgIGVsZW1lbnQgPSAwOwotICAgIGNsZWFyQXR0cmlidXRlcygp
OwotfQotCi1OYW1lZEF0dHJNYXAmIE5hbWVkQXR0ck1hcDo6b3BlcmF0b3I9KGNvbnN0IE5hbWVk
QXR0ck1hcCYgb3RoZXIpCi17Ci0gICAgLy8gY2xvbmUgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIG90
aGVyIG1hcCwgYnV0IGF0dGFjaCB0byBvdXIgZWxlbWVudAotICAgIGlmICghZWxlbWVudCkKLSAg
ICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgLy8gSWYgYXNzaWduaW5nIHRoZSBtYXAgY2hhbmdl
cyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwKLSAgICAvLyB1cGRhdGVJZC4KLQot
ICAgIEF0dHJpYnV0ZSAqb2xkSWQgPSBnZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0gICAgQXR0
cmlidXRlICpuZXdJZCA9IG90aGVyLmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLQotICAgIGlm
IChvbGRJZCB8fCBuZXdJZCkKLSAgICAgICAgZWxlbWVudC0+dXBkYXRlSWQob2xkSWQgPyBvbGRJ
ZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20p
OwotCi0gICAgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgbGVuID0gb3RoZXIubGVuOwotICAgIGF0
dHJzID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKGxlbiAqIHNpemVvZihB
dHRyaWJ1dGUgKikpKTsKLQotICAgIC8vIGZpcnN0IGluaXRpYWxpemUgYXR0cnMgdmVjdG9yLCB0
aGVuIGNhbGwgYXR0cmlidXRlQ2hhbmdlZCBvbiBpdAotICAgIC8vIHRoaXMgYWxsb3dzIGF0dHJp
YnV0ZUNoYW5nZWQgdG8gdXNlIGdldEF0dHJpYnV0ZQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBsZW47IGkrKykgewotICAgICAgICBhdHRyc1tpXSA9IG90aGVyLmF0dHJzW2ldLT5jbG9u
ZSgpOwotICAgICAgICBhdHRyc1tpXS0+cmVmKCk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRo
aXMgaXMgd2FzdGVmdWwuICBUaGUgY2xhc3MgbGlzdCBjb3VsZCBiZSBwcmVzZXJ2ZWQgb24gYSBj
b3B5LCBhbmQgd2UKLSAgICAvLyB3b3VsZG4ndCBoYXZlIHRvIHdhc3RlIHRpbWUgcmVwYXJzaW5n
IHRoZSBhdHRyaWJ1dGUuCi0gICAgLy8gVGhlIGRlcml2ZWQgY2xhc3MsIEhUTUxOYW1lZEF0dHJN
YXAsIHdoaWNoIG1hbmFnZXMgYSBwYXJzZWQgY2xhc3MgbGlzdCBmb3IgdGhlIENMQVNTIGF0dHJp
YnV0ZSwKLSAgICAvLyB3aWxsIHVwZGF0ZSBpdHMgbWVtYmVyIHZhcmlhYmxlIHdoZW4gcGFyc2Ug
YXR0cmlidXRlIGlzIGNhbGxlZC4KLSAgICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkr
KykKLSAgICAgICAgZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChhdHRyc1tpXSwgdHJ1ZSk7Ci0K
LSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjphZGRBdHRyaWJ1dGUo
QXR0cmlidXRlICphdHRyaWJ1dGUpCi17Ci0gICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhl
IGxpc3QKLSAgICBBdHRyaWJ1dGUgKipuZXdBdHRycyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZSAq
Kj4oZmFzdE1hbGxvYygobGVuICsgMSkgKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0gICAgaWYg
KGF0dHJzKSB7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAg
ICAgIG5ld0F0dHJzW2ldID0gYXR0cnNbaV07Ci0gICAgICBmYXN0RnJlZShhdHRycyk7Ci0gICAg
fQotICAgIGF0dHJzID0gbmV3QXR0cnM7Ci0gICAgYXR0cnNbbGVuKytdID0gYXR0cmlidXRlOwot
ICAgIGF0dHJpYnV0ZS0+cmVmKCk7Ci0KLSAgICBBdHRyICogY29uc3QgYXR0ciA9IGF0dHJpYnV0
ZS0+bV9pbXBsOwotICAgIGlmIChhdHRyKQotICAgICAgICBhdHRyLT5tX2VsZW1lbnQgPSBlbGVt
ZW50OwotCi0gICAgLy8gTm90aWZ5IHRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSBoYXMg
YmVlbiBhZGRlZCwgYW5kIGRpc3BhdGNoIGFwcHJvcHJpYXRlIG11dGF0aW9uIGV2ZW50cwotICAg
IC8vIE5vdGUgdGhhdCBlbGVtZW50IG1heSBiZSBudWxsIGhlcmUgaWYgd2UgYXJlIGNhbGxlZCBm
cm9tIGluc2VydEF0dHIoKSBkdXJpbmcgcGFyc2luZwotICAgIGlmIChlbGVtZW50KSB7Ci0gICAg
ICAgIFJlZlB0cjxBdHRyaWJ1dGU+IGEgPSBhdHRyaWJ1dGU7Ci0gICAgICAgIGVsZW1lbnQtPmF0
dHJpYnV0ZUNoYW5nZWQoYS5nZXQoKSk7Ci0gICAgICAgIC8vIEJlY2F1c2Ugb2Ygb3VyIHVwZGF0
ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBzdHlsZSBtb2RpZmljYXRpb24gZXZlbnRzIGFyZSBu
ZXZlciBzZW50IGF0IHRoZSByaWdodCB0aW1lLCBzbyBkb24ndCBib3RoZXIgc2VuZGluZyB0aGVt
LgotICAgICAgICBpZiAoYS0+bmFtZSgpICE9IHN0eWxlQXR0cikgewotICAgICAgICAgICAgZWxl
bWVudC0+ZGlzcGF0Y2hBdHRyQWRkaXRpb25FdmVudChhLmdldCgpKTsKLSAgICAgICAgICAgIGVs
ZW1lbnQtPmRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoZmFsc2UpOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIG5hbWUpCi17Ci0gICAgdW5zaWduZWQgaW5kZXggPSBsZW4rMTsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgIGlmIChhdHRyc1tpXS0+bmFt
ZSgpLm1hdGNoZXMobmFtZSkpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm47Ci0KLSAg
ICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0Ci0gICAgQXR0cmlidXRlKiBh
dHRyID0gYXR0cnNbaW5kZXhdOwotICAgIGlmIChhdHRyc1tpbmRleF0tPm1faW1wbCkKLSAgICAg
ICAgYXR0cnNbaW5kZXhdLT5tX2ltcGwtPm1fZWxlbWVudCA9IDA7Ci0gICAgaWYgKGxlbiA9PSAx
KSB7Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSAwOwotICAgICAg
ICBsZW4gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEF0dHJpYnV0ZSAqKm5ld0F0dHJzID0g
c3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKChsZW4gLSAxKSAqIHNpemVvZihB
dHRyaWJ1dGUgKikpKTsKLSAgICAgICAgdW5zaWduZWQgaTsKLSAgICAgICAgZm9yIChpID0gMDsg
aSA8IHVuc2lnbmVkKGluZGV4KTsgaSsrKQotICAgICAgICAgICAgbmV3QXR0cnNbaV0gPSBhdHRy
c1tpXTsKLSAgICAgICAgbGVuLS07Ci0gICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspCi0gICAg
ICAgICAgICBuZXdBdHRyc1tpXSA9IGF0dHJzW2krMV07Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJz
KTsKLSAgICAgICAgYXR0cnMgPSBuZXdBdHRyczsKLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhl
IGVsZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAvLyBkaXNw
YXRjaCBhcHByb3ByaWF0ZSBtdXRhdGlvbiBldmVudHMKLSAgICBpZiAoZWxlbWVudCAmJiAhYXR0
ci0+bV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICBBdG9taWNTdHJpbmcgdmFsdWUgPSBhdHRy
LT5tX3ZhbHVlOwotICAgICAgICBhdHRyLT5tX3ZhbHVlID0gbnVsbEF0b207Ci0gICAgICAgIGVs
ZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQoYXR0cik7Ci0gICAgICAgIGF0dHItPm1fdmFsdWUgPSB2
YWx1ZTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0
Y2hBdHRyUmVtb3ZhbEV2ZW50KGF0dHIpOwotICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFN1YnRy
ZWVNb2RpZmllZEV2ZW50KGZhbHNlKTsKLSAgICB9Ci0gICAgYXR0ci0+ZGVyZWYoKTsKLX0KLQot
Ym9vbCBOYW1lZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkQXR0ck1hcCogb3Ro
ZXJNYXApIGNvbnN0Ci17Ci0gICAgaWYgKCFvdGhlck1hcCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIAotICAgIGlmIChsZW5ndGgoKSAhPSBvdGhlck1hcC0+bGVuZ3RoKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3Ro
KCk7IGkrKykgewotICAgICAgICBBdHRyaWJ1dGUgKmF0dHIgPSBhdHRyaWJ1dGVJdGVtKGkpOwot
ICAgICAgICBBdHRyaWJ1dGUgKm90aGVyQXR0ciA9IG90aGVyTWFwLT5nZXRBdHRyaWJ1dGVJdGVt
KGF0dHItPm5hbWUoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKCFvdGhlckF0dHIgfHwg
YXR0ci0+dmFsdWUoKSAhPSBvdGhlckF0dHItPnZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0eWxlZCBFbGVtZW50IGFuZCBNYXBwZWQgQXR0cmlidXRl
IEltcGxlbWVudGF0aW9uCi0KLUNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uOjp+Q1NTTWFw
cGVkQXR0cmlidXRlRGVjbGFyYXRpb24oKQotewotICAgIGlmIChtX2VudHJ5VHlwZSAhPSBlUGVy
c2lzdGVudCkKLSAgICAgICAgU3R5bGVkRWxlbWVudDo6cmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVj
bChtX2VudHJ5VHlwZSwgbV9hdHRyTmFtZSwgbV9hdHRyVmFsdWUpOwotfQotCi1DU1NNYXBwZWRB
dHRyaWJ1dGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6Z2V0TWFwcGVkQXR0cmlidXRlRGVj
bChNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUsIEF0dHJpYnV0ZSogYXR0cikKLXsKLSAg
ICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1
cm4gbWFwcGVkQXR0cmlidXRlRGVjbHMtPmdldChNYXBwZWRBdHRyaWJ1dGVLZXkoZW50cnlUeXBl
LCBhdHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuaW1wbCgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSkp
OwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OnNldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVk
QXR0cmlidXRlRW50cnkgZW50cnlUeXBlLCBBdHRyaWJ1dGUqIGF0dHIsIENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKiBkZWNsKQotewotICAgIGlmICghbWFwcGVkQXR0cmlidXRlRGVjbHMp
Ci0gICAgICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzID0gbmV3IE1hcHBlZEF0dHJpYnV0ZURlY2xz
OwotICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzLT5zZXQoTWFwcGVkQXR0cmlidXRlS2V5KGVudHJ5
VHlwZSwgYXR0ci0+bmFtZSgpLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0ci0+dmFsdWUoKS5pbXBs
KCkpLCBkZWNsKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpyZW1vdmVNYXBwZWRBdHRyaWJ1
dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5VHlwZSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0clZhbHVlKQotewotICAgIGlmICghbWFwcGVk
QXR0cmlidXRlRGVjbHMpCi0gICAgICAgIHJldHVybjsKLSAgICBtYXBwZWRBdHRyaWJ1dGVEZWNs
cy0+cmVtb3ZlKE1hcHBlZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0dHJOYW1lLmxvY2FsTmFt
ZSgpLmltcGwoKSwgYXR0clZhbHVlLmltcGwoKSkpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6
OmludmFsaWRhdGVTdHlsZUF0dHJpYnV0ZSgpCi17Ci0gICAgbV9pc1N0eWxlQXR0cmlidXRlVmFs
aWQgPSBmYWxzZTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50Ojp1cGRhdGVTdHlsZUF0dHJpYnV0
ZUlmTmVlZGVkKCkgY29uc3QKLXsKLSAgICBpZiAoIW1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkKSB7
Ci0gICAgICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgbV9zeW5j
aHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUgPSB0cnVlOwotICAgICAgICBpZiAobV9pbmxpbmVTdHls
ZURlY2wpCi0gICAgICAgICAgICBjb25zdF9jYXN0PFN0eWxlZEVsZW1lbnQqPih0aGlzKS0+c2V0
QXR0cmlidXRlKHN0eWxlQXR0ciwgbV9pbmxpbmVTdHlsZURlY2wtPmNzc1RleHQoKSk7Ci0gICAg
ICAgIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgfQotfQotCi1B
dHRyaWJ1dGUqIE1hcHBlZEF0dHJpYnV0ZTo6Y2xvbmUoYm9vbCBwcmVzZXJ2ZURlY2wpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG5ldyBNYXBwZWRBdHRyaWJ1dGUobmFtZSgpLCB2YWx1ZSgpLCBwcmVz
ZXJ2ZURlY2wgPyBtX3N0eWxlRGVjbC5nZXQoKSA6IDApOwotfQotCi1OYW1lZE1hcHBlZEF0dHJN
YXA6Ok5hbWVkTWFwcGVkQXR0ck1hcChFbGVtZW50ICplKQotOk5hbWVkQXR0ck1hcChlKSwgbV9t
YXBwZWRBdHRyaWJ1dGVDb3VudCgwKQote30KLQotdm9pZCBOYW1lZE1hcHBlZEF0dHJNYXA6OmNs
ZWFyQXR0cmlidXRlcygpCi17Ci0gICAgbV9jbGFzc0xpc3QuY2xlYXIoKTsKLSAgICBtX21hcHBl
ZEF0dHJpYnV0ZUNvdW50ID0gMDsKLSAgICBOYW1lZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygp
OwotfQotCi1ib29sIE5hbWVkTWFwcGVkQXR0ck1hcDo6aXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBj
b25zdAotewotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgTmFtZWRNYXBwZWRBdHRyTWFwOjpk
ZWNsQ291bnQoKSBjb25zdAotewotICAgIGludCByZXN1bHQgPSAwOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIE1hcHBlZEF0dHJpYnV0ZSog
YXR0ciA9IGF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkpCi0gICAg
ICAgICAgICByZXN1bHQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBO
YW1lZE1hcHBlZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1h
cCogb3RoZXJNYXApIGNvbnN0Ci17Ci0gICAgLy8gVGhlICMgb2YgZGVjbHMgbXVzdCBtYXRjaC4K
LSAgICBpZiAoZGVjbENvdW50KCkgIT0gb3RoZXJNYXAtPmRlY2xDb3VudCgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgLy8gVGhlIHZhbHVlcyBmb3IgZWFjaCBkZWNsIG11c3Qg
bWF0Y2guCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aCgpOyBpKyspIHsKLSAg
ICAgICAgTWFwcGVkQXR0cmlidXRlKiBhdHRyID0gYXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAg
aWYgKGF0dHItPmRlY2woKSkgewotICAgICAgICAgICAgQXR0cmlidXRlKiBvdGhlckF0dHIgPSBv
dGhlck1hcC0+Z2V0QXR0cmlidXRlSXRlbShhdHRyLT5uYW1lKCkpOwotICAgICAgICAgICAgaWYg
KCFvdGhlckF0dHIgfHwgKGF0dHItPnZhbHVlKCkgIT0gb3RoZXJBdHRyLT52YWx1ZSgpKSkKLSAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLWlubGluZSBzdGF0aWMgYm9vbCBpc0NsYXNzV2hpdGVzcGFjZShRQ2hhciBj
KQotewotICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdccicgfHwgYyA9PSAnXG4nIHx8IGMg
PT0gJ1x0JzsKLX0KLQotdm9pZCBOYW1lZE1hcHBlZEF0dHJNYXA6OnBhcnNlQ2xhc3NBdHRyaWJ1
dGUoY29uc3QgU3RyaW5nJiBjbGFzc1N0cikKLXsKLSAgICBtX2NsYXNzTGlzdC5jbGVhcigpOwot
ICAgIGlmICghZWxlbWVudC0+aGFzQ2xhc3MoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAg
IFN0cmluZyBjbGFzc0F0dHIgPSBlbGVtZW50LT5nZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUo
KSA/IAotICAgICAgICAoY2xhc3NTdHIuaW1wbCgpLT5pc0xvd2VyKCkgPyBjbGFzc1N0ciA6IFN0
cmluZyhjbGFzc1N0ci5pbXBsKCktPmxvd2VyKCkpKSA6Ci0gICAgICAgIGNsYXNzU3RyOwotICAg
IAotICAgIEF0b21pY1N0cmluZ0xpc3QqIGN1cnIgPSAwOwotICAgIAotICAgIGNvbnN0IFFDaGFy
KiBzdHIgPSBjbGFzc0F0dHIudW5pY29kZSgpOwotICAgIGludCBsZW5ndGggPSBjbGFzc0F0dHIu
bGVuZ3RoKCk7Ci0gICAgaW50IHNQb3MgPSAwOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgd2hpbGUgKHNQb3MgPCBsZW5ndGggJiYgaXNDbGFzc1doaXRlc3BhY2Uoc3RyW3NQb3NdKSkK
LSAgICAgICAgICAgICsrc1BvczsKLSAgICAgICAgaWYgKHNQb3MgPj0gbGVuZ3RoKQotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGludCBlUG9zID0gc1BvcyArIDE7Ci0gICAgICAgIHdoaWxl
IChlUG9zIDwgbGVuZ3RoICYmICFpc0NsYXNzV2hpdGVzcGFjZShzdHJbZVBvc10pKQotICAgICAg
ICAgICAgKytlUG9zOwotICAgICAgICBpZiAoY3VycikgewotICAgICAgICAgICAgY3Vyci0+c2V0
TmV4dChuZXcgQXRvbWljU3RyaW5nTGlzdChBdG9taWNTdHJpbmcoc3RyICsgc1BvcywgZVBvcyAt
IHNQb3MpKSk7Ci0gICAgICAgICAgICBjdXJyID0gY3Vyci0+bmV4dCgpOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgaWYgKHNQb3MgPT0gMCAmJiBlUG9zID09IGxlbmd0aCkgewotICAg
ICAgICAgICAgICAgIG1fY2xhc3NMaXN0LnNldFN0cmluZyhBdG9taWNTdHJpbmcoY2xhc3NBdHRy
KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBt
X2NsYXNzTGlzdC5zZXRTdHJpbmcoQXRvbWljU3RyaW5nKHN0ciArIHNQb3MsIGVQb3MgLSBzUG9z
KSk7Ci0gICAgICAgICAgICBjdXJyID0gJm1fY2xhc3NMaXN0OwotICAgICAgICB9Ci0gICAgICAg
IHNQb3MgPSBlUG9zICsgMTsKLSAgICB9Ci19Ci0KLVN0eWxlZEVsZW1lbnQ6OlN0eWxlZEVsZW1l
bnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgICA6IEVsZW1l
bnQobmFtZSwgZG9jKQotewotICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsKLSAg
ICBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwotfQotCi1TdHlsZWRFbGVt
ZW50Ojp+U3R5bGVkRWxlbWVudCgpCi17Ci0gICAgZGVzdHJveUlubGluZVN0eWxlRGVjbCgpOwot
fQotCi1BdHRyaWJ1dGUqIFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBRdWFs
aWZpZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbmV3IE1h
cHBlZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6Y3Jl
YXRlSW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBtX2lubGluZVN0eWxlRGVjbCA9IG5ldyBDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbjsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0UGFyZW50
KGdldERvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+
c2V0Tm9kZSh0aGlzKTsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0U3RyaWN0UGFyc2luZygh
Z2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6
OmRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKQotewotICAgIGlmIChtX2lubGluZVN0eWxlRGVjbCkg
ewotICAgICAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgbV9pbmxp
bmVTdHlsZURlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgbV9pbmxpbmVTdHlsZURlY2wgPSAw
OwotICAgIH0KLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphdHRyaWJ1dGVDaGFuZ2VkKEF0dHJp
YnV0ZSogYXR0ciwgYm9vbCBwcmVzZXJ2ZURlY2xzKQotewotICAgIE1hcHBlZEF0dHJpYnV0ZSog
bWFwcGVkQXR0ciA9IHN0YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+KGF0dHIpOwotICAgIGlm
IChtYXBwZWRBdHRyLT5kZWNsKCkgJiYgIXByZXNlcnZlRGVjbHMpIHsKLSAgICAgICAgbWFwcGVk
QXR0ci0+c2V0RGVjbCgwKTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICBpZiAobmFt
ZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5kZWNsUmVtb3ZlZCgp
OwotICAgIH0KLQotICAgIGJvb2wgY2hlY2tEZWNsID0gdHJ1ZTsKLSAgICBNYXBwZWRBdHRyaWJ1
dGVFbnRyeSBlbnRyeTsKLSAgICBib29sIG5lZWRUb1BhcnNlID0gbWFwVG9FbnRyeShhdHRyLT5u
YW1lKCksIGVudHJ5KTsKLSAgICBpZiAocHJlc2VydmVEZWNscykgewotICAgICAgICBpZiAobWFw
cGVkQXR0ci0+ZGVjbCgpKSB7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAg
ICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+
ZGVjbEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVja0RlY2wgPSBmYWxzZTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBlbHNlIGlmICghYXR0ci0+aXNOdWxsKCkgJiYgZW50cnkgIT0gZU5vbmUpIHsK
LSAgICAgICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRB
dHRyaWJ1dGVEZWNsKGVudHJ5LCBhdHRyKTsKLSAgICAgICAgaWYgKGRlY2wpIHsKLSAgICAgICAg
ICAgIG1hcHBlZEF0dHItPnNldERlY2woZGVjbCk7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7
Ci0gICAgICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgICAgIG1hcHBlZEF0
dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVja0RlY2wgPSBmYWxzZTsK
LSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZWVkVG9QYXJzZSA9IHRydWU7Ci0gICAgfQot
Ci0gICAgaWYgKG5lZWRUb1BhcnNlKQotICAgICAgICBwYXJzZU1hcHBlZEF0dHJpYnV0ZShtYXBw
ZWRBdHRyKTsKLSAgICAKLSAgICBpZiAoY2hlY2tEZWNsICYmIG1hcHBlZEF0dHItPmRlY2woKSkg
ewotICAgICAgICAvLyBBZGQgdGhlIGRlY2wgdG8gdGhlIHRhYmxlIGluIHRoZSBhcHByb3ByaWF0
ZSBzcG90LgotICAgICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVudHJ5LCBhdHRyLCBtYXBw
ZWRBdHRyLT5kZWNsKCkpOwotICAgICAgICBtYXBwZWRBdHRyLT5kZWNsKCktPnNldE1hcHBlZFN0
YXRlKGVudHJ5LCBhdHRyLT5uYW1lKCksIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBtYXBwZWRB
dHRyLT5kZWNsKCktPnNldFBhcmVudCgwKTsKLSAgICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgpLT5z
ZXROb2RlKDApOwotICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVk
QXR0cmlidXRlcygpLT5kZWNsQWRkZWQoKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3R5bGVkRWxlbWVu
dDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmli
dXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICByZXN1bHQgPSBlTm9uZTsKLSAgICBpZiAo
YXR0ck5hbWUgPT0gc3R5bGVBdHRyKQotICAgICAgICByZXR1cm4gIW1fc3luY2hyb25pemluZ1N0
eWxlQXR0cmlidXRlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAo
YXR0ci0+bmFtZSgpID09IGlkQXR0cikgewotICAgICAgICAvLyB1bmlxdWUgaWQKLSAgICAgICAg
c2V0SGFzSUQoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkgewot
ICAgICAgICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIG5hbWVkQXR0
ck1hcC0+c2V0SUQobnVsbEF0b20pOwotICAgICAgICAgICAgZWxzZSBpZiAoZ2V0RG9jdW1lbnQo
KS0+aW5Db21wYXRNb2RlKCkgJiYgIWF0dHItPnZhbHVlKCkuaW1wbCgpLT5pc0xvd2VyKCkpCi0g
ICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChBdG9taWNTdHJpbmcoYXR0ci0+dmFs
dWUoKS5kb21TdHJpbmcoKS5sb3dlcigpKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgfQotICAg
ICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2xhc3NB
dHRyKSB7Ci0gICAgICAgIC8vIGNsYXNzCi0gICAgICAgIHNldEhhc0NsYXNzKCFhdHRyLT5pc051
bGwoKSk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgICAgICBtYXBwZWRBdHRy
aWJ1dGVzKCktPnBhcnNlQ2xhc3NBdHRyaWJ1dGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIHNl
dENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzdHlsZUF0dHIpIHsK
LSAgICAgICAgc2V0SGFzU3R5bGUoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKGF0dHIt
PmlzTnVsbCgpKQotICAgICAgICAgICAgZGVzdHJveUlubGluZVN0eWxlRGVjbCgpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBnZXRJbmxpbmVTdHlsZURlY2woKS0+cGFyc2VEZWNsYXJhdGlv
bihhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQgPSB0cnVl
OwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6
OmNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0Ci17Ci0gICAgbmFtZWRBdHRyTWFwID0gbmV3IE5h
bWVkTWFwcGVkQXR0ck1hcChjb25zdF9jYXN0PFN0eWxlZEVsZW1lbnQqPih0aGlzKSk7Ci19Ci0K
LUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50OjpnZXRJbmxpbmVTdHls
ZURlY2woKQotewotICAgIGlmICghbV9pbmxpbmVTdHlsZURlY2wpCi0gICAgICAgIGNyZWF0ZUlu
bGluZVN0eWxlRGVjbCgpOwotICAgIHJldHVybiBtX2lubGluZVN0eWxlRGVjbC5nZXQoKTsKLX0K
LQotQ1NTU3R5bGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6c3R5bGUoKQotewotICAgIHJl
dHVybiBnZXRJbmxpbmVTdHlsZURlY2woKTsKLX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b24qIFN0eWxlZEVsZW1lbnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKQotewotICAg
IHJldHVybiAwOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmdMaXN0KiBTdHlsZWRFbGVtZW50Ojpn
ZXRDbGFzc0xpc3QoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgPyBtYXBwZWRB
dHRyaWJ1dGVzKCktPmdldENsYXNzTGlzdCgpIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBib29s
IGlzSGV4RGlnaXQoIGNvbnN0IFFDaGFyICZjICkgewotICAgIHJldHVybiAoIGMgPj0gJzAnICYm
IGMgPD0gJzknICkgfHwKLSAgICAgICAgICAgKCBjID49ICdhJyAmJiBjIDw9ICdmJyApIHx8Ci0g
ICAgICAgICAgICggYyA+PSAnQScgJiYgYyA8PSAnRicgKTsKLX0KLQotc3RhdGljIGlubGluZSBp
bnQgdG9IZXgoIGNvbnN0IFFDaGFyICZjICkgewotICAgIHJldHVybiAoIChjID49ICcwJyAmJiBj
IDw9ICc5JykKLSAgICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAtICcwJykKLSAgICAgICAgICAg
ICA6ICggKCBjID49ICdhJyAmJiBjIDw9ICdmJyApCi0gICAgICAgICAgICAgICAgID8gKGMudW5p
Y29kZSgpIC0gJ2EnICsgMTApCi0gICAgICAgICAgICAgICAgIDogKCAoIGMgPj0gJ0EnICYmIGMg
PD0gJ0YnICkKLSAgICAgICAgICAgICAgICAgICAgID8gKGMudW5pY29kZSgpIC0gJ0EnICsgMTAp
Ci0gICAgICAgICAgICAgICAgICAgICA6IC0xICkgKSApOwotfQotCi12b2lkIFN0eWxlZEVsZW1l
bnQ6OmFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNs
KGF0dHIpOwotICAgIGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIHZhbHVlLCBmYWxzZSk7
Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NTUHJvcGVydHkoTWFwcGVkQXR0cmlidXRl
KiBhdHRyLCBpbnQgaWQsIGludCB2YWx1ZSkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3Jl
YXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCB2
YWx1ZSwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU1N0cmluZ1Byb3Bl
cnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlLCBD
U1NQcmltaXRpdmVWYWx1ZTo6VW5pdFR5cGVzIHR5cGUpCi17Ci0gICAgaWYgKCFhdHRyLT5kZWNs
KCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRTdHJpbmdQ
cm9wZXJ0eShpZCwgdmFsdWUsIHR5cGUsIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50
OjphZGRDU1NJbWFnZVByb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25z
dCBTdHJpbmcgJlVSTCkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVj
bChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldEltYWdlUHJvcGVydHkoaWQsIFVSTCwgZmFs
c2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0xlbmd0aChNYXBwZWRBdHRyaWJ1
dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICAvLyBGSVhNRTog
VGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IHNwaW4gdXAgdGhlIENTUyBwYXJzZXIsIGJ1dCBzaG91
bGQgaW5zdGVhZCBqdXN0IGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QKLSAgICAvLyBsZW5ndGggdW5p
dCBhbmQgbWFrZSB0aGUgYXBwcm9wcmlhdGUgcGFyc2VkIHZhbHVlLgotICAgIGlmICghYXR0ci0+
ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotCi0gICAgLy8gc3RyaXAgYXR0cmlidXRl
IGdhcmJhZ2UuLgotICAgIFN0cmluZ0ltcGwqIHYgPSB2YWx1ZS5pbXBsKCk7Ci0gICAgaWYgKHYp
IHsKLSAgICAgICAgdW5zaWduZWQgaW50IGwgPSAwOwotICAgICAgICAKLSAgICAgICAgd2hpbGUg
KGwgPCB2LT5sZW5ndGgoKSAmJiAoKnYpW2xdLnVuaWNvZGUoKSA8PSAnICcpCi0gICAgICAgICAg
ICBsKys7Ci0gICAgICAgIAotICAgICAgICBmb3IgKDsgbCA8IHYtPmxlbmd0aCgpOyBsKyspIHsK
LSAgICAgICAgICAgIGNoYXIgY2MgPSAoKnYpW2xdLmxhdGluMSgpOwotICAgICAgICAgICAgaWYg
KGNjID4gJzknIHx8IChjYyA8ICcwJyAmJiBjYyAhPSAnKicgJiYgY2MgIT0gJyUnICYmIGNjICE9
ICcuJykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAo
bCAhPSB2LT5sZW5ndGgoKSkgewotICAgICAgICAgICAgYXR0ci0+ZGVjbCgpLT5zZXRMZW5ndGhQ
cm9wZXJ0eShpZCwgdi0+c3Vic3RyaW5nKDAsIGwpLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgYXR0ci0+ZGVjbCgpLT5zZXRMZW5ndGhQ
cm9wZXJ0eShpZCwgdmFsdWUsIGZhbHNlKTsKLX0KLQotLyogY29sb3IgcGFyc2luZyB0aGF0IHRy
aWVzIHRvIG1hdGNoIGFzIGNsb3NlIGFzIHBvc3NpYmxlIElFIDYuICovCi12b2lkIFN0eWxlZEVs
ZW1lbnQ6OmFkZENTU0NvbG9yKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBT
dHJpbmcgJmMpCi17Ci0gICAgLy8gdGhpcyBpcyB0aGUgb25seSBjYXNlIG5vIGNvbG9yIGdldHMg
YXBwbGllZCBpbiBJRS4KLSAgICBpZiAoICFjLmxlbmd0aCgpICkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgCi0g
ICAgaWYgKGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIGMsIGZhbHNlKSApCi0gICAgICAg
IHJldHVybjsKLSAgICAKLSAgICBEZXByZWNhdGVkU3RyaW5nIGNvbG9yID0gYy5kZXByZWNhdGVk
U3RyaW5nKCk7Ci0gICAgLy8gbm90IHNvbWV0aGluZyB0aGF0IGZpdHMgdGhlIHNwZWNzLgotICAg
IAotICAgIC8vIHdlJ3JlIGVtdWxhdGluZyBJRXMgY29sb3IgcGFyc2VyIGhlcmUuIEl0IG1hcHMg
dHJhbnNwYXJlbnQgdG8gYmxhY2ssIG90aGVyd2lzZSBpdCB0cmllcyB0byBidWlsZCBhIHJnYiB2
YWx1ZQotICAgIC8vIG91dCBvZiBldmVyeWh0aW5nIHlvdSBwdXQgaW4uIFRoZSBhbGdvcml0aG0g
aXMgZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCwgYnV0IHNlZW1zIHRvIHdvcmsgZm9yIGFsbCB0
ZXN0IGNhc2VzIEkgaGF2ZS4KLSAgICAKLSAgICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBjb2xvciB2
YWx1ZSBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0Ci0gICAgLy8gbXVsdGlwbGUgb2YgMy4gZWFj
aCBwYXJ0IG9mIHRoZSByZ2IgdHJpcGxlIHRoZW4gZ2V0cyBvbmUgdGhpcmQKLSAgICAvLyBvZiB0
aGUgbGVuZ3RoLgotICAgIC8vCi0gICAgLy8gRWFjaCB0cmlwbGV0IGlzIHBhcnNlZCBieXRlIGJ5
IGJ5dGUsIG1hcHBpbmcKLSAgICAvLyBlYWNoIG51bWJlciB0byBhIGhleCB2YWx1ZSAoMC05YS1m
QS1GIHRvIHRoZWlyIHZhbHVlcwotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSB0byAwKS4KLSAgICAv
LwotICAgIC8vIFRoZSBoaWdoZXN0IG5vbiB6ZXJvIGRpZ2l0IGluIGFsbCB0cmlwbGV0cyBpcyBy
ZW1lbWJlcmVkLCBhbmQKLSAgICAvLyB1c2VkIGFzIGEgbm9ybWFsaXphdGlvbiBwb2ludCB0byBu
b3JtYWxpemUgdG8gdmFsdWVzIGJldHdlZW4gMAotICAgIC8vIGFuZCAyNTUuCi0gICAgCi0gICAg
aWYgKCBjb2xvci5sb3dlcigpICE9ICJ0cmFuc3BhcmVudCIgKSB7Ci0gICAgICAgIGlmICggY29s
b3JbMF0gPT0gJyMnICkKLSAgICAgICAgICAgIGNvbG9yLnJlbW92ZSggMCwgIDEgKTsKLSAgICAg
ICAgaW50IGJhc2ljTGVuZ3RoID0gKGNvbG9yLmxlbmd0aCgpICsgMikgLyAzOwotICAgICAgICBp
ZiAoIGJhc2ljTGVuZ3RoID4gMSApIHsKLSAgICAgICAgICAgIC8vIElFIGlnbm9yZXMgY29sb3Jz
IHdpdGggdGhyZWUgZGlnaXRzIG9yIGxlc3MKLSAgICAgICAgICAgIGludCBjb2xvcnNbM10gPSB7
IDAsIDAsIDAgfTsKLSAgICAgICAgICAgIGludCBjb21wb25lbnQgPSAwOwotICAgICAgICAgICAg
aW50IHBvcyA9IDA7Ci0gICAgICAgICAgICBpbnQgbWF4RGlnaXQgPSBiYXNpY0xlbmd0aC0xOwot
ICAgICAgICAgICAgd2hpbGUgKCBjb21wb25lbnQgPCAzICkgewotICAgICAgICAgICAgICAgIC8v
IHNlYXJjaCBmb3J3YXJkIGZvciBkaWdpdHMgaW4gdGhlIHN0cmluZwotICAgICAgICAgICAgICAg
IGludCBudW1EaWdpdHMgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICggcG9zIDwgKGludClj
b2xvci5sZW5ndGgoKSAmJiBudW1EaWdpdHMgPCBiYXNpY0xlbmd0aCApIHsKLSAgICAgICAgICAg
ICAgICAgICAgaW50IGhleCA9IHRvSGV4KCBjb2xvcltwb3NdICk7Ci0gICAgICAgICAgICAgICAg
ICAgIGNvbG9yc1tjb21wb25lbnRdID0gKGNvbG9yc1tjb21wb25lbnRdIDw8IDQpOwotICAgICAg
ICAgICAgICAgICAgICBpZiAoIGhleCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBj
b2xvcnNbY29tcG9uZW50XSArPSBoZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhEaWdp
dCA9IGtNaW4oIG1heERpZ2l0LCBudW1EaWdpdHMgKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBudW1EaWdpdHMrKzsKLSAgICAgICAgICAgICAgICAgICAgcG9z
Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICggbnVtRGlnaXRz
KysgPCBiYXNpY0xlbmd0aCApCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yc1tjb21wb25lbnRd
IDw8PSA0OwotICAgICAgICAgICAgICAgIGNvbXBvbmVudCsrOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgbWF4RGlnaXQgPSBiYXNpY0xlbmd0aCAtIG1heERpZ2l0OwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICAvLyBub3JtYWxpemUgdG8gMDAtZmYuIFRoZSBoaWdoZXN0IGZpbGxlZCBk
aWdpdCBjb3VudHMsIG1pbmltdW0gaXMgMiBkaWdpdHMKLSAgICAgICAgICAgIG1heERpZ2l0IC09
IDI7Ci0gICAgICAgICAgICBjb2xvcnNbMF0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICBj
b2xvcnNbMV0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICBjb2xvcnNbMl0gPj49IDQqbWF4
RGlnaXQ7Ci0gICAgICAgICAgICAvLyBhc3NlcnQoIGNvbG9yc1swXSA8IDB4MTAwICYmIGNvbG9y
c1sxXSA8IDB4MTAwICYmIGNvbG9yc1syXSA8IDB4MTAwICk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGNvbG9yLnNwcmludGYoIiMlMDJ4JTAyeCUwMngiLCBjb2xvcnNbMF0sIGNvbG9yc1sx
XSwgY29sb3JzWzJdICk7Ci0gICAgICAgICAgICBpZiAoIGF0dHItPmRlY2woKS0+c2V0UHJvcGVy
dHkoaWQsIFN0cmluZyhjb2xvciksIGZhbHNlKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0gICAgfQotICAgIGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIENTU19W
QUxfQkxBQ0ssIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpjcmVhdGVNYXBwZWRE
ZWNsKE1hcHBlZEF0dHJpYnV0ZSogYXR0cikKLXsKLSAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNs
YXJhdGlvbiogZGVjbCA9IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigwKTsKLSAg
ICBhdHRyLT5zZXREZWNsKGRlY2wpOwotICAgIGRlY2wtPnNldFBhcmVudChnZXREb2N1bWVudCgp
LT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgZGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICBkZWNsLT5z
ZXRTdHJpY3RQYXJzaW5nKGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJpYnV0ZXMgYXJlIGp1c3QgYWx3
YXlzIHF1aXJreS4KLX0KLQotLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRyYXJ5IHN0YXJ0IHZhbHVl
IHRvIGF2b2lkIG1hcHBpbmcgYWxsIDAncyB0byBhbGwgMCdzCi0vLyBvciBhbnl0aGluZyBsaWtl
IHRoYXQuCi1jb25zdCB1bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsKLQotLy8gUGF1bCBIc2ll
aCdzIFN1cGVyRmFzdEhhc2gKLS8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25rZXlzLmNvbS9xZWQv
aGFzaC5odG1sCi11bnNpZ25lZCBNYXBwZWRBdHRyaWJ1dGVIYXNoOjpoYXNoKGNvbnN0IE1hcHBl
ZEF0dHJpYnV0ZUtleSYga2V5KQotewotICAgIHVpbnQzMl90IGhhc2ggPSBQSEk7Ci0gICAgdWlu
dDMyX3QgdG1wOwotCi0gICAgY29uc3QgdWludDE2X3QqIHA7Ci0KLSAgICBwID0gcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZrZXkubmFtZSk7Ci0gICAgaGFzaCArPSBwWzBdOwot
ICAgIHRtcCA9IChwWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgaGFzaCA9IChoYXNoIDw8IDE2KSBe
IHRtcDsKLSAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAgYXNzZXJ0KHNpemVvZihrZXkubmFt
ZSkgPT0gNCB8fCBzaXplb2Yoa2V5Lm5hbWUpID09IDgpOwotICAgIGlmIChzaXplb2Yoa2V5Lm5h
bWUpID09IDgpIHsKLSAgICAgICAgcCArPSAyOwotICAgICAgICBoYXNoICs9IHBbMF07Ci0gICAg
ICAgIHRtcCA9IChwWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgICAgIGhhc2ggPSAoaGFzaCA8PCAx
NikgXiB0bXA7Ci0gICAgICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAgICB9Ci0KLSAgICBwID0g
cmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZrZXkudmFsdWUpOwotICAgIGhhc2gg
Kz0gcFswXTsKLSAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgIGhhc2ggPSAoaGFz
aCA8PCAxNikgXiB0bXA7Ci0gICAgaGFzaCArPSBoYXNoID4+IDExOwotICAgIGFzc2VydChzaXpl
b2Yoa2V5LnZhbHVlKSA9PSA0IHx8IHNpemVvZihrZXkudmFsdWUpID09IDgpOwotICAgIGlmIChz
aXplb2Yoa2V5LnZhbHVlKSA9PSA4KSB7Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgaGFzaCAr
PSBwWzBdOwotICAgICAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgICAgICBoYXNo
ID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAg
fQotCi0gICAgLy8gSGFuZGxlIGVuZCBjYXNlCi0gICAgaGFzaCArPSBrZXkudHlwZTsKLSAgICBo
YXNoIF49IGhhc2ggPDwgMTE7Ci0gICAgaGFzaCArPSBoYXNoID4+IDE3OwotCi0gICAgLy8gRm9y
Y2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cwotICAgIGhhc2ggXj0gaGFzaCA8PCAz
OwotICAgIGhhc2ggKz0gaGFzaCA+PiA1OwotICAgIGhhc2ggXj0gaGFzaCA8PCAyOwotICAgIGhh
c2ggKz0gaGFzaCA+PiAxNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMTA7Ci0KLSAgICAvLyBUaGlz
IGF2b2lkcyBldmVyIHJldHVybmluZyBhIGhhc2ggY29kZSBvZiAwLCBzaW5jZSB0aGF0IGlzIHVz
ZWQgdG8KLSAgICAvLyBzaWduYWwgImhhc2ggbm90IGNvbXB1dGVkIHlldCIsIHVzaW5nIGEgdmFs
dWUgdGhhdCBpcyBsaWtlbHkgdG8gYmUKLSAgICAvLyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyAw
IHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBtYXNrZWQKLSAgICBpZiAoaGFzaCA9PSAwKQotICAgICAg
ICBoYXNoID0gMHg4MDAwMDAwMDsKLQotICAgIHJldHVybiBoYXNoOwotfQotCiB9CkluZGV4OiBk
b20vQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRvbS9D
U1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgZG9t
L0NTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIs
MTYzNyArMjIsMTcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5
IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNB
LgogICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJkb21fZWxlbWVudGltcGwu
aCIKKyNpbmNsdWRlICJDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5oIgogCi0jaW5jbHVk
ZSAiRXhjZXB0aW9uQ29kZS5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiVGV4dC5o
IgotI2luY2x1ZGUgImNzc19zdHlsZXNoZWV0aW1wbC5oIgotI2luY2x1ZGUgImNzc192YWx1ZWlt
cGwuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVL
ZXl3b3Jkcy5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgImRvbV94
bWxpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFBhcnNlci5o
IgotI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5oIgotI2luY2x1ZGUgPHF0ZXh0c3RyZWFtLmg+Cisj
aW5jbHVkZSAiU3R5bGVkRWxlbWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5n
IG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLXN0cnVjdCBNYXBwZWRBdHRyaWJ1dGVLZXkgewotICAg
IHVpbnQxNl90IHR5cGU7Ci0gICAgU3RyaW5nSW1wbCogbmFtZTsKLSAgICBTdHJpbmdJbXBsKiB2
YWx1ZTsKLSAgICBNYXBwZWRBdHRyaWJ1dGVLZXkoTWFwcGVkQXR0cmlidXRlRW50cnkgdCwgU3Ry
aW5nSW1wbCogbiwgU3RyaW5nSW1wbCogdikKLSAgICAgICAgOiB0eXBlKHQpLCBuYW1lKG4pLCB2
YWx1ZSh2KSB7IH0KLX07Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1h
cHBlZEF0dHJpYnV0ZUtleSYgYSwgY29uc3QgTWFwcGVkQXR0cmlidXRlS2V5JiBiKQotICAgIHsg
cmV0dXJuIGEudHlwZSA9PSBiLnR5cGUgJiYgYS5uYW1lID09IGIubmFtZSAmJiBhLnZhbHVlID09
IGIudmFsdWU7IH0gCi0KLXN0cnVjdCBNYXBwZWRBdHRyaWJ1dGVLZXlUcmFpdHMgewotICAgIHR5
cGVkZWYgTWFwcGVkQXR0cmlidXRlS2V5IFRyYWl0VHlwZTsKLSAgICBzdGF0aWMgY29uc3QgYm9v
bCBlbXB0eVZhbHVlSXNaZXJvID0gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVkc0Rl
c3RydWN0aW9uID0gZmFsc2U7Ci0gICAgc3RhdGljIE1hcHBlZEF0dHJpYnV0ZUtleSBlbXB0eVZh
bHVlKCkgeyByZXR1cm4gTWFwcGVkQXR0cmlidXRlS2V5KGVOb25lLCAwLCAwKTsgfQotICAgIHN0
YXRpYyBNYXBwZWRBdHRyaWJ1dGVLZXkgZGVsZXRlZFZhbHVlKCkgeyByZXR1cm4gTWFwcGVkQXR0
cmlidXRlS2V5KGVMYXN0RW50cnksIDAsIDApOyB9Ci19OwotCi1zdHJ1Y3QgTWFwcGVkQXR0cmli
dXRlSGFzaCB7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgTWFwcGVkQXR0cmlidXRl
S2V5Jik7Ci0gICAgc3RhdGljIGJvb2wgZXF1YWwoY29uc3QgTWFwcGVkQXR0cmlidXRlS2V5JiBh
LCBjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQotfTsKLQot
dHlwZWRlZiBIYXNoTWFwPE1hcHBlZEF0dHJpYnV0ZUtleSwgQ1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb24qLCBNYXBwZWRBdHRyaWJ1dGVIYXNoLCBNYXBwZWRBdHRyaWJ1dGVLZXlUcmFpdHM+
IE1hcHBlZEF0dHJpYnV0ZURlY2xzOwotCi1zdGF0aWMgTWFwcGVkQXR0cmlidXRlRGVjbHMqIG1h
cHBlZEF0dHJpYnV0ZURlY2xzID0gMDsKLQotQXR0cmlidXRlKiBBdHRyaWJ1dGU6OmNsb25lKGJv
b2wpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUobV9uYW1lLCBtX3ZhbHVlKTsK
LX0KLQotUGFzc1JlZlB0cjxBdHRyPiBBdHRyaWJ1dGU6OmNyZWF0ZUF0dHJJZk5lZWRlZChFbGVt
ZW50KiBlKQotewotICAgIFJlZlB0cjxBdHRyPiByKG1faW1wbCk7Ci0gICAgaWYgKCFyKSB7Ci0g
ICAgICAgIHIgPSBuZXcgQXR0cihlLCBlLT5nZXREb2N1bWVudCgpLCB0aGlzKTsKLSAgICAgICAg
ci0+Y3JlYXRlVGV4dENoaWxkKCk7Ci0gICAgfQotICAgIHJldHVybiByLnJlbGVhc2UoKTsKLX0K
LQotQXR0cjo6QXR0cihFbGVtZW50KiBlbGVtZW50LCBEb2N1bWVudCogZG9jUHRyLCBBdHRyaWJ1
dGUqIGEpCi0gICAgOiBDb250YWluZXJOb2RlKGRvY1B0ciksCi0gICAgICBtX2VsZW1lbnQoZWxl
bWVudCksCi0gICAgICBtX2F0dHJpYnV0ZShhKSwKLSAgICAgIG1faWdub3JlQ2hpbGRyZW5DaGFu
Z2VkKDApCi17Ci0gICAgYXNzZXJ0KCFtX2F0dHJpYnV0ZS0+bV9pbXBsKTsKLSAgICBtX2F0dHJp
YnV0ZS0+bV9pbXBsID0gdGhpczsKLSAgICBtX3NwZWNpZmllZCA9IHRydWU7Ci19Ci0KLUF0dHI6
On5BdHRyKCkKLXsKLSAgICBhc3NlcnQobV9hdHRyaWJ1dGUtPm1faW1wbCA9PSB0aGlzKTsKLSAg
ICBtX2F0dHJpYnV0ZS0+bV9pbXBsID0gMDsKLX0KLQotdm9pZCBBdHRyOjpjcmVhdGVUZXh0Q2hp
bGQoKQotewotICAgIGFzc2VydChyZWZDb3VudCgpKTsKLSAgICBpZiAoIW1fYXR0cmlidXRlLT52
YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAg
ICAgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQrKzsKLSAgICAgICAgYXBwZW5kQ2hpbGQoZ2V0RG9j
dW1lbnQoKS0+Y3JlYXRlVGV4dE5vZGUobV9hdHRyaWJ1dGUtPnZhbHVlKCkuaW1wbCgpKSwgZWMp
OwotICAgICAgICBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZC0tOwotICAgIH0KLX0KLQotU3RyaW5n
IEF0dHI6Om5vZGVOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZSgpOwotfQotCi1Ob2Rl
OjpOb2RlVHlwZSBBdHRyOjpub2RlVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEFUVFJJQlVU
RV9OT0RFOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEF0dHI6OmxvY2FsTmFtZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fYXR0cmlidXRlLT5sb2NhbE5hbWUoKTsKLX0KLQotY29uc3QgQXRv
bWljU3RyaW5nJiBBdHRyOjpuYW1lc3BhY2VVUkkoKSBjb25zdAotewotICAgIHJldHVybiBtX2F0
dHJpYnV0ZS0+bmFtZXNwYWNlVVJJKCk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgQXR0cjo6
cHJlZml4KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hdHRyaWJ1dGUtPnByZWZpeCgpOwotfQot
Ci12b2lkIEF0dHI6OnNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2Vw
dGlvbkNvZGUmIGVjKQotewotICAgIGNoZWNrU2V0UHJlZml4KF9wcmVmaXgsIGVjKTsKLSAgICBp
ZiAoZWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fYXR0cmlidXRlLT5zZXRQcmVmaXgoX3By
ZWZpeCk7Ci19Ci0KLVN0cmluZyBBdHRyOjpub2RlVmFsdWUoKSBjb25zdAotewotICAgIHJldHVy
biB2YWx1ZSgpOwotfQotCi12b2lkIEF0dHI6OnNldFZhbHVlKCBjb25zdCBTdHJpbmcmIHYsIEV4
Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGVjID0gMDsKLQotICAgIC8vIGRvIG5vdCBpbnRlcnBy
ZXRlIGVudGl0aWVzIGluIHRoZSBzdHJpbmcsIGl0cyBsaXRlcmFsIQotCi0gICAgLy8gTk9fTU9E
SUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seQot
ICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxM
T1dFRF9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyAjIyMgd2hhdCB0byBk
byBvbiAwID8KLSAgICBpZiAodi5pc051bGwoKSkgewotICAgICAgICBlYyA9IERPTVNUUklOR19T
SVpFX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBlID0gMDsKLSAgICBt
X2lnbm9yZUNoaWxkcmVuQ2hhbmdlZCsrOwotICAgIHJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgYXBw
ZW5kQ2hpbGQoZ2V0RG9jdW1lbnQoKS0+Y3JlYXRlVGV4dE5vZGUodi5pbXBsKCkpLCBlKTsKLSAg
ICBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZC0tOwotICAgIAotICAgIG1fYXR0cmlidXRlLT5zZXRW
YWx1ZSh2LmltcGwoKSk7Ci0gICAgaWYgKG1fZWxlbWVudCkKLSAgICAgICAgbV9lbGVtZW50LT5h
dHRyaWJ1dGVDaGFuZ2VkKG1fYXR0cmlidXRlLmdldCgpKTsKLX0KLQotdm9pZCBBdHRyOjpzZXRO
b2RlVmFsdWUoY29uc3QgU3RyaW5nJiB2LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICAvLyBO
T19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IHRha2VuIGNhcmUgb2YgYnkgc2V0VmFsdWUoKQot
ICAgIHNldFZhbHVlKHYsIGVjKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBBdHRyOjpjbG9uZU5v
ZGUoYm9vbCAvKmRlZXAqLykKLXsKLSAgICBSZWZQdHI8QXR0cj4gY2xvbmUgPSBuZXcgQXR0cigw
LCBnZXREb2N1bWVudCgpLCBtX2F0dHJpYnV0ZS0+Y2xvbmUoKSk7Ci0gICAgY2xvbmVDaGlsZE5v
ZGVzKGNsb25lLmdldCgpKTsKLSAgICByZXR1cm4gY2xvbmUucmVsZWFzZSgpOwotfQotCi0vLyBE
T00gU2VjdGlvbiAxLjEuMQotYm9vbCBBdHRyOjpjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlIHR5
cGUpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgVEVYVF9OT0RFOgotICAg
ICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0K
LQotdm9pZCBBdHRyOjpjaGlsZHJlbkNoYW5nZWQoKQotewotICAgIE5vZGU6OmNoaWxkcmVuQ2hh
bmdlZCgpOwotICAgIAotICAgIGlmIChtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZCA+IDApCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGluY2x1ZGUgZW50aXR5
IHJlZmVyZW5jZXMgaW4gdGhlIHZhbHVlCi0gICAgCi0gICAgU3RyaW5nIHZhbCA9ICIiOwotICAg
IGZvciAoTm9kZSAqbiA9IGZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsK
LSAgICAgICAgaWYgKG4tPmlzVGV4dE5vZGUoKSkKLSAgICAgICAgICAgIHZhbCArPSBzdGF0aWNf
Y2FzdDxUZXh0ICo+KG4pLT5kYXRhKCk7Ci0gICAgfQotICAgIAotICAgIG1fYXR0cmlidXRlLT5z
ZXRWYWx1ZSh2YWwuaW1wbCgpKTsKLSAgICBpZiAobV9lbGVtZW50KQotICAgICAgICBtX2VsZW1l
bnQtPmF0dHJpYnV0ZUNoYW5nZWQobV9hdHRyaWJ1dGUuZ2V0KCkpOwotfQotCi1TdHJpbmcgQXR0
cjo6dG9TdHJpbmcoKSBjb25zdAotewotICAgIFN0cmluZyByZXN1bHQ7Ci0KLSAgICByZXN1bHQg
Kz0gbm9kZU5hbWUoKTsKLQotICAgIC8vIEZJWE1FOiBzdWJzdGl0dXRlIGVudGl0aWVzIGZvciBh
bnkgaW5zdGFuY2VzIG9mICIgb3IgJyAtLQotICAgIC8vIG1heWJlIGVhc2llciB0byBqdXN0IHVz
ZSB0ZXh0IHZhbHVlIGFuZCBpZ25vcmUgZXhpc3RpbmcKLSAgICAvLyBlbnRpdHkgcmVmcz8KLQot
ICAgIGlmIChmaXJzdENoaWxkKCkgIT0gTlVMTCkgewotICAgICAgICByZXN1bHQgKz0gIj1cIiI7
Ci0KLSAgICAgICAgZm9yIChOb2RlICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gTlVM
TDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgcmVzdWx0ICs9
IGNoaWxkLT50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXN1bHQg
Kz0gIlwiIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLSNpZm5kZWYgTkRFQlVHCi1zdHJ1Y3QgRWxlbWVudEltcGxDb3VudGVyIAoteyAK
LSAgICBzdGF0aWMgaW50IGNvdW50OyAKLSAgICB+RWxlbWVudEltcGxDb3VudGVyKCkgeyAvKiBp
ZiAoY291bnQgIT0gMCkgZnByaW50ZihzdGRlcnIsICJMRUFLOiAlZCBFbGVtZW50XG4iLCBjb3Vu
dCk7ICovIH0gCi19OwotaW50IEVsZW1lbnRJbXBsQ291bnRlcjo6Y291bnQ7Ci1zdGF0aWMgRWxl
bWVudEltcGxDb3VudGVyIGVsZW1lbnRJbXBsQ291bnRlcjsKLSNlbmRpZiBOREVCVUcKLQotRWxl
bWVudDo6RWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiBxTmFtZSwgRG9jdW1lbnQgKmRvYykK
LSAgICA6IENvbnRhaW5lck5vZGUoZG9jKSwgbV90YWdOYW1lKHFOYW1lKQotewotI2lmbmRlZiBO
REVCVUcKLSAgICArK0VsZW1lbnRJbXBsQ291bnRlcjo6Y291bnQ7Ci0jZW5kaWYKLX0KLQotRWxl
bWVudDo6fkVsZW1lbnQoKQotewotI2lmbmRlZiBOREVCVUcKLSAgICAtLUVsZW1lbnRJbXBsQ291
bnRlcjo6Y291bnQ7Ci0jZW5kaWYKLSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICBuYW1l
ZEF0dHJNYXAtPmRldGFjaEZyb21FbGVtZW50KCk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gRWxl
bWVudDo6Y2xvbmVOb2RlKGJvb2wgZGVlcCkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsK
LSAgICBSZWZQdHI8RWxlbWVudD4gY2xvbmUgPSBnZXREb2N1bWVudCgpLT5jcmVhdGVFbGVtZW50
TlMobmFtZXNwYWNlVVJJKCksIG5vZGVOYW1lKCksIGVjKTsKLSAgICBhc3NlcnQoIWVjKTsKLSAg
ICAKLSAgICAvLyBjbG9uZSBhdHRyaWJ1dGVzCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAg
ICAgKmNsb25lLT5hdHRyaWJ1dGVzKCkgPSAqbmFtZWRBdHRyTWFwOwotCi0gICAgY2xvbmUtPmNv
cHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKHRoaXMpOwotICAgIAotICAgIGlmIChkZWVwKQotICAg
ICAgICBjbG9uZUNoaWxkTm9kZXMoY2xvbmUuZ2V0KCkpOwotCi0gICAgcmV0dXJuIGNsb25lLnJl
bGVhc2UoKTsKLX0KLQotdm9pZCBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGUoY29uc3QgUXVhbGlm
aWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKG5hbWVkQXR0ck1h
cCkgewotICAgICAgICBuYW1lZEF0dHJNYXAtPnJlbW92ZU5hbWVkSXRlbShuYW1lLCBlYyk7Ci0g
ICAgICAgIGlmIChlYyA9PSBOT1RfRk9VTkRfRVJSKQotICAgICAgICAgICAgZWMgPSAwOwotICAg
IH0KLX0KLQotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYg
bmFtZSwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsK
LSAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUuaW1wbCgpLCBlYyk7Ci19Ci0KLS8vIFZpcnR1
YWwgZnVuY3Rpb24sIGRlZmluZWQgaW4gYmFzZSBjbGFzcy4KLU5hbWVkQXR0ck1hcCAqRWxlbWVu
dDo6YXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZXMoZmFsc2UpOwot
fQotCi1OYW1lZEF0dHJNYXAqIEVsZW1lbnQ6OmF0dHJpYnV0ZXMoYm9vbCByZWFkb25seSkgY29u
c3QKLXsKLSAgICB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCk7Ci0gICAgaWYgKCFyZWFk
b25seSAmJiAhbmFtZWRBdHRyTWFwKQotICAgICAgICBjcmVhdGVBdHRyaWJ1dGVNYXAoKTsKLSAg
ICByZXR1cm4gbmFtZWRBdHRyTWFwLmdldCgpOwotfQotCi1Ob2RlOjpOb2RlVHlwZSBFbGVtZW50
Ojpub2RlVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEVMRU1FTlRfTk9ERTsKLX0KLQotY29u
c3QgQXRvbWljU3RyaW5nTGlzdCogRWxlbWVudDo6Z2V0Q2xhc3NMaXN0KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gMDsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBFbGVtZW50OjpnZXRJREF0dHJp
YnV0ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWVkQXR0ck1hcCA/IG5hbWVkQXR0ck1hcC0+
aWQoKSA6IG51bGxBdG9tOwotfQotCi1ib29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZShjb25zdCBR
dWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIHJldHVybiBoYXNBdHRyaWJ1dGVOUyhu
YW1lLm5hbWVzcGFjZVVSSSgpLCBuYW1lLmxvY2FsTmFtZSgpKTsKLX0KLQotY29uc3QgQXRvbWlj
U3RyaW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkg
Y29uc3QKLXsKLSAgICBpZiAobmFtZSA9PSBzdHlsZUF0dHIpCi0gICAgICAgIHVwZGF0ZVN0eWxl
QXR0cmlidXRlSWZOZWVkZWQoKTsKLQotICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgIGlm
IChBdHRyaWJ1dGUqIGEgPSBuYW1lZEF0dHJNYXAtPmdldEF0dHJpYnV0ZUl0ZW0obmFtZSkpCi0g
ICAgICAgICAgICByZXR1cm4gYS0+dmFsdWUoKTsKLQotICAgIHJldHVybiBudWxsQXRvbTsKLX0K
LQotdm9pZCBFbGVtZW50OjpzY3JvbGxJbnRvVmlldyhib29sIGFsaWduVG9Ub3ApIAotewotICAg
IEludFJlY3QgYm91bmRzID0gdGhpcy0+Z2V0UmVjdCgpOyAgICAKLSAgICBpZiAocmVuZGVyZXIo
KSkgewotICAgICAgICAvLyBBbGlnbiB0byB0aGUgdG9wIC8gYm90dG9tIGFuZCB0byB0aGUgY2xv
c2VzdCBlZGdlLgotICAgICAgICBpZiAoYWxpZ25Ub1RvcCkKLSAgICAgICAgICAgIHJlbmRlcmVy
KCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJM
YXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25Ub3BBbHdheXMp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW5kZXJlcigpLT5lbmNsb3NpbmdMYXllcigp
LT5zY3JvbGxSZWN0VG9WaXNpYmxlKGJvdW5kcywgUmVuZGVyTGF5ZXI6OmdBbGlnblRvRWRnZUlm
TmVlZGVkLCBSZW5kZXJMYXllcjo6Z0FsaWduQm90dG9tQWx3YXlzKTsKLSAgICB9Ci19Ci0KLXZv
aWQgRWxlbWVudDo6c2Nyb2xsSW50b1ZpZXdJZk5lZWRlZChib29sIGNlbnRlcklmTmVlZGVkKQot
ewotICAgIEludFJlY3QgYm91bmRzID0gdGhpcy0+Z2V0UmVjdCgpOyAgICAKLSAgICBpZiAocmVu
ZGVyZXIoKSkgewotICAgICAgICBpZiAoY2VudGVySWZOZWVkZWQpCi0gICAgICAgICAgICByZW5k
ZXJlcigpLT5lbmNsb3NpbmdMYXllcigpLT5zY3JvbGxSZWN0VG9WaXNpYmxlKGJvdW5kcywgUmVu
ZGVyTGF5ZXI6OmdBbGlnbkNlbnRlcklmTmVlZGVkLCBSZW5kZXJMYXllcjo6Z0FsaWduQ2VudGVy
SWZOZWVkZWQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZW5kZXJlcigpLT5lbmNsb3Np
bmdMYXllcigpLT5zY3JvbGxSZWN0VG9WaXNpYmxlKGJvdW5kcywgUmVuZGVyTGF5ZXI6OmdBbGln
blRvRWRnZUlmTmVlZGVkLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQpOwotICAg
IH0KLX0KLQotc3RhdGljIGlubGluZSBib29sIGluSFRNTERvY3VtZW50KGNvbnN0IEVsZW1lbnQq
IGUpCi17Ci0gICAgcmV0dXJuIGUgJiYgZS0+Z2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQo
KTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBFbGVtZW50OjpnZXRBdHRyaWJ1dGUoY29uc3Qg
U3RyaW5nJiBuYW1lKSBjb25zdAotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1
bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRvbSkpOwot
fQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0ZU5TKGNvbnN0IFN0
cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5p
bXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpKTsKLX0KLQotdm9pZCBFbGVtZW50OjpzZXRBdHRy
aWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlLCBFeGNlcHRpb25D
b2RlJiBlYykKLXsKLSAgICBpZiAoIURvY3VtZW50Ojppc1ZhbGlkTmFtZShuYW1lKSkgewotICAg
ICAgICBlYyA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1lbnQodGhpcykgPyBuYW1lLmxvd2Vy
KCkgOiBuYW1lOwotICAgIHNldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2Nh
bE5hbWUuaW1wbCgpLCBudWxsQXRvbSksIHZhbHVlLmltcGwoKSwgZWMpOwotfQotCi12b2lkIEVs
ZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBs
KiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKGluRG9jdW1lbnQoKSkKLSAg
ICAgICAgZ2V0RG9jdW1lbnQoKS0+aW5jRE9NVHJlZVZlcnNpb24oKTsKLQotICAgIC8vIGFsbG9j
YXRlIGF0dHJpYnV0ZW1hcCBpZiBuZWNlc3NhcnkKLSAgICBBdHRyaWJ1dGUqIG9sZCA9IGF0dHJp
YnV0ZXMoZmFsc2UpLT5nZXRBdHRyaWJ1dGVJdGVtKG5hbWUpOwotCi0gICAgLy8gTk9fTU9ESUZJ
Q0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seQotICAg
IGlmIChuYW1lZEF0dHJNYXAtPmlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElG
SUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChu
YW1lID09IGlkQXR0cikKLSAgICAgICAgdXBkYXRlSWQob2xkID8gb2xkLT52YWx1ZSgpIDogbnVs
bEF0b20sIHZhbHVlKTsKLSAgICAKLSAgICBpZiAob2xkICYmICF2YWx1ZSkKLSAgICAgICAgbmFt
ZWRBdHRyTWFwLT5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgZWxzZSBpZiAoIW9sZCAmJiB2
YWx1ZSkKLSAgICAgICAgbmFtZWRBdHRyTWFwLT5hZGRBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRl
KG5hbWUsIHZhbHVlKSk7Ci0gICAgZWxzZSBpZiAob2xkICYmIHZhbHVlKSB7Ci0gICAgICAgIG9s
ZC0+c2V0VmFsdWUodmFsdWUpOwotICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG9sZCk7Ci0gICAg
fQotfQotCi1BdHRyaWJ1dGUqIEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZp
ZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbmV3IEF0dHJp
YnV0ZShuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlTWFwKE5h
bWVkQXR0ck1hcCogbGlzdCkKLXsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBnZXRE
b2N1bWVudCgpLT5pbmNET01UcmVlVmVyc2lvbigpOwotCi0gICAgLy8gSWYgc2V0dGluZyB0aGUg
d2hvbGUgbWFwIGNoYW5nZXMgdGhlIGlkIGF0dHJpYnV0ZSwgd2UgbmVlZCB0byBjYWxsIHVwZGF0
ZUlkLgotCi0gICAgQXR0cmlidXRlICpvbGRJZCA9IG5hbWVkQXR0ck1hcCA/IG5hbWVkQXR0ck1h
cC0+Z2V0QXR0cmlidXRlSXRlbShpZEF0dHIpIDogMDsKLSAgICBBdHRyaWJ1dGUgKm5ld0lkID0g
bGlzdCA/IGxpc3QtPmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKSA6IDA7Ci0KLSAgICBpZiAob2xk
SWQgfHwgbmV3SWQpCi0gICAgICAgIHVwZGF0ZUlkKG9sZElkID8gb2xkSWQtPnZhbHVlKCkgOiBu
dWxsQXRvbSwgbmV3SWQgPyBuZXdJZC0+dmFsdWUoKSA6IG51bGxBdG9tKTsKLQotICAgIGlmIChu
YW1lZEF0dHJNYXApCi0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZWxlbWVudCA9IDA7Ci0KLSAgICBu
YW1lZEF0dHJNYXAgPSBsaXN0OwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkgewotICAgICAgICBu
YW1lZEF0dHJNYXAtPmVsZW1lbnQgPSB0aGlzOwotICAgICAgICB1bnNpZ25lZCBsZW4gPSBuYW1l
ZEF0dHJNYXAtPmxlbmd0aCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVu
OyBpKyspCi0gICAgICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWVkQXR0ck1hcC0+YXR0cnNb
aV0pOwotICAgICAgICAvLyBGSVhNRTogV2hhdCBhYm91dCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBp
biB0aGUgb2xkIG1hcCB0aGF0IGFyZSBub3QgaW4gdGhlIG5ldyBtYXA/Ci0gICAgfQotfQotCi1i
b29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZXMoKSBjb25zdAotewotICAgIHVwZGF0ZVN0eWxlQXR0
cmlidXRlSWZOZWVkZWQoKTsKLSAgICByZXR1cm4gbmFtZWRBdHRyTWFwICYmIG5hbWVkQXR0ck1h
cC0+bGVuZ3RoKCkgPiAwOwotfQotCi1TdHJpbmcgRWxlbWVudDo6bm9kZU5hbWUoKSBjb25zdAot
ewotICAgIHJldHVybiBtX3RhZ05hbWUudG9TdHJpbmcoKTsKLX0KLQotdm9pZCBFbGVtZW50Ojpz
ZXRQcmVmaXgoY29uc3QgQXRvbWljU3RyaW5nICZfcHJlZml4LCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICBjaGVja1NldFByZWZpeChfcHJlZml4LCBlYyk7Ci0gICAgaWYgKGVjKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBtX3RhZ05hbWUuc2V0UHJlZml4KF9wcmVmaXgpOwotfQotCi12b2lk
IEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0Ci17Ci0gICAgbmFtZWRBdHRyTWFw
ID0gbmV3IE5hbWVkQXR0ck1hcChjb25zdF9jYXN0PEVsZW1lbnQqPih0aGlzKSk7Ci19Ci0KLWJv
b2wgRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotUmVuZGVyU3R5bGUgKkVsZW1lbnQ6OmNyZWF0ZVN0eWxlRm9y
UmVuZGVyZXIoUmVuZGVyT2JqZWN0ICpwYXJlbnRSZW5kZXJlcikKLXsKLSAgICByZXR1cm4gZ2V0
RG9jdW1lbnQoKS0+c3R5bGVTZWxlY3RvcigpLT5jcmVhdGVTdHlsZUZvckVsZW1lbnQodGhpcyk7
Ci19Ci0KLVJlbmRlck9iamVjdCAqRWxlbWVudDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEg
KmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgaWYgKGdldERvY3VtZW50KCktPmRv
Y3VtZW50RWxlbWVudCgpID09IHRoaXMgJiYgc3R5bGUtPmRpc3BsYXkoKSA9PSBOT05FKSB7Ci0g
ICAgICAgIC8vIElnbm9yZSBkaXNwbGF5OiBub25lIG9uIHJvb3QgZWxlbWVudHMuICBGb3JjZSBh
IGRpc3BsYXkgb2YgYmxvY2sgaW4gdGhhdCBjYXNlLgotICAgICAgICBSZW5kZXJCbG9jayogcmVz
dWx0ID0gbmV3IChhcmVuYSkgUmVuZGVyQmxvY2sodGhpcyk7Ci0gICAgICAgIGlmIChyZXN1bHQp
IHJlc3VsdC0+c2V0U3R5bGUoc3R5bGUpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0K
LSAgICByZXR1cm4gUmVuZGVyT2JqZWN0OjpjcmVhdGVPYmplY3QodGhpcywgc3R5bGUpOwotfQot
Ci0KLXZvaWQgRWxlbWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIC8vIG5lZWQg
dG8gZG8gc3VwZXJjbGFzcyBwcm9jZXNzaW5nIGZpcnN0IHNvIGluRG9jdW1lbnQoKSBpcyB0cnVl
Ci0gICAgLy8gYnkgdGhlIHRpbWUgd2UgcmVhY2ggdXBkYXRlSWQKLSAgICBDb250YWluZXJOb2Rl
OjppbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgaWYgKGhhc0lEKCkpIHsKLSAgICAgICAg
TmFtZWRBdHRyTWFwKiBhdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgICAgIGlmIChhdHRy
cykgewotICAgICAgICAgICAgQXR0cmlidXRlKiBpZEl0ZW0gPSBhdHRycy0+Z2V0QXR0cmlidXRl
SXRlbShpZEF0dHIpOwotICAgICAgICAgICAgaWYgKGlkSXRlbSAmJiAhaWRJdGVtLT5pc051bGwo
KSkKLSAgICAgICAgICAgICAgICB1cGRhdGVJZChudWxsQXRvbSwgaWRJdGVtLT52YWx1ZSgpKTsK
LSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50
KCkKLXsKLSAgICBpZiAoaGFzSUQoKSkgewotICAgICAgICBOYW1lZEF0dHJNYXAqIGF0dHJzID0g
YXR0cmlidXRlcyh0cnVlKTsKLSAgICAgICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgICAgICBBdHRy
aWJ1dGUqIGlkSXRlbSA9IGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0gICAgICAg
ICAgICBpZiAoaWRJdGVtICYmICFpZEl0ZW0tPmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIHVw
ZGF0ZUlkKGlkSXRlbS0+dmFsdWUoKSwgbnVsbEF0b20pOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgQ29udGFpbmVyTm9kZTo6cmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotfQotCi12b2lkIEVsZW1l
bnQ6OmF0dGFjaCgpCi17Ci0jaWYgU1BFRURfREVCVUcgPCAxCi0gICAgY3JlYXRlUmVuZGVyZXJJ
Zk5lZWRlZCgpOwotI2VuZGlmCi0gICAgQ29udGFpbmVyTm9kZTo6YXR0YWNoKCk7Ci19Ci0KLXZv
aWQgRWxlbWVudDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoYW5nZSApCi17Ci0gICAgLy8g
IyMjIHNob3VsZCBnbyBhd2F5IGFuZCBiZSBkb25lIGluIHJlbmRlcm9iamVjdAotICAgIFJlbmRl
clN0eWxlKiBfc3R5bGUgPSByZW5kZXJlcigpID8gcmVuZGVyZXIoKS0+c3R5bGUoKSA6IDA7Ci0g
ICAgYm9vbCBoYXNQYXJlbnRSZW5kZXJlciA9IHBhcmVudCgpID8gcGFyZW50KCktPnJlbmRlcmVy
KCkgOiBmYWxzZTsKLSAgICAKLSAgICBpZiAoIGhhc1BhcmVudFJlbmRlcmVyICYmIChjaGFuZ2Ug
Pj0gSW5oZXJpdCB8fCBjaGFuZ2VkKCkpICkgewotICAgICAgICBSZW5kZXJTdHlsZSAqbmV3U3R5
bGUgPSBnZXREb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmNyZWF0ZVN0eWxlRm9yRWxlbWVu
dCh0aGlzKTsKLSAgICAgICAgU3R5bGVDaGFuZ2UgY2ggPSBkaWZmKCBfc3R5bGUsIG5ld1N0eWxl
ICk7Ci0gICAgICAgIGlmIChjaCA9PSBEZXRhY2gpIHsKLSAgICAgICAgICAgIGlmIChhdHRhY2hl
ZCgpKSBkZXRhY2goKTsKLSAgICAgICAgICAgIC8vICMjIyBTdWJvcHRpbWFsLiBTdHlsZSBnZXRz
IGNhbGN1bGF0ZWQgYWdhaW4uCi0gICAgICAgICAgICBhdHRhY2goKTsKLSAgICAgICAgICAgIC8v
IGF0dGFjaCByZWNhbHVsYXRlcyB0aGUgc3R5bGUgZm9yIGFsbCBjaGlsZHJlbi4gTm8gbmVlZCB0
byBkbyBpdCB0d2ljZS4KLSAgICAgICAgICAgIHNldENoYW5nZWQoIGZhbHNlICk7Ci0gICAgICAg
ICAgICBzZXRIYXNDaGFuZ2VkQ2hpbGQoIGZhbHNlICk7Ci0gICAgICAgICAgICBuZXdTdHlsZS0+
ZGVyZWYoZ2V0RG9jdW1lbnQoKS0+cmVuZGVyQXJlbmEoKSk7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2ggIT0gTm9DaGFuZ2UpIHsKLSAgICAgICAg
ICAgIGlmIChyZW5kZXJlcigpICYmIG5ld1N0eWxlKQotICAgICAgICAgICAgICAgIHJlbmRlcmVy
KCktPnNldFN0eWxlKG5ld1N0eWxlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGFu
Z2VkKCkgJiYgcmVuZGVyZXIoKSAmJiBuZXdTdHlsZSAmJiAoZ2V0RG9jdW1lbnQoKS0+dXNlc1Np
YmxpbmdSdWxlcygpIHx8IGdldERvY3VtZW50KCktPnVzZXNEZXNjZW5kYW50UnVsZXMoKSkpIHsK
LSAgICAgICAgICAgIC8vIEFsdGhvdWdoIG5vIGNoYW5nZSBvY2N1cnJlZCwgd2UgdXNlIHRoZSBu
ZXcgc3R5bGUgc28gdGhhdCB0aGUgY291c2luIHN0eWxlIHNoYXJpbmcgY29kZSB3b24ndCBnZXQK
LSAgICAgICAgICAgIC8vIGZvb2xlZCBpbnRvIGJlbGlldmluZyB0aGlzIHN0eWxlIGlzIHRoZSBz
YW1lLiAgVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB0aGUgZG9jdW1lbnQgYWN0dWFsbHkgdXNl
cwotICAgICAgICAgICAgLy8gc2libGluZy9kZXNjZW5kYW50IHJ1bGVzLCBzaW5jZSBvdGhlcndp
c2UgaXQgaXNuJ3QgcG9zc2libGUgZm9yIGFuY2VzdG9yIHN0eWxlcyB0byBhZmZlY3Qgc2hhcmlu
ZyBvZgotICAgICAgICAgICAgLy8gZGVzY2VuZGFudHMuCi0gICAgICAgICAgICByZW5kZXJlcigp
LT5zZXRTdHlsZUludGVybmFsKG5ld1N0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5ld1N0
eWxlLT5kZXJlZihnZXREb2N1bWVudCgpLT5yZW5kZXJBcmVuYSgpKTsKLQotICAgICAgICBpZiAo
IGNoYW5nZSAhPSBGb3JjZSkgewotICAgICAgICAgICAgaWYgKGdldERvY3VtZW50KCktPnVzZXNE
ZXNjZW5kYW50UnVsZXMoKSkKLSAgICAgICAgICAgICAgICBjaGFuZ2UgPSBGb3JjZTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjaGFuZ2UgPSBjaDsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIGZvciAoTm9kZSAqbiA9IGZhc3RGaXJzdENoaWxkKCk7IG47IG4gPSBuLT5uZXh0
U2libGluZygpKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPj0gSW5oZXJpdCB8fCBuLT5pc1RleHRO
b2RlKCkgfHwgbi0+aGFzQ2hhbmdlZENoaWxkKCkgfHwgbi0+Y2hhbmdlZCgpKQotICAgICAgICAg
ICAgbi0+cmVjYWxjU3R5bGUoY2hhbmdlKTsKLSAgICB9Ci0KLSAgICBzZXRDaGFuZ2VkKCBmYWxz
ZSApOwotICAgIHNldEhhc0NoYW5nZWRDaGlsZCggZmFsc2UgKTsKLX0KLQotYm9vbCBFbGVtZW50
OjpjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlIHR5cGUpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7
Ci0gICAgICAgIGNhc2UgRUxFTUVOVF9OT0RFOgotICAgICAgICBjYXNlIFRFWFRfTk9ERToKLSAg
ICAgICAgY2FzZSBDT01NRU5UX05PREU6Ci0gICAgICAgIGNhc2UgUFJPQ0VTU0lOR19JTlNUUlVD
VElPTl9OT0RFOgotICAgICAgICBjYXNlIENEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgY2Fz
ZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpkaXNwYXRjaEF0dHJSZW1vdmFsRXZlbnQoQXR0
cmlidXRlKikKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0jaWYg
MAotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50OjpET01B
VFRSTU9ESUZJRURfTElTVEVORVIpKQotICAgICAgICByZXR1cm47Ci0gICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudChET01BdHRyTW9k
aWZpZWRFdmVudCwgdHJ1ZSwgZmFsc2UsIGF0dHIsIGF0dHItPnZhbHVlKCksCi0gICAgICAgIGF0
dHItPnZhbHVlKCksIGdldERvY3VtZW50KCktPmF0dHJOYW1lKGF0dHItPmlkKCkpLCBNdXRhdGlv
bkV2ZW50OjpSRU1PVkFMKSwgZWMpOwotI2VuZGlmCi19Ci0KLXZvaWQgRWxlbWVudDo6ZGlzcGF0
Y2hBdHRyQWRkaXRpb25FdmVudChBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgYXNzZXJ0KCFldmVu
dERpc3BhdGNoRm9yYmlkZGVuKCkpOwotI2lmIDAKLSAgICBpZiAoIWdldERvY3VtZW50KCktPmhh
c0xpc3RlbmVyVHlwZShEb2N1bWVudDo6RE9NQVRUUk1PRElGSUVEX0xJU1RFTkVSKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGRpc3BhdGNoRXZlbnQo
bmV3IE11dGF0aW9uRXZlbnQoRE9NQXR0ck1vZGlmaWVkRXZlbnQsIHRydWUsIGZhbHNlLCBhdHRy
LCBhdHRyLT52YWx1ZSgpLAotICAgICAgICBhdHRyLT52YWx1ZSgpLGdldERvY3VtZW50KCktPmF0
dHJOYW1lKGF0dHItPmlkKCkpLCBNdXRhdGlvbkV2ZW50OjpBRERJVElPTiksIGVjKTsKLSNlbmRp
ZgotfQotCi1TdHJpbmcgRWxlbWVudDo6b3BlblRhZ1N0YXJ0VG9TdHJpbmcoKSBjb25zdAotewot
ICAgIFN0cmluZyByZXN1bHQgPSAiPCIgKyBub2RlTmFtZSgpOwotCi0gICAgTmFtZWRBdHRyTWFw
ICphdHRyTWFwID0gYXR0cmlidXRlcyh0cnVlKTsKLQotICAgIGlmIChhdHRyTWFwKSB7Ci0gICAg
ICAgIHVuc2lnbmVkIG51bUF0dHJzID0gYXR0ck1hcC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBudW1BdHRyczsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQg
Kz0gIiAiOwotCi0gICAgICAgICAgICBBdHRyaWJ1dGUgKmF0dHJpYnV0ZSA9IGF0dHJNYXAtPmF0
dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICByZXN1bHQgKz0gYXR0cmlidXRlLT5uYW1lKCku
dG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmICghYXR0cmlidXRlLT52YWx1ZSgpLmlzTnVsbCgp
KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICI9XCIiOwotICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBzdWJzdGl0dXRlIGVudGl0aWVzIGZvciBhbnkgaW5zdGFuY2VzIG9mICIgb3IgJwot
ICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhdHRyaWJ1dGUtPnZhbHVlKCk7Ci0gICAgICAgICAg
ICAgICAgcmVzdWx0ICs9ICJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1TdHJpbmcgRWxlbWVudDo6dG9TdHJpbmcoKSBjb25z
dAotewotICAgIFN0cmluZyByZXN1bHQgPSBvcGVuVGFnU3RhcnRUb1N0cmluZygpOwotCi0gICAg
aWYgKGhhc0NoaWxkTm9kZXMoKSkgewotICAgICAgICByZXN1bHQgKz0gIj4iOwotCi0gICAgICAg
IGZvciAoTm9kZSAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0g
Y2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSBjaGlsZC0+dG9T
dHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCArPSAiPC8iOwotICAgICAgICBy
ZXN1bHQgKz0gbm9kZU5hbWUoKTsKLSAgICAgICAgcmVzdWx0ICs9ICI+IjsKLSAgICB9IGVsc2Ug
ewotICAgICAgICByZXN1bHQgKz0gIiAvPiI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQotdm9pZCBFbGVtZW50Ojp1cGRhdGVJZChjb25zdCBBdG9taWNTdHJpbmcmIG9sZElkLCBj
b25zdCBBdG9taWNTdHJpbmcmIG5ld0lkKQotewotICAgIGlmICghaW5Eb2N1bWVudCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBpZiAob2xkSWQgPT0gbmV3SWQpCi0gICAgICAgIHJldHVybjsK
LQotICAgIERvY3VtZW50KiBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGlmICghb2xkSWQuaXNF
bXB0eSgpKQotICAgICAgICBkb2MtPnJlbW92ZUVsZW1lbnRCeUlkKG9sZElkLCB0aGlzKTsKLSAg
ICBpZiAoIW5ld0lkLmlzRW1wdHkoKSkKLSAgICAgICAgZG9jLT5hZGRFbGVtZW50QnlJZChuZXdJ
ZCwgdGhpcyk7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIEVsZW1lbnQ6OmR1bXAoUVRleHRT
dHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRlZFN0cmluZyBpbmQpIGNvbnN0Ci17Ci0gICAgdXBkYXRl
U3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotICAgIGlmIChuYW1lZEF0dHJNYXApIHsKLSAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5hbWVkQXR0ck1hcC0+bGVuZ3RoKCk7IGkrKykg
ewotICAgICAgICAgICAgQXR0cmlidXRlICphdHRyID0gbmFtZWRBdHRyTWFwLT5hdHRyaWJ1dGVJ
dGVtKGkpOwotICAgICAgICAgICAgKnN0cmVhbSA8PCAiICIgPDwgYXR0ci0+bmFtZSgpLmxvY2Fs
TmFtZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpCi0gICAgICAgICAgICAgICAgICAgIDw8
ICI9XCIiIDw8IGF0dHItPnZhbHVlKCkuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCkgPDwgIlwi
IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENvbnRhaW5lck5vZGU6OmR1bXAoc3RyZWFtLGlu
ZCk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgRWxlbWVudDo6Zm9ybWF0Rm9y
RGVidWdnZXIoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgU3Ry
aW5nIHJlc3VsdDsKLSAgICBTdHJpbmcgczsKLSAgICAKLSAgICBzID0gbm9kZU5hbWUoKTsKLSAg
ICBpZiAocy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgcmVzdWx0ICs9IHM7Ci0gICAgfQotICAg
ICAgICAgIAotICAgIHMgPSBnZXRBdHRyaWJ1dGUoaWRBdHRyKTsKLSAgICBpZiAocy5sZW5ndGgo
KSA+IDApIHsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBy
ZXN1bHQgKz0gIjsgIjsKLSAgICAgICAgcmVzdWx0ICs9ICJpZD0iOwotICAgICAgICByZXN1bHQg
Kz0gczsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgcyA9IGdldEF0dHJpYnV0ZShjbGFzc0F0dHIp
OwotICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgp
ID4gMCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiOyAiOwotICAgICAgICByZXN1bHQgKz0gImNs
YXNzPSI7Ci0gICAgICAgIHJlc3VsdCArPSBzOwotICAgIH0KLSAgICAgICAgICAKLSAgICBzdHJu
Y3B5KGJ1ZmZlciwgcmVzdWx0LmRlcHJlY2F0ZWRTdHJpbmcoKS5sYXRpbjEoKSwgbGVuZ3RoIC0g
MSk7Ci19Ci0jZW5kaWYKLQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpzZXRBdHRyaWJ1dGVO
b2RlKEF0dHIgKmF0dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIEFTU0VSVChhdHRyKTsK
LSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRyPihhdHRyaWJ1dGVzKGZhbHNlKS0+
c2V0TmFtZWRJdGVtKGF0dHIsIGVjKSk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6
cmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyICphdHRyLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAg
ICBpZiAoIWF0dHIgfHwgYXR0ci0+b3duZXJFbGVtZW50KCkgIT0gdGhpcykgewotICAgICAgICBl
YyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoZ2V0
RG9jdW1lbnQoKSAhPSBhdHRyLT5nZXREb2N1bWVudCgpKSB7Ci0gICAgICAgIGVjID0gV1JPTkdf
RE9DVU1FTlRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBOYW1lZEF0dHJN
YXAgKmF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBpZiAoIWF0dHJzKQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9jYXN0PEF0dHI+KGF0dHJzLT5y
ZW1vdmVOYW1lZEl0ZW0oYXR0ci0+cXVhbGlmaWVkTmFtZSgpLCBlYykpOwotfQotCi12b2lkIEVs
ZW1lbnQ6OnNldEF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBT
dHJpbmcmIHF1YWxpZmllZE5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUm
IGVjKQotewotICAgIFN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKLSAgICBpZiAoIURvY3VtZW50
OjpwYXJzZVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUpKSB7
Ci0gICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIHNldEF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKHByZWZpeC5pbXBsKCksIGxvY2Fs
TmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0K
LQotdm9pZCBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lLCBFeGNl
cHRpb25Db2RlJiBlYykKLXsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1lbnQo
dGhpcykgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJlbW92ZUF0dHJpYnV0ZShRdWFsaWZp
ZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRvbSksIGVjKTsKLX0KLQot
dm9pZCBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVS
SSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIHJl
bW92ZUF0dHJpYnV0ZShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBu
YW1lc3BhY2VVUkkuaW1wbCgpKSwgZWMpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6
OmdldEF0dHJpYnV0ZU5vZGUoY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIE5hbWVkQXR0ck1h
cCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5h
bWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4o
YXR0cnMtPmdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1w
bCgpLCBudWxsQXRvbSkpKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpnZXRBdHRy
aWJ1dGVOb2RlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9j
YWxOYW1lKQotewotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwot
ICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzdGF0aWNfcG9p
bnRlcl9jYXN0PEF0dHI+KGF0dHJzLT5nZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRv
bSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpKTsKLX0KLQotYm9vbCBF
bGVtZW50OjpoYXNBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBuYW1lKSBjb25zdAotewotICAgIE5h
bWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9jdW1l
bnQodGhpcykgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJldHVybiBhdHRycy0+Z2V0QXR0
cmlidXRlSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxs
QXRvbSkpOwotfQotCi1ib29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYg
bmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3QKLXsKLSAgICBOYW1l
ZEF0dHJNYXAgKmF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICBpZiAoIWF0dHJzKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKFF1
YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBs
KCkpKTsKLX0KLQotQ1NTU3R5bGVEZWNsYXJhdGlvbiAqRWxlbWVudDo6c3R5bGUoKQotewotICAg
IHJldHVybiAwOwotfQotCi12b2lkIEVsZW1lbnQ6OmZvY3VzKCkKLXsKLSAgICBEb2N1bWVudCog
ZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBkb2MtPnVwZGF0ZUxheW91dCgpOwotICAgIGlmIChp
c0ZvY3VzYWJsZSgpKSB7Ci0gICAgICAgIGRvYy0+c2V0Rm9jdXNOb2RlKHRoaXMpOwotICAgICAg
ICBpZiAocm9vdEVkaXRhYmxlRWxlbWVudCgpID09IHRoaXMpIHsKLSAgICAgICAgICAgIC8vIEZJ
WE1FOiB3ZSBzaG91bGQgcmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHRoZXJlIGlz
IG9uZSwgaW5zdGVhZCBvZiBhbHdheXMgc2VsZWN0aW5nIGFsbC4KLSAgICAgICAgICAgIGlmIChk
b2MtPmZyYW1lKCktPnNlbGVjdENvbnRlbnRzT2ZOb2RlKHRoaXMpKQotICAgICAgICAgICAgICAg
IGRvYy0+ZnJhbWUoKS0+cmV2ZWFsU2VsZWN0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVu
ZGVyZXIoKSAmJiAhcmVuZGVyZXIoKS0+aXNXaWRnZXQoKSkKLSAgICAgICAgICAgIHJlbmRlcmVy
KCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoZ2V0UmVjdCgpKTsKLSAg
ICB9Ci19Ci0KLXZvaWQgRWxlbWVudDo6Ymx1cigpCi17Ci0gICAgRG9jdW1lbnQqIGRvYyA9IGdl
dERvY3VtZW50KCk7Ci0gICAgaWYgKGRvYy0+Zm9jdXNOb2RlKCkgPT0gdGhpcykKLSAgICAgICAg
ZG9jLT5zZXRGb2N1c05vZGUoMCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTmFtZWRB
dHRyTWFwOjpOYW1lZEF0dHJNYXAoRWxlbWVudCAqZSkKLSAgICA6IGVsZW1lbnQoZSkKLSAgICAs
IGF0dHJzKDApCi0gICAgLCBsZW4oMCkKLXsKLX0KLQotTmFtZWRBdHRyTWFwOjp+TmFtZWRBdHRy
TWFwKCkKLXsKLSAgICBOYW1lZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygpOyAvLyB2aXJ0dWFs
IG1ldGhvZCwgc28gcXVhbGlmeSBqdXN0IHRvIGJlIGV4cGxpY2l0Ci19Ci0KLWJvb2wgTmFtZWRB
dHRyTWFwOjppc01hcHBlZEF0dHJpYnV0ZU1hcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6Z2V0TmFtZWRJdGVtKGNvbnN0
IFN0cmluZyYgbmFtZSkgY29uc3QKLXsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gaW5IVE1MRG9j
dW1lbnQoZWxlbWVudCkgPyBuYW1lLmxvd2VyKCkgOiBuYW1lOwotICAgIHJldHVybiBnZXROYW1l
ZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbnVsbEF0b20p
KTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OmdldE5hbWVkSXRlbU5TKGNv
bnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0TmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2Fs
TmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpKTsKLX0KLQotUGFzc1JlZlB0cjxOb2Rl
PiBOYW1lZEF0dHJNYXA6OnJlbW92ZU5hbWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2Vw
dGlvbkNvZGUmIGVjKQotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudChl
bGVtZW50KSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIHJlbW92ZU5hbWVkSXRl
bShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRvbSksIGVj
KTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1lZEF0dHJNYXA6OnJlbW92ZU5hbWVkSXRlbU5T
KGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhj
ZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgcmV0dXJuIHJlbW92ZU5hbWVkSXRlbShRdWFsaWZpZWRO
YW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSwgZWMp
OwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6Z2V0TmFtZWRJdGVtKGNvbnN0
IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0Ci17Ci0gICAgQXR0cmlidXRlKiBhID0gZ2V0QXR0
cmlidXRlSXRlbShuYW1lKTsKLSAgICBpZiAoIWEpIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGEt
PmNyZWF0ZUF0dHJJZk5lZWRlZChlbGVtZW50KTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBOYW1l
ZEF0dHJNYXA6OnNldE5hbWVkSXRlbShOb2RlKiBhcmcsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewot
ICAgIGlmICghZWxlbWVudCkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAgICAg
IHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjog
UmFpc2VkIGlmIHRoaXMgbWFwIGlzIHJlYWRvbmx5LgotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsK
LSAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLQotICAgIC8vIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIGFyZyB3
YXMgY3JlYXRlZCBmcm9tIGEgZGlmZmVyZW50IGRvY3VtZW50IHRoYW4gdGhlIG9uZSB0aGF0IGNy
ZWF0ZWQgdGhpcyBtYXAuCi0gICAgaWYgKGFyZy0+Z2V0RG9jdW1lbnQoKSAhPSBlbGVtZW50LT5n
ZXREb2N1bWVudCgpKSB7Ci0gICAgICAgIGVjID0gV1JPTkdfRE9DVU1FTlRfRVJSOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOb3QgbWVudGlvbmVkIGluIHNwZWM6IHRocm93
IGEgSElFUkFSQ0hZX1JFUVVFU1RfRVJST1IgaWYgdGhlIHVzZXIgcGFzc2VzIGluIGEgbm9uLWF0
dHJpYnV0ZSBub2RlCi0gICAgaWYgKCFhcmctPmlzQXR0cmlidXRlTm9kZSgpKSB7Ci0gICAgICAg
IGVjID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0g
ICAgQXR0ciAqYXR0ciA9IHN0YXRpY19jYXN0PEF0dHIqPihhcmcpOwotCi0gICAgQXR0cmlidXRl
KiBhID0gYXR0ci0+YXR0cigpOwotICAgIEF0dHJpYnV0ZSogb2xkID0gZ2V0QXR0cmlidXRlSXRl
bShhLT5uYW1lKCkpOwotICAgIGlmIChvbGQgPT0gYSkKLSAgICAgICAgcmV0dXJuIFJlZlB0cjxO
b2RlPihhcmcpOyAvLyB3ZSBrbm93IGFib3V0IGl0IGFscmVhZHkKLQotICAgIC8vIElOVVNFX0FU
VFJJQlVURV9FUlI6IFJhaXNlZCBpZiBhcmcgaXMgYW4gQXR0ciB0aGF0IGlzIGFscmVhZHkgYW4g
YXR0cmlidXRlIG9mIGFub3RoZXIgRWxlbWVudCBvYmplY3QuCi0gICAgLy8gVGhlIERPTSB1c2Vy
IG11c3QgZXhwbGljaXRseSBjbG9uZSBBdHRyIG5vZGVzIHRvIHJlLXVzZSB0aGVtIGluIG90aGVy
IGVsZW1lbnRzLgotICAgIGlmIChhdHRyLT5vd25lckVsZW1lbnQoKSkgewotICAgICAgICBlYyA9
IElOVVNFX0FUVFJJQlVURV9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlm
IChhLT5uYW1lKCkgPT0gaWRBdHRyKQotICAgICAgICBlbGVtZW50LT51cGRhdGVJZChvbGQgPyBv
bGQtPnZhbHVlKCkgOiBudWxsQXRvbSwgYS0+dmFsdWUoKSk7Ci0KLSAgICAvLyAjIyMgc2xpZ2h0
bHkgaW5lZmZpY2llbnQgLSByZXNpemVzIGF0dHJpYnV0ZSBhcnJheSB0d2ljZS4KLSAgICBSZWZQ
dHI8Tm9kZT4gcjsKLSAgICBpZiAob2xkKSB7Ci0gICAgICAgIHIgPSBvbGQtPmNyZWF0ZUF0dHJJ
Zk5lZWRlZChlbGVtZW50KTsKLSAgICAgICAgcmVtb3ZlQXR0cmlidXRlKGEtPm5hbWUoKSk7Ci0g
ICAgfQotCi0gICAgYWRkQXR0cmlidXRlKGEpOwotICAgIHJldHVybiByLnJlbGVhc2UoKTsKLX0K
LQotLy8gVGhlIERPTTIgc3BlYyBkb2Vzbid0IHNheSB0aGF0IHJlbW92ZUF0dHJpYnV0ZVtOU10g
dGhyb3dzIE5PVF9GT1VORF9FUlIKLS8vIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kLCBi
dXQgYXQgdGhpcyBsZXZlbCB3ZSBoYXZlIHRvIHRocm93IE5PVF9GT1VORF9FUlIKLS8vIGJlY2F1
c2Ugb2YgcmVtb3ZlTmFtZWRJdGVtLCByZW1vdmVOYW1lZEl0ZW1OUywgYW5kIHJlbW92ZUF0dHJp
YnV0ZU5vZGUuCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVt
KGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIC8v
ICMjIyBzaG91bGQgdGhpcyByZWFsbHkgYmUgcmFpc2VkIHdoZW4gdGhlIGF0dHJpYnV0ZSB0byBy
ZW1vdmUgaXNuJ3QgdGhlcmUgYXQgYWxsPwotICAgIC8vIE5PX01PRElGSUNBVElPTl9BTExPV0VE
X0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkKLSAgICBpZiAoaXNSZWFkT25s
eSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBBdHRyaWJ1dGUqIGEgPSBnZXRBdHRyaWJ1dGVJdGVt
KG5hbWUpOwotICAgIGlmICghYSkgewotICAgICAgICBlYyA9IE5PVF9GT1VORF9FUlI7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIFJlZlB0cjxOb2RlPiByID0gYS0+Y3JlYXRlQXR0
cklmTmVlZGVkKGVsZW1lbnQpOwotCi0gICAgaWYgKG5hbWUgPT0gaWRBdHRyKQotICAgICAgICBl
bGVtZW50LT51cGRhdGVJZChhLT52YWx1ZSgpLCBudWxsQXRvbSk7Ci0KLSAgICByZW1vdmVBdHRy
aWJ1dGUobmFtZSk7Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPE5v
ZGU+IE5hbWVkQXR0ck1hcDo6aXRlbSAoIHVuc2lnbmVkIGluZGV4ICkgY29uc3QKLXsKLSAgICBp
ZiAoaW5kZXggPj0gbGVuKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBhdHRyc1tp
bmRleF0tPmNyZWF0ZUF0dHJJZk5lZWRlZChlbGVtZW50KTsKLX0KLQotQXR0cmlidXRlKiBOYW1l
ZEF0dHJNYXA6OmdldEF0dHJpYnV0ZUl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29u
c3QKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAg
aWYgKGF0dHJzW2ldLT5uYW1lKCkubWF0Y2hlcyhuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBh
dHRyc1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjpj
bGVhckF0dHJpYnV0ZXMoKQotewotICAgIGlmIChhdHRycykgewotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpXS0+bV9p
bXBsKQotICAgICAgICAgICAgICAgIGF0dHJzW2ldLT5tX2ltcGwtPm1fZWxlbWVudCA9IDA7Ci0g
ICAgICAgICAgICBhdHRyc1tpXS0+ZGVyZWYoKTsKLSAgICAgICAgfQotICAgICAgICBmYXN0RnJl
ZShhdHRycyk7Ci0gICAgICAgIGF0dHJzID0gMDsKLSAgICB9Ci0gICAgbGVuID0gMDsKLX0KLQot
dm9pZCBOYW1lZEF0dHJNYXA6OmRldGFjaEZyb21FbGVtZW50KCkKLXsKLSAgICAvLyB3ZSBhbGxv
dyBhIE5hbWVkQXR0ck1hcCB3L28gYW4gZWxlbWVudCBpbiBjYXNlIHNvbWVvbmUgc3RpbGwgaGFz
IGEgcmVmZXJlbmNlCi0gICAgLy8gdG8gaWYgYWZ0ZXIgdGhlIGVsZW1lbnQgZ2V0cyBkZWxldGVk
IC0gYnV0IHRoZSBtYXAgaXMgbm93IGludmFsaWQKLSAgICBlbGVtZW50ID0gMDsKLSAgICBjbGVh
ckF0dHJpYnV0ZXMoKTsKLX0KLQotTmFtZWRBdHRyTWFwJiBOYW1lZEF0dHJNYXA6Om9wZXJhdG9y
PShjb25zdCBOYW1lZEF0dHJNYXAmIG90aGVyKQotewotICAgIC8vIGNsb25lIGFsbCBhdHRyaWJ1
dGVzIGluIHRoZSBvdGhlciBtYXAsIGJ1dCBhdHRhY2ggdG8gb3VyIGVsZW1lbnQKLSAgICBpZiAo
IWVsZW1lbnQpCi0gICAgICAgIHJldHVybiAqdGhpczsKLQotICAgIC8vIElmIGFzc2lnbmluZyB0
aGUgbWFwIGNoYW5nZXMgdGhlIGlkIGF0dHJpYnV0ZSwgd2UgbmVlZCB0byBjYWxsCi0gICAgLy8g
dXBkYXRlSWQuCi0KLSAgICBBdHRyaWJ1dGUgKm9sZElkID0gZ2V0QXR0cmlidXRlSXRlbShpZEF0
dHIpOwotICAgIEF0dHJpYnV0ZSAqbmV3SWQgPSBvdGhlci5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0
cik7Ci0KLSAgICBpZiAob2xkSWQgfHwgbmV3SWQpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlk
KG9sZElkID8gb2xkSWQtPnZhbHVlKCkgOiBudWxsQXRvbSwgbmV3SWQgPyBuZXdJZC0+dmFsdWUo
KSA6IG51bGxBdG9tKTsKLQotICAgIGNsZWFyQXR0cmlidXRlcygpOwotICAgIGxlbiA9IG90aGVy
LmxlbjsKLSAgICBhdHRycyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZSAqKj4oZmFzdE1hbGxvYyhs
ZW4gKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0KLSAgICAvLyBmaXJzdCBpbml0aWFsaXplIGF0
dHJzIHZlY3RvciwgdGhlbiBjYWxsIGF0dHJpYnV0ZUNoYW5nZWQgb24gaXQKLSAgICAvLyB0aGlz
IGFsbG93cyBhdHRyaWJ1dGVDaGFuZ2VkIHRvIHVzZSBnZXRBdHRyaWJ1dGUKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgYXR0cnNbaV0gPSBvdGhlci5h
dHRyc1tpXS0+Y2xvbmUoKTsKLSAgICAgICAgYXR0cnNbaV0tPnJlZigpOwotICAgIH0KLQotICAg
IC8vIEZJWE1FOiBUaGlzIGlzIHdhc3RlZnVsLiAgVGhlIGNsYXNzIGxpc3QgY291bGQgYmUgcHJl
c2VydmVkIG9uIGEgY29weSwgYW5kIHdlCi0gICAgLy8gd291bGRuJ3QgaGF2ZSB0byB3YXN0ZSB0
aW1lIHJlcGFyc2luZyB0aGUgYXR0cmlidXRlLgotICAgIC8vIFRoZSBkZXJpdmVkIGNsYXNzLCBI
VE1MTmFtZWRBdHRyTWFwLCB3aGljaCBtYW5hZ2VzIGEgcGFyc2VkIGNsYXNzIGxpc3QgZm9yIHRo
ZSBDTEFTUyBhdHRyaWJ1dGUsCi0gICAgLy8gd2lsbCB1cGRhdGUgaXRzIG1lbWJlciB2YXJpYWJs
ZSB3aGVuIHBhcnNlIGF0dHJpYnV0ZSBpcyBjYWxsZWQuCi0gICAgZm9yKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbGVuOyBpKyspCi0gICAgICAgIGVsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQoYXR0cnNb
aV0sIHRydWUpOwotCi0gICAgcmV0dXJuICp0aGlzOwotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6
YWRkQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cmlidXRlKQotewotICAgIC8vIEFkZCB0aGUgYXR0
cmlidXRlIHRvIHRoZSBsaXN0Ci0gICAgQXR0cmlidXRlICoqbmV3QXR0cnMgPSBzdGF0aWNfY2Fz
dDxBdHRyaWJ1dGUgKio+KGZhc3RNYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKEF0dHJpYnV0ZSAq
KSkpOwotICAgIGlmIChhdHRycykgewotICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxl
bjsgaSsrKQotICAgICAgICBuZXdBdHRyc1tpXSA9IGF0dHJzW2ldOwotICAgICAgZmFzdEZyZWUo
YXR0cnMpOwotICAgIH0KLSAgICBhdHRycyA9IG5ld0F0dHJzOwotICAgIGF0dHJzW2xlbisrXSA9
IGF0dHJpYnV0ZTsKLSAgICBhdHRyaWJ1dGUtPnJlZigpOwotCi0gICAgQXR0ciAqIGNvbnN0IGF0
dHIgPSBhdHRyaWJ1dGUtPm1faW1wbDsKLSAgICBpZiAoYXR0cikKLSAgICAgICAgYXR0ci0+bV9l
bGVtZW50ID0gZWxlbWVudDsKLQotICAgIC8vIE5vdGlmeSB0aGUgZWxlbWVudCB0aGF0IHRoZSBh
dHRyaWJ1dGUgaGFzIGJlZW4gYWRkZWQsIGFuZCBkaXNwYXRjaCBhcHByb3ByaWF0ZSBtdXRhdGlv
biBldmVudHMKLSAgICAvLyBOb3RlIHRoYXQgZWxlbWVudCBtYXkgYmUgbnVsbCBoZXJlIGlmIHdl
IGFyZSBjYWxsZWQgZnJvbSBpbnNlcnRBdHRyKCkgZHVyaW5nIHBhcnNpbmcKLSAgICBpZiAoZWxl
bWVudCkgewotICAgICAgICBSZWZQdHI8QXR0cmlidXRlPiBhID0gYXR0cmlidXRlOwotICAgICAg
ICBlbGVtZW50LT5hdHRyaWJ1dGVDaGFuZ2VkKGEuZ2V0KCkpOwotICAgICAgICAvLyBCZWNhdXNl
IG9mIG91ciB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCkgc3R5bGUgbW9kaWZpY2F0aW9u
IGV2ZW50cyBhcmUgbmV2ZXIgc2VudCBhdCB0aGUgcmlnaHQgdGltZSwgc28gZG9uJ3QgYm90aGVy
IHNlbmRpbmcgdGhlbS4KLSAgICAgICAgaWYgKGEtPm5hbWUoKSAhPSBzdHlsZUF0dHIpIHsKLSAg
ICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoQXR0ckFkZGl0aW9uRXZlbnQoYS5nZXQoKSk7Ci0g
ICAgICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KGZhbHNlKTsK
LSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBOYW1lZEF0dHJNYXA6OnJlbW92ZUF0dHJpYnV0
ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKQotewotICAgIHVuc2lnbmVkIGluZGV4ID0gbGVu
KzE7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgKytpKQotICAgICAgICBpZiAo
YXR0cnNbaV0tPm5hbWUoKS5tYXRjaGVzKG5hbWUpKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgaWYgKGluZGV4ID49IGxlbikg
cmV0dXJuOwotCi0gICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdAotICAg
IEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJzW2luZGV4XTsKLSAgICBpZiAoYXR0cnNbaW5kZXhdLT5t
X2ltcGwpCi0gICAgICAgIGF0dHJzW2luZGV4XS0+bV9pbXBsLT5tX2VsZW1lbnQgPSAwOwotICAg
IGlmIChsZW4gPT0gMSkgewotICAgICAgICBmYXN0RnJlZShhdHRycyk7Ci0gICAgICAgIGF0dHJz
ID0gMDsKLSAgICAgICAgbGVuID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBBdHRyaWJ1dGUg
KipuZXdBdHRycyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZSAqKj4oZmFzdE1hbGxvYygobGVuIC0g
MSkgKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0gICAgICAgIHVuc2lnbmVkIGk7Ci0gICAgICAg
IGZvciAoaSA9IDA7IGkgPCB1bnNpZ25lZChpbmRleCk7IGkrKykKLSAgICAgICAgICAgIG5ld0F0
dHJzW2ldID0gYXR0cnNbaV07Ci0gICAgICAgIGxlbi0tOwotICAgICAgICBmb3IgKDsgaSA8IGxl
bjsgaSsrKQotICAgICAgICAgICAgbmV3QXR0cnNbaV0gPSBhdHRyc1tpKzFdOwotICAgICAgICBm
YXN0RnJlZShhdHRycyk7Ci0gICAgICAgIGF0dHJzID0gbmV3QXR0cnM7Ci0gICAgfQotCi0gICAg
Ly8gTm90aWZ5IHRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVk
Ci0gICAgLy8gZGlzcGF0Y2ggYXBwcm9wcmlhdGUgbXV0YXRpb24gZXZlbnRzCi0gICAgaWYgKGVs
ZW1lbnQgJiYgIWF0dHItPm1fdmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAgQXRvbWljU3RyaW5n
IHZhbHVlID0gYXR0ci0+bV92YWx1ZTsKLSAgICAgICAgYXR0ci0+bV92YWx1ZSA9IG51bGxBdG9t
OwotICAgICAgICBlbGVtZW50LT5hdHRyaWJ1dGVDaGFuZ2VkKGF0dHIpOwotICAgICAgICBhdHRy
LT5tX3ZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgIGVs
ZW1lbnQtPmRpc3BhdGNoQXR0clJlbW92YWxFdmVudChhdHRyKTsKLSAgICAgICAgZWxlbWVudC0+
ZGlzcGF0Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudChmYWxzZSk7Ci0gICAgfQotICAgIGF0dHItPmRl
cmVmKCk7Ci19Ci0KLWJvb2wgTmFtZWRBdHRyTWFwOjptYXBzRXF1aXZhbGVudChjb25zdCBOYW1l
ZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdAotewotICAgIGlmICghb3RoZXJNYXApCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobGVuZ3RoKCkgIT0gb3RoZXJNYXAtPmxlbmd0
aCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgQXR0cmlidXRlICphdHRyID0gYXR0cmli
dXRlSXRlbShpKTsKLSAgICAgICAgQXR0cmlidXRlICpvdGhlckF0dHIgPSBvdGhlck1hcC0+Z2V0
QXR0cmlidXRlSXRlbShhdHRyLT5uYW1lKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIGlmICgh
b3RoZXJBdHRyIHx8IGF0dHItPnZhbHVlKCkgIT0gb3RoZXJBdHRyLT52YWx1ZSgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdHlsZWQgRWxlbWVudCBhbmQgTWFw
cGVkIEF0dHJpYnV0ZSBJbXBsZW1lbnRhdGlvbgotCiBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbjo6fkNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkKIHsKICAgICBpZiAobV9lbnRy
eVR5cGUgIT0gZVBlcnNpc3RlbnQpCiAgICAgICAgIFN0eWxlZEVsZW1lbnQ6OnJlbW92ZU1hcHBl
ZEF0dHJpYnV0ZURlY2wobV9lbnRyeVR5cGUsIG1fYXR0ck5hbWUsIG1fYXR0clZhbHVlKTsKIH0K
IAotQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIFN0eWxlZEVsZW1lbnQ6OmdldE1hcHBl
ZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgZW50cnlUeXBlLCBBdHRyaWJ1dGUq
IGF0dHIpCi17Ci0gICAgaWYgKCFtYXBwZWRBdHRyaWJ1dGVEZWNscykKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgcmV0dXJuIG1hcHBlZEF0dHJpYnV0ZURlY2xzLT5nZXQoTWFwcGVkQXR0cmlidXRl
S2V5KGVudHJ5VHlwZSwgYXR0ci0+bmFtZSgpLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0ci0+dmFs
dWUoKS5pbXBsKCkpKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpzZXRNYXBwZWRBdHRyaWJ1
dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5VHlwZSwgQXR0cmlidXRlKiBhdHRyLCBD
U1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCkKLXsKLSAgICBpZiAoIW1hcHBlZEF0
dHJpYnV0ZURlY2xzKQotICAgICAgICBtYXBwZWRBdHRyaWJ1dGVEZWNscyA9IG5ldyBNYXBwZWRB
dHRyaWJ1dGVEZWNsczsKLSAgICBtYXBwZWRBdHRyaWJ1dGVEZWNscy0+c2V0KE1hcHBlZEF0dHJp
YnV0ZUtleShlbnRyeVR5cGUsIGF0dHItPm5hbWUoKS5sb2NhbE5hbWUoKS5pbXBsKCksIGF0dHIt
PnZhbHVlKCkuaW1wbCgpKSwgZGVjbCk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6cmVtb3Zl
TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFF1YWxp
ZmllZE5hbWUmIGF0dHJOYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIGF0dHJWYWx1ZSkKLXsKLSAg
ICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAgICAgICByZXR1cm47Ci0gICAgbWFwcGVk
QXR0cmlidXRlRGVjbHMtPnJlbW92ZShNYXBwZWRBdHRyaWJ1dGVLZXkoZW50cnlUeXBlLCBhdHRy
TmFtZS5sb2NhbE5hbWUoKS5pbXBsKCksIGF0dHJWYWx1ZS5pbXBsKCkpKTsKLX0KLQotdm9pZCBT
dHlsZWRFbGVtZW50OjppbnZhbGlkYXRlU3R5bGVBdHRyaWJ1dGUoKQotewotICAgIG1faXNTdHls
ZUF0dHJpYnV0ZVZhbGlkID0gZmFsc2U7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6dXBkYXRl
U3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2lzU3R5bGVBdHRy
aWJ1dGVWYWxpZCkgewotICAgICAgICBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxpZCA9IHRydWU7Ci0g
ICAgICAgIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgaWYg
KG1faW5saW5lU3R5bGVEZWNsKQotICAgICAgICAgICAgY29uc3RfY2FzdDxTdHlsZWRFbGVtZW50
Kj4odGhpcyktPnNldEF0dHJpYnV0ZShzdHlsZUF0dHIsIG1faW5saW5lU3R5bGVEZWNsLT5jc3NU
ZXh0KCkpOwotICAgICAgICBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwot
ICAgIH0KLX0KLQotQXR0cmlidXRlKiBNYXBwZWRBdHRyaWJ1dGU6OmNsb25lKGJvb2wgcHJlc2Vy
dmVEZWNsKSBjb25zdAotewotICAgIHJldHVybiBuZXcgTWFwcGVkQXR0cmlidXRlKG5hbWUoKSwg
dmFsdWUoKSwgcHJlc2VydmVEZWNsID8gbV9zdHlsZURlY2wuZ2V0KCkgOiAwKTsKLX0KLQotTmFt
ZWRNYXBwZWRBdHRyTWFwOjpOYW1lZE1hcHBlZEF0dHJNYXAoRWxlbWVudCAqZSkKLTpOYW1lZEF0
dHJNYXAoZSksIG1fbWFwcGVkQXR0cmlidXRlQ291bnQoMCkKLXt9Ci0KLXZvaWQgTmFtZWRNYXBw
ZWRBdHRyTWFwOjpjbGVhckF0dHJpYnV0ZXMoKQotewotICAgIG1fY2xhc3NMaXN0LmNsZWFyKCk7
Ci0gICAgbV9tYXBwZWRBdHRyaWJ1dGVDb3VudCA9IDA7Ci0gICAgTmFtZWRBdHRyTWFwOjpjbGVh
ckF0dHJpYnV0ZXMoKTsKLX0KLQotYm9vbCBOYW1lZE1hcHBlZEF0dHJNYXA6OmlzTWFwcGVkQXR0
cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IE5hbWVkTWFw
cGVkQXR0ck1hcDo6ZGVjbENvdW50KCkgY29uc3QKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoKCk7IGkrKykgewotICAgICAgICBNYXBw
ZWRBdHRyaWJ1dGUqIGF0dHIgPSBhdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICBpZiAoYXR0ci0+
ZGVjbCgpKQotICAgICAgICAgICAgcmVzdWx0Kys7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLWJvb2wgTmFtZWRNYXBwZWRBdHRyTWFwOjptYXBzRXF1aXZhbGVudChjb25zdCBOYW1l
ZE1hcHBlZEF0dHJNYXAqIG90aGVyTWFwKSBjb25zdAotewotICAgIC8vIFRoZSAjIG9mIGRlY2xz
IG11c3QgbWF0Y2guCi0gICAgaWYgKGRlY2xDb3VudCgpICE9IG90aGVyTWFwLT5kZWNsQ291bnQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIC8vIFRoZSB2YWx1ZXMgZm9yIGVh
Y2ggZGVjbCBtdXN0IG1hdGNoLgotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGgo
KTsgaSsrKSB7Ci0gICAgICAgIE1hcHBlZEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJpYnV0ZUl0ZW0o
aSk7Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSog
b3RoZXJBdHRyID0gb3RoZXJNYXAtPmdldEF0dHJpYnV0ZUl0ZW0oYXR0ci0+bmFtZSgpKTsKLSAg
ICAgICAgICAgIGlmICghb3RoZXJBdHRyIHx8IChhdHRyLT52YWx1ZSgpICE9IG90aGVyQXR0ci0+
dmFsdWUoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUgc3RhdGljIGJvb2wgaXNDbGFzc1doaXRl
c3BhY2UoUUNoYXIgYykKLXsKLSAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHInIHx8IGMg
PT0gJ1xuJyB8fCBjID09ICdcdCc7Ci19Ci0KLXZvaWQgTmFtZWRNYXBwZWRBdHRyTWFwOjpwYXJz
ZUNsYXNzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgY2xhc3NTdHIpCi17Ci0gICAgbV9jbGFzc0xp
c3QuY2xlYXIoKTsKLSAgICBpZiAoIWVsZW1lbnQtPmhhc0NsYXNzKCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBTdHJpbmcgY2xhc3NBdHRyID0gZWxlbWVudC0+Z2V0RG9jdW1lbnQoKS0+
aW5Db21wYXRNb2RlKCkgPyAKLSAgICAgICAgKGNsYXNzU3RyLmltcGwoKS0+aXNMb3dlcigpID8g
Y2xhc3NTdHIgOiBTdHJpbmcoY2xhc3NTdHIuaW1wbCgpLT5sb3dlcigpKSkgOgotICAgICAgICBj
bGFzc1N0cjsKLSAgICAKLSAgICBBdG9taWNTdHJpbmdMaXN0KiBjdXJyID0gMDsKLSAgICAKLSAg
ICBjb25zdCBRQ2hhciogc3RyID0gY2xhc3NBdHRyLnVuaWNvZGUoKTsKLSAgICBpbnQgbGVuZ3Ro
ID0gY2xhc3NBdHRyLmxlbmd0aCgpOwotICAgIGludCBzUG9zID0gMDsKLQotICAgIHdoaWxlICh0
cnVlKSB7Ci0gICAgICAgIHdoaWxlIChzUG9zIDwgbGVuZ3RoICYmIGlzQ2xhc3NXaGl0ZXNwYWNl
KHN0cltzUG9zXSkpCi0gICAgICAgICAgICArK3NQb3M7Ci0gICAgICAgIGlmIChzUG9zID49IGxl
bmd0aCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpbnQgZVBvcyA9IHNQb3MgKyAxOwot
ICAgICAgICB3aGlsZSAoZVBvcyA8IGxlbmd0aCAmJiAhaXNDbGFzc1doaXRlc3BhY2Uoc3RyW2VQ
b3NdKSkKLSAgICAgICAgICAgICsrZVBvczsKLSAgICAgICAgaWYgKGN1cnIpIHsKLSAgICAgICAg
ICAgIGN1cnItPnNldE5leHQobmV3IEF0b21pY1N0cmluZ0xpc3QoQXRvbWljU3RyaW5nKHN0ciAr
IHNQb3MsIGVQb3MgLSBzUG9zKSkpOwotICAgICAgICAgICAgY3VyciA9IGN1cnItPm5leHQoKTsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzUG9zID09IDAgJiYgZVBvcyA9PSBs
ZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBtX2NsYXNzTGlzdC5zZXRTdHJpbmcoQXRvbWljU3Ry
aW5nKGNsYXNzQXR0cikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgbV9jbGFzc0xpc3Quc2V0U3RyaW5nKEF0b21pY1N0cmluZyhzdHIgKyBzUG9z
LCBlUG9zIC0gc1BvcykpOwotICAgICAgICAgICAgY3VyciA9ICZtX2NsYXNzTGlzdDsKLSAgICAg
ICAgfQotICAgICAgICBzUG9zID0gZVBvcyArIDE7Ci0gICAgfQotfQotCi1TdHlsZWRFbGVtZW50
OjpTdHlsZWRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIERvY3VtZW50ICpkb2Mp
Ci0gICAgOiBFbGVtZW50KG5hbWUsIGRvYykKLXsKLSAgICBtX2lzU3R5bGVBdHRyaWJ1dGVWYWxp
ZCA9IHRydWU7Ci0gICAgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUgPSBmYWxzZTsKLX0K
LQotU3R5bGVkRWxlbWVudDo6flN0eWxlZEVsZW1lbnQoKQotewotICAgIGRlc3Ryb3lJbmxpbmVT
dHlsZURlY2woKTsKLX0KLQotQXR0cmlidXRlKiBTdHlsZWRFbGVtZW50OjpjcmVhdGVBdHRyaWJ1
dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpCi17Ci0gICAg
cmV0dXJuIG5ldyBNYXBwZWRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotfQotCi12b2lkIFN0eWxl
ZEVsZW1lbnQ6OmNyZWF0ZUlubGluZVN0eWxlRGVjbCgpCi17Ci0gICAgbV9pbmxpbmVTdHlsZURl
Y2wgPSBuZXcgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb247Ci0gICAgbV9pbmxpbmVTdHlsZURl
Y2wtPnNldFBhcmVudChnZXREb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgbV9pbmxp
bmVTdHlsZURlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldFN0
cmljdFBhcnNpbmcoIWdldERvY3VtZW50KCktPmluQ29tcGF0TW9kZSgpKTsKLX0KLQotdm9pZCBT
dHlsZWRFbGVtZW50OjpkZXN0cm95SW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBpZiAobV9pbmxp
bmVTdHlsZURlY2wpIHsKLSAgICAgICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldE5vZGUoMCk7Ci0g
ICAgICAgIG1faW5saW5lU3R5bGVEZWNsLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIG1faW5saW5l
U3R5bGVEZWNsID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YXR0cmlidXRl
Q2hhbmdlZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscykKLXsKLSAgICBNYXBw
ZWRBdHRyaWJ1dGUqIG1hcHBlZEF0dHIgPSBzdGF0aWNfY2FzdDxNYXBwZWRBdHRyaWJ1dGUqPihh
dHRyKTsKLSAgICBpZiAobWFwcGVkQXR0ci0+ZGVjbCgpICYmICFwcmVzZXJ2ZURlY2xzKSB7Ci0g
ICAgICAgIG1hcHBlZEF0dHItPnNldERlY2woMCk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAg
ICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+
ZGVjbFJlbW92ZWQoKTsKLSAgICB9Ci0KLSAgICBib29sIGNoZWNrRGVjbCA9IHRydWU7Ci0gICAg
TWFwcGVkQXR0cmlidXRlRW50cnkgZW50cnk7Ci0gICAgYm9vbCBuZWVkVG9QYXJzZSA9IG1hcFRv
RW50cnkoYXR0ci0+bmFtZSgpLCBlbnRyeSk7Ci0gICAgaWYgKHByZXNlcnZlRGVjbHMpIHsKLSAg
ICAgICAgaWYgKG1hcHBlZEF0dHItPmRlY2woKSkgewotICAgICAgICAgICAgc2V0Q2hhbmdlZCgp
OwotICAgICAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgICAgICAgICBtYXBwZWRB
dHRyaWJ1dGVzKCktPmRlY2xBZGRlZCgpOwotICAgICAgICAgICAgY2hlY2tEZWNsID0gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIWF0dHItPmlzTnVsbCgpICYmIGVudHJ5
ICE9IGVOb25lKSB7Ci0gICAgICAgIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNs
ID0gZ2V0TWFwcGVkQXR0cmlidXRlRGVjbChlbnRyeSwgYXR0cik7Ci0gICAgICAgIGlmIChkZWNs
KSB7Ci0gICAgICAgICAgICBtYXBwZWRBdHRyLT5zZXREZWNsKGRlY2wpOwotICAgICAgICAgICAg
c2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgICAg
ICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPmRlY2xBZGRlZCgpOwotICAgICAgICAgICAgY2hlY2tE
ZWNsID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbmVlZFRvUGFyc2UgPSB0
cnVlOwotICAgIH0KLQotICAgIGlmIChuZWVkVG9QYXJzZSkKLSAgICAgICAgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUobWFwcGVkQXR0cik7Ci0gICAgCi0gICAgaWYgKGNoZWNrRGVjbCAmJiBtYXBwZWRB
dHRyLT5kZWNsKCkpIHsKLSAgICAgICAgLy8gQWRkIHRoZSBkZWNsIHRvIHRoZSB0YWJsZSBpbiB0
aGUgYXBwcm9wcmlhdGUgc3BvdC4KLSAgICAgICAgc2V0TWFwcGVkQXR0cmlidXRlRGVjbChlbnRy
eSwgYXR0ciwgbWFwcGVkQXR0ci0+ZGVjbCgpKTsKLSAgICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgp
LT5zZXRNYXBwZWRTdGF0ZShlbnRyeSwgYXR0ci0+bmFtZSgpLCBhdHRyLT52YWx1ZSgpKTsKLSAg
ICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgpLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIG1hcHBlZEF0
dHItPmRlY2woKS0+c2V0Tm9kZSgwKTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAg
ICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgfQotfQotCi1ib29s
IFN0eWxlZEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUs
IE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgcmVzdWx0ID0gZU5v
bmU7Ci0gICAgaWYgKGF0dHJOYW1lID09IHN0eWxlQXR0cikKLSAgICAgICAgcmV0dXJuICFtX3N5
bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBT
dHlsZWRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIp
Ci17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBpZEF0dHIpIHsKLSAgICAgICAgLy8gdW5pcXVl
IGlkCi0gICAgICAgIHNldEhhc0lEKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAgIGlmIChuYW1l
ZEF0dHJNYXApIHsKLSAgICAgICAgICAgIGlmIChhdHRyLT5pc051bGwoKSkKLSAgICAgICAgICAg
ICAgICBuYW1lZEF0dHJNYXAtPnNldElEKG51bGxBdG9tKTsKLSAgICAgICAgICAgIGVsc2UgaWYg
KGdldERvY3VtZW50KCktPmluQ29tcGF0TW9kZSgpICYmICFhdHRyLT52YWx1ZSgpLmltcGwoKS0+
aXNMb3dlcigpKQotICAgICAgICAgICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQoQXRvbWljU3Ry
aW5nKGF0dHItPnZhbHVlKCkuZG9tU3RyaW5nKCkubG93ZXIoKSkpOwotICAgICAgICAgICAgZWxz
ZQotICAgICAgICAgICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQoYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGNsYXNzQXR0cikgewotICAgICAgICAvLyBjbGFzcwotICAgICAgICBzZXRIYXNDbGFz
cyghYXR0ci0+aXNOdWxsKCkpOwotICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAg
ICAgbWFwcGVkQXR0cmlidXRlcygpLT5wYXJzZUNsYXNzQXR0cmlidXRlKGF0dHItPnZhbHVlKCkp
OwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
c3R5bGVBdHRyKSB7Ci0gICAgICAgIHNldEhhc1N0eWxlKCFhdHRyLT5pc051bGwoKSk7Ci0gICAg
ICAgIGlmIChhdHRyLT5pc051bGwoKSkKLSAgICAgICAgICAgIGRlc3Ryb3lJbmxpbmVTdHlsZURl
Y2woKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2V0SW5saW5lU3R5bGVEZWNsKCktPnBh
cnNlRGVjbGFyYXRpb24oYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIG1faXNTdHlsZUF0dHJpYnV0
ZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgIH0KLX0KLQotdm9pZCBT
dHlsZWRFbGVtZW50OjpjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIG5hbWVkQXR0
ck1hcCA9IG5ldyBOYW1lZE1hcHBlZEF0dHJNYXAoY29uc3RfY2FzdDxTdHlsZWRFbGVtZW50Kj4o
dGhpcykpOwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6
Z2V0SW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBpZiAoIW1faW5saW5lU3R5bGVEZWNsKQotICAg
ICAgICBjcmVhdGVJbmxpbmVTdHlsZURlY2woKTsKLSAgICByZXR1cm4gbV9pbmxpbmVTdHlsZURl
Y2wuZ2V0KCk7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb24qIFN0eWxlZEVsZW1lbnQ6OnN0eWxl
KCkKLXsKLSAgICByZXR1cm4gZ2V0SW5saW5lU3R5bGVEZWNsKCk7Ci19Ci0KLUNTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50OjphZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVE
ZWNsKCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nTGlzdCogU3R5
bGVkRWxlbWVudDo6Z2V0Q2xhc3NMaXN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZWRBdHRy
TWFwID8gbWFwcGVkQXR0cmlidXRlcygpLT5nZXRDbGFzc0xpc3QoKSA6IDA7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgYm9vbCBpc0hleERpZ2l0KCBjb25zdCBRQ2hhciAmYyApIHsKLSAgICByZXR1cm4g
KCBjID49ICcwJyAmJiBjIDw9ICc5JyApIHx8Ci0gICAgICAgICAgICggYyA+PSAnYScgJiYgYyA8
PSAnZicgKSB8fAotICAgICAgICAgICAoIGMgPj0gJ0EnICYmIGMgPD0gJ0YnICk7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgaW50IHRvSGV4KCBjb25zdCBRQ2hhciAmYyApIHsKLSAgICByZXR1cm4gKCAo
YyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICAgPyAoYy51bmljb2RlKCkgLSAnMCcp
Ci0gICAgICAgICAgICAgOiAoICggYyA+PSAnYScgJiYgYyA8PSAnZicgKQotICAgICAgICAgICAg
ICAgICA/IChjLnVuaWNvZGUoKSAtICdhJyArIDEwKQotICAgICAgICAgICAgICAgICA6ICggKCBj
ID49ICdBJyAmJiBjIDw9ICdGJyApCi0gICAgICAgICAgICAgICAgICAgICA/IChjLnVuaWNvZGUo
KSAtICdBJyArIDEwKQotICAgICAgICAgICAgICAgICAgICAgOiAtMSApICkgKTsKLX0KLQotdm9p
ZCBTdHlsZWRFbGVtZW50OjphZGRDU1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGlu
dCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3Jl
YXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCB2
YWx1ZSwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU1Byb3BlcnR5KE1h
cHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBpbnQgdmFsdWUpCi17Ci0gICAgaWYgKCFhdHRy
LT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRQ
cm9wZXJ0eShpZCwgdmFsdWUsIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRD
U1NTdHJpbmdQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3Ry
aW5nICZ2YWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWU6OlVuaXRUeXBlcyB0eXBlKQotewotICAgIGlm
ICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0dHItPmRlY2wo
KS0+c2V0U3RyaW5nUHJvcGVydHkoaWQsIHZhbHVlLCB0eXBlLCBmYWxzZSk7Ci19Ci0KLXZvaWQg
U3R5bGVkRWxlbWVudDo6YWRkQ1NTSW1hZ2VQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIs
IGludCBpZCwgY29uc3QgU3RyaW5nICZVUkwpCi17Ci0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNy
ZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRJbWFnZVByb3BlcnR5
KGlkLCBVUkwsIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NMZW5ndGgo
TWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBzcGluIHVwIHRoZSBDU1MgcGFy
c2VyLCBidXQgc2hvdWxkIGluc3RlYWQganVzdCBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0Ci0gICAg
Ly8gbGVuZ3RoIHVuaXQgYW5kIG1ha2UgdGhlIGFwcHJvcHJpYXRlIHBhcnNlZCB2YWx1ZS4KLSAg
ICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLQotICAgIC8vIHN0
cmlwIGF0dHJpYnV0ZSBnYXJiYWdlLi4KLSAgICBTdHJpbmdJbXBsKiB2ID0gdmFsdWUuaW1wbCgp
OwotICAgIGlmICh2KSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBsID0gMDsKLSAgICAgICAgCi0g
ICAgICAgIHdoaWxlIChsIDwgdi0+bGVuZ3RoKCkgJiYgKCp2KVtsXS51bmljb2RlKCkgPD0gJyAn
KQotICAgICAgICAgICAgbCsrOwotICAgICAgICAKLSAgICAgICAgZm9yICg7IGwgPCB2LT5sZW5n
dGgoKTsgbCsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNjID0gKCp2KVtsXS5sYXRpbjEoKTsKLSAg
ICAgICAgICAgIGlmIChjYyA+ICc5JyB8fCAoY2MgPCAnMCcgJiYgY2MgIT0gJyonICYmIGNjICE9
ICclJyAmJiBjYyAhPSAnLicpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKGwgIT0gdi0+bGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGF0dHItPmRlY2wo
KS0+c2V0TGVuZ3RoUHJvcGVydHkoaWQsIHYtPnN1YnN0cmluZygwLCBsKSwgZmFsc2UpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGF0dHItPmRlY2wo
KS0+c2V0TGVuZ3RoUHJvcGVydHkoaWQsIHZhbHVlLCBmYWxzZSk7Ci19Ci0KLS8qIGNvbG9yIHBh
cnNpbmcgdGhhdCB0cmllcyB0byBtYXRjaCBhcyBjbG9zZSBhcyBwb3NzaWJsZSBJRSA2LiAqLwot
dm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NDb2xvcihNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGlu
dCBpZCwgY29uc3QgU3RyaW5nICZjKQotewotICAgIC8vIHRoaXMgaXMgdGhlIG9ubHkgY2FzZSBu
byBjb2xvciBnZXRzIGFwcGxpZWQgaW4gSUUuCi0gICAgaWYgKCAhYy5sZW5ndGgoKSApCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0
dHIpOwotICAgIAotICAgIGlmIChhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCBjLCBmYWxz
ZSkgKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgRGVwcmVjYXRlZFN0cmluZyBjb2xvciA9
IGMuZGVwcmVjYXRlZFN0cmluZygpOwotICAgIC8vIG5vdCBzb21ldGhpbmcgdGhhdCBmaXRzIHRo
ZSBzcGVjcy4KLSAgICAKLSAgICAvLyB3ZSdyZSBlbXVsYXRpbmcgSUVzIGNvbG9yIHBhcnNlciBo
ZXJlLiBJdCBtYXBzIHRyYW5zcGFyZW50IHRvIGJsYWNrLCBvdGhlcndpc2UgaXQgdHJpZXMgdG8g
YnVpbGQgYSByZ2IgdmFsdWUKLSAgICAvLyBvdXQgb2YgZXZlcnlodGluZyB5b3UgcHV0IGluLiBU
aGUgYWxnb3JpdGhtIGlzIGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQsIGJ1dCBzZWVtcyB0byB3
b3JrIGZvciBhbGwgdGVzdCBjYXNlcyBJIGhhdmUuCi0gICAgCi0gICAgLy8gdGhlIGxlbmd0aCBv
ZiB0aGUgY29sb3IgdmFsdWUgaXMgcm91bmRlZCB1cCB0byB0aGUgbmV4dAotICAgIC8vIG11bHRp
cGxlIG9mIDMuIGVhY2ggcGFydCBvZiB0aGUgcmdiIHRyaXBsZSB0aGVuIGdldHMgb25lIHRoaXJk
Ci0gICAgLy8gb2YgdGhlIGxlbmd0aC4KLSAgICAvLwotICAgIC8vIEVhY2ggdHJpcGxldCBpcyBw
YXJzZWQgYnl0ZSBieSBieXRlLCBtYXBwaW5nCi0gICAgLy8gZWFjaCBudW1iZXIgdG8gYSBoZXgg
dmFsdWUgKDAtOWEtZkEtRiB0byB0aGVpciB2YWx1ZXMKLSAgICAvLyBldmVyeXRoaW5nIGVsc2Ug
dG8gMCkuCi0gICAgLy8KLSAgICAvLyBUaGUgaGlnaGVzdCBub24gemVybyBkaWdpdCBpbiBhbGwg
dHJpcGxldHMgaXMgcmVtZW1iZXJlZCwgYW5kCi0gICAgLy8gdXNlZCBhcyBhIG5vcm1hbGl6YXRp
b24gcG9pbnQgdG8gbm9ybWFsaXplIHRvIHZhbHVlcyBiZXR3ZWVuIDAKLSAgICAvLyBhbmQgMjU1
LgotICAgIAotICAgIGlmICggY29sb3IubG93ZXIoKSAhPSAidHJhbnNwYXJlbnQiICkgewotICAg
ICAgICBpZiAoIGNvbG9yWzBdID09ICcjJyApCi0gICAgICAgICAgICBjb2xvci5yZW1vdmUoIDAs
ICAxICk7Ci0gICAgICAgIGludCBiYXNpY0xlbmd0aCA9IChjb2xvci5sZW5ndGgoKSArIDIpIC8g
MzsKLSAgICAgICAgaWYgKCBiYXNpY0xlbmd0aCA+IDEgKSB7Ci0gICAgICAgICAgICAvLyBJRSBp
Z25vcmVzIGNvbG9ycyB3aXRoIHRocmVlIGRpZ2l0cyBvciBsZXNzCi0gICAgICAgICAgICBpbnQg
Y29sb3JzWzNdID0geyAwLCAwLCAwIH07Ci0gICAgICAgICAgICBpbnQgY29tcG9uZW50ID0gMDsK
LSAgICAgICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICAgICAgaW50IG1heERpZ2l0ID0gYmFz
aWNMZW5ndGgtMTsKLSAgICAgICAgICAgIHdoaWxlICggY29tcG9uZW50IDwgMyApIHsKLSAgICAg
ICAgICAgICAgICAvLyBzZWFyY2ggZm9yd2FyZCBmb3IgZGlnaXRzIGluIHRoZSBzdHJpbmcKLSAg
ICAgICAgICAgICAgICBpbnQgbnVtRGlnaXRzID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAo
IHBvcyA8IChpbnQpY29sb3IubGVuZ3RoKCkgJiYgbnVtRGlnaXRzIDwgYmFzaWNMZW5ndGggKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGludCBoZXggPSB0b0hleCggY29sb3JbcG9zXSApOwotICAg
ICAgICAgICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50XSA9IChjb2xvcnNbY29tcG9uZW50XSA8
PCA0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBoZXggPiAwICkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgY29sb3JzW2NvbXBvbmVudF0gKz0gaGV4OwotICAgICAgICAgICAgICAgICAg
ICAgICAgbWF4RGlnaXQgPSBrTWluKCBtYXhEaWdpdCwgbnVtRGlnaXRzICk7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnVtRGlnaXRzKys7Ci0gICAgICAgICAg
ICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGls
ZSAoIG51bURpZ2l0cysrIDwgYmFzaWNMZW5ndGggKQotICAgICAgICAgICAgICAgICAgICBjb2xv
cnNbY29tcG9uZW50XSA8PD0gNDsKLSAgICAgICAgICAgICAgICBjb21wb25lbnQrKzsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIG1heERpZ2l0ID0gYmFzaWNMZW5ndGggLSBtYXhEaWdpdDsK
LSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRvIDAwLWZmLiBUaGUgaGln
aGVzdCBmaWxsZWQgZGlnaXQgY291bnRzLCBtaW5pbXVtIGlzIDIgZGlnaXRzCi0gICAgICAgICAg
ICBtYXhEaWdpdCAtPSAyOwotICAgICAgICAgICAgY29sb3JzWzBdID4+PSA0Km1heERpZ2l0Owot
ICAgICAgICAgICAgY29sb3JzWzFdID4+PSA0Km1heERpZ2l0OwotICAgICAgICAgICAgY29sb3Jz
WzJdID4+PSA0Km1heERpZ2l0OwotICAgICAgICAgICAgLy8gYXNzZXJ0KCBjb2xvcnNbMF0gPCAw
eDEwMCAmJiBjb2xvcnNbMV0gPCAweDEwMCAmJiBjb2xvcnNbMl0gPCAweDEwMCApOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBjb2xvci5zcHJpbnRmKCIjJTAyeCUwMnglMDJ4IiwgY29sb3Jz
WzBdLCBjb2xvcnNbMV0sIGNvbG9yc1syXSApOwotICAgICAgICAgICAgaWYgKCBhdHRyLT5kZWNs
KCktPnNldFByb3BlcnR5KGlkLCBTdHJpbmcoY29sb3IpLCBmYWxzZSkgKQotICAgICAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBhdHRyLT5kZWNsKCktPnNldFByb3Bl
cnR5KGlkLCBDU1NfVkFMX0JMQUNLLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6
Y3JlYXRlTWFwcGVkRGVjbChNYXBwZWRBdHRyaWJ1dGUqIGF0dHIpCi17Ci0gICAgQ1NTTWFwcGVk
QXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBuZXcgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFy
YXRpb24oMCk7Ci0gICAgYXR0ci0+c2V0RGVjbChkZWNsKTsKLSAgICBkZWNsLT5zZXRQYXJlbnQo
Z2V0RG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0KCkpOwotICAgIGRlY2wtPnNldE5vZGUodGhpcyk7
Ci0gICAgZGVjbC0+c2V0U3RyaWN0UGFyc2luZyhmYWxzZSk7IC8vIE1hcHBlZCBhdHRyaWJ1dGVz
IGFyZSBqdXN0IGFsd2F5cyBxdWlya3kuCi19Ci0KLS8vIEdvbGRlbiByYXRpbyAtIGFyYml0cmFy
eSBzdGFydCB2YWx1ZSB0byBhdm9pZCBtYXBwaW5nIGFsbCAwJ3MgdG8gYWxsIDAncwotLy8gb3Ig
YW55dGhpbmcgbGlrZSB0aGF0LgotY29uc3QgdW5zaWduZWQgUEhJID0gMHg5ZTM3NzliOVU7Ci0K
LS8vIFBhdWwgSHNpZWgncyBTdXBlckZhc3RIYXNoCi0vLyBodHRwOi8vd3d3LmF6aWxsaW9ubW9u
a2V5cy5jb20vcWVkL2hhc2guaHRtbAotdW5zaWduZWQgTWFwcGVkQXR0cmlidXRlSGFzaDo6aGFz
aChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGtleSkKLXsKLSAgICB1aW50MzJfdCBoYXNoID0g
UEhJOwotICAgIHVpbnQzMl90IHRtcDsKLQotICAgIGNvbnN0IHVpbnQxNl90KiBwOwotCi0gICAg
cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QqPigma2V5Lm5hbWUpOwotICAgIGhh
c2ggKz0gcFswXTsKLSAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgIGhhc2ggPSAo
aGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgaGFzaCArPSBoYXNoID4+IDExOwotICAgIGFzc2VydChz
aXplb2Yoa2V5Lm5hbWUpID09IDQgfHwgc2l6ZW9mKGtleS5uYW1lKSA9PSA4KTsKLSAgICBpZiAo
c2l6ZW9mKGtleS5uYW1lKSA9PSA4KSB7Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgaGFzaCAr
PSBwWzBdOwotICAgICAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgICAgICBoYXNo
ID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAg
fQotCi0gICAgcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QqPigma2V5LnZhbHVl
KTsKLSAgICBoYXNoICs9IHBbMF07Ci0gICAgdG1wID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsKLSAg
ICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAg
ICBhc3NlcnQoc2l6ZW9mKGtleS52YWx1ZSkgPT0gNCB8fCBzaXplb2Yoa2V5LnZhbHVlKSA9PSA4
KTsKLSAgICBpZiAoc2l6ZW9mKGtleS52YWx1ZSkgPT0gOCkgewotICAgICAgICBwICs9IDI7Ci0g
ICAgICAgIGhhc2ggKz0gcFswXTsKLSAgICAgICAgdG1wID0gKHBbMV0gPDwgMTEpIF4gaGFzaDsK
LSAgICAgICAgaGFzaCA9IChoYXNoIDw8IDE2KSBeIHRtcDsKLSAgICAgICAgaGFzaCArPSBoYXNo
ID4+IDExOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBlbmQgY2FzZQotICAgIGhhc2ggKz0ga2V5
LnR5cGU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDExOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxNzsK
LQotICAgIC8vIEZvcmNlICJhdmFsYW5jaGluZyIgb2YgZmluYWwgMTI3IGJpdHMKLSAgICBoYXNo
IF49IGhhc2ggPDwgMzsKLSAgICBoYXNoICs9IGhhc2ggPj4gNTsKLSAgICBoYXNoIF49IGhhc2gg
PDwgMjsKLSAgICBoYXNoICs9IGhhc2ggPj4gMTU7Ci0gICAgaGFzaCBePSBoYXNoIDw8IDEwOwot
Ci0gICAgLy8gVGhpcyBhdm9pZHMgZXZlciByZXR1cm5pbmcgYSBoYXNoIGNvZGUgb2YgMCwgc2lu
Y2UgdGhhdCBpcyB1c2VkIHRvCi0gICAgLy8gc2lnbmFsICJoYXNoIG5vdCBjb21wdXRlZCB5ZXQi
LCB1c2luZyBhIHZhbHVlIHRoYXQgaXMgbGlrZWx5IHRvIGJlCi0gICAgLy8gZWZmZWN0aXZlbHkg
dGhlIHNhbWUgYXMgMCB3aGVuIHRoZSBsb3cgYml0cyBhcmUgbWFza2VkCi0gICAgaWYgKGhhc2gg
PT0gMCkKLSAgICAgICAgaGFzaCA9IDB4ODAwMDAwMDA7Ci0KLSAgICByZXR1cm4gaGFzaDsKLX0K
LQogfQpJbmRleDogZG9tL2RvbV9lbGVtZW50aW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL2Rv
bV9lbGVtZW50aW1wbC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgZG9tL2RvbV9lbGVtZW50aW1w
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTY1OCArMCwwIEBACi0vKioKLSAqIFRoaXMgZmls
ZSBpcyBwYXJ0IG9mIHRoZSBET00gaW1wbGVtZW50YXRpb24gZm9yIEtERS4KLSAqCi0gKiBDb3B5
cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqICAgICAgICAgICAo
QykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqICAgICAgICAgICAo
QykgMjAwMSBQZXRlciBLZWxseSAocG1rQHBvc3QuY29tKQotICogICAgICAgICAgIChDKSAyMDAx
IERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDA0LCAy
MDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBN
QSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
ImRvbV9lbGVtZW50aW1wbC5oIgotCi0jaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgotI2luY2x1
ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgImNzc19zdHlsZXNoZWV0
aW1wbC5oIgotI2luY2x1ZGUgImNzc192YWx1ZWltcGwuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNl
bGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgotI2luY2x1ZGUgImRvbTJf
ZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgImRvbV94bWxpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCi0jaW5jbHVkZSAiSFRNTFBhcnNlci5oIgotI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5o
IgotI2luY2x1ZGUgPHF0ZXh0c3RyZWFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotdXNp
bmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleSB7Ci0g
ICAgdWludDE2X3QgdHlwZTsKLSAgICBTdHJpbmdJbXBsKiBuYW1lOwotICAgIFN0cmluZ0ltcGwq
IHZhbHVlOwotICAgIE1hcHBlZEF0dHJpYnV0ZUtleShNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0LCBT
dHJpbmdJbXBsKiBuLCBTdHJpbmdJbXBsKiB2KQotICAgICAgICA6IHR5cGUodCksIG5hbWUobiks
IHZhbHVlKHYpIHsgfQotfTsKLQotc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qg
TWFwcGVkQXR0cmlidXRlS2V5JiBhLCBjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGIpCi0gICAg
eyByZXR1cm4gYS50eXBlID09IGIudHlwZSAmJiBhLm5hbWUgPT0gYi5uYW1lICYmIGEudmFsdWUg
PT0gYi52YWx1ZTsgfSAKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0cyB7Ci0gICAg
dHlwZWRlZiBNYXBwZWRBdHRyaWJ1dGVLZXkgVHJhaXRUeXBlOwotICAgIHN0YXRpYyBjb25zdCBi
b29sIGVtcHR5VmFsdWVJc1plcm8gPSB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRz
RGVzdHJ1Y3Rpb24gPSBmYWxzZTsKLSAgICBzdGF0aWMgTWFwcGVkQXR0cmlidXRlS2V5IGVtcHR5
VmFsdWUoKSB7IHJldHVybiBNYXBwZWRBdHRyaWJ1dGVLZXkoZU5vbmUsIDAsIDApOyB9Ci0gICAg
c3RhdGljIE1hcHBlZEF0dHJpYnV0ZUtleSBkZWxldGVkVmFsdWUoKSB7IHJldHVybiBNYXBwZWRB
dHRyaWJ1dGVLZXkoZUxhc3RFbnRyeSwgMCwgMCk7IH0KLX07Ci0KLXN0cnVjdCBNYXBwZWRBdHRy
aWJ1dGVIYXNoIHsKLSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBNYXBwZWRBdHRyaWJ1
dGVLZXkmKTsKLSAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkm
IGEsIGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci19Owot
Ci10eXBlZGVmIEhhc2hNYXA8TWFwcGVkQXR0cmlidXRlS2V5LCBDU1NNYXBwZWRBdHRyaWJ1dGVE
ZWNsYXJhdGlvbiosIE1hcHBlZEF0dHJpYnV0ZUhhc2gsIE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0
cz4gTWFwcGVkQXR0cmlidXRlRGVjbHM7Ci0KLXN0YXRpYyBNYXBwZWRBdHRyaWJ1dGVEZWNscyog
bWFwcGVkQXR0cmlidXRlRGVjbHMgPSAwOwotCi1BdHRyaWJ1dGUqIEF0dHJpYnV0ZTo6Y2xvbmUo
Ym9vbCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZShtX25hbWUsIG1fdmFsdWUp
OwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEF0dHJpYnV0ZTo6Y3JlYXRlQXR0cklmTmVlZGVkKEVs
ZW1lbnQqIGUpCi17Ci0gICAgUmVmUHRyPEF0dHI+IHIobV9pbXBsKTsKLSAgICBpZiAoIXIpIHsK
LSAgICAgICAgciA9IG5ldyBBdHRyKGUsIGUtPmdldERvY3VtZW50KCksIHRoaXMpOwotICAgICAg
ICByLT5jcmVhdGVUZXh0Q2hpbGQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwot
fQotCi1BdHRyOjpBdHRyKEVsZW1lbnQqIGVsZW1lbnQsIERvY3VtZW50KiBkb2NQdHIsIEF0dHJp
YnV0ZSogYSkKLSAgICA6IENvbnRhaW5lck5vZGUoZG9jUHRyKSwKLSAgICAgIG1fZWxlbWVudChl
bGVtZW50KSwKLSAgICAgIG1fYXR0cmlidXRlKGEpLAotICAgICAgbV9pZ25vcmVDaGlsZHJlbkNo
YW5nZWQoMCkKLXsKLSAgICBhc3NlcnQoIW1fYXR0cmlidXRlLT5tX2ltcGwpOwotICAgIG1fYXR0
cmlidXRlLT5tX2ltcGwgPSB0aGlzOwotICAgIG1fc3BlY2lmaWVkID0gdHJ1ZTsKLX0KLQotQXR0
cjo6fkF0dHIoKQotewotICAgIGFzc2VydChtX2F0dHJpYnV0ZS0+bV9pbXBsID09IHRoaXMpOwot
ICAgIG1fYXR0cmlidXRlLT5tX2ltcGwgPSAwOwotfQotCi12b2lkIEF0dHI6OmNyZWF0ZVRleHRD
aGlsZCgpCi17Ci0gICAgYXNzZXJ0KHJlZkNvdW50KCkpOwotICAgIGlmICghbV9hdHRyaWJ1dGUt
PnZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAg
ICAgICBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZCsrOwotICAgICAgICBhcHBlbmRDaGlsZChnZXRE
b2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZShtX2F0dHJpYnV0ZS0+dmFsdWUoKS5pbXBsKCkpLCBl
Yyk7Ci0gICAgICAgIG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkLS07Ci0gICAgfQotfQotCi1TdHJp
bmcgQXR0cjo6bm9kZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lKCk7Ci19Ci0KLU5v
ZGU6Ok5vZGVUeXBlIEF0dHI6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQVRUUklC
VVRFX05PREU7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgQXR0cjo6bG9jYWxOYW1lKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9hdHRyaWJ1dGUtPmxvY2FsTmFtZSgpOwotfQotCi1jb25zdCBB
dG9taWNTdHJpbmcmIEF0dHI6Om5hbWVzcGFjZVVSSSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1f
YXR0cmlidXRlLT5uYW1lc3BhY2VVUkkoKTsKLX0KLQotY29uc3QgQXRvbWljU3RyaW5nJiBBdHRy
OjpwcmVmaXgoKSBjb25zdAotewotICAgIHJldHVybiBtX2F0dHJpYnV0ZS0+cHJlZml4KCk7Ci19
Ci0KLXZvaWQgQXR0cjo6c2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyAmX3ByZWZpeCwgRXhj
ZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgY2hlY2tTZXRQcmVmaXgoX3ByZWZpeCwgZWMpOwotICAg
IGlmIChlYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9hdHRyaWJ1dGUtPnNldFByZWZpeChf
cHJlZml4KTsKLX0KLQotU3RyaW5nIEF0dHI6Om5vZGVWYWx1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIHZhbHVlKCk7Ci19Ci0KLXZvaWQgQXR0cjo6c2V0VmFsdWUoIGNvbnN0IFN0cmluZyYgdiwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgZWMgPSAwOwotCi0gICAgLy8gZG8gbm90IGludGVy
cHJldGUgZW50aXRpZXMgaW4gdGhlIHN0cmluZywgaXRzIGxpdGVyYWwhCi0KLSAgICAvLyBOT19N
T0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5
Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9B
TExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vICMjIyB3aGF0IHRv
IGRvIG9uIDAgPwotICAgIGlmICh2LmlzTnVsbCgpKSB7Ci0gICAgICAgIGVjID0gRE9NU1RSSU5H
X1NJWkVfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGUgPSAwOwotICAg
IG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkKys7Ci0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBh
cHBlbmRDaGlsZChnZXREb2N1bWVudCgpLT5jcmVhdGVUZXh0Tm9kZSh2LmltcGwoKSksIGUpOwot
ICAgIG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkLS07Ci0gICAgCi0gICAgbV9hdHRyaWJ1dGUtPnNl
dFZhbHVlKHYuaW1wbCgpKTsKLSAgICBpZiAobV9lbGVtZW50KQotICAgICAgICBtX2VsZW1lbnQt
PmF0dHJpYnV0ZUNoYW5nZWQobV9hdHRyaWJ1dGUuZ2V0KCkpOwotfQotCi12b2lkIEF0dHI6OnNl
dE5vZGVWYWx1ZShjb25zdCBTdHJpbmcmIHYsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIC8v
IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogdGFrZW4gY2FyZSBvZiBieSBzZXRWYWx1ZSgp
Ci0gICAgc2V0VmFsdWUodiwgZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IEF0dHI6OmNsb25l
Tm9kZShib29sIC8qZGVlcCovKQotewotICAgIFJlZlB0cjxBdHRyPiBjbG9uZSA9IG5ldyBBdHRy
KDAsIGdldERvY3VtZW50KCksIG1fYXR0cmlidXRlLT5jbG9uZSgpKTsKLSAgICBjbG9uZUNoaWxk
Tm9kZXMoY2xvbmUuZ2V0KCkpOwotICAgIHJldHVybiBjbG9uZS5yZWxlYXNlKCk7Ci19Ci0KLS8v
IERPTSBTZWN0aW9uIDEuMS4xCi1ib29sIEF0dHI6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUg
dHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBURVhUX05PREU6Ci0g
ICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
fQotCi12b2lkIEF0dHI6OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgTm9kZTo6Y2hpbGRyZW5D
aGFuZ2VkKCk7Ci0gICAgCi0gICAgaWYgKG1faWdub3JlQ2hpbGRyZW5DaGFuZ2VkID4gMCkKLSAg
ICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgaW5jbHVkZSBlbnRp
dHkgcmVmZXJlbmNlcyBpbiB0aGUgdmFsdWUKLSAgICAKLSAgICBTdHJpbmcgdmFsID0gIiI7Ci0g
ICAgZm9yIChOb2RlICpuID0gZmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkg
ewotICAgICAgICBpZiAobi0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgdmFsICs9IHN0YXRp
Y19jYXN0PFRleHQgKj4obiktPmRhdGEoKTsKLSAgICB9Ci0gICAgCi0gICAgbV9hdHRyaWJ1dGUt
PnNldFZhbHVlKHZhbC5pbXBsKCkpOwotICAgIGlmIChtX2VsZW1lbnQpCi0gICAgICAgIG1fZWxl
bWVudC0+YXR0cmlidXRlQ2hhbmdlZChtX2F0dHJpYnV0ZS5nZXQoKSk7Ci19Ci0KLVN0cmluZyBB
dHRyOjp0b1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdDsKLQotICAgIHJlc3Vs
dCArPSBub2RlTmFtZSgpOwotCi0gICAgLy8gRklYTUU6IHN1YnN0aXR1dGUgZW50aXRpZXMgZm9y
IGFueSBpbnN0YW5jZXMgb2YgIiBvciAnIC0tCi0gICAgLy8gbWF5YmUgZWFzaWVyIHRvIGp1c3Qg
dXNlIHRleHQgdmFsdWUgYW5kIGlnbm9yZSBleGlzdGluZwotICAgIC8vIGVudGl0eSByZWZzPwot
Ci0gICAgaWYgKGZpcnN0Q2hpbGQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPVwi
IjsKLQotICAgICAgICBmb3IgKE5vZGUgKmNoaWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBO
VUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICByZXN1bHQg
Kz0gY2hpbGQtPnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3Vs
dCArPSAiXCIiOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotI2lmbmRlZiBOREVCVUcKLXN0cnVjdCBFbGVtZW50SW1wbENvdW50ZXIgCi17
IAotICAgIHN0YXRpYyBpbnQgY291bnQ7IAotICAgIH5FbGVtZW50SW1wbENvdW50ZXIoKSB7IC8q
IGlmIChjb3VudCAhPSAwKSBmcHJpbnRmKHN0ZGVyciwgIkxFQUs6ICVkIEVsZW1lbnRcbiIsIGNv
dW50KTsgKi8gfSAKLX07Ci1pbnQgRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLXN0YXRpYyBF
bGVtZW50SW1wbENvdW50ZXIgZWxlbWVudEltcGxDb3VudGVyOwotI2VuZGlmIE5ERUJVRwotCi1F
bGVtZW50OjpFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHFOYW1lLCBEb2N1bWVudCAqZG9j
KQotICAgIDogQ29udGFpbmVyTm9kZShkb2MpLCBtX3RhZ05hbWUocU5hbWUpCi17Ci0jaWZuZGVm
IE5ERUJVRwotICAgICsrRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRpZgotfQotCi1F
bGVtZW50Ojp+RWxlbWVudCgpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIC0tRWxlbWVudEltcGxD
b3VudGVyOjpjb3VudDsKLSNlbmRpZgotICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgIG5h
bWVkQXR0ck1hcC0+ZGV0YWNoRnJvbUVsZW1lbnQoKTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBF
bGVtZW50OjpjbG9uZU5vZGUoYm9vbCBkZWVwKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgIFJlZlB0cjxFbGVtZW50PiBjbG9uZSA9IGdldERvY3VtZW50KCktPmNyZWF0ZUVsZW1l
bnROUyhuYW1lc3BhY2VVUkkoKSwgbm9kZU5hbWUoKSwgZWMpOwotICAgIGFzc2VydCghZWMpOwot
ICAgIAotICAgIC8vIGNsb25lIGF0dHJpYnV0ZXMKLSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAg
ICAgICAqY2xvbmUtPmF0dHJpYnV0ZXMoKSA9ICpuYW1lZEF0dHJNYXA7Ci0KLSAgICBjbG9uZS0+
Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXModGhpcyk7Ci0gICAgCi0gICAgaWYgKGRlZXApCi0g
ICAgICAgIGNsb25lQ2hpbGROb2RlcyhjbG9uZS5nZXQoKSk7Ci0KLSAgICByZXR1cm4gY2xvbmUu
cmVsZWFzZSgpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFs
aWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAobmFtZWRBdHRy
TWFwKSB7Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+cmVtb3ZlTmFtZWRJdGVtKG5hbWUsIGVjKTsK
LSAgICAgICAgaWYgKGVjID09IE5PVF9GT1VORF9FUlIpCi0gICAgICAgICAgICBlYyA9IDA7Ci0g
ICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1l
JiBuYW1lLCBjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZS5pbXBsKCksIGVjKTsKLX0KLQotLy8gVmly
dHVhbCBmdW5jdGlvbiwgZGVmaW5lZCBpbiBiYXNlIGNsYXNzLgotTmFtZWRBdHRyTWFwICpFbGVt
ZW50OjphdHRyaWJ1dGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0cmlidXRlcyhmYWxzZSk7
Ci19Ci0KLU5hbWVkQXR0ck1hcCogRWxlbWVudDo6YXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBj
b25zdAotewotICAgIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKTsKLSAgICBpZiAoIXJl
YWRvbmx5ICYmICFuYW1lZEF0dHJNYXApCi0gICAgICAgIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpOwot
ICAgIHJldHVybiBuYW1lZEF0dHJNYXAuZ2V0KCk7Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEVsZW1l
bnQ6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gRUxFTUVOVF9OT0RFOwotfQotCi1j
b25zdCBBdG9taWNTdHJpbmdMaXN0KiBFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBjb25zdAotewot
ICAgIHJldHVybiAwOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldElEQXR0
cmlidXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFw
LT5pZCgpIDogbnVsbEF0b207Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlKGNvbnN0
IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZU5T
KG5hbWUubmFtZXNwYWNlVVJJKCksIG5hbWUubG9jYWxOYW1lKCkpOwotfQotCi1jb25zdCBBdG9t
aWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
KSBjb25zdAotewotICAgIGlmIChuYW1lID09IHN0eWxlQXR0cikKLSAgICAgICAgdXBkYXRlU3R5
bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAg
aWYgKEF0dHJpYnV0ZSogYSA9IG5hbWVkQXR0ck1hcC0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKSkK
LSAgICAgICAgICAgIHJldHVybiBhLT52YWx1ZSgpOwotCi0gICAgcmV0dXJuIG51bGxBdG9tOwot
fQotCi12b2lkIEVsZW1lbnQ6OnNjcm9sbEludG9WaWV3KGJvb2wgYWxpZ25Ub1RvcCkgCi17Ci0g
ICAgSW50UmVjdCBib3VuZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJl
cigpKSB7Ci0gICAgICAgIC8vIEFsaWduIHRvIHRoZSB0b3AgLyBib3R0b20gYW5kIHRvIHRoZSBj
bG9zZXN0IGVkZ2UuCi0gICAgICAgIGlmIChhbGlnblRvVG9wKQotICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRl
ckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCwgUmVuZGVyTGF5ZXI6OmdBbGlnblRvcEFsd2F5
cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVy
KCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdl
SWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25Cb3R0b21BbHdheXMpOwotICAgIH0KLX0KLQot
dm9pZCBFbGVtZW50OjpzY3JvbGxJbnRvVmlld0lmTmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQp
Ci17Ci0gICAgSW50UmVjdCBib3VuZHMgPSB0aGlzLT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChy
ZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmIChjZW50ZXJJZk5lZWRlZCkKLSAgICAgICAgICAgIHJl
bmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBS
ZW5kZXJMYXllcjo6Z0FsaWduQ2VudGVySWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25DZW50
ZXJJZk5lZWRlZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xv
c2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0Fs
aWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCk7Ci0g
ICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5IVE1MRG9jdW1lbnQoY29uc3QgRWxlbWVu
dCogZSkKLXsKLSAgICByZXR1cm4gZSAmJiBlLT5nZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVu
dCgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25z
dCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERv
Y3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7
Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgRWxlbWVudDo6Z2V0QXR0cmlidXRlTlMoY29uc3Qg
U3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1l
LmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0
dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIGlmICghRG9jdW1lbnQ6OmlzVmFsaWROYW1lKG5hbWUpKSB7Ci0g
ICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93
ZXIoKSA6IG5hbWU7Ci0gICAgc2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxv
Y2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgdmFsdWUuaW1wbCgpLCBlYyk7Ci19Ci0KLXZvaWQg
RWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0lt
cGwqIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQot
ICAgICAgICBnZXREb2N1bWVudCgpLT5pbmNET01UcmVlVmVyc2lvbigpOwotCi0gICAgLy8gYWxs
b2NhdGUgYXR0cmlidXRlbWFwIGlmIG5lY2Vzc2FyeQotICAgIEF0dHJpYnV0ZSogb2xkID0gYXR0
cmlidXRlcyhmYWxzZSktPmdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0KLSAgICAvLyBOT19NT0RJ
RklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0g
ICAgaWYgKG5hbWVkQXR0ck1hcC0+aXNSZWFkT25seSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9E
SUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYg
KG5hbWUgPT0gaWRBdHRyKQotICAgICAgICB1cGRhdGVJZChvbGQgPyBvbGQtPnZhbHVlKCkgOiBu
dWxsQXRvbSwgdmFsdWUpOwotICAgIAotICAgIGlmIChvbGQgJiYgIXZhbHVlKQotICAgICAgICBu
YW1lZEF0dHJNYXAtPnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICBlbHNlIGlmICghb2xkICYm
IHZhbHVlKQotICAgICAgICBuYW1lZEF0dHJNYXAtPmFkZEF0dHJpYnV0ZShjcmVhdGVBdHRyaWJ1
dGUobmFtZSwgdmFsdWUpKTsKLSAgICBlbHNlIGlmIChvbGQgJiYgdmFsdWUpIHsKLSAgICAgICAg
b2xkLT5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQob2xkKTsKLSAg
ICB9Ci19Ci0KLUF0dHJpYnV0ZSogRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxp
ZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlKQotewotICAgIHJldHVybiBuZXcgQXR0
cmlidXRlKG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGVNYXAo
TmFtZWRBdHRyTWFwKiBsaXN0KQotewotICAgIGlmIChpbkRvY3VtZW50KCkpCi0gICAgICAgIGdl
dERvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7Ci0KLSAgICAvLyBJZiBzZXR0aW5nIHRo
ZSB3aG9sZSBtYXAgY2hhbmdlcyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwgdXBk
YXRlSWQuCi0KLSAgICBBdHRyaWJ1dGUgKm9sZElkID0gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRy
TWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cikgOiAwOwotICAgIEF0dHJpYnV0ZSAqbmV3SWQg
PSBsaXN0ID8gbGlzdC0+Z2V0QXR0cmlidXRlSXRlbShpZEF0dHIpIDogMDsKLQotICAgIGlmIChv
bGRJZCB8fCBuZXdJZCkKLSAgICAgICAgdXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6
IG51bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwotCi0gICAgaWYg
KG5hbWVkQXR0ck1hcCkKLSAgICAgICAgbmFtZWRBdHRyTWFwLT5lbGVtZW50ID0gMDsKLQotICAg
IG5hbWVkQXR0ck1hcCA9IGxpc3Q7Ci0KLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAg
IG5hbWVkQXR0ck1hcC0+ZWxlbWVudCA9IHRoaXM7Ci0gICAgICAgIHVuc2lnbmVkIGxlbiA9IG5h
bWVkQXR0ck1hcC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBs
ZW47IGkrKykKLSAgICAgICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQobmFtZWRBdHRyTWFwLT5hdHRy
c1tpXSk7Ci0gICAgICAgIC8vIEZJWE1FOiBXaGF0IGFib3V0IGF0dHJpYnV0ZXMgdGhhdCB3ZXJl
IGluIHRoZSBvbGQgbWFwIHRoYXQgYXJlIG5vdCBpbiB0aGUgbmV3IG1hcD8KLSAgICB9Ci19Ci0K
LWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlcygpIGNvbnN0Ci17Ci0gICAgdXBkYXRlU3R5bGVB
dHRyaWJ1dGVJZk5lZWRlZCgpOwotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgJiYgbmFtZWRBdHRy
TWFwLT5sZW5ndGgoKSA+IDA7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojpub2RlTmFtZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGFnTmFtZS50b1N0cmluZygpOwotfQotCi12b2lkIEVsZW1lbnQ6
OnNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2VwdGlvbkNvZGUmIGVj
KQotewotICAgIGNoZWNrU2V0UHJlZml4KF9wcmVmaXgsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fdGFnTmFtZS5zZXRQcmVmaXgoX3ByZWZpeCk7Ci19Ci0KLXZv
aWQgRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICBuYW1lZEF0dHJN
YXAgPSBuZXcgTmFtZWRBdHRyTWFwKGNvbnN0X2Nhc3Q8RWxlbWVudCo+KHRoaXMpKTsKLX0KLQot
Ym9vbCBFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJTdHlsZSAqRWxlbWVudDo6Y3JlYXRlU3R5bGVG
b3JSZW5kZXJlcihSZW5kZXJPYmplY3QgKnBhcmVudFJlbmRlcmVyKQotewotICAgIHJldHVybiBn
ZXREb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmNyZWF0ZVN0eWxlRm9yRWxlbWVudCh0aGlz
KTsKLX0KLQotUmVuZGVyT2JqZWN0ICpFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVu
YSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkgPT0gdGhpcyAmJiBzdHlsZS0+ZGlzcGxheSgpID09IE5PTkUpIHsK
LSAgICAgICAgLy8gSWdub3JlIGRpc3BsYXk6IG5vbmUgb24gcm9vdCBlbGVtZW50cy4gIEZvcmNl
IGEgZGlzcGxheSBvZiBibG9jayBpbiB0aGF0IGNhc2UuCi0gICAgICAgIFJlbmRlckJsb2NrKiBy
ZXN1bHQgPSBuZXcgKGFyZW5hKSBSZW5kZXJCbG9jayh0aGlzKTsKLSAgICAgICAgaWYgKHJlc3Vs
dCkgcmVzdWx0LT5zZXRTdHlsZShzdHlsZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAg
fQotICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNyZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci19
Ci0KLQotdm9pZCBFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgLy8gbmVl
ZCB0byBkbyBzdXBlcmNsYXNzIHByb2Nlc3NpbmcgZmlyc3Qgc28gaW5Eb2N1bWVudCgpIGlzIHRy
dWUKLSAgICAvLyBieSB0aGUgdGltZSB3ZSByZWFjaCB1cGRhdGVJZAotICAgIENvbnRhaW5lck5v
ZGU6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0KLSAgICBpZiAoaGFzSUQoKSkgewotICAgICAg
ICBOYW1lZEF0dHJNYXAqIGF0dHJzID0gYXR0cmlidXRlcyh0cnVlKTsKLSAgICAgICAgaWYgKGF0
dHJzKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUqIGlkSXRlbSA9IGF0dHJzLT5nZXRBdHRyaWJ1
dGVJdGVtKGlkQXR0cik7Ci0gICAgICAgICAgICBpZiAoaWRJdGVtICYmICFpZEl0ZW0tPmlzTnVs
bCgpKQotICAgICAgICAgICAgICAgIHVwZGF0ZUlkKG51bGxBdG9tLCBpZEl0ZW0tPnZhbHVlKCkp
OwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1l
bnQoKQotewotICAgIGlmIChoYXNJRCgpKSB7Ci0gICAgICAgIE5hbWVkQXR0ck1hcCogYXR0cnMg
PSBhdHRyaWJ1dGVzKHRydWUpOwotICAgICAgICBpZiAoYXR0cnMpIHsKLSAgICAgICAgICAgIEF0
dHJpYnV0ZSogaWRJdGVtID0gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLSAgICAg
ICAgICAgIGlmIChpZEl0ZW0gJiYgIWlkSXRlbS0+aXNOdWxsKCkpCi0gICAgICAgICAgICAgICAg
dXBkYXRlSWQoaWRJdGVtLT52YWx1ZSgpLCBudWxsQXRvbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBDb250YWluZXJOb2RlOjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0KLXZvaWQgRWxl
bWVudDo6YXR0YWNoKCkKLXsKLSNpZiBTUEVFRF9ERUJVRyA8IDEKLSAgICBjcmVhdGVSZW5kZXJl
cklmTmVlZGVkKCk7Ci0jZW5kaWYKLSAgICBDb250YWluZXJOb2RlOjphdHRhY2goKTsKLX0KLQot
dm9pZCBFbGVtZW50OjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkKLXsKLSAgICAv
LyAjIyMgc2hvdWxkIGdvIGF3YXkgYW5kIGJlIGRvbmUgaW4gcmVuZGVyb2JqZWN0Ci0gICAgUmVu
ZGVyU3R5bGUqIF9zdHlsZSA9IHJlbmRlcmVyKCkgPyByZW5kZXJlcigpLT5zdHlsZSgpIDogMDsK
LSAgICBib29sIGhhc1BhcmVudFJlbmRlcmVyID0gcGFyZW50KCkgPyBwYXJlbnQoKS0+cmVuZGVy
ZXIoKSA6IGZhbHNlOwotICAgIAotICAgIGlmICggaGFzUGFyZW50UmVuZGVyZXIgJiYgKGNoYW5n
ZSA+PSBJbmhlcml0IHx8IGNoYW5nZWQoKSkgKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlICpuZXdT
dHlsZSA9IGdldERvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Y3JlYXRlU3R5bGVGb3JFbGVt
ZW50KHRoaXMpOwotICAgICAgICBTdHlsZUNoYW5nZSBjaCA9IGRpZmYoIF9zdHlsZSwgbmV3U3R5
bGUgKTsKLSAgICAgICAgaWYgKGNoID09IERldGFjaCkgewotICAgICAgICAgICAgaWYgKGF0dGFj
aGVkKCkpIGRldGFjaCgpOwotICAgICAgICAgICAgLy8gIyMjIFN1Ym9wdGltYWwuIFN0eWxlIGdl
dHMgY2FsY3VsYXRlZCBhZ2Fpbi4KLSAgICAgICAgICAgIGF0dGFjaCgpOwotICAgICAgICAgICAg
Ly8gYXR0YWNoIHJlY2FsdWxhdGVzIHRoZSBzdHlsZSBmb3IgYWxsIGNoaWxkcmVuLiBObyBuZWVk
IHRvIGRvIGl0IHR3aWNlLgotICAgICAgICAgICAgc2V0Q2hhbmdlZCggZmFsc2UgKTsKLSAgICAg
ICAgICAgIHNldEhhc0NoYW5nZWRDaGlsZCggZmFsc2UgKTsKLSAgICAgICAgICAgIG5ld1N0eWxl
LT5kZXJlZihnZXREb2N1bWVudCgpLT5yZW5kZXJBcmVuYSgpKTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaCAhPSBOb0NoYW5nZSkgewotICAgICAg
ICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgbmV3U3R5bGUpCi0gICAgICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNo
YW5nZWQoKSAmJiByZW5kZXJlcigpICYmIG5ld1N0eWxlICYmIChnZXREb2N1bWVudCgpLT51c2Vz
U2libGluZ1J1bGVzKCkgfHwgZ2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygpKSkg
ewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggbm8gY2hhbmdlIG9jY3VycmVkLCB3ZSB1c2UgdGhl
IG5ldyBzdHlsZSBzbyB0aGF0IHRoZSBjb3VzaW4gc3R5bGUgc2hhcmluZyBjb2RlIHdvbid0IGdl
dAotICAgICAgICAgICAgLy8gZm9vbGVkIGludG8gYmVsaWV2aW5nIHRoaXMgc3R5bGUgaXMgdGhl
IHNhbWUuICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHRoZSBkb2N1bWVudCBhY3R1YWxseSB1
c2VzCi0gICAgICAgICAgICAvLyBzaWJsaW5nL2Rlc2NlbmRhbnQgcnVsZXMsIHNpbmNlIG90aGVy
d2lzZSBpdCBpc24ndCBwb3NzaWJsZSBmb3IgYW5jZXN0b3Igc3R5bGVzIHRvIGFmZmVjdCBzaGFy
aW5nIG9mCi0gICAgICAgICAgICAvLyBkZXNjZW5kYW50cy4KLSAgICAgICAgICAgIHJlbmRlcmVy
KCktPnNldFN0eWxlSW50ZXJuYWwobmV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3
U3R5bGUtPmRlcmVmKGdldERvY3VtZW50KCktPnJlbmRlckFyZW5hKCkpOwotCi0gICAgICAgIGlm
ICggY2hhbmdlICE9IEZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+dXNl
c0Rlc2NlbmRhbnRSdWxlcygpKQotICAgICAgICAgICAgICAgIGNoYW5nZSA9IEZvcmNlOwotICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNoYW5nZSA9IGNoOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgZm9yIChOb2RlICpuID0gZmFzdEZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IG4tPmlzVGV4
dE5vZGUoKSB8fCBuLT5oYXNDaGFuZ2VkQ2hpbGQoKSB8fCBuLT5jaGFuZ2VkKCkpCi0gICAgICAg
ICAgICBuLT5yZWNhbGNTdHlsZShjaGFuZ2UpOwotICAgIH0KLQotICAgIHNldENoYW5nZWQoIGZh
bHNlICk7Ci0gICAgc2V0SGFzQ2hhbmdlZENoaWxkKCBmYWxzZSApOwotfQotCi1ib29sIEVsZW1l
bnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUp
IHsKLSAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgVEVYVF9OT0RFOgot
ICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RS
VUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBj
YXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OmRpc3BhdGNoQXR0clJlbW92YWxFdmVudChB
dHRyaWJ1dGUqKQotewotICAgIGFzc2VydCghZXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSNp
ZiAwCi0gICAgaWYgKCFnZXREb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnQ6OkRP
TUFUVFJNT0RJRklFRF9MSVNURU5FUikpCi0gICAgICAgIHJldHVybjsKLSAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKLSAgICBkaXNwYXRjaEV2ZW50KG5ldyBNdXRhdGlvbkV2ZW50KERPTUF0dHJN
b2RpZmllZEV2ZW50LCB0cnVlLCBmYWxzZSwgYXR0ciwgYXR0ci0+dmFsdWUoKSwKLSAgICAgICAg
YXR0ci0+dmFsdWUoKSwgZ2V0RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0
aW9uRXZlbnQ6OlJFTU9WQUwpLCBlYyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBFbGVtZW50OjpkaXNw
YXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBhc3NlcnQoIWV2
ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0jaWYgMAotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+
aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50OjpET01BVFRSTU9ESUZJRURfTElTVEVORVIpKQotICAg
ICAgICByZXR1cm47Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgZGlzcGF0Y2hFdmVu
dChuZXcgTXV0YXRpb25FdmVudChET01BdHRyTW9kaWZpZWRFdmVudCwgdHJ1ZSwgZmFsc2UsIGF0
dHIsIGF0dHItPnZhbHVlKCksCi0gICAgICAgIGF0dHItPnZhbHVlKCksZ2V0RG9jdW1lbnQoKS0+
YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0aW9uRXZlbnQ6OkFERElUSU9OKSwgZWMpOwotI2Vu
ZGlmCi19Ci0KLVN0cmluZyBFbGVtZW50OjpvcGVuVGFnU3RhcnRUb1N0cmluZygpIGNvbnN0Ci17
Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICI8IiArIG5vZGVOYW1lKCk7Ci0KLSAgICBOYW1lZEF0dHJN
YXAgKmF0dHJNYXAgPSBhdHRyaWJ1dGVzKHRydWUpOwotCi0gICAgaWYgKGF0dHJNYXApIHsKLSAg
ICAgICAgdW5zaWduZWQgbnVtQXR0cnMgPSBhdHRyTWFwLT5sZW5ndGgoKTsKLSAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUF0dHJzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3Vs
dCArPSAiICI7Ci0KLSAgICAgICAgICAgIEF0dHJpYnV0ZSAqYXR0cmlidXRlID0gYXR0ck1hcC0+
YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgIHJlc3VsdCArPSBhdHRyaWJ1dGUtPm5hbWUo
KS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUtPnZhbHVlKCkuaXNOdWxs
KCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gIj1cIiI7Ci0gICAgICAgICAgICAgICAg
Ly8gRklYTUU6IHN1YnN0aXR1dGUgZW50aXRpZXMgZm9yIGFueSBpbnN0YW5jZXMgb2YgIiBvciAn
Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGF0dHJpYnV0ZS0+dmFsdWUoKTsKLSAgICAgICAg
ICAgICAgICByZXN1bHQgKz0gIlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVN0cmluZyBFbGVtZW50Ojp0b1N0cmluZygpIGNv
bnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG9wZW5UYWdTdGFydFRvU3RyaW5nKCk7Ci0KLSAg
ICBpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiPiI7Ci0KLSAgICAg
ICAgZm9yIChOb2RlICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgcmVzdWx0ICs9IGNoaWxkLT50
b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ICs9ICI8LyI7Ci0gICAgICAg
IHJlc3VsdCArPSBub2RlTmFtZSgpOwotICAgICAgICByZXN1bHQgKz0gIj4iOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiIC8+IjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi12b2lkIEVsZW1lbnQ6OnVwZGF0ZUlkKGNvbnN0IEF0b21pY1N0cmluZyYgb2xkSWQs
IGNvbnN0IEF0b21pY1N0cmluZyYgbmV3SWQpCi17Ci0gICAgaWYgKCFpbkRvY3VtZW50KCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmIChvbGRJZCA9PSBuZXdJZCkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgRG9jdW1lbnQqIGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgaWYgKCFvbGRJZC5p
c0VtcHR5KCkpCi0gICAgICAgIGRvYy0+cmVtb3ZlRWxlbWVudEJ5SWQob2xkSWQsIHRoaXMpOwot
ICAgIGlmICghbmV3SWQuaXNFbXB0eSgpKQotICAgICAgICBkb2MtPmFkZEVsZW1lbnRCeUlkKG5l
d0lkLCB0aGlzKTsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgRWxlbWVudDo6ZHVtcChRVGV4
dFN0cmVhbSAqc3RyZWFtLCBEZXByZWNhdGVkU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgICB1cGRh
dGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCk7Ci0gICAgaWYgKG5hbWVkQXR0ck1hcCkgewotICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZWRBdHRyTWFwLT5sZW5ndGgoKTsgaSsr
KSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgKmF0dHIgPSBuYW1lZEF0dHJNYXAtPmF0dHJpYnV0
ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAqc3RyZWFtIDw8ICIgIiA8PCBhdHRyLT5uYW1lKCkubG9j
YWxOYW1lKCkuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCkKLSAgICAgICAgICAgICAgICAgICAg
PDwgIj1cIiIgPDwgYXR0ci0+dmFsdWUoKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSA8PCAi
XCIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGFpbmVyTm9kZTo6ZHVtcChzdHJlYW0s
aW5kKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5ERUJVRwotdm9pZCBFbGVtZW50Ojpmb3JtYXRG
b3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBT
dHJpbmcgcmVzdWx0OwotICAgIFN0cmluZyBzOwotICAgIAotICAgIHMgPSBub2RlTmFtZSgpOwot
ICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gczsKLSAgICB9Ci0g
ICAgICAgICAgCi0gICAgcyA9IGdldEF0dHJpYnV0ZShpZEF0dHIpOwotICAgIGlmIChzLmxlbmd0
aCgpID4gMCkgewotICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAg
IHJlc3VsdCArPSAiOyAiOwotICAgICAgICByZXN1bHQgKz0gImlkPSI7Ci0gICAgICAgIHJlc3Vs
dCArPSBzOwotICAgIH0KLSAgICAgICAgICAKLSAgICBzID0gZ2V0QXR0cmlidXRlKGNsYXNzQXR0
cik7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3Ro
KCkgPiAwKQotICAgICAgICAgICAgcmVzdWx0ICs9ICI7ICI7Ci0gICAgICAgIHJlc3VsdCArPSAi
Y2xhc3M9IjsKLSAgICAgICAgcmVzdWx0ICs9IHM7Ci0gICAgfQotICAgICAgICAgIAotICAgIHN0
cm5jcHkoYnVmZmVyLCByZXN1bHQuZGVwcmVjYXRlZFN0cmluZygpLmxhdGluMSgpLCBsZW5ndGgg
LSAxKTsKLX0KLSNlbmRpZgotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OnNldEF0dHJpYnV0
ZU5vZGUoQXR0ciAqYXR0ciwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgQVNTRVJUKGF0dHIp
OwotICAgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9jYXN0PEF0dHI+KGF0dHJpYnV0ZXMoZmFsc2Up
LT5zZXROYW1lZEl0ZW0oYXR0ciwgZWMpKTsKLX0KLQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50
OjpyZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIgKmF0dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewot
ICAgIGlmICghYXR0ciB8fCBhdHRyLT5vd25lckVsZW1lbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAg
IGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChn
ZXREb2N1bWVudCgpICE9IGF0dHItPmdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBXUk9O
R19ET0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIE5hbWVkQXR0
ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAg
IHJldHVybiAwOwotCi0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMt
PnJlbW92ZU5hbWVkSXRlbShhdHRyLT5xdWFsaWZpZWROYW1lKCksIGVjKSk7Ci19Ci0KLXZvaWQg
RWxlbWVudDo6c2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0
IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29k
ZSYgZWMpCi17Ci0gICAgU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlmICghRG9jdW1l
bnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSkp
IHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgc2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUocHJlZml4LmltcGwoKSwgbG9j
YWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSksIHZhbHVlLmltcGwoKSwgZWMpOwot
fQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4
Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVu
dCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1YWxp
ZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQot
Ci12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNl
VVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAg
cmVtb3ZlQXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCks
IG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVu
dDo6Z2V0QXR0cmlidXRlTm9kZShjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgTmFtZWRBdHRy
TWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8g
bmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRy
PihhdHRycy0+Z2V0TmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5p
bXBsKCksIG51bGxBdG9tKSkpOwotfQotCi1QYXNzUmVmUHRyPEF0dHI+IEVsZW1lbnQ6OmdldEF0
dHJpYnV0ZU5vZGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBs
b2NhbE5hbWUpCi17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7
Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19w
b2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMtPmdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxB
dG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3BhY2VVUkkuaW1wbCgpKSkpOwotfQotCi1ib29s
IEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAg
TmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1
bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGF0dHJzLT5nZXRB
dHRyaWJ1dGVJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51
bGxBdG9tKSk7Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlTlMoY29uc3QgU3RyaW5n
JiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIE5h
bWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgIGlmICghYXR0cnMpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0o
UXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmlt
cGwoKSkpOwotfQotCi1DU1NTdHlsZURlY2xhcmF0aW9uICpFbGVtZW50OjpzdHlsZSgpCi17Ci0g
ICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRWxlbWVudDo6Zm9jdXMoKQotewotICAgIERvY3VtZW50
KiBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGRvYy0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgaWYg
KGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgZG9jLT5zZXRGb2N1c05vZGUodGhpcyk7Ci0gICAg
ICAgIGlmIChyb290RWRpdGFibGVFbGVtZW50KCkgPT0gdGhpcykgewotICAgICAgICAgICAgLy8g
RklYTUU6IHdlIHNob3VsZCByZXN0b3JlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgdGhlcmUg
aXMgb25lLCBpbnN0ZWFkIG9mIGFsd2F5cyBzZWxlY3RpbmcgYWxsLgotICAgICAgICAgICAgaWYg
KGRvYy0+ZnJhbWUoKS0+c2VsZWN0Q29udGVudHNPZk5vZGUodGhpcykpCi0gICAgICAgICAgICAg
ICAgZG9jLT5mcmFtZSgpLT5yZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChy
ZW5kZXJlcigpICYmICFyZW5kZXJlcigpLT5pc1dpZGdldCgpKQotICAgICAgICAgICAgcmVuZGVy
ZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xsUmVjdFRvVmlzaWJsZShnZXRSZWN0KCkpOwot
ICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpibHVyKCkKLXsKLSAgICBEb2N1bWVudCogZG9jID0g
Z2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jLT5mb2N1c05vZGUoKSA9PSB0aGlzKQotICAgICAg
ICBkb2MtPnNldEZvY3VzTm9kZSgwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OYW1l
ZEF0dHJNYXA6Ok5hbWVkQXR0ck1hcChFbGVtZW50ICplKQotICAgIDogZWxlbWVudChlKQotICAg
ICwgYXR0cnMoMCkKLSAgICAsIGxlbigwKQotewotfQotCi1OYW1lZEF0dHJNYXA6On5OYW1lZEF0
dHJNYXAoKQotewotICAgIE5hbWVkQXR0ck1hcDo6Y2xlYXJBdHRyaWJ1dGVzKCk7IC8vIHZpcnR1
YWwgbWV0aG9kLCBzbyBxdWFsaWZ5IGp1c3QgdG8gYmUgZXhwbGljaXQKLX0KLQotYm9vbCBOYW1l
ZEF0dHJNYXA6OmlzTWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29u
c3QgU3RyaW5nJiBuYW1lKSBjb25zdAotewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxE
b2N1bWVudChlbGVtZW50KSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgcmV0dXJuIGdldE5h
bWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRv
bSkpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6Z2V0TmFtZWRJdGVtTlMo
Y29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25z
dAotewotICAgIHJldHVybiBnZXROYW1lZEl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9j
YWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1QYXNzUmVmUHRyPE5v
ZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhj
ZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50
KGVsZW1lbnQpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJ
dGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwg
ZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVt
TlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBF
eGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmll
ZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBl
Yyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29u
c3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QKLXsKLSAgICBBdHRyaWJ1dGUqIGEgPSBnZXRB
dHRyaWJ1dGVJdGVtKG5hbWUpOwotICAgIGlmICghYSkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4g
YS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5h
bWVkQXR0ck1hcDo6c2V0TmFtZWRJdGVtKE5vZGUqIGFyZywgRXhjZXB0aW9uQ29kZSYgZWMpCi17
Ci0gICAgaWYgKCFlbGVtZW50KSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJS
OiBSYWlzZWQgaWYgdGhpcyBtYXAgaXMgcmVhZG9ubHkuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkg
ewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgYXJn
IHdhcyBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQg
Y3JlYXRlZCB0aGlzIG1hcC4KLSAgICBpZiAoYXJnLT5nZXREb2N1bWVudCgpICE9IGVsZW1lbnQt
PmdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhy
b3cgYSBISUVSQVJDSFlfUkVRVUVTVF9FUlJPUiBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBub24t
YXR0cmlidXRlIG5vZGUKLSAgICBpZiAoIWFyZy0+aXNBdHRyaWJ1dGVOb2RlKCkpIHsKLSAgICAg
ICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0K
LSAgICBBdHRyICphdHRyID0gc3RhdGljX2Nhc3Q8QXR0cio+KGFyZyk7Ci0KLSAgICBBdHRyaWJ1
dGUqIGEgPSBhdHRyLT5hdHRyKCk7Ci0gICAgQXR0cmlidXRlKiBvbGQgPSBnZXRBdHRyaWJ1dGVJ
dGVtKGEtPm5hbWUoKSk7Ci0gICAgaWYgKG9sZCA9PSBhKQotICAgICAgICByZXR1cm4gUmVmUHRy
PE5vZGU+KGFyZyk7IC8vIHdlIGtub3cgYWJvdXQgaXQgYWxyZWFkeQotCi0gICAgLy8gSU5VU0Vf
QVRUUklCVVRFX0VSUjogUmFpc2VkIGlmIGFyZyBpcyBhbiBBdHRyIHRoYXQgaXMgYWxyZWFkeSBh
biBhdHRyaWJ1dGUgb2YgYW5vdGhlciBFbGVtZW50IG9iamVjdC4KLSAgICAvLyBUaGUgRE9NIHVz
ZXIgbXVzdCBleHBsaWNpdGx5IGNsb25lIEF0dHIgbm9kZXMgdG8gcmUtdXNlIHRoZW0gaW4gb3Ro
ZXIgZWxlbWVudHMuCi0gICAgaWYgKGF0dHItPm93bmVyRWxlbWVudCgpKSB7Ci0gICAgICAgIGVj
ID0gSU5VU0VfQVRUUklCVVRFX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAg
aWYgKGEtPm5hbWUoKSA9PSBpZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlkKG9sZCA/
IG9sZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBhLT52YWx1ZSgpKTsKLQotICAgIC8vICMjIyBzbGln
aHRseSBpbmVmZmljaWVudCAtIHJlc2l6ZXMgYXR0cmlidXRlIGFycmF5IHR3aWNlLgotICAgIFJl
ZlB0cjxOb2RlPiByOwotICAgIGlmIChvbGQpIHsKLSAgICAgICAgciA9IG9sZC0+Y3JlYXRlQXR0
cklmTmVlZGVkKGVsZW1lbnQpOwotICAgICAgICByZW1vdmVBdHRyaWJ1dGUoYS0+bmFtZSgpKTsK
LSAgICB9Ci0KLSAgICBhZGRBdHRyaWJ1dGUoYSk7Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwot
fQotCi0vLyBUaGUgRE9NMiBzcGVjIGRvZXNuJ3Qgc2F5IHRoYXQgcmVtb3ZlQXR0cmlidXRlW05T
XSB0aHJvd3MgTk9UX0ZPVU5EX0VSUgotLy8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQs
IGJ1dCBhdCB0aGlzIGxldmVsIHdlIGhhdmUgdG8gdGhyb3cgTk9UX0ZPVU5EX0VSUgotLy8gYmVj
YXVzZSBvZiByZW1vdmVOYW1lZEl0ZW0sIHJlbW92ZU5hbWVkSXRlbU5TLCBhbmQgcmVtb3ZlQXR0
cmlidXRlTm9kZS4KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjpyZW1vdmVOYW1lZEl0
ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAg
Ly8gIyMjIHNob3VsZCB0aGlzIHJlYWxseSBiZSByYWlzZWQgd2hlbiB0aGUgYXR0cmlidXRlIHRv
IHJlbW92ZSBpc24ndCB0aGVyZSBhdCBhbGw/Ci0gICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9X
RURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seQotICAgIGlmIChpc1JlYWRP
bmx5KCkpIHsKLSAgICAgICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEF0dHJpYnV0ZSogYSA9IGdldEF0dHJpYnV0ZUl0
ZW0obmFtZSk7Ci0gICAgaWYgKCFhKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUmVmUHRyPE5vZGU+IHIgPSBhLT5jcmVhdGVB
dHRySWZOZWVkZWQoZWxlbWVudCk7Ci0KLSAgICBpZiAobmFtZSA9PSBpZEF0dHIpCi0gICAgICAg
IGVsZW1lbnQtPnVwZGF0ZUlkKGEtPnZhbHVlKCksIG51bGxBdG9tKTsKLQotICAgIHJlbW92ZUF0
dHJpYnV0ZShuYW1lKTsKLSAgICByZXR1cm4gci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8
Tm9kZT4gTmFtZWRBdHRyTWFwOjppdGVtICggdW5zaWduZWQgaW5kZXggKSBjb25zdAotewotICAg
IGlmIChpbmRleCA+PSBsZW4pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGF0dHJz
W2luZGV4XS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotfQotCi1BdHRyaWJ1dGUqIE5h
bWVkQXR0ck1hcDo6Z2V0QXR0cmlidXRlSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBj
b25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAg
ICBpZiAoYXR0cnNbaV0tPm5hbWUoKS5tYXRjaGVzKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJu
IGF0dHJzW2ldOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOYW1lZEF0dHJNYXA6
OmNsZWFyQXR0cmlidXRlcygpCi17Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGF0dHJzW2ldLT5t
X2ltcGwpCi0gICAgICAgICAgICAgICAgYXR0cnNbaV0tPm1faW1wbC0+bV9lbGVtZW50ID0gMDsK
LSAgICAgICAgICAgIGF0dHJzW2ldLT5kZXJlZigpOwotICAgICAgICB9Ci0gICAgICAgIGZhc3RG
cmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSAwOwotICAgIH0KLSAgICBsZW4gPSAwOwotfQot
Ci12b2lkIE5hbWVkQXR0ck1hcDo6ZGV0YWNoRnJvbUVsZW1lbnQoKQotewotICAgIC8vIHdlIGFs
bG93IGEgTmFtZWRBdHRyTWFwIHcvbyBhbiBlbGVtZW50IGluIGNhc2Ugc29tZW9uZSBzdGlsbCBo
YXMgYSByZWZlcmVuY2UKLSAgICAvLyB0byBpZiBhZnRlciB0aGUgZWxlbWVudCBnZXRzIGRlbGV0
ZWQgLSBidXQgdGhlIG1hcCBpcyBub3cgaW52YWxpZAotICAgIGVsZW1lbnQgPSAwOwotICAgIGNs
ZWFyQXR0cmlidXRlcygpOwotfQotCi1OYW1lZEF0dHJNYXAmIE5hbWVkQXR0ck1hcDo6b3BlcmF0
b3I9KGNvbnN0IE5hbWVkQXR0ck1hcCYgb3RoZXIpCi17Ci0gICAgLy8gY2xvbmUgYWxsIGF0dHJp
YnV0ZXMgaW4gdGhlIG90aGVyIG1hcCwgYnV0IGF0dGFjaCB0byBvdXIgZWxlbWVudAotICAgIGlm
ICghZWxlbWVudCkKLSAgICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgLy8gSWYgYXNzaWduaW5n
IHRoZSBtYXAgY2hhbmdlcyB0aGUgaWQgYXR0cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwKLSAgICAv
LyB1cGRhdGVJZC4KLQotICAgIEF0dHJpYnV0ZSAqb2xkSWQgPSBnZXRBdHRyaWJ1dGVJdGVtKGlk
QXR0cik7Ci0gICAgQXR0cmlidXRlICpuZXdJZCA9IG90aGVyLmdldEF0dHJpYnV0ZUl0ZW0oaWRB
dHRyKTsKLQotICAgIGlmIChvbGRJZCB8fCBuZXdJZCkKLSAgICAgICAgZWxlbWVudC0+dXBkYXRl
SWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1
ZSgpIDogbnVsbEF0b20pOwotCi0gICAgY2xlYXJBdHRyaWJ1dGVzKCk7Ci0gICAgbGVuID0gb3Ro
ZXIubGVuOwotICAgIGF0dHJzID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9j
KGxlbiAqIHNpemVvZihBdHRyaWJ1dGUgKikpKTsKLQotICAgIC8vIGZpcnN0IGluaXRpYWxpemUg
YXR0cnMgdmVjdG9yLCB0aGVuIGNhbGwgYXR0cmlidXRlQ2hhbmdlZCBvbiBpdAotICAgIC8vIHRo
aXMgYWxsb3dzIGF0dHJpYnV0ZUNoYW5nZWQgdG8gdXNlIGdldEF0dHJpYnV0ZQotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBhdHRyc1tpXSA9IG90aGVy
LmF0dHJzW2ldLT5jbG9uZSgpOwotICAgICAgICBhdHRyc1tpXS0+cmVmKCk7Ci0gICAgfQotCi0g
ICAgLy8gRklYTUU6IFRoaXMgaXMgd2FzdGVmdWwuICBUaGUgY2xhc3MgbGlzdCBjb3VsZCBiZSBw
cmVzZXJ2ZWQgb24gYSBjb3B5LCBhbmQgd2UKLSAgICAvLyB3b3VsZG4ndCBoYXZlIHRvIHdhc3Rl
IHRpbWUgcmVwYXJzaW5nIHRoZSBhdHRyaWJ1dGUuCi0gICAgLy8gVGhlIGRlcml2ZWQgY2xhc3Ms
IEhUTUxOYW1lZEF0dHJNYXAsIHdoaWNoIG1hbmFnZXMgYSBwYXJzZWQgY2xhc3MgbGlzdCBmb3Ig
dGhlIENMQVNTIGF0dHJpYnV0ZSwKLSAgICAvLyB3aWxsIHVwZGF0ZSBpdHMgbWVtYmVyIHZhcmlh
YmxlIHdoZW4gcGFyc2UgYXR0cmlidXRlIGlzIGNhbGxlZC4KLSAgICBmb3IodW5zaWduZWQgaSA9
IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgZWxlbWVudC0+YXR0cmlidXRlQ2hhbmdlZChhdHRy
c1tpXSwgdHJ1ZSk7Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFw
OjphZGRBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyaWJ1dGUpCi17Ci0gICAgLy8gQWRkIHRoZSBh
dHRyaWJ1dGUgdG8gdGhlIGxpc3QKLSAgICBBdHRyaWJ1dGUgKipuZXdBdHRycyA9IHN0YXRpY19j
YXN0PEF0dHJpYnV0ZSAqKj4oZmFzdE1hbGxvYygobGVuICsgMSkgKiBzaXplb2YoQXR0cmlidXRl
ICopKSk7Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bGVuOyBpKyspCi0gICAgICAgIG5ld0F0dHJzW2ldID0gYXR0cnNbaV07Ci0gICAgICBmYXN0RnJl
ZShhdHRycyk7Ci0gICAgfQotICAgIGF0dHJzID0gbmV3QXR0cnM7Ci0gICAgYXR0cnNbbGVuKytd
ID0gYXR0cmlidXRlOwotICAgIGF0dHJpYnV0ZS0+cmVmKCk7Ci0KLSAgICBBdHRyICogY29uc3Qg
YXR0ciA9IGF0dHJpYnV0ZS0+bV9pbXBsOwotICAgIGlmIChhdHRyKQotICAgICAgICBhdHRyLT5t
X2VsZW1lbnQgPSBlbGVtZW50OwotCi0gICAgLy8gTm90aWZ5IHRoZSBlbGVtZW50IHRoYXQgdGhl
IGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCwgYW5kIGRpc3BhdGNoIGFwcHJvcHJpYXRlIG11dGF0
aW9uIGV2ZW50cwotICAgIC8vIE5vdGUgdGhhdCBlbGVtZW50IG1heSBiZSBudWxsIGhlcmUgaWYg
d2UgYXJlIGNhbGxlZCBmcm9tIGluc2VydEF0dHIoKSBkdXJpbmcgcGFyc2luZwotICAgIGlmIChl
bGVtZW50KSB7Ci0gICAgICAgIFJlZlB0cjxBdHRyaWJ1dGU+IGEgPSBhdHRyaWJ1dGU7Ci0gICAg
ICAgIGVsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQoYS5nZXQoKSk7Ci0gICAgICAgIC8vIEJlY2F1
c2Ugb2Ygb3VyIHVwZGF0ZVN0eWxlQXR0cmlidXRlSWZOZWVkZWQoKSBzdHlsZSBtb2RpZmljYXRp
b24gZXZlbnRzIGFyZSBuZXZlciBzZW50IGF0IHRoZSByaWdodCB0aW1lLCBzbyBkb24ndCBib3Ro
ZXIgc2VuZGluZyB0aGVtLgotICAgICAgICBpZiAoYS0+bmFtZSgpICE9IHN0eWxlQXR0cikgewot
ICAgICAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hBdHRyQWRkaXRpb25FdmVudChhLmdldCgpKTsK
LSAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQoZmFsc2Up
OwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6cmVtb3ZlQXR0cmli
dXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpCi17Ci0gICAgdW5zaWduZWQgaW5kZXggPSBs
ZW4rMTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgICAgIGlm
IChhdHRyc1tpXS0+bmFtZSgpLm1hdGNoZXMobmFtZSkpIHsKLSAgICAgICAgICAgIGluZGV4ID0g
aTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBpZiAoaW5kZXggPj0gbGVu
KSByZXR1cm47Ci0KLSAgICAvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0Ci0g
ICAgQXR0cmlidXRlKiBhdHRyID0gYXR0cnNbaW5kZXhdOwotICAgIGlmIChhdHRyc1tpbmRleF0t
Pm1faW1wbCkKLSAgICAgICAgYXR0cnNbaW5kZXhdLT5tX2ltcGwtPm1fZWxlbWVudCA9IDA7Ci0g
ICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0
cnMgPSAwOwotICAgICAgICBsZW4gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEF0dHJpYnV0
ZSAqKm5ld0F0dHJzID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKChsZW4g
LSAxKSAqIHNpemVvZihBdHRyaWJ1dGUgKikpKTsKLSAgICAgICAgdW5zaWduZWQgaTsKLSAgICAg
ICAgZm9yIChpID0gMDsgaSA8IHVuc2lnbmVkKGluZGV4KTsgaSsrKQotICAgICAgICAgICAgbmV3
QXR0cnNbaV0gPSBhdHRyc1tpXTsKLSAgICAgICAgbGVuLS07Ci0gICAgICAgIGZvciAoOyBpIDwg
bGVuOyBpKyspCi0gICAgICAgICAgICBuZXdBdHRyc1tpXSA9IGF0dHJzW2krMV07Ci0gICAgICAg
IGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSBuZXdBdHRyczsKLSAgICB9Ci0KLSAg
ICAvLyBOb3RpZnkgdGhlIGVsZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIHJlbW92
ZWQKLSAgICAvLyBkaXNwYXRjaCBhcHByb3ByaWF0ZSBtdXRhdGlvbiBldmVudHMKLSAgICBpZiAo
ZWxlbWVudCAmJiAhYXR0ci0+bV92YWx1ZS5pc051bGwoKSkgewotICAgICAgICBBdG9taWNTdHJp
bmcgdmFsdWUgPSBhdHRyLT5tX3ZhbHVlOwotICAgICAgICBhdHRyLT5tX3ZhbHVlID0gbnVsbEF0
b207Ci0gICAgICAgIGVsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQoYXR0cik7Ci0gICAgICAgIGF0
dHItPm1fdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAg
ZWxlbWVudC0+ZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KGF0dHIpOwotICAgICAgICBlbGVtZW50
LT5kaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50KGZhbHNlKTsKLSAgICB9Ci0gICAgYXR0ci0+
ZGVyZWYoKTsKLX0KLQotYm9vbCBOYW1lZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5h
bWVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0Ci17Ci0gICAgaWYgKCFvdGhlck1hcCkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChsZW5ndGgoKSAhPSBvdGhlck1hcC0+bGVu
Z3RoKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbGVuZ3RoKCk7IGkrKykgewotICAgICAgICBBdHRyaWJ1dGUgKmF0dHIgPSBhdHRy
aWJ1dGVJdGVtKGkpOwotICAgICAgICBBdHRyaWJ1dGUgKm90aGVyQXR0ciA9IG90aGVyTWFwLT5n
ZXRBdHRyaWJ1dGVJdGVtKGF0dHItPm5hbWUoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYg
KCFvdGhlckF0dHIgfHwgYXR0ci0+dmFsdWUoKSAhPSBvdGhlckF0dHItPnZhbHVlKCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0eWxlZCBFbGVtZW50IGFuZCBN
YXBwZWQgQXR0cmlidXRlIEltcGxlbWVudGF0aW9uCi0KLUNTU01hcHBlZEF0dHJpYnV0ZURlY2xh
cmF0aW9uOjp+Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oKQotewotICAgIGlmIChtX2Vu
dHJ5VHlwZSAhPSBlUGVyc2lzdGVudCkKLSAgICAgICAgU3R5bGVkRWxlbWVudDo6cmVtb3ZlTWFw
cGVkQXR0cmlidXRlRGVjbChtX2VudHJ5VHlwZSwgbV9hdHRyTmFtZSwgbV9hdHRyVmFsdWUpOwot
fQotCi1DU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6Z2V0TWFw
cGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeVR5cGUsIEF0dHJpYnV0
ZSogYXR0cikKLXsKLSAgICBpZiAoIW1hcHBlZEF0dHJpYnV0ZURlY2xzKQotICAgICAgICByZXR1
cm4gMDsKLSAgICByZXR1cm4gbWFwcGVkQXR0cmlidXRlRGVjbHMtPmdldChNYXBwZWRBdHRyaWJ1
dGVLZXkoZW50cnlUeXBlLCBhdHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuaW1wbCgpLCBhdHRyLT52
YWx1ZSgpLmltcGwoKSkpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OnNldE1hcHBlZEF0dHJp
YnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkgZW50cnlUeXBlLCBBdHRyaWJ1dGUqIGF0dHIs
IENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsKQotewotICAgIGlmICghbWFwcGVk
QXR0cmlidXRlRGVjbHMpCi0gICAgICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzID0gbmV3IE1hcHBl
ZEF0dHJpYnV0ZURlY2xzOwotICAgIG1hcHBlZEF0dHJpYnV0ZURlY2xzLT5zZXQoTWFwcGVkQXR0
cmlidXRlS2V5KGVudHJ5VHlwZSwgYXR0ci0+bmFtZSgpLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0
ci0+dmFsdWUoKS5pbXBsKCkpLCBkZWNsKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpyZW1v
dmVNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IGVudHJ5VHlwZSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUXVh
bGlmaWVkTmFtZSYgYXR0ck5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgYXR0clZhbHVlKQotewot
ICAgIGlmICghbWFwcGVkQXR0cmlidXRlRGVjbHMpCi0gICAgICAgIHJldHVybjsKLSAgICBtYXBw
ZWRBdHRyaWJ1dGVEZWNscy0+cmVtb3ZlKE1hcHBlZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0
dHJOYW1lLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0clZhbHVlLmltcGwoKSkpOwotfQotCi12b2lk
IFN0eWxlZEVsZW1lbnQ6OmludmFsaWRhdGVTdHlsZUF0dHJpYnV0ZSgpCi17Ci0gICAgbV9pc1N0
eWxlQXR0cmlidXRlVmFsaWQgPSBmYWxzZTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50Ojp1cGRh
dGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCkgY29uc3QKLXsKLSAgICBpZiAoIW1faXNTdHlsZUF0
dHJpYnV0ZVZhbGlkKSB7Ci0gICAgICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsK
LSAgICAgICAgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1dGUgPSB0cnVlOwotICAgICAgICBp
ZiAobV9pbmxpbmVTdHlsZURlY2wpCi0gICAgICAgICAgICBjb25zdF9jYXN0PFN0eWxlZEVsZW1l
bnQqPih0aGlzKS0+c2V0QXR0cmlidXRlKHN0eWxlQXR0ciwgbV9pbmxpbmVTdHlsZURlY2wtPmNz
c1RleHQoKSk7Ci0gICAgICAgIG1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlID0gZmFsc2U7
Ci0gICAgfQotfQotCi1BdHRyaWJ1dGUqIE1hcHBlZEF0dHJpYnV0ZTo6Y2xvbmUoYm9vbCBwcmVz
ZXJ2ZURlY2wpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5ldyBNYXBwZWRBdHRyaWJ1dGUobmFtZSgp
LCB2YWx1ZSgpLCBwcmVzZXJ2ZURlY2wgPyBtX3N0eWxlRGVjbC5nZXQoKSA6IDApOwotfQotCi1O
YW1lZE1hcHBlZEF0dHJNYXA6Ok5hbWVkTWFwcGVkQXR0ck1hcChFbGVtZW50ICplKQotOk5hbWVk
QXR0ck1hcChlKSwgbV9tYXBwZWRBdHRyaWJ1dGVDb3VudCgwKQote30KLQotdm9pZCBOYW1lZE1h
cHBlZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygpCi17Ci0gICAgbV9jbGFzc0xpc3QuY2xlYXIo
KTsKLSAgICBtX21hcHBlZEF0dHJpYnV0ZUNvdW50ID0gMDsKLSAgICBOYW1lZEF0dHJNYXA6OmNs
ZWFyQXR0cmlidXRlcygpOwotfQotCi1ib29sIE5hbWVkTWFwcGVkQXR0ck1hcDo6aXNNYXBwZWRB
dHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgTmFtZWRN
YXBwZWRBdHRyTWFwOjpkZWNsQ291bnQoKSBjb25zdAotewotICAgIGludCByZXN1bHQgPSAwOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIE1h
cHBlZEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgIGlmIChhdHRy
LT5kZWNsKCkpCi0gICAgICAgICAgICByZXN1bHQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3Vs
dDsKLX0KLQotYm9vbCBOYW1lZE1hcHBlZEF0dHJNYXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5h
bWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0Ci17Ci0gICAgLy8gVGhlICMgb2YgZGVj
bHMgbXVzdCBtYXRjaC4KLSAgICBpZiAoZGVjbENvdW50KCkgIT0gb3RoZXJNYXAtPmRlY2xDb3Vu
dCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgLy8gVGhlIHZhbHVlcyBmb3Ig
ZWFjaCBkZWNsIG11c3QgbWF0Y2guCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0
aCgpOyBpKyspIHsKLSAgICAgICAgTWFwcGVkQXR0cmlidXRlKiBhdHRyID0gYXR0cmlidXRlSXRl
bShpKTsKLSAgICAgICAgaWYgKGF0dHItPmRlY2woKSkgewotICAgICAgICAgICAgQXR0cmlidXRl
KiBvdGhlckF0dHIgPSBvdGhlck1hcC0+Z2V0QXR0cmlidXRlSXRlbShhdHRyLT5uYW1lKCkpOwot
ICAgICAgICAgICAgaWYgKCFvdGhlckF0dHIgfHwgKGF0dHItPnZhbHVlKCkgIT0gb3RoZXJBdHRy
LT52YWx1ZSgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWlubGluZSBzdGF0aWMgYm9vbCBpc0NsYXNzV2hp
dGVzcGFjZShRQ2hhciBjKQotewotICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdccicgfHwg
YyA9PSAnXG4nIHx8IGMgPT0gJ1x0JzsKLX0KLQotdm9pZCBOYW1lZE1hcHBlZEF0dHJNYXA6OnBh
cnNlQ2xhc3NBdHRyaWJ1dGUoY29uc3QgU3RyaW5nJiBjbGFzc1N0cikKLXsKLSAgICBtX2NsYXNz
TGlzdC5jbGVhcigpOwotICAgIGlmICghZWxlbWVudC0+aGFzQ2xhc3MoKSkKLSAgICAgICAgcmV0
dXJuOwotICAgIAotICAgIFN0cmluZyBjbGFzc0F0dHIgPSBlbGVtZW50LT5nZXREb2N1bWVudCgp
LT5pbkNvbXBhdE1vZGUoKSA/IAotICAgICAgICAoY2xhc3NTdHIuaW1wbCgpLT5pc0xvd2VyKCkg
PyBjbGFzc1N0ciA6IFN0cmluZyhjbGFzc1N0ci5pbXBsKCktPmxvd2VyKCkpKSA6Ci0gICAgICAg
IGNsYXNzU3RyOwotICAgIAotICAgIEF0b21pY1N0cmluZ0xpc3QqIGN1cnIgPSAwOwotICAgIAot
ICAgIGNvbnN0IFFDaGFyKiBzdHIgPSBjbGFzc0F0dHIudW5pY29kZSgpOwotICAgIGludCBsZW5n
dGggPSBjbGFzc0F0dHIubGVuZ3RoKCk7Ci0gICAgaW50IHNQb3MgPSAwOwotCi0gICAgd2hpbGUg
KHRydWUpIHsKLSAgICAgICAgd2hpbGUgKHNQb3MgPCBsZW5ndGggJiYgaXNDbGFzc1doaXRlc3Bh
Y2Uoc3RyW3NQb3NdKSkKLSAgICAgICAgICAgICsrc1BvczsKLSAgICAgICAgaWYgKHNQb3MgPj0g
bGVuZ3RoKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGludCBlUG9zID0gc1BvcyArIDE7
Ci0gICAgICAgIHdoaWxlIChlUG9zIDwgbGVuZ3RoICYmICFpc0NsYXNzV2hpdGVzcGFjZShzdHJb
ZVBvc10pKQotICAgICAgICAgICAgKytlUG9zOwotICAgICAgICBpZiAoY3VycikgewotICAgICAg
ICAgICAgY3Vyci0+c2V0TmV4dChuZXcgQXRvbWljU3RyaW5nTGlzdChBdG9taWNTdHJpbmcoc3Ry
ICsgc1BvcywgZVBvcyAtIHNQb3MpKSk7Ci0gICAgICAgICAgICBjdXJyID0gY3Vyci0+bmV4dCgp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNQb3MgPT0gMCAmJiBlUG9zID09
IGxlbmd0aCkgewotICAgICAgICAgICAgICAgIG1fY2xhc3NMaXN0LnNldFN0cmluZyhBdG9taWNT
dHJpbmcoY2xhc3NBdHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBtX2NsYXNzTGlzdC5zZXRTdHJpbmcoQXRvbWljU3RyaW5nKHN0ciArIHNQ
b3MsIGVQb3MgLSBzUG9zKSk7Ci0gICAgICAgICAgICBjdXJyID0gJm1fY2xhc3NMaXN0OwotICAg
ICAgICB9Ci0gICAgICAgIHNQb3MgPSBlUG9zICsgMTsKLSAgICB9Ci19Ci0KLVN0eWxlZEVsZW1l
bnQ6OlN0eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgRG9jdW1lbnQgKmRv
YykKLSAgICA6IEVsZW1lbnQobmFtZSwgZG9jKQotewotICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZh
bGlkID0gdHJ1ZTsKLSAgICBtX3N5bmNocm9uaXppbmdTdHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwot
fQotCi1TdHlsZWRFbGVtZW50Ojp+U3R5bGVkRWxlbWVudCgpCi17Ci0gICAgZGVzdHJveUlubGlu
ZVN0eWxlRGVjbCgpOwotfQotCi1BdHRyaWJ1dGUqIFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJp
YnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBTdHJpbmdJbXBsKiB2YWx1ZSkKLXsKLSAg
ICByZXR1cm4gbmV3IE1hcHBlZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5
bGVkRWxlbWVudDo6Y3JlYXRlSW5saW5lU3R5bGVEZWNsKCkKLXsKLSAgICBtX2lubGluZVN0eWxl
RGVjbCA9IG5ldyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjsKLSAgICBtX2lubGluZVN0eWxl
RGVjbC0+c2V0UGFyZW50KGdldERvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICBtX2lu
bGluZVN0eWxlRGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0
U3RyaWN0UGFyc2luZyghZ2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpOwotfQotCi12b2lk
IFN0eWxlZEVsZW1lbnQ6OmRlc3Ryb3lJbmxpbmVTdHlsZURlY2woKQotewotICAgIGlmIChtX2lu
bGluZVN0eWxlRGVjbCkgewotICAgICAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0Tm9kZSgwKTsK
LSAgICAgICAgbV9pbmxpbmVTdHlsZURlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgbV9pbmxp
bmVTdHlsZURlY2wgPSAwOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphdHRyaWJ1
dGVDaGFuZ2VkKEF0dHJpYnV0ZSogYXR0ciwgYm9vbCBwcmVzZXJ2ZURlY2xzKQotewotICAgIE1h
cHBlZEF0dHJpYnV0ZSogbWFwcGVkQXR0ciA9IHN0YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+
KGF0dHIpOwotICAgIGlmIChtYXBwZWRBdHRyLT5kZWNsKCkgJiYgIXByZXNlcnZlRGVjbHMpIHsK
LSAgICAgICAgbWFwcGVkQXR0ci0+c2V0RGVjbCgwKTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwot
ICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygp
LT5kZWNsUmVtb3ZlZCgpOwotICAgIH0KLQotICAgIGJvb2wgY2hlY2tEZWNsID0gdHJ1ZTsKLSAg
ICBNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeTsKLSAgICBib29sIG5lZWRUb1BhcnNlID0gbWFw
VG9FbnRyeShhdHRyLT5uYW1lKCksIGVudHJ5KTsKLSAgICBpZiAocHJlc2VydmVEZWNscykgewot
ICAgICAgICBpZiAobWFwcGVkQXR0ci0+ZGVjbCgpKSB7Ci0gICAgICAgICAgICBzZXRDaGFuZ2Vk
KCk7Ci0gICAgICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgICAgIG1hcHBl
ZEF0dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVja0RlY2wgPSBmYWxz
ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghYXR0ci0+aXNOdWxsKCkgJiYgZW50
cnkgIT0gZU5vbmUpIHsKLSAgICAgICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRl
Y2wgPSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVudHJ5LCBhdHRyKTsKLSAgICAgICAgaWYgKGRl
Y2wpIHsKLSAgICAgICAgICAgIG1hcHBlZEF0dHItPnNldERlY2woZGVjbCk7Ci0gICAgICAgICAg
ICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAg
ICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVj
a0RlY2wgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZWVkVG9QYXJzZSA9
IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG5lZWRUb1BhcnNlKQotICAgICAgICBwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShtYXBwZWRBdHRyKTsKLSAgICAKLSAgICBpZiAoY2hlY2tEZWNsICYmIG1hcHBl
ZEF0dHItPmRlY2woKSkgewotICAgICAgICAvLyBBZGQgdGhlIGRlY2wgdG8gdGhlIHRhYmxlIGlu
IHRoZSBhcHByb3ByaWF0ZSBzcG90LgotICAgICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVu
dHJ5LCBhdHRyLCBtYXBwZWRBdHRyLT5kZWNsKCkpOwotICAgICAgICBtYXBwZWRBdHRyLT5kZWNs
KCktPnNldE1hcHBlZFN0YXRlKGVudHJ5LCBhdHRyLT5uYW1lKCksIGF0dHItPnZhbHVlKCkpOwot
ICAgICAgICBtYXBwZWRBdHRyLT5kZWNsKCktPnNldFBhcmVudCgwKTsKLSAgICAgICAgbWFwcGVk
QXR0ci0+ZGVjbCgpLT5zZXROb2RlKDApOwotICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAg
ICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5kZWNsQWRkZWQoKTsKLSAgICB9Ci19Ci0KLWJv
b2wgU3R5bGVkRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFt
ZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICByZXN1bHQgPSBl
Tm9uZTsKLSAgICBpZiAoYXR0ck5hbWUgPT0gc3R5bGVBdHRyKQotICAgICAgICByZXR1cm4gIW1f
c3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lk
IFN0eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0
cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGlkQXR0cikgewotICAgICAgICAvLyB1bmlx
dWUgaWQKLSAgICAgICAgc2V0SGFzSUQoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKG5h
bWVkQXR0ck1hcCkgewotICAgICAgICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKQotICAgICAgICAg
ICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQobnVsbEF0b20pOwotICAgICAgICAgICAgZWxzZSBp
ZiAoZ2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkgJiYgIWF0dHItPnZhbHVlKCkuaW1wbCgp
LT5pc0xvd2VyKCkpCi0gICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChBdG9taWNT
dHJpbmcoYXR0ci0+dmFsdWUoKS5kb21TdHJpbmcoKS5sb3dlcigpKSk7Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgbmFtZWRBdHRyTWFwLT5zZXRJRChhdHRyLT52YWx1ZSgpKTsK
LSAgICAgICAgfQotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gY2xhc3NBdHRyKSB7Ci0gICAgICAgIC8vIGNsYXNzCi0gICAgICAgIHNldEhhc0Ns
YXNzKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAgIGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAg
ICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPnBhcnNlQ2xhc3NBdHRyaWJ1dGUoYXR0ci0+dmFsdWUo
KSk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBzdHlsZUF0dHIpIHsKLSAgICAgICAgc2V0SGFzU3R5bGUoIWF0dHItPmlzTnVsbCgpKTsKLSAg
ICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKQotICAgICAgICAgICAgZGVzdHJveUlubGluZVN0eWxl
RGVjbCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnZXRJbmxpbmVTdHlsZURlY2woKS0+
cGFyc2VEZWNsYXJhdGlvbihhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgbV9pc1N0eWxlQXR0cmli
dXRlVmFsaWQgPSB0cnVlOwotICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgfQotfQotCi12b2lk
IFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0Ci17Ci0gICAgbmFtZWRB
dHRyTWFwID0gbmV3IE5hbWVkTWFwcGVkQXR0ck1hcChjb25zdF9jYXN0PFN0eWxlZEVsZW1lbnQq
Pih0aGlzKSk7Ci19Ci0KLUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50
OjpnZXRJbmxpbmVTdHlsZURlY2woKQotewotICAgIGlmICghbV9pbmxpbmVTdHlsZURlY2wpCi0g
ICAgICAgIGNyZWF0ZUlubGluZVN0eWxlRGVjbCgpOwotICAgIHJldHVybiBtX2lubGluZVN0eWxl
RGVjbC5nZXQoKTsKLX0KLQotQ1NTU3R5bGVEZWNsYXJhdGlvbiogU3R5bGVkRWxlbWVudDo6c3R5
bGUoKQotewotICAgIHJldHVybiBnZXRJbmxpbmVTdHlsZURlY2woKTsKLX0KLQotQ1NTTXV0YWJs
ZVN0eWxlRGVjbGFyYXRpb24qIFN0eWxlZEVsZW1lbnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHls
ZURlY2woKQotewotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmdMaXN0KiBT
dHlsZWRFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lZEF0
dHJNYXAgPyBtYXBwZWRBdHRyaWJ1dGVzKCktPmdldENsYXNzTGlzdCgpIDogMDsKLX0KLQotc3Rh
dGljIGlubGluZSBib29sIGlzSGV4RGlnaXQoIGNvbnN0IFFDaGFyICZjICkgewotICAgIHJldHVy
biAoIGMgPj0gJzAnICYmIGMgPD0gJzknICkgfHwKLSAgICAgICAgICAgKCBjID49ICdhJyAmJiBj
IDw9ICdmJyApIHx8Ci0gICAgICAgICAgICggYyA+PSAnQScgJiYgYyA8PSAnRicgKTsKLX0KLQot
c3RhdGljIGlubGluZSBpbnQgdG9IZXgoIGNvbnN0IFFDaGFyICZjICkgewotICAgIHJldHVybiAo
IChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgICA/IChjLnVuaWNvZGUoKSAtICcw
JykKLSAgICAgICAgICAgICA6ICggKCBjID49ICdhJyAmJiBjIDw9ICdmJyApCi0gICAgICAgICAg
ICAgICAgID8gKGMudW5pY29kZSgpIC0gJ2EnICsgMTApCi0gICAgICAgICAgICAgICAgIDogKCAo
IGMgPj0gJ0EnICYmIGMgPD0gJ0YnICkKLSAgICAgICAgICAgICAgICAgICAgID8gKGMudW5pY29k
ZSgpIC0gJ0EnICsgMTApCi0gICAgICAgICAgICAgICAgICAgICA6IC0xICkgKSApOwotfQotCi12
b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwg
aW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBj
cmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQs
IHZhbHVlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6YWRkQ1NTUHJvcGVydHko
TWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQsIGludCB2YWx1ZSkKLXsKLSAgICBpZiAoIWF0
dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNl
dFByb3BlcnR5KGlkLCB2YWx1ZSwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFk
ZENTU1N0cmluZ1Byb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBT
dHJpbmcgJnZhbHVlLCBDU1NQcmltaXRpdmVWYWx1ZTo6VW5pdFR5cGVzIHR5cGUpCi17Ci0gICAg
aWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVj
bCgpLT5zZXRTdHJpbmdQcm9wZXJ0eShpZCwgdmFsdWUsIHR5cGUsIGZhbHNlKTsKLX0KLQotdm9p
ZCBTdHlsZWRFbGVtZW50OjphZGRDU1NJbWFnZVByb3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0
ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJlVSTCkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkg
Y3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldEltYWdlUHJvcGVy
dHkoaWQsIFVSTCwgZmFsc2UpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0xlbmd0
aChNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICAvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IHNwaW4gdXAgdGhlIENTUyBw
YXJzZXIsIGJ1dCBzaG91bGQgaW5zdGVhZCBqdXN0IGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QKLSAg
ICAvLyBsZW5ndGggdW5pdCBhbmQgbWFrZSB0aGUgYXBwcm9wcmlhdGUgcGFyc2VkIHZhbHVlLgot
ICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotCi0gICAgLy8g
c3RyaXAgYXR0cmlidXRlIGdhcmJhZ2UuLgotICAgIFN0cmluZ0ltcGwqIHYgPSB2YWx1ZS5pbXBs
KCk7Ci0gICAgaWYgKHYpIHsKLSAgICAgICAgdW5zaWduZWQgaW50IGwgPSAwOwotICAgICAgICAK
LSAgICAgICAgd2hpbGUgKGwgPCB2LT5sZW5ndGgoKSAmJiAoKnYpW2xdLnVuaWNvZGUoKSA8PSAn
ICcpCi0gICAgICAgICAgICBsKys7Ci0gICAgICAgIAotICAgICAgICBmb3IgKDsgbCA8IHYtPmxl
bmd0aCgpOyBsKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2MgPSAoKnYpW2xdLmxhdGluMSgpOwot
ICAgICAgICAgICAgaWYgKGNjID4gJzknIHx8IChjYyA8ICcwJyAmJiBjYyAhPSAnKicgJiYgY2Mg
IT0gJyUnICYmIGNjICE9ICcuJykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAobCAhPSB2LT5sZW5ndGgoKSkgewotICAgICAgICAgICAgYXR0ci0+ZGVj
bCgpLT5zZXRMZW5ndGhQcm9wZXJ0eShpZCwgdi0+c3Vic3RyaW5nKDAsIGwpLCBmYWxzZSk7Ci0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgYXR0ci0+ZGVj
bCgpLT5zZXRMZW5ndGhQcm9wZXJ0eShpZCwgdmFsdWUsIGZhbHNlKTsKLX0KLQotLyogY29sb3Ig
cGFyc2luZyB0aGF0IHRyaWVzIHRvIG1hdGNoIGFzIGNsb3NlIGFzIHBvc3NpYmxlIElFIDYuICov
Ci12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0NvbG9yKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwg
aW50IGlkLCBjb25zdCBTdHJpbmcgJmMpCi17Ci0gICAgLy8gdGhpcyBpcyB0aGUgb25seSBjYXNl
IG5vIGNvbG9yIGdldHMgYXBwbGllZCBpbiBJRS4KLSAgICBpZiAoICFjLmxlbmd0aCgpICkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2wo
YXR0cik7Ci0gICAgCi0gICAgaWYgKGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIGMsIGZh
bHNlKSApCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBEZXByZWNhdGVkU3RyaW5nIGNvbG9y
ID0gYy5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAgLy8gbm90IHNvbWV0aGluZyB0aGF0IGZpdHMg
dGhlIHNwZWNzLgotICAgIAotICAgIC8vIHdlJ3JlIGVtdWxhdGluZyBJRXMgY29sb3IgcGFyc2Vy
IGhlcmUuIEl0IG1hcHMgdHJhbnNwYXJlbnQgdG8gYmxhY2ssIG90aGVyd2lzZSBpdCB0cmllcyB0
byBidWlsZCBhIHJnYiB2YWx1ZQotICAgIC8vIG91dCBvZiBldmVyeWh0aW5nIHlvdSBwdXQgaW4u
IFRoZSBhbGdvcml0aG0gaXMgZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZCwgYnV0IHNlZW1zIHRv
IHdvcmsgZm9yIGFsbCB0ZXN0IGNhc2VzIEkgaGF2ZS4KLSAgICAKLSAgICAvLyB0aGUgbGVuZ3Ro
IG9mIHRoZSBjb2xvciB2YWx1ZSBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0Ci0gICAgLy8gbXVs
dGlwbGUgb2YgMy4gZWFjaCBwYXJ0IG9mIHRoZSByZ2IgdHJpcGxlIHRoZW4gZ2V0cyBvbmUgdGhp
cmQKLSAgICAvLyBvZiB0aGUgbGVuZ3RoLgotICAgIC8vCi0gICAgLy8gRWFjaCB0cmlwbGV0IGlz
IHBhcnNlZCBieXRlIGJ5IGJ5dGUsIG1hcHBpbmcKLSAgICAvLyBlYWNoIG51bWJlciB0byBhIGhl
eCB2YWx1ZSAoMC05YS1mQS1GIHRvIHRoZWlyIHZhbHVlcwotICAgIC8vIGV2ZXJ5dGhpbmcgZWxz
ZSB0byAwKS4KLSAgICAvLwotICAgIC8vIFRoZSBoaWdoZXN0IG5vbiB6ZXJvIGRpZ2l0IGluIGFs
bCB0cmlwbGV0cyBpcyByZW1lbWJlcmVkLCBhbmQKLSAgICAvLyB1c2VkIGFzIGEgbm9ybWFsaXph
dGlvbiBwb2ludCB0byBub3JtYWxpemUgdG8gdmFsdWVzIGJldHdlZW4gMAotICAgIC8vIGFuZCAy
NTUuCi0gICAgCi0gICAgaWYgKCBjb2xvci5sb3dlcigpICE9ICJ0cmFuc3BhcmVudCIgKSB7Ci0g
ICAgICAgIGlmICggY29sb3JbMF0gPT0gJyMnICkKLSAgICAgICAgICAgIGNvbG9yLnJlbW92ZSgg
MCwgIDEgKTsKLSAgICAgICAgaW50IGJhc2ljTGVuZ3RoID0gKGNvbG9yLmxlbmd0aCgpICsgMikg
LyAzOwotICAgICAgICBpZiAoIGJhc2ljTGVuZ3RoID4gMSApIHsKLSAgICAgICAgICAgIC8vIElF
IGlnbm9yZXMgY29sb3JzIHdpdGggdGhyZWUgZGlnaXRzIG9yIGxlc3MKLSAgICAgICAgICAgIGlu
dCBjb2xvcnNbM10gPSB7IDAsIDAsIDAgfTsKLSAgICAgICAgICAgIGludCBjb21wb25lbnQgPSAw
OwotICAgICAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgICAgICBpbnQgbWF4RGlnaXQgPSBi
YXNpY0xlbmd0aC0xOwotICAgICAgICAgICAgd2hpbGUgKCBjb21wb25lbnQgPCAzICkgewotICAg
ICAgICAgICAgICAgIC8vIHNlYXJjaCBmb3J3YXJkIGZvciBkaWdpdHMgaW4gdGhlIHN0cmluZwot
ICAgICAgICAgICAgICAgIGludCBudW1EaWdpdHMgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxl
ICggcG9zIDwgKGludCljb2xvci5sZW5ndGgoKSAmJiBudW1EaWdpdHMgPCBiYXNpY0xlbmd0aCAp
IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhleCA9IHRvSGV4KCBjb2xvcltwb3NdICk7Ci0g
ICAgICAgICAgICAgICAgICAgIGNvbG9yc1tjb21wb25lbnRdID0gKGNvbG9yc1tjb21wb25lbnRd
IDw8IDQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGhleCA+IDAgKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50XSArPSBoZXg7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBtYXhEaWdpdCA9IGtNaW4oIG1heERpZ2l0LCBudW1EaWdpdHMgKTsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBudW1EaWdpdHMrKzsKLSAgICAgICAg
ICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdo
aWxlICggbnVtRGlnaXRzKysgPCBiYXNpY0xlbmd0aCApCi0gICAgICAgICAgICAgICAgICAgIGNv
bG9yc1tjb21wb25lbnRdIDw8PSA0OwotICAgICAgICAgICAgICAgIGNvbXBvbmVudCsrOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgbWF4RGlnaXQgPSBiYXNpY0xlbmd0aCAtIG1heERpZ2l0
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBub3JtYWxpemUgdG8gMDAtZmYuIFRoZSBo
aWdoZXN0IGZpbGxlZCBkaWdpdCBjb3VudHMsIG1pbmltdW0gaXMgMiBkaWdpdHMKLSAgICAgICAg
ICAgIG1heERpZ2l0IC09IDI7Ci0gICAgICAgICAgICBjb2xvcnNbMF0gPj49IDQqbWF4RGlnaXQ7
Ci0gICAgICAgICAgICBjb2xvcnNbMV0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICBjb2xv
cnNbMl0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICAvLyBhc3NlcnQoIGNvbG9yc1swXSA8
IDB4MTAwICYmIGNvbG9yc1sxXSA8IDB4MTAwICYmIGNvbG9yc1syXSA8IDB4MTAwICk7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIGNvbG9yLnNwcmludGYoIiMlMDJ4JTAyeCUwMngiLCBjb2xv
cnNbMF0sIGNvbG9yc1sxXSwgY29sb3JzWzJdICk7Ci0gICAgICAgICAgICBpZiAoIGF0dHItPmRl
Y2woKS0+c2V0UHJvcGVydHkoaWQsIFN0cmluZyhjb2xvciksIGZhbHNlKSApCi0gICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGF0dHItPmRlY2woKS0+c2V0UHJv
cGVydHkoaWQsIENTU19WQUxfQkxBQ0ssIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50
OjpjcmVhdGVNYXBwZWREZWNsKE1hcHBlZEF0dHJpYnV0ZSogYXR0cikKLXsKLSAgICBDU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNs
YXJhdGlvbigwKTsKLSAgICBhdHRyLT5zZXREZWNsKGRlY2wpOwotICAgIGRlY2wtPnNldFBhcmVu
dChnZXREb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgZGVjbC0+c2V0Tm9kZSh0aGlz
KTsKLSAgICBkZWNsLT5zZXRTdHJpY3RQYXJzaW5nKGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJpYnV0
ZXMgYXJlIGp1c3QgYWx3YXlzIHF1aXJreS4KLX0KLQotLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRy
YXJ5IHN0YXJ0IHZhbHVlIHRvIGF2b2lkIG1hcHBpbmcgYWxsIDAncyB0byBhbGwgMCdzCi0vLyBv
ciBhbnl0aGluZyBsaWtlIHRoYXQuCi1jb25zdCB1bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsK
LQotLy8gUGF1bCBIc2llaCdzIFN1cGVyRmFzdEhhc2gKLS8vIGh0dHA6Ly93d3cuYXppbGxpb25t
b25rZXlzLmNvbS9xZWQvaGFzaC5odG1sCi11bnNpZ25lZCBNYXBwZWRBdHRyaWJ1dGVIYXNoOjpo
YXNoKGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYga2V5KQotewotICAgIHVpbnQzMl90IGhhc2gg
PSBQSEk7Ci0gICAgdWludDMyX3QgdG1wOwotCi0gICAgY29uc3QgdWludDE2X3QqIHA7Ci0KLSAg
ICBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZrZXkubmFtZSk7Ci0gICAg
aGFzaCArPSBwWzBdOwotICAgIHRtcCA9IChwWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgaGFzaCA9
IChoYXNoIDw8IDE2KSBeIHRtcDsKLSAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAgYXNzZXJ0
KHNpemVvZihrZXkubmFtZSkgPT0gNCB8fCBzaXplb2Yoa2V5Lm5hbWUpID09IDgpOwotICAgIGlm
IChzaXplb2Yoa2V5Lm5hbWUpID09IDgpIHsKLSAgICAgICAgcCArPSAyOwotICAgICAgICBoYXNo
ICs9IHBbMF07Ci0gICAgICAgIHRtcCA9IChwWzFdIDw8IDExKSBeIGhhc2g7Ci0gICAgICAgIGhh
c2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAg
ICB9Ci0KLSAgICBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCo+KCZrZXkudmFs
dWUpOwotICAgIGhhc2ggKz0gcFswXTsKLSAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwot
ICAgIGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAgaGFzaCArPSBoYXNoID4+IDExOwot
ICAgIGFzc2VydChzaXplb2Yoa2V5LnZhbHVlKSA9PSA0IHx8IHNpemVvZihrZXkudmFsdWUpID09
IDgpOwotICAgIGlmIChzaXplb2Yoa2V5LnZhbHVlKSA9PSA4KSB7Ci0gICAgICAgIHAgKz0gMjsK
LSAgICAgICAgaGFzaCArPSBwWzBdOwotICAgICAgICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNo
OwotICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYpIF4gdG1wOwotICAgICAgICBoYXNoICs9IGhh
c2ggPj4gMTE7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGVuZCBjYXNlCi0gICAgaGFzaCArPSBr
ZXkudHlwZTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMTE7Ci0gICAgaGFzaCArPSBoYXNoID4+IDE3
OwotCi0gICAgLy8gRm9yY2UgImF2YWxhbmNoaW5nIiBvZiBmaW5hbCAxMjcgYml0cwotICAgIGhh
c2ggXj0gaGFzaCA8PCAzOwotICAgIGhhc2ggKz0gaGFzaCA+PiA1OwotICAgIGhhc2ggXj0gaGFz
aCA8PCAyOwotICAgIGhhc2ggKz0gaGFzaCA+PiAxNTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMTA7
Ci0KLSAgICAvLyBUaGlzIGF2b2lkcyBldmVyIHJldHVybmluZyBhIGhhc2ggY29kZSBvZiAwLCBz
aW5jZSB0aGF0IGlzIHVzZWQgdG8KLSAgICAvLyBzaWduYWwgImhhc2ggbm90IGNvbXB1dGVkIHll
dCIsIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyBsaWtlbHkgdG8gYmUKLSAgICAvLyBlZmZlY3RpdmVs
eSB0aGUgc2FtZSBhcyAwIHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBtYXNrZWQKLSAgICBpZiAoaGFz
aCA9PSAwKQotICAgICAgICBoYXNoID0gMHg4MDAwMDAwMDsKLQotICAgIHJldHVybiBoYXNoOwot
fQotCi19CkluZGV4OiBkb20vQXR0ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL0F0dHIuY3BwCShy
ZXZpc2lvbiAxMzQ3NykKKysrIGRvbS9BdHRyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNzEg
KzIyLDE2IEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1w
bGUgUGxhY2UgLSBTdWl0ZSAzMzAsCiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAq
LwotCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiZG9tX2VsZW1lbnRpbXBsLmgiCisj
aW5jbHVkZSAiQXR0ci5oIgogCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFbGVt
ZW50LmgiCiAjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCiAj
aW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgImNzc19zdHlsZXNoZWV0aW1wbC5oIgotI2luY2x1
ZGUgImNzc192YWx1ZWltcGwuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5j
bHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgot
I2luY2x1ZGUgImRvbV94bWxpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVk
ZSAiSFRNTFBhcnNlci5oIgotI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5oIgotI2luY2x1ZGUgPHF0
ZXh0c3RyZWFtLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEhU
TUxOYW1lczsKLQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleSB7Ci0gICAgdWludDE2X3QgdHlw
ZTsKLSAgICBTdHJpbmdJbXBsKiBuYW1lOwotICAgIFN0cmluZ0ltcGwqIHZhbHVlOwotICAgIE1h
cHBlZEF0dHJpYnV0ZUtleShNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0LCBTdHJpbmdJbXBsKiBuLCBT
dHJpbmdJbXBsKiB2KQotICAgICAgICA6IHR5cGUodCksIG5hbWUobiksIHZhbHVlKHYpIHsgfQot
fTsKLQotc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFwcGVkQXR0cmlidXRl
S2V5JiBhLCBjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGIpCi0gICAgeyByZXR1cm4gYS50eXBl
ID09IGIudHlwZSAmJiBhLm5hbWUgPT0gYi5uYW1lICYmIGEudmFsdWUgPT0gYi52YWx1ZTsgfSAK
LQotc3RydWN0IE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0cyB7Ci0gICAgdHlwZWRlZiBNYXBwZWRB
dHRyaWJ1dGVLZXkgVHJhaXRUeXBlOwotICAgIHN0YXRpYyBjb25zdCBib29sIGVtcHR5VmFsdWVJ
c1plcm8gPSB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSBm
YWxzZTsKLSAgICBzdGF0aWMgTWFwcGVkQXR0cmlidXRlS2V5IGVtcHR5VmFsdWUoKSB7IHJldHVy
biBNYXBwZWRBdHRyaWJ1dGVLZXkoZU5vbmUsIDAsIDApOyB9Ci0gICAgc3RhdGljIE1hcHBlZEF0
dHJpYnV0ZUtleSBkZWxldGVkVmFsdWUoKSB7IHJldHVybiBNYXBwZWRBdHRyaWJ1dGVLZXkoZUxh
c3RFbnRyeSwgMCwgMCk7IH0KLX07Ci0KLXN0cnVjdCBNYXBwZWRBdHRyaWJ1dGVIYXNoIHsKLSAg
ICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmKTsKLSAgICBz
dGF0aWMgYm9vbCBlcXVhbChjb25zdCBNYXBwZWRBdHRyaWJ1dGVLZXkmIGEsIGNvbnN0IE1hcHBl
ZEF0dHJpYnV0ZUtleSYgYikgeyByZXR1cm4gYSA9PSBiOyB9Ci19OwotCi10eXBlZGVmIEhhc2hN
YXA8TWFwcGVkQXR0cmlidXRlS2V5LCBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiosIE1h
cHBlZEF0dHJpYnV0ZUhhc2gsIE1hcHBlZEF0dHJpYnV0ZUtleVRyYWl0cz4gTWFwcGVkQXR0cmli
dXRlRGVjbHM7Ci0KLXN0YXRpYyBNYXBwZWRBdHRyaWJ1dGVEZWNscyogbWFwcGVkQXR0cmlidXRl
RGVjbHMgPSAwOwotCi1BdHRyaWJ1dGUqIEF0dHJpYnV0ZTo6Y2xvbmUoYm9vbCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZShtX25hbWUsIG1fdmFsdWUpOwotfQotCi1QYXNzUmVm
UHRyPEF0dHI+IEF0dHJpYnV0ZTo6Y3JlYXRlQXR0cklmTmVlZGVkKEVsZW1lbnQqIGUpCi17Ci0g
ICAgUmVmUHRyPEF0dHI+IHIobV9pbXBsKTsKLSAgICBpZiAoIXIpIHsKLSAgICAgICAgciA9IG5l
dyBBdHRyKGUsIGUtPmdldERvY3VtZW50KCksIHRoaXMpOwotICAgICAgICByLT5jcmVhdGVUZXh0
Q2hpbGQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwotfQotCiBBdHRyOjpBdHRy
KEVsZW1lbnQqIGVsZW1lbnQsIERvY3VtZW50KiBkb2NQdHIsIEF0dHJpYnV0ZSogYSkKICAgICA6
IENvbnRhaW5lck5vZGUoZG9jUHRyKSwKICAgICAgIG1fZWxlbWVudChlbGVtZW50KSwKQEAgLTI1
MSwxNDA4ICsxOTYsNCBAQCBTdHJpbmcgQXR0cjo6dG9TdHJpbmcoKSBjb25zdAogICAgIHJldHVy
biByZXN1bHQ7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmbmRlZiBOREVCVUcKLXN0
cnVjdCBFbGVtZW50SW1wbENvdW50ZXIgCi17IAotICAgIHN0YXRpYyBpbnQgY291bnQ7IAotICAg
IH5FbGVtZW50SW1wbENvdW50ZXIoKSB7IC8qIGlmIChjb3VudCAhPSAwKSBmcHJpbnRmKHN0ZGVy
ciwgIkxFQUs6ICVkIEVsZW1lbnRcbiIsIGNvdW50KTsgKi8gfSAKLX07Ci1pbnQgRWxlbWVudElt
cGxDb3VudGVyOjpjb3VudDsKLXN0YXRpYyBFbGVtZW50SW1wbENvdW50ZXIgZWxlbWVudEltcGxD
b3VudGVyOwotI2VuZGlmIE5ERUJVRwotCi1FbGVtZW50OjpFbGVtZW50KGNvbnN0IFF1YWxpZmll
ZE5hbWUmIHFOYW1lLCBEb2N1bWVudCAqZG9jKQotICAgIDogQ29udGFpbmVyTm9kZShkb2MpLCBt
X3RhZ05hbWUocU5hbWUpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgICsrRWxlbWVudEltcGxDb3Vu
dGVyOjpjb3VudDsKLSNlbmRpZgotfQotCi1FbGVtZW50Ojp+RWxlbWVudCgpCi17Ci0jaWZuZGVm
IE5ERUJVRwotICAgIC0tRWxlbWVudEltcGxDb3VudGVyOjpjb3VudDsKLSNlbmRpZgotICAgIGlm
IChuYW1lZEF0dHJNYXApCi0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZGV0YWNoRnJvbUVsZW1lbnQo
KTsKLX0KLQotUGFzc1JlZlB0cjxOb2RlPiBFbGVtZW50OjpjbG9uZU5vZGUoYm9vbCBkZWVwKQot
ewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIFJlZlB0cjxFbGVtZW50PiBjbG9uZSA9
IGdldERvY3VtZW50KCktPmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkkoKSwgbm9kZU5hbWUo
KSwgZWMpOwotICAgIGFzc2VydCghZWMpOwotICAgIAotICAgIC8vIGNsb25lIGF0dHJpYnV0ZXMK
LSAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAqY2xvbmUtPmF0dHJpYnV0ZXMoKSA9ICpu
YW1lZEF0dHJNYXA7Ci0KLSAgICBjbG9uZS0+Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXModGhp
cyk7Ci0gICAgCi0gICAgaWYgKGRlZXApCi0gICAgICAgIGNsb25lQ2hpbGROb2RlcyhjbG9uZS5n
ZXQoKSk7Ci0KLSAgICByZXR1cm4gY2xvbmUucmVsZWFzZSgpOwotfQotCi12b2lkIEVsZW1lbnQ6
OnJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2Rl
JiBlYykKLXsKLSAgICBpZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+
cmVtb3ZlTmFtZWRJdGVtKG5hbWUsIGVjKTsKLSAgICAgICAgaWYgKGVjID09IE5PVF9GT1VORF9F
UlIpCi0gICAgICAgICAgICBlYyA9IDA7Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0
dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1
ZS5pbXBsKCksIGVjKTsKLX0KLQotLy8gVmlydHVhbCBmdW5jdGlvbiwgZGVmaW5lZCBpbiBiYXNl
IGNsYXNzLgotTmFtZWRBdHRyTWFwICpFbGVtZW50OjphdHRyaWJ1dGVzKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gYXR0cmlidXRlcyhmYWxzZSk7Ci19Ci0KLU5hbWVkQXR0ck1hcCogRWxlbWVudDo6
YXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBjb25zdAotewotICAgIHVwZGF0ZVN0eWxlQXR0cmli
dXRlSWZOZWVkZWQoKTsKLSAgICBpZiAoIXJlYWRvbmx5ICYmICFuYW1lZEF0dHJNYXApCi0gICAg
ICAgIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpOwotICAgIHJldHVybiBuYW1lZEF0dHJNYXAuZ2V0KCk7
Ci19Ci0KLU5vZGU6Ok5vZGVUeXBlIEVsZW1lbnQ6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gRUxFTUVOVF9OT0RFOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmdMaXN0KiBFbGVtZW50
OjpnZXRDbGFzc0xpc3QoKSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1jb25zdCBBdG9t
aWNTdHJpbmcmIEVsZW1lbnQ6OmdldElEQXR0cmlidXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFwLT5pZCgpIDogbnVsbEF0b207Ci19Ci0KLWJvb2wg
RWxlbWVudDo6aGFzQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZU5TKG5hbWUubmFtZXNwYWNlVVJJKCksIG5hbWUubG9j
YWxOYW1lKCkpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcmIEVsZW1lbnQ6OmdldEF0dHJpYnV0
ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIGlmIChuYW1lID09IHN0
eWxlQXR0cikKLSAgICAgICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotCi0gICAg
aWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgaWYgKEF0dHJpYnV0ZSogYSA9IG5hbWVkQXR0ck1h
cC0+Z2V0QXR0cmlidXRlSXRlbShuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBhLT52YWx1ZSgp
OwotCi0gICAgcmV0dXJuIG51bGxBdG9tOwotfQotCi12b2lkIEVsZW1lbnQ6OnNjcm9sbEludG9W
aWV3KGJvb2wgYWxpZ25Ub1RvcCkgCi17Ci0gICAgSW50UmVjdCBib3VuZHMgPSB0aGlzLT5nZXRS
ZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIC8vIEFsaWduIHRvIHRo
ZSB0b3AgLyBib3R0b20gYW5kIHRvIHRoZSBjbG9zZXN0IGVkZ2UuCi0gICAgICAgIGlmIChhbGln
blRvVG9wKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xs
UmVjdFRvVmlzaWJsZShib3VuZHMsIFJlbmRlckxheWVyOjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCwg
UmVuZGVyTGF5ZXI6OmdBbGlnblRvcEFsd2F5cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRz
LCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxheWVyOjpnQWxpZ25C
b3R0b21BbHdheXMpOwotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpzY3JvbGxJbnRvVmlld0lm
TmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQpCi17Ci0gICAgSW50UmVjdCBib3VuZHMgPSB0aGlz
LT5nZXRSZWN0KCk7ICAgIAotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmIChjZW50
ZXJJZk5lZWRlZCkKLSAgICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNj
cm9sbFJlY3RUb1Zpc2libGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduQ2VudGVySWZOZWVk
ZWQsIFJlbmRlckxheWVyOjpnQWxpZ25DZW50ZXJJZk5lZWRlZCk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCktPnNjcm9sbFJlY3RUb1Zpc2li
bGUoYm91bmRzLCBSZW5kZXJMYXllcjo6Z0FsaWduVG9FZGdlSWZOZWVkZWQsIFJlbmRlckxheWVy
OjpnQWxpZ25Ub0VkZ2VJZk5lZWRlZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wg
aW5IVE1MRG9jdW1lbnQoY29uc3QgRWxlbWVudCogZSkKLXsKLSAgICByZXR1cm4gZSAmJiBlLT5n
ZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpOwotfQotCi1jb25zdCBBdG9taWNTdHJpbmcm
IEVsZW1lbnQ6OmdldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAg
U3RyaW5nIGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDog
bmFtZTsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxv
Y2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7Ci19Ci0KLWNvbnN0IEF0b21pY1N0cmluZyYgRWxl
bWVudDo6Z2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0
cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUXVhbGlm
aWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkp
OwotfQotCi12b2lkIEVsZW1lbnQ6OnNldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghRG9jdW1l
bnQ6OmlzVmFsaWROYW1lKG5hbWUpKSB7Ci0gICAgICAgIGVjID0gSU5WQUxJRF9DSEFSQUNURVJf
RVJSOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBpbkhU
TUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7Ci0gICAgc2V0QXR0cmlidXRl
KFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgdmFs
dWUuaW1wbCgpLCBlYyk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlKGNvbnN0IFF1
YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykK
LXsKLSAgICBpZiAoaW5Eb2N1bWVudCgpKQotICAgICAgICBnZXREb2N1bWVudCgpLT5pbmNET01U
cmVlVmVyc2lvbigpOwotCi0gICAgLy8gYWxsb2NhdGUgYXR0cmlidXRlbWFwIGlmIG5lY2Vzc2Fy
eQotICAgIEF0dHJpYnV0ZSogb2xkID0gYXR0cmlidXRlcyhmYWxzZSktPmdldEF0dHJpYnV0ZUl0
ZW0obmFtZSk7Ci0KLSAgICAvLyBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3
aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5Ci0gICAgaWYgKG5hbWVkQXR0ck1hcC0+aXNSZWFkT25s
eSgpKSB7Ci0gICAgICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gaWRBdHRyKQotICAgICAgICB1cGRh
dGVJZChvbGQgPyBvbGQtPnZhbHVlKCkgOiBudWxsQXRvbSwgdmFsdWUpOwotICAgIAotICAgIGlm
IChvbGQgJiYgIXZhbHVlKQotICAgICAgICBuYW1lZEF0dHJNYXAtPnJlbW92ZUF0dHJpYnV0ZShu
YW1lKTsKLSAgICBlbHNlIGlmICghb2xkICYmIHZhbHVlKQotICAgICAgICBuYW1lZEF0dHJNYXAt
PmFkZEF0dHJpYnV0ZShjcmVhdGVBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTsKLSAgICBlbHNlIGlm
IChvbGQgJiYgdmFsdWUpIHsKLSAgICAgICAgb2xkLT5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAg
IGF0dHJpYnV0ZUNoYW5nZWQob2xkKTsKLSAgICB9Ci19Ci0KLUF0dHJpYnV0ZSogRWxlbWVudDo6
Y3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZh
bHVlKQotewotICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLX0KLQotdm9p
ZCBFbGVtZW50OjpzZXRBdHRyaWJ1dGVNYXAoTmFtZWRBdHRyTWFwKiBsaXN0KQotewotICAgIGlm
IChpbkRvY3VtZW50KCkpCi0gICAgICAgIGdldERvY3VtZW50KCktPmluY0RPTVRyZWVWZXJzaW9u
KCk7Ci0KLSAgICAvLyBJZiBzZXR0aW5nIHRoZSB3aG9sZSBtYXAgY2hhbmdlcyB0aGUgaWQgYXR0
cmlidXRlLCB3ZSBuZWVkIHRvIGNhbGwgdXBkYXRlSWQuCi0KLSAgICBBdHRyaWJ1dGUgKm9sZElk
ID0gbmFtZWRBdHRyTWFwID8gbmFtZWRBdHRyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cikg
OiAwOwotICAgIEF0dHJpYnV0ZSAqbmV3SWQgPSBsaXN0ID8gbGlzdC0+Z2V0QXR0cmlidXRlSXRl
bShpZEF0dHIpIDogMDsKLQotICAgIGlmIChvbGRJZCB8fCBuZXdJZCkKLSAgICAgICAgdXBkYXRl
SWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1
ZSgpIDogbnVsbEF0b20pOwotCi0gICAgaWYgKG5hbWVkQXR0ck1hcCkKLSAgICAgICAgbmFtZWRB
dHRyTWFwLT5lbGVtZW50ID0gMDsKLQotICAgIG5hbWVkQXR0ck1hcCA9IGxpc3Q7Ci0KLSAgICBp
ZiAobmFtZWRBdHRyTWFwKSB7Ci0gICAgICAgIG5hbWVkQXR0ck1hcC0+ZWxlbWVudCA9IHRoaXM7
Ci0gICAgICAgIHVuc2lnbmVkIGxlbiA9IG5hbWVkQXR0ck1hcC0+bGVuZ3RoKCk7Ci0gICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgIGF0dHJpYnV0
ZUNoYW5nZWQobmFtZWRBdHRyTWFwLT5hdHRyc1tpXSk7Ci0gICAgICAgIC8vIEZJWE1FOiBXaGF0
IGFib3V0IGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGluIHRoZSBvbGQgbWFwIHRoYXQgYXJlIG5vdCBp
biB0aGUgbmV3IG1hcD8KLSAgICB9Ci19Ci0KLWJvb2wgRWxlbWVudDo6aGFzQXR0cmlidXRlcygp
IGNvbnN0Ci17Ci0gICAgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpOwotICAgIHJldHVy
biBuYW1lZEF0dHJNYXAgJiYgbmFtZWRBdHRyTWFwLT5sZW5ndGgoKSA+IDA7Ci19Ci0KLVN0cmlu
ZyBFbGVtZW50Ojpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fdGFnTmFtZS50b1N0
cmluZygpOwotfQotCi12b2lkIEVsZW1lbnQ6OnNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcg
Jl9wcmVmaXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGNoZWNrU2V0UHJlZml4KF9wcmVm
aXgsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGFnTmFtZS5z
ZXRQcmVmaXgoX3ByZWZpeCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6Y3JlYXRlQXR0cmlidXRlTWFw
KCkgY29uc3QKLXsKLSAgICBuYW1lZEF0dHJNYXAgPSBuZXcgTmFtZWRBdHRyTWFwKGNvbnN0X2Nh
c3Q8RWxlbWVudCo+KHRoaXMpKTsKLX0KLQotYm9vbCBFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShB
dHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1SZW5kZXJT
dHlsZSAqRWxlbWVudDo6Y3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QgKnBhcmVu
dFJlbmRlcmVyKQotewotICAgIHJldHVybiBnZXREb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCkt
PmNyZWF0ZVN0eWxlRm9yRWxlbWVudCh0aGlzKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpFbGVtZW50
OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkK
LXsKLSAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gdGhpcyAmJiBz
dHlsZS0+ZGlzcGxheSgpID09IE5PTkUpIHsKLSAgICAgICAgLy8gSWdub3JlIGRpc3BsYXk6IG5v
bmUgb24gcm9vdCBlbGVtZW50cy4gIEZvcmNlIGEgZGlzcGxheSBvZiBibG9jayBpbiB0aGF0IGNh
c2UuCi0gICAgICAgIFJlbmRlckJsb2NrKiByZXN1bHQgPSBuZXcgKGFyZW5hKSBSZW5kZXJCbG9j
ayh0aGlzKTsKLSAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0LT5zZXRTdHlsZShzdHlsZSk7Ci0g
ICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJPYmplY3Q6OmNy
ZWF0ZU9iamVjdCh0aGlzLCBzdHlsZSk7Ci19Ci0KLQotdm9pZCBFbGVtZW50OjppbnNlcnRlZElu
dG9Eb2N1bWVudCgpCi17Ci0gICAgLy8gbmVlZCB0byBkbyBzdXBlcmNsYXNzIHByb2Nlc3Npbmcg
Zmlyc3Qgc28gaW5Eb2N1bWVudCgpIGlzIHRydWUKLSAgICAvLyBieSB0aGUgdGltZSB3ZSByZWFj
aCB1cGRhdGVJZAotICAgIENvbnRhaW5lck5vZGU6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0K
LSAgICBpZiAoaGFzSUQoKSkgewotICAgICAgICBOYW1lZEF0dHJNYXAqIGF0dHJzID0gYXR0cmli
dXRlcyh0cnVlKTsKLSAgICAgICAgaWYgKGF0dHJzKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUq
IGlkSXRlbSA9IGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0gICAgICAgICAgICBp
ZiAoaWRJdGVtICYmICFpZEl0ZW0tPmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIHVwZGF0ZUlk
KG51bGxBdG9tLCBpZEl0ZW0tPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lk
IEVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChoYXNJRCgpKSB7Ci0g
ICAgICAgIE5hbWVkQXR0ck1hcCogYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUpOwotICAgICAgICBp
ZiAoYXR0cnMpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSogaWRJdGVtID0gYXR0cnMtPmdldEF0
dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLSAgICAgICAgICAgIGlmIChpZEl0ZW0gJiYgIWlkSXRlbS0+
aXNOdWxsKCkpCi0gICAgICAgICAgICAgICAgdXBkYXRlSWQoaWRJdGVtLT52YWx1ZSgpLCBudWxs
QXRvbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDb250YWluZXJOb2RlOjpyZW1vdmVkRnJv
bURvY3VtZW50KCk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6YXR0YWNoKCkKLXsKLSNpZiBTUEVFRF9E
RUJVRyA8IDEKLSAgICBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCk7Ci0jZW5kaWYKLSAgICBDb250
YWluZXJOb2RlOjphdHRhY2goKTsKLX0KLQotdm9pZCBFbGVtZW50OjpyZWNhbGNTdHlsZSggU3R5
bGVDaGFuZ2UgY2hhbmdlICkKLXsKLSAgICAvLyAjIyMgc2hvdWxkIGdvIGF3YXkgYW5kIGJlIGRv
bmUgaW4gcmVuZGVyb2JqZWN0Ci0gICAgUmVuZGVyU3R5bGUqIF9zdHlsZSA9IHJlbmRlcmVyKCkg
PyByZW5kZXJlcigpLT5zdHlsZSgpIDogMDsKLSAgICBib29sIGhhc1BhcmVudFJlbmRlcmVyID0g
cGFyZW50KCkgPyBwYXJlbnQoKS0+cmVuZGVyZXIoKSA6IGZhbHNlOwotICAgIAotICAgIGlmICgg
aGFzUGFyZW50UmVuZGVyZXIgJiYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IGNoYW5nZWQoKSkgKSB7
Ci0gICAgICAgIFJlbmRlclN0eWxlICpuZXdTdHlsZSA9IGdldERvY3VtZW50KCktPnN0eWxlU2Vs
ZWN0b3IoKS0+Y3JlYXRlU3R5bGVGb3JFbGVtZW50KHRoaXMpOwotICAgICAgICBTdHlsZUNoYW5n
ZSBjaCA9IGRpZmYoIF9zdHlsZSwgbmV3U3R5bGUgKTsKLSAgICAgICAgaWYgKGNoID09IERldGFj
aCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkKCkpIGRldGFjaCgpOwotICAgICAgICAgICAg
Ly8gIyMjIFN1Ym9wdGltYWwuIFN0eWxlIGdldHMgY2FsY3VsYXRlZCBhZ2Fpbi4KLSAgICAgICAg
ICAgIGF0dGFjaCgpOwotICAgICAgICAgICAgLy8gYXR0YWNoIHJlY2FsdWxhdGVzIHRoZSBzdHls
ZSBmb3IgYWxsIGNoaWxkcmVuLiBObyBuZWVkIHRvIGRvIGl0IHR3aWNlLgotICAgICAgICAgICAg
c2V0Q2hhbmdlZCggZmFsc2UgKTsKLSAgICAgICAgICAgIHNldEhhc0NoYW5nZWRDaGlsZCggZmFs
c2UgKTsKLSAgICAgICAgICAgIG5ld1N0eWxlLT5kZXJlZihnZXREb2N1bWVudCgpLT5yZW5kZXJB
cmVuYSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlm
IChjaCAhPSBOb0NoYW5nZSkgewotICAgICAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgbmV3U3R5
bGUpCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0U3R5bGUobmV3U3R5bGUpOwotICAg
ICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoYW5nZWQoKSAmJiByZW5kZXJlcigpICYmIG5ld1N0
eWxlICYmIChnZXREb2N1bWVudCgpLT51c2VzU2libGluZ1J1bGVzKCkgfHwgZ2V0RG9jdW1lbnQo
KS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygpKSkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggbm8g
Y2hhbmdlIG9jY3VycmVkLCB3ZSB1c2UgdGhlIG5ldyBzdHlsZSBzbyB0aGF0IHRoZSBjb3VzaW4g
c3R5bGUgc2hhcmluZyBjb2RlIHdvbid0IGdldAotICAgICAgICAgICAgLy8gZm9vbGVkIGludG8g
YmVsaWV2aW5nIHRoaXMgc3R5bGUgaXMgdGhlIHNhbWUuICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5
IGlmIHRoZSBkb2N1bWVudCBhY3R1YWxseSB1c2VzCi0gICAgICAgICAgICAvLyBzaWJsaW5nL2Rl
c2NlbmRhbnQgcnVsZXMsIHNpbmNlIG90aGVyd2lzZSBpdCBpc24ndCBwb3NzaWJsZSBmb3IgYW5j
ZXN0b3Igc3R5bGVzIHRvIGFmZmVjdCBzaGFyaW5nIG9mCi0gICAgICAgICAgICAvLyBkZXNjZW5k
YW50cy4KLSAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldFN0eWxlSW50ZXJuYWwobmV3U3R5bGUp
OwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3U3R5bGUtPmRlcmVmKGdldERvY3VtZW50KCktPnJl
bmRlckFyZW5hKCkpOwotCi0gICAgICAgIGlmICggY2hhbmdlICE9IEZvcmNlKSB7Ci0gICAgICAg
ICAgICBpZiAoZ2V0RG9jdW1lbnQoKS0+dXNlc0Rlc2NlbmRhbnRSdWxlcygpKQotICAgICAgICAg
ICAgICAgIGNoYW5nZSA9IEZvcmNlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IGNoYW5nZSA9IGNoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChOb2RlICpuID0gZmFz
dEZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGNo
YW5nZSA+PSBJbmhlcml0IHx8IG4tPmlzVGV4dE5vZGUoKSB8fCBuLT5oYXNDaGFuZ2VkQ2hpbGQo
KSB8fCBuLT5jaGFuZ2VkKCkpCi0gICAgICAgICAgICBuLT5yZWNhbGNTdHlsZShjaGFuZ2UpOwot
ICAgIH0KLQotICAgIHNldENoYW5nZWQoIGZhbHNlICk7Ci0gICAgc2V0SGFzQ2hhbmdlZENoaWxk
KCBmYWxzZSApOwotfQotCi1ib29sIEVsZW1lbnQ6OmNoaWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUg
dHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBFTEVNRU5UX05PREU6
Ci0gICAgICAgIGNhc2UgVEVYVF9OT0RFOgotICAgICAgICBjYXNlIENPTU1FTlRfTk9ERToKLSAg
ICAgICAgY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgQ0RB
VEFfU0VDVElPTl9OT0RFOgotICAgICAgICBjYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEVsZW1lbnQ6
OmRpc3BhdGNoQXR0clJlbW92YWxFdmVudChBdHRyaWJ1dGUqKQotewotICAgIGFzc2VydCghZXZl
bnREaXNwYXRjaEZvcmJpZGRlbigpKTsKLSNpZiAwCi0gICAgaWYgKCFnZXREb2N1bWVudCgpLT5o
YXNMaXN0ZW5lclR5cGUoRG9jdW1lbnQ6OkRPTUFUVFJNT0RJRklFRF9MSVNURU5FUikpCi0gICAg
ICAgIHJldHVybjsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBkaXNwYXRjaEV2ZW50
KG5ldyBNdXRhdGlvbkV2ZW50KERPTUF0dHJNb2RpZmllZEV2ZW50LCB0cnVlLCBmYWxzZSwgYXR0
ciwgYXR0ci0+dmFsdWUoKSwKLSAgICAgICAgYXR0ci0+dmFsdWUoKSwgZ2V0RG9jdW1lbnQoKS0+
YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0aW9uRXZlbnQ6OlJFTU9WQUwpLCBlYyk7Ci0jZW5k
aWYKLX0KLQotdm9pZCBFbGVtZW50OjpkaXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0
ZSAqYXR0cikKLXsKLSAgICBhc3NlcnQoIWV2ZW50RGlzcGF0Y2hGb3JiaWRkZW4oKSk7Ci0jaWYg
MAotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50OjpET01B
VFRSTU9ESUZJRURfTElTVEVORVIpKQotICAgICAgICByZXR1cm47Ci0gICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgZGlzcGF0Y2hFdmVudChuZXcgTXV0YXRpb25FdmVudChET01BdHRyTW9k
aWZpZWRFdmVudCwgdHJ1ZSwgZmFsc2UsIGF0dHIsIGF0dHItPnZhbHVlKCksCi0gICAgICAgIGF0
dHItPnZhbHVlKCksZ2V0RG9jdW1lbnQoKS0+YXR0ck5hbWUoYXR0ci0+aWQoKSksIE11dGF0aW9u
RXZlbnQ6OkFERElUSU9OKSwgZWMpOwotI2VuZGlmCi19Ci0KLVN0cmluZyBFbGVtZW50OjpvcGVu
VGFnU3RhcnRUb1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICI8IiArIG5v
ZGVOYW1lKCk7Ci0KLSAgICBOYW1lZEF0dHJNYXAgKmF0dHJNYXAgPSBhdHRyaWJ1dGVzKHRydWUp
OwotCi0gICAgaWYgKGF0dHJNYXApIHsKLSAgICAgICAgdW5zaWduZWQgbnVtQXR0cnMgPSBhdHRy
TWFwLT5sZW5ndGgoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUF0dHJz
OyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAiICI7Ci0KLSAgICAgICAgICAgIEF0dHJp
YnV0ZSAqYXR0cmlidXRlID0gYXR0ck1hcC0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAg
IHJlc3VsdCArPSBhdHRyaWJ1dGUtPm5hbWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYg
KCFhdHRyaWJ1dGUtPnZhbHVlKCkuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQg
Kz0gIj1cIiI7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHN1YnN0aXR1dGUgZW50aXRpZXMg
Zm9yIGFueSBpbnN0YW5jZXMgb2YgIiBvciAnCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGF0
dHJpYnV0ZS0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlwiIjsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVN0
cmluZyBFbGVtZW50Ojp0b1N0cmluZygpIGNvbnN0Ci17Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG9w
ZW5UYWdTdGFydFRvU3RyaW5nKCk7Ci0KLSAgICBpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0gICAg
ICAgIHJlc3VsdCArPSAiPiI7Ci0KLSAgICAgICAgZm9yIChOb2RlICpjaGlsZCA9IGZpcnN0Q2hp
bGQoKTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAg
ICAgICAgICAgcmVzdWx0ICs9IGNoaWxkLT50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgcmVzdWx0ICs9ICI8LyI7Ci0gICAgICAgIHJlc3VsdCArPSBub2RlTmFtZSgpOwotICAgICAg
ICByZXN1bHQgKz0gIj4iOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiIC8+IjsK
LSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVsZW1lbnQ6OnVwZGF0ZUlk
KGNvbnN0IEF0b21pY1N0cmluZyYgb2xkSWQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmV3SWQpCi17
Ci0gICAgaWYgKCFpbkRvY3VtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChvbGRJ
ZCA9PSBuZXdJZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnQqIGRvYyA9IGdldERv
Y3VtZW50KCk7Ci0gICAgaWYgKCFvbGRJZC5pc0VtcHR5KCkpCi0gICAgICAgIGRvYy0+cmVtb3Zl
RWxlbWVudEJ5SWQob2xkSWQsIHRoaXMpOwotICAgIGlmICghbmV3SWQuaXNFbXB0eSgpKQotICAg
ICAgICBkb2MtPmFkZEVsZW1lbnRCeUlkKG5ld0lkLCB0aGlzKTsKLX0KLQotI2lmbmRlZiBOREVC
VUcKLXZvaWQgRWxlbWVudDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBEZXByZWNhdGVkU3Ry
aW5nIGluZCkgY29uc3QKLXsKLSAgICB1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCk7Ci0g
ICAgaWYgKG5hbWVkQXR0ck1hcCkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bmFtZWRBdHRyTWFwLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgKmF0
dHIgPSBuYW1lZEF0dHJNYXAtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAqc3RyZWFt
IDw8ICIgIiA8PCBhdHRyLT5uYW1lKCkubG9jYWxOYW1lKCkuZGVwcmVjYXRlZFN0cmluZygpLmFz
Y2lpKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIj1cIiIgPDwgYXR0ci0+dmFsdWUoKS5kZXBy
ZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSA8PCAiXCIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
Q29udGFpbmVyTm9kZTo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5E
RUJVRwotdm9pZCBFbGVtZW50Ojpmb3JtYXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2ln
bmVkIGxlbmd0aCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmVzdWx0OwotICAgIFN0cmluZyBzOwot
ICAgIAotICAgIHMgPSBub2RlTmFtZSgpOwotICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAg
ICAgICByZXN1bHQgKz0gczsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgcyA9IGdldEF0dHJpYnV0
ZShpZEF0dHIpOwotICAgIGlmIChzLmxlbmd0aCgpID4gMCkgewotICAgICAgICBpZiAocmVzdWx0
Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHJlc3VsdCArPSAiOyAiOwotICAgICAgICByZXN1
bHQgKz0gImlkPSI7Ci0gICAgICAgIHJlc3VsdCArPSBzOwotICAgIH0KLSAgICAgICAgICAKLSAg
ICBzID0gZ2V0QXR0cmlidXRlKGNsYXNzQXR0cik7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPiAwKSB7
Ci0gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmVzdWx0ICs9
ICI7ICI7Ci0gICAgICAgIHJlc3VsdCArPSAiY2xhc3M9IjsKLSAgICAgICAgcmVzdWx0ICs9IHM7
Ci0gICAgfQotICAgICAgICAgIAotICAgIHN0cm5jcHkoYnVmZmVyLCByZXN1bHQuZGVwcmVjYXRl
ZFN0cmluZygpLmxhdGluMSgpLCBsZW5ndGggLSAxKTsKLX0KLSNlbmRpZgotCi1QYXNzUmVmUHRy
PEF0dHI+IEVsZW1lbnQ6OnNldEF0dHJpYnV0ZU5vZGUoQXR0ciAqYXR0ciwgRXhjZXB0aW9uQ29k
ZSYgZWMpCi17Ci0gICAgQVNTRVJUKGF0dHIpOwotICAgIHJldHVybiBzdGF0aWNfcG9pbnRlcl9j
YXN0PEF0dHI+KGF0dHJpYnV0ZXMoZmFsc2UpLT5zZXROYW1lZEl0ZW0oYXR0ciwgZWMpKTsKLX0K
LQotUGFzc1JlZlB0cjxBdHRyPiBFbGVtZW50OjpyZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIgKmF0
dHIsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGlmICghYXR0ciB8fCBhdHRyLT5vd25lckVs
ZW1lbnQoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChnZXREb2N1bWVudCgpICE9IGF0dHItPmdldERvY3Vt
ZW50KCkpIHsKLSAgICAgICAgZWMgPSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLQotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVzKHRydWUp
OwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIHN0YXRp
Y19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMtPnJlbW92ZU5hbWVkSXRlbShhdHRyLT5xdWFsaWZp
ZWROYW1lKCksIGVjKSk7Ci19Ci0KLXZvaWQgRWxlbWVudDo6c2V0QXR0cmlidXRlTlMoY29uc3Qg
U3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5nIHByZWZpeCwg
bG9jYWxOYW1lOwotICAgIGlmICghRG9jdW1lbnQ6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZp
ZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSkpIHsKLSAgICAgICAgZWMgPSBJTlZBTElEX0NIQVJB
Q1RFUl9FUlI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0QXR0cmlidXRlKFF1YWxp
ZmllZE5hbWUocHJlZml4LmltcGwoKSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmlt
cGwoKSksIHZhbHVlLmltcGwoKSwgZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJp
YnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIFN0cmlu
ZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5hbWU7
Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5p
bXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQotCi12b2lkIEVsZW1lbnQ6OnJlbW92ZUF0dHJpYnV0
ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgcmVtb3ZlQXR0cmlidXRlKFF1YWxpZmllZE5hbWUo
bnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBlYyk7Ci19
Ci0KLVBhc3NSZWZQdHI8QXR0cj4gRWxlbWVudDo6Z2V0QXR0cmlidXRlTm9kZShjb25zdCBTdHJp
bmcmIG5hbWUpCi17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7
Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3RyaW5nIGxvY2FsTmFt
ZSA9IGluSFRNTERvY3VtZW50KHRoaXMpID8gbmFtZS5sb3dlcigpIDogbmFtZTsKLSAgICByZXR1
cm4gc3RhdGljX3BvaW50ZXJfY2FzdDxBdHRyPihhdHRycy0+Z2V0TmFtZWRJdGVtKFF1YWxpZmll
ZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSkpOwotfQotCi1QYXNz
UmVmUHRyPEF0dHI+IEVsZW1lbnQ6OmdldEF0dHJpYnV0ZU5vZGVOUyhjb25zdCBTdHJpbmcmIG5h
bWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpCi17Ci0gICAgTmFtZWRBdHRyTWFw
ICphdHRycyA9IGF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19wb2ludGVyX2Nhc3Q8QXR0cj4oYXR0cnMtPmdldE5h
bWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9tLCBsb2NhbE5hbWUuaW1wbCgpLCBuYW1lc3Bh
Y2VVUkkuaW1wbCgpKSkpOwotfQotCi1ib29sIEVsZW1lbnQ6Omhhc0F0dHJpYnV0ZShjb25zdCBT
dHJpbmcmIG5hbWUpIGNvbnN0Ci17Ci0gICAgTmFtZWRBdHRyTWFwICphdHRycyA9IGF0dHJpYnV0
ZXModHJ1ZSk7Ci0gICAgaWYgKCFhdHRycykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0
cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudCh0aGlzKSA/IG5hbWUubG93ZXIoKSA6IG5h
bWU7Ci0gICAgcmV0dXJuIGF0dHJzLT5nZXRBdHRyaWJ1dGVJdGVtKFF1YWxpZmllZE5hbWUobnVs
bEF0b20sIGxvY2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSk7Ci19Ci0KLWJvb2wgRWxlbWVudDo6
aGFzQXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYg
bG9jYWxOYW1lKSBjb25zdAotewotICAgIE5hbWVkQXR0ck1hcCAqYXR0cnMgPSBhdHRyaWJ1dGVz
KHRydWUpOwotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1
cm4gYXR0cnMtPmdldEF0dHJpYnV0ZUl0ZW0oUXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxO
YW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmltcGwoKSkpOwotfQotCi1DU1NTdHlsZURlY2xhcmF0
aW9uICpFbGVtZW50OjpzdHlsZSgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRWxlbWVu
dDo6Zm9jdXMoKQotewotICAgIERvY3VtZW50KiBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIGRv
Yy0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgZG9j
LT5zZXRGb2N1c05vZGUodGhpcyk7Ci0gICAgICAgIGlmIChyb290RWRpdGFibGVFbGVtZW50KCkg
PT0gdGhpcykgewotICAgICAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCByZXN0b3JlIHRoZSBw
cmV2aW91cyBzZWxlY3Rpb24gaWYgdGhlcmUgaXMgb25lLCBpbnN0ZWFkIG9mIGFsd2F5cyBzZWxl
Y3RpbmcgYWxsLgotICAgICAgICAgICAgaWYgKGRvYy0+ZnJhbWUoKS0+c2VsZWN0Q29udGVudHNP
Zk5vZGUodGhpcykpCi0gICAgICAgICAgICAgICAgZG9jLT5mcmFtZSgpLT5yZXZlYWxTZWxlY3Rp
b24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJlcigpICYmICFyZW5kZXJlcigpLT5pc1dp
ZGdldCgpKQotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKS0+c2Nyb2xs
UmVjdFRvVmlzaWJsZShnZXRSZWN0KCkpOwotICAgIH0KLX0KLQotdm9pZCBFbGVtZW50OjpibHVy
KCkKLXsKLSAgICBEb2N1bWVudCogZG9jID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jLT5m
b2N1c05vZGUoKSA9PSB0aGlzKQotICAgICAgICBkb2MtPnNldEZvY3VzTm9kZSgwKTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OYW1lZEF0dHJNYXA6Ok5hbWVkQXR0ck1hcChFbGVtZW50
ICplKQotICAgIDogZWxlbWVudChlKQotICAgICwgYXR0cnMoMCkKLSAgICAsIGxlbigwKQotewot
fQotCi1OYW1lZEF0dHJNYXA6On5OYW1lZEF0dHJNYXAoKQotewotICAgIE5hbWVkQXR0ck1hcDo6
Y2xlYXJBdHRyaWJ1dGVzKCk7IC8vIHZpcnR1YWwgbWV0aG9kLCBzbyBxdWFsaWZ5IGp1c3QgdG8g
YmUgZXhwbGljaXQKLX0KLQotYm9vbCBOYW1lZEF0dHJNYXA6OmlzTWFwcGVkQXR0cmlidXRlTWFw
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFt
ZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29uc3QgU3RyaW5nJiBuYW1lKSBjb25zdAotewotICAg
IFN0cmluZyBsb2NhbE5hbWUgPSBpbkhUTUxEb2N1bWVudChlbGVtZW50KSA/IG5hbWUubG93ZXIo
KSA6IG5hbWU7Ci0gICAgcmV0dXJuIGdldE5hbWVkSXRlbShRdWFsaWZpZWROYW1lKG51bGxBdG9t
LCBsb2NhbE5hbWUuaW1wbCgpLCBudWxsQXRvbSkpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5h
bWVkQXR0ck1hcDo6Z2V0TmFtZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkksIGNv
bnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdAotewotICAgIHJldHVybiBnZXROYW1lZEl0ZW0o
UXVhbGlmaWVkTmFtZShudWxsQXRvbSwgbG9jYWxOYW1lLmltcGwoKSwgbmFtZXNwYWNlVVJJLmlt
cGwoKSkpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJ
dGVtKGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgU3RyaW5n
IGxvY2FsTmFtZSA9IGluSFRNTERvY3VtZW50KGVsZW1lbnQpID8gbmFtZS5sb3dlcigpIDogbmFt
ZTsKLSAgICByZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxv
Y2FsTmFtZS5pbXBsKCksIG51bGxBdG9tKSwgZWMpOwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5h
bWVkQXR0ck1hcDo6cmVtb3ZlTmFtZWRJdGVtTlMoY29uc3QgU3RyaW5nJiBuYW1lc3BhY2VVUkks
IGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICByZXR1
cm4gcmVtb3ZlTmFtZWRJdGVtKFF1YWxpZmllZE5hbWUobnVsbEF0b20sIGxvY2FsTmFtZS5pbXBs
KCksIG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBlYyk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFt
ZWRBdHRyTWFwOjpnZXROYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QK
LXsKLSAgICBBdHRyaWJ1dGUqIGEgPSBnZXRBdHRyaWJ1dGVJdGVtKG5hbWUpOwotICAgIGlmICgh
YSkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gYS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQp
OwotfQotCi1QYXNzUmVmUHRyPE5vZGU+IE5hbWVkQXR0ck1hcDo6c2V0TmFtZWRJdGVtKE5vZGUq
IGFyZywgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgaWYgKCFlbGVtZW50KSB7Ci0gICAgICAg
IGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8g
Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtYXAgaXMgcmVhZG9u
bHkuCi0gICAgaWYgKGlzUmVhZE9ubHkoKSkgewotICAgICAgICBlYyA9IE5PX01PRElGSUNBVElP
Tl9BTExPV0VEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gV1JPTkdf
RE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgYXJnIHdhcyBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQg
ZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGlzIG1hcC4KLSAgICBpZiAoYXJn
LT5nZXREb2N1bWVudCgpICE9IGVsZW1lbnQtPmdldERvY3VtZW50KCkpIHsKLSAgICAgICAgZWMg
PSBXUk9OR19ET0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8v
IE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhyb3cgYSBISUVSQVJDSFlfUkVRVUVTVF9FUlJPUiBp
ZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBub24tYXR0cmlidXRlIG5vZGUKLSAgICBpZiAoIWFyZy0+
aXNBdHRyaWJ1dGVOb2RlKCkpIHsKLSAgICAgICAgZWMgPSBISUVSQVJDSFlfUkVRVUVTVF9FUlI7
Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBBdHRyICphdHRyID0gc3RhdGljX2Nhc3Q8
QXR0cio+KGFyZyk7Ci0KLSAgICBBdHRyaWJ1dGUqIGEgPSBhdHRyLT5hdHRyKCk7Ci0gICAgQXR0
cmlidXRlKiBvbGQgPSBnZXRBdHRyaWJ1dGVJdGVtKGEtPm5hbWUoKSk7Ci0gICAgaWYgKG9sZCA9
PSBhKQotICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGU+KGFyZyk7IC8vIHdlIGtub3cgYWJvdXQg
aXQgYWxyZWFkeQotCi0gICAgLy8gSU5VU0VfQVRUUklCVVRFX0VSUjogUmFpc2VkIGlmIGFyZyBp
cyBhbiBBdHRyIHRoYXQgaXMgYWxyZWFkeSBhbiBhdHRyaWJ1dGUgb2YgYW5vdGhlciBFbGVtZW50
IG9iamVjdC4KLSAgICAvLyBUaGUgRE9NIHVzZXIgbXVzdCBleHBsaWNpdGx5IGNsb25lIEF0dHIg
bm9kZXMgdG8gcmUtdXNlIHRoZW0gaW4gb3RoZXIgZWxlbWVudHMuCi0gICAgaWYgKGF0dHItPm93
bmVyRWxlbWVudCgpKSB7Ci0gICAgICAgIGVjID0gSU5VU0VfQVRUUklCVVRFX0VSUjsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGEtPm5hbWUoKSA9PSBpZEF0dHIpCi0gICAg
ICAgIGVsZW1lbnQtPnVwZGF0ZUlkKG9sZCA/IG9sZC0+dmFsdWUoKSA6IG51bGxBdG9tLCBhLT52
YWx1ZSgpKTsKLQotICAgIC8vICMjIyBzbGlnaHRseSBpbmVmZmljaWVudCAtIHJlc2l6ZXMgYXR0
cmlidXRlIGFycmF5IHR3aWNlLgotICAgIFJlZlB0cjxOb2RlPiByOwotICAgIGlmIChvbGQpIHsK
LSAgICAgICAgciA9IG9sZC0+Y3JlYXRlQXR0cklmTmVlZGVkKGVsZW1lbnQpOwotICAgICAgICBy
ZW1vdmVBdHRyaWJ1dGUoYS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICBhZGRBdHRyaWJ1dGUoYSk7
Ci0gICAgcmV0dXJuIHIucmVsZWFzZSgpOwotfQotCi0vLyBUaGUgRE9NMiBzcGVjIGRvZXNuJ3Qg
c2F5IHRoYXQgcmVtb3ZlQXR0cmlidXRlW05TXSB0aHJvd3MgTk9UX0ZPVU5EX0VSUgotLy8gaWYg
dGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIGJ1dCBhdCB0aGlzIGxldmVsIHdlIGhhdmUgdG8g
dGhyb3cgTk9UX0ZPVU5EX0VSUgotLy8gYmVjYXVzZSBvZiByZW1vdmVOYW1lZEl0ZW0sIHJlbW92
ZU5hbWVkSXRlbU5TLCBhbmQgcmVtb3ZlQXR0cmlidXRlTm9kZS4KLVBhc3NSZWZQdHI8Tm9kZT4g
TmFtZWRBdHRyTWFwOjpyZW1vdmVOYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8gIyMjIHNob3VsZCB0aGlzIHJlYWxseSBiZSBy
YWlzZWQgd2hlbiB0aGUgYXR0cmlidXRlIHRvIHJlbW92ZSBpc24ndCB0aGVyZSBhdCBhbGw/Ci0g
ICAgLy8gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBp
cyByZWFkb25seQotICAgIGlmIChpc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgZWMgPSBOT19NT0RJ
RklDQVRJT05fQUxMT1dFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEF0
dHJpYnV0ZSogYSA9IGdldEF0dHJpYnV0ZUl0ZW0obmFtZSk7Ci0gICAgaWYgKCFhKSB7Ci0gICAg
ICAgIGVjID0gTk9UX0ZPVU5EX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAg
UmVmUHRyPE5vZGU+IHIgPSBhLT5jcmVhdGVBdHRySWZOZWVkZWQoZWxlbWVudCk7Ci0KLSAgICBp
ZiAobmFtZSA9PSBpZEF0dHIpCi0gICAgICAgIGVsZW1lbnQtPnVwZGF0ZUlkKGEtPnZhbHVlKCks
IG51bGxBdG9tKTsKLQotICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICByZXR1cm4gci5y
ZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Tm9kZT4gTmFtZWRBdHRyTWFwOjppdGVtICggdW5z
aWduZWQgaW5kZXggKSBjb25zdAotewotICAgIGlmIChpbmRleCA+PSBsZW4pCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgcmV0dXJuIGF0dHJzW2luZGV4XS0+Y3JlYXRlQXR0cklmTmVlZGVkKGVs
ZW1lbnQpOwotfQotCi1BdHRyaWJ1dGUqIE5hbWVkQXR0ck1hcDo6Z2V0QXR0cmlidXRlSXRlbShj
b25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgICBpZiAoYXR0cnNbaV0tPm5hbWUoKS5tYXRjaGVz
KG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGF0dHJzW2ldOwotICAgIH0KLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBOYW1lZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygpCi17Ci0gICAgaWYg
KGF0dHJzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykgewot
ICAgICAgICAgICAgaWYgKGF0dHJzW2ldLT5tX2ltcGwpCi0gICAgICAgICAgICAgICAgYXR0cnNb
aV0tPm1faW1wbC0+bV9lbGVtZW50ID0gMDsKLSAgICAgICAgICAgIGF0dHJzW2ldLT5kZXJlZigp
OwotICAgICAgICB9Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSAw
OwotICAgIH0KLSAgICBsZW4gPSAwOwotfQotCi12b2lkIE5hbWVkQXR0ck1hcDo6ZGV0YWNoRnJv
bUVsZW1lbnQoKQotewotICAgIC8vIHdlIGFsbG93IGEgTmFtZWRBdHRyTWFwIHcvbyBhbiBlbGVt
ZW50IGluIGNhc2Ugc29tZW9uZSBzdGlsbCBoYXMgYSByZWZlcmVuY2UKLSAgICAvLyB0byBpZiBh
ZnRlciB0aGUgZWxlbWVudCBnZXRzIGRlbGV0ZWQgLSBidXQgdGhlIG1hcCBpcyBub3cgaW52YWxp
ZAotICAgIGVsZW1lbnQgPSAwOwotICAgIGNsZWFyQXR0cmlidXRlcygpOwotfQotCi1OYW1lZEF0
dHJNYXAmIE5hbWVkQXR0ck1hcDo6b3BlcmF0b3I9KGNvbnN0IE5hbWVkQXR0ck1hcCYgb3RoZXIp
Ci17Ci0gICAgLy8gY2xvbmUgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIG90aGVyIG1hcCwgYnV0IGF0
dGFjaCB0byBvdXIgZWxlbWVudAotICAgIGlmICghZWxlbWVudCkKLSAgICAgICAgcmV0dXJuICp0
aGlzOwotCi0gICAgLy8gSWYgYXNzaWduaW5nIHRoZSBtYXAgY2hhbmdlcyB0aGUgaWQgYXR0cmli
dXRlLCB3ZSBuZWVkIHRvIGNhbGwKLSAgICAvLyB1cGRhdGVJZC4KLQotICAgIEF0dHJpYnV0ZSAq
b2xkSWQgPSBnZXRBdHRyaWJ1dGVJdGVtKGlkQXR0cik7Ci0gICAgQXR0cmlidXRlICpuZXdJZCA9
IG90aGVyLmdldEF0dHJpYnV0ZUl0ZW0oaWRBdHRyKTsKLQotICAgIGlmIChvbGRJZCB8fCBuZXdJ
ZCkKLSAgICAgICAgZWxlbWVudC0+dXBkYXRlSWQob2xkSWQgPyBvbGRJZC0+dmFsdWUoKSA6IG51
bGxBdG9tLCBuZXdJZCA/IG5ld0lkLT52YWx1ZSgpIDogbnVsbEF0b20pOwotCi0gICAgY2xlYXJB
dHRyaWJ1dGVzKCk7Ci0gICAgbGVuID0gb3RoZXIubGVuOwotICAgIGF0dHJzID0gc3RhdGljX2Nh
c3Q8QXR0cmlidXRlICoqPihmYXN0TWFsbG9jKGxlbiAqIHNpemVvZihBdHRyaWJ1dGUgKikpKTsK
LQotICAgIC8vIGZpcnN0IGluaXRpYWxpemUgYXR0cnMgdmVjdG9yLCB0aGVuIGNhbGwgYXR0cmli
dXRlQ2hhbmdlZCBvbiBpdAotICAgIC8vIHRoaXMgYWxsb3dzIGF0dHJpYnV0ZUNoYW5nZWQgdG8g
dXNlIGdldEF0dHJpYnV0ZQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykg
ewotICAgICAgICBhdHRyc1tpXSA9IG90aGVyLmF0dHJzW2ldLT5jbG9uZSgpOwotICAgICAgICBh
dHRyc1tpXS0+cmVmKCk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgd2FzdGVmdWwu
ICBUaGUgY2xhc3MgbGlzdCBjb3VsZCBiZSBwcmVzZXJ2ZWQgb24gYSBjb3B5LCBhbmQgd2UKLSAg
ICAvLyB3b3VsZG4ndCBoYXZlIHRvIHdhc3RlIHRpbWUgcmVwYXJzaW5nIHRoZSBhdHRyaWJ1dGUu
Ci0gICAgLy8gVGhlIGRlcml2ZWQgY2xhc3MsIEhUTUxOYW1lZEF0dHJNYXAsIHdoaWNoIG1hbmFn
ZXMgYSBwYXJzZWQgY2xhc3MgbGlzdCBmb3IgdGhlIENMQVNTIGF0dHJpYnV0ZSwKLSAgICAvLyB3
aWxsIHVwZGF0ZSBpdHMgbWVtYmVyIHZhcmlhYmxlIHdoZW4gcGFyc2UgYXR0cmlidXRlIGlzIGNh
bGxlZC4KLSAgICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgZWxl
bWVudC0+YXR0cmlidXRlQ2hhbmdlZChhdHRyc1tpXSwgdHJ1ZSk7Ci0KLSAgICByZXR1cm4gKnRo
aXM7Ci19Ci0KLXZvaWQgTmFtZWRBdHRyTWFwOjphZGRBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRy
aWJ1dGUpCi17Ci0gICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3QKLSAgICBBdHRy
aWJ1dGUgKipuZXdBdHRycyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZSAqKj4oZmFzdE1hbGxvYygo
bGVuICsgMSkgKiBzaXplb2YoQXR0cmlidXRlICopKSk7Ci0gICAgaWYgKGF0dHJzKSB7Ci0gICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgIG5ld0F0dHJzW2ld
ID0gYXR0cnNbaV07Ci0gICAgICBmYXN0RnJlZShhdHRycyk7Ci0gICAgfQotICAgIGF0dHJzID0g
bmV3QXR0cnM7Ci0gICAgYXR0cnNbbGVuKytdID0gYXR0cmlidXRlOwotICAgIGF0dHJpYnV0ZS0+
cmVmKCk7Ci0KLSAgICBBdHRyICogY29uc3QgYXR0ciA9IGF0dHJpYnV0ZS0+bV9pbXBsOwotICAg
IGlmIChhdHRyKQotICAgICAgICBhdHRyLT5tX2VsZW1lbnQgPSBlbGVtZW50OwotCi0gICAgLy8g
Tm90aWZ5IHRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBhZGRlZCwgYW5k
IGRpc3BhdGNoIGFwcHJvcHJpYXRlIG11dGF0aW9uIGV2ZW50cwotICAgIC8vIE5vdGUgdGhhdCBl
bGVtZW50IG1heSBiZSBudWxsIGhlcmUgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIGluc2VydEF0dHIo
KSBkdXJpbmcgcGFyc2luZwotICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgIFJlZlB0cjxBdHRy
aWJ1dGU+IGEgPSBhdHRyaWJ1dGU7Ci0gICAgICAgIGVsZW1lbnQtPmF0dHJpYnV0ZUNoYW5nZWQo
YS5nZXQoKSk7Ci0gICAgICAgIC8vIEJlY2F1c2Ugb2Ygb3VyIHVwZGF0ZVN0eWxlQXR0cmlidXRl
SWZOZWVkZWQoKSBzdHlsZSBtb2RpZmljYXRpb24gZXZlbnRzIGFyZSBuZXZlciBzZW50IGF0IHRo
ZSByaWdodCB0aW1lLCBzbyBkb24ndCBib3RoZXIgc2VuZGluZyB0aGVtLgotICAgICAgICBpZiAo
YS0+bmFtZSgpICE9IHN0eWxlQXR0cikgewotICAgICAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hB
dHRyQWRkaXRpb25FdmVudChhLmdldCgpKTsKLSAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNo
U3VidHJlZU1vZGlmaWVkRXZlbnQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lk
IE5hbWVkQXR0ck1hcDo6cmVtb3ZlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUp
Ci17Ci0gICAgdW5zaWduZWQgaW5kZXggPSBsZW4rMTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbGVuOyArK2kpCi0gICAgICAgIGlmIChhdHRyc1tpXS0+bmFtZSgpLm1hdGNoZXMobmFt
ZSkpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0KLSAgICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm47Ci0KLSAgICAvLyBSZW1vdmUgdGhl
IGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0Ci0gICAgQXR0cmlidXRlKiBhdHRyID0gYXR0cnNbaW5k
ZXhdOwotICAgIGlmIChhdHRyc1tpbmRleF0tPm1faW1wbCkKLSAgICAgICAgYXR0cnNbaW5kZXhd
LT5tX2ltcGwtPm1fZWxlbWVudCA9IDA7Ci0gICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIGZh
c3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0cnMgPSAwOwotICAgICAgICBsZW4gPSAwOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIEF0dHJpYnV0ZSAqKm5ld0F0dHJzID0gc3RhdGljX2Nhc3Q8QXR0
cmlidXRlICoqPihmYXN0TWFsbG9jKChsZW4gLSAxKSAqIHNpemVvZihBdHRyaWJ1dGUgKikpKTsK
LSAgICAgICAgdW5zaWduZWQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHVuc2lnbmVkKGlu
ZGV4KTsgaSsrKQotICAgICAgICAgICAgbmV3QXR0cnNbaV0gPSBhdHRyc1tpXTsKLSAgICAgICAg
bGVuLS07Ci0gICAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICBuZXdBdHRy
c1tpXSA9IGF0dHJzW2krMV07Ci0gICAgICAgIGZhc3RGcmVlKGF0dHJzKTsKLSAgICAgICAgYXR0
cnMgPSBuZXdBdHRyczsKLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhlIGVsZW1lbnQgdGhhdCB0
aGUgYXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAvLyBkaXNwYXRjaCBhcHByb3ByaWF0
ZSBtdXRhdGlvbiBldmVudHMKLSAgICBpZiAoZWxlbWVudCAmJiAhYXR0ci0+bV92YWx1ZS5pc051
bGwoKSkgewotICAgICAgICBBdG9taWNTdHJpbmcgdmFsdWUgPSBhdHRyLT5tX3ZhbHVlOwotICAg
ICAgICBhdHRyLT5tX3ZhbHVlID0gbnVsbEF0b207Ci0gICAgICAgIGVsZW1lbnQtPmF0dHJpYnV0
ZUNoYW5nZWQoYXR0cik7Ci0gICAgICAgIGF0dHItPm1fdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0g
ICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2
ZW50KGF0dHIpOwotICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFN1YnRyZWVNb2RpZmllZEV2ZW50
KGZhbHNlKTsKLSAgICB9Ci0gICAgYXR0ci0+ZGVyZWYoKTsKLX0KLQotYm9vbCBOYW1lZEF0dHJN
YXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0Ci17
Ci0gICAgaWYgKCFvdGhlck1hcCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlm
IChsZW5ndGgoKSAhPSBvdGhlck1hcC0+bGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoKCk7IGkrKykgewotICAg
ICAgICBBdHRyaWJ1dGUgKmF0dHIgPSBhdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICBBdHRyaWJ1
dGUgKm90aGVyQXR0ciA9IG90aGVyTWFwLT5nZXRBdHRyaWJ1dGVJdGVtKGF0dHItPm5hbWUoKSk7
Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYgKCFvdGhlckF0dHIgfHwgYXR0ci0+dmFsdWUoKSAh
PSBvdGhlckF0dHItPnZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIFN0eWxlZCBFbGVtZW50IGFuZCBNYXBwZWQgQXR0cmlidXRlIEltcGxlbWVudGF0aW9u
Ci0KLUNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uOjp+Q1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb24oKQotewotICAgIGlmIChtX2VudHJ5VHlwZSAhPSBlUGVyc2lzdGVudCkKLSAgICAg
ICAgU3R5bGVkRWxlbWVudDo6cmVtb3ZlTWFwcGVkQXR0cmlidXRlRGVjbChtX2VudHJ5VHlwZSwg
bV9hdHRyTmFtZSwgbV9hdHRyVmFsdWUpOwotfQotCi1DU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbiogU3R5bGVkRWxlbWVudDo6Z2V0TWFwcGVkQXR0cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1
dGVFbnRyeSBlbnRyeVR5cGUsIEF0dHJpYnV0ZSogYXR0cikKLXsKLSAgICBpZiAoIW1hcHBlZEF0
dHJpYnV0ZURlY2xzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gbWFwcGVkQXR0cmli
dXRlRGVjbHMtPmdldChNYXBwZWRBdHRyaWJ1dGVLZXkoZW50cnlUeXBlLCBhdHRyLT5uYW1lKCku
bG9jYWxOYW1lKCkuaW1wbCgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSkpOwotfQotCi12b2lkIFN0
eWxlZEVsZW1lbnQ6OnNldE1hcHBlZEF0dHJpYnV0ZURlY2woTWFwcGVkQXR0cmlidXRlRW50cnkg
ZW50cnlUeXBlLCBBdHRyaWJ1dGUqIGF0dHIsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9u
KiBkZWNsKQotewotICAgIGlmICghbWFwcGVkQXR0cmlidXRlRGVjbHMpCi0gICAgICAgIG1hcHBl
ZEF0dHJpYnV0ZURlY2xzID0gbmV3IE1hcHBlZEF0dHJpYnV0ZURlY2xzOwotICAgIG1hcHBlZEF0
dHJpYnV0ZURlY2xzLT5zZXQoTWFwcGVkQXR0cmlidXRlS2V5KGVudHJ5VHlwZSwgYXR0ci0+bmFt
ZSgpLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0ci0+dmFsdWUoKS5pbXBsKCkpLCBkZWNsKTsKLX0K
LQotdm9pZCBTdHlsZWRFbGVtZW50OjpyZW1vdmVNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0
dHJpYnV0ZUVudHJ5IGVudHJ5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIGNvbnN0IEF0
b21pY1N0cmluZyYgYXR0clZhbHVlKQotewotICAgIGlmICghbWFwcGVkQXR0cmlidXRlRGVjbHMp
Ci0gICAgICAgIHJldHVybjsKLSAgICBtYXBwZWRBdHRyaWJ1dGVEZWNscy0+cmVtb3ZlKE1hcHBl
ZEF0dHJpYnV0ZUtleShlbnRyeVR5cGUsIGF0dHJOYW1lLmxvY2FsTmFtZSgpLmltcGwoKSwgYXR0
clZhbHVlLmltcGwoKSkpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmludmFsaWRhdGVTdHls
ZUF0dHJpYnV0ZSgpCi17Ci0gICAgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQgPSBmYWxzZTsKLX0K
LQotdm9pZCBTdHlsZWRFbGVtZW50Ojp1cGRhdGVTdHlsZUF0dHJpYnV0ZUlmTmVlZGVkKCkgY29u
c3QKLXsKLSAgICBpZiAoIW1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkKSB7Ci0gICAgICAgIG1faXNT
dHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgbV9zeW5jaHJvbml6aW5nU3R5bGVB
dHRyaWJ1dGUgPSB0cnVlOwotICAgICAgICBpZiAobV9pbmxpbmVTdHlsZURlY2wpCi0gICAgICAg
ICAgICBjb25zdF9jYXN0PFN0eWxlZEVsZW1lbnQqPih0aGlzKS0+c2V0QXR0cmlidXRlKHN0eWxl
QXR0ciwgbV9pbmxpbmVTdHlsZURlY2wtPmNzc1RleHQoKSk7Ci0gICAgICAgIG1fc3luY2hyb25p
emluZ1N0eWxlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgfQotfQotCi1BdHRyaWJ1dGUqIE1hcHBl
ZEF0dHJpYnV0ZTo6Y2xvbmUoYm9vbCBwcmVzZXJ2ZURlY2wpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG5ldyBNYXBwZWRBdHRyaWJ1dGUobmFtZSgpLCB2YWx1ZSgpLCBwcmVzZXJ2ZURlY2wgPyBtX3N0
eWxlRGVjbC5nZXQoKSA6IDApOwotfQotCi1OYW1lZE1hcHBlZEF0dHJNYXA6Ok5hbWVkTWFwcGVk
QXR0ck1hcChFbGVtZW50ICplKQotOk5hbWVkQXR0ck1hcChlKSwgbV9tYXBwZWRBdHRyaWJ1dGVD
b3VudCgwKQote30KLQotdm9pZCBOYW1lZE1hcHBlZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygp
Ci17Ci0gICAgbV9jbGFzc0xpc3QuY2xlYXIoKTsKLSAgICBtX21hcHBlZEF0dHJpYnV0ZUNvdW50
ID0gMDsKLSAgICBOYW1lZEF0dHJNYXA6OmNsZWFyQXR0cmlidXRlcygpOwotfQotCi1ib29sIE5h
bWVkTWFwcGVkQXR0ck1hcDo6aXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBjb25zdAotewotICAgIHJl
dHVybiB0cnVlOwotfQotCi1pbnQgTmFtZWRNYXBwZWRBdHRyTWFwOjpkZWNsQ291bnQoKSBjb25z
dAotewotICAgIGludCByZXN1bHQgPSAwOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBs
ZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIE1hcHBlZEF0dHJpYnV0ZSogYXR0ciA9IGF0dHJpYnV0
ZUl0ZW0oaSk7Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkpCi0gICAgICAgICAgICByZXN1bHQr
KzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBOYW1lZE1hcHBlZEF0dHJN
YXA6Om1hcHNFcXVpdmFsZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXApIGNv
bnN0Ci17Ci0gICAgLy8gVGhlICMgb2YgZGVjbHMgbXVzdCBtYXRjaC4KLSAgICBpZiAoZGVjbENv
dW50KCkgIT0gb3RoZXJNYXAtPmRlY2xDb3VudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgCi0gICAgLy8gVGhlIHZhbHVlcyBmb3IgZWFjaCBkZWNsIG11c3QgbWF0Y2guCi0gICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgTWFwcGVkQXR0
cmlidXRlKiBhdHRyID0gYXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgaWYgKGF0dHItPmRlY2wo
KSkgewotICAgICAgICAgICAgQXR0cmlidXRlKiBvdGhlckF0dHIgPSBvdGhlck1hcC0+Z2V0QXR0
cmlidXRlSXRlbShhdHRyLT5uYW1lKCkpOwotICAgICAgICAgICAgaWYgKCFvdGhlckF0dHIgfHwg
KGF0dHItPnZhbHVlKCkgIT0gb3RoZXJBdHRyLT52YWx1ZSgpKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWlu
bGluZSBzdGF0aWMgYm9vbCBpc0NsYXNzV2hpdGVzcGFjZShRQ2hhciBjKQotewotICAgIHJldHVy
biBjID09ICcgJyB8fCBjID09ICdccicgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JzsKLX0KLQot
dm9pZCBOYW1lZE1hcHBlZEF0dHJNYXA6OnBhcnNlQ2xhc3NBdHRyaWJ1dGUoY29uc3QgU3RyaW5n
JiBjbGFzc1N0cikKLXsKLSAgICBtX2NsYXNzTGlzdC5jbGVhcigpOwotICAgIGlmICghZWxlbWVu
dC0+aGFzQ2xhc3MoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFN0cmluZyBjbGFzc0F0
dHIgPSBlbGVtZW50LT5nZXREb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSA/IAotICAgICAgICAo
Y2xhc3NTdHIuaW1wbCgpLT5pc0xvd2VyKCkgPyBjbGFzc1N0ciA6IFN0cmluZyhjbGFzc1N0ci5p
bXBsKCktPmxvd2VyKCkpKSA6Ci0gICAgICAgIGNsYXNzU3RyOwotICAgIAotICAgIEF0b21pY1N0
cmluZ0xpc3QqIGN1cnIgPSAwOwotICAgIAotICAgIGNvbnN0IFFDaGFyKiBzdHIgPSBjbGFzc0F0
dHIudW5pY29kZSgpOwotICAgIGludCBsZW5ndGggPSBjbGFzc0F0dHIubGVuZ3RoKCk7Ci0gICAg
aW50IHNQb3MgPSAwOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgd2hpbGUgKHNQb3Mg
PCBsZW5ndGggJiYgaXNDbGFzc1doaXRlc3BhY2Uoc3RyW3NQb3NdKSkKLSAgICAgICAgICAgICsr
c1BvczsKLSAgICAgICAgaWYgKHNQb3MgPj0gbGVuZ3RoKQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGludCBlUG9zID0gc1BvcyArIDE7Ci0gICAgICAgIHdoaWxlIChlUG9zIDwgbGVuZ3Ro
ICYmICFpc0NsYXNzV2hpdGVzcGFjZShzdHJbZVBvc10pKQotICAgICAgICAgICAgKytlUG9zOwot
ICAgICAgICBpZiAoY3VycikgewotICAgICAgICAgICAgY3Vyci0+c2V0TmV4dChuZXcgQXRvbWlj
U3RyaW5nTGlzdChBdG9taWNTdHJpbmcoc3RyICsgc1BvcywgZVBvcyAtIHNQb3MpKSk7Ci0gICAg
ICAgICAgICBjdXJyID0gY3Vyci0+bmV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgaWYgKHNQb3MgPT0gMCAmJiBlUG9zID09IGxlbmd0aCkgewotICAgICAgICAgICAgICAgIG1f
Y2xhc3NMaXN0LnNldFN0cmluZyhBdG9taWNTdHJpbmcoY2xhc3NBdHRyKSk7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2NsYXNzTGlzdC5zZXRT
dHJpbmcoQXRvbWljU3RyaW5nKHN0ciArIHNQb3MsIGVQb3MgLSBzUG9zKSk7Ci0gICAgICAgICAg
ICBjdXJyID0gJm1fY2xhc3NMaXN0OwotICAgICAgICB9Ci0gICAgICAgIHNQb3MgPSBlUG9zICsg
MTsKLSAgICB9Ci19Ci0KLVN0eWxlZEVsZW1lbnQ6OlN0eWxlZEVsZW1lbnQoY29uc3QgUXVhbGlm
aWVkTmFtZSYgbmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgICA6IEVsZW1lbnQobmFtZSwgZG9jKQot
ewotICAgIG1faXNTdHlsZUF0dHJpYnV0ZVZhbGlkID0gdHJ1ZTsKLSAgICBtX3N5bmNocm9uaXpp
bmdTdHlsZUF0dHJpYnV0ZSA9IGZhbHNlOwotfQotCi1TdHlsZWRFbGVtZW50Ojp+U3R5bGVkRWxl
bWVudCgpCi17Ci0gICAgZGVzdHJveUlubGluZVN0eWxlRGVjbCgpOwotfQotCi1BdHRyaWJ1dGUq
IFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
LCBTdHJpbmdJbXBsKiB2YWx1ZSkKLXsKLSAgICByZXR1cm4gbmV3IE1hcHBlZEF0dHJpYnV0ZShu
YW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5bGVkRWxlbWVudDo6Y3JlYXRlSW5saW5lU3R5bGVE
ZWNsKCkKLXsKLSAgICBtX2lubGluZVN0eWxlRGVjbCA9IG5ldyBDU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbjsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0UGFyZW50KGdldERvY3VtZW50KCkt
PmVsZW1lbnRTaGVldCgpKTsKLSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0Tm9kZSh0aGlzKTsK
LSAgICBtX2lubGluZVN0eWxlRGVjbC0+c2V0U3RyaWN0UGFyc2luZyghZ2V0RG9jdW1lbnQoKS0+
aW5Db21wYXRNb2RlKCkpOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmRlc3Ryb3lJbmxpbmVT
dHlsZURlY2woKQotewotICAgIGlmIChtX2lubGluZVN0eWxlRGVjbCkgewotICAgICAgICBtX2lu
bGluZVN0eWxlRGVjbC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgbV9pbmxpbmVTdHlsZURlY2wtPnNl
dFBhcmVudCgwKTsKLSAgICAgICAgbV9pbmxpbmVTdHlsZURlY2wgPSAwOwotICAgIH0KLX0KLQot
dm9pZCBTdHlsZWRFbGVtZW50OjphdHRyaWJ1dGVDaGFuZ2VkKEF0dHJpYnV0ZSogYXR0ciwgYm9v
bCBwcmVzZXJ2ZURlY2xzKQotewotICAgIE1hcHBlZEF0dHJpYnV0ZSogbWFwcGVkQXR0ciA9IHN0
YXRpY19jYXN0PE1hcHBlZEF0dHJpYnV0ZSo+KGF0dHIpOwotICAgIGlmIChtYXBwZWRBdHRyLT5k
ZWNsKCkgJiYgIXByZXNlcnZlRGVjbHMpIHsKLSAgICAgICAgbWFwcGVkQXR0ci0+c2V0RGVjbCgw
KTsKLSAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAg
ICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5kZWNsUmVtb3ZlZCgpOwotICAgIH0KLQotICAg
IGJvb2wgY2hlY2tEZWNsID0gdHJ1ZTsKLSAgICBNYXBwZWRBdHRyaWJ1dGVFbnRyeSBlbnRyeTsK
LSAgICBib29sIG5lZWRUb1BhcnNlID0gbWFwVG9FbnRyeShhdHRyLT5uYW1lKCksIGVudHJ5KTsK
LSAgICBpZiAocHJlc2VydmVEZWNscykgewotICAgICAgICBpZiAobWFwcGVkQXR0ci0+ZGVjbCgp
KSB7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAobmFtZWRBdHRy
TWFwKQotICAgICAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVjbEFkZGVkKCk7Ci0g
ICAgICAgICAgICBjaGVja0RlY2wgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNl
IGlmICghYXR0ci0+aXNOdWxsKCkgJiYgZW50cnkgIT0gZU5vbmUpIHsKLSAgICAgICAgQ1NTTWFw
cGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVu
dHJ5LCBhdHRyKTsKLSAgICAgICAgaWYgKGRlY2wpIHsKLSAgICAgICAgICAgIG1hcHBlZEF0dHIt
PnNldERlY2woZGVjbCk7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBp
ZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgICAgIG1hcHBlZEF0dHJpYnV0ZXMoKS0+ZGVj
bEFkZGVkKCk7Ci0gICAgICAgICAgICBjaGVja0RlY2wgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNl
Ci0gICAgICAgICAgICBuZWVkVG9QYXJzZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG5lZWRU
b1BhcnNlKQotICAgICAgICBwYXJzZU1hcHBlZEF0dHJpYnV0ZShtYXBwZWRBdHRyKTsKLSAgICAK
LSAgICBpZiAoY2hlY2tEZWNsICYmIG1hcHBlZEF0dHItPmRlY2woKSkgewotICAgICAgICAvLyBB
ZGQgdGhlIGRlY2wgdG8gdGhlIHRhYmxlIGluIHRoZSBhcHByb3ByaWF0ZSBzcG90LgotICAgICAg
ICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVudHJ5LCBhdHRyLCBtYXBwZWRBdHRyLT5kZWNsKCkp
OwotICAgICAgICBtYXBwZWRBdHRyLT5kZWNsKCktPnNldE1hcHBlZFN0YXRlKGVudHJ5LCBhdHRy
LT5uYW1lKCksIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBtYXBwZWRBdHRyLT5kZWNsKCktPnNl
dFBhcmVudCgwKTsKLSAgICAgICAgbWFwcGVkQXR0ci0+ZGVjbCgpLT5zZXROb2RlKDApOwotICAg
ICAgICBpZiAobmFtZWRBdHRyTWFwKQotICAgICAgICAgICAgbWFwcGVkQXR0cmlidXRlcygpLT5k
ZWNsQWRkZWQoKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3R5bGVkRWxlbWVudDo6bWFwVG9FbnRyeShj
b25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3Vs
dCkgY29uc3QKLXsKLSAgICByZXN1bHQgPSBlTm9uZTsKLSAgICBpZiAoYXR0ck5hbWUgPT0gc3R5
bGVBdHRyKQotICAgICAgICByZXR1cm4gIW1fc3luY2hyb25pemluZ1N0eWxlQXR0cmlidXRlOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09
IGlkQXR0cikgewotICAgICAgICAvLyB1bmlxdWUgaWQKLSAgICAgICAgc2V0SGFzSUQoIWF0dHIt
PmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKG5hbWVkQXR0ck1hcCkgewotICAgICAgICAgICAgaWYg
KGF0dHItPmlzTnVsbCgpKQotICAgICAgICAgICAgICAgIG5hbWVkQXR0ck1hcC0+c2V0SUQobnVs
bEF0b20pOwotICAgICAgICAgICAgZWxzZSBpZiAoZ2V0RG9jdW1lbnQoKS0+aW5Db21wYXRNb2Rl
KCkgJiYgIWF0dHItPnZhbHVlKCkuaW1wbCgpLT5pc0xvd2VyKCkpCi0gICAgICAgICAgICAgICAg
bmFtZWRBdHRyTWFwLT5zZXRJRChBdG9taWNTdHJpbmcoYXR0ci0+dmFsdWUoKS5kb21TdHJpbmco
KS5sb3dlcigpKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbmFtZWRBdHRy
TWFwLT5zZXRJRChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRDaGFuZ2Vk
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2xhc3NBdHRyKSB7Ci0gICAgICAg
IC8vIGNsYXNzCi0gICAgICAgIHNldEhhc0NsYXNzKCFhdHRyLT5pc051bGwoKSk7Ci0gICAgICAg
IGlmIChuYW1lZEF0dHJNYXApCi0gICAgICAgICAgICBtYXBwZWRBdHRyaWJ1dGVzKCktPnBhcnNl
Q2xhc3NBdHRyaWJ1dGUoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIHNldENoYW5nZWQoKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzdHlsZUF0dHIpIHsKLSAgICAgICAgc2V0SGFz
U3R5bGUoIWF0dHItPmlzTnVsbCgpKTsKLSAgICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKQotICAg
ICAgICAgICAgZGVzdHJveUlubGluZVN0eWxlRGVjbCgpOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBnZXRJbmxpbmVTdHlsZURlY2woKS0+cGFyc2VEZWNsYXJhdGlvbihhdHRyLT52YWx1ZSgp
KTsKLSAgICAgICAgbV9pc1N0eWxlQXR0cmlidXRlVmFsaWQgPSB0cnVlOwotICAgICAgICBzZXRD
aGFuZ2VkKCk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmNyZWF0ZUF0dHJpYnV0
ZU1hcCgpIGNvbnN0Ci17Ci0gICAgbmFtZWRBdHRyTWFwID0gbmV3IE5hbWVkTWFwcGVkQXR0ck1h
cChjb25zdF9jYXN0PFN0eWxlZEVsZW1lbnQqPih0aGlzKSk7Ci19Ci0KLUNTU011dGFibGVTdHls
ZURlY2xhcmF0aW9uKiBTdHlsZWRFbGVtZW50OjpnZXRJbmxpbmVTdHlsZURlY2woKQotewotICAg
IGlmICghbV9pbmxpbmVTdHlsZURlY2wpCi0gICAgICAgIGNyZWF0ZUlubGluZVN0eWxlRGVjbCgp
OwotICAgIHJldHVybiBtX2lubGluZVN0eWxlRGVjbC5nZXQoKTsKLX0KLQotQ1NTU3R5bGVEZWNs
YXJhdGlvbiogU3R5bGVkRWxlbWVudDo6c3R5bGUoKQotewotICAgIHJldHVybiBnZXRJbmxpbmVT
dHlsZURlY2woKTsKLX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIFN0eWxlZEVsZW1l
bnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKQotewotICAgIHJldHVybiAwOwotfQot
Ci1jb25zdCBBdG9taWNTdHJpbmdMaXN0KiBTdHlsZWRFbGVtZW50OjpnZXRDbGFzc0xpc3QoKSBj
b25zdAotewotICAgIHJldHVybiBuYW1lZEF0dHJNYXAgPyBtYXBwZWRBdHRyaWJ1dGVzKCktPmdl
dENsYXNzTGlzdCgpIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzSGV4RGlnaXQoIGNv
bnN0IFFDaGFyICZjICkgewotICAgIHJldHVybiAoIGMgPj0gJzAnICYmIGMgPD0gJzknICkgfHwK
LSAgICAgICAgICAgKCBjID49ICdhJyAmJiBjIDw9ICdmJyApIHx8Ci0gICAgICAgICAgICggYyA+
PSAnQScgJiYgYyA8PSAnRicgKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdG9IZXgoIGNvbnN0
IFFDaGFyICZjICkgewotICAgIHJldHVybiAoIChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAg
ICAgICAgICA/IChjLnVuaWNvZGUoKSAtICcwJykKLSAgICAgICAgICAgICA6ICggKCBjID49ICdh
JyAmJiBjIDw9ICdmJyApCi0gICAgICAgICAgICAgICAgID8gKGMudW5pY29kZSgpIC0gJ2EnICsg
MTApCi0gICAgICAgICAgICAgICAgIDogKCAoIGMgPj0gJ0EnICYmIGMgPD0gJ0YnICkKLSAgICAg
ICAgICAgICAgICAgICAgID8gKGMudW5pY29kZSgpIC0gJ0EnICsgMTApCi0gICAgICAgICAgICAg
ICAgICAgICA6IC0xICkgKSApOwotfQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU1Byb3Bl
cnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVNYXBwZWREZWNsKGF0dHIpOwotICAgIGF0
dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIHZhbHVlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgU3R5
bGVkRWxlbWVudDo6YWRkQ1NTUHJvcGVydHkoTWFwcGVkQXR0cmlidXRlKiBhdHRyLCBpbnQgaWQs
IGludCB2YWx1ZSkKLXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChh
dHRyKTsKLSAgICBhdHRyLT5kZWNsKCktPnNldFByb3BlcnR5KGlkLCB2YWx1ZSwgZmFsc2UpOwot
fQotCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU1N0cmluZ1Byb3BlcnR5KE1hcHBlZEF0dHJp
YnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlLCBDU1NQcmltaXRpdmVWYWx1
ZTo6VW5pdFR5cGVzIHR5cGUpCi17Ci0gICAgaWYgKCFhdHRyLT5kZWNsKCkpIGNyZWF0ZU1hcHBl
ZERlY2woYXR0cik7Ci0gICAgYXR0ci0+ZGVjbCgpLT5zZXRTdHJpbmdQcm9wZXJ0eShpZCwgdmFs
dWUsIHR5cGUsIGZhbHNlKTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjphZGRDU1NJbWFnZVBy
b3BlcnR5KE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJlVSTCkK
LXsKLSAgICBpZiAoIWF0dHItPmRlY2woKSkgY3JlYXRlTWFwcGVkRGVjbChhdHRyKTsKLSAgICBh
dHRyLT5kZWNsKCktPnNldEltYWdlUHJvcGVydHkoaWQsIFVSTCwgZmFsc2UpOwotfQotCi12b2lk
IFN0eWxlZEVsZW1lbnQ6OmFkZENTU0xlbmd0aChNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBp
ZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBz
aG91bGQgbm90IHNwaW4gdXAgdGhlIENTUyBwYXJzZXIsIGJ1dCBzaG91bGQgaW5zdGVhZCBqdXN0
IGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QKLSAgICAvLyBsZW5ndGggdW5pdCBhbmQgbWFrZSB0aGUg
YXBwcm9wcmlhdGUgcGFyc2VkIHZhbHVlLgotICAgIGlmICghYXR0ci0+ZGVjbCgpKSBjcmVhdGVN
YXBwZWREZWNsKGF0dHIpOwotCi0gICAgLy8gc3RyaXAgYXR0cmlidXRlIGdhcmJhZ2UuLgotICAg
IFN0cmluZ0ltcGwqIHYgPSB2YWx1ZS5pbXBsKCk7Ci0gICAgaWYgKHYpIHsKLSAgICAgICAgdW5z
aWduZWQgaW50IGwgPSAwOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGwgPCB2LT5sZW5ndGgo
KSAmJiAoKnYpW2xdLnVuaWNvZGUoKSA8PSAnICcpCi0gICAgICAgICAgICBsKys7Ci0gICAgICAg
IAotICAgICAgICBmb3IgKDsgbCA8IHYtPmxlbmd0aCgpOyBsKyspIHsKLSAgICAgICAgICAgIGNo
YXIgY2MgPSAoKnYpW2xdLmxhdGluMSgpOwotICAgICAgICAgICAgaWYgKGNjID4gJzknIHx8IChj
YyA8ICcwJyAmJiBjYyAhPSAnKicgJiYgY2MgIT0gJyUnICYmIGNjICE9ICcuJykpCi0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobCAhPSB2LT5sZW5ndGgo
KSkgewotICAgICAgICAgICAgYXR0ci0+ZGVjbCgpLT5zZXRMZW5ndGhQcm9wZXJ0eShpZCwgdi0+
c3Vic3RyaW5nKDAsIGwpLCBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgCi0gICAgYXR0ci0+ZGVjbCgpLT5zZXRMZW5ndGhQcm9wZXJ0eShpZCwgdmFs
dWUsIGZhbHNlKTsKLX0KLQotLyogY29sb3IgcGFyc2luZyB0aGF0IHRyaWVzIHRvIG1hdGNoIGFz
IGNsb3NlIGFzIHBvc3NpYmxlIElFIDYuICovCi12b2lkIFN0eWxlZEVsZW1lbnQ6OmFkZENTU0Nv
bG9yKE1hcHBlZEF0dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJmMpCi17Ci0g
ICAgLy8gdGhpcyBpcyB0aGUgb25seSBjYXNlIG5vIGNvbG9yIGdldHMgYXBwbGllZCBpbiBJRS4K
LSAgICBpZiAoICFjLmxlbmd0aCgpICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFhdHRy
LT5kZWNsKCkpIGNyZWF0ZU1hcHBlZERlY2woYXR0cik7Ci0gICAgCi0gICAgaWYgKGF0dHItPmRl
Y2woKS0+c2V0UHJvcGVydHkoaWQsIGMsIGZhbHNlKSApCi0gICAgICAgIHJldHVybjsKLSAgICAK
LSAgICBEZXByZWNhdGVkU3RyaW5nIGNvbG9yID0gYy5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAg
Ly8gbm90IHNvbWV0aGluZyB0aGF0IGZpdHMgdGhlIHNwZWNzLgotICAgIAotICAgIC8vIHdlJ3Jl
IGVtdWxhdGluZyBJRXMgY29sb3IgcGFyc2VyIGhlcmUuIEl0IG1hcHMgdHJhbnNwYXJlbnQgdG8g
YmxhY2ssIG90aGVyd2lzZSBpdCB0cmllcyB0byBidWlsZCBhIHJnYiB2YWx1ZQotICAgIC8vIG91
dCBvZiBldmVyeWh0aW5nIHlvdSBwdXQgaW4uIFRoZSBhbGdvcml0aG0gaXMgZXhwZXJpbWVudGFs
bHkgZGV0ZXJtaW5lZCwgYnV0IHNlZW1zIHRvIHdvcmsgZm9yIGFsbCB0ZXN0IGNhc2VzIEkgaGF2
ZS4KLSAgICAKLSAgICAvLyB0aGUgbGVuZ3RoIG9mIHRoZSBjb2xvciB2YWx1ZSBpcyByb3VuZGVk
IHVwIHRvIHRoZSBuZXh0Ci0gICAgLy8gbXVsdGlwbGUgb2YgMy4gZWFjaCBwYXJ0IG9mIHRoZSBy
Z2IgdHJpcGxlIHRoZW4gZ2V0cyBvbmUgdGhpcmQKLSAgICAvLyBvZiB0aGUgbGVuZ3RoLgotICAg
IC8vCi0gICAgLy8gRWFjaCB0cmlwbGV0IGlzIHBhcnNlZCBieXRlIGJ5IGJ5dGUsIG1hcHBpbmcK
LSAgICAvLyBlYWNoIG51bWJlciB0byBhIGhleCB2YWx1ZSAoMC05YS1mQS1GIHRvIHRoZWlyIHZh
bHVlcwotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSB0byAwKS4KLSAgICAvLwotICAgIC8vIFRoZSBo
aWdoZXN0IG5vbiB6ZXJvIGRpZ2l0IGluIGFsbCB0cmlwbGV0cyBpcyByZW1lbWJlcmVkLCBhbmQK
LSAgICAvLyB1c2VkIGFzIGEgbm9ybWFsaXphdGlvbiBwb2ludCB0byBub3JtYWxpemUgdG8gdmFs
dWVzIGJldHdlZW4gMAotICAgIC8vIGFuZCAyNTUuCi0gICAgCi0gICAgaWYgKCBjb2xvci5sb3dl
cigpICE9ICJ0cmFuc3BhcmVudCIgKSB7Ci0gICAgICAgIGlmICggY29sb3JbMF0gPT0gJyMnICkK
LSAgICAgICAgICAgIGNvbG9yLnJlbW92ZSggMCwgIDEgKTsKLSAgICAgICAgaW50IGJhc2ljTGVu
Z3RoID0gKGNvbG9yLmxlbmd0aCgpICsgMikgLyAzOwotICAgICAgICBpZiAoIGJhc2ljTGVuZ3Ro
ID4gMSApIHsKLSAgICAgICAgICAgIC8vIElFIGlnbm9yZXMgY29sb3JzIHdpdGggdGhyZWUgZGln
aXRzIG9yIGxlc3MKLSAgICAgICAgICAgIGludCBjb2xvcnNbM10gPSB7IDAsIDAsIDAgfTsKLSAg
ICAgICAgICAgIGludCBjb21wb25lbnQgPSAwOwotICAgICAgICAgICAgaW50IHBvcyA9IDA7Ci0g
ICAgICAgICAgICBpbnQgbWF4RGlnaXQgPSBiYXNpY0xlbmd0aC0xOwotICAgICAgICAgICAgd2hp
bGUgKCBjb21wb25lbnQgPCAzICkgewotICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBmb3J3YXJk
IGZvciBkaWdpdHMgaW4gdGhlIHN0cmluZwotICAgICAgICAgICAgICAgIGludCBudW1EaWdpdHMg
PSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICggcG9zIDwgKGludCljb2xvci5sZW5ndGgoKSAm
JiBudW1EaWdpdHMgPCBiYXNpY0xlbmd0aCApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhl
eCA9IHRvSGV4KCBjb2xvcltwb3NdICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yc1tjb21w
b25lbnRdID0gKGNvbG9yc1tjb21wb25lbnRdIDw8IDQpOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoIGhleCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnNbY29tcG9uZW50
XSArPSBoZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhEaWdpdCA9IGtNaW4oIG1heERp
Z2l0LCBudW1EaWdpdHMgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICBudW1EaWdpdHMrKzsKLSAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICggbnVtRGlnaXRzKysgPCBiYXNpY0xlbmd0
aCApCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yc1tjb21wb25lbnRdIDw8PSA0OwotICAgICAg
ICAgICAgICAgIGNvbXBvbmVudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF4RGln
aXQgPSBiYXNpY0xlbmd0aCAtIG1heERpZ2l0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAv
LyBub3JtYWxpemUgdG8gMDAtZmYuIFRoZSBoaWdoZXN0IGZpbGxlZCBkaWdpdCBjb3VudHMsIG1p
bmltdW0gaXMgMiBkaWdpdHMKLSAgICAgICAgICAgIG1heERpZ2l0IC09IDI7Ci0gICAgICAgICAg
ICBjb2xvcnNbMF0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAgICAgICBjb2xvcnNbMV0gPj49IDQq
bWF4RGlnaXQ7Ci0gICAgICAgICAgICBjb2xvcnNbMl0gPj49IDQqbWF4RGlnaXQ7Ci0gICAgICAg
ICAgICAvLyBhc3NlcnQoIGNvbG9yc1swXSA8IDB4MTAwICYmIGNvbG9yc1sxXSA8IDB4MTAwICYm
IGNvbG9yc1syXSA8IDB4MTAwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbG9yLnNw
cmludGYoIiMlMDJ4JTAyeCUwMngiLCBjb2xvcnNbMF0sIGNvbG9yc1sxXSwgY29sb3JzWzJdICk7
Ci0gICAgICAgICAgICBpZiAoIGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIFN0cmluZyhj
b2xvciksIGZhbHNlKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAg
fQotICAgIGF0dHItPmRlY2woKS0+c2V0UHJvcGVydHkoaWQsIENTU19WQUxfQkxBQ0ssIGZhbHNl
KTsKLX0KLQotdm9pZCBTdHlsZWRFbGVtZW50OjpjcmVhdGVNYXBwZWREZWNsKE1hcHBlZEF0dHJp
YnV0ZSogYXR0cikKLXsKLSAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9
IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigwKTsKLSAgICBhdHRyLT5zZXREZWNs
KGRlY2wpOwotICAgIGRlY2wtPnNldFBhcmVudChnZXREb2N1bWVudCgpLT5lbGVtZW50U2hlZXQo
KSk7Ci0gICAgZGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICBkZWNsLT5zZXRTdHJpY3RQYXJzaW5n
KGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJpYnV0ZXMgYXJlIGp1c3QgYWx3YXlzIHF1aXJreS4KLX0K
LQotLy8gR29sZGVuIHJhdGlvIC0gYXJiaXRyYXJ5IHN0YXJ0IHZhbHVlIHRvIGF2b2lkIG1hcHBp
bmcgYWxsIDAncyB0byBhbGwgMCdzCi0vLyBvciBhbnl0aGluZyBsaWtlIHRoYXQuCi1jb25zdCB1
bnNpZ25lZCBQSEkgPSAweDllMzc3OWI5VTsKLQotLy8gUGF1bCBIc2llaCdzIFN1cGVyRmFzdEhh
c2gKLS8vIGh0dHA6Ly93d3cuYXppbGxpb25tb25rZXlzLmNvbS9xZWQvaGFzaC5odG1sCi11bnNp
Z25lZCBNYXBwZWRBdHRyaWJ1dGVIYXNoOjpoYXNoKGNvbnN0IE1hcHBlZEF0dHJpYnV0ZUtleSYg
a2V5KQotewotICAgIHVpbnQzMl90IGhhc2ggPSBQSEk7Ci0gICAgdWludDMyX3QgdG1wOwotCi0g
ICAgY29uc3QgdWludDE2X3QqIHA7Ci0KLSAgICBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50MTZfdCo+KCZrZXkubmFtZSk7Ci0gICAgaGFzaCArPSBwWzBdOwotICAgIHRtcCA9IChwWzFd
IDw8IDExKSBeIGhhc2g7Ci0gICAgaGFzaCA9IChoYXNoIDw8IDE2KSBeIHRtcDsKLSAgICBoYXNo
ICs9IGhhc2ggPj4gMTE7Ci0gICAgYXNzZXJ0KHNpemVvZihrZXkubmFtZSkgPT0gNCB8fCBzaXpl
b2Yoa2V5Lm5hbWUpID09IDgpOwotICAgIGlmIChzaXplb2Yoa2V5Lm5hbWUpID09IDgpIHsKLSAg
ICAgICAgcCArPSAyOwotICAgICAgICBoYXNoICs9IHBbMF07Ci0gICAgICAgIHRtcCA9IChwWzFd
IDw8IDExKSBeIGhhc2g7Ci0gICAgICAgIGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7Ci0gICAg
ICAgIGhhc2ggKz0gaGFzaCA+PiAxMTsKLSAgICB9Ci0KLSAgICBwID0gcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCB1aW50MTZfdCo+KCZrZXkudmFsdWUpOwotICAgIGhhc2ggKz0gcFswXTsKLSAgICB0
bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgIGhhc2ggPSAoaGFzaCA8PCAxNikgXiB0bXA7
Ci0gICAgaGFzaCArPSBoYXNoID4+IDExOwotICAgIGFzc2VydChzaXplb2Yoa2V5LnZhbHVlKSA9
PSA0IHx8IHNpemVvZihrZXkudmFsdWUpID09IDgpOwotICAgIGlmIChzaXplb2Yoa2V5LnZhbHVl
KSA9PSA4KSB7Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgaGFzaCArPSBwWzBdOwotICAgICAg
ICB0bXAgPSAocFsxXSA8PCAxMSkgXiBoYXNoOwotICAgICAgICBoYXNoID0gKGhhc2ggPDwgMTYp
IF4gdG1wOwotICAgICAgICBoYXNoICs9IGhhc2ggPj4gMTE7Ci0gICAgfQotCi0gICAgLy8gSGFu
ZGxlIGVuZCBjYXNlCi0gICAgaGFzaCArPSBrZXkudHlwZTsKLSAgICBoYXNoIF49IGhhc2ggPDwg
MTE7Ci0gICAgaGFzaCArPSBoYXNoID4+IDE3OwotCi0gICAgLy8gRm9yY2UgImF2YWxhbmNoaW5n
IiBvZiBmaW5hbCAxMjcgYml0cwotICAgIGhhc2ggXj0gaGFzaCA8PCAzOwotICAgIGhhc2ggKz0g
aGFzaCA+PiA1OwotICAgIGhhc2ggXj0gaGFzaCA8PCAyOwotICAgIGhhc2ggKz0gaGFzaCA+PiAx
NTsKLSAgICBoYXNoIF49IGhhc2ggPDwgMTA7Ci0KLSAgICAvLyBUaGlzIGF2b2lkcyBldmVyIHJl
dHVybmluZyBhIGhhc2ggY29kZSBvZiAwLCBzaW5jZSB0aGF0IGlzIHVzZWQgdG8KLSAgICAvLyBz
aWduYWwgImhhc2ggbm90IGNvbXB1dGVkIHlldCIsIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyBsaWtl
bHkgdG8gYmUKLSAgICAvLyBlZmZlY3RpdmVseSB0aGUgc2FtZSBhcyAwIHdoZW4gdGhlIGxvdyBi
aXRzIGFyZSBtYXNrZWQKLSAgICBpZiAoaGFzaCA9PSAwKQotICAgICAgICBoYXNoID0gMHg4MDAw
MDAwMDsKLQotICAgIHJldHVybiBoYXNoOwotfQotCiB9CkluZGV4OiBkb20vTWFwcGVkQXR0cmli
dXRlRW50cnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vTWFwcGVkQXR0cmlidXRlRW50cnkuaAkocmV2
aXNpb24gMTM0NzcpCisrKyBkb20vTWFwcGVkQXR0cmlidXRlRW50cnkuaAkod29ya2luZyBjb3B5
KQpAQCAtMjQsNDM3ICsyNCwyOSBAQAogICoKICAqLwogCi0jaWZuZGVmIERPTV9FTEVNRU5USU1Q
TF9ICi0jZGVmaW5lIERPTV9FTEVNRU5USU1QTF9ICi0KLSNpbmNsdWRlICJBdG9taWNTdHJpbmdM
aXN0LmgiCi0jaW5jbHVkZSAiQ29udGFpbmVyTm9kZS5oIgotI2luY2x1ZGUgIk5hbWVkTm9kZU1h
cC5oIgotI2luY2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKLSNpbmNsdWRlICJTdHJpbmdJbXBsLmgi
Ci0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgotCi0jaWYgX19PQkpDX18KLSNkZWZpbmUgaWQg
aWRfQVZPSURfS0VZV09SRAotI2VuZGlmCisjaWZuZGVmIE1hcHBlZEF0dHJpYnV0ZUVudHJ5X2gK
KyNkZWZpbmUgTWFwcGVkQXR0cmlidXRlRW50cnlfaAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LWNsYXNzIEF0dHI7Ci1jbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOwotY2xhc3MgQ1NTU3R5bGVT
ZWxlY3RvcjsKLWNsYXNzIEVsZW1lbnQ7Ci1jbGFzcyBOYW1lZEF0dHJNYXA7Ci0KLS8vIHRoaXMg
aGFzIG5vIGNvdW50ZXJwYXJ0IGluIERPTSwgcHVyZWx5IGludGVybmFsCi0vLyByZXByZXNlbnRh
dGlvbiBvZiB0aGUgbm9kZXZhbHVlIG9mIGFuIEF0dHIuCi0vLyB0aGUgYWN0dWFsIEF0dHIgKEF0
dHIpIHdpdGggaXRzIHZhbHVlIGFzIHRleHRjaGlsZAotLy8gaXMgb25seSBhbGxvY2F0ZWQgb24g
ZGVtYW5kIGJ5IHRoZSBET00gYmluZGluZ3MuCi0vLyBBbnkgdXNlIG9mIEF0dHIgaW5zaWRlIGto
dG1sIHNob3VsZCBiZSBhdm9pZGVkLgotY2xhc3MgQXR0cmlidXRlIDogcHVibGljIFNoYXJlZDxB
dHRyaWJ1dGU+IHsKLSAgICBmcmllbmQgY2xhc3MgTmFtZWRBdHRyTWFwOwotICAgIGZyaWVuZCBj
bGFzcyBFbGVtZW50OwotICAgIGZyaWVuZCBjbGFzcyBBdHRyOwotCi1wdWJsaWM6Ci0gICAgLy8g
bnVsbCB2YWx1ZSBpcyBmb3JiaWRkZW4gIQotICAgIEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWRO
YW1lJiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKQotICAgICAgICA6IG1fbmFtZShu
YW1lKSwgbV92YWx1ZSh2YWx1ZSksIG1faW1wbCgwKQotICAgIHt9Ci0gICAgCi0gICAgQXR0cmli
dXRlKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkK
LSAgICAgICAgOiBtX25hbWUobnVsbEF0b20sIG5hbWUsIG51bGxBdG9tKSwgbV92YWx1ZSh2YWx1
ZSksIG1faW1wbCgwKQotICAgIHt9Ci0KLSAgICB2aXJ0dWFsIH5BdHRyaWJ1dGUoKSB7IH0KLSAg
ICAKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1
ZTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KCkgY29uc3QgeyByZXR1cm4gbV9u
YW1lLnByZWZpeCgpOyB9Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25z
dCB7IHJldHVybiBtX25hbWUubG9jYWxOYW1lKCk7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcm
IG5hbWVzcGFjZVVSSSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZS5uYW1lc3BhY2VVUkkoKTsgfQot
ICAgIAotICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25h
bWU7IH0KLSAgICAKLSAgICBBdHRyKiBhdHRyKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsOyB9Ci0g
ICAgUGFzc1JlZlB0cjxBdHRyPiBjcmVhdGVBdHRySWZOZWVkZWQoRWxlbWVudCogZSk7Ci0KLSAg
ICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWUuaXNOdWxsKCk7IH0KLSAgICBi
b29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlLmlzRW1wdHkoKTsgfQotICAgIAot
ICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjbG9uZShib29sIHByZXNlcnZlRGVjbD10cnVlKSBjb25z
dDsKLQotICAgIC8vIEFuIGV4dGVuc2lvbiB0byBnZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZv
ciBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzLgotICAgIHZpcnR1YWwgQ1NTU3R5bGVEZWNsYXJh
dGlvbiogc3R5bGUoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgCi1wcml2YXRlOgotICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7
IH0KLSAgICB2b2lkIHNldFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcmIHByZWZpeCkgeyBtX25h
bWUuc2V0UHJlZml4KHByZWZpeCk7IH0KLQotICAgIFF1YWxpZmllZE5hbWUgbV9uYW1lOwotICAg
IEF0b21pY1N0cmluZyBtX3ZhbHVlOwotICAgIEF0dHIqIG1faW1wbDsKLX07Ci0KLS8vIEF0dHIg
Y2FuIGhhdmUgVGV4dCBhbmQgRW50aXR5UmVmZXJlbmNlIGNoaWxkcmVuCi0vLyB0aGVyZWZvcmUg
aXQgaGFzIHRvIGJlIGEgZnVsbGJsb3duIE5vZGUuIFRoZSBwbGFuCi0vLyBpcyB0byBkeW5hbWlj
YWxseSBhbGxvY2F0ZSBhIHRleHRjaGlsZCBhbmQgc3RvcmUgdGhlCi0vLyByZXN1bHRpbmcgbm9k
ZXZhbHVlIGluIHRoZSBBdHRyaWJ1dGUgdXBvbgotLy8gZGVzdHJ1Y3Rpb24uIGhvd2V2ZXIsIHRo
aXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KLWNsYXNzIEF0dHIgOiBwdWJsaWMgQ29udGFpbmVy
Tm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNzIE5hbWVkQXR0ck1hcDsKLQotcHVibGljOgotICAgIEF0
dHIoRWxlbWVudCosIERvY3VtZW50KiwgQXR0cmlidXRlKik7Ci0gICAgfkF0dHIoKTsKLQotICAg
IC8vIENhbGwgdGhpcyBhZnRlciBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciBzbyB0aGUKLSAgICAv
LyBBdHRyIG5vZGUgaXNuJ3QgZmxvYXRpbmcgd2hlbiB3ZSBhcHBlbmQgdGhlIHRleHQgbm9kZS4K
LSAgICB2b2lkIGNyZWF0ZVRleHRDaGlsZCgpOwotICAgIAotICAgIC8vIERPTSBtZXRob2RzICYg
YXR0cmlidXRlcyBmb3IgQXR0cgotICAgIFN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gcXVh
bGlmaWVkTmFtZSgpLnRvU3RyaW5nKCk7IH0KLSAgICBib29sIHNwZWNpZmllZCgpIGNvbnN0IHsg
cmV0dXJuIG1fc3BlY2lmaWVkOyB9Ci0gICAgRWxlbWVudCogb3duZXJFbGVtZW50KCkgY29uc3Qg
eyByZXR1cm4gbV9lbGVtZW50OyB9Ci0KLSAgICBTdHJpbmcgdmFsdWUoKSBjb25zdCB7IHJldHVy
biBtX2F0dHJpYnV0ZS0+dmFsdWUoKTsgfQotICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5n
JiwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9t
IHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBTdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIE5vZGVUeXBlIG5vZGVUeXBlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBB
dG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0
cmluZyYgcHJlZml4KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFByZWZpeChjb25zdCBB
dG9taWNTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBub2Rl
VmFsdWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Tm9kZVZhbHVlKGNvbnN0IFN0cmlu
ZyYsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gY2xvbmVO
b2RlKGJvb2wgZGVlcCk7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00p
Ci0gICAgdmlydHVhbCBib29sIGlzQXR0cmlidXRlTm9kZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSk7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgdG9TdHJp
bmcoKSBjb25zdDsKLQotICAgIEF0dHJpYnV0ZSogYXR0cigpIGNvbnN0IHsgcmV0dXJuIG1fYXR0
cmlidXRlLmdldCgpOyB9Ci0gICAgY29uc3QgUXVhbGlmaWVkTmFtZSYgcXVhbGlmaWVkTmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYXR0cmlidXRlLT5uYW1lKCk7IH0KLQotICAgIC8vIEFuIGV4dGVu
c2lvbiB0byBnZXQgcHJlc2VudGF0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGF0dHJpYnV0ZXMuCi0g
ICAgQ1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSB7IHJldHVybiBtX2F0dHJpYnV0ZS0+c3R5
bGUoKTsgfQotCi1wcml2YXRlOgotICAgIEVsZW1lbnQqIG1fZWxlbWVudDsKLSAgICBSZWZQdHI8
QXR0cmlidXRlPiBtX2F0dHJpYnV0ZTsKLSAgICBpbnQgbV9pZ25vcmVDaGlsZHJlbkNoYW5nZWQ7
Ci19OwotCi1jbGFzcyBFbGVtZW50IDogcHVibGljIENvbnRhaW5lck5vZGUgewotICAgIGZyaWVu
ZCBjbGFzcyBEb2N1bWVudDsKLSAgICBmcmllbmQgY2xhc3MgTmFtZWRBdHRyTWFwOwotICAgIGZy
aWVuZCBjbGFzcyBBdHRyOwotICAgIGZyaWVuZCBjbGFzcyBOb2RlOwotICAgIGZyaWVuZCBjbGFz
cyBDU1NTdHlsZVNlbGVjdG9yOwotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3QgUXVhbGlmaWVk
TmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkVsZW1lbnQoKTsKLQotICAgIC8v
IFVzZWQgdG8gcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBoYXMg
YSBnaXZlbiBDU1MgY2xhc3MuCi0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmdMaXN0KiBn
ZXRDbGFzc0xpc3QoKSBjb25zdDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldElEQXR0cmli
dXRlKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYg
bmFtZSkgY29uc3Q7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBnZXRBdHRyaWJ1dGUoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBdHRyaWJ1dGUoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsK
LSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNl
cHRpb25Db2RlJik7Ci0KLSAgICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdDsKLQotICAgIGJv
b2wgaGFzQXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgYm9vbCBoYXNB
dHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2Nh
bE5hbWUpIGNvbnN0OwotCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBnZXRBdHRyaWJ1dGUoY29u
c3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJp
YnV0ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFt
ZSkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2b2lkIHNldEF0dHJpYnV0
ZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIHF1YWxpZmllZE5h
bWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZvaWQgc2Ny
b2xsSW50b1ZpZXcgKGJvb2wgYWxpZ25Ub1RvcCk7Ci0gICAgdm9pZCBzY3JvbGxJbnRvVmlld0lm
TmVlZGVkKGJvb2wgY2VudGVySWZOZWVkZWQpOwotCi0gICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUo
Y29uc3QgU3RyaW5nICZuYW1lLCBFeGNlcHRpb25Db2RlJiBlYyk7Ci0gICAgdm9pZCByZW1vdmVB
dHRyaWJ1dGVOUyhjb25zdCBTdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2Nh
bE5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIFBhc3NSZWZQdHI8QXR0cj4gZ2V0QXR0cmli
dXRlTm9kZShjb25zdCBTdHJpbmcmIG5hbWUpOwotICAgIFBhc3NSZWZQdHI8QXR0cj4gZ2V0QXR0
cmlidXRlTm9kZU5TKGNvbnN0IFN0cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxv
Y2FsTmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIqLCBF
eGNlcHRpb25Db2RlJik7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBzZXRBdHRyaWJ1dGVOb2RlTlMo
QXR0ciogbmV3QXR0ciwgRXhjZXB0aW9uQ29kZSYgZWMpIHsgcmV0dXJuIHNldEF0dHJpYnV0ZU5v
ZGUobmV3QXR0ciwgZWMpOyB9Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiByZW1vdmVBdHRyaWJ1dGVO
b2RlKEF0dHIqLCBFeGNlcHRpb25Db2RlJik7Ci0gICAgCi0gICAgdmlydHVhbCBDU1NTdHlsZURl
Y2xhcmF0aW9uICpzdHlsZSgpOwotCi0gICAgdmlydHVhbCBjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbV90YWdOYW1lOyB9Ci0gICAgdmlydHVhbCBib29sIGhh
c1RhZ05hbWUoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSkgY29uc3QgeyByZXR1cm4gbV90
YWdOYW1lLm1hdGNoZXModGFnTmFtZSk7IH0KLSAgICAKLSAgICAvLyBBIGZhc3QgZnVuY3Rpb24g
Zm9yIGNoZWNraW5nIHRoZSBsb2NhbCBuYW1lIGFnYWluc3QgYW5vdGhlciBhdG9taWMgc3RyaW5n
LgotICAgIGJvb2wgaGFzTG9jYWxOYW1lKGNvbnN0IEF0b21pY1N0cmluZyYgb3RoZXIpIGNvbnN0
IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKSA9PSBvdGhlcjsgfQotICAgIGJvb2wgaGFz
TG9jYWxOYW1lKGNvbnN0IFF1YWxpZmllZE5hbWUmIG90aGVyKSBjb25zdCB7IHJldHVybiBtX3Rh
Z05hbWUubG9jYWxOYW1lKCkgPT0gb3RoZXIubG9jYWxOYW1lKCk7IH0KLQotICAgIHZpcnR1YWwg
Y29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUoKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUu
bG9jYWxOYW1lKCk7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KCkg
Y29uc3QgeyByZXR1cm4gbV90YWdOYW1lLnByZWZpeCgpOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNl
dFByZWZpeChjb25zdCBBdG9taWNTdHJpbmcgJl9wcmVmaXgsIEV4Y2VwdGlvbkNvZGUmKTsKLSAg
ICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29uc3QgeyByZXR1
cm4gbV90YWdOYW1lLm5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgCi0gICAgLy8gRE9NIG1ldGhvZHMg
b3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgTm9kZVR5cGUgbm9k
ZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gY2xvbmVOb2RlKGJv
b2wgZGVlcCk7Ci0gICAgdmlydHVhbCBTdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgaXNFbGVtZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0
dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotCi0gICAgLy8gY29udmVuaWVuY2UgbWV0aG9kcyB3aGljaCBpZ25v
cmUgZXhjZXB0aW9ucwotICAgIHZvaWQgc2V0QXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpOwotCi0gICAgdmlydHVhbCBOYW1lZEF0dHJNYXAg
KmF0dHJpYnV0ZXMoKSBjb25zdDsKLSAgICBOYW1lZEF0dHJNYXAqIGF0dHJpYnV0ZXMoYm9vbCBy
ZWFkb25seSkgY29uc3Q7Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIg
YW4gYXR0cmlidXRlIGlzIGFkZGVkLCBjaGFuZ2VkIG9yIHJlbW92ZWQuCi0gICAgdmlydHVhbCB2
b2lkIGF0dHJpYnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRyLCBib29sIHByZXNlcnZlRGVjbHMg
PSBmYWxzZSkge30KLQotICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBET00KLSAgICB2b2lkIHNldEF0
dHJpYnV0ZU1hcChOYW1lZEF0dHJNYXAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjb3B5Tm9uQXR0
cmlidXRlUHJvcGVydGllcyhjb25zdCBFbGVtZW50ICpzb3VyY2UpIHt9Ci0gICAgCi0gICAgLy8g
U3RhdGUgb2YgdGhlIGVsZW1lbnQuCi0gICAgdmlydHVhbCBEZXByZWNhdGVkU3RyaW5nIHN0YXRl
KCkgeyByZXR1cm4gRGVwcmVjYXRlZFN0cmluZzo6bnVsbDsgfQotCi0gICAgdmlydHVhbCB2b2lk
IGF0dGFjaCgpOwotICAgIHZpcnR1YWwgUmVuZGVyU3R5bGUgKmNyZWF0ZVN0eWxlRm9yUmVuZGVy
ZXIoUmVuZGVyT2JqZWN0ICpwYXJlbnQpOwotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVh
dGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlID0gTm9DaGFuZ2UgKTsKLQotICAgIHZpcnR1YWwg
Ym9vbCBjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlKTsKLSAKLSAgICB2aXJ0dWFsIEF0dHJpYnV0
ZSogY3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwq
IHZhbHVlKTsKLSAgICAKLSAgICB2b2lkIGRpc3BhdGNoQXR0clJlbW92YWxFdmVudChBdHRyaWJ1
dGUgKmF0dHIpOwotICAgIHZvaWQgZGlzcGF0Y2hBdHRyQWRkaXRpb25FdmVudChBdHRyaWJ1dGUg
KmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGFjY2Vzc0tleUFjdGlvbihib29sIHNlbmRUb0Fu
eUV2ZW50KSB7IH0KLQotICAgIHZpcnR1YWwgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdDsKLSAg
ICAgICAgCi0gICAgdmlydHVhbCB2b2lkIGZvY3VzKCk7Ci0gICAgdm9pZCBibHVyKCk7Ci0gICAg
Ci0jaWYgIU5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0s
IERlcHJlY2F0ZWRTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBmb3Jt
YXRGb3JEZWJ1Z2dlcihjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7Ci0jZW5k
aWYKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBdHRyaWJ1dGVNYXAoKSBj
b25zdDsKLSAgICBTdHJpbmcgb3BlblRhZ1N0YXJ0VG9TdHJpbmcoKSBjb25zdDsKLQotcHJpdmF0
ZToKLSAgICB2b2lkIHVwZGF0ZUlkKGNvbnN0IEF0b21pY1N0cmluZyYgb2xkSWQsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmV3SWQpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0eWxlQXR0cmli
dXRlSWZOZWVkZWQoKSBjb25zdCB7fQotCi1wcm90ZWN0ZWQ6IC8vIG1lbWJlciB2YXJpYWJsZXMK
LSAgICBtdXRhYmxlIFJlZlB0cjxOYW1lZEF0dHJNYXA+IG5hbWVkQXR0ck1hcDsKLSAgICBRdWFs
aWZpZWROYW1lIG1fdGFnTmFtZTsKLX07Ci0KLS8vIHRoZSBtYXAgb2YgYXR0cmlidXRlcyBvZiBh
biBlbGVtZW50Ci1jbGFzcyBOYW1lZEF0dHJNYXAgOiBwdWJsaWMgTmFtZWROb2RlTWFwIHsKLSAg
ICBmcmllbmQgY2xhc3MgRWxlbWVudDsKLXB1YmxpYzoKLSAgICBOYW1lZEF0dHJNYXAoRWxlbWVu
dCAqZSk7Ci0gICAgdmlydHVhbCB+TmFtZWRBdHRyTWFwKCk7Ci0gICAgTmFtZWRBdHRyTWFwKGNv
bnN0IE5hbWVkQXR0ck1hcCYpOwotICAgIE5hbWVkQXR0ck1hcCAmb3BlcmF0b3IgPShjb25zdCBO
YW1lZEF0dHJNYXAgJm90aGVyKTsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBm
b3IgTmFtZWROb2RlTWFwCi0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Tm9kZT4gZ2V0TmFtZWRJ
dGVtKGNvbnN0IFN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5v
ZGU+IHJlbW92ZU5hbWVkSXRlbShjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsK
LQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW1OUyhjb25zdCBTdHJp
bmcmIG5hbWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUpIGNvbnN0OwotICAgIHZp
cnR1YWwgUGFzc1JlZlB0cjxOb2RlPiByZW1vdmVOYW1lZEl0ZW1OUyhjb25zdCBTdHJpbmcmIG5h
bWVzcGFjZVVSSSwgY29uc3QgU3RyaW5nJiBsb2NhbE5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQot
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBnZXROYW1lZEl0ZW0oY29uc3QgUXVhbGlmaWVk
TmFtZSYgbmFtZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IHJlbW92ZU5h
bWVkSXRlbShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lLCBFeGNlcHRpb25Db2RlJik7Ci0gICAg
dmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IHNldE5hbWVkSXRlbShOb2RlKiBhcmcsIEV4Y2VwdGlv
bkNvZGUmKTsKLQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBpdGVtKHVuc2lnbmVkIGlu
ZGV4KSBjb25zdDsKLSAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBsZW47IH0K
LQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICBBdHRyaWJ1dGUq
IGF0dHJpYnV0ZUl0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGF0dHJzID8gYXR0
cnNbaW5kZXhdIDogMDsgfQotICAgIEF0dHJpYnV0ZSogZ2V0QXR0cmlidXRlSXRlbShjb25zdCBR
dWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNSZWFkT25seSgp
IHsgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50LT5pc1JlYWRPbmx5KCkgOiBmYWxzZTsgfQotCi0g
ICAgLy8gdXNlZCBkdXJpbmcgcGFyc2luZzogb25seSBpbnNlcnRzIGlmIG5vdCBhbHJlYWR5IHRo
ZXJlCi0gICAgLy8gbm8gZXJyb3IgY2hlY2tpbmchCi0gICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUo
QXR0cmlidXRlKiBuZXdBdHRyaWJ1dGUpIHsKLSAgICAgICAgYXNzZXJ0KCFlbGVtZW50KTsKLSAg
ICAgICAgaWYgKCFnZXRBdHRyaWJ1dGVJdGVtKG5ld0F0dHJpYnV0ZS0+bmFtZSgpKSkKLSAgICAg
ICAgICAgIGFkZEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUpOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBuZXdBdHRyaWJ1dGUtPmRlcmVmKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlz
TWFwcGVkQXR0cmlidXRlTWFwKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGlk
KCkgY29uc3QgeyByZXR1cm4gbV9pZDsgfQotICAgIHZvaWQgc2V0SUQoY29uc3QgQXRvbWljU3Ry
aW5nJiBfaWQpIHsgbV9pZCA9IF9pZDsgfQotICAgIAotICAgIGJvb2wgbWFwc0VxdWl2YWxlbnQo
Y29uc3QgTmFtZWRBdHRyTWFwKiBvdGhlck1hcCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICAv
LyB0aGlzIG1ldGhvZCBpcyBpbnRlcm5hbCwgZG9lcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwK
LSAgICB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUqIG5ld0F0dHJpYnV0ZSk7Ci0gICAgLy8g
dGhpcyBtZXRob2QgaXMgaW50ZXJuYWwsIGRvZXMgbm8gZXJyb3IgY2hlY2tpbmcgYXQgYWxsCi0g
ICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSk7Ci0gICAg
dmlydHVhbCB2b2lkIGNsZWFyQXR0cmlidXRlcygpOwotICAgIHZvaWQgZGV0YWNoRnJvbUVsZW1l
bnQoKTsKLQotICAgIEVsZW1lbnQgKmVsZW1lbnQ7Ci0gICAgQXR0cmlidXRlICoqYXR0cnM7Ci0g
ICAgdW5zaWduZWQgbGVuOwotICAgIEF0b21pY1N0cmluZyBtX2lkOwotfTsKLQorZW51bSBNYXBw
ZWRBdHRyaWJ1dGVFbnRyeSB7CisgICAgICBlTm9uZQorICAgICwgZVVuaXZlcnNhbAorICAgICwg
ZVBlcnNpc3RlbnQKKyAgICAsIGVSZXBsYWNlZAorICAgICwgZUJsb2NrCisgICAgLCBlSFIKKyAg
ICAsIGVVbm9yZGVyZWRMaXN0CisgICAgLCBlTGlzdEl0ZW0KKyAgICAsIGVUYWJsZQorICAgICwg
ZUNlbGwKKyAgICAsIGVDYXB0aW9uCisgICAgLCBlQkRPCisgICAgLCBlUHJlCiAvLyBXaGVuIGFk
ZGluZyBuZXcgZW50cmllcywgbWFrZSBzdXJlIHRvIGtlZXAgZUxhc3RFbnRyeSBhdCB0aGUgZW5k
IG9mIHRoZSBsaXN0LgotZW51bSBNYXBwZWRBdHRyaWJ1dGVFbnRyeSB7IGVOb25lLCBlVW5pdmVy
c2FsLCBlUGVyc2lzdGVudCwgZVJlcGxhY2VkLCBlQmxvY2ssIGVIUiwgZVVub3JkZXJlZExpc3Qs
IGVMaXN0SXRlbSwKLSAgICBlVGFibGUsIGVDZWxsLCBlQ2FwdGlvbiwgZUJETywgZVByZSwgZUxh
c3RFbnRyeSB9OwotCi1jbGFzcyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiA6IHB1Ymxp
YyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiB7Ci1wdWJsaWM6Ci0gICAgQ1NTTWFwcGVkQXR0
cmlidXRlRGVjbGFyYXRpb24oQ1NTUnVsZSAqcGFyZW50UnVsZSkKLSAgICA6IENTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uKHBhcmVudFJ1bGUpLCBtX2VudHJ5VHlwZShlTm9uZSksIG1fYXR0ck5h
bWUoYW55UU5hbWUoKSkKLSAgICB7fQotICAgIAotICAgIHZpcnR1YWwgfkNTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKCk7Ci0KLSAgICB2b2lkIHNldE1hcHBlZFN0YXRlKE1hcHBlZEF0dHJp
YnV0ZUVudHJ5IHR5cGUsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0
cmluZyYgdmFsKQotICAgIHsKLSAgICAgICAgbV9lbnRyeVR5cGUgPSB0eXBlOwotICAgICAgICBt
X2F0dHJOYW1lID0gbmFtZTsKLSAgICAgICAgbV9hdHRyVmFsdWUgPSB2YWw7Ci0gICAgfQotCi1w
cml2YXRlOgotICAgIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IG1fZW50cnlUeXBlOwotICAgIFF1YWxp
ZmllZE5hbWUgbV9hdHRyTmFtZTsKLSAgICBBdG9taWNTdHJpbmcgbV9hdHRyVmFsdWU7CisgICAg
LCBlTGFzdEVudHJ5CiB9OwotCi1jbGFzcyBNYXBwZWRBdHRyaWJ1dGUgOiBwdWJsaWMgQXR0cmli
dXRlCi17Ci1wdWJsaWM6Ci0gICAgTWFwcGVkQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUsIENTU01hcHBlZEF0dHJpYnV0ZURlY2xh
cmF0aW9uKiBkZWNsID0gMCkKLSAgICA6IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSksIG1fc3R5bGVE
ZWNsKGRlY2wpCi0gICAgewotICAgIH0KLQotICAgIE1hcHBlZEF0dHJpYnV0ZShjb25zdCBBdG9t
aWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUsIENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gMCkKLSAgICA6IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSks
IG1fc3R5bGVEZWNsKGRlY2wpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgQXR0cmlidXRl
KiBjbG9uZShib29sIHByZXNlcnZlRGVjbD10cnVlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgQ1NT
U3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlRGVjbC5nZXQo
KTsgfQotCi0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2woKSBjb25zdCB7
IHJldHVybiBtX3N0eWxlRGVjbC5nZXQoKTsgfQotICAgIHZvaWQgc2V0RGVjbChDU1NNYXBwZWRB
dHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCkgeyBtX3N0eWxlRGVjbCA9IGRlY2w7IH0KLQotcHJp
dmF0ZToKLSAgICBSZWZQdHI8Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24+IG1fc3R5bGVE
ZWNsOwotfTsKLQotY2xhc3MgTmFtZWRNYXBwZWRBdHRyTWFwIDogcHVibGljIE5hbWVkQXR0ck1h
cAotewotcHVibGljOgotICAgIE5hbWVkTWFwcGVkQXR0ck1hcChFbGVtZW50ICplKTsKLQotICAg
IHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
aXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VDbGFzc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIGNsYXNzQXR0cik7Ci0gICAgY29uc3QgQXRv
bWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3QgeyByZXR1cm4gJm1fY2xhc3NMaXN0
OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGhhc01hcHBlZEF0dHJpYnV0ZXMoKSBjb25zdCB7
IHJldHVybiBtX21hcHBlZEF0dHJpYnV0ZUNvdW50ID4gMDsgfQotICAgIHZvaWQgZGVjbFJlbW92
ZWQoKSB7IG1fbWFwcGVkQXR0cmlidXRlQ291bnQtLTsgfQotICAgIHZvaWQgZGVjbEFkZGVkKCkg
eyBtX21hcHBlZEF0dHJpYnV0ZUNvdW50Kys7IH0KLSAgICAKLSAgICBib29sIG1hcHNFcXVpdmFs
ZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0OwotICAgIGludCBk
ZWNsQ291bnQoKSBjb25zdDsKLQotICAgIE1hcHBlZEF0dHJpYnV0ZSogYXR0cmlidXRlSXRlbSh1
bnNpZ25lZCBpbmRleCkgY29uc3QKLSAgICB7IHJldHVybiBhdHRycyA/IHN0YXRpY19jYXN0PE1h
cHBlZEF0dHJpYnV0ZSo+KGF0dHJzW2luZGV4XSkgOiAwOyB9Ci0gICAgCi1wcml2YXRlOgotICAg
IEF0b21pY1N0cmluZ0xpc3QgbV9jbGFzc0xpc3Q7Ci0gICAgaW50IG1fbWFwcGVkQXR0cmlidXRl
Q291bnQ7Ci19OwotCi1jbGFzcyBTdHlsZWRFbGVtZW50IDogcHVibGljIEVsZW1lbnQKLXsKLXB1
YmxpYzoKLSAgICBTdHlsZWRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERv
Y3VtZW50ICpkb2MpOwotICAgIHZpcnR1YWwgflN0eWxlZEVsZW1lbnQoKTsKLQotICAgIHZpcnR1
YWwgYm9vbCBpc1N0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBO
YW1lZE1hcHBlZEF0dHJNYXAqIG1hcHBlZEF0dHJpYnV0ZXMoKSB7IHJldHVybiBzdGF0aWNfY2Fz
dDxOYW1lZE1hcHBlZEF0dHJNYXAqPihuYW1lZEF0dHJNYXAuZ2V0KCkpOyB9Ci0gICAgY29uc3Qg
TmFtZWRNYXBwZWRBdHRyTWFwKiBtYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gc3Rh
dGljX2Nhc3Q8TmFtZWRNYXBwZWRBdHRyTWFwKj4obmFtZWRBdHRyTWFwLmdldCgpKTsgfQotICAg
IGJvb2wgaGFzTWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVkQXR0ck1hcCAm
JiBtYXBwZWRBdHRyaWJ1dGVzKCktPmhhc01hcHBlZEF0dHJpYnV0ZXMoKTsgfQotICAgIGJvb2wg
aXNNYXBwZWRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QgeyBNYXBw
ZWRBdHRyaWJ1dGVFbnRyeSByZXMgPSBlTm9uZTsgbWFwVG9FbnRyeShuYW1lLCByZXMpOyByZXR1
cm4gcmVzICE9IGVOb25lOyB9Ci0KLSAgICB2b2lkIGFkZENTU0xlbmd0aChNYXBwZWRBdHRyaWJ1
dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSk7Ci0gICAgdm9pZCBhZGRDU1NQ
cm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1
ZSk7Ci0gICAgdm9pZCBhZGRDU1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBp
ZCwgaW50IHZhbHVlKTsKLSAgICB2b2lkIGFkZENTU1N0cmluZ1Byb3BlcnR5KE1hcHBlZEF0dHJp
YnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlLCBDU1NQcmltaXRpdmVWYWx1
ZTo6VW5pdFR5cGVzID0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpOwotICAgIHZvaWQg
YWRkQ1NTSW1hZ2VQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3Qg
U3RyaW5nICZVUkwpOwotICAgIHZvaWQgYWRkQ1NTQ29sb3IoTWFwcGVkQXR0cmlidXRlKiBhdHRy
LCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmYyk7Ci0gICAgdm9pZCBjcmVhdGVNYXBwZWREZWNsKE1h
cHBlZEF0dHJpYnV0ZSogYXR0cik7CiAgICAgCi0gICAgc3RhdGljIENTU01hcHBlZEF0dHJpYnV0
ZURlY2xhcmF0aW9uKiBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5
IHR5cGUsIEF0dHJpYnV0ZSogYXR0cik7Ci0gICAgc3RhdGljIHZvaWQgc2V0TWFwcGVkQXR0cmli
dXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0eXBlLCBBdHRyaWJ1dGUqIGF0dHIsIENTU01h
cHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsKTsKLSAgICBzdGF0aWMgdm9pZCByZW1vdmVN
YXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIGNvbnN0IFF1YWxp
ZmllZE5hbWUmIGF0dHJOYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIGF0dHJWYWx1ZSk7Ci0gICAg
Ci0gICAgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGlubGluZVN0eWxlRGVjbCgpIGNvbnN0
IHsgcmV0dXJuIG1faW5saW5lU3R5bGVEZWNsLmdldCgpOyB9Ci0gICAgdmlydHVhbCBDU1NNdXRh
YmxlU3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpOwotICAg
IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRJbmxpbmVTdHlsZURlY2woKTsKLSAgICBD
U1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSgpOwotICAgIHZvaWQgY3JlYXRlSW5saW5lU3R5bGVE
ZWNsKCk7Ci0gICAgdm9pZCBkZXN0cm95SW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgdm9pZCBpbnZh
bGlkYXRlU3R5bGVBdHRyaWJ1dGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVBdHRy
aWJ1dGVJZk5lZWRlZCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3Ry
aW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGF0dHJpYnV0
ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRyLCBib29sIHByZXNlcnZlRGVjbHMgPSBmYWxzZSk7Ci0g
ICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSogYXR0
cik7Ci0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwg
dm9pZCBjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICB2aXJ0dWFsIEF0dHJpYnV0ZSog
Y3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwqIHZh
bHVlKTsKLQotcHJvdGVjdGVkOgotICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlv
bj4gbV9pbmxpbmVTdHlsZURlY2w7Ci0gICAgbXV0YWJsZSBib29sIG1faXNTdHlsZUF0dHJpYnV0
ZVZhbGlkIDogMTsKLSAgICBtdXRhYmxlIGJvb2wgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRyaWJ1
dGUgOiAxOwotfTsKLQotfSAvL25hbWVzcGFjZQotCi0jdW5kZWYgaWQKK30KIAogI2VuZGlmCklu
ZGV4OiBkb20vTmFtZWRBdHRyTWFwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZG9tL05hbWVkQXR0ck1hcC5o
CShyZXZpc2lvbiAxMzQ3NykKKysrIGRvbS9OYW1lZEF0dHJNYXAuaAkod29ya2luZyBjb3B5KQpA
QCAtMjQsMTUgKzI0LDEyIEBACiAgKgogICovCiAKLSNpZm5kZWYgRE9NX0VMRU1FTlRJTVBMX0gK
LSNkZWZpbmUgRE9NX0VMRU1FTlRJTVBMX0gKKyNpZm5kZWYgTmFtZWRBdHRyTWFwX2gKKyNkZWZp
bmUgTmFtZWRBdHRyTWFwX2gKIAotI2luY2x1ZGUgIkF0b21pY1N0cmluZ0xpc3QuaCIKLSNpbmNs
dWRlICJDb250YWluZXJOb2RlLmgiCiAjaW5jbHVkZSAiTmFtZWROb2RlTWFwLmgiCi0jaW5jbHVk
ZSAiUXVhbGlmaWVkTmFtZS5oIgotI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKLSNpbmNsdWRlICJj
c3NfdmFsdWVpbXBsLmgiCisjaW5jbHVkZSAiQXR0cmlidXRlLmgiCisjaW5jbHVkZSAiRWxlbWVu
dC5oIgogCiAjaWYgX19PQkpDX18KICNkZWZpbmUgaWQgaWRfQVZPSURfS0VZV09SRApAQCAtNDAs
MjM2ICszNyw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQXR0cjsKLWNsYXNz
IENTU1N0eWxlRGVjbGFyYXRpb247Ci1jbGFzcyBDU1NTdHlsZVNlbGVjdG9yOwotY2xhc3MgRWxl
bWVudDsKLWNsYXNzIE5hbWVkQXR0ck1hcDsKLQotLy8gdGhpcyBoYXMgbm8gY291bnRlcnBhcnQg
aW4gRE9NLCBwdXJlbHkgaW50ZXJuYWwKLS8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RldmFs
dWUgb2YgYW4gQXR0ci4KLS8vIHRoZSBhY3R1YWwgQXR0ciAoQXR0cikgd2l0aCBpdHMgdmFsdWUg
YXMgdGV4dGNoaWxkCi0vLyBpcyBvbmx5IGFsbG9jYXRlZCBvbiBkZW1hbmQgYnkgdGhlIERPTSBi
aW5kaW5ncy4KLS8vIEFueSB1c2Ugb2YgQXR0ciBpbnNpZGUga2h0bWwgc2hvdWxkIGJlIGF2b2lk
ZWQuCi1jbGFzcyBBdHRyaWJ1dGUgOiBwdWJsaWMgU2hhcmVkPEF0dHJpYnV0ZT4gewotICAgIGZy
aWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNsYXNzIEVsZW1lbnQ7Ci0gICAg
ZnJpZW5kIGNsYXNzIEF0dHI7Ci0KLXB1YmxpYzoKLSAgICAvLyBudWxsIHZhbHVlIGlzIGZvcmJp
ZGRlbiAhCi0gICAgQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0
b21pY1N0cmluZyYgdmFsdWUpCi0gICAgICAgIDogbV9uYW1lKG5hbWUpLCBtX3ZhbHVlKHZhbHVl
KSwgbV9pbXBsKDApCi0gICAge30KLSAgICAKLSAgICBBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlKQotICAgICAgICA6IG1fbmFtZShu
dWxsQXRvbSwgbmFtZSwgbnVsbEF0b20pLCBtX3ZhbHVlKHZhbHVlKSwgbV9pbXBsKDApCi0gICAg
e30KLQotICAgIHZpcnR1YWwgfkF0dHJpYnV0ZSgpIHsgfQotICAgIAotICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9Ci0gICAgY29uc3QgQXRv
bWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJldHVybiBtX25hbWUucHJlZml4KCk7IH0KLSAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZS5s
b2NhbE5hbWUoKTsgfQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZXNwYWNlVVJJKCkgY29u
c3QgeyByZXR1cm4gbV9uYW1lLm5hbWVzcGFjZVVSSSgpOyB9Ci0gICAgCi0gICAgY29uc3QgUXVh
bGlmaWVkTmFtZSYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQotICAgIAotICAgIEF0
dHIqIGF0dHIoKSBjb25zdCB7IHJldHVybiBtX2ltcGw7IH0KLSAgICBQYXNzUmVmUHRyPEF0dHI+
IGNyZWF0ZUF0dHJJZk5lZWRlZChFbGVtZW50KiBlKTsKLQotICAgIGJvb2wgaXNOdWxsKCkgY29u
c3QgeyByZXR1cm4gbV92YWx1ZS5pc051bGwoKTsgfQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWUuaXNFbXB0eSgpOyB9Ci0gICAgCi0gICAgdmlydHVhbCBBdHRyaWJ1
dGUqIGNsb25lKGJvb2wgcHJlc2VydmVEZWNsPXRydWUpIGNvbnN0OwotCi0gICAgLy8gQW4gZXh0
ZW5zaW9uIHRvIGdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZm9yIHByZXNlbnRhdGlvbmFsIGF0
dHJpYnV0ZXMuCi0gICAgdmlydHVhbCBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIDA7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBB
dG9taWNTdHJpbmcmIHZhbHVlKSB7IG1fdmFsdWUgPSB2YWx1ZTsgfQotICAgIHZvaWQgc2V0UHJl
Zml4KGNvbnN0IEF0b21pY1N0cmluZyYgcHJlZml4KSB7IG1fbmFtZS5zZXRQcmVmaXgocHJlZml4
KTsgfQotCi0gICAgUXVhbGlmaWVkTmFtZSBtX25hbWU7Ci0gICAgQXRvbWljU3RyaW5nIG1fdmFs
dWU7Ci0gICAgQXR0ciogbV9pbXBsOwotfTsKLQotLy8gQXR0ciBjYW4gaGF2ZSBUZXh0IGFuZCBF
bnRpdHlSZWZlcmVuY2UgY2hpbGRyZW4KLS8vIHRoZXJlZm9yZSBpdCBoYXMgdG8gYmUgYSBmdWxs
Ymxvd24gTm9kZS4gVGhlIHBsYW4KLS8vIGlzIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgdGV4
dGNoaWxkIGFuZCBzdG9yZSB0aGUKLS8vIHJlc3VsdGluZyBub2RldmFsdWUgaW4gdGhlIEF0dHJp
YnV0ZSB1cG9uCi0vLyBkZXN0cnVjdGlvbi4gaG93ZXZlciwgdGhpcyBpcyBub3QgeWV0IGltcGxl
bWVudGVkLgotY2xhc3MgQXR0ciA6IHB1YmxpYyBDb250YWluZXJOb2RlIHsKLSAgICBmcmllbmQg
Y2xhc3MgTmFtZWRBdHRyTWFwOwotCi1wdWJsaWM6Ci0gICAgQXR0cihFbGVtZW50KiwgRG9jdW1l
bnQqLCBBdHRyaWJ1dGUqKTsKLSAgICB+QXR0cigpOwotCi0gICAgLy8gQ2FsbCB0aGlzIGFmdGVy
IGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yIHNvIHRoZQotICAgIC8vIEF0dHIgbm9kZSBpc24ndCBm
bG9hdGluZyB3aGVuIHdlIGFwcGVuZCB0aGUgdGV4dCBub2RlLgotICAgIHZvaWQgY3JlYXRlVGV4
dENoaWxkKCk7Ci0gICAgCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBBdHRy
Ci0gICAgU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBxdWFsaWZpZWROYW1lKCkudG9TdHJp
bmcoKTsgfQotICAgIGJvb2wgc3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gbV9zcGVjaWZpZWQ7
IH0KLSAgICBFbGVtZW50KiBvd25lckVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQ7
IH0KLQotICAgIFN0cmluZyB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXR0cmlidXRlLT52YWx1
ZSgpOyB9Ci0gICAgdm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmLCBFeGNlcHRpb25Db2RlJik7
Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gcGFyZW50IGNsYXNzZXMKLSAg
ICB2aXJ0dWFsIFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZVR5cGUg
bm9kZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxO
YW1lKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWVzcGFjZVVS
SSgpIGNvbnN0OwotICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25z
dDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21pY1N0cmluZyYsIEV4Y2Vw
dGlvbkNvZGUmKTsKLQotICAgIHZpcnR1YWwgU3RyaW5nIG5vZGVWYWx1ZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgdm9pZCBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJiwgRXhjZXB0aW9uQ29kZSYp
OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBkZWVwKTsKLQot
ICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICB2aXJ0dWFsIGJvb2wg
aXNBdHRyaWJ1dGVOb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9v
bCBjaGlsZFR5cGVBbGxvd2VkKE5vZGVUeXBlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJl
bkNoYW5nZWQoKTsKLSAgICB2aXJ0dWFsIFN0cmluZyB0b1N0cmluZygpIGNvbnN0OwotCi0gICAg
QXR0cmlidXRlKiBhdHRyKCkgY29uc3QgeyByZXR1cm4gbV9hdHRyaWJ1dGUuZ2V0KCk7IH0KLSAg
ICBjb25zdCBRdWFsaWZpZWROYW1lJiBxdWFsaWZpZWROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9h
dHRyaWJ1dGUtPm5hbWUoKTsgfQotCi0gICAgLy8gQW4gZXh0ZW5zaW9uIHRvIGdldCBwcmVzZW50
YXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgYXR0cmlidXRlcy4KLSAgICBDU1NTdHlsZURlY2xhcmF0
aW9uKiBzdHlsZSgpIHsgcmV0dXJuIG1fYXR0cmlidXRlLT5zdHlsZSgpOyB9Ci0KLXByaXZhdGU6
Ci0gICAgRWxlbWVudCogbV9lbGVtZW50OwotICAgIFJlZlB0cjxBdHRyaWJ1dGU+IG1fYXR0cmli
dXRlOwotICAgIGludCBtX2lnbm9yZUNoaWxkcmVuQ2hhbmdlZDsKLX07Ci0KLWNsYXNzIEVsZW1l
bnQgOiBwdWJsaWMgQ29udGFpbmVyTm9kZSB7Ci0gICAgZnJpZW5kIGNsYXNzIERvY3VtZW50Owot
ICAgIGZyaWVuZCBjbGFzcyBOYW1lZEF0dHJNYXA7Ci0gICAgZnJpZW5kIGNsYXNzIEF0dHI7Ci0g
ICAgZnJpZW5kIGNsYXNzIE5vZGU7Ci0gICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2VsZWN0b3I7
Ci1wdWJsaWM6Ci0gICAgRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudCAqZG9jKTsKLSAgICB+RWxlbWVudCgpOwotCi0gICAgLy8gVXNlZCB0byBxdWlja2x5IGRl
dGVybWluZSB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGhhcyBhIGdpdmVuIENTUyBjbGFzcy4K
LSAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZ0xpc3QqIGdldENsYXNzTGlzdCgpIGNvbnN0
OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0SURBdHRyaWJ1dGUoKSBjb25zdDsKLSAgICBi
b29sIGhhc0F0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1lKSBjb25zdDsKLSAgICBj
b25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
KSBjb25zdDsKLSAgICB2b2lkIHNldEF0dHJpYnV0ZShjb25zdCBRdWFsaWZpZWROYW1lJiBuYW1l
LCBTdHJpbmdJbXBsKiB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgcmVtb3ZlQXR0
cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAg
IGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNBdHRyaWJ1dGUoY29u
c3QgU3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgICBib29sIGhhc0F0dHJpYnV0ZU5TKGNvbnN0IFN0
cmluZyYgbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSkgY29uc3Q7Ci0KLSAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGdldEF0dHJpYnV0ZShjb25zdCBTdHJpbmcmIG5hbWUpIGNv
bnN0OwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZ2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5n
JiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKSBjb25zdDsKLQotICAgIHZv
aWQgc2V0QXR0cmlidXRlKGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwg
RXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgc2V0QXR0cmlidXRlTlMoY29uc3QgU3RyaW5nJiBu
YW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgcXVhbGlmaWVkTmFtZSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzY3JvbGxJbnRvVmlldyAoYm9vbCBh
bGlnblRvVG9wKTsKLSAgICB2b2lkIHNjcm9sbEludG9WaWV3SWZOZWVkZWQoYm9vbCBjZW50ZXJJ
Zk5lZWRlZCk7Ci0KLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShjb25zdCBTdHJpbmcgJm5hbWUs
IEV4Y2VwdGlvbkNvZGUmIGVjKTsKLSAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZU5TKGNvbnN0IFN0
cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBTdHJpbmcmIGxvY2FsTmFtZSwgRXhjZXB0aW9uQ29k
ZSYpOwotCi0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2RlKGNvbnN0IFN0cmlu
ZyYgbmFtZSk7Ci0gICAgUGFzc1JlZlB0cjxBdHRyPiBnZXRBdHRyaWJ1dGVOb2RlTlMoY29uc3Qg
U3RyaW5nJiBuYW1lc3BhY2VVUkksIGNvbnN0IFN0cmluZyYgbG9jYWxOYW1lKTsKLSAgICBQYXNz
UmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGUoQXR0ciosIEV4Y2VwdGlvbkNvZGUmKTsKLSAg
ICBQYXNzUmVmUHRyPEF0dHI+IHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyKiBuZXdBdHRyLCBFeGNl
cHRpb25Db2RlJiBlYykgeyByZXR1cm4gc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyLCBlYyk7IH0K
LSAgICBQYXNzUmVmUHRyPEF0dHI+IHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciosIEV4Y2VwdGlv
bkNvZGUmKTsKLSAgICAKLSAgICB2aXJ0dWFsIENTU1N0eWxlRGVjbGFyYXRpb24gKnN0eWxlKCk7
Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUoKSBjb25zdCB7IHJl
dHVybiBtX3RhZ05hbWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVGFnTmFtZShjb25zdCBRdWFs
aWZpZWROYW1lJiB0YWdOYW1lKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubWF0Y2hlcyh0YWdO
YW1lKTsgfQotICAgIAotICAgIC8vIEEgZmFzdCBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgdGhlIGxv
Y2FsIG5hbWUgYWdhaW5zdCBhbm90aGVyIGF0b21pYyBzdHJpbmcuCi0gICAgYm9vbCBoYXNMb2Nh
bE5hbWUoY29uc3QgQXRvbWljU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gbV90YWdOYW1l
LmxvY2FsTmFtZSgpID09IG90aGVyOyB9Ci0gICAgYm9vbCBoYXNMb2NhbE5hbWUoY29uc3QgUXVh
bGlmaWVkTmFtZSYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKSA9
PSBvdGhlci5sb2NhbE5hbWUoKTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBBdG9taWNTdHJpbmcm
IGxvY2FsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGFnTmFtZS5sb2NhbE5hbWUoKTsgfQotICAg
IHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVmaXgoKSBjb25zdCB7IHJldHVybiBtX3Rh
Z05hbWUucHJlZml4KCk7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IEF0b21p
Y1N0cmluZyAmX3ByZWZpeCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZpcnR1YWwgY29uc3QgQXRv
bWljU3RyaW5nJiBuYW1lc3BhY2VVUkkoKSBjb25zdCB7IHJldHVybiBtX3RhZ05hbWUubmFtZXNw
YWNlVVJJKCk7IH0KLSAgICAKLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBh
cmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBOb2RlVHlwZSBub2RlVHlwZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxOb2RlPiBjbG9uZU5vZGUoYm9vbCBkZWVwKTsKLSAgICB2aXJ0
dWFsIFN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc0VsZW1lbnRO
b2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZElu
dG9Eb2N1bWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkRnJvbURvY3VtZW50KCk7Ci0K
LSAgICAvLyBjb252ZW5pZW5jZSBtZXRob2RzIHdoaWNoIGlnbm9yZSBleGNlcHRpb25zCi0gICAg
dm9pZCBzZXRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgY29uc3QgU3RyaW5n
JiB2YWx1ZSk7Ci0KLSAgICB2aXJ0dWFsIE5hbWVkQXR0ck1hcCAqYXR0cmlidXRlcygpIGNvbnN0
OwotICAgIE5hbWVkQXR0ck1hcCogYXR0cmlidXRlcyhib29sIHJlYWRvbmx5KSBjb25zdDsKLQot
ICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhdHRyaWJ1dGUgaXMgYWRk
ZWQsIGNoYW5nZWQgb3IgcmVtb3ZlZC4KLSAgICB2aXJ0dWFsIHZvaWQgYXR0cmlidXRlQ2hhbmdl
ZChBdHRyaWJ1dGUqIGF0dHIsIGJvb2wgcHJlc2VydmVEZWNscyA9IGZhbHNlKSB7fQotCi0gICAg
Ly8gbm90IHBhcnQgb2YgdGhlIERPTQotICAgIHZvaWQgc2V0QXR0cmlidXRlTWFwKE5hbWVkQXR0
ck1hcCopOwotCi0gICAgdmlydHVhbCB2b2lkIGNvcHlOb25BdHRyaWJ1dGVQcm9wZXJ0aWVzKGNv
bnN0IEVsZW1lbnQgKnNvdXJjZSkge30KLSAgICAKLSAgICAvLyBTdGF0ZSBvZiB0aGUgZWxlbWVu
dC4KLSAgICB2aXJ0dWFsIERlcHJlY2F0ZWRTdHJpbmcgc3RhdGUoKSB7IHJldHVybiBEZXByZWNh
dGVkU3RyaW5nOjpudWxsOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgdmly
dHVhbCBSZW5kZXJTdHlsZSAqY3JlYXRlU3R5bGVGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QgKnBh
cmVudCk7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFy
ZW5hICosIFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5
bGVDaGFuZ2UgPSBOb0NoYW5nZSApOwotCi0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93
ZWQoTm9kZVR5cGUpOwotIAotICAgIHZpcnR1YWwgQXR0cmlidXRlKiBjcmVhdGVBdHRyaWJ1dGUo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSwgU3RyaW5nSW1wbCogdmFsdWUpOwotICAgIAotICAg
IHZvaWQgZGlzcGF0Y2hBdHRyUmVtb3ZhbEV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7Ci0gICAgdm9p
ZCBkaXNwYXRjaEF0dHJBZGRpdGlvbkV2ZW50KEF0dHJpYnV0ZSAqYXR0cik7Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgYWNjZXNzS2V5QWN0aW9uKGJvb2wgc2VuZFRvQW55RXZlbnQpIHsgfQotCi0gICAg
dmlydHVhbCBTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1VS
TEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotICAgICAgICAKLSAgICB2aXJ0dWFs
IHZvaWQgZm9jdXMoKTsKLSAgICB2b2lkIGJsdXIoKTsKLSAgICAKLSNpZiAhTkRFQlVHCi0gICAg
dmlydHVhbCB2b2lkIGR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRlZFN0cmluZyBp
bmQgPSAiIikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGZvcm1hdEZvckRlYnVnZ2VyKGNoYXIg
KmJ1ZmZlciwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKLSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0g
ICAgdmlydHVhbCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OwotICAgIFN0cmluZyBv
cGVuVGFnU3RhcnRUb1N0cmluZygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZvaWQgdXBkYXRl
SWQoY29uc3QgQXRvbWljU3RyaW5nJiBvbGRJZCwgY29uc3QgQXRvbWljU3RyaW5nJiBuZXdJZCk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVBdHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0
IHt9Ci0KLXByb3RlY3RlZDogLy8gbWVtYmVyIHZhcmlhYmxlcwotICAgIG11dGFibGUgUmVmUHRy
PE5hbWVkQXR0ck1hcD4gbmFtZWRBdHRyTWFwOwotICAgIFF1YWxpZmllZE5hbWUgbV90YWdOYW1l
OwotfTsKLQogLy8gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQKIGNsYXNzIE5h
bWVkQXR0ck1hcCA6IHB1YmxpYyBOYW1lZE5vZGVNYXAgewogICAgIGZyaWVuZCBjbGFzcyBFbGVt
ZW50OwpAQCAtMzMwLDEyOSArOTcsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgQXRvbWljU3RyaW5nIG1f
aWQ7CiB9OwogCi0vLyBXaGVuIGFkZGluZyBuZXcgZW50cmllcywgbWFrZSBzdXJlIHRvIGtlZXAg
ZUxhc3RFbnRyeSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgotZW51bSBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSB7IGVOb25lLCBlVW5pdmVyc2FsLCBlUGVyc2lzdGVudCwgZVJlcGxhY2VkLCBlQmxvY2ss
IGVIUiwgZVVub3JkZXJlZExpc3QsIGVMaXN0SXRlbSwKLSAgICBlVGFibGUsIGVDZWxsLCBlQ2Fw
dGlvbiwgZUJETywgZVByZSwgZUxhc3RFbnRyeSB9OwotCi1jbGFzcyBDU1NNYXBwZWRBdHRyaWJ1
dGVEZWNsYXJhdGlvbiA6IHB1YmxpYyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiB7Ci1wdWJs
aWM6Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oQ1NTUnVsZSAqcGFyZW50UnVs
ZSkKLSAgICA6IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKHBhcmVudFJ1bGUpLCBtX2VudHJ5
VHlwZShlTm9uZSksIG1fYXR0ck5hbWUoYW55UU5hbWUoKSkKLSAgICB7fQotICAgIAotICAgIHZp
cnR1YWwgfkNTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0KLSAgICB2b2lkIHNldE1h
cHBlZFN0YXRlKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIGNvbnN0IFF1YWxpZmllZE5hbWUm
IG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsKQotICAgIHsKLSAgICAgICAgbV9lbnRyeVR5
cGUgPSB0eXBlOwotICAgICAgICBtX2F0dHJOYW1lID0gbmFtZTsKLSAgICAgICAgbV9hdHRyVmFs
dWUgPSB2YWw7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIE1hcHBlZEF0dHJpYnV0ZUVudHJ5IG1f
ZW50cnlUeXBlOwotICAgIFF1YWxpZmllZE5hbWUgbV9hdHRyTmFtZTsKLSAgICBBdG9taWNTdHJp
bmcgbV9hdHRyVmFsdWU7Ci19OwotCi1jbGFzcyBNYXBwZWRBdHRyaWJ1dGUgOiBwdWJsaWMgQXR0
cmlidXRlCi17Ci1wdWJsaWM6Ci0gICAgTWFwcGVkQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5h
bWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUsIENTU01hcHBlZEF0dHJpYnV0ZURl
Y2xhcmF0aW9uKiBkZWNsID0gMCkKLSAgICA6IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSksIG1fc3R5
bGVEZWNsKGRlY2wpCi0gICAgewotICAgIH0KLQotICAgIE1hcHBlZEF0dHJpYnV0ZShjb25zdCBB
dG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUsIENTU01hcHBlZEF0
dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gMCkKLSAgICA6IEF0dHJpYnV0ZShuYW1lLCB2YWx1
ZSksIG1fc3R5bGVEZWNsKGRlY2wpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgQXR0cmli
dXRlKiBjbG9uZShib29sIHByZXNlcnZlRGVjbD10cnVlKSBjb25zdDsKLQotICAgIHZpcnR1YWwg
Q1NTU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlRGVjbC5n
ZXQoKTsgfQotCi0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2woKSBjb25z
dCB7IHJldHVybiBtX3N0eWxlRGVjbC5nZXQoKTsgfQotICAgIHZvaWQgc2V0RGVjbChDU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCkgeyBtX3N0eWxlRGVjbCA9IGRlY2w7IH0KLQot
cHJpdmF0ZToKLSAgICBSZWZQdHI8Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24+IG1fc3R5
bGVEZWNsOwotfTsKLQotY2xhc3MgTmFtZWRNYXBwZWRBdHRyTWFwIDogcHVibGljIE5hbWVkQXR0
ck1hcAotewotcHVibGljOgotICAgIE5hbWVkTWFwcGVkQXR0ck1hcChFbGVtZW50ICplKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCBjbGVhckF0dHJpYnV0ZXMoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJv
b2wgaXNNYXBwZWRBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQg
cGFyc2VDbGFzc0F0dHJpYnV0ZShjb25zdCBTdHJpbmcmIGNsYXNzQXR0cik7Ci0gICAgY29uc3Qg
QXRvbWljU3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3QgeyByZXR1cm4gJm1fY2xhc3NM
aXN0OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGhhc01hcHBlZEF0dHJpYnV0ZXMoKSBjb25z
dCB7IHJldHVybiBtX21hcHBlZEF0dHJpYnV0ZUNvdW50ID4gMDsgfQotICAgIHZvaWQgZGVjbFJl
bW92ZWQoKSB7IG1fbWFwcGVkQXR0cmlidXRlQ291bnQtLTsgfQotICAgIHZvaWQgZGVjbEFkZGVk
KCkgeyBtX21hcHBlZEF0dHJpYnV0ZUNvdW50Kys7IH0KLSAgICAKLSAgICBib29sIG1hcHNFcXVp
dmFsZW50KGNvbnN0IE5hbWVkTWFwcGVkQXR0ck1hcCogb3RoZXJNYXApIGNvbnN0OwotICAgIGlu
dCBkZWNsQ291bnQoKSBjb25zdDsKLQotICAgIE1hcHBlZEF0dHJpYnV0ZSogYXR0cmlidXRlSXRl
bSh1bnNpZ25lZCBpbmRleCkgY29uc3QKLSAgICB7IHJldHVybiBhdHRycyA/IHN0YXRpY19jYXN0
PE1hcHBlZEF0dHJpYnV0ZSo+KGF0dHJzW2luZGV4XSkgOiAwOyB9Ci0gICAgCi1wcml2YXRlOgot
ICAgIEF0b21pY1N0cmluZ0xpc3QgbV9jbGFzc0xpc3Q7Ci0gICAgaW50IG1fbWFwcGVkQXR0cmli
dXRlQ291bnQ7Ci19OwotCi1jbGFzcyBTdHlsZWRFbGVtZW50IDogcHVibGljIEVsZW1lbnQKLXsK
LXB1YmxpYzoKLSAgICBTdHlsZWRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUs
IERvY3VtZW50ICpkb2MpOwotICAgIHZpcnR1YWwgflN0eWxlZEVsZW1lbnQoKTsKLQotICAgIHZp
cnR1YWwgYm9vbCBpc1N0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAg
ICBOYW1lZE1hcHBlZEF0dHJNYXAqIG1hcHBlZEF0dHJpYnV0ZXMoKSB7IHJldHVybiBzdGF0aWNf
Y2FzdDxOYW1lZE1hcHBlZEF0dHJNYXAqPihuYW1lZEF0dHJNYXAuZ2V0KCkpOyB9Ci0gICAgY29u
c3QgTmFtZWRNYXBwZWRBdHRyTWFwKiBtYXBwZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8TmFtZWRNYXBwZWRBdHRyTWFwKj4obmFtZWRBdHRyTWFwLmdldCgpKTsgfQot
ICAgIGJvb2wgaGFzTWFwcGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVkQXR0ck1h
cCAmJiBtYXBwZWRBdHRyaWJ1dGVzKCktPmhhc01hcHBlZEF0dHJpYnV0ZXMoKTsgfQotICAgIGJv
b2wgaXNNYXBwZWRBdHRyaWJ1dGUoY29uc3QgUXVhbGlmaWVkTmFtZSYgbmFtZSkgY29uc3QgeyBN
YXBwZWRBdHRyaWJ1dGVFbnRyeSByZXMgPSBlTm9uZTsgbWFwVG9FbnRyeShuYW1lLCByZXMpOyBy
ZXR1cm4gcmVzICE9IGVOb25lOyB9Ci0KLSAgICB2b2lkIGFkZENTU0xlbmd0aChNYXBwZWRBdHRy
aWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2YWx1ZSk7Ci0gICAgdm9pZCBhZGRD
U1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29uc3QgU3RyaW5nICZ2
YWx1ZSk7Ci0gICAgdm9pZCBhZGRDU1NQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGlu
dCBpZCwgaW50IHZhbHVlKTsKLSAgICB2b2lkIGFkZENTU1N0cmluZ1Byb3BlcnR5KE1hcHBlZEF0
dHJpYnV0ZSogYXR0ciwgaW50IGlkLCBjb25zdCBTdHJpbmcgJnZhbHVlLCBDU1NQcmltaXRpdmVW
YWx1ZTo6VW5pdFR5cGVzID0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpOwotICAgIHZv
aWQgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShNYXBwZWRBdHRyaWJ1dGUqIGF0dHIsIGludCBpZCwgY29u
c3QgU3RyaW5nICZVUkwpOwotICAgIHZvaWQgYWRkQ1NTQ29sb3IoTWFwcGVkQXR0cmlidXRlKiBh
dHRyLCBpbnQgaWQsIGNvbnN0IFN0cmluZyAmYyk7Ci0gICAgdm9pZCBjcmVhdGVNYXBwZWREZWNs
KE1hcHBlZEF0dHJpYnV0ZSogYXR0cik7Ci0gICAgCi0gICAgc3RhdGljIENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKiBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5IHR5cGUsIEF0dHJpYnV0ZSogYXR0cik7Ci0gICAgc3RhdGljIHZvaWQgc2V0TWFwcGVkQXR0
cmlidXRlRGVjbChNYXBwZWRBdHRyaWJ1dGVFbnRyeSB0eXBlLCBBdHRyaWJ1dGUqIGF0dHIsIENT
U01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsKTsKLSAgICBzdGF0aWMgdm9pZCByZW1v
dmVNYXBwZWRBdHRyaWJ1dGVEZWNsKE1hcHBlZEF0dHJpYnV0ZUVudHJ5IHR5cGUsIGNvbnN0IFF1
YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBjb25zdCBBdG9taWNTdHJpbmcmIGF0dHJWYWx1ZSk7Ci0g
ICAgCi0gICAgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGlubGluZVN0eWxlRGVjbCgpIGNv
bnN0IHsgcmV0dXJuIG1faW5saW5lU3R5bGVEZWNsLmdldCgpOyB9Ci0gICAgdmlydHVhbCBDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpOwot
ICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRJbmxpbmVTdHlsZURlY2woKTsKLSAg
ICBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSgpOwotICAgIHZvaWQgY3JlYXRlSW5saW5lU3R5
bGVEZWNsKCk7Ci0gICAgdm9pZCBkZXN0cm95SW5saW5lU3R5bGVEZWNsKCk7Ci0gICAgdm9pZCBp
bnZhbGlkYXRlU3R5bGVBdHRyaWJ1dGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3R5bGVB
dHRyaWJ1dGVJZk5lZWRlZCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgY29uc3QgQXRvbWlj
U3RyaW5nTGlzdCogZ2V0Q2xhc3NMaXN0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGF0dHJp
YnV0ZUNoYW5nZWQoQXR0cmlidXRlKiBhdHRyLCBib29sIHByZXNlcnZlRGVjbHMgPSBmYWxzZSk7
Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSog
YXR0cik7Ci0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYg
YXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1
YWwgdm9pZCBjcmVhdGVBdHRyaWJ1dGVNYXAoKSBjb25zdDsKLSAgICB2aXJ0dWFsIEF0dHJpYnV0
ZSogY3JlYXRlQXR0cmlidXRlKGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIFN0cmluZ0ltcGwq
IHZhbHVlKTsKLQotcHJvdGVjdGVkOgotICAgIFJlZlB0cjxDU1NNdXRhYmxlU3R5bGVEZWNsYXJh
dGlvbj4gbV9pbmxpbmVTdHlsZURlY2w7Ci0gICAgbXV0YWJsZSBib29sIG1faXNTdHlsZUF0dHJp
YnV0ZVZhbGlkIDogMTsKLSAgICBtdXRhYmxlIGJvb2wgbV9zeW5jaHJvbml6aW5nU3R5bGVBdHRy
aWJ1dGUgOiAxOwotfTsKLQogfSAvL25hbWVzcGFjZQogCiAjdW5kZWYgaWQKSW5kZXg6IGRvbS9O
b2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBkb20vTm9kZS5jcHAJKHJldmlzaW9uIDEzNDc5KQorKysg
ZG9tL05vZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw5ICsyOSwxMSBAQAogI2luY2x1ZGUg
IkNoaWxkTm9kZUxpc3QuaCIKICNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbi5oIgogI2luY2x1
ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkV4Y2VwdGlv
bkNvZGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2lu
Y2x1ZGUgIk5hbWVkQXR0ck1hcC5oIgogI2luY2x1ZGUgIlRleHQuaCIKICNpbmNsdWRlICJodG1s
ZWRpdGluZy5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgpJbmRleDogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagkocmV2aXNpb24gMTM0NzcpCisrKyBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTMyNiw3ICszMjYsNiBAQAogCQk5M0YxOTkxODA4
MjQ1RTU5MDAxRTlBQkMgLyogUmFuZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEY1MjNEMzA0MDJERTQ0NzYwMTg2MzVDQSAvKiBSYW5nZS5oICovOyB9
OwogCQk5M0YxOTkxOTA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tMl90cmF2ZXJzYWxpbXBsLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDMwNjAyREU0
NDc2MDE4NjM1Q0EgLyogZG9tMl90cmF2ZXJzYWxpbXBsLmggKi87IH07CiAJCTkzRjE5OTFBMDgy
NDVFNTkwMDFFOUFCQyAvKiBBYnN0cmFjdFZpZXcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMzA4MDJERTQ0NzYwMTg2MzVDQSAvKiBBYnN0cmFj
dFZpZXcuaCAqLzsgfTsKLQkJOTNGMTk5MUMwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9lbGVtZW50
aW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUy
M0QyRjgwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVtZW50aW1wbC5oICovOyB9OwogCQk5M0Yx
OTkyMDA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX3htbGltcGwuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMzAwMDJERTQ0NzYwMTg2MzVDQSAvKiBk
b21feG1saW1wbC5oICovOyB9OwogCQk5M0YxOTkyMTA4MjQ1RTU5MDAxRTlBQkMgLyogeG1sX3Rv
a2VuaXplci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
RjUyM0QzMEEwMkRFNDQ3NjAxODYzNUNBIC8qIHhtbF90b2tlbml6ZXIuaCAqLzsgfTsKIAkJOTNG
MTk5MjkwODI0NUU1OTAwMUU5QUJDIC8qIEtXUUNTdHJpbmcuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1ODc4NjgzMDJERTNCODYwMUVBNDEyMiAvKiBL
V1FDU3RyaW5nLmggKi87IH07CkBAIC00NDgsNyArNDQ3LDYgQEAKIAkJOTNGMTlBOUIwODI0NUU1
OTAwMUU5QUJDIC8qIEhUTUxQYXJzZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNTAwMkRFNDM5NjAxODYzNUNBIC8qIEhUTUxQYXJzZXIu
Y3BwICovOyB9OwogCQk5M0YxOUE5QzA4MjQ1RTU5MDAxRTlBQkMgLyogSFRNTFRva2VuaXplci5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDI1
MjAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTFRva2VuaXplci5jcHAgKi87IH07CiAJCTkzRjE5QTlE
MDgyNDVFNTkwMDFFOUFCQyAvKiBkZWNvZGVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjc4MDJERTQzRDcwMTg2MzVDQSAvKiBkZWNvZGVy
LmNwcCAqLzsgfTsKLQkJOTNGMTlBQjMwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9lbGVtZW50aW1w
bC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIz
RDJGNzAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmNwcCAqLzsgfTsKIAkJOTNG
MTlBQjcwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV94bWxpbXBsLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMkZGMDJERTQ0NzYwMTg2MzVDQSAv
KiBkb21feG1saW1wbC5jcHAgKi87IH07CiAJCTkzRjE5QUI4MDgyNDVFNTkwMDFFOUFCQyAvKiBk
b20yX2V2ZW50c2ltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRjUyM0QzMDEwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbTJfZXZlbnRzaW1wbC5jcHAg
Ki87IH07CiAJCTkzRjE5QUI5MDgyNDVFNTkwMDFFOUFCQyAvKiBSYW5nZS5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDMwMzAyREU0NDc2MDE4
NjM1Q0EgLyogUmFuZ2UuY3BwICovOyB9OwpAQCAtNTQ0LDcgKzU0Miw2IEBACiAJCUE4MTg1RjQw
MDk3NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODVGMzgwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50
LmggKi87IH07CiAJCUE4MTg3MjFCMDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlTGlzdC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTAwOTc3RDND
MDAwNTgyNkQ5IC8qIE5vZGVMaXN0LmggKi87IH07CiAJCUE4MTg3MjFDMDk3N0QzQzAwMDU4MjZE
OSAvKiBDb250YWluZXJOb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBBODE4NzIxMTA5NzdEM0MwMDA1ODI2RDkgLyogQ29udGFpbmVyTm9kZS5oICov
OyB9OwotCQlBODE4NzIxRDA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NzIxMjA5NzdEM0MwMDA1ODI2
RDkgLyogTm9kZS5jcHAgKi87IH07CiAJCUE4MTg3MjFFMDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1l
Tm9kZUxpc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEE4MTg3MjEzMDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1lTm9kZUxpc3QuaCAqLzsgfTsKIAkJQTgx
ODcyMUYwOTc3RDNDMDAwNTgyNkQ5IC8qIENvbnRhaW5lck5vZGUuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTgxODcyMTQwOTc3RDNDMDAwNTgyNkQ5
IC8qIENvbnRhaW5lck5vZGUuY3BwICovOyB9OwogCQlBODE4NzIyMDA5NzdEM0MwMDA1ODI2RDkg
LyogQ2hpbGROb2RlTGlzdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQTgxODcyMTUwOTc3RDNDMDAwNTgyNkQ5IC8qIENoaWxkTm9kZUxpc3QuaCAqLzsg
fTsKQEAgLTg5OCw2ICs4OTUsMjUgQEAKIAkJQTg4QUQ1MUUwOTUyNDk5RjAwMUREMTk2IC8qIFNW
R05hbWVzV3JhcHBlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBODg0MjgzODA5MzA4QzFDMDBCNkQ0NjEgLyogU1ZHTmFtZXNXcmFwcGVyLmNwcCAq
LzsgfTsKIAkJQTg4QUQ1MkYwOTUyNEI5MjAwMUREMTk2IC8qIFF1YXJ0ekNvcmUuZnJhbWV3b3Jr
IGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg1RDdB
MkYwODc5RUJBOTAwNkE5MTcyIC8qIFF1YXJ0ekNvcmUuZnJhbWV3b3JrICovOyB9OwogCQlBODhB
RDVBQTA5NTI1MTMxMDAxREQxOTYgLyogU1ZHQ1NTU3R5bGVTZWxlY3Rvci5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEMwRjZGQjA4OTcwMUYxMDBC
QTUxMTQgLyogU1ZHQ1NTU3R5bGVTZWxlY3Rvci5jcHAgKi87IH07CisJCUE4QzRBN0ZEMDlENTYz
MjcwMDAzQUM4RCAvKiBTdHlsZWRFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdFQjA5RDU2MzI3MDAwM0FDOEQgLyogU3R5bGVkRWxl
bWVudC5oICovOyB9OworCQlBOEM0QTdGRTA5RDU2MzI3MDAwM0FDOEQgLyogU3R5bGVkRWxlbWVu
dC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0
QTdFQzA5RDU2MzI3MDAwM0FDOEQgLyogU3R5bGVkRWxlbWVudC5jcHAgKi87IH07CisJCUE4QzRB
N0ZGMDlENTYzMjcwMDAzQUM4RCAvKiBOb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdFRDA5RDU2MzI3MDAwM0FDOEQgLyogTm9kZS5oICov
OyB9OworCQlBOEM0QTgwMDA5RDU2MzI3MDAwM0FDOEQgLyogTm9kZS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdFRTA5RDU2MzI3MDAwM0FD
OEQgLyogTm9kZS5jcHAgKi87IH07CisJCUE4QzRBODAxMDlENTYzMjcwMDAzQUM4RCAvKiBOYW1l
ZE1hcHBlZEF0dHJNYXAuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEE4QzRBN0VGMDlENTYzMjcwMDAzQUM4RCAvKiBOYW1lZE1hcHBlZEF0dHJNYXAuaCAq
LzsgfTsKKwkJQThDNEE4MDIwOUQ1NjMyNzAwMDNBQzhEIC8qIE5hbWVkTWFwcGVkQXR0ck1hcC5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdG
MDA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRNYXBwZWRBdHRyTWFwLmNwcCAqLzsgfTsKKwkJQThD
NEE4MDMwOUQ1NjMyNzAwMDNBQzhEIC8qIE5hbWVkQXR0ck1hcC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThDNEE3RjEwOUQ1NjMyNzAwMDNBQzhEIC8q
IE5hbWVkQXR0ck1hcC5oICovOyB9OworCQlBOEM0QTgwNDA5RDU2MzI3MDAwM0FDOEQgLyogTmFt
ZWRBdHRyTWFwLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEE4QzRBN0YyMDlENTYzMjcwMDAzQUM4RCAvKiBOYW1lZEF0dHJNYXAuY3BwICovOyB9Owor
CQlBOEM0QTgwNTA5RDU2MzI3MDAwM0FDOEQgLyogTWFwcGVkQXR0cmlidXRlLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdGMzA5RDU2MzI3MDAw
M0FDOEQgLyogTWFwcGVkQXR0cmlidXRlLmggKi87IH07CisJCUE4QzRBODA2MDlENTYzMjcwMDAz
QUM4RCAvKiBNYXBwZWRBdHRyaWJ1dGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQThDNEE3RjQwOUQ1NjMyNzAwMDNBQzhEIC8qIE1hcHBlZEF0dHJp
YnV0ZS5jcHAgKi87IH07CisJCUE4QzRBODA3MDlENTYzMjcwMDAzQUM4RCAvKiBFbGVtZW50Lmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdGNTA5
RDU2MzI3MDAwM0FDOEQgLyogRWxlbWVudC5oICovOyB9OworCQlBOEM0QTgwODA5RDU2MzI3MDAw
M0FDOEQgLyogRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBBOEM0QTdGNjA5RDU2MzI3MDAwM0FDOEQgLyogRWxlbWVudC5jcHAgKi87IH07
CisJCUE4QzRBODA5MDlENTYzMjcwMDAzQUM4RCAvKiBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThD
NEE3RjcwOUQ1NjMyNzAwMDNBQzhEIC8qIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmgg
Ki87IH07CisJCUE4QzRBODBBMDlENTYzMjcwMDAzQUM4RCAvKiBDU1NNYXBwZWRBdHRyaWJ1dGVE
ZWNsYXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBOEM0QTdGODA5RDU2MzI3MDAwM0FDOEQgLyogQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFy
YXRpb24uY3BwICovOyB9OworCQlBOEM0QTgwQjA5RDU2MzI3MDAwM0FDOEQgLyogQXR0cmlidXRl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdG
OTA5RDU2MzI3MDAwM0FDOEQgLyogQXR0cmlidXRlLmggKi87IH07CisJCUE4QzRBODBDMDlENTYz
MjcwMDAzQUM4RCAvKiBBdHRyaWJ1dGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQThDNEE3RkEwOUQ1NjMyNzAwMDNBQzhEIC8qIEF0dHJpYnV0ZS5j
cHAgKi87IH07CisJCUE4QzRBODBEMDlENTYzMjcwMDAzQUM4RCAvKiBBdHRyLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0QTdGQjA5RDU2MzI3MDAw
M0FDOEQgLyogQXR0ci5oICovOyB9OworCQlBOEM0QTgwRTA5RDU2MzI3MDAwM0FDOEQgLyogQXR0
ci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEM0
QTdGQzA5RDU2MzI3MDAwM0FDOEQgLyogQXR0ci5jcHAgKi87IH07CisJCUE4QzRBODRDMDlENTY0
OUQwMDAzQUM4RCAvKiBNYXBwZWRBdHRyaWJ1dGVFbnRyeS5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQThDNEE4NEIwOUQ1NjQ5RDAwMDNBQzhEIC8qIE1h
cHBlZEF0dHJpYnV0ZUVudHJ5LmggKi87IH07CiAJCUE4REYzRkNFMDk3RkEwRkMwMDUyOTgxQiAv
KiBIVE1MRm9ybUNvbGxlY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEE4REYzRkM2MDk3RkEwRkIwMDUyOTgxQiAvKiBIVE1MRm9ybUNvbGxlY3Rp
b24uaCAqLzsgfTsKIAkJQThERjNGQ0YwOTdGQTBGQzAwNTI5ODFCIC8qIEhUTUxGb3JtQ29sbGVj
dGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBB
OERGM0ZDNzA5N0ZBMEZCMDA1Mjk4MUIgLyogSFRNTEZvcm1Db2xsZWN0aW9uLmNwcCAqLzsgfTsK
IAkJQThERjNGRDAwOTdGQTBGQzAwNTI5ODFCIC8qIEhUTUxDb2xsZWN0aW9uLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOERGM0ZDODA5N0ZBMEZCMDA1
Mjk4MUIgLyogSFRNTENvbGxlY3Rpb24uaCAqLzsgfTsKQEAgLTIwODIsNiArMjA5OCwyNSBAQAog
CQlBOEMzMjk2NzA5M0JCN0IyMDAwQjlDQUMgLyogU1ZHRkVQb2ludExpZ2h0RWxlbWVudC5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lk
dGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFNW
R0ZFUG9pbnRMaWdodEVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJQThDMzJEODkwOTNEOEJGQTAwMEI5Q0FDIC8qIHhs
aW5rYXR0cnMuaW4gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSB4bGlu
a2F0dHJzLmluOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJz
ID0gMDsgfTsKIAkJQThDMzJEOTYwOTNEOEVBNDAwMEI5Q0FDIC8qIFhMaW5rTmFtZXNXcmFwcGVy
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRl
bnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gWExpbmtOYW1lc1dyYXBwZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKKwkJQThDNEE3RUIwOUQ1NjMyNzAwMDNBQzhEIC8qIFN0
eWxlZEVsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN0eWxlZEVs
ZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThDNEE3RUMwOUQ1NjMyNzAw
MDNBQzhEIC8qIFN0eWxlZEVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFN0eWxlZEVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQlBOEM0QTdFRDA5RDU2MzI3MDAwM0FDOEQgLyogTm9kZS5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gTm9kZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBOEM0
QTdFRTA5RDU2MzI3MDAwM0FDOEQgLyogTm9kZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gTm9kZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4
QzRBN0VGMDlENTYzMjcwMDAzQUM4RCAvKiBOYW1lZE1hcHBlZEF0dHJNYXAuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5hbWVkTWFwcGVkQXR0ck1hcC5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQlBOEM0QTdGMDA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRNYXBw
ZWRBdHRyTWFwLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBOYW1l
ZE1hcHBlZEF0dHJNYXAuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBOEM0QTdG
MTA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRBdHRyTWFwLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBOYW1lZEF0dHJNYXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJQThDNEE3RjIwOUQ1NjMyNzAwMDNBQzhEIC8qIE5hbWVkQXR0ck1hcC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTmFtZWRBdHRyTWFwLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThDNEE3RjMwOUQ1NjMyNzAwMDNBQzhEIC8qIE1hcHBlZEF0
dHJpYnV0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTWFwcGVkQXR0cmli
dXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4QzRBN0Y0MDlENTYzMjcwMDAz
QUM4RCAvKiBNYXBwZWRBdHRyaWJ1dGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IE1hcHBlZEF0dHJpYnV0ZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4QzRBN0Y1MDlENTYzMjcwMDAzQUM4RCAvKiBFbGVtZW50LmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBFbGVtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4QzRBN0Y2MDlENTYzMjcwMDAzQUM4RCAvKiBFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKKwkJQThDNEE3RjcwOUQ1NjMyNzAwMDNBQzhEIC8qIENTU01hcHBlZEF0dHJpYnV0
ZURlY2xhcmF0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlB
OEM0QTdGODA5RDU2MzI3MDAwM0FDOEQgLyogQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24u
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQThDNEE3
RjkwOUQ1NjMyNzAwMDNBQzhEIC8qIEF0dHJpYnV0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gQXR0cmlidXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4
QzRBN0ZBMDlENTYzMjcwMDAzQUM4RCAvKiBBdHRyaWJ1dGUuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEF0dHJpYnV0ZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUE4QzRBN0ZCMDlENTYzMjcwMDAzQUM4RCAvKiBBdHRyLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBBdHRyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4QzRBN0ZDMDlENTYzMjcwMDAzQUM4RCAvKiBBdHRyLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBBdHRyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQThDNEE4NEIwOUQ1NjQ5RDAwMDNBQzhEIC8qIE1hcHBlZEF0dHJpYnV0ZUVudHJ5Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBNYXBwZWRBdHRyaWJ1dGVFbnRyeS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBOERGM0ZDNjA5N0ZBMEZCMDA1Mjk4MUIg
LyogSFRNTEZvcm1Db2xsZWN0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBIVE1MRm9ybUNvbGxlY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQThE
RjNGQzcwOTdGQTBGQjAwNTI5ODFCIC8qIEhUTUxGb3JtQ29sbGVjdGlvbi5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTEZvcm1Db2xsZWN0aW9uLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQThERjNGQzgwOTdGQTBGQjAwNTI5ODFCIC8qIEhU
TUxDb2xsZWN0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MQ29s
bGVjdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjM3NSw4ICsyNDEwLDYg
QEAKIAkJRjUyM0QyNTMwMkRFNDM5NjAxODYzNUNBIC8qIEhUTUxUb2tlbml6ZXIuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRNTFRva2VuaXpl
ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsg
fTsKIAkJRjUyM0QyNzgwMkRFNDNENzAxODYzNUNBIC8qIGRlY29kZXIuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gZGVjb2Rlci5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9Owog
CQlGNTIzRDI3OTAyREU0M0Q3MDE4NjM1Q0EgLyogZGVjb2Rlci5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBkZWNvZGVyLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwotCQlGNTIzRDJGNzAy
REU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGRvbV9lbGVtZW50aW1wbC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9Owot
CQlGNTIzRDJGODAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGRvbV9lbGVtZW50aW1w
bC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsg
fTsKIAkJRjUyM0QyRkYwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV94bWxpbXBsLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IGRvbV94bWxp
bXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9
IDA7IH07CiAJCUY1MjNEMzAwMDJERTQ0NzYwMTg2MzVDQSAvKiBkb21feG1saW1wbC5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBkb21feG1saW1w
bC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsg
fTsKIAkJRjUyM0QzMDEwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbTJfZXZlbnRzaW1wbC5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRo
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBkb20y
X2V2ZW50c2ltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVz
ZXNUYWJzID0gMDsgfTsKQEAgLTQwMTAsNyArNDA0MywxMSBAQAogCQkJCUY1MjNEMzA3MDJERTQ0
NzYwMTg2MzVDQSAvKiBBYnN0cmFjdFZpZXcuY3BwICovLAogCQkJCUY1MjNEMzA4MDJERTQ0NzYw
MTg2MzVDQSAvKiBBYnN0cmFjdFZpZXcuaCAqLywKIAkJCQlCQzNCMzY0NzA1QzlENUUyMDBFNDI5
MDIgLyogQXRvbWljU3RyaW5nTGlzdC5oICovLAorCQkJCUE4QzRBN0ZDMDlENTYzMjcwMDAzQUM4
RCAvKiBBdHRyLmNwcCAqLywKKwkJCQlBOEM0QTdGQjA5RDU2MzI3MDAwM0FDOEQgLyogQXR0ci5o
ICovLAogCQkJCTkzRUVDMUU1MDlDMjg3NzcwMEM1MTVEMSAvKiBBdHRyLmlkbCAqLywKKwkJCQlB
OEM0QTdGQTA5RDU2MzI3MDAwM0FDOEQgLyogQXR0cmlidXRlLmNwcCAqLywKKwkJCQlBOEM0QTdG
OTA5RDU2MzI3MDAwM0FDOEQgLyogQXR0cmlidXRlLmggKi8sCiAJCQkJQUIyM0EzMjUwOUJCQTdE
MDAwNjdDQzUzIC8qIEJlZm9yZVRleHRJbnNlcnRlZEV2ZW50LmNwcCAqLywKIAkJCQlBQjIzQTMy
NjA5QkJBN0QwMDA2N0NDNTMgLyogQmVmb3JlVGV4dEluc2VydGVkRXZlbnQuaCAqLywKIAkJCQk2
NTUwQjY5MzA5OURGMDI3MDA5MEQ3ODEgLyogQ0RBVEFTZWN0aW9uLmNwcCAqLywKQEAgLTQwMjQs
NiArNDA2MSw4IEBACiAJCQkJNjU1MEI2OTgwOTlERjAyNzAwOTBENzgxIC8qIENvbW1lbnQuaCAq
LywKIAkJCQlBODE4NzIxNDA5NzdEM0MwMDA1ODI2RDkgLyogQ29udGFpbmVyTm9kZS5jcHAgKi8s
CiAJCQkJQTgxODcyMTEwOTc3RDNDMDAwNTgyNkQ5IC8qIENvbnRhaW5lck5vZGUuaCAqLywKKwkJ
CQlBOEM0QTdGODA5RDU2MzI3MDAwM0FDOEQgLyogQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRp
b24uY3BwICovLAorCQkJCUE4QzRBN0Y3MDlENTYzMjcwMDAzQUM4RCAvKiBDU1NNYXBwZWRBdHRy
aWJ1dGVEZWNsYXJhdGlvbi5oICovLAogCQkJCTkzRUVDMUU3MDlDMjg3NzcwMEM1MTVEMSAvKiBE
b2NQdHIuaCAqLywKIAkJCQlBODE4NUYzNDA5NzY1NzY1MDA1ODI2RDkgLyogRG9jdW1lbnQuY3Bw
ICovLAogCQkJCUE4MTg1RjM4MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudC5oICovLApAQCAt
NDAzNyw4ICs0MDc2LDYgQEAKIAkJCQlGNTIzRDMwMjAyREU0NDc2MDE4NjM1Q0EgLyogZG9tMl9l
dmVudHNpbXBsLmggKi8sCiAJCQkJRjUyM0QzMDUwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbTJfdHJh
dmVyc2FsaW1wbC5jcHAgKi8sCiAJCQkJRjUyM0QzMDYwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbTJf
dHJhdmVyc2FsaW1wbC5oICovLAotCQkJCUY1MjNEMkY3MDJERTQ0NzYwMTg2MzVDQSAvKiBkb21f
ZWxlbWVudGltcGwuY3BwICovLAotCQkJCUY1MjNEMkY4MDJERTQ0NzYwMTg2MzVDQSAvKiBkb21f
ZWxlbWVudGltcGwuaCAqLywKIAkJCQlGNTIzRDJGRjAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX3ht
bGltcGwuY3BwICovLAogCQkJCUY1MjNEMzAwMDJERTQ0NzYwMTg2MzVDQSAvKiBkb21feG1saW1w
bC5oICovLAogCQkJCUE4MTg1RjM2MDk3NjU3NjUwMDU4MjZEOSAvKiBET01JbXBsZW1lbnRhdGlv
bi5jcHAgKi8sCkBAIC00MDQ2LDYgKzQwODMsOCBAQAogCQkJCTkzRUVDMUU5MDlDMjg3NzcwMEM1
MTVEMSAvKiBET01JbXBsZW1lbnRhdGlvbi5pZGwgKi8sCiAJCQkJNjU1MEI2OTkwOTlERjAyNzAw
OTBENzgxIC8qIEVkaXRpbmdUZXh0LmNwcCAqLywKIAkJCQk2NTUwQjY5QTA5OURGMDI3MDA5MEQ3
ODEgLyogRWRpdGluZ1RleHQuaCAqLywKKwkJCQlBOEM0QTdGNjA5RDU2MzI3MDAwM0FDOEQgLyog
RWxlbWVudC5jcHAgKi8sCisJCQkJQThDNEE3RjUwOUQ1NjMyNzAwMDNBQzhEIC8qIEVsZW1lbnQu
aCAqLywKIAkJCQk5M0VFQzFFQTA5QzI4Nzc3MDBDNTE1RDEgLyogRWxlbWVudC5pZGwgKi8sCiAJ
CQkJOTNFRUMxRUIwOUMyODc3NzAwQzUxNUQxIC8qIEVudGl0eS5pZGwgKi8sCiAJCQkJOTM1RkJD
NDQwOUJBMDBCOTAwRTIzMEIxIC8qIEV2ZW50TGlzdGVuZXIuaCAqLywKQEAgLTQwNTQsMTIgKzQw
OTMsMTkgQEAKIAkJCQkxNEVDMjY3RTA5Q0EwN0UwMDBFMUVFRUMgLyogRXZlbnRUYXJnZXROb2Rl
LmNwcCAqLywKIAkJCQkxNEVDMjY3RDA5Q0EwN0UwMDBFMUVFRUMgLyogRXZlbnRUYXJnZXROb2Rl
LmggKi8sCiAJCQkJOTM1RkJDRjEwOUJBMTQzQjAwRTIzMEIxIC8qIEV4Y2VwdGlvbkNvZGUuaCAq
LywKKwkJCQlBOEM0QTdGNDA5RDU2MzI3MDAwM0FDOEQgLyogTWFwcGVkQXR0cmlidXRlLmNwcCAq
LywKKwkJCQlBOEM0QTdGMzA5RDU2MzI3MDAwM0FDOEQgLyogTWFwcGVkQXR0cmlidXRlLmggKi8s
CisJCQkJQThDNEE4NEIwOUQ1NjQ5RDAwMDNBQzhEIC8qIE1hcHBlZEF0dHJpYnV0ZUVudHJ5Lmgg
Ki8sCiAJCQkJOTNFRUMxRjMwOUMyODc3NzAwQzUxNUQxIC8qIE11dGF0aW9uRXZlbnQuaWRsICov
LAorCQkJCUE4QzRBN0YyMDlENTYzMjcwMDAzQUM4RCAvKiBOYW1lZEF0dHJNYXAuY3BwICovLAor
CQkJCUE4QzRBN0YxMDlENTYzMjcwMDAzQUM4RCAvKiBOYW1lZEF0dHJNYXAuaCAqLywKKwkJCQlB
OEM0QTdGMDA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRNYXBwZWRBdHRyTWFwLmNwcCAqLywKKwkJ
CQlBOEM0QTdFRjA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRNYXBwZWRBdHRyTWFwLmggKi8sCiAJ
CQkJQTgxODcyMTgwOTc3RDNDMDAwNTgyNkQ5IC8qIE5hbWVkTm9kZU1hcC5oICovLAogCQkJCUE4
MTg3MjE5MDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1lTm9kZUxpc3QuY3BwICovLAogCQkJCUE4MTg3
MjEzMDk3N0QzQzAwMDU4MjZEOSAvKiBOYW1lTm9kZUxpc3QuaCAqLywKLQkJCQlBODE4NzIxMjA5
NzdEM0MwMDA1ODI2RDkgLyogTm9kZS5jcHAgKi8sCi0JCQkJQTgxODcyMTcwOTc3RDNDMDAwNTgy
NkQ5IC8qIE5vZGUuaCAqLywKKwkJCQlBOEM0QTdFRTA5RDU2MzI3MDAwM0FDOEQgLyogTm9kZS5j
cHAgKi8sCisJCQkJQThDNEE3RUQwOUQ1NjMyNzAwMDNBQzhEIC8qIE5vZGUuaCAqLywKIAkJCQlB
ODE4NzIxNjA5NzdEM0MwMDA1ODI2RDkgLyogTm9kZUxpc3QuY3BwICovLAogCQkJCUE4MTg3MjEw
MDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlTGlzdC5oICovLAogCQkJCTkzRUVDMUY0MDlDMjg3Nzcw
MEM1MTVEMSAvKiBOb3RhdGlvbi5pZGwgKi8sCkBAIC00MDcxLDEyICs0MTE3LDE2IEBACiAJCQkJ
RjUyM0QzMDMwMkRFNDQ3NjAxODYzNUNBIC8qIFJhbmdlLmNwcCAqLywKIAkJCQlGNTIzRDMwNDAy
REU0NDc2MDE4NjM1Q0EgLyogUmFuZ2UuaCAqLywKIAkJCQk5MzZERDAzQTA5Q0VBQzI3MDA1NkFF
OEMgLyogUmFuZ2UuaWRsICovLAorCQkJCUE4QzRBN0VDMDlENTYzMjcwMDAzQUM4RCAvKiBTdHls
ZWRFbGVtZW50LmNwcCAqLywKKwkJCQlBOEM0QTdFQjA5RDU2MzI3MDAwM0FDOEQgLyogU3R5bGVk
RWxlbWVudC5oICovLAogCQkJCTY1NTBCNjlCMDk5REYwMjcwMDkwRDc4MSAvKiBUZXh0LmNwcCAq
LywKIAkJCQk2NTUwQjY5QzA5OURGMDI3MDA5MEQ3ODEgLyogVGV4dC5oICovLAogCQkJCTkzRUVD
MUY2MDlDMjg3NzcwMEM1MTVEMSAvKiBUZXh0LmlkbCAqLywKIAkJCQk5M0VFQzFGNzA5QzI4Nzc3
MDBDNTE1RDEgLyogV2hlZWxFdmVudC5pZGwgKi8sCiAJCQkJRjUyM0QzMDkwMkRFNDQ3NjAxODYz
NUNBIC8qIHhtbF90b2tlbml6ZXIuY3BwICovLAogCQkJCUY1MjNEMzBBMDJERTQ0NzYwMTg2MzVD
QSAvKiB4bWxfdG9rZW5pemVyLmggKi8sCisJCQkJQTgxODcyMTIwOTc3RDNDMDAwNTgyNkQ5IC8q
IE5vZGUuY3BwICovLAorCQkJCUE4MTg3MjE3MDk3N0QzQzAwMDU4MjZEOSAvKiBOb2RlLmggKi8s
CiAJCQkpOwogCQkJcGF0aCA9IGRvbTsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC00
MTg4LDcgKzQyMzgsNiBAQAogCQkJCTkzRjE5OTE4MDgyNDVFNTkwMDFFOUFCQyAvKiBSYW5nZS5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5MTkwODI0NUU1OTAwMUU5QUJDIC8qIGRvbTJfdHJh
dmVyc2FsaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5MUEwODI0NUU1OTAwMUU5QUJD
IC8qIEFic3RyYWN0Vmlldy5oIGluIEhlYWRlcnMgKi8sCi0JCQkJOTNGMTk5MUMwODI0NUU1OTAw
MUU5QUJDIC8qIGRvbV9lbGVtZW50aW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5MjAw
ODI0NUU1OTAwMUU5QUJDIC8qIGRvbV94bWxpbXBsLmggaW4gSGVhZGVycyAqLywKIAkJCQk5M0Yx
OTkyMTA4MjQ1RTU5MDAxRTlBQkMgLyogeG1sX3Rva2VuaXplci5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJOTNGMTk5MjkwODI0NUU1OTAwMUU5QUJDIC8qIEtXUUNTdHJpbmcuaCBpbiBIZWFkZXJzICov
LApAQCAtNDcyMiw2ICs0NzcxLDE2IEBACiAJCQkJNjVERjMyM0MwOUQxREU2NTAwMEJFMzI1IC8q
IEpTQ2FudmFzUGF0dGVybi5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNjVERjMyM0UwOUQxREU2NTAw
MEJFMzI1IC8qIEpTQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmggaW4gSGVhZGVycyAqLywKIAkJ
CQlEMDg2RkU5ODA5RDUzQUFCMDA1QkM3NEQgLyogVW5saW5rQ29tbWFuZC5oIGluIEhlYWRlcnMg
Ki8sCisJCQkJQThDNEE3RkQwOUQ1NjMyNzAwMDNBQzhEIC8qIFN0eWxlZEVsZW1lbnQuaCBpbiBI
ZWFkZXJzICovLAorCQkJCUE4QzRBN0ZGMDlENTYzMjcwMDAzQUM4RCAvKiBOb2RlLmggaW4gSGVh
ZGVycyAqLywKKwkJCQlBOEM0QTgwMTA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRNYXBwZWRBdHRy
TWFwLmggaW4gSGVhZGVycyAqLywKKwkJCQlBOEM0QTgwMzA5RDU2MzI3MDAwM0FDOEQgLyogTmFt
ZWRBdHRyTWFwLmggaW4gSGVhZGVycyAqLywKKwkJCQlBOEM0QTgwNTA5RDU2MzI3MDAwM0FDOEQg
LyogTWFwcGVkQXR0cmlidXRlLmggaW4gSGVhZGVycyAqLywKKwkJCQlBOEM0QTgwNzA5RDU2MzI3
MDAwM0FDOEQgLyogRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQThDNEE4MDkwOUQ1NjMy
NzAwMDNBQzhEIC8qIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmggaW4gSGVhZGVycyAq
LywKKwkJCQlBOEM0QTgwQjA5RDU2MzI3MDAwM0FDOEQgLyogQXR0cmlidXRlLmggaW4gSGVhZGVy
cyAqLywKKwkJCQlBOEM0QTgwRDA5RDU2MzI3MDAwM0FDOEQgLyogQXR0ci5oIGluIEhlYWRlcnMg
Ki8sCisJCQkJQThDNEE4NEMwOUQ1NjQ5RDAwMDNBQzhEIC8qIE1hcHBlZEF0dHJpYnV0ZUVudHJ5
LmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9j
ZXNzaW5nID0gMDsKIAkJfTsKQEAgLTQ5NzksNyArNTAzOCw2IEBACiAJCQkJOTNGMTlBOUIwODI0
NUU1OTAwMUU5QUJDIC8qIEhUTUxQYXJzZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlB
OUMwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxUb2tlbml6ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJOTNGMTlBOUQwODI0NUU1OTAwMUU5QUJDIC8qIGRlY29kZXIuY3BwIGluIFNvdXJjZXMgKi8s
Ci0JCQkJOTNGMTlBQjMwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9lbGVtZW50aW1wbC5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQk5M0YxOUFCNzA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX3htbGltcGwu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBQjgwODI0NUU1OTAwMUU5QUJDIC8qIGRvbTJf
ZXZlbnRzaW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YxOUFCOTA4MjQ1RTU5MDAxRTlB
QkMgLyogUmFuZ2UuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC01MjE5LDcgKzUyNzcsNiBAQAogCQkJ
CUE4MTg1RjNDMDk3NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudC5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQlBODE4NUYzRTA5NzY1NzY2MDA1ODI2RDkgLyogRE9NSW1wbGVtZW50YXRpb24uY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQTgxODVGM0YwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50RnJh
Z21lbnQuY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJQTgxODcyMUQwOTc3RDNDMDAwNTgyNkQ5IC8q
IE5vZGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgxODcyMUYwOTc3RDNDMDAwNTgyNkQ5IC8q
IENvbnRhaW5lck5vZGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgxODcyMjEwOTc3RDNDMDAw
NTgyNkQ5IC8qIE5vZGVMaXN0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTg3MjI0MDk3N0Qz
QzAwMDU4MjZEOSAvKiBOYW1lTm9kZUxpc3QuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC01NDM3LDYg
KzU0OTQsMTUgQEAKIAkJCQk2NURGMzIzRDA5RDFERTY1MDAwQkUzMjUgLyogSlNDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNjVERjMyNjEwOUQxRTE5OTAw
MEJFMzI1IC8qIFVzZXJBZ2VudFN0eWxlU2hlZXRzRGF0YS5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQlEMDg2RkU5OTA5RDUzQUFCMDA1QkM3NEQgLyogVW5saW5rQ29tbWFuZC5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQlBOEM0QTdGRTA5RDU2MzI3MDAwM0FDOEQgLyogU3R5bGVkRWxlbWVudC5jcHAg
aW4gU291cmNlcyAqLywKKwkJCQlBOEM0QTgwMDA5RDU2MzI3MDAwM0FDOEQgLyogTm9kZS5jcHAg
aW4gU291cmNlcyAqLywKKwkJCQlBOEM0QTgwMjA5RDU2MzI3MDAwM0FDOEQgLyogTmFtZWRNYXBw
ZWRBdHRyTWFwLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4QzRBODA0MDlENTYzMjcwMDAzQUM4
RCAvKiBOYW1lZEF0dHJNYXAuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQThDNEE4MDYwOUQ1NjMy
NzAwMDNBQzhEIC8qIE1hcHBlZEF0dHJpYnV0ZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBOEM0
QTgwODA5RDU2MzI3MDAwM0FDOEQgLyogRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlB
OEM0QTgwQTA5RDU2MzI3MDAwM0FDOEQgLyogQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24u
Y3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQThDNEE4MEMwOUQ1NjMyNzAwMDNBQzhEIC8qIEF0dHJp
YnV0ZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBOEM0QTgwRTA5RDU2MzI3MDAwM0FDOEQgLyog
QXR0ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBv
c3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IGVkaXRpbmcvU3BsaXRFbGVtZW50Q29tbWFu
ZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gZWRpdGluZy9TcGxpdEVsZW1lbnRDb21tYW5kLmNwcAkocmV2
aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL1NwbGl0RWxlbWVudENvbW1hbmQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNSwxNSArMjUsMTAgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1
ZGUgIlNwbGl0RWxlbWVudENvbW1hbmQuaCIKLQotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5o
IgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMu
aD4KIAotdXNpbmcgV2ViQ29yZTo6RG9jdW1lbnQ7Ci11c2luZyBXZWJDb3JlOjpFbGVtZW50Owot
dXNpbmcgV2ViQ29yZTo6Tm9kZTsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBTcGxpdEVsZW1l
bnRDb21tYW5kOjpTcGxpdEVsZW1lbnRDb21tYW5kKFdlYkNvcmU6OkRvY3VtZW50ICpkb2N1bWVu
dCwgV2ViQ29yZTo6RWxlbWVudCAqZWxlbWVudCwgV2ViQ29yZTo6Tm9kZSAqYXRDaGlsZCkKSW5k
ZXg6IGVkaXRpbmcvQ29tcG9zaXRlRWRpdENvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRp
bmcvQ29tcG9zaXRlRWRpdENvbW1hbmQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGVkaXRpbmcv
Q29tcG9zaXRlRWRpdENvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBA
CiAjaW5jbHVkZSAiQXBwbHlTdHlsZUNvbW1hbmQuaCIKICNpbmNsdWRlICJEZWxldGVGcm9tVGV4
dE5vZGVDb21tYW5kLmgiCiAjaW5jbHVkZSAiRGVsZXRlU2VsZWN0aW9uQ29tbWFuZC5oIgorI2lu
Y2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJSYW5nZS5oIgogI2luY2x1ZGUgImh0bWxlZGl0
aW5nLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCkluZGV4OiBlZGl0aW5nL0luc2VydFRleHRD
b21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBlZGl0aW5nL0luc2VydFRleHRDb21tYW5kLmNwcAko
cmV2aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL0luc2VydFRleHRDb21tYW5kLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIkluc2VydFRleHRDb21tYW5kLmgi
CiAKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRl
ICJFZGl0aW5nVGV4dC5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5o
IgpJbmRleDogZWRpdGluZy9NZXJnZUlkZW50aWNhbEVsZW1lbnRzQ29tbWFuZC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gZWRpdGluZy9NZXJnZUlkZW50aWNhbEVsZW1lbnRzQ29tbWFuZC5jcHAJKHJldmlz
aW9uIDEzNDc3KQorKysgZWRpdGluZy9NZXJnZUlkZW50aWNhbEVsZW1lbnRzQ29tbWFuZC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI1LDggKzI1LDcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgIk1lcmdlSWRlbnRpY2FsRWxlbWVudHNDb21tYW5kLmgiCi0KLSNpbmNsdWRlICJk
b21fZWxlbWVudGltcGwuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCiAKICNpbmNsdWRlIDxreG1s
Y29yZS9Bc3NlcnRpb25zLmg+CiAKSW5kZXg6IGVkaXRpbmcvRGVsZXRlRnJvbVRleHROb2RlQ29t
bWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gZWRpdGluZy9EZWxldGVGcm9tVGV4dE5vZGVDb21tYW5k
LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL0RlbGV0ZUZyb21UZXh0Tm9kZUNvbW1h
bmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw5ICszMCw2IEBACiAKICNpbmNsdWRlIDxreG1s
Y29yZS9Bc3NlcnRpb25zLmg+CiAKLXVzaW5nIFdlYkNvcmU6OkRvY3VtZW50OwotdXNpbmcgV2Vi
Q29yZTo6VGV4dDsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBEZWxldGVGcm9tVGV4dE5vZGVD
b21tYW5kOjpEZWxldGVGcm9tVGV4dE5vZGVDb21tYW5kKERvY3VtZW50ICpkb2N1bWVudCwgVGV4
dCAqbm9kZSwgaW50IG9mZnNldCwgaW50IGNvdW50KQpJbmRleDogZWRpdGluZy9SZW1vdmVDU1NQ
cm9wZXJ0eUNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvUmVtb3ZlQ1NTUHJvcGVy
dHlDb21tYW5kLmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL1JlbW92ZUNTU1Byb3Bl
cnR5Q29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDEwICszMCw2IEBACiAKICNpbmNs
dWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CiAKLXVzaW5nIFdlYkNvcmU6OkNTU1N0eWxlRGVj
bGFyYXRpb247Ci11c2luZyBXZWJDb3JlOjpTdHJpbmc7Ci11c2luZyBXZWJDb3JlOjpEb2N1bWVu
dDsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBSZW1vdmVDU1NQcm9wZXJ0eUNvbW1hbmQ6OlJl
bW92ZUNTU1Byb3BlcnR5Q29tbWFuZChEb2N1bWVudCAqZG9jdW1lbnQsIENTU1N0eWxlRGVjbGFy
YXRpb24gKmRlY2wsIGludCBwcm9wZXJ0eSkKSW5kZXg6IGVkaXRpbmcvTW92ZVNlbGVjdGlvbkNv
bW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvTW92ZVNlbGVjdGlvbkNvbW1hbmQuY3Bw
CShyZXZpc2lvbiAxMzQ3NykKKysrIGVkaXRpbmcvTW92ZVNlbGVjdGlvbkNvbW1hbmQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMSwxMSArMzEsNiBAQAogCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNz
ZXJ0aW9ucy5oPgogCi11c2luZyBXZWJDb3JlOjpEb2N1bWVudDsKLXVzaW5nIFdlYkNvcmU6OkRv
Y3VtZW50RnJhZ21lbnQ7Ci11c2luZyBXZWJDb3JlOjpOb2RlOwotdXNpbmcgV2ViQ29yZTo6UG9z
aXRpb247Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogTW92ZVNlbGVjdGlvbkNvbW1hbmQ6Ok1v
dmVTZWxlY3Rpb25Db21tYW5kKERvY3VtZW50ICpkb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCAq
ZnJhZ21lbnQsIFBvc2l0aW9uICZwb3NpdGlvbiwgYm9vbCBzbWFydE1vdmUpIApJbmRleDogZWRp
dGluZy9Nb2RpZnlTZWxlY3Rpb25MaXN0TGV2ZWxDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBl
ZGl0aW5nL01vZGlmeVNlbGVjdGlvbkxpc3RMZXZlbENvbW1hbmQuY3BwCShyZXZpc2lvbiAxMzQ3
NykKKysrIGVkaXRpbmcvTW9kaWZ5U2VsZWN0aW9uTGlzdExldmVsQ29tbWFuZC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgIkNvbXBvc2l0ZUVkaXRDb21t
YW5kLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKICNpbmNsdWRlICJTZWxl
Y3Rpb25Db250cm9sbGVyLmgiCkluZGV4OiBlZGl0aW5nL1NldE5vZGVBdHRyaWJ1dGVDb21tYW5k
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBlZGl0aW5nL1NldE5vZGVBdHRyaWJ1dGVDb21tYW5kLmNwcAko
cmV2aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL1NldE5vZGVBdHRyaWJ1dGVDb21tYW5kLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjUsMTcgKzI1LDEwIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJTZXROb2RlQXR0cmlidXRlQ29tbWFuZC5oIgotCi0jaW5jbHVkZSAiZG9tX2Vs
ZW1lbnRpbXBsLmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogCiAjaW5jbHVkZSA8a3htbGNvcmUv
QXNzZXJ0aW9ucy5oPgogCi11c2luZyBXZWJDb3JlOjpEb2N1bWVudDsKLXVzaW5nIFdlYkNvcmU6
OkVsZW1lbnQ7Ci11c2luZyBXZWJDb3JlOjpOb2RlOwotdXNpbmcgV2ViQ29yZTo6U3RyaW5nOwot
dXNpbmcgV2ViQ29yZTo6UXVhbGlmaWVkTmFtZTsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBT
ZXROb2RlQXR0cmlidXRlQ29tbWFuZDo6U2V0Tm9kZUF0dHJpYnV0ZUNvbW1hbmQoRG9jdW1lbnQg
KmRvY3VtZW50LCBFbGVtZW50ICplbGVtZW50LCAKSW5kZXg6IGVkaXRpbmcvU2VsZWN0aW9uLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBlZGl0aW5nL1NlbGVjdGlvbi5jcHAJKHJldmlzaW9uIDEzNDc3KQor
KysgZWRpdGluZy9TZWxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBA
CiAjaW5jbHVkZSAiU2VsZWN0aW9uLmgiCiAKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1
ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJodG1sZWRpdGluZy5oIgogI2luY2x1ZGUgIlZpc2li
bGVQb3NpdGlvbi5oIgogI2luY2x1ZGUgInZpc2libGVfdW5pdHMuaCIKSW5kZXg6IGVkaXRpbmcv
UmVtb3ZlTm9kZUF0dHJpYnV0ZUNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvUmVt
b3ZlTm9kZUF0dHJpYnV0ZUNvbW1hbmQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGVkaXRpbmcv
UmVtb3ZlTm9kZUF0dHJpYnV0ZUNvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSwxNiAr
MjUsMTAgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlJlbW92ZU5vZGVBdHRy
aWJ1dGVDb21tYW5kLmgiCi0KLSNpbmNsdWRlICJkb21fZWxlbWVudGltcGwuaCIKKyNpbmNsdWRl
ICJFbGVtZW50LmgiCiAKICNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CiAKLXVzaW5n
IFdlYkNvcmU6OkRvY3VtZW50OwotdXNpbmcgV2ViQ29yZTo6RWxlbWVudDsKLXVzaW5nIFdlYkNv
cmU6Ok5vZGU7Ci11c2luZyBXZWJDb3JlOjpRdWFsaWZpZWROYW1lOwotCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKIFJlbW92ZU5vZGVBdHRyaWJ1dGVDb21tYW5kOjpSZW1vdmVOb2RlQXR0cmlidXRl
Q29tbWFuZChEb2N1bWVudCAqZG9jdW1lbnQsIEVsZW1lbnQgKmVsZW1lbnQsIGNvbnN0IFF1YWxp
ZmllZE5hbWUmIGF0dHJpYnV0ZSkKSW5kZXg6IGVkaXRpbmcvRGVsZXRlU2VsZWN0aW9uQ29tbWFu
ZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gZWRpdGluZy9EZWxldGVTZWxlY3Rpb25Db21tYW5kLmNwcAko
cmV2aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL0RlbGV0ZVNlbGVjdGlvbkNvbW1hbmQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiRGVsZXRlU2VsZWN0aW9u
Q29tbWFuZC5oIgogCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiQ1NT
Q29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmgiCkluZGV4OiBlZGl0aW5nL1R5cGluZ0NvbW1hbmQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvVHlwaW5nQ29tbWFuZC5jcHAJKHJldmlzaW9uIDEz
NDc3KQorKysgZWRpdGluZy9UeXBpbmdDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjks
NiArMjksNyBAQAogI2luY2x1ZGUgIkJlZm9yZVRleHRJbnNlcnRlZEV2ZW50LmgiCiAjaW5jbHVk
ZSAiQnJlYWtCbG9ja3F1b3RlQ29tbWFuZC5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5j
bHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgogI2luY2x1ZGUg
IkZyYW1lLmgiCiAjaW5jbHVkZSAiSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5oIgpJbmRleDogZWRp
dGluZy92aXNpYmxlX3VuaXRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBlZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI3LDEyICsyNywxMiBAQAogI2luY2x1ZGUgInZpc2libGVfdW5pdHMu
aCIKIAogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1
ZGUgIklubGluZVRleHRCb3guaCIKICNpbmNsdWRlICJEZXByZWNhdGVkU3RyaW5nLmgiCiAjaW5j
bHVkZSAiUmVuZGVyQmxvY2suaCIKICNpbmNsdWRlICJUZXh0Qm91bmRhcmllcy5oIgogI2luY2x1
ZGUgIlZpc2libGVQb3NpdGlvbi5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogI2lu
Y2x1ZGUgImh0bWxlZGl0aW5nLmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAi
VGV4dEl0ZXJhdG9yLmgiCkluZGV4OiBlZGl0aW5nL0luc2VydExpbmVCcmVha0NvbW1hbmQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGVkaXRpbmcvSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5jcHAJKHJldmlz
aW9uIDEzNDc3KQorKysgZWRpdGluZy9JbnNlcnRMaW5lQnJlYWtDb21tYW5kLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjYsMTMgKzI2LDE0IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVk
ZSAiSW5zZXJ0TGluZUJyZWFrQ29tbWFuZC5oIgogCisjaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5o
IgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUg
IkZyYW1lLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlRleHQuaCIKICNpbmNs
dWRlICJWaXNpYmxlUG9zaXRpb24uaCIKICNpbmNsdWRlICJSYW5nZS5oIgotI2luY2x1ZGUgImRv
bV9lbGVtZW50aW1wbC5oIgogI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCiAjaW5jbHVkZSAiSFRN
TE5hbWVzLmgiCiAjaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgpJbmRleDogZWRpdGluZy9WaXNp
YmxlUG9zaXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNw
cAkocmV2aXNpb24gMTM0NzcpCisrKyBlZGl0aW5nL1Zpc2libGVQb3NpdGlvbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI1LDE0ICsyNSwxNSBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAiVmlzaWJsZVBvc2l0aW9uLmgiCi0jaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgotI2lu
Y2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJF
bGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAicmVuZGVyX2xpbmUu
aCIKLSNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94Lmgi
Ci0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJSYW5nZS5oIgorI2luY2x1ZGUgIlJl
bmRlck9iamVjdC5oIgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAicmVuZGVy
X2xpbmUuaCIKKyNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCiAKICNpbmNsdWRlIDxreG1sY29y
ZS9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSAiTG9nZ2luZy5oIgpJbmRleDogZWRpdGluZy9TZWxl
Y3Rpb25Db250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBlZGl0aW5nL1NlbGVjdGlvbkNvbnRy
b2xsZXIuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGVkaXRpbmcvU2VsZWN0aW9uQ29udHJvbGxl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJTZWxlY3Rp
b25Db250cm9sbGVyLmgiCiAKICNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVsZW1l
bnQuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNs
dWRlICJGcmFtZVZpZXcuaCIKQEAgLTM3LDcgKzM4LDYgQEAKICNpbmNsdWRlICJWaXNpYmxlUG9z
aXRpb24uaCIKICNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKICNpbmNsdWRlICJSYW5nZS5o
IgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgi
CiAjaW5jbHVkZSAiUmVuZGVyQ2FudmFzLmgiCiAjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCklu
ZGV4OiBlZGl0aW5nL1RleHRJdGVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZWRpdGluZy9UZXh0
SXRlcmF0b3IuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGVkaXRpbmcvVGV4dEl0ZXJhdG9yLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjcsMTQgKzI3LDEyIEBACiAjaW5jbHVkZSAiY29uZmlnLmgi
CiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2lu
Y2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJJbmxp
bmVUZXh0Qm94LmgiCiAjaW5jbHVkZSAiUG9zaXRpb24uaCIKICNpbmNsdWRlICJSYW5nZS5oIgot
I2luY2x1ZGUgIkRvY3VtZW50LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOjpIVE1MTmFt
ZXM7Ci11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIAogLy8gRklYTUU6IFRoZXNlIGNsYXNzZXMg
c2hvdWxkIHByb2JhYmx5IHVzZSB0aGUgcmVuZGVyIHRyZWUgYW5kIG5vdCB0aGUgRE9NIHRyZWUs
IHNpbmNlIGVsZW1lbnRzIGNvdWxkCiAvLyBiZSBoaWRkZW4gdXNpbmcgQ1NTLCBvciBhZGRpdGlv
bmFsIGdlbmVyYXRlZCBjb250ZW50IGNvdWxkIGJlIGFkZGVkLiAgRm9yIG5vdywgd2UganVzdCBt
YWtlIHN1cmUKQEAgLTQzLDYgKzQxLDggQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKwogY29uc3Qg
dW5zaWduZWQgc2hvcnQgbm9uQnJlYWtpbmdTcGFjZSA9IDB4QTA7CiAKIC8vIEJ1ZmZlciB0aGF0
IGtub3dzIGhvdyB0byBjb21wYXJlIHdpdGggYSBzZWFyY2ggdGFyZ2V0LgpJbmRleDogZWRpdGlu
Zy9JbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3JDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBlZGl0
aW5nL0luc2VydFBhcmFncmFwaFNlcGFyYXRvckNvbW1hbmQuY3BwCShyZXZpc2lvbiAxMzQ3NykK
KysrIGVkaXRpbmcvSW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yQ29tbWFuZC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAi
Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uLmgiCiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1l
cy5oIgotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogI2luY2x1ZGUgIlBvc2l0aW9uLmgi
CiAjaW5jbHVkZSAiVGV4dC5oIgogI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCkluZGV4OiBlZGl0
aW5nL0JyZWFrQmxvY2txdW90ZUNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvQnJl
YWtCbG9ja3F1b3RlQ29tbWFuZC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysgZWRpdGluZy9CcmVh
a0Jsb2NrcXVvdGVDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTEgKzI2LDEyIEBA
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiQnJlYWtCbG9ja3F1b3RlQ29tbWFuZC5o
IgogCi0jaW5jbHVkZSAiZG9tX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiVGV4dC5oIgotI2lu
Y2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkhU
TUxOYW1lcy5oIgorI2luY2x1ZGUgIlRleHQuaCIKICNpbmNsdWRlICJWaXNpYmxlUG9zaXRpb24u
aCIKKyNpbmNsdWRlICJodG1sZWRpdGluZy5oIgorCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0
aW9ucy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkluZGV4OiBlZGl0aW5nL1NwbGl0VGV4dE5v
ZGVDb250YWluaW5nRWxlbWVudENvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGVkaXRpbmcvU3Bs
aXRUZXh0Tm9kZUNvbnRhaW5pbmdFbGVtZW50Q29tbWFuZC5jcHAJKHJldmlzaW9uIDEzNDc3KQor
KysgZWRpdGluZy9TcGxpdFRleHROb2RlQ29udGFpbmluZ0VsZW1lbnRDb21tYW5kLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1
ZGUgIlNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudENvbW1hbmQuaCIKIAorI2luY2x1ZGUg
IkVsZW1lbnQuaCIKICNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiZG9tX2VsZW1lbnRpbXBs
LmgiCiAjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0
aW9ucy5oPgogCkluZGV4OiBrY2FudmFzL1JlbmRlclNWR0ltYWdlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBrY2FudmFzL1JlbmRlclNWR0ltYWdlLmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrY2FudmFz
L1JlbmRlclNWR0ltYWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNyBAQAogI2lu
Y2x1ZGUgIlNWR0FuaW1hdGVkTGVuZ3RoLmgiCiAjaW5jbHVkZSAiU1ZHSW1hZ2VFbGVtZW50Lmgi
CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+Ci0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIu
aD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlICJTVkdJbWFnZUVsZW1lbnQuaCIKIApJ
bmRleDogQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIENoYW5nZUxvZwkocmV2aXNpb24gMTM0Nzkp
CisrKyBDaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSwxNTQgQEAKIDIwMDYtMDMt
MjUgIEVyaWMgU2VpZGVsICA8ZXNlaWRlbEBhcHBsZS5jb20+CiAKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3BsaXQgZG9tX2VsZW1lbnRpbXBsLiogaW50
byBtdWx0aXBsZSBmaWxlcyAob25lIHBlciBjbGFzcykuCisgICAgICAgIGh0dHA6Ly9idWd6aWxs
YS5vcGVuZGFyd2luLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk3OAorCisgICAgICAgICogRm9yd2Fy
ZGluZ0hlYWRlcnMva2RvbS9jb3JlL0F0dHIuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBGb3J3YXJk
aW5nSGVhZGVycy9rZG9tL2NvcmUvRWxlbWVudC5oOiBSZW1vdmVkLgorICAgICAgICAqIEZvcndh
cmRpbmdIZWFkZXJzL2tkb20vY29yZS9YTUxFbGVtZW50Lmg6IFJlbW92ZWQuCisgICAgICAgICog
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGJpbmRpbmdzL29i
amMvRE9NLm1tOgorICAgICAgICAqIGJpbmRpbmdzL29iamMvRE9NSFRNTC5tbToKKyAgICAgICAg
KiBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JKUy5wbToKKyAgICAgICAgKiBkb20vQWJz
dHJhY3RWaWV3LmNwcDoKKyAgICAgICAgKiBkb20vQXR0ci5jcHA6IEFkZGVkLgorICAgICAgICAq
IGRvbS9BdHRyLmg6IEFkZGVkLgorICAgICAgICAqIGRvbS9BdHRyaWJ1dGUuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBkb20vQXR0cmlidXRlLmg6IEFkZGVkLgorICAgICAgICAqIGRvbS9DU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5jcHA6IEFkZGVkLgorICAgICAgICAqIGRvbS9DU1NNYXBw
ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5oOiBBZGRlZC4KKyAgICAgICAgKiBkb20vRE9NSW1wbGVt
ZW50YXRpb24uY3BwOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAgICAgICAqIGRvbS9E
b2N1bWVudFR5cGUuY3BwOgorICAgICAgICAqIGRvbS9FbGVtZW50LmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpFbGVtZW50OjpFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1l
bnQ6On5FbGVtZW50KToKKyAgICAgICAgKiBkb20vRWxlbWVudC5oOiBBZGRlZC4KKyAgICAgICAg
KiBkb20vRXZlbnROYW1lcy5jcHA6CisgICAgICAgICogZG9tL0V2ZW50VGFyZ2V0Tm9kZS5jcHA6
CisgICAgICAgICogZG9tL01hcHBlZEF0dHJpYnV0ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIGRv
bS9NYXBwZWRBdHRyaWJ1dGUuaDogQWRkZWQuCisgICAgICAgICogZG9tL01hcHBlZEF0dHJpYnV0
ZUVudHJ5Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKiBkb20vTmFt
ZU5vZGVMaXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok5hbWVOb2RlTGlzdDo6TmFtZU5vZGVM
aXN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok5hbWVOb2RlTGlzdDo6aXRlbSk6CisgICAgICAgIChX
ZWJDb3JlOjpOYW1lTm9kZUxpc3Q6Om5vZGVNYXRjaGVzKToKKyAgICAgICAgKiBkb20vTmFtZWRB
dHRyTWFwLmNwcDogQWRkZWQuCisgICAgICAgICogZG9tL05hbWVkQXR0ck1hcC5oOiBBZGRlZC4K
KyAgICAgICAgKiBkb20vTmFtZWRNYXBwZWRBdHRyTWFwLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpOYW1lZE1hcHBlZEF0dHJNYXA6Ok5hbWVkTWFwcGVkQXR0ck1hcCk6CisgICAgICAg
ICogZG9tL05hbWVkTWFwcGVkQXR0ck1hcC5oOiBBZGRlZC4KKyAgICAgICAgKiBkb20vTm9kZS5j
cHA6CisgICAgICAgICogZG9tL05vZGVMaXN0LmNwcDoKKyAgICAgICAgKiBkb20vUG9zaXRpb24u
Y3BwOgorICAgICAgICAqIGRvbS9TdHlsZWRFbGVtZW50LmNwcDogQWRkZWQuCisgICAgICAgICog
ZG9tL1N0eWxlZEVsZW1lbnQuaDogQWRkZWQuCisgICAgICAgICogZG9tL2RvbV9lbGVtZW50aW1w
bC5jcHA6IFJlbW92ZWQuCisgICAgICAgICogZG9tL2RvbV9lbGVtZW50aW1wbC5oOiBSZW1vdmVk
LgorICAgICAgICAqIGVkaXRpbmcvQnJlYWtCbG9ja3F1b3RlQ29tbWFuZC5jcHA6CisgICAgICAg
ICogZWRpdGluZy9Db21wb3NpdGVFZGl0Q29tbWFuZC5jcHA6CisgICAgICAgICogZWRpdGluZy9E
ZWxldGVGcm9tVGV4dE5vZGVDb21tYW5kLmNwcDoKKyAgICAgICAgKiBlZGl0aW5nL0RlbGV0ZVNl
bGVjdGlvbkNvbW1hbmQuY3BwOgorICAgICAgICAqIGVkaXRpbmcvSW5zZXJ0TGluZUJyZWFrQ29t
bWFuZC5jcHA6CisgICAgICAgICogZWRpdGluZy9JbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3JDb21t
YW5kLmNwcDoKKyAgICAgICAgKiBlZGl0aW5nL0luc2VydFRleHRDb21tYW5kLmNwcDoKKyAgICAg
ICAgKiBlZGl0aW5nL01lcmdlSWRlbnRpY2FsRWxlbWVudHNDb21tYW5kLmNwcDoKKyAgICAgICAg
KiBlZGl0aW5nL01vZGlmeVNlbGVjdGlvbkxpc3RMZXZlbENvbW1hbmQuY3BwOgorICAgICAgICAq
IGVkaXRpbmcvTW92ZVNlbGVjdGlvbkNvbW1hbmQuY3BwOgorICAgICAgICAqIGVkaXRpbmcvUmVt
b3ZlQ1NTUHJvcGVydHlDb21tYW5kLmNwcDoKKyAgICAgICAgKiBlZGl0aW5nL1JlbW92ZU5vZGVB
dHRyaWJ1dGVDb21tYW5kLmNwcDoKKyAgICAgICAgKiBlZGl0aW5nL1NlbGVjdGlvbi5jcHA6Cisg
ICAgICAgICogZWRpdGluZy9TZWxlY3Rpb25Db250cm9sbGVyLmNwcDoKKyAgICAgICAgKiBlZGl0
aW5nL1NldE5vZGVBdHRyaWJ1dGVDb21tYW5kLmNwcDoKKyAgICAgICAgKiBlZGl0aW5nL1NwbGl0
RWxlbWVudENvbW1hbmQuY3BwOgorICAgICAgICAqIGVkaXRpbmcvU3BsaXRUZXh0Tm9kZUNvbnRh
aW5pbmdFbGVtZW50Q29tbWFuZC5jcHA6CisgICAgICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3Iu
Y3BwOgorICAgICAgICAqIGVkaXRpbmcvVHlwaW5nQ29tbWFuZC5jcHA6CisgICAgICAgICogZWRp
dGluZy9WaXNpYmxlUG9zaXRpb24uY3BwOgorICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0
cy5jcHA6CisgICAgICAgICogaHRtbC9IVE1MRWxlbWVudC5oOgorICAgICAgICAqIGh0bWwvSFRN
TFRva2VuaXplci5oOgorICAgICAgICAqIGh0bWwvaHRtbF9iYXNlaW1wbC5jcHA6CisgICAgICAg
ICoga2NhbnZhcy9SZW5kZXJTVkdJbWFnZS5jcHA6CisgICAgICAgICoga2h0bWwvZWNtYS9ranNf
dmlld3MuY3BwOgorICAgICAgICAqIGtodG1sL2VjbWEva2pzX3dpbmRvdy5jcHA6CisgICAgICAg
IChLSlM6OldpbmRvdzo6Z2V0VmFsdWVQcm9wZXJ0eSk6CisgICAgICAgICoga2h0bWwveGJsL3hi
bF9iaW5kaW5nX21hbmFnZXIuY3BwOgorICAgICAgICAqIGtodG1sL3hibC94YmxfdG9rZW5pemVy
LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9taXNjL1NWR0ltYWdlTG9hZGVyLmNwcDoKKyAgICAgICAg
KiBrc3ZnMi9zdmcvU1ZHQUVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdBbmlt
YXRlVHJhbnNmb3JtRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0FuaW1hdGlv
bkVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdDaXJjbGVFbGVtZW50LmNwcDoK
KyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHQ2xpcFBhdGhFbGVtZW50LmNwcDoKKyAgICAgICAgKiBr
c3ZnMi9zdmcvU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQuY3BwOgorICAgICAg
ICAqIGtzdmcyL3N2Zy9TVkdDdXJzb3JFbGVtZW50LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcv
U1ZHRWxlbWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTVkdFbGVtZW50OjpTVkdFbGVtZW50
KToKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHRWxlbWVudC5oOgorICAgICAgICAqIGtzdmcyL3N2
Zy9TVkdFbGxpcHNlRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0V4dGVybmFs
UmVzb3VyY2VzUmVxdWlyZWQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdGRUJsZW5kRWxl
bWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0ZFQ29sb3JNYXRyaXhFbGVtZW50LmNw
cDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQuY3Bw
OgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdGRUNvbXBvc2l0ZUVsZW1lbnQuY3BwOgorICAgICAg
ICAqIGtzdmcyL3N2Zy9TVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQuY3BwOgorICAgICAgICAq
IGtzdmcyL3N2Zy9TVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQuY3BwOgorICAgICAgICAqIGtz
dmcyL3N2Zy9TVkdGRUZsb29kRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0ZF
R2F1c3NpYW5CbHVyRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0ZFSW1hZ2VF
bGVtZW50LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHRkVMaWdodEVsZW1lbnQuY3BwOgor
ICAgICAgICAqIGtzdmcyL3N2Zy9TVkdGRU1lcmdlRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2
ZzIvc3ZnL1NWR0ZFTWVyZ2VOb2RlRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NW
R0ZFT2Zmc2V0RWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0ZFU3BlY3VsYXJM
aWdodGluZ0VsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdGRVRpbGVFbGVtZW50
LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHRkVUdXJidWxlbmNlRWxlbWVudC5jcHA6Cisg
ICAgICAgICoga3N2ZzIvc3ZnL1NWR0ZpbHRlckVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcy
L3N2Zy9TVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMuY3BwOgorICAgICAgICAq
IGtzdmcyL3N2Zy9TVkdGaXRUb1ZpZXdCb3guY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdH
cmFkaWVudEVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdJbWFnZUVsZW1lbnQu
Y3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdMYW5nU3BhY2UuY3BwOgorICAgICAgICAqIGtz
dmcyL3N2Zy9TVkdMaW5lRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR0xpbmVh
ckdyYWRpZW50RWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR01hcmtlckVsZW1l
bnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdNYXNrRWxlbWVudC5jcHA6CisgICAgICAg
ICoga3N2ZzIvc3ZnL1NWR1BhdGhFbGVtZW50LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZH
UGF0dGVybkVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdQb2x5RWxlbWVudC5j
cHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR1JhZGlhbEdyYWRpZW50RWxlbWVudC5jcHA6Cisg
ICAgICAgICoga3N2ZzIvc3ZnL1NWR1JlY3RFbGVtZW50LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9z
dmcvU1ZHU1ZHRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR1NjcmlwdEVsZW1l
bnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdTdG9wRWxlbWVudC5jcHA6CisgICAgICAg
ICoga3N2ZzIvc3ZnL1NWR1N0eWxlZEVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9T
VkdTdHlsZWRUcmFuc2Zvcm1hYmxlRWxlbWVudC5jcHA6CisgICAgICAgICoga3N2ZzIvc3ZnL1NW
R1N3aXRjaEVsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcyL3N2Zy9TVkdUZXN0cy5jcHA6Cisg
ICAgICAgICoga3N2ZzIvc3ZnL1NWR1RleHRDb250ZW50RWxlbWVudC5jcHA6CisgICAgICAgICog
a3N2ZzIvc3ZnL1NWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQuY3BwOgorICAgICAgICAqIGtzdmcy
L3N2Zy9TVkdUcmFuc2Zvcm1hYmxlLmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHVVJJUmVm
ZXJlbmNlLmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHVXNlRWxlbWVudC5jcHA6CisgICAg
ICAgICoga3N2ZzIvc3ZnL1NWR1ZpZXdFbGVtZW50LmNwcDoKKyAgICAgICAgKiBrc3ZnMi9zdmcv
U1ZHWm9vbUFuZFBhbi5jcHA6CisgICAgICAgICoga3dxL1dlYkNvcmVUZXh0QXJlYS5tbToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9XaWRnZXQuaDoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxv
Y2suY3BwOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJDYW52YXMuY3BwOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJDb250YWluZXIuY3BwOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJPYmplY3QuY3BwOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0RmllbGQuY3BwOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbToKKyAgICAgICAgKiByZW5kZXJp
bmcvYmlkaS5jcHA6CisgICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5jcHA6CisK
KzIwMDYtMDMtMjUgIEVyaWMgU2VpZGVsICA8ZXNlaWRlbEBhcHBsZS5jb20+CisKICAgICAgICAg
UmV2aWV3ZWQgYnkgbWpzLgogCiAgICAgICAgIEZpeCBSZW5kZXJTdHlsZSBjcmVhdGlvbiB0byBh
dm9pZCBmbG9hdGluZyBSZW5kZXJTdHlsZSBvYmplY3RzLgpJbmRleDoga3N2ZzIvc3ZnL1NWR0Zp
bHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIv
c3ZnL1NWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcy5jcHAJKHJldmlzaW9uIDEz
NDc3KQorKysga3N2ZzIvc3ZnL1NWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcy5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2lmIFNWR19TVVBQT1JUCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRl
ICJBdHRyLmgiCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgogCiAjaW5jbHVkZSAi
a3N2Zy5oIgpJbmRleDoga3N2ZzIvc3ZnL1NWR1VSSVJlZmVyZW5jZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0ga3N2ZzIvc3ZnL1NWR1VSSVJlZmVyZW5jZS5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2
ZzIvc3ZnL1NWR1VSSVJlZmVyZW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDcgKzIzLDcg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAogI2luY2x1ZGUgIk5vZGUu
aCIKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAogI2lu
Y2x1ZGUgIlNWR05hbWVzLmgiCiAjaW5jbHVkZSAiWExpbmtOYW1lcy5oIgpJbmRleDoga3N2ZzIv
c3ZnL1NWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBrc3ZnMi9zdmcvU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQuY3BwCShyZXZp
c2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxl
bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDcgQEAKICNpZiBTVkdfU1VQUE9S
VAogI2luY2x1ZGUgPERlcHJlY2F0ZWRTdHJpbmdMaXN0Lmg+CiAKLSNpbmNsdWRlIDxrZG9tL2Nv
cmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAogI2luY2x1ZGUgImtzdmcuaCIKICNpbmNs
dWRlICJTVkdOYW1lcy5oIgpJbmRleDoga3N2ZzIvc3ZnL1NWR0xhbmdTcGFjZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0xhbmdTcGFjZS5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysg
a3N2ZzIvc3ZnL1NWR0xhbmdTcGFjZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDcgKzIzLDcg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAogI2luY2x1ZGUgPGtkb20v
Y29yZS9kb21hdHRycy5oPgotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAi
QXR0ci5oIgogI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKIAogI2luY2x1ZGUgImtzdmcuaCIKSW5k
ZXg6IGtzdmcyL3N2Zy9TVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBrc3ZnMi9zdmcvU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3
KQorKysga3N2ZzIvc3ZnL1NWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQ
UE9SVAotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAj
aW5jbHVkZSAiU1ZHTmFtZXMuaCIKICNpbmNsdWRlICJTVkdIZWxwZXIuaCIKSW5kZXg6IGtzdmcy
L3N2Zy9TVkdGRU1lcmdlRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0ZF
TWVyZ2VFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRkVNZXJn
ZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgU1ZHX1NV
UFBPUlQKICNpbmNsdWRlIDxEZXByZWNhdGVkU3RyaW5nTGlzdC5oPgogCi0jaW5jbHVkZSA8a2Rv
bS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlIDxrY2FudmFzL0tD
YW52YXMuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXNGaWx0ZXJzLmg+CkluZGV4OiBrc3Zn
Mi9zdmcvU1ZHRml0VG9WaWV3Qm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRml0
VG9WaWV3Qm94LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRml0VG9WaWV3
Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2lmIFNWR19TVVBQT1JU
CiAjaW5jbHVkZSA8RGVwcmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29y
ZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKIAog
I2luY2x1ZGUgIlNWR05hbWVzLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHRkVEaXNwbGFjZW1lbnRN
YXBFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRkVEaXNwbGFjZW1lbnRN
YXBFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRkVEaXNwbGFj
ZW1lbnRNYXBFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogI2lm
IFNWR19TVVBQT1JUCiAjaW5jbHVkZSA8RGVwcmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1
ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2Nh
bnZhcy9LQ2FudmFzLmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzRmlsdGVycy5oPgpJbmRl
eDoga3N2ZzIvc3ZnL1NWR1N0eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBrc3ZnMi9zdmcvU1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVsZW1lbnQuY3BwCShyZXZpc2lv
biAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdTdHlsZWRUcmFuc2Zvcm1hYmxlRWxlbWVudC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxxcmVnZXhwLmg+CiAj
aW5jbHVkZSA8RGVwcmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29yZS9B
dHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+
CiAjaW5jbHVkZSA8a2NhbnZhcy9SZW5kZXJQYXRoLmg+CkluZGV4OiBrc3ZnMi9zdmcvU1ZHRmls
dGVyRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0ZpbHRlckVsZW1lbnQu
Y3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdGaWx0ZXJFbGVtZW50LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAj
aWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0
dHIuaCIKIAogI2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhcy5oPgogI2luY2x1ZGUgPGtjYW52YXMv
S0NhbnZhc1Jlc291cmNlcy5oPgpJbmRleDoga3N2ZzIvc3ZnL1NWR0xpbmVFbGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHTGluZUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxMzQ3
NykKKysrIGtzdmcyL3N2Zy9TVkdMaW5lRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIy
LDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2lmIFNWR19TVVBQT1JUCi0jaW5j
bHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlICJT
VkdOYW1lcy5oIgogI2luY2x1ZGUgIlNWR0hlbHBlci5oIgpJbmRleDoga3N2ZzIvc3ZnL1NWR0dy
YWRpZW50RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0dyYWRpZW50RWxl
bWVudC5jcHAJKHJldmlzaW9uIDEzNDc5KQorKysga3N2ZzIvc3ZnL1NWR0dyYWRpZW50RWxlbWVu
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2lmIFNWR19TVVBQT1JUCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNs
dWRlICJBdHRyLmgiCiAjaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rvci5oIgogI2luY2x1ZGUgIkRv
Y3VtZW50LmgiCiAKSW5kZXg6IGtzdmcyL3N2Zy9TVkdFbGxpcHNlRWxlbWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0VsbGlwc2VFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0Nzcp
CisrKyBrc3ZnMi9zdmcvU1ZHRWxsaXBzZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Miw3ICsyMiw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAotI2lu
Y2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSAi
U1ZHTmFtZXMuaCIKICNpbmNsdWRlICJTVkdIZWxwZXIuaCIKSW5kZXg6IGtzdmcyL3N2Zy9TVkdB
bmltYXRlVHJhbnNmb3JtRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0Fu
aW1hdGVUcmFuc2Zvcm1FbGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcv
U1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsy
Miw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAotI2luY2x1ZGUg
PGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2NhbnZh
cy9SZW5kZXJQYXRoLmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzTWF0cml4Lmg+CkluZGV4
OiBrc3ZnMi9zdmcvU1ZHUmVjdEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9T
VkdSZWN0RWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR1JlY3RF
bGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgor
I2luY2x1ZGUgIkF0dHIuaCIKIAogI2luY2x1ZGUgIlNWR05hbWVzLmgiCiAjaW5jbHVkZSAiU1ZH
SGVscGVyLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHRXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQu
Y3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdFeHRlcm5hbFJlc291cmNlc1Jl
cXVpcmVkLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgor
I2luY2x1ZGUgIkF0dHIuaCIKIAogI2luY2x1ZGUgIlNWR05hbWVzLmgiCiAjaW5jbHVkZSAiU1ZH
SGVscGVyLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHVHJhbnNmb3JtYWJsZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga3N2ZzIvc3ZnL1NWR1RyYW5zZm9ybWFibGUuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysr
IGtzdmcyL3N2Zy9TVkdUcmFuc2Zvcm1hYmxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyAr
MjYsNyBAQAogI2luY2x1ZGUgPERlcHJlY2F0ZWRTdHJpbmdMaXN0Lmg+CiAjaW5jbHVkZSA8a3ht
bGNvcmUvUmVmUHRyLmg+CiAKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUg
IkF0dHIuaCIKIAogI2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhcy5oPgogI2luY2x1ZGUgPGtjYW52
YXMvUmVuZGVyUGF0aC5oPgpJbmRleDoga3N2ZzIvc3ZnL1NWR1Rlc3RzLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBrc3ZnMi9zdmcvU1ZHVGVzdHMuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2
Zy9TVkdUZXN0cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRl
ICJTVkdIZWxwZXIuaCIKICNpbmNsdWRlICJTVkdOYW1lcy5oIgogI2luY2x1ZGUgIlNWR1N0cmlu
Z0xpc3QuaCIKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkluZGV4OiBrc3ZnMi9zdmcvU1ZHU3dpdGNoRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR1N3aXRjaEVsZW1lbnQuY3BwCShyZXZp
c2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdTd2l0Y2hFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NV
UFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAog
I2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhc0NyZWF0b3IuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tD
YW52YXNDb250YWluZXIuaD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdDdXJzb3JFbGVtZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHQ3Vyc29yRWxlbWVudC5jcHAJKHJldmlzaW9uIDEz
NDc3KQorKysga3N2ZzIvc3ZnL1NWR0N1cnNvckVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAot
I2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogI2luY2x1ZGUg
IkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRG9jTG9hZGVyLmgiCiAKSW5kZXg6IGtzdmcyL3N2Zy9T
VkdNYXNrRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR01hc2tFbGVtZW50
LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHTWFza0VsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rv
ci5oIgogI2luY2x1ZGUgImtzdmcuaCIKICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXMuaD4KLSNp
bmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCkluZGV4OiBrc3ZnMi9zdmcvU1ZHQUVsZW1lbnQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGtzdmcyL3N2Zy9TVkdBRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIv
c3ZnL1NWR0FFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUv
QXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKICNpbmNsdWRlIDxrZG9tL2V2ZW50cy9Nb3VzZUV2
ZW50Lmg+CiAjaW5jbHVkZSA8a2RvbS9IZWxwZXIuaD4KICNpbmNsdWRlICJkb20yX2V2ZW50c2lt
cGwuaCIKSW5kZXg6IGtzdmcyL3N2Zy9TVkdTY3JpcHRFbGVtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBrc3ZnMi9zdmcvU1ZHU2NyaXB0RWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2
ZzIvc3ZnL1NWR1NjcmlwdEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3
IEBACiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgogLy8jaW5j
bHVkZSA8a2RvbS9lY21hL0VjbWEuaD4KLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2lu
Y2x1ZGUgIkF0dHIuaCIKICNpbmNsdWRlICJTdHJpbmdJbXBsLmgiCiAKICNpbmNsdWRlICJrc3Zn
LmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHUGF0dGVybkVsZW1lbnQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGtzdmcyL3N2Zy9TVkdQYXR0ZXJuRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2
ZzIvc3ZnL1NWR1BhdHRlcm5FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDYsNyArNDYs
NyBAQAogI2luY2x1ZGUgIlNWR1RyYW5zZm9ybWFibGUuaCIKICNpbmNsdWRlICJrc3ZnLmgiCiAj
aW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+Ci0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4K
KyNpbmNsdWRlICJBdHRyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApJbmRleDoga3N2ZzIv
c3ZnL1NWR1RleHRDb250ZW50RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NW
R1RleHRDb250ZW50RWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NW
R1RleHRDb250ZW50RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDcgKzIyLDcgQEAK
IAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2lmIFNWR19TVVBQT1JUCi0jaW5jbHVkZSA8a2RvbS9j
b3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlICJTVkdOYW1lcy5oIgog
I2luY2x1ZGUgIlNWR0hlbHBlci5oIgpJbmRleDoga3N2ZzIvc3ZnL1NWR0ZFTWVyZ2VOb2RlRWxl
bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0ZFTWVyZ2VOb2RlRWxlbWVudC5j
cHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR0ZFTWVyZ2VOb2RlRWxlbWVudC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2lmIFNWR19TVVBQT1JUCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRl
ICJBdHRyLmgiCiAKICNpbmNsdWRlICJTVkdIZWxwZXIuaCIKICNpbmNsdWRlICJTVkdGRU1lcmdl
Tm9kZUVsZW1lbnQuaCIKSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRUltYWdlRWxlbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0ZFSW1hZ2VFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0
NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRkVJbWFnZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKIAot
I2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogI2luY2x1ZGUg
PGtkb20vY2FjaGUvS0RPTUxvYWRlci5oPgogI2luY2x1ZGUgPGtkb20vY2FjaGUvS0RPTUNhY2hl
ZE9iamVjdC5oPgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHUmFk
aWFsR3JhZGllbnRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHUmFkaWFs
R3JhZGllbnRFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHUmFk
aWFsR3JhZGllbnRFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2Nv
cmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAogI2luY2x1ZGUgImtzdmcuaCIKICNpbmNs
dWRlICJTVkdOYW1lcy5oIgpJbmRleDoga3N2ZzIvc3ZnL1NWR1ZpZXdFbGVtZW50LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHVmlld0VsZW1lbnQuY3BwCShyZXZpc2lvbiAxMzQ3NykK
KysrIGtzdmcyL3N2Zy9TVkdWaWV3RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDcg
KzIzLDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAogI2luY2x1ZGUg
IlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRl
ICJBdHRyLmgiCiAjaW5jbHVkZSA8a2RvbS9jb3JlL05hbWVkQXR0ck1hcC5oPgogCiAjaW5jbHVk
ZSAiU1ZHTmFtZXMuaCIKSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRUNvbXBvc2l0ZUVsZW1lbnQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdGRUNvbXBvc2l0ZUVsZW1lbnQuY3BwCShyZXZp
c2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdGRUNvbXBvc2l0ZUVsZW1lbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlIDxE
ZXByZWNhdGVkU3RyaW5nTGlzdC5oPgogCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNp
bmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXMuaD4KICNpbmNsdWRl
IDxrY2FudmFzL0tDYW52YXNSZXNvdXJjZXMuaD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRUZsb29k
RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0ZFRmxvb2RFbGVtZW50LmNw
cAkocmV2aXNpb24gMTM0NzkpCisrKyBrc3ZnMi9zdmcvU1ZHRkVGbG9vZEVsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRl
IDxEZXByZWNhdGVkU3RyaW5nTGlzdC5oPgogCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4K
KyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXMuaD4KICNpbmNs
dWRlIDxrY2FudmFzL0tDYW52YXNGaWx0ZXJzLmg+CkluZGV4OiBrc3ZnMi9zdmcvU1ZHQW5pbWF0
aW9uRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0FuaW1hdGlvbkVsZW1l
bnQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdBbmltYXRpb25FbGVtZW50
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+
CiAKICNpbmNsdWRlIDxrZG9tL2tkb20uaD4KLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgor
I2luY2x1ZGUgIkF0dHIuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUgIkRPTUlt
cGxlbWVudGF0aW9uLmgiCiAjaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgpJbmRleDoga3N2ZzIv
c3ZnL1NWR01hcmtlckVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdNYXJr
ZXJFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHTWFya2VyRWxl
bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJjb25m
aWcuaCIKICNpZiBTVkdfU1VQUE9SVAogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5j
bHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAjaW5jbHVkZSA8a2Rv
bS9jb3JlL05hbWVkQXR0ck1hcC5oPgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+Cklu
ZGV4OiBrc3ZnMi9zdmcvU1ZHU3RvcEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2
Zy9TVkdTdG9wRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR1N0
b3BFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5o
PgorI2luY2x1ZGUgIkF0dHIuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgogCiAjaW5jbHVkZSA8
a2NhbnZhcy9LQ2FudmFzLmg+CkluZGV4OiBrc3ZnMi9zdmcvU1ZHQ2xpcFBhdGhFbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHQ2xpcFBhdGhFbGVtZW50LmNwcAkocmV2aXNp
b24gMTM0NzkpCisrKyBrc3ZnMi9zdmcvU1ZHQ2xpcFBhdGhFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NV
UFBPUlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAog
I2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhcy5oPgogI2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhc1Bh
dGguaD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRVRpbGVFbGVtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBrc3ZnMi9zdmcvU1ZHRkVUaWxlRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2
ZzIvc3ZnL1NWR0ZFVGlsZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3
IEBACiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlIDxEZXByZWNhdGVkU3RyaW5nTGlzdC5oPgog
Ci0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNs
dWRlIDxrY2FudmFzL0tDYW52YXMuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXNGaWx0ZXJz
Lmg+CkluZGV4OiBrc3ZnMi9zdmcvU1ZHRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIv
c3ZnL1NWR0VsZW1lbnQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdFbGVt
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgImtzdmcu
aCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgogI2luY2x1ZGUgPGtkb20vTmFtZXNwYWNl
Lmg+Ci0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAjaW5j
bHVkZSA8a2RvbS9jb3JlL2RvbWF0dHJzLmg+CiAjaW5jbHVkZSA8a2RvbS9ldmVudHMvRXZlbnRM
aXN0ZW5lci5oPgogI2luY2x1ZGUgPGtkb20va2RvbS5oPgpAQCAtNDYsNyArNDYsNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogdXNpbmcgbmFtZXNw
YWNlIEV2ZW50TmFtZXM7CiAKLVNWR0VsZW1lbnQ6OlNWR0VsZW1lbnQoY29uc3QgUXVhbGlmaWVk
TmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYykgOiBYTUxFbGVtZW50KHRhZ05hbWUsIGRvYyks
IG1fY2xvc2VkKGZhbHNlKQorU1ZHRWxlbWVudDo6U1ZHRWxlbWVudChjb25zdCBRdWFsaWZpZWRO
YW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jKSA6IFN0eWxlZEVsZW1lbnQodGFnTmFtZSwgZG9j
KSwgbV9jbG9zZWQoZmFsc2UpCiB7CiB9CiAKSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRVNwZWN1bGFy
TGlnaHRpbmdFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRkVTcGVjdWxh
ckxpZ2h0aW5nRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR0ZF
U3BlY3VsYXJMaWdodGluZ0VsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw3ICsyMyw3
IEBACiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlIDxEZXByZWNhdGVkU3RyaW5nTGlzdC5oPgog
Ci0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNs
dWRlIDxrY2FudmFzL0tDYW52YXMuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXNGaWx0ZXJz
Lmg+CkluZGV4OiBrc3ZnMi9zdmcvU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50LmNwcAkocmV2
aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjEsNyArMjEsNyBAQAogI2lmIFNWR19TVVBQT1JUCiAjaW5j
bHVkZSA8RGVwcmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRy
Lmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+CiAj
aW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzRmlsdGVycy5oPgpJbmRleDoga3N2ZzIvc3ZnL1NWR0xp
bmVhckdyYWRpZW50RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0xpbmVh
ckdyYWRpZW50RWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR0xp
bmVhckdyYWRpZW50RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIyLDcgKzIyLDcgQEAK
IAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2lmIFNWR19TVVBQT1JUCi0jaW5jbHVkZSA8a2RvbS9j
b3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlICJrc3ZnLmgiCiAjaW5j
bHVkZSAiU1ZHTmFtZXMuaCIKSW5kZXg6IGtzdmcyL3N2Zy9TVkdQYXRoRWxlbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR1BhdGhFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0Nzcp
CisrKyBrc3ZnMi9zdmcvU1ZHUGF0aEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3
ICsyMiw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpZiBTVkdfU1VQUE9SVAotI2luY2x1
ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSAia3N2
Zy5oIgogI2luY2x1ZGUgIlNWR05hbWVzLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHU3R5bGVkRWxl
bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR1N0eWxlZEVsZW1lbnQuY3BwCShy
ZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdTdHlsZWRFbGVtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgIlNWR1N0eWxlZEVsZW1lbnQuaCIK
IAogI2luY2x1ZGUgPGtkb20va2RvbS5oPgotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+Cisj
aW5jbHVkZSAiQXR0ci5oIgogI2luY2x1ZGUgPGtkb20vY29yZS9kb21hdHRycy5oPgogI2luY2x1
ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKSW5kZXg6IGtzdmcy
L3N2Zy9TVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2
ZzIvc3ZnL1NWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50LmNwcAkocmV2aXNpb24gMTM0Nzcp
CisrKyBrc3ZnMi9zdmcvU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlIDxEZXBy
ZWNhdGVkU3RyaW5nTGlzdC5oPgogCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNs
dWRlICJBdHRyLmgiCiAKICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXMuaD4KICNpbmNsdWRlIDxr
Y2FudmFzL0tDYW52YXNSZXNvdXJjZXMuaD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRVR1cmJ1bGVu
Y2VFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRkVUdXJidWxlbmNlRWxl
bWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR0ZFVHVyYnVsZW5jZUVs
ZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgU1ZHX1NVUFBP
UlQKICNpbmNsdWRlIDxEZXByZWNhdGVkU3RyaW5nTGlzdC5oPgogCi0jaW5jbHVkZSA8a2RvbS9j
b3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRlIDxrY2FudmFzL0tDYW52
YXMuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXNSZXNvdXJjZXMuaD4KSW5kZXg6IGtzdmcy
L3N2Zy9TVkdab29tQW5kUGFuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHWm9vbUFu
ZFBhbi5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR1pvb21BbmRQYW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsyMiw4IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpZiBTVkdfU1VQUE9SVAotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAi
QXR0ci5oIgorI2luY2x1ZGUgIk1hcHBlZEF0dHJpYnV0ZS5oIgogCiAjaW5jbHVkZSAia3N2Zy5o
IgogI2luY2x1ZGUgIlNWR05hbWVzLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHRkVMaWdodEVsZW1l
bnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdGRUxpZ2h0RWxlbWVudC5jcHAJKHJl
dmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR0ZFTGlnaHRFbGVtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2lmIFNWR19TVVBQT1JUCiAjaW5jbHVkZSA8RGVw
cmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5j
bHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+CiAjaW5jbHVkZSA8
a2NhbnZhcy9LQ2FudmFzUmVzb3VyY2VzLmg+CkluZGV4OiBrc3ZnMi9zdmcvU1ZHUG9seUVsZW1l
bnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdQb2x5RWxlbWVudC5jcHAJKHJldmlz
aW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR1BvbHlFbGVtZW50LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBP
UlQKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKICNpbmNs
dWRlIDxrZG9tL05hbWVzcGFjZS5oPgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAKSW5kZXg6IGtz
dmcyL3N2Zy9TVkdFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0VsZW1lbnQu
aAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRWxlbWVudC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0yNCw4ICsyNCw4IEBACiAjZGVmaW5lIEtTVkdfU1ZHRWxlbWVudEltcGxfSAogI2lm
IFNWR19TVVBQT1JUCiAKKyNpbmNsdWRlICJTdHlsZWRFbGVtZW50LmgiCiAjaW5jbHVkZSAiU1ZH
TmFtZXMuaCIKLSNpbmNsdWRlIDxrZG9tL2NvcmUvWE1MRWxlbWVudC5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAgICAgY2xhc3MgU1ZHTWF0cml4OwpAQCAtMzMsOSArMzMsOCBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgU1ZHU3R5bGVkRWxlbWVudDsKICAgICBjbGFzcyBFY21h
OwogICAgIGNsYXNzIERvY3VtZW50UHRyOwotICAgIHR5cGVkZWYgU3R5bGVkRWxlbWVudCBYTUxF
bGVtZW50OwogCi0gICAgY2xhc3MgU1ZHRWxlbWVudCA6IHB1YmxpYyBYTUxFbGVtZW50CisgICAg
Y2xhc3MgU1ZHRWxlbWVudCA6IHB1YmxpYyBTdHlsZWRFbGVtZW50CiAgICAgewogICAgIHB1Ymxp
YzoKICAgICAgICAgU1ZHRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1
bWVudCAqZG9jKTsKSW5kZXg6IGtzdmcyL3N2Zy9TVkdTVkdFbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBrc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2
ZzIvc3ZnL1NWR1NWR0VsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Nyw3ICs1Nyw3IEBA
CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzTWF0cml4Lmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9S
ZW5kZXJQYXRoLmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9kZXZpY2UvS1JlbmRlcmluZ0RldmljZS5o
PgotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogI2luY2x1
ZGUgPGtkb20vY29yZS9OYW1lZEF0dHJNYXAuaD4KICNpbmNsdWRlIDxxdGV4dHN0cmVhbS5oPgog
CkluZGV4OiBrc3ZnMi9zdmcvU1ZHQ2lyY2xlRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2
ZzIvc3ZnL1NWR0NpcmNsZUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2
Zy9TVkdDaXJjbGVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlIDxrZG9tL2Nv
cmUvQXR0ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAogI2luY2x1ZGUgIlNWR05hbWVzLmgiCiAj
aW5jbHVkZSAiU1ZHSGVscGVyLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHRkVDb2xvck1hdHJpeEVs
ZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdGRUNvbG9yTWF0cml4RWxlbWVu
dC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NWR0ZFQ29sb3JNYXRyaXhFbGVt
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2lmIFNWR19TVVBQT1JU
CiAjaW5jbHVkZSA8RGVwcmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29y
ZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFz
Lmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzUmVzb3VyY2VzLmg+CkluZGV4OiBrc3ZnMi9z
dmcvU1ZHSW1hZ2VFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHSW1hZ2VF
bGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHSW1hZ2VFbGVtZW50
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2lmIFNWR19TVVBQT1JUCiAKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1
ZGUgIkF0dHIuaCIKICNpbmNsdWRlIDxrZG9tL2NvcmUvRE9NQ29uZmlndXJhdGlvbi5oPgogI2lu
Y2x1ZGUgPGtkb20vcGFyc2VyL0tET01QYXJzZXIuaD4KIApJbmRleDoga3N2ZzIvc3ZnL1NWR0ZF
QmxlbmRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRkVCbGVuZEVsZW1l
bnQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdGRUJsZW5kRWxlbWVudC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDcgQEAKICNpZiBTVkdfU1VQUE9SVAogI2lu
Y2x1ZGUgPERlcHJlY2F0ZWRTdHJpbmdMaXN0Lmg+CiAKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0
ci5oPgorI2luY2x1ZGUgIkF0dHIuaCIKIAogI2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhcy5oPgog
I2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhc0ZpbHRlcnMuaD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdG
RUdhdXNzaWFuQmx1ckVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdGRUdh
dXNzaWFuQmx1ckVsZW1lbnQuY3BwCShyZXZpc2lvbiAxMzQ3NykKKysrIGtzdmcyL3N2Zy9TVkdG
RUdhdXNzaWFuQmx1ckVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBA
CiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlIDxEZXByZWNhdGVkU3RyaW5nTGlzdC5oPgogCi0j
aW5jbHVkZSA8a2RvbS9jb3JlL0F0dHIuaD4KKyNpbmNsdWRlICJBdHRyLmgiCiAKICNpbmNsdWRl
IDxrY2FudmFzL0tDYW52YXMuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXNSZXNvdXJjZXMu
aD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdVc2VFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3Zn
Mi9zdmcvU1ZHVXNlRWxlbWVudC5jcHAJKHJldmlzaW9uIDEzNDc3KQorKysga3N2ZzIvc3ZnL1NW
R1VzZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlIDxrZG9tL05hbWVzcGFjZS5o
PgotI2luY2x1ZGUgPGtkb20vY29yZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5j
bHVkZSAia3N2Zy5oIgogI2luY2x1ZGUgIlNWR05hbWVzLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZH
RkVPZmZzZXRFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRkVPZmZzZXRF
bGVtZW50LmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9zdmcvU1ZHRkVPZmZzZXRFbGVt
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2lmIFNWR19TVVBQT1JU
CiAjaW5jbHVkZSA8RGVwcmVjYXRlZFN0cmluZ0xpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29y
ZS9BdHRyLmg+CisjaW5jbHVkZSAiQXR0ci5oIgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFz
Lmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzUmVzb3VyY2VzLmg+CkluZGV4OiBrc3ZnMi9t
aXNjL1NWR0ltYWdlTG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9taXNjL1NWR0ltYWdl
TG9hZGVyLmNwcAkocmV2aXNpb24gMTM0NzcpCisrKyBrc3ZnMi9taXNjL1NWR0ltYWdlTG9hZGVy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2lmIFNWR19TVVBQT1JUCiAKLSNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ci5oPgorI2luY2x1
ZGUgIkF0dHIuaCIKICNpbmNsdWRlIDxrZG9tL2NhY2hlL0tET01Mb2FkZXIuaD4KICNpbmNsdWRl
ICJEb2NMb2FkZXIuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgpJbmRleDogRm9yd2FyZGluZ0hl
YWRlcnMva2RvbS9jb3JlL0VsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBGb3J3YXJkaW5nSGVhZGVy
cy9rZG9tL2NvcmUvRWxlbWVudC5oCShyZXZpc2lvbiAxMzQ3NykKKysrIEZvcndhcmRpbmdIZWFk
ZXJzL2tkb20vY29yZS9FbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTEgKzAsMCBAQAotI2lu
Y2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgpJbmRleDogRm9yd2FyZGluZ0hlYWRlcnMva2RvbS9j
b3JlL0F0dHIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBGb3J3YXJkaW5nSGVhZGVycy9rZG9tL2NvcmUvQXR0
ci5oCShyZXZpc2lvbiAxMzQ3NykKKysrIEZvcndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9BdHRy
LmgJKHdvcmtpbmcgY29weSkKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1w
bC5oIgpJbmRleDogRm9yd2FyZGluZ0hlYWRlcnMva2RvbS9jb3JlL1hNTEVsZW1lbnQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBGb3J3YXJkaW5nSGVhZGVycy9rZG9tL2NvcmUvWE1MRWxlbWVudC5oCShyZXZp
c2lvbiAxMzQ3NykKKysrIEZvcndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9YTUxFbGVtZW50LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5o
IgpJbmRleDoga3dxL1dlYkNvcmVUZXh0QXJlYS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrd3EvV2ViQ29y
ZVRleHRBcmVhLm1tCShyZXZpc2lvbiAxMzQ3NykKKysrIGt3cS9XZWJDb3JlVGV4dEFyZWEubW0J
KHdvcmtpbmcgY29weSkKQEAgLTI5LDExICsyOSwxMSBAQAogI2ltcG9ydCAiRE9NQ1NTLmgiCiAj
aW1wb3J0ICJET01IVE1MLmgiCiAjaW1wb3J0ICJFdmVudE5hbWVzLmgiCisjaW1wb3J0ICJFbGVt
ZW50LmgiCiAjaW1wb3J0ICJLV1FLSFRNTFNldHRpbmdzLmgiCiAjaW1wb3J0ICJLV1FUZXh0RWRp
dC5oIgogI2ltcG9ydCAiRnJhbWVNYWMuaCIKICNpbXBvcnQgIldlYkNvcmVGcmFtZUJyaWRnZS5o
IgotI2ltcG9ydCAiZG9tX2VsZW1lbnRpbXBsLmgiCiAjaW1wb3J0ICJyZW5kZXJfcmVwbGFjZWQu
aCIKICNpbXBvcnQgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KIAo=
</data>
<flag name="review"
          id="1942"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
      

    </bug>

</bugzilla>