<?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>8889</bug_id>
          
          <creation_ts>2006-05-13 10:36:05 -0700</creation_ts>
          <short_desc>Split render_form.* into separate files (one class per file).</short_desc>
          <delta_ts>2006-05-15 12:45:56 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore 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="Sam Weinig">sam</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>adele</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>42210</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2006-05-13 10:36:05 -0700</bug_when>
    <thetext>will split for food</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42212</commentid>
    <comment_count>1</comment_count>
      <attachid>8284</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2006-05-13 10:39:51 -0700</bug_when>
    <thetext>Created attachment 8284
patch

I don&apos;t know how helpfull this will be, but this is the patch created by a svn-create patch after finishing the split and clean up.  I don&apos;t think it contains any of the svn copy info though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42213</commentid>
    <comment_count>2</comment_count>
      <attachid>8285</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2006-05-13 10:42:11 -0700</bug_when>
    <thetext>Created attachment 8285
folder with all the new files in it

I am also uploading all the files in their non diffed glory so that if they are need they are available.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42217</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-13 11:52:20 -0700</bug_when>
    <thetext>Thanks!  I&apos;ll give it a whirl come monday.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42381</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-15 10:42:43 -0700</bug_when>
    <thetext>Assuming adele isn&apos;t in the middle of a big render_form patch, I&apos;ll land this this afternoon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42390</commentid>
    <comment_count>5</comment_count>
      <attachid>8284</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-15 12:45:45 -0700</bug_when>
    <thetext>Comment on attachment 8284
patch

edited a bit and landed.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>8284</attachid>
            <date>2006-05-13 10:39:51 -0700</date>
            <delta_ts>2006-05-15 12:45:45 -0700</delta_ts>
            <desc>patch</desc>
            <filename>renderformsplit.diff</filename>
            <type>text/plain</type>
            <size>472237</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkNvcmVUZXh0RmllbGQubW0KPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViQ29yZVRleHRGaWVsZC5tbQkocmV2aXNpb24g
MTQzNDIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJDb3JlVGV4dEZpZWxkLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNiwxMiArMjYsMTIgQEAKICNpbXBvcnQgImNvbmZpZy5oIgogI2ltcG9y
dCAiV2ViQ29yZVRleHRGaWVsZC5oIgogCi0jaW1wb3J0ICJLV1FMaW5lRWRpdC5oIgogI2ltcG9y
dCAiRnJhbWVNYWMuaCIKICNpbXBvcnQgIktXUUtIVE1MU2V0dGluZ3MuaCIKKyNpbXBvcnQgIktX
UUxpbmVFZGl0LmgiIAogI2ltcG9ydCAiV2ViQ29yZUZyYW1lQnJpZGdlLmgiCiAjaW1wb3J0ICJX
ZWJDb3JlV2lkZ2V0SG9sZGVyLmgiCi0jaW1wb3J0ICJyZW5kZXJfZm9ybS5oIgorI2ltcG9ydCAi
V2lkZ2V0Q2xpZW50LmgiCiAjaW1wb3J0IDx3dGYvQXNzZXJ0aW9ucy5oPgogCiB1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MT2JqZWN0RWxlbWVudC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxPYmplY3RFbGVtZW50LmNwcAkocmV2aXNp
b24gMTQzNDIpCisrKyBXZWJDb3JlL2h0bWwvSFRNTE9iamVjdEVsZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yNiw4ICsyNiw4IEBACiAKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnQuaCIKICNpbmNsdWRlICJI
VE1MRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnQuaCIKICNpbmNsdWRlICJI
VE1MTmFtZXMuaCIKICNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgogI2luY2x1ZGUgIlJlbmRlclBh
cnRPYmplY3QuaCIKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MTGFiZWxFbGVtZW50LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvSFRNTExhYmVsRWxlbWVudC5jcHAJKHJldmlzaW9uIDE0
MzQyKQorKysgV2ViQ29yZS9odG1sL0hUTUxMYWJlbEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yNiwxOSArMjYsMTcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkhU
TUxMYWJlbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnQuaCIKIAotI2luY2x1
ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5oIgorI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5o
IgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKICNpbmNs
dWRlICJEb2N1bWVudC5oIgogCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLXVzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOjpIVE1MTmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTo6RXZlbnRO
YW1lczsKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVz
OwordXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CisKIEhUTUxMYWJlbEVsZW1lbnQ6OkhUTUxM
YWJlbEVsZW1lbnQoRG9jdW1lbnQgKmRvYykKICAgICA6IEhUTUxFbGVtZW50KGxhYmVsVGFnLCBk
b2MpCiB7CkluZGV4OiBXZWJDb3JlL2h0bWwvSFRNTEZpZWxkU2V0RWxlbWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxGaWVsZFNldEVsZW1lbnQuY3BwCShyZXZpc2lvbiAx
NDM0MikKKysrIFdlYkNvcmUvaHRtbC9IVE1MRmllbGRTZXRFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjcsOCArMjcsOCBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkhU
TUxGaWVsZFNldEVsZW1lbnQuaCIKIAotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5o
IgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlJlbmRlckZpZWxkc2V0LmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIApJbmRleDogV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1l
bnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcAko
cmV2aXNpb24gMTQzNDIpCisrKyBXZWJDb3JlL2h0bWwvSFRNTElucHV0RWxlbWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM2LDEzICszNiwxNyBAQAogI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVu
dC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3Mu
aCIKKyNpbmNsdWRlICJSZW5kZXJCdXR0b24uaCIKKyNpbmNsdWRlICJSZW5kZXJGaWxlQnV0dG9u
LmgiCisjaW5jbHVkZSAiUmVuZGVySW1hZ2VCdXR0b24uaCIKKyNpbmNsdWRlICJSZW5kZXJMaW5l
RWRpdC5oIgorI2luY2x1ZGUgIlJlbmRlclNsaWRlci5oIgogI2luY2x1ZGUgIlJlbmRlclRleHQu
aCIKICNpbmNsdWRlICJSZW5kZXJUZXh0RmllbGQuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0Rmll
bGQuaCIKICNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgogI2luY2x1ZGUgIlNlbGVjdGlvbkNvbnRy
b2xsZXIuaCIKICNpbmNsdWRlICJodG1sX2ltYWdlaW1wbC5oIgotI2luY2x1ZGUgIlJlbmRlckJ1
dHRvbi5oIgotI2luY2x1ZGUgInJlbmRlcl9mb3JtLmgiCiAjaW5jbHVkZSA8dW5pY29kZS91YnJr
Lmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CkluZGV4OiBXZWJDb3JlL2h0bWwvSFRNTE9wdGlv
bkVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9IVE1MT3B0aW9uRWxlbWVu
dC5jcHAJKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9odG1sL0hUTUxPcHRpb25FbGVtZW50
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgIkV4Y2VwdGlv
bkNvZGUuaCIKICNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgogI2luY2x1ZGUgIlRleHQu
aCIKLSNpbmNsdWRlICJyZW5kZXJfZm9ybS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKSW5k
ZXg6IFdlYkNvcmUvaHRtbC9IVE1MVGV4dEFyZWFFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2h0bWwvSFRNTFRleHRBcmVhRWxlbWVudC5jcHAJKHJldmlzaW9uIDE0MzQyKQorKysg
V2ViQ29yZS9odG1sL0hUTUxUZXh0QXJlYUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NiwxMyArMjYsMTMgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkhUTUxUZXh0
QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaCIKLSNpbmNs
dWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiRm9ybURhdGFMaXN0LmgiCi0jaW5jbHVkZSAiRG9jdW1l
bnQuaCIKIAorI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgor
I2luY2x1ZGUgIkZvcm1EYXRhTGlzdC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1
ZGUgIlJlbmRlclRleHRBcmVhLmgiCisjaW5jbHVkZSAiVGV4dC5oIgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MU2VsZWN0RWxlbWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9odG1sL0hUTUxTZWxlY3RFbGVtZW50LmNwcAkocmV2aXNpb24gMTQz
NDIpCisrKyBXZWJDb3JlL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0yNywxNiArMjcsMTYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJIVE1M
U2VsZWN0RWxlbWVudC5oIgogCisjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgogI2luY2x1
ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgogI2luY2x1ZGUgIkZvcm1E
YXRhTGlzdC5oIgogI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxP
cHRpb25FbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmgiCi0jaW5j
bHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgorI2luY2x1ZGUgIlJlbmRlclNlbGVjdC5oIgogI2lu
Y2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKICNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIK
LSNpbmNsdWRlICJyZW5kZXJfZm9ybS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKSW5kZXg6
IFdlYkNvcmUvaHRtbC9IVE1MTGVnZW5kRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9odG1sL0hUTUxMZWdlbmRFbGVtZW50LmNwcAkocmV2aXNpb24gMTQzNDIpCisrKyBXZWJDb3Jl
L2h0bWwvSFRNTExlZ2VuZEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw4ICsyNyw4
IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiSFRNTExlZ2VuZEVsZW1lbnQuaCIK
IAotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5oIgogI2luY2x1ZGUgIkhUTUxOYW1l
cy5oIgorI2luY2x1ZGUgIlJlbmRlckxlZ2VuZC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
SW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1MRm9ybUVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvaHRtbC9IVE1MRm9ybUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNDM0MikKKysrIFdlYkNv
cmUvaHRtbC9IVE1MRm9ybUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw5ICszNCw5
IEBACiAjaW5jbHVkZSAiSFRNTEZvcm1Db2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiSFRNTElucHV0
RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlJlbmRlckxpbmVF
ZGl0LmgiCiAjaW5jbHVkZSAiY3NzaGVscGVyLmgiCiAjaW5jbHVkZSAiaHRtbF9pbWFnZWltcGwu
aCIKLSNpbmNsdWRlICJyZW5kZXJfZm9ybS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKSW5k
ZXg6IFdlYkNvcmUvaHRtbC9IVE1MQnV0dG9uRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9odG1sL0hUTUxCdXR0b25FbGVtZW50LmNwcAkocmV2aXNpb24gMTQzNDIpCisrKyBXZWJD
b3JlL2h0bWwvSFRNTEJ1dHRvbkVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwxNSAr
MjYsMTMgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkhUTUxCdXR0b25FbGVt
ZW50LmgiCi0jaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50LmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVu
dHNpbXBsLmgiCi0jaW5jbHVkZSAiRm9ybURhdGFMaXN0LmgiCi0KLSNpbmNsdWRlICJyZW5kZXJp
bmcvcmVuZGVyX2Zvcm0uaCIKLSNpbmNsdWRlICJSZW5kZXJCdXR0b24uaCIKIAogI2luY2x1ZGUg
IkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGb3JtRGF0YUxpc3QuaCIKKyNpbmNsdWRlICJIVE1M
Rm9ybUVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJSZW5kZXJC
dXR0b24uaCIKKyNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMZWdlbmQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMZWdlbmQuaAkocmV2aXNpb24gMTQzNDIpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMZWdlbmQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMs
Mjg2ICsyMywyMiBAQAogICoKICAqLwogCi0jaWZuZGVmIFJFTkRFUl9GT1JNX0gKLSNkZWZpbmUg
UkVOREVSX0ZPUk1fSAorI2lmbmRlZiBSZW5kZXJMZWdlbmRfaAorI2RlZmluZSBSZW5kZXJMZWdl
bmRfaAogCi0jaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NUeXBl
cy5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCi0jaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIK
LQotY2xhc3MgUUxpc3RCb3g7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRG9jTG9h
ZGVyOwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotY2xhc3MgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Ci1jbGFzcyBIVE1MU2VsZWN0RWxlbWVudDsKLWNs
YXNzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
UmVuZGVyRm9ybUVsZW1lbnQgOiBwdWJsaWMgUmVuZGVyV2lkZ2V0Ci17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCogbm9kZSk7Ci0gICAgdmly
dHVhbCB+UmVuZGVyRm9ybUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVu
ZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGb3JtIjsgfQotCi0gICAgdmlydHVhbCBi
b29sIGlzRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBBcXVh
IGZvcm0gY29udHJvbHMgbmV2ZXIgaGF2ZSBib3JkZXIvcGFkZGluZy4KLSAgICBpbnQgYm9yZGVy
VG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBib3JkZXJCb3R0b20oKSBjb25zdCB7
IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckxlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0g
ICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5n
VG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nQm90dG9tKCkgY29uc3Qg
eyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nTGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0K
LSAgICBpbnQgcGFkZGluZ1JpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgLy8gQXF1
YSBjb250cm9scyB1c2UgaW50cmluc2ljIG1hcmdpbiB2YWx1ZXMgaW4gb3JkZXIgdG8gbGVhdmUg
c3BhY2UgZm9yIGZvY3VzIHJpbmdzCi0gICAgLy8gYW5kIHRvIGtlZXAgY29udHJvbHMgZnJvbSBi
dXR0aW5nIHVwIGFnYWluc3Qgb25lIGFub3RoZXIuICBUaGlzIGludHJpbnNpYyBtYXJnaW4KLSAg
ICAvLyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIFdlYiBwYWdlIGFsbG93cyB0aGUgY29udHJvbCB0
byBzaXplIGludHJpbnNpY2FsbHkuICBJZiB0aGUKLSAgICAvLyBXZWIgcGFnZSBzcGVjaWZpZXMg
YW4gZXhwbGljaXQgd2lkdGggZm9yIGEgY29udHJvbCwgdGhlbiB3ZSBnbyBhaGVhZCBhbmQgaG9u
b3IgdGhhdAotICAgIC8vIHByZWNpc2Ugd2lkdGguICBTaW1pbGFybHksIGlmIGEgV2ViIHBhZ2Ug
dXNlcyBhIHNwZWNpZmljIG1hcmdpbiB2YWx1ZSwgd2Ugd2lsbCBnbyBhaGVhZAotICAgIC8vIGFu
ZCBob25vciB0aGF0IHZhbHVlLiAgCi0gICAgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zSWZBbGxv
d2VkKFJlbmRlclN0eWxlKiBfc3R5bGUpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmlu
c2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgaW50IGludHJpbnNpY01h
cmdpbigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShS
ZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9z
aXRpb24oIGJvb2wsIGJvb2wgKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQg
Y2xpY2tlZChXaWRnZXQqKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRh
YmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIEhvcml6b250YWxBbGlnbm1lbnQg
dGV4dEFsaWdubWVudCgpIGNvbnN0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBSZW5kZXJJbWFnZUJ1dHRvbiA6IHB1YmxpYyBSZW5kZXJJbWFnZQotewotcHVibGljOgotICAg
IFJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgY29u
c3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJJbWFnZUJ1dHRvbiI7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZUJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyTGluZUVkaXQgOiBw
dWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJMaW5lRWRpdChI
VE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7
Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0hl
aWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1l
KCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxpbmVFZGl0IjsgfQotICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHls
ZSAqKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQo
KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblN0YXJ0KGludCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rp
b25FbmQoaW50KTsKLSAgICAKLSAgICBib29sIGlzRWRpdGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRFZGl0ZWQoYm9vbCk7Ci0gICAgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50
LCBpbnQpOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhZGRTZWFyY2hSZXN1bHQoKTsKLQotcHJpdmF0
ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25D
aGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtU2VhcmNoKFdpZGdldCop
OwotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
Ci0KLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIFJlbmRlckZpZWxkc2V0IDogcHVibGljIFJlbmRlckJsb2NrCi17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCopOwotCi0gICAgdmlydHVhbCBj
b25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZpZWxkU2V0Ijsg
fQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91dExlZ2VuZChib29sIHJlbGF5b3V0
Q2hpbGRyZW4pOwotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7Ci0g
ICAgCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25zKFBhaW50
SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2b2lkIHBhaW50Qm9yZGVyTWludXNMZWdlbmQo
R3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgY29uc3QgUmVu
ZGVyU3R5bGUgKiwgaW50IGx4LCBpbnQgbHcpOwotICAgIFJlbmRlck9iamVjdCogZmluZExlZ2Vu
ZCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJGaWxlQnV0dG9u
IDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRmlsZUJ1
dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRl
ck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmlsZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFs
IHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci0gICAgdm9pZCBzZWxlY3QoKTsKLQotICAgIGludCBjYWxjUmVwbGFjZWRIZWlnaHQo
KSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgfQotCi0gICAgdm9pZCBjbGljayhi
b29sIHNlbmRNb3VzZUV2ZW50cyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNF
ZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFs
IHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFu
Z2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJM
YWJlbCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlckxh
YmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpOwotCi0gICAgdmlydHVhbCBjb25z
dCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxhYmVsIjsgfQotfTsK
LQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckxlZ2VuZCA6IHB1YmxpYyBS
ZW5kZXJCbG9jawotewotcHVibGljOgotICAgIFJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50ICplbGVtZW50KTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgp
IGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMZWdlbmQiOyB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIFJlbmRlclNlbGVjdCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewot
cHVibGljOgotICAgIFJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVudCopOwotCi0gICAgdmly
dHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclNlbGVj
dCI7IH0KLQotICAgIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBiICkgY29u
c3Q7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgaWYgKCFtX3VzZUxpc3RC
b3gpIHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgcmV0dXJuIFJlbmRlckZvcm1FbGVtZW50Ojpj
YWxjUmVwbGFjZWRIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2lj
TWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBjYWxj
TWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0KLSAgICB2b2lkIHNl
dE9wdGlvbnNDaGFuZ2VkKGJvb2wgX29wdGlvbnNDaGFuZ2VkKTsKLQotICAgIGJvb2wgc2VsZWN0
aW9uQ2hhbmdlZCgpIHsgcmV0dXJuIG1fc2VsZWN0aW9uQ2hhbmdlZDsgfQotICAgIHZvaWQgc2V0
U2VsZWN0aW9uQ2hhbmdlZChib29sIF9zZWxlY3Rpb25DaGFuZ2VkKSB7IG1fc2VsZWN0aW9uQ2hh
bmdlZCA9IF9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21F
bGVtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0g
ICAgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKTsKLQotcHJvdGVjdGVkOgotICAgIFFMaXN0Qm94ICpj
cmVhdGVMaXN0Qm94KCk7Ci0gICAgdm9pZCBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci0K
LSAgICB1bnNpZ25lZCAgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0aXBsZTsKLSAgICBib29sIG1f
dXNlTGlzdEJveDsKLSAgICBib29sIG1fc2VsZWN0aW9uQ2hhbmdlZDsKLSAgICBib29sIG1faWdu
b3JlU2VsZWN0RXZlbnRzOwotICAgIGJvb2wgbV9vcHRpb25zQ2hhbmdlZDsKLQotcHJpdmF0ZToK
LSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9p
ZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBSZW5kZXJUZXh0QXJlYSA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVi
bGljOgotICAgIFJlbmRlclRleHRBcmVhKEhUTUxUZXh0QXJlYUVsZW1lbnQqKTsKLQotICAgIHZp
cnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5h
bWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGV4dEFyZWEiOyB9Ci0gICAgdmlydHVhbCB2b2lk
IGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgp
OwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGJvb2wg
aXNUZXh0QXJlYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIGlzRWRpdGVkKCkg
Y29uc3QgeyByZXR1cm4gbV9kaXJ0eTsgfQotICAgIHZvaWQgc2V0RWRpdGVkIChib29sKTsKLSAg
ICAKLSAgICBTdHJpbmcgdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0V2l0aEhhcmRMaW5lQnJlYWtz
KCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5kKCk7
Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9u
RW5kKGludCk7Ci0gICAgCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlv
blJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNp
Y01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVh
bCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9u
Q2hhbmdlZChXaWRnZXQqKTsKLSAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNF
ZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJvb2wgbV9kaXJ0eTsKLSAg
ICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgY2xhc3Mg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudDsKIAotY2xhc3MgUmVuZGVyU2xpZGVyIDogcHVibGljIFJl
bmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyU2xpZGVyKEhUTUxJbnB1dEVs
ZW1lbnQqKTsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25z
dCB7IHJldHVybiAiUmVuZGVyU2xpZGVyIjsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50
cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
Y2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7
CisgICAgY2xhc3MgUmVuZGVyTGVnZW5kIDogcHVibGljIFJlbmRlckJsb2NrIHsKKyAgICBwdWJs
aWM6CisgICAgICAgIFJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kik7CiAKLXBy
aXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLX07CisgICAg
ICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5k
ZXJMZWdlbmQiOyB9CisgICAgfTsKIAotfSAvL25hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQogCi0jZW5kaWYKKyNlbmRpZiAvLyBSZW5kZXJMZWdlbmRfaApJbmRleDogV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyRmllbGRzZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJGaWVsZHNldC5oCShyZXZpc2lvbiAxNDM0MikKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckZpZWxkc2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTIzLDI4NiArMjMsMzEgQEAKICAq
CiAgKi8KIAotI2lmbmRlZiBSRU5ERVJfRk9STV9ICi0jZGVmaW5lIFJFTkRFUl9GT1JNX0gKKyNp
Zm5kZWYgUmVuZGVyRmllbGRzZXRfaAorI2RlZmluZSBSZW5kZXJGaWVsZHNldF9oCiAKLSNpbmNs
dWRlICJSZW5kZXJXaWRnZXQuaCIKLSNpbmNsdWRlICJHcmFwaGljc1R5cGVzLmgiCiAjaW5jbHVk
ZSAiUmVuZGVyQmxvY2suaCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotCi1jbGFzcyBRTGlz
dEJveDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBEb2NMb2FkZXI7Ci1jbGFzcyBI
VE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50OwotY2xhc3MgSFRN
TElucHV0RWxlbWVudDsKLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50OwotY2xhc3MgSFRNTFRleHRB
cmVhRWxlbWVudDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJGb3JtRWxl
bWVudCA6IHB1YmxpYyBSZW5kZXJXaWRnZXQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJGb3JtRWxl
bWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50KiBub2RlKTsKLSAgICB2aXJ0dWFsIH5SZW5kZXJG
b3JtRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29u
c3QgeyByZXR1cm4gIlJlbmRlckZvcm0iOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb3JtRWxl
bWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIC8vIEFxdWEgZm9ybSBjb250cm9s
cyBuZXZlciBoYXZlIGJvcmRlci9wYWRkaW5nLgotICAgIGludCBib3JkZXJUb3AoKSBjb25zdCB7
IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0K
LSAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgYm9yZGVy
UmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IHBhZGRpbmdUb3AoKSBjb25zdCB7
IHJldHVybiAwOyB9Ci0gICAgaW50IHBhZGRpbmdCb3R0b20oKSBjb25zdCB7IHJldHVybiAwOyB9
Ci0gICAgaW50IHBhZGRpbmdMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRk
aW5nUmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICAvLyBBcXVhIGNvbnRyb2xzIHVz
ZSBpbnRyaW5zaWMgbWFyZ2luIHZhbHVlcyBpbiBvcmRlciB0byBsZWF2ZSBzcGFjZSBmb3IgZm9j
dXMgcmluZ3MKLSAgICAvLyBhbmQgdG8ga2VlcCBjb250cm9scyBmcm9tIGJ1dHRpbmcgdXAgYWdh
aW5zdCBvbmUgYW5vdGhlci4gIFRoaXMgaW50cmluc2ljIG1hcmdpbgotICAgIC8vIGlzIG9ubHkg
YXBwbGllZCBpZiB0aGUgV2ViIHBhZ2UgYWxsb3dzIHRoZSBjb250cm9sIHRvIHNpemUgaW50cmlu
c2ljYWxseS4gIElmIHRoZQotICAgIC8vIFdlYiBwYWdlIHNwZWNpZmllcyBhbiBleHBsaWNpdCB3
aWR0aCBmb3IgYSBjb250cm9sLCB0aGVuIHdlIGdvIGFoZWFkIGFuZCBob25vciB0aGF0Ci0gICAg
Ly8gcHJlY2lzZSB3aWR0aC4gIFNpbWlsYXJseSwgaWYgYSBXZWIgcGFnZSB1c2VzIGEgc3BlY2lm
aWMgbWFyZ2luIHZhbHVlLCB3ZSB3aWxsIGdvIGFoZWFkCi0gICAgLy8gYW5kIGhvbm9yIHRoYXQg
dmFsdWUuICAKLSAgICB2b2lkIGFkZEludHJpbnNpY01hcmdpbnNJZkFsbG93ZWQoUmVuZGVyU3R5
bGUqIF9zdHlsZSk7Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICBpbnQgaW50cmluc2ljTWFyZ2luKCkgY29uc3Qg
eyByZXR1cm4gMjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICop
OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCB2
b2lkIGxheW91dCgpOwotICAgIHZpcnR1YWwgc2hvcnQgYmFzZWxpbmVQb3NpdGlvbiggYm9vbCwg
Ym9vbCApIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBjbGlja2VkKFdpZGdl
dCopOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQotCi0gICAgSG9yaXpvbnRhbEFsaWdubWVudCB0ZXh0QWxpZ25tZW50
KCkgY29uc3Q7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckltYWdl
QnV0dG9uIDogcHVibGljIFJlbmRlckltYWdlCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVySW1hZ2VC
dXR0b24oSFRNTElucHV0RWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5k
ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckltYWdlQnV0dG9uIjsgfQotICAgIHZpcnR1
YWwgYm9vbCBpc0ltYWdlQnV0dG9uKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotfTsKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJMaW5lRWRpdCA6IHB1YmxpYyBSZW5kZXJG
b3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlckxpbmVFZGl0KEhUTUxJbnB1dEVsZW1l
bnQqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICBpbnQgY2Fs
Y1JlcGxhY2VkSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaW50cmluc2ljSGVpZ2h0KCk7IH0KLSAg
ICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0
cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJl
dHVybiAiUmVuZGVyTGluZUVkaXQiOyB9Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0gICAg
aW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgpOwotICAgIHZvaWQg
c2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOwot
ICAgIAotICAgIGJvb2wgaXNFZGl0ZWQoKSBjb25zdDsKLSAgICB2b2lkIHNldEVkaXRlZChib29s
KTsKLSAgICBib29sIGlzVGV4dEZpZWxkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZv
aWQgc2VsZWN0KCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25SYW5nZShpbnQsIGludCk7Ci0KLXB1
YmxpYzoKLSAgICB2b2lkIGFkZFNlYXJjaFJlc3VsdCgpOwotCi1wcml2YXRlOgotICAgIHZpcnR1
YWwgdm9pZCByZXR1cm5QcmVzc2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNo
YW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0
Kik7Ci0gICAgdmlydHVhbCB2b2lkIHBlcmZvcm1TZWFyY2goV2lkZ2V0Kik7Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJvb2wg
bV91cGRhdGluZzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyRmll
bGRzZXQgOiBwdWJsaWMgUmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJGaWVsZHNl
dChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJl
bmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmllbGRTZXQiOyB9Ci0KLSAgICB2aXJ0
dWFsIFJlbmRlck9iamVjdCogbGF5b3V0TGVnZW5kKGJvb2wgcmVsYXlvdXRDaGlsZHJlbik7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUqKTsKLSAgICAKLXByaXZhdGU6
Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiwgaW50IHR4
LCBpbnQgdHkpOwotICAgIHZvaWQgcGFpbnRCb3JkZXJNaW51c0xlZ2VuZChHcmFwaGljc0NvbnRl
eHQqLCBpbnQgdHgsIGludCB0eSwgaW50IHcsIGludCBoLCBjb25zdCBSZW5kZXJTdHlsZSAqLCBp
bnQgbHgsIGludCBsdyk7Ci0gICAgUmVuZGVyT2JqZWN0KiBmaW5kTGVnZW5kKCk7Ci19OwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckZpbGVCdXR0b24gOiBwdWJsaWMgUmVu
ZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJGaWxlQnV0dG9uKEhUTUxJbnB1
dEVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0
IHsgcmV0dXJuICJSZW5kZXJGaWxlQnV0dG9uIjsgfQotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWlu
TWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB2
b2lkIHNlbGVjdCgpOwotCi0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgcmV0
dXJuIGludHJpbnNpY0hlaWdodCgpOyB9Ci0KLSAgICB2b2lkIGNsaWNrKGJvb2wgc2VuZE1vdXNl
RXZlbnRzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCByZXR1cm5Q
cmVzc2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7
Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckxhYmVsIDogcHVibGlj
IFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyTGFiZWwoSFRNTEdlbmVy
aWNGb3JtRWxlbWVudCAqZWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRl
ck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyTGFiZWwiOyB9Ci19OwotCi0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyTGVnZW5kIDogcHVibGljIFJlbmRlckJsb2NrCi17
Ci1wdWJsaWM6Ci0gICAgUmVuZGVyTGVnZW5kKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1l
bnQpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1
cm4gIlJlbmRlckxlZ2VuZCI7IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
UmVuZGVyU2VsZWN0IDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyU2VsZWN0KEhUTUxTZWxlY3RFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNo
YXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU2VsZWN0IjsgfQotCi0gICAg
c2hvcnQgYmFzZWxpbmVQb3NpdGlvbiggYm9vbCBmLCBib29sIGIgKSBjb25zdDsKLSAgICBpbnQg
Y2FsY1JlcGxhY2VkSGVpZ2h0KCkgY29uc3QgeyBpZiAoIW1fdXNlTGlzdEJveCkgcmV0dXJuIGlu
dHJpbnNpY0hlaWdodCgpOyByZXR1cm4gUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNSZXBsYWNlZEhl
aWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgp
OwotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLQotICAgIHZvaWQgc2V0T3B0aW9uc0NoYW5n
ZWQoYm9vbCBfb3B0aW9uc0NoYW5nZWQpOwotCi0gICAgYm9vbCBzZWxlY3Rpb25DaGFuZ2VkKCkg
eyByZXR1cm4gbV9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25DaGFu
Z2VkKGJvb2wgX3NlbGVjdGlvbkNoYW5nZWQpIHsgbV9zZWxlY3Rpb25DaGFuZ2VkID0gX3NlbGVj
dGlvbkNoYW5nZWQ7IH0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKik7Ci0KLSAgICB2b2lkIHVwZGF0
ZVNlbGVjdGlvbigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgUUxpc3RCb3ggKmNyZWF0ZUxpc3RCb3go
KTsKLSAgICB2b2lkIHNldFdpZGdldFdyaXRpbmdEaXJlY3Rpb24oKTsKLQotICAgIHVuc2lnbmVk
ICBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJvb2wgbV91c2VMaXN0Qm94Owot
ICAgIGJvb2wgbV9zZWxlY3Rpb25DaGFuZ2VkOwotICAgIGJvb2wgbV9pZ25vcmVTZWxlY3RFdmVu
dHM7Ci0gICAgYm9vbCBtX29wdGlvbnNDaGFuZ2VkOwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwg
dm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHNlbGVjdGlvbkNo
YW5nZWQoV2lkZ2V0Kik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRl
clRleHRBcmVhIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVu
ZGVyVGV4dEFyZWEoSFRNTFRleHRBcmVhRWxlbWVudCopOwotCi0gICAgdmlydHVhbCB2b2lkIGRl
c3Ryb3koKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsg
cmV0dXJuICJSZW5kZXJUZXh0QXJlYSI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdp
ZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVh
bCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0gICAgYm9vbCBpc1RleHRBcmVhKCkg
Y29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgaXNFZGl0ZWQoKSBjb25zdCB7IHJldHVy
biBtX2RpcnR5OyB9Ci0gICAgdm9pZCBzZXRFZGl0ZWQgKGJvb2wpOwotICAgIAotICAgIFN0cmlu
ZyB0ZXh0KCk7Ci0gICAgU3RyaW5nIHRleHRXaXRoSGFyZExpbmVCcmVha3MoKTsKLQotICAgIGlu
dCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLSAgICB2b2lkIHNl
dFNlbGVjdGlvblN0YXJ0KGludCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25FbmQoaW50KTsKLSAg
ICAKLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBp
bnQpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVD
aGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdl
dCopOwotICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnQ7CiAK
LSAgICBib29sIG1fZGlydHk7Ci0gICAgYm9vbCBtX3VwZGF0aW5nOwotfTsKKyAgICBjbGFzcyBS
ZW5kZXJGaWVsZHNldCA6IHB1YmxpYyBSZW5kZXJCbG9jayB7CisgICAgcHVibGljOgorICAgICAg
ICBSZW5kZXJGaWVsZHNldChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kik7CiAKLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3Qg
eyByZXR1cm4gIlJlbmRlckZpZWxkU2V0IjsgfQogCi1jbGFzcyBSZW5kZXJTbGlkZXIgOiBwdWJs
aWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJTbGlkZXIoSFRNTElu
cHV0RWxlbWVudCopOwotICAgIAotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgp
IGNvbnN0IHsgcmV0dXJuICJSZW5kZXJTbGlkZXIiOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhh
dmVJbnRyaW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwg
dm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1l
bnQoKTsKKyAgICAgICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91dExlZ2VuZChib29sIHJl
bGF5b3V0Q2hpbGRyZW4pOwogCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5n
ZWQoV2lkZ2V0Kik7Ci19OworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5
bGUqKTsKKyAgICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB2b2lkIHBhaW50
Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOworICAgICAgICB2b2lk
IHBhaW50Qm9yZGVyTWludXNMZWdlbmQoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHks
IGludCB3LCBpbnQgaCwgY29uc3QgUmVuZGVyU3R5bGUqLCBpbnQgbHgsIGludCBsdyk7CisgICAg
ICAgIFJlbmRlck9iamVjdCogZmluZExlZ2VuZCgpOworICAgIH07CiAKLX0gLy9uYW1lc3BhY2UK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmCisjZW5kaWYgLy8gUmVuZGVyRmllbGRz
ZXRfaApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZUJ1dHRvbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZUJ1dHRvbi5jcHAJKHJldmlzaW9u
IDE0MzQyKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZUJ1dHRvbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI0LDQ4NSArMjQsMTYgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAicmVuZGVyX2Zvcm0uaCIKKyNpbmNsdWRlICJSZW5kZXJGaWxlQnV0dG9uLmgi
CiAKLSNpbmNsdWRlICJCcm93c2VyRXh0ZW5zaW9uLmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5o
IgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgogI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgog
I2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0R3JvdXBFbGVt
ZW50LmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MU2Vs
ZWN0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRl
ICJLV1FDb21ib0JveC5oIgogI2luY2x1ZGUgIktXUUZpbGVCdXR0b24uaCIKLSNpbmNsdWRlICJL
V1FMaW5lRWRpdC5oIgotI2luY2x1ZGUgIktXUVNsaWRlci5oIgotI2luY2x1ZGUgIktXUVRleHRF
ZGl0LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiZG9tMl9l
dmVudHNpbXBsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwotCi1SZW5kZXJGb3JtRWxlbWVudDo6UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNG
b3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlcldpZGdldChlbGVtZW50KQotewotICAg
IHNldElubGluZSh0cnVlKTsKLX0KLQotUmVuZGVyRm9ybUVsZW1lbnQ6On5SZW5kZXJGb3JtRWxl
bWVudCgpCi17Ci19Ci0KLXNob3J0IFJlbmRlckZvcm1FbGVtZW50OjpiYXNlbGluZVBvc2l0aW9u
KCBib29sIGYsIGJvb2wgaXNSb290TGluZUJveCApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1hcmdp
blRvcCgpICsgd2lkZ2V0KCktPmJhc2VsaW5lUG9zaXRpb24obV9oZWlnaHQpOwotfQotCi12b2lk
IFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShSZW5kZXJTdHlsZSogcykKLXsKLSAgICBpZiAo
Y2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSkKLSAgICAgICAgYWRkSW50cmluc2ljTWFyZ2luc0lm
QWxsb3dlZChzKTsKLQotICAgIFJlbmRlcldpZGdldDo6c2V0U3R5bGUocyk7Ci0KLSAgICAvLyBE
byBub3QgcGFpbnQgYSBiYWNrZ3JvdW5kIG9yIGJvcmRlciBmb3IgQXF1YSBmb3JtIGVsZW1lbnRz
Ci0gICAgc2V0U2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIoZmFsc2UpOwotCi0gICAgbV93
aWRnZXQtPnNldEZvbnQoc3R5bGUoKS0+Zm9udCgpKTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxl
bWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIG1fd2lkZ2V0LT5zZXRFbmFibGVkKCFz
dGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7
Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3Nl
cnQoIG5lZWRzTGF5b3V0KCkgKTsKLSAgICBLSFRNTEFzc2VydCggbWluTWF4S25vd24oKSApOwot
Ci0gICAgLy8gbWluaW11bSBoZWlnaHQKLSAgICBtX2hlaWdodCA9IDA7Ci0KLSAgICBjYWxjV2lk
dGgoKTsKLSAgICBjYWxjSGVpZ2h0KCk7Ci0gICAgCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2Up
OwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpjbGlja2VkKFdpZGdldCopCi17Ci0gICAg
UmVuZGVyQXJlbmEqIGFyZW5hID0gcmVmKCk7Ci0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGV2ZW50
OyAvLyBnZXRzICJjdXJyZW50IGV2ZW50IgotICAgIGlmIChub2RlKCkpCi0gICAgICAgIHN0YXRp
Y19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5vZGUoKSktPmRpc3BhdGNoTW91c2VFdmVudChldmVu
dCwgY2xpY2tFdmVudCwgZXZlbnQuY2xpY2tDb3VudCgpKTsKLSAgICBkZXJlZihhcmVuYSk7Ci19
Ci0KLUhvcml6b250YWxBbGlnbm1lbnQgUmVuZGVyRm9ybUVsZW1lbnQ6OnRleHRBbGlnbm1lbnQo
KSBjb25zdAotewotICAgIHN3aXRjaCAoc3R5bGUoKS0+dGV4dEFsaWduKCkpIHsKLSAgICAgICAg
Y2FzZSBMRUZUOgotICAgICAgICBjYXNlIEtIVE1MX0xFRlQ6Ci0gICAgICAgICAgICByZXR1cm4g
QWxpZ25MZWZ0OwotICAgICAgICBjYXNlIFJJR0hUOgotICAgICAgICBjYXNlIEtIVE1MX1JJR0hU
OgotICAgICAgICAgICAgcmV0dXJuIEFsaWduUmlnaHQ7Ci0gICAgICAgIGNhc2UgQ0VOVEVSOgot
ICAgICAgICBjYXNlIEtIVE1MX0NFTlRFUjoKLSAgICAgICAgICAgIHJldHVybiBBbGlnbkhDZW50
ZXI7Ci0gICAgICAgIGNhc2UgSlVTVElGWToKLSAgICAgICAgICAgIC8vIEp1c3QgZmFsbCBpbnRv
IHRoZSBhdXRvIGNvZGUgZm9yIGp1c3RpZnkuCi0gICAgICAgIGNhc2UgVEFBVVRPOgotICAgICAg
ICAgICAgcmV0dXJuIHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IEFsaWduUmlnaHQgOiBB
bGlnbkxlZnQ7Ci0gICAgfQotICAgIEFTU0VSVChmYWxzZSk7IC8vIFNob3VsZCBuZXZlciBiZSBy
ZWFjaGVkLgotICAgIHJldHVybiBBbGlnbkxlZnQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJGb3JtRWxl
bWVudDo6YWRkSW50cmluc2ljTWFyZ2luc0lmQWxsb3dlZChSZW5kZXJTdHlsZSogX3N0eWxlKQot
ewotICAgIC8vIEN1dCBvdXQgdGhlIGludHJpbnNpYyBtYXJnaW5zIGNvbXBsZXRlbHkgaWYgd2Ug
ZW5kIHVwIHVzaW5nIG1pbmkgY29udHJvbHMuCi0gICAgaWYgKF9zdHlsZS0+Zm9udFNpemUoKSA8
IDExKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hl
aWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGgg
aXMgZmxhd2VkLgotICAgIGludCBtID0gaW50cmluc2ljTWFyZ2luKCk7Ci0gICAgaWYgKF9zdHls
ZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1h
cmdpbkxlZnQoKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0eWxlLT5zZXRNYXJnaW5MZWZ0KExl
bmd0aChtLCBGaXhlZCkpOwotICAgICAgICBpZiAoX3N0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJr
KCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChtLCBGaXhlZCkp
OwotICAgIH0KLQotICAgIGlmIChfc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7Ci0gICAgICAg
IGlmIChfc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNl
dE1hcmdpblRvcChMZW5ndGgobSwgRml4ZWQpKTsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2lu
Qm90dG9tKCkucXVpcmsoKSkKLSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luQm90dG9tKExl
bmd0aChtLCBGaXhlZCkpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1SZW5kZXJJbWFnZUJ1dHRvbjo6UmVuZGVySW1hZ2VCdXR0b24oSFRNTElucHV0RWxlbWVudCAq
ZWxlbWVudCkKLSAgICA6IFJlbmRlckltYWdlKGVsZW1lbnQpCi17Ci0gICAgLy8gIyMjIHN1cHBv
cnQgRE9NQWN0aXZhdGUgZXZlbnQgd2hlbiBjbGlja2VkCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJMaW5lRWRpdDo6
UmVuZGVyTGluZUVkaXQoSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZv
cm1FbGVtZW50KGVsZW1lbnQpLCBtX3VwZGF0aW5nKGZhbHNlKQotewotICAgIFFMaW5lRWRpdDo6
VHlwZSB0eXBlOwotICAgIHN3aXRjaCAoZWxlbWVudC0+aW5wdXRUeXBlKCkpIHsKLSAgICAgICAg
Y2FzZSBIVE1MSW5wdXRFbGVtZW50OjpQQVNTV09SRDoKLSAgICAgICAgICAgIHR5cGUgPSBRTGlu
ZUVkaXQ6OlBhc3N3b3JkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSFRNTElu
cHV0RWxlbWVudDo6U0VBUkNIOgotICAgICAgICAgICAgdHlwZSA9IFFMaW5lRWRpdDo6U2VhcmNo
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0eXBl
ID0gUUxpbmVFZGl0OjpOb3JtYWw7Ci0gICAgfQotICAgIFFMaW5lRWRpdCogZWRpdCA9IG5ldyBR
TGluZUVkaXQodHlwZSk7Ci0gICAgaWYgKHR5cGUgPT0gUUxpbmVFZGl0OjpTZWFyY2gpCi0gICAg
ICAgIGVkaXQtPnNldExpdmVTZWFyY2goZmFsc2UpOwotICAgIHNldFdpZGdldChlZGl0KTsKLX0K
LQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAg
IC8vIFdlIG9ubHkgd2FudCB0byBjYWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFjdHVhbGx5IGlzIGEg
c2VsZWN0aW9uCi0gICAgUUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93
aWRnZXQpOwotICAgIGlmICh3LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAgICAgc3RhdGljX2Nh
c3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5vZGUoKSktPm9uU2VsZWN0KCk7Ci19Ci0KLXZv
aWQgUmVuZGVyTGluZUVkaXQ6OnJldHVyblByZXNzZWQoV2lkZ2V0KikKLXsKLSAgICAvLyBFbWl0
IG9uQ2hhbmdlIGlmIG5lY2Vzc2FyeQotICAgIC8vIFdvcmtzIGJ1dCBtaWdodCBub3QgYmUgZW5v
dWdoLCBkaXJrIHNhaWQgaGUgaGFkIGFub3RoZXIgc29sdXRpb24gYXQKLSAgICAvLyBoYW5kIChj
YW4ndCByZW1lbWJlciB3aGljaCkgLSBEYXZpZAotICAgIGlmIChpc1RleHRGaWVsZCgpICYmIGlz
RWRpdGVkKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+
KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci0gICAgICAgIHNldEVkaXRlZChmYWxzZSk7Ci0gICAgfQot
Ci0gICAgaWYgKEhUTUxGb3JtRWxlbWVudCogZmUgPSBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpKQotICAgICAgICBmZS0+c3VibWl0Q2xpY2soKTsK
LX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6cGVyZm9ybVNlYXJjaChXaWRnZXQqKQotewotICAg
IC8vIEZpcmUgdGhlICJzZWFyY2giIERPTSBldmVudC4KLSAgICBzdGF0aWNfY2FzdDxFdmVudFRh
cmdldE5vZGUqPihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChzZWFyY2hFdmVudCwgdHJ1ZSwg
ZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjphZGRTZWFyY2hSZXN1bHQoKQotewot
ICAgIGlmICh3aWRnZXQoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0
KCkpLT5hZGRTZWFyY2hSZXN1bHQoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6Y2FsY01p
bk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24oKSk7Ci0KLSAgICAv
LyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAgbV91
cGRhdGluZyA9IHRydWU7Ci0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNfY2FzdDxRTGluZUVk
aXQqPih3aWRnZXQoKSktPnNpemVGb3JDaGFyYWN0ZXJXaWR0aChzaXplID4gMCA/IHNpemUgOiAy
MCkpOwotICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLQotICAgIHNldEludHJpbnNpY1dpZHRoKHMu
d2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkpOwotCi0gICAgUmVu
ZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVF
ZGl0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6
c2V0U3R5bGUocyk7Ci0KLSAgICBRTGluZUVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQq
Pih3aWRnZXQoKSk7Ci0gICAgdy0+c2V0QWxpZ25tZW50KHRleHRBbGlnbm1lbnQoKSk7Ci0gICAg
dy0+c2V0V3JpdGluZ0RpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwgPyBSVEwg
OiBMVFIpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17
Ci0gICAgSFRNTElucHV0RWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpOwotICAgIFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdp
ZGdldCgpKTsKLSAgICAKLSAgICBpbnQgbWwgPSBlLT5tYXhMZW5ndGgoKTsKLSAgICBpZiAobWwg
PD0gMCB8fCBtbCA+IDEwMjQpCi0gICAgICAgIG1sID0gMTAyNDsKLSAgICBpZiAody0+bWF4TGVu
Z3RoKCkgIT0gbWwpCi0gICAgICAgIHctPnNldE1heExlbmd0aChtbCk7Ci0KLSAgICBpZiAoIWUt
PnZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkpIHsKLSAgICAgICAgU3RyaW5nIHdpZGdldFRleHQgPSB3
LT50ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gZS0+dmFsdWUoKTsKLSAgICAgICAg
bmV3VGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAg
ICAgIGlmICh3aWRnZXRUZXh0ICE9IG5ld1RleHQpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSB3
LT5jdXJzb3JQb3NpdGlvbigpOwotCi0gICAgICAgICAgICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAg
ICAgICAgICAgIHctPnNldFRleHQobmV3VGV4dCk7Ci0gICAgICAgICAgICBtX3VwZGF0aW5nID0g
ZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHctPnNldEVkaXRlZCggZmFsc2UgKTsK
LQotICAgICAgICAgICAgdy0+c2V0Q3Vyc29yUG9zaXRpb24ocG9zKTsKLSAgICAgICAgfQotICAg
ICAgICBlLT5zZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpOwotICAgIH0KLQotICAgIHctPnNldFJl
YWRPbmx5KGUtPmlzUmVhZE9ubHlDb250cm9sKCkpOwotICAgIAotICAgIC8vIEhhbmRsZSB1cGRh
dGluZyB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMuCi0gICAgdy0+c2V0UGxhY2Vob2xkZXJTdHJpbmco
ZS0+Z2V0QXR0cmlidXRlKHBsYWNlaG9sZGVyQXR0cikuZGVwcmVjYXRlZFN0cmluZygpKTsKLSAg
ICBpZiAody0+dHlwZSgpID09IFFMaW5lRWRpdDo6U2VhcmNoKSB7Ci0gICAgICAgIHctPnNldExp
dmVTZWFyY2goIWUtPmdldEF0dHJpYnV0ZShpbmNyZW1lbnRhbEF0dHIpLmlzTnVsbCgpKTsKLSAg
ICAgICAgdy0+c2V0QXV0b1NhdmVOYW1lKGUtPmdldEF0dHJpYnV0ZShhdXRvc2F2ZUF0dHIpKTsK
LSAgICAgICAgdy0+c2V0TWF4UmVzdWx0cyhlLT5tYXhSZXN1bHRzKCkpOwotICAgIH0KLQotICAg
IHctPnNldENvbG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Y29sb3Io
KSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQot
dm9pZCBSZW5kZXJMaW5lRWRpdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgaWYgKG1f
dXBkYXRpbmcpIC8vIERvbid0IGFsdGVyIHRoZSB2YWx1ZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRs
ZSBvZiBpbml0aW5nIHRoZSBjb250cm9sLCBzaW5jZQotICAgICAgICByZXR1cm47ICAgICAvLyB3
ZSBhcmUgZ2V0dGluZyB0aGUgdmFsdWUgZnJvbSB0aGUgRE9NIGFuZCBpdCdzIG5vdCB1c2VyIGlu
cHV0LgotCi0gICAgU3RyaW5nIG5ld1RleHQgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3aWRn
ZXQoKSktPnRleHQoKTsKLQotICAgIC8vIEEgbnVsbCBzdHJpbmcgdmFsdWUgaXMgdXNlZCB0byBp
bmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGNvbnRyb2wgaGFzIG5vdCBhbHRlcmVkIHRoZSBvcmlnaW5h
bAotICAgIC8vIGRlZmF1bHQgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5ldmVy
IHVzZSB0aGUgbnVsbCBzdHJpbmcgdmFsdWUgd2hlbiB0aGUgdXNlcgotICAgIC8vIGVtcHRpZXMg
YSB0ZXh0ZmllbGQsIGJ1dCBzaG91bGQgYWx3YXlzIGZvcmNlIGFuIGVtcHR5IHRleHRmaWVsZCB0
byB1c2UgdGhlIGVtcHR5IHN0cmluZy4KLSAgICBpZiAobmV3VGV4dC5pc051bGwoKSkKLSAgICAg
ICAgbmV3VGV4dCA9ICIiOwotCi0gICAgbmV3VGV4dC5yZXBsYWNlKGJhY2tzbGFzaEFzQ3VycmVu
Y3lTeW1ib2woKSwgJ1xcJyk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5v
ZGUoKSktPnNldFZhbHVlRnJvbVJlbmRlcmVyKG5ld1RleHQpOwotfQotCi1pbnQgUmVuZGVyTGlu
ZUVkaXQ6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBRTGluZUVkaXQgKmxpbmVFZGl0ID0gc3Rh
dGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICBpbnQgc3RhcnQgPSBsaW5lRWRp
dC0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpZiAoc3RhcnQgPT0gLTEpCi0gICAgICAgIHN0YXJ0
ID0gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIHN0YXJ0OwotfQotCi1p
bnQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUUxpbmVFZGl0ICpsaW5l
RWRpdCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCk7Ci0gICAgaW50IHN0YXJ0
ID0gbGluZUVkaXQtPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaWYgKHN0YXJ0ID09IC0xKQotICAg
ICAgICByZXR1cm4gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIHN0YXJ0
ICsgKGludClsaW5lRWRpdC0+c2VsZWN0ZWRUZXh0KCkubGVuZ3RoKCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBpbnQgcmVh
bFN0YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gbWF4KHNlbGVjdGlvbkVu
ZCgpIC0gcmVhbFN0YXJ0LCAwKTsKLSAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQgKj4obV93aWRn
ZXQpLT5zZXRTZWxlY3Rpb24ocmVhbFN0YXJ0LCBsZW5ndGgpOwotfQotCi12b2lkIFJlbmRlckxp
bmVFZGl0OjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBpbnQgc3RhcnQgPSBzZWxl
Y3Rpb25TdGFydCgpOwotICAgIGludCByZWFsRW5kID0gbWF4KGVuZCwgMCk7Ci0gICAgaW50IGxl
bmd0aCA9IHJlYWxFbmQgLSBzdGFydDsKLSAgICBpZiAobGVuZ3RoIDwgMCkgewotICAgICAgICBz
dGFydCA9IHJlYWxFbmQ7Ci0gICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgfQotICAgIHN0YXRpY19j
YXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihzdGFydCwgbGVuZ3RoKTsK
LX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxR
TGluZUVkaXQqPihtX3dpZGdldCktPnNlbGVjdEFsbCgpOwotfQotCi1ib29sIFJlbmRlckxpbmVF
ZGl0Ojppc0VkaXRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFFMaW5lRWRp
dCo+KG1fd2lkZ2V0KS0+ZWRpdGVkKCk7Ci19Ci12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRFZGl0
ZWQoYm9vbCB4KQotewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0KS0+c2V0
RWRpdGVkKHgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxlY3Rpb25SYW5nZShp
bnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaW50IHJlYWxTdGFydCA9IG1heChzdGFydCwgMCk7
Ci0gICAgaW50IGxlbmd0aCA9IG1heChlbmQgLSByZWFsU3RhcnQsIDApOwotICAgIHN0YXRpY19j
YXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihyZWFsU3RhcnQsIGxlbmd0
aCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJGaWVsZHNldDo6UmVuZGVy
RmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLTogUmVuZGVyQmxvY2so
ZWxlbWVudCkKLXsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNldDo6bGF5b3V0TGVn
ZW5kKGJvb2wgcmVsYXlvdXRDaGlsZHJlbikKLXsKLSAgICBSZW5kZXJPYmplY3QqIGxlZ2VuZCA9
IGZpbmRMZWdlbmQoKTsKLSAgICBpZiAobGVnZW5kKSB7Ci0gICAgICAgIGlmIChyZWxheW91dENo
aWxkcmVuKQotICAgICAgICAgICAgbGVnZW5kLT5zZXROZWVkc0xheW91dCh0cnVlKTsKLSAgICAg
ICAgbGVnZW5kLT5sYXlvdXRJZk5lZWRlZCgpOwotCi0gICAgICAgIGludCB4UG9zID0gYm9yZGVy
TGVmdCgpICsgcGFkZGluZ0xlZnQoKSArIGxlZ2VuZC0+bWFyZ2luTGVmdCgpOwotICAgICAgICBp
ZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKQotICAgICAgICAgICAgeFBvcyA9IG1fd2lk
dGggLSBwYWRkaW5nUmlnaHQoKSAtIGJvcmRlclJpZ2h0KCkgLSBsZWdlbmQtPndpZHRoKCkgLSBs
ZWdlbmQtPm1hcmdpblJpZ2h0KCk7Ci0gICAgICAgIGludCBiID0gYm9yZGVyVG9wKCk7Ci0gICAg
ICAgIGludCBoID0gbGVnZW5kLT5oZWlnaHQoKTsKLSAgICAgICAgbGVnZW5kLT5zZXRQb3MoeFBv
cywgbWF4KChiLWgpLzIsIDApKTsKLSAgICAgICAgbV9oZWlnaHQgPSBtYXgoYixoKSArIHBhZGRp
bmdUb3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxlZ2VuZDsKLX0KLQotUmVuZGVyT2JqZWN0KiBS
ZW5kZXJGaWVsZHNldDo6ZmluZExlZ2VuZCgpCi17Ci0gICAgZm9yIChSZW5kZXJPYmplY3QqIGxl
Z2VuZCA9IGZpcnN0Q2hpbGQoKTsgbGVnZW5kOyBsZWdlbmQgPSBsZWdlbmQtPm5leHRTaWJsaW5n
KCkpIHsKLSAgICAgIGlmICghbGVnZW5kLT5pc0Zsb2F0aW5nT3JQb3NpdGlvbmVkKCkgJiYgbGVn
ZW5kLT5lbGVtZW50KCkgJiYKLSAgICAgICAgICBsZWdlbmQtPmVsZW1lbnQoKS0+aGFzVGFnTmFt
ZShsZWdlbmRUYWcpKQotICAgICAgICByZXR1cm4gbGVnZW5kOwotICAgIH0KLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBSZW5kZXJGaWVsZHNldDo6cGFpbnRCb3hEZWNvcmF0aW9ucyhQYWludElu
Zm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgaW50IHcgPSB3aWR0aCgpOwotICAgIGlu
dCBoID0gaGVpZ2h0KCkgKyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90dG9tRXh0cmEoKTsK
LSAgICBSZW5kZXJPYmplY3QqIGxlZ2VuZCA9IGZpbmRMZWdlbmQoKTsKLSAgICBpZiAoIWxlZ2Vu
ZCkKLSAgICAgICAgcmV0dXJuIFJlbmRlckJsb2NrOjpwYWludEJveERlY29yYXRpb25zKGksIF90
eCwgX3R5KTsKLQotICAgIGludCB5T2ZmID0gKGxlZ2VuZC0+eVBvcygpID4gMCkgPyAwIDogKGxl
Z2VuZC0+aGVpZ2h0KCktYm9yZGVyVG9wKCkpLzI7Ci0gICAgaCAtPSB5T2ZmOwotICAgIF90eSAr
PSB5T2ZmIC0gYm9yZGVyVG9wRXh0cmEoKTsKLQotICAgIGludCBteSA9IG1heChfdHksIGkuci55
KCkpOwotICAgIGludCBlbmQgPSBtaW4oaS5yLmJvdHRvbSgpLCAgX3R5ICsgaCk7Ci0gICAgaW50
IG1oID0gZW5kIC0gbXk7Ci0KLSAgICBwYWludEJhY2tncm91bmQoaS5wLCBzdHlsZSgpLT5iYWNr
Z3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpLCBteSwgbWgsIF90eCwg
X3R5LCB3LCBoKTsKLQotICAgIGlmIChzdHlsZSgpLT5oYXNCb3JkZXIoKSkKLSAgICAgICAgcGFp
bnRCb3JkZXJNaW51c0xlZ2VuZChpLnAsIF90eCwgX3R5LCB3LCBoLCBzdHlsZSgpLCBsZWdlbmQt
PnhQb3MoKSwgbGVnZW5kLT53aWR0aCgpKTsKLX0KLQotdm9pZCBSZW5kZXJGaWVsZHNldDo6cGFp
bnRCb3JkZXJNaW51c0xlZ2VuZChHcmFwaGljc0NvbnRleHQqIHAsIGludCBfdHgsIGludCBfdHks
IGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQgbHgsIGludCBsdykKLXsKLQotICAgIGNv
bnN0IENvbG9yJiB0YyA9IHN0eWxlLT5ib3JkZXJUb3BDb2xvcigpOwotICAgIGNvbnN0IENvbG9y
JiBiYyA9IHN0eWxlLT5ib3JkZXJCb3R0b21Db2xvcigpOwotCi0gICAgRUJvcmRlclN0eWxlIHRz
ID0gc3R5bGUtPmJvcmRlclRvcFN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxlIGJzID0gc3R5bGUt
PmJvcmRlckJvdHRvbVN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxlIGxzID0gc3R5bGUtPmJvcmRl
ckxlZnRTdHlsZSgpOwotICAgIEVCb3JkZXJTdHlsZSBycyA9IHN0eWxlLT5ib3JkZXJSaWdodFN0
eWxlKCk7Ci0KLSAgICBib29sIHJlbmRlcl90ID0gdHMgPiBCSElEREVOOwotICAgIGJvb2wgcmVu
ZGVyX2wgPSBscyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfciA9IHJzID4gQkhJRERFTjsK
LSAgICBib29sIHJlbmRlcl9iID0gYnMgPiBCSElEREVOOwotCi0gICAgaWYocmVuZGVyX3QpIHsK
LSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgbHgsIF90eSArICBzdHlsZS0+
Ym9yZGVyVG9wV2lkdGgoKSwgQlNUb3AsIHRjLCBzdHlsZS0+Y29sb3IoKSwgdHMsCi0gICAgICAg
ICAgICAgICAgICAgKHJlbmRlcl9sICYmIChscyA9PSBET1RURUQgfHwgbHMgPT0gREFTSEVEIHx8
IGxzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlckxlZnRXaWR0aCgpOjApLCAwKTsKLSAgICAgICAg
ZHJhd0JvcmRlcihwLCBfdHgrbHgrbHcsIF90eSwgX3R4ICsgdywgX3R5ICsgIHN0eWxlLT5ib3Jk
ZXJUb3BXaWR0aCgpLCBCU1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywKLSAgICAgICAgICAg
ICAgICAgICAwLCAocmVuZGVyX3IgJiYgKHJzID09IERPVFRFRCB8fCBycyA9PSBEQVNIRUQgfHwg
cnMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpOjApKTsKLSAgICB9Ci0KLSAg
ICBpZihyZW5kZXJfYikKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSArIGggLSBzdHls
ZS0+Ym9yZGVyQm90dG9tV2lkdGgoKSwgX3R4ICsgdywgX3R5ICsgaCwgQlNCb3R0b20sIGJjLCBz
dHlsZS0+Y29sb3IoKSwgYnMsCi0gICAgICAgICAgICAgICAgICAgKHJlbmRlcl9sICYmIChscyA9
PSBET1RURUQgfHwgbHMgPT0gREFTSEVEIHx8IGxzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlckxl
ZnRXaWR0aCgpOjApLAotICAgICAgICAgICAgICAgICAgIChyZW5kZXJfciAmJiAocnMgPT0gRE9U
VEVEIHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VCTEUpP3N0eWxlLT5ib3JkZXJSaWdodFdp
ZHRoKCk6MCkpOwotCi0gICAgaWYocmVuZGVyX2wpCi0gICAgewotICAgICAgICBjb25zdCBDb2xv
ciYgbGMgPSBzdHlsZS0+Ym9yZGVyTGVmdENvbG9yKCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVf
dG9wID0KLSAgICAgICAgICAgICh0YyA9PSBsYykgJiYKLSAgICAgICAgICAgIChscyA+PSBPVVRT
RVQpICYmCi0gICAgICAgICAgICAodHMgPT0gRE9UVEVEIHx8IHRzID09IERBU0hFRCB8fCB0cyA9
PSBTT0xJRCB8fCB0cyA9PSBPVVRTRVQpOwotCi0gICAgICAgIGJvb2wgaWdub3JlX2JvdHRvbSA9
Ci0gICAgICAgICAgICAoYmMgPT0gbGMpICYmCi0gICAgICAgICAgICAobHMgPj0gT1VUU0VUKSAm
JgotICAgICAgICAgICAgKGJzID09IERPVFRFRCB8fCBicyA9PSBEQVNIRUQgfHwgYnMgPT0gU09M
SUQgfHwgYnMgPT0gSU5TRVQpOwotCi0gICAgICAgIGRyYXdCb3JkZXIocCwgX3R4LCBfdHksIF90
eCArIHN0eWxlLT5ib3JkZXJMZWZ0V2lkdGgoKSwgX3R5ICsgaCwgQlNMZWZ0LCBsYywgc3R5bGUt
PmNvbG9yKCksIGxzLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV90b3A/MDpzdHlsZS0+Ym9y
ZGVyVG9wV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVfYm90dG9tPzA6c3R5bGUt
PmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRlcl9yKQotICAgIHsK
LSAgICAgICAgY29uc3QgQ29sb3ImIHJjID0gc3R5bGUtPmJvcmRlclJpZ2h0Q29sb3IoKTsKLQot
ICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAgICAgICAgICAgKHRjID09IHJjKSAmJgotICAg
ICAgICAgICAgKHJzID49IERPVFRFRCB8fCBycyA9PSBJTlNFVCkgJiYKLSAgICAgICAgICAgICh0
cyA9PSBET1RURUQgfHwgdHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8IHRzID09IE9VVFNF
VCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAgICAgIChiYyA9PSBy
YykgJiYKLSAgICAgICAgICAgIChycyA+PSBET1RURUQgfHwgcnMgPT0gSU5TRVQpICYmCi0gICAg
ICAgICAgICAoYnMgPT0gRE9UVEVEIHx8IGJzID09IERBU0hFRCB8fCBicyA9PSBTT0xJRCB8fCBi
cyA9PSBJTlNFVCk7Ci0KLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHggKyB3IC0gc3R5bGUtPmJv
cmRlclJpZ2h0V2lkdGgoKSwgX3R5LCBfdHggKyB3LCBfdHkgKyBoLCBCU1JpZ2h0LCByYywgc3R5
bGUtPmNvbG9yKCksIHJzLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV90b3A/MDpzdHlsZS0+
Ym9yZGVyVG9wV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVfYm90dG9tPzA6c3R5
bGUtPmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJGaWVsZHNl
dDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUqIF9zdHlsZSkKLXsKLSAgICBSZW5kZXJCbG9jazo6c2V0
U3R5bGUoX3N0eWxlKTsKLQotICAgIC8vIFdpbklFIHJlbmRlcnMgZmllbGRzZXRzIHdpdGggZGlz
cGxheTppbmxpbmUgbGlrZSB0aGV5J3JlIGlubGluZS1ibG9ja3MuICBGb3IgdXMsCi0gICAgLy8g
YW4gaW5saW5lLWJsb2NrIGlzIGp1c3QgYSBibG9jayBlbGVtZW50IHdpdGggcmVwbGFjZWQgc2V0
IHRvIHRydWUgYW5kIGlubGluZSBzZXQKLSAgICAvLyB0byB0cnVlLiAgRW5zdXJlIHRoYXQgaWYg
d2UgZW5kZWQgdXAgYmVpbmcgaW5saW5lIHRoYXQgd2Ugc2V0IG91ciByZXBsYWNlZCBmbGFnCi0g
ICAgLy8gc28gdGhhdCB3ZSdyZSB0cmVhdGVkIGxpa2UgYW4gaW5saW5lLWJsb2NrLgotICAgIGlm
IChpc0lubGluZSgpKQotICAgICAgICBzZXRSZXBsYWNlZCh0cnVlKTsKLX0gICAgCi0gICAgCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckZpbGVCdXR0b246OlJlbmRlckZpbGVCdXR0b24o
SFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKK1JlbmRlckZpbGVCdXR0b246OlJlbmRlckZpbGVC
dXR0b24oSFRNTElucHV0RWxlbWVudCogZWxlbWVudCkKICAgICA6IFJlbmRlckZvcm1FbGVtZW50
KGVsZW1lbnQpCiB7CiAgICAgc2V0V2lkZ2V0KG5ldyBLV1FGaWxlQnV0dG9uKHZpZXcoKS0+ZnJh
bWUoKSkpOwpAQCAtNTEwLDExICs0MSwxMSBAQCBSZW5kZXJGaWxlQnV0dG9uOjpSZW5kZXJGaWxl
QnV0dG9uKEhUTUxJCiAKIHZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6Y2FsY01pbk1heFdpZHRoKCkK
IHsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24oKSk7CisgICAgQVNTRVJUKCFtaW5NYXhL
bm93bigpKTsKIAogICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50
cyB0byBiZS4KICAgICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihu
b2RlKCkpLT5zaXplKCk7Ci0gICAgSW50U2l6ZSBzKHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24g
Kj4od2lkZ2V0KCkpLT5zaXplRm9yQ2hhcmFjdGVyV2lkdGgoc2l6ZSA+IDAgPyBzaXplIDogMjAp
KTsKKyAgICBJbnRTaXplIHMoc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+
c2l6ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8gc2l6ZSA6IDIwKSk7CiAKICAgICBzZXRJ
bnRyaW5zaWNXaWR0aChzLndpZHRoKCkpOwogICAgIHNldEludHJpbnNpY0hlaWdodChzLmhlaWdo
dCgpKTsKQEAgLTU0Niw2MDggKzc3LDkgQEAgdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpzZWxlY3Qo
KQogewogfQogCi0KIHZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6Y2xpY2soYm9vbCBzZW5kTW91c2VF
dmVudHMpCiB7Ci0gICAgc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbiAqPih3aWRnZXQoKSktPmNs
aWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5k
ZXJMYWJlbDo6UmVuZGVyTGFiZWwoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAg
ICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCi17Ci0KLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1SZW5kZXJMZWdlbmQ6OlJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50
ICplbGVtZW50KQotICAgIDogUmVuZGVyQmxvY2soZWxlbWVudCkKLXsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1SZW5kZXJTZWxlY3Q6OlJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVu
dCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCi17Ci0gICAgbV9p
Z25vcmVTZWxlY3RFdmVudHMgPSBmYWxzZTsKLSAgICBtX211bHRpcGxlID0gZWxlbWVudC0+bXVs
dGlwbGUoKTsKLSAgICBtX3NpemUgPSBlbGVtZW50LT5zaXplKCk7Ci0gICAgbV91c2VMaXN0Qm94
ID0gKG1fbXVsdGlwbGUgfHwgbV9zaXplID4gMSk7Ci0gICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0g
dHJ1ZTsKLSAgICBtX29wdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKLQotICAgIGlmIChtX3VzZUxpc3RC
b3gpCi0gICAgICAgIHNldFdpZGdldChjcmVhdGVMaXN0Qm94KCkpOwotICAgIGVsc2UKLSAgICAg
ICAgc2V0V2lkZ2V0KG5ldyBRQ29tYm9Cb3gpOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0Ojpz
ZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCkKLXsKLSAgICBUZXh0RGlyZWN0aW9uIGQgPSBzdHls
ZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwgPyBSVEwgOiBMVFI7Ci0gICAgaWYgKG1fdXNlTGlzdEJv
eCkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3ggKj4obV93aWRnZXQpLT5zZXRXcml0aW5n
RGlyZWN0aW9uKGQpOwotICAgIGVsc2UKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94ICo+
KG1fd2lkZ2V0KS0+c2V0V3JpdGluZ0RpcmVjdGlvbihkKTsKLX0KLQotdm9pZCBSZW5kZXJTZWxl
Y3Q6OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQotewotICAgIFJlbmRlckZvcm1FbGVtZW50Ojpz
ZXRTdHlsZShzKTsKLSAgICBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci19Ci0KLQotdm9p
ZCBSZW5kZXJTZWxlY3Q6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBtX2lnbm9yZVNlbGVj
dEV2ZW50cyA9IHRydWU7Ci0KLSAgICAvLyBjaGFuZ2Ugd2lkZ2V0IHR5cGUKLSAgICBib29sIG9s
ZE11bHRpcGxlID0gbV9tdWx0aXBsZTsKLSAgICB1bnNpZ25lZCBvbGRTaXplID0gbV9zaXplOwot
ICAgIGJvb2wgb2xkTGlzdGJveCA9IG1fdXNlTGlzdEJveDsKLQotICAgIG1fbXVsdGlwbGUgPSBz
dGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm11bHRpcGxlKCk7Ci0gICAg
bV9zaXplID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5zaXplKCk7
Ci0gICAgbV91c2VMaXN0Qm94ID0gKG1fbXVsdGlwbGUgfHwgbV9zaXplID4gMSk7Ci0KLSAgICBp
ZiAob2xkTXVsdGlwbGUgIT0gbV9tdWx0aXBsZSB8fCBvbGRTaXplICE9IG1fc2l6ZSkgewotICAg
ICAgICBpZiAobV91c2VMaXN0Qm94ICE9IG9sZExpc3Rib3gpIHsKLSAgICAgICAgICAgIC8vIHR5
cGUgb2Ygc2VsZWN0IGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICBkZWxldGUgbV93aWRnZXQ7Ci0K
LSAgICAgICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgc2V0V2lkZ2V0
KGNyZWF0ZUxpc3RCb3goKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0
V2lkZ2V0KG5ldyBRQ29tYm9Cb3gpOwotICAgICAgICAgICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVj
dGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCAmJiBvbGRNdWx0
aXBsZSAhPSBtX211bHRpcGxlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+
KG1fd2lkZ2V0KS0+c2V0U2VsZWN0aW9uTW9kZShtX211bHRpcGxlID8gUUxpc3RCb3g6OkV4dGVu
ZGVkIDogUUxpc3RCb3g6OlNpbmdsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9zZWxlY3Rpb25D
aGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0gICAgfQot
Ci0gICAgLy8gdXBkYXRlIGNvbnRlbnRzIGxpc3Rib3gvY29tYm9ib3ggYmFzZWQgb24gb3B0aW9u
cyBpbiBtX2VsZW1lbnQKLSAgICBpZiAoIG1fb3B0aW9uc0NoYW5nZWQgKSB7Ci0gICAgICAgIGlm
IChzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm1fcmVjYWxjTGlzdEl0
ZW1zKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkp
LT5yZWNhbGNMaXN0SXRlbXMoKTsKLSAgICAgICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50
Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5s
aXN0SXRlbXMoKTsKLSAgICAgICAgaW50IGxpc3RJbmRleDsKLQotICAgICAgICBpZiAobV91c2VM
aXN0Qm94KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmNs
ZWFyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+
KG1fd2lkZ2V0KS0+Y2xlYXIoKTsKLQotICAgICAgICBib29sIGdyb3VwRW5hYmxlZCA9IHRydWU7
Ci0gICAgICAgIGZvciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4IDwgaW50KGxpc3RJdGVtcy5z
aXplKCkpOyBsaXN0SW5kZXgrKykgewotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tsaXN0SW5k
ZXhdLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkgewotICAgICAgICAgICAgICAgIEhUTUxPcHRH
cm91cEVsZW1lbnQgKm9wdGdyb3VwRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxPcHRHcm91cEVs
ZW1lbnQqPihsaXN0SXRlbXNbbGlzdEluZGV4XSk7Ci0gICAgICAgICAgICAgICAgRGVwcmVjYXRl
ZFN0cmluZyBsYWJlbCA9IG9wdGdyb3VwRWxlbWVudC0+Z2V0QXR0cmlidXRlKGxhYmVsQXR0ciku
ZGVwcmVjYXRlZFN0cmluZygpOwotICAgICAgICAgICAgICAgIGxhYmVsLnJlcGxhY2UoJ1xcJywg
YmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgICAgICAvLyBJbiBXaW5JRSwgYW4gb3B0Z3JvdXAgY2FuJ3Qgc3RhcnQgb3IgZW5kIHdpdGgg
d2hpdGVzcGFjZSAob3RoZXIgdGhhbiB0aGUgaW5kZW50Ci0gICAgICAgICAgICAgICAgLy8gd2Ug
Z2l2ZSBpdCkuICBXZSBtYXRjaCB0aGlzIGJlaGF2aW9yLgotICAgICAgICAgICAgICAgIGxhYmVs
ID0gbGFiZWwuc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0
byBjb2xsYXBzZSBvdXIgd2hpdGVzcGFjZSB0b28uICBUaGlzIHdpbGwgbWF0Y2ggb3RoZXIgYnJv
d3NlcnMuCi0gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5zaW1wbGlmeVdoaXRlU3BhY2Uo
KTsKLQotICAgICAgICAgICAgICAgIGdyb3VwRW5hYmxlZCA9IG9wdGdyb3VwRWxlbWVudC0+aXNF
bmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKG1fdXNlTGlz
dEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdl
dCktPmFwcGVuZEdyb3VwTGFiZWwobGFiZWwsIGdyb3VwRW5hYmxlZCk7Ci0gICAgICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dp
ZGdldCktPmFwcGVuZEdyb3VwTGFiZWwobGFiZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgZWxzZSBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkg
ewotICAgICAgICAgICAgICAgIEhUTUxPcHRpb25FbGVtZW50ICpvcHRpb25FbGVtZW50ID0gc3Rh
dGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbbGlzdEluZGV4XSk7Ci0gICAg
ICAgICAgICAgICAgRGVwcmVjYXRlZFN0cmluZyBpdGVtVGV4dDsKLSAgICAgICAgICAgICAgICBp
ZiAob3B0aW9uRWxlbWVudC0+aGFzQXR0cmlidXRlKGxhYmVsQXR0cikpCi0gICAgICAgICAgICAg
ICAgICAgIGl0ZW1UZXh0ID0gb3B0aW9uRWxlbWVudC0+Z2V0QXR0cmlidXRlKGxhYmVsQXR0ciku
ZGVwcmVjYXRlZFN0cmluZygpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICAgICAgaXRlbVRleHQgPSBvcHRpb25FbGVtZW50LT50ZXh0KCkuZGVwcmVjYXRlZFN0cmluZygp
OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGl0ZW1UZXh0LnJlcGxhY2UoJ1xc
JywgYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIElu
IFdpbklFLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQgaW4gb3B0
aW9ucy4gV2UgbWF0Y2ggdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9
IGl0ZW1UZXh0LnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQg
dG8gY29sbGFwc2Ugb3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3aWxsIG1hdGNoIG90aGVyIGJy
b3dzZXJzLgotICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gaXRlbVRleHQuc2ltcGxpZnlXaGl0
ZVNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVt
c1tsaXN0SW5kZXhdLT5wYXJlbnROb2RlKCktPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAg
ICAgICAgICAgICAgICAgICBpdGVtVGV4dC5wcmVwZW5kKCIgICAgIik7Ci0KLSAgICAgICAgICAg
ICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxR
TGlzdEJveCo+KG1fd2lkZ2V0KS0+YXBwZW5kSXRlbShpdGVtVGV4dCwgZ3JvdXBFbmFibGVkICYm
IG9wdGlvbkVsZW1lbnQtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5k
SXRlbShpdGVtVGV4dCwgZ3JvdXBFbmFibGVkICYmIG9wdGlvbkVsZW1lbnQtPmlzRW5hYmxlZCgp
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtc1tsaXN0SW5k
ZXhdLT5oYXNUYWdOYW1lKGhyVGFnKSkgewotICAgICAgICAgICAgICAgIGlmICghbV91c2VMaXN0
Qm94KQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdl
dCktPmFwcGVuZFNlcGFyYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIEtIVE1MQXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgIG1fc2VsZWN0
aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkK
LSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5kb25lQXBwZW5k
aW5nSXRlbXMoKTsKLSAgICAgICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAg
ICAgICAgbV9vcHRpb25zQ2hhbmdlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBz
ZWxlY3Rpb24KLSAgICBpZiAobV9zZWxlY3Rpb25DaGFuZ2VkKSB7Ci0gICAgICAgIHVwZGF0ZVNl
bGVjdGlvbigpOwotICAgIH0KLQotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0K
LSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotCi1zaG9y
dCBSZW5kZXJTZWxlY3Q6OmJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBpc1Jvb3RMaW5l
Qm94ICkgY29uc3QKLXsKLSAgICBpZiAobV91c2VMaXN0Qm94KSB7Ci0gICAgICAgIC8vIEZJWE1F
OiBTaG91bGQgZ2V0IHRoZSBoYXJkY29kZWQgY29uc3RhbnQgb2YgNyBieSBjYWxsaW5nIGEgUUxp
c3RCb3ggZnVuY3Rpb24sCi0gICAgICAgIC8vIGFzIHdlIGRvIGZvciBvdGhlciB3aWRnZXQgY2xh
c3Nlcy4KLSAgICAgICAgcmV0dXJuIFJlbmRlcldpZGdldDo6YmFzZWxpbmVQb3NpdGlvbiggZiwg
aXNSb290TGluZUJveCApIC0gNzsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckZvcm1FbGVtZW50
OjpiYXNlbGluZVBvc2l0aW9uKCBmLCBpc1Jvb3RMaW5lQm94ICk7Ci19Ci0KLQotdm9pZCBSZW5k
ZXJTZWxlY3Q6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoICFtaW5NYXhL
bm93bigpICk7Ci0KLSAgICBpZiAobV9vcHRpb25zQ2hhbmdlZCkKLSAgICAgICAgdXBkYXRlRnJv
bUVsZW1lbnQoKTsKLQotICAgIC8vICMjIyB1Z2x5IEhBQ0sgRklYTUUhISEKLSAgICBzZXRNaW5N
YXhLbm93bigpOwotICAgIGxheW91dElmTmVlZGVkKCk7Ci0gICAgc2V0TmVlZHNMYXlvdXRBbmRN
aW5NYXhSZWNhbGMoKTsKLSAgICAvLyAjIyMgZW5kIEZJWE1FCi0KLSAgICBSZW5kZXJGb3JtRWxl
bWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0OjpsYXlvdXQo
ICkKLXsKLSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBLSFRNTEFzc2VydCht
aW5NYXhLbm93bigpKTsKLQotICAgIC8vICMjIyBtYWludGFpbiBzZWxlY3Rpb24gcHJvcGVybHkg
YmV0d2VlbiB0eXBlL3NpemUgY2hhbmdlcywgYW5kIHdvcmsKLSAgICAvLyBvdXQgaG93IHRvIGhh
bmRsZSBtdWx0aXNlbGVjdC0+c2luZ2xlc2VsZWN0IChwcm9iYWJseSBqdXN0IHNlbGVjdAotICAg
IC8vIGZpcnN0IHNlbGVjdGVkIG9uZSkKLQotICAgIC8vIGNhbGN1bGF0ZSBzaXplCi0gICAgaWYo
bV91c2VMaXN0Qm94KSB7Ci0gICAgICAgIFFMaXN0Qm94KiB3ID0gc3RhdGljX2Nhc3Q8UUxpc3RC
b3gqPihtX3dpZGdldCk7Ci0KLQotICAgICAgICBpbnQgc2l6ZSA9IG1fc2l6ZTsKLSAgICAgICAg
Ly8gY2hlY2sgaWYgbXVsdGlwbGUgYW5kIHNpemUgd2FzIG5vdCBnaXZlbiBvciBpbnZhbGlkCi0g
ICAgICAgIC8vIEludGVybmV0IEV4cGxvZGVyIHNldHMgc2l6ZSB0byBtaW4obnVtYmVyIG9mIGVs
ZW1lbnRzLCA0KQotICAgICAgICAvLyBOZXRzY2FwZSBzZWVtcyB0byBzaW1wbHkgc2V0IGl0IHRv
ICJudW1iZXIgb2YgZWxlbWVudHMiCi0gICAgICAgIC8vIHRoZSBhdmVyYWdlIG9mIHRoYXQgaXMg
SU1ITyBtaW4obnVtYmVyIG9mIGVsZW1lbnRzLCAxMCkKLSAgICAgICAgLy8gc28gSSBkaWQgdGhh
dCA7LSkKLSAgICAgICAgaWYoc2l6ZSA8IDEpCi0gICAgICAgICAgICBzaXplID0gbWluKHN0YXRp
Y19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5jb3VudCgpLCAxMFUpOwotCi0gICAgICAgIC8v
IExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAgICAgICAg
SW50U2l6ZSBzKHctPnNpemVGb3JOdW1iZXJPZkxpbmVzKHNpemUpKTsKLSAgICAgICAgc2V0SW50
cmluc2ljV2lkdGgoIHMud2lkdGgoKSApOwotICAgICAgICBzZXRJbnRyaW5zaWNIZWlnaHQoIHMu
aGVpZ2h0KCkgKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEludFNpemUgcyhtX3dpZGdl
dC0+c2l6ZUhpbnQoKSk7Ci0gICAgICAgIHNldEludHJpbnNpY1dpZHRoKCBzLndpZHRoKCkgKTsK
LSAgICAgICAgc2V0SW50cmluc2ljSGVpZ2h0KCBzLmhlaWdodCgpICk7Ci0gICAgfQotCi0gICAg
UmVuZGVyRm9ybUVsZW1lbnQ6OmxheW91dCgpOwotCi0gICAgLy8gYW5kIG5vdyBkaXNhYmxlIHRo
ZSB3aWRnZXQgaW4gY2FzZSB0aGVyZSBpcyBubyA8b3B0aW9uPiBnaXZlbgotICAgIERlcHJlY2F0
ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RF
bGVtZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1zKCk7Ci0KLSAgICBib29sIGZvdW5kT3B0aW9uID0g
ZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVtcy5zaXplKCkgJiYg
IWZvdW5kT3B0aW9uOyBpKyspCi0gICAgICAgIGZvdW5kT3B0aW9uID0gKGxpc3RJdGVtc1tpXS0+
aGFzVGFnTmFtZShvcHRpb25UYWcpKTsKLQotICAgIG1fd2lkZ2V0LT5zZXRFbmFibGVkKGZvdW5k
T3B0aW9uICYmICEgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5kaXNh
YmxlZCgpKTsKLX0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQot
ewotICAgIGlmIChtX2lnbm9yZVNlbGVjdEV2ZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
S0hUTUxBc3NlcnQoIW1fdXNlTGlzdEJveCk7Ci0KLSAgICBpbnQgaW5kZXggPSBzdGF0aWNfY2Fz
dDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmN1cnJlbnRJdGVtKCk7Ci0KLSAgICBEZXByZWNhdGVk
QXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxl
bWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4
IDwgKGludClsaXN0SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBsaXN0SXRl
bXNbaW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRhZyk7Ci0gICAgICAgIGlmICghZm91bmQpIHsK
LSAgICAgICAgICAgIC8vIHRoaXMgb25lIGlzIG5vdCBzZWxlY3RhYmxlLCAgd2UgbmVlZCB0byBm
aW5kIGFuIG9wdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICB3aGlsZSAoKHVuc2lnbmVkKSBpbmRl
eCA8IGxpc3RJdGVtcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2lu
ZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5k
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlm
ICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgewotICAgICAg
ICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2luZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICAtLWluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotCi0gICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgaWYgKCBpbmRleCAhPSBzdGF0
aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmN1cnJlbnRJdGVtKCkgKQotICAgICAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+c2V0Q3VycmVudEl0ZW0o
IGluZGV4ICk7Ci0KLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0SXRl
bXMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFn
TmFtZShvcHRpb25UYWcpICYmIGkgIT0gKHVuc2lnbmVkIGludCkgaW5kZXgpCi0gICAgICAgICAg
ICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oIGxpc3RJdGVtc1tpXSAp
LT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRp
b25FbGVtZW50Kj4obGlzdEl0ZW1zW2luZGV4XSktPm1fc2VsZWN0ZWQgPSB0cnVlOwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkp
LT5vbkNoYW5nZSgpOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0OjpzZWxlY3Rpb25DaGFuZ2Vk
KFdpZGdldCopCi17Ci0gICAgaWYgKG1faWdub3JlU2VsZWN0RXZlbnRzKQotICAgICAgICByZXR1
cm47Ci0KLSAgICAvLyBkb24ndCB1c2UgbGlzdEl0ZW1zKCkgaGVyZSBhcyB3ZSBoYXZlIHRvIGF2
b2lkIHJlY2FsY3VsYXRpb25zIC0gY2hhbmdpbmcgdGhlCi0gICAgLy8gb3B0aW9uIGxpc3Qgd2ls
bCBtYWtlIHVzZSB1cGRhdGUgb3B0aW9ucyBub3QgaW4gdGhlIHdheSB0aGUgdXNlciBleHBlY3Rz
IHRoZW0KLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0
aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm1fbGlzdEl0ZW1zOwotICAgIGlu
dCBqID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGlzdEl0ZW1zLmNvdW50KCk7
IGkrKykgewotICAgICAgICAvLyBkb24ndCB1c2Ugc2V0U2VsZWN0ZWQoKSBoZXJlIGJlY2F1c2Ug
aXQgd2lsbCBjYXVzZSB1cyB0byBiZSBjYWxsZWQKLSAgICAgICAgLy8gYWdhaW4gd2l0aCB1cGRh
dGVTZWxlY3Rpb24uCi0gICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9u
VGFnKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oIGxpc3RJ
dGVtc1tpXSApCi0gICAgICAgICAgICAgICAgLT5tX3NlbGVjdGVkID0gc3RhdGljX2Nhc3Q8UUxp
c3RCb3gqPiggbV93aWRnZXQgKS0+aXNTZWxlY3RlZCggaiApOwotICAgICAgICBpZiAobGlzdEl0
ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgbGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1l
KG9wdGdyb3VwVGFnKSkKLSAgICAgICAgICAgICsrajsKLSAgICB9Ci0gICAgc3RhdGljX2Nhc3Q8
SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5vbkNoYW5nZSgpOwotfQotCi0KLXZvaWQgUmVu
ZGVyU2VsZWN0OjpzZXRPcHRpb25zQ2hhbmdlZChib29sIF9vcHRpb25zQ2hhbmdlZCkKLXsKLSAg
ICBtX29wdGlvbnNDaGFuZ2VkID0gX29wdGlvbnNDaGFuZ2VkOwotfQotCi1RTGlzdEJveCogUmVu
ZGVyU2VsZWN0OjpjcmVhdGVMaXN0Qm94KCkKLXsKLSAgICBRTGlzdEJveCAqbGIgPSBuZXcgUUxp
c3RCb3goKTsKLSAgICBsYi0+c2V0U2VsZWN0aW9uTW9kZShtX211bHRpcGxlID8gUUxpc3RCb3g6
OkV4dGVuZGVkIDogUUxpc3RCb3g6OlNpbmdsZSk7Ci0gICAgbV9pZ25vcmVTZWxlY3RFdmVudHMg
PSBmYWxzZTsKLSAgICByZXR1cm4gbGI7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp1cGRhdGVT
ZWxlY3Rpb24oKQotewotICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJdGVt
cyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1zKCk7
Ci0gICAgaW50IGk7Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkgewotICAgICAgICAvLyBpZiBtdWx0
aS1zZWxlY3QsIHdlIHNlbGVjdCBvbmx5IHRoZSBuZXcgc2VsZWN0ZWQgaW5kZXgKLSAgICAgICAg
UUxpc3RCb3ggKmxpc3RCb3ggPSBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KTsKLSAg
ICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW50KGxpc3RJdGVtcy5z
aXplKCkpOyBpKyspIHsKLSAgICAgICAgICAgIGxpc3RCb3gtPnNldFNlbGVjdGVkKGosIGxpc3RJ
dGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpICYmCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2ldKS0+
c2VsZWN0ZWQoKSk7Ci0gICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9w
dGlvblRhZykgfHwgbGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkKLSAgICAg
ICAgICAgICAgICArK2o7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNl
IHsKLSAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICB1bnNpZ25lZCBmaXJzdE9w
dGlvbiA9IGxpc3RJdGVtcy5zaXplKCk7Ci0gICAgICAgIGkgPSBsaXN0SXRlbXMuc2l6ZSgpOwot
ICAgICAgICB3aGlsZSAoaS0tKQotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFn
TmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kKQotICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpXSkt
Pm1fc2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpXSktPnNlbGVjdGVkKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4oIG1fd2lkZ2V0ICktPnNldEN1
cnJlbnRJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcnN0T3B0aW9uID0gaTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICBBU1NFUlQoZmlyc3RPcHRpb24gPT0gbGlzdEl0ZW1zLnNpemUoKSB8fCBm
b3VuZCk7Ci0gICAgfQotCi0gICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci19Ci0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyVGV4
dEFyZWE6OlJlbmRlclRleHRBcmVhKEhUTUxUZXh0QXJlYUVsZW1lbnQgKmVsZW1lbnQpCi0gICAg
OiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KSwgbV9kaXJ0eShmYWxzZSksIG1fdXBkYXRpbmco
ZmFsc2UpCi17Ci0gICAgUVRleHRFZGl0ICplZGl0ID0gbmV3IFFUZXh0RWRpdCh2aWV3KCkpOwot
Ci0gICAgaWYgKGVsZW1lbnQtPndyYXAoKSAhPSBIVE1MVGV4dEFyZWFFbGVtZW50Ojp0YV9Ob1dy
YXApCi0gICAgICAgIGVkaXQtPnNldFdvcmRXcmFwKFFUZXh0RWRpdDo6V2lkZ2V0V2lkdGgpOwot
ICAgIGVsc2UKLSAgICAgICAgZWRpdC0+c2V0V29yZFdyYXAoUVRleHRFZGl0OjpOb1dyYXApOwot
Ci0gICAgc2V0V2lkZ2V0KGVkaXQpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpkZXN0cm95
KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+cmVu
ZGVyZXJXaWxsQmVEZXN0cm95ZWQoKTsKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6ZGVzdHJveSgp
OwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtI
VE1MQXNzZXJ0KCAhbWluTWF4S25vd24oKSApOwotCi0gICAgUVRleHRFZGl0KiB3ID0gc3RhdGlj
X2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpOwotICAgIEludFNpemUgc2l6ZSh3LT5zaXplV2l0
aENvbHVtbnNBbmRSb3dzKAotICAgICAgICBtYXgoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxl
bWVudCo+KG5vZGUoKSktPmNvbHMoKSwgMSksCi0gICAgICAgIG1heChzdGF0aWNfY2FzdDxIVE1M
VGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+cm93cygpLCAxKSkpOwotCi0gICAgc2V0SW50cmlu
c2ljV2lkdGgoIHNpemUud2lkdGgoKSApOwotICAgIHNldEludHJpbnNpY0hlaWdodCggc2l6ZS5o
ZWlnaHQoKSApOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwot
fQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAg
ICBSZW5kZXJGb3JtRWxlbWVudDo6c2V0U3R5bGUocyk7Ci0KLSAgICBRVGV4dEVkaXQqIHcgPSBz
dGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7Ci0gICAgdy0+c2V0QWxpZ25tZW50KHRl
eHRBbGlnbm1lbnQoKSk7Ci0gICAgdy0+c2V0TGluZUhlaWdodChSZW5kZXJPYmplY3Q6OmxpbmVI
ZWlnaHQodHJ1ZSkpOwotCi0gICAgdy0+c2V0V3JpdGluZ0RpcmVjdGlvbihzdHlsZSgpLT5kaXJl
Y3Rpb24oKSA9PSBSVEwgPyBSVEwgOiBMVFIpOwotCi0gICAgU2Nyb2xsQmFyTW9kZSBzY3JvbGxN
b2RlID0gU2Nyb2xsQmFyQXV0bzsKLSAgICBzd2l0Y2ggKHN0eWxlKCktPm92ZXJmbG93KCkpIHsK
LSAgICAgICAgY2FzZSBPQVVUTzoKLSAgICAgICAgY2FzZSBPTUFSUVVFRTogLy8gbWFrZXMgbm8g
c2Vuc2UsIG1hcCB0byBhdXRvCi0gICAgICAgIGNhc2UgT09WRVJMQVk6IC8vIG5vdCBpbXBsZW1l
bnRlZCBmb3IgdGV4dCwgbWFwIHRvIGF1dG8KLSAgICAgICAgY2FzZSBPVklTSUJMRToKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9ISURERU46Ci0gICAgICAgICAgICBzY3JvbGxN
b2RlID0gU2Nyb2xsQmFyQWx3YXlzT2ZmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgT1NDUk9MTDoKLSAgICAgICAgICAgIHNjcm9sbE1vZGUgPSBTY3JvbGxCYXJBbHdheXNPbjsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBTY3JvbGxCYXJNb2RlIGhvcml6b250YWxT
Y3JvbGxNb2RlID0gc2Nyb2xsTW9kZTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVh
RWxlbWVudCo+KG5vZGUoKSktPndyYXAoKSAhPSBIVE1MVGV4dEFyZWFFbGVtZW50Ojp0YV9Ob1dy
YXApCi0gICAgICAgIGhvcml6b250YWxTY3JvbGxNb2RlID0gU2Nyb2xsQmFyQWx3YXlzT2ZmOwot
Ci0gICAgdy0+c2V0U2Nyb2xsQmFyTW9kZXMoaG9yaXpvbnRhbFNjcm9sbE1vZGUsIHNjcm9sbE1v
ZGUpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZXRFZGl0ZWQoYm9vbCB4KQotewotICAg
IG1fZGlydHkgPSB4OwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjp1cGRhdGVGcm9tRWxlbWVu
dCgpCi17Ci0gICAgSFRNTFRleHRBcmVhRWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEhUTUxUZXh0
QXJlYUVsZW1lbnQqPihub2RlKCkpOwotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFU
ZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLQotICAgIHctPnNldFJlYWRPbmx5KGUtPmlzUmVhZE9ubHlD
b250cm9sKCkpOwotICAgIHctPnNldERpc2FibGVkKGUtPmRpc2FibGVkKCkpOwotCi0gICAgU3Ry
aW5nIHdpZGdldFRleHQgPSB0ZXh0KCk7Ci0gICAgU3RyaW5nIHRleHQgPSBlLT52YWx1ZSgpOwot
ICAgIHRleHQucmVwbGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOwotICAg
IGlmICh3aWRnZXRUZXh0ICE9IHRleHQpIHsKLSAgICAgICAgaW50IGxpbmUsIGNvbDsKLSAgICAg
ICAgdy0+Z2V0Q3Vyc29yUG9zaXRpb24oICZsaW5lLCAmY29sICk7Ci0gICAgICAgIG1fdXBkYXRp
bmcgPSB0cnVlOwotICAgICAgICB3LT5zZXRUZXh0KHRleHQpOwotICAgICAgICBtX3VwZGF0aW5n
ID0gZmFsc2U7Ci0gICAgICAgIHctPnNldEN1cnNvclBvc2l0aW9uKCBsaW5lLCBjb2wgKTsKLSAg
ICB9Ci0gICAgbV9kaXJ0eSA9IGZhbHNlOwotCi0gICAgdy0+c2V0Q29sb3JzKHN0eWxlKCktPmJh
Y2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5jb2xvcigpKTsKLQotICAgIFJlbmRlckZvcm1FbGVt
ZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi1TdHJpbmcgUmVuZGVyVGV4dEFyZWE6OnRl
eHQoKQotewotICAgIFN0cmluZyB0eHQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdl
dCktPnRleHQoKTsKLSAgICByZXR1cm4gdHh0LnJlcGxhY2UoYmFja3NsYXNoQXNDdXJyZW5jeVN5
bWJvbCgpLCAnXFwnKTsKLX0KLQotU3RyaW5nIFJlbmRlclRleHRBcmVhOjp0ZXh0V2l0aEhhcmRM
aW5lQnJlYWtzKCkKLXsKLSAgICBTdHJpbmcgdHh0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4o
bV93aWRnZXQpLT50ZXh0V2l0aEhhcmRMaW5lQnJlYWtzKCk7Ci0gICAgcmV0dXJuIHR4dC5yZXBs
YWNlKGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGV4dEFyZWE6OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX3VwZGF0aW5nKQot
ICAgICAgICByZXR1cm47Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5v
ZGUoKSktPmludmFsaWRhdGVWYWx1ZSgpOwotICAgIG1fZGlydHkgPSB0cnVlOwotfQotCi1pbnQg
UmVuZGVyVGV4dEFyZWE6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRF
ZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICByZXR1cm4gdGV4
dEVkaXQtPnNlbGVjdGlvblN0YXJ0KCk7Ci19Ci0KLWludCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0
aW9uRW5kKCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRF
ZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICByZXR1cm4gdGV4dEVkaXQtPnNlbGVjdGlvbkVuZCgpOwor
ICAgIHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24qPih3aWRnZXQoKSktPmNsaWNrKHNlbmRNb3Vz
ZUV2ZW50cyk7CiB9CiAKLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvblN0YXJ0KGlu
dCBzdGFydCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRF
ZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQp
OwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsK
LSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lk
Z2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyVGV4dEFyZWE6OnNlbGVjdCgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1f
d2lkZ2V0KS0+c2VsZWN0QWxsKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVj
dGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0
ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0
U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZC1zdGFydCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFy
ZWE6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0
aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7Ci0KLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8g
Y2FsbCBvbnNlbGVjdCBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHNlbGVjdGlvbgotICAgIGlmICgh
dy0+aGFzU2VsZWN0ZWRUZXh0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBzdGF0aWNf
Y2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+b25TZWxlY3QoKTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclNsaWRlcjo6UmVuZGVyU2xpZGVyKEhUTUxJbnB1
dEVsZW1lbnQqIGVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewot
ICAgIHNldFdpZGdldChuZXcgUVNsaWRlcik7Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjpjYWxj
TWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLSAgICAK
LSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0g
ICAgSW50U2l6ZSBzKHdpZGdldCgpLT5zaXplSGludCgpKTsKLSAgICBib29sIHdpZHRoU2V0ID0g
IXN0eWxlKCktPndpZHRoKCkuaXNBdXRvKCk7Ci0gICAgYm9vbCBoZWlnaHRTZXQgPSAhc3R5bGUo
KS0+aGVpZ2h0KCkuaXNBdXRvKCk7Ci0gICAgaWYgKGhlaWdodFNldCAmJiAhd2lkdGhTZXQpIHsK
LSAgICAgICAgLy8gRmxpcCB0aGUgaW50cmluc2ljIGRpbWVuc2lvbnMuCi0gICAgICAgIGludCBi
YXJMZW5ndGggPSBzLndpZHRoKCk7Ci0gICAgICAgIHMgPSBJbnRTaXplKHMuaGVpZ2h0KCksIGJh
ckxlbmd0aCk7Ci0gICAgfQotICAgIHNldEludHJpbnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAg
c2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkpOwotICAgIAotICAgIFJlbmRlckZvcm1FbGVt
ZW50OjpjYWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJTbGlkZXI6OnVwZGF0ZUZy
b21FbGVtZW50KCkKLXsKLSAgICBTdHJpbmcgdmFsdWUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+dmFsdWUoKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1pblN0
ciA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUo
bWluQXR0cik7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBtYXhTdHIgPSBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKG1heEF0dHIpOwotICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgcHJlY2lzaW9uID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVu
dCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShwcmVjaXNpb25BdHRyKTsKLSAgICAKLSAgICBkb3Vi
bGUgbWluVmFsID0gbWluU3RyLmlzTnVsbCgpID8gMC4wIDogbWluU3RyLmRlcHJlY2F0ZWRTdHJp
bmcoKS50b0RvdWJsZSgpOwotICAgIGRvdWJsZSBtYXhWYWwgPSBtYXhTdHIuaXNOdWxsKCkgPyAx
MDAuMCA6IG1heFN0ci5kZXByZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICBtaW5WYWwg
PSBtaW4obWluVmFsLCBtYXhWYWwpOyAvLyBNYWtlIHN1cmUgdGhlIHJhbmdlIGlzIHNhbmUuCi0g
ICAgCi0gICAgZG91YmxlIHZhbCA9IHZhbHVlLmlzTnVsbCgpID8gKG1heFZhbCArIG1pblZhbCkv
Mi4wIDogdmFsdWUuZGVwcmVjYXRlZFN0cmluZygpLnRvRG91YmxlKCk7Ci0gICAgdmFsID0gbWF4
KG1pblZhbCwgbWluKHZhbCwgbWF4VmFsKSk7IC8vIE1ha2Ugc3VyZSB2YWwgaXMgd2l0aGluIG1p
bi9tYXguCi0gICAgCi0gICAgLy8gRm9yY2UgaW50ZWdlciB2YWx1ZSBpZiBub3QgZmxvYXQuCi0g
ICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShwcmVjaXNpb24sICJmbG9hdCIpKQotICAgICAgICB2
YWwgPSAoaW50KSh2YWwgKyAwLjUpOwotCi0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVu
dCo+KG5vZGUoKSktPnNldFZhbHVlKFN0cmluZzo6bnVtYmVyKHZhbCkpOwotCi0gICAgUVNsaWRl
ciogc2xpZGVyID0gKFFTbGlkZXIqKXdpZGdldCgpOwotICAgICAKLSAgICBzbGlkZXItPnNldE1p
blZhbHVlKG1pblZhbCk7Ci0gICAgc2xpZGVyLT5zZXRNYXhWYWx1ZShtYXhWYWwpOwotICAgIHNs
aWRlci0+c2V0VmFsdWUodmFsKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9t
RWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclNsaWRlcjo6dmFsdWVDaGFuZ2VkKFdpZGdldCop
Ci17Ci0gICAgUVNsaWRlciogc2xpZGVyID0gc3RhdGljX2Nhc3Q8UVNsaWRlcio+KHdpZGdldCgp
KTsKLQotICAgIGRvdWJsZSB2YWwgPSBzbGlkZXItPnZhbHVlKCk7Ci0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBwcmVjaXNpb24gPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgp
KS0+Z2V0QXR0cmlidXRlKHByZWNpc2lvbkF0dHIpOwotCi0gICAgLy8gRm9yY2UgaW50ZWdlciB2
YWx1ZSBpZiBub3QgZmxvYXQuCi0gICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShwcmVjaXNpb24s
ICJmbG9hdCIpKQotICAgICAgICB2YWwgPSAoaW50KSh2YWwgKyAwLjUpOwotCi0gICAgc3RhdGlj
X2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlKFN0cmluZzo6bnVtYmVy
KHZhbCkpOwotICAgIAotICAgIC8vIEZpcmUgdGhlICJpbnB1dCIgRE9NIGV2ZW50LgotICAgIHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChp
bnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckZvcm1FbGVtZW50LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRm9ybUVsZW1lbnQuaAkocmV2aXNpb24gMTQzNDIp
CisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJGb3JtRWxlbWVudC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yMywyODYgKzIzLDYwIEBACiAgKgogICovCiAKLSNpZm5kZWYgUkVOREVSX0ZPUk1fSAot
I2RlZmluZSBSRU5ERVJfRk9STV9ICisjaWZuZGVmIFJlbmRlckZvcm1FbGVtZW50X2gKKyNkZWZp
bmUgUmVuZGVyRm9ybUVsZW1lbnRfaAogCiAjaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCiAjaW5j
bHVkZSAiR3JhcGhpY3NUeXBlcy5oIgotI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCi0jaW5jbHVk
ZSAiUmVuZGVySW1hZ2UuaCIKLQotY2xhc3MgUUxpc3RCb3g7CiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotY2xhc3MgRG9jTG9hZGVyOwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotY2xhc3MgSFRN
TEdlbmVyaWNGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Ci1jbGFzcyBIVE1M
U2VsZWN0RWxlbWVudDsKLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQgOiBwdWJsaWMgUmVuZGVyV2lkZ2V0
Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dCogbm9kZSk7Ci0gICAgdmlydHVhbCB+UmVuZGVyRm9ybUVsZW1lbnQoKTsKLQotICAgIHZpcnR1
YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGb3JtIjsg
fQotCi0gICAgdmlydHVhbCBib29sIGlzRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9Ci0KLSAgICAvLyBBcXVhIGZvcm0gY29udHJvbHMgbmV2ZXIgaGF2ZSBib3JkZXIvcGFkZGlu
Zy4KLSAgICBpbnQgYm9yZGVyVG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBib3Jk
ZXJCb3R0b20oKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckxlZnQoKSBjb25z
dCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsg
fQotICAgIGludCBwYWRkaW5nVG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRk
aW5nQm90dG9tKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nTGVmdCgpIGNv
bnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ1JpZ2h0KCkgY29uc3QgeyByZXR1cm4g
MDsgfQotCi0gICAgLy8gQXF1YSBjb250cm9scyB1c2UgaW50cmluc2ljIG1hcmdpbiB2YWx1ZXMg
aW4gb3JkZXIgdG8gbGVhdmUgc3BhY2UgZm9yIGZvY3VzIHJpbmdzCi0gICAgLy8gYW5kIHRvIGtl
ZXAgY29udHJvbHMgZnJvbSBidXR0aW5nIHVwIGFnYWluc3Qgb25lIGFub3RoZXIuICBUaGlzIGlu
dHJpbnNpYyBtYXJnaW4KLSAgICAvLyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIFdlYiBwYWdlIGFs
bG93cyB0aGUgY29udHJvbCB0byBzaXplIGludHJpbnNpY2FsbHkuICBJZiB0aGUKLSAgICAvLyBX
ZWIgcGFnZSBzcGVjaWZpZXMgYW4gZXhwbGljaXQgd2lkdGggZm9yIGEgY29udHJvbCwgdGhlbiB3
ZSBnbyBhaGVhZCBhbmQgaG9ub3IgdGhhdAotICAgIC8vIHByZWNpc2Ugd2lkdGguICBTaW1pbGFy
bHksIGlmIGEgV2ViIHBhZ2UgdXNlcyBhIHNwZWNpZmljIG1hcmdpbiB2YWx1ZSwgd2Ugd2lsbCBn
byBhaGVhZAotICAgIC8vIGFuZCBob25vciB0aGF0IHZhbHVlLiAgCi0gICAgdm9pZCBhZGRJbnRy
aW5zaWNNYXJnaW5zSWZBbGxvd2VkKFJlbmRlclN0eWxlKiBfc3R5bGUpOwotICAgIHZpcnR1YWwg
Ym9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0g
ICAgaW50IGludHJpbnNpY01hcmdpbigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
RnJvbUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0dWFs
IHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wsIGJvb2wgKSBjb25zdDsKLQotcHJpdmF0ZToK
LSAgICB2aXJ0dWFsIHZvaWQgY2xpY2tlZChXaWRnZXQqKTsKLQotcHJvdGVjdGVkOgotICAgIHZp
cnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIEhv
cml6b250YWxBbGlnbm1lbnQgdGV4dEFsaWdubWVudCgpIGNvbnN0OwotfTsKLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJJbWFnZUJ1dHRvbiA6IHB1YmxpYyBSZW5kZXJJbWFn
ZQotewotcHVibGljOgotICAgIFJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQqKTsK
LQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJS
ZW5kZXJJbWFnZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZUJ1dHRvbigpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
UmVuZGVyTGluZUVkaXQgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAg
ICBSZW5kZXJMaW5lRWRpdChIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
Y2FsY01pbk1heFdpZHRoKCk7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsg
cmV0dXJuIGludHJpbnNpY0hlaWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRy
aW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBjb25z
dCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxpbmVFZGl0IjsgfQot
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBz
ZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAg
IGludCBzZWxlY3Rpb25FbmQoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblN0YXJ0KGludCk7Ci0g
ICAgdm9pZCBzZXRTZWxlY3Rpb25FbmQoaW50KTsKLSAgICAKLSAgICBib29sIGlzRWRpdGVkKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRFZGl0ZWQoYm9vbCk7Ci0gICAgYm9vbCBpc1RleHRGaWVsZCgp
IGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0
U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhZGRTZWFyY2hS
ZXN1bHQoKTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRn
ZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1
YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBwZXJm
b3JtU2VhcmNoKFdpZGdldCopOwotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25z
dCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckZpZWxkc2V0IDogcHVibGljIFJlbmRlckJsb2Nr
Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCop
OwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4g
IlJlbmRlckZpZWxkU2V0IjsgfQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91dExl
Z2VuZChib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxl
KFJlbmRlclN0eWxlKik7Ci0gICAgCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBwYWludEJv
eERlY29yYXRpb25zKFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2b2lkIHBhaW50
Qm9yZGVyTWludXNMZWdlbmQoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGludCB3
LCBpbnQgaCwgY29uc3QgUmVuZGVyU3R5bGUgKiwgaW50IGx4LCBpbnQgbHcpOwotICAgIFJlbmRl
ck9iamVjdCogZmluZExlZ2VuZCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBSZW5kZXJGaWxlQnV0dG9uIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6
Ci0gICAgUmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFs
IGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmlsZUJ1dHRv
biI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2
b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdm9pZCBzZWxlY3QoKTsKLQotICAgIGludCBj
YWxjUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgfQot
Ci0gICAgdm9pZCBjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cyk7Ci0KLXByb3RlY3RlZDoKLSAg
ICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJp
dmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0
dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBSZW5kZXJMYWJlbCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVi
bGljOgotICAgIFJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpOwot
Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJl
bmRlckxhYmVsIjsgfQotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRl
ckxlZ2VuZCA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAgIFJlbmRlckxlZ2Vu
ZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KTsKLQotICAgIHZpcnR1YWwgY29uc3Qg
Y2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMZWdlbmQiOyB9Ci19Owot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlclNlbGVjdCA6IHB1YmxpYyBSZW5k
ZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxl
bWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyBy
ZXR1cm4gIlJlbmRlclNlbGVjdCI7IH0KLQotICAgIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJv
b2wgZiwgYm9vbCBiICkgY29uc3Q7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0
IHsgaWYgKCFtX3VzZUxpc3RCb3gpIHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgcmV0dXJuIFJl
bmRlckZvcm1FbGVtZW50OjpjYWxjUmVwbGFjZWRIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgYm9v
bCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAg
IHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0
KCk7Ci0KLSAgICB2b2lkIHNldE9wdGlvbnNDaGFuZ2VkKGJvb2wgX29wdGlvbnNDaGFuZ2VkKTsK
LQotICAgIGJvb2wgc2VsZWN0aW9uQ2hhbmdlZCgpIHsgcmV0dXJuIG1fc2VsZWN0aW9uQ2hhbmdl
ZDsgfQotICAgIHZvaWQgc2V0U2VsZWN0aW9uQ2hhbmdlZChib29sIF9zZWxlY3Rpb25DaGFuZ2Vk
KSB7IG1fc2VsZWN0aW9uQ2hhbmdlZCA9IF9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdmlydHVh
bCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJl
bmRlclN0eWxlICopOwotCi0gICAgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKTsKLQotcHJvdGVjdGVk
OgotICAgIFFMaXN0Qm94ICpjcmVhdGVMaXN0Qm94KCk7Ci0gICAgdm9pZCBzZXRXaWRnZXRXcml0
aW5nRGlyZWN0aW9uKCk7Ci0KLSAgICB1bnNpZ25lZCAgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0
aXBsZTsKLSAgICBib29sIG1fdXNlTGlzdEJveDsKLSAgICBib29sIG1fc2VsZWN0aW9uQ2hhbmdl
ZDsKLSAgICBib29sIG1faWdub3JlU2VsZWN0RXZlbnRzOwotICAgIGJvb2wgbV9vcHRpb25zQ2hh
bmdlZDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCop
OwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUZXh0QXJlYSA6IHB1YmxpYyBSZW5kZXJG
b3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclRleHRBcmVhKEhUTUxUZXh0QXJlYUVs
ZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIGNv
bnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGV4dEFyZWEiOyB9
Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHls
ZSAqKTsKLQotICAgIGJvb2wgaXNUZXh0QXJlYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAg
ICBib29sIGlzRWRpdGVkKCkgY29uc3QgeyByZXR1cm4gbV9kaXJ0eTsgfQotICAgIHZvaWQgc2V0
RWRpdGVkIChib29sKTsKLSAgICAKLSAgICBTdHJpbmcgdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0
V2l0aEhhcmRMaW5lQnJlYWtzKCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBp
bnQgc2VsZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAg
IHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0gICAgCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAg
ICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIGJv
b2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXBy
aXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0
dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKLSAgICAKLXByb3RlY3RlZDoKLSAg
ICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAg
IGJvb2wgbV9kaXJ0eTsKLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLWNsYXNzIFJlbmRlclNsaWRlciA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAot
ewotcHVibGljOgotICAgIFJlbmRlclNsaWRlcihIVE1MSW5wdXRFbGVtZW50Kik7Ci0gICAgCi0g
ICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRl
clNsaWRlciI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBj
b25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgp
OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotCi1wcml2YXRlOgotICAg
IHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci19OworICAgIGNsYXNzIEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnQ7CisKKyAgICBjbGFzcyBSZW5kZXJGb3JtRWxlbWVudCA6IHB1Ymxp
YyBSZW5kZXJXaWRnZXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyRm9ybUVsZW1lbnQo
SFRNTEdlbmVyaWNGb3JtRWxlbWVudCopOworICAgICAgICB2aXJ0dWFsIH5SZW5kZXJGb3JtRWxl
bWVudCgpOworCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0
IHsgcmV0dXJuICJSZW5kZXJGb3JtIjsgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0Zvcm1F
bGVtZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIC8vIEFxdWEgZm9ybSBj
b250cm9scyBuZXZlciBoYXZlIGJvcmRlci9wYWRkaW5nLgorICAgICAgICBpbnQgYm9yZGVyVG9w
KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgICAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29uc3Qg
eyByZXR1cm4gMDsgfQorICAgICAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KKyAgICAgICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgICAg
ICBpbnQgcGFkZGluZ1RvcCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICAgICAgaW50IHBhZGRp
bmdCb3R0b20oKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgICAgIGludCBwYWRkaW5nTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICAgICAgaW50IHBhZGRpbmdSaWdodCgpIGNvbnN0IHsg
cmV0dXJuIDA7IH0KKworICAgICAgICAvLyBBcXVhIGNvbnRyb2xzIHVzZSBpbnRyaW5zaWMgbWFy
Z2luIHZhbHVlcyBpbiBvcmRlciB0byBsZWF2ZSBzcGFjZSBmb3IgZm9jdXMgcmluZ3MKKyAgICAg
ICAgLy8gYW5kIHRvIGtlZXAgY29udHJvbHMgZnJvbSBidXR0aW5nIHVwIGFnYWluc3Qgb25lIGFu
b3RoZXIuICBUaGlzIGludHJpbnNpYyBtYXJnaW4KKyAgICAgICAgLy8gaXMgb25seSBhcHBsaWVk
IGlmIHRoZSBXZWIgcGFnZSBhbGxvd3MgdGhlIGNvbnRyb2wgdG8gc2l6ZSBpbnRyaW5zaWNhbGx5
LiAgSWYgdGhlCisgICAgICAgIC8vIFdlYiBwYWdlIHNwZWNpZmllcyBhbiBleHBsaWNpdCB3aWR0
aCBmb3IgYSBjb250cm9sLCB0aGVuIHdlIGdvIGFoZWFkIGFuZCBob25vciB0aGF0CisgICAgICAg
IC8vIHByZWNpc2Ugd2lkdGguICBTaW1pbGFybHksIGlmIGEgV2ViIHBhZ2UgdXNlcyBhIHNwZWNp
ZmljIG1hcmdpbiB2YWx1ZSwgd2Ugd2lsbCBnbyBhaGVhZAorICAgICAgICAvLyBhbmQgaG9ub3Ig
dGhhdCB2YWx1ZS4gIAorICAgICAgICB2b2lkIGFkZEludHJpbnNpY01hcmdpbnNJZkFsbG93ZWQo
UmVuZGVyU3R5bGUqKTsKKyAgICAgICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJn
aW5zKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgaW50IGludHJpbnNpY01hcmdp
bigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUo
UmVuZGVyU3R5bGUqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7
CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGxheW91dCgpOworICAgICAgICB2aXJ0dWFsIHNob3J0
IGJhc2VsaW5lUG9zaXRpb24oYm9vbCwgYm9vbCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6Cisg
ICAgICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
KworICAgICAgICBIb3Jpem9udGFsQWxpZ25tZW50IHRleHRBbGlnbm1lbnQoKSBjb25zdDsKKwor
ICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbGlja2VkKFdpZGdldCopOworICAg
IH07CiAKLX0gLy9uYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmCisj
ZW5kaWYgLy8gUmVuZGVyRm9ybUVsZW1lbnRfaApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyRmllbGRzZXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckZp
ZWxkc2V0LmNwcAkocmV2aXNpb24gMTQzNDIpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJG
aWVsZHNldC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDM0OCArMjQsMjAgQEAKICAqLwogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicmVuZGVyX2Zvcm0uaCIKKyNpbmNsdWRlICJS
ZW5kZXJGaWVsZHNldC5oIgogCi0jaW5jbHVkZSAiQnJvd3NlckV4dGVuc2lvbi5oIgotI2luY2x1
ZGUgIkV2ZW50TmFtZXMuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJIVE1M
Rm9ybUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTE9wdEdyb3VwRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCi0j
aW5jbHVkZSAiSFRNTFNlbGVjdEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MVGV4dEFyZWFFbGVt
ZW50LmgiCi0jaW5jbHVkZSAiS1dRQ29tYm9Cb3guaCIKLSNpbmNsdWRlICJLV1FGaWxlQnV0dG9u
LmgiCi0jaW5jbHVkZSAiS1dRTGluZUVkaXQuaCIKLSNpbmNsdWRlICJLV1FTbGlkZXIuaCIKLSNp
bmNsdWRlICJLV1FUZXh0RWRpdC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgot
I2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgorI2luY2x1ZGUgIkhUTUxHZW5lcmljRm9ybUVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsK
K3VzaW5nIHN0ZDo6bWluOwordXNpbmcgc3RkOjptYXg7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVz
OwogCi1SZW5kZXJGb3JtRWxlbWVudDo6UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlcldpZGdldChlbGVtZW50KQotewotICAgIHNl
dElubGluZSh0cnVlKTsKLX0KLQotUmVuZGVyRm9ybUVsZW1lbnQ6On5SZW5kZXJGb3JtRWxlbWVu
dCgpCi17Ci19Ci0KLXNob3J0IFJlbmRlckZvcm1FbGVtZW50OjpiYXNlbGluZVBvc2l0aW9uKCBi
b29sIGYsIGJvb2wgaXNSb290TGluZUJveCApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1hcmdpblRv
cCgpICsgd2lkZ2V0KCktPmJhc2VsaW5lUG9zaXRpb24obV9oZWlnaHQpOwotfQotCi12b2lkIFJl
bmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShSZW5kZXJTdHlsZSogcykKLXsKLSAgICBpZiAoY2Fu
SGF2ZUludHJpbnNpY01hcmdpbnMoKSkKLSAgICAgICAgYWRkSW50cmluc2ljTWFyZ2luc0lmQWxs
b3dlZChzKTsKLQotICAgIFJlbmRlcldpZGdldDo6c2V0U3R5bGUocyk7Ci0KLSAgICAvLyBEbyBu
b3QgcGFpbnQgYSBiYWNrZ3JvdW5kIG9yIGJvcmRlciBmb3IgQXF1YSBmb3JtIGVsZW1lbnRzCi0g
ICAgc2V0U2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIoZmFsc2UpOwotCi0gICAgbV93aWRn
ZXQtPnNldEZvbnQoc3R5bGUoKS0+Zm9udCgpKTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVu
dDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIG1fd2lkZ2V0LT5zZXRFbmFibGVkKCFzdGF0
aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7Ci19
Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQo
IG5lZWRzTGF5b3V0KCkgKTsKLSAgICBLSFRNTEFzc2VydCggbWluTWF4S25vd24oKSApOwotCi0g
ICAgLy8gbWluaW11bSBoZWlnaHQKLSAgICBtX2hlaWdodCA9IDA7Ci0KLSAgICBjYWxjV2lkdGgo
KTsKLSAgICBjYWxjSGVpZ2h0KCk7Ci0gICAgCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwot
fQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpjbGlja2VkKFdpZGdldCopCi17Ci0gICAgUmVu
ZGVyQXJlbmEqIGFyZW5hID0gcmVmKCk7Ci0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGV2ZW50OyAv
LyBnZXRzICJjdXJyZW50IGV2ZW50IgotICAgIGlmIChub2RlKCkpCi0gICAgICAgIHN0YXRpY19j
YXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5vZGUoKSktPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwg
Y2xpY2tFdmVudCwgZXZlbnQuY2xpY2tDb3VudCgpKTsKLSAgICBkZXJlZihhcmVuYSk7Ci19Ci0K
LUhvcml6b250YWxBbGlnbm1lbnQgUmVuZGVyRm9ybUVsZW1lbnQ6OnRleHRBbGlnbm1lbnQoKSBj
b25zdAotewotICAgIHN3aXRjaCAoc3R5bGUoKS0+dGV4dEFsaWduKCkpIHsKLSAgICAgICAgY2Fz
ZSBMRUZUOgotICAgICAgICBjYXNlIEtIVE1MX0xFRlQ6Ci0gICAgICAgICAgICByZXR1cm4gQWxp
Z25MZWZ0OwotICAgICAgICBjYXNlIFJJR0hUOgotICAgICAgICBjYXNlIEtIVE1MX1JJR0hUOgot
ICAgICAgICAgICAgcmV0dXJuIEFsaWduUmlnaHQ7Ci0gICAgICAgIGNhc2UgQ0VOVEVSOgotICAg
ICAgICBjYXNlIEtIVE1MX0NFTlRFUjoKLSAgICAgICAgICAgIHJldHVybiBBbGlnbkhDZW50ZXI7
Ci0gICAgICAgIGNhc2UgSlVTVElGWToKLSAgICAgICAgICAgIC8vIEp1c3QgZmFsbCBpbnRvIHRo
ZSBhdXRvIGNvZGUgZm9yIGp1c3RpZnkuCi0gICAgICAgIGNhc2UgVEFBVVRPOgotICAgICAgICAg
ICAgcmV0dXJuIHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IEFsaWduUmlnaHQgOiBBbGln
bkxlZnQ7Ci0gICAgfQotICAgIEFTU0VSVChmYWxzZSk7IC8vIFNob3VsZCBuZXZlciBiZSByZWFj
aGVkLgotICAgIHJldHVybiBBbGlnbkxlZnQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVu
dDo6YWRkSW50cmluc2ljTWFyZ2luc0lmQWxsb3dlZChSZW5kZXJTdHlsZSogX3N0eWxlKQotewot
ICAgIC8vIEN1dCBvdXQgdGhlIGludHJpbnNpYyBtYXJnaW5zIGNvbXBsZXRlbHkgaWYgd2UgZW5k
IHVwIHVzaW5nIG1pbmkgY29udHJvbHMuCi0gICAgaWYgKF9zdHlsZS0+Zm9udFNpemUoKSA8IDEx
KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdo
dCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMg
Zmxhd2VkLgotICAgIGludCBtID0gaW50cmluc2ljTWFyZ2luKCk7Ci0gICAgaWYgKF9zdHlsZS0+
d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdp
bkxlZnQoKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0
aChtLCBGaXhlZCkpOwotICAgICAgICBpZiAoX3N0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkp
Ci0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChtLCBGaXhlZCkpOwot
ICAgIH0KLQotICAgIGlmIChfc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7Ci0gICAgICAgIGlm
IChfc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1h
cmdpblRvcChMZW5ndGgobSwgRml4ZWQpKTsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luQm90
dG9tKCkucXVpcmsoKSkKLSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0
aChtLCBGaXhlZCkpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1S
ZW5kZXJJbWFnZUJ1dHRvbjo6UmVuZGVySW1hZ2VCdXR0b24oSFRNTElucHV0RWxlbWVudCAqZWxl
bWVudCkKLSAgICA6IFJlbmRlckltYWdlKGVsZW1lbnQpCi17Ci0gICAgLy8gIyMjIHN1cHBvcnQg
RE9NQWN0aXZhdGUgZXZlbnQgd2hlbiBjbGlja2VkCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJMaW5lRWRpdDo6UmVu
ZGVyTGluZUVkaXQoSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1F
bGVtZW50KGVsZW1lbnQpLCBtX3VwZGF0aW5nKGZhbHNlKQotewotICAgIFFMaW5lRWRpdDo6VHlw
ZSB0eXBlOwotICAgIHN3aXRjaCAoZWxlbWVudC0+aW5wdXRUeXBlKCkpIHsKLSAgICAgICAgY2Fz
ZSBIVE1MSW5wdXRFbGVtZW50OjpQQVNTV09SRDoKLSAgICAgICAgICAgIHR5cGUgPSBRTGluZUVk
aXQ6OlBhc3N3b3JkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSFRNTElucHV0
RWxlbWVudDo6U0VBUkNIOgotICAgICAgICAgICAgdHlwZSA9IFFMaW5lRWRpdDo6U2VhcmNoOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0eXBlID0g
UUxpbmVFZGl0OjpOb3JtYWw7Ci0gICAgfQotICAgIFFMaW5lRWRpdCogZWRpdCA9IG5ldyBRTGlu
ZUVkaXQodHlwZSk7Ci0gICAgaWYgKHR5cGUgPT0gUUxpbmVFZGl0OjpTZWFyY2gpCi0gICAgICAg
IGVkaXQtPnNldExpdmVTZWFyY2goZmFsc2UpOwotICAgIHNldFdpZGdldChlZGl0KTsKLX0KLQot
dm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIC8v
IFdlIG9ubHkgd2FudCB0byBjYWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFjdHVhbGx5IGlzIGEgc2Vs
ZWN0aW9uCi0gICAgUUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRn
ZXQpOwotICAgIGlmICh3LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8
SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5vZGUoKSktPm9uU2VsZWN0KCk7Ci19Ci0KLXZvaWQg
UmVuZGVyTGluZUVkaXQ6OnJldHVyblByZXNzZWQoV2lkZ2V0KikKLXsKLSAgICAvLyBFbWl0IG9u
Q2hhbmdlIGlmIG5lY2Vzc2FyeQotICAgIC8vIFdvcmtzIGJ1dCBtaWdodCBub3QgYmUgZW5vdWdo
LCBkaXJrIHNhaWQgaGUgaGFkIGFub3RoZXIgc29sdXRpb24gYXQKLSAgICAvLyBoYW5kIChjYW4n
dCByZW1lbWJlciB3aGljaCkgLSBEYXZpZAotICAgIGlmIChpc1RleHRGaWVsZCgpICYmIGlzRWRp
dGVkKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5v
ZGUoKSktPm9uQ2hhbmdlKCk7Ci0gICAgICAgIHNldEVkaXRlZChmYWxzZSk7Ci0gICAgfQotCi0g
ICAgaWYgKEhUTUxGb3JtRWxlbWVudCogZmUgPSBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpKQotICAgICAgICBmZS0+c3VibWl0Q2xpY2soKTsKLX0K
LQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6cGVyZm9ybVNlYXJjaChXaWRnZXQqKQotewotICAgIC8v
IEZpcmUgdGhlICJzZWFyY2giIERPTSBldmVudC4KLSAgICBzdGF0aWNfY2FzdDxFdmVudFRhcmdl
dE5vZGUqPihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChzZWFyY2hFdmVudCwgdHJ1ZSwgZmFs
c2UpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjphZGRTZWFyY2hSZXN1bHQoKQotewotICAg
IGlmICh3aWRnZXQoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkp
LT5hZGRTZWFyY2hSZXN1bHQoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6Y2FsY01pbk1h
eFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyBM
ZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAgbV91cGRh
dGluZyA9IHRydWU7Ci0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNfY2FzdDxRTGluZUVkaXQq
Pih3aWRnZXQoKSktPnNpemVGb3JDaGFyYWN0ZXJXaWR0aChzaXplID4gMCA/IHNpemUgOiAyMCkp
OwotICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLQotICAgIHNldEludHJpbnNpY1dpZHRoKHMud2lk
dGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkpOwotCi0gICAgUmVuZGVy
Rm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0
OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6c2V0
U3R5bGUocyk7Ci0KLSAgICBRTGluZUVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3
aWRnZXQoKSk7Ci0gICAgdy0+c2V0QWxpZ25tZW50KHRleHRBbGlnbm1lbnQoKSk7Ci0gICAgdy0+
c2V0V3JpdGluZ0RpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwgPyBSVEwgOiBM
VFIpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0g
ICAgSFRNTElucHV0RWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihu
b2RlKCkpOwotICAgIFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdl
dCgpKTsKLSAgICAKLSAgICBpbnQgbWwgPSBlLT5tYXhMZW5ndGgoKTsKLSAgICBpZiAobWwgPD0g
MCB8fCBtbCA+IDEwMjQpCi0gICAgICAgIG1sID0gMTAyNDsKLSAgICBpZiAody0+bWF4TGVuZ3Ro
KCkgIT0gbWwpCi0gICAgICAgIHctPnNldE1heExlbmd0aChtbCk7Ci0KLSAgICBpZiAoIWUtPnZh
bHVlTWF0Y2hlc1JlbmRlcmVyKCkpIHsKLSAgICAgICAgU3RyaW5nIHdpZGdldFRleHQgPSB3LT50
ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gZS0+dmFsdWUoKTsKLSAgICAgICAgbmV3
VGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAg
IGlmICh3aWRnZXRUZXh0ICE9IG5ld1RleHQpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSB3LT5j
dXJzb3JQb3NpdGlvbigpOwotCi0gICAgICAgICAgICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAgICAg
ICAgICAgIHctPnNldFRleHQobmV3VGV4dCk7Ci0gICAgICAgICAgICBtX3VwZGF0aW5nID0gZmFs
c2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHctPnNldEVkaXRlZCggZmFsc2UgKTsKLQot
ICAgICAgICAgICAgdy0+c2V0Q3Vyc29yUG9zaXRpb24ocG9zKTsKLSAgICAgICAgfQotICAgICAg
ICBlLT5zZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpOwotICAgIH0KLQotICAgIHctPnNldFJlYWRP
bmx5KGUtPmlzUmVhZE9ubHlDb250cm9sKCkpOwotICAgIAotICAgIC8vIEhhbmRsZSB1cGRhdGlu
ZyB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMuCi0gICAgdy0+c2V0UGxhY2Vob2xkZXJTdHJpbmcoZS0+
Z2V0QXR0cmlidXRlKHBsYWNlaG9sZGVyQXR0cikuZGVwcmVjYXRlZFN0cmluZygpKTsKLSAgICBp
ZiAody0+dHlwZSgpID09IFFMaW5lRWRpdDo6U2VhcmNoKSB7Ci0gICAgICAgIHctPnNldExpdmVT
ZWFyY2goIWUtPmdldEF0dHJpYnV0ZShpbmNyZW1lbnRhbEF0dHIpLmlzTnVsbCgpKTsKLSAgICAg
ICAgdy0+c2V0QXV0b1NhdmVOYW1lKGUtPmdldEF0dHJpYnV0ZShhdXRvc2F2ZUF0dHIpKTsKLSAg
ICAgICAgdy0+c2V0TWF4UmVzdWx0cyhlLT5tYXhSZXN1bHRzKCkpOwotICAgIH0KLQotICAgIHct
PnNldENvbG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Y29sb3IoKSk7
Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotdm9p
ZCBSZW5kZXJMaW5lRWRpdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgaWYgKG1fdXBk
YXRpbmcpIC8vIERvbid0IGFsdGVyIHRoZSB2YWx1ZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBv
ZiBpbml0aW5nIHRoZSBjb250cm9sLCBzaW5jZQotICAgICAgICByZXR1cm47ICAgICAvLyB3ZSBh
cmUgZ2V0dGluZyB0aGUgdmFsdWUgZnJvbSB0aGUgRE9NIGFuZCBpdCdzIG5vdCB1c2VyIGlucHV0
LgotCi0gICAgU3RyaW5nIG5ld1RleHQgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3aWRnZXQo
KSktPnRleHQoKTsKLQotICAgIC8vIEEgbnVsbCBzdHJpbmcgdmFsdWUgaXMgdXNlZCB0byBpbmRp
Y2F0ZSB0aGF0IHRoZSBmb3JtIGNvbnRyb2wgaGFzIG5vdCBhbHRlcmVkIHRoZSBvcmlnaW5hbAot
ICAgIC8vIGRlZmF1bHQgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5ldmVyIHVz
ZSB0aGUgbnVsbCBzdHJpbmcgdmFsdWUgd2hlbiB0aGUgdXNlcgotICAgIC8vIGVtcHRpZXMgYSB0
ZXh0ZmllbGQsIGJ1dCBzaG91bGQgYWx3YXlzIGZvcmNlIGFuIGVtcHR5IHRleHRmaWVsZCB0byB1
c2UgdGhlIGVtcHR5IHN0cmluZy4KLSAgICBpZiAobmV3VGV4dC5pc051bGwoKSkKLSAgICAgICAg
bmV3VGV4dCA9ICIiOwotCi0gICAgbmV3VGV4dC5yZXBsYWNlKGJhY2tzbGFzaEFzQ3VycmVuY3lT
eW1ib2woKSwgJ1xcJyk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUo
KSktPnNldFZhbHVlRnJvbVJlbmRlcmVyKG5ld1RleHQpOwotfQotCi1pbnQgUmVuZGVyTGluZUVk
aXQ6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBRTGluZUVkaXQgKmxpbmVFZGl0ID0gc3RhdGlj
X2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICBpbnQgc3RhcnQgPSBsaW5lRWRpdC0+
c2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpZiAoc3RhcnQgPT0gLTEpCi0gICAgICAgIHN0YXJ0ID0g
bGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIHN0YXJ0OwotfQotCi1pbnQg
UmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUUxpbmVFZGl0ICpsaW5lRWRp
dCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCk7Ci0gICAgaW50IHN0YXJ0ID0g
bGluZUVkaXQtPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaWYgKHN0YXJ0ID09IC0xKQotICAgICAg
ICByZXR1cm4gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIHN0YXJ0ICsg
KGludClsaW5lRWRpdC0+c2VsZWN0ZWRUZXh0KCkubGVuZ3RoKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
TGluZUVkaXQ6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBpbnQgcmVhbFN0
YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gbWF4KHNlbGVjdGlvbkVuZCgp
IC0gcmVhbFN0YXJ0LCAwKTsKLSAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQgKj4obV93aWRnZXQp
LT5zZXRTZWxlY3Rpb24ocmVhbFN0YXJ0LCBsZW5ndGgpOwotfQotCi12b2lkIFJlbmRlckxpbmVF
ZGl0OjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBpbnQgc3RhcnQgPSBzZWxlY3Rp
b25TdGFydCgpOwotICAgIGludCByZWFsRW5kID0gbWF4KGVuZCwgMCk7Ci0gICAgaW50IGxlbmd0
aCA9IHJlYWxFbmQgLSBzdGFydDsKLSAgICBpZiAobGVuZ3RoIDwgMCkgewotICAgICAgICBzdGFy
dCA9IHJlYWxFbmQ7Ci0gICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgfQotICAgIHN0YXRpY19jYXN0
PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihzdGFydCwgbGVuZ3RoKTsKLX0K
LQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxRTGlu
ZUVkaXQqPihtX3dpZGdldCktPnNlbGVjdEFsbCgpOwotfQotCi1ib29sIFJlbmRlckxpbmVFZGl0
Ojppc0VkaXRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+
KG1fd2lkZ2V0KS0+ZWRpdGVkKCk7Ci19Ci12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRFZGl0ZWQo
Ym9vbCB4KQotewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0KS0+c2V0RWRp
dGVkKHgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxlY3Rpb25SYW5nZShpbnQg
c3RhcnQsIGludCBlbmQpCi17Ci0gICAgaW50IHJlYWxTdGFydCA9IG1heChzdGFydCwgMCk7Ci0g
ICAgaW50IGxlbmd0aCA9IG1heChlbmQgLSByZWFsU3RhcnQsIDApOwotICAgIHN0YXRpY19jYXN0
PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihyZWFsU3RhcnQsIGxlbmd0aCk7
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJGaWVsZHNldDo6UmVuZGVyRmll
bGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLTogUmVuZGVyQmxvY2soZWxl
bWVudCkKK1JlbmRlckZpZWxkc2V0OjpSZW5kZXJGaWVsZHNldChIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50KiBlbGVtZW50KQorICAgIDogUmVuZGVyQmxvY2soZWxlbWVudCkKIHsKIH0KIApAQCAtMzkx
LDkgKzYzLDkgQEAgUmVuZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNldDo6bGF5b3V0TGVnZQogUmVu
ZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNldDo6ZmluZExlZ2VuZCgpCiB7CiAgICAgZm9yIChSZW5k
ZXJPYmplY3QqIGxlZ2VuZCA9IGZpcnN0Q2hpbGQoKTsgbGVnZW5kOyBsZWdlbmQgPSBsZWdlbmQt
Pm5leHRTaWJsaW5nKCkpIHsKLSAgICAgIGlmICghbGVnZW5kLT5pc0Zsb2F0aW5nT3JQb3NpdGlv
bmVkKCkgJiYgbGVnZW5kLT5lbGVtZW50KCkgJiYKLSAgICAgICAgICBsZWdlbmQtPmVsZW1lbnQo
KS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQotICAgICAgICByZXR1cm4gbGVnZW5kOworICAgICAg
ICBpZiAoIWxlZ2VuZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpICYmIGxlZ2VuZC0+ZWxlbWVu
dCgpICYmCisgICAgICAgICAgICBsZWdlbmQtPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShsZWdlbmRU
YWcpKQorICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9
CkBAIC00MzcsMjAgKzEwOSwxOSBAQCB2b2lkIFJlbmRlckZpZWxkc2V0OjpwYWludEJvcmRlck1p
bnVzTGVnCiAgICAgYm9vbCByZW5kZXJfciA9IHJzID4gQkhJRERFTjsKICAgICBib29sIHJlbmRl
cl9iID0gYnMgPiBCSElEREVOOwogCi0gICAgaWYocmVuZGVyX3QpIHsKKyAgICBpZiAocmVuZGVy
X3QpIHsKICAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgbHgsIF90eSArICBz
dHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwgQlNUb3AsIHRjLCBzdHlsZS0+Y29sb3IoKSwgdHMsCiAg
ICAgICAgICAgICAgICAgICAgKHJlbmRlcl9sICYmIChscyA9PSBET1RURUQgfHwgbHMgPT0gREFT
SEVEIHx8IGxzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlckxlZnRXaWR0aCgpOjApLCAwKTsKICAg
ICAgICAgZHJhd0JvcmRlcihwLCBfdHgrbHgrbHcsIF90eSwgX3R4ICsgdywgX3R5ICsgIHN0eWxl
LT5ib3JkZXJUb3BXaWR0aCgpLCBCU1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywKICAgICAg
ICAgICAgICAgICAgICAwLCAocmVuZGVyX3IgJiYgKHJzID09IERPVFRFRCB8fCBycyA9PSBEQVNI
RUQgfHwgcnMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpOjApKTsKICAgICB9
CiAKLSAgICBpZihyZW5kZXJfYikKKyAgICBpZiAocmVuZGVyX2IpCiAgICAgICAgIGRyYXdCb3Jk
ZXIocCwgX3R4LCBfdHkgKyBoIC0gc3R5bGUtPmJvcmRlckJvdHRvbVdpZHRoKCksIF90eCArIHcs
IF90eSArIGgsIEJTQm90dG9tLCBiYywgc3R5bGUtPmNvbG9yKCksIGJzLAogICAgICAgICAgICAg
ICAgICAgIChyZW5kZXJfbCAmJiAobHMgPT0gRE9UVEVEIHx8IGxzID09IERBU0hFRCB8fCBscyA9
PSBET1VCTEUpP3N0eWxlLT5ib3JkZXJMZWZ0V2lkdGgoKTowKSwKICAgICAgICAgICAgICAgICAg
ICAocmVuZGVyX3IgJiYgKHJzID09IERPVFRFRCB8fCBycyA9PSBEQVNIRUQgfHwgcnMgPT0gRE9V
QkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpOjApKTsKIAotICAgIGlmKHJlbmRlcl9sKQot
ICAgIHsKKyAgICBpZiAocmVuZGVyX2wpIHsKICAgICAgICAgY29uc3QgQ29sb3ImIGxjID0gc3R5
bGUtPmJvcmRlckxlZnRDb2xvcigpOwogCiAgICAgICAgIGJvb2wgaWdub3JlX3RvcCA9CkBAIC00
NjgsOCArMTM5LDcgQEAgdm9pZCBSZW5kZXJGaWVsZHNldDo6cGFpbnRCb3JkZXJNaW51c0xlZwog
ICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9tV2lk
dGgoKSk7CiAgICAgfQogCi0gICAgaWYocmVuZGVyX3IpCi0gICAgeworICAgIGlmIChyZW5kZXJf
cikgewogICAgICAgICBjb25zdCBDb2xvciYgcmMgPSBzdHlsZS0+Ym9yZGVyUmlnaHRDb2xvcigp
OwogCiAgICAgICAgIGJvb2wgaWdub3JlX3RvcCA9CkBAIC00OTksNjU1ICsxNjksNSBAQCB2b2lk
IFJlbmRlckZpZWxkc2V0OjpzZXRTdHlsZShSZW5kZXJTdHlsCiAgICAgaWYgKGlzSW5saW5lKCkp
CiAgICAgICAgIHNldFJlcGxhY2VkKHRydWUpOwogfSAgICAKLSAgICAKLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotUmVuZGVyRmlsZUJ1dHRvbjo6UmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVt
ZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBz
ZXRXaWRnZXQobmV3IEtXUUZpbGVCdXR0b24odmlldygpLT5mcmFtZSgpKSk7Ci19Ci0KLXZvaWQg
UmVuZGVyRmlsZUJ1dHRvbjo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCgh
bWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcg
aXQgd2FudHMgdG8gYmUuCi0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNfY2FzdDxLV1FGaWxl
QnV0dG9uICo+KHdpZGdldCgpKS0+c2l6ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8gc2l6
ZSA6IDIwKSk7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNldElu
dHJpbnNpY0hlaWdodChzLmhlaWdodCgpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxj
TWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjp1cGRhdGVGcm9tRWxl
bWVudCgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+c2V0
RmlsZW5hbWUoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
LT52YWx1ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6
dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpyZXR1cm5Q
cmVzc2VkKFdpZGdldCopCi17Ci0gICAgaWYgKHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpLT5mb3JtKCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpLT5mb3JtKCktPnByZXBhcmVTdWJtaXQoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxl
QnV0dG9uOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVGcm9tUmVuZGVyZXIoc3RhdGljX2Nhc3Q8S1dR
RmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+ZmlsZW5hbWUoKSk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRN
TElucHV0RWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgUmVuZGVyRmls
ZUJ1dHRvbjo6c2VsZWN0KCkKLXsKLX0KLQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OmNsaWNr
KGJvb2wgc2VuZE1vdXNlRXZlbnRzKQotewotICAgIHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24g
Kj4od2lkZ2V0KCkpLT5jbGljayhzZW5kTW91c2VFdmVudHMpOwotfQotCi0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotUmVuZGVyTGFiZWw6OlJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVsZW1l
bnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotCi19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyTGVnZW5kOjpSZW5kZXJMZWdlbmQoSFRNTEdl
bmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckJsb2NrKGVsZW1lbnQpCi17
Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2VsZWN0OjpSZW5kZXJTZWxlY3Qo
SFRNTFNlbGVjdEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVt
ZW50KQotewotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgbV9tdWx0aXBs
ZSA9IGVsZW1lbnQtPm11bHRpcGxlKCk7Ci0gICAgbV9zaXplID0gZWxlbWVudC0+c2l6ZSgpOwot
ICAgIG1fdXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotICAgIG1fc2Vs
ZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0KLSAg
ICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgpKTsK
LSAgICBlbHNlCi0gICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLX0KLQogCi12b2lk
IFJlbmRlclNlbGVjdDo6c2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpCi17Ci0gICAgVGV4dERp
cmVjdGlvbiBkID0gc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSOwotICAg
IGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94ICo+KG1fd2lk
Z2V0KS0+c2V0V3JpdGluZ0RpcmVjdGlvbihkKTsKLSAgICBlbHNlCi0gICAgICAgIHN0YXRpY19j
YXN0PFFDb21ib0JveCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci19Ci0K
LXZvaWQgUmVuZGVyU2VsZWN0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5k
ZXJGb3JtRWxlbWVudDo6c2V0U3R5bGUocyk7Ci0gICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlv
bigpOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0g
ICAgbV9pZ25vcmVTZWxlY3RFdmVudHMgPSB0cnVlOwotCi0gICAgLy8gY2hhbmdlIHdpZGdldCB0
eXBlCi0gICAgYm9vbCBvbGRNdWx0aXBsZSA9IG1fbXVsdGlwbGU7Ci0gICAgdW5zaWduZWQgb2xk
U2l6ZSA9IG1fc2l6ZTsKLSAgICBib29sIG9sZExpc3Rib3ggPSBtX3VzZUxpc3RCb3g7Ci0KLSAg
ICBtX211bHRpcGxlID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5t
dWx0aXBsZSgpOwotICAgIG1fc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4o
bm9kZSgpKS0+c2l6ZSgpOwotICAgIG1fdXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6
ZSA+IDEpOwotCi0gICAgaWYgKG9sZE11bHRpcGxlICE9IG1fbXVsdGlwbGUgfHwgb2xkU2l6ZSAh
PSBtX3NpemUpIHsKLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCAhPSBvbGRMaXN0Ym94KSB7Ci0g
ICAgICAgICAgICAvLyB0eXBlIG9mIHNlbGVjdCBoYXMgY2hhbmdlZAotICAgICAgICAgICAgZGVs
ZXRlIG1fd2lkZ2V0OwotCi0gICAgICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAg
ICAgICAgIHNldFdpZGdldChjcmVhdGVMaXN0Qm94KCkpOwotICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLSAgICAgICAgICAgIHNldFdp
ZGdldFdyaXRpbmdEaXJlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3VzZUxp
c3RCb3ggJiYgb2xkTXVsdGlwbGUgIT0gbV9tdWx0aXBsZSkgewotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/
IFFMaXN0Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgICAgICB9Ci0gICAg
ICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQg
PSB0cnVlOwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBjb250ZW50cyBsaXN0Ym94L2NvbWJvYm94
IGJhc2VkIG9uIG9wdGlvbnMgaW4gbV9lbGVtZW50Ci0gICAgaWYgKCBtX29wdGlvbnNDaGFuZ2Vk
ICkgewotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkp
LT5tX3JlY2FsY0xpc3RJdGVtcykKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RF
bGVtZW50Kj4obm9kZSgpKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgIERlcHJlY2F0ZWRB
cnJheTxIVE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVt
ZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsaXN0SW5kZXg7Ci0KLSAg
ICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94
Kj4obV93aWRnZXQpLT5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0aWNf
Y2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmNsZWFyKCk7Ci0KLSAgICAgICAgYm9vbCBncm91
cEVuYWJsZWQgPSB0cnVlOwotICAgICAgICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8
IGludChsaXN0SXRlbXMuc2l6ZSgpKTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgICAgIGlmIChs
aXN0SXRlbXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAg
ICAgICAgICBIVE1MT3B0R3JvdXBFbGVtZW50ICpvcHRncm91cEVsZW1lbnQgPSBzdGF0aWNfY2Fz
dDxIVE1MT3B0R3JvdXBFbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOwotICAgICAgICAg
ICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgbGFiZWwgPSBvcHRncm91cEVsZW1lbnQtPmdldEF0dHJp
YnV0ZShsYWJlbEF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsYWJl
bC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSW4gV2luSUUsIGFuIG9wdGdyb3VwIGNhbid0IHN0
YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UgKG90aGVyIHRoYW4gdGhlIGluZGVudAotICAgICAg
ICAgICAgICAgIC8vIHdlIGdpdmUgaXQpLiAgV2UgbWF0Y2ggdGhpcyBiZWhhdmlvci4KLSAgICAg
ICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAg
ICAgIC8vIFdlIHdhbnQgdG8gY29sbGFwc2Ugb3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3aWxs
IG1hdGNoIG90aGVyIGJyb3dzZXJzLgotICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc2lt
cGxpZnlXaGl0ZVNwYWNlKCk7Ci0KLSAgICAgICAgICAgICAgICBncm91cEVuYWJsZWQgPSBvcHRn
cm91cEVsZW1lbnQtPmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAg
ICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFM
aXN0Qm94Kj4obV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsLCBncm91cEVuYWJsZWQp
OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
UUNvbWJvQm94Kj4obV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNUYWdO
YW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCAqb3B0
aW9uRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2xp
c3RJbmRleF0pOwotICAgICAgICAgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgaXRlbVRleHQ7Ci0g
ICAgICAgICAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQtPmhhc0F0dHJpYnV0ZShsYWJlbEF0dHIp
KQotICAgICAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IG9wdGlvbkVsZW1lbnQtPmdldEF0dHJp
YnV0ZShsYWJlbEF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gb3B0aW9uRWxlbWVudC0+dGV4dCgpLmRl
cHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpdGVt
VGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0KLSAgICAg
ICAgICAgICAgICAvLyBJbiBXaW5JRSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBp
cyBpZ25vcmVkIGluIG9wdGlvbnMuIFdlIG1hdGNoIHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAg
ICAgICAgaXRlbVRleHQgPSBpdGVtVGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAg
ICAgICAvLyBXZSB3YW50IHRvIGNvbGxhcHNlIG91ciB3aGl0ZXNwYWNlIHRvby4gIFRoaXMgd2ls
bCBtYXRjaCBvdGhlciBicm93c2Vycy4KLSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IGl0ZW1U
ZXh0LnNpbXBsaWZ5V2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAg
ICAgIGlmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+cGFyZW50Tm9kZSgpLT5oYXNUYWdOYW1lKG9w
dGdyb3VwVGFnKSkKLSAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQucHJlcGVuZCgiICAgICIp
OwotCi0gICAgICAgICAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQs
IGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAg
ICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPiht
X3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVt
ZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChs
aXN0SXRlbXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoIW1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNv
bWJvQm94Kj4obV93aWRnZXQpLT5hcHBlbmRTZXBhcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBLSFRNTEFzc2VydChmYWxzZSk7Ci0gICAg
ICAgICAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlm
IChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lk
Z2V0KS0+ZG9uZUFwcGVuZGluZ0l0ZW1zKCk7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWlu
TWF4UmVjYWxjKCk7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSBmYWxzZTsKLSAgICB9Ci0K
LSAgICAvLyB1cGRhdGUgc2VsZWN0aW9uCi0gICAgaWYgKG1fc2VsZWN0aW9uQ2hhbmdlZCkgewot
ICAgICAgICB1cGRhdGVTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBtX2lnbm9yZVNlbGVjdEV2
ZW50cyA9IGZhbHNlOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50
KCk7Ci19Ci0KLQotc2hvcnQgUmVuZGVyU2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKCBib29sIGYs
IGJvb2wgaXNSb290TGluZUJveCApIGNvbnN0Ci17Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkgewot
ICAgICAgICAvLyBGSVhNRTogU2hvdWxkIGdldCB0aGUgaGFyZGNvZGVkIGNvbnN0YW50IG9mIDcg
YnkgY2FsbGluZyBhIFFMaXN0Qm94IGZ1bmN0aW9uLAotICAgICAgICAvLyBhcyB3ZSBkbyBmb3Ig
b3RoZXIgd2lkZ2V0IGNsYXNzZXMuCi0gICAgICAgIHJldHVybiBSZW5kZXJXaWRnZXQ6OmJhc2Vs
aW5lUG9zaXRpb24oIGYsIGlzUm9vdExpbmVCb3ggKSAtIDc7Ci0gICAgfQotICAgIHJldHVybiBS
ZW5kZXJGb3JtRWxlbWVudDo6YmFzZWxpbmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJveCApOwot
fQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1M
QXNzZXJ0KCAhbWluTWF4S25vd24oKSApOwotCi0gICAgaWYgKG1fb3B0aW9uc0NoYW5nZWQpCi0g
ICAgICAgIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICAvLyAjIyMgdWdseSBIQUNLIEZJWE1F
ISEhCi0gICAgc2V0TWluTWF4S25vd24oKTsKLSAgICBsYXlvdXRJZk5lZWRlZCgpOwotICAgIHNl
dE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgLy8gIyMjIGVuZCBGSVhNRQotCi0g
ICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRl
clNlbGVjdDo6bGF5b3V0KCApCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0g
ICAgS0hUTUxBc3NlcnQobWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyAjIyMgbWFpbnRhaW4gc2Vs
ZWN0aW9uIHByb3Blcmx5IGJldHdlZW4gdHlwZS9zaXplIGNoYW5nZXMsIGFuZCB3b3JrCi0gICAg
Ly8gb3V0IGhvdyB0byBoYW5kbGUgbXVsdGlzZWxlY3QtPnNpbmdsZXNlbGVjdCAocHJvYmFibHkg
anVzdCBzZWxlY3QKLSAgICAvLyBmaXJzdCBzZWxlY3RlZCBvbmUpCi0KLSAgICAvLyBjYWxjdWxh
dGUgc2l6ZQotICAgIGlmKG1fdXNlTGlzdEJveCkgewotICAgICAgICBRTGlzdEJveCogdyA9IHN0
YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpOwotCi0KLSAgICAgICAgaW50IHNpemUgPSBt
X3NpemU7Ci0gICAgICAgIC8vIGNoZWNrIGlmIG11bHRpcGxlIGFuZCBzaXplIHdhcyBub3QgZ2l2
ZW4gb3IgaW52YWxpZAotICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb2RlciBzZXRzIHNpemUgdG8g
bWluKG51bWJlciBvZiBlbGVtZW50cywgNCkKLSAgICAgICAgLy8gTmV0c2NhcGUgc2VlbXMgdG8g
c2ltcGx5IHNldCBpdCB0byAibnVtYmVyIG9mIGVsZW1lbnRzIgotICAgICAgICAvLyB0aGUgYXZl
cmFnZSBvZiB0aGF0IGlzIElNSE8gbWluKG51bWJlciBvZiBlbGVtZW50cywgMTApCi0gICAgICAg
IC8vIHNvIEkgZGlkIHRoYXQgOy0pCi0gICAgICAgIGlmKHNpemUgPCAxKQotICAgICAgICAgICAg
c2l6ZSA9IG1pbihzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+Y291bnQoKSwgMTBV
KTsKLQotICAgICAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMg
dG8gYmUuCi0gICAgICAgIEludFNpemUgcyh3LT5zaXplRm9yTnVtYmVyT2ZMaW5lcyhzaXplKSk7
Ci0gICAgICAgIHNldEludHJpbnNpY1dpZHRoKCBzLndpZHRoKCkgKTsKLSAgICAgICAgc2V0SW50
cmluc2ljSGVpZ2h0KCBzLmhlaWdodCgpICk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBJ
bnRTaXplIHMobV93aWRnZXQtPnNpemVIaW50KCkpOwotICAgICAgICBzZXRJbnRyaW5zaWNXaWR0
aCggcy53aWR0aCgpICk7Ci0gICAgICAgIHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQoKSAp
OwotICAgIH0KLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpsYXlvdXQoKTsKLQotICAgIC8vIGFu
ZCBub3cgZGlzYWJsZSB0aGUgd2lkZ2V0IGluIGNhc2UgdGhlcmUgaXMgbm8gPG9wdGlvbj4gZ2l2
ZW4KLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNf
Y2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotCi0gICAgYm9v
bCBmb3VuZE9wdGlvbiA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0
SXRlbXMuc2l6ZSgpICYmICFmb3VuZE9wdGlvbjsgaSsrKQotICAgICAgICBmb3VuZE9wdGlvbiA9
IChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSk7Ci0KLSAgICBtX3dpZGdldC0+
c2V0RW5hYmxlZChmb3VuZE9wdGlvbiAmJiAhIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50
Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp2YWx1ZUNo
YW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV9pZ25vcmVTZWxlY3RFdmVudHMpCi0gICAgICAg
IHJldHVybjsKLQotICAgIEtIVE1MQXNzZXJ0KCFtX3VzZUxpc3RCb3gpOwotCi0gICAgaW50IGlu
ZGV4ID0gc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpOwot
Ci0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nh
c3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpZiAoaW5k
ZXggPj0gMCAmJiBpbmRleCA8IChpbnQpbGlzdEl0ZW1zLnNpemUoKSkgewotICAgICAgICBib29s
IGZvdW5kID0gbGlzdEl0ZW1zW2luZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpOwotICAgICAg
ICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBub3Qgc2VsZWN0YWJs
ZSwgIHdlIG5lZWQgdG8gZmluZCBhbiBvcHRpb24gZWxlbWVudAotICAgICAgICAgICAgd2hpbGUg
KCh1bnNpZ25lZCkgaW5kZXggPCBsaXN0SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGxpc3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAg
ICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4
ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhhc1Rh
Z05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVl
OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICAgICAgLS1pbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIGlm
ICggaW5kZXggIT0gc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRl
bSgpICkKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCkt
PnNldEN1cnJlbnRJdGVtKCBpbmRleCApOwotCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbGlzdEl0ZW1zLnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIGlmIChsaXN0
SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJiBpICE9ICh1bnNpZ25lZCBpbnQpIGlu
ZGV4KQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+
KCBsaXN0SXRlbXNbaV0gKS0+bV9zZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpbmRleF0pLT5tX3NlbGVjdGVk
ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RF
bGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6
c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX2lnbm9yZVNlbGVjdEV2ZW50
cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gZG9uJ3QgdXNlIGxpc3RJdGVtcygpIGhlcmUg
YXMgd2UgaGF2ZSB0byBhdm9pZCByZWNhbGN1bGF0aW9ucyAtIGNoYW5naW5nIHRoZQotICAgIC8v
IG9wdGlvbiBsaXN0IHdpbGwgbWFrZSB1c2UgdXBkYXRlIG9wdGlvbnMgbm90IGluIHRoZSB3YXkg
dGhlIHVzZXIgZXhwZWN0cyB0aGVtCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4g
bGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX2xp
c3RJdGVtczsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxp
c3RJdGVtcy5jb3VudCgpOyBpKyspIHsKLSAgICAgICAgLy8gZG9uJ3QgdXNlIHNldFNlbGVjdGVk
KCkgaGVyZSBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdXMgdG8gYmUgY2FsbGVkCi0gICAgICAgIC8v
IGFnYWluIHdpdGggdXBkYXRlU2VsZWN0aW9uLgotICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5o
YXNUYWdOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudCo+KCBsaXN0SXRlbXNbaV0gKQotICAgICAgICAgICAgICAgIC0+bV9zZWxlY3RlZCA9
IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4oIG1fd2lkZ2V0ICktPmlzU2VsZWN0ZWQoIGogKTsKLSAg
ICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVt
c1tpXS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICArK2o7Ci0gICAgfQot
ICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsK
LX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBfb3B0aW9u
c0NoYW5nZWQpCi17Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IF9vcHRpb25zQ2hhbmdlZDsKLX0K
LQotUUxpc3RCb3gqIFJlbmRlclNlbGVjdDo6Y3JlYXRlTGlzdEJveCgpCi17Ci0gICAgUUxpc3RC
b3ggKmxiID0gbmV3IFFMaXN0Qm94KCk7Ci0gICAgbGItPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0
aXBsZSA/IFFMaXN0Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgIG1faWdu
b3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGxiOwotfQotCi12b2lkIFJlbmRl
clNlbGVjdDo6dXBkYXRlU2VsZWN0aW9uKCkKLXsKLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVs
ZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUo
KSktPmxpc3RJdGVtcygpOwotICAgIGludCBpOwotICAgIGlmIChtX3VzZUxpc3RCb3gpIHsKLSAg
ICAgICAgLy8gaWYgbXVsdGktc2VsZWN0LCB3ZSBzZWxlY3Qgb25seSB0aGUgbmV3IHNlbGVjdGVk
IGluZGV4Ci0gICAgICAgIFFMaXN0Qm94ICpsaXN0Qm94ID0gc3RhdGljX2Nhc3Q8UUxpc3RCb3gq
PihtX3dpZGdldCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8
IGludChsaXN0SXRlbXMuc2l6ZSgpKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0Qm94LT5zZXRT
ZWxlY3RlZChqLCBsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+
KGxpc3RJdGVtc1tpXSktPnNlbGVjdGVkKCkpOwotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tp
XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRn
cm91cFRhZykpCi0gICAgICAgICAgICAgICAgKytqOwotICAgICAgICAgICAgCi0gICAgICAgIH0K
LSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAg
dW5zaWduZWQgZmlyc3RPcHRpb24gPSBsaXN0SXRlbXMuc2l6ZSgpOwotICAgICAgICBpID0gbGlz
dEl0ZW1zLnNpemUoKTsKLSAgICAgICAgd2hpbGUgKGktLSkKLSAgICAgICAgICAgIGlmIChsaXN0
SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChm
b3VuZCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQq
PihsaXN0SXRlbXNbaV0pLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZWxz
ZSBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5zZWxl
Y3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KCBt
X3dpZGdldCApLT5zZXRDdXJyZW50SXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQg
PSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJzdE9wdGlvbiA9
IGk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUKGZpcnN0T3B0aW9uID09IGxpc3RJ
dGVtcy5zaXplKCkgfHwgZm91bmQpOwotICAgIH0KLQotICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9
IGZhbHNlOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLVJlbmRlclRleHRBcmVhOjpSZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50
ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCksIG1fZGlydHkoZmFs
c2UpLCBtX3VwZGF0aW5nKGZhbHNlKQotewotICAgIFFUZXh0RWRpdCAqZWRpdCA9IG5ldyBRVGV4
dEVkaXQodmlldygpKTsKLQotICAgIGlmIChlbGVtZW50LT53cmFwKCkgIT0gSFRNTFRleHRBcmVh
RWxlbWVudDo6dGFfTm9XcmFwKQotICAgICAgICBlZGl0LT5zZXRXb3JkV3JhcChRVGV4dEVkaXQ6
OldpZGdldFdpZHRoKTsKLSAgICBlbHNlCi0gICAgICAgIGVkaXQtPnNldFdvcmRXcmFwKFFUZXh0
RWRpdDo6Tm9XcmFwKTsKLQotICAgIHNldFdpZGdldChlZGl0KTsKLX0KLQotdm9pZCBSZW5kZXJU
ZXh0QXJlYTo6ZGVzdHJveSgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVu
dCo+KG5vZGUoKSktPnJlbmRlcmVyV2lsbEJlRGVzdHJveWVkKCk7Ci0gICAgUmVuZGVyRm9ybUVs
ZW1lbnQ6OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6Y2FsY01pbk1heFdp
ZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCggIW1pbk1heEtub3duKCkgKTsKLQotICAgIFFUZXh0
RWRpdCogdyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLSAgICBJbnRTaXpl
IHNpemUody0+c2l6ZVdpdGhDb2x1bW5zQW5kUm93cygKLSAgICAgICAgbWF4KHN0YXRpY19jYXN0
PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5jb2xzKCksIDEpLAotICAgICAgICBtYXgo
c3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPnJvd3MoKSwgMSkpKTsK
LQotICAgIHNldEludHJpbnNpY1dpZHRoKCBzaXplLndpZHRoKCkgKTsKLSAgICBzZXRJbnRyaW5z
aWNIZWlnaHQoIHNpemUuaGVpZ2h0KCkgKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxj
TWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U3R5bGUoUmVuZGVy
U3R5bGUgKnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotCi0gICAg
UVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpOwotICAgIHct
PnNldEFsaWdubWVudCh0ZXh0QWxpZ25tZW50KCkpOwotICAgIHctPnNldExpbmVIZWlnaHQoUmVu
ZGVyT2JqZWN0OjpsaW5lSGVpZ2h0KHRydWUpKTsKLQotICAgIHctPnNldFdyaXRpbmdEaXJlY3Rp
b24oc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSKTsKLQotICAgIFNjcm9s
bEJhck1vZGUgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckF1dG87Ci0gICAgc3dpdGNoIChzdHlsZSgp
LT5vdmVyZmxvdygpKSB7Ci0gICAgICAgIGNhc2UgT0FVVE86Ci0gICAgICAgIGNhc2UgT01BUlFV
RUU6IC8vIG1ha2VzIG5vIHNlbnNlLCBtYXAgdG8gYXV0bwotICAgICAgICBjYXNlIE9PVkVSTEFZ
OiAvLyBub3QgaW1wbGVtZW50ZWQgZm9yIHRleHQsIG1hcCB0byBhdXRvCi0gICAgICAgIGNhc2Ug
T1ZJU0lCTEU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSElEREVOOgotICAg
ICAgICAgICAgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09mZjsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIE9TQ1JPTEw6Ci0gICAgICAgICAgICBzY3JvbGxNb2RlID0gU2Ny
b2xsQmFyQWx3YXlzT247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgU2Nyb2xsQmFy
TW9kZSBob3Jpem9udGFsU2Nyb2xsTW9kZSA9IHNjcm9sbE1vZGU7Ci0gICAgaWYgKHN0YXRpY19j
YXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT53cmFwKCkgIT0gSFRNTFRleHRBcmVh
RWxlbWVudDo6dGFfTm9XcmFwKQotICAgICAgICBob3Jpem9udGFsU2Nyb2xsTW9kZSA9IFNjcm9s
bEJhckFsd2F5c09mZjsKLQotICAgIHctPnNldFNjcm9sbEJhck1vZGVzKGhvcml6b250YWxTY3Jv
bGxNb2RlLCBzY3JvbGxNb2RlKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0RWRpdGVk
KGJvb2wgeCkKLXsKLSAgICBtX2RpcnR5ID0geDsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6
dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIEhUTUxUZXh0QXJlYUVsZW1lbnQqIGUgPSBzdGF0
aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBRVGV4dEVkaXQqIHcg
PSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7Ci0KLSAgICB3LT5zZXRSZWFkT25s
eShlLT5pc1JlYWRPbmx5Q29udHJvbCgpKTsKLSAgICB3LT5zZXREaXNhYmxlZChlLT5kaXNhYmxl
ZCgpKTsKLQotICAgIFN0cmluZyB3aWRnZXRUZXh0ID0gdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0
ID0gZS0+dmFsdWUoKTsKLSAgICB0ZXh0LnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXNDdXJyZW5j
eVN5bWJvbCgpKTsKLSAgICBpZiAod2lkZ2V0VGV4dCAhPSB0ZXh0KSB7Ci0gICAgICAgIGludCBs
aW5lLCBjb2w7Ci0gICAgICAgIHctPmdldEN1cnNvclBvc2l0aW9uKCAmbGluZSwgJmNvbCApOwot
ICAgICAgICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAgICAgICAgdy0+c2V0VGV4dCh0ZXh0KTsKLSAg
ICAgICAgbV91cGRhdGluZyA9IGZhbHNlOwotICAgICAgICB3LT5zZXRDdXJzb3JQb3NpdGlvbigg
bGluZSwgY29sICk7Ci0gICAgfQotICAgIG1fZGlydHkgPSBmYWxzZTsKLQotICAgIHctPnNldENv
bG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Y29sb3IoKSk7Ci0KLSAg
ICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotU3RyaW5nIFJl
bmRlclRleHRBcmVhOjp0ZXh0KCkKLXsKLSAgICBTdHJpbmcgdHh0ID0gc3RhdGljX2Nhc3Q8UVRl
eHRFZGl0Kj4obV93aWRnZXQpLT50ZXh0KCk7Ci0gICAgcmV0dXJuIHR4dC5yZXBsYWNlKGJhY2tz
bGFzaEFzQ3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0QXJl
YTo6dGV4dFdpdGhIYXJkTGluZUJyZWFrcygpCi17Ci0gICAgU3RyaW5nIHR4dCA9IHN0YXRpY19j
YXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KS0+dGV4dFdpdGhIYXJkTGluZUJyZWFrcygpOwotICAg
IHJldHVybiB0eHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcpOwot
fQotCi12b2lkIFJlbmRlclRleHRBcmVhOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBp
ZiAobV91cGRhdGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0
QXJlYUVsZW1lbnQqPihub2RlKCkpLT5pbnZhbGlkYXRlVmFsdWUoKTsKLSAgICBtX2RpcnR5ID0g
dHJ1ZTsKLX0KLQotaW50IFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAg
UVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7
Ci0gICAgcmV0dXJuIHRleHRFZGl0LT5zZWxlY3Rpb25TdGFydCgpOwotfQotCi1pbnQgUmVuZGVy
VGV4dEFyZWE6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0
YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAgcmV0dXJuIHRleHRFZGl0LT5z
ZWxlY3Rpb25FbmQoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0aW9uU3Rh
cnQoaW50IHN0YXJ0KQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxR
VGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25TdGFydChz
dGFydCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5k
KQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4o
bV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9p
ZCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxRVGV4dEVkaXQg
Kj4obV93aWRnZXQpLT5zZWxlY3RBbGwoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0
U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIFFUZXh0RWRpdCAqdGV4
dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0
LT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLXN0YXJ0KTsKLX0KLQotdm9pZCBSZW5kZXJU
ZXh0QXJlYTo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIFFUZXh0RWRpdCogdyA9
IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLQotICAgIC8vIFdlIG9ubHkgd2Fu
dCB0byBjYWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFjdHVhbGx5IGlzIGEgc2VsZWN0aW9uCi0gICAg
aWYgKCF3LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHN0
YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5vblNlbGVjdCgpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2xpZGVyOjpSZW5kZXJTbGlkZXIoSFRN
TElucHV0RWxlbWVudCogZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQp
Ci17Ci0gICAgc2V0V2lkZ2V0KG5ldyBRU2xpZGVyKTsKLX0KLQotdm9pZCBSZW5kZXJTbGlkZXI6
OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkpOwot
ICAgIAotICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBi
ZS4KLSAgICBJbnRTaXplIHMod2lkZ2V0KCktPnNpemVIaW50KCkpOwotICAgIGJvb2wgd2lkdGhT
ZXQgPSAhc3R5bGUoKS0+d2lkdGgoKS5pc0F1dG8oKTsKLSAgICBib29sIGhlaWdodFNldCA9ICFz
dHlsZSgpLT5oZWlnaHQoKS5pc0F1dG8oKTsKLSAgICBpZiAoaGVpZ2h0U2V0ICYmICF3aWR0aFNl
dCkgewotICAgICAgICAvLyBGbGlwIHRoZSBpbnRyaW5zaWMgZGltZW5zaW9ucy4KLSAgICAgICAg
aW50IGJhckxlbmd0aCA9IHMud2lkdGgoKTsKLSAgICAgICAgcyA9IEludFNpemUocy5oZWlnaHQo
KSwgYmFyTGVuZ3RoKTsKLSAgICB9Ci0gICAgc2V0SW50cmluc2ljV2lkdGgocy53aWR0aCgpKTsK
LSAgICBzZXRJbnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0gICAgCi0gICAgUmVuZGVyRm9y
bUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlclNsaWRlcjo6dXBk
YXRlRnJvbUVsZW1lbnQoKQotewotICAgIFN0cmluZyB2YWx1ZSA9IHN0YXRpY19jYXN0PEhUTUxJ
bnB1dEVsZW1lbnQqPihub2RlKCkpLT52YWx1ZSgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
bWluU3RyID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJp
YnV0ZShtaW5BdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1heFN0ciA9IHN0YXRpY19j
YXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUobWF4QXR0cik7Ci0g
ICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVjaXNpb24gPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKHByZWNpc2lvbkF0dHIpOwotICAgIAotICAg
IGRvdWJsZSBtaW5WYWwgPSBtaW5TdHIuaXNOdWxsKCkgPyAwLjAgOiBtaW5TdHIuZGVwcmVjYXRl
ZFN0cmluZygpLnRvRG91YmxlKCk7Ci0gICAgZG91YmxlIG1heFZhbCA9IG1heFN0ci5pc051bGwo
KSA/IDEwMC4wIDogbWF4U3RyLmRlcHJlY2F0ZWRTdHJpbmcoKS50b0RvdWJsZSgpOwotICAgIG1p
blZhbCA9IG1pbihtaW5WYWwsIG1heFZhbCk7IC8vIE1ha2Ugc3VyZSB0aGUgcmFuZ2UgaXMgc2Fu
ZS4KLSAgICAKLSAgICBkb3VibGUgdmFsID0gdmFsdWUuaXNOdWxsKCkgPyAobWF4VmFsICsgbWlu
VmFsKS8yLjAgOiB2YWx1ZS5kZXByZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICB2YWwg
PSBtYXgobWluVmFsLCBtaW4odmFsLCBtYXhWYWwpKTsgLy8gTWFrZSBzdXJlIHZhbCBpcyB3aXRo
aW4gbWluL21heC4KLSAgICAKLSAgICAvLyBGb3JjZSBpbnRlZ2VyIHZhbHVlIGlmIG5vdCBmbG9h
dC4KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKHByZWNpc2lvbiwgImZsb2F0IikpCi0gICAg
ICAgIHZhbCA9IChpbnQpKHZhbCArIDAuNSk7Ci0KLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoU3RyaW5nOjpudW1iZXIodmFsKSk7Ci0KLSAgICBR
U2xpZGVyKiBzbGlkZXIgPSAoUVNsaWRlciopd2lkZ2V0KCk7Ci0gICAgIAotICAgIHNsaWRlci0+
c2V0TWluVmFsdWUobWluVmFsKTsKLSAgICBzbGlkZXItPnNldE1heFZhbHVlKG1heFZhbCk7Ci0g
ICAgc2xpZGVyLT5zZXRWYWx1ZSh2YWwpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0
ZUZyb21FbGVtZW50KCk7Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjp2YWx1ZUNoYW5nZWQoV2lk
Z2V0KikKLXsKLSAgICBRU2xpZGVyKiBzbGlkZXIgPSBzdGF0aWNfY2FzdDxRU2xpZGVyKj4od2lk
Z2V0KCkpOwotCi0gICAgZG91YmxlIHZhbCA9IHNsaWRlci0+dmFsdWUoKTsKLSAgICBjb25zdCBB
dG9taWNTdHJpbmcmIHByZWNpc2lvbiA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihu
b2RlKCkpLT5nZXRBdHRyaWJ1dGUocHJlY2lzaW9uQXR0cik7Ci0KLSAgICAvLyBGb3JjZSBpbnRl
Z2VyIHZhbHVlIGlmIG5vdCBmbG9hdC4KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKHByZWNp
c2lvbiwgImZsb2F0IikpCi0gICAgICAgIHZhbCA9IChpbnQpKHZhbCArIDAuNSk7Ci0KLSAgICBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoU3RyaW5nOjpu
dW1iZXIodmFsKSk7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0g
ICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmRpc3BhdGNoSFRNTEV2
ZW50KGlucHV0RXZlbnQsIHRydWUsIGZhbHNlKTsKLX0KLQotfQorfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRm9ybUVsZW1lbnQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckZvcm1FbGVtZW50LmNwcAkocmV2aXNp
b24gMTQzNDIpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJGb3JtRWxlbWVudC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI0LDMzICsyNCwxNyBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJyZW5kZXJfZm9ybS5oIgorI2luY2x1ZGUgIlJlbmRlckZvcm1FbGVtZW50
LmgiCiAKLSNpbmNsdWRlICJCcm93c2VyRXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRXZlbnROYW1l
cy5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5o
IgotI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0R3JvdXBF
bGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1M
U2VsZWN0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNs
dWRlICJLV1FDb21ib0JveC5oIgotI2luY2x1ZGUgIktXUUZpbGVCdXR0b24uaCIKLSNpbmNsdWRl
ICJLV1FMaW5lRWRpdC5oIgotI2luY2x1ZGUgIktXUVNsaWRlci5oIgotI2luY2x1ZGUgIktXUVRl
eHRFZGl0LmgiCisjaW5jbHVkZSAiSFRNTEdlbmVyaWNGb3JtRWxlbWVudC5oIgogI2luY2x1ZGUg
IlBsYXRmb3JtTW91c2VFdmVudC5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotCi11
c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVz
cGFjZSBFdmVudE5hbWVzOwotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotUmVuZGVyRm9y
bUVsZW1lbnQ6OlJlbmRlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1l
bnQpCitSZW5kZXJGb3JtRWxlbWVudDo6UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudCogZWxlbWVudCkKICAgICA6IFJlbmRlcldpZGdldChlbGVtZW50KQogewogICAgIHNl
dElubGluZSh0cnVlKTsKQEAgLTYwLDcgKzQ0LDcgQEAgUmVuZGVyRm9ybUVsZW1lbnQ6On5SZW5k
ZXJGb3JtRWxlbWVudCgpCiB7CiB9CiAKLXNob3J0IFJlbmRlckZvcm1FbGVtZW50OjpiYXNlbGlu
ZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgaXNSb290TGluZUJveCApIGNvbnN0CitzaG9ydCBSZW5k
ZXJGb3JtRWxlbWVudDo6YmFzZWxpbmVQb3NpdGlvbihib29sIGYsIGJvb2wgaXNSb290TGluZUJv
eCkgY29uc3QKIHsKICAgICByZXR1cm4gbWFyZ2luVG9wKCkgKyB3aWRnZXQoKS0+YmFzZWxpbmVQ
b3NpdGlvbihtX2hlaWdodCk7CiB9CkBAIC0xNTEsMTAwMyArMTM1LDQgQEAgdm9pZCBSZW5kZXJG
b3JtRWxlbWVudDo6YWRkSW50cmluc2ljTWFyZwogICAgIH0KIH0KIAotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1SZW5kZXJJbWFnZUJ1dHRvbjo6UmVuZGVySW1hZ2VCdXR0b24oSFRNTElu
cHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckltYWdlKGVsZW1lbnQpCi17Ci0gICAg
Ly8gIyMjIHN1cHBvcnQgRE9NQWN0aXZhdGUgZXZlbnQgd2hlbiBjbGlja2VkCi19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5k
ZXJMaW5lRWRpdDo6UmVuZGVyTGluZUVkaXQoSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAg
ICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpLCBtX3VwZGF0aW5nKGZhbHNlKQotewotICAg
IFFMaW5lRWRpdDo6VHlwZSB0eXBlOwotICAgIHN3aXRjaCAoZWxlbWVudC0+aW5wdXRUeXBlKCkp
IHsKLSAgICAgICAgY2FzZSBIVE1MSW5wdXRFbGVtZW50OjpQQVNTV09SRDoKLSAgICAgICAgICAg
IHR5cGUgPSBRTGluZUVkaXQ6OlBhc3N3b3JkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgSFRNTElucHV0RWxlbWVudDo6U0VBUkNIOgotICAgICAgICAgICAgdHlwZSA9IFFMaW5l
RWRpdDo6U2VhcmNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICB0eXBlID0gUUxpbmVFZGl0OjpOb3JtYWw7Ci0gICAgfQotICAgIFFMaW5lRWRpdCog
ZWRpdCA9IG5ldyBRTGluZUVkaXQodHlwZSk7Ci0gICAgaWYgKHR5cGUgPT0gUUxpbmVFZGl0OjpT
ZWFyY2gpCi0gICAgICAgIGVkaXQtPnNldExpdmVTZWFyY2goZmFsc2UpOwotICAgIHNldFdpZGdl
dChlZGl0KTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uQ2hhbmdlZChXaWRn
ZXQqKQotewotICAgIC8vIFdlIG9ubHkgd2FudCB0byBjYWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFj
dHVhbGx5IGlzIGEgc2VsZWN0aW9uCi0gICAgUUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxp
bmVFZGl0Kj4obV93aWRnZXQpOwotICAgIGlmICh3LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5vZGUoKSktPm9uU2VsZWN0
KCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnJldHVyblByZXNzZWQoV2lkZ2V0KikKLXsK
LSAgICAvLyBFbWl0IG9uQ2hhbmdlIGlmIG5lY2Vzc2FyeQotICAgIC8vIFdvcmtzIGJ1dCBtaWdo
dCBub3QgYmUgZW5vdWdoLCBkaXJrIHNhaWQgaGUgaGFkIGFub3RoZXIgc29sdXRpb24gYXQKLSAg
ICAvLyBoYW5kIChjYW4ndCByZW1lbWJlciB3aGljaCkgLSBEYXZpZAotICAgIGlmIChpc1RleHRG
aWVsZCgpICYmIGlzRWRpdGVkKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNG
b3JtRWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci0gICAgICAgIHNldEVkaXRlZChmYWxz
ZSk7Ci0gICAgfQotCi0gICAgaWYgKEhUTUxGb3JtRWxlbWVudCogZmUgPSBzdGF0aWNfY2FzdDxI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpKQotICAgICAgICBmZS0+c3Vi
bWl0Q2xpY2soKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6cGVyZm9ybVNlYXJjaChXaWRn
ZXQqKQotewotICAgIC8vIEZpcmUgdGhlICJzZWFyY2giIERPTSBldmVudC4KLSAgICBzdGF0aWNf
Y2FzdDxFdmVudFRhcmdldE5vZGUqPihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChzZWFyY2hF
dmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjphZGRTZWFyY2hS
ZXN1bHQoKQotewotICAgIGlmICh3aWRnZXQoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUxpbmVF
ZGl0Kj4od2lkZ2V0KCkpLT5hZGRTZWFyY2hSZXN1bHQoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5l
RWRpdDo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24o
KSk7Ci0KLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8g
YmUuCi0gICAgbV91cGRhdGluZyA9IHRydWU7Ci0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNf
Y2FzdDxRTGluZUVkaXQqPih3aWRnZXQoKSktPnNpemVGb3JDaGFyYWN0ZXJXaWR0aChzaXplID4g
MCA/IHNpemUgOiAyMCkpOwotICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLQotICAgIHNldEludHJp
bnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkp
OwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lk
IFJlbmRlckxpbmVFZGl0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJG
b3JtRWxlbWVudDo6c2V0U3R5bGUocyk7Ci0KLSAgICBRTGluZUVkaXQqIHcgPSBzdGF0aWNfY2Fz
dDxRTGluZUVkaXQqPih3aWRnZXQoKSk7Ci0gICAgdy0+c2V0QWxpZ25tZW50KHRleHRBbGlnbm1l
bnQoKSk7Ci0gICAgdy0+c2V0V3JpdGluZ0RpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24oKSA9
PSBSVEwgPyBSVEwgOiBMVFIpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0Ojp1cGRhdGVGcm9t
RWxlbWVudCgpCi17Ci0gICAgSFRNTElucHV0RWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEhUTUxJ
bnB1dEVsZW1lbnQqPihub2RlKCkpOwotICAgIFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFM
aW5lRWRpdCo+KHdpZGdldCgpKTsKLSAgICAKLSAgICBpbnQgbWwgPSBlLT5tYXhMZW5ndGgoKTsK
LSAgICBpZiAobWwgPD0gMCB8fCBtbCA+IDEwMjQpCi0gICAgICAgIG1sID0gMTAyNDsKLSAgICBp
ZiAody0+bWF4TGVuZ3RoKCkgIT0gbWwpCi0gICAgICAgIHctPnNldE1heExlbmd0aChtbCk7Ci0K
LSAgICBpZiAoIWUtPnZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkpIHsKLSAgICAgICAgU3RyaW5nIHdp
ZGdldFRleHQgPSB3LT50ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gZS0+dmFsdWUo
KTsKLSAgICAgICAgbmV3VGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1i
b2woKSk7Ci0gICAgICAgIGlmICh3aWRnZXRUZXh0ICE9IG5ld1RleHQpIHsKLSAgICAgICAgICAg
IGludCBwb3MgPSB3LT5jdXJzb3JQb3NpdGlvbigpOwotCi0gICAgICAgICAgICBtX3VwZGF0aW5n
ID0gdHJ1ZTsKLSAgICAgICAgICAgIHctPnNldFRleHQobmV3VGV4dCk7Ci0gICAgICAgICAgICBt
X3VwZGF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHctPnNldEVkaXRl
ZCggZmFsc2UgKTsKLQotICAgICAgICAgICAgdy0+c2V0Q3Vyc29yUG9zaXRpb24ocG9zKTsKLSAg
ICAgICAgfQotICAgICAgICBlLT5zZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpOwotICAgIH0KLQot
ICAgIHctPnNldFJlYWRPbmx5KGUtPmlzUmVhZE9ubHlDb250cm9sKCkpOwotICAgIAotICAgIC8v
IEhhbmRsZSB1cGRhdGluZyB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMuCi0gICAgdy0+c2V0UGxhY2Vo
b2xkZXJTdHJpbmcoZS0+Z2V0QXR0cmlidXRlKHBsYWNlaG9sZGVyQXR0cikuZGVwcmVjYXRlZFN0
cmluZygpKTsKLSAgICBpZiAody0+dHlwZSgpID09IFFMaW5lRWRpdDo6U2VhcmNoKSB7Ci0gICAg
ICAgIHctPnNldExpdmVTZWFyY2goIWUtPmdldEF0dHJpYnV0ZShpbmNyZW1lbnRhbEF0dHIpLmlz
TnVsbCgpKTsKLSAgICAgICAgdy0+c2V0QXV0b1NhdmVOYW1lKGUtPmdldEF0dHJpYnV0ZShhdXRv
c2F2ZUF0dHIpKTsKLSAgICAgICAgdy0+c2V0TWF4UmVzdWx0cyhlLT5tYXhSZXN1bHRzKCkpOwot
ICAgIH0KLQotICAgIHctPnNldENvbG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5
bGUoKS0+Y29sb3IoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1l
bnQoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17
Ci0gICAgaWYgKG1fdXBkYXRpbmcpIC8vIERvbid0IGFsdGVyIHRoZSB2YWx1ZSBpZiB3ZSBhcmUg
aW4gdGhlIG1pZGRsZSBvZiBpbml0aW5nIHRoZSBjb250cm9sLCBzaW5jZQotICAgICAgICByZXR1
cm47ICAgICAvLyB3ZSBhcmUgZ2V0dGluZyB0aGUgdmFsdWUgZnJvbSB0aGUgRE9NIGFuZCBpdCdz
IG5vdCB1c2VyIGlucHV0LgotCi0gICAgU3RyaW5nIG5ld1RleHQgPSBzdGF0aWNfY2FzdDxRTGlu
ZUVkaXQqPih3aWRnZXQoKSktPnRleHQoKTsKLQotICAgIC8vIEEgbnVsbCBzdHJpbmcgdmFsdWUg
aXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGNvbnRyb2wgaGFzIG5vdCBhbHRlcmVk
IHRoZSBvcmlnaW5hbAotICAgIC8vIGRlZmF1bHQgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgd2Ug
c2hvdWxkIG5ldmVyIHVzZSB0aGUgbnVsbCBzdHJpbmcgdmFsdWUgd2hlbiB0aGUgdXNlcgotICAg
IC8vIGVtcHRpZXMgYSB0ZXh0ZmllbGQsIGJ1dCBzaG91bGQgYWx3YXlzIGZvcmNlIGFuIGVtcHR5
IHRleHRmaWVsZCB0byB1c2UgdGhlIGVtcHR5IHN0cmluZy4KLSAgICBpZiAobmV3VGV4dC5pc051
bGwoKSkKLSAgICAgICAgbmV3VGV4dCA9ICIiOwotCi0gICAgbmV3VGV4dC5yZXBsYWNlKGJhY2tz
bGFzaEFzQ3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlRnJvbVJlbmRlcmVyKG5ld1RleHQpOwotfQotCi1p
bnQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBRTGluZUVkaXQgKmxp
bmVFZGl0ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICBpbnQgc3Rh
cnQgPSBsaW5lRWRpdC0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpZiAoc3RhcnQgPT0gLTEpCi0g
ICAgICAgIHN0YXJ0ID0gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIHN0
YXJ0OwotfQotCi1pbnQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUUxp
bmVFZGl0ICpsaW5lRWRpdCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCk7Ci0g
ICAgaW50IHN0YXJ0ID0gbGluZUVkaXQtPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaWYgKHN0YXJ0
ID09IC0xKQotICAgICAgICByZXR1cm4gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAg
cmV0dXJuIHN0YXJ0ICsgKGludClsaW5lRWRpdC0+c2VsZWN0ZWRUZXh0KCkubGVuZ3RoKCk7Ci19
Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsK
LSAgICBpbnQgcmVhbFN0YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gbWF4
KHNlbGVjdGlvbkVuZCgpIC0gcmVhbFN0YXJ0LCAwKTsKLSAgICBzdGF0aWNfY2FzdDxRTGluZUVk
aXQgKj4obV93aWRnZXQpLT5zZXRTZWxlY3Rpb24ocmVhbFN0YXJ0LCBsZW5ndGgpOwotfQotCi12
b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBpbnQg
c3RhcnQgPSBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCByZWFsRW5kID0gbWF4KGVuZCwgMCk7
Ci0gICAgaW50IGxlbmd0aCA9IHJlYWxFbmQgLSBzdGFydDsKLSAgICBpZiAobGVuZ3RoIDwgMCkg
ewotICAgICAgICBzdGFydCA9IHJlYWxFbmQ7Ci0gICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgfQot
ICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihzdGFy
dCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0KCkKLXsKLSAgICBz
dGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCktPnNlbGVjdEFsbCgpOwotfQotCi1ib29s
IFJlbmRlckxpbmVFZGl0Ojppc0VkaXRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19j
YXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0KS0+ZWRpdGVkKCk7Ci19Ci12b2lkIFJlbmRlckxpbmVF
ZGl0OjpzZXRFZGl0ZWQoYm9vbCB4KQotewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1f
d2lkZ2V0KS0+c2V0RWRpdGVkKHgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxl
Y3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaW50IHJlYWxTdGFydCA9IG1h
eChzdGFydCwgMCk7Ci0gICAgaW50IGxlbmd0aCA9IG1heChlbmQgLSByZWFsU3RhcnQsIDApOwot
ICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihyZWFs
U3RhcnQsIGxlbmd0aCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJGaWVs
ZHNldDo6UmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLTog
UmVuZGVyQmxvY2soZWxlbWVudCkKLXsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNl
dDo6bGF5b3V0TGVnZW5kKGJvb2wgcmVsYXlvdXRDaGlsZHJlbikKLXsKLSAgICBSZW5kZXJPYmpl
Y3QqIGxlZ2VuZCA9IGZpbmRMZWdlbmQoKTsKLSAgICBpZiAobGVnZW5kKSB7Ci0gICAgICAgIGlm
IChyZWxheW91dENoaWxkcmVuKQotICAgICAgICAgICAgbGVnZW5kLT5zZXROZWVkc0xheW91dCh0
cnVlKTsKLSAgICAgICAgbGVnZW5kLT5sYXlvdXRJZk5lZWRlZCgpOwotCi0gICAgICAgIGludCB4
UG9zID0gYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKSArIGxlZ2VuZC0+bWFyZ2luTGVmdCgp
OwotICAgICAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKQotICAgICAgICAgICAg
eFBvcyA9IG1fd2lkdGggLSBwYWRkaW5nUmlnaHQoKSAtIGJvcmRlclJpZ2h0KCkgLSBsZWdlbmQt
PndpZHRoKCkgLSBsZWdlbmQtPm1hcmdpblJpZ2h0KCk7Ci0gICAgICAgIGludCBiID0gYm9yZGVy
VG9wKCk7Ci0gICAgICAgIGludCBoID0gbGVnZW5kLT5oZWlnaHQoKTsKLSAgICAgICAgbGVnZW5k
LT5zZXRQb3MoeFBvcywgbWF4KChiLWgpLzIsIDApKTsKLSAgICAgICAgbV9oZWlnaHQgPSBtYXgo
YixoKSArIHBhZGRpbmdUb3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxlZ2VuZDsKLX0KLQotUmVu
ZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNldDo6ZmluZExlZ2VuZCgpCi17Ci0gICAgZm9yIChSZW5k
ZXJPYmplY3QqIGxlZ2VuZCA9IGZpcnN0Q2hpbGQoKTsgbGVnZW5kOyBsZWdlbmQgPSBsZWdlbmQt
Pm5leHRTaWJsaW5nKCkpIHsKLSAgICAgIGlmICghbGVnZW5kLT5pc0Zsb2F0aW5nT3JQb3NpdGlv
bmVkKCkgJiYgbGVnZW5kLT5lbGVtZW50KCkgJiYKLSAgICAgICAgICBsZWdlbmQtPmVsZW1lbnQo
KS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQotICAgICAgICByZXR1cm4gbGVnZW5kOwotICAgIH0K
LSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJGaWVsZHNldDo6cGFpbnRCb3hEZWNvcmF0
aW9ucyhQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgaW50IHcgPSB3aWR0
aCgpOwotICAgIGludCBoID0gaGVpZ2h0KCkgKyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90
dG9tRXh0cmEoKTsKLSAgICBSZW5kZXJPYmplY3QqIGxlZ2VuZCA9IGZpbmRMZWdlbmQoKTsKLSAg
ICBpZiAoIWxlZ2VuZCkKLSAgICAgICAgcmV0dXJuIFJlbmRlckJsb2NrOjpwYWludEJveERlY29y
YXRpb25zKGksIF90eCwgX3R5KTsKLQotICAgIGludCB5T2ZmID0gKGxlZ2VuZC0+eVBvcygpID4g
MCkgPyAwIDogKGxlZ2VuZC0+aGVpZ2h0KCktYm9yZGVyVG9wKCkpLzI7Ci0gICAgaCAtPSB5T2Zm
OwotICAgIF90eSArPSB5T2ZmIC0gYm9yZGVyVG9wRXh0cmEoKTsKLQotICAgIGludCBteSA9IG1h
eChfdHksIGkuci55KCkpOwotICAgIGludCBlbmQgPSBtaW4oaS5yLmJvdHRvbSgpLCAgX3R5ICsg
aCk7Ci0gICAgaW50IG1oID0gZW5kIC0gbXk7Ci0KLSAgICBwYWludEJhY2tncm91bmQoaS5wLCBz
dHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpLCBt
eSwgbWgsIF90eCwgX3R5LCB3LCBoKTsKLQotICAgIGlmIChzdHlsZSgpLT5oYXNCb3JkZXIoKSkK
LSAgICAgICAgcGFpbnRCb3JkZXJNaW51c0xlZ2VuZChpLnAsIF90eCwgX3R5LCB3LCBoLCBzdHls
ZSgpLCBsZWdlbmQtPnhQb3MoKSwgbGVnZW5kLT53aWR0aCgpKTsKLX0KLQotdm9pZCBSZW5kZXJG
aWVsZHNldDo6cGFpbnRCb3JkZXJNaW51c0xlZ2VuZChHcmFwaGljc0NvbnRleHQqIHAsIGludCBf
dHgsIGludCBfdHksIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQgbHgsIGludCBsdykK
LXsKLQotICAgIGNvbnN0IENvbG9yJiB0YyA9IHN0eWxlLT5ib3JkZXJUb3BDb2xvcigpOwotICAg
IGNvbnN0IENvbG9yJiBiYyA9IHN0eWxlLT5ib3JkZXJCb3R0b21Db2xvcigpOwotCi0gICAgRUJv
cmRlclN0eWxlIHRzID0gc3R5bGUtPmJvcmRlclRvcFN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxl
IGJzID0gc3R5bGUtPmJvcmRlckJvdHRvbVN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxlIGxzID0g
c3R5bGUtPmJvcmRlckxlZnRTdHlsZSgpOwotICAgIEVCb3JkZXJTdHlsZSBycyA9IHN0eWxlLT5i
b3JkZXJSaWdodFN0eWxlKCk7Ci0KLSAgICBib29sIHJlbmRlcl90ID0gdHMgPiBCSElEREVOOwot
ICAgIGJvb2wgcmVuZGVyX2wgPSBscyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfciA9IHJz
ID4gQkhJRERFTjsKLSAgICBib29sIHJlbmRlcl9iID0gYnMgPiBCSElEREVOOwotCi0gICAgaWYo
cmVuZGVyX3QpIHsKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgbHgsIF90
eSArICBzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwgQlNUb3AsIHRjLCBzdHlsZS0+Y29sb3IoKSwg
dHMsCi0gICAgICAgICAgICAgICAgICAgKHJlbmRlcl9sICYmIChscyA9PSBET1RURUQgfHwgbHMg
PT0gREFTSEVEIHx8IGxzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlckxlZnRXaWR0aCgpOjApLCAw
KTsKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgrbHgrbHcsIF90eSwgX3R4ICsgdywgX3R5ICsg
IHN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLCBCU1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywK
LSAgICAgICAgICAgICAgICAgICAwLCAocmVuZGVyX3IgJiYgKHJzID09IERPVFRFRCB8fCBycyA9
PSBEQVNIRUQgfHwgcnMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpOjApKTsK
LSAgICB9Ci0KLSAgICBpZihyZW5kZXJfYikKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90
eSArIGggLSBzdHlsZS0+Ym9yZGVyQm90dG9tV2lkdGgoKSwgX3R4ICsgdywgX3R5ICsgaCwgQlNC
b3R0b20sIGJjLCBzdHlsZS0+Y29sb3IoKSwgYnMsCi0gICAgICAgICAgICAgICAgICAgKHJlbmRl
cl9sICYmIChscyA9PSBET1RURUQgfHwgbHMgPT0gREFTSEVEIHx8IGxzID09IERPVUJMRSk/c3R5
bGUtPmJvcmRlckxlZnRXaWR0aCgpOjApLAotICAgICAgICAgICAgICAgICAgIChyZW5kZXJfciAm
JiAocnMgPT0gRE9UVEVEIHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VCTEUpP3N0eWxlLT5i
b3JkZXJSaWdodFdpZHRoKCk6MCkpOwotCi0gICAgaWYocmVuZGVyX2wpCi0gICAgewotICAgICAg
ICBjb25zdCBDb2xvciYgbGMgPSBzdHlsZS0+Ym9yZGVyTGVmdENvbG9yKCk7Ci0KLSAgICAgICAg
Ym9vbCBpZ25vcmVfdG9wID0KLSAgICAgICAgICAgICh0YyA9PSBsYykgJiYKLSAgICAgICAgICAg
IChscyA+PSBPVVRTRVQpICYmCi0gICAgICAgICAgICAodHMgPT0gRE9UVEVEIHx8IHRzID09IERB
U0hFRCB8fCB0cyA9PSBTT0xJRCB8fCB0cyA9PSBPVVRTRVQpOwotCi0gICAgICAgIGJvb2wgaWdu
b3JlX2JvdHRvbSA9Ci0gICAgICAgICAgICAoYmMgPT0gbGMpICYmCi0gICAgICAgICAgICAobHMg
Pj0gT1VUU0VUKSAmJgotICAgICAgICAgICAgKGJzID09IERPVFRFRCB8fCBicyA9PSBEQVNIRUQg
fHwgYnMgPT0gU09MSUQgfHwgYnMgPT0gSU5TRVQpOwotCi0gICAgICAgIGRyYXdCb3JkZXIocCwg
X3R4LCBfdHksIF90eCArIHN0eWxlLT5ib3JkZXJMZWZ0V2lkdGgoKSwgX3R5ICsgaCwgQlNMZWZ0
LCBsYywgc3R5bGUtPmNvbG9yKCksIGxzLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV90b3A/
MDpzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVfYm90
dG9tPzA6c3R5bGUtPmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRl
cl9yKQotICAgIHsKLSAgICAgICAgY29uc3QgQ29sb3ImIHJjID0gc3R5bGUtPmJvcmRlclJpZ2h0
Q29sb3IoKTsKLQotICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAgICAgICAgICAgKHRjID09
IHJjKSAmJgotICAgICAgICAgICAgKHJzID49IERPVFRFRCB8fCBycyA9PSBJTlNFVCkgJiYKLSAg
ICAgICAgICAgICh0cyA9PSBET1RURUQgfHwgdHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8
IHRzID09IE9VVFNFVCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAg
ICAgIChiYyA9PSByYykgJiYKLSAgICAgICAgICAgIChycyA+PSBET1RURUQgfHwgcnMgPT0gSU5T
RVQpICYmCi0gICAgICAgICAgICAoYnMgPT0gRE9UVEVEIHx8IGJzID09IERBU0hFRCB8fCBicyA9
PSBTT0xJRCB8fCBicyA9PSBJTlNFVCk7Ci0KLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHggKyB3
IC0gc3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKSwgX3R5LCBfdHggKyB3LCBfdHkgKyBoLCBCU1Jp
Z2h0LCByYywgc3R5bGUtPmNvbG9yKCksIHJzLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV90
b3A/MDpzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVf
Ym90dG9tPzA6c3R5bGUtPmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAgIH0KLX0KLQotdm9pZCBS
ZW5kZXJGaWVsZHNldDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUqIF9zdHlsZSkKLXsKLSAgICBSZW5k
ZXJCbG9jazo6c2V0U3R5bGUoX3N0eWxlKTsKLQotICAgIC8vIFdpbklFIHJlbmRlcnMgZmllbGRz
ZXRzIHdpdGggZGlzcGxheTppbmxpbmUgbGlrZSB0aGV5J3JlIGlubGluZS1ibG9ja3MuICBGb3Ig
dXMsCi0gICAgLy8gYW4gaW5saW5lLWJsb2NrIGlzIGp1c3QgYSBibG9jayBlbGVtZW50IHdpdGgg
cmVwbGFjZWQgc2V0IHRvIHRydWUgYW5kIGlubGluZSBzZXQKLSAgICAvLyB0byB0cnVlLiAgRW5z
dXJlIHRoYXQgaWYgd2UgZW5kZWQgdXAgYmVpbmcgaW5saW5lIHRoYXQgd2Ugc2V0IG91ciByZXBs
YWNlZCBmbGFnCi0gICAgLy8gc28gdGhhdCB3ZSdyZSB0cmVhdGVkIGxpa2UgYW4gaW5saW5lLWJs
b2NrLgotICAgIGlmIChpc0lubGluZSgpKQotICAgICAgICBzZXRSZXBsYWNlZCh0cnVlKTsKLX0g
ICAgCi0gICAgCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckZpbGVCdXR0b246OlJlbmRl
ckZpbGVCdXR0b24oSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1F
bGVtZW50KGVsZW1lbnQpCi17Ci0gICAgc2V0V2lkZ2V0KG5ldyBLV1FGaWxlQnV0dG9uKHZpZXco
KS0+ZnJhbWUoKSkpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OmNhbGNNaW5NYXhXaWR0
aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkpOwotCi0gICAgLy8gTGV0IHRo
ZSB3aWRnZXQgdGVsbCB1cyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgIGludCBzaXplID0g
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNpemUoKTsKLSAgICBJbnRT
aXplIHMoc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbiAqPih3aWRnZXQoKSktPnNpemVGb3JDaGFy
YWN0ZXJXaWR0aChzaXplID4gMCA/IHNpemUgOiAyMCkpOwotCi0gICAgc2V0SW50cmluc2ljV2lk
dGgocy53aWR0aCgpKTsKLSAgICBzZXRJbnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0KLSAg
ICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
RmlsZUJ1dHRvbjo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIHN0YXRpY19jYXN0PEtXUUZp
bGVCdXR0b24qPih3aWRnZXQoKSktPnNldEZpbGVuYW1lKAotICAgICAgICBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+dmFsdWUoKS5kZXByZWNhdGVkU3RyaW5nKCkpOwot
Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLXZvaWQg
UmVuZGVyRmlsZUJ1dHRvbjo6cmV0dXJuUHJlc3NlZChXaWRnZXQqKQotewotICAgIGlmIChzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpKQotICAgICAgICBzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpLT5wcmVwYXJlU3VibWl0
KCk7Ci19Ci0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17
Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlRnJv
bVJlbmRlcmVyKHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24qPih3aWRnZXQoKSktPmZpbGVuYW1l
KCkpOwotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5vbkNoYW5n
ZSgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OnNlbGVjdCgpCi17Ci19Ci0KLQotdm9p
ZCBSZW5kZXJGaWxlQnV0dG9uOjpjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cykKLXsKLSAgICBz
dGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uICo+KHdpZGdldCgpKS0+Y2xpY2soc2VuZE1vdXNlRXZl
bnRzKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxhYmVsOjpSZW5kZXJM
YWJlbChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVs
ZW1lbnQoZWxlbWVudCkKLXsKLQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxl
Z2VuZDo6UmVuZGVyTGVnZW5kKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpCi0gICAg
OiBSZW5kZXJCbG9jayhlbGVtZW50KQotewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJl
bmRlclNlbGVjdDo6UmVuZGVyU2VsZWN0KEhUTUxTZWxlY3RFbGVtZW50ICplbGVtZW50KQotICAg
IDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50
cyA9IGZhbHNlOwotICAgIG1fbXVsdGlwbGUgPSBlbGVtZW50LT5tdWx0aXBsZSgpOwotICAgIG1f
c2l6ZSA9IGVsZW1lbnQtPnNpemUoKTsKLSAgICBtX3VzZUxpc3RCb3ggPSAobV9tdWx0aXBsZSB8
fCBtX3NpemUgPiAxKTsKLSAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgIG1fb3B0
aW9uc0NoYW5nZWQgPSB0cnVlOwotCi0gICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgc2V0
V2lkZ2V0KGNyZWF0ZUxpc3RCb3goKSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRXaWRnZXQobmV3
IFFDb21ib0JveCk7Ci19Ci0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnNldFdpZGdldFdyaXRpbmdE
aXJlY3Rpb24oKQotewotICAgIFRleHREaXJlY3Rpb24gZCA9IHN0eWxlKCktPmRpcmVjdGlvbigp
ID09IFJUTCA/IFJUTCA6IExUUjsKLSAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICBzdGF0
aWNfY2FzdDxRTGlzdEJveCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci0g
ICAgZWxzZQotICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3ggKj4obV93aWRnZXQpLT5zZXRX
cml0aW5nRGlyZWN0aW9uKGQpOwotfQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2V0U3R5bGUoUmVu
ZGVyU3R5bGUgKnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotICAg
IHNldFdpZGdldFdyaXRpbmdEaXJlY3Rpb24oKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6
dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gdHJ1ZTsK
LQotICAgIC8vIGNoYW5nZSB3aWRnZXQgdHlwZQotICAgIGJvb2wgb2xkTXVsdGlwbGUgPSBtX211
bHRpcGxlOwotICAgIHVuc2lnbmVkIG9sZFNpemUgPSBtX3NpemU7Ci0gICAgYm9vbCBvbGRMaXN0
Ym94ID0gbV91c2VMaXN0Qm94OwotCi0gICAgbV9tdWx0aXBsZSA9IHN0YXRpY19jYXN0PEhUTUxT
ZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+bXVsdGlwbGUoKTsKLSAgICBtX3NpemUgPSBzdGF0aWNf
Y2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPnNpemUoKTsKLSAgICBtX3VzZUxpc3RC
b3ggPSAobV9tdWx0aXBsZSB8fCBtX3NpemUgPiAxKTsKLQotICAgIGlmIChvbGRNdWx0aXBsZSAh
PSBtX211bHRpcGxlIHx8IG9sZFNpemUgIT0gbV9zaXplKSB7Ci0gICAgICAgIGlmIChtX3VzZUxp
c3RCb3ggIT0gb2xkTGlzdGJveCkgewotICAgICAgICAgICAgLy8gdHlwZSBvZiBzZWxlY3QgaGFz
IGNoYW5nZWQKLSAgICAgICAgICAgIGRlbGV0ZSBtX3dpZGdldDsKLQotICAgICAgICAgICAgaWYg
KG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgp
KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXRXaWRnZXQobmV3IFFDb21i
b0JveCk7Ci0gICAgICAgICAgICBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAobV91c2VMaXN0Qm94ICYmIG9sZE11bHRpcGxlICE9IG1fbXVsdGlw
bGUpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5zZXRT
ZWxlY3Rpb25Nb2RlKG1fbXVsdGlwbGUgPyBRTGlzdEJveDo6RXh0ZW5kZWQgOiBRTGlzdEJveDo6
U2luZ2xlKTsKLSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwot
ICAgICAgICBtX29wdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUg
Y29udGVudHMgbGlzdGJveC9jb21ib2JveCBiYXNlZCBvbiBvcHRpb25zIGluIG1fZWxlbWVudAot
ICAgIGlmICggbV9vcHRpb25zQ2hhbmdlZCApIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhU
TUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+bV9yZWNhbGNMaXN0SXRlbXMpCi0gICAgICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPnJlY2FsY0xpc3RJdGVt
cygpOwotICAgICAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBz
dGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotICAg
ICAgICBpbnQgbGlzdEluZGV4OwotCi0gICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+Y2xlYXIoKTsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jbGVh
cigpOwotCi0gICAgICAgIGJvb2wgZ3JvdXBFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgZm9yIChs
aXN0SW5kZXggPSAwOyBsaXN0SW5kZXggPCBpbnQobGlzdEl0ZW1zLnNpemUoKSk7IGxpc3RJbmRl
eCsrKSB7Ci0gICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUo
b3B0Z3JvdXBUYWcpKSB7Ci0gICAgICAgICAgICAgICAgSFRNTE9wdEdyb3VwRWxlbWVudCAqb3B0
Z3JvdXBFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdEdyb3VwRWxlbWVudCo+KGxpc3RJdGVt
c1tsaXN0SW5kZXhdKTsKLSAgICAgICAgICAgICAgICBEZXByZWNhdGVkU3RyaW5nIGxhYmVsID0g
b3B0Z3JvdXBFbGVtZW50LT5nZXRBdHRyaWJ1dGUobGFiZWxBdHRyKS5kZXByZWNhdGVkU3RyaW5n
KCk7Ci0gICAgICAgICAgICAgICAgbGFiZWwucmVwbGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1cnJl
bmN5U3ltYm9sKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEluIFdp
bklFLCBhbiBvcHRncm91cCBjYW4ndCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlIChvdGhl
ciB0aGFuIHRoZSBpbmRlbnQKLSAgICAgICAgICAgICAgICAvLyB3ZSBnaXZlIGl0KS4gIFdlIG1h
dGNoIHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5zdHJpcFdo
aXRlU3BhY2UoKTsKLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGNvbGxhcHNlIG91ciB3
aGl0ZXNwYWNlIHRvby4gIFRoaXMgd2lsbCBtYXRjaCBvdGhlciBicm93c2Vycy4KLSAgICAgICAg
ICAgICAgICBsYWJlbCA9IGxhYmVsLnNpbXBsaWZ5V2hpdGVTcGFjZSgpOwotCi0gICAgICAgICAg
ICAgICAgZ3JvdXBFbmFibGVkID0gb3B0Z3JvdXBFbGVtZW50LT5pc0VuYWJsZWQoKTsKLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+YXBwZW5kR3JvdXBM
YWJlbChsYWJlbCwgZ3JvdXBFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5kR3Jv
dXBMYWJlbChsYWJlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0
SXRlbXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAg
ICAgSFRNTE9wdGlvbkVsZW1lbnQgKm9wdGlvbkVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tsaXN0SW5kZXhdKTsKLSAgICAgICAgICAgICAgICBEZXBy
ZWNhdGVkU3RyaW5nIGl0ZW1UZXh0OwotICAgICAgICAgICAgICAgIGlmIChvcHRpb25FbGVtZW50
LT5oYXNBdHRyaWJ1dGUobGFiZWxBdHRyKSkKLSAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQg
PSBvcHRpb25FbGVtZW50LT5nZXRBdHRyaWJ1dGUobGFiZWxBdHRyKS5kZXByZWNhdGVkU3RyaW5n
KCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpdGVtVGV4dCA9
IG9wdGlvbkVsZW1lbnQtPnRleHQoKS5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAgICAgaXRlbVRleHQucmVwbGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1
cnJlbmN5U3ltYm9sKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gSW4gV2luSUUsIGxlYWRpbmcg
YW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBpbiBvcHRpb25zLiBXZSBtYXRjaCB0
aGlzIGJlaGF2aW9yLgotICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gaXRlbVRleHQuc3RyaXBX
aGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBjb2xsYXBzZSBvdXIg
d2hpdGVzcGFjZSB0b28uICBUaGlzIHdpbGwgbWF0Y2ggb3RoZXIgYnJvd3NlcnMuCi0gICAgICAg
ICAgICAgICAgaXRlbVRleHQgPSBpdGVtVGV4dC5zaW1wbGlmeVdoaXRlU3BhY2UoKTsKLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPnBh
cmVudE5vZGUoKS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICAgICAgICAg
IGl0ZW1UZXh0LnByZXBlbmQoIiAgICAiKTsKLQotICAgICAgICAgICAgICAgIGlmIChtX3VzZUxp
c3RCb3gpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRn
ZXQpLT5hcHBlbmRJdGVtKGl0ZW1UZXh0LCBncm91cEVuYWJsZWQgJiYgb3B0aW9uRWxlbWVudC0+
aXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5hcHBlbmRJdGVtKGl0ZW1UZXh0LCBn
cm91cEVuYWJsZWQgJiYgb3B0aW9uRWxlbWVudC0+aXNFbmFibGVkKCkpOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgZWxzZSBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUo
aHJUYWcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX3VzZUxpc3RCb3gpCi0gICAgICAgICAg
ICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5kU2VwYXJh
dG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
S0hUTUxBc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1
ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmRvbmVBcHBlbmRpbmdJdGVtcygpOwotICAg
ICAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgICAgICBtX29wdGlvbnND
aGFuZ2VkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHNlbGVjdGlvbgotICAgIGlm
IChtX3NlbGVjdGlvbkNoYW5nZWQpIHsKLSAgICAgICAgdXBkYXRlU2VsZWN0aW9uKCk7Ci0gICAg
fQotCi0gICAgbV9pZ25vcmVTZWxlY3RFdmVudHMgPSBmYWxzZTsKLQotICAgIFJlbmRlckZvcm1F
bGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi0KLXNob3J0IFJlbmRlclNlbGVjdDo6
YmFzZWxpbmVQb3NpdGlvbiggYm9vbCBmLCBib29sIGlzUm9vdExpbmVCb3ggKSBjb25zdAotewot
ICAgIGlmIChtX3VzZUxpc3RCb3gpIHsKLSAgICAgICAgLy8gRklYTUU6IFNob3VsZCBnZXQgdGhl
IGhhcmRjb2RlZCBjb25zdGFudCBvZiA3IGJ5IGNhbGxpbmcgYSBRTGlzdEJveCBmdW5jdGlvbiwK
LSAgICAgICAgLy8gYXMgd2UgZG8gZm9yIG90aGVyIHdpZGdldCBjbGFzc2VzLgotICAgICAgICBy
ZXR1cm4gUmVuZGVyV2lkZ2V0OjpiYXNlbGluZVBvc2l0aW9uKCBmLCBpc1Jvb3RMaW5lQm94ICkg
LSA3OwotICAgIH0KLSAgICByZXR1cm4gUmVuZGVyRm9ybUVsZW1lbnQ6OmJhc2VsaW5lUG9zaXRp
b24oIGYsIGlzUm9vdExpbmVCb3ggKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6Y2FsY01p
bk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCggIW1pbk1heEtub3duKCkgKTsKLQotICAg
IGlmIChtX29wdGlvbnNDaGFuZ2VkKQotICAgICAgICB1cGRhdGVGcm9tRWxlbWVudCgpOwotCi0g
ICAgLy8gIyMjIHVnbHkgSEFDSyBGSVhNRSEhIQotICAgIHNldE1pbk1heEtub3duKCk7Ci0gICAg
bGF5b3V0SWZOZWVkZWQoKTsKLSAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwot
ICAgIC8vICMjIyBlbmQgRklYTUUKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4
V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OmxheW91dCggKQotewotICAgIEtIVE1M
QXNzZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOwot
Ci0gICAgLy8gIyMjIG1haW50YWluIHNlbGVjdGlvbiBwcm9wZXJseSBiZXR3ZWVuIHR5cGUvc2l6
ZSBjaGFuZ2VzLCBhbmQgd29yawotICAgIC8vIG91dCBob3cgdG8gaGFuZGxlIG11bHRpc2VsZWN0
LT5zaW5nbGVzZWxlY3QgKHByb2JhYmx5IGp1c3Qgc2VsZWN0Ci0gICAgLy8gZmlyc3Qgc2VsZWN0
ZWQgb25lKQotCi0gICAgLy8gY2FsY3VsYXRlIHNpemUKLSAgICBpZihtX3VzZUxpc3RCb3gpIHsK
LSAgICAgICAgUUxpc3RCb3gqIHcgPSBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KTsK
LQotCi0gICAgICAgIGludCBzaXplID0gbV9zaXplOwotICAgICAgICAvLyBjaGVjayBpZiBtdWx0
aXBsZSBhbmQgc2l6ZSB3YXMgbm90IGdpdmVuIG9yIGludmFsaWQKLSAgICAgICAgLy8gSW50ZXJu
ZXQgRXhwbG9kZXIgc2V0cyBzaXplIHRvIG1pbihudW1iZXIgb2YgZWxlbWVudHMsIDQpCi0gICAg
ICAgIC8vIE5ldHNjYXBlIHNlZW1zIHRvIHNpbXBseSBzZXQgaXQgdG8gIm51bWJlciBvZiBlbGVt
ZW50cyIKLSAgICAgICAgLy8gdGhlIGF2ZXJhZ2Ugb2YgdGhhdCBpcyBJTUhPIG1pbihudW1iZXIg
b2YgZWxlbWVudHMsIDEwKQotICAgICAgICAvLyBzbyBJIGRpZCB0aGF0IDstKQotICAgICAgICBp
ZihzaXplIDwgMSkKLSAgICAgICAgICAgIHNpemUgPSBtaW4oc3RhdGljX2Nhc3Q8UUxpc3RCb3gq
PihtX3dpZGdldCktPmNvdW50KCksIDEwVSk7Ci0KLSAgICAgICAgLy8gTGV0IHRoZSB3aWRnZXQg
dGVsbCB1cyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgICAgICBJbnRTaXplIHMody0+c2l6
ZUZvck51bWJlck9mTGluZXMoc2l6ZSkpOwotICAgICAgICBzZXRJbnRyaW5zaWNXaWR0aCggcy53
aWR0aCgpICk7Ci0gICAgICAgIHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQoKSApOwotICAg
IH0KLSAgICBlbHNlIHsKLSAgICAgICAgSW50U2l6ZSBzKG1fd2lkZ2V0LT5zaXplSGludCgpKTsK
LSAgICAgICAgc2V0SW50cmluc2ljV2lkdGgoIHMud2lkdGgoKSApOwotICAgICAgICBzZXRJbnRy
aW5zaWNIZWlnaHQoIHMuaGVpZ2h0KCkgKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVu
dDo6bGF5b3V0KCk7Ci0KLSAgICAvLyBhbmQgbm93IGRpc2FibGUgdGhlIHdpZGdldCBpbiBjYXNl
IHRoZXJlIGlzIG5vIDxvcHRpb24+IGdpdmVuCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVt
ZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkp
LT5saXN0SXRlbXMoKTsKLQotICAgIGJvb2wgZm91bmRPcHRpb24gPSBmYWxzZTsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbGlzdEl0ZW1zLnNpemUoKSAmJiAhZm91bmRPcHRpb247IGkr
KykKLSAgICAgICAgZm91bmRPcHRpb24gPSAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlv
blRhZykpOwotCi0gICAgbV93aWRnZXQtPnNldEVuYWJsZWQoZm91bmRPcHRpb24gJiYgISBzdGF0
aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmRpc2FibGVkKCkpOwotfQotCi12
b2lkIFJlbmRlclNlbGVjdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgaWYgKG1faWdu
b3JlU2VsZWN0RXZlbnRzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBLSFRNTEFzc2VydCghbV91
c2VMaXN0Qm94KTsKLQotICAgIGludCBpbmRleCA9IHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1f
d2lkZ2V0KS0+Y3VycmVudEl0ZW0oKTsKLQotICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxlbWVu
dCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+
bGlzdEl0ZW1zKCk7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCAoaW50KWxpc3RJdGVt
cy5zaXplKCkpIHsKLSAgICAgICAgYm9vbCBmb3VuZCA9IGxpc3RJdGVtc1tpbmRleF0tPmhhc1Rh
Z05hbWUob3B0aW9uVGFnKTsKLSAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgLy8g
dGhpcyBvbmUgaXMgbm90IHNlbGVjdGFibGUsICB3ZSBuZWVkIHRvIGZpbmQgYW4gb3B0aW9uIGVs
ZW1lbnQKLSAgICAgICAgICAgIHdoaWxlICgodW5zaWduZWQpIGluZGV4IDwgbGlzdEl0ZW1zLnNp
emUoKSkgewotICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbaW5kZXhdLT5oYXNUYWdOYW1l
KG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
KytpbmRleDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAg
ICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChsaXN0SXRlbXNbaW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC0taW5kZXg7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KGZvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoIGluZGV4ICE9IHN0YXRpY19jYXN0PFFDb21ib0Jv
eCo+KG1fd2lkZ2V0KS0+Y3VycmVudEl0ZW0oKSApCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5zZXRDdXJyZW50SXRlbSggaW5kZXggKTsKLQotICAg
ICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVtcy5zaXplKCk7ICsraSkK
LSAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykg
JiYgaSAhPSAodW5zaWduZWQgaW50KSBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPiggbGlzdEl0ZW1zW2ldICktPm1fc2VsZWN0ZWQgPSBm
YWxzZTsKLQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0
SXRlbXNbaW5kZXhdKS0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci19
Ci0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0KikKLXsKLSAg
ICBpZiAobV9pZ25vcmVTZWxlY3RFdmVudHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIGRv
bid0IHVzZSBsaXN0SXRlbXMoKSBoZXJlIGFzIHdlIGhhdmUgdG8gYXZvaWQgcmVjYWxjdWxhdGlv
bnMgLSBjaGFuZ2luZyB0aGUKLSAgICAvLyBvcHRpb24gbGlzdCB3aWxsIG1ha2UgdXNlIHVwZGF0
ZSBvcHRpb25zIG5vdCBpbiB0aGUgd2F5IHRoZSB1c2VyIGV4cGVjdHMgdGhlbQotICAgIERlcHJl
Y2F0ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxl
Y3RFbGVtZW50Kj4obm9kZSgpKS0+bV9saXN0SXRlbXM7Ci0gICAgaW50IGogPSAwOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0SXRlbXMuY291bnQoKTsgaSsrKSB7Ci0gICAgICAg
IC8vIGRvbid0IHVzZSBzZXRTZWxlY3RlZCgpIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGNhdXNlIHVz
IHRvIGJlIGNhbGxlZAotICAgICAgICAvLyBhZ2FpbiB3aXRoIHVwZGF0ZVNlbGVjdGlvbi4KLSAg
ICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKQotICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPiggbGlzdEl0ZW1zW2ldICkKLSAgICAg
ICAgICAgICAgICAtPm1fc2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KCBtX3dpZGdl
dCApLT5pc1NlbGVjdGVkKCBqICk7Ci0gICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05h
bWUob3B0aW9uVGFnKSB8fCBsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQot
ICAgICAgICAgICAgKytqOwotICAgIH0KLSAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVu
dCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci19Ci0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnNldE9w
dGlvbnNDaGFuZ2VkKGJvb2wgX29wdGlvbnNDaGFuZ2VkKQotewotICAgIG1fb3B0aW9uc0NoYW5n
ZWQgPSBfb3B0aW9uc0NoYW5nZWQ7Ci19Ci0KLVFMaXN0Qm94KiBSZW5kZXJTZWxlY3Q6OmNyZWF0
ZUxpc3RCb3goKQotewotICAgIFFMaXN0Qm94ICpsYiA9IG5ldyBRTGlzdEJveCgpOwotICAgIGxi
LT5zZXRTZWxlY3Rpb25Nb2RlKG1fbXVsdGlwbGUgPyBRTGlzdEJveDo6RXh0ZW5kZWQgOiBRTGlz
dEJveDo6U2luZ2xlKTsKLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9IGZhbHNlOwotICAgIHJl
dHVybiBsYjsKLX0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnVwZGF0ZVNlbGVjdGlvbigpCi17Ci0g
ICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8
SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpbnQgaTsKLSAg
ICBpZiAobV91c2VMaXN0Qm94KSB7Ci0gICAgICAgIC8vIGlmIG11bHRpLXNlbGVjdCwgd2Ugc2Vs
ZWN0IG9ubHkgdGhlIG5ldyBzZWxlY3RlZCBpbmRleAotICAgICAgICBRTGlzdEJveCAqbGlzdEJv
eCA9IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpOwotICAgICAgICBpbnQgaiA9IDA7
Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnQobGlzdEl0ZW1zLnNpemUoKSk7IGkrKykgewot
ICAgICAgICAgICAgbGlzdEJveC0+c2V0U2VsZWN0ZWQoaiwgbGlzdEl0ZW1zW2ldLT5oYXNUYWdO
YW1lKG9wdGlvblRhZykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5zZWxlY3RlZCgpKTsKLSAg
ICAgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBsaXN0
SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICAgICAgICAgICsrajsK
LSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBib29s
IGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHVuc2lnbmVkIGZpcnN0T3B0aW9uID0gbGlzdEl0ZW1z
LnNpemUoKTsKLSAgICAgICAgaSA9IGxpc3RJdGVtcy5zaXplKCk7Ci0gICAgICAgIHdoaWxlIChp
LS0pCi0gICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykp
IHsKLSAgICAgICAgICAgICAgICBpZiAoZm91bmQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9IGZh
bHNlOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVt
ZW50Kj4obGlzdEl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxRQ29tYm9Cb3gqPiggbV93aWRnZXQgKS0+c2V0Q3VycmVudEl0ZW0oaSk7Ci0g
ICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgZmlyc3RPcHRpb24gPSBpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIEFT
U0VSVChmaXJzdE9wdGlvbiA9PSBsaXN0SXRlbXMuc2l6ZSgpIHx8IGZvdW5kKTsKLSAgICB9Ci0K
LSAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJUZXh0QXJlYTo6UmVuZGVyVGV4
dEFyZWEoSFRNTFRleHRBcmVhRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVt
ZW50KGVsZW1lbnQpLCBtX2RpcnR5KGZhbHNlKSwgbV91cGRhdGluZyhmYWxzZSkKLXsKLSAgICBR
VGV4dEVkaXQgKmVkaXQgPSBuZXcgUVRleHRFZGl0KHZpZXcoKSk7Ci0KLSAgICBpZiAoZWxlbWVu
dC0+d3JhcCgpICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKLSAgICAgICAgZWRp
dC0+c2V0V29yZFdyYXAoUVRleHRFZGl0OjpXaWRnZXRXaWR0aCk7Ci0gICAgZWxzZQotICAgICAg
ICBlZGl0LT5zZXRXb3JkV3JhcChRVGV4dEVkaXQ6Ok5vV3JhcCk7Ci0KLSAgICBzZXRXaWRnZXQo
ZWRpdCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OmRlc3Ryb3koKQotewotICAgIHN0YXRp
Y19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5yZW5kZXJlcldpbGxCZURlc3Ry
b3llZCgpOwotICAgIFJlbmRlckZvcm1FbGVtZW50OjpkZXN0cm95KCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyVGV4dEFyZWE6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoICFtaW5N
YXhLbm93bigpICk7Ci0KLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQq
PihtX3dpZGdldCk7Ci0gICAgSW50U2l6ZSBzaXplKHctPnNpemVXaXRoQ29sdW1uc0FuZFJvd3Mo
Ci0gICAgICAgIG1heChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+
Y29scygpLCAxKSwKLSAgICAgICAgbWF4KHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQq
Pihub2RlKCkpLT5yb3dzKCksIDEpKSk7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aCggc2l6ZS53
aWR0aCgpICk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KCBzaXplLmhlaWdodCgpICk7Ci0KLSAg
ICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGV4dEFyZWE6OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQotewotICAgIFJlbmRlckZvcm1FbGVt
ZW50OjpzZXRTdHlsZShzKTsKLQotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFUZXh0
RWRpdCo+KG1fd2lkZ2V0KTsKLSAgICB3LT5zZXRBbGlnbm1lbnQodGV4dEFsaWdubWVudCgpKTsK
LSAgICB3LT5zZXRMaW5lSGVpZ2h0KFJlbmRlck9iamVjdDo6bGluZUhlaWdodCh0cnVlKSk7Ci0K
LSAgICB3LT5zZXRXcml0aW5nRGlyZWN0aW9uKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/
IFJUTCA6IExUUik7Ci0KLSAgICBTY3JvbGxCYXJNb2RlIHNjcm9sbE1vZGUgPSBTY3JvbGxCYXJB
dXRvOwotICAgIHN3aXRjaCAoc3R5bGUoKS0+b3ZlcmZsb3coKSkgewotICAgICAgICBjYXNlIE9B
VVRPOgotICAgICAgICBjYXNlIE9NQVJRVUVFOiAvLyBtYWtlcyBubyBzZW5zZSwgbWFwIHRvIGF1
dG8KLSAgICAgICAgY2FzZSBPT1ZFUkxBWTogLy8gbm90IGltcGxlbWVudGVkIGZvciB0ZXh0LCBt
YXAgdG8gYXV0bwotICAgICAgICBjYXNlIE9WSVNJQkxFOgotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgT0hJRERFTjoKLSAgICAgICAgICAgIHNjcm9sbE1vZGUgPSBTY3JvbGxCYXJB
bHdheXNPZmY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPU0NST0xMOgotICAg
ICAgICAgICAgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09uOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgfQotICAgIFNjcm9sbEJhck1vZGUgaG9yaXpvbnRhbFNjcm9sbE1vZGUgPSBzY3Jv
bGxNb2RlOwotICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgp
KS0+d3JhcCgpICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKLSAgICAgICAgaG9y
aXpvbnRhbFNjcm9sbE1vZGUgPSBTY3JvbGxCYXJBbHdheXNPZmY7Ci0KLSAgICB3LT5zZXRTY3Jv
bGxCYXJNb2Rlcyhob3Jpem9udGFsU2Nyb2xsTW9kZSwgc2Nyb2xsTW9kZSk7Ci19Ci0KLXZvaWQg
UmVuZGVyVGV4dEFyZWE6OnNldEVkaXRlZChib29sIHgpCi17Ci0gICAgbV9kaXJ0eSA9IHg7Ci19
Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBIVE1M
VGV4dEFyZWFFbGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5v
ZGUoKSk7Ci0gICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRn
ZXQpOwotCi0gICAgdy0+c2V0UmVhZE9ubHkoZS0+aXNSZWFkT25seUNvbnRyb2woKSk7Ci0gICAg
dy0+c2V0RGlzYWJsZWQoZS0+ZGlzYWJsZWQoKSk7Ci0KLSAgICBTdHJpbmcgd2lkZ2V0VGV4dCA9
IHRleHQoKTsKLSAgICBTdHJpbmcgdGV4dCA9IGUtPnZhbHVlKCk7Ci0gICAgdGV4dC5yZXBsYWNl
KCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgaWYgKHdpZGdldFRleHQg
IT0gdGV4dCkgewotICAgICAgICBpbnQgbGluZSwgY29sOwotICAgICAgICB3LT5nZXRDdXJzb3JQ
b3NpdGlvbiggJmxpbmUsICZjb2wgKTsKLSAgICAgICAgbV91cGRhdGluZyA9IHRydWU7Ci0gICAg
ICAgIHctPnNldFRleHQodGV4dCk7Ci0gICAgICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLSAgICAg
ICAgdy0+c2V0Q3Vyc29yUG9zaXRpb24oIGxpbmUsIGNvbCApOwotICAgIH0KLSAgICBtX2RpcnR5
ID0gZmFsc2U7Ci0KLSAgICB3LT5zZXRDb2xvcnMoc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCks
IHN0eWxlKCktPmNvbG9yKCkpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21F
bGVtZW50KCk7Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0QXJlYTo6dGV4dCgpCi17Ci0gICAgU3Ry
aW5nIHR4dCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KS0+dGV4dCgpOwotICAg
IHJldHVybiB0eHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcpOwot
fQotCi1TdHJpbmcgUmVuZGVyVGV4dEFyZWE6OnRleHRXaXRoSGFyZExpbmVCcmVha3MoKQotewot
ICAgIFN0cmluZyB0eHQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCktPnRleHRX
aXRoSGFyZExpbmVCcmVha3MoKTsKLSAgICByZXR1cm4gdHh0LnJlcGxhY2UoYmFja3NsYXNoQXND
dXJyZW5jeVN5bWJvbCgpLCAnXFwnKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6dmFsdWVD
aGFuZ2VkKFdpZGdldCopCi17Ci0gICAgaWYgKG1fdXBkYXRpbmcpCi0gICAgICAgIHJldHVybjsK
LSAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+aW52YWxpZGF0
ZVZhbHVlKCk7Ci0gICAgbV9kaXJ0eSA9IHRydWU7Ci19Ci0KLWludCBSZW5kZXJUZXh0QXJlYTo6
c2VsZWN0aW9uU3RhcnQoKQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2Fz
dDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHJldHVybiB0ZXh0RWRpdC0+c2VsZWN0aW9u
U3RhcnQoKTsKLX0KLQotaW50IFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25FbmQoKQotewotICAg
IFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQp
OwotICAgIHJldHVybiB0ZXh0RWRpdC0+c2VsZWN0aW9uRW5kKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGV4dEFyZWE6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBRVGV4dEVkaXQg
KnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0
RWRpdC0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVh
OjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0g
c3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2Vs
ZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdCgpCi17Ci0g
ICAgc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KS0+c2VsZWN0QWxsKCk7Ci19Ci0K
LXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVu
ZCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+
KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZC1z
dGFydCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0
KikKLXsKLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdl
dCk7Ci0KLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8gY2FsbCBvbnNlbGVjdCBpZiB0aGVyZSBhY3R1
YWxseSBpcyBhIHNlbGVjdGlvbgotICAgIGlmICghdy0+aGFzU2VsZWN0ZWRUZXh0KCkpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4o
bm9kZSgpKS0+b25TZWxlY3QoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRl
clNsaWRlcjo6UmVuZGVyU2xpZGVyKEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQpCi0gICAgOiBS
ZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotICAgIHNldFdpZGdldChuZXcgUVNsaWRlcik7
Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1M
QXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLSAgICAKLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxs
IHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAgSW50U2l6ZSBzKHdpZGdldCgpLT5zaXpl
SGludCgpKTsKLSAgICBib29sIHdpZHRoU2V0ID0gIXN0eWxlKCktPndpZHRoKCkuaXNBdXRvKCk7
Ci0gICAgYm9vbCBoZWlnaHRTZXQgPSAhc3R5bGUoKS0+aGVpZ2h0KCkuaXNBdXRvKCk7Ci0gICAg
aWYgKGhlaWdodFNldCAmJiAhd2lkdGhTZXQpIHsKLSAgICAgICAgLy8gRmxpcCB0aGUgaW50cmlu
c2ljIGRpbWVuc2lvbnMuCi0gICAgICAgIGludCBiYXJMZW5ndGggPSBzLndpZHRoKCk7Ci0gICAg
ICAgIHMgPSBJbnRTaXplKHMuaGVpZ2h0KCksIGJhckxlbmd0aCk7Ci0gICAgfQotICAgIHNldElu
dHJpbnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0
KCkpOwotICAgIAotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lkdGgoKTsKLX0K
LQotdm9pZCBSZW5kZXJTbGlkZXI6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBTdHJpbmcg
dmFsdWUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+dmFsdWUoKTsK
LSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1pblN0ciA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUobWluQXR0cik7Ci0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBtYXhTdHIgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+
Z2V0QXR0cmlidXRlKG1heEF0dHIpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlY2lzaW9u
ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShw
cmVjaXNpb25BdHRyKTsKLSAgICAKLSAgICBkb3VibGUgbWluVmFsID0gbWluU3RyLmlzTnVsbCgp
ID8gMC4wIDogbWluU3RyLmRlcHJlY2F0ZWRTdHJpbmcoKS50b0RvdWJsZSgpOwotICAgIGRvdWJs
ZSBtYXhWYWwgPSBtYXhTdHIuaXNOdWxsKCkgPyAxMDAuMCA6IG1heFN0ci5kZXByZWNhdGVkU3Ry
aW5nKCkudG9Eb3VibGUoKTsKLSAgICBtaW5WYWwgPSBtaW4obWluVmFsLCBtYXhWYWwpOyAvLyBN
YWtlIHN1cmUgdGhlIHJhbmdlIGlzIHNhbmUuCi0gICAgCi0gICAgZG91YmxlIHZhbCA9IHZhbHVl
LmlzTnVsbCgpID8gKG1heFZhbCArIG1pblZhbCkvMi4wIDogdmFsdWUuZGVwcmVjYXRlZFN0cmlu
ZygpLnRvRG91YmxlKCk7Ci0gICAgdmFsID0gbWF4KG1pblZhbCwgbWluKHZhbCwgbWF4VmFsKSk7
IC8vIE1ha2Ugc3VyZSB2YWwgaXMgd2l0aGluIG1pbi9tYXguCi0gICAgCi0gICAgLy8gRm9yY2Ug
aW50ZWdlciB2YWx1ZSBpZiBub3QgZmxvYXQuCi0gICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShw
cmVjaXNpb24sICJmbG9hdCIpKQotICAgICAgICB2YWwgPSAoaW50KSh2YWwgKyAwLjUpOwotCi0g
ICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlKFN0cmlu
Zzo6bnVtYmVyKHZhbCkpOwotCi0gICAgUVNsaWRlciogc2xpZGVyID0gKFFTbGlkZXIqKXdpZGdl
dCgpOwotICAgICAKLSAgICBzbGlkZXItPnNldE1pblZhbHVlKG1pblZhbCk7Ci0gICAgc2xpZGVy
LT5zZXRNYXhWYWx1ZShtYXhWYWwpOwotICAgIHNsaWRlci0+c2V0VmFsdWUodmFsKTsKLQotICAg
IFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRl
clNsaWRlcjo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgUVNsaWRlciogc2xpZGVyID0g
c3RhdGljX2Nhc3Q8UVNsaWRlcio+KHdpZGdldCgpKTsKLQotICAgIGRvdWJsZSB2YWwgPSBzbGlk
ZXItPnZhbHVlKCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVjaXNpb24gPSBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKHByZWNpc2lvbkF0
dHIpOwotCi0gICAgLy8gRm9yY2UgaW50ZWdlciB2YWx1ZSBpZiBub3QgZmxvYXQuCi0gICAgaWYg
KCFlcXVhbElnbm9yaW5nQ2FzZShwcmVjaXNpb24sICJmbG9hdCIpKQotICAgICAgICB2YWwgPSAo
aW50KSh2YWwgKyAwLjUpOwotCi0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5v
ZGUoKSktPnNldFZhbHVlKFN0cmluZzo6bnVtYmVyKHZhbCkpOwotICAgIAotICAgIC8vIEZpcmUg
dGhlICJpbnB1dCIgRE9NIGV2ZW50LgotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19
Ci0KLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckltYWdlQnV0dG9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJJbWFnZUJ1dHRvbi5jcHAJKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVySW1hZ2VCdXR0b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCwxMTMwICsyNCwxNiBA
QAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJfZm9ybS5oIgor
I2luY2x1ZGUgIlJlbmRlckltYWdlQnV0dG9uLmgiCiAKLSNpbmNsdWRlICJCcm93c2VyRXh0ZW5z
aW9uLmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgot
I2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQu
aCIKLSNpbmNsdWRlICJIVE1MT3B0R3JvdXBFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlv
bkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhU
TUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRlICJLV1FDb21ib0JveC5oIgotI2luY2x1ZGUg
IktXUUZpbGVCdXR0b24uaCIKLSNpbmNsdWRlICJLV1FMaW5lRWRpdC5oIgotI2luY2x1ZGUgIktX
UVNsaWRlci5oIgotI2luY2x1ZGUgIktXUVRleHRFZGl0LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1N
b3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCi0KLXVzaW5nIG5hbWVz
cGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50
TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi1SZW5kZXJGb3JtRWxlbWVudDo6
UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6
IFJlbmRlcldpZGdldChlbGVtZW50KQotewotICAgIHNldElubGluZSh0cnVlKTsKLX0KLQotUmVu
ZGVyRm9ybUVsZW1lbnQ6On5SZW5kZXJGb3JtRWxlbWVudCgpCi17Ci19Ci0KLXNob3J0IFJlbmRl
ckZvcm1FbGVtZW50OjpiYXNlbGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgaXNSb290TGluZUJv
eCApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1hcmdpblRvcCgpICsgd2lkZ2V0KCktPmJhc2VsaW5l
UG9zaXRpb24obV9oZWlnaHQpOwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHls
ZShSZW5kZXJTdHlsZSogcykKLXsKLSAgICBpZiAoY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSkK
LSAgICAgICAgYWRkSW50cmluc2ljTWFyZ2luc0lmQWxsb3dlZChzKTsKLQotICAgIFJlbmRlcldp
ZGdldDo6c2V0U3R5bGUocyk7Ci0KLSAgICAvLyBEbyBub3QgcGFpbnQgYSBiYWNrZ3JvdW5kIG9y
IGJvcmRlciBmb3IgQXF1YSBmb3JtIGVsZW1lbnRzCi0gICAgc2V0U2hvdWxkUGFpbnRCYWNrZ3Jv
dW5kT3JCb3JkZXIoZmFsc2UpOwotCi0gICAgbV93aWRnZXQtPnNldEZvbnQoc3R5bGUoKS0+Zm9u
dCgpKTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKQot
ewotICAgIG1fd2lkZ2V0LT5zZXRFbmFibGVkKCFzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1l
bnQ6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIG5lZWRzTGF5b3V0KCkgKTsKLSAgICBL
SFRNTEFzc2VydCggbWluTWF4S25vd24oKSApOwotCi0gICAgLy8gbWluaW11bSBoZWlnaHQKLSAg
ICBtX2hlaWdodCA9IDA7Ci0KLSAgICBjYWxjV2lkdGgoKTsKLSAgICBjYWxjSGVpZ2h0KCk7Ci0g
ICAgCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVt
ZW50OjpjbGlja2VkKFdpZGdldCopCi17Ci0gICAgUmVuZGVyQXJlbmEqIGFyZW5hID0gcmVmKCk7
Ci0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGV2ZW50OyAvLyBnZXRzICJjdXJyZW50IGV2ZW50Igot
ICAgIGlmIChub2RlKCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5v
ZGUoKSktPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwgY2xpY2tFdmVudCwgZXZlbnQuY2xpY2tD
b3VudCgpKTsKLSAgICBkZXJlZihhcmVuYSk7Ci19Ci0KLUhvcml6b250YWxBbGlnbm1lbnQgUmVu
ZGVyRm9ybUVsZW1lbnQ6OnRleHRBbGlnbm1lbnQoKSBjb25zdAotewotICAgIHN3aXRjaCAoc3R5
bGUoKS0+dGV4dEFsaWduKCkpIHsKLSAgICAgICAgY2FzZSBMRUZUOgotICAgICAgICBjYXNlIEtI
VE1MX0xFRlQ6Ci0gICAgICAgICAgICByZXR1cm4gQWxpZ25MZWZ0OwotICAgICAgICBjYXNlIFJJ
R0hUOgotICAgICAgICBjYXNlIEtIVE1MX1JJR0hUOgotICAgICAgICAgICAgcmV0dXJuIEFsaWdu
UmlnaHQ7Ci0gICAgICAgIGNhc2UgQ0VOVEVSOgotICAgICAgICBjYXNlIEtIVE1MX0NFTlRFUjoK
LSAgICAgICAgICAgIHJldHVybiBBbGlnbkhDZW50ZXI7Ci0gICAgICAgIGNhc2UgSlVTVElGWToK
LSAgICAgICAgICAgIC8vIEp1c3QgZmFsbCBpbnRvIHRoZSBhdXRvIGNvZGUgZm9yIGp1c3RpZnku
Ci0gICAgICAgIGNhc2UgVEFBVVRPOgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlKCktPmRpcmVj
dGlvbigpID09IFJUTCA/IEFsaWduUmlnaHQgOiBBbGlnbkxlZnQ7Ci0gICAgfQotICAgIEFTU0VS
VChmYWxzZSk7IC8vIFNob3VsZCBuZXZlciBiZSByZWFjaGVkLgotICAgIHJldHVybiBBbGlnbkxl
ZnQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6YWRkSW50cmluc2ljTWFyZ2luc0lm
QWxsb3dlZChSZW5kZXJTdHlsZSogX3N0eWxlKQotewotICAgIC8vIEN1dCBvdXQgdGhlIGludHJp
bnNpYyBtYXJnaW5zIGNvbXBsZXRlbHkgaWYgd2UgZW5kIHVwIHVzaW5nIG1pbmkgY29udHJvbHMu
Ci0gICAgaWYgKF9zdHlsZS0+Zm9udFNpemUoKSA8IDExKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVh
bGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgotICAgIGludCBtID0gaW50
cmluc2ljTWFyZ2luKCk7Ci0gICAgaWYgKF9zdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0
bygpKSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygpKQotICAgICAg
ICAgICAgX3N0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChtLCBGaXhlZCkpOwotICAgICAgICBp
ZiAoX3N0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNl
dE1hcmdpblJpZ2h0KExlbmd0aChtLCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChfc3R5bGUt
PmhlaWdodCgpLmlzQXV0bygpKSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpblRvcCgpLnF1
aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgobSwgRml4ZWQp
KTsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKLSAgICAgICAg
ICAgIF9zdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChtLCBGaXhlZCkpOwotICAgIH0KLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJJbWFnZUJ1dHRvbjo6UmVuZGVy
SW1hZ2VCdXR0b24oSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKK1JlbmRlckltYWdlQnV0dG9u
OjpSZW5kZXJJbWFnZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50KiBlbGVtZW50KQogICAgIDogUmVu
ZGVySW1hZ2UoZWxlbWVudCkKIHsKICAgICAvLyAjIyMgc3VwcG9ydCBET01BY3RpdmF0ZSBldmVu
dCB3aGVuIGNsaWNrZWQKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxpbmVFZGl0OjpSZW5kZXJMaW5lRWRpdChIVE1M
SW5wdXRFbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCks
IG1fdXBkYXRpbmcoZmFsc2UpCi17Ci0gICAgUUxpbmVFZGl0OjpUeXBlIHR5cGU7Ci0gICAgc3dp
dGNoIChlbGVtZW50LT5pbnB1dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhUTUxJbnB1dEVsZW1l
bnQ6OlBBU1NXT1JEOgotICAgICAgICAgICAgdHlwZSA9IFFMaW5lRWRpdDo6UGFzc3dvcmQ7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIVE1MSW5wdXRFbGVtZW50OjpTRUFSQ0g6
Ci0gICAgICAgICAgICB0eXBlID0gUUxpbmVFZGl0OjpTZWFyY2g7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHR5cGUgPSBRTGluZUVkaXQ6Ok5vcm1h
bDsKLSAgICB9Ci0gICAgUUxpbmVFZGl0KiBlZGl0ID0gbmV3IFFMaW5lRWRpdCh0eXBlKTsKLSAg
ICBpZiAodHlwZSA9PSBRTGluZUVkaXQ6OlNlYXJjaCkKLSAgICAgICAgZWRpdC0+c2V0TGl2ZVNl
YXJjaChmYWxzZSk7Ci0gICAgc2V0V2lkZ2V0KGVkaXQpOwotfQotCi12b2lkIFJlbmRlckxpbmVF
ZGl0OjpzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgLy8gV2Ugb25seSB3YW50IHRv
IGNhbGwgb25zZWxlY3QgaWYgdGhlcmUgYWN0dWFsbHkgaXMgYSBzZWxlY3Rpb24KLSAgICBRTGlu
ZUVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCk7Ci0gICAgaWYgKHct
Pmhhc1NlbGVjdGVkVGV4dCgpKQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50Kj4obm9kZSgpKS0+b25TZWxlY3QoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6
cmV0dXJuUHJlc3NlZChXaWRnZXQqKQotewotICAgIC8vIEVtaXQgb25DaGFuZ2UgaWYgbmVjZXNz
YXJ5Ci0gICAgLy8gV29ya3MgYnV0IG1pZ2h0IG5vdCBiZSBlbm91Z2gsIGRpcmsgc2FpZCBoZSBo
YWQgYW5vdGhlciBzb2x1dGlvbiBhdAotICAgIC8vIGhhbmQgKGNhbid0IHJlbWVtYmVyIHdoaWNo
KSAtIERhdmlkCi0gICAgaWYgKGlzVGV4dEZpZWxkKCkgJiYgaXNFZGl0ZWQoKSkgewotICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2Uo
KTsKLSAgICAgICAgc2V0RWRpdGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAoSFRNTEZvcm1F
bGVtZW50KiBmZSA9IHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqPihub2RlKCkp
LT5mb3JtKCkpCi0gICAgICAgIGZlLT5zdWJtaXRDbGljaygpOwotfQotCi12b2lkIFJlbmRlckxp
bmVFZGl0OjpwZXJmb3JtU2VhcmNoKFdpZGdldCopCi17Ci0gICAgLy8gRmlyZSB0aGUgInNlYXJj
aCIgRE9NIGV2ZW50LgotICAgIHN0YXRpY19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5vZGUoKSkt
PmRpc3BhdGNoSFRNTEV2ZW50KHNlYXJjaEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLXZvaWQg
UmVuZGVyTGluZUVkaXQ6OmFkZFNlYXJjaFJlc3VsdCgpCi17Ci0gICAgaWYgKHdpZGdldCgpKQot
ICAgICAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3aWRnZXQoKSktPmFkZFNlYXJjaFJlc3Vs
dCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAg
IEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLQotICAgIC8vIExldCB0aGUgd2lkZ2V0IHRl
bGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAgICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAg
ICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zaXpl
KCk7Ci0gICAgSW50U2l6ZSBzKHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+c2l6
ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8gc2l6ZSA6IDIwKSk7Ci0gICAgbV91cGRhdGlu
ZyA9IGZhbHNlOwotCi0gICAgc2V0SW50cmluc2ljV2lkdGgocy53aWR0aCgpKTsKLSAgICBzZXRJ
bnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6Y2Fs
Y01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFN0eWxlKFJlbmRl
clN0eWxlICpzKQotewotICAgIFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShzKTsKLQotICAg
IFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKTsKLSAgICB3
LT5zZXRBbGlnbm1lbnQodGV4dEFsaWdubWVudCgpKTsKLSAgICB3LT5zZXRXcml0aW5nRGlyZWN0
aW9uKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IFJUTCA6IExUUik7Ci19Ci0KLXZvaWQg
UmVuZGVyTGluZUVkaXQ6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBIVE1MSW5wdXRFbGVt
ZW50KiBlID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7Ci0gICAgUUxp
bmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkpOwotICAgIAotICAg
IGludCBtbCA9IGUtPm1heExlbmd0aCgpOwotICAgIGlmIChtbCA8PSAwIHx8IG1sID4gMTAyNCkK
LSAgICAgICAgbWwgPSAxMDI0OwotICAgIGlmICh3LT5tYXhMZW5ndGgoKSAhPSBtbCkKLSAgICAg
ICAgdy0+c2V0TWF4TGVuZ3RoKG1sKTsKLQotICAgIGlmICghZS0+dmFsdWVNYXRjaGVzUmVuZGVy
ZXIoKSkgewotICAgICAgICBTdHJpbmcgd2lkZ2V0VGV4dCA9IHctPnRleHQoKTsKLSAgICAgICAg
U3RyaW5nIG5ld1RleHQgPSBlLT52YWx1ZSgpOwotICAgICAgICBuZXdUZXh0LnJlcGxhY2UoJ1xc
JywgYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgaWYgKHdpZGdldFRleHQg
IT0gbmV3VGV4dCkgewotICAgICAgICAgICAgaW50IHBvcyA9IHctPmN1cnNvclBvc2l0aW9uKCk7
Ci0KLSAgICAgICAgICAgIG1fdXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgdy0+c2V0VGV4
dChuZXdUZXh0KTsKLSAgICAgICAgICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAg
IAotICAgICAgICAgICAgdy0+c2V0RWRpdGVkKCBmYWxzZSApOwotCi0gICAgICAgICAgICB3LT5z
ZXRDdXJzb3JQb3NpdGlvbihwb3MpOwotICAgICAgICB9Ci0gICAgICAgIGUtPnNldFZhbHVlTWF0
Y2hlc1JlbmRlcmVyKCk7Ci0gICAgfQotCi0gICAgdy0+c2V0UmVhZE9ubHkoZS0+aXNSZWFkT25s
eUNvbnRyb2woKSk7Ci0gICAgCi0gICAgLy8gSGFuZGxlIHVwZGF0aW5nIHRoZSBzZWFyY2ggYXR0
cmlidXRlcy4KLSAgICB3LT5zZXRQbGFjZWhvbGRlclN0cmluZyhlLT5nZXRBdHRyaWJ1dGUocGxh
Y2Vob2xkZXJBdHRyKS5kZXByZWNhdGVkU3RyaW5nKCkpOwotICAgIGlmICh3LT50eXBlKCkgPT0g
UUxpbmVFZGl0OjpTZWFyY2gpIHsKLSAgICAgICAgdy0+c2V0TGl2ZVNlYXJjaCghZS0+Z2V0QXR0
cmlidXRlKGluY3JlbWVudGFsQXR0cikuaXNOdWxsKCkpOwotICAgICAgICB3LT5zZXRBdXRvU2F2
ZU5hbWUoZS0+Z2V0QXR0cmlidXRlKGF1dG9zYXZlQXR0cikpOwotICAgICAgICB3LT5zZXRNYXhS
ZXN1bHRzKGUtPm1heFJlc3VsdHMoKSk7Ci0gICAgfQotCi0gICAgdy0+c2V0Q29sb3JzKHN0eWxl
KCktPmJhY2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5jb2xvcigpKTsKLQotICAgIFJlbmRlckZv
cm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0
Ojp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV91cGRhdGluZykgLy8gRG9uJ3Qg
YWx0ZXIgdGhlIHZhbHVlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGluaXRpbmcgdGhlIGNv
bnRyb2wsIHNpbmNlCi0gICAgICAgIHJldHVybjsgICAgIC8vIHdlIGFyZSBnZXR0aW5nIHRoZSB2
YWx1ZSBmcm9tIHRoZSBET00gYW5kIGl0J3Mgbm90IHVzZXIgaW5wdXQuCi0KLSAgICBTdHJpbmcg
bmV3VGV4dCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+dGV4dCgpOwotCi0g
ICAgLy8gQSBudWxsIHN0cmluZyB2YWx1ZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZv
cm0gY29udHJvbCBoYXMgbm90IGFsdGVyZWQgdGhlIG9yaWdpbmFsCi0gICAgLy8gZGVmYXVsdCB2
YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbmV2ZXIgdXNlIHRoZSBudWxsIHN0cmlu
ZyB2YWx1ZSB3aGVuIHRoZSB1c2VyCi0gICAgLy8gZW1wdGllcyBhIHRleHRmaWVsZCwgYnV0IHNo
b3VsZCBhbHdheXMgZm9yY2UgYW4gZW1wdHkgdGV4dGZpZWxkIHRvIHVzZSB0aGUgZW1wdHkgc3Ry
aW5nLgotICAgIGlmIChuZXdUZXh0LmlzTnVsbCgpKQotICAgICAgICBuZXdUZXh0ID0gIiI7Ci0K
LSAgICBuZXdUZXh0LnJlcGxhY2UoYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpLCAnXFwnKTsK
LSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVGcm9t
UmVuZGVyZXIobmV3VGV4dCk7Ci19Ci0KLWludCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uU3Rh
cnQoKQotewotICAgIFFMaW5lRWRpdCAqbGluZUVkaXQgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQg
Kj4obV93aWRnZXQpOwotICAgIGludCBzdGFydCA9IGxpbmVFZGl0LT5zZWxlY3Rpb25TdGFydCgp
OwotICAgIGlmIChzdGFydCA9PSAtMSkKLSAgICAgICAgc3RhcnQgPSBsaW5lRWRpdC0+Y3Vyc29y
UG9zaXRpb24oKTsKLSAgICByZXR1cm4gc3RhcnQ7Ci19Ci0KLWludCBSZW5kZXJMaW5lRWRpdDo6
c2VsZWN0aW9uRW5kKCkKLXsKLSAgICBRTGluZUVkaXQgKmxpbmVFZGl0ID0gc3RhdGljX2Nhc3Q8
UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICBpbnQgc3RhcnQgPSBsaW5lRWRpdC0+c2VsZWN0
aW9uU3RhcnQoKTsKLSAgICBpZiAoc3RhcnQgPT0gLTEpCi0gICAgICAgIHJldHVybiBsaW5lRWRp
dC0+Y3Vyc29yUG9zaXRpb24oKTsKLSAgICByZXR1cm4gc3RhcnQgKyAoaW50KWxpbmVFZGl0LT5z
ZWxlY3RlZFRleHQoKS5sZW5ndGgoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0U2Vs
ZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAgIGludCByZWFsU3RhcnQgPSBtYXgoc3RhcnQs
IDApOwotICAgIGludCBsZW5ndGggPSBtYXgoc2VsZWN0aW9uRW5kKCkgLSByZWFsU3RhcnQsIDAp
OwotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihy
ZWFsU3RhcnQsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlv
bkVuZChpbnQgZW5kKQotewotICAgIGludCBzdGFydCA9IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAg
aW50IHJlYWxFbmQgPSBtYXgoZW5kLCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gcmVhbEVuZCAtIHN0
YXJ0OwotICAgIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgICAgIHN0YXJ0ID0gcmVhbEVuZDsKLSAg
ICAgICAgbGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1f
d2lkZ2V0KS0+c2V0U2VsZWN0aW9uKHN0YXJ0LCBsZW5ndGgpOwotfQotCi12b2lkIFJlbmRlckxp
bmVFZGl0OjpzZWxlY3QoKQotewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0
KS0+c2VsZWN0QWxsKCk7Ci19Ci0KLWJvb2wgUmVuZGVyTGluZUVkaXQ6OmlzRWRpdGVkKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRnZXQpLT5lZGl0
ZWQoKTsKLX0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldEVkaXRlZChib29sIHgpCi17Ci0gICAg
c3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRnZXQpLT5zZXRFZGl0ZWQoeCk7Ci19Ci0KLXZv
aWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkK
LXsKLSAgICBpbnQgcmVhbFN0YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3RoID0g
bWF4KGVuZCAtIHJlYWxTdGFydCwgMCk7Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1f
d2lkZ2V0KS0+c2V0U2VsZWN0aW9uKHJlYWxTdGFydCwgbGVuZ3RoKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLVJlbmRlckZpZWxkc2V0OjpSZW5kZXJGaWVsZHNldChIVE1MR2VuZXJp
Y0Zvcm1FbGVtZW50ICplbGVtZW50KQotOiBSZW5kZXJCbG9jayhlbGVtZW50KQotewotfQotCi1S
ZW5kZXJPYmplY3QqIFJlbmRlckZpZWxkc2V0OjpsYXlvdXRMZWdlbmQoYm9vbCByZWxheW91dENo
aWxkcmVuKQotewotICAgIFJlbmRlck9iamVjdCogbGVnZW5kID0gZmluZExlZ2VuZCgpOwotICAg
IGlmIChsZWdlbmQpIHsKLSAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4pCi0gICAgICAgICAg
ICBsZWdlbmQtPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICBsZWdlbmQtPmxheW91dElm
TmVlZGVkKCk7Ci0KLSAgICAgICAgaW50IHhQb3MgPSBib3JkZXJMZWZ0KCkgKyBwYWRkaW5nTGVm
dCgpICsgbGVnZW5kLT5tYXJnaW5MZWZ0KCk7Ci0gICAgICAgIGlmIChzdHlsZSgpLT5kaXJlY3Rp
b24oKSA9PSBSVEwpCi0gICAgICAgICAgICB4UG9zID0gbV93aWR0aCAtIHBhZGRpbmdSaWdodCgp
IC0gYm9yZGVyUmlnaHQoKSAtIGxlZ2VuZC0+d2lkdGgoKSAtIGxlZ2VuZC0+bWFyZ2luUmlnaHQo
KTsKLSAgICAgICAgaW50IGIgPSBib3JkZXJUb3AoKTsKLSAgICAgICAgaW50IGggPSBsZWdlbmQt
PmhlaWdodCgpOwotICAgICAgICBsZWdlbmQtPnNldFBvcyh4UG9zLCBtYXgoKGItaCkvMiwgMCkp
OwotICAgICAgICBtX2hlaWdodCA9IG1heChiLGgpICsgcGFkZGluZ1RvcCgpOwotICAgIH0KLSAg
ICByZXR1cm4gbGVnZW5kOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckZpZWxkc2V0OjpmaW5k
TGVnZW5kKCkKLXsKLSAgICBmb3IgKFJlbmRlck9iamVjdCogbGVnZW5kID0gZmlyc3RDaGlsZCgp
OyBsZWdlbmQ7IGxlZ2VuZCA9IGxlZ2VuZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgaWYgKCFs
ZWdlbmQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSAmJiBsZWdlbmQtPmVsZW1lbnQoKSAmJgot
ICAgICAgICAgIGxlZ2VuZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCi0gICAg
ICAgIHJldHVybiBsZWdlbmQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFJlbmRl
ckZpZWxkc2V0OjpwYWludEJveERlY29yYXRpb25zKFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50
IF90eSkKLXsKLSAgICBpbnQgdyA9IHdpZHRoKCk7Ci0gICAgaW50IGggPSBoZWlnaHQoKSArIGJv
cmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpOwotICAgIFJlbmRlck9iamVjdCog
bGVnZW5kID0gZmluZExlZ2VuZCgpOwotICAgIGlmICghbGVnZW5kKQotICAgICAgICByZXR1cm4g
UmVuZGVyQmxvY2s6OnBhaW50Qm94RGVjb3JhdGlvbnMoaSwgX3R4LCBfdHkpOwotCi0gICAgaW50
IHlPZmYgPSAobGVnZW5kLT55UG9zKCkgPiAwKSA/IDAgOiAobGVnZW5kLT5oZWlnaHQoKS1ib3Jk
ZXJUb3AoKSkvMjsKLSAgICBoIC09IHlPZmY7Ci0gICAgX3R5ICs9IHlPZmYgLSBib3JkZXJUb3BF
eHRyYSgpOwotCi0gICAgaW50IG15ID0gbWF4KF90eSwgaS5yLnkoKSk7Ci0gICAgaW50IGVuZCA9
IG1pbihpLnIuYm90dG9tKCksICBfdHkgKyBoKTsKLSAgICBpbnQgbWggPSBlbmQgLSBteTsKLQot
ICAgIHBhaW50QmFja2dyb3VuZChpLnAsIHN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpLCBzdHls
ZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCksIG15LCBtaCwgX3R4LCBfdHksIHcsIGgpOwotCi0gICAg
aWYgKHN0eWxlKCktPmhhc0JvcmRlcigpKQotICAgICAgICBwYWludEJvcmRlck1pbnVzTGVnZW5k
KGkucCwgX3R4LCBfdHksIHcsIGgsIHN0eWxlKCksIGxlZ2VuZC0+eFBvcygpLCBsZWdlbmQtPndp
ZHRoKCkpOwotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpwYWludEJvcmRlck1pbnVzTGVnZW5k
KEdyYXBoaWNzQ29udGV4dCogcCwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHls
ZSogc3R5bGUsIGludCBseCwgaW50IGx3KQotewotCi0gICAgY29uc3QgQ29sb3ImIHRjID0gc3R5
bGUtPmJvcmRlclRvcENvbG9yKCk7Ci0gICAgY29uc3QgQ29sb3ImIGJjID0gc3R5bGUtPmJvcmRl
ckJvdHRvbUNvbG9yKCk7Ci0KLSAgICBFQm9yZGVyU3R5bGUgdHMgPSBzdHlsZS0+Ym9yZGVyVG9w
U3R5bGUoKTsKLSAgICBFQm9yZGVyU3R5bGUgYnMgPSBzdHlsZS0+Ym9yZGVyQm90dG9tU3R5bGUo
KTsKLSAgICBFQm9yZGVyU3R5bGUgbHMgPSBzdHlsZS0+Ym9yZGVyTGVmdFN0eWxlKCk7Ci0gICAg
RUJvcmRlclN0eWxlIHJzID0gc3R5bGUtPmJvcmRlclJpZ2h0U3R5bGUoKTsKLQotICAgIGJvb2wg
cmVuZGVyX3QgPSB0cyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfbCA9IGxzID4gQkhJRERF
TjsKLSAgICBib29sIHJlbmRlcl9yID0gcnMgPiBCSElEREVOOwotICAgIGJvb2wgcmVuZGVyX2Ig
PSBicyA+IEJISURERU47Ci0KLSAgICBpZihyZW5kZXJfdCkgewotICAgICAgICBkcmF3Qm9yZGVy
KHAsIF90eCwgX3R5LCBfdHggKyBseCwgX3R5ICsgIHN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLCBC
U1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywKLSAgICAgICAgICAgICAgICAgICAocmVuZGVy
X2wgJiYgKGxzID09IERPVFRFRCB8fCBscyA9PSBEQVNIRUQgfHwgbHMgPT0gRE9VQkxFKT9zdHls
ZS0+Ym9yZGVyTGVmdFdpZHRoKCk6MCksIDApOwotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCts
eCtsdywgX3R5LCBfdHggKyB3LCBfdHkgKyAgc3R5bGUtPmJvcmRlclRvcFdpZHRoKCksIEJTVG9w
LCB0Yywgc3R5bGUtPmNvbG9yKCksIHRzLAotICAgICAgICAgICAgICAgICAgIDAsIChyZW5kZXJf
ciAmJiAocnMgPT0gRE9UVEVEIHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VCTEUpP3N0eWxl
LT5ib3JkZXJSaWdodFdpZHRoKCk6MCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRlcl9iKQotICAg
ICAgICBkcmF3Qm9yZGVyKHAsIF90eCwgX3R5ICsgaCAtIHN0eWxlLT5ib3JkZXJCb3R0b21XaWR0
aCgpLCBfdHggKyB3LCBfdHkgKyBoLCBCU0JvdHRvbSwgYmMsIHN0eWxlLT5jb2xvcigpLCBicywK
LSAgICAgICAgICAgICAgICAgICAocmVuZGVyX2wgJiYgKGxzID09IERPVFRFRCB8fCBscyA9PSBE
QVNIRUQgfHwgbHMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCk6MCksCi0gICAg
ICAgICAgICAgICAgICAgKHJlbmRlcl9yICYmIChycyA9PSBET1RURUQgfHwgcnMgPT0gREFTSEVE
IHx8IHJzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKTowKSk7Ci0KLSAgICBp
ZihyZW5kZXJfbCkKLSAgICB7Ci0gICAgICAgIGNvbnN0IENvbG9yJiBsYyA9IHN0eWxlLT5ib3Jk
ZXJMZWZ0Q29sb3IoKTsKLQotICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAgICAgICAgICAg
KHRjID09IGxjKSAmJgotICAgICAgICAgICAgKGxzID49IE9VVFNFVCkgJiYKLSAgICAgICAgICAg
ICh0cyA9PSBET1RURUQgfHwgdHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8IHRzID09IE9V
VFNFVCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAgICAgIChiYyA9
PSBsYykgJiYKLSAgICAgICAgICAgIChscyA+PSBPVVRTRVQpICYmCi0gICAgICAgICAgICAoYnMg
PT0gRE9UVEVEIHx8IGJzID09IERBU0hFRCB8fCBicyA9PSBTT0xJRCB8fCBicyA9PSBJTlNFVCk7
Ci0KLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgc3R5bGUtPmJvcmRlckxl
ZnRXaWR0aCgpLCBfdHkgKyBoLCBCU0xlZnQsIGxjLCBzdHlsZS0+Y29sb3IoKSwgbHMsCi0gICAg
ICAgICAgICAgICAgICAgaWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLAotICAg
ICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9tV2lkdGgo
KSk7Ci0gICAgfQotCi0gICAgaWYocmVuZGVyX3IpCi0gICAgewotICAgICAgICBjb25zdCBDb2xv
ciYgcmMgPSBzdHlsZS0+Ym9yZGVyUmlnaHRDb2xvcigpOwotCi0gICAgICAgIGJvb2wgaWdub3Jl
X3RvcCA9Ci0gICAgICAgICAgICAodGMgPT0gcmMpICYmCi0gICAgICAgICAgICAocnMgPj0gRE9U
VEVEIHx8IHJzID09IElOU0VUKSAmJgotICAgICAgICAgICAgKHRzID09IERPVFRFRCB8fCB0cyA9
PSBEQVNIRUQgfHwgdHMgPT0gU09MSUQgfHwgdHMgPT0gT1VUU0VUKTsKLQotICAgICAgICBib29s
IGlnbm9yZV9ib3R0b20gPQotICAgICAgICAgICAgKGJjID09IHJjKSAmJgotICAgICAgICAgICAg
KHJzID49IERPVFRFRCB8fCBycyA9PSBJTlNFVCkgJiYKLSAgICAgICAgICAgIChicyA9PSBET1RU
RUQgfHwgYnMgPT0gREFTSEVEIHx8IGJzID09IFNPTElEIHx8IGJzID09IElOU0VUKTsKLQotICAg
ICAgICBkcmF3Qm9yZGVyKHAsIF90eCArIHcgLSBzdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpLCBf
dHksIF90eCArIHcsIF90eSArIGgsIEJTUmlnaHQsIHJjLCBzdHlsZS0+Y29sb3IoKSwgcnMsCi0g
ICAgICAgICAgICAgICAgICAgaWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLAot
ICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9tV2lk
dGgoKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpzZXRTdHlsZShSZW5kZXJT
dHlsZSogX3N0eWxlKQotewotICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShfc3R5bGUpOwotCi0g
ICAgLy8gV2luSUUgcmVuZGVycyBmaWVsZHNldHMgd2l0aCBkaXNwbGF5OmlubGluZSBsaWtlIHRo
ZXkncmUgaW5saW5lLWJsb2Nrcy4gIEZvciB1cywKLSAgICAvLyBhbiBpbmxpbmUtYmxvY2sgaXMg
anVzdCBhIGJsb2NrIGVsZW1lbnQgd2l0aCByZXBsYWNlZCBzZXQgdG8gdHJ1ZSBhbmQgaW5saW5l
IHNldAotICAgIC8vIHRvIHRydWUuICBFbnN1cmUgdGhhdCBpZiB3ZSBlbmRlZCB1cCBiZWluZyBp
bmxpbmUgdGhhdCB3ZSBzZXQgb3VyIHJlcGxhY2VkIGZsYWcKLSAgICAvLyBzbyB0aGF0IHdlJ3Jl
IHRyZWF0ZWQgbGlrZSBhbiBpbmxpbmUtYmxvY2suCi0gICAgaWYgKGlzSW5saW5lKCkpCi0gICAg
ICAgIHNldFJlcGxhY2VkKHRydWUpOwotfSAgICAKLSAgICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotUmVuZGVyRmlsZUJ1dHRvbjo6UmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50ICpl
bGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBzZXRXaWRn
ZXQobmV3IEtXUUZpbGVCdXR0b24odmlldygpLT5mcmFtZSgpKSk7Ci19Ci0KLXZvaWQgUmVuZGVy
RmlsZUJ1dHRvbjo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4
S25vd24oKSk7Ci0KLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2Fu
dHMgdG8gYmUuCi0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4o
bm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9u
ICo+KHdpZGdldCgpKS0+c2l6ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8gc2l6ZSA6IDIw
KSk7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNldEludHJpbnNp
Y0hlaWdodChzLmhlaWdodCgpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4
V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjp1cGRhdGVGcm9tRWxlbWVudCgp
Ci17Ci0gICAgc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+c2V0RmlsZW5h
bWUoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT52YWx1
ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRl
RnJvbUVsZW1lbnQoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpyZXR1cm5QcmVzc2Vk
KFdpZGdldCopCi17Ci0gICAgaWYgKHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2Rl
KCkpLT5mb3JtKCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2Rl
KCkpLT5mb3JtKCktPnByZXBhcmVTdWJtaXQoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9u
Ojp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVGcm9tUmVuZGVyZXIoc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1
dHRvbio+KHdpZGdldCgpKS0+ZmlsZW5hbWUoKSk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRv
bjo6c2VsZWN0KCkKLXsKLX0KLQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OmNsaWNrKGJvb2wg
c2VuZE1vdXNlRXZlbnRzKQotewotICAgIHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24gKj4od2lk
Z2V0KCkpLT5jbGljayhzZW5kTW91c2VFdmVudHMpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotUmVuZGVyTGFiZWw6OlJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVs
ZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotCi19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyTGVnZW5kOjpSZW5kZXJMZWdlbmQoSFRNTEdlbmVyaWNG
b3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckJsb2NrKGVsZW1lbnQpCi17Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2VsZWN0OjpSZW5kZXJTZWxlY3QoSFRNTFNl
bGVjdEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQot
ewotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgbV9tdWx0aXBsZSA9IGVs
ZW1lbnQtPm11bHRpcGxlKCk7Ci0gICAgbV9zaXplID0gZWxlbWVudC0+c2l6ZSgpOwotICAgIG1f
dXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotICAgIG1fc2VsZWN0aW9u
Q2hhbmdlZCA9IHRydWU7Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0KLSAgICBpZiAo
bV91c2VMaXN0Qm94KQotICAgICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgpKTsKLSAgICBl
bHNlCi0gICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLX0KLQotCi12b2lkIFJlbmRl
clNlbGVjdDo6c2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpCi17Ci0gICAgVGV4dERpcmVjdGlv
biBkID0gc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSOwotICAgIGlmICht
X3VzZUxpc3RCb3gpCi0gICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94ICo+KG1fd2lkZ2V0KS0+
c2V0V3JpdGluZ0RpcmVjdGlvbihkKTsKLSAgICBlbHNlCi0gICAgICAgIHN0YXRpY19jYXN0PFFD
b21ib0JveCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci19Ci0KLXZvaWQg
UmVuZGVyU2VsZWN0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJGb3Jt
RWxlbWVudDo6c2V0U3R5bGUocyk7Ci0gICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpOwot
fQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgbV9p
Z25vcmVTZWxlY3RFdmVudHMgPSB0cnVlOwotCi0gICAgLy8gY2hhbmdlIHdpZGdldCB0eXBlCi0g
ICAgYm9vbCBvbGRNdWx0aXBsZSA9IG1fbXVsdGlwbGU7Ci0gICAgdW5zaWduZWQgb2xkU2l6ZSA9
IG1fc2l6ZTsKLSAgICBib29sIG9sZExpc3Rib3ggPSBtX3VzZUxpc3RCb3g7Ci0KLSAgICBtX211
bHRpcGxlID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tdWx0aXBs
ZSgpOwotICAgIG1fc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgp
KS0+c2l6ZSgpOwotICAgIG1fdXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEp
OwotCi0gICAgaWYgKG9sZE11bHRpcGxlICE9IG1fbXVsdGlwbGUgfHwgb2xkU2l6ZSAhPSBtX3Np
emUpIHsKLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCAhPSBvbGRMaXN0Ym94KSB7Ci0gICAgICAg
ICAgICAvLyB0eXBlIG9mIHNlbGVjdCBoYXMgY2hhbmdlZAotICAgICAgICAgICAgZGVsZXRlIG1f
d2lkZ2V0OwotCi0gICAgICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgICAg
IHNldFdpZGdldChjcmVhdGVMaXN0Qm94KCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLSAgICAgICAgICAgIHNldFdpZGdldFdy
aXRpbmdEaXJlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3VzZUxpc3RCb3gg
JiYgb2xkTXVsdGlwbGUgIT0gbV9tdWx0aXBsZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
UUxpc3RCb3gqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/IFFMaXN0
Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIG1f
c2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSB0cnVl
OwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBjb250ZW50cyBsaXN0Ym94L2NvbWJvYm94IGJhc2Vk
IG9uIG9wdGlvbnMgaW4gbV9lbGVtZW50Ci0gICAgaWYgKCBtX29wdGlvbnNDaGFuZ2VkICkgewot
ICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX3Jl
Y2FsY0xpc3RJdGVtcykKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50
Kj4obm9kZSgpKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgIERlcHJlY2F0ZWRBcnJheTxI
VE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4o
bm9kZSgpKS0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsaXN0SW5kZXg7Ci0KLSAgICAgICAg
aWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93
aWRnZXQpLT5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxR
Q29tYm9Cb3gqPihtX3dpZGdldCktPmNsZWFyKCk7Ci0KLSAgICAgICAgYm9vbCBncm91cEVuYWJs
ZWQgPSB0cnVlOwotICAgICAgICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8IGludChs
aXN0SXRlbXMuc2l6ZSgpKTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgICAgIGlmIChsaXN0SXRl
bXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAgICAgICAg
ICBIVE1MT3B0R3JvdXBFbGVtZW50ICpvcHRncm91cEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
T3B0R3JvdXBFbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOwotICAgICAgICAgICAgICAg
IERlcHJlY2F0ZWRTdHJpbmcgbGFiZWwgPSBvcHRncm91cEVsZW1lbnQtPmdldEF0dHJpYnV0ZShs
YWJlbEF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5yZXBs
YWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gSW4gV2luSUUsIGFuIG9wdGdyb3VwIGNhbid0IHN0YXJ0IG9y
IGVuZCB3aXRoIHdoaXRlc3BhY2UgKG90aGVyIHRoYW4gdGhlIGluZGVudAotICAgICAgICAgICAg
ICAgIC8vIHdlIGdpdmUgaXQpLiAgV2UgbWF0Y2ggdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAg
ICAgICBsYWJlbCA9IGxhYmVsLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIC8v
IFdlIHdhbnQgdG8gY29sbGFwc2Ugb3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3aWxsIG1hdGNo
IG90aGVyIGJyb3dzZXJzLgotICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc2ltcGxpZnlX
aGl0ZVNwYWNlKCk7Ci0KLSAgICAgICAgICAgICAgICBncm91cEVuYWJsZWQgPSBvcHRncm91cEVs
ZW1lbnQtPmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlm
IChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94
Kj4obV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsLCBncm91cEVuYWJsZWQpOwotICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJv
Qm94Kj4obV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNUYWdOYW1lKG9w
dGlvblRhZykpIHsKLSAgICAgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCAqb3B0aW9uRWxl
bWVudCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRl
eF0pOwotICAgICAgICAgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgaXRlbVRleHQ7Ci0gICAgICAg
ICAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQtPmhhc0F0dHJpYnV0ZShsYWJlbEF0dHIpKQotICAg
ICAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IG9wdGlvbkVsZW1lbnQtPmdldEF0dHJpYnV0ZShs
YWJlbEF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gb3B0aW9uRWxlbWVudC0+dGV4dCgpLmRlcHJlY2F0
ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpdGVtVGV4dC5y
ZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0KLSAgICAgICAgICAg
ICAgICAvLyBJbiBXaW5JRSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25v
cmVkIGluIG9wdGlvbnMuIFdlIG1hdGNoIHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAgICAgICAg
aXRlbVRleHQgPSBpdGVtVGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgICAgICAv
LyBXZSB3YW50IHRvIGNvbGxhcHNlIG91ciB3aGl0ZXNwYWNlIHRvby4gIFRoaXMgd2lsbCBtYXRj
aCBvdGhlciBicm93c2Vycy4KLSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IGl0ZW1UZXh0LnNp
bXBsaWZ5V2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlm
IChsaXN0SXRlbXNbbGlzdEluZGV4XS0+cGFyZW50Tm9kZSgpLT5oYXNUYWdOYW1lKG9wdGdyb3Vw
VGFnKSkKLSAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQucHJlcGVuZCgiICAgICIpOwotCi0g
ICAgICAgICAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3Vw
RW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdl
dCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5p
c0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0SXRl
bXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAo
IW1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94
Kj4obV93aWRnZXQpLT5hcHBlbmRTZXBhcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICBLSFRNTEFzc2VydChmYWxzZSk7Ci0gICAgICAgICAg
ICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3Vz
ZUxpc3RCb3gpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+
ZG9uZUFwcGVuZGluZ0l0ZW1zKCk7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVj
YWxjKCk7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAv
LyB1cGRhdGUgc2VsZWN0aW9uCi0gICAgaWYgKG1fc2VsZWN0aW9uQ2hhbmdlZCkgewotICAgICAg
ICB1cGRhdGVTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9
IGZhbHNlOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19
Ci0KLQotc2hvcnQgUmVuZGVyU2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wg
aXNSb290TGluZUJveCApIGNvbnN0Ci17Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkgewotICAgICAg
ICAvLyBGSVhNRTogU2hvdWxkIGdldCB0aGUgaGFyZGNvZGVkIGNvbnN0YW50IG9mIDcgYnkgY2Fs
bGluZyBhIFFMaXN0Qm94IGZ1bmN0aW9uLAotICAgICAgICAvLyBhcyB3ZSBkbyBmb3Igb3RoZXIg
d2lkZ2V0IGNsYXNzZXMuCi0gICAgICAgIHJldHVybiBSZW5kZXJXaWRnZXQ6OmJhc2VsaW5lUG9z
aXRpb24oIGYsIGlzUm9vdExpbmVCb3ggKSAtIDc7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJG
b3JtRWxlbWVudDo6YmFzZWxpbmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJveCApOwotfQotCi0K
LXZvaWQgUmVuZGVyU2VsZWN0OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0
KCAhbWluTWF4S25vd24oKSApOwotCi0gICAgaWYgKG1fb3B0aW9uc0NoYW5nZWQpCi0gICAgICAg
IHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICAvLyAjIyMgdWdseSBIQUNLIEZJWE1FISEhCi0g
ICAgc2V0TWluTWF4S25vd24oKTsKLSAgICBsYXlvdXRJZk5lZWRlZCgpOwotICAgIHNldE5lZWRz
TGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgLy8gIyMjIGVuZCBGSVhNRQotCi0gICAgUmVu
ZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlclNlbGVj
dDo6bGF5b3V0KCApCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0gICAgS0hU
TUxBc3NlcnQobWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyAjIyMgbWFpbnRhaW4gc2VsZWN0aW9u
IHByb3Blcmx5IGJldHdlZW4gdHlwZS9zaXplIGNoYW5nZXMsIGFuZCB3b3JrCi0gICAgLy8gb3V0
IGhvdyB0byBoYW5kbGUgbXVsdGlzZWxlY3QtPnNpbmdsZXNlbGVjdCAocHJvYmFibHkganVzdCBz
ZWxlY3QKLSAgICAvLyBmaXJzdCBzZWxlY3RlZCBvbmUpCi0KLSAgICAvLyBjYWxjdWxhdGUgc2l6
ZQotICAgIGlmKG1fdXNlTGlzdEJveCkgewotICAgICAgICBRTGlzdEJveCogdyA9IHN0YXRpY19j
YXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpOwotCi0KLSAgICAgICAgaW50IHNpemUgPSBtX3NpemU7
Ci0gICAgICAgIC8vIGNoZWNrIGlmIG11bHRpcGxlIGFuZCBzaXplIHdhcyBub3QgZ2l2ZW4gb3Ig
aW52YWxpZAotICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb2RlciBzZXRzIHNpemUgdG8gbWluKG51
bWJlciBvZiBlbGVtZW50cywgNCkKLSAgICAgICAgLy8gTmV0c2NhcGUgc2VlbXMgdG8gc2ltcGx5
IHNldCBpdCB0byAibnVtYmVyIG9mIGVsZW1lbnRzIgotICAgICAgICAvLyB0aGUgYXZlcmFnZSBv
ZiB0aGF0IGlzIElNSE8gbWluKG51bWJlciBvZiBlbGVtZW50cywgMTApCi0gICAgICAgIC8vIHNv
IEkgZGlkIHRoYXQgOy0pCi0gICAgICAgIGlmKHNpemUgPCAxKQotICAgICAgICAgICAgc2l6ZSA9
IG1pbihzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+Y291bnQoKSwgMTBVKTsKLQot
ICAgICAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUu
Ci0gICAgICAgIEludFNpemUgcyh3LT5zaXplRm9yTnVtYmVyT2ZMaW5lcyhzaXplKSk7Ci0gICAg
ICAgIHNldEludHJpbnNpY1dpZHRoKCBzLndpZHRoKCkgKTsKLSAgICAgICAgc2V0SW50cmluc2lj
SGVpZ2h0KCBzLmhlaWdodCgpICk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBJbnRTaXpl
IHMobV93aWRnZXQtPnNpemVIaW50KCkpOwotICAgICAgICBzZXRJbnRyaW5zaWNXaWR0aCggcy53
aWR0aCgpICk7Ci0gICAgICAgIHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQoKSApOwotICAg
IH0KLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpsYXlvdXQoKTsKLQotICAgIC8vIGFuZCBub3cg
ZGlzYWJsZSB0aGUgd2lkZ2V0IGluIGNhc2UgdGhlcmUgaXMgbm8gPG9wdGlvbj4gZ2l2ZW4KLSAg
ICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxI
VE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotCi0gICAgYm9vbCBmb3Vu
ZE9wdGlvbiA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0SXRlbXMu
c2l6ZSgpICYmICFmb3VuZE9wdGlvbjsgaSsrKQotICAgICAgICBmb3VuZE9wdGlvbiA9IChsaXN0
SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSk7Ci0KLSAgICBtX3dpZGdldC0+c2V0RW5h
YmxlZChmb3VuZE9wdGlvbiAmJiAhIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9k
ZSgpKS0+ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp2YWx1ZUNoYW5nZWQo
V2lkZ2V0KikKLXsKLSAgICBpZiAobV9pZ25vcmVTZWxlY3RFdmVudHMpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIEtIVE1MQXNzZXJ0KCFtX3VzZUxpc3RCb3gpOwotCi0gICAgaW50IGluZGV4ID0g
c3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpOwotCi0gICAg
RGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRN
TFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpZiAoaW5kZXggPj0g
MCAmJiBpbmRleCA8IChpbnQpbGlzdEl0ZW1zLnNpemUoKSkgewotICAgICAgICBib29sIGZvdW5k
ID0gbGlzdEl0ZW1zW2luZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpOwotICAgICAgICBpZiAo
IWZvdW5kKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBub3Qgc2VsZWN0YWJsZSwgIHdl
IG5lZWQgdG8gZmluZCBhbiBvcHRpb24gZWxlbWVudAotICAgICAgICAgICAgd2hpbGUgKCh1bnNp
Z25lZCkgaW5kZXggPCBsaXN0SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxp
c3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAg
ICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4ID49IDAp
IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUo
b3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgLS1pbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIGlmICggaW5k
ZXggIT0gc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpICkK
LSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPnNldEN1
cnJlbnRJdGVtKCBpbmRleCApOwotCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbGlzdEl0ZW1zLnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNb
aV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJiBpICE9ICh1bnNpZ25lZCBpbnQpIGluZGV4KQot
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KCBsaXN0
SXRlbXNbaV0gKS0+bV9zZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBzdGF0aWNfY2Fz
dDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpbmRleF0pLT5tX3NlbGVjdGVkID0gdHJ1
ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50
Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2VsZWN0
aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX2lnbm9yZVNlbGVjdEV2ZW50cykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gZG9uJ3QgdXNlIGxpc3RJdGVtcygpIGhlcmUgYXMgd2Ug
aGF2ZSB0byBhdm9pZCByZWNhbGN1bGF0aW9ucyAtIGNoYW5naW5nIHRoZQotICAgIC8vIG9wdGlv
biBsaXN0IHdpbGwgbWFrZSB1c2UgdXBkYXRlIG9wdGlvbnMgbm90IGluIHRoZSB3YXkgdGhlIHVz
ZXIgZXhwZWN0cyB0aGVtCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0
ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX2xpc3RJdGVt
czsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVt
cy5jb3VudCgpOyBpKyspIHsKLSAgICAgICAgLy8gZG9uJ3QgdXNlIHNldFNlbGVjdGVkKCkgaGVy
ZSBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdXMgdG8gYmUgY2FsbGVkCi0gICAgICAgIC8vIGFnYWlu
IHdpdGggdXBkYXRlU2VsZWN0aW9uLgotICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdO
YW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dCo+KCBsaXN0SXRlbXNbaV0gKQotICAgICAgICAgICAgICAgIC0+bV9zZWxlY3RlZCA9IHN0YXRp
Y19jYXN0PFFMaXN0Qm94Kj4oIG1fd2lkZ2V0ICktPmlzU2VsZWN0ZWQoIGogKTsKLSAgICAgICAg
aWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+
aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICArK2o7Ci0gICAgfQotICAgIHN0
YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQot
Ci12b2lkIFJlbmRlclNlbGVjdDo6c2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBfb3B0aW9uc0NoYW5n
ZWQpCi17Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IF9vcHRpb25zQ2hhbmdlZDsKLX0KLQotUUxp
c3RCb3gqIFJlbmRlclNlbGVjdDo6Y3JlYXRlTGlzdEJveCgpCi17Ci0gICAgUUxpc3RCb3ggKmxi
ID0gbmV3IFFMaXN0Qm94KCk7Ci0gICAgbGItPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/
IFFMaXN0Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgIG1faWdub3JlU2Vs
ZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGxiOwotfQotCi12b2lkIFJlbmRlclNlbGVj
dDo6dXBkYXRlU2VsZWN0aW9uKCkKLXsKLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQq
PiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxp
c3RJdGVtcygpOwotICAgIGludCBpOwotICAgIGlmIChtX3VzZUxpc3RCb3gpIHsKLSAgICAgICAg
Ly8gaWYgbXVsdGktc2VsZWN0LCB3ZSBzZWxlY3Qgb25seSB0aGUgbmV3IHNlbGVjdGVkIGluZGV4
Ci0gICAgICAgIFFMaXN0Qm94ICpsaXN0Qm94ID0gc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dp
ZGdldCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGludChs
aXN0SXRlbXMuc2l6ZSgpKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0Qm94LT5zZXRTZWxlY3Rl
ZChqLCBsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJ
dGVtc1tpXSktPnNlbGVjdGVkKCkpOwotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFz
VGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRncm91cFRh
ZykpCi0gICAgICAgICAgICAgICAgKytqOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9
Ci0gICAgZWxzZSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgdW5zaWdu
ZWQgZmlyc3RPcHRpb24gPSBsaXN0SXRlbXMuc2l6ZSgpOwotICAgICAgICBpID0gbGlzdEl0ZW1z
LnNpemUoKTsKLSAgICAgICAgd2hpbGUgKGktLSkKLSAgICAgICAgICAgIGlmIChsaXN0SXRlbXNb
aV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChmb3VuZCkK
LSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0
SXRlbXNbaV0pLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAo
c3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5zZWxlY3RlZCgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KCBtX3dpZGdl
dCApLT5zZXRDdXJyZW50SXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVl
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJzdE9wdGlvbiA9IGk7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUKGZpcnN0T3B0aW9uID09IGxpc3RJdGVtcy5z
aXplKCkgfHwgZm91bmQpOwotICAgIH0KLQotICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNl
OwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LVJlbmRlclRleHRBcmVhOjpSZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50ICplbGVt
ZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCksIG1fZGlydHkoZmFsc2UpLCBt
X3VwZGF0aW5nKGZhbHNlKQotewotICAgIFFUZXh0RWRpdCAqZWRpdCA9IG5ldyBRVGV4dEVkaXQo
dmlldygpKTsKLQotICAgIGlmIChlbGVtZW50LT53cmFwKCkgIT0gSFRNTFRleHRBcmVhRWxlbWVu
dDo6dGFfTm9XcmFwKQotICAgICAgICBlZGl0LT5zZXRXb3JkV3JhcChRVGV4dEVkaXQ6OldpZGdl
dFdpZHRoKTsKLSAgICBlbHNlCi0gICAgICAgIGVkaXQtPnNldFdvcmRXcmFwKFFUZXh0RWRpdDo6
Tm9XcmFwKTsKLQotICAgIHNldFdpZGdldChlZGl0KTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJl
YTo6ZGVzdHJveSgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5v
ZGUoKSktPnJlbmRlcmVyV2lsbEJlRGVzdHJveWVkKCk7Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6
OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6Y2FsY01pbk1heFdpZHRoKCkK
LXsKLSAgICBLSFRNTEFzc2VydCggIW1pbk1heEtub3duKCkgKTsKLQotICAgIFFUZXh0RWRpdCog
dyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLSAgICBJbnRTaXplIHNpemUo
dy0+c2l6ZVdpdGhDb2x1bW5zQW5kUm93cygKLSAgICAgICAgbWF4KHN0YXRpY19jYXN0PEhUTUxU
ZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5jb2xzKCksIDEpLAotICAgICAgICBtYXgoc3RhdGlj
X2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPnJvd3MoKSwgMSkpKTsKLQotICAg
IHNldEludHJpbnNpY1dpZHRoKCBzaXplLndpZHRoKCkgKTsKLSAgICBzZXRJbnRyaW5zaWNIZWln
aHQoIHNpemUuaGVpZ2h0KCkgKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4
V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U3R5bGUoUmVuZGVyU3R5bGUg
KnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotCi0gICAgUVRleHRF
ZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpOwotICAgIHctPnNldEFs
aWdubWVudCh0ZXh0QWxpZ25tZW50KCkpOwotICAgIHctPnNldExpbmVIZWlnaHQoUmVuZGVyT2Jq
ZWN0OjpsaW5lSGVpZ2h0KHRydWUpKTsKLQotICAgIHctPnNldFdyaXRpbmdEaXJlY3Rpb24oc3R5
bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSKTsKLQotICAgIFNjcm9sbEJhck1v
ZGUgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckF1dG87Ci0gICAgc3dpdGNoIChzdHlsZSgpLT5vdmVy
ZmxvdygpKSB7Ci0gICAgICAgIGNhc2UgT0FVVE86Ci0gICAgICAgIGNhc2UgT01BUlFVRUU6IC8v
IG1ha2VzIG5vIHNlbnNlLCBtYXAgdG8gYXV0bwotICAgICAgICBjYXNlIE9PVkVSTEFZOiAvLyBu
b3QgaW1wbGVtZW50ZWQgZm9yIHRleHQsIG1hcCB0byBhdXRvCi0gICAgICAgIGNhc2UgT1ZJU0lC
TEU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSElEREVOOgotICAgICAgICAg
ICAgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09mZjsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIE9TQ1JPTEw6Ci0gICAgICAgICAgICBzY3JvbGxNb2RlID0gU2Nyb2xsQmFy
QWx3YXlzT247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgU2Nyb2xsQmFyTW9kZSBo
b3Jpem9udGFsU2Nyb2xsTW9kZSA9IHNjcm9sbE1vZGU7Ci0gICAgaWYgKHN0YXRpY19jYXN0PEhU
TUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT53cmFwKCkgIT0gSFRNTFRleHRBcmVhRWxlbWVu
dDo6dGFfTm9XcmFwKQotICAgICAgICBob3Jpem9udGFsU2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFs
d2F5c09mZjsKLQotICAgIHctPnNldFNjcm9sbEJhck1vZGVzKGhvcml6b250YWxTY3JvbGxNb2Rl
LCBzY3JvbGxNb2RlKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0RWRpdGVkKGJvb2wg
eCkKLXsKLSAgICBtX2RpcnR5ID0geDsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6dXBkYXRl
RnJvbUVsZW1lbnQoKQotewotICAgIEhUTUxUZXh0QXJlYUVsZW1lbnQqIGUgPSBzdGF0aWNfY2Fz
dDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0
aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7Ci0KLSAgICB3LT5zZXRSZWFkT25seShlLT5p
c1JlYWRPbmx5Q29udHJvbCgpKTsKLSAgICB3LT5zZXREaXNhYmxlZChlLT5kaXNhYmxlZCgpKTsK
LQotICAgIFN0cmluZyB3aWRnZXRUZXh0ID0gdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0ID0gZS0+
dmFsdWUoKTsKLSAgICB0ZXh0LnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJv
bCgpKTsKLSAgICBpZiAod2lkZ2V0VGV4dCAhPSB0ZXh0KSB7Ci0gICAgICAgIGludCBsaW5lLCBj
b2w7Ci0gICAgICAgIHctPmdldEN1cnNvclBvc2l0aW9uKCAmbGluZSwgJmNvbCApOwotICAgICAg
ICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAgICAgICAgdy0+c2V0VGV4dCh0ZXh0KTsKLSAgICAgICAg
bV91cGRhdGluZyA9IGZhbHNlOwotICAgICAgICB3LT5zZXRDdXJzb3JQb3NpdGlvbiggbGluZSwg
Y29sICk7Ci0gICAgfQotICAgIG1fZGlydHkgPSBmYWxzZTsKLQotICAgIHctPnNldENvbG9ycyhz
dHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Y29sb3IoKSk7Ci0KLSAgICBSZW5k
ZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotU3RyaW5nIFJlbmRlclRl
eHRBcmVhOjp0ZXh0KCkKLXsKLSAgICBTdHJpbmcgdHh0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0
Kj4obV93aWRnZXQpLT50ZXh0KCk7Ci0gICAgcmV0dXJuIHR4dC5yZXBsYWNlKGJhY2tzbGFzaEFz
Q3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0QXJlYTo6dGV4
dFdpdGhIYXJkTGluZUJyZWFrcygpCi17Ci0gICAgU3RyaW5nIHR4dCA9IHN0YXRpY19jYXN0PFFU
ZXh0RWRpdCo+KG1fd2lkZ2V0KS0+dGV4dFdpdGhIYXJkTGluZUJyZWFrcygpOwotICAgIHJldHVy
biB0eHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcpOwotfQotCi12
b2lkIFJlbmRlclRleHRBcmVhOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV91
cGRhdGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVs
ZW1lbnQqPihub2RlKCkpLT5pbnZhbGlkYXRlVmFsdWUoKTsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsK
LX0KLQotaW50IFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAgUVRleHRF
ZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAg
cmV0dXJuIHRleHRFZGl0LT5zZWxlY3Rpb25TdGFydCgpOwotfQotCi1pbnQgUmVuZGVyVGV4dEFy
ZWE6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19j
YXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAgcmV0dXJuIHRleHRFZGl0LT5zZWxlY3Rp
b25FbmQoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0aW9uU3RhcnQoaW50
IHN0YXJ0KQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVk
aXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7
Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewot
ICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRn
ZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9pZCBSZW5k
ZXJUZXh0QXJlYTo6c2VsZWN0KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93
aWRnZXQpLT5zZWxlY3RBbGwoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0
aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQg
PSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRT
ZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLXN0YXJ0KTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJl
YTo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRp
Y19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLQotICAgIC8vIFdlIG9ubHkgd2FudCB0byBj
YWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFjdHVhbGx5IGlzIGEgc2VsZWN0aW9uCi0gICAgaWYgKCF3
LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHN0YXRpY19j
YXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5vblNlbGVjdCgpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2xpZGVyOjpSZW5kZXJTbGlkZXIoSFRNTElucHV0
RWxlbWVudCogZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCi17Ci0g
ICAgc2V0V2lkZ2V0KG5ldyBRU2xpZGVyKTsKLX0KLQotdm9pZCBSZW5kZXJTbGlkZXI6OmNhbGNN
aW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkpOwotICAgIAot
ICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAg
ICBJbnRTaXplIHMod2lkZ2V0KCktPnNpemVIaW50KCkpOwotICAgIGJvb2wgd2lkdGhTZXQgPSAh
c3R5bGUoKS0+d2lkdGgoKS5pc0F1dG8oKTsKLSAgICBib29sIGhlaWdodFNldCA9ICFzdHlsZSgp
LT5oZWlnaHQoKS5pc0F1dG8oKTsKLSAgICBpZiAoaGVpZ2h0U2V0ICYmICF3aWR0aFNldCkgewot
ICAgICAgICAvLyBGbGlwIHRoZSBpbnRyaW5zaWMgZGltZW5zaW9ucy4KLSAgICAgICAgaW50IGJh
ckxlbmd0aCA9IHMud2lkdGgoKTsKLSAgICAgICAgcyA9IEludFNpemUocy5oZWlnaHQoKSwgYmFy
TGVuZ3RoKTsKLSAgICB9Ci0gICAgc2V0SW50cmluc2ljV2lkdGgocy53aWR0aCgpKTsKLSAgICBz
ZXRJbnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0gICAgCi0gICAgUmVuZGVyRm9ybUVsZW1l
bnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlclNsaWRlcjo6dXBkYXRlRnJv
bUVsZW1lbnQoKQotewotICAgIFN0cmluZyB2YWx1ZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihub2RlKCkpLT52YWx1ZSgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbWluU3Ry
ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZSht
aW5BdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1heFN0ciA9IHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUobWF4QXR0cik7Ci0gICAgY29u
c3QgQXRvbWljU3RyaW5nJiBwcmVjaXNpb24gPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKHByZWNpc2lvbkF0dHIpOwotICAgIAotICAgIGRvdWJs
ZSBtaW5WYWwgPSBtaW5TdHIuaXNOdWxsKCkgPyAwLjAgOiBtaW5TdHIuZGVwcmVjYXRlZFN0cmlu
ZygpLnRvRG91YmxlKCk7Ci0gICAgZG91YmxlIG1heFZhbCA9IG1heFN0ci5pc051bGwoKSA/IDEw
MC4wIDogbWF4U3RyLmRlcHJlY2F0ZWRTdHJpbmcoKS50b0RvdWJsZSgpOwotICAgIG1pblZhbCA9
IG1pbihtaW5WYWwsIG1heFZhbCk7IC8vIE1ha2Ugc3VyZSB0aGUgcmFuZ2UgaXMgc2FuZS4KLSAg
ICAKLSAgICBkb3VibGUgdmFsID0gdmFsdWUuaXNOdWxsKCkgPyAobWF4VmFsICsgbWluVmFsKS8y
LjAgOiB2YWx1ZS5kZXByZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICB2YWwgPSBtYXgo
bWluVmFsLCBtaW4odmFsLCBtYXhWYWwpKTsgLy8gTWFrZSBzdXJlIHZhbCBpcyB3aXRoaW4gbWlu
L21heC4KLSAgICAKLSAgICAvLyBGb3JjZSBpbnRlZ2VyIHZhbHVlIGlmIG5vdCBmbG9hdC4KLSAg
ICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKHByZWNpc2lvbiwgImZsb2F0IikpCi0gICAgICAgIHZh
bCA9IChpbnQpKHZhbCArIDAuNSk7Ci0KLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
Kj4obm9kZSgpKS0+c2V0VmFsdWUoU3RyaW5nOjpudW1iZXIodmFsKSk7Ci0KLSAgICBRU2xpZGVy
KiBzbGlkZXIgPSAoUVNsaWRlciopd2lkZ2V0KCk7Ci0gICAgIAotICAgIHNsaWRlci0+c2V0TWlu
VmFsdWUobWluVmFsKTsKLSAgICBzbGlkZXItPnNldE1heFZhbHVlKG1heFZhbCk7Ci0gICAgc2xp
ZGVyLT5zZXRWYWx1ZSh2YWwpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21F
bGVtZW50KCk7Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikK
LXsKLSAgICBRU2xpZGVyKiBzbGlkZXIgPSBzdGF0aWNfY2FzdDxRU2xpZGVyKj4od2lkZ2V0KCkp
OwotCi0gICAgZG91YmxlIHZhbCA9IHNsaWRlci0+dmFsdWUoKTsKLSAgICBjb25zdCBBdG9taWNT
dHJpbmcmIHByZWNpc2lvbiA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
LT5nZXRBdHRyaWJ1dGUocHJlY2lzaW9uQXR0cik7Ci0KLSAgICAvLyBGb3JjZSBpbnRlZ2VyIHZh
bHVlIGlmIG5vdCBmbG9hdC4KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKHByZWNpc2lvbiwg
ImZsb2F0IikpCi0gICAgICAgIHZhbCA9IChpbnQpKHZhbCArIDAuNSk7Ci0KLSAgICBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoU3RyaW5nOjpudW1iZXIo
dmFsKSk7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQuCi0gICAgc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmRpc3BhdGNoSFRNTEV2ZW50KGlu
cHV0RXZlbnQsIHRydWUsIGZhbHNlKTsKLX0KLQotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU2xpZGVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTbGlkZXIuY3BwCShyZXZpc2lvbiAxNDM0MikKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclNsaWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDEw
NjEgKzI0LDIwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInJlbmRl
cl9mb3JtLmgiCisjaW5jbHVkZSAiUmVuZGVyU2xpZGVyLmgiCiAKLSNpbmNsdWRlICJCcm93c2Vy
RXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgotI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0R3JvdXBF
bGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1M
U2VsZWN0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNs
dWRlICJLV1FDb21ib0JveC5oIgotI2luY2x1ZGUgIktXUUZpbGVCdXR0b24uaCIKLSNpbmNsdWRl
ICJLV1FMaW5lRWRpdC5oIgogI2luY2x1ZGUgIktXUVNsaWRlci5oIgotI2luY2x1ZGUgIktXUVRl
eHRFZGl0LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiZG9t
Ml9ldmVudHNpbXBsLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBzdGQ6Om1pbjsK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKIHVz
aW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLVJlbmRlckZvcm1FbGVtZW50OjpSZW5kZXJGb3Jt
RWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyV2lk
Z2V0KGVsZW1lbnQpCi17Ci0gICAgc2V0SW5saW5lKHRydWUpOwotfQotCi1SZW5kZXJGb3JtRWxl
bWVudDo6flJlbmRlckZvcm1FbGVtZW50KCkKLXsKLX0KLQotc2hvcnQgUmVuZGVyRm9ybUVsZW1l
bnQ6OmJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBpc1Jvb3RMaW5lQm94ICkgY29uc3QK
LXsKLSAgICByZXR1cm4gbWFyZ2luVG9wKCkgKyB3aWRnZXQoKS0+YmFzZWxpbmVQb3NpdGlvbiht
X2hlaWdodCk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKFJlbmRlclN0
eWxlKiBzKQotewotICAgIGlmIChjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpKQotICAgICAgICBh
ZGRJbnRyaW5zaWNNYXJnaW5zSWZBbGxvd2VkKHMpOwotCi0gICAgUmVuZGVyV2lkZ2V0OjpzZXRT
dHlsZShzKTsKLQotICAgIC8vIERvIG5vdCBwYWludCBhIGJhY2tncm91bmQgb3IgYm9yZGVyIGZv
ciBBcXVhIGZvcm0gZWxlbWVudHMKLSAgICBzZXRTaG91bGRQYWludEJhY2tncm91bmRPckJvcmRl
cihmYWxzZSk7Ci0KLSAgICBtX3dpZGdldC0+c2V0Rm9udChzdHlsZSgpLT5mb250KCkpOwotfQot
Ci12b2lkIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgbV93
aWRnZXQtPnNldEVuYWJsZWQoIXN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqPihu
b2RlKCkpLT5kaXNhYmxlZCgpKTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6bGF5b3V0
KCkKLXsKLSAgICBLSFRNTEFzc2VydCggbmVlZHNMYXlvdXQoKSApOwotICAgIEtIVE1MQXNzZXJ0
KCBtaW5NYXhLbm93bigpICk7Ci0KLSAgICAvLyBtaW5pbXVtIGhlaWdodAotICAgIG1faGVpZ2h0
ID0gMDsKLQotICAgIGNhbGNXaWR0aCgpOwotICAgIGNhbGNIZWlnaHQoKTsKLSAgICAKLSAgICBz
ZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OmNsaWNr
ZWQoV2lkZ2V0KikKLXsKLSAgICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZWYoKTsKLSAgICBQbGF0
Zm9ybU1vdXNlRXZlbnQgZXZlbnQ7IC8vIGdldHMgImN1cnJlbnQgZXZlbnQiCi0gICAgaWYgKG5v
ZGUoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8RXZlbnRUYXJnZXROb2RlKj4obm9kZSgpKS0+ZGlz
cGF0Y2hNb3VzZUV2ZW50KGV2ZW50LCBjbGlja0V2ZW50LCBldmVudC5jbGlja0NvdW50KCkpOwot
ICAgIGRlcmVmKGFyZW5hKTsKLX0KLQotSG9yaXpvbnRhbEFsaWdubWVudCBSZW5kZXJGb3JtRWxl
bWVudDo6dGV4dEFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChzdHlsZSgpLT50ZXh0
QWxpZ24oKSkgewotICAgICAgICBjYXNlIExFRlQ6Ci0gICAgICAgIGNhc2UgS0hUTUxfTEVGVDoK
LSAgICAgICAgICAgIHJldHVybiBBbGlnbkxlZnQ7Ci0gICAgICAgIGNhc2UgUklHSFQ6Ci0gICAg
ICAgIGNhc2UgS0hUTUxfUklHSFQ6Ci0gICAgICAgICAgICByZXR1cm4gQWxpZ25SaWdodDsKLSAg
ICAgICAgY2FzZSBDRU5URVI6Ci0gICAgICAgIGNhc2UgS0hUTUxfQ0VOVEVSOgotICAgICAgICAg
ICAgcmV0dXJuIEFsaWduSENlbnRlcjsKLSAgICAgICAgY2FzZSBKVVNUSUZZOgotICAgICAgICAg
ICAgLy8gSnVzdCBmYWxsIGludG8gdGhlIGF1dG8gY29kZSBmb3IganVzdGlmeS4KLSAgICAgICAg
Y2FzZSBUQUFVVE86Ci0gICAgICAgICAgICByZXR1cm4gc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0g
UlRMID8gQWxpZ25SaWdodCA6IEFsaWduTGVmdDsKLSAgICB9Ci0gICAgQVNTRVJUKGZhbHNlKTsg
Ly8gU2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuCi0gICAgcmV0dXJuIEFsaWduTGVmdDsKLX0KLQot
Ci12b2lkIFJlbmRlckZvcm1FbGVtZW50OjphZGRJbnRyaW5zaWNNYXJnaW5zSWZBbGxvd2VkKFJl
bmRlclN0eWxlKiBfc3R5bGUpCi17Ci0gICAgLy8gQ3V0IG91dCB0aGUgaW50cmluc2ljIG1hcmdp
bnMgY29tcGxldGVseSBpZiB3ZSBlbmQgdXAgdXNpbmcgbWluaSBjb250cm9scy4KLSAgICBpZiAo
X3N0eWxlLT5mb250U2l6ZSgpIDwgMTEpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBG
SVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdpdGgg
bWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCi0gICAgaW50IG0gPSBpbnRyaW5zaWNNYXJn
aW4oKTsKLSAgICBpZiAoX3N0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpIHsKLSAg
ICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luTGVmdCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5
bGUtPnNldE1hcmdpbkxlZnQoTGVuZ3RoKG0sIEZpeGVkKSk7Ci0gICAgICAgIGlmIChfc3R5bGUt
Pm1hcmdpblJpZ2h0KCkucXVpcmsoKSkKLSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luUmln
aHQoTGVuZ3RoKG0sIEZpeGVkKSk7Ci0gICAgfQotCi0gICAgaWYgKF9zdHlsZS0+aGVpZ2h0KCku
aXNBdXRvKCkpIHsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luVG9wKCkucXVpcmsoKSkKLSAg
ICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0aChtLCBGaXhlZCkpOwotICAgICAg
ICBpZiAoX3N0eWxlLT5tYXJnaW5Cb3R0b20oKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0eWxl
LT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKG0sIEZpeGVkKSk7Ci0gICAgfQotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckltYWdlQnV0dG9uOjpSZW5kZXJJbWFnZUJ1dHRv
bihIVE1MSW5wdXRFbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVySW1hZ2UoZWxlbWVudCkK
LXsKLSAgICAvLyAjIyMgc3VwcG9ydCBET01BY3RpdmF0ZSBldmVudCB3aGVuIGNsaWNrZWQKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVJlbmRlckxpbmVFZGl0OjpSZW5kZXJMaW5lRWRpdChIVE1MSW5wdXRFbGVtZW50ICplbGVt
ZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCksIG1fdXBkYXRpbmcoZmFsc2Up
Ci17Ci0gICAgUUxpbmVFZGl0OjpUeXBlIHR5cGU7Ci0gICAgc3dpdGNoIChlbGVtZW50LT5pbnB1
dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhUTUxJbnB1dEVsZW1lbnQ6OlBBU1NXT1JEOgotICAg
ICAgICAgICAgdHlwZSA9IFFMaW5lRWRpdDo6UGFzc3dvcmQ7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBIVE1MSW5wdXRFbGVtZW50OjpTRUFSQ0g6Ci0gICAgICAgICAgICB0eXBl
ID0gUUxpbmVFZGl0OjpTZWFyY2g7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIHR5cGUgPSBRTGluZUVkaXQ6Ok5vcm1hbDsKLSAgICB9Ci0gICAgUUxp
bmVFZGl0KiBlZGl0ID0gbmV3IFFMaW5lRWRpdCh0eXBlKTsKLSAgICBpZiAodHlwZSA9PSBRTGlu
ZUVkaXQ6OlNlYXJjaCkKLSAgICAgICAgZWRpdC0+c2V0TGl2ZVNlYXJjaChmYWxzZSk7Ci0gICAg
c2V0V2lkZ2V0KGVkaXQpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZWxlY3Rpb25DaGFu
Z2VkKFdpZGdldCopCi17Ci0gICAgLy8gV2Ugb25seSB3YW50IHRvIGNhbGwgb25zZWxlY3QgaWYg
dGhlcmUgYWN0dWFsbHkgaXMgYSBzZWxlY3Rpb24KLSAgICBRTGluZUVkaXQqIHcgPSBzdGF0aWNf
Y2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCk7Ci0gICAgaWYgKHctPmhhc1NlbGVjdGVkVGV4dCgp
KQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+
b25TZWxlY3QoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6cmV0dXJuUHJlc3NlZChXaWRn
ZXQqKQotewotICAgIC8vIEVtaXQgb25DaGFuZ2UgaWYgbmVjZXNzYXJ5Ci0gICAgLy8gV29ya3Mg
YnV0IG1pZ2h0IG5vdCBiZSBlbm91Z2gsIGRpcmsgc2FpZCBoZSBoYWQgYW5vdGhlciBzb2x1dGlv
biBhdAotICAgIC8vIGhhbmQgKGNhbid0IHJlbWVtYmVyIHdoaWNoKSAtIERhdmlkCi0gICAgaWYg
KGlzVGV4dEZpZWxkKCkgJiYgaXNFZGl0ZWQoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLSAgICAgICAgc2V0RWRp
dGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAoSFRNTEZvcm1FbGVtZW50KiBmZSA9IHN0YXRp
Y19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqPihub2RlKCkpLT5mb3JtKCkpCi0gICAgICAg
IGZlLT5zdWJtaXRDbGljaygpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpwZXJmb3JtU2Vh
cmNoKFdpZGdldCopCi17Ci0gICAgLy8gRmlyZSB0aGUgInNlYXJjaCIgRE9NIGV2ZW50LgotICAg
IHN0YXRpY19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5vZGUoKSktPmRpc3BhdGNoSFRNTEV2ZW50
KHNlYXJjaEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OmFk
ZFNlYXJjaFJlc3VsdCgpCi17Ci0gICAgaWYgKHdpZGdldCgpKQotICAgICAgICBzdGF0aWNfY2Fz
dDxRTGluZUVkaXQqPih3aWRnZXQoKSktPmFkZFNlYXJjaFJlc3VsdCgpOwotfQotCi12b2lkIFJl
bmRlckxpbmVFZGl0OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCFtaW5N
YXhLbm93bigpKTsKLQotICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3
YW50cyB0byBiZS4KLSAgICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAgICBpbnQgc2l6ZSA9IHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zaXplKCk7Ci0gICAgSW50U2l6ZSBz
KHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+c2l6ZUZvckNoYXJhY3RlcldpZHRo
KHNpemUgPiAwID8gc2l6ZSA6IDIwKSk7Ci0gICAgbV91cGRhdGluZyA9IGZhbHNlOwotCi0gICAg
c2V0SW50cmluc2ljV2lkdGgocy53aWR0aCgpKTsKLSAgICBzZXRJbnRyaW5zaWNIZWlnaHQocy5o
ZWlnaHQoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19
Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQotewotICAg
IFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShzKTsKLQotICAgIFFMaW5lRWRpdCogdyA9IHN0
YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKTsKLSAgICB3LT5zZXRBbGlnbm1lbnQodGV4
dEFsaWdubWVudCgpKTsKLSAgICB3LT5zZXRXcml0aW5nRGlyZWN0aW9uKHN0eWxlKCktPmRpcmVj
dGlvbigpID09IFJUTCA/IFJUTCA6IExUUik7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnVw
ZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBlID0gc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7Ci0gICAgUUxpbmVFZGl0KiB3ID0gc3RhdGlj
X2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkpOwotICAgIAotICAgIGludCBtbCA9IGUtPm1heExl
bmd0aCgpOwotICAgIGlmIChtbCA8PSAwIHx8IG1sID4gMTAyNCkKLSAgICAgICAgbWwgPSAxMDI0
OwotICAgIGlmICh3LT5tYXhMZW5ndGgoKSAhPSBtbCkKLSAgICAgICAgdy0+c2V0TWF4TGVuZ3Ro
KG1sKTsKLQotICAgIGlmICghZS0+dmFsdWVNYXRjaGVzUmVuZGVyZXIoKSkgewotICAgICAgICBT
dHJpbmcgd2lkZ2V0VGV4dCA9IHctPnRleHQoKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBl
LT52YWx1ZSgpOwotICAgICAgICBuZXdUZXh0LnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXNDdXJy
ZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgaWYgKHdpZGdldFRleHQgIT0gbmV3VGV4dCkgewotICAg
ICAgICAgICAgaW50IHBvcyA9IHctPmN1cnNvclBvc2l0aW9uKCk7Ci0KLSAgICAgICAgICAgIG1f
dXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgdy0+c2V0VGV4dChuZXdUZXh0KTsKLSAgICAg
ICAgICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdy0+
c2V0RWRpdGVkKCBmYWxzZSApOwotCi0gICAgICAgICAgICB3LT5zZXRDdXJzb3JQb3NpdGlvbihw
b3MpOwotICAgICAgICB9Ci0gICAgICAgIGUtPnNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCk7Ci0g
ICAgfQotCi0gICAgdy0+c2V0UmVhZE9ubHkoZS0+aXNSZWFkT25seUNvbnRyb2woKSk7Ci0gICAg
Ci0gICAgLy8gSGFuZGxlIHVwZGF0aW5nIHRoZSBzZWFyY2ggYXR0cmlidXRlcy4KLSAgICB3LT5z
ZXRQbGFjZWhvbGRlclN0cmluZyhlLT5nZXRBdHRyaWJ1dGUocGxhY2Vob2xkZXJBdHRyKS5kZXBy
ZWNhdGVkU3RyaW5nKCkpOwotICAgIGlmICh3LT50eXBlKCkgPT0gUUxpbmVFZGl0OjpTZWFyY2gp
IHsKLSAgICAgICAgdy0+c2V0TGl2ZVNlYXJjaCghZS0+Z2V0QXR0cmlidXRlKGluY3JlbWVudGFs
QXR0cikuaXNOdWxsKCkpOwotICAgICAgICB3LT5zZXRBdXRvU2F2ZU5hbWUoZS0+Z2V0QXR0cmli
dXRlKGF1dG9zYXZlQXR0cikpOwotICAgICAgICB3LT5zZXRNYXhSZXN1bHRzKGUtPm1heFJlc3Vs
dHMoKSk7Ci0gICAgfQotCi0gICAgdy0+c2V0Q29sb3JzKHN0eWxlKCktPmJhY2tncm91bmRDb2xv
cigpLCBzdHlsZSgpLT5jb2xvcigpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVG
cm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0Ojp2YWx1ZUNoYW5nZWQoV2lk
Z2V0KikKLXsKLSAgICBpZiAobV91cGRhdGluZykgLy8gRG9uJ3QgYWx0ZXIgdGhlIHZhbHVlIGlm
IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGluaXRpbmcgdGhlIGNvbnRyb2wsIHNpbmNlCi0gICAg
ICAgIHJldHVybjsgICAgIC8vIHdlIGFyZSBnZXR0aW5nIHRoZSB2YWx1ZSBmcm9tIHRoZSBET00g
YW5kIGl0J3Mgbm90IHVzZXIgaW5wdXQuCi0KLSAgICBTdHJpbmcgbmV3VGV4dCA9IHN0YXRpY19j
YXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+dGV4dCgpOwotCi0gICAgLy8gQSBudWxsIHN0cmlu
ZyB2YWx1ZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvcm0gY29udHJvbCBoYXMgbm90
IGFsdGVyZWQgdGhlIG9yaWdpbmFsCi0gICAgLy8gZGVmYXVsdCB2YWx1ZS4gIFRoYXQgbWVhbnMg
dGhhdCB3ZSBzaG91bGQgbmV2ZXIgdXNlIHRoZSBudWxsIHN0cmluZyB2YWx1ZSB3aGVuIHRoZSB1
c2VyCi0gICAgLy8gZW1wdGllcyBhIHRleHRmaWVsZCwgYnV0IHNob3VsZCBhbHdheXMgZm9yY2Ug
YW4gZW1wdHkgdGV4dGZpZWxkIHRvIHVzZSB0aGUgZW1wdHkgc3RyaW5nLgotICAgIGlmIChuZXdU
ZXh0LmlzTnVsbCgpKQotICAgICAgICBuZXdUZXh0ID0gIiI7Ci0KLSAgICBuZXdUZXh0LnJlcGxh
Y2UoYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpLCAnXFwnKTsKLSAgICBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVGcm9tUmVuZGVyZXIobmV3VGV4dCk7
Ci19Ci0KLWludCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIFFMaW5l
RWRpdCAqbGluZUVkaXQgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQgKj4obV93aWRnZXQpOwotICAg
IGludCBzdGFydCA9IGxpbmVFZGl0LT5zZWxlY3Rpb25TdGFydCgpOwotICAgIGlmIChzdGFydCA9
PSAtMSkKLSAgICAgICAgc3RhcnQgPSBsaW5lRWRpdC0+Y3Vyc29yUG9zaXRpb24oKTsKLSAgICBy
ZXR1cm4gc3RhcnQ7Ci19Ci0KLWludCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uRW5kKCkKLXsK
LSAgICBRTGluZUVkaXQgKmxpbmVFZGl0ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lk
Z2V0KTsKLSAgICBpbnQgc3RhcnQgPSBsaW5lRWRpdC0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICBp
ZiAoc3RhcnQgPT0gLTEpCi0gICAgICAgIHJldHVybiBsaW5lRWRpdC0+Y3Vyc29yUG9zaXRpb24o
KTsKLSAgICByZXR1cm4gc3RhcnQgKyAoaW50KWxpbmVFZGl0LT5zZWxlY3RlZFRleHQoKS5sZW5n
dGgoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0U2VsZWN0aW9uU3RhcnQoaW50IHN0
YXJ0KQotewotICAgIGludCByZWFsU3RhcnQgPSBtYXgoc3RhcnQsIDApOwotICAgIGludCBsZW5n
dGggPSBtYXgoc2VsZWN0aW9uRW5kKCkgLSByZWFsU3RhcnQsIDApOwotICAgIHN0YXRpY19jYXN0
PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihyZWFsU3RhcnQsIGxlbmd0aCk7
Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewot
ICAgIGludCBzdGFydCA9IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHJlYWxFbmQgPSBtYXgo
ZW5kLCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gcmVhbEVuZCAtIHN0YXJ0OwotICAgIGlmIChsZW5n
dGggPCAwKSB7Ci0gICAgICAgIHN0YXJ0ID0gcmVhbEVuZDsKLSAgICAgICAgbGVuZ3RoID0gMDsK
LSAgICB9Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KS0+c2V0U2VsZWN0
aW9uKHN0YXJ0LCBsZW5ndGgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZWxlY3QoKQot
ewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0KS0+c2VsZWN0QWxsKCk7Ci19
Ci0KLWJvb2wgUmVuZGVyTGluZUVkaXQ6OmlzRWRpdGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRnZXQpLT5lZGl0ZWQoKTsKLX0KLXZvaWQgUmVu
ZGVyTGluZUVkaXQ6OnNldEVkaXRlZChib29sIHgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVF
ZGl0Kj4obV93aWRnZXQpLT5zZXRFZGl0ZWQoeCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6
OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgICBpbnQgcmVhbFN0
YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gbWF4KGVuZCAtIHJlYWxTdGFy
dCwgMCk7Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KS0+c2V0U2VsZWN0
aW9uKHJlYWxTdGFydCwgbGVuZ3RoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJl
bmRlckZpZWxkc2V0OjpSZW5kZXJGaWVsZHNldChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVt
ZW50KQotOiBSZW5kZXJCbG9jayhlbGVtZW50KQotewotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRl
ckZpZWxkc2V0OjpsYXlvdXRMZWdlbmQoYm9vbCByZWxheW91dENoaWxkcmVuKQotewotICAgIFJl
bmRlck9iamVjdCogbGVnZW5kID0gZmluZExlZ2VuZCgpOwotICAgIGlmIChsZWdlbmQpIHsKLSAg
ICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4pCi0gICAgICAgICAgICBsZWdlbmQtPnNldE5lZWRz
TGF5b3V0KHRydWUpOwotICAgICAgICBsZWdlbmQtPmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAg
ICAgaW50IHhQb3MgPSBib3JkZXJMZWZ0KCkgKyBwYWRkaW5nTGVmdCgpICsgbGVnZW5kLT5tYXJn
aW5MZWZ0KCk7Ci0gICAgICAgIGlmIChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwpCi0gICAg
ICAgICAgICB4UG9zID0gbV93aWR0aCAtIHBhZGRpbmdSaWdodCgpIC0gYm9yZGVyUmlnaHQoKSAt
IGxlZ2VuZC0+d2lkdGgoKSAtIGxlZ2VuZC0+bWFyZ2luUmlnaHQoKTsKLSAgICAgICAgaW50IGIg
PSBib3JkZXJUb3AoKTsKLSAgICAgICAgaW50IGggPSBsZWdlbmQtPmhlaWdodCgpOwotICAgICAg
ICBsZWdlbmQtPnNldFBvcyh4UG9zLCBtYXgoKGItaCkvMiwgMCkpOwotICAgICAgICBtX2hlaWdo
dCA9IG1heChiLGgpICsgcGFkZGluZ1RvcCgpOwotICAgIH0KLSAgICByZXR1cm4gbGVnZW5kOwot
fQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckZpZWxkc2V0OjpmaW5kTGVnZW5kKCkKLXsKLSAgICBm
b3IgKFJlbmRlck9iamVjdCogbGVnZW5kID0gZmlyc3RDaGlsZCgpOyBsZWdlbmQ7IGxlZ2VuZCA9
IGxlZ2VuZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgaWYgKCFsZWdlbmQtPmlzRmxvYXRpbmdP
clBvc2l0aW9uZWQoKSAmJiBsZWdlbmQtPmVsZW1lbnQoKSAmJgotICAgICAgICAgIGxlZ2VuZC0+
ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCi0gICAgICAgIHJldHVybiBsZWdlbmQ7
Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpwYWludEJv
eERlY29yYXRpb25zKFBhaW50SW5mbyYgaSwgaW50IF90eCwgaW50IF90eSkKLXsKLSAgICBpbnQg
dyA9IHdpZHRoKCk7Ci0gICAgaW50IGggPSBoZWlnaHQoKSArIGJvcmRlclRvcEV4dHJhKCkgKyBi
b3JkZXJCb3R0b21FeHRyYSgpOwotICAgIFJlbmRlck9iamVjdCogbGVnZW5kID0gZmluZExlZ2Vu
ZCgpOwotICAgIGlmICghbGVnZW5kKQotICAgICAgICByZXR1cm4gUmVuZGVyQmxvY2s6OnBhaW50
Qm94RGVjb3JhdGlvbnMoaSwgX3R4LCBfdHkpOwotCi0gICAgaW50IHlPZmYgPSAobGVnZW5kLT55
UG9zKCkgPiAwKSA/IDAgOiAobGVnZW5kLT5oZWlnaHQoKS1ib3JkZXJUb3AoKSkvMjsKLSAgICBo
IC09IHlPZmY7Ci0gICAgX3R5ICs9IHlPZmYgLSBib3JkZXJUb3BFeHRyYSgpOwotCi0gICAgaW50
IG15ID0gbWF4KF90eSwgaS5yLnkoKSk7Ci0gICAgaW50IGVuZCA9IG1pbihpLnIuYm90dG9tKCks
ICBfdHkgKyBoKTsKLSAgICBpbnQgbWggPSBlbmQgLSBteTsKLQotICAgIHBhaW50QmFja2dyb3Vu
ZChpLnAsIHN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kTGF5
ZXJzKCksIG15LCBtaCwgX3R4LCBfdHksIHcsIGgpOwotCi0gICAgaWYgKHN0eWxlKCktPmhhc0Jv
cmRlcigpKQotICAgICAgICBwYWludEJvcmRlck1pbnVzTGVnZW5kKGkucCwgX3R4LCBfdHksIHcs
IGgsIHN0eWxlKCksIGxlZ2VuZC0+eFBvcygpLCBsZWdlbmQtPndpZHRoKCkpOwotfQotCi12b2lk
IFJlbmRlckZpZWxkc2V0OjpwYWludEJvcmRlck1pbnVzTGVnZW5kKEdyYXBoaWNzQ29udGV4dCog
cCwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGludCBseCwg
aW50IGx3KQotewotCi0gICAgY29uc3QgQ29sb3ImIHRjID0gc3R5bGUtPmJvcmRlclRvcENvbG9y
KCk7Ci0gICAgY29uc3QgQ29sb3ImIGJjID0gc3R5bGUtPmJvcmRlckJvdHRvbUNvbG9yKCk7Ci0K
LSAgICBFQm9yZGVyU3R5bGUgdHMgPSBzdHlsZS0+Ym9yZGVyVG9wU3R5bGUoKTsKLSAgICBFQm9y
ZGVyU3R5bGUgYnMgPSBzdHlsZS0+Ym9yZGVyQm90dG9tU3R5bGUoKTsKLSAgICBFQm9yZGVyU3R5
bGUgbHMgPSBzdHlsZS0+Ym9yZGVyTGVmdFN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxlIHJzID0g
c3R5bGUtPmJvcmRlclJpZ2h0U3R5bGUoKTsKLQotICAgIGJvb2wgcmVuZGVyX3QgPSB0cyA+IEJI
SURERU47Ci0gICAgYm9vbCByZW5kZXJfbCA9IGxzID4gQkhJRERFTjsKLSAgICBib29sIHJlbmRl
cl9yID0gcnMgPiBCSElEREVOOwotICAgIGJvb2wgcmVuZGVyX2IgPSBicyA+IEJISURERU47Ci0K
LSAgICBpZihyZW5kZXJfdCkgewotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCwgX3R5LCBfdHgg
KyBseCwgX3R5ICsgIHN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLCBCU1RvcCwgdGMsIHN0eWxlLT5j
b2xvcigpLCB0cywKLSAgICAgICAgICAgICAgICAgICAocmVuZGVyX2wgJiYgKGxzID09IERPVFRF
RCB8fCBscyA9PSBEQVNIRUQgfHwgbHMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyTGVmdFdpZHRo
KCk6MCksIDApOwotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCtseCtsdywgX3R5LCBfdHggKyB3
LCBfdHkgKyAgc3R5bGUtPmJvcmRlclRvcFdpZHRoKCksIEJTVG9wLCB0Yywgc3R5bGUtPmNvbG9y
KCksIHRzLAotICAgICAgICAgICAgICAgICAgIDAsIChyZW5kZXJfciAmJiAocnMgPT0gRE9UVEVE
IHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VCTEUpP3N0eWxlLT5ib3JkZXJSaWdodFdpZHRo
KCk6MCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRlcl9iKQotICAgICAgICBkcmF3Qm9yZGVyKHAs
IF90eCwgX3R5ICsgaCAtIHN0eWxlLT5ib3JkZXJCb3R0b21XaWR0aCgpLCBfdHggKyB3LCBfdHkg
KyBoLCBCU0JvdHRvbSwgYmMsIHN0eWxlLT5jb2xvcigpLCBicywKLSAgICAgICAgICAgICAgICAg
ICAocmVuZGVyX2wgJiYgKGxzID09IERPVFRFRCB8fCBscyA9PSBEQVNIRUQgfHwgbHMgPT0gRE9V
QkxFKT9zdHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCk6MCksCi0gICAgICAgICAgICAgICAgICAgKHJl
bmRlcl9yICYmIChycyA9PSBET1RURUQgfHwgcnMgPT0gREFTSEVEIHx8IHJzID09IERPVUJMRSk/
c3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKTowKSk7Ci0KLSAgICBpZihyZW5kZXJfbCkKLSAgICB7
Ci0gICAgICAgIGNvbnN0IENvbG9yJiBsYyA9IHN0eWxlLT5ib3JkZXJMZWZ0Q29sb3IoKTsKLQot
ICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAgICAgICAgICAgKHRjID09IGxjKSAmJgotICAg
ICAgICAgICAgKGxzID49IE9VVFNFVCkgJiYKLSAgICAgICAgICAgICh0cyA9PSBET1RURUQgfHwg
dHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8IHRzID09IE9VVFNFVCk7Ci0KLSAgICAgICAg
Ym9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAgICAgIChiYyA9PSBsYykgJiYKLSAgICAgICAg
ICAgIChscyA+PSBPVVRTRVQpICYmCi0gICAgICAgICAgICAoYnMgPT0gRE9UVEVEIHx8IGJzID09
IERBU0hFRCB8fCBicyA9PSBTT0xJRCB8fCBicyA9PSBJTlNFVCk7Ci0KLSAgICAgICAgZHJhd0Jv
cmRlcihwLCBfdHgsIF90eSwgX3R4ICsgc3R5bGUtPmJvcmRlckxlZnRXaWR0aCgpLCBfdHkgKyBo
LCBCU0xlZnQsIGxjLCBzdHlsZS0+Y29sb3IoKSwgbHMsCi0gICAgICAgICAgICAgICAgICAgaWdu
b3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgIGln
bm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9tV2lkdGgoKSk7Ci0gICAgfQotCi0gICAg
aWYocmVuZGVyX3IpCi0gICAgewotICAgICAgICBjb25zdCBDb2xvciYgcmMgPSBzdHlsZS0+Ym9y
ZGVyUmlnaHRDb2xvcigpOwotCi0gICAgICAgIGJvb2wgaWdub3JlX3RvcCA9Ci0gICAgICAgICAg
ICAodGMgPT0gcmMpICYmCi0gICAgICAgICAgICAocnMgPj0gRE9UVEVEIHx8IHJzID09IElOU0VU
KSAmJgotICAgICAgICAgICAgKHRzID09IERPVFRFRCB8fCB0cyA9PSBEQVNIRUQgfHwgdHMgPT0g
U09MSUQgfHwgdHMgPT0gT1VUU0VUKTsKLQotICAgICAgICBib29sIGlnbm9yZV9ib3R0b20gPQot
ICAgICAgICAgICAgKGJjID09IHJjKSAmJgotICAgICAgICAgICAgKHJzID49IERPVFRFRCB8fCBy
cyA9PSBJTlNFVCkgJiYKLSAgICAgICAgICAgIChicyA9PSBET1RURUQgfHwgYnMgPT0gREFTSEVE
IHx8IGJzID09IFNPTElEIHx8IGJzID09IElOU0VUKTsKLQotICAgICAgICBkcmF3Qm9yZGVyKHAs
IF90eCArIHcgLSBzdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpLCBfdHksIF90eCArIHcsIF90eSAr
IGgsIEJTUmlnaHQsIHJjLCBzdHlsZS0+Y29sb3IoKSwgcnMsCi0gICAgICAgICAgICAgICAgICAg
aWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLAotICAgICAgICAgICAgICAgICAg
IGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9tV2lkdGgoKSk7Ci0gICAgfQotfQot
Ci12b2lkIFJlbmRlckZpZWxkc2V0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSogX3N0eWxlKQotewot
ICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShfc3R5bGUpOwotCi0gICAgLy8gV2luSUUgcmVuZGVy
cyBmaWVsZHNldHMgd2l0aCBkaXNwbGF5OmlubGluZSBsaWtlIHRoZXkncmUgaW5saW5lLWJsb2Nr
cy4gIEZvciB1cywKLSAgICAvLyBhbiBpbmxpbmUtYmxvY2sgaXMganVzdCBhIGJsb2NrIGVsZW1l
bnQgd2l0aCByZXBsYWNlZCBzZXQgdG8gdHJ1ZSBhbmQgaW5saW5lIHNldAotICAgIC8vIHRvIHRy
dWUuICBFbnN1cmUgdGhhdCBpZiB3ZSBlbmRlZCB1cCBiZWluZyBpbmxpbmUgdGhhdCB3ZSBzZXQg
b3VyIHJlcGxhY2VkIGZsYWcKLSAgICAvLyBzbyB0aGF0IHdlJ3JlIHRyZWF0ZWQgbGlrZSBhbiBp
bmxpbmUtYmxvY2suCi0gICAgaWYgKGlzSW5saW5lKCkpCi0gICAgICAgIHNldFJlcGxhY2VkKHRy
dWUpOwotfSAgICAKLSAgICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyRmlsZUJ1dHRv
bjo6UmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50ICplbGVtZW50KQotICAgIDogUmVu
ZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBzZXRXaWRnZXQobmV3IEtXUUZpbGVCdXR0
b24odmlldygpLT5mcmFtZSgpKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6Y2FsY01p
bk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24oKSk7Ci0KLSAgICAv
LyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAgaW50
IHNpemUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwot
ICAgIEludFNpemUgcyhzdGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uICo+KHdpZGdldCgpKS0+c2l6
ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8gc2l6ZSA6IDIwKSk7Ci0KLSAgICBzZXRJbnRy
aW5zaWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNldEludHJpbnNpY0hlaWdodChzLmhlaWdodCgp
KTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9p
ZCBSZW5kZXJGaWxlQnV0dG9uOjp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgc3RhdGljX2Nh
c3Q8S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+c2V0RmlsZW5hbWUoCi0gICAgICAgIHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT52YWx1ZSgpLmRlcHJlY2F0ZWRTdHJp
bmcoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0K
LQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpyZXR1cm5QcmVzc2VkKFdpZGdldCopCi17Ci0gICAg
aWYgKHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5mb3JtKCkpCi0gICAg
ICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5mb3JtKCktPnByZXBh
cmVTdWJtaXQoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjp2YWx1ZUNoYW5nZWQoV2lk
Z2V0KikKLXsKLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0
VmFsdWVGcm9tUmVuZGVyZXIoc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+
ZmlsZW5hbWUoKSk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSkt
Pm9uQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6c2VsZWN0KCkKLXsKLX0K
LQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OmNsaWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzKQot
ewotICAgIHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24gKj4od2lkZ2V0KCkpLT5jbGljayhzZW5k
TW91c2VFdmVudHMpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyTGFiZWw6
OlJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5k
ZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
UmVuZGVyTGVnZW5kOjpSZW5kZXJMZWdlbmQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVu
dCkKLSAgICA6IFJlbmRlckJsb2NrKGVsZW1lbnQpCi17Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotUmVuZGVyU2VsZWN0OjpSZW5kZXJTZWxlY3QoSFRNTFNlbGVjdEVsZW1lbnQgKmVsZW1l
bnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotICAgIG1faWdub3JlU2Vs
ZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgbV9tdWx0aXBsZSA9IGVsZW1lbnQtPm11bHRpcGxlKCk7
Ci0gICAgbV9zaXplID0gZWxlbWVudC0+c2l6ZSgpOwotICAgIG1fdXNlTGlzdEJveCA9IChtX211
bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0g
ICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0KLSAgICBpZiAobV91c2VMaXN0Qm94KQotICAg
ICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgpKTsKLSAgICBlbHNlCi0gICAgICAgIHNldFdp
ZGdldChuZXcgUUNvbWJvQm94KTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2V0V2lkZ2V0
V3JpdGluZ0RpcmVjdGlvbigpCi17Ci0gICAgVGV4dERpcmVjdGlvbiBkID0gc3R5bGUoKS0+ZGly
ZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSOwotICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAg
ICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94ICo+KG1fd2lkZ2V0KS0+c2V0V3JpdGluZ0RpcmVjdGlv
bihkKTsKLSAgICBlbHNlCi0gICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCAqPihtX3dpZGdl
dCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0OjpzZXRT
dHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6c2V0U3R5bGUo
cyk7Ci0gICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpOwotfQotCi0KLXZvaWQgUmVuZGVy
U2VsZWN0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgbV9pZ25vcmVTZWxlY3RFdmVudHMg
PSB0cnVlOwotCi0gICAgLy8gY2hhbmdlIHdpZGdldCB0eXBlCi0gICAgYm9vbCBvbGRNdWx0aXBs
ZSA9IG1fbXVsdGlwbGU7Ci0gICAgdW5zaWduZWQgb2xkU2l6ZSA9IG1fc2l6ZTsKLSAgICBib29s
IG9sZExpc3Rib3ggPSBtX3VzZUxpc3RCb3g7Ci0KLSAgICBtX211bHRpcGxlID0gc3RhdGljX2Nh
c3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tdWx0aXBsZSgpOwotICAgIG1fc2l6ZSA9
IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIG1f
dXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotCi0gICAgaWYgKG9sZE11
bHRpcGxlICE9IG1fbXVsdGlwbGUgfHwgb2xkU2l6ZSAhPSBtX3NpemUpIHsKLSAgICAgICAgaWYg
KG1fdXNlTGlzdEJveCAhPSBvbGRMaXN0Ym94KSB7Ci0gICAgICAgICAgICAvLyB0eXBlIG9mIHNl
bGVjdCBoYXMgY2hhbmdlZAotICAgICAgICAgICAgZGVsZXRlIG1fd2lkZ2V0OwotCi0gICAgICAg
ICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgICAgIHNldFdpZGdldChjcmVhdGVM
aXN0Qm94KCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNldFdpZGdldChu
ZXcgUUNvbWJvQm94KTsKLSAgICAgICAgICAgIHNldFdpZGdldFdyaXRpbmdEaXJlY3Rpb24oKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3VzZUxpc3RCb3ggJiYgb2xkTXVsdGlwbGUgIT0g
bV9tdWx0aXBsZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdl
dCktPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/IFFMaXN0Qm94OjpFeHRlbmRlZCA6IFFM
aXN0Qm94OjpTaW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9
IHRydWU7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8v
IHVwZGF0ZSBjb250ZW50cyBsaXN0Ym94L2NvbWJvYm94IGJhc2VkIG9uIG9wdGlvbnMgaW4gbV9l
bGVtZW50Ci0gICAgaWYgKCBtX29wdGlvbnNDaGFuZ2VkICkgewotICAgICAgICBpZiAoc3RhdGlj
X2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX3JlY2FsY0xpc3RJdGVtcykKLSAg
ICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+cmVjYWxj
TGlzdEl0ZW1zKCk7Ci0gICAgICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJ
dGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1z
KCk7Ci0gICAgICAgIGludCBsaXN0SW5kZXg7Ci0KLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkK
LSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5jbGVhcigpOwot
ICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdl
dCktPmNsZWFyKCk7Ci0KLSAgICAgICAgYm9vbCBncm91cEVuYWJsZWQgPSB0cnVlOwotICAgICAg
ICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8IGludChsaXN0SXRlbXMuc2l6ZSgpKTsg
bGlzdEluZGV4KyspIHsKLSAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+aGFz
VGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAgICAgICAgICBIVE1MT3B0R3JvdXBFbGVt
ZW50ICpvcHRncm91cEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0R3JvdXBFbGVtZW50Kj4o
bGlzdEl0ZW1zW2xpc3RJbmRleF0pOwotICAgICAgICAgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcg
bGFiZWwgPSBvcHRncm91cEVsZW1lbnQtPmdldEF0dHJpYnV0ZShsYWJlbEF0dHIpLmRlcHJlY2F0
ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFz
aEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAg
Ly8gSW4gV2luSUUsIGFuIG9wdGdyb3VwIGNhbid0IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3Bh
Y2UgKG90aGVyIHRoYW4gdGhlIGluZGVudAotICAgICAgICAgICAgICAgIC8vIHdlIGdpdmUgaXQp
LiAgV2UgbWF0Y2ggdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVs
LnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gY29sbGFw
c2Ugb3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3aWxsIG1hdGNoIG90aGVyIGJyb3dzZXJzLgot
ICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc2ltcGxpZnlXaGl0ZVNwYWNlKCk7Ci0KLSAg
ICAgICAgICAgICAgICBncm91cEVuYWJsZWQgPSBvcHRncm91cEVsZW1lbnQtPmlzRW5hYmxlZCgp
OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0g
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5hcHBl
bmRHcm91cExhYmVsKGxhYmVsLCBncm91cEVuYWJsZWQpOwotICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5h
cHBlbmRHcm91cExhYmVsKGxhYmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2Ug
aWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAg
ICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCAqb3B0aW9uRWxlbWVudCA9IHN0YXRpY19jYXN0
PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOwotICAgICAgICAgICAg
ICAgIERlcHJlY2F0ZWRTdHJpbmcgaXRlbVRleHQ7Ci0gICAgICAgICAgICAgICAgaWYgKG9wdGlv
bkVsZW1lbnQtPmhhc0F0dHJpYnV0ZShsYWJlbEF0dHIpKQotICAgICAgICAgICAgICAgICAgICBp
dGVtVGV4dCA9IG9wdGlvbkVsZW1lbnQtPmdldEF0dHJpYnV0ZShsYWJlbEF0dHIpLmRlcHJlY2F0
ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGl0
ZW1UZXh0ID0gb3B0aW9uRWxlbWVudC0+dGV4dCgpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpdGVtVGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tz
bGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbiBXaW5JRSwg
bGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIGluIG9wdGlvbnMuIFdl
IG1hdGNoIHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAgICAgICAgaXRlbVRleHQgPSBpdGVtVGV4
dC5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGNvbGxh
cHNlIG91ciB3aGl0ZXNwYWNlIHRvby4gIFRoaXMgd2lsbCBtYXRjaCBvdGhlciBicm93c2Vycy4K
LSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IGl0ZW1UZXh0LnNpbXBsaWZ5V2hpdGVTcGFjZSgp
OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbbGlzdElu
ZGV4XS0+cGFyZW50Tm9kZSgpLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkKLSAgICAgICAgICAg
ICAgICAgICAgaXRlbVRleHQucHJlcGVuZCgiICAgICIpOwotCi0gICAgICAgICAgICAgICAgaWYg
KG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gq
PihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25F
bGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRl
bVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+aGFz
VGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1fdXNlTGlzdEJveCkKLSAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5hcHBl
bmRTZXBhcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICBLSFRNTEFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICBtX3NlbGVjdGlvbkNoYW5n
ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+ZG9uZUFwcGVuZGluZ0l0ZW1z
KCk7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgICAgIG1f
b3B0aW9uc0NoYW5nZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUgc2VsZWN0aW9u
Ci0gICAgaWYgKG1fc2VsZWN0aW9uQ2hhbmdlZCkgewotICAgICAgICB1cGRhdGVTZWxlY3Rpb24o
KTsKLSAgICB9Ci0KLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9IGZhbHNlOwotCi0gICAgUmVu
ZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLQotc2hvcnQgUmVuZGVy
U2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgaXNSb290TGluZUJveCApIGNv
bnN0Ci17Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkgewotICAgICAgICAvLyBGSVhNRTogU2hvdWxk
IGdldCB0aGUgaGFyZGNvZGVkIGNvbnN0YW50IG9mIDcgYnkgY2FsbGluZyBhIFFMaXN0Qm94IGZ1
bmN0aW9uLAotICAgICAgICAvLyBhcyB3ZSBkbyBmb3Igb3RoZXIgd2lkZ2V0IGNsYXNzZXMuCi0g
ICAgICAgIHJldHVybiBSZW5kZXJXaWRnZXQ6OmJhc2VsaW5lUG9zaXRpb24oIGYsIGlzUm9vdExp
bmVCb3ggKSAtIDc7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJGb3JtRWxlbWVudDo6YmFzZWxp
bmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJveCApOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0
OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCAhbWluTWF4S25vd24oKSAp
OwotCi0gICAgaWYgKG1fb3B0aW9uc0NoYW5nZWQpCi0gICAgICAgIHVwZGF0ZUZyb21FbGVtZW50
KCk7Ci0KLSAgICAvLyAjIyMgdWdseSBIQUNLIEZJWE1FISEhCi0gICAgc2V0TWluTWF4S25vd24o
KTsKLSAgICBsYXlvdXRJZk5lZWRlZCgpOwotICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVj
YWxjKCk7Ci0gICAgLy8gIyMjIGVuZCBGSVhNRQotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNh
bGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlclNlbGVjdDo6bGF5b3V0KCApCi17Ci0g
ICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0gICAgS0hUTUxBc3NlcnQobWluTWF4S25v
d24oKSk7Ci0KLSAgICAvLyAjIyMgbWFpbnRhaW4gc2VsZWN0aW9uIHByb3Blcmx5IGJldHdlZW4g
dHlwZS9zaXplIGNoYW5nZXMsIGFuZCB3b3JrCi0gICAgLy8gb3V0IGhvdyB0byBoYW5kbGUgbXVs
dGlzZWxlY3QtPnNpbmdsZXNlbGVjdCAocHJvYmFibHkganVzdCBzZWxlY3QKLSAgICAvLyBmaXJz
dCBzZWxlY3RlZCBvbmUpCi0KLSAgICAvLyBjYWxjdWxhdGUgc2l6ZQotICAgIGlmKG1fdXNlTGlz
dEJveCkgewotICAgICAgICBRTGlzdEJveCogdyA9IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93
aWRnZXQpOwotCi0KLSAgICAgICAgaW50IHNpemUgPSBtX3NpemU7Ci0gICAgICAgIC8vIGNoZWNr
IGlmIG11bHRpcGxlIGFuZCBzaXplIHdhcyBub3QgZ2l2ZW4gb3IgaW52YWxpZAotICAgICAgICAv
LyBJbnRlcm5ldCBFeHBsb2RlciBzZXRzIHNpemUgdG8gbWluKG51bWJlciBvZiBlbGVtZW50cywg
NCkKLSAgICAgICAgLy8gTmV0c2NhcGUgc2VlbXMgdG8gc2ltcGx5IHNldCBpdCB0byAibnVtYmVy
IG9mIGVsZW1lbnRzIgotICAgICAgICAvLyB0aGUgYXZlcmFnZSBvZiB0aGF0IGlzIElNSE8gbWlu
KG51bWJlciBvZiBlbGVtZW50cywgMTApCi0gICAgICAgIC8vIHNvIEkgZGlkIHRoYXQgOy0pCi0g
ICAgICAgIGlmKHNpemUgPCAxKQotICAgICAgICAgICAgc2l6ZSA9IG1pbihzdGF0aWNfY2FzdDxR
TGlzdEJveCo+KG1fd2lkZ2V0KS0+Y291bnQoKSwgMTBVKTsKLQotICAgICAgICAvLyBMZXQgdGhl
IHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAgICAgIEludFNpemUg
cyh3LT5zaXplRm9yTnVtYmVyT2ZMaW5lcyhzaXplKSk7Ci0gICAgICAgIHNldEludHJpbnNpY1dp
ZHRoKCBzLndpZHRoKCkgKTsKLSAgICAgICAgc2V0SW50cmluc2ljSGVpZ2h0KCBzLmhlaWdodCgp
ICk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBJbnRTaXplIHMobV93aWRnZXQtPnNpemVI
aW50KCkpOwotICAgICAgICBzZXRJbnRyaW5zaWNXaWR0aCggcy53aWR0aCgpICk7Ci0gICAgICAg
IHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQoKSApOwotICAgIH0KLQotICAgIFJlbmRlckZv
cm1FbGVtZW50OjpsYXlvdXQoKTsKLQotICAgIC8vIGFuZCBub3cgZGlzYWJsZSB0aGUgd2lkZ2V0
IGluIGNhc2UgdGhlcmUgaXMgbm8gPG9wdGlvbj4gZ2l2ZW4KLSAgICBEZXByZWNhdGVkQXJyYXk8
SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+
KG5vZGUoKSktPmxpc3RJdGVtcygpOwotCi0gICAgYm9vbCBmb3VuZE9wdGlvbiA9IGZhbHNlOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0SXRlbXMuc2l6ZSgpICYmICFmb3VuZE9w
dGlvbjsgaSsrKQotICAgICAgICBmb3VuZE9wdGlvbiA9IChsaXN0SXRlbXNbaV0tPmhhc1RhZ05h
bWUob3B0aW9uVGFnKSk7Ci0KLSAgICBtX3dpZGdldC0+c2V0RW5hYmxlZChmb3VuZE9wdGlvbiAm
JiAhIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7
Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBp
ZiAobV9pZ25vcmVTZWxlY3RFdmVudHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEtIVE1MQXNz
ZXJ0KCFtX3VzZUxpc3RCb3gpOwotCi0gICAgaW50IGluZGV4ID0gc3RhdGljX2Nhc3Q8UUNvbWJv
Qm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpOwotCi0gICAgRGVwcmVjYXRlZEFycmF5PEhU
TUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihu
b2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IChpbnQp
bGlzdEl0ZW1zLnNpemUoKSkgewotICAgICAgICBib29sIGZvdW5kID0gbGlzdEl0ZW1zW2luZGV4
XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpOwotICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAg
ICAgICAvLyB0aGlzIG9uZSBpcyBub3Qgc2VsZWN0YWJsZSwgIHdlIG5lZWQgdG8gZmluZCBhbiBv
cHRpb24gZWxlbWVudAotICAgICAgICAgICAgd2hpbGUgKCh1bnNpZ25lZCkgaW5kZXggPCBsaXN0
SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhh
c1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWZvdW5k
KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLS1p
bmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIGlmICggaW5kZXggIT0gc3RhdGljX2Nhc3Q8
UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpICkKLSAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPnNldEN1cnJlbnRJdGVtKCBpbmRleCAp
OwotCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGlzdEl0ZW1zLnNpemUo
KTsgKytpKQotICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0
aW9uVGFnKSAmJiBpICE9ICh1bnNpZ25lZCBpbnQpIGluZGV4KQotICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KCBsaXN0SXRlbXNbaV0gKS0+bV9zZWxl
Y3RlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dCo+KGxpc3RJdGVtc1tpbmRleF0pLT5tX3NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFu
Z2UoKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQq
KQotewotICAgIGlmIChtX2lnbm9yZVNlbGVjdEV2ZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgLy8gZG9uJ3QgdXNlIGxpc3RJdGVtcygpIGhlcmUgYXMgd2UgaGF2ZSB0byBhdm9pZCByZWNh
bGN1bGF0aW9ucyAtIGNoYW5naW5nIHRoZQotICAgIC8vIG9wdGlvbiBsaXN0IHdpbGwgbWFrZSB1
c2UgdXBkYXRlIG9wdGlvbnMgbm90IGluIHRoZSB3YXkgdGhlIHVzZXIgZXhwZWN0cyB0aGVtCi0g
ICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8
SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX2xpc3RJdGVtczsKLSAgICBpbnQgaiA9IDA7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVtcy5jb3VudCgpOyBpKyspIHsK
LSAgICAgICAgLy8gZG9uJ3QgdXNlIHNldFNlbGVjdGVkKCkgaGVyZSBiZWNhdXNlIGl0IHdpbGwg
Y2F1c2UgdXMgdG8gYmUgY2FsbGVkCi0gICAgICAgIC8vIGFnYWluIHdpdGggdXBkYXRlU2VsZWN0
aW9uLgotICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykpCi0g
ICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KCBsaXN0SXRlbXNbaV0g
KQotICAgICAgICAgICAgICAgIC0+bV9zZWxlY3RlZCA9IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4o
IG1fd2lkZ2V0ICktPmlzU2VsZWN0ZWQoIGogKTsKLSAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+
aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRncm91
cFRhZykpCi0gICAgICAgICAgICArK2o7Ci0gICAgfQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxl
Y3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVj
dDo6c2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBfb3B0aW9uc0NoYW5nZWQpCi17Ci0gICAgbV9vcHRp
b25zQ2hhbmdlZCA9IF9vcHRpb25zQ2hhbmdlZDsKLX0KLQotUUxpc3RCb3gqIFJlbmRlclNlbGVj
dDo6Y3JlYXRlTGlzdEJveCgpCi17Ci0gICAgUUxpc3RCb3ggKmxiID0gbmV3IFFMaXN0Qm94KCk7
Ci0gICAgbGItPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/IFFMaXN0Qm94OjpFeHRlbmRl
ZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7
Ci0gICAgcmV0dXJuIGxiOwotfQotCi12b2lkIFJlbmRlclNlbGVjdDo6dXBkYXRlU2VsZWN0aW9u
KCkKLXsKLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0
aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotICAgIGlu
dCBpOwotICAgIGlmIChtX3VzZUxpc3RCb3gpIHsKLSAgICAgICAgLy8gaWYgbXVsdGktc2VsZWN0
LCB3ZSBzZWxlY3Qgb25seSB0aGUgbmV3IHNlbGVjdGVkIGluZGV4Ci0gICAgICAgIFFMaXN0Qm94
ICpsaXN0Qm94ID0gc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCk7Ci0gICAgICAgIGlu
dCBqID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGludChsaXN0SXRlbXMuc2l6ZSgpKTsg
aSsrKSB7Ci0gICAgICAgICAgICBsaXN0Qm94LT5zZXRTZWxlY3RlZChqLCBsaXN0SXRlbXNbaV0t
Pmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpXSktPnNlbGVjdGVk
KCkpOwotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcp
IHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICAg
ICAgKytqOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgdW5zaWduZWQgZmlyc3RPcHRpb24gPSBs
aXN0SXRlbXMuc2l6ZSgpOwotICAgICAgICBpID0gbGlzdEl0ZW1zLnNpemUoKTsKLSAgICAgICAg
d2hpbGUgKGktLSkKLSAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0
aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChmb3VuZCkKLSAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5tX3NlbGVj
dGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5zZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KCBtX3dpZGdldCApLT5zZXRDdXJyZW50SXRl
bShpKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBmaXJzdE9wdGlvbiA9IGk7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgQVNTRVJUKGZpcnN0T3B0aW9uID09IGxpc3RJdGVtcy5zaXplKCkgfHwgZm91bmQpOwot
ICAgIH0KLQotICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlOwotfQotCi0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclRleHRBcmVhOjpS
ZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVy
Rm9ybUVsZW1lbnQoZWxlbWVudCksIG1fZGlydHkoZmFsc2UpLCBtX3VwZGF0aW5nKGZhbHNlKQot
ewotICAgIFFUZXh0RWRpdCAqZWRpdCA9IG5ldyBRVGV4dEVkaXQodmlldygpKTsKLQotICAgIGlm
IChlbGVtZW50LT53cmFwKCkgIT0gSFRNTFRleHRBcmVhRWxlbWVudDo6dGFfTm9XcmFwKQotICAg
ICAgICBlZGl0LT5zZXRXb3JkV3JhcChRVGV4dEVkaXQ6OldpZGdldFdpZHRoKTsKLSAgICBlbHNl
Ci0gICAgICAgIGVkaXQtPnNldFdvcmRXcmFwKFFUZXh0RWRpdDo6Tm9XcmFwKTsKLQotICAgIHNl
dFdpZGdldChlZGl0KTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6ZGVzdHJveSgpCi17Ci0g
ICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPnJlbmRlcmVyV2ls
bEJlRGVzdHJveWVkKCk7Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmRlc3Ryb3koKTsKLX0KLQot
dm9pZCBSZW5kZXJUZXh0QXJlYTo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2Vy
dCggIW1pbk1heEtub3duKCkgKTsKLQotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFU
ZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLSAgICBJbnRTaXplIHNpemUody0+c2l6ZVdpdGhDb2x1bW5z
QW5kUm93cygKLSAgICAgICAgbWF4KHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihu
b2RlKCkpLT5jb2xzKCksIDEpLAotICAgICAgICBtYXgoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVh
RWxlbWVudCo+KG5vZGUoKSktPnJvd3MoKSwgMSkpKTsKLQotICAgIHNldEludHJpbnNpY1dpZHRo
KCBzaXplLndpZHRoKCkgKTsKLSAgICBzZXRJbnRyaW5zaWNIZWlnaHQoIHNpemUuaGVpZ2h0KCkg
KTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9p
ZCBSZW5kZXJUZXh0QXJlYTo6c2V0U3R5bGUoUmVuZGVyU3R5bGUgKnMpCi17Ci0gICAgUmVuZGVy
Rm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotCi0gICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nh
c3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpOwotICAgIHctPnNldEFsaWdubWVudCh0ZXh0QWxpZ25t
ZW50KCkpOwotICAgIHctPnNldExpbmVIZWlnaHQoUmVuZGVyT2JqZWN0OjpsaW5lSGVpZ2h0KHRy
dWUpKTsKLQotICAgIHctPnNldFdyaXRpbmdEaXJlY3Rpb24oc3R5bGUoKS0+ZGlyZWN0aW9uKCkg
PT0gUlRMID8gUlRMIDogTFRSKTsKLQotICAgIFNjcm9sbEJhck1vZGUgc2Nyb2xsTW9kZSA9IFNj
cm9sbEJhckF1dG87Ci0gICAgc3dpdGNoIChzdHlsZSgpLT5vdmVyZmxvdygpKSB7Ci0gICAgICAg
IGNhc2UgT0FVVE86Ci0gICAgICAgIGNhc2UgT01BUlFVRUU6IC8vIG1ha2VzIG5vIHNlbnNlLCBt
YXAgdG8gYXV0bwotICAgICAgICBjYXNlIE9PVkVSTEFZOiAvLyBub3QgaW1wbGVtZW50ZWQgZm9y
IHRleHQsIG1hcCB0byBhdXRvCi0gICAgICAgIGNhc2UgT1ZJU0lCTEU6Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBPSElEREVOOgotICAgICAgICAgICAgc2Nyb2xsTW9kZSA9IFNj
cm9sbEJhckFsd2F5c09mZjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9TQ1JP
TEw6Ci0gICAgICAgICAgICBzY3JvbGxNb2RlID0gU2Nyb2xsQmFyQWx3YXlzT247Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICB9Ci0gICAgU2Nyb2xsQmFyTW9kZSBob3Jpem9udGFsU2Nyb2xsTW9k
ZSA9IHNjcm9sbE1vZGU7Ci0gICAgaWYgKHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQq
Pihub2RlKCkpLT53cmFwKCkgIT0gSFRNTFRleHRBcmVhRWxlbWVudDo6dGFfTm9XcmFwKQotICAg
ICAgICBob3Jpem9udGFsU2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09mZjsKLQotICAgIHct
PnNldFNjcm9sbEJhck1vZGVzKGhvcml6b250YWxTY3JvbGxNb2RlLCBzY3JvbGxNb2RlKTsKLX0K
LQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0RWRpdGVkKGJvb2wgeCkKLXsKLSAgICBtX2RpcnR5
ID0geDsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewot
ICAgIEhUTUxUZXh0QXJlYUVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVt
ZW50Kj4obm9kZSgpKTsKLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQq
PihtX3dpZGdldCk7Ci0KLSAgICB3LT5zZXRSZWFkT25seShlLT5pc1JlYWRPbmx5Q29udHJvbCgp
KTsKLSAgICB3LT5zZXREaXNhYmxlZChlLT5kaXNhYmxlZCgpKTsKLQotICAgIFN0cmluZyB3aWRn
ZXRUZXh0ID0gdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0ID0gZS0+dmFsdWUoKTsKLSAgICB0ZXh0
LnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLSAgICBpZiAod2lk
Z2V0VGV4dCAhPSB0ZXh0KSB7Ci0gICAgICAgIGludCBsaW5lLCBjb2w7Ci0gICAgICAgIHctPmdl
dEN1cnNvclBvc2l0aW9uKCAmbGluZSwgJmNvbCApOwotICAgICAgICBtX3VwZGF0aW5nID0gdHJ1
ZTsKLSAgICAgICAgdy0+c2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgbV91cGRhdGluZyA9IGZhbHNl
OwotICAgICAgICB3LT5zZXRDdXJzb3JQb3NpdGlvbiggbGluZSwgY29sICk7Ci0gICAgfQotICAg
IG1fZGlydHkgPSBmYWxzZTsKLQotICAgIHctPnNldENvbG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5k
Q29sb3IoKSwgc3R5bGUoKS0+Y29sb3IoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBk
YXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotU3RyaW5nIFJlbmRlclRleHRBcmVhOjp0ZXh0KCkKLXsK
LSAgICBTdHJpbmcgdHh0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpLT50ZXh0
KCk7Ci0gICAgcmV0dXJuIHR4dC5yZXBsYWNlKGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSwg
J1xcJyk7Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0QXJlYTo6dGV4dFdpdGhIYXJkTGluZUJyZWFr
cygpCi17Ci0gICAgU3RyaW5nIHR4dCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0
KS0+dGV4dFdpdGhIYXJkTGluZUJyZWFrcygpOwotICAgIHJldHVybiB0eHQucmVwbGFjZShiYWNr
c2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVh
Ojp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV91cGRhdGluZykKLSAgICAgICAg
cmV0dXJuOwotICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5p
bnZhbGlkYXRlVmFsdWUoKTsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsKLX0KLQotaW50IFJlbmRlclRl
eHRBcmVhOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0
YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAgcmV0dXJuIHRleHRFZGl0LT5z
ZWxlY3Rpb25TdGFydCgpOwotfQotCi1pbnQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdGlvbkVuZCgp
Ci17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPiht
X3dpZGdldCk7Ci0gICAgcmV0dXJuIHRleHRFZGl0LT5zZWxlY3Rpb25FbmQoKTsKLX0KLQotdm9p
ZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAgIFFU
ZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwot
ICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7Ci19Ci0KLXZvaWQgUmVuZGVy
VGV4dEFyZWE6OnNldFNlbGVjdGlvbkVuZChpbnQgZW5kKQotewotICAgIFFUZXh0RWRpdCAqdGV4
dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0
LT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0
KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpLT5zZWxlY3RBbGwo
KTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0
LCBpbnQgZW5kKQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4
dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25SYW5nZShzdGFy
dCwgZW5kLXN0YXJ0KTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0aW9uQ2hhbmdl
ZChXaWRnZXQqKQotewotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+
KG1fd2lkZ2V0KTsKLQotICAgIC8vIFdlIG9ubHkgd2FudCB0byBjYWxsIG9uc2VsZWN0IGlmIHRo
ZXJlIGFjdHVhbGx5IGlzIGEgc2VsZWN0aW9uCi0gICAgaWYgKCF3LT5oYXNTZWxlY3RlZFRleHQo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVs
ZW1lbnQqPihub2RlKCkpLT5vblNlbGVjdCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQogUmVuZGVyU2xpZGVyOjpSZW5kZXJTbGlkZXIoSFRNTElucHV0RWxlbWVudCogZWxlbWVudCkK
ICAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCiB7CkBAIC0xMDg3LDcgKzQ2LDcgQEAg
UmVuZGVyU2xpZGVyOjpSZW5kZXJTbGlkZXIoSFRNTElucHV0RWxlbQogCiB2b2lkIFJlbmRlclNs
aWRlcjo6Y2FsY01pbk1heFdpZHRoKCkKIHsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24o
KSk7CisgICAgQVNTRVJUKCFtaW5NYXhLbm93bigpKTsKICAgICAKICAgICAvLyBMZXQgdGhlIHdp
ZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCiAgICAgSW50U2l6ZSBzKHdpZGdl
dCgpLT5zaXplSGludCgpKTsKQEAgLTExMjQsNyArODMsNyBAQCB2b2lkIFJlbmRlclNsaWRlcjo6
dXBkYXRlRnJvbUVsZW1lbnQoKQogCiAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+
KG5vZGUoKSktPnNldFZhbHVlKFN0cmluZzo6bnVtYmVyKHZhbCkpOwogCi0gICAgUVNsaWRlciog
c2xpZGVyID0gKFFTbGlkZXIqKXdpZGdldCgpOworICAgIFFTbGlkZXIqIHNsaWRlciA9IHN0YXRp
Y19jYXN0PFFTbGlkZXIqPih3aWRnZXQoKSk7CiAgICAgIAogICAgIHNsaWRlci0+c2V0TWluVmFs
dWUobWluVmFsKTsKICAgICBzbGlkZXItPnNldE1heFZhbHVlKG1heFZhbCk7CkBAIC0xMTUwLDQg
KzEwOSw0IEBAIHZvaWQgUmVuZGVyU2xpZGVyOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKICAgICBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+ZGlzcGF0Y2hIVE1MRXZlbnQo
aW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwogfQogCi19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0QXJlYS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRBcmVhLmgJKHJldmlzaW9uIDE0MzQyKQorKysg
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dEFyZWEuaAkod29ya2luZyBjb3B5KQpAQCAtMjMs
Mjg2ICsyMyw1NiBAQAogICoKICAqLwogCi0jaWZuZGVmIFJFTkRFUl9GT1JNX0gKLSNkZWZpbmUg
UkVOREVSX0ZPUk1fSAorI2lmbmRlZiBSZW5kZXJUZXh0QXJlYV9oCisjZGVmaW5lIFJlbmRlclRl
eHRBcmVhX2gKIAotI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgotI2luY2x1ZGUgIkdyYXBoaWNz
VHlwZXMuaCIKLSNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgotI2luY2x1ZGUgIlJlbmRlckltYWdl
LmgiCi0KLWNsYXNzIFFMaXN0Qm94OworI2luY2x1ZGUgIlJlbmRlckZvcm1FbGVtZW50LmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRG9jTG9hZGVyOwotY2xhc3MgSFRNTEZvcm1F
bGVtZW50OwotY2xhc3MgSFRNTEdlbmVyaWNGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxJbnB1dEVs
ZW1lbnQ7Ci1jbGFzcyBIVE1MU2VsZWN0RWxlbWVudDsKLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1l
bnQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQgOiBw
dWJsaWMgUmVuZGVyV2lkZ2V0Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQoSFRN
TEdlbmVyaWNGb3JtRWxlbWVudCogbm9kZSk7Ci0gICAgdmlydHVhbCB+UmVuZGVyRm9ybUVsZW1l
bnQoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0
dXJuICJSZW5kZXJGb3JtIjsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9ybUVsZW1lbnQoKSBj
b25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBBcXVhIGZvcm0gY29udHJvbHMgbmV2ZXIg
aGF2ZSBib3JkZXIvcGFkZGluZy4KLSAgICBpbnQgYm9yZGVyVG9wKCkgY29uc3QgeyByZXR1cm4g
MDsgfQotICAgIGludCBib3JkZXJCb3R0b20oKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50
IGJvcmRlckxlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlclJpZ2h0KCkg
Y29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nVG9wKCkgY29uc3QgeyByZXR1cm4g
MDsgfQotICAgIGludCBwYWRkaW5nQm90dG9tKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGlu
dCBwYWRkaW5nTGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ1JpZ2h0
KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgLy8gQXF1YSBjb250cm9scyB1c2UgaW50cmlu
c2ljIG1hcmdpbiB2YWx1ZXMgaW4gb3JkZXIgdG8gbGVhdmUgc3BhY2UgZm9yIGZvY3VzIHJpbmdz
Ci0gICAgLy8gYW5kIHRvIGtlZXAgY29udHJvbHMgZnJvbSBidXR0aW5nIHVwIGFnYWluc3Qgb25l
IGFub3RoZXIuICBUaGlzIGludHJpbnNpYyBtYXJnaW4KLSAgICAvLyBpcyBvbmx5IGFwcGxpZWQg
aWYgdGhlIFdlYiBwYWdlIGFsbG93cyB0aGUgY29udHJvbCB0byBzaXplIGludHJpbnNpY2FsbHku
ICBJZiB0aGUKLSAgICAvLyBXZWIgcGFnZSBzcGVjaWZpZXMgYW4gZXhwbGljaXQgd2lkdGggZm9y
IGEgY29udHJvbCwgdGhlbiB3ZSBnbyBhaGVhZCBhbmQgaG9ub3IgdGhhdAotICAgIC8vIHByZWNp
c2Ugd2lkdGguICBTaW1pbGFybHksIGlmIGEgV2ViIHBhZ2UgdXNlcyBhIHNwZWNpZmljIG1hcmdp
biB2YWx1ZSwgd2Ugd2lsbCBnbyBhaGVhZAotICAgIC8vIGFuZCBob25vciB0aGF0IHZhbHVlLiAg
Ci0gICAgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zSWZBbGxvd2VkKFJlbmRlclN0eWxlKiBfc3R5
bGUpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9Ci0gICAgaW50IGludHJpbnNpY01hcmdpbigpIGNvbnN0IHsgcmV0dXJu
IDI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLSAgICB2
aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBsYXlv
dXQoKTsKLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wsIGJvb2wgKSBj
b25zdDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2tlZChXaWRnZXQqKTsKLQot
cHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4g
ZmFsc2U7IH0KLQotICAgIEhvcml6b250YWxBbGlnbm1lbnQgdGV4dEFsaWdubWVudCgpIGNvbnN0
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJJbWFnZUJ1dHRvbiA6
IHB1YmxpYyBSZW5kZXJJbWFnZQotewotcHVibGljOgotICAgIFJlbmRlckltYWdlQnV0dG9uKEhU
TUxJbnB1dEVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgp
IGNvbnN0IHsgcmV0dXJuICJSZW5kZXJJbWFnZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFsIGJvb2wg
aXNJbWFnZUJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyTGluZUVkaXQgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1l
bnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJMaW5lRWRpdChIVE1MSW5wdXRFbGVtZW50Kik7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgaW50IGNhbGNSZXBsYWNl
ZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0hlaWdodCgpOyB9Ci0gICAgdmlydHVh
bCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQot
Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJl
bmRlckxpbmVFZGl0IjsgfQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwot
ICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGludCBzZWxl
Y3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLSAgICB2b2lkIHNldFNlbGVj
dGlvblN0YXJ0KGludCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25FbmQoaW50KTsKLSAgICAKLSAg
ICBib29sIGlzRWRpdGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRFZGl0ZWQoYm9vbCk7Ci0gICAg
Ym9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2b2lkIHNlbGVj
dCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi1wdWJsaWM6Ci0g
ICAgdm9pZCBhZGRTZWFyY2hSZXN1bHQoKTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQg
cmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdp
ZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotICAg
IHZpcnR1YWwgdm9pZCBwZXJmb3JtU2VhcmNoKFdpZGdldCopOwotCi0gICAgdmlydHVhbCBib29s
IGlzRWRpdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBib29sIG1fdXBkYXRp
bmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckZpZWxkc2V0IDog
cHVibGljIFJlbmRlckJsb2NrCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRmllbGRzZXQoSFRNTEdl
bmVyaWNGb3JtRWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1l
KCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZpZWxkU2V0IjsgfQotCi0gICAgdmlydHVhbCBSZW5k
ZXJPYmplY3QqIGxheW91dExlZ2VuZChib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwotCi0gICAgdmly
dHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7Ci0gICAgCi1wcml2YXRlOgotICAgIHZp
cnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25zKFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5
KTsKLSAgICB2b2lkIHBhaW50Qm9yZGVyTWludXNMZWdlbmQoR3JhcGhpY3NDb250ZXh0KiwgaW50
IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgY29uc3QgUmVuZGVyU3R5bGUgKiwgaW50IGx4LCBp
bnQgbHcpOwotICAgIFJlbmRlck9iamVjdCogZmluZExlZ2VuZCgpOwotfTsKLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJGaWxlQnV0dG9uIDogcHVibGljIFJlbmRlckZvcm1F
bGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50
Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVy
biAiUmVuZGVyRmlsZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRo
KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdm9pZCBzZWxl
Y3QoKTsKLQotICAgIGludCBjYWxjUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRy
aW5zaWNIZWlnaHQoKTsgfQotCi0gICAgdm9pZCBjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cyk7
Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChX
aWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotfTsKLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJMYWJlbCA6IHB1YmxpYyBSZW5kZXJG
b3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnQgKmVsZW1lbnQpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkg
Y29uc3QgeyByZXR1cm4gIlJlbmRlckxhYmVsIjsgfQotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIFJlbmRlckxlZ2VuZCA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGlj
OgotICAgIFJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KTsKLQot
ICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5k
ZXJMZWdlbmQiOyB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlclNl
bGVjdCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclNl
bGVjdChIVE1MU2VsZWN0RWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5k
ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclNlbGVjdCI7IH0KLQotICAgIHNob3J0IGJh
c2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBiICkgY29uc3Q7Ci0gICAgaW50IGNhbGNSZXBs
YWNlZEhlaWdodCgpIGNvbnN0IHsgaWYgKCFtX3VzZUxpc3RCb3gpIHJldHVybiBpbnRyaW5zaWNI
ZWlnaHQoKTsgcmV0dXJuIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjUmVwbGFjZWRIZWlnaHQoKTsg
fQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2
aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0KLSAgICB2b2lkIHNldE9wdGlvbnNDaGFuZ2VkKGJvb2wg
X29wdGlvbnNDaGFuZ2VkKTsKLQotICAgIGJvb2wgc2VsZWN0aW9uQ2hhbmdlZCgpIHsgcmV0dXJu
IG1fc2VsZWN0aW9uQ2hhbmdlZDsgfQotICAgIHZvaWQgc2V0U2VsZWN0aW9uQ2hhbmdlZChib29s
IF9zZWxlY3Rpb25DaGFuZ2VkKSB7IG1fc2VsZWN0aW9uQ2hhbmdlZCA9IF9zZWxlY3Rpb25DaGFu
Z2VkOyB9Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVh
bCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0gICAgdm9pZCB1cGRhdGVTZWxlY3Rp
b24oKTsKLQotcHJvdGVjdGVkOgotICAgIFFMaXN0Qm94ICpjcmVhdGVMaXN0Qm94KCk7Ci0gICAg
dm9pZCBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci0KLSAgICB1bnNpZ25lZCAgbV9zaXpl
OwotICAgIGJvb2wgbV9tdWx0aXBsZTsKLSAgICBib29sIG1fdXNlTGlzdEJveDsKLSAgICBib29s
IG1fc2VsZWN0aW9uQ2hhbmdlZDsKLSAgICBib29sIG1faWdub3JlU2VsZWN0RXZlbnRzOwotICAg
IGJvb2wgbV9vcHRpb25zQ2hhbmdlZDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgdmFs
dWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdp
ZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUZXh0QXJl
YSA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclRleHRB
cmVhKEhUTUxUZXh0QXJlYUVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7
Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAi
UmVuZGVyVGV4dEFyZWEiOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwot
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBz
ZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGJvb2wgaXNUZXh0QXJlYSgpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KLSAgICBib29sIGlzRWRpdGVkKCkgY29uc3QgeyByZXR1cm4gbV9kaXJ0
eTsgfQotICAgIHZvaWQgc2V0RWRpdGVkIChib29sKTsKLSAgICAKLSAgICBTdHJpbmcgdGV4dCgp
OwotICAgIFN0cmluZyB0ZXh0V2l0aEhhcmRMaW5lQnJlYWtzKCk7Ci0KLSAgICBpbnQgc2VsZWN0
aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rp
b25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0gICAgCi0gICAg
dm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAg
ICAKLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChX
aWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKLSAg
ICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotICAgIGJvb2wgbV9kaXJ0eTsKLSAgICBib29sIG1fdXBkYXRpbmc7Ci19
OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlclNsaWRlciA6IHB1YmxpYyBS
ZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclNsaWRlcihIVE1MSW5wdXRF
bGVtZW50Kik7Ci0gICAgCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29u
c3QgeyByZXR1cm4gIlJlbmRlclNsaWRlciI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUlu
dHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCB2b2lk
IGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgp
OwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci19
OworICAgIGNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7CisKKyAgICBjbGFzcyBSZW5kZXJUZXh0
QXJlYSA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudCB7CisgICAgcHVibGljOgorICAgICAgICBS
ZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50Kik7CisKKyAgICAgICAgdmlydHVhbCBj
b25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclRleHRBcmVhIjsg
fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7CisKKyAgICAgICAgdmlydHVhbCB2
b2lkIGNhbGNNaW5NYXhXaWR0aCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVs
ZW1lbnQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7CisK
KyAgICAgICAgYm9vbCBpc1RleHRBcmVhKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAg
ICBib29sIGlzRWRpdGVkKCkgY29uc3QgeyByZXR1cm4gbV9kaXJ0eTsgfQorICAgICAgICB2b2lk
IHNldEVkaXRlZChib29sKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyB0ZXh0KCk7CisgICAg
ICAgIFN0cmluZyB0ZXh0V2l0aEhhcmRMaW5lQnJlYWtzKCk7CisKKyAgICAgICAgaW50IHNlbGVj
dGlvblN0YXJ0KCk7CisgICAgICAgIGludCBzZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgdm9pZCBz
ZXRTZWxlY3Rpb25TdGFydChpbnQpOworICAgICAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQp
OworICAgICAgICAKKyAgICAgICAgdm9pZCBzZWxlY3QoKTsKKyAgICAgICAgdm9pZCBzZXRTZWxl
Y3Rpb25SYW5nZShpbnQsIGludCk7CisgICAgICAgIAorICAgICAgICB2aXJ0dWFsIGJvb2wgY2Fu
SGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOworICAgICAg
ICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKKyAgICAgICAgCisgICAg
cHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KKworICAgICAgICBib29sIG1fZGlydHk7CisgICAgICAgIGJvb2wgbV91cGRh
dGluZzsKKyAgICB9OworCiAKLX0gLy9uYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
IAotI2VuZGlmCisjZW5kaWYgLy8gUmVuZGVyVGV4dEFyZWFfaApJbmRleDogV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyTGFiZWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJMYWJlbC5oCShyZXZpc2lvbiAxNDM0MikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxh
YmVsLmgJKHdvcmtpbmcgY29weSkKQEAgLTIzLDI4NiArMjMsMjAgQEAKICAqCiAgKi8KIAotI2lm
bmRlZiBSRU5ERVJfRk9STV9ICi0jZGVmaW5lIFJFTkRFUl9GT1JNX0gKKyNpZm5kZWYgUmVuZGVy
TGFiZWxfaAorI2RlZmluZSBSZW5kZXJMYWJlbF9oCiAKLSNpbmNsdWRlICJSZW5kZXJXaWRnZXQu
aCIKLSNpbmNsdWRlICJHcmFwaGljc1R5cGVzLmgiCi0jaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIK
LSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotCi1jbGFzcyBRTGlzdEJveDsKKyNpbmNsdWRlICJS
ZW5kZXJGb3JtRWxlbWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIERvY0xv
YWRlcjsKLWNsYXNzIEhUTUxGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1l
bnQ7Ci1jbGFzcyBIVE1MSW5wdXRFbGVtZW50OwotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnQ7Ci1j
bGFzcyBIVE1MVGV4dEFyZWFFbGVtZW50OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNz
IFJlbmRlckZvcm1FbGVtZW50IDogcHVibGljIFJlbmRlcldpZGdldAotewotcHVibGljOgotICAg
IFJlbmRlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqIG5vZGUpOwotICAgIHZp
cnR1YWwgflJlbmRlckZvcm1FbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJl
bmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRm9ybSI7IH0KLQotICAgIHZpcnR1YWwg
Ym9vbCBpc0Zvcm1FbGVtZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgLy8gQXF1
YSBmb3JtIGNvbnRyb2xzIG5ldmVyIGhhdmUgYm9yZGVyL3BhZGRpbmcuCi0gICAgaW50IGJvcmRl
clRvcCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29uc3Qg
eyByZXR1cm4gMDsgfQotICAgIGludCBib3JkZXJMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQot
ICAgIGludCBib3JkZXJSaWdodCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGlu
Z1RvcCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ0JvdHRvbSgpIGNvbnN0
IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ0xlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9
Ci0gICAgaW50IHBhZGRpbmdSaWdodCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIC8vIEFx
dWEgY29udHJvbHMgdXNlIGludHJpbnNpYyBtYXJnaW4gdmFsdWVzIGluIG9yZGVyIHRvIGxlYXZl
IHNwYWNlIGZvciBmb2N1cyByaW5ncwotICAgIC8vIGFuZCB0byBrZWVwIGNvbnRyb2xzIGZyb20g
YnV0dGluZyB1cCBhZ2FpbnN0IG9uZSBhbm90aGVyLiAgVGhpcyBpbnRyaW5zaWMgbWFyZ2luCi0g
ICAgLy8gaXMgb25seSBhcHBsaWVkIGlmIHRoZSBXZWIgcGFnZSBhbGxvd3MgdGhlIGNvbnRyb2wg
dG8gc2l6ZSBpbnRyaW5zaWNhbGx5LiAgSWYgdGhlCi0gICAgLy8gV2ViIHBhZ2Ugc3BlY2lmaWVz
IGFuIGV4cGxpY2l0IHdpZHRoIGZvciBhIGNvbnRyb2wsIHRoZW4gd2UgZ28gYWhlYWQgYW5kIGhv
bm9yIHRoYXQKLSAgICAvLyBwcmVjaXNlIHdpZHRoLiAgU2ltaWxhcmx5LCBpZiBhIFdlYiBwYWdl
IHVzZXMgYSBzcGVjaWZpYyBtYXJnaW4gdmFsdWUsIHdlIHdpbGwgZ28gYWhlYWQKLSAgICAvLyBh
bmQgaG9ub3IgdGhhdCB2YWx1ZS4gIAotICAgIHZvaWQgYWRkSW50cmluc2ljTWFyZ2luc0lmQWxs
b3dlZChSZW5kZXJTdHlsZSogX3N0eWxlKTsKLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJp
bnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIGludCBpbnRyaW5zaWNN
YXJnaW4oKSBjb25zdCB7IHJldHVybiAyOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUo
UmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0gICAgdmlydHVhbCBzaG9ydCBiYXNlbGluZVBv
c2l0aW9uKCBib29sLCBib29sICkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lk
IGNsaWNrZWQoV2lkZ2V0Kik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0
YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBIb3Jpem9udGFsQWxpZ25tZW50
IHRleHRBbGlnbm1lbnQoKSBjb25zdDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xh
c3MgUmVuZGVySW1hZ2VCdXR0b24gOiBwdWJsaWMgUmVuZGVySW1hZ2UKLXsKLXB1YmxpYzoKLSAg
ICBSZW5kZXJJbWFnZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNv
bnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVySW1hZ2VCdXR0b24i
OyB9Ci0gICAgdmlydHVhbCBib29sIGlzSW1hZ2VCdXR0b24oKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckxpbmVFZGl0IDog
cHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyTGluZUVkaXQo
SFRNTElucHV0RWxlbWVudCopOwotCi0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgp
OwotICAgIGludCBjYWxjUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNI
ZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFt
ZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMaW5lRWRpdCI7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5
bGUgKik7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5k
KCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0
aW9uRW5kKGludCk7Ci0gICAgCi0gICAgYm9vbCBpc0VkaXRlZCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0RWRpdGVkKGJvb2wpOwotICAgIGJvb2wgaXNUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiB0
cnVlOyB9Ci0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGlu
dCwgaW50KTsKLQotcHVibGljOgotICAgIHZvaWQgYWRkU2VhcmNoUmVzdWx0KCk7Ci0KLXByaXZh
dGU6Ci0gICAgdmlydHVhbCB2b2lkIHJldHVyblByZXNzZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVh
bCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9u
Q2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybVNlYXJjaChXaWRnZXQq
KTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQotCi0gICAgYm9vbCBtX3VwZGF0aW5nOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBSZW5kZXJGaWVsZHNldCA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAg
IFJlbmRlckZpZWxkc2V0KEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwg
Y29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGaWVsZFNldCI7
IH0KLQotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBsYXlvdXRMZWdlbmQoYm9vbCByZWxheW91
dENoaWxkcmVuKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSopOwot
ICAgIAotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCb3hEZWNvcmF0aW9ucyhQYWlu
dEluZm8mLCBpbnQgdHgsIGludCB0eSk7Ci0gICAgdm9pZCBwYWludEJvcmRlck1pbnVzTGVnZW5k
KEdyYXBoaWNzQ29udGV4dCosIGludCB0eCwgaW50IHR5LCBpbnQgdywgaW50IGgsIGNvbnN0IFJl
bmRlclN0eWxlICosIGludCBseCwgaW50IGx3KTsKLSAgICBSZW5kZXJPYmplY3QqIGZpbmRMZWdl
bmQoKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyRmlsZUJ1dHRv
biA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlckZpbGVC
dXR0b24oSFRNTElucHV0RWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5k
ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZpbGVCdXR0b24iOyB9Ci0gICAgdmlydHVh
bCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxl
bWVudCgpOwotICAgIHZvaWQgc2VsZWN0KCk7Ci0KLSAgICBpbnQgY2FsY1JlcGxhY2VkSGVpZ2h0
KCkgY29uc3QgeyByZXR1cm4gaW50cmluc2ljSGVpZ2h0KCk7IH0KLQotICAgIHZvaWQgY2xpY2so
Ym9vbCBzZW5kTW91c2VFdmVudHMpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIGlz
RWRpdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVh
bCB2b2lkIHJldHVyblByZXNzZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hh
bmdlZChXaWRnZXQqKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVy
TGFiZWwgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJM
YWJlbChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KTsKLQotICAgIHZpcnR1YWwgY29u
c3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMYWJlbCI7IH0KLX07
Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJMZWdlbmQgOiBwdWJsaWMg
UmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJMZWdlbmQoSFRNTEdlbmVyaWNGb3Jt
RWxlbWVudCAqZWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUo
KSBjb25zdCB7IHJldHVybiAiUmVuZGVyTGVnZW5kIjsgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBSZW5kZXJTZWxlY3QgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsK
LXB1YmxpYzoKLSAgICBSZW5kZXJTZWxlY3QoSFRNTFNlbGVjdEVsZW1lbnQqKTsKLQotICAgIHZp
cnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJTZWxl
Y3QiOyB9Ci0KLSAgICBzaG9ydCBiYXNlbGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgYiApIGNv
bnN0OwotICAgIGludCBjYWxjUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IGlmICghbV91c2VMaXN0
Qm94KSByZXR1cm4gaW50cmluc2ljSGVpZ2h0KCk7IHJldHVybiBSZW5kZXJGb3JtRWxlbWVudDo6
Y2FsY1JlcGxhY2VkSGVpZ2h0KCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNp
Y01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2Fs
Y01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIGxheW91dCgpOwotCi0gICAgdm9pZCBz
ZXRPcHRpb25zQ2hhbmdlZChib29sIF9vcHRpb25zQ2hhbmdlZCk7Ci0KLSAgICBib29sIHNlbGVj
dGlvbkNoYW5nZWQoKSB7IHJldHVybiBtX3NlbGVjdGlvbkNoYW5nZWQ7IH0KLSAgICB2b2lkIHNl
dFNlbGVjdGlvbkNoYW5nZWQoYm9vbCBfc2VsZWN0aW9uQ2hhbmdlZCkgeyBtX3NlbGVjdGlvbkNo
YW5nZWQgPSBfc2VsZWN0aW9uQ2hhbmdlZDsgfQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9t
RWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQot
ICAgIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBRTGlzdEJveCAq
Y3JlYXRlTGlzdEJveCgpOwotICAgIHZvaWQgc2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpOwot
Ci0gICAgdW5zaWduZWQgIG1fc2l6ZTsKLSAgICBib29sIG1fbXVsdGlwbGU7Ci0gICAgYm9vbCBt
X3VzZUxpc3RCb3g7Ci0gICAgYm9vbCBtX3NlbGVjdGlvbkNoYW5nZWQ7Ci0gICAgYm9vbCBtX2ln
bm9yZVNlbGVjdEV2ZW50czsKLSAgICBib29sIG1fb3B0aW9uc0NoYW5nZWQ7Ci0KLXByaXZhdGU6
Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotY2xhc3MgUmVuZGVyVGV4dEFyZWEgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1
YmxpYzoKLSAgICBSZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50Kik7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJO
YW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclRleHRBcmVhIjsgfQotICAgIHZpcnR1YWwgdm9p
ZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQo
KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKik7Ci0KLSAgICBib29s
IGlzVGV4dEFyZWEoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgYm9vbCBpc0VkaXRlZCgp
IGNvbnN0IHsgcmV0dXJuIG1fZGlydHk7IH0KLSAgICB2b2lkIHNldEVkaXRlZCAoYm9vbCk7Ci0g
ICAgCi0gICAgU3RyaW5nIHRleHQoKTsKLSAgICBTdHJpbmcgdGV4dFdpdGhIYXJkTGluZUJyZWFr
cygpOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlvbkVuZCgp
OwotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNlbGVjdGlv
bkVuZChpbnQpOwotICAgIAotICAgIHZvaWQgc2VsZWN0KCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rp
b25SYW5nZShpbnQsIGludCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5z
aWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICAgIHZpcnR1
YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHNlbGVjdGlv
bkNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIGlz
RWRpdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBib29sIG1fZGlydHk7Ci0g
ICAgYm9vbCBtX3VwZGF0aW5nOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBS
ZW5kZXJTbGlkZXIgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBS
ZW5kZXJTbGlkZXIoSFRNTElucHV0RWxlbWVudCopOwotICAgIAotICAgIHZpcnR1YWwgY29uc3Qg
Y2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJTbGlkZXIiOyB9Ci0gICAg
dmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZv
aWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKKyAgICBjbGFzcyBSZW5kZXJMYWJlbCA6IHB1YmxpYyBS
ZW5kZXJGb3JtRWxlbWVudCB7CisgICAgcHVibGljOgorICAgICAgICBSZW5kZXJMYWJlbChIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50Kik7CiAKLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVl
Q2hhbmdlZChXaWRnZXQqKTsKLX07CisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVy
TmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMYWJlbCI7IH0KKyAgICB9OwogCi19IC8vbmFt
ZXNwYWNlCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZgorI2VuZGlmIC8vIFJlbmRl
ckxhYmVsX2gKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNlbGVjdC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNlbGVjdC5oCShyZXZpc2lvbiAxNDM0MikK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNlbGVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
MywyODYgKzIzLDU1IEBACiAgKgogICovCiAKLSNpZm5kZWYgUkVOREVSX0ZPUk1fSAotI2RlZmlu
ZSBSRU5ERVJfRk9STV9ICisjaWZuZGVmIFJlbmRlclNlbGVjdF9oCisjZGVmaW5lIFJlbmRlclNl
bGVjdF9oCiAKLSNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKLSNpbmNsdWRlICJHcmFwaGljc1R5
cGVzLmgiCi0jaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5o
IgorI2luY2x1ZGUgIlJlbmRlckZvcm1FbGVtZW50LmgiCiAKIGNsYXNzIFFMaXN0Qm94OwogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIERvY0xvYWRlcjsKLWNsYXNzIEhUTUxGb3JtRWxl
bWVudDsKLWNsYXNzIEhUTUxHZW5lcmljRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MSW5wdXRFbGVt
ZW50OwotY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnQ7Ci1jbGFzcyBIVE1MVGV4dEFyZWFFbGVtZW50
OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckZvcm1FbGVtZW50IDogcHVi
bGljIFJlbmRlcldpZGdldAotewotcHVibGljOgotICAgIFJlbmRlckZvcm1FbGVtZW50KEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnQqIG5vZGUpOwotICAgIHZpcnR1YWwgflJlbmRlckZvcm1FbGVtZW50
KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVy
biAiUmVuZGVyRm9ybSI7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0Zvcm1FbGVtZW50KCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgLy8gQXF1YSBmb3JtIGNvbnRyb2xzIG5ldmVyIGhh
dmUgYm9yZGVyL3BhZGRpbmcuCi0gICAgaW50IGJvcmRlclRvcCgpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KLSAgICBpbnQgYm9yZGVyQm90dG9tKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBi
b3JkZXJMZWZ0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBib3JkZXJSaWdodCgpIGNv
bnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ1RvcCgpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KLSAgICBpbnQgcGFkZGluZ0JvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQg
cGFkZGluZ0xlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IHBhZGRpbmdSaWdodCgp
IGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIC8vIEFxdWEgY29udHJvbHMgdXNlIGludHJpbnNp
YyBtYXJnaW4gdmFsdWVzIGluIG9yZGVyIHRvIGxlYXZlIHNwYWNlIGZvciBmb2N1cyByaW5ncwot
ICAgIC8vIGFuZCB0byBrZWVwIGNvbnRyb2xzIGZyb20gYnV0dGluZyB1cCBhZ2FpbnN0IG9uZSBh
bm90aGVyLiAgVGhpcyBpbnRyaW5zaWMgbWFyZ2luCi0gICAgLy8gaXMgb25seSBhcHBsaWVkIGlm
IHRoZSBXZWIgcGFnZSBhbGxvd3MgdGhlIGNvbnRyb2wgdG8gc2l6ZSBpbnRyaW5zaWNhbGx5LiAg
SWYgdGhlCi0gICAgLy8gV2ViIHBhZ2Ugc3BlY2lmaWVzIGFuIGV4cGxpY2l0IHdpZHRoIGZvciBh
IGNvbnRyb2wsIHRoZW4gd2UgZ28gYWhlYWQgYW5kIGhvbm9yIHRoYXQKLSAgICAvLyBwcmVjaXNl
IHdpZHRoLiAgU2ltaWxhcmx5LCBpZiBhIFdlYiBwYWdlIHVzZXMgYSBzcGVjaWZpYyBtYXJnaW4g
dmFsdWUsIHdlIHdpbGwgZ28gYWhlYWQKLSAgICAvLyBhbmQgaG9ub3IgdGhhdCB2YWx1ZS4gIAot
ICAgIHZvaWQgYWRkSW50cmluc2ljTWFyZ2luc0lmQWxsb3dlZChSZW5kZXJTdHlsZSogX3N0eWxl
KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQotICAgIGludCBpbnRyaW5zaWNNYXJnaW4oKSBjb25zdCB7IHJldHVybiAy
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKik7Ci0gICAgdmly
dHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0
KCk7Ci0gICAgdmlydHVhbCBzaG9ydCBiYXNlbGluZVBvc2l0aW9uKCBib29sLCBib29sICkgY29u
c3Q7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIGNsaWNrZWQoV2lkZ2V0Kik7Ci0KLXBy
b3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9Ci0KLSAgICBIb3Jpem9udGFsQWxpZ25tZW50IHRleHRBbGlnbm1lbnQoKSBjb25zdDsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVySW1hZ2VCdXR0b24gOiBw
dWJsaWMgUmVuZGVySW1hZ2UKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJJbWFnZUJ1dHRvbihIVE1M
SW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBj
b25zdCB7IHJldHVybiAiUmVuZGVySW1hZ2VCdXR0b24iOyB9Ci0gICAgdmlydHVhbCBib29sIGlz
SW1hZ2VCdXR0b24oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci19OwotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLWNsYXNzIFJlbmRlckxpbmVFZGl0IDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50
Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyTGluZUVkaXQoSFRNTElucHV0RWxlbWVudCopOwotCi0g
ICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIGludCBjYWxjUmVwbGFjZWRI
ZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwg
Ym9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQot
ICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5k
ZXJMaW5lRWRpdCI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKik7Ci0KLSAgICBpbnQgc2VsZWN0
aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rp
b25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0gICAgCi0gICAg
Ym9vbCBpc0VkaXRlZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0RWRpdGVkKGJvb2wpOwotICAgIGJv
b2wgaXNUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdm9pZCBzZWxlY3Qo
KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLQotcHVibGljOgotICAg
IHZvaWQgYWRkU2VhcmNoUmVzdWx0KCk7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHJl
dHVyblByZXNzZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRn
ZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2
aXJ0dWFsIHZvaWQgcGVyZm9ybVNlYXJjaChXaWRnZXQqKTsKLQotICAgIHZpcnR1YWwgYm9vbCBp
c0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgYm9vbCBtX3VwZGF0aW5n
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJGaWVsZHNldCA6IHB1
YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAgIFJlbmRlckZpZWxkc2V0KEhUTUxHZW5l
cmljRm9ybUVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgp
IGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGaWVsZFNldCI7IH0KLQotICAgIHZpcnR1YWwgUmVuZGVy
T2JqZWN0KiBsYXlvdXRMZWdlbmQoYm9vbCByZWxheW91dENoaWxkcmVuKTsKLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSopOwogICAgIAotcHJpdmF0ZToKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnRCb3hEZWNvcmF0aW9ucyhQYWludEluZm8mLCBpbnQgdHgsIGludCB0eSk7
Ci0gICAgdm9pZCBwYWludEJvcmRlck1pbnVzTGVnZW5kKEdyYXBoaWNzQ29udGV4dCosIGludCB0
eCwgaW50IHR5LCBpbnQgdywgaW50IGgsIGNvbnN0IFJlbmRlclN0eWxlICosIGludCBseCwgaW50
IGx3KTsKLSAgICBSZW5kZXJPYmplY3QqIGZpbmRMZWdlbmQoKTsKLX07Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyRmlsZUJ1dHRvbiA6IHB1YmxpYyBSZW5kZXJGb3JtRWxl
bWVudAotewotcHVibGljOgotICAgIFJlbmRlckZpbGVCdXR0b24oSFRNTElucHV0RWxlbWVudCop
OwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4g
IlJlbmRlckZpbGVCdXR0b24iOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgp
OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZvaWQgc2VsZWN0
KCk7Ci0KLSAgICBpbnQgY2FsY1JlcGxhY2VkSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaW50cmlu
c2ljSGVpZ2h0KCk7IH0KLQotICAgIHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMpOwot
Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHJldHVyblByZXNzZWQoV2lk
Z2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLX07Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyTGFiZWwgOiBwdWJsaWMgUmVuZGVyRm9y
bUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJMYWJlbChIVE1MR2VuZXJpY0Zvcm1FbGVt
ZW50ICplbGVtZW50KTsKKyAgICBjbGFzcyBIVE1MU2VsZWN0RWxlbWVudDsKIAotICAgIHZpcnR1
YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMYWJlbCI7
IH0KLX07CisgICAgY2xhc3MgUmVuZGVyU2VsZWN0IDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVudCop
OwogCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0
dXJuICJSZW5kZXJTZWxlY3QiOyB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgc2hv
cnQgYmFzZWxpbmVQb3NpdGlvbihib29sIGYsIGJvb2wgYikgY29uc3Q7CisgICAgICAgIGludCBj
YWxjUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IGlmICghbV91c2VMaXN0Qm94KSByZXR1cm4gaW50
cmluc2ljSGVpZ2h0KCk7IHJldHVybiBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY1JlcGxhY2VkSGVp
Z2h0KCk7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkg
Y29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogCi1jbGFzcyBSZW5kZXJMZWdlbmQgOiBwdWJsaWMgUmVu
ZGVyQmxvY2sKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJMZWdlbmQoSFRNTEdlbmVyaWNGb3JtRWxl
bWVudCAqZWxlbWVudCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsK
KyAgICAgICAgdmlydHVhbCB2b2lkIGxheW91dCgpOwogCi0gICAgdmlydHVhbCBjb25zdCBjaGFy
ICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxlZ2VuZCI7IH0KLX07CisgICAg
ICAgIHZvaWQgc2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBvcHRpb25zQ2hhbmdlZCk7CiAKLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKyAgICAgICAgYm9vbCBzZWxlY3Rpb25DaGFuZ2VkKCkgeyByZXR1cm4g
bV9zZWxlY3Rpb25DaGFuZ2VkOyB9CisgICAgICAgIHZvaWQgc2V0U2VsZWN0aW9uQ2hhbmdlZChi
b29sIHNlbGVjdGlvbkNoYW5nZWQpIHsgbV9zZWxlY3Rpb25DaGFuZ2VkID0gc2VsZWN0aW9uQ2hh
bmdlZDsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKKyAgICAg
ICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7CiAKLWNsYXNzIFJlbmRlclNl
bGVjdCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclNl
bGVjdChIVE1MU2VsZWN0RWxlbWVudCopOworICAgICAgICB2b2lkIHVwZGF0ZVNlbGVjdGlvbigp
OwogCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4g
IlJlbmRlclNlbGVjdCI7IH0KKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIHZvaWQgdmFs
dWVDaGFuZ2VkKFdpZGdldCopOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9uQ2hhbmdl
ZChXaWRnZXQqKTsKIAotICAgIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBi
ICkgY29uc3Q7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgaWYgKCFtX3Vz
ZUxpc3RCb3gpIHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgcmV0dXJuIFJlbmRlckZvcm1FbGVt
ZW50OjpjYWxjUmVwbGFjZWRIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50
cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBwcm90ZWN0ZWQ6Cisg
ICAgICAgIFFMaXN0Qm94KiBjcmVhdGVMaXN0Qm94KCk7CisgICAgICAgIHZvaWQgc2V0V2lkZ2V0
V3JpdGluZ0RpcmVjdGlvbigpOwogCi0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgp
OwotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLQotICAgIHZvaWQgc2V0T3B0aW9uc0NoYW5n
ZWQoYm9vbCBfb3B0aW9uc0NoYW5nZWQpOwotCi0gICAgYm9vbCBzZWxlY3Rpb25DaGFuZ2VkKCkg
eyByZXR1cm4gbV9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25DaGFu
Z2VkKGJvb2wgX3NlbGVjdGlvbkNoYW5nZWQpIHsgbV9zZWxlY3Rpb25DaGFuZ2VkID0gX3NlbGVj
dGlvbkNoYW5nZWQ7IH0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKik7Ci0KLSAgICB2b2lkIHVwZGF0
ZVNlbGVjdGlvbigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgUUxpc3RCb3ggKmNyZWF0ZUxpc3RCb3go
KTsKLSAgICB2b2lkIHNldFdpZGdldFdyaXRpbmdEaXJlY3Rpb24oKTsKLQotICAgIHVuc2lnbmVk
ICBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJvb2wgbV91c2VMaXN0Qm94Owot
ICAgIGJvb2wgbV9zZWxlY3Rpb25DaGFuZ2VkOwotICAgIGJvb2wgbV9pZ25vcmVTZWxlY3RFdmVu
dHM7Ci0gICAgYm9vbCBtX29wdGlvbnNDaGFuZ2VkOwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwg
dm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHNlbGVjdGlvbkNo
YW5nZWQoV2lkZ2V0Kik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRl
clRleHRBcmVhIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVu
ZGVyVGV4dEFyZWEoSFRNTFRleHRBcmVhRWxlbWVudCopOwotCi0gICAgdmlydHVhbCB2b2lkIGRl
c3Ryb3koKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsg
cmV0dXJuICJSZW5kZXJUZXh0QXJlYSI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdp
ZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVh
bCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0gICAgYm9vbCBpc1RleHRBcmVhKCkg
Y29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgaXNFZGl0ZWQoKSBjb25zdCB7IHJldHVy
biBtX2RpcnR5OyB9Ci0gICAgdm9pZCBzZXRFZGl0ZWQgKGJvb2wpOwotICAgIAotICAgIFN0cmlu
ZyB0ZXh0KCk7Ci0gICAgU3RyaW5nIHRleHRXaXRoSGFyZExpbmVCcmVha3MoKTsKLQotICAgIGlu
dCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLSAgICB2b2lkIHNl
dFNlbGVjdGlvblN0YXJ0KGludCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25FbmQoaW50KTsKLSAg
ICAKLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBp
bnQpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVD
aGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdl
dCopOwotICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgYm9vbCBtX2RpcnR5OwotICAgIGJvb2wgbV91cGRh
dGluZzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyU2xpZGVyIDog
cHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyU2xpZGVyKEhU
TUxJbnB1dEVsZW1lbnQqKTsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5h
bWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU2xpZGVyIjsgfQotICAgIHZpcnR1YWwgYm9vbCBj
YW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0
dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21F
bGVtZW50KCk7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRn
ZXQqKTsKLX07CisgICAgICAgIHVuc2lnbmVkIG1fc2l6ZTsKKyAgICAgICAgYm9vbCBtX211bHRp
cGxlOworICAgICAgICBib29sIG1fdXNlTGlzdEJveDsKKyAgICAgICAgYm9vbCBtX3NlbGVjdGlv
bkNoYW5nZWQ7CisgICAgICAgIGJvb2wgbV9pZ25vcmVTZWxlY3RFdmVudHM7CisgICAgICAgIGJv
b2wgbV9vcHRpb25zQ2hhbmdlZDsKKyAgICB9OwogCi19IC8vbmFtZXNwYWNlCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCiAKLSNlbmRpZgorI2VuZGlmIC8vIFJlbmRlclNlbGVjdF9oCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0QXJlYS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyVGV4dEFyZWEuY3BwCShyZXZpc2lvbiAxNDM0MikKKysrIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclRleHRBcmVhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsOTAx
ICsyNCwyMCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJf
Zm9ybS5oIgorI2luY2x1ZGUgIlJlbmRlclRleHRBcmVhLmgiCiAKLSNpbmNsdWRlICJCcm93c2Vy
RXh0ZW5zaW9uLmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgotI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxJbnB1dEVs
ZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0R3JvdXBFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRN
TE9wdGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgotI2luY2x1
ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRlICJLV1FDb21ib0JveC5oIgotI2lu
Y2x1ZGUgIktXUUZpbGVCdXR0b24uaCIKLSNpbmNsdWRlICJLV1FMaW5lRWRpdC5oIgotI2luY2x1
ZGUgIktXUVNsaWRlci5oIgogI2luY2x1ZGUgIktXUVRleHRFZGl0LmgiCi0jaW5jbHVkZSAiUGxh
dGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCi0KLXVzaW5n
IG5hbWVzcGFjZSBzdGQ7CisjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxlbWVudC5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFj
ZSBFdmVudE5hbWVzOwotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotUmVuZGVyRm9ybUVs
ZW1lbnQ6OlJlbmRlckZvcm1FbGVtZW50KEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQp
Ci0gICAgOiBSZW5kZXJXaWRnZXQoZWxlbWVudCkKLXsKLSAgICBzZXRJbmxpbmUodHJ1ZSk7Ci19
Ci0KLVJlbmRlckZvcm1FbGVtZW50Ojp+UmVuZGVyRm9ybUVsZW1lbnQoKQotewotfQotCi1zaG9y
dCBSZW5kZXJGb3JtRWxlbWVudDo6YmFzZWxpbmVQb3NpdGlvbiggYm9vbCBmLCBib29sIGlzUm9v
dExpbmVCb3ggKSBjb25zdAotewotICAgIHJldHVybiBtYXJnaW5Ub3AoKSArIHdpZGdldCgpLT5i
YXNlbGluZVBvc2l0aW9uKG1faGVpZ2h0KTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6
c2V0U3R5bGUoUmVuZGVyU3R5bGUqIHMpCi17Ci0gICAgaWYgKGNhbkhhdmVJbnRyaW5zaWNNYXJn
aW5zKCkpCi0gICAgICAgIGFkZEludHJpbnNpY01hcmdpbnNJZkFsbG93ZWQocyk7Ci0KLSAgICBS
ZW5kZXJXaWRnZXQ6OnNldFN0eWxlKHMpOwotCi0gICAgLy8gRG8gbm90IHBhaW50IGEgYmFja2dy
b3VuZCBvciBib3JkZXIgZm9yIEFxdWEgZm9ybSBlbGVtZW50cwotICAgIHNldFNob3VsZFBhaW50
QmFja2dyb3VuZE9yQm9yZGVyKGZhbHNlKTsKLQotICAgIG1fd2lkZ2V0LT5zZXRGb250KHN0eWxl
KCktPmZvbnQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVt
ZW50KCkKLXsKLSAgICBtX3dpZGdldC0+c2V0RW5hYmxlZCghc3RhdGljX2Nhc3Q8SFRNTEdlbmVy
aWNGb3JtRWxlbWVudCo+KG5vZGUoKSktPmRpc2FibGVkKCkpOwotfQotCi12b2lkIFJlbmRlckZv
cm1FbGVtZW50OjpsYXlvdXQoKQotewotICAgIEtIVE1MQXNzZXJ0KCBuZWVkc0xheW91dCgpICk7
Ci0gICAgS0hUTUxBc3NlcnQoIG1pbk1heEtub3duKCkgKTsKLQotICAgIC8vIG1pbmltdW0gaGVp
Z2h0Ci0gICAgbV9oZWlnaHQgPSAwOwotCi0gICAgY2FsY1dpZHRoKCk7Ci0gICAgY2FsY0hlaWdo
dCgpOwotICAgIAotICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLX0KLQotdm9pZCBSZW5kZXJG
b3JtRWxlbWVudDo6Y2xpY2tlZChXaWRnZXQqKQotewotICAgIFJlbmRlckFyZW5hKiBhcmVuYSA9
IHJlZigpOwotICAgIFBsYXRmb3JtTW91c2VFdmVudCBldmVudDsgLy8gZ2V0cyAiY3VycmVudCBl
dmVudCIKLSAgICBpZiAobm9kZSgpKQotICAgICAgICBzdGF0aWNfY2FzdDxFdmVudFRhcmdldE5v
ZGUqPihub2RlKCkpLT5kaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnQsIGNsaWNrRXZlbnQsIGV2ZW50
LmNsaWNrQ291bnQoKSk7Ci0gICAgZGVyZWYoYXJlbmEpOwotfQotCi1Ib3Jpem9udGFsQWxpZ25t
ZW50IFJlbmRlckZvcm1FbGVtZW50Ojp0ZXh0QWxpZ25tZW50KCkgY29uc3QKLXsKLSAgICBzd2l0
Y2ggKHN0eWxlKCktPnRleHRBbGlnbigpKSB7Ci0gICAgICAgIGNhc2UgTEVGVDoKLSAgICAgICAg
Y2FzZSBLSFRNTF9MRUZUOgotICAgICAgICAgICAgcmV0dXJuIEFsaWduTGVmdDsKLSAgICAgICAg
Y2FzZSBSSUdIVDoKLSAgICAgICAgY2FzZSBLSFRNTF9SSUdIVDoKLSAgICAgICAgICAgIHJldHVy
biBBbGlnblJpZ2h0OwotICAgICAgICBjYXNlIENFTlRFUjoKLSAgICAgICAgY2FzZSBLSFRNTF9D
RU5URVI6Ci0gICAgICAgICAgICByZXR1cm4gQWxpZ25IQ2VudGVyOwotICAgICAgICBjYXNlIEpV
U1RJRlk6Ci0gICAgICAgICAgICAvLyBKdXN0IGZhbGwgaW50byB0aGUgYXV0byBjb2RlIGZvciBq
dXN0aWZ5LgotICAgICAgICBjYXNlIFRBQVVUTzoKLSAgICAgICAgICAgIHJldHVybiBzdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBSVEwgPyBBbGlnblJpZ2h0IDogQWxpZ25MZWZ0OwotICAgIH0KLSAg
ICBBU1NFUlQoZmFsc2UpOyAvLyBTaG91bGQgbmV2ZXIgYmUgcmVhY2hlZC4KLSAgICByZXR1cm4g
QWxpZ25MZWZ0OwotfQotCi0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OmFkZEludHJpbnNpY01h
cmdpbnNJZkFsbG93ZWQoUmVuZGVyU3R5bGUqIF9zdHlsZSkKLXsKLSAgICAvLyBDdXQgb3V0IHRo
ZSBpbnRyaW5zaWMgbWFyZ2lucyBjb21wbGV0ZWx5IGlmIHdlIGVuZCB1cCB1c2luZyBtaW5pIGNv
bnRyb2xzLgotICAgIGlmIChfc3R5bGUtPmZvbnRTaXplKCkgPCAxMSkKLSAgICAgICAgcmV0dXJu
OwotICAgIAotICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9oZWlnaHQgYWxvbmUgYW5kIG5vdCBh
bHNvIGRlYWxpbmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRoIGlzIGZsYXdlZC4KLSAgICBpbnQg
bSA9IGludHJpbnNpY01hcmdpbigpOwotICAgIGlmIChfc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5z
aWNPckF1dG8oKSkgewotICAgICAgICBpZiAoX3N0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmsoKSkK
LSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luTGVmdChMZW5ndGgobSwgRml4ZWQpKTsKLSAg
ICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luUmlnaHQoKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0
eWxlLT5zZXRNYXJnaW5SaWdodChMZW5ndGgobSwgRml4ZWQpKTsKLSAgICB9Ci0KLSAgICBpZiAo
X3N0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgewotICAgICAgICBpZiAoX3N0eWxlLT5tYXJnaW5U
b3AoKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKG0s
IEZpeGVkKSk7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkpCi0g
ICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpbkJvdHRvbShMZW5ndGgobSwgRml4ZWQpKTsKLSAg
ICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVySW1hZ2VCdXR0b246
OlJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5k
ZXJJbWFnZShlbGVtZW50KQotewotICAgIC8vICMjIyBzdXBwb3J0IERPTUFjdGl2YXRlIGV2ZW50
IHdoZW4gY2xpY2tlZAotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyTGluZUVkaXQ6OlJlbmRlckxpbmVFZGl0KEhUTUxJ
bnB1dEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KSwg
bV91cGRhdGluZyhmYWxzZSkKLXsKLSAgICBRTGluZUVkaXQ6OlR5cGUgdHlwZTsKLSAgICBzd2l0
Y2ggKGVsZW1lbnQtPmlucHV0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSFRNTElucHV0RWxlbWVu
dDo6UEFTU1dPUkQ6Ci0gICAgICAgICAgICB0eXBlID0gUUxpbmVFZGl0OjpQYXNzd29yZDsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUxJbnB1dEVsZW1lbnQ6OlNFQVJDSDoK
LSAgICAgICAgICAgIHR5cGUgPSBRTGluZUVkaXQ6OlNlYXJjaDsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdHlwZSA9IFFMaW5lRWRpdDo6Tm9ybWFs
OwotICAgIH0KLSAgICBRTGluZUVkaXQqIGVkaXQgPSBuZXcgUUxpbmVFZGl0KHR5cGUpOwotICAg
IGlmICh0eXBlID09IFFMaW5lRWRpdDo6U2VhcmNoKQotICAgICAgICBlZGl0LT5zZXRMaXZlU2Vh
cmNoKGZhbHNlKTsKLSAgICBzZXRXaWRnZXQoZWRpdCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVk
aXQ6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8g
Y2FsbCBvbnNlbGVjdCBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHNlbGVjdGlvbgotICAgIFFMaW5l
RWRpdCogdyA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0KTsKLSAgICBpZiAody0+
aGFzU2VsZWN0ZWRUZXh0KCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnQqPihub2RlKCkpLT5vblNlbGVjdCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0Ojpy
ZXR1cm5QcmVzc2VkKFdpZGdldCopCi17Ci0gICAgLy8gRW1pdCBvbkNoYW5nZSBpZiBuZWNlc3Nh
cnkKLSAgICAvLyBXb3JrcyBidXQgbWlnaHQgbm90IGJlIGVub3VnaCwgZGlyayBzYWlkIGhlIGhh
ZCBhbm90aGVyIHNvbHV0aW9uIGF0Ci0gICAgLy8gaGFuZCAoY2FuJ3QgcmVtZW1iZXIgd2hpY2gp
IC0gRGF2aWQKLSAgICBpZiAoaXNUZXh0RmllbGQoKSAmJiBpc0VkaXRlZCgpKSB7Ci0gICAgICAg
IHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqPihub2RlKCkpLT5vbkNoYW5nZSgp
OwotICAgICAgICBzZXRFZGl0ZWQoZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChIVE1MRm9ybUVs
ZW1lbnQqIGZlID0gc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5vZGUoKSkt
PmZvcm0oKSkKLSAgICAgICAgZmUtPnN1Ym1pdENsaWNrKCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGlu
ZUVkaXQ6OnBlcmZvcm1TZWFyY2goV2lkZ2V0KikKLXsKLSAgICAvLyBGaXJlIHRoZSAic2VhcmNo
IiBET00gZXZlbnQuCi0gICAgc3RhdGljX2Nhc3Q8RXZlbnRUYXJnZXROb2RlKj4obm9kZSgpKS0+
ZGlzcGF0Y2hIVE1MRXZlbnQoc2VhcmNoRXZlbnQsIHRydWUsIGZhbHNlKTsKLX0KLQotdm9pZCBS
ZW5kZXJMaW5lRWRpdDo6YWRkU2VhcmNoUmVzdWx0KCkKLXsKLSAgICBpZiAod2lkZ2V0KCkpCi0g
ICAgICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+YWRkU2VhcmNoUmVzdWx0
KCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAg
S0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkpOwotCi0gICAgLy8gTGV0IHRoZSB3aWRnZXQgdGVs
bCB1cyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgIG1fdXBkYXRpbmcgPSB0cnVlOwotICAg
IGludCBzaXplID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNpemUo
KTsKLSAgICBJbnRTaXplIHMoc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkpLT5zaXpl
Rm9yQ2hhcmFjdGVyV2lkdGgoc2l6ZSA+IDAgPyBzaXplIDogMjApKTsKLSAgICBtX3VwZGF0aW5n
ID0gZmFsc2U7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNldElu
dHJpbnNpY0hlaWdodChzLmhlaWdodCgpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxj
TWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0U3R5bGUoUmVuZGVy
U3R5bGUgKnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotCi0gICAg
UUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkpOwotICAgIHct
PnNldEFsaWdubWVudCh0ZXh0QWxpZ25tZW50KCkpOwotICAgIHctPnNldFdyaXRpbmdEaXJlY3Rp
b24oc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSKTsKLX0KLQotdm9pZCBS
ZW5kZXJMaW5lRWRpdDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIEhUTUxJbnB1dEVsZW1l
bnQqIGUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBRTGlu
ZUVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3aWRnZXQoKSk7Ci0gICAgCi0gICAg
aW50IG1sID0gZS0+bWF4TGVuZ3RoKCk7Ci0gICAgaWYgKG1sIDw9IDAgfHwgbWwgPiAxMDI0KQot
ICAgICAgICBtbCA9IDEwMjQ7Ci0gICAgaWYgKHctPm1heExlbmd0aCgpICE9IG1sKQotICAgICAg
ICB3LT5zZXRNYXhMZW5ndGgobWwpOwotCi0gICAgaWYgKCFlLT52YWx1ZU1hdGNoZXNSZW5kZXJl
cigpKSB7Ci0gICAgICAgIFN0cmluZyB3aWRnZXRUZXh0ID0gdy0+dGV4dCgpOwotICAgICAgICBT
dHJpbmcgbmV3VGV4dCA9IGUtPnZhbHVlKCk7Ci0gICAgICAgIG5ld1RleHQucmVwbGFjZSgnXFwn
LCBiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOwotICAgICAgICBpZiAod2lkZ2V0VGV4dCAh
PSBuZXdUZXh0KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gdy0+Y3Vyc29yUG9zaXRpb24oKTsK
LQotICAgICAgICAgICAgbV91cGRhdGluZyA9IHRydWU7Ci0gICAgICAgICAgICB3LT5zZXRUZXh0
KG5ld1RleHQpOwotICAgICAgICAgICAgbV91cGRhdGluZyA9IGZhbHNlOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICB3LT5zZXRFZGl0ZWQoIGZhbHNlICk7Ci0KLSAgICAgICAgICAgIHctPnNl
dEN1cnNvclBvc2l0aW9uKHBvcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZS0+c2V0VmFsdWVNYXRj
aGVzUmVuZGVyZXIoKTsKLSAgICB9Ci0KLSAgICB3LT5zZXRSZWFkT25seShlLT5pc1JlYWRPbmx5
Q29udHJvbCgpKTsKLSAgICAKLSAgICAvLyBIYW5kbGUgdXBkYXRpbmcgdGhlIHNlYXJjaCBhdHRy
aWJ1dGVzLgotICAgIHctPnNldFBsYWNlaG9sZGVyU3RyaW5nKGUtPmdldEF0dHJpYnV0ZShwbGFj
ZWhvbGRlckF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKSk7Ci0gICAgaWYgKHctPnR5cGUoKSA9PSBR
TGluZUVkaXQ6OlNlYXJjaCkgewotICAgICAgICB3LT5zZXRMaXZlU2VhcmNoKCFlLT5nZXRBdHRy
aWJ1dGUoaW5jcmVtZW50YWxBdHRyKS5pc051bGwoKSk7Ci0gICAgICAgIHctPnNldEF1dG9TYXZl
TmFtZShlLT5nZXRBdHRyaWJ1dGUoYXV0b3NhdmVBdHRyKSk7Ci0gICAgICAgIHctPnNldE1heFJl
c3VsdHMoZS0+bWF4UmVzdWx0cygpKTsKLSAgICB9Ci0KLSAgICB3LT5zZXRDb2xvcnMoc3R5bGUo
KS0+YmFja2dyb3VuZENvbG9yKCksIHN0eWxlKCktPmNvbG9yKCkpOwotCi0gICAgUmVuZGVyRm9y
bUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6
OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX3VwZGF0aW5nKSAvLyBEb24ndCBh
bHRlciB0aGUgdmFsdWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgaW5pdGluZyB0aGUgY29u
dHJvbCwgc2luY2UKLSAgICAgICAgcmV0dXJuOyAgICAgLy8gd2UgYXJlIGdldHRpbmcgdGhlIHZh
bHVlIGZyb20gdGhlIERPTSBhbmQgaXQncyBub3QgdXNlciBpbnB1dC4KLQotICAgIFN0cmluZyBu
ZXdUZXh0ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkpLT50ZXh0KCk7Ci0KLSAg
ICAvLyBBIG51bGwgc3RyaW5nIHZhbHVlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZm9y
bSBjb250cm9sIGhhcyBub3QgYWx0ZXJlZCB0aGUgb3JpZ2luYWwKLSAgICAvLyBkZWZhdWx0IHZh
bHVlLiAgVGhhdCBtZWFucyB0aGF0IHdlIHNob3VsZCBuZXZlciB1c2UgdGhlIG51bGwgc3RyaW5n
IHZhbHVlIHdoZW4gdGhlIHVzZXIKLSAgICAvLyBlbXB0aWVzIGEgdGV4dGZpZWxkLCBidXQgc2hv
dWxkIGFsd2F5cyBmb3JjZSBhbiBlbXB0eSB0ZXh0ZmllbGQgdG8gdXNlIHRoZSBlbXB0eSBzdHJp
bmcuCi0gICAgaWYgKG5ld1RleHQuaXNOdWxsKCkpCi0gICAgICAgIG5ld1RleHQgPSAiIjsKLQot
ICAgIG5ld1RleHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcpOwot
ICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zZXRWYWx1ZUZyb21S
ZW5kZXJlcihuZXdUZXh0KTsKLX0KLQotaW50IFJlbmRlckxpbmVFZGl0OjpzZWxlY3Rpb25TdGFy
dCgpCi17Ci0gICAgUUxpbmVFZGl0ICpsaW5lRWRpdCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCAq
PihtX3dpZGdldCk7Ci0gICAgaW50IHN0YXJ0ID0gbGluZUVkaXQtPnNlbGVjdGlvblN0YXJ0KCk7
Ci0gICAgaWYgKHN0YXJ0ID09IC0xKQotICAgICAgICBzdGFydCA9IGxpbmVFZGl0LT5jdXJzb3JQ
b3NpdGlvbigpOwotICAgIHJldHVybiBzdGFydDsKLX0KLQotaW50IFJlbmRlckxpbmVFZGl0Ojpz
ZWxlY3Rpb25FbmQoKQotewotICAgIFFMaW5lRWRpdCAqbGluZUVkaXQgPSBzdGF0aWNfY2FzdDxR
TGluZUVkaXQgKj4obV93aWRnZXQpOwotICAgIGludCBzdGFydCA9IGxpbmVFZGl0LT5zZWxlY3Rp
b25TdGFydCgpOwotICAgIGlmIChzdGFydCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIGxpbmVFZGl0
LT5jdXJzb3JQb3NpdGlvbigpOwotICAgIHJldHVybiBzdGFydCArIChpbnQpbGluZUVkaXQtPnNl
bGVjdGVkVGV4dCgpLmxlbmd0aCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxl
Y3Rpb25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgaW50IHJlYWxTdGFydCA9IG1heChzdGFydCwg
MCk7Ci0gICAgaW50IGxlbmd0aCA9IG1heChzZWxlY3Rpb25FbmQoKSAtIHJlYWxTdGFydCwgMCk7
Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KS0+c2V0U2VsZWN0aW9uKHJl
YWxTdGFydCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0U2VsZWN0aW9u
RW5kKGludCBlbmQpCi17Ci0gICAgaW50IHN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBp
bnQgcmVhbEVuZCA9IG1heChlbmQsIDApOwotICAgIGludCBsZW5ndGggPSByZWFsRW5kIC0gc3Rh
cnQ7Ci0gICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgICAgc3RhcnQgPSByZWFsRW5kOwotICAg
ICAgICBsZW5ndGggPSAwOwotICAgIH0KLSAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQgKj4obV93
aWRnZXQpLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGlu
ZUVkaXQ6OnNlbGVjdCgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRnZXQp
LT5zZWxlY3RBbGwoKTsKLX0KLQotYm9vbCBSZW5kZXJMaW5lRWRpdDo6aXNFZGl0ZWQoKSBjb25z
dAotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCktPmVkaXRl
ZCgpOwotfQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0RWRpdGVkKGJvb2wgeCkKLXsKLSAgICBz
dGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCktPnNldEVkaXRlZCh4KTsKLX0KLQotdm9p
ZCBSZW5kZXJMaW5lRWRpdDo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQot
ewotICAgIGludCByZWFsU3RhcnQgPSBtYXgoc3RhcnQsIDApOwotICAgIGludCBsZW5ndGggPSBt
YXgoZW5kIC0gcmVhbFN0YXJ0LCAwKTsKLSAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQgKj4obV93
aWRnZXQpLT5zZXRTZWxlY3Rpb24ocmVhbFN0YXJ0LCBsZW5ndGgpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotUmVuZGVyRmllbGRzZXQ6OlJlbmRlckZpZWxkc2V0KEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnQgKmVsZW1lbnQpCi06IFJlbmRlckJsb2NrKGVsZW1lbnQpCi17Ci19Ci0KLVJl
bmRlck9iamVjdCogUmVuZGVyRmllbGRzZXQ6OmxheW91dExlZ2VuZChib29sIHJlbGF5b3V0Q2hp
bGRyZW4pCi17Ci0gICAgUmVuZGVyT2JqZWN0KiBsZWdlbmQgPSBmaW5kTGVnZW5kKCk7Ci0gICAg
aWYgKGxlZ2VuZCkgewotICAgICAgICBpZiAocmVsYXlvdXRDaGlsZHJlbikKLSAgICAgICAgICAg
IGxlZ2VuZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0gICAgICAgIGxlZ2VuZC0+bGF5b3V0SWZO
ZWVkZWQoKTsKLQotICAgICAgICBpbnQgeFBvcyA9IGJvcmRlckxlZnQoKSArIHBhZGRpbmdMZWZ0
KCkgKyBsZWdlbmQtPm1hcmdpbkxlZnQoKTsKLSAgICAgICAgaWYgKHN0eWxlKCktPmRpcmVjdGlv
bigpID09IFJUTCkKLSAgICAgICAgICAgIHhQb3MgPSBtX3dpZHRoIC0gcGFkZGluZ1JpZ2h0KCkg
LSBib3JkZXJSaWdodCgpIC0gbGVnZW5kLT53aWR0aCgpIC0gbGVnZW5kLT5tYXJnaW5SaWdodCgp
OwotICAgICAgICBpbnQgYiA9IGJvcmRlclRvcCgpOwotICAgICAgICBpbnQgaCA9IGxlZ2VuZC0+
aGVpZ2h0KCk7Ci0gICAgICAgIGxlZ2VuZC0+c2V0UG9zKHhQb3MsIG1heCgoYi1oKS8yLCAwKSk7
Ci0gICAgICAgIG1faGVpZ2h0ID0gbWF4KGIsaCkgKyBwYWRkaW5nVG9wKCk7Ci0gICAgfQotICAg
IHJldHVybiBsZWdlbmQ7Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyRmllbGRzZXQ6OmZpbmRM
ZWdlbmQoKQotewotICAgIGZvciAoUmVuZGVyT2JqZWN0KiBsZWdlbmQgPSBmaXJzdENoaWxkKCk7
IGxlZ2VuZDsgbGVnZW5kID0gbGVnZW5kLT5uZXh0U2libGluZygpKSB7Ci0gICAgICBpZiAoIWxl
Z2VuZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpICYmIGxlZ2VuZC0+ZWxlbWVudCgpICYmCi0g
ICAgICAgICAgbGVnZW5kLT5lbGVtZW50KCktPmhhc1RhZ05hbWUobGVnZW5kVGFnKSkKLSAgICAg
ICAgcmV0dXJuIGxlZ2VuZDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUmVuZGVy
RmllbGRzZXQ6OnBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJbmZvJiBpLCBpbnQgX3R4LCBpbnQg
X3R5KQotewotICAgIGludCB3ID0gd2lkdGgoKTsKLSAgICBpbnQgaCA9IGhlaWdodCgpICsgYm9y
ZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBs
ZWdlbmQgPSBmaW5kTGVnZW5kKCk7Ci0gICAgaWYgKCFsZWdlbmQpCi0gICAgICAgIHJldHVybiBS
ZW5kZXJCbG9jazo6cGFpbnRCb3hEZWNvcmF0aW9ucyhpLCBfdHgsIF90eSk7Ci0KLSAgICBpbnQg
eU9mZiA9IChsZWdlbmQtPnlQb3MoKSA+IDApID8gMCA6IChsZWdlbmQtPmhlaWdodCgpLWJvcmRl
clRvcCgpKS8yOwotICAgIGggLT0geU9mZjsKLSAgICBfdHkgKz0geU9mZiAtIGJvcmRlclRvcEV4
dHJhKCk7Ci0KLSAgICBpbnQgbXkgPSBtYXgoX3R5LCBpLnIueSgpKTsKLSAgICBpbnQgZW5kID0g
bWluKGkuci5ib3R0b20oKSwgIF90eSArIGgpOwotICAgIGludCBtaCA9IGVuZCAtIG15OwotCi0g
ICAgcGFpbnRCYWNrZ3JvdW5kKGkucCwgc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCksIHN0eWxl
KCktPmJhY2tncm91bmRMYXllcnMoKSwgbXksIG1oLCBfdHgsIF90eSwgdywgaCk7Ci0KLSAgICBp
ZiAoc3R5bGUoKS0+aGFzQm9yZGVyKCkpCi0gICAgICAgIHBhaW50Qm9yZGVyTWludXNMZWdlbmQo
aS5wLCBfdHgsIF90eSwgdywgaCwgc3R5bGUoKSwgbGVnZW5kLT54UG9zKCksIGxlZ2VuZC0+d2lk
dGgoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRmllbGRzZXQ6OnBhaW50Qm9yZGVyTWludXNMZWdlbmQo
R3JhcGhpY3NDb250ZXh0KiBwLCBpbnQgX3R4LCBpbnQgX3R5LCBpbnQgdywgaW50IGgsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxl
KiBzdHlsZSwgaW50IGx4LCBpbnQgbHcpCi17Ci0KLSAgICBjb25zdCBDb2xvciYgdGMgPSBzdHls
ZS0+Ym9yZGVyVG9wQ29sb3IoKTsKLSAgICBjb25zdCBDb2xvciYgYmMgPSBzdHlsZS0+Ym9yZGVy
Qm90dG9tQ29sb3IoKTsKLQotICAgIEVCb3JkZXJTdHlsZSB0cyA9IHN0eWxlLT5ib3JkZXJUb3BT
dHlsZSgpOwotICAgIEVCb3JkZXJTdHlsZSBicyA9IHN0eWxlLT5ib3JkZXJCb3R0b21TdHlsZSgp
OwotICAgIEVCb3JkZXJTdHlsZSBscyA9IHN0eWxlLT5ib3JkZXJMZWZ0U3R5bGUoKTsKLSAgICBF
Qm9yZGVyU3R5bGUgcnMgPSBzdHlsZS0+Ym9yZGVyUmlnaHRTdHlsZSgpOwotCi0gICAgYm9vbCBy
ZW5kZXJfdCA9IHRzID4gQkhJRERFTjsKLSAgICBib29sIHJlbmRlcl9sID0gbHMgPiBCSElEREVO
OwotICAgIGJvb2wgcmVuZGVyX3IgPSBycyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfYiA9
IGJzID4gQkhJRERFTjsKLQotICAgIGlmKHJlbmRlcl90KSB7Ci0gICAgICAgIGRyYXdCb3JkZXIo
cCwgX3R4LCBfdHksIF90eCArIGx4LCBfdHkgKyAgc3R5bGUtPmJvcmRlclRvcFdpZHRoKCksIEJT
VG9wLCB0Yywgc3R5bGUtPmNvbG9yKCksIHRzLAotICAgICAgICAgICAgICAgICAgIChyZW5kZXJf
bCAmJiAobHMgPT0gRE9UVEVEIHx8IGxzID09IERBU0hFRCB8fCBscyA9PSBET1VCTEUpP3N0eWxl
LT5ib3JkZXJMZWZ0V2lkdGgoKTowKSwgMCk7Ci0gICAgICAgIGRyYXdCb3JkZXIocCwgX3R4K2x4
K2x3LCBfdHksIF90eCArIHcsIF90eSArICBzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwgQlNUb3As
IHRjLCBzdHlsZS0+Y29sb3IoKSwgdHMsCi0gICAgICAgICAgICAgICAgICAgMCwgKHJlbmRlcl9y
ICYmIChycyA9PSBET1RURUQgfHwgcnMgPT0gREFTSEVEIHx8IHJzID09IERPVUJMRSk/c3R5bGUt
PmJvcmRlclJpZ2h0V2lkdGgoKTowKSk7Ci0gICAgfQotCi0gICAgaWYocmVuZGVyX2IpCi0gICAg
ICAgIGRyYXdCb3JkZXIocCwgX3R4LCBfdHkgKyBoIC0gc3R5bGUtPmJvcmRlckJvdHRvbVdpZHRo
KCksIF90eCArIHcsIF90eSArIGgsIEJTQm90dG9tLCBiYywgc3R5bGUtPmNvbG9yKCksIGJzLAot
ICAgICAgICAgICAgICAgICAgIChyZW5kZXJfbCAmJiAobHMgPT0gRE9UVEVEIHx8IGxzID09IERB
U0hFRCB8fCBscyA9PSBET1VCTEUpP3N0eWxlLT5ib3JkZXJMZWZ0V2lkdGgoKTowKSwKLSAgICAg
ICAgICAgICAgICAgICAocmVuZGVyX3IgJiYgKHJzID09IERPVFRFRCB8fCBycyA9PSBEQVNIRUQg
fHwgcnMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpOjApKTsKLQotICAgIGlm
KHJlbmRlcl9sKQotICAgIHsKLSAgICAgICAgY29uc3QgQ29sb3ImIGxjID0gc3R5bGUtPmJvcmRl
ckxlZnRDb2xvcigpOwotCi0gICAgICAgIGJvb2wgaWdub3JlX3RvcCA9Ci0gICAgICAgICAgICAo
dGMgPT0gbGMpICYmCi0gICAgICAgICAgICAobHMgPj0gT1VUU0VUKSAmJgotICAgICAgICAgICAg
KHRzID09IERPVFRFRCB8fCB0cyA9PSBEQVNIRUQgfHwgdHMgPT0gU09MSUQgfHwgdHMgPT0gT1VU
U0VUKTsKLQotICAgICAgICBib29sIGlnbm9yZV9ib3R0b20gPQotICAgICAgICAgICAgKGJjID09
IGxjKSAmJgotICAgICAgICAgICAgKGxzID49IE9VVFNFVCkgJiYKLSAgICAgICAgICAgIChicyA9
PSBET1RURUQgfHwgYnMgPT0gREFTSEVEIHx8IGJzID09IFNPTElEIHx8IGJzID09IElOU0VUKTsK
LQotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCwgX3R5LCBfdHggKyBzdHlsZS0+Ym9yZGVyTGVm
dFdpZHRoKCksIF90eSArIGgsIEJTTGVmdCwgbGMsIHN0eWxlLT5jb2xvcigpLCBscywKLSAgICAg
ICAgICAgICAgICAgICBpZ25vcmVfdG9wPzA6c3R5bGUtPmJvcmRlclRvcFdpZHRoKCksCi0gICAg
ICAgICAgICAgICAgICAgaWdub3JlX2JvdHRvbT8wOnN0eWxlLT5ib3JkZXJCb3R0b21XaWR0aCgp
KTsKLSAgICB9Ci0KLSAgICBpZihyZW5kZXJfcikKLSAgICB7Ci0gICAgICAgIGNvbnN0IENvbG9y
JiByYyA9IHN0eWxlLT5ib3JkZXJSaWdodENvbG9yKCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVf
dG9wID0KLSAgICAgICAgICAgICh0YyA9PSByYykgJiYKLSAgICAgICAgICAgIChycyA+PSBET1RU
RUQgfHwgcnMgPT0gSU5TRVQpICYmCi0gICAgICAgICAgICAodHMgPT0gRE9UVEVEIHx8IHRzID09
IERBU0hFRCB8fCB0cyA9PSBTT0xJRCB8fCB0cyA9PSBPVVRTRVQpOwotCi0gICAgICAgIGJvb2wg
aWdub3JlX2JvdHRvbSA9Ci0gICAgICAgICAgICAoYmMgPT0gcmMpICYmCi0gICAgICAgICAgICAo
cnMgPj0gRE9UVEVEIHx8IHJzID09IElOU0VUKSAmJgotICAgICAgICAgICAgKGJzID09IERPVFRF
RCB8fCBicyA9PSBEQVNIRUQgfHwgYnMgPT0gU09MSUQgfHwgYnMgPT0gSU5TRVQpOwotCi0gICAg
ICAgIGRyYXdCb3JkZXIocCwgX3R4ICsgdyAtIHN0eWxlLT5ib3JkZXJSaWdodFdpZHRoKCksIF90
eSwgX3R4ICsgdywgX3R5ICsgaCwgQlNSaWdodCwgcmMsIHN0eWxlLT5jb2xvcigpLCBycywKLSAg
ICAgICAgICAgICAgICAgICBpZ25vcmVfdG9wPzA6c3R5bGUtPmJvcmRlclRvcFdpZHRoKCksCi0g
ICAgICAgICAgICAgICAgICAgaWdub3JlX2JvdHRvbT8wOnN0eWxlLT5ib3JkZXJCb3R0b21XaWR0
aCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyRmllbGRzZXQ6OnNldFN0eWxlKFJlbmRlclN0
eWxlKiBfc3R5bGUpCi17Ci0gICAgUmVuZGVyQmxvY2s6OnNldFN0eWxlKF9zdHlsZSk7Ci0KLSAg
ICAvLyBXaW5JRSByZW5kZXJzIGZpZWxkc2V0cyB3aXRoIGRpc3BsYXk6aW5saW5lIGxpa2UgdGhl
eSdyZSBpbmxpbmUtYmxvY2tzLiAgRm9yIHVzLAotICAgIC8vIGFuIGlubGluZS1ibG9jayBpcyBq
dXN0IGEgYmxvY2sgZWxlbWVudCB3aXRoIHJlcGxhY2VkIHNldCB0byB0cnVlIGFuZCBpbmxpbmUg
c2V0Ci0gICAgLy8gdG8gdHJ1ZS4gIEVuc3VyZSB0aGF0IGlmIHdlIGVuZGVkIHVwIGJlaW5nIGlu
bGluZSB0aGF0IHdlIHNldCBvdXIgcmVwbGFjZWQgZmxhZwotICAgIC8vIHNvIHRoYXQgd2UncmUg
dHJlYXRlZCBsaWtlIGFuIGlubGluZS1ibG9jay4KLSAgICBpZiAoaXNJbmxpbmUoKSkKLSAgICAg
ICAgc2V0UmVwbGFjZWQodHJ1ZSk7Ci19ICAgIAotICAgIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1SZW5kZXJGaWxlQnV0dG9uOjpSZW5kZXJGaWxlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQgKmVs
ZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotICAgIHNldFdpZGdl
dChuZXcgS1dRRmlsZUJ1dHRvbih2aWV3KCktPmZyYW1lKCkpKTsKLX0KLQotdm9pZCBSZW5kZXJG
aWxlQnV0dG9uOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhL
bm93bigpKTsKLQotICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50
cyB0byBiZS4KLSAgICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihu
b2RlKCkpLT5zaXplKCk7Ci0gICAgSW50U2l6ZSBzKHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24g
Kj4od2lkZ2V0KCkpLT5zaXplRm9yQ2hhcmFjdGVyV2lkdGgoc2l6ZSA+IDAgPyBzaXplIDogMjAp
KTsKLQotICAgIHNldEludHJpbnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2lj
SGVpZ2h0KHMuaGVpZ2h0KCkpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhX
aWR0aCgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OnVwZGF0ZUZyb21FbGVtZW50KCkK
LXsKLSAgICBzdGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uKj4od2lkZ2V0KCkpLT5zZXRGaWxlbmFt
ZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnZhbHVl
KCkuZGVwcmVjYXRlZFN0cmluZygpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVG
cm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OnJldHVyblByZXNzZWQo
V2lkZ2V0KikKLXsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUo
KSktPmZvcm0oKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUo
KSktPmZvcm0oKS0+cHJlcGFyZVN1Ym1pdCgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246
OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihub2RlKCkpLT5zZXRWYWx1ZUZyb21SZW5kZXJlcihzdGF0aWNfY2FzdDxLV1FGaWxlQnV0
dG9uKj4od2lkZ2V0KCkpLT5maWxlbmFtZSgpKTsKLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9u
OjpzZWxlY3QoKQotewotfQotCi0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6Y2xpY2soYm9vbCBz
ZW5kTW91c2VFdmVudHMpCi17Ci0gICAgc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbiAqPih3aWRn
ZXQoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1SZW5kZXJMYWJlbDo6UmVuZGVyTGFiZWwoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxl
bWVudCkKK1JlbmRlclRleHRBcmVhOjpSZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50
KiBlbGVtZW50KQogICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKKyAgICAsIG1fZGly
dHkoZmFsc2UpCisgICAgLCBtX3VwZGF0aW5nKGZhbHNlKQogewotCi19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotUmVuZGVyTGVnZW5kOjpSZW5kZXJMZWdlbmQoSFRNTEdlbmVyaWNGb3JtRWxl
bWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckJsb2NrKGVsZW1lbnQpCi17Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2VsZWN0OjpSZW5kZXJTZWxlY3QoSFRNTFNlbGVjdEVs
ZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotICAg
IG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgbV9tdWx0aXBsZSA9IGVsZW1lbnQt
Pm11bHRpcGxlKCk7Ci0gICAgbV9zaXplID0gZWxlbWVudC0+c2l6ZSgpOwotICAgIG1fdXNlTGlz
dEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotICAgIG1fc2VsZWN0aW9uQ2hhbmdl
ZCA9IHRydWU7Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0KLSAgICBpZiAobV91c2VM
aXN0Qm94KQotICAgICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgpKTsKLSAgICBlbHNlCi0g
ICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVj
dDo6c2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpCi17Ci0gICAgVGV4dERpcmVjdGlvbiBkID0g
c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSOwotICAgIGlmIChtX3VzZUxp
c3RCb3gpCi0gICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94ICo+KG1fd2lkZ2V0KS0+c2V0V3Jp
dGluZ0RpcmVjdGlvbihkKTsKLSAgICBlbHNlCi0gICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0Jv
eCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci19Ci0KLXZvaWQgUmVuZGVy
U2VsZWN0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJGb3JtRWxlbWVu
dDo6c2V0U3R5bGUocyk7Ci0gICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpOwotfQotCi0K
LXZvaWQgUmVuZGVyU2VsZWN0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgbV9pZ25vcmVT
ZWxlY3RFdmVudHMgPSB0cnVlOwotCi0gICAgLy8gY2hhbmdlIHdpZGdldCB0eXBlCi0gICAgYm9v
bCBvbGRNdWx0aXBsZSA9IG1fbXVsdGlwbGU7Ci0gICAgdW5zaWduZWQgb2xkU2l6ZSA9IG1fc2l6
ZTsKLSAgICBib29sIG9sZExpc3Rib3ggPSBtX3VzZUxpc3RCb3g7Ci0KLSAgICBtX211bHRpcGxl
ID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tdWx0aXBsZSgpOwot
ICAgIG1fc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+c2l6
ZSgpOwotICAgIG1fdXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotCi0g
ICAgaWYgKG9sZE11bHRpcGxlICE9IG1fbXVsdGlwbGUgfHwgb2xkU2l6ZSAhPSBtX3NpemUpIHsK
LSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCAhPSBvbGRMaXN0Ym94KSB7Ci0gICAgICAgICAgICAv
LyB0eXBlIG9mIHNlbGVjdCBoYXMgY2hhbmdlZAotICAgICAgICAgICAgZGVsZXRlIG1fd2lkZ2V0
OwotCi0gICAgICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgICAgIHNldFdp
ZGdldChjcmVhdGVMaXN0Qm94KCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLSAgICAgICAgICAgIHNldFdpZGdldFdyaXRpbmdE
aXJlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3VzZUxpc3RCb3ggJiYgb2xk
TXVsdGlwbGUgIT0gbV9tdWx0aXBsZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RC
b3gqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/IFFMaXN0Qm94OjpF
eHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIG1fc2VsZWN0
aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSB0cnVlOwotICAg
IH0KLQotICAgIC8vIHVwZGF0ZSBjb250ZW50cyBsaXN0Ym94L2NvbWJvYm94IGJhc2VkIG9uIG9w
dGlvbnMgaW4gbV9lbGVtZW50Ci0gICAgaWYgKCBtX29wdGlvbnNDaGFuZ2VkICkgewotICAgICAg
ICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX3JlY2FsY0xp
c3RJdGVtcykKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9k
ZSgpKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxl
bWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgp
KS0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsaXN0SW5kZXg7Ci0KLSAgICAgICAgaWYgKG1f
dXNlTGlzdEJveCkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQp
LT5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9C
b3gqPihtX3dpZGdldCktPmNsZWFyKCk7Ci0KLSAgICAgICAgYm9vbCBncm91cEVuYWJsZWQgPSB0
cnVlOwotICAgICAgICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8IGludChsaXN0SXRl
bXMuc2l6ZSgpKTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbbGlz
dEluZGV4XS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAgICAgICAgICBIVE1M
T3B0R3JvdXBFbGVtZW50ICpvcHRncm91cEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0R3Jv
dXBFbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOwotICAgICAgICAgICAgICAgIERlcHJl
Y2F0ZWRTdHJpbmcgbGFiZWwgPSBvcHRncm91cEVsZW1lbnQtPmdldEF0dHJpYnV0ZShsYWJlbEF0
dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsYWJlbC5yZXBsYWNlKCdc
XCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAg
ICAgICAgICAgICAgLy8gSW4gV2luSUUsIGFuIG9wdGdyb3VwIGNhbid0IHN0YXJ0IG9yIGVuZCB3
aXRoIHdoaXRlc3BhY2UgKG90aGVyIHRoYW4gdGhlIGluZGVudAotICAgICAgICAgICAgICAgIC8v
IHdlIGdpdmUgaXQpLiAgV2UgbWF0Y2ggdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICBs
YWJlbCA9IGxhYmVsLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIC8vIFdlIHdh
bnQgdG8gY29sbGFwc2Ugb3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3aWxsIG1hdGNoIG90aGVy
IGJyb3dzZXJzLgotICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc2ltcGxpZnlXaGl0ZVNw
YWNlKCk7Ci0KLSAgICAgICAgICAgICAgICBncm91cEVuYWJsZWQgPSBvcHRncm91cEVsZW1lbnQt
PmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChtX3Vz
ZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93
aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsLCBncm91cEVuYWJsZWQpOwotICAgICAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4o
bV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRh
ZykpIHsKLSAgICAgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCAqb3B0aW9uRWxlbWVudCA9
IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOwot
ICAgICAgICAgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgaXRlbVRleHQ7Ci0gICAgICAgICAgICAg
ICAgaWYgKG9wdGlvbkVsZW1lbnQtPmhhc0F0dHJpYnV0ZShsYWJlbEF0dHIpKQotICAgICAgICAg
ICAgICAgICAgICBpdGVtVGV4dCA9IG9wdGlvbkVsZW1lbnQtPmdldEF0dHJpYnV0ZShsYWJlbEF0
dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIGl0ZW1UZXh0ID0gb3B0aW9uRWxlbWVudC0+dGV4dCgpLmRlcHJlY2F0ZWRTdHJp
bmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpdGVtVGV4dC5yZXBsYWNl
KCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0KLSAgICAgICAgICAgICAgICAv
LyBJbiBXaW5JRSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIGlu
IG9wdGlvbnMuIFdlIG1hdGNoIHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAgICAgICAgaXRlbVRl
eHQgPSBpdGVtVGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgICAgICAvLyBXZSB3
YW50IHRvIGNvbGxhcHNlIG91ciB3aGl0ZXNwYWNlIHRvby4gIFRoaXMgd2lsbCBtYXRjaCBvdGhl
ciBicm93c2Vycy4KLSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IGl0ZW1UZXh0LnNpbXBsaWZ5
V2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsaXN0
SXRlbXNbbGlzdEluZGV4XS0+cGFyZW50Tm9kZSgpLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkK
LSAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQucHJlcGVuZCgiICAgICIpOwotCi0gICAgICAg
ICAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxl
ZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmFw
cGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJs
ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0SXRlbXNbbGlz
dEluZGV4XS0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1fdXNl
TGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93
aWRnZXQpLT5hcHBlbmRTZXBhcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICBLSFRNTEFzc2VydChmYWxzZSk7Ci0gICAgICAgICAgICBtX3Nl
bGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3VzZUxpc3RC
b3gpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+ZG9uZUFw
cGVuZGluZ0l0ZW1zKCk7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7
Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyB1cGRh
dGUgc2VsZWN0aW9uCi0gICAgaWYgKG1fc2VsZWN0aW9uQ2hhbmdlZCkgewotICAgICAgICB1cGRh
dGVTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9IGZhbHNl
OwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLQot
c2hvcnQgUmVuZGVyU2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgaXNSb290
TGluZUJveCApIGNvbnN0Ci17Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkgewotICAgICAgICAvLyBG
SVhNRTogU2hvdWxkIGdldCB0aGUgaGFyZGNvZGVkIGNvbnN0YW50IG9mIDcgYnkgY2FsbGluZyBh
IFFMaXN0Qm94IGZ1bmN0aW9uLAotICAgICAgICAvLyBhcyB3ZSBkbyBmb3Igb3RoZXIgd2lkZ2V0
IGNsYXNzZXMuCi0gICAgICAgIHJldHVybiBSZW5kZXJXaWRnZXQ6OmJhc2VsaW5lUG9zaXRpb24o
IGYsIGlzUm9vdExpbmVCb3ggKSAtIDc7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJGb3JtRWxl
bWVudDo6YmFzZWxpbmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJveCApOwotfQotCi0KLXZvaWQg
UmVuZGVyU2VsZWN0OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCAhbWlu
TWF4S25vd24oKSApOwotCi0gICAgaWYgKG1fb3B0aW9uc0NoYW5nZWQpCi0gICAgICAgIHVwZGF0
ZUZyb21FbGVtZW50KCk7Ci0KLSAgICAvLyAjIyMgdWdseSBIQUNLIEZJWE1FISEhCi0gICAgc2V0
TWluTWF4S25vd24oKTsKLSAgICBsYXlvdXRJZk5lZWRlZCgpOwotICAgIHNldE5lZWRzTGF5b3V0
QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgLy8gIyMjIGVuZCBGSVhNRQotCi0gICAgUmVuZGVyRm9y
bUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlclNlbGVjdDo6bGF5
b3V0KCApCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0gICAgS0hUTUxBc3Nl
cnQobWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyAjIyMgbWFpbnRhaW4gc2VsZWN0aW9uIHByb3Bl
cmx5IGJldHdlZW4gdHlwZS9zaXplIGNoYW5nZXMsIGFuZCB3b3JrCi0gICAgLy8gb3V0IGhvdyB0
byBoYW5kbGUgbXVsdGlzZWxlY3QtPnNpbmdsZXNlbGVjdCAocHJvYmFibHkganVzdCBzZWxlY3QK
LSAgICAvLyBmaXJzdCBzZWxlY3RlZCBvbmUpCi0KLSAgICAvLyBjYWxjdWxhdGUgc2l6ZQotICAg
IGlmKG1fdXNlTGlzdEJveCkgewotICAgICAgICBRTGlzdEJveCogdyA9IHN0YXRpY19jYXN0PFFM
aXN0Qm94Kj4obV93aWRnZXQpOwotCi0KLSAgICAgICAgaW50IHNpemUgPSBtX3NpemU7Ci0gICAg
ICAgIC8vIGNoZWNrIGlmIG11bHRpcGxlIGFuZCBzaXplIHdhcyBub3QgZ2l2ZW4gb3IgaW52YWxp
ZAotICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb2RlciBzZXRzIHNpemUgdG8gbWluKG51bWJlciBv
ZiBlbGVtZW50cywgNCkKLSAgICAgICAgLy8gTmV0c2NhcGUgc2VlbXMgdG8gc2ltcGx5IHNldCBp
dCB0byAibnVtYmVyIG9mIGVsZW1lbnRzIgotICAgICAgICAvLyB0aGUgYXZlcmFnZSBvZiB0aGF0
IGlzIElNSE8gbWluKG51bWJlciBvZiBlbGVtZW50cywgMTApCi0gICAgICAgIC8vIHNvIEkgZGlk
IHRoYXQgOy0pCi0gICAgICAgIGlmKHNpemUgPCAxKQotICAgICAgICAgICAgc2l6ZSA9IG1pbihz
dGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+Y291bnQoKSwgMTBVKTsKLQotICAgICAg
ICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAg
ICAgIEludFNpemUgcyh3LT5zaXplRm9yTnVtYmVyT2ZMaW5lcyhzaXplKSk7Ci0gICAgICAgIHNl
dEludHJpbnNpY1dpZHRoKCBzLndpZHRoKCkgKTsKLSAgICAgICAgc2V0SW50cmluc2ljSGVpZ2h0
KCBzLmhlaWdodCgpICk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBJbnRTaXplIHMobV93
aWRnZXQtPnNpemVIaW50KCkpOwotICAgICAgICBzZXRJbnRyaW5zaWNXaWR0aCggcy53aWR0aCgp
ICk7Ci0gICAgICAgIHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQoKSApOwotICAgIH0KLQot
ICAgIFJlbmRlckZvcm1FbGVtZW50OjpsYXlvdXQoKTsKLQotICAgIC8vIGFuZCBub3cgZGlzYWJs
ZSB0aGUgd2lkZ2V0IGluIGNhc2UgdGhlcmUgaXMgbm8gPG9wdGlvbj4gZ2l2ZW4KLSAgICBEZXBy
ZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2Vs
ZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotCi0gICAgYm9vbCBmb3VuZE9wdGlv
biA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0SXRlbXMuc2l6ZSgp
ICYmICFmb3VuZE9wdGlvbjsgaSsrKQotICAgICAgICBmb3VuZE9wdGlvbiA9IChsaXN0SXRlbXNb
aV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSk7Ci0KLSAgICBtX3dpZGdldC0+c2V0RW5hYmxlZChm
b3VuZE9wdGlvbiAmJiAhIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+
ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp2YWx1ZUNoYW5nZWQoV2lkZ2V0
KikKLXsKLSAgICBpZiAobV9pZ25vcmVTZWxlY3RFdmVudHMpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIEtIVE1MQXNzZXJ0KCFtX3VzZUxpc3RCb3gpOwotCi0gICAgaW50IGluZGV4ID0gc3RhdGlj
X2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpOwotCi0gICAgRGVwcmVj
YXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVj
dEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBp
bmRleCA8IChpbnQpbGlzdEl0ZW1zLnNpemUoKSkgewotICAgICAgICBib29sIGZvdW5kID0gbGlz
dEl0ZW1zW2luZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpOwotICAgICAgICBpZiAoIWZvdW5k
KSB7Ci0gICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBub3Qgc2VsZWN0YWJsZSwgIHdlIG5lZWQg
dG8gZmluZCBhbiBvcHRpb24gZWxlbWVudAotICAgICAgICAgICAgd2hpbGUgKCh1bnNpZ25lZCkg
aW5kZXggPCBsaXN0SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVt
c1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgICAgICBm
b3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4ID49IDApIHsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9u
VGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICAgICAgLS1pbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIGlmICggaW5kZXggIT0g
c3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgpICkKLSAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPnNldEN1cnJlbnRJ
dGVtKCBpbmRleCApOwotCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGlz
dEl0ZW1zLnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhh
c1RhZ05hbWUob3B0aW9uVGFnKSAmJiBpICE9ICh1bnNpZ25lZCBpbnQpIGluZGV4KQotICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KCBsaXN0SXRlbXNb
aV0gKS0+bV9zZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1M
T3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpbmRleF0pLT5tX3NlbGVjdGVkID0gdHJ1ZTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9k
ZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2VsZWN0aW9uQ2hh
bmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX2lnbm9yZVNlbGVjdEV2ZW50cykKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgLy8gZG9uJ3QgdXNlIGxpc3RJdGVtcygpIGhlcmUgYXMgd2UgaGF2ZSB0
byBhdm9pZCByZWNhbGN1bGF0aW9ucyAtIGNoYW5naW5nIHRoZQotICAgIC8vIG9wdGlvbiBsaXN0
IHdpbGwgbWFrZSB1c2UgdXBkYXRlIG9wdGlvbnMgbm90IGluIHRoZSB3YXkgdGhlIHVzZXIgZXhw
ZWN0cyB0aGVtCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0g
c3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX2xpc3RJdGVtczsKLSAg
ICBpbnQgaiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVtcy5jb3Vu
dCgpOyBpKyspIHsKLSAgICAgICAgLy8gZG9uJ3QgdXNlIHNldFNlbGVjdGVkKCkgaGVyZSBiZWNh
dXNlIGl0IHdpbGwgY2F1c2UgdXMgdG8gYmUgY2FsbGVkCi0gICAgICAgIC8vIGFnYWluIHdpdGgg
dXBkYXRlU2VsZWN0aW9uLgotICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9w
dGlvblRhZykpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KCBs
aXN0SXRlbXNbaV0gKQotICAgICAgICAgICAgICAgIC0+bV9zZWxlY3RlZCA9IHN0YXRpY19jYXN0
PFFMaXN0Qm94Kj4oIG1fd2lkZ2V0ICktPmlzU2VsZWN0ZWQoIGogKTsKLSAgICAgICAgaWYgKGxp
c3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFn
TmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICArK2o7Ci0gICAgfQotICAgIHN0YXRpY19j
YXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotCi12b2lk
IFJlbmRlclNlbGVjdDo6c2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBfb3B0aW9uc0NoYW5nZWQpCi17
Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IF9vcHRpb25zQ2hhbmdlZDsKLX0KLQotUUxpc3RCb3gq
IFJlbmRlclNlbGVjdDo6Y3JlYXRlTGlzdEJveCgpCi17Ci0gICAgUUxpc3RCb3ggKmxiID0gbmV3
IFFMaXN0Qm94KCk7Ci0gICAgbGItPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBsZSA/IFFMaXN0
Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgIG1faWdub3JlU2VsZWN0RXZl
bnRzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGxiOwotfQotCi12b2lkIFJlbmRlclNlbGVjdDo6dXBk
YXRlU2VsZWN0aW9uKCkKLXsKLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0
SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVt
cygpOwotICAgIGludCBpOwotICAgIGlmIChtX3VzZUxpc3RCb3gpIHsKLSAgICAgICAgLy8gaWYg
bXVsdGktc2VsZWN0LCB3ZSBzZWxlY3Qgb25seSB0aGUgbmV3IHNlbGVjdGVkIGluZGV4Ci0gICAg
ICAgIFFMaXN0Qm94ICpsaXN0Qm94ID0gc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCk7
Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGludChsaXN0SXRl
bXMuc2l6ZSgpKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0Qm94LT5zZXRTZWxlY3RlZChqLCBs
aXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tp
XSktPnNlbGVjdGVkKCkpOwotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFt
ZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0g
ICAgICAgICAgICAgICAgKytqOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgdW5zaWduZWQgZmly
c3RPcHRpb24gPSBsaXN0SXRlbXMuc2l6ZSgpOwotICAgICAgICBpID0gbGlzdEl0ZW1zLnNpemUo
KTsKLSAgICAgICAgd2hpbGUgKGktLSkKLSAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhh
c1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlmIChmb3VuZCkKLSAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNb
aV0pLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGlj
X2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5zZWxlY3RlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KCBtX3dpZGdldCApLT5z
ZXRDdXJyZW50SXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJzdE9wdGlvbiA9IGk7Ci0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgQVNTRVJUKGZpcnN0T3B0aW9uID09IGxpc3RJdGVtcy5zaXplKCkg
fHwgZm91bmQpOwotICAgIH0KLQotICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlOwotfQot
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRl
clRleHRBcmVhOjpSZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVtZW50ICplbGVtZW50KQot
ICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCksIG1fZGlydHkoZmFsc2UpLCBtX3VwZGF0
aW5nKGZhbHNlKQotewotICAgIFFUZXh0RWRpdCAqZWRpdCA9IG5ldyBRVGV4dEVkaXQodmlldygp
KTsKKyAgICBRVGV4dEVkaXQqIGVkaXQgPSBuZXcgUVRleHRFZGl0KHZpZXcoKSk7CiAKICAgICBp
ZiAoZWxlbWVudC0+d3JhcCgpICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKICAg
ICAgICAgZWRpdC0+c2V0V29yZFdyYXAoUVRleHRFZGl0OjpXaWRnZXRXaWR0aCk7CkBAIC05MzYs
MjAgKzU1LDIwIEBAIHZvaWQgUmVuZGVyVGV4dEFyZWE6OmRlc3Ryb3koKQogCiB2b2lkIFJlbmRl
clRleHRBcmVhOjpjYWxjTWluTWF4V2lkdGgoKQogewotICAgIEtIVE1MQXNzZXJ0KCAhbWluTWF4
S25vd24oKSApOworICAgIEFTU0VSVCghbWluTWF4S25vd24oKSk7CiAKICAgICBRVGV4dEVkaXQq
IHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7CiAgICAgSW50U2l6ZSBzaXpl
KHctPnNpemVXaXRoQ29sdW1uc0FuZFJvd3MoCiAgICAgICAgIG1heChzdGF0aWNfY2FzdDxIVE1M
VGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+Y29scygpLCAxKSwKICAgICAgICAgbWF4KHN0YXRp
Y19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5yb3dzKCksIDEpKSk7CiAKLSAg
ICBzZXRJbnRyaW5zaWNXaWR0aCggc2l6ZS53aWR0aCgpICk7Ci0gICAgc2V0SW50cmluc2ljSGVp
Z2h0KCBzaXplLmhlaWdodCgpICk7CisgICAgc2V0SW50cmluc2ljV2lkdGgoc2l6ZS53aWR0aCgp
KTsKKyAgICBzZXRJbnRyaW5zaWNIZWlnaHQoc2l6ZS5oZWlnaHQoKSk7CiAKICAgICBSZW5kZXJG
b3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7CiB9CiAKLXZvaWQgUmVuZGVyVGV4dEFyZWE6
OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQordm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U3R5bGUo
UmVuZGVyU3R5bGUqIHMpCiB7CiAgICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwog
CkBAIC0xMDMzLDM2ICsxNTIsMzYgQEAgdm9pZCBSZW5kZXJUZXh0QXJlYTo6dmFsdWVDaGFuZ2Vk
KFdpZGdldAogCiBpbnQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdGlvblN0YXJ0KCkKIHsKLSAgICBR
VGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsK
KyAgICBRVGV4dEVkaXQqIHRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRn
ZXQpOwogICAgIHJldHVybiB0ZXh0RWRpdC0+c2VsZWN0aW9uU3RhcnQoKTsKIH0KIAogaW50IFJl
bmRlclRleHRBcmVhOjpzZWxlY3Rpb25FbmQoKQogewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQg
PSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOworICAgIFFUZXh0RWRpdCogdGV4
dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7CiAgICAgcmV0dXJuIHRl
eHRFZGl0LT5zZWxlY3Rpb25FbmQoKTsKIH0KIAogdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2Vs
ZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQogewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0
aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOworICAgIFFUZXh0RWRpdCogdGV4dEVkaXQg
PSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7CiAgICAgdGV4dEVkaXQtPnNldFNl
bGVjdGlvblN0YXJ0KHN0YXJ0KTsKIH0KIAogdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0
aW9uRW5kKGludCBlbmQpCiB7Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0
PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7CisgICAgUVRleHRFZGl0KiB0ZXh0RWRpdCA9IHN0YXRp
Y19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKICAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9u
RW5kKGVuZCk7CiB9CiAKIHZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdCgpCiB7Ci0gICAgc3Rh
dGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KS0+c2VsZWN0QWxsKCk7CisgICAgc3RhdGlj
X2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpLT5zZWxlY3RBbGwoKTsKIH0KIAogdm9pZCBSZW5k
ZXJUZXh0QXJlYTo6c2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQogewotICAg
IFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQp
OworICAgIFFUZXh0RWRpdCogdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dp
ZGdldCk7CiAgICAgdGV4dEVkaXQtPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQtc3RhcnQp
OwogfQogCkBAIC0xMDc3LDc3ICsxOTYsNCBAQCB2b2lkIFJlbmRlclRleHRBcmVhOjpzZWxlY3Rp
b25DaGFuZ2VkKFdpCiAgICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUo
KSktPm9uU2VsZWN0KCk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJTbGlk
ZXI6OlJlbmRlclNsaWRlcihIVE1MSW5wdXRFbGVtZW50KiBlbGVtZW50KQotICAgIDogUmVuZGVy
Rm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBzZXRXaWRnZXQobmV3IFFTbGlkZXIpOwotfQot
Ci12b2lkIFJlbmRlclNsaWRlcjo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2Vy
dCghbWluTWF4S25vd24oKSk7Ci0gICAgCi0gICAgLy8gTGV0IHRoZSB3aWRnZXQgdGVsbCB1cyBo
b3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgIEludFNpemUgcyh3aWRnZXQoKS0+c2l6ZUhpbnQo
KSk7Ci0gICAgYm9vbCB3aWR0aFNldCA9ICFzdHlsZSgpLT53aWR0aCgpLmlzQXV0bygpOwotICAg
IGJvb2wgaGVpZ2h0U2V0ID0gIXN0eWxlKCktPmhlaWdodCgpLmlzQXV0bygpOwotICAgIGlmICho
ZWlnaHRTZXQgJiYgIXdpZHRoU2V0KSB7Ci0gICAgICAgIC8vIEZsaXAgdGhlIGludHJpbnNpYyBk
aW1lbnNpb25zLgotICAgICAgICBpbnQgYmFyTGVuZ3RoID0gcy53aWR0aCgpOwotICAgICAgICBz
ID0gSW50U2l6ZShzLmhlaWdodCgpLCBiYXJMZW5ndGgpOwotICAgIH0KLSAgICBzZXRJbnRyaW5z
aWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNldEludHJpbnNpY0hlaWdodChzLmhlaWdodCgpKTsK
LSAgICAKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZv
aWQgUmVuZGVyU2xpZGVyOjp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgU3RyaW5nIHZhbHVl
ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnZhbHVlKCk7Ci0gICAg
Y29uc3QgQXRvbWljU3RyaW5nJiBtaW5TdHIgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKG1pbkF0dHIpOwotICAgIGNvbnN0IEF0b21pY1N0cmlu
ZyYgbWF4U3RyID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0
dHJpYnV0ZShtYXhBdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWNpc2lvbiA9IHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUocHJlY2lz
aW9uQXR0cik7Ci0gICAgCi0gICAgZG91YmxlIG1pblZhbCA9IG1pblN0ci5pc051bGwoKSA/IDAu
MCA6IG1pblN0ci5kZXByZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICBkb3VibGUgbWF4
VmFsID0gbWF4U3RyLmlzTnVsbCgpID8gMTAwLjAgOiBtYXhTdHIuZGVwcmVjYXRlZFN0cmluZygp
LnRvRG91YmxlKCk7Ci0gICAgbWluVmFsID0gbWluKG1pblZhbCwgbWF4VmFsKTsgLy8gTWFrZSBz
dXJlIHRoZSByYW5nZSBpcyBzYW5lLgotICAgIAotICAgIGRvdWJsZSB2YWwgPSB2YWx1ZS5pc051
bGwoKSA/IChtYXhWYWwgKyBtaW5WYWwpLzIuMCA6IHZhbHVlLmRlcHJlY2F0ZWRTdHJpbmcoKS50
b0RvdWJsZSgpOwotICAgIHZhbCA9IG1heChtaW5WYWwsIG1pbih2YWwsIG1heFZhbCkpOyAvLyBN
YWtlIHN1cmUgdmFsIGlzIHdpdGhpbiBtaW4vbWF4LgotICAgIAotICAgIC8vIEZvcmNlIGludGVn
ZXIgdmFsdWUgaWYgbm90IGZsb2F0LgotICAgIGlmICghZXF1YWxJZ25vcmluZ0Nhc2UocHJlY2lz
aW9uLCAiZmxvYXQiKSkKLSAgICAgICAgdmFsID0gKGludCkodmFsICsgMC41KTsKLQotICAgIHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zZXRWYWx1ZShTdHJpbmc6Om51
bWJlcih2YWwpKTsKLQotICAgIFFTbGlkZXIqIHNsaWRlciA9IChRU2xpZGVyKil3aWRnZXQoKTsK
LSAgICAgCi0gICAgc2xpZGVyLT5zZXRNaW5WYWx1ZShtaW5WYWwpOwotICAgIHNsaWRlci0+c2V0
TWF4VmFsdWUobWF4VmFsKTsKLSAgICBzbGlkZXItPnNldFZhbHVlKHZhbCk7Ci0KLSAgICBSZW5k
ZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotdm9pZCBSZW5kZXJTbGlk
ZXI6OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIFFTbGlkZXIqIHNsaWRlciA9IHN0YXRp
Y19jYXN0PFFTbGlkZXIqPih3aWRnZXQoKSk7Ci0KLSAgICBkb3VibGUgdmFsID0gc2xpZGVyLT52
YWx1ZSgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlY2lzaW9uID0gc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShwcmVjaXNpb25BdHRyKTsK
LQotICAgIC8vIEZvcmNlIGludGVnZXIgdmFsdWUgaWYgbm90IGZsb2F0LgotICAgIGlmICghZXF1
YWxJZ25vcmluZ0Nhc2UocHJlY2lzaW9uLCAiZmxvYXQiKSkKLSAgICAgICAgdmFsID0gKGludCko
dmFsICsgMC41KTsKLQotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
LT5zZXRWYWx1ZShTdHJpbmc6Om51bWJlcih2YWwpKTsKLSAgICAKLSAgICAvLyBGaXJlIHRoZSAi
aW5wdXQiIERPTSBldmVudC4KLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9k
ZSgpKS0+ZGlzcGF0Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi19
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJM
YWJlbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGFiZWwuY3Bw
CShyZXZpc2lvbiAxNDM0MikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxhYmVsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjQsMTEzMCArMjQsMTMgQEAKICAqLwogCiAjaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaW5jbHVkZSAicmVuZGVyX2Zvcm0uaCIKLQotI2luY2x1ZGUgIkJyb3dzZXJFeHRl
bnNpb24uaCIKLSNpbmNsdWRlICJFdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
Ci0jaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVu
dC5oIgotI2luY2x1ZGUgIkhUTUxPcHRHcm91cEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0
aW9uRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxTZWxlY3RFbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTFRleHRBcmVhRWxlbWVudC5oIgotI2luY2x1ZGUgIktXUUNvbWJvQm94LmgiCi0jaW5jbHVk
ZSAiS1dRRmlsZUJ1dHRvbi5oIgotI2luY2x1ZGUgIktXUUxpbmVFZGl0LmgiCi0jaW5jbHVkZSAi
S1dRU2xpZGVyLmgiCi0jaW5jbHVkZSAiS1dRVGV4dEVkaXQuaCIKLSNpbmNsdWRlICJQbGF0Zm9y
bU1vdXNlRXZlbnQuaCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLQotdXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKyNpbmNsdWRlICJSZW5kZXJMYWJlbC5oIgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwotdXNpbmcgbmFtZXNwYWNlIEhUTUxO
YW1lczsKLQotUmVuZGVyRm9ybUVsZW1lbnQ6OlJlbmRlckZvcm1FbGVtZW50KEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJXaWRnZXQoZWxlbWVudCkKLXsKLSAg
ICBzZXRJbmxpbmUodHJ1ZSk7Ci19Ci0KLVJlbmRlckZvcm1FbGVtZW50Ojp+UmVuZGVyRm9ybUVs
ZW1lbnQoKQotewotfQotCi1zaG9ydCBSZW5kZXJGb3JtRWxlbWVudDo6YmFzZWxpbmVQb3NpdGlv
biggYm9vbCBmLCBib29sIGlzUm9vdExpbmVCb3ggKSBjb25zdAotewotICAgIHJldHVybiBtYXJn
aW5Ub3AoKSArIHdpZGdldCgpLT5iYXNlbGluZVBvc2l0aW9uKG1faGVpZ2h0KTsKLX0KLQotdm9p
ZCBSZW5kZXJGb3JtRWxlbWVudDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUqIHMpCi17Ci0gICAgaWYg
KGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkpCi0gICAgICAgIGFkZEludHJpbnNpY01hcmdpbnNJ
ZkFsbG93ZWQocyk7Ci0KLSAgICBSZW5kZXJXaWRnZXQ6OnNldFN0eWxlKHMpOwotCi0gICAgLy8g
RG8gbm90IHBhaW50IGEgYmFja2dyb3VuZCBvciBib3JkZXIgZm9yIEFxdWEgZm9ybSBlbGVtZW50
cwotICAgIHNldFNob3VsZFBhaW50QmFja2dyb3VuZE9yQm9yZGVyKGZhbHNlKTsKLQotICAgIG1f
d2lkZ2V0LT5zZXRGb250KHN0eWxlKCktPmZvbnQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVs
ZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBtX3dpZGdldC0+c2V0RW5hYmxlZCgh
c3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5vZGUoKSktPmRpc2FibGVkKCkp
OwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpsYXlvdXQoKQotewotICAgIEtIVE1MQXNz
ZXJ0KCBuZWVkc0xheW91dCgpICk7Ci0gICAgS0hUTUxBc3NlcnQoIG1pbk1heEtub3duKCkgKTsK
LQotICAgIC8vIG1pbmltdW0gaGVpZ2h0Ci0gICAgbV9oZWlnaHQgPSAwOwotCi0gICAgY2FsY1dp
ZHRoKCk7Ci0gICAgY2FsY0hlaWdodCgpOwotICAgIAotICAgIHNldE5lZWRzTGF5b3V0KGZhbHNl
KTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6Y2xpY2tlZChXaWRnZXQqKQotewotICAg
IFJlbmRlckFyZW5hKiBhcmVuYSA9IHJlZigpOwotICAgIFBsYXRmb3JtTW91c2VFdmVudCBldmVu
dDsgLy8gZ2V0cyAiY3VycmVudCBldmVudCIKLSAgICBpZiAobm9kZSgpKQotICAgICAgICBzdGF0
aWNfY2FzdDxFdmVudFRhcmdldE5vZGUqPihub2RlKCkpLT5kaXNwYXRjaE1vdXNlRXZlbnQoZXZl
bnQsIGNsaWNrRXZlbnQsIGV2ZW50LmNsaWNrQ291bnQoKSk7Ci0gICAgZGVyZWYoYXJlbmEpOwot
fQotCi1Ib3Jpem9udGFsQWxpZ25tZW50IFJlbmRlckZvcm1FbGVtZW50Ojp0ZXh0QWxpZ25tZW50
KCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKHN0eWxlKCktPnRleHRBbGlnbigpKSB7Ci0gICAgICAg
IGNhc2UgTEVGVDoKLSAgICAgICAgY2FzZSBLSFRNTF9MRUZUOgotICAgICAgICAgICAgcmV0dXJu
IEFsaWduTGVmdDsKLSAgICAgICAgY2FzZSBSSUdIVDoKLSAgICAgICAgY2FzZSBLSFRNTF9SSUdI
VDoKLSAgICAgICAgICAgIHJldHVybiBBbGlnblJpZ2h0OwotICAgICAgICBjYXNlIENFTlRFUjoK
LSAgICAgICAgY2FzZSBLSFRNTF9DRU5URVI6Ci0gICAgICAgICAgICByZXR1cm4gQWxpZ25IQ2Vu
dGVyOwotICAgICAgICBjYXNlIEpVU1RJRlk6Ci0gICAgICAgICAgICAvLyBKdXN0IGZhbGwgaW50
byB0aGUgYXV0byBjb2RlIGZvciBqdXN0aWZ5LgotICAgICAgICBjYXNlIFRBQVVUTzoKLSAgICAg
ICAgICAgIHJldHVybiBzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwgPyBBbGlnblJpZ2h0IDog
QWxpZ25MZWZ0OwotICAgIH0KLSAgICBBU1NFUlQoZmFsc2UpOyAvLyBTaG91bGQgbmV2ZXIgYmUg
cmVhY2hlZC4KLSAgICByZXR1cm4gQWxpZ25MZWZ0OwotfQotCi0KLXZvaWQgUmVuZGVyRm9ybUVs
ZW1lbnQ6OmFkZEludHJpbnNpY01hcmdpbnNJZkFsbG93ZWQoUmVuZGVyU3R5bGUqIF9zdHlsZSkK
LXsKLSAgICAvLyBDdXQgb3V0IHRoZSBpbnRyaW5zaWMgbWFyZ2lucyBjb21wbGV0ZWx5IGlmIHdl
IGVuZCB1cCB1c2luZyBtaW5pIGNvbnRyb2xzLgotICAgIGlmIChfc3R5bGUtPmZvbnRTaXplKCkg
PCAxMSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9o
ZWlnaHQgYWxvbmUgYW5kIG5vdCBhbHNvIGRlYWxpbmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRo
IGlzIGZsYXdlZC4KLSAgICBpbnQgbSA9IGludHJpbnNpY01hcmdpbigpOwotICAgIGlmIChfc3R5
bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkgewotICAgICAgICBpZiAoX3N0eWxlLT5t
YXJnaW5MZWZ0KCkucXVpcmsoKSkKLSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luTGVmdChM
ZW5ndGgobSwgRml4ZWQpKTsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luUmlnaHQoKS5xdWly
aygpKQotICAgICAgICAgICAgX3N0eWxlLT5zZXRNYXJnaW5SaWdodChMZW5ndGgobSwgRml4ZWQp
KTsKLSAgICB9Ci0KLSAgICBpZiAoX3N0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgewotICAgICAg
ICBpZiAoX3N0eWxlLT5tYXJnaW5Ub3AoKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0eWxlLT5z
ZXRNYXJnaW5Ub3AoTGVuZ3RoKG0sIEZpeGVkKSk7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdp
bkJvdHRvbSgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpbkJvdHRvbShM
ZW5ndGgobSwgRml4ZWQpKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotUmVuZGVySW1hZ2VCdXR0b246OlJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQg
KmVsZW1lbnQpCi0gICAgOiBSZW5kZXJJbWFnZShlbGVtZW50KQotewotICAgIC8vICMjIyBzdXBw
b3J0IERPTUFjdGl2YXRlIGV2ZW50IHdoZW4gY2xpY2tlZAotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyTGluZUVkaXQ6
OlJlbmRlckxpbmVFZGl0KEhUTUxJbnB1dEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJG
b3JtRWxlbWVudChlbGVtZW50KSwgbV91cGRhdGluZyhmYWxzZSkKLXsKLSAgICBRTGluZUVkaXQ6
OlR5cGUgdHlwZTsKLSAgICBzd2l0Y2ggKGVsZW1lbnQtPmlucHV0VHlwZSgpKSB7Ci0gICAgICAg
IGNhc2UgSFRNTElucHV0RWxlbWVudDo6UEFTU1dPUkQ6Ci0gICAgICAgICAgICB0eXBlID0gUUxp
bmVFZGl0OjpQYXNzd29yZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUxJ
bnB1dEVsZW1lbnQ6OlNFQVJDSDoKLSAgICAgICAgICAgIHR5cGUgPSBRTGluZUVkaXQ6OlNlYXJj
aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdHlw
ZSA9IFFMaW5lRWRpdDo6Tm9ybWFsOwotICAgIH0KLSAgICBRTGluZUVkaXQqIGVkaXQgPSBuZXcg
UUxpbmVFZGl0KHR5cGUpOwotICAgIGlmICh0eXBlID09IFFMaW5lRWRpdDo6U2VhcmNoKQotICAg
ICAgICBlZGl0LT5zZXRMaXZlU2VhcmNoKGZhbHNlKTsKLSAgICBzZXRXaWRnZXQoZWRpdCk7Ci19
Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0KikKLXsKLSAg
ICAvLyBXZSBvbmx5IHdhbnQgdG8gY2FsbCBvbnNlbGVjdCBpZiB0aGVyZSBhY3R1YWxseSBpcyBh
IHNlbGVjdGlvbgotICAgIFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1f
d2lkZ2V0KTsKLSAgICBpZiAody0+aGFzU2VsZWN0ZWRUZXh0KCkpCi0gICAgICAgIHN0YXRpY19j
YXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqPihub2RlKCkpLT5vblNlbGVjdCgpOwotfQotCi12
b2lkIFJlbmRlckxpbmVFZGl0OjpyZXR1cm5QcmVzc2VkKFdpZGdldCopCi17Ci0gICAgLy8gRW1p
dCBvbkNoYW5nZSBpZiBuZWNlc3NhcnkKLSAgICAvLyBXb3JrcyBidXQgbWlnaHQgbm90IGJlIGVu
b3VnaCwgZGlyayBzYWlkIGhlIGhhZCBhbm90aGVyIHNvbHV0aW9uIGF0Ci0gICAgLy8gaGFuZCAo
Y2FuJ3QgcmVtZW1iZXIgd2hpY2gpIC0gRGF2aWQKLSAgICBpZiAoaXNUZXh0RmllbGQoKSAmJiBp
c0VkaXRlZCgpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQq
Pihub2RlKCkpLT5vbkNoYW5nZSgpOwotICAgICAgICBzZXRFZGl0ZWQoZmFsc2UpOwotICAgIH0K
LQotICAgIGlmIChIVE1MRm9ybUVsZW1lbnQqIGZlID0gc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNG
b3JtRWxlbWVudCo+KG5vZGUoKSktPmZvcm0oKSkKLSAgICAgICAgZmUtPnN1Ym1pdENsaWNrKCk7
Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnBlcmZvcm1TZWFyY2goV2lkZ2V0KikKLXsKLSAg
ICAvLyBGaXJlIHRoZSAic2VhcmNoIiBET00gZXZlbnQuCi0gICAgc3RhdGljX2Nhc3Q8RXZlbnRU
YXJnZXROb2RlKj4obm9kZSgpKS0+ZGlzcGF0Y2hIVE1MRXZlbnQoc2VhcmNoRXZlbnQsIHRydWUs
IGZhbHNlKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6YWRkU2VhcmNoUmVzdWx0KCkKLXsK
LSAgICBpZiAod2lkZ2V0KCkpCi0gICAgICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdl
dCgpKS0+YWRkU2VhcmNoUmVzdWx0KCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OmNhbGNN
aW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkpOwotCi0gICAg
Ly8gTGV0IHRoZSB3aWRnZXQgdGVsbCB1cyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgIG1f
dXBkYXRpbmcgPSB0cnVlOwotICAgIGludCBzaXplID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KG5vZGUoKSktPnNpemUoKTsKLSAgICBJbnRTaXplIHMoc3RhdGljX2Nhc3Q8UUxpbmVF
ZGl0Kj4od2lkZ2V0KCkpLT5zaXplRm9yQ2hhcmFjdGVyV2lkdGgoc2l6ZSA+IDAgPyBzaXplIDog
MjApKTsKLSAgICBtX3VwZGF0aW5nID0gZmFsc2U7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aChz
LndpZHRoKCkpOwotICAgIHNldEludHJpbnNpY0hlaWdodChzLmhlaWdodCgpKTsKLQotICAgIFJl
bmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5l
RWRpdDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUgKnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6
OnNldFN0eWxlKHMpOwotCi0gICAgUUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0
Kj4od2lkZ2V0KCkpOwotICAgIHctPnNldEFsaWdubWVudCh0ZXh0QWxpZ25tZW50KCkpOwotICAg
IHctPnNldFdyaXRpbmdEaXJlY3Rpb24oc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRM
IDogTFRSKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6dXBkYXRlRnJvbUVsZW1lbnQoKQot
ewotICAgIEhUTUxJbnB1dEVsZW1lbnQqIGUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
Kj4obm9kZSgpKTsKLSAgICBRTGluZUVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3
aWRnZXQoKSk7Ci0gICAgCi0gICAgaW50IG1sID0gZS0+bWF4TGVuZ3RoKCk7Ci0gICAgaWYgKG1s
IDw9IDAgfHwgbWwgPiAxMDI0KQotICAgICAgICBtbCA9IDEwMjQ7Ci0gICAgaWYgKHctPm1heExl
bmd0aCgpICE9IG1sKQotICAgICAgICB3LT5zZXRNYXhMZW5ndGgobWwpOwotCi0gICAgaWYgKCFl
LT52YWx1ZU1hdGNoZXNSZW5kZXJlcigpKSB7Ci0gICAgICAgIFN0cmluZyB3aWRnZXRUZXh0ID0g
dy0+dGV4dCgpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGUtPnZhbHVlKCk7Ci0gICAgICAg
IG5ld1RleHQucmVwbGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOwotICAg
ICAgICBpZiAod2lkZ2V0VGV4dCAhPSBuZXdUZXh0KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0g
dy0+Y3Vyc29yUG9zaXRpb24oKTsKLQotICAgICAgICAgICAgbV91cGRhdGluZyA9IHRydWU7Ci0g
ICAgICAgICAgICB3LT5zZXRUZXh0KG5ld1RleHQpOwotICAgICAgICAgICAgbV91cGRhdGluZyA9
IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3LT5zZXRFZGl0ZWQoIGZhbHNlICk7
Ci0KLSAgICAgICAgICAgIHctPnNldEN1cnNvclBvc2l0aW9uKHBvcyk7Ci0gICAgICAgIH0KLSAg
ICAgICAgZS0+c2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKTsKLSAgICB9Ci0KLSAgICB3LT5zZXRS
ZWFkT25seShlLT5pc1JlYWRPbmx5Q29udHJvbCgpKTsKLSAgICAKLSAgICAvLyBIYW5kbGUgdXBk
YXRpbmcgdGhlIHNlYXJjaCBhdHRyaWJ1dGVzLgotICAgIHctPnNldFBsYWNlaG9sZGVyU3RyaW5n
KGUtPmdldEF0dHJpYnV0ZShwbGFjZWhvbGRlckF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKSk7Ci0g
ICAgaWYgKHctPnR5cGUoKSA9PSBRTGluZUVkaXQ6OlNlYXJjaCkgewotICAgICAgICB3LT5zZXRM
aXZlU2VhcmNoKCFlLT5nZXRBdHRyaWJ1dGUoaW5jcmVtZW50YWxBdHRyKS5pc051bGwoKSk7Ci0g
ICAgICAgIHctPnNldEF1dG9TYXZlTmFtZShlLT5nZXRBdHRyaWJ1dGUoYXV0b3NhdmVBdHRyKSk7
Ci0gICAgICAgIHctPnNldE1heFJlc3VsdHMoZS0+bWF4UmVzdWx0cygpKTsKLSAgICB9Ci0KLSAg
ICB3LT5zZXRDb2xvcnMoc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCksIHN0eWxlKCktPmNvbG9y
KCkpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0K
LXZvaWQgUmVuZGVyTGluZUVkaXQ6OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmICht
X3VwZGF0aW5nKSAvLyBEb24ndCBhbHRlciB0aGUgdmFsdWUgaWYgd2UgYXJlIGluIHRoZSBtaWRk
bGUgb2YgaW5pdGluZyB0aGUgY29udHJvbCwgc2luY2UKLSAgICAgICAgcmV0dXJuOyAgICAgLy8g
d2UgYXJlIGdldHRpbmcgdGhlIHZhbHVlIGZyb20gdGhlIERPTSBhbmQgaXQncyBub3QgdXNlciBp
bnB1dC4KLQotICAgIFN0cmluZyBuZXdUZXh0ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lk
Z2V0KCkpLT50ZXh0KCk7Ci0KLSAgICAvLyBBIG51bGwgc3RyaW5nIHZhbHVlIGlzIHVzZWQgdG8g
aW5kaWNhdGUgdGhhdCB0aGUgZm9ybSBjb250cm9sIGhhcyBub3QgYWx0ZXJlZCB0aGUgb3JpZ2lu
YWwKLSAgICAvLyBkZWZhdWx0IHZhbHVlLiAgVGhhdCBtZWFucyB0aGF0IHdlIHNob3VsZCBuZXZl
ciB1c2UgdGhlIG51bGwgc3RyaW5nIHZhbHVlIHdoZW4gdGhlIHVzZXIKLSAgICAvLyBlbXB0aWVz
IGEgdGV4dGZpZWxkLCBidXQgc2hvdWxkIGFsd2F5cyBmb3JjZSBhbiBlbXB0eSB0ZXh0ZmllbGQg
dG8gdXNlIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgaWYgKG5ld1RleHQuaXNOdWxsKCkpCi0gICAg
ICAgIG5ld1RleHQgPSAiIjsKLQotICAgIG5ld1RleHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJl
bmN5U3ltYm9sKCksICdcXCcpOwotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihu
b2RlKCkpLT5zZXRWYWx1ZUZyb21SZW5kZXJlcihuZXdUZXh0KTsKLX0KLQotaW50IFJlbmRlckxp
bmVFZGl0OjpzZWxlY3Rpb25TdGFydCgpCi17Ci0gICAgUUxpbmVFZGl0ICpsaW5lRWRpdCA9IHN0
YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCk7Ci0gICAgaW50IHN0YXJ0ID0gbGluZUVk
aXQtPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaWYgKHN0YXJ0ID09IC0xKQotICAgICAgICBzdGFy
dCA9IGxpbmVFZGl0LT5jdXJzb3JQb3NpdGlvbigpOwotICAgIHJldHVybiBzdGFydDsKLX0KLQot
aW50IFJlbmRlckxpbmVFZGl0OjpzZWxlY3Rpb25FbmQoKQotewotICAgIFFMaW5lRWRpdCAqbGlu
ZUVkaXQgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQgKj4obV93aWRnZXQpOwotICAgIGludCBzdGFy
dCA9IGxpbmVFZGl0LT5zZWxlY3Rpb25TdGFydCgpOwotICAgIGlmIChzdGFydCA9PSAtMSkKLSAg
ICAgICAgcmV0dXJuIGxpbmVFZGl0LT5jdXJzb3JQb3NpdGlvbigpOwotICAgIHJldHVybiBzdGFy
dCArIChpbnQpbGluZUVkaXQtPnNlbGVjdGVkVGV4dCgpLmxlbmd0aCgpOwotfQotCi12b2lkIFJl
bmRlckxpbmVFZGl0OjpzZXRTZWxlY3Rpb25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgaW50IHJl
YWxTdGFydCA9IG1heChzdGFydCwgMCk7Ci0gICAgaW50IGxlbmd0aCA9IG1heChzZWxlY3Rpb25F
bmQoKSAtIHJlYWxTdGFydCwgMCk7Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lk
Z2V0KS0+c2V0U2VsZWN0aW9uKHJlYWxTdGFydCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBSZW5kZXJM
aW5lRWRpdDo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17Ci0gICAgaW50IHN0YXJ0ID0gc2Vs
ZWN0aW9uU3RhcnQoKTsKLSAgICBpbnQgcmVhbEVuZCA9IG1heChlbmQsIDApOwotICAgIGludCBs
ZW5ndGggPSByZWFsRW5kIC0gc3RhcnQ7Ci0gICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgICAg
c3RhcnQgPSByZWFsRW5kOwotICAgICAgICBsZW5ndGggPSAwOwotICAgIH0KLSAgICBzdGF0aWNf
Y2FzdDxRTGluZUVkaXQgKj4obV93aWRnZXQpLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGxlbmd0aCk7
Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdCgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8
UUxpbmVFZGl0Kj4obV93aWRnZXQpLT5zZWxlY3RBbGwoKTsKLX0KLQotYm9vbCBSZW5kZXJMaW5l
RWRpdDo6aXNFZGl0ZWQoKSBjb25zdAotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxRTGluZUVk
aXQqPihtX3dpZGdldCktPmVkaXRlZCgpOwotfQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0RWRp
dGVkKGJvb2wgeCkKLXsKLSAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCktPnNl
dEVkaXRlZCh4KTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0U2VsZWN0aW9uUmFuZ2Uo
aW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIGludCByZWFsU3RhcnQgPSBtYXgoc3RhcnQsIDAp
OwotICAgIGludCBsZW5ndGggPSBtYXgoZW5kIC0gcmVhbFN0YXJ0LCAwKTsKLSAgICBzdGF0aWNf
Y2FzdDxRTGluZUVkaXQgKj4obV93aWRnZXQpLT5zZXRTZWxlY3Rpb24ocmVhbFN0YXJ0LCBsZW5n
dGgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyRmllbGRzZXQ6OlJlbmRl
ckZpZWxkc2V0KEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpCi06IFJlbmRlckJsb2Nr
KGVsZW1lbnQpCi17Ci19Ci0KLVJlbmRlck9iamVjdCogUmVuZGVyRmllbGRzZXQ6OmxheW91dExl
Z2VuZChib29sIHJlbGF5b3V0Q2hpbGRyZW4pCi17Ci0gICAgUmVuZGVyT2JqZWN0KiBsZWdlbmQg
PSBmaW5kTGVnZW5kKCk7Ci0gICAgaWYgKGxlZ2VuZCkgewotICAgICAgICBpZiAocmVsYXlvdXRD
aGlsZHJlbikKLSAgICAgICAgICAgIGxlZ2VuZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0gICAg
ICAgIGxlZ2VuZC0+bGF5b3V0SWZOZWVkZWQoKTsKLQotICAgICAgICBpbnQgeFBvcyA9IGJvcmRl
ckxlZnQoKSArIHBhZGRpbmdMZWZ0KCkgKyBsZWdlbmQtPm1hcmdpbkxlZnQoKTsKLSAgICAgICAg
aWYgKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkKLSAgICAgICAgICAgIHhQb3MgPSBtX3dp
ZHRoIC0gcGFkZGluZ1JpZ2h0KCkgLSBib3JkZXJSaWdodCgpIC0gbGVnZW5kLT53aWR0aCgpIC0g
bGVnZW5kLT5tYXJnaW5SaWdodCgpOwotICAgICAgICBpbnQgYiA9IGJvcmRlclRvcCgpOwotICAg
ICAgICBpbnQgaCA9IGxlZ2VuZC0+aGVpZ2h0KCk7Ci0gICAgICAgIGxlZ2VuZC0+c2V0UG9zKHhQ
b3MsIG1heCgoYi1oKS8yLCAwKSk7Ci0gICAgICAgIG1faGVpZ2h0ID0gbWF4KGIsaCkgKyBwYWRk
aW5nVG9wKCk7Ci0gICAgfQotICAgIHJldHVybiBsZWdlbmQ7Ci19Ci0KLVJlbmRlck9iamVjdCog
UmVuZGVyRmllbGRzZXQ6OmZpbmRMZWdlbmQoKQotewotICAgIGZvciAoUmVuZGVyT2JqZWN0KiBs
ZWdlbmQgPSBmaXJzdENoaWxkKCk7IGxlZ2VuZDsgbGVnZW5kID0gbGVnZW5kLT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICBpZiAoIWxlZ2VuZC0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpICYmIGxl
Z2VuZC0+ZWxlbWVudCgpICYmCi0gICAgICAgICAgbGVnZW5kLT5lbGVtZW50KCktPmhhc1RhZ05h
bWUobGVnZW5kVGFnKSkKLSAgICAgICAgcmV0dXJuIGxlZ2VuZDsKLSAgICB9Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLXZvaWQgUmVuZGVyRmllbGRzZXQ6OnBhaW50Qm94RGVjb3JhdGlvbnMoUGFpbnRJ
bmZvJiBpLCBpbnQgX3R4LCBpbnQgX3R5KQotewotICAgIGludCB3ID0gd2lkdGgoKTsKLSAgICBp
bnQgaCA9IGhlaWdodCgpICsgYm9yZGVyVG9wRXh0cmEoKSArIGJvcmRlckJvdHRvbUV4dHJhKCk7
Ci0gICAgUmVuZGVyT2JqZWN0KiBsZWdlbmQgPSBmaW5kTGVnZW5kKCk7Ci0gICAgaWYgKCFsZWdl
bmQpCi0gICAgICAgIHJldHVybiBSZW5kZXJCbG9jazo6cGFpbnRCb3hEZWNvcmF0aW9ucyhpLCBf
dHgsIF90eSk7Ci0KLSAgICBpbnQgeU9mZiA9IChsZWdlbmQtPnlQb3MoKSA+IDApID8gMCA6IChs
ZWdlbmQtPmhlaWdodCgpLWJvcmRlclRvcCgpKS8yOwotICAgIGggLT0geU9mZjsKLSAgICBfdHkg
Kz0geU9mZiAtIGJvcmRlclRvcEV4dHJhKCk7Ci0KLSAgICBpbnQgbXkgPSBtYXgoX3R5LCBpLnIu
eSgpKTsKLSAgICBpbnQgZW5kID0gbWluKGkuci5ib3R0b20oKSwgIF90eSArIGgpOwotICAgIGlu
dCBtaCA9IGVuZCAtIG15OwotCi0gICAgcGFpbnRCYWNrZ3JvdW5kKGkucCwgc3R5bGUoKS0+YmFj
a2dyb3VuZENvbG9yKCksIHN0eWxlKCktPmJhY2tncm91bmRMYXllcnMoKSwgbXksIG1oLCBfdHgs
IF90eSwgdywgaCk7Ci0KLSAgICBpZiAoc3R5bGUoKS0+aGFzQm9yZGVyKCkpCi0gICAgICAgIHBh
aW50Qm9yZGVyTWludXNMZWdlbmQoaS5wLCBfdHgsIF90eSwgdywgaCwgc3R5bGUoKSwgbGVnZW5k
LT54UG9zKCksIGxlZ2VuZC0+d2lkdGgoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRmllbGRzZXQ6OnBh
aW50Qm9yZGVyTWludXNMZWdlbmQoR3JhcGhpY3NDb250ZXh0KiBwLCBpbnQgX3R4LCBpbnQgX3R5
LCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgaW50IGx4LCBpbnQgbHcpCi17Ci0KLSAgICBj
b25zdCBDb2xvciYgdGMgPSBzdHlsZS0+Ym9yZGVyVG9wQ29sb3IoKTsKLSAgICBjb25zdCBDb2xv
ciYgYmMgPSBzdHlsZS0+Ym9yZGVyQm90dG9tQ29sb3IoKTsKLQotICAgIEVCb3JkZXJTdHlsZSB0
cyA9IHN0eWxlLT5ib3JkZXJUb3BTdHlsZSgpOwotICAgIEVCb3JkZXJTdHlsZSBicyA9IHN0eWxl
LT5ib3JkZXJCb3R0b21TdHlsZSgpOwotICAgIEVCb3JkZXJTdHlsZSBscyA9IHN0eWxlLT5ib3Jk
ZXJMZWZ0U3R5bGUoKTsKLSAgICBFQm9yZGVyU3R5bGUgcnMgPSBzdHlsZS0+Ym9yZGVyUmlnaHRT
dHlsZSgpOwotCi0gICAgYm9vbCByZW5kZXJfdCA9IHRzID4gQkhJRERFTjsKLSAgICBib29sIHJl
bmRlcl9sID0gbHMgPiBCSElEREVOOwotICAgIGJvb2wgcmVuZGVyX3IgPSBycyA+IEJISURERU47
Ci0gICAgYm9vbCByZW5kZXJfYiA9IGJzID4gQkhJRERFTjsKLQotICAgIGlmKHJlbmRlcl90KSB7
Ci0gICAgICAgIGRyYXdCb3JkZXIocCwgX3R4LCBfdHksIF90eCArIGx4LCBfdHkgKyAgc3R5bGUt
PmJvcmRlclRvcFdpZHRoKCksIEJTVG9wLCB0Yywgc3R5bGUtPmNvbG9yKCksIHRzLAotICAgICAg
ICAgICAgICAgICAgIChyZW5kZXJfbCAmJiAobHMgPT0gRE9UVEVEIHx8IGxzID09IERBU0hFRCB8
fCBscyA9PSBET1VCTEUpP3N0eWxlLT5ib3JkZXJMZWZ0V2lkdGgoKTowKSwgMCk7Ci0gICAgICAg
IGRyYXdCb3JkZXIocCwgX3R4K2x4K2x3LCBfdHksIF90eCArIHcsIF90eSArICBzdHlsZS0+Ym9y
ZGVyVG9wV2lkdGgoKSwgQlNUb3AsIHRjLCBzdHlsZS0+Y29sb3IoKSwgdHMsCi0gICAgICAgICAg
ICAgICAgICAgMCwgKHJlbmRlcl9yICYmIChycyA9PSBET1RURUQgfHwgcnMgPT0gREFTSEVEIHx8
IHJzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKTowKSk7Ci0gICAgfQotCi0g
ICAgaWYocmVuZGVyX2IpCi0gICAgICAgIGRyYXdCb3JkZXIocCwgX3R4LCBfdHkgKyBoIC0gc3R5
bGUtPmJvcmRlckJvdHRvbVdpZHRoKCksIF90eCArIHcsIF90eSArIGgsIEJTQm90dG9tLCBiYywg
c3R5bGUtPmNvbG9yKCksIGJzLAotICAgICAgICAgICAgICAgICAgIChyZW5kZXJfbCAmJiAobHMg
PT0gRE9UVEVEIHx8IGxzID09IERBU0hFRCB8fCBscyA9PSBET1VCTEUpP3N0eWxlLT5ib3JkZXJM
ZWZ0V2lkdGgoKTowKSwKLSAgICAgICAgICAgICAgICAgICAocmVuZGVyX3IgJiYgKHJzID09IERP
VFRFRCB8fCBycyA9PSBEQVNIRUQgfHwgcnMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRX
aWR0aCgpOjApKTsKLQotICAgIGlmKHJlbmRlcl9sKQotICAgIHsKLSAgICAgICAgY29uc3QgQ29s
b3ImIGxjID0gc3R5bGUtPmJvcmRlckxlZnRDb2xvcigpOwotCi0gICAgICAgIGJvb2wgaWdub3Jl
X3RvcCA9Ci0gICAgICAgICAgICAodGMgPT0gbGMpICYmCi0gICAgICAgICAgICAobHMgPj0gT1VU
U0VUKSAmJgotICAgICAgICAgICAgKHRzID09IERPVFRFRCB8fCB0cyA9PSBEQVNIRUQgfHwgdHMg
PT0gU09MSUQgfHwgdHMgPT0gT1VUU0VUKTsKLQotICAgICAgICBib29sIGlnbm9yZV9ib3R0b20g
PQotICAgICAgICAgICAgKGJjID09IGxjKSAmJgotICAgICAgICAgICAgKGxzID49IE9VVFNFVCkg
JiYKLSAgICAgICAgICAgIChicyA9PSBET1RURUQgfHwgYnMgPT0gREFTSEVEIHx8IGJzID09IFNP
TElEIHx8IGJzID09IElOU0VUKTsKLQotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCwgX3R5LCBf
dHggKyBzdHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCksIF90eSArIGgsIEJTTGVmdCwgbGMsIHN0eWxl
LT5jb2xvcigpLCBscywKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVfdG9wPzA6c3R5bGUtPmJv
cmRlclRvcFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgaWdub3JlX2JvdHRvbT8wOnN0eWxl
LT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKLSAgICB9Ci0KLSAgICBpZihyZW5kZXJfcikKLSAgICB7
Ci0gICAgICAgIGNvbnN0IENvbG9yJiByYyA9IHN0eWxlLT5ib3JkZXJSaWdodENvbG9yKCk7Ci0K
LSAgICAgICAgYm9vbCBpZ25vcmVfdG9wID0KLSAgICAgICAgICAgICh0YyA9PSByYykgJiYKLSAg
ICAgICAgICAgIChycyA+PSBET1RURUQgfHwgcnMgPT0gSU5TRVQpICYmCi0gICAgICAgICAgICAo
dHMgPT0gRE9UVEVEIHx8IHRzID09IERBU0hFRCB8fCB0cyA9PSBTT0xJRCB8fCB0cyA9PSBPVVRT
RVQpOwotCi0gICAgICAgIGJvb2wgaWdub3JlX2JvdHRvbSA9Ci0gICAgICAgICAgICAoYmMgPT0g
cmMpICYmCi0gICAgICAgICAgICAocnMgPj0gRE9UVEVEIHx8IHJzID09IElOU0VUKSAmJgotICAg
ICAgICAgICAgKGJzID09IERPVFRFRCB8fCBicyA9PSBEQVNIRUQgfHwgYnMgPT0gU09MSUQgfHwg
YnMgPT0gSU5TRVQpOwotCi0gICAgICAgIGRyYXdCb3JkZXIocCwgX3R4ICsgdyAtIHN0eWxlLT5i
b3JkZXJSaWdodFdpZHRoKCksIF90eSwgX3R4ICsgdywgX3R5ICsgaCwgQlNSaWdodCwgcmMsIHN0
eWxlLT5jb2xvcigpLCBycywKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVfdG9wPzA6c3R5bGUt
PmJvcmRlclRvcFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgaWdub3JlX2JvdHRvbT8wOnN0
eWxlLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyRmllbGRz
ZXQ6OnNldFN0eWxlKFJlbmRlclN0eWxlKiBfc3R5bGUpCi17Ci0gICAgUmVuZGVyQmxvY2s6OnNl
dFN0eWxlKF9zdHlsZSk7Ci0KLSAgICAvLyBXaW5JRSByZW5kZXJzIGZpZWxkc2V0cyB3aXRoIGRp
c3BsYXk6aW5saW5lIGxpa2UgdGhleSdyZSBpbmxpbmUtYmxvY2tzLiAgRm9yIHVzLAotICAgIC8v
IGFuIGlubGluZS1ibG9jayBpcyBqdXN0IGEgYmxvY2sgZWxlbWVudCB3aXRoIHJlcGxhY2VkIHNl
dCB0byB0cnVlIGFuZCBpbmxpbmUgc2V0Ci0gICAgLy8gdG8gdHJ1ZS4gIEVuc3VyZSB0aGF0IGlm
IHdlIGVuZGVkIHVwIGJlaW5nIGlubGluZSB0aGF0IHdlIHNldCBvdXIgcmVwbGFjZWQgZmxhZwot
ICAgIC8vIHNvIHRoYXQgd2UncmUgdHJlYXRlZCBsaWtlIGFuIGlubGluZS1ibG9jay4KLSAgICBp
ZiAoaXNJbmxpbmUoKSkKLSAgICAgICAgc2V0UmVwbGFjZWQodHJ1ZSk7Ci19ICAgIAotICAgIAot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJGaWxlQnV0dG9uOjpSZW5kZXJGaWxlQnV0dG9u
KEhUTUxJbnB1dEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVt
ZW50KQotewotICAgIHNldFdpZGdldChuZXcgS1dRRmlsZUJ1dHRvbih2aWV3KCktPmZyYW1lKCkp
KTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAg
IEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLQotICAgIC8vIExldCB0aGUgd2lkZ2V0IHRl
bGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAgICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zaXplKCk7Ci0gICAgSW50U2l6ZSBzKHN0YXRp
Y19jYXN0PEtXUUZpbGVCdXR0b24gKj4od2lkZ2V0KCkpLT5zaXplRm9yQ2hhcmFjdGVyV2lkdGgo
c2l6ZSA+IDAgPyBzaXplIDogMjApKTsKLQotICAgIHNldEludHJpbnNpY1dpZHRoKHMud2lkdGgo
KSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkpOwotCi0gICAgUmVuZGVyRm9y
bUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246
OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uKj4o
d2lkZ2V0KCkpLT5zZXRGaWxlbmFtZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KG5vZGUoKSktPnZhbHVlKCkuZGVwcmVjYXRlZFN0cmluZygpKTsKLQotICAgIFJlbmRl
ckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlckZpbGVC
dXR0b246OnJldHVyblByZXNzZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8SFRN
TElucHV0RWxlbWVudCo+KG5vZGUoKSktPmZvcm0oKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRN
TElucHV0RWxlbWVudCo+KG5vZGUoKSktPmZvcm0oKS0+cHJlcGFyZVN1Ym1pdCgpOwotfQotCi12
b2lkIFJlbmRlckZpbGVCdXR0b246OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zZXRWYWx1ZUZyb21SZW5kZXJlcihz
dGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uKj4od2lkZ2V0KCkpLT5maWxlbmFtZSgpKTsKLSAgICBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQot
dm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpzZWxlY3QoKQotewotfQotCi0KLXZvaWQgUmVuZGVyRmls
ZUJ1dHRvbjo6Y2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMpCi17Ci0gICAgc3RhdGljX2Nhc3Q8
S1dRRmlsZUJ1dHRvbiAqPih3aWRnZXQoKSktPmNsaWNrKHNlbmRNb3VzZUV2ZW50cyk7Ci19Ci0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJMYWJlbDo6UmVuZGVyTGFiZWwoSFRNTEdl
bmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKK1JlbmRlckxhYmVsOjpSZW5kZXJMYWJlbChIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50KiBlbGVtZW50KQogICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxl
bWVudCkKIHsKLQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxlZ2VuZDo6UmVu
ZGVyTGVnZW5kKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJC
bG9jayhlbGVtZW50KQotewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclNlbGVj
dDo6UmVuZGVyU2VsZWN0KEhUTUxTZWxlY3RFbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVy
Rm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9IGZhbHNl
OwotICAgIG1fbXVsdGlwbGUgPSBlbGVtZW50LT5tdWx0aXBsZSgpOwotICAgIG1fc2l6ZSA9IGVs
ZW1lbnQtPnNpemUoKTsKLSAgICBtX3VzZUxpc3RCb3ggPSAobV9tdWx0aXBsZSB8fCBtX3NpemUg
PiAxKTsKLSAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgIG1fb3B0aW9uc0NoYW5n
ZWQgPSB0cnVlOwotCi0gICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgc2V0V2lkZ2V0KGNy
ZWF0ZUxpc3RCb3goKSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRXaWRnZXQobmV3IFFDb21ib0Jv
eCk7Ci19Ci0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnNldFdpZGdldFdyaXRpbmdEaXJlY3Rpb24o
KQotewotICAgIFRleHREaXJlY3Rpb24gZCA9IHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/
IFJUTCA6IExUUjsKLSAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICBzdGF0aWNfY2FzdDxR
TGlzdEJveCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci0gICAgZWxzZQot
ICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3ggKj4obV93aWRnZXQpLT5zZXRXcml0aW5nRGly
ZWN0aW9uKGQpOwotfQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUg
KnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotICAgIHNldFdpZGdl
dFdyaXRpbmdEaXJlY3Rpb24oKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6dXBkYXRlRnJv
bUVsZW1lbnQoKQotewotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gdHJ1ZTsKLQotICAgIC8v
IGNoYW5nZSB3aWRnZXQgdHlwZQotICAgIGJvb2wgb2xkTXVsdGlwbGUgPSBtX211bHRpcGxlOwot
ICAgIHVuc2lnbmVkIG9sZFNpemUgPSBtX3NpemU7Ci0gICAgYm9vbCBvbGRMaXN0Ym94ID0gbV91
c2VMaXN0Qm94OwotCi0gICAgbV9tdWx0aXBsZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVt
ZW50Kj4obm9kZSgpKS0+bXVsdGlwbGUoKTsKLSAgICBtX3NpemUgPSBzdGF0aWNfY2FzdDxIVE1M
U2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPnNpemUoKTsKLSAgICBtX3VzZUxpc3RCb3ggPSAobV9t
dWx0aXBsZSB8fCBtX3NpemUgPiAxKTsKLQotICAgIGlmIChvbGRNdWx0aXBsZSAhPSBtX211bHRp
cGxlIHx8IG9sZFNpemUgIT0gbV9zaXplKSB7Ci0gICAgICAgIGlmIChtX3VzZUxpc3RCb3ggIT0g
b2xkTGlzdGJveCkgewotICAgICAgICAgICAgLy8gdHlwZSBvZiBzZWxlY3QgaGFzIGNoYW5nZWQK
LSAgICAgICAgICAgIGRlbGV0ZSBtX3dpZGdldDsKLQotICAgICAgICAgICAgaWYgKG1fdXNlTGlz
dEJveCkKLSAgICAgICAgICAgICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgpKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXRXaWRnZXQobmV3IFFDb21ib0JveCk7Ci0g
ICAgICAgICAgICBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAobV91c2VMaXN0Qm94ICYmIG9sZE11bHRpcGxlICE9IG1fbXVsdGlwbGUpIHsKLSAg
ICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5zZXRTZWxlY3Rpb25N
b2RlKG1fbXVsdGlwbGUgPyBRTGlzdEJveDo6RXh0ZW5kZWQgOiBRTGlzdEJveDo6U2luZ2xlKTsK
LSAgICAgICAgfQotICAgICAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICBt
X29wdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUgY29udGVudHMg
bGlzdGJveC9jb21ib2JveCBiYXNlZCBvbiBvcHRpb25zIGluIG1fZWxlbWVudAotICAgIGlmICgg
bV9vcHRpb25zQ2hhbmdlZCApIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxTZWxlY3RF
bGVtZW50Kj4obm9kZSgpKS0+bV9yZWNhbGNMaXN0SXRlbXMpCi0gICAgICAgICAgICBzdGF0aWNf
Y2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPnJlY2FsY0xpc3RJdGVtcygpOwotICAg
ICAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2Fz
dDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotICAgICAgICBpbnQg
bGlzdEluZGV4OwotCi0gICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+Y2xlYXIoKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jbGVhcigpOwotCi0g
ICAgICAgIGJvb2wgZ3JvdXBFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgZm9yIChsaXN0SW5kZXgg
PSAwOyBsaXN0SW5kZXggPCBpbnQobGlzdEl0ZW1zLnNpemUoKSk7IGxpc3RJbmRleCsrKSB7Ci0g
ICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUob3B0Z3JvdXBU
YWcpKSB7Ci0gICAgICAgICAgICAgICAgSFRNTE9wdEdyb3VwRWxlbWVudCAqb3B0Z3JvdXBFbGVt
ZW50ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdEdyb3VwRWxlbWVudCo+KGxpc3RJdGVtc1tsaXN0SW5k
ZXhdKTsKLSAgICAgICAgICAgICAgICBEZXByZWNhdGVkU3RyaW5nIGxhYmVsID0gb3B0Z3JvdXBF
bGVtZW50LT5nZXRBdHRyaWJ1dGUobGFiZWxBdHRyKS5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAg
ICAgICAgICAgICAgbGFiZWwucmVwbGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9s
KCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEluIFdpbklFLCBhbiBv
cHRncm91cCBjYW4ndCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlIChvdGhlciB0aGFuIHRo
ZSBpbmRlbnQKLSAgICAgICAgICAgICAgICAvLyB3ZSBnaXZlIGl0KS4gIFdlIG1hdGNoIHRoaXMg
YmVoYXZpb3IuCi0gICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5zdHJpcFdoaXRlU3BhY2Uo
KTsKLSAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGNvbGxhcHNlIG91ciB3aGl0ZXNwYWNl
IHRvby4gIFRoaXMgd2lsbCBtYXRjaCBvdGhlciBicm93c2Vycy4KLSAgICAgICAgICAgICAgICBs
YWJlbCA9IGxhYmVsLnNpbXBsaWZ5V2hpdGVTcGFjZSgpOwotCi0gICAgICAgICAgICAgICAgZ3Jv
dXBFbmFibGVkID0gb3B0Z3JvdXBFbGVtZW50LT5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+YXBwZW5kR3JvdXBMYWJlbChsYWJl
bCwgZ3JvdXBFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5kR3JvdXBMYWJlbChs
YWJlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0SXRlbXNbbGlz
dEluZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAgICAgSFRNTE9w
dGlvbkVsZW1lbnQgKm9wdGlvbkVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dCo+KGxpc3RJdGVtc1tsaXN0SW5kZXhdKTsKLSAgICAgICAgICAgICAgICBEZXByZWNhdGVkU3Ry
aW5nIGl0ZW1UZXh0OwotICAgICAgICAgICAgICAgIGlmIChvcHRpb25FbGVtZW50LT5oYXNBdHRy
aWJ1dGUobGFiZWxBdHRyKSkKLSAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQgPSBvcHRpb25F
bGVtZW50LT5nZXRBdHRyaWJ1dGUobGFiZWxBdHRyKS5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAg
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IG9wdGlvbkVs
ZW1lbnQtPnRleHQoKS5kZXByZWNhdGVkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAg
ICAgICAgICAgICAgaXRlbVRleHQucmVwbGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1cnJlbmN5U3lt
Ym9sKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gSW4gV2luSUUsIGxlYWRpbmcgYW5kIHRyYWls
aW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBpbiBvcHRpb25zLiBXZSBtYXRjaCB0aGlzIGJlaGF2
aW9yLgotICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gaXRlbVRleHQuc3RyaXBXaGl0ZVNwYWNl
KCk7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBjb2xsYXBzZSBvdXIgd2hpdGVzcGFj
ZSB0b28uICBUaGlzIHdpbGwgbWF0Y2ggb3RoZXIgYnJvd3NlcnMuCi0gICAgICAgICAgICAgICAg
aXRlbVRleHQgPSBpdGVtVGV4dC5zaW1wbGlmeVdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPnBhcmVudE5vZGUo
KS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICAgICAgICAgIGl0ZW1UZXh0
LnByZXBlbmQoIiAgICAiKTsKLQotICAgICAgICAgICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0g
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5hcHBl
bmRJdGVtKGl0ZW1UZXh0LCBncm91cEVuYWJsZWQgJiYgb3B0aW9uRWxlbWVudC0+aXNFbmFibGVk
KCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5hcHBlbmRJdGVtKGl0ZW1UZXh0LCBncm91cEVuYWJs
ZWQgJiYgb3B0aW9uRWxlbWVudC0+aXNFbmFibGVkKCkpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgZWxzZSBpZiAobGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUoaHJUYWcpKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKCFtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5kU2VwYXJhdG9yKCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgS0hUTUxBc3Nl
cnQoZmFsc2UpOwotICAgICAgICAgICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLSAgICAg
ICAgfQotICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
UUxpc3RCb3gqPihtX3dpZGdldCktPmRvbmVBcHBlbmRpbmdJdGVtcygpOwotICAgICAgICBzZXRO
ZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgICAgICBtX29wdGlvbnNDaGFuZ2VkID0g
ZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHNlbGVjdGlvbgotICAgIGlmIChtX3NlbGVj
dGlvbkNoYW5nZWQpIHsKLSAgICAgICAgdXBkYXRlU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAg
bV9pZ25vcmVTZWxlY3RFdmVudHMgPSBmYWxzZTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1
cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi0KLXNob3J0IFJlbmRlclNlbGVjdDo6YmFzZWxpbmVQ
b3NpdGlvbiggYm9vbCBmLCBib29sIGlzUm9vdExpbmVCb3ggKSBjb25zdAotewotICAgIGlmICht
X3VzZUxpc3RCb3gpIHsKLSAgICAgICAgLy8gRklYTUU6IFNob3VsZCBnZXQgdGhlIGhhcmRjb2Rl
ZCBjb25zdGFudCBvZiA3IGJ5IGNhbGxpbmcgYSBRTGlzdEJveCBmdW5jdGlvbiwKLSAgICAgICAg
Ly8gYXMgd2UgZG8gZm9yIG90aGVyIHdpZGdldCBjbGFzc2VzLgotICAgICAgICByZXR1cm4gUmVu
ZGVyV2lkZ2V0OjpiYXNlbGluZVBvc2l0aW9uKCBmLCBpc1Jvb3RMaW5lQm94ICkgLSA3OwotICAg
IH0KLSAgICByZXR1cm4gUmVuZGVyRm9ybUVsZW1lbnQ6OmJhc2VsaW5lUG9zaXRpb24oIGYsIGlz
Um9vdExpbmVCb3ggKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6Y2FsY01pbk1heFdpZHRo
KCkKLXsKLSAgICBLSFRNTEFzc2VydCggIW1pbk1heEtub3duKCkgKTsKLQotICAgIGlmIChtX29w
dGlvbnNDaGFuZ2VkKQotICAgICAgICB1cGRhdGVGcm9tRWxlbWVudCgpOwotCi0gICAgLy8gIyMj
IHVnbHkgSEFDSyBGSVhNRSEhIQotICAgIHNldE1pbk1heEtub3duKCk7Ci0gICAgbGF5b3V0SWZO
ZWVkZWQoKTsKLSAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotICAgIC8vICMj
IyBlbmQgRklYTUUKLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lkdGgoKTsK
LX0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OmxheW91dCggKQotewotICAgIEtIVE1MQXNzZXJ0KG5l
ZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOwotCi0gICAgLy8g
IyMjIG1haW50YWluIHNlbGVjdGlvbiBwcm9wZXJseSBiZXR3ZWVuIHR5cGUvc2l6ZSBjaGFuZ2Vz
LCBhbmQgd29yawotICAgIC8vIG91dCBob3cgdG8gaGFuZGxlIG11bHRpc2VsZWN0LT5zaW5nbGVz
ZWxlY3QgKHByb2JhYmx5IGp1c3Qgc2VsZWN0Ci0gICAgLy8gZmlyc3Qgc2VsZWN0ZWQgb25lKQot
Ci0gICAgLy8gY2FsY3VsYXRlIHNpemUKLSAgICBpZihtX3VzZUxpc3RCb3gpIHsKLSAgICAgICAg
UUxpc3RCb3gqIHcgPSBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KTsKLQotCi0gICAg
ICAgIGludCBzaXplID0gbV9zaXplOwotICAgICAgICAvLyBjaGVjayBpZiBtdWx0aXBsZSBhbmQg
c2l6ZSB3YXMgbm90IGdpdmVuIG9yIGludmFsaWQKLSAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9k
ZXIgc2V0cyBzaXplIHRvIG1pbihudW1iZXIgb2YgZWxlbWVudHMsIDQpCi0gICAgICAgIC8vIE5l
dHNjYXBlIHNlZW1zIHRvIHNpbXBseSBzZXQgaXQgdG8gIm51bWJlciBvZiBlbGVtZW50cyIKLSAg
ICAgICAgLy8gdGhlIGF2ZXJhZ2Ugb2YgdGhhdCBpcyBJTUhPIG1pbihudW1iZXIgb2YgZWxlbWVu
dHMsIDEwKQotICAgICAgICAvLyBzbyBJIGRpZCB0aGF0IDstKQotICAgICAgICBpZihzaXplIDwg
MSkKLSAgICAgICAgICAgIHNpemUgPSBtaW4oc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdl
dCktPmNvdW50KCksIDEwVSk7Ci0KLSAgICAgICAgLy8gTGV0IHRoZSB3aWRnZXQgdGVsbCB1cyBo
b3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgICAgICBJbnRTaXplIHMody0+c2l6ZUZvck51bWJl
ck9mTGluZXMoc2l6ZSkpOwotICAgICAgICBzZXRJbnRyaW5zaWNXaWR0aCggcy53aWR0aCgpICk7
Ci0gICAgICAgIHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQoKSApOwotICAgIH0KLSAgICBl
bHNlIHsKLSAgICAgICAgSW50U2l6ZSBzKG1fd2lkZ2V0LT5zaXplSGludCgpKTsKLSAgICAgICAg
c2V0SW50cmluc2ljV2lkdGgoIHMud2lkdGgoKSApOwotICAgICAgICBzZXRJbnRyaW5zaWNIZWln
aHQoIHMuaGVpZ2h0KCkgKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6bGF5b3V0
KCk7Ci0KLSAgICAvLyBhbmQgbm93IGRpc2FibGUgdGhlIHdpZGdldCBpbiBjYXNlIHRoZXJlIGlz
IG5vIDxvcHRpb24+IGdpdmVuCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlz
dEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRl
bXMoKTsKLQotICAgIGJvb2wgZm91bmRPcHRpb24gPSBmYWxzZTsKLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbGlzdEl0ZW1zLnNpemUoKSAmJiAhZm91bmRPcHRpb247IGkrKykKLSAgICAg
ICAgZm91bmRPcHRpb24gPSAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykpOwot
Ci0gICAgbV93aWRnZXQtPnNldEVuYWJsZWQoZm91bmRPcHRpb24gJiYgISBzdGF0aWNfY2FzdDxI
VE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmRpc2FibGVkKCkpOwotfQotCi12b2lkIFJlbmRl
clNlbGVjdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgaWYgKG1faWdub3JlU2VsZWN0
RXZlbnRzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBLSFRNTEFzc2VydCghbV91c2VMaXN0Qm94
KTsKLQotICAgIGludCBpbmRleCA9IHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+
Y3VycmVudEl0ZW0oKTsKLQotICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJ
dGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1z
KCk7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCAoaW50KWxpc3RJdGVtcy5zaXplKCkp
IHsKLSAgICAgICAgYm9vbCBmb3VuZCA9IGxpc3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0
aW9uVGFnKTsKLSAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgLy8gdGhpcyBvbmUg
aXMgbm90IHNlbGVjdGFibGUsICB3ZSBuZWVkIHRvIGZpbmQgYW4gb3B0aW9uIGVsZW1lbnQKLSAg
ICAgICAgICAgIHdoaWxlICgodW5zaWduZWQpIGluZGV4IDwgbGlzdEl0ZW1zLnNpemUoKSkgewot
ICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbaW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRh
ZykpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytpbmRleDsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAg
ICAgIHdoaWxlIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0SXRl
bXNbaW5kZXhdLT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC0taW5kZXg7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvdW5kKSB7
Ci0gICAgICAgICAgICBpZiAoIGluZGV4ICE9IHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lk
Z2V0KS0+Y3VycmVudEl0ZW0oKSApCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJv
Qm94Kj4obV93aWRnZXQpLT5zZXRDdXJyZW50SXRlbSggaW5kZXggKTsKLQotICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVtcy5zaXplKCk7ICsraSkKLSAgICAgICAg
ICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgJiYgaSAhPSAo
dW5zaWduZWQgaW50KSBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnQqPiggbGlzdEl0ZW1zW2ldICktPm1fc2VsZWN0ZWQgPSBmYWxzZTsKLQot
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaW5k
ZXhdKS0+bV9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWNf
Y2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci19Ci0KLQotdm9p
ZCBSZW5kZXJTZWxlY3Q6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV9p
Z25vcmVTZWxlY3RFdmVudHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIGRvbid0IHVzZSBs
aXN0SXRlbXMoKSBoZXJlIGFzIHdlIGhhdmUgdG8gYXZvaWQgcmVjYWxjdWxhdGlvbnMgLSBjaGFu
Z2luZyB0aGUKLSAgICAvLyBvcHRpb24gbGlzdCB3aWxsIG1ha2UgdXNlIHVwZGF0ZSBvcHRpb25z
IG5vdCBpbiB0aGUgd2F5IHRoZSB1c2VyIGV4cGVjdHMgdGhlbQotICAgIERlcHJlY2F0ZWRBcnJh
eTxIVE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50
Kj4obm9kZSgpKS0+bV9saXN0SXRlbXM7Ci0gICAgaW50IGogPSAwOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBsaXN0SXRlbXMuY291bnQoKTsgaSsrKSB7Ci0gICAgICAgIC8vIGRvbid0
IHVzZSBzZXRTZWxlY3RlZCgpIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGNhdXNlIHVzIHRvIGJlIGNh
bGxlZAotICAgICAgICAvLyBhZ2FpbiB3aXRoIHVwZGF0ZVNlbGVjdGlvbi4KLSAgICAgICAgaWYg
KGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKQotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPiggbGlzdEl0ZW1zW2ldICkKLSAgICAgICAgICAgICAg
ICAtPm1fc2VsZWN0ZWQgPSBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KCBtX3dpZGdldCApLT5pc1Nl
bGVjdGVkKCBqICk7Ci0gICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9u
VGFnKSB8fCBsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICAg
ICAgKytqOwotICAgIH0KLSAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUo
KSktPm9uQ2hhbmdlKCk7Ci19Ci0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnNldE9wdGlvbnNDaGFu
Z2VkKGJvb2wgX29wdGlvbnNDaGFuZ2VkKQotewotICAgIG1fb3B0aW9uc0NoYW5nZWQgPSBfb3B0
aW9uc0NoYW5nZWQ7Ci19Ci0KLVFMaXN0Qm94KiBSZW5kZXJTZWxlY3Q6OmNyZWF0ZUxpc3RCb3go
KQotewotICAgIFFMaXN0Qm94ICpsYiA9IG5ldyBRTGlzdEJveCgpOwotICAgIGxiLT5zZXRTZWxl
Y3Rpb25Nb2RlKG1fbXVsdGlwbGUgPyBRTGlzdEJveDo6RXh0ZW5kZWQgOiBRTGlzdEJveDo6U2lu
Z2xlKTsKLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9IGZhbHNlOwotICAgIHJldHVybiBsYjsK
LX0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnVwZGF0ZVNlbGVjdGlvbigpCi17Ci0gICAgRGVwcmVj
YXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVj
dEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpbnQgaTsKLSAgICBpZiAobV91
c2VMaXN0Qm94KSB7Ci0gICAgICAgIC8vIGlmIG11bHRpLXNlbGVjdCwgd2Ugc2VsZWN0IG9ubHkg
dGhlIG5ldyBzZWxlY3RlZCBpbmRleAotICAgICAgICBRTGlzdEJveCAqbGlzdEJveCA9IHN0YXRp
Y19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAg
IGZvciAoaSA9IDA7IGkgPCBpbnQobGlzdEl0ZW1zLnNpemUoKSk7IGkrKykgewotICAgICAgICAg
ICAgbGlzdEJveC0+c2V0U2VsZWN0ZWQoaiwgbGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlv
blRhZykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5zZWxlY3RlZCgpKTsKLSAgICAgICAgICAg
IGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBsaXN0SXRlbXNbaV0t
Pmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICAgICAgICAgICsrajsKLSAgICAgICAg
ICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBib29sIGZvdW5kID0g
ZmFsc2U7Ci0gICAgICAgIHVuc2lnbmVkIGZpcnN0T3B0aW9uID0gbGlzdEl0ZW1zLnNpemUoKTsK
LSAgICAgICAgaSA9IGxpc3RJdGVtcy5zaXplKCk7Ci0gICAgICAgIHdoaWxlIChpLS0pCi0gICAg
ICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoZm91bmQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhU
TUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2ldKS0+bV9zZWxlY3RlZCA9IGZhbHNlOwotICAg
ICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlz
dEl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxRQ29tYm9Cb3gqPiggbV93aWRnZXQgKS0+c2V0Q3VycmVudEl0ZW0oaSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgZmlyc3RPcHRpb24gPSBpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIEFTU0VSVChmaXJz
dE9wdGlvbiA9PSBsaXN0SXRlbXMuc2l6ZSgpIHx8IGZvdW5kKTsKLSAgICB9Ci0KLSAgICBtX3Nl
bGVjdGlvbkNoYW5nZWQgPSBmYWxzZTsKIH0KIAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJUZXh0QXJlYTo6UmVuZGVyVGV4dEFyZWEoSFRN
TFRleHRBcmVhRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1l
bnQpLCBtX2RpcnR5KGZhbHNlKSwgbV91cGRhdGluZyhmYWxzZSkKLXsKLSAgICBRVGV4dEVkaXQg
KmVkaXQgPSBuZXcgUVRleHRFZGl0KHZpZXcoKSk7Ci0KLSAgICBpZiAoZWxlbWVudC0+d3JhcCgp
ICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKLSAgICAgICAgZWRpdC0+c2V0V29y
ZFdyYXAoUVRleHRFZGl0OjpXaWRnZXRXaWR0aCk7Ci0gICAgZWxzZQotICAgICAgICBlZGl0LT5z
ZXRXb3JkV3JhcChRVGV4dEVkaXQ6Ok5vV3JhcCk7Ci0KLSAgICBzZXRXaWRnZXQoZWRpdCk7Ci19
Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OmRlc3Ryb3koKQotewotICAgIHN0YXRpY19jYXN0PEhU
TUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5yZW5kZXJlcldpbGxCZURlc3Ryb3llZCgpOwot
ICAgIFJlbmRlckZvcm1FbGVtZW50OjpkZXN0cm95KCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFy
ZWE6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoICFtaW5NYXhLbm93bigp
ICk7Ci0KLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdl
dCk7Ci0gICAgSW50U2l6ZSBzaXplKHctPnNpemVXaXRoQ29sdW1uc0FuZFJvd3MoCi0gICAgICAg
IG1heChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+Y29scygpLCAx
KSwKLSAgICAgICAgbWF4KHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkp
LT5yb3dzKCksIDEpKSk7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aCggc2l6ZS53aWR0aCgpICk7
Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KCBzaXplLmhlaWdodCgpICk7Ci0KLSAgICBSZW5kZXJG
b3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6
OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQotewotICAgIFJlbmRlckZvcm1FbGVtZW50OjpzZXRT
dHlsZShzKTsKLQotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1f
d2lkZ2V0KTsKLSAgICB3LT5zZXRBbGlnbm1lbnQodGV4dEFsaWdubWVudCgpKTsKLSAgICB3LT5z
ZXRMaW5lSGVpZ2h0KFJlbmRlck9iamVjdDo6bGluZUhlaWdodCh0cnVlKSk7Ci0KLSAgICB3LT5z
ZXRXcml0aW5nRGlyZWN0aW9uKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IFJUTCA6IExU
Uik7Ci0KLSAgICBTY3JvbGxCYXJNb2RlIHNjcm9sbE1vZGUgPSBTY3JvbGxCYXJBdXRvOwotICAg
IHN3aXRjaCAoc3R5bGUoKS0+b3ZlcmZsb3coKSkgewotICAgICAgICBjYXNlIE9BVVRPOgotICAg
ICAgICBjYXNlIE9NQVJRVUVFOiAvLyBtYWtlcyBubyBzZW5zZSwgbWFwIHRvIGF1dG8KLSAgICAg
ICAgY2FzZSBPT1ZFUkxBWTogLy8gbm90IGltcGxlbWVudGVkIGZvciB0ZXh0LCBtYXAgdG8gYXV0
bwotICAgICAgICBjYXNlIE9WSVNJQkxFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgT0hJRERFTjoKLSAgICAgICAgICAgIHNjcm9sbE1vZGUgPSBTY3JvbGxCYXJBbHdheXNPZmY7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPU0NST0xMOgotICAgICAgICAgICAg
c2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
fQotICAgIFNjcm9sbEJhck1vZGUgaG9yaXpvbnRhbFNjcm9sbE1vZGUgPSBzY3JvbGxNb2RlOwot
ICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+d3JhcCgp
ICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKLSAgICAgICAgaG9yaXpvbnRhbFNj
cm9sbE1vZGUgPSBTY3JvbGxCYXJBbHdheXNPZmY7Ci0KLSAgICB3LT5zZXRTY3JvbGxCYXJNb2Rl
cyhob3Jpem9udGFsU2Nyb2xsTW9kZSwgc2Nyb2xsTW9kZSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4
dEFyZWE6OnNldEVkaXRlZChib29sIHgpCi17Ci0gICAgbV9kaXJ0eSA9IHg7Ci19Ci0KLXZvaWQg
UmVuZGVyVGV4dEFyZWE6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBIVE1MVGV4dEFyZWFF
bGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSk7Ci0g
ICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpOwotCi0g
ICAgdy0+c2V0UmVhZE9ubHkoZS0+aXNSZWFkT25seUNvbnRyb2woKSk7Ci0gICAgdy0+c2V0RGlz
YWJsZWQoZS0+ZGlzYWJsZWQoKSk7Ci0KLSAgICBTdHJpbmcgd2lkZ2V0VGV4dCA9IHRleHQoKTsK
LSAgICBTdHJpbmcgdGV4dCA9IGUtPnZhbHVlKCk7Ci0gICAgdGV4dC5yZXBsYWNlKCdcXCcsIGJh
Y2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgaWYgKHdpZGdldFRleHQgIT0gdGV4dCkg
ewotICAgICAgICBpbnQgbGluZSwgY29sOwotICAgICAgICB3LT5nZXRDdXJzb3JQb3NpdGlvbigg
JmxpbmUsICZjb2wgKTsKLSAgICAgICAgbV91cGRhdGluZyA9IHRydWU7Ci0gICAgICAgIHctPnNl
dFRleHQodGV4dCk7Ci0gICAgICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgdy0+c2V0
Q3Vyc29yUG9zaXRpb24oIGxpbmUsIGNvbCApOwotICAgIH0KLSAgICBtX2RpcnR5ID0gZmFsc2U7
Ci0KLSAgICB3LT5zZXRDb2xvcnMoc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCksIHN0eWxlKCkt
PmNvbG9yKCkpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7
Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0QXJlYTo6dGV4dCgpCi17Ci0gICAgU3RyaW5nIHR4dCA9
IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KS0+dGV4dCgpOwotICAgIHJldHVybiB0
eHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcpOwotfQotCi1TdHJp
bmcgUmVuZGVyVGV4dEFyZWE6OnRleHRXaXRoSGFyZExpbmVCcmVha3MoKQotewotICAgIFN0cmlu
ZyB0eHQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCktPnRleHRXaXRoSGFyZExp
bmVCcmVha3MoKTsKLSAgICByZXR1cm4gdHh0LnJlcGxhY2UoYmFja3NsYXNoQXNDdXJyZW5jeVN5
bWJvbCgpLCAnXFwnKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6dmFsdWVDaGFuZ2VkKFdp
ZGdldCopCi17Ci0gICAgaWYgKG1fdXBkYXRpbmcpCi0gICAgICAgIHJldHVybjsKLSAgICBzdGF0
aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+aW52YWxpZGF0ZVZhbHVlKCk7
Ci0gICAgbV9kaXJ0eSA9IHRydWU7Ci19Ci0KLWludCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0aW9u
U3RhcnQoKQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVk
aXQgKj4obV93aWRnZXQpOwotICAgIHJldHVybiB0ZXh0RWRpdC0+c2VsZWN0aW9uU3RhcnQoKTsK
LX0KLQotaW50IFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25FbmQoKQotewotICAgIFFUZXh0RWRp
dCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHJl
dHVybiB0ZXh0RWRpdC0+c2VsZWN0aW9uRW5kKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6
OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0
ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0
U2VsZWN0aW9uU3RhcnQoc3RhcnQpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZXRTZWxl
Y3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nh
c3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uRW5k
KGVuZCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdCgpCi17Ci0gICAgc3RhdGlj
X2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KS0+c2VsZWN0QWxsKCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAg
ICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0
KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZC1zdGFydCk7Ci19
Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0KikKLXsKLSAg
ICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7Ci0KLSAg
ICAvLyBXZSBvbmx5IHdhbnQgdG8gY2FsbCBvbnNlbGVjdCBpZiB0aGVyZSBhY3R1YWxseSBpcyBh
IHNlbGVjdGlvbgotICAgIGlmICghdy0+aGFzU2VsZWN0ZWRUZXh0KCkpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+
b25TZWxlY3QoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlclNsaWRlcjo6
UmVuZGVyU2xpZGVyKEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3Jt
RWxlbWVudChlbGVtZW50KQotewotICAgIHNldFdpZGdldChuZXcgUVNsaWRlcik7Ci19Ci0KLXZv
aWQgUmVuZGVyU2xpZGVyOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCFt
aW5NYXhLbm93bigpKTsKLSAgICAKLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBi
aWcgaXQgd2FudHMgdG8gYmUuCi0gICAgSW50U2l6ZSBzKHdpZGdldCgpLT5zaXplSGludCgpKTsK
LSAgICBib29sIHdpZHRoU2V0ID0gIXN0eWxlKCktPndpZHRoKCkuaXNBdXRvKCk7Ci0gICAgYm9v
bCBoZWlnaHRTZXQgPSAhc3R5bGUoKS0+aGVpZ2h0KCkuaXNBdXRvKCk7Ci0gICAgaWYgKGhlaWdo
dFNldCAmJiAhd2lkdGhTZXQpIHsKLSAgICAgICAgLy8gRmxpcCB0aGUgaW50cmluc2ljIGRpbWVu
c2lvbnMuCi0gICAgICAgIGludCBiYXJMZW5ndGggPSBzLndpZHRoKCk7Ci0gICAgICAgIHMgPSBJ
bnRTaXplKHMuaGVpZ2h0KCksIGJhckxlbmd0aCk7Ci0gICAgfQotICAgIHNldEludHJpbnNpY1dp
ZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkpOwotICAg
IAotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBS
ZW5kZXJTbGlkZXI6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBTdHJpbmcgdmFsdWUgPSBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+dmFsdWUoKTsKLSAgICBjb25z
dCBBdG9taWNTdHJpbmcmIG1pblN0ciA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihu
b2RlKCkpLT5nZXRBdHRyaWJ1dGUobWluQXR0cik7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBt
YXhTdHIgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmli
dXRlKG1heEF0dHIpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlY2lzaW9uID0gc3RhdGlj
X2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShwcmVjaXNpb25B
dHRyKTsKLSAgICAKLSAgICBkb3VibGUgbWluVmFsID0gbWluU3RyLmlzTnVsbCgpID8gMC4wIDog
bWluU3RyLmRlcHJlY2F0ZWRTdHJpbmcoKS50b0RvdWJsZSgpOwotICAgIGRvdWJsZSBtYXhWYWwg
PSBtYXhTdHIuaXNOdWxsKCkgPyAxMDAuMCA6IG1heFN0ci5kZXByZWNhdGVkU3RyaW5nKCkudG9E
b3VibGUoKTsKLSAgICBtaW5WYWwgPSBtaW4obWluVmFsLCBtYXhWYWwpOyAvLyBNYWtlIHN1cmUg
dGhlIHJhbmdlIGlzIHNhbmUuCi0gICAgCi0gICAgZG91YmxlIHZhbCA9IHZhbHVlLmlzTnVsbCgp
ID8gKG1heFZhbCArIG1pblZhbCkvMi4wIDogdmFsdWUuZGVwcmVjYXRlZFN0cmluZygpLnRvRG91
YmxlKCk7Ci0gICAgdmFsID0gbWF4KG1pblZhbCwgbWluKHZhbCwgbWF4VmFsKSk7IC8vIE1ha2Ug
c3VyZSB2YWwgaXMgd2l0aGluIG1pbi9tYXguCi0gICAgCi0gICAgLy8gRm9yY2UgaW50ZWdlciB2
YWx1ZSBpZiBub3QgZmxvYXQuCi0gICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShwcmVjaXNpb24s
ICJmbG9hdCIpKQotICAgICAgICB2YWwgPSAoaW50KSh2YWwgKyAwLjUpOwotCi0gICAgc3RhdGlj
X2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlKFN0cmluZzo6bnVtYmVy
KHZhbCkpOwotCi0gICAgUVNsaWRlciogc2xpZGVyID0gKFFTbGlkZXIqKXdpZGdldCgpOwotICAg
ICAKLSAgICBzbGlkZXItPnNldE1pblZhbHVlKG1pblZhbCk7Ci0gICAgc2xpZGVyLT5zZXRNYXhW
YWx1ZShtYXhWYWwpOwotICAgIHNsaWRlci0+c2V0VmFsdWUodmFsKTsKLQotICAgIFJlbmRlckZv
cm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclNsaWRlcjo6
dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgUVNsaWRlciogc2xpZGVyID0gc3RhdGljX2Nh
c3Q8UVNsaWRlcio+KHdpZGdldCgpKTsKLQotICAgIGRvdWJsZSB2YWwgPSBzbGlkZXItPnZhbHVl
KCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVjaXNpb24gPSBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKHByZWNpc2lvbkF0dHIpOwotCi0g
ICAgLy8gRm9yY2UgaW50ZWdlciB2YWx1ZSBpZiBub3QgZmxvYXQuCi0gICAgaWYgKCFlcXVhbEln
bm9yaW5nQ2FzZShwcmVjaXNpb24sICJmbG9hdCIpKQotICAgICAgICB2YWwgPSAoaW50KSh2YWwg
KyAwLjUpOwotCi0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNl
dFZhbHVlKFN0cmluZzo6bnVtYmVyKHZhbCkpOwotICAgIAotICAgIC8vIEZpcmUgdGhlICJpbnB1
dCIgRE9NIGV2ZW50LgotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
LT5kaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLX0KK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNlbGVj
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU2VsZWN0LmNwcAko
cmV2aXNpb24gMTQzNDIpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTZWxlY3QuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNCw1ODUgKzI0LDUwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgInJlbmRlcl9mb3JtLmgiCisjaW5jbHVkZSAiUmVuZGVyU2VsZWN0Lmgi
CiAKLSNpbmNsdWRlICJCcm93c2VyRXh0ZW5zaW9uLmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5o
IgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgot
I2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNp
bmNsdWRlICJIVE1MT3B0R3JvdXBFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1l
bnQuaCIKICNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUZXh0
QXJlYUVsZW1lbnQuaCIKICNpbmNsdWRlICJLV1FDb21ib0JveC5oIgotI2luY2x1ZGUgIktXUUZp
bGVCdXR0b24uaCIKLSNpbmNsdWRlICJLV1FMaW5lRWRpdC5oIgotI2luY2x1ZGUgIktXUVNsaWRl
ci5oIgotI2luY2x1ZGUgIktXUVRleHRFZGl0LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2
ZW50LmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBz
dGQ7Cit1c2luZyBzdGQ6Om1pbjsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1l
c3BhY2UgRXZlbnROYW1lczsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLVJlbmRlckZv
cm1FbGVtZW50OjpSZW5kZXJGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVt
ZW50KQotICAgIDogUmVuZGVyV2lkZ2V0KGVsZW1lbnQpCi17Ci0gICAgc2V0SW5saW5lKHRydWUp
OwotfQotCi1SZW5kZXJGb3JtRWxlbWVudDo6flJlbmRlckZvcm1FbGVtZW50KCkKLXsKLX0KLQot
c2hvcnQgUmVuZGVyRm9ybUVsZW1lbnQ6OmJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBp
c1Jvb3RMaW5lQm94ICkgY29uc3QKLXsKLSAgICByZXR1cm4gbWFyZ2luVG9wKCkgKyB3aWRnZXQo
KS0+YmFzZWxpbmVQb3NpdGlvbihtX2hlaWdodCk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1l
bnQ6OnNldFN0eWxlKFJlbmRlclN0eWxlKiBzKQotewotICAgIGlmIChjYW5IYXZlSW50cmluc2lj
TWFyZ2lucygpKQotICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5zSWZBbGxvd2VkKHMpOwotCi0g
ICAgUmVuZGVyV2lkZ2V0OjpzZXRTdHlsZShzKTsKLQotICAgIC8vIERvIG5vdCBwYWludCBhIGJh
Y2tncm91bmQgb3IgYm9yZGVyIGZvciBBcXVhIGZvcm0gZWxlbWVudHMKLSAgICBzZXRTaG91bGRQ
YWludEJhY2tncm91bmRPckJvcmRlcihmYWxzZSk7Ci0KLSAgICBtX3dpZGdldC0+c2V0Rm9udChz
dHlsZSgpLT5mb250KCkpOwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9t
RWxlbWVudCgpCi17Ci0gICAgbV93aWRnZXQtPnNldEVuYWJsZWQoIXN0YXRpY19jYXN0PEhUTUxH
ZW5lcmljRm9ybUVsZW1lbnQqPihub2RlKCkpLT5kaXNhYmxlZCgpKTsKLX0KLQotdm9pZCBSZW5k
ZXJGb3JtRWxlbWVudDo6bGF5b3V0KCkKLXsKLSAgICBLSFRNTEFzc2VydCggbmVlZHNMYXlvdXQo
KSApOwotICAgIEtIVE1MQXNzZXJ0KCBtaW5NYXhLbm93bigpICk7Ci0KLSAgICAvLyBtaW5pbXVt
IGhlaWdodAotICAgIG1faGVpZ2h0ID0gMDsKLQotICAgIGNhbGNXaWR0aCgpOwotICAgIGNhbGNI
ZWlnaHQoKTsKLSAgICAKLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLXZvaWQgUmVu
ZGVyRm9ybUVsZW1lbnQ6OmNsaWNrZWQoV2lkZ2V0KikKLXsKLSAgICBSZW5kZXJBcmVuYSogYXJl
bmEgPSByZWYoKTsKLSAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgZXZlbnQ7IC8vIGdldHMgImN1cnJl
bnQgZXZlbnQiCi0gICAgaWYgKG5vZGUoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8RXZlbnRUYXJn
ZXROb2RlKj4obm9kZSgpKS0+ZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50LCBjbGlja0V2ZW50LCBl
dmVudC5jbGlja0NvdW50KCkpOwotICAgIGRlcmVmKGFyZW5hKTsKLX0KLQotSG9yaXpvbnRhbEFs
aWdubWVudCBSZW5kZXJGb3JtRWxlbWVudDo6dGV4dEFsaWdubWVudCgpIGNvbnN0Ci17Ci0gICAg
c3dpdGNoIChzdHlsZSgpLT50ZXh0QWxpZ24oKSkgewotICAgICAgICBjYXNlIExFRlQ6Ci0gICAg
ICAgIGNhc2UgS0hUTUxfTEVGVDoKLSAgICAgICAgICAgIHJldHVybiBBbGlnbkxlZnQ7Ci0gICAg
ICAgIGNhc2UgUklHSFQ6Ci0gICAgICAgIGNhc2UgS0hUTUxfUklHSFQ6Ci0gICAgICAgICAgICBy
ZXR1cm4gQWxpZ25SaWdodDsKLSAgICAgICAgY2FzZSBDRU5URVI6Ci0gICAgICAgIGNhc2UgS0hU
TUxfQ0VOVEVSOgotICAgICAgICAgICAgcmV0dXJuIEFsaWduSENlbnRlcjsKLSAgICAgICAgY2Fz
ZSBKVVNUSUZZOgotICAgICAgICAgICAgLy8gSnVzdCBmYWxsIGludG8gdGhlIGF1dG8gY29kZSBm
b3IganVzdGlmeS4KLSAgICAgICAgY2FzZSBUQUFVVE86Ci0gICAgICAgICAgICByZXR1cm4gc3R5
bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gQWxpZ25SaWdodCA6IEFsaWduTGVmdDsKLSAgICB9
Ci0gICAgQVNTRVJUKGZhbHNlKTsgLy8gU2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuCi0gICAgcmV0
dXJuIEFsaWduTGVmdDsKLX0KLQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjphZGRJbnRyaW5z
aWNNYXJnaW5zSWZBbGxvd2VkKFJlbmRlclN0eWxlKiBfc3R5bGUpCi17Ci0gICAgLy8gQ3V0IG91
dCB0aGUgaW50cmluc2ljIG1hcmdpbnMgY29tcGxldGVseSBpZiB3ZSBlbmQgdXAgdXNpbmcgbWlu
aSBjb250cm9scy4KLSAgICBpZiAoX3N0eWxlLT5mb250U2l6ZSgpIDwgMTEpCi0gICAgICAgIHJl
dHVybjsKLSAgICAKLSAgICAvLyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBu
b3QgYWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCi0gICAg
aW50IG0gPSBpbnRyaW5zaWNNYXJnaW4oKTsKLSAgICBpZiAoX3N0eWxlLT53aWR0aCgpLmlzSW50
cmluc2ljT3JBdXRvKCkpIHsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luTGVmdCgpLnF1aXJr
KCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpbkxlZnQoTGVuZ3RoKG0sIEZpeGVkKSk7
Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkKLSAgICAgICAgICAg
IF9zdHlsZS0+c2V0TWFyZ2luUmlnaHQoTGVuZ3RoKG0sIEZpeGVkKSk7Ci0gICAgfQotCi0gICAg
aWYgKF9zdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpIHsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFy
Z2luVG9wKCkucXVpcmsoKSkKLSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0
aChtLCBGaXhlZCkpOwotICAgICAgICBpZiAoX3N0eWxlLT5tYXJnaW5Cb3R0b20oKS5xdWlyaygp
KQotICAgICAgICAgICAgX3N0eWxlLT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKG0sIEZpeGVkKSk7
Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckltYWdlQnV0
dG9uOjpSZW5kZXJJbWFnZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50ICplbGVtZW50KQotICAgIDog
UmVuZGVySW1hZ2UoZWxlbWVudCkKLXsKLSAgICAvLyAjIyMgc3VwcG9ydCBET01BY3RpdmF0ZSBl
dmVudCB3aGVuIGNsaWNrZWQKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxpbmVFZGl0OjpSZW5kZXJMaW5lRWRpdChI
VE1MSW5wdXRFbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVu
dCksIG1fdXBkYXRpbmcoZmFsc2UpCi17Ci0gICAgUUxpbmVFZGl0OjpUeXBlIHR5cGU7Ci0gICAg
c3dpdGNoIChlbGVtZW50LT5pbnB1dFR5cGUoKSkgewotICAgICAgICBjYXNlIEhUTUxJbnB1dEVs
ZW1lbnQ6OlBBU1NXT1JEOgotICAgICAgICAgICAgdHlwZSA9IFFMaW5lRWRpdDo6UGFzc3dvcmQ7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIVE1MSW5wdXRFbGVtZW50OjpTRUFS
Q0g6Ci0gICAgICAgICAgICB0eXBlID0gUUxpbmVFZGl0OjpTZWFyY2g7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHR5cGUgPSBRTGluZUVkaXQ6Ok5v
cm1hbDsKLSAgICB9Ci0gICAgUUxpbmVFZGl0KiBlZGl0ID0gbmV3IFFMaW5lRWRpdCh0eXBlKTsK
LSAgICBpZiAodHlwZSA9PSBRTGluZUVkaXQ6OlNlYXJjaCkKLSAgICAgICAgZWRpdC0+c2V0TGl2
ZVNlYXJjaChmYWxzZSk7Ci0gICAgc2V0V2lkZ2V0KGVkaXQpOwotfQotCi12b2lkIFJlbmRlckxp
bmVFZGl0OjpzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgLy8gV2Ugb25seSB3YW50
IHRvIGNhbGwgb25zZWxlY3QgaWYgdGhlcmUgYWN0dWFsbHkgaXMgYSBzZWxlY3Rpb24KLSAgICBR
TGluZUVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCk7Ci0gICAgaWYg
KHctPmhhc1NlbGVjdGVkVGV4dCgpKQotICAgICAgICBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50Kj4obm9kZSgpKS0+b25TZWxlY3QoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRp
dDo6cmV0dXJuUHJlc3NlZChXaWRnZXQqKQotewotICAgIC8vIEVtaXQgb25DaGFuZ2UgaWYgbmVj
ZXNzYXJ5Ci0gICAgLy8gV29ya3MgYnV0IG1pZ2h0IG5vdCBiZSBlbm91Z2gsIGRpcmsgc2FpZCBo
ZSBoYWQgYW5vdGhlciBzb2x1dGlvbiBhdAotICAgIC8vIGhhbmQgKGNhbid0IHJlbWVtYmVyIHdo
aWNoKSAtIERhdmlkCi0gICAgaWYgKGlzVGV4dEZpZWxkKCkgJiYgaXNFZGl0ZWQoKSkgewotICAg
ICAgICBzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+b25DaGFu
Z2UoKTsKLSAgICAgICAgc2V0RWRpdGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAoSFRNTEZv
cm1FbGVtZW50KiBmZSA9IHN0YXRpY19jYXN0PEhUTUxHZW5lcmljRm9ybUVsZW1lbnQqPihub2Rl
KCkpLT5mb3JtKCkpCi0gICAgICAgIGZlLT5zdWJtaXRDbGljaygpOwotfQotCi12b2lkIFJlbmRl
ckxpbmVFZGl0OjpwZXJmb3JtU2VhcmNoKFdpZGdldCopCi17Ci0gICAgLy8gRmlyZSB0aGUgInNl
YXJjaCIgRE9NIGV2ZW50LgotICAgIHN0YXRpY19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5vZGUo
KSktPmRpc3BhdGNoSFRNTEV2ZW50KHNlYXJjaEV2ZW50LCB0cnVlLCBmYWxzZSk7Ci19Ci0KLXZv
aWQgUmVuZGVyTGluZUVkaXQ6OmFkZFNlYXJjaFJlc3VsdCgpCi17Ci0gICAgaWYgKHdpZGdldCgp
KQotICAgICAgICBzdGF0aWNfY2FzdDxRTGluZUVkaXQqPih3aWRnZXQoKSktPmFkZFNlYXJjaFJl
c3VsdCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpjYWxjTWluTWF4V2lkdGgoKQotewot
ICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLQotICAgIC8vIExldCB0aGUgd2lkZ2V0
IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAgICBtX3VwZGF0aW5nID0gdHJ1ZTsK
LSAgICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5z
aXplKCk7Ci0gICAgSW50U2l6ZSBzKHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+
c2l6ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8gc2l6ZSA6IDIwKSk7Ci0gICAgbV91cGRh
dGluZyA9IGZhbHNlOwotCi0gICAgc2V0SW50cmluc2ljV2lkdGgocy53aWR0aCgpKTsKLSAgICBz
ZXRJbnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6
Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFN0eWxlKFJl
bmRlclN0eWxlICpzKQotewotICAgIFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShzKTsKLQot
ICAgIFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKTsKLSAg
ICB3LT5zZXRBbGlnbm1lbnQodGV4dEFsaWdubWVudCgpKTsKLSAgICB3LT5zZXRXcml0aW5nRGly
ZWN0aW9uKHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IFJUTCA6IExUUik7Ci19Ci0KLXZv
aWQgUmVuZGVyTGluZUVkaXQ6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBIVE1MSW5wdXRF
bGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7Ci0gICAg
UUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4od2lkZ2V0KCkpOwotICAgIAot
ICAgIGludCBtbCA9IGUtPm1heExlbmd0aCgpOwotICAgIGlmIChtbCA8PSAwIHx8IG1sID4gMTAy
NCkKLSAgICAgICAgbWwgPSAxMDI0OwotICAgIGlmICh3LT5tYXhMZW5ndGgoKSAhPSBtbCkKLSAg
ICAgICAgdy0+c2V0TWF4TGVuZ3RoKG1sKTsKLQotICAgIGlmICghZS0+dmFsdWVNYXRjaGVzUmVu
ZGVyZXIoKSkgewotICAgICAgICBTdHJpbmcgd2lkZ2V0VGV4dCA9IHctPnRleHQoKTsKLSAgICAg
ICAgU3RyaW5nIG5ld1RleHQgPSBlLT52YWx1ZSgpOwotICAgICAgICBuZXdUZXh0LnJlcGxhY2Uo
J1xcJywgYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgaWYgKHdpZGdldFRl
eHQgIT0gbmV3VGV4dCkgewotICAgICAgICAgICAgaW50IHBvcyA9IHctPmN1cnNvclBvc2l0aW9u
KCk7Ci0KLSAgICAgICAgICAgIG1fdXBkYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgdy0+c2V0
VGV4dChuZXdUZXh0KTsKLSAgICAgICAgICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgdy0+c2V0RWRpdGVkKCBmYWxzZSApOwotCi0gICAgICAgICAgICB3
LT5zZXRDdXJzb3JQb3NpdGlvbihwb3MpOwotICAgICAgICB9Ci0gICAgICAgIGUtPnNldFZhbHVl
TWF0Y2hlc1JlbmRlcmVyKCk7Ci0gICAgfQotCi0gICAgdy0+c2V0UmVhZE9ubHkoZS0+aXNSZWFk
T25seUNvbnRyb2woKSk7Ci0gICAgCi0gICAgLy8gSGFuZGxlIHVwZGF0aW5nIHRoZSBzZWFyY2gg
YXR0cmlidXRlcy4KLSAgICB3LT5zZXRQbGFjZWhvbGRlclN0cmluZyhlLT5nZXRBdHRyaWJ1dGUo
cGxhY2Vob2xkZXJBdHRyKS5kZXByZWNhdGVkU3RyaW5nKCkpOwotICAgIGlmICh3LT50eXBlKCkg
PT0gUUxpbmVFZGl0OjpTZWFyY2gpIHsKLSAgICAgICAgdy0+c2V0TGl2ZVNlYXJjaCghZS0+Z2V0
QXR0cmlidXRlKGluY3JlbWVudGFsQXR0cikuaXNOdWxsKCkpOwotICAgICAgICB3LT5zZXRBdXRv
U2F2ZU5hbWUoZS0+Z2V0QXR0cmlidXRlKGF1dG9zYXZlQXR0cikpOwotICAgICAgICB3LT5zZXRN
YXhSZXN1bHRzKGUtPm1heFJlc3VsdHMoKSk7Ci0gICAgfQotCi0gICAgdy0+c2V0Q29sb3JzKHN0
eWxlKCktPmJhY2tncm91bmRDb2xvcigpLCBzdHlsZSgpLT5jb2xvcigpKTsKLQotICAgIFJlbmRl
ckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlckxpbmVF
ZGl0Ojp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV91cGRhdGluZykgLy8gRG9u
J3QgYWx0ZXIgdGhlIHZhbHVlIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGluaXRpbmcgdGhl
IGNvbnRyb2wsIHNpbmNlCi0gICAgICAgIHJldHVybjsgICAgIC8vIHdlIGFyZSBnZXR0aW5nIHRo
ZSB2YWx1ZSBmcm9tIHRoZSBET00gYW5kIGl0J3Mgbm90IHVzZXIgaW5wdXQuCi0KLSAgICBTdHJp
bmcgbmV3VGV4dCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KHdpZGdldCgpKS0+dGV4dCgpOwot
Ci0gICAgLy8gQSBudWxsIHN0cmluZyB2YWx1ZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhl
IGZvcm0gY29udHJvbCBoYXMgbm90IGFsdGVyZWQgdGhlIG9yaWdpbmFsCi0gICAgLy8gZGVmYXVs
dCB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbmV2ZXIgdXNlIHRoZSBudWxsIHN0
cmluZyB2YWx1ZSB3aGVuIHRoZSB1c2VyCi0gICAgLy8gZW1wdGllcyBhIHRleHRmaWVsZCwgYnV0
IHNob3VsZCBhbHdheXMgZm9yY2UgYW4gZW1wdHkgdGV4dGZpZWxkIHRvIHVzZSB0aGUgZW1wdHkg
c3RyaW5nLgotICAgIGlmIChuZXdUZXh0LmlzTnVsbCgpKQotICAgICAgICBuZXdUZXh0ID0gIiI7
Ci0KLSAgICBuZXdUZXh0LnJlcGxhY2UoYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpLCAnXFwn
KTsKLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVG
cm9tUmVuZGVyZXIobmV3VGV4dCk7Ci19Ci0KLWludCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9u
U3RhcnQoKQotewotICAgIFFMaW5lRWRpdCAqbGluZUVkaXQgPSBzdGF0aWNfY2FzdDxRTGluZUVk
aXQgKj4obV93aWRnZXQpOwotICAgIGludCBzdGFydCA9IGxpbmVFZGl0LT5zZWxlY3Rpb25TdGFy
dCgpOwotICAgIGlmIChzdGFydCA9PSAtMSkKLSAgICAgICAgc3RhcnQgPSBsaW5lRWRpdC0+Y3Vy
c29yUG9zaXRpb24oKTsKLSAgICByZXR1cm4gc3RhcnQ7Ci19Ci0KLWludCBSZW5kZXJMaW5lRWRp
dDo6c2VsZWN0aW9uRW5kKCkKLXsKLSAgICBRTGluZUVkaXQgKmxpbmVFZGl0ID0gc3RhdGljX2Nh
c3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICBpbnQgc3RhcnQgPSBsaW5lRWRpdC0+c2Vs
ZWN0aW9uU3RhcnQoKTsKLSAgICBpZiAoc3RhcnQgPT0gLTEpCi0gICAgICAgIHJldHVybiBsaW5l
RWRpdC0+Y3Vyc29yUG9zaXRpb24oKTsKLSAgICByZXR1cm4gc3RhcnQgKyAoaW50KWxpbmVFZGl0
LT5zZWxlY3RlZFRleHQoKS5sZW5ndGgoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2V0
U2VsZWN0aW9uU3RhcnQoaW50IHN0YXJ0KQotewotICAgIGludCByZWFsU3RhcnQgPSBtYXgoc3Rh
cnQsIDApOwotICAgIGludCBsZW5ndGggPSBtYXgoc2VsZWN0aW9uRW5kKCkgLSByZWFsU3RhcnQs
IDApOwotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlv
bihyZWFsU3RhcnQsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVj
dGlvbkVuZChpbnQgZW5kKQotewotICAgIGludCBzdGFydCA9IHNlbGVjdGlvblN0YXJ0KCk7Ci0g
ICAgaW50IHJlYWxFbmQgPSBtYXgoZW5kLCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gcmVhbEVuZCAt
IHN0YXJ0OwotICAgIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgICAgIHN0YXJ0ID0gcmVhbEVuZDsK
LSAgICAgICAgbGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+
KG1fd2lkZ2V0KS0+c2V0U2VsZWN0aW9uKHN0YXJ0LCBsZW5ndGgpOwotfQotCi12b2lkIFJlbmRl
ckxpbmVFZGl0OjpzZWxlY3QoKQotewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1fd2lk
Z2V0KS0+c2VsZWN0QWxsKCk7Ci19Ci0KLWJvb2wgUmVuZGVyTGluZUVkaXQ6OmlzRWRpdGVkKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRnZXQpLT5l
ZGl0ZWQoKTsKLX0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldEVkaXRlZChib29sIHgpCi17Ci0g
ICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0Kj4obV93aWRnZXQpLT5zZXRFZGl0ZWQoeCk7Ci19Ci0K
LXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFydCwgaW50IGVu
ZCkKLXsKLSAgICBpbnQgcmVhbFN0YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3Ro
ID0gbWF4KGVuZCAtIHJlYWxTdGFydCwgMCk7Ci0gICAgc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+
KG1fd2lkZ2V0KS0+c2V0U2VsZWN0aW9uKHJlYWxTdGFydCwgbGVuZ3RoKTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckZpZWxkc2V0OjpSZW5kZXJGaWVsZHNldChIVE1MR2Vu
ZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KQotOiBSZW5kZXJCbG9jayhlbGVtZW50KQotewotfQot
Ci1SZW5kZXJPYmplY3QqIFJlbmRlckZpZWxkc2V0OjpsYXlvdXRMZWdlbmQoYm9vbCByZWxheW91
dENoaWxkcmVuKQotewotICAgIFJlbmRlck9iamVjdCogbGVnZW5kID0gZmluZExlZ2VuZCgpOwot
ICAgIGlmIChsZWdlbmQpIHsKLSAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4pCi0gICAgICAg
ICAgICBsZWdlbmQtPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICBsZWdlbmQtPmxheW91
dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgaW50IHhQb3MgPSBib3JkZXJMZWZ0KCkgKyBwYWRkaW5n
TGVmdCgpICsgbGVnZW5kLT5tYXJnaW5MZWZ0KCk7Ci0gICAgICAgIGlmIChzdHlsZSgpLT5kaXJl
Y3Rpb24oKSA9PSBSVEwpCi0gICAgICAgICAgICB4UG9zID0gbV93aWR0aCAtIHBhZGRpbmdSaWdo
dCgpIC0gYm9yZGVyUmlnaHQoKSAtIGxlZ2VuZC0+d2lkdGgoKSAtIGxlZ2VuZC0+bWFyZ2luUmln
aHQoKTsKLSAgICAgICAgaW50IGIgPSBib3JkZXJUb3AoKTsKLSAgICAgICAgaW50IGggPSBsZWdl
bmQtPmhlaWdodCgpOwotICAgICAgICBsZWdlbmQtPnNldFBvcyh4UG9zLCBtYXgoKGItaCkvMiwg
MCkpOwotICAgICAgICBtX2hlaWdodCA9IG1heChiLGgpICsgcGFkZGluZ1RvcCgpOwotICAgIH0K
LSAgICByZXR1cm4gbGVnZW5kOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckZpZWxkc2V0Ojpm
aW5kTGVnZW5kKCkKLXsKLSAgICBmb3IgKFJlbmRlck9iamVjdCogbGVnZW5kID0gZmlyc3RDaGls
ZCgpOyBsZWdlbmQ7IGxlZ2VuZCA9IGxlZ2VuZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgaWYg
KCFsZWdlbmQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSAmJiBsZWdlbmQtPmVsZW1lbnQoKSAm
JgotICAgICAgICAgIGxlZ2VuZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCi0g
ICAgICAgIHJldHVybiBsZWdlbmQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFJl
bmRlckZpZWxkc2V0OjpwYWludEJveERlY29yYXRpb25zKFBhaW50SW5mbyYgaSwgaW50IF90eCwg
aW50IF90eSkKLXsKLSAgICBpbnQgdyA9IHdpZHRoKCk7Ci0gICAgaW50IGggPSBoZWlnaHQoKSAr
IGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpOwotICAgIFJlbmRlck9iamVj
dCogbGVnZW5kID0gZmluZExlZ2VuZCgpOwotICAgIGlmICghbGVnZW5kKQotICAgICAgICByZXR1
cm4gUmVuZGVyQmxvY2s6OnBhaW50Qm94RGVjb3JhdGlvbnMoaSwgX3R4LCBfdHkpOwotCi0gICAg
aW50IHlPZmYgPSAobGVnZW5kLT55UG9zKCkgPiAwKSA/IDAgOiAobGVnZW5kLT5oZWlnaHQoKS1i
b3JkZXJUb3AoKSkvMjsKLSAgICBoIC09IHlPZmY7Ci0gICAgX3R5ICs9IHlPZmYgLSBib3JkZXJU
b3BFeHRyYSgpOwotCi0gICAgaW50IG15ID0gbWF4KF90eSwgaS5yLnkoKSk7Ci0gICAgaW50IGVu
ZCA9IG1pbihpLnIuYm90dG9tKCksICBfdHkgKyBoKTsKLSAgICBpbnQgbWggPSBlbmQgLSBteTsK
LQotICAgIHBhaW50QmFja2dyb3VuZChpLnAsIHN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpLCBz
dHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCksIG15LCBtaCwgX3R4LCBfdHksIHcsIGgpOwotCi0g
ICAgaWYgKHN0eWxlKCktPmhhc0JvcmRlcigpKQotICAgICAgICBwYWludEJvcmRlck1pbnVzTGVn
ZW5kKGkucCwgX3R4LCBfdHksIHcsIGgsIHN0eWxlKCksIGxlZ2VuZC0+eFBvcygpLCBsZWdlbmQt
PndpZHRoKCkpOwotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpwYWludEJvcmRlck1pbnVzTGVn
ZW5kKEdyYXBoaWNzQ29udGV4dCogcCwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGludCBoLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJT
dHlsZSogc3R5bGUsIGludCBseCwgaW50IGx3KQotewotCi0gICAgY29uc3QgQ29sb3ImIHRjID0g
c3R5bGUtPmJvcmRlclRvcENvbG9yKCk7Ci0gICAgY29uc3QgQ29sb3ImIGJjID0gc3R5bGUtPmJv
cmRlckJvdHRvbUNvbG9yKCk7Ci0KLSAgICBFQm9yZGVyU3R5bGUgdHMgPSBzdHlsZS0+Ym9yZGVy
VG9wU3R5bGUoKTsKLSAgICBFQm9yZGVyU3R5bGUgYnMgPSBzdHlsZS0+Ym9yZGVyQm90dG9tU3R5
bGUoKTsKLSAgICBFQm9yZGVyU3R5bGUgbHMgPSBzdHlsZS0+Ym9yZGVyTGVmdFN0eWxlKCk7Ci0g
ICAgRUJvcmRlclN0eWxlIHJzID0gc3R5bGUtPmJvcmRlclJpZ2h0U3R5bGUoKTsKLQotICAgIGJv
b2wgcmVuZGVyX3QgPSB0cyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfbCA9IGxzID4gQkhJ
RERFTjsKLSAgICBib29sIHJlbmRlcl9yID0gcnMgPiBCSElEREVOOwotICAgIGJvb2wgcmVuZGVy
X2IgPSBicyA+IEJISURERU47Ci0KLSAgICBpZihyZW5kZXJfdCkgewotICAgICAgICBkcmF3Qm9y
ZGVyKHAsIF90eCwgX3R5LCBfdHggKyBseCwgX3R5ICsgIHN0eWxlLT5ib3JkZXJUb3BXaWR0aCgp
LCBCU1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywKLSAgICAgICAgICAgICAgICAgICAocmVu
ZGVyX2wgJiYgKGxzID09IERPVFRFRCB8fCBscyA9PSBEQVNIRUQgfHwgbHMgPT0gRE9VQkxFKT9z
dHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCk6MCksIDApOwotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90
eCtseCtsdywgX3R5LCBfdHggKyB3LCBfdHkgKyAgc3R5bGUtPmJvcmRlclRvcFdpZHRoKCksIEJT
VG9wLCB0Yywgc3R5bGUtPmNvbG9yKCksIHRzLAotICAgICAgICAgICAgICAgICAgIDAsIChyZW5k
ZXJfciAmJiAocnMgPT0gRE9UVEVEIHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VCTEUpP3N0
eWxlLT5ib3JkZXJSaWdodFdpZHRoKCk6MCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRlcl9iKQot
ICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCwgX3R5ICsgaCAtIHN0eWxlLT5ib3JkZXJCb3R0b21X
aWR0aCgpLCBfdHggKyB3LCBfdHkgKyBoLCBCU0JvdHRvbSwgYmMsIHN0eWxlLT5jb2xvcigpLCBi
cywKLSAgICAgICAgICAgICAgICAgICAocmVuZGVyX2wgJiYgKGxzID09IERPVFRFRCB8fCBscyA9
PSBEQVNIRUQgfHwgbHMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCk6MCksCi0g
ICAgICAgICAgICAgICAgICAgKHJlbmRlcl9yICYmIChycyA9PSBET1RURUQgfHwgcnMgPT0gREFT
SEVEIHx8IHJzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKTowKSk7Ci0KLSAg
ICBpZihyZW5kZXJfbCkKLSAgICB7Ci0gICAgICAgIGNvbnN0IENvbG9yJiBsYyA9IHN0eWxlLT5i
b3JkZXJMZWZ0Q29sb3IoKTsKLQotICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAgICAgICAg
ICAgKHRjID09IGxjKSAmJgotICAgICAgICAgICAgKGxzID49IE9VVFNFVCkgJiYKLSAgICAgICAg
ICAgICh0cyA9PSBET1RURUQgfHwgdHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8IHRzID09
IE9VVFNFVCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAgICAgIChi
YyA9PSBsYykgJiYKLSAgICAgICAgICAgIChscyA+PSBPVVRTRVQpICYmCi0gICAgICAgICAgICAo
YnMgPT0gRE9UVEVEIHx8IGJzID09IERBU0hFRCB8fCBicyA9PSBTT0xJRCB8fCBicyA9PSBJTlNF
VCk7Ci0KLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgc3R5bGUtPmJvcmRl
ckxlZnRXaWR0aCgpLCBfdHkgKyBoLCBCU0xlZnQsIGxjLCBzdHlsZS0+Y29sb3IoKSwgbHMsCi0g
ICAgICAgICAgICAgICAgICAgaWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLAot
ICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9tV2lk
dGgoKSk7Ci0gICAgfQotCi0gICAgaWYocmVuZGVyX3IpCi0gICAgewotICAgICAgICBjb25zdCBD
b2xvciYgcmMgPSBzdHlsZS0+Ym9yZGVyUmlnaHRDb2xvcigpOwotCi0gICAgICAgIGJvb2wgaWdu
b3JlX3RvcCA9Ci0gICAgICAgICAgICAodGMgPT0gcmMpICYmCi0gICAgICAgICAgICAocnMgPj0g
RE9UVEVEIHx8IHJzID09IElOU0VUKSAmJgotICAgICAgICAgICAgKHRzID09IERPVFRFRCB8fCB0
cyA9PSBEQVNIRUQgfHwgdHMgPT0gU09MSUQgfHwgdHMgPT0gT1VUU0VUKTsKLQotICAgICAgICBi
b29sIGlnbm9yZV9ib3R0b20gPQotICAgICAgICAgICAgKGJjID09IHJjKSAmJgotICAgICAgICAg
ICAgKHJzID49IERPVFRFRCB8fCBycyA9PSBJTlNFVCkgJiYKLSAgICAgICAgICAgIChicyA9PSBE
T1RURUQgfHwgYnMgPT0gREFTSEVEIHx8IGJzID09IFNPTElEIHx8IGJzID09IElOU0VUKTsKLQot
ICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCArIHcgLSBzdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgp
LCBfdHksIF90eCArIHcsIF90eSArIGgsIEJTUmlnaHQsIHJjLCBzdHlsZS0+Y29sb3IoKSwgcnMs
Ci0gICAgICAgICAgICAgICAgICAgaWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0aCgp
LAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90dG9t
V2lkdGgoKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpzZXRTdHlsZShSZW5k
ZXJTdHlsZSogX3N0eWxlKQotewotICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShfc3R5bGUpOwot
Ci0gICAgLy8gV2luSUUgcmVuZGVycyBmaWVsZHNldHMgd2l0aCBkaXNwbGF5OmlubGluZSBsaWtl
IHRoZXkncmUgaW5saW5lLWJsb2Nrcy4gIEZvciB1cywKLSAgICAvLyBhbiBpbmxpbmUtYmxvY2sg
aXMganVzdCBhIGJsb2NrIGVsZW1lbnQgd2l0aCByZXBsYWNlZCBzZXQgdG8gdHJ1ZSBhbmQgaW5s
aW5lIHNldAotICAgIC8vIHRvIHRydWUuICBFbnN1cmUgdGhhdCBpZiB3ZSBlbmRlZCB1cCBiZWlu
ZyBpbmxpbmUgdGhhdCB3ZSBzZXQgb3VyIHJlcGxhY2VkIGZsYWcKLSAgICAvLyBzbyB0aGF0IHdl
J3JlIHRyZWF0ZWQgbGlrZSBhbiBpbmxpbmUtYmxvY2suCi0gICAgaWYgKGlzSW5saW5lKCkpCi0g
ICAgICAgIHNldFJlcGxhY2VkKHRydWUpOwotfSAgICAKLSAgICAKLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotUmVuZGVyRmlsZUJ1dHRvbjo6UmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50
ICplbGVtZW50KQorUmVuZGVyU2VsZWN0OjpSZW5kZXJTZWxlY3QoSFRNTFNlbGVjdEVsZW1lbnQq
IGVsZW1lbnQpCiAgICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQorICAgICwgbV9zaXpl
KGVsZW1lbnQtPnNpemUoKSkKKyAgICAsIG1fbXVsdGlwbGUoZWxlbWVudC0+bXVsdGlwbGUoKSkK
KyAgICAsIG1fdXNlTGlzdEJveChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpCisgICAgLCBtX3Nl
bGVjdGlvbkNoYW5nZWQodHJ1ZSkKKyAgICAsIG1faWdub3JlU2VsZWN0RXZlbnRzKGZhbHNlKQor
ICAgICwgbV9vcHRpb25zQ2hhbmdlZCh0cnVlKQogewotICAgIHNldFdpZGdldChuZXcgS1dRRmls
ZUJ1dHRvbih2aWV3KCktPmZyYW1lKCkpKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpj
YWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLQot
ICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAg
ICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zaXpl
KCk7Ci0gICAgSW50U2l6ZSBzKHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24gKj4od2lkZ2V0KCkp
LT5zaXplRm9yQ2hhcmFjdGVyV2lkdGgoc2l6ZSA+IDAgPyBzaXplIDogMjApKTsKLQotICAgIHNl
dEludHJpbnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVp
Z2h0KCkpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQot
Ci12b2lkIFJlbmRlckZpbGVCdXR0b246OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBzdGF0
aWNfY2FzdDxLV1FGaWxlQnV0dG9uKj4od2lkZ2V0KCkpLT5zZXRGaWxlbmFtZSgKLSAgICAgICAg
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnZhbHVlKCkuZGVwcmVjYXRl
ZFN0cmluZygpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgp
OwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OnJldHVyblByZXNzZWQoV2lkZ2V0KikKLXsK
LSAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmZvcm0oKSkK
LSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmZvcm0oKS0+
cHJlcGFyZVN1Ym1pdCgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OnZhbHVlQ2hhbmdl
ZChXaWRnZXQqKQotewotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
LT5zZXRWYWx1ZUZyb21SZW5kZXJlcihzdGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uKj4od2lkZ2V0
KCkpLT5maWxlbmFtZSgpKTsKLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9k
ZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpzZWxlY3QoKQot
ewotfQotCi0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6Y2xpY2soYm9vbCBzZW5kTW91c2VFdmVu
dHMpCi17Ci0gICAgc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbiAqPih3aWRnZXQoKSktPmNsaWNr
KHNlbmRNb3VzZUV2ZW50cyk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJM
YWJlbDo6UmVuZGVyTGFiZWwoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6
IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCi17Ci0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1SZW5kZXJMZWdlbmQ6OlJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICpl
bGVtZW50KQotICAgIDogUmVuZGVyQmxvY2soZWxlbWVudCkKLXsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1SZW5kZXJTZWxlY3Q6OlJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVudCAq
ZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCi17Ci0gICAgbV9pZ25v
cmVTZWxlY3RFdmVudHMgPSBmYWxzZTsKLSAgICBtX211bHRpcGxlID0gZWxlbWVudC0+bXVsdGlw
bGUoKTsKLSAgICBtX3NpemUgPSBlbGVtZW50LT5zaXplKCk7Ci0gICAgbV91c2VMaXN0Qm94ID0g
KG1fbXVsdGlwbGUgfHwgbV9zaXplID4gMSk7Ci0gICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1
ZTsKLSAgICBtX29wdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKLQogICAgIGlmIChtX3VzZUxpc3RCb3gp
CiAgICAgICAgIHNldFdpZGdldChjcmVhdGVMaXN0Qm94KCkpOwogICAgIGVsc2UKICAgICAgICAg
c2V0V2lkZ2V0KG5ldyBRQ29tYm9Cb3gpOwogfQogCi0KIHZvaWQgUmVuZGVyU2VsZWN0OjpzZXRX
aWRnZXRXcml0aW5nRGlyZWN0aW9uKCkKIHsKICAgICBUZXh0RGlyZWN0aW9uIGQgPSBzdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBSVEwgPyBSVEwgOiBMVFI7CiAgICAgaWYgKG1fdXNlTGlzdEJveCkK
LSAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3ggKj4obV93aWRnZXQpLT5zZXRXcml0aW5nRGly
ZWN0aW9uKGQpOworICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+c2V0
V3JpdGluZ0RpcmVjdGlvbihkKTsKICAgICBlbHNlCi0gICAgICAgIHN0YXRpY19jYXN0PFFDb21i
b0JveCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7CisgICAgICAgIHN0YXRp
Y19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+c2V0V3JpdGluZ0RpcmVjdGlvbihkKTsKIH0K
IAotdm9pZCBSZW5kZXJTZWxlY3Q6OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQordm9pZCBSZW5k
ZXJTZWxlY3Q6OnNldFN0eWxlKFJlbmRlclN0eWxlKiBzKQogewogICAgIFJlbmRlckZvcm1FbGVt
ZW50OjpzZXRTdHlsZShzKTsKICAgICBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7CiB9CiAK
LQogdm9pZCBSZW5kZXJTZWxlY3Q6OnVwZGF0ZUZyb21FbGVtZW50KCkKIHsKICAgICBtX2lnbm9y
ZVNlbGVjdEV2ZW50cyA9IHRydWU7CkBAIC02MzYsNyArMTAxLDcgQEAgdm9pZCBSZW5kZXJTZWxl
Y3Q6OnVwZGF0ZUZyb21FbGVtZW50KCkKICAgICB9CiAKICAgICAvLyB1cGRhdGUgY29udGVudHMg
bGlzdGJveC9jb21ib2JveCBiYXNlZCBvbiBvcHRpb25zIGluIG1fZWxlbWVudAotICAgIGlmICgg
bV9vcHRpb25zQ2hhbmdlZCApIHsKKyAgICBpZiAobV9vcHRpb25zQ2hhbmdlZCkgewogICAgICAg
ICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5tX3JlY2FsY0xp
c3RJdGVtcykKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9k
ZSgpKS0+cmVjYWxjTGlzdEl0ZW1zKCk7CiAgICAgICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxl
bWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgp
KS0+bGlzdEl0ZW1zKCk7CkBAIC02NTAsNyArMTE1LDcgQEAgdm9pZCBSZW5kZXJTZWxlY3Q6OnVw
ZGF0ZUZyb21FbGVtZW50KCkKICAgICAgICAgYm9vbCBncm91cEVuYWJsZWQgPSB0cnVlOwogICAg
ICAgICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRleCA8IGludChsaXN0SXRlbXMuc2l6ZSgp
KTsgbGlzdEluZGV4KyspIHsKICAgICAgICAgICAgIGlmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+
aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAgICAgICAgICAgICBIVE1MT3B0R3JvdXBF
bGVtZW50ICpvcHRncm91cEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0R3JvdXBFbGVtZW50
Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOworICAgICAgICAgICAgICAgIEhUTUxPcHRHcm91cEVs
ZW1lbnQqIG9wdGdyb3VwRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxPcHRHcm91cEVsZW1lbnQq
PihsaXN0SXRlbXNbbGlzdEluZGV4XSk7CiAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZFN0cmlu
ZyBsYWJlbCA9IG9wdGdyb3VwRWxlbWVudC0+Z2V0QXR0cmlidXRlKGxhYmVsQXR0cikuZGVwcmVj
YXRlZFN0cmluZygpOwogICAgICAgICAgICAgICAgIGxhYmVsLnJlcGxhY2UoJ1xcJywgYmFja3Ns
YXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKICAgICAgICAgICAgICAgICAKQEAgLTY2Niw5ICsxMzEs
OCBAQCB2b2lkIFJlbmRlclNlbGVjdDo6dXBkYXRlRnJvbUVsZW1lbnQoKQogICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+YXBwZW5kR3JvdXBMYWJl
bChsYWJlbCwgZ3JvdXBFbmFibGVkKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAg
ICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5kR3JvdXBM
YWJlbChsYWJlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0SXRl
bXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAgICAg
SFRNTE9wdGlvbkVsZW1lbnQgKm9wdGlvbkVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudCo+KGxpc3RJdGVtc1tsaXN0SW5kZXhdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAo
bGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgeworICAgICAgICAg
ICAgICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb25FbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbbGlzdEluZGV4XSk7CiAgICAgICAgICAgICAgICAg
RGVwcmVjYXRlZFN0cmluZyBpdGVtVGV4dDsKICAgICAgICAgICAgICAgICBpZiAob3B0aW9uRWxl
bWVudC0+aGFzQXR0cmlidXRlKGxhYmVsQXR0cikpCiAgICAgICAgICAgICAgICAgICAgIGl0ZW1U
ZXh0ID0gb3B0aW9uRWxlbWVudC0+Z2V0QXR0cmlidXRlKGxhYmVsQXR0cikuZGVwcmVjYXRlZFN0
cmluZygpOwpAQCAtNjg5LDEzICsxNTMsMTEgQEAgdm9pZCBSZW5kZXJTZWxlY3Q6OnVwZGF0ZUZy
b21FbGVtZW50KCkKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPiht
X3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVt
ZW50LT5pc0VuYWJsZWQoKSk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRl
eHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+aGFzVGFn
TmFtZShoclRhZykpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdEl0ZW1zW2xpc3RJbmRl
eF0tPmhhc1RhZ05hbWUoaHJUYWcpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtX3VzZUxpc3RC
b3gpCiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0
KS0+YXBwZW5kU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgS0hUTUxBc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAgICAgQVNTRVJUKGZhbHNlKTsKICAgICAgICAgICAgIG1fc2VsZWN0aW9uQ2hh
bmdlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKQEAgLTcx
NCw4ICsxNzYsNyBAQCB2b2lkIFJlbmRlclNlbGVjdDo6dXBkYXRlRnJvbUVsZW1lbnQoKQogICAg
IFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwogfQogCi0KLXNob3J0IFJl
bmRlclNlbGVjdDo6YmFzZWxpbmVQb3NpdGlvbiggYm9vbCBmLCBib29sIGlzUm9vdExpbmVCb3gg
KSBjb25zdAorc2hvcnQgUmVuZGVyU2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgZiwgYm9v
bCBpc1Jvb3RMaW5lQm94KSBjb25zdAogewogICAgIGlmIChtX3VzZUxpc3RCb3gpIHsKICAgICAg
ICAgLy8gRklYTUU6IFNob3VsZCBnZXQgdGhlIGhhcmRjb2RlZCBjb25zdGFudCBvZiA3IGJ5IGNh
bGxpbmcgYSBRTGlzdEJveCBmdW5jdGlvbiwKQEAgLTcyNSwxMCArMTg2LDkgQEAgc2hvcnQgUmVu
ZGVyU2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKCBibwogICAgIHJldHVybiBSZW5kZXJGb3JtRWxl
bWVudDo6YmFzZWxpbmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJveCApOwogfQogCi0KIHZvaWQg
UmVuZGVyU2VsZWN0OjpjYWxjTWluTWF4V2lkdGgoKQogewotICAgIEtIVE1MQXNzZXJ0KCAhbWlu
TWF4S25vd24oKSApOworICAgIEFTU0VSVCghbWluTWF4S25vd24oKSk7CiAKICAgICBpZiAobV9v
cHRpb25zQ2hhbmdlZCkKICAgICAgICAgdXBkYXRlRnJvbUVsZW1lbnQoKTsKQEAgLTc0NCw4ICsy
MDQsOCBAQCB2b2lkIFJlbmRlclNlbGVjdDo6Y2FsY01pbk1heFdpZHRoKCkKIAogdm9pZCBSZW5k
ZXJTZWxlY3Q6OmxheW91dCggKQogewotICAgIEtIVE1MQXNzZXJ0KG5lZWRzTGF5b3V0KCkpOwot
ICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOworICAgIEFTU0VSVChuZWVkc0xheW91dCgp
KTsKKyAgICBBU1NFUlQobWluTWF4S25vd24oKSk7CiAKICAgICAvLyAjIyMgbWFpbnRhaW4gc2Vs
ZWN0aW9uIHByb3Blcmx5IGJldHdlZW4gdHlwZS9zaXplIGNoYW5nZXMsIGFuZCB3b3JrCiAgICAg
Ly8gb3V0IGhvdyB0byBoYW5kbGUgbXVsdGlzZWxlY3QtPnNpbmdsZXNlbGVjdCAocHJvYmFibHkg
anVzdCBzZWxlY3QKQEAgLTc5Myw3ICsyNTMsNyBAQCB2b2lkIFJlbmRlclNlbGVjdDo6dmFsdWVD
aGFuZ2VkKFdpZGdldCopCiAgICAgaWYgKG1faWdub3JlU2VsZWN0RXZlbnRzKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBLSFRNTEFzc2VydCghbV91c2VMaXN0Qm94KTsKKyAgICBBU1NFUlQoIW1f
dXNlTGlzdEJveCk7CiAKICAgICBpbnQgaW5kZXggPSBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPiht
X3dpZGdldCktPmN1cnJlbnRJdGVtKCk7CiAKQEAgLTgzNiw3ICsyOTYsNiBAQCB2b2lkIFJlbmRl
clNlbGVjdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCiAgICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVj
dEVsZW1lbnQqPihub2RlKCkpLT5vbkNoYW5nZSgpOwogfQogCi0KIHZvaWQgUmVuZGVyU2VsZWN0
OjpzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopCiB7CiAgICAgaWYgKG1faWdub3JlU2VsZWN0RXZl
bnRzKQpAQCAtODU4LDcgKzMxNyw2IEBAIHZvaWQgUmVuZGVyU2VsZWN0OjpzZWxlY3Rpb25DaGFu
Z2VkKFdpZGcKICAgICBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm9u
Q2hhbmdlKCk7CiB9CiAKLQogdm9pZCBSZW5kZXJTZWxlY3Q6OnNldE9wdGlvbnNDaGFuZ2VkKGJv
b2wgX29wdGlvbnNDaGFuZ2VkKQogewogICAgIG1fb3B0aW9uc0NoYW5nZWQgPSBfb3B0aW9uc0No
YW5nZWQ7CkBAIC05MDksMjQ1ICszNjcsNCBAQCB2b2lkIFJlbmRlclNlbGVjdDo6dXBkYXRlU2Vs
ZWN0aW9uKCkKICAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTsKIH0KIAotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJUZXh0QXJlYTo6
UmVuZGVyVGV4dEFyZWEoSFRNTFRleHRBcmVhRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRl
ckZvcm1FbGVtZW50KGVsZW1lbnQpLCBtX2RpcnR5KGZhbHNlKSwgbV91cGRhdGluZyhmYWxzZSkK
LXsKLSAgICBRVGV4dEVkaXQgKmVkaXQgPSBuZXcgUVRleHRFZGl0KHZpZXcoKSk7Ci0KLSAgICBp
ZiAoZWxlbWVudC0+d3JhcCgpICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKLSAg
ICAgICAgZWRpdC0+c2V0V29yZFdyYXAoUVRleHRFZGl0OjpXaWRnZXRXaWR0aCk7Ci0gICAgZWxz
ZQotICAgICAgICBlZGl0LT5zZXRXb3JkV3JhcChRVGV4dEVkaXQ6Ok5vV3JhcCk7Ci0KLSAgICBz
ZXRXaWRnZXQoZWRpdCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OmRlc3Ryb3koKQotewot
ICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5yZW5kZXJlcldp
bGxCZURlc3Ryb3llZCgpOwotICAgIFJlbmRlckZvcm1FbGVtZW50OjpkZXN0cm95KCk7Ci19Ci0K
LXZvaWQgUmVuZGVyVGV4dEFyZWE6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3Nl
cnQoICFtaW5NYXhLbm93bigpICk7Ci0KLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxR
VGV4dEVkaXQqPihtX3dpZGdldCk7Ci0gICAgSW50U2l6ZSBzaXplKHctPnNpemVXaXRoQ29sdW1u
c0FuZFJvd3MoCi0gICAgICAgIG1heChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4o
bm9kZSgpKS0+Y29scygpLCAxKSwKLSAgICAgICAgbWF4KHN0YXRpY19jYXN0PEhUTUxUZXh0QXJl
YUVsZW1lbnQqPihub2RlKCkpLT5yb3dzKCksIDEpKSk7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0
aCggc2l6ZS53aWR0aCgpICk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KCBzaXplLmhlaWdodCgp
ICk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZv
aWQgUmVuZGVyVGV4dEFyZWE6OnNldFN0eWxlKFJlbmRlclN0eWxlICpzKQotewotICAgIFJlbmRl
ckZvcm1FbGVtZW50OjpzZXRTdHlsZShzKTsKLQotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19j
YXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLSAgICB3LT5zZXRBbGlnbm1lbnQodGV4dEFsaWdu
bWVudCgpKTsKLSAgICB3LT5zZXRMaW5lSGVpZ2h0KFJlbmRlck9iamVjdDo6bGluZUhlaWdodCh0
cnVlKSk7Ci0KLSAgICB3LT5zZXRXcml0aW5nRGlyZWN0aW9uKHN0eWxlKCktPmRpcmVjdGlvbigp
ID09IFJUTCA/IFJUTCA6IExUUik7Ci0KLSAgICBTY3JvbGxCYXJNb2RlIHNjcm9sbE1vZGUgPSBT
Y3JvbGxCYXJBdXRvOwotICAgIHN3aXRjaCAoc3R5bGUoKS0+b3ZlcmZsb3coKSkgewotICAgICAg
ICBjYXNlIE9BVVRPOgotICAgICAgICBjYXNlIE9NQVJRVUVFOiAvLyBtYWtlcyBubyBzZW5zZSwg
bWFwIHRvIGF1dG8KLSAgICAgICAgY2FzZSBPT1ZFUkxBWTogLy8gbm90IGltcGxlbWVudGVkIGZv
ciB0ZXh0LCBtYXAgdG8gYXV0bwotICAgICAgICBjYXNlIE9WSVNJQkxFOgotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgT0hJRERFTjoKLSAgICAgICAgICAgIHNjcm9sbE1vZGUgPSBT
Y3JvbGxCYXJBbHdheXNPZmY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPU0NS
T0xMOgotICAgICAgICAgICAgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09uOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFNjcm9sbEJhck1vZGUgaG9yaXpvbnRhbFNjcm9sbE1v
ZGUgPSBzY3JvbGxNb2RlOwotICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50
Kj4obm9kZSgpKS0+d3JhcCgpICE9IEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnRhX05vV3JhcCkKLSAg
ICAgICAgaG9yaXpvbnRhbFNjcm9sbE1vZGUgPSBTY3JvbGxCYXJBbHdheXNPZmY7Ci0KLSAgICB3
LT5zZXRTY3JvbGxCYXJNb2Rlcyhob3Jpem9udGFsU2Nyb2xsTW9kZSwgc2Nyb2xsTW9kZSk7Ci19
Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldEVkaXRlZChib29sIHgpCi17Ci0gICAgbV9kaXJ0
eSA9IHg7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsK
LSAgICBIVE1MVGV4dEFyZWFFbGVtZW50KiBlID0gc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxl
bWVudCo+KG5vZGUoKSk7Ci0gICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0
Kj4obV93aWRnZXQpOwotCi0gICAgdy0+c2V0UmVhZE9ubHkoZS0+aXNSZWFkT25seUNvbnRyb2wo
KSk7Ci0gICAgdy0+c2V0RGlzYWJsZWQoZS0+ZGlzYWJsZWQoKSk7Ci0KLSAgICBTdHJpbmcgd2lk
Z2V0VGV4dCA9IHRleHQoKTsKLSAgICBTdHJpbmcgdGV4dCA9IGUtPnZhbHVlKCk7Ci0gICAgdGV4
dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgaWYgKHdp
ZGdldFRleHQgIT0gdGV4dCkgewotICAgICAgICBpbnQgbGluZSwgY29sOwotICAgICAgICB3LT5n
ZXRDdXJzb3JQb3NpdGlvbiggJmxpbmUsICZjb2wgKTsKLSAgICAgICAgbV91cGRhdGluZyA9IHRy
dWU7Ci0gICAgICAgIHctPnNldFRleHQodGV4dCk7Ci0gICAgICAgIG1fdXBkYXRpbmcgPSBmYWxz
ZTsKLSAgICAgICAgdy0+c2V0Q3Vyc29yUG9zaXRpb24oIGxpbmUsIGNvbCApOwotICAgIH0KLSAg
ICBtX2RpcnR5ID0gZmFsc2U7Ci0KLSAgICB3LT5zZXRDb2xvcnMoc3R5bGUoKS0+YmFja2dyb3Vu
ZENvbG9yKCksIHN0eWxlKCktPmNvbG9yKCkpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVw
ZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0QXJlYTo6dGV4dCgpCi17
Ci0gICAgU3RyaW5nIHR4dCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KS0+dGV4
dCgpOwotICAgIHJldHVybiB0eHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCks
ICdcXCcpOwotfQotCi1TdHJpbmcgUmVuZGVyVGV4dEFyZWE6OnRleHRXaXRoSGFyZExpbmVCcmVh
a3MoKQotewotICAgIFN0cmluZyB0eHQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdl
dCktPnRleHRXaXRoSGFyZExpbmVCcmVha3MoKTsKLSAgICByZXR1cm4gdHh0LnJlcGxhY2UoYmFj
a3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpLCAnXFwnKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJl
YTo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgaWYgKG1fdXBkYXRpbmcpCi0gICAgICAg
IHJldHVybjsKLSAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+
aW52YWxpZGF0ZVZhbHVlKCk7Ci0gICAgbV9kaXJ0eSA9IHRydWU7Ci19Ci0KLWludCBSZW5kZXJU
ZXh0QXJlYTo6c2VsZWN0aW9uU3RhcnQoKQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBz
dGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHJldHVybiB0ZXh0RWRpdC0+
c2VsZWN0aW9uU3RhcnQoKTsKLX0KLQotaW50IFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25FbmQo
KQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4o
bV93aWRnZXQpOwotICAgIHJldHVybiB0ZXh0RWRpdC0+c2VsZWN0aW9uRW5kKCk7Ci19Ci0KLXZv
aWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsKLSAgICBR
VGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsK
LSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uU3RhcnQoc3RhcnQpOwotfQotCi12b2lkIFJlbmRl
clRleHRBcmVhOjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBRVGV4dEVkaXQgKnRl
eHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRp
dC0+c2V0U2VsZWN0aW9uRW5kKGVuZCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVj
dCgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KS0+c2VsZWN0QWxs
KCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvblJhbmdlKGludCBzdGFy
dCwgaW50IGVuZCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRl
eHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICB0ZXh0RWRpdC0+c2V0U2VsZWN0aW9uUmFuZ2Uoc3Rh
cnQsIGVuZC1zdGFydCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNlbGVjdGlvbkNoYW5n
ZWQoV2lkZ2V0KikKLXsKLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQq
PihtX3dpZGdldCk7Ci0KLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8gY2FsbCBvbnNlbGVjdCBpZiB0
aGVyZSBhY3R1YWxseSBpcyBhIHNlbGVjdGlvbgotICAgIGlmICghdy0+aGFzU2VsZWN0ZWRUZXh0
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFF
bGVtZW50Kj4obm9kZSgpKS0+b25TZWxlY3QoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVJlbmRlclNsaWRlcjo6UmVuZGVyU2xpZGVyKEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQp
Ci0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotICAgIHNldFdpZGdldChuZXcg
UVNsaWRlcik7Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjpjYWxjTWluTWF4V2lkdGgoKQotewot
ICAgIEtIVE1MQXNzZXJ0KCFtaW5NYXhLbm93bigpKTsKLSAgICAKLSAgICAvLyBMZXQgdGhlIHdp
ZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8gYmUuCi0gICAgSW50U2l6ZSBzKHdpZGdl
dCgpLT5zaXplSGludCgpKTsKLSAgICBib29sIHdpZHRoU2V0ID0gIXN0eWxlKCktPndpZHRoKCku
aXNBdXRvKCk7Ci0gICAgYm9vbCBoZWlnaHRTZXQgPSAhc3R5bGUoKS0+aGVpZ2h0KCkuaXNBdXRv
KCk7Ci0gICAgaWYgKGhlaWdodFNldCAmJiAhd2lkdGhTZXQpIHsKLSAgICAgICAgLy8gRmxpcCB0
aGUgaW50cmluc2ljIGRpbWVuc2lvbnMuCi0gICAgICAgIGludCBiYXJMZW5ndGggPSBzLndpZHRo
KCk7Ci0gICAgICAgIHMgPSBJbnRTaXplKHMuaGVpZ2h0KCksIGJhckxlbmd0aCk7Ci0gICAgfQot
ICAgIHNldEludHJpbnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0
KHMuaGVpZ2h0KCkpOwotICAgIAotICAgIFJlbmRlckZvcm1FbGVtZW50OjpjYWxjTWluTWF4V2lk
dGgoKTsKLX0KLQotdm9pZCBSZW5kZXJTbGlkZXI6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAg
ICBTdHJpbmcgdmFsdWUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+
dmFsdWUoKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1pblN0ciA9IHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUobWluQXR0cik7Ci0gICAgY29u
c3QgQXRvbWljU3RyaW5nJiBtYXhTdHIgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4o
bm9kZSgpKS0+Z2V0QXR0cmlidXRlKG1heEF0dHIpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
cHJlY2lzaW9uID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0
dHJpYnV0ZShwcmVjaXNpb25BdHRyKTsKLSAgICAKLSAgICBkb3VibGUgbWluVmFsID0gbWluU3Ry
LmlzTnVsbCgpID8gMC4wIDogbWluU3RyLmRlcHJlY2F0ZWRTdHJpbmcoKS50b0RvdWJsZSgpOwot
ICAgIGRvdWJsZSBtYXhWYWwgPSBtYXhTdHIuaXNOdWxsKCkgPyAxMDAuMCA6IG1heFN0ci5kZXBy
ZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICBtaW5WYWwgPSBtaW4obWluVmFsLCBtYXhW
YWwpOyAvLyBNYWtlIHN1cmUgdGhlIHJhbmdlIGlzIHNhbmUuCi0gICAgCi0gICAgZG91YmxlIHZh
bCA9IHZhbHVlLmlzTnVsbCgpID8gKG1heFZhbCArIG1pblZhbCkvMi4wIDogdmFsdWUuZGVwcmVj
YXRlZFN0cmluZygpLnRvRG91YmxlKCk7Ci0gICAgdmFsID0gbWF4KG1pblZhbCwgbWluKHZhbCwg
bWF4VmFsKSk7IC8vIE1ha2Ugc3VyZSB2YWwgaXMgd2l0aGluIG1pbi9tYXguCi0gICAgCi0gICAg
Ly8gRm9yY2UgaW50ZWdlciB2YWx1ZSBpZiBub3QgZmxvYXQuCi0gICAgaWYgKCFlcXVhbElnbm9y
aW5nQ2FzZShwcmVjaXNpb24sICJmbG9hdCIpKQotICAgICAgICB2YWwgPSAoaW50KSh2YWwgKyAw
LjUpOwotCi0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNldFZh
bHVlKFN0cmluZzo6bnVtYmVyKHZhbCkpOwotCi0gICAgUVNsaWRlciogc2xpZGVyID0gKFFTbGlk
ZXIqKXdpZGdldCgpOwotICAgICAKLSAgICBzbGlkZXItPnNldE1pblZhbHVlKG1pblZhbCk7Ci0g
ICAgc2xpZGVyLT5zZXRNYXhWYWx1ZShtYXhWYWwpOwotICAgIHNsaWRlci0+c2V0VmFsdWUodmFs
KTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12
b2lkIFJlbmRlclNsaWRlcjo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17Ci0gICAgUVNsaWRlciog
c2xpZGVyID0gc3RhdGljX2Nhc3Q8UVNsaWRlcio+KHdpZGdldCgpKTsKLQotICAgIGRvdWJsZSB2
YWwgPSBzbGlkZXItPnZhbHVlKCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVjaXNpb24g
PSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKHBy
ZWNpc2lvbkF0dHIpOwotCi0gICAgLy8gRm9yY2UgaW50ZWdlciB2YWx1ZSBpZiBub3QgZmxvYXQu
Ci0gICAgaWYgKCFlcXVhbElnbm9yaW5nQ2FzZShwcmVjaXNpb24sICJmbG9hdCIpKQotICAgICAg
ICB2YWwgPSAoaW50KSh2YWwgKyAwLjUpOwotCi0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KG5vZGUoKSktPnNldFZhbHVlKFN0cmluZzo6bnVtYmVyKHZhbCkpOwotICAgIAotICAg
IC8vIEZpcmUgdGhlICJpbnB1dCIgRE9NIGV2ZW50LgotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChpbnB1dEV2ZW50LCB0cnVlLCBm
YWxzZSk7Ci19Ci0KLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckltYWdlQnV0dG9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVySW1hZ2VCdXR0b24uaAkocmV2aXNpb24gMTQzNDIpCisrKyBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbWFnZUJ1dHRvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMywyODYgKzIzLDIz
IEBACiAgKgogICovCiAKLSNpZm5kZWYgUkVOREVSX0ZPUk1fSAotI2RlZmluZSBSRU5ERVJfRk9S
TV9ICisjaWZuZGVmIFJlbmRlckltYWdlQnV0dG9uX2gKKyNkZWZpbmUgUmVuZGVySW1hZ2VCdXR0
b25faAogCi0jaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NUeXBl
cy5oIgotI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIK
IAotY2xhc3MgUUxpc3RCb3g7Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRG9jTG9h
ZGVyOwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotY2xhc3MgSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Ci1jbGFzcyBIVE1MU2VsZWN0RWxlbWVudDsKLWNs
YXNzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
UmVuZGVyRm9ybUVsZW1lbnQgOiBwdWJsaWMgUmVuZGVyV2lkZ2V0Ci17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCogbm9kZSk7Ci0gICAgdmly
dHVhbCB+UmVuZGVyRm9ybUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVu
ZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGb3JtIjsgfQotCi0gICAgdmlydHVhbCBi
b29sIGlzRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAvLyBBcXVh
IGZvcm0gY29udHJvbHMgbmV2ZXIgaGF2ZSBib3JkZXIvcGFkZGluZy4KLSAgICBpbnQgYm9yZGVy
VG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBib3JkZXJCb3R0b20oKSBjb25zdCB7
IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckxlZnQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0g
ICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5n
VG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nQm90dG9tKCkgY29uc3Qg
eyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nTGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0K
LSAgICBpbnQgcGFkZGluZ1JpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgLy8gQXF1
YSBjb250cm9scyB1c2UgaW50cmluc2ljIG1hcmdpbiB2YWx1ZXMgaW4gb3JkZXIgdG8gbGVhdmUg
c3BhY2UgZm9yIGZvY3VzIHJpbmdzCi0gICAgLy8gYW5kIHRvIGtlZXAgY29udHJvbHMgZnJvbSBi
dXR0aW5nIHVwIGFnYWluc3Qgb25lIGFub3RoZXIuICBUaGlzIGludHJpbnNpYyBtYXJnaW4KLSAg
ICAvLyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIFdlYiBwYWdlIGFsbG93cyB0aGUgY29udHJvbCB0
byBzaXplIGludHJpbnNpY2FsbHkuICBJZiB0aGUKLSAgICAvLyBXZWIgcGFnZSBzcGVjaWZpZXMg
YW4gZXhwbGljaXQgd2lkdGggZm9yIGEgY29udHJvbCwgdGhlbiB3ZSBnbyBhaGVhZCBhbmQgaG9u
b3IgdGhhdAotICAgIC8vIHByZWNpc2Ugd2lkdGguICBTaW1pbGFybHksIGlmIGEgV2ViIHBhZ2Ug
dXNlcyBhIHNwZWNpZmljIG1hcmdpbiB2YWx1ZSwgd2Ugd2lsbCBnbyBhaGVhZAotICAgIC8vIGFu
ZCBob25vciB0aGF0IHZhbHVlLiAgCi0gICAgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zSWZBbGxv
d2VkKFJlbmRlclN0eWxlKiBfc3R5bGUpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmlu
c2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgaW50IGludHJpbnNpY01h
cmdpbigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShS
ZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9z
aXRpb24oIGJvb2wsIGJvb2wgKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQg
Y2xpY2tlZChXaWRnZXQqKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBpc0VkaXRh
YmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIEhvcml6b250YWxBbGlnbm1lbnQg
dGV4dEFsaWdubWVudCgpIGNvbnN0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBSZW5kZXJJbWFnZUJ1dHRvbiA6IHB1YmxpYyBSZW5kZXJJbWFnZQotewotcHVibGljOgotICAg
IFJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgY29u
c3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJJbWFnZUJ1dHRvbiI7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZUJ1dHRvbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyTGluZUVkaXQgOiBw
dWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJMaW5lRWRpdChI
VE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7
Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0hl
aWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1l
KCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxpbmVFZGl0IjsgfQotICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHls
ZSAqKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25FbmQo
KTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblN0YXJ0KGludCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rp
b25FbmQoaW50KTsKLSAgICAKLSAgICBib29sIGlzRWRpdGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRFZGl0ZWQoYm9vbCk7Ci0gICAgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uUmFuZ2UoaW50
LCBpbnQpOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhZGRTZWFyY2hSZXN1bHQoKTsKLQotcHJpdmF0
ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25D
aGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtU2VhcmNoKFdpZGdldCop
OwotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
Ci0KLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNs
YXNzIFJlbmRlckZpZWxkc2V0IDogcHVibGljIFJlbmRlckJsb2NrCi17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCopOwotCi0gICAgdmlydHVhbCBj
b25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZpZWxkU2V0Ijsg
fQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91dExlZ2VuZChib29sIHJlbGF5b3V0
Q2hpbGRyZW4pOwotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7Ci0g
ICAgCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERlY29yYXRpb25zKFBhaW50
SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2b2lkIHBhaW50Qm9yZGVyTWludXNMZWdlbmQo
R3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGludCB3LCBpbnQgaCwgY29uc3QgUmVu
ZGVyU3R5bGUgKiwgaW50IGx4LCBpbnQgbHcpOwotICAgIFJlbmRlck9iamVjdCogZmluZExlZ2Vu
ZCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJGaWxlQnV0dG9u
IDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRmlsZUJ1
dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRl
ck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmlsZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFs
IHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci0gICAgdm9pZCBzZWxlY3QoKTsKLQotICAgIGludCBjYWxjUmVwbGFjZWRIZWlnaHQo
KSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgfQotCi0gICAgdm9pZCBjbGljayhi
b29sIHNlbmRNb3VzZUV2ZW50cyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNF
ZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFs
IHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFu
Z2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJM
YWJlbCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlckxh
YmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpOwotCi0gICAgdmlydHVhbCBjb25z
dCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxhYmVsIjsgfQotfTsK
LQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckxlZ2VuZCA6IHB1YmxpYyBS
ZW5kZXJCbG9jawotewotcHVibGljOgotICAgIFJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50ICplbGVtZW50KTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgp
IGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMZWdlbmQiOyB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIFJlbmRlclNlbGVjdCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewot
cHVibGljOgotICAgIFJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVudCopOwotCi0gICAgdmly
dHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclNlbGVj
dCI7IH0KLQotICAgIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBiICkgY29u
c3Q7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgaWYgKCFtX3VzZUxpc3RC
b3gpIHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgcmV0dXJuIFJlbmRlckZvcm1FbGVtZW50Ojpj
YWxjUmVwbGFjZWRIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2lj
TWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBjYWxj
TWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0KLSAgICB2b2lkIHNl
dE9wdGlvbnNDaGFuZ2VkKGJvb2wgX29wdGlvbnNDaGFuZ2VkKTsKLQotICAgIGJvb2wgc2VsZWN0
aW9uQ2hhbmdlZCgpIHsgcmV0dXJuIG1fc2VsZWN0aW9uQ2hhbmdlZDsgfQotICAgIHZvaWQgc2V0
U2VsZWN0aW9uQ2hhbmdlZChib29sIF9zZWxlY3Rpb25DaGFuZ2VkKSB7IG1fc2VsZWN0aW9uQ2hh
bmdlZCA9IF9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21F
bGVtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0g
ICAgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKTsKLQotcHJvdGVjdGVkOgotICAgIFFMaXN0Qm94ICpj
cmVhdGVMaXN0Qm94KCk7Ci0gICAgdm9pZCBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci0K
LSAgICB1bnNpZ25lZCAgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0aXBsZTsKLSAgICBib29sIG1f
dXNlTGlzdEJveDsKLSAgICBib29sIG1fc2VsZWN0aW9uQ2hhbmdlZDsKLSAgICBib29sIG1faWdu
b3JlU2VsZWN0RXZlbnRzOwotICAgIGJvb2wgbV9vcHRpb25zQ2hhbmdlZDsKLQotcHJpdmF0ZToK
LSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9p
ZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBSZW5kZXJUZXh0QXJlYSA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVi
bGljOgotICAgIFJlbmRlclRleHRBcmVhKEhUTUxUZXh0QXJlYUVsZW1lbnQqKTsKLQotICAgIHZp
cnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5h
bWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGV4dEFyZWEiOyB9Ci0gICAgdmlydHVhbCB2b2lk
IGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgp
OwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGJvb2wg
aXNUZXh0QXJlYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIGlzRWRpdGVkKCkg
Y29uc3QgeyByZXR1cm4gbV9kaXJ0eTsgfQotICAgIHZvaWQgc2V0RWRpdGVkIChib29sKTsKLSAg
ICAKLSAgICBTdHJpbmcgdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0V2l0aEhhcmRMaW5lQnJlYWtz
KCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpbnQgc2VsZWN0aW9uRW5kKCk7
Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9u
RW5kKGludCk7Ci0gICAgCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlv
blJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNp
Y01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVh
bCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2VsZWN0aW9u
Q2hhbmdlZChXaWRnZXQqKTsKLSAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGJvb2wgaXNF
ZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJvb2wgbV9kaXJ0eTsKLSAg
ICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgY2xhc3Mg
SFRNTElucHV0RWxlbWVudDsKIAotY2xhc3MgUmVuZGVyU2xpZGVyIDogcHVibGljIFJlbmRlckZv
cm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyU2xpZGVyKEhUTUxJbnB1dEVsZW1lbnQq
KTsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJl
dHVybiAiUmVuZGVyU2xpZGVyIjsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2lj
TWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01p
bk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7CisgICAg
Y2xhc3MgUmVuZGVySW1hZ2VCdXR0b24gOiBwdWJsaWMgUmVuZGVySW1hZ2UgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgUmVuZGVySW1hZ2VCdXR0b24oSFRNTElucHV0RWxlbWVudCopOwogCi1wcml2
YXRlOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci19OworICAgICAg
ICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVy
SW1hZ2VCdXR0b24iOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0ltYWdlQnV0dG9uKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIH07CiAKLX0gLy9uYW1lc3BhY2UKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKIAotI2VuZGlmCisjZW5kaWYgLy8gUmVuZGVySW1hZ2VCdXR0b25faApJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU2xpZGVyLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyU2xpZGVyLmgJKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyU2xpZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTIzLDI4NiArMjMsMzAg
QEAKICAqCiAgKi8KIAotI2lmbmRlZiBSRU5ERVJfRk9STV9ICi0jZGVmaW5lIFJFTkRFUl9GT1JN
X0gKKyNpZm5kZWYgUmVuZGVyU2xpZGVyX2gKKyNkZWZpbmUgUmVuZGVyU2xpZGVyX2gKIAotI2lu
Y2x1ZGUgIlJlbmRlcldpZGdldC5oIgotI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKLSNpbmNs
dWRlICJSZW5kZXJCbG9jay5oIgotI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCi0KLWNsYXNzIFFM
aXN0Qm94OworI2luY2x1ZGUgIlJlbmRlckZvcm1FbGVtZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotY2xhc3MgRG9jTG9hZGVyOwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotY2xhc3Mg
SFRNTEdlbmVyaWNGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Ci1jbGFzcyBI
VE1MU2VsZWN0RWxlbWVudDsKLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQgOiBwdWJsaWMgUmVuZGVyV2lk
Z2V0Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxl
bWVudCogbm9kZSk7Ci0gICAgdmlydHVhbCB+UmVuZGVyRm9ybUVsZW1lbnQoKTsKLQotICAgIHZp
cnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGb3Jt
IjsgfQotCi0gICAgdmlydHVhbCBib29sIGlzRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0
cnVlOyB9Ci0KLSAgICAvLyBBcXVhIGZvcm0gY29udHJvbHMgbmV2ZXIgaGF2ZSBib3JkZXIvcGFk
ZGluZy4KLSAgICBpbnQgYm9yZGVyVG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBi
b3JkZXJCb3R0b20oKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckxlZnQoKSBj
b25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3QgeyByZXR1cm4g
MDsgfQotICAgIGludCBwYWRkaW5nVG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBw
YWRkaW5nQm90dG9tKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nTGVmdCgp
IGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ1JpZ2h0KCkgY29uc3QgeyByZXR1
cm4gMDsgfQotCi0gICAgLy8gQXF1YSBjb250cm9scyB1c2UgaW50cmluc2ljIG1hcmdpbiB2YWx1
ZXMgaW4gb3JkZXIgdG8gbGVhdmUgc3BhY2UgZm9yIGZvY3VzIHJpbmdzCi0gICAgLy8gYW5kIHRv
IGtlZXAgY29udHJvbHMgZnJvbSBidXR0aW5nIHVwIGFnYWluc3Qgb25lIGFub3RoZXIuICBUaGlz
IGludHJpbnNpYyBtYXJnaW4KLSAgICAvLyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIFdlYiBwYWdl
IGFsbG93cyB0aGUgY29udHJvbCB0byBzaXplIGludHJpbnNpY2FsbHkuICBJZiB0aGUKLSAgICAv
LyBXZWIgcGFnZSBzcGVjaWZpZXMgYW4gZXhwbGljaXQgd2lkdGggZm9yIGEgY29udHJvbCwgdGhl
biB3ZSBnbyBhaGVhZCBhbmQgaG9ub3IgdGhhdAotICAgIC8vIHByZWNpc2Ugd2lkdGguICBTaW1p
bGFybHksIGlmIGEgV2ViIHBhZ2UgdXNlcyBhIHNwZWNpZmljIG1hcmdpbiB2YWx1ZSwgd2Ugd2ls
bCBnbyBhaGVhZAotICAgIC8vIGFuZCBob25vciB0aGF0IHZhbHVlLiAgCi0gICAgdm9pZCBhZGRJ
bnRyaW5zaWNNYXJnaW5zSWZBbGxvd2VkKFJlbmRlclN0eWxlKiBfc3R5bGUpOwotICAgIHZpcnR1
YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9
Ci0gICAgaW50IGludHJpbnNpY01hcmdpbigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KLQotICAgIHZp
cnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0
dWFsIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wsIGJvb2wgKSBjb25zdDsKLQotcHJpdmF0
ZToKLSAgICB2aXJ0dWFsIHZvaWQgY2xpY2tlZChXaWRnZXQqKTsKLQotcHJvdGVjdGVkOgotICAg
IHZpcnR1YWwgYm9vbCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAg
IEhvcml6b250YWxBbGlnbm1lbnQgdGV4dEFsaWdubWVudCgpIGNvbnN0OwotfTsKLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJJbWFnZUJ1dHRvbiA6IHB1YmxpYyBSZW5kZXJJ
bWFnZQotewotcHVibGljOgotICAgIFJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQq
KTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJu
ICJSZW5kZXJJbWFnZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZUJ1dHRvbigp
IGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xh
c3MgUmVuZGVyTGluZUVkaXQgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoK
LSAgICBSZW5kZXJMaW5lRWRpdChIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0
IHsgcmV0dXJuIGludHJpbnNpY0hlaWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJ
bnRyaW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBj
b25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxpbmVFZGl0Ijsg
fQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9p
ZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwot
ICAgIGludCBzZWxlY3Rpb25FbmQoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblN0YXJ0KGludCk7
Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25FbmQoaW50KTsKLSAgICAKLSAgICBib29sIGlzRWRpdGVk
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRFZGl0ZWQoYm9vbCk7Ci0gICAgYm9vbCBpc1RleHRGaWVs
ZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQg
c2V0U2VsZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhZGRTZWFy
Y2hSZXN1bHQoKTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChX
aWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZp
cnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBw
ZXJmb3JtU2VhcmNoKFdpZGdldCopOwotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBj
b25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckZpZWxkc2V0IDogcHVibGljIFJlbmRlckJs
b2NrCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVu
dCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1
cm4gIlJlbmRlckZpZWxkU2V0IjsgfQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91
dExlZ2VuZChib29sIHJlbGF5b3V0Q2hpbGRyZW4pOwotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0
eWxlKFJlbmRlclN0eWxlKik7Ci0gICAgCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBwYWlu
dEJveERlY29yYXRpb25zKFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2b2lkIHBh
aW50Qm9yZGVyTWludXNMZWdlbmQoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGlu
dCB3LCBpbnQgaCwgY29uc3QgUmVuZGVyU3R5bGUgKiwgaW50IGx4LCBpbnQgbHcpOwotICAgIFJl
bmRlck9iamVjdCogZmluZExlZ2VuZCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBSZW5kZXJGaWxlQnV0dG9uIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJs
aWM6Ci0gICAgUmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0
dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmlsZUJ1
dHRvbiI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVh
bCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdm9pZCBzZWxlY3QoKTsKLQotICAgIGlu
dCBjYWxjUmVwbGFjZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsg
fQotCi0gICAgdm9pZCBjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cyk7Ci0KLXByb3RlY3RlZDoK
LSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQot
cHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2
aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBSZW5kZXJMYWJlbCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewot
cHVibGljOgotICAgIFJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQp
OwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4g
IlJlbmRlckxhYmVsIjsgfQotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJl
bmRlckxlZ2VuZCA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAgIFJlbmRlckxl
Z2VuZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KTsKLQotICAgIHZpcnR1YWwgY29u
c3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMZWdlbmQiOyB9Ci19
OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlclNlbGVjdCA6IHB1YmxpYyBS
ZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclNlbGVjdChIVE1MU2VsZWN0
RWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3Qg
eyByZXR1cm4gIlJlbmRlclNlbGVjdCI7IH0KLQotICAgIHNob3J0IGJhc2VsaW5lUG9zaXRpb24o
IGJvb2wgZiwgYm9vbCBiICkgY29uc3Q7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNv
bnN0IHsgaWYgKCFtX3VzZUxpc3RCb3gpIHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgcmV0dXJu
IFJlbmRlckZvcm1FbGVtZW50OjpjYWxjUmVwbGFjZWRIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwg
Ym9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQot
ICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbGF5
b3V0KCk7Ci0KLSAgICB2b2lkIHNldE9wdGlvbnNDaGFuZ2VkKGJvb2wgX29wdGlvbnNDaGFuZ2Vk
KTsKLQotICAgIGJvb2wgc2VsZWN0aW9uQ2hhbmdlZCgpIHsgcmV0dXJuIG1fc2VsZWN0aW9uQ2hh
bmdlZDsgfQotICAgIHZvaWQgc2V0U2VsZWN0aW9uQ2hhbmdlZChib29sIF9zZWxlY3Rpb25DaGFu
Z2VkKSB7IG1fc2VsZWN0aW9uQ2hhbmdlZCA9IF9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdmly
dHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxl
KFJlbmRlclN0eWxlICopOwotCi0gICAgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKTsKLQotcHJvdGVj
dGVkOgotICAgIFFMaXN0Qm94ICpjcmVhdGVMaXN0Qm94KCk7Ci0gICAgdm9pZCBzZXRXaWRnZXRX
cml0aW5nRGlyZWN0aW9uKCk7Ci0KLSAgICB1bnNpZ25lZCAgbV9zaXplOwotICAgIGJvb2wgbV9t
dWx0aXBsZTsKLSAgICBib29sIG1fdXNlTGlzdEJveDsKLSAgICBib29sIG1fc2VsZWN0aW9uQ2hh
bmdlZDsKLSAgICBib29sIG1faWdub3JlU2VsZWN0RXZlbnRzOwotICAgIGJvb2wgbV9vcHRpb25z
Q2hhbmdlZDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdl
dCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotfTsKLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUZXh0QXJlYSA6IHB1YmxpYyBSZW5k
ZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclRleHRBcmVhKEhUTUxUZXh0QXJl
YUVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFs
IGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGV4dEFyZWEi
OyB9Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJT
dHlsZSAqKTsKLQotICAgIGJvb2wgaXNUZXh0QXJlYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0K
LSAgICBib29sIGlzRWRpdGVkKCkgY29uc3QgeyByZXR1cm4gbV9kaXJ0eTsgfQotICAgIHZvaWQg
c2V0RWRpdGVkIChib29sKTsKLSAgICAKLSAgICBTdHJpbmcgdGV4dCgpOwotICAgIFN0cmluZyB0
ZXh0V2l0aEhhcmRMaW5lQnJlYWtzKCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAg
ICBpbnQgc2VsZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwot
ICAgIHZvaWQgc2V0U2VsZWN0aW9uRW5kKGludCk7Ci0gICAgCi0gICAgdm9pZCBzZWxlY3QoKTsK
LSAgICB2b2lkIHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKKyAgICBjbGFzcyBIVE1MSW5w
dXRFbGVtZW50OwogICAgIAotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lu
cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBjbGFzcyBSZW5kZXJTbGlkZXIgOiBwdWJs
aWMgUmVuZGVyRm9ybUVsZW1lbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyU2xpZGVy
KEhUTUxJbnB1dEVsZW1lbnQqKTsKKyAgICAgICAgCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hh
ciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJTbGlkZXIiOyB9CiAKLXByaXZh
dGU6Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKLSAgICAKLXByb3RlY3RlZDoKLSAgICB2
aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJv
b2wgbV9kaXJ0eTsKLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OworICAgICAgICB2aXJ0dWFsIGJv
b2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAg
ICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKKyAgICAgICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUZyb21FbGVtZW50KCk7CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVu
ZGVyU2xpZGVyIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVu
ZGVyU2xpZGVyKEhUTUxJbnB1dEVsZW1lbnQqKTsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IGNo
YXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU2xpZGVyIjsgfQotICAgIHZp
cnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUZyb21FbGVtZW50KCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB2b2lk
IHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKKyAgICB9OwogCi1wcml2YXRlOgotICAgIHZpcnR1YWwg
dm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci19OwogCi19IC8vbmFtZXNwYWNlCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZgorI2VuZGlmIC8vIFJlbmRlclNsaWRlcl9oCkluZGV4
OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMZWdlbmQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxlZ2VuZC5jcHAJKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGVnZW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTEzMCAr
MjQsMTUgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicmVuZGVyX2Zv
cm0uaCIKKyNpbmNsdWRlICJSZW5kZXJMZWdlbmQuaCIKIAotI2luY2x1ZGUgIkJyb3dzZXJFeHRl
bnNpb24uaCIKLSNpbmNsdWRlICJFdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
Ci0jaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVu
dC5oIgotI2luY2x1ZGUgIkhUTUxPcHRHcm91cEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0
aW9uRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxTZWxlY3RFbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTFRleHRBcmVhRWxlbWVudC5oIgotI2luY2x1ZGUgIktXUUNvbWJvQm94LmgiCi0jaW5jbHVk
ZSAiS1dRRmlsZUJ1dHRvbi5oIgotI2luY2x1ZGUgIktXUUxpbmVFZGl0LmgiCi0jaW5jbHVkZSAi
S1dRU2xpZGVyLmgiCi0jaW5jbHVkZSAiS1dRVGV4dEVkaXQuaCIKLSNpbmNsdWRlICJQbGF0Zm9y
bU1vdXNlRXZlbnQuaCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLQotdXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKyNpbmNsdWRlICJIVE1MR2VuZXJpY0Zvcm1FbGVtZW50LmgiCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci11c2luZyBuYW1l
c3BhY2UgSFRNTE5hbWVzOwotCi1SZW5kZXJGb3JtRWxlbWVudDo6UmVuZGVyRm9ybUVsZW1lbnQo
SFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlcldpZGdldChlbGVt
ZW50KQotewotICAgIHNldElubGluZSh0cnVlKTsKLX0KLQotUmVuZGVyRm9ybUVsZW1lbnQ6On5S
ZW5kZXJGb3JtRWxlbWVudCgpCi17Ci19Ci0KLXNob3J0IFJlbmRlckZvcm1FbGVtZW50OjpiYXNl
bGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgaXNSb290TGluZUJveCApIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1hcmdpblRvcCgpICsgd2lkZ2V0KCktPmJhc2VsaW5lUG9zaXRpb24obV9oZWlnaHQp
OwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShSZW5kZXJTdHlsZSogcykK
LXsKLSAgICBpZiAoY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSkKLSAgICAgICAgYWRkSW50cmlu
c2ljTWFyZ2luc0lmQWxsb3dlZChzKTsKLQotICAgIFJlbmRlcldpZGdldDo6c2V0U3R5bGUocyk7
Ci0KLSAgICAvLyBEbyBub3QgcGFpbnQgYSBiYWNrZ3JvdW5kIG9yIGJvcmRlciBmb3IgQXF1YSBm
b3JtIGVsZW1lbnRzCi0gICAgc2V0U2hvdWxkUGFpbnRCYWNrZ3JvdW5kT3JCb3JkZXIoZmFsc2Up
OwotCi0gICAgbV93aWRnZXQtPnNldEZvbnQoc3R5bGUoKS0+Zm9udCgpKTsKLX0KLQotdm9pZCBS
ZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIG1fd2lkZ2V0LT5z
ZXRFbmFibGVkKCFzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+
ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVsZW1lbnQ6OmxheW91dCgpCi17Ci0g
ICAgS0hUTUxBc3NlcnQoIG5lZWRzTGF5b3V0KCkgKTsKLSAgICBLSFRNTEFzc2VydCggbWluTWF4
S25vd24oKSApOwotCi0gICAgLy8gbWluaW11bSBoZWlnaHQKLSAgICBtX2hlaWdodCA9IDA7Ci0K
LSAgICBjYWxjV2lkdGgoKTsKLSAgICBjYWxjSGVpZ2h0KCk7Ci0gICAgCi0gICAgc2V0TmVlZHNM
YXlvdXQoZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpjbGlja2VkKFdpZGdl
dCopCi17Ci0gICAgUmVuZGVyQXJlbmEqIGFyZW5hID0gcmVmKCk7Ci0gICAgUGxhdGZvcm1Nb3Vz
ZUV2ZW50IGV2ZW50OyAvLyBnZXRzICJjdXJyZW50IGV2ZW50IgotICAgIGlmIChub2RlKCkpCi0g
ICAgICAgIHN0YXRpY19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+KG5vZGUoKSktPmRpc3BhdGNoTW91
c2VFdmVudChldmVudCwgY2xpY2tFdmVudCwgZXZlbnQuY2xpY2tDb3VudCgpKTsKLSAgICBkZXJl
ZihhcmVuYSk7Ci19Ci0KLUhvcml6b250YWxBbGlnbm1lbnQgUmVuZGVyRm9ybUVsZW1lbnQ6OnRl
eHRBbGlnbm1lbnQoKSBjb25zdAotewotICAgIHN3aXRjaCAoc3R5bGUoKS0+dGV4dEFsaWduKCkp
IHsKLSAgICAgICAgY2FzZSBMRUZUOgotICAgICAgICBjYXNlIEtIVE1MX0xFRlQ6Ci0gICAgICAg
ICAgICByZXR1cm4gQWxpZ25MZWZ0OwotICAgICAgICBjYXNlIFJJR0hUOgotICAgICAgICBjYXNl
IEtIVE1MX1JJR0hUOgotICAgICAgICAgICAgcmV0dXJuIEFsaWduUmlnaHQ7Ci0gICAgICAgIGNh
c2UgQ0VOVEVSOgotICAgICAgICBjYXNlIEtIVE1MX0NFTlRFUjoKLSAgICAgICAgICAgIHJldHVy
biBBbGlnbkhDZW50ZXI7Ci0gICAgICAgIGNhc2UgSlVTVElGWToKLSAgICAgICAgICAgIC8vIEp1
c3QgZmFsbCBpbnRvIHRoZSBhdXRvIGNvZGUgZm9yIGp1c3RpZnkuCi0gICAgICAgIGNhc2UgVEFB
VVRPOgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IEFs
aWduUmlnaHQgOiBBbGlnbkxlZnQ7Ci0gICAgfQotICAgIEFTU0VSVChmYWxzZSk7IC8vIFNob3Vs
ZCBuZXZlciBiZSByZWFjaGVkLgotICAgIHJldHVybiBBbGlnbkxlZnQ7Ci19Ci0KLQotdm9pZCBS
ZW5kZXJGb3JtRWxlbWVudDo6YWRkSW50cmluc2ljTWFyZ2luc0lmQWxsb3dlZChSZW5kZXJTdHls
ZSogX3N0eWxlKQotewotICAgIC8vIEN1dCBvdXQgdGhlIGludHJpbnNpYyBtYXJnaW5zIGNvbXBs
ZXRlbHkgaWYgd2UgZW5kIHVwIHVzaW5nIG1pbmkgY29udHJvbHMuCi0gICAgaWYgKF9zdHlsZS0+
Zm9udFNpemUoKSA8IDExKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gRklYTUU6IFVz
aW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1pbi13aWR0
aC9tYXgtd2lkdGggaXMgZmxhd2VkLgotICAgIGludCBtID0gaW50cmluc2ljTWFyZ2luKCk7Ci0g
ICAgaWYgKF9zdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlm
IChfc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygpKQotICAgICAgICAgICAgX3N0eWxlLT5zZXRN
YXJnaW5MZWZ0KExlbmd0aChtLCBGaXhlZCkpOwotICAgICAgICBpZiAoX3N0eWxlLT5tYXJnaW5S
aWdodCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0
aChtLCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChfc3R5bGUtPmhlaWdodCgpLmlzQXV0bygp
KSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCi0gICAgICAgICAg
ICBfc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgobSwgRml4ZWQpKTsKLSAgICAgICAgaWYgKF9z
dHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKLSAgICAgICAgICAgIF9zdHlsZS0+c2V0TWFy
Z2luQm90dG9tKExlbmd0aChtLCBGaXhlZCkpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1SZW5kZXJJbWFnZUJ1dHRvbjo6UmVuZGVySW1hZ2VCdXR0b24oSFRNTElu
cHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckltYWdlKGVsZW1lbnQpCi17Ci0gICAg
Ly8gIyMjIHN1cHBvcnQgRE9NQWN0aXZhdGUgZXZlbnQgd2hlbiBjbGlja2VkCi19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5k
ZXJMaW5lRWRpdDo6UmVuZGVyTGluZUVkaXQoSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAg
ICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpLCBtX3VwZGF0aW5nKGZhbHNlKQotewotICAg
IFFMaW5lRWRpdDo6VHlwZSB0eXBlOwotICAgIHN3aXRjaCAoZWxlbWVudC0+aW5wdXRUeXBlKCkp
IHsKLSAgICAgICAgY2FzZSBIVE1MSW5wdXRFbGVtZW50OjpQQVNTV09SRDoKLSAgICAgICAgICAg
IHR5cGUgPSBRTGluZUVkaXQ6OlBhc3N3b3JkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgSFRNTElucHV0RWxlbWVudDo6U0VBUkNIOgotICAgICAgICAgICAgdHlwZSA9IFFMaW5l
RWRpdDo6U2VhcmNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICB0eXBlID0gUUxpbmVFZGl0OjpOb3JtYWw7Ci0gICAgfQotICAgIFFMaW5lRWRpdCog
ZWRpdCA9IG5ldyBRTGluZUVkaXQodHlwZSk7Ci0gICAgaWYgKHR5cGUgPT0gUUxpbmVFZGl0OjpT
ZWFyY2gpCi0gICAgICAgIGVkaXQtPnNldExpdmVTZWFyY2goZmFsc2UpOwotICAgIHNldFdpZGdl
dChlZGl0KTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0aW9uQ2hhbmdlZChXaWRn
ZXQqKQotewotICAgIC8vIFdlIG9ubHkgd2FudCB0byBjYWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFj
dHVhbGx5IGlzIGEgc2VsZWN0aW9uCi0gICAgUUxpbmVFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UUxp
bmVFZGl0Kj4obV93aWRnZXQpOwotICAgIGlmICh3LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG5vZGUoKSktPm9uU2VsZWN0
KCk7Ci19Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnJldHVyblByZXNzZWQoV2lkZ2V0KikKLXsK
LSAgICAvLyBFbWl0IG9uQ2hhbmdlIGlmIG5lY2Vzc2FyeQotICAgIC8vIFdvcmtzIGJ1dCBtaWdo
dCBub3QgYmUgZW5vdWdoLCBkaXJrIHNhaWQgaGUgaGFkIGFub3RoZXIgc29sdXRpb24gYXQKLSAg
ICAvLyBoYW5kIChjYW4ndCByZW1lbWJlciB3aGljaCkgLSBEYXZpZAotICAgIGlmIChpc1RleHRG
aWVsZCgpICYmIGlzRWRpdGVkKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNG
b3JtRWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci0gICAgICAgIHNldEVkaXRlZChmYWxz
ZSk7Ci0gICAgfQotCi0gICAgaWYgKEhUTUxGb3JtRWxlbWVudCogZmUgPSBzdGF0aWNfY2FzdDxI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpKQotICAgICAgICBmZS0+c3Vi
bWl0Q2xpY2soKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6cGVyZm9ybVNlYXJjaChXaWRn
ZXQqKQotewotICAgIC8vIEZpcmUgdGhlICJzZWFyY2giIERPTSBldmVudC4KLSAgICBzdGF0aWNf
Y2FzdDxFdmVudFRhcmdldE5vZGUqPihub2RlKCkpLT5kaXNwYXRjaEhUTUxFdmVudChzZWFyY2hF
dmVudCwgdHJ1ZSwgZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjphZGRTZWFyY2hS
ZXN1bHQoKQotewotICAgIGlmICh3aWRnZXQoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUxpbmVF
ZGl0Kj4od2lkZ2V0KCkpLT5hZGRTZWFyY2hSZXN1bHQoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5l
RWRpdDo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCghbWluTWF4S25vd24o
KSk7Ci0KLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2FudHMgdG8g
YmUuCi0gICAgbV91cGRhdGluZyA9IHRydWU7Ci0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNf
Y2FzdDxRTGluZUVkaXQqPih3aWRnZXQoKSktPnNpemVGb3JDaGFyYWN0ZXJXaWR0aChzaXplID4g
MCA/IHNpemUgOiAyMCkpOwotICAgIG1fdXBkYXRpbmcgPSBmYWxzZTsKLQotICAgIHNldEludHJp
bnNpY1dpZHRoKHMud2lkdGgoKSk7Ci0gICAgc2V0SW50cmluc2ljSGVpZ2h0KHMuaGVpZ2h0KCkp
OwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lk
IFJlbmRlckxpbmVFZGl0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJG
b3JtRWxlbWVudDo6c2V0U3R5bGUocyk7Ci0KLSAgICBRTGluZUVkaXQqIHcgPSBzdGF0aWNfY2Fz
dDxRTGluZUVkaXQqPih3aWRnZXQoKSk7Ci0gICAgdy0+c2V0QWxpZ25tZW50KHRleHRBbGlnbm1l
bnQoKSk7Ci0gICAgdy0+c2V0V3JpdGluZ0RpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24oKSA9
PSBSVEwgPyBSVEwgOiBMVFIpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0Ojp1cGRhdGVGcm9t
RWxlbWVudCgpCi17Ci0gICAgSFRNTElucHV0RWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEhUTUxJ
bnB1dEVsZW1lbnQqPihub2RlKCkpOwotICAgIFFMaW5lRWRpdCogdyA9IHN0YXRpY19jYXN0PFFM
aW5lRWRpdCo+KHdpZGdldCgpKTsKLSAgICAKLSAgICBpbnQgbWwgPSBlLT5tYXhMZW5ndGgoKTsK
LSAgICBpZiAobWwgPD0gMCB8fCBtbCA+IDEwMjQpCi0gICAgICAgIG1sID0gMTAyNDsKLSAgICBp
ZiAody0+bWF4TGVuZ3RoKCkgIT0gbWwpCi0gICAgICAgIHctPnNldE1heExlbmd0aChtbCk7Ci0K
LSAgICBpZiAoIWUtPnZhbHVlTWF0Y2hlc1JlbmRlcmVyKCkpIHsKLSAgICAgICAgU3RyaW5nIHdp
ZGdldFRleHQgPSB3LT50ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gZS0+dmFsdWUo
KTsKLSAgICAgICAgbmV3VGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1i
b2woKSk7Ci0gICAgICAgIGlmICh3aWRnZXRUZXh0ICE9IG5ld1RleHQpIHsKLSAgICAgICAgICAg
IGludCBwb3MgPSB3LT5jdXJzb3JQb3NpdGlvbigpOwotCi0gICAgICAgICAgICBtX3VwZGF0aW5n
ID0gdHJ1ZTsKLSAgICAgICAgICAgIHctPnNldFRleHQobmV3VGV4dCk7Ci0gICAgICAgICAgICBt
X3VwZGF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHctPnNldEVkaXRl
ZCggZmFsc2UgKTsKLQotICAgICAgICAgICAgdy0+c2V0Q3Vyc29yUG9zaXRpb24ocG9zKTsKLSAg
ICAgICAgfQotICAgICAgICBlLT5zZXRWYWx1ZU1hdGNoZXNSZW5kZXJlcigpOwotICAgIH0KLQot
ICAgIHctPnNldFJlYWRPbmx5KGUtPmlzUmVhZE9ubHlDb250cm9sKCkpOwotICAgIAotICAgIC8v
IEhhbmRsZSB1cGRhdGluZyB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMuCi0gICAgdy0+c2V0UGxhY2Vo
b2xkZXJTdHJpbmcoZS0+Z2V0QXR0cmlidXRlKHBsYWNlaG9sZGVyQXR0cikuZGVwcmVjYXRlZFN0
cmluZygpKTsKLSAgICBpZiAody0+dHlwZSgpID09IFFMaW5lRWRpdDo6U2VhcmNoKSB7Ci0gICAg
ICAgIHctPnNldExpdmVTZWFyY2goIWUtPmdldEF0dHJpYnV0ZShpbmNyZW1lbnRhbEF0dHIpLmlz
TnVsbCgpKTsKLSAgICAgICAgdy0+c2V0QXV0b1NhdmVOYW1lKGUtPmdldEF0dHJpYnV0ZShhdXRv
c2F2ZUF0dHIpKTsKLSAgICAgICAgdy0+c2V0TWF4UmVzdWx0cyhlLT5tYXhSZXN1bHRzKCkpOwot
ICAgIH0KLQotICAgIHctPnNldENvbG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5
bGUoKS0+Y29sb3IoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1l
bnQoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17
Ci0gICAgaWYgKG1fdXBkYXRpbmcpIC8vIERvbid0IGFsdGVyIHRoZSB2YWx1ZSBpZiB3ZSBhcmUg
aW4gdGhlIG1pZGRsZSBvZiBpbml0aW5nIHRoZSBjb250cm9sLCBzaW5jZQotICAgICAgICByZXR1
cm47ICAgICAvLyB3ZSBhcmUgZ2V0dGluZyB0aGUgdmFsdWUgZnJvbSB0aGUgRE9NIGFuZCBpdCdz
IG5vdCB1c2VyIGlucHV0LgotCi0gICAgU3RyaW5nIG5ld1RleHQgPSBzdGF0aWNfY2FzdDxRTGlu
ZUVkaXQqPih3aWRnZXQoKSktPnRleHQoKTsKLQotICAgIC8vIEEgbnVsbCBzdHJpbmcgdmFsdWUg
aXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGNvbnRyb2wgaGFzIG5vdCBhbHRlcmVk
IHRoZSBvcmlnaW5hbAotICAgIC8vIGRlZmF1bHQgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgd2Ug
c2hvdWxkIG5ldmVyIHVzZSB0aGUgbnVsbCBzdHJpbmcgdmFsdWUgd2hlbiB0aGUgdXNlcgotICAg
IC8vIGVtcHRpZXMgYSB0ZXh0ZmllbGQsIGJ1dCBzaG91bGQgYWx3YXlzIGZvcmNlIGFuIGVtcHR5
IHRleHRmaWVsZCB0byB1c2UgdGhlIGVtcHR5IHN0cmluZy4KLSAgICBpZiAobmV3VGV4dC5pc051
bGwoKSkKLSAgICAgICAgbmV3VGV4dCA9ICIiOwotCi0gICAgbmV3VGV4dC5yZXBsYWNlKGJhY2tz
bGFzaEFzQ3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlRnJvbVJlbmRlcmVyKG5ld1RleHQpOwotfQotCi1p
bnQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBRTGluZUVkaXQgKmxp
bmVFZGl0ID0gc3RhdGljX2Nhc3Q8UUxpbmVFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICBpbnQgc3Rh
cnQgPSBsaW5lRWRpdC0+c2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpZiAoc3RhcnQgPT0gLTEpCi0g
ICAgICAgIHN0YXJ0ID0gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIHN0
YXJ0OwotfQotCi1pbnQgUmVuZGVyTGluZUVkaXQ6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUUxp
bmVFZGl0ICpsaW5lRWRpdCA9IHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCk7Ci0g
ICAgaW50IHN0YXJ0ID0gbGluZUVkaXQtPnNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaWYgKHN0YXJ0
ID09IC0xKQotICAgICAgICByZXR1cm4gbGluZUVkaXQtPmN1cnNvclBvc2l0aW9uKCk7Ci0gICAg
cmV0dXJuIHN0YXJ0ICsgKGludClsaW5lRWRpdC0+c2VsZWN0ZWRUZXh0KCkubGVuZ3RoKCk7Ci19
Ci0KLXZvaWQgUmVuZGVyTGluZUVkaXQ6OnNldFNlbGVjdGlvblN0YXJ0KGludCBzdGFydCkKLXsK
LSAgICBpbnQgcmVhbFN0YXJ0ID0gbWF4KHN0YXJ0LCAwKTsKLSAgICBpbnQgbGVuZ3RoID0gbWF4
KHNlbGVjdGlvbkVuZCgpIC0gcmVhbFN0YXJ0LCAwKTsKLSAgICBzdGF0aWNfY2FzdDxRTGluZUVk
aXQgKj4obV93aWRnZXQpLT5zZXRTZWxlY3Rpb24ocmVhbFN0YXJ0LCBsZW5ndGgpOwotfQotCi12
b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxlY3Rpb25FbmQoaW50IGVuZCkKLXsKLSAgICBpbnQg
c3RhcnQgPSBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCByZWFsRW5kID0gbWF4KGVuZCwgMCk7
Ci0gICAgaW50IGxlbmd0aCA9IHJlYWxFbmQgLSBzdGFydDsKLSAgICBpZiAobGVuZ3RoIDwgMCkg
ewotICAgICAgICBzdGFydCA9IHJlYWxFbmQ7Ci0gICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgfQot
ICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihzdGFy
dCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBSZW5kZXJMaW5lRWRpdDo6c2VsZWN0KCkKLXsKLSAgICBz
dGF0aWNfY2FzdDxRTGluZUVkaXQqPihtX3dpZGdldCktPnNlbGVjdEFsbCgpOwotfQotCi1ib29s
IFJlbmRlckxpbmVFZGl0Ojppc0VkaXRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0YXRpY19j
YXN0PFFMaW5lRWRpdCo+KG1fd2lkZ2V0KS0+ZWRpdGVkKCk7Ci19Ci12b2lkIFJlbmRlckxpbmVF
ZGl0OjpzZXRFZGl0ZWQoYm9vbCB4KQotewotICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCo+KG1f
d2lkZ2V0KS0+c2V0RWRpdGVkKHgpOwotfQotCi12b2lkIFJlbmRlckxpbmVFZGl0OjpzZXRTZWxl
Y3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICAgaW50IHJlYWxTdGFydCA9IG1h
eChzdGFydCwgMCk7Ci0gICAgaW50IGxlbmd0aCA9IG1heChlbmQgLSByZWFsU3RhcnQsIDApOwot
ICAgIHN0YXRpY19jYXN0PFFMaW5lRWRpdCAqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbihyZWFs
U3RhcnQsIGxlbmd0aCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJGaWVs
ZHNldDo6UmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLTog
UmVuZGVyQmxvY2soZWxlbWVudCkKLXsKLX0KLQotUmVuZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNl
dDo6bGF5b3V0TGVnZW5kKGJvb2wgcmVsYXlvdXRDaGlsZHJlbikKLXsKLSAgICBSZW5kZXJPYmpl
Y3QqIGxlZ2VuZCA9IGZpbmRMZWdlbmQoKTsKLSAgICBpZiAobGVnZW5kKSB7Ci0gICAgICAgIGlm
IChyZWxheW91dENoaWxkcmVuKQotICAgICAgICAgICAgbGVnZW5kLT5zZXROZWVkc0xheW91dCh0
cnVlKTsKLSAgICAgICAgbGVnZW5kLT5sYXlvdXRJZk5lZWRlZCgpOwotCi0gICAgICAgIGludCB4
UG9zID0gYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKSArIGxlZ2VuZC0+bWFyZ2luTGVmdCgp
OwotICAgICAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKQotICAgICAgICAgICAg
eFBvcyA9IG1fd2lkdGggLSBwYWRkaW5nUmlnaHQoKSAtIGJvcmRlclJpZ2h0KCkgLSBsZWdlbmQt
PndpZHRoKCkgLSBsZWdlbmQtPm1hcmdpblJpZ2h0KCk7Ci0gICAgICAgIGludCBiID0gYm9yZGVy
VG9wKCk7Ci0gICAgICAgIGludCBoID0gbGVnZW5kLT5oZWlnaHQoKTsKLSAgICAgICAgbGVnZW5k
LT5zZXRQb3MoeFBvcywgbWF4KChiLWgpLzIsIDApKTsKLSAgICAgICAgbV9oZWlnaHQgPSBtYXgo
YixoKSArIHBhZGRpbmdUb3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxlZ2VuZDsKLX0KLQotUmVu
ZGVyT2JqZWN0KiBSZW5kZXJGaWVsZHNldDo6ZmluZExlZ2VuZCgpCi17Ci0gICAgZm9yIChSZW5k
ZXJPYmplY3QqIGxlZ2VuZCA9IGZpcnN0Q2hpbGQoKTsgbGVnZW5kOyBsZWdlbmQgPSBsZWdlbmQt
Pm5leHRTaWJsaW5nKCkpIHsKLSAgICAgIGlmICghbGVnZW5kLT5pc0Zsb2F0aW5nT3JQb3NpdGlv
bmVkKCkgJiYgbGVnZW5kLT5lbGVtZW50KCkgJiYKLSAgICAgICAgICBsZWdlbmQtPmVsZW1lbnQo
KS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQotICAgICAgICByZXR1cm4gbGVnZW5kOwotICAgIH0K
LSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBSZW5kZXJGaWVsZHNldDo6cGFpbnRCb3hEZWNvcmF0
aW9ucyhQYWludEluZm8mIGksIGludCBfdHgsIGludCBfdHkpCi17Ci0gICAgaW50IHcgPSB3aWR0
aCgpOwotICAgIGludCBoID0gaGVpZ2h0KCkgKyBib3JkZXJUb3BFeHRyYSgpICsgYm9yZGVyQm90
dG9tRXh0cmEoKTsKLSAgICBSZW5kZXJPYmplY3QqIGxlZ2VuZCA9IGZpbmRMZWdlbmQoKTsKLSAg
ICBpZiAoIWxlZ2VuZCkKLSAgICAgICAgcmV0dXJuIFJlbmRlckJsb2NrOjpwYWludEJveERlY29y
YXRpb25zKGksIF90eCwgX3R5KTsKLQotICAgIGludCB5T2ZmID0gKGxlZ2VuZC0+eVBvcygpID4g
MCkgPyAwIDogKGxlZ2VuZC0+aGVpZ2h0KCktYm9yZGVyVG9wKCkpLzI7Ci0gICAgaCAtPSB5T2Zm
OwotICAgIF90eSArPSB5T2ZmIC0gYm9yZGVyVG9wRXh0cmEoKTsKLQotICAgIGludCBteSA9IG1h
eChfdHksIGkuci55KCkpOwotICAgIGludCBlbmQgPSBtaW4oaS5yLmJvdHRvbSgpLCAgX3R5ICsg
aCk7Ci0gICAgaW50IG1oID0gZW5kIC0gbXk7Ci0KLSAgICBwYWludEJhY2tncm91bmQoaS5wLCBz
dHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpLCBt
eSwgbWgsIF90eCwgX3R5LCB3LCBoKTsKLQotICAgIGlmIChzdHlsZSgpLT5oYXNCb3JkZXIoKSkK
LSAgICAgICAgcGFpbnRCb3JkZXJNaW51c0xlZ2VuZChpLnAsIF90eCwgX3R5LCB3LCBoLCBzdHls
ZSgpLCBsZWdlbmQtPnhQb3MoKSwgbGVnZW5kLT53aWR0aCgpKTsKLX0KLQotdm9pZCBSZW5kZXJG
aWVsZHNldDo6cGFpbnRCb3JkZXJNaW51c0xlZ2VuZChHcmFwaGljc0NvbnRleHQqIHAsIGludCBf
dHgsIGludCBfdHksIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQgbHgsIGludCBsdykK
LXsKLQotICAgIGNvbnN0IENvbG9yJiB0YyA9IHN0eWxlLT5ib3JkZXJUb3BDb2xvcigpOwotICAg
IGNvbnN0IENvbG9yJiBiYyA9IHN0eWxlLT5ib3JkZXJCb3R0b21Db2xvcigpOwotCi0gICAgRUJv
cmRlclN0eWxlIHRzID0gc3R5bGUtPmJvcmRlclRvcFN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxl
IGJzID0gc3R5bGUtPmJvcmRlckJvdHRvbVN0eWxlKCk7Ci0gICAgRUJvcmRlclN0eWxlIGxzID0g
c3R5bGUtPmJvcmRlckxlZnRTdHlsZSgpOwotICAgIEVCb3JkZXJTdHlsZSBycyA9IHN0eWxlLT5i
b3JkZXJSaWdodFN0eWxlKCk7Ci0KLSAgICBib29sIHJlbmRlcl90ID0gdHMgPiBCSElEREVOOwot
ICAgIGJvb2wgcmVuZGVyX2wgPSBscyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfciA9IHJz
ID4gQkhJRERFTjsKLSAgICBib29sIHJlbmRlcl9iID0gYnMgPiBCSElEREVOOwotCi0gICAgaWYo
cmVuZGVyX3QpIHsKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgbHgsIF90
eSArICBzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwgQlNUb3AsIHRjLCBzdHlsZS0+Y29sb3IoKSwg
dHMsCi0gICAgICAgICAgICAgICAgICAgKHJlbmRlcl9sICYmIChscyA9PSBET1RURUQgfHwgbHMg
PT0gREFTSEVEIHx8IGxzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlckxlZnRXaWR0aCgpOjApLCAw
KTsKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgrbHgrbHcsIF90eSwgX3R4ICsgdywgX3R5ICsg
IHN0eWxlLT5ib3JkZXJUb3BXaWR0aCgpLCBCU1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywK
LSAgICAgICAgICAgICAgICAgICAwLCAocmVuZGVyX3IgJiYgKHJzID09IERPVFRFRCB8fCBycyA9
PSBEQVNIRUQgfHwgcnMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyUmlnaHRXaWR0aCgpOjApKTsK
LSAgICB9Ci0KLSAgICBpZihyZW5kZXJfYikKLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90
eSArIGggLSBzdHlsZS0+Ym9yZGVyQm90dG9tV2lkdGgoKSwgX3R4ICsgdywgX3R5ICsgaCwgQlNC
b3R0b20sIGJjLCBzdHlsZS0+Y29sb3IoKSwgYnMsCi0gICAgICAgICAgICAgICAgICAgKHJlbmRl
cl9sICYmIChscyA9PSBET1RURUQgfHwgbHMgPT0gREFTSEVEIHx8IGxzID09IERPVUJMRSk/c3R5
bGUtPmJvcmRlckxlZnRXaWR0aCgpOjApLAotICAgICAgICAgICAgICAgICAgIChyZW5kZXJfciAm
JiAocnMgPT0gRE9UVEVEIHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VCTEUpP3N0eWxlLT5i
b3JkZXJSaWdodFdpZHRoKCk6MCkpOwotCi0gICAgaWYocmVuZGVyX2wpCi0gICAgewotICAgICAg
ICBjb25zdCBDb2xvciYgbGMgPSBzdHlsZS0+Ym9yZGVyTGVmdENvbG9yKCk7Ci0KLSAgICAgICAg
Ym9vbCBpZ25vcmVfdG9wID0KLSAgICAgICAgICAgICh0YyA9PSBsYykgJiYKLSAgICAgICAgICAg
IChscyA+PSBPVVRTRVQpICYmCi0gICAgICAgICAgICAodHMgPT0gRE9UVEVEIHx8IHRzID09IERB
U0hFRCB8fCB0cyA9PSBTT0xJRCB8fCB0cyA9PSBPVVRTRVQpOwotCi0gICAgICAgIGJvb2wgaWdu
b3JlX2JvdHRvbSA9Ci0gICAgICAgICAgICAoYmMgPT0gbGMpICYmCi0gICAgICAgICAgICAobHMg
Pj0gT1VUU0VUKSAmJgotICAgICAgICAgICAgKGJzID09IERPVFRFRCB8fCBicyA9PSBEQVNIRUQg
fHwgYnMgPT0gU09MSUQgfHwgYnMgPT0gSU5TRVQpOwotCi0gICAgICAgIGRyYXdCb3JkZXIocCwg
X3R4LCBfdHksIF90eCArIHN0eWxlLT5ib3JkZXJMZWZ0V2lkdGgoKSwgX3R5ICsgaCwgQlNMZWZ0
LCBsYywgc3R5bGUtPmNvbG9yKCksIGxzLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV90b3A/
MDpzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVfYm90
dG9tPzA6c3R5bGUtPmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRl
cl9yKQotICAgIHsKLSAgICAgICAgY29uc3QgQ29sb3ImIHJjID0gc3R5bGUtPmJvcmRlclJpZ2h0
Q29sb3IoKTsKLQotICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAgICAgICAgICAgKHRjID09
IHJjKSAmJgotICAgICAgICAgICAgKHJzID49IERPVFRFRCB8fCBycyA9PSBJTlNFVCkgJiYKLSAg
ICAgICAgICAgICh0cyA9PSBET1RURUQgfHwgdHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8
IHRzID09IE9VVFNFVCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAg
ICAgIChiYyA9PSByYykgJiYKLSAgICAgICAgICAgIChycyA+PSBET1RURUQgfHwgcnMgPT0gSU5T
RVQpICYmCi0gICAgICAgICAgICAoYnMgPT0gRE9UVEVEIHx8IGJzID09IERBU0hFRCB8fCBicyA9
PSBTT0xJRCB8fCBicyA9PSBJTlNFVCk7Ci0KLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHggKyB3
IC0gc3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKSwgX3R5LCBfdHggKyB3LCBfdHkgKyBoLCBCU1Jp
Z2h0LCByYywgc3R5bGUtPmNvbG9yKCksIHJzLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV90
b3A/MDpzdHlsZS0+Ym9yZGVyVG9wV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICBpZ25vcmVf
Ym90dG9tPzA6c3R5bGUtPmJvcmRlckJvdHRvbVdpZHRoKCkpOwotICAgIH0KLX0KLQotdm9pZCBS
ZW5kZXJGaWVsZHNldDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUqIF9zdHlsZSkKLXsKLSAgICBSZW5k
ZXJCbG9jazo6c2V0U3R5bGUoX3N0eWxlKTsKLQotICAgIC8vIFdpbklFIHJlbmRlcnMgZmllbGRz
ZXRzIHdpdGggZGlzcGxheTppbmxpbmUgbGlrZSB0aGV5J3JlIGlubGluZS1ibG9ja3MuICBGb3Ig
dXMsCi0gICAgLy8gYW4gaW5saW5lLWJsb2NrIGlzIGp1c3QgYSBibG9jayBlbGVtZW50IHdpdGgg
cmVwbGFjZWQgc2V0IHRvIHRydWUgYW5kIGlubGluZSBzZXQKLSAgICAvLyB0byB0cnVlLiAgRW5z
dXJlIHRoYXQgaWYgd2UgZW5kZWQgdXAgYmVpbmcgaW5saW5lIHRoYXQgd2Ugc2V0IG91ciByZXBs
YWNlZCBmbGFnCi0gICAgLy8gc28gdGhhdCB3ZSdyZSB0cmVhdGVkIGxpa2UgYW4gaW5saW5lLWJs
b2NrLgotICAgIGlmIChpc0lubGluZSgpKQotICAgICAgICBzZXRSZXBsYWNlZCh0cnVlKTsKLX0g
ICAgCi0gICAgCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckZpbGVCdXR0b246OlJlbmRl
ckZpbGVCdXR0b24oSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1F
bGVtZW50KGVsZW1lbnQpCi17Ci0gICAgc2V0V2lkZ2V0KG5ldyBLV1FGaWxlQnV0dG9uKHZpZXco
KS0+ZnJhbWUoKSkpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OmNhbGNNaW5NYXhXaWR0
aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkpOwotCi0gICAgLy8gTGV0IHRo
ZSB3aWRnZXQgdGVsbCB1cyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgIGludCBzaXplID0g
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNpemUoKTsKLSAgICBJbnRT
aXplIHMoc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbiAqPih3aWRnZXQoKSktPnNpemVGb3JDaGFy
YWN0ZXJXaWR0aChzaXplID4gMCA/IHNpemUgOiAyMCkpOwotCi0gICAgc2V0SW50cmluc2ljV2lk
dGgocy53aWR0aCgpKTsKLSAgICBzZXRJbnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0KLSAg
ICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
RmlsZUJ1dHRvbjo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIHN0YXRpY19jYXN0PEtXUUZp
bGVCdXR0b24qPih3aWRnZXQoKSktPnNldEZpbGVuYW1lKAotICAgICAgICBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+dmFsdWUoKS5kZXByZWNhdGVkU3RyaW5nKCkpOwot
Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLXZvaWQg
UmVuZGVyRmlsZUJ1dHRvbjo6cmV0dXJuUHJlc3NlZChXaWRnZXQqKQotewotICAgIGlmIChzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpKQotICAgICAgICBzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+Zm9ybSgpLT5wcmVwYXJlU3VibWl0
KCk7Ci19Ci0KLXZvaWQgUmVuZGVyRmlsZUJ1dHRvbjo6dmFsdWVDaGFuZ2VkKFdpZGdldCopCi17
Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNldFZhbHVlRnJv
bVJlbmRlcmVyKHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0b24qPih3aWRnZXQoKSktPmZpbGVuYW1l
KCkpOwotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5vbkNoYW5n
ZSgpOwotfQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OnNlbGVjdCgpCi17Ci19Ci0KLQotdm9p
ZCBSZW5kZXJGaWxlQnV0dG9uOjpjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cykKLXsKLSAgICBz
dGF0aWNfY2FzdDxLV1FGaWxlQnV0dG9uICo+KHdpZGdldCgpKS0+Y2xpY2soc2VuZE1vdXNlRXZl
bnRzKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxhYmVsOjpSZW5kZXJM
YWJlbChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVs
ZW1lbnQoZWxlbWVudCkKLXsKLQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckxl
Z2VuZDo6UmVuZGVyTGVnZW5kKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpCitSZW5k
ZXJMZWdlbmQ6OlJlbmRlckxlZ2VuZChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50KiBlbGVtZW50KQog
ICAgIDogUmVuZGVyQmxvY2soZWxlbWVudCkKIHsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1SZW5kZXJTZWxlY3Q6OlJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVudCAqZWxlbWVudCkK
LSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpCi17Ci0gICAgbV9pZ25vcmVTZWxlY3RF
dmVudHMgPSBmYWxzZTsKLSAgICBtX211bHRpcGxlID0gZWxlbWVudC0+bXVsdGlwbGUoKTsKLSAg
ICBtX3NpemUgPSBlbGVtZW50LT5zaXplKCk7Ci0gICAgbV91c2VMaXN0Qm94ID0gKG1fbXVsdGlw
bGUgfHwgbV9zaXplID4gMSk7Ci0gICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLSAgICBt
X29wdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKLQotICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAg
IHNldFdpZGdldChjcmVhdGVMaXN0Qm94KCkpOwotICAgIGVsc2UKLSAgICAgICAgc2V0V2lkZ2V0
KG5ldyBRQ29tYm9Cb3gpOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0OjpzZXRXaWRnZXRXcml0
aW5nRGlyZWN0aW9uKCkKLXsKLSAgICBUZXh0RGlyZWN0aW9uIGQgPSBzdHlsZSgpLT5kaXJlY3Rp
b24oKSA9PSBSVEwgPyBSVEwgOiBMVFI7Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAg
c3RhdGljX2Nhc3Q8UUxpc3RCb3ggKj4obV93aWRnZXQpLT5zZXRXcml0aW5nRGlyZWN0aW9uKGQp
OwotICAgIGVsc2UKLSAgICAgICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94ICo+KG1fd2lkZ2V0KS0+
c2V0V3JpdGluZ0RpcmVjdGlvbihkKTsKLX0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OnNldFN0eWxl
KFJlbmRlclN0eWxlICpzKQotewotICAgIFJlbmRlckZvcm1FbGVtZW50OjpzZXRTdHlsZShzKTsK
LSAgICBzZXRXaWRnZXRXcml0aW5nRGlyZWN0aW9uKCk7Ci19Ci0KLQotdm9pZCBSZW5kZXJTZWxl
Y3Q6OnVwZGF0ZUZyb21FbGVtZW50KCkKLXsKLSAgICBtX2lnbm9yZVNlbGVjdEV2ZW50cyA9IHRy
dWU7Ci0KLSAgICAvLyBjaGFuZ2Ugd2lkZ2V0IHR5cGUKLSAgICBib29sIG9sZE11bHRpcGxlID0g
bV9tdWx0aXBsZTsKLSAgICB1bnNpZ25lZCBvbGRTaXplID0gbV9zaXplOwotICAgIGJvb2wgb2xk
TGlzdGJveCA9IG1fdXNlTGlzdEJveDsKLQotICAgIG1fbXVsdGlwbGUgPSBzdGF0aWNfY2FzdDxI
VE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm11bHRpcGxlKCk7Ci0gICAgbV9zaXplID0gc3Rh
dGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5zaXplKCk7Ci0gICAgbV91c2VM
aXN0Qm94ID0gKG1fbXVsdGlwbGUgfHwgbV9zaXplID4gMSk7Ci0KLSAgICBpZiAob2xkTXVsdGlw
bGUgIT0gbV9tdWx0aXBsZSB8fCBvbGRTaXplICE9IG1fc2l6ZSkgewotICAgICAgICBpZiAobV91
c2VMaXN0Qm94ICE9IG9sZExpc3Rib3gpIHsKLSAgICAgICAgICAgIC8vIHR5cGUgb2Ygc2VsZWN0
IGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICBkZWxldGUgbV93aWRnZXQ7Ci0KLSAgICAgICAgICAg
IGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgc2V0V2lkZ2V0KGNyZWF0ZUxpc3RC
b3goKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0V2lkZ2V0KG5ldyBR
Q29tYm9Cb3gpOwotICAgICAgICAgICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCAmJiBvbGRNdWx0aXBsZSAhPSBtX211
bHRpcGxlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+
c2V0U2VsZWN0aW9uTW9kZShtX211bHRpcGxlID8gUUxpc3RCb3g6OkV4dGVuZGVkIDogUUxpc3RC
b3g6OlNpbmdsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1
ZTsKLSAgICAgICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gdXBk
YXRlIGNvbnRlbnRzIGxpc3Rib3gvY29tYm9ib3ggYmFzZWQgb24gb3B0aW9ucyBpbiBtX2VsZW1l
bnQKLSAgICBpZiAoIG1fb3B0aW9uc0NoYW5nZWQgKSB7Ci0gICAgICAgIGlmIChzdGF0aWNfY2Fz
dDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm1fcmVjYWxjTGlzdEl0ZW1zKQotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5yZWNhbGNMaXN0
SXRlbXMoKTsKLSAgICAgICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1z
ID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsK
LSAgICAgICAgaW50IGxpc3RJbmRleDsKLQotICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmNsZWFyKCk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+
Y2xlYXIoKTsKLQotICAgICAgICBib29sIGdyb3VwRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIGZv
ciAobGlzdEluZGV4ID0gMDsgbGlzdEluZGV4IDwgaW50KGxpc3RJdGVtcy5zaXplKCkpOyBsaXN0
SW5kZXgrKykgewotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNUYWdO
YW1lKG9wdGdyb3VwVGFnKSkgewotICAgICAgICAgICAgICAgIEhUTUxPcHRHcm91cEVsZW1lbnQg
Km9wdGdyb3VwRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxPcHRHcm91cEVsZW1lbnQqPihsaXN0
SXRlbXNbbGlzdEluZGV4XSk7Ci0gICAgICAgICAgICAgICAgRGVwcmVjYXRlZFN0cmluZyBsYWJl
bCA9IG9wdGdyb3VwRWxlbWVudC0+Z2V0QXR0cmlidXRlKGxhYmVsQXR0cikuZGVwcmVjYXRlZFN0
cmluZygpOwotICAgICAgICAgICAgICAgIGxhYmVsLnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXND
dXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBJ
biBXaW5JRSwgYW4gb3B0Z3JvdXAgY2FuJ3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZSAo
b3RoZXIgdGhhbiB0aGUgaW5kZW50Ci0gICAgICAgICAgICAgICAgLy8gd2UgZ2l2ZSBpdCkuICBX
ZSBtYXRjaCB0aGlzIGJlaGF2aW9yLgotICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuc3Ry
aXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBjb2xsYXBzZSBv
dXIgd2hpdGVzcGFjZSB0b28uICBUaGlzIHdpbGwgbWF0Y2ggb3RoZXIgYnJvd3NlcnMuCi0gICAg
ICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5zaW1wbGlmeVdoaXRlU3BhY2UoKTsKLQotICAgICAg
ICAgICAgICAgIGdyb3VwRW5hYmxlZCA9IG9wdGdyb3VwRWxlbWVudC0+aXNFbmFibGVkKCk7Ci0g
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmFwcGVuZEdy
b3VwTGFiZWwobGFiZWwsIGdyb3VwRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmFwcGVu
ZEdyb3VwTGFiZWwobGFiZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAo
bGlzdEl0ZW1zW2xpc3RJbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAg
ICAgICAgIEhUTUxPcHRpb25FbGVtZW50ICpvcHRpb25FbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRN
TE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbbGlzdEluZGV4XSk7Ci0gICAgICAgICAgICAgICAg
RGVwcmVjYXRlZFN0cmluZyBpdGVtVGV4dDsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9uRWxl
bWVudC0+aGFzQXR0cmlidXRlKGxhYmVsQXR0cikpCi0gICAgICAgICAgICAgICAgICAgIGl0ZW1U
ZXh0ID0gb3B0aW9uRWxlbWVudC0+Z2V0QXR0cmlidXRlKGxhYmVsQXR0cikuZGVwcmVjYXRlZFN0
cmluZygpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaXRlbVRl
eHQgPSBvcHRpb25FbGVtZW50LT50ZXh0KCkuZGVwcmVjYXRlZFN0cmluZygpOwotICAgICAgICAg
ICAgICAgIAotICAgICAgICAgICAgICAgIGl0ZW1UZXh0LnJlcGxhY2UoJ1xcJywgYmFja3NsYXNo
QXNDdXJyZW5jeVN5bWJvbCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEluIFdpbklFLCBsZWFk
aW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQgaW4gb3B0aW9ucy4gV2UgbWF0
Y2ggdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IGl0ZW1UZXh0LnN0
cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gY29sbGFwc2Ug
b3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3aWxsIG1hdGNoIG90aGVyIGJyb3dzZXJzLgotICAg
ICAgICAgICAgICAgIGl0ZW1UZXh0ID0gaXRlbVRleHQuc2ltcGxpZnlXaGl0ZVNwYWNlKCk7Ci0g
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhd
LT5wYXJlbnROb2RlKCktPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICAgICAgICAg
ICAgICBpdGVtVGV4dC5wcmVwZW5kKCIgICAgIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobV91
c2VMaXN0Qm94KQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1f
d2lkZ2V0KS0+YXBwZW5kSXRlbShpdGVtVGV4dCwgZ3JvdXBFbmFibGVkICYmIG9wdGlvbkVsZW1l
bnQtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+YXBwZW5kSXRlbShpdGVtVGV4
dCwgZ3JvdXBFbmFibGVkICYmIG9wdGlvbkVsZW1lbnQtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNUYWdO
YW1lKGhyVGFnKSkgewotICAgICAgICAgICAgICAgIGlmICghbV91c2VMaXN0Qm94KQotICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmFwcGVuZFNl
cGFyYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIEtIVE1MQXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9
IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAg
IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5kb25lQXBwZW5kaW5nSXRlbXMoKTsK
LSAgICAgICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgbV9vcHRp
b25zQ2hhbmdlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBzZWxlY3Rpb24KLSAg
ICBpZiAobV9zZWxlY3Rpb25DaGFuZ2VkKSB7Ci0gICAgICAgIHVwZGF0ZVNlbGVjdGlvbigpOwot
ICAgIH0KLQotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0KLSAgICBSZW5kZXJG
b3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotCi1zaG9ydCBSZW5kZXJTZWxl
Y3Q6OmJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwgYm9vbCBpc1Jvb3RMaW5lQm94ICkgY29uc3QK
LXsKLSAgICBpZiAobV91c2VMaXN0Qm94KSB7Ci0gICAgICAgIC8vIEZJWE1FOiBTaG91bGQgZ2V0
IHRoZSBoYXJkY29kZWQgY29uc3RhbnQgb2YgNyBieSBjYWxsaW5nIGEgUUxpc3RCb3ggZnVuY3Rp
b24sCi0gICAgICAgIC8vIGFzIHdlIGRvIGZvciBvdGhlciB3aWRnZXQgY2xhc3Nlcy4KLSAgICAg
ICAgcmV0dXJuIFJlbmRlcldpZGdldDo6YmFzZWxpbmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJv
eCApIC0gNzsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlckZvcm1FbGVtZW50OjpiYXNlbGluZVBv
c2l0aW9uKCBmLCBpc1Jvb3RMaW5lQm94ICk7Ci19Ci0KLQotdm9pZCBSZW5kZXJTZWxlY3Q6OmNh
bGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoICFtaW5NYXhLbm93bigpICk7Ci0K
LSAgICBpZiAobV9vcHRpb25zQ2hhbmdlZCkKLSAgICAgICAgdXBkYXRlRnJvbUVsZW1lbnQoKTsK
LQotICAgIC8vICMjIyB1Z2x5IEhBQ0sgRklYTUUhISEKLSAgICBzZXRNaW5NYXhLbm93bigpOwot
ICAgIGxheW91dElmTmVlZGVkKCk7Ci0gICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMo
KTsKLSAgICAvLyAjIyMgZW5kIEZJWE1FCi0KLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01p
bk1heFdpZHRoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0OjpsYXlvdXQoICkKLXsKLSAgICBL
SFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBLSFRNTEFzc2VydChtaW5NYXhLbm93bigp
KTsKLQotICAgIC8vICMjIyBtYWludGFpbiBzZWxlY3Rpb24gcHJvcGVybHkgYmV0d2VlbiB0eXBl
L3NpemUgY2hhbmdlcywgYW5kIHdvcmsKLSAgICAvLyBvdXQgaG93IHRvIGhhbmRsZSBtdWx0aXNl
bGVjdC0+c2luZ2xlc2VsZWN0IChwcm9iYWJseSBqdXN0IHNlbGVjdAotICAgIC8vIGZpcnN0IHNl
bGVjdGVkIG9uZSkKLQotICAgIC8vIGNhbGN1bGF0ZSBzaXplCi0gICAgaWYobV91c2VMaXN0Qm94
KSB7Ci0gICAgICAgIFFMaXN0Qm94KiB3ID0gc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdl
dCk7Ci0KLQotICAgICAgICBpbnQgc2l6ZSA9IG1fc2l6ZTsKLSAgICAgICAgLy8gY2hlY2sgaWYg
bXVsdGlwbGUgYW5kIHNpemUgd2FzIG5vdCBnaXZlbiBvciBpbnZhbGlkCi0gICAgICAgIC8vIElu
dGVybmV0IEV4cGxvZGVyIHNldHMgc2l6ZSB0byBtaW4obnVtYmVyIG9mIGVsZW1lbnRzLCA0KQot
ICAgICAgICAvLyBOZXRzY2FwZSBzZWVtcyB0byBzaW1wbHkgc2V0IGl0IHRvICJudW1iZXIgb2Yg
ZWxlbWVudHMiCi0gICAgICAgIC8vIHRoZSBhdmVyYWdlIG9mIHRoYXQgaXMgSU1ITyBtaW4obnVt
YmVyIG9mIGVsZW1lbnRzLCAxMCkKLSAgICAgICAgLy8gc28gSSBkaWQgdGhhdCA7LSkKLSAgICAg
ICAgaWYoc2l6ZSA8IDEpCi0gICAgICAgICAgICBzaXplID0gbWluKHN0YXRpY19jYXN0PFFMaXN0
Qm94Kj4obV93aWRnZXQpLT5jb3VudCgpLCAxMFUpOwotCi0gICAgICAgIC8vIExldCB0aGUgd2lk
Z2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0byBiZS4KLSAgICAgICAgSW50U2l6ZSBzKHct
PnNpemVGb3JOdW1iZXJPZkxpbmVzKHNpemUpKTsKLSAgICAgICAgc2V0SW50cmluc2ljV2lkdGgo
IHMud2lkdGgoKSApOwotICAgICAgICBzZXRJbnRyaW5zaWNIZWlnaHQoIHMuaGVpZ2h0KCkgKTsK
LSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEludFNpemUgcyhtX3dpZGdldC0+c2l6ZUhpbnQo
KSk7Ci0gICAgICAgIHNldEludHJpbnNpY1dpZHRoKCBzLndpZHRoKCkgKTsKLSAgICAgICAgc2V0
SW50cmluc2ljSGVpZ2h0KCBzLmhlaWdodCgpICk7Ci0gICAgfQotCi0gICAgUmVuZGVyRm9ybUVs
ZW1lbnQ6OmxheW91dCgpOwotCi0gICAgLy8gYW5kIG5vdyBkaXNhYmxlIHRoZSB3aWRnZXQgaW4g
Y2FzZSB0aGVyZSBpcyBubyA8b3B0aW9uPiBnaXZlbgotICAgIERlcHJlY2F0ZWRBcnJheTxIVE1M
RWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9k
ZSgpKS0+bGlzdEl0ZW1zKCk7Ci0KLSAgICBib29sIGZvdW5kT3B0aW9uID0gZmFsc2U7Ci0gICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxpc3RJdGVtcy5zaXplKCkgJiYgIWZvdW5kT3B0aW9u
OyBpKyspCi0gICAgICAgIGZvdW5kT3B0aW9uID0gKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShv
cHRpb25UYWcpKTsKLQotICAgIG1fd2lkZ2V0LT5zZXRFbmFibGVkKGZvdW5kT3B0aW9uICYmICEg
c3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5kaXNhYmxlZCgpKTsKLX0K
LQotdm9pZCBSZW5kZXJTZWxlY3Q6OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmICht
X2lnbm9yZVNlbGVjdEV2ZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgS0hUTUxBc3NlcnQo
IW1fdXNlTGlzdEJveCk7Ci0KLSAgICBpbnQgaW5kZXggPSBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gq
PihtX3dpZGdldCktPmN1cnJlbnRJdGVtKCk7Ci0KLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVs
ZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUo
KSktPmxpc3RJdGVtcygpOwotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgKGludClsaXN0
SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBsaXN0SXRlbXNbaW5kZXhdLT5o
YXNUYWdOYW1lKG9wdGlvblRhZyk7Ci0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAg
IC8vIHRoaXMgb25lIGlzIG5vdCBzZWxlY3RhYmxlLCAgd2UgbmVlZCB0byBmaW5kIGFuIG9wdGlv
biBlbGVtZW50Ci0gICAgICAgICAgICB3aGlsZSAoKHVuc2lnbmVkKSBpbmRleCA8IGxpc3RJdGVt
cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2luZGV4XS0+aGFzVGFn
TmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICsraW5kZXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsK
LSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAg
ICBpZiAobGlzdEl0ZW1zW2luZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAtLWluZGV4
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChmb3VuZCkgewotICAgICAgICAgICAgaWYgKCBpbmRleCAhPSBzdGF0aWNfY2FzdDxRQ29t
Ym9Cb3gqPihtX3dpZGdldCktPmN1cnJlbnRJdGVtKCkgKQotICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PFFDb21ib0JveCo+KG1fd2lkZ2V0KS0+c2V0Q3VycmVudEl0ZW0oIGluZGV4ICk7Ci0K
LSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsaXN0SXRlbXMuc2l6ZSgpOyAr
K2kpCi0gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25U
YWcpICYmIGkgIT0gKHVuc2lnbmVkIGludCkgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oIGxpc3RJdGVtc1tpXSApLT5tX3NlbGVjdGVk
ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4o
bGlzdEl0ZW1zW2luZGV4XSktPm1fc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5vbkNoYW5nZSgp
OwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0OjpzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopCi17
Ci0gICAgaWYgKG1faWdub3JlU2VsZWN0RXZlbnRzKQotICAgICAgICByZXR1cm47Ci0KLSAgICAv
LyBkb24ndCB1c2UgbGlzdEl0ZW1zKCkgaGVyZSBhcyB3ZSBoYXZlIHRvIGF2b2lkIHJlY2FsY3Vs
YXRpb25zIC0gY2hhbmdpbmcgdGhlCi0gICAgLy8gb3B0aW9uIGxpc3Qgd2lsbCBtYWtlIHVzZSB1
cGRhdGUgb3B0aW9ucyBub3QgaW4gdGhlIHdheSB0aGUgdXNlciBleHBlY3RzIHRoZW0KLSAgICBE
ZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1M
U2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPm1fbGlzdEl0ZW1zOwotICAgIGludCBqID0gMDsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGlzdEl0ZW1zLmNvdW50KCk7IGkrKykgewotICAg
ICAgICAvLyBkb24ndCB1c2Ugc2V0U2VsZWN0ZWQoKSBoZXJlIGJlY2F1c2UgaXQgd2lsbCBjYXVz
ZSB1cyB0byBiZSBjYWxsZWQKLSAgICAgICAgLy8gYWdhaW4gd2l0aCB1cGRhdGVTZWxlY3Rpb24u
Ci0gICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4oIGxpc3RJdGVtc1tpXSApCi0g
ICAgICAgICAgICAgICAgLT5tX3NlbGVjdGVkID0gc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPiggbV93
aWRnZXQgKS0+aXNTZWxlY3RlZCggaiApOwotICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNU
YWdOYW1lKG9wdGlvblRhZykgfHwgbGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFn
KSkKLSAgICAgICAgICAgICsrajsKLSAgICB9Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVs
ZW1lbnQqPihub2RlKCkpLT5vbkNoYW5nZSgpOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0Ojpz
ZXRPcHRpb25zQ2hhbmdlZChib29sIF9vcHRpb25zQ2hhbmdlZCkKLXsKLSAgICBtX29wdGlvbnND
aGFuZ2VkID0gX29wdGlvbnNDaGFuZ2VkOwotfQotCi1RTGlzdEJveCogUmVuZGVyU2VsZWN0Ojpj
cmVhdGVMaXN0Qm94KCkKLXsKLSAgICBRTGlzdEJveCAqbGIgPSBuZXcgUUxpc3RCb3goKTsKLSAg
ICBsYi0+c2V0U2VsZWN0aW9uTW9kZShtX211bHRpcGxlID8gUUxpc3RCb3g6OkV4dGVuZGVkIDog
UUxpc3RCb3g6OlNpbmdsZSk7Ci0gICAgbV9pZ25vcmVTZWxlY3RFdmVudHMgPSBmYWxzZTsKLSAg
ICByZXR1cm4gbGI7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp1cGRhdGVTZWxlY3Rpb24oKQot
ewotICAgIERlcHJlY2F0ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19j
YXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1zKCk7Ci0gICAgaW50IGk7
Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkgewotICAgICAgICAvLyBpZiBtdWx0aS1zZWxlY3QsIHdl
IHNlbGVjdCBvbmx5IHRoZSBuZXcgc2VsZWN0ZWQgaW5kZXgKLSAgICAgICAgUUxpc3RCb3ggKmxp
c3RCb3ggPSBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KTsKLSAgICAgICAgaW50IGog
PSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW50KGxpc3RJdGVtcy5zaXplKCkpOyBpKysp
IHsKLSAgICAgICAgICAgIGxpc3RCb3gtPnNldFNlbGVjdGVkKGosIGxpc3RJdGVtc1tpXS0+aGFz
VGFnTmFtZShvcHRpb25UYWcpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1zW2ldKS0+c2VsZWN0ZWQoKSk7
Ci0gICAgICAgICAgICBpZiAobGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwg
bGlzdEl0ZW1zW2ldLT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkKLSAgICAgICAgICAgICAgICAr
K2o7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAg
Ym9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICB1bnNpZ25lZCBmaXJzdE9wdGlvbiA9IGxpc3RJ
dGVtcy5zaXplKCk7Ci0gICAgICAgIGkgPSBsaXN0SXRlbXMuc2l6ZSgpOwotICAgICAgICB3aGls
ZSAoaS0tKQotICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25U
YWcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kKQotICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpXSktPm1fc2VsZWN0ZWQg
PSBmYWxzZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0aWNfY2FzdDxIVE1MT3B0aW9u
RWxlbWVudCo+KGxpc3RJdGVtc1tpXSktPnNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4oIG1fd2lkZ2V0ICktPnNldEN1cnJlbnRJdGVtKGkp
OwotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIGZpcnN0T3B0aW9uID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICBBU1NFUlQoZmlyc3RPcHRpb24gPT0gbGlzdEl0ZW1zLnNpemUoKSB8fCBmb3VuZCk7Ci0gICAg
fQotCi0gICAgbV9zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci19Ci0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyVGV4dEFyZWE6OlJlbmRl
clRleHRBcmVhKEhUTUxUZXh0QXJlYUVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3Jt
RWxlbWVudChlbGVtZW50KSwgbV9kaXJ0eShmYWxzZSksIG1fdXBkYXRpbmcoZmFsc2UpCi17Ci0g
ICAgUVRleHRFZGl0ICplZGl0ID0gbmV3IFFUZXh0RWRpdCh2aWV3KCkpOwotCi0gICAgaWYgKGVs
ZW1lbnQtPndyYXAoKSAhPSBIVE1MVGV4dEFyZWFFbGVtZW50Ojp0YV9Ob1dyYXApCi0gICAgICAg
IGVkaXQtPnNldFdvcmRXcmFwKFFUZXh0RWRpdDo6V2lkZ2V0V2lkdGgpOwotICAgIGVsc2UKLSAg
ICAgICAgZWRpdC0+c2V0V29yZFdyYXAoUVRleHRFZGl0OjpOb1dyYXApOwotCi0gICAgc2V0V2lk
Z2V0KGVkaXQpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpkZXN0cm95KCkKLXsKLSAgICBz
dGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+cmVuZGVyZXJXaWxsQmVE
ZXN0cm95ZWQoKTsKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6ZGVzdHJveSgpOwotfQotCi12b2lk
IFJlbmRlclRleHRBcmVhOjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtIVE1MQXNzZXJ0KCAh
bWluTWF4S25vd24oKSApOwotCi0gICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRF
ZGl0Kj4obV93aWRnZXQpOwotICAgIEludFNpemUgc2l6ZSh3LT5zaXplV2l0aENvbHVtbnNBbmRS
b3dzKAotICAgICAgICBtYXgoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUo
KSktPmNvbHMoKSwgMSksCi0gICAgICAgIG1heChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVt
ZW50Kj4obm9kZSgpKS0+cm93cygpLCAxKSkpOwotCi0gICAgc2V0SW50cmluc2ljV2lkdGgoIHNp
emUud2lkdGgoKSApOwotICAgIHNldEludHJpbnNpY0hlaWdodCggc2l6ZS5oZWlnaHQoKSApOwot
Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJl
bmRlclRleHRBcmVhOjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBSZW5kZXJGb3Jt
RWxlbWVudDo6c2V0U3R5bGUocyk7Ci0KLSAgICBRVGV4dEVkaXQqIHcgPSBzdGF0aWNfY2FzdDxR
VGV4dEVkaXQqPihtX3dpZGdldCk7Ci0gICAgdy0+c2V0QWxpZ25tZW50KHRleHRBbGlnbm1lbnQo
KSk7Ci0gICAgdy0+c2V0TGluZUhlaWdodChSZW5kZXJPYmplY3Q6OmxpbmVIZWlnaHQodHJ1ZSkp
OwotCi0gICAgdy0+c2V0V3JpdGluZ0RpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBS
VEwgPyBSVEwgOiBMVFIpOwotCi0gICAgU2Nyb2xsQmFyTW9kZSBzY3JvbGxNb2RlID0gU2Nyb2xs
QmFyQXV0bzsKLSAgICBzd2l0Y2ggKHN0eWxlKCktPm92ZXJmbG93KCkpIHsKLSAgICAgICAgY2Fz
ZSBPQVVUTzoKLSAgICAgICAgY2FzZSBPTUFSUVVFRTogLy8gbWFrZXMgbm8gc2Vuc2UsIG1hcCB0
byBhdXRvCi0gICAgICAgIGNhc2UgT09WRVJMQVk6IC8vIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGV4
dCwgbWFwIHRvIGF1dG8KLSAgICAgICAgY2FzZSBPVklTSUJMRToKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIE9ISURERU46Ci0gICAgICAgICAgICBzY3JvbGxNb2RlID0gU2Nyb2xs
QmFyQWx3YXlzT2ZmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1NDUk9MTDoK
LSAgICAgICAgICAgIHNjcm9sbE1vZGUgPSBTY3JvbGxCYXJBbHdheXNPbjsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgIH0KLSAgICBTY3JvbGxCYXJNb2RlIGhvcml6b250YWxTY3JvbGxNb2RlID0g
c2Nyb2xsTW9kZTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5v
ZGUoKSktPndyYXAoKSAhPSBIVE1MVGV4dEFyZWFFbGVtZW50Ojp0YV9Ob1dyYXApCi0gICAgICAg
IGhvcml6b250YWxTY3JvbGxNb2RlID0gU2Nyb2xsQmFyQWx3YXlzT2ZmOwotCi0gICAgdy0+c2V0
U2Nyb2xsQmFyTW9kZXMoaG9yaXpvbnRhbFNjcm9sbE1vZGUsIHNjcm9sbE1vZGUpOwotfQotCi12
b2lkIFJlbmRlclRleHRBcmVhOjpzZXRFZGl0ZWQoYm9vbCB4KQotewotICAgIG1fZGlydHkgPSB4
OwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAg
SFRNTFRleHRBcmVhRWxlbWVudCogZSA9IHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQq
Pihub2RlKCkpOwotICAgIFFUZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1f
d2lkZ2V0KTsKLQotICAgIHctPnNldFJlYWRPbmx5KGUtPmlzUmVhZE9ubHlDb250cm9sKCkpOwot
ICAgIHctPnNldERpc2FibGVkKGUtPmRpc2FibGVkKCkpOwotCi0gICAgU3RyaW5nIHdpZGdldFRl
eHQgPSB0ZXh0KCk7Ci0gICAgU3RyaW5nIHRleHQgPSBlLT52YWx1ZSgpOwotICAgIHRleHQucmVw
bGFjZSgnXFwnLCBiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOwotICAgIGlmICh3aWRnZXRU
ZXh0ICE9IHRleHQpIHsKLSAgICAgICAgaW50IGxpbmUsIGNvbDsKLSAgICAgICAgdy0+Z2V0Q3Vy
c29yUG9zaXRpb24oICZsaW5lLCAmY29sICk7Ci0gICAgICAgIG1fdXBkYXRpbmcgPSB0cnVlOwot
ICAgICAgICB3LT5zZXRUZXh0KHRleHQpOwotICAgICAgICBtX3VwZGF0aW5nID0gZmFsc2U7Ci0g
ICAgICAgIHctPnNldEN1cnNvclBvc2l0aW9uKCBsaW5lLCBjb2wgKTsKLSAgICB9Ci0gICAgbV9k
aXJ0eSA9IGZhbHNlOwotCi0gICAgdy0+c2V0Q29sb3JzKHN0eWxlKCktPmJhY2tncm91bmRDb2xv
cigpLCBzdHlsZSgpLT5jb2xvcigpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojp1cGRhdGVG
cm9tRWxlbWVudCgpOwotfQotCi1TdHJpbmcgUmVuZGVyVGV4dEFyZWE6OnRleHQoKQotewotICAg
IFN0cmluZyB0eHQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCktPnRleHQoKTsK
LSAgICByZXR1cm4gdHh0LnJlcGxhY2UoYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpLCAnXFwn
KTsKLX0KLQotU3RyaW5nIFJlbmRlclRleHRBcmVhOjp0ZXh0V2l0aEhhcmRMaW5lQnJlYWtzKCkK
LXsKLSAgICBTdHJpbmcgdHh0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpLT50
ZXh0V2l0aEhhcmRMaW5lQnJlYWtzKCk7Ci0gICAgcmV0dXJuIHR4dC5yZXBsYWNlKGJhY2tzbGFz
aEFzQ3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnZh
bHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX3VwZGF0aW5nKQotICAgICAgICByZXR1
cm47Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPmludmFs
aWRhdGVWYWx1ZSgpOwotICAgIG1fZGlydHkgPSB0cnVlOwotfQotCi1pbnQgUmVuZGVyVGV4dEFy
ZWE6OnNlbGVjdGlvblN0YXJ0KCkKLXsKLSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGlj
X2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lkZ2V0KTsKLSAgICByZXR1cm4gdGV4dEVkaXQtPnNlbGVj
dGlvblN0YXJ0KCk7Ci19Ci0KLWludCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0aW9uRW5kKCkKLXsK
LSAgICBRVGV4dEVkaXQgKnRleHRFZGl0ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0ICo+KG1fd2lk
Z2V0KTsKLSAgICByZXR1cm4gdGV4dEVkaXQtPnNlbGVjdGlvbkVuZCgpOwotfQotCi12b2lkIFJl
bmRlclRleHRBcmVhOjpzZXRTZWxlY3Rpb25TdGFydChpbnQgc3RhcnQpCi17Ci0gICAgUVRleHRF
ZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAg
dGV4dEVkaXQtPnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0
QXJlYTo6c2V0U2VsZWN0aW9uRW5kKGludCBlbmQpCi17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRp
dCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAgdGV4dEVkaXQtPnNl
dFNlbGVjdGlvbkVuZChlbmQpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZWxlY3QoKQot
ewotICAgIHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCktPnNlbGVjdEFsbCgpOwot
fQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGlu
dCBlbmQpCi17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0PFFUZXh0RWRp
dCAqPihtX3dpZGdldCk7Ci0gICAgdGV4dEVkaXQtPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBl
bmQtc3RhcnQpOwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25DaGFuZ2VkKFdp
ZGdldCopCi17Ci0gICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93
aWRnZXQpOwotCi0gICAgLy8gV2Ugb25seSB3YW50IHRvIGNhbGwgb25zZWxlY3QgaWYgdGhlcmUg
YWN0dWFsbHkgaXMgYSBzZWxlY3Rpb24KLSAgICBpZiAoIXctPmhhc1NlbGVjdGVkVGV4dCgpKQot
ICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVu
dCo+KG5vZGUoKSktPm9uU2VsZWN0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1S
ZW5kZXJTbGlkZXI6OlJlbmRlclNsaWRlcihIVE1MSW5wdXRFbGVtZW50KiBlbGVtZW50KQotICAg
IDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAgICBzZXRXaWRnZXQobmV3IFFTbGlk
ZXIpOwotfQotCi12b2lkIFJlbmRlclNsaWRlcjo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBL
SFRNTEFzc2VydCghbWluTWF4S25vd24oKSk7Ci0gICAgCi0gICAgLy8gTGV0IHRoZSB3aWRnZXQg
dGVsbCB1cyBob3cgYmlnIGl0IHdhbnRzIHRvIGJlLgotICAgIEludFNpemUgcyh3aWRnZXQoKS0+
c2l6ZUhpbnQoKSk7Ci0gICAgYm9vbCB3aWR0aFNldCA9ICFzdHlsZSgpLT53aWR0aCgpLmlzQXV0
bygpOwotICAgIGJvb2wgaGVpZ2h0U2V0ID0gIXN0eWxlKCktPmhlaWdodCgpLmlzQXV0bygpOwot
ICAgIGlmIChoZWlnaHRTZXQgJiYgIXdpZHRoU2V0KSB7Ci0gICAgICAgIC8vIEZsaXAgdGhlIGlu
dHJpbnNpYyBkaW1lbnNpb25zLgotICAgICAgICBpbnQgYmFyTGVuZ3RoID0gcy53aWR0aCgpOwot
ICAgICAgICBzID0gSW50U2l6ZShzLmhlaWdodCgpLCBiYXJMZW5ndGgpOwotICAgIH0KLSAgICBz
ZXRJbnRyaW5zaWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNldEludHJpbnNpY0hlaWdodChzLmhl
aWdodCgpKTsKLSAgICAKLSAgICBSZW5kZXJGb3JtRWxlbWVudDo6Y2FsY01pbk1heFdpZHRoKCk7
Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgU3Ry
aW5nIHZhbHVlID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnZhbHVl
KCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBtaW5TdHIgPSBzdGF0aWNfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKG1pbkF0dHIpOwotICAgIGNvbnN0IEF0
b21pY1N0cmluZyYgbWF4U3RyID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUo
KSktPmdldEF0dHJpYnV0ZShtYXhBdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHByZWNp
c2lvbiA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1
dGUocHJlY2lzaW9uQXR0cik7Ci0gICAgCi0gICAgZG91YmxlIG1pblZhbCA9IG1pblN0ci5pc051
bGwoKSA/IDAuMCA6IG1pblN0ci5kZXByZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICBk
b3VibGUgbWF4VmFsID0gbWF4U3RyLmlzTnVsbCgpID8gMTAwLjAgOiBtYXhTdHIuZGVwcmVjYXRl
ZFN0cmluZygpLnRvRG91YmxlKCk7Ci0gICAgbWluVmFsID0gbWluKG1pblZhbCwgbWF4VmFsKTsg
Ly8gTWFrZSBzdXJlIHRoZSByYW5nZSBpcyBzYW5lLgotICAgIAotICAgIGRvdWJsZSB2YWwgPSB2
YWx1ZS5pc051bGwoKSA/IChtYXhWYWwgKyBtaW5WYWwpLzIuMCA6IHZhbHVlLmRlcHJlY2F0ZWRT
dHJpbmcoKS50b0RvdWJsZSgpOwotICAgIHZhbCA9IG1heChtaW5WYWwsIG1pbih2YWwsIG1heFZh
bCkpOyAvLyBNYWtlIHN1cmUgdmFsIGlzIHdpdGhpbiBtaW4vbWF4LgotICAgIAotICAgIC8vIEZv
cmNlIGludGVnZXIgdmFsdWUgaWYgbm90IGZsb2F0LgotICAgIGlmICghZXF1YWxJZ25vcmluZ0Nh
c2UocHJlY2lzaW9uLCAiZmxvYXQiKSkKLSAgICAgICAgdmFsID0gKGludCkodmFsICsgMC41KTsK
LQotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zZXRWYWx1ZShT
dHJpbmc6Om51bWJlcih2YWwpKTsKLQotICAgIFFTbGlkZXIqIHNsaWRlciA9IChRU2xpZGVyKil3
aWRnZXQoKTsKLSAgICAgCi0gICAgc2xpZGVyLT5zZXRNaW5WYWx1ZShtaW5WYWwpOwotICAgIHNs
aWRlci0+c2V0TWF4VmFsdWUobWF4VmFsKTsKLSAgICBzbGlkZXItPnNldFZhbHVlKHZhbCk7Ci0K
LSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotdm9pZCBS
ZW5kZXJTbGlkZXI6OnZhbHVlQ2hhbmdlZChXaWRnZXQqKQotewotICAgIFFTbGlkZXIqIHNsaWRl
ciA9IHN0YXRpY19jYXN0PFFTbGlkZXIqPih3aWRnZXQoKSk7Ci0KLSAgICBkb3VibGUgdmFsID0g
c2xpZGVyLT52YWx1ZSgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHJlY2lzaW9uID0gc3Rh
dGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShwcmVjaXNp
b25BdHRyKTsKLQotICAgIC8vIEZvcmNlIGludGVnZXIgdmFsdWUgaWYgbm90IGZsb2F0LgotICAg
IGlmICghZXF1YWxJZ25vcmluZ0Nhc2UocHJlY2lzaW9uLCAiZmxvYXQiKSkKLSAgICAgICAgdmFs
ID0gKGludCkodmFsICsgMC41KTsKLQotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpLT5zZXRWYWx1ZShTdHJpbmc6Om51bWJlcih2YWwpKTsKLSAgICAKLSAgICAvLyBG
aXJlIHRoZSAiaW5wdXQiIERPTSBldmVudC4KLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50Kj4obm9kZSgpKS0+ZGlzcGF0Y2hIVE1MRXZlbnQoaW5wdXRFdmVudCwgdHJ1ZSwgZmFsc2Up
OwotfQotCi19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJMaW5lRWRpdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckxpbmVFZGl0LmgJKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
TGluZUVkaXQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsMjg2ICsyMyw1MiBAQAogICoKICAqLwog
Ci0jaWZuZGVmIFJFTkRFUl9GT1JNX0gKLSNkZWZpbmUgUkVOREVSX0ZPUk1fSAorI2lmbmRlZiBS
ZW5kZXJMaW5lRWRpdF9oCisjZGVmaW5lIFJlbmRlckxpbmVFZGl0X2gKIAotI2luY2x1ZGUgIlJl
bmRlcldpZGdldC5oIgotI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKLSNpbmNsdWRlICJSZW5k
ZXJCbG9jay5oIgotI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCi0KLWNsYXNzIFFMaXN0Qm94Owor
I2luY2x1ZGUgIlJlbmRlckZvcm1FbGVtZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
Y2xhc3MgRG9jTG9hZGVyOwotY2xhc3MgSFRNTEZvcm1FbGVtZW50OwotY2xhc3MgSFRNTEdlbmVy
aWNGb3JtRWxlbWVudDsKLWNsYXNzIEhUTUxJbnB1dEVsZW1lbnQ7Ci1jbGFzcyBIVE1MU2VsZWN0
RWxlbWVudDsKLWNsYXNzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgUmVuZGVyRm9ybUVsZW1lbnQgOiBwdWJsaWMgUmVuZGVyV2lkZ2V0Ci17Ci1w
dWJsaWM6Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCogbm9k
ZSk7Ci0gICAgdmlydHVhbCB+UmVuZGVyRm9ybUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgY29u
c3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGb3JtIjsgfQotCi0g
ICAgdmlydHVhbCBib29sIGlzRm9ybUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0K
LSAgICAvLyBBcXVhIGZvcm0gY29udHJvbHMgbmV2ZXIgaGF2ZSBib3JkZXIvcGFkZGluZy4KLSAg
ICBpbnQgYm9yZGVyVG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBib3JkZXJCb3R0
b20oKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckxlZnQoKSBjb25zdCB7IHJl
dHVybiAwOyB9Ci0gICAgaW50IGJvcmRlclJpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAg
IGludCBwYWRkaW5nVG9wKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nQm90
dG9tKCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAgIGludCBwYWRkaW5nTGVmdCgpIGNvbnN0IHsg
cmV0dXJuIDA7IH0KLSAgICBpbnQgcGFkZGluZ1JpZ2h0KCkgY29uc3QgeyByZXR1cm4gMDsgfQot
Ci0gICAgLy8gQXF1YSBjb250cm9scyB1c2UgaW50cmluc2ljIG1hcmdpbiB2YWx1ZXMgaW4gb3Jk
ZXIgdG8gbGVhdmUgc3BhY2UgZm9yIGZvY3VzIHJpbmdzCi0gICAgLy8gYW5kIHRvIGtlZXAgY29u
dHJvbHMgZnJvbSBidXR0aW5nIHVwIGFnYWluc3Qgb25lIGFub3RoZXIuICBUaGlzIGludHJpbnNp
YyBtYXJnaW4KLSAgICAvLyBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIFdlYiBwYWdlIGFsbG93cyB0
aGUgY29udHJvbCB0byBzaXplIGludHJpbnNpY2FsbHkuICBJZiB0aGUKLSAgICAvLyBXZWIgcGFn
ZSBzcGVjaWZpZXMgYW4gZXhwbGljaXQgd2lkdGggZm9yIGEgY29udHJvbCwgdGhlbiB3ZSBnbyBh
aGVhZCBhbmQgaG9ub3IgdGhhdAotICAgIC8vIHByZWNpc2Ugd2lkdGguICBTaW1pbGFybHksIGlm
IGEgV2ViIHBhZ2UgdXNlcyBhIHNwZWNpZmljIG1hcmdpbiB2YWx1ZSwgd2Ugd2lsbCBnbyBhaGVh
ZAotICAgIC8vIGFuZCBob25vciB0aGF0IHZhbHVlLiAgCi0gICAgdm9pZCBhZGRJbnRyaW5zaWNN
YXJnaW5zSWZBbGxvd2VkKFJlbmRlclN0eWxlKiBfc3R5bGUpOwotICAgIHZpcnR1YWwgYm9vbCBj
YW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgaW50
IGludHJpbnNpY01hcmdpbigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KLQotICAgIHZpcnR1YWwgdm9p
ZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVs
ZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0dWFsIHNob3J0
IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wsIGJvb2wgKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2
aXJ0dWFsIHZvaWQgY2xpY2tlZChXaWRnZXQqKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwg
Ym9vbCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIEhvcml6b250
YWxBbGlnbm1lbnQgdGV4dEFsaWdubWVudCgpIGNvbnN0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBSZW5kZXJJbWFnZUJ1dHRvbiA6IHB1YmxpYyBSZW5kZXJJbWFnZQotewot
cHVibGljOgotICAgIFJlbmRlckltYWdlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQqKTsKLQotICAg
IHZpcnR1YWwgY29uc3QgY2hhciAqcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJJ
bWFnZUJ1dHRvbiI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbWFnZUJ1dHRvbigpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVy
TGluZUVkaXQgOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5k
ZXJMaW5lRWRpdChIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01p
bk1heFdpZHRoKCk7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJu
IGludHJpbnNpY0hlaWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRyaW5zaWNN
YXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFy
ICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxpbmVFZGl0IjsgfQotICAgIHZp
cnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHls
ZShSZW5kZXJTdHlsZSAqKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCBz
ZWxlY3Rpb25FbmQoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblN0YXJ0KGludCk7Ci0gICAgdm9p
ZCBzZXRTZWxlY3Rpb25FbmQoaW50KTsKLSAgICAKLSAgICBib29sIGlzRWRpdGVkKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRFZGl0ZWQoYm9vbCk7Ci0gICAgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0
IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2VsZWN0
aW9uUmFuZ2UoaW50LCBpbnQpOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhZGRTZWFyY2hSZXN1bHQo
KTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9p
ZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtU2Vh
cmNoKFdpZGdldCopOwotCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9Ci0KLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLWNsYXNzIFJlbmRlckZpZWxkc2V0IDogcHVibGljIFJlbmRlckJsb2NrCi17Ci1w
dWJsaWM6Ci0gICAgUmVuZGVyRmllbGRzZXQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCopOwotCi0g
ICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRl
ckZpZWxkU2V0IjsgfQotCi0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGxheW91dExlZ2VuZChi
b29sIHJlbGF5b3V0Q2hpbGRyZW4pOwotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRl
clN0eWxlKik7Ci0gICAgCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBwYWludEJveERlY29y
YXRpb25zKFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICB2b2lkIHBhaW50Qm9yZGVy
TWludXNMZWdlbmQoR3JhcGhpY3NDb250ZXh0KiwgaW50IHR4LCBpbnQgdHksIGludCB3LCBpbnQg
aCwgY29uc3QgUmVuZGVyU3R5bGUgKiwgaW50IGx4LCBpbnQgbHcpOwotICAgIFJlbmRlck9iamVj
dCogZmluZExlZ2VuZCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5k
ZXJGaWxlQnV0dG9uIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0
IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmlsZUJ1dHRvbiI7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVw
ZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdm9pZCBzZWxlY3QoKTsKLQotICAgIGludCBjYWxjUmVw
bGFjZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgfQotCi0gICAg
dm9pZCBjbGljayhib29sIHNlbmRNb3VzZUV2ZW50cyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0
dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToK
LSAgICB2aXJ0dWFsIHZvaWQgcmV0dXJuUHJlc3NlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBSZW5kZXJMYWJlbCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgot
ICAgIFJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVsZW1lbnQgKmVsZW1lbnQpOwotCi0gICAg
dmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxh
YmVsIjsgfQotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckxlZ2Vu
ZCA6IHB1YmxpYyBSZW5kZXJCbG9jawotewotcHVibGljOgotICAgIFJlbmRlckxlZ2VuZChIVE1M
R2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAq
cmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJMZWdlbmQiOyB9Ci19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlclNlbGVjdCA6IHB1YmxpYyBSZW5kZXJGb3Jt
RWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlclNlbGVjdChIVE1MU2VsZWN0RWxlbWVudCop
OwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4g
IlJlbmRlclNlbGVjdCI7IH0KLQotICAgIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oIGJvb2wgZiwg
Ym9vbCBiICkgY29uc3Q7Ci0gICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsgaWYg
KCFtX3VzZUxpc3RCb3gpIHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgcmV0dXJuIFJlbmRlckZv
cm1FbGVtZW50OjpjYWxjUmVwbGFjZWRIZWlnaHQoKTsgfQotICAgIHZpcnR1YWwgYm9vbCBjYW5I
YXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1
YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0K
LSAgICB2b2lkIHNldE9wdGlvbnNDaGFuZ2VkKGJvb2wgX29wdGlvbnNDaGFuZ2VkKTsKLQotICAg
IGJvb2wgc2VsZWN0aW9uQ2hhbmdlZCgpIHsgcmV0dXJuIG1fc2VsZWN0aW9uQ2hhbmdlZDsgfQot
ICAgIHZvaWQgc2V0U2VsZWN0aW9uQ2hhbmdlZChib29sIF9zZWxlY3Rpb25DaGFuZ2VkKSB7IG1f
c2VsZWN0aW9uQ2hhbmdlZCA9IF9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0
eWxlICopOwotCi0gICAgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKTsKLQotcHJvdGVjdGVkOgotICAg
IFFMaXN0Qm94ICpjcmVhdGVMaXN0Qm94KCk7Ci0gICAgdm9pZCBzZXRXaWRnZXRXcml0aW5nRGly
ZWN0aW9uKCk7Ci0KLSAgICB1bnNpZ25lZCAgbV9zaXplOwotICAgIGJvb2wgbV9tdWx0aXBsZTsK
LSAgICBib29sIG1fdXNlTGlzdEJveDsKLSAgICBib29sIG1fc2VsZWN0aW9uQ2hhbmdlZDsKLSAg
ICBib29sIG1faWdub3JlU2VsZWN0RXZlbnRzOwotICAgIGJvb2wgbV9vcHRpb25zQ2hhbmdlZDsK
LQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAg
IHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdpZGdldCopOwotfTsKLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJUZXh0QXJlYSA6IHB1YmxpYyBSZW5kZXJGb3JtRWxl
bWVudAotewotcHVibGljOgotICAgIFJlbmRlclRleHRBcmVhKEhUTUxUZXh0QXJlYUVsZW1lbnQq
KTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNo
YXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGV4dEFyZWEiOyB9Ci0gICAg
dmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVG
cm9tRWxlbWVudCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSAqKTsK
LQotICAgIGJvb2wgaXNUZXh0QXJlYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICBib29s
IGlzRWRpdGVkKCkgY29uc3QgeyByZXR1cm4gbV9kaXJ0eTsgfQotICAgIHZvaWQgc2V0RWRpdGVk
IChib29sKTsKLSAgICAKLSAgICBTdHJpbmcgdGV4dCgpOwotICAgIFN0cmluZyB0ZXh0V2l0aEhh
cmRMaW5lQnJlYWtzKCk7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3RhcnQoKTsKLSAgICBpbnQgc2Vs
ZWN0aW9uRW5kKCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChpbnQpOwotICAgIHZvaWQg
c2V0U2VsZWN0aW9uRW5kKGludCk7Ci0gICAgCi0gICAgdm9pZCBzZWxlY3QoKTsKLSAgICB2b2lk
IHNldFNlbGVjdGlvblJhbmdlKGludCwgaW50KTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgY2Fu
SGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6
Ci0gICAgdmlydHVhbCB2b2lkIHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgc2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKLSAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0
dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJvb2wg
bV9kaXJ0eTsKLSAgICBib29sIG1fdXBkYXRpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIFJlbmRlclNsaWRlciA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVi
bGljOgotICAgIFJlbmRlclNsaWRlcihIVE1MSW5wdXRFbGVtZW50Kik7Ci0gICAgCi0gICAgdmly
dHVhbCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclNsaWRl
ciI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNhbGNNaW5NYXhXaWR0aCgpOwotICAg
IHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOwotCi1wcml2YXRlOgotICAgIHZpcnR1
YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci19OworICAgIGNsYXNzIEhUTUxJbnB1dEVs
ZW1lbnQ7CisKKyAgICBjbGFzcyBSZW5kZXJMaW5lRWRpdCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxl
bWVudCB7CisgICAgcHVibGljOgorICAgICAgICBSZW5kZXJMaW5lRWRpdChIVE1MSW5wdXRFbGVt
ZW50Kik7CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3Qg
eyByZXR1cm4gIlJlbmRlckxpbmVFZGl0IjsgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxj
TWluTWF4V2lkdGgoKTsKKyAgICAgICAgaW50IGNhbGNSZXBsYWNlZEhlaWdodCgpIGNvbnN0IHsg
cmV0dXJuIGludHJpbnNpY0hlaWdodCgpOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZl
SW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICB2aXJ0
dWFsIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFN0
eWxlKFJlbmRlclN0eWxlKik7CisKKyAgICAgICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7CisgICAg
ICAgIGludCBzZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgdm9pZCBzZXRTZWxlY3Rpb25TdGFydChp
bnQpOworICAgICAgICB2b2lkIHNldFNlbGVjdGlvbkVuZChpbnQpOworICAgICAgICAKKyAgICAg
ICAgYm9vbCBpc0VkaXRlZCgpIGNvbnN0OworICAgICAgICB2b2lkIHNldEVkaXRlZChib29sKTsK
KyAgICAgICAgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAg
ICAgdm9pZCBzZWxlY3QoKTsKKyAgICAgICAgdm9pZCBzZXRTZWxlY3Rpb25SYW5nZShpbnQsIGlu
dCk7CisKKyAgICAgICAgdm9pZCBhZGRTZWFyY2hSZXN1bHQoKTsKKworICAgIHByaXZhdGU6Cisg
ICAgICAgIHZpcnR1YWwgdm9pZCByZXR1cm5QcmVzc2VkKFdpZGdldCopOworICAgICAgICB2aXJ0
dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2Vs
ZWN0aW9uQ2hhbmdlZChXaWRnZXQqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBlcmZvcm1TZWFy
Y2goV2lkZ2V0Kik7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzRWRpdGFibGUoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgYm9vbCBtX3VwZGF0aW5nOworICAgIH07CiAKLX0g
Ly9uYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmCisjZW5kaWYgLy8g
UmVuZGVyTGluZUVkaXRfaApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZUJ1dHRv
bi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckZpbGVCdXR0b24uaAko
cmV2aXNpb24gMTQzNDIpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJGaWxlQnV0dG9uLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIzLDI4NiArMjMsMzcgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBS
RU5ERVJfRk9STV9ICi0jZGVmaW5lIFJFTkRFUl9GT1JNX0gKKyNpZm5kZWYgUmVuZGVyRmlsZUJ1
dHRvbl9oCisjZGVmaW5lIFJlbmRlckZpbGVCdXR0b25faAogCi0jaW5jbHVkZSAiUmVuZGVyV2lk
Z2V0LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5oIgotI2luY2x1ZGUgIlJlbmRlckJsb2Nr
LmgiCi0jaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKLQotY2xhc3MgUUxpc3RCb3g7CisjaW5jbHVk
ZSAiUmVuZGVyRm9ybUVsZW1lbnQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBE
b2NMb2FkZXI7Ci1jbGFzcyBIVE1MRm9ybUVsZW1lbnQ7Ci1jbGFzcyBIVE1MR2VuZXJpY0Zvcm1F
bGVtZW50OwotY2xhc3MgSFRNTElucHV0RWxlbWVudDsKLWNsYXNzIEhUTUxTZWxlY3RFbGVtZW50
OwotY2xhc3MgSFRNTFRleHRBcmVhRWxlbWVudDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBSZW5kZXJGb3JtRWxlbWVudCA6IHB1YmxpYyBSZW5kZXJXaWRnZXQKLXsKLXB1YmxpYzoK
LSAgICBSZW5kZXJGb3JtRWxlbWVudChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50KiBub2RlKTsKLSAg
ICB2aXJ0dWFsIH5SZW5kZXJGb3JtRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFy
ICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZvcm0iOyB9Ci0KLSAgICB2aXJ0
dWFsIGJvb2wgaXNGb3JtRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIC8v
IEFxdWEgZm9ybSBjb250cm9scyBuZXZlciBoYXZlIGJvcmRlci9wYWRkaW5nLgotICAgIGludCBi
b3JkZXJUb3AoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IGJvcmRlckJvdHRvbSgpIGNv
bnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgYm9yZGVyTGVmdCgpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KLSAgICBpbnQgYm9yZGVyUmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IHBh
ZGRpbmdUb3AoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IHBhZGRpbmdCb3R0b20oKSBj
b25zdCB7IHJldHVybiAwOyB9Ci0gICAgaW50IHBhZGRpbmdMZWZ0KCkgY29uc3QgeyByZXR1cm4g
MDsgfQotICAgIGludCBwYWRkaW5nUmlnaHQoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICAv
LyBBcXVhIGNvbnRyb2xzIHVzZSBpbnRyaW5zaWMgbWFyZ2luIHZhbHVlcyBpbiBvcmRlciB0byBs
ZWF2ZSBzcGFjZSBmb3IgZm9jdXMgcmluZ3MKLSAgICAvLyBhbmQgdG8ga2VlcCBjb250cm9scyBm
cm9tIGJ1dHRpbmcgdXAgYWdhaW5zdCBvbmUgYW5vdGhlci4gIFRoaXMgaW50cmluc2ljIG1hcmdp
bgotICAgIC8vIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgV2ViIHBhZ2UgYWxsb3dzIHRoZSBjb250
cm9sIHRvIHNpemUgaW50cmluc2ljYWxseS4gIElmIHRoZQotICAgIC8vIFdlYiBwYWdlIHNwZWNp
ZmllcyBhbiBleHBsaWNpdCB3aWR0aCBmb3IgYSBjb250cm9sLCB0aGVuIHdlIGdvIGFoZWFkIGFu
ZCBob25vciB0aGF0Ci0gICAgLy8gcHJlY2lzZSB3aWR0aC4gIFNpbWlsYXJseSwgaWYgYSBXZWIg
cGFnZSB1c2VzIGEgc3BlY2lmaWMgbWFyZ2luIHZhbHVlLCB3ZSB3aWxsIGdvIGFoZWFkCi0gICAg
Ly8gYW5kIGhvbm9yIHRoYXQgdmFsdWUuICAKLSAgICB2b2lkIGFkZEludHJpbnNpY01hcmdpbnNJ
ZkFsbG93ZWQoUmVuZGVyU3R5bGUqIF9zdHlsZSk7Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJ
bnRyaW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICBpbnQgaW50cmlu
c2ljTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gMjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFN0
eWxlKFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgp
OwotCi0gICAgdmlydHVhbCB2b2lkIGxheW91dCgpOwotICAgIHZpcnR1YWwgc2hvcnQgYmFzZWxp
bmVQb3NpdGlvbiggYm9vbCwgYm9vbCApIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwg
dm9pZCBjbGlja2VkKFdpZGdldCopOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIGlz
RWRpdGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgSG9yaXpvbnRhbEFsaWdu
bWVudCB0ZXh0QWxpZ25tZW50KCkgY29uc3Q7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIFJlbmRlckltYWdlQnV0dG9uIDogcHVibGljIFJlbmRlckltYWdlCi17Ci1wdWJsaWM6
Ci0gICAgUmVuZGVySW1hZ2VCdXR0b24oSFRNTElucHV0RWxlbWVudCopOwotCi0gICAgdmlydHVh
bCBjb25zdCBjaGFyICpyZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckltYWdlQnV0
dG9uIjsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0ltYWdlQnV0dG9uKCkgY29uc3QgeyByZXR1cm4g
dHJ1ZTsgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZW5kZXJMaW5lRWRp
dCA6IHB1YmxpYyBSZW5kZXJGb3JtRWxlbWVudAotewotcHVibGljOgotICAgIFJlbmRlckxpbmVF
ZGl0KEhUTUxJbnB1dEVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lk
dGgoKTsKLSAgICBpbnQgY2FsY1JlcGxhY2VkSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaW50cmlu
c2ljSGVpZ2h0KCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2ZUludHJpbnNpY01hcmdpbnMo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRl
ck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyTGluZUVkaXQiOyB9Ci0gICAgdmlydHVhbCB2
b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRl
clN0eWxlICopOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgaW50IHNlbGVjdGlv
bkVuZCgpOwotICAgIHZvaWQgc2V0U2VsZWN0aW9uU3RhcnQoaW50KTsKLSAgICB2b2lkIHNldFNl
bGVjdGlvbkVuZChpbnQpOwotICAgIAotICAgIGJvb2wgaXNFZGl0ZWQoKSBjb25zdDsKLSAgICB2
b2lkIHNldEVkaXRlZChib29sKTsKLSAgICBib29sIGlzVGV4dEZpZWxkKCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQotICAgIHZvaWQgc2VsZWN0KCk7Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb25SYW5n
ZShpbnQsIGludCk7Ci0KLXB1YmxpYzoKLSAgICB2b2lkIGFkZFNlYXJjaFJlc3VsdCgpOwotCi1w
cml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCByZXR1cm5QcmVzc2VkKFdpZGdldCopOwotICAgIHZp
cnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHNlbGVj
dGlvbkNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHBlcmZvcm1TZWFyY2goV2lk
Z2V0Kik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLQotICAgIGJvb2wgbV91cGRhdGluZzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotY2xhc3MgUmVuZGVyRmllbGRzZXQgOiBwdWJsaWMgUmVuZGVyQmxvY2sKLXsKLXB1YmxpYzoK
LSAgICBSZW5kZXJGaWVsZHNldChIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kik7Ci0KLSAgICB2aXJ0
dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRmllbGRT
ZXQiOyB9Ci0KLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogbGF5b3V0TGVnZW5kKGJvb2wgcmVs
YXlvdXRDaGlsZHJlbik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUq
KTsKLSAgICAKLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50Qm94RGVjb3JhdGlvbnMo
UGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotICAgIHZvaWQgcGFpbnRCb3JkZXJNaW51c0xl
Z2VuZChHcmFwaGljc0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSwgaW50IHcsIGludCBoLCBjb25z
dCBSZW5kZXJTdHlsZSAqLCBpbnQgbHgsIGludCBsdyk7Ci0gICAgUmVuZGVyT2JqZWN0KiBmaW5k
TGVnZW5kKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlbmRlckZpbGVC
dXR0b24gOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJG
aWxlQnV0dG9uKEhUTUxJbnB1dEVsZW1lbnQqKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAq
cmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGaWxlQnV0dG9uIjsgfQotICAgIHZp
cnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJv
bUVsZW1lbnQoKTsKLSAgICB2b2lkIHNlbGVjdCgpOwotCi0gICAgaW50IGNhbGNSZXBsYWNlZEhl
aWdodCgpIGNvbnN0IHsgcmV0dXJuIGludHJpbnNpY0hlaWdodCgpOyB9Ci0KLSAgICB2b2lkIGNs
aWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9v
bCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICAgIHZp
cnR1YWwgdm9pZCByZXR1cm5QcmVzc2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCB2YWx1
ZUNoYW5nZWQoV2lkZ2V0Kik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJl
bmRlckxhYmVsIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVu
ZGVyTGFiZWwoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCk7Ci0KLSAgICB2aXJ0dWFs
IGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyTGFiZWwiOyB9
Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyTGVnZW5kIDogcHVi
bGljIFJlbmRlckJsb2NrCi17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyTGVnZW5kKEhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnQgKmVsZW1lbnQpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICpyZW5kZXJO
YW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckxlZ2VuZCI7IH0KLX07Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotY2xhc3MgUmVuZGVyU2VsZWN0IDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50
Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVyU2VsZWN0KEhUTUxTZWxlY3RFbGVtZW50Kik7Ci0KLSAg
ICB2aXJ0dWFsIGNvbnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVy
U2VsZWN0IjsgfQotCi0gICAgc2hvcnQgYmFzZWxpbmVQb3NpdGlvbiggYm9vbCBmLCBib29sIGIg
KSBjb25zdDsKLSAgICBpbnQgY2FsY1JlcGxhY2VkSGVpZ2h0KCkgY29uc3QgeyBpZiAoIW1fdXNl
TGlzdEJveCkgcmV0dXJuIGludHJpbnNpY0hlaWdodCgpOyByZXR1cm4gUmVuZGVyRm9ybUVsZW1l
bnQ6OmNhbGNSZXBsYWNlZEhlaWdodCgpOyB9Ci0gICAgdmlydHVhbCBib29sIGNhbkhhdmVJbnRy
aW5zaWNNYXJnaW5zKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCB2b2lk
IGNhbGNNaW5NYXhXaWR0aCgpOwotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLQotICAgIHZv
aWQgc2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBfb3B0aW9uc0NoYW5nZWQpOwotCi0gICAgYm9vbCBz
ZWxlY3Rpb25DaGFuZ2VkKCkgeyByZXR1cm4gbV9zZWxlY3Rpb25DaGFuZ2VkOyB9Ci0gICAgdm9p
ZCBzZXRTZWxlY3Rpb25DaGFuZ2VkKGJvb2wgX3NlbGVjdGlvbkNoYW5nZWQpIHsgbV9zZWxlY3Rp
b25DaGFuZ2VkID0gX3NlbGVjdGlvbkNoYW5nZWQ7IH0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRl
RnJvbUVsZW1lbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3R5bGUoUmVuZGVyU3R5bGUgKik7
Ci0KLSAgICB2b2lkIHVwZGF0ZVNlbGVjdGlvbigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgUUxpc3RC
b3ggKmNyZWF0ZUxpc3RCb3goKTsKLSAgICB2b2lkIHNldFdpZGdldFdyaXRpbmdEaXJlY3Rpb24o
KTsKLQotICAgIHVuc2lnbmVkICBtX3NpemU7Ci0gICAgYm9vbCBtX211bHRpcGxlOwotICAgIGJv
b2wgbV91c2VMaXN0Qm94OwotICAgIGJvb2wgbV9zZWxlY3Rpb25DaGFuZ2VkOwotICAgIGJvb2wg
bV9pZ25vcmVTZWxlY3RFdmVudHM7Ci0gICAgYm9vbCBtX29wdGlvbnNDaGFuZ2VkOwotCi1wcml2
YXRlOgotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoV2lkZ2V0Kik7Ci0gICAgdmlydHVh
bCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoV2lkZ2V0Kik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWNsYXNzIFJlbmRlclRleHRBcmVhIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17
Ci1wdWJsaWM6Ci0gICAgUmVuZGVyVGV4dEFyZWEoSFRNTFRleHRBcmVhRWxlbWVudCopOwotCi0g
ICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqcmVu
ZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJUZXh0QXJlYSI7IH0KLSAgICB2aXJ0dWFs
IHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlICopOwotCi0gICAg
Ym9vbCBpc1RleHRBcmVhKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgaXNFZGl0
ZWQoKSBjb25zdCB7IHJldHVybiBtX2RpcnR5OyB9Ci0gICAgdm9pZCBzZXRFZGl0ZWQgKGJvb2wp
OwotICAgIAotICAgIFN0cmluZyB0ZXh0KCk7Ci0gICAgU3RyaW5nIHRleHRXaXRoSGFyZExpbmVC
cmVha3MoKTsKLQotICAgIGludCBzZWxlY3Rpb25TdGFydCgpOwotICAgIGludCBzZWxlY3Rpb25F
bmQoKTsKLSAgICB2b2lkIHNldFNlbGVjdGlvblN0YXJ0KGludCk7Ci0gICAgdm9pZCBzZXRTZWxl
Y3Rpb25FbmQoaW50KTsKLSAgICAKLSAgICB2b2lkIHNlbGVjdCgpOwotICAgIHZvaWQgc2V0U2Vs
ZWN0aW9uUmFuZ2UoaW50LCBpbnQpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50
cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgICB2
aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOwotICAgIHZpcnR1YWwgdm9pZCBzZWxl
Y3Rpb25DaGFuZ2VkKFdpZGdldCopOwotICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9v
bCBpc0VkaXRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgYm9vbCBtX2RpcnR5
OwotICAgIGJvb2wgbV91cGRhdGluZzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xh
c3MgUmVuZGVyU2xpZGVyIDogcHVibGljIFJlbmRlckZvcm1FbGVtZW50Ci17Ci1wdWJsaWM6Ci0g
ICAgUmVuZGVyU2xpZGVyKEhUTUxJbnB1dEVsZW1lbnQqKTsKLSAgICAKLSAgICB2aXJ0dWFsIGNv
bnN0IGNoYXIgKnJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU2xpZGVyIjsgfQot
ICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlSW50cmluc2ljTWFyZ2lucygpIGNvbnN0IHsgcmV0dXJu
IHRydWU7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2FsY01pbk1heFdpZHRoKCk7Ci0gICAgdmlydHVh
bCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lk
IHZhbHVlQ2hhbmdlZChXaWRnZXQqKTsKLX07CisgICAgY2xhc3MgSFRNTElucHV0RWxlbWVudDsK
KworICAgIGNsYXNzIFJlbmRlckZpbGVCdXR0b24gOiBwdWJsaWMgUmVuZGVyRm9ybUVsZW1lbnQg
eworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRFbGVtZW50
Kik7CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyBy
ZXR1cm4gIlJlbmRlckZpbGVCdXR0b24iOyB9CisgICAgICAgIAorICAgICAgICB2aXJ0dWFsIHZv
aWQgY2FsY01pbk1heFdpZHRoKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxl
bWVudCgpOworICAgICAgICB2b2lkIHNlbGVjdCgpOworCisgICAgICAgIGludCBjYWxjUmVwbGFj
ZWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBpbnRyaW5zaWNIZWlnaHQoKTsgfQorCisgICAgICAg
IHZvaWQgY2xpY2soYm9vbCBzZW5kTW91c2VFdmVudHMpOworCisgICAgcHJvdGVjdGVkOgorICAg
ICAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKwor
ICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgdm9pZCByZXR1cm5QcmVzc2VkKFdpZGdldCop
OworICAgICAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFdpZGdldCopOworICAgIH07CiAK
LX0gLy9uYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmCisjZW5kaWYg
Ly8gUmVuZGVyRmlsZUJ1dHRvbl9oCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaW5l
RWRpdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGluZUVkaXQu
Y3BwCShyZXZpc2lvbiAxNDM0MikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxpbmVFZGl0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTQ4ICsyNCwyMiBAQAogICovCiAKICNpbmNsdWRl
ICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJfZm9ybS5oIgorI2luY2x1ZGUgIlJlbmRlckxp
bmVFZGl0LmgiCiAKLSNpbmNsdWRlICJCcm93c2VyRXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiRXZl
bnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgogI2luY2x1ZGUgIkhUTUxGb3JtRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1l
bnQuaCIKLSNpbmNsdWRlICJIVE1MT3B0R3JvdXBFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE9w
dGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MU2VsZWN0RWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRlICJLV1FDb21ib0JveC5oIgotI2luY2x1
ZGUgIktXUUZpbGVCdXR0b24uaCIKICNpbmNsdWRlICJLV1FMaW5lRWRpdC5oIgotI2luY2x1ZGUg
IktXUVNsaWRlci5oIgotI2luY2x1ZGUgIktXUVRleHRFZGl0LmgiCi0jaW5jbHVkZSAiUGxhdGZv
cm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCi0KLXVzaW5nIG5h
bWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFtZXNwYWNlIEV2
ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1SZW5kZXJGb3JtRWxlbWVu
dDo6UmVuZGVyRm9ybUVsZW1lbnQoSFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAg
ICA6IFJlbmRlcldpZGdldChlbGVtZW50KQotewotICAgIHNldElubGluZSh0cnVlKTsKLX0KLQot
UmVuZGVyRm9ybUVsZW1lbnQ6On5SZW5kZXJGb3JtRWxlbWVudCgpCi17Ci19Ci0KLXNob3J0IFJl
bmRlckZvcm1FbGVtZW50OjpiYXNlbGluZVBvc2l0aW9uKCBib29sIGYsIGJvb2wgaXNSb290TGlu
ZUJveCApIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1hcmdpblRvcCgpICsgd2lkZ2V0KCktPmJhc2Vs
aW5lUG9zaXRpb24obV9oZWlnaHQpOwotfQotCi12b2lkIFJlbmRlckZvcm1FbGVtZW50OjpzZXRT
dHlsZShSZW5kZXJTdHlsZSogcykKLXsKLSAgICBpZiAoY2FuSGF2ZUludHJpbnNpY01hcmdpbnMo
KSkKLSAgICAgICAgYWRkSW50cmluc2ljTWFyZ2luc0lmQWxsb3dlZChzKTsKLQotICAgIFJlbmRl
cldpZGdldDo6c2V0U3R5bGUocyk7Ci0KLSAgICAvLyBEbyBub3QgcGFpbnQgYSBiYWNrZ3JvdW5k
IG9yIGJvcmRlciBmb3IgQXF1YSBmb3JtIGVsZW1lbnRzCi0gICAgc2V0U2hvdWxkUGFpbnRCYWNr
Z3JvdW5kT3JCb3JkZXIoZmFsc2UpOwotCi0gICAgbV93aWRnZXQtPnNldEZvbnQoc3R5bGUoKS0+
Zm9udCgpKTsKLX0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQo
KQotewotICAgIG1fd2lkZ2V0LT5zZXRFbmFibGVkKCFzdGF0aWNfY2FzdDxIVE1MR2VuZXJpY0Zv
cm1FbGVtZW50Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyRm9ybUVs
ZW1lbnQ6OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIG5lZWRzTGF5b3V0KCkgKTsKLSAg
ICBLSFRNTEFzc2VydCggbWluTWF4S25vd24oKSApOwotCi0gICAgLy8gbWluaW11bSBoZWlnaHQK
LSAgICBtX2hlaWdodCA9IDA7Ci0KLSAgICBjYWxjV2lkdGgoKTsKLSAgICBjYWxjSGVpZ2h0KCk7
Ci0gICAgCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckZvcm1F
bGVtZW50OjpjbGlja2VkKFdpZGdldCopCi17Ci0gICAgUmVuZGVyQXJlbmEqIGFyZW5hID0gcmVm
KCk7Ci0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGV2ZW50OyAvLyBnZXRzICJjdXJyZW50IGV2ZW50
IgotICAgIGlmIChub2RlKCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEV2ZW50VGFyZ2V0Tm9kZSo+
KG5vZGUoKSktPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwgY2xpY2tFdmVudCwgZXZlbnQuY2xp
Y2tDb3VudCgpKTsKLSAgICBkZXJlZihhcmVuYSk7Ci19Ci0KLUhvcml6b250YWxBbGlnbm1lbnQg
UmVuZGVyRm9ybUVsZW1lbnQ6OnRleHRBbGlnbm1lbnQoKSBjb25zdAotewotICAgIHN3aXRjaCAo
c3R5bGUoKS0+dGV4dEFsaWduKCkpIHsKLSAgICAgICAgY2FzZSBMRUZUOgotICAgICAgICBjYXNl
IEtIVE1MX0xFRlQ6Ci0gICAgICAgICAgICByZXR1cm4gQWxpZ25MZWZ0OwotICAgICAgICBjYXNl
IFJJR0hUOgotICAgICAgICBjYXNlIEtIVE1MX1JJR0hUOgotICAgICAgICAgICAgcmV0dXJuIEFs
aWduUmlnaHQ7Ci0gICAgICAgIGNhc2UgQ0VOVEVSOgotICAgICAgICBjYXNlIEtIVE1MX0NFTlRF
UjoKLSAgICAgICAgICAgIHJldHVybiBBbGlnbkhDZW50ZXI7Ci0gICAgICAgIGNhc2UgSlVTVElG
WToKLSAgICAgICAgICAgIC8vIEp1c3QgZmFsbCBpbnRvIHRoZSBhdXRvIGNvZGUgZm9yIGp1c3Rp
ZnkuCi0gICAgICAgIGNhc2UgVEFBVVRPOgotICAgICAgICAgICAgcmV0dXJuIHN0eWxlKCktPmRp
cmVjdGlvbigpID09IFJUTCA/IEFsaWduUmlnaHQgOiBBbGlnbkxlZnQ7Ci0gICAgfQotICAgIEFT
U0VSVChmYWxzZSk7IC8vIFNob3VsZCBuZXZlciBiZSByZWFjaGVkLgotICAgIHJldHVybiBBbGln
bkxlZnQ7Ci19Ci0KLQotdm9pZCBSZW5kZXJGb3JtRWxlbWVudDo6YWRkSW50cmluc2ljTWFyZ2lu
c0lmQWxsb3dlZChSZW5kZXJTdHlsZSogX3N0eWxlKQotewotICAgIC8vIEN1dCBvdXQgdGhlIGlu
dHJpbnNpYyBtYXJnaW5zIGNvbXBsZXRlbHkgaWYgd2UgZW5kIHVwIHVzaW5nIG1pbmkgY29udHJv
bHMuCi0gICAgaWYgKF9zdHlsZS0+Zm9udFNpemUoKSA8IDExKQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28g
ZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgotICAgIGludCBtID0g
aW50cmluc2ljTWFyZ2luKCk7Ci0gICAgaWYgKF9zdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09y
QXV0bygpKSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygpKQotICAg
ICAgICAgICAgX3N0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChtLCBGaXhlZCkpOwotICAgICAg
ICBpZiAoX3N0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUt
PnNldE1hcmdpblJpZ2h0KExlbmd0aChtLCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChfc3R5
bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7Ci0gICAgICAgIGlmIChfc3R5bGUtPm1hcmdpblRvcCgp
LnF1aXJrKCkpCi0gICAgICAgICAgICBfc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgobSwgRml4
ZWQpKTsKLSAgICAgICAgaWYgKF9zdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKLSAgICAg
ICAgICAgIF9zdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChtLCBGaXhlZCkpOwotICAgIH0K
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZW5kZXJJbWFnZUJ1dHRvbjo6UmVu
ZGVySW1hZ2VCdXR0b24oSFRNTElucHV0RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlcklt
YWdlKGVsZW1lbnQpCi17Ci0gICAgLy8gIyMjIHN1cHBvcnQgRE9NQWN0aXZhdGUgZXZlbnQgd2hl
biBjbGlja2VkCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1SZW5kZXJMaW5lRWRpdDo6UmVuZGVyTGluZUVkaXQoSFRNTElucHV0
RWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1lbnQpLCBtX3Vw
ZGF0aW5nKGZhbHNlKQorUmVuZGVyTGluZUVkaXQ6OlJlbmRlckxpbmVFZGl0KEhUTUxJbnB1dEVs
ZW1lbnQqIGVsZW1lbnQpCisgICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQorICAgICwg
bV91cGRhdGluZyhmYWxzZSkKIHsKICAgICBRTGluZUVkaXQ6OlR5cGUgdHlwZTsKICAgICBzd2l0
Y2ggKGVsZW1lbnQtPmlucHV0VHlwZSgpKSB7CkBAIC0zNjIsNzkyICsyMzYsNCBAQCB2b2lkIFJl
bmRlckxpbmVFZGl0OjpzZXRTZWxlY3Rpb25SYW5nZShpCiAgICAgc3RhdGljX2Nhc3Q8UUxpbmVF
ZGl0ICo+KG1fd2lkZ2V0KS0+c2V0U2VsZWN0aW9uKHJlYWxTdGFydCwgbGVuZ3RoKTsKIH0KIAot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlbmRlckZpZWxkc2V0OjpSZW5kZXJGaWVsZHNldChI
VE1MR2VuZXJpY0Zvcm1FbGVtZW50ICplbGVtZW50KQotOiBSZW5kZXJCbG9jayhlbGVtZW50KQot
ewotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckZpZWxkc2V0OjpsYXlvdXRMZWdlbmQoYm9vbCBy
ZWxheW91dENoaWxkcmVuKQotewotICAgIFJlbmRlck9iamVjdCogbGVnZW5kID0gZmluZExlZ2Vu
ZCgpOwotICAgIGlmIChsZWdlbmQpIHsKLSAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4pCi0g
ICAgICAgICAgICBsZWdlbmQtPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICBsZWdlbmQt
PmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICAgICAgaW50IHhQb3MgPSBib3JkZXJMZWZ0KCkgKyBw
YWRkaW5nTGVmdCgpICsgbGVnZW5kLT5tYXJnaW5MZWZ0KCk7Ci0gICAgICAgIGlmIChzdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBSVEwpCi0gICAgICAgICAgICB4UG9zID0gbV93aWR0aCAtIHBhZGRp
bmdSaWdodCgpIC0gYm9yZGVyUmlnaHQoKSAtIGxlZ2VuZC0+d2lkdGgoKSAtIGxlZ2VuZC0+bWFy
Z2luUmlnaHQoKTsKLSAgICAgICAgaW50IGIgPSBib3JkZXJUb3AoKTsKLSAgICAgICAgaW50IGgg
PSBsZWdlbmQtPmhlaWdodCgpOwotICAgICAgICBsZWdlbmQtPnNldFBvcyh4UG9zLCBtYXgoKGIt
aCkvMiwgMCkpOwotICAgICAgICBtX2hlaWdodCA9IG1heChiLGgpICsgcGFkZGluZ1RvcCgpOwot
ICAgIH0KLSAgICByZXR1cm4gbGVnZW5kOwotfQotCi1SZW5kZXJPYmplY3QqIFJlbmRlckZpZWxk
c2V0OjpmaW5kTGVnZW5kKCkKLXsKLSAgICBmb3IgKFJlbmRlck9iamVjdCogbGVnZW5kID0gZmly
c3RDaGlsZCgpOyBsZWdlbmQ7IGxlZ2VuZCA9IGxlZ2VuZC0+bmV4dFNpYmxpbmcoKSkgewotICAg
ICAgaWYgKCFsZWdlbmQtPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSAmJiBsZWdlbmQtPmVsZW1l
bnQoKSAmJgotICAgICAgICAgIGxlZ2VuZC0+ZWxlbWVudCgpLT5oYXNUYWdOYW1lKGxlZ2VuZFRh
ZykpCi0gICAgICAgIHJldHVybiBsZWdlbmQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12
b2lkIFJlbmRlckZpZWxkc2V0OjpwYWludEJveERlY29yYXRpb25zKFBhaW50SW5mbyYgaSwgaW50
IF90eCwgaW50IF90eSkKLXsKLSAgICBpbnQgdyA9IHdpZHRoKCk7Ci0gICAgaW50IGggPSBoZWln
aHQoKSArIGJvcmRlclRvcEV4dHJhKCkgKyBib3JkZXJCb3R0b21FeHRyYSgpOwotICAgIFJlbmRl
ck9iamVjdCogbGVnZW5kID0gZmluZExlZ2VuZCgpOwotICAgIGlmICghbGVnZW5kKQotICAgICAg
ICByZXR1cm4gUmVuZGVyQmxvY2s6OnBhaW50Qm94RGVjb3JhdGlvbnMoaSwgX3R4LCBfdHkpOwot
Ci0gICAgaW50IHlPZmYgPSAobGVnZW5kLT55UG9zKCkgPiAwKSA/IDAgOiAobGVnZW5kLT5oZWln
aHQoKS1ib3JkZXJUb3AoKSkvMjsKLSAgICBoIC09IHlPZmY7Ci0gICAgX3R5ICs9IHlPZmYgLSBi
b3JkZXJUb3BFeHRyYSgpOwotCi0gICAgaW50IG15ID0gbWF4KF90eSwgaS5yLnkoKSk7Ci0gICAg
aW50IGVuZCA9IG1pbihpLnIuYm90dG9tKCksICBfdHkgKyBoKTsKLSAgICBpbnQgbWggPSBlbmQg
LSBteTsKLQotICAgIHBhaW50QmFja2dyb3VuZChpLnAsIHN0eWxlKCktPmJhY2tncm91bmRDb2xv
cigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kTGF5ZXJzKCksIG15LCBtaCwgX3R4LCBfdHksIHcsIGgp
OwotCi0gICAgaWYgKHN0eWxlKCktPmhhc0JvcmRlcigpKQotICAgICAgICBwYWludEJvcmRlck1p
bnVzTGVnZW5kKGkucCwgX3R4LCBfdHksIHcsIGgsIHN0eWxlKCksIGxlZ2VuZC0+eFBvcygpLCBs
ZWdlbmQtPndpZHRoKCkpOwotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpwYWludEJvcmRlck1p
bnVzTGVnZW5kKEdyYXBoaWNzQ29udGV4dCogcCwgaW50IF90eCwgaW50IF90eSwgaW50IHcsIGlu
dCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBS
ZW5kZXJTdHlsZSogc3R5bGUsIGludCBseCwgaW50IGx3KQotewotCi0gICAgY29uc3QgQ29sb3Im
IHRjID0gc3R5bGUtPmJvcmRlclRvcENvbG9yKCk7Ci0gICAgY29uc3QgQ29sb3ImIGJjID0gc3R5
bGUtPmJvcmRlckJvdHRvbUNvbG9yKCk7Ci0KLSAgICBFQm9yZGVyU3R5bGUgdHMgPSBzdHlsZS0+
Ym9yZGVyVG9wU3R5bGUoKTsKLSAgICBFQm9yZGVyU3R5bGUgYnMgPSBzdHlsZS0+Ym9yZGVyQm90
dG9tU3R5bGUoKTsKLSAgICBFQm9yZGVyU3R5bGUgbHMgPSBzdHlsZS0+Ym9yZGVyTGVmdFN0eWxl
KCk7Ci0gICAgRUJvcmRlclN0eWxlIHJzID0gc3R5bGUtPmJvcmRlclJpZ2h0U3R5bGUoKTsKLQot
ICAgIGJvb2wgcmVuZGVyX3QgPSB0cyA+IEJISURERU47Ci0gICAgYm9vbCByZW5kZXJfbCA9IGxz
ID4gQkhJRERFTjsKLSAgICBib29sIHJlbmRlcl9yID0gcnMgPiBCSElEREVOOwotICAgIGJvb2wg
cmVuZGVyX2IgPSBicyA+IEJISURERU47Ci0KLSAgICBpZihyZW5kZXJfdCkgewotICAgICAgICBk
cmF3Qm9yZGVyKHAsIF90eCwgX3R5LCBfdHggKyBseCwgX3R5ICsgIHN0eWxlLT5ib3JkZXJUb3BX
aWR0aCgpLCBCU1RvcCwgdGMsIHN0eWxlLT5jb2xvcigpLCB0cywKLSAgICAgICAgICAgICAgICAg
ICAocmVuZGVyX2wgJiYgKGxzID09IERPVFRFRCB8fCBscyA9PSBEQVNIRUQgfHwgbHMgPT0gRE9V
QkxFKT9zdHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCk6MCksIDApOwotICAgICAgICBkcmF3Qm9yZGVy
KHAsIF90eCtseCtsdywgX3R5LCBfdHggKyB3LCBfdHkgKyAgc3R5bGUtPmJvcmRlclRvcFdpZHRo
KCksIEJTVG9wLCB0Yywgc3R5bGUtPmNvbG9yKCksIHRzLAotICAgICAgICAgICAgICAgICAgIDAs
IChyZW5kZXJfciAmJiAocnMgPT0gRE9UVEVEIHx8IHJzID09IERBU0hFRCB8fCBycyA9PSBET1VC
TEUpP3N0eWxlLT5ib3JkZXJSaWdodFdpZHRoKCk6MCkpOwotICAgIH0KLQotICAgIGlmKHJlbmRl
cl9iKQotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCwgX3R5ICsgaCAtIHN0eWxlLT5ib3JkZXJC
b3R0b21XaWR0aCgpLCBfdHggKyB3LCBfdHkgKyBoLCBCU0JvdHRvbSwgYmMsIHN0eWxlLT5jb2xv
cigpLCBicywKLSAgICAgICAgICAgICAgICAgICAocmVuZGVyX2wgJiYgKGxzID09IERPVFRFRCB8
fCBscyA9PSBEQVNIRUQgfHwgbHMgPT0gRE9VQkxFKT9zdHlsZS0+Ym9yZGVyTGVmdFdpZHRoKCk6
MCksCi0gICAgICAgICAgICAgICAgICAgKHJlbmRlcl9yICYmIChycyA9PSBET1RURUQgfHwgcnMg
PT0gREFTSEVEIHx8IHJzID09IERPVUJMRSk/c3R5bGUtPmJvcmRlclJpZ2h0V2lkdGgoKTowKSk7
Ci0KLSAgICBpZihyZW5kZXJfbCkKLSAgICB7Ci0gICAgICAgIGNvbnN0IENvbG9yJiBsYyA9IHN0
eWxlLT5ib3JkZXJMZWZ0Q29sb3IoKTsKLQotICAgICAgICBib29sIGlnbm9yZV90b3AgPQotICAg
ICAgICAgICAgKHRjID09IGxjKSAmJgotICAgICAgICAgICAgKGxzID49IE9VVFNFVCkgJiYKLSAg
ICAgICAgICAgICh0cyA9PSBET1RURUQgfHwgdHMgPT0gREFTSEVEIHx8IHRzID09IFNPTElEIHx8
IHRzID09IE9VVFNFVCk7Ci0KLSAgICAgICAgYm9vbCBpZ25vcmVfYm90dG9tID0KLSAgICAgICAg
ICAgIChiYyA9PSBsYykgJiYKLSAgICAgICAgICAgIChscyA+PSBPVVRTRVQpICYmCi0gICAgICAg
ICAgICAoYnMgPT0gRE9UVEVEIHx8IGJzID09IERBU0hFRCB8fCBicyA9PSBTT0xJRCB8fCBicyA9
PSBJTlNFVCk7Ci0KLSAgICAgICAgZHJhd0JvcmRlcihwLCBfdHgsIF90eSwgX3R4ICsgc3R5bGUt
PmJvcmRlckxlZnRXaWR0aCgpLCBfdHkgKyBoLCBCU0xlZnQsIGxjLCBzdHlsZS0+Y29sb3IoKSwg
bHMsCi0gICAgICAgICAgICAgICAgICAgaWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BXaWR0
aCgpLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVyQm90
dG9tV2lkdGgoKSk7Ci0gICAgfQotCi0gICAgaWYocmVuZGVyX3IpCi0gICAgewotICAgICAgICBj
b25zdCBDb2xvciYgcmMgPSBzdHlsZS0+Ym9yZGVyUmlnaHRDb2xvcigpOwotCi0gICAgICAgIGJv
b2wgaWdub3JlX3RvcCA9Ci0gICAgICAgICAgICAodGMgPT0gcmMpICYmCi0gICAgICAgICAgICAo
cnMgPj0gRE9UVEVEIHx8IHJzID09IElOU0VUKSAmJgotICAgICAgICAgICAgKHRzID09IERPVFRF
RCB8fCB0cyA9PSBEQVNIRUQgfHwgdHMgPT0gU09MSUQgfHwgdHMgPT0gT1VUU0VUKTsKLQotICAg
ICAgICBib29sIGlnbm9yZV9ib3R0b20gPQotICAgICAgICAgICAgKGJjID09IHJjKSAmJgotICAg
ICAgICAgICAgKHJzID49IERPVFRFRCB8fCBycyA9PSBJTlNFVCkgJiYKLSAgICAgICAgICAgIChi
cyA9PSBET1RURUQgfHwgYnMgPT0gREFTSEVEIHx8IGJzID09IFNPTElEIHx8IGJzID09IElOU0VU
KTsKLQotICAgICAgICBkcmF3Qm9yZGVyKHAsIF90eCArIHcgLSBzdHlsZS0+Ym9yZGVyUmlnaHRX
aWR0aCgpLCBfdHksIF90eCArIHcsIF90eSArIGgsIEJTUmlnaHQsIHJjLCBzdHlsZS0+Y29sb3Io
KSwgcnMsCi0gICAgICAgICAgICAgICAgICAgaWdub3JlX3RvcD8wOnN0eWxlLT5ib3JkZXJUb3BX
aWR0aCgpLAotICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ib3R0b20/MDpzdHlsZS0+Ym9yZGVy
Qm90dG9tV2lkdGgoKSk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckZpZWxkc2V0OjpzZXRTdHls
ZShSZW5kZXJTdHlsZSogX3N0eWxlKQotewotICAgIFJlbmRlckJsb2NrOjpzZXRTdHlsZShfc3R5
bGUpOwotCi0gICAgLy8gV2luSUUgcmVuZGVycyBmaWVsZHNldHMgd2l0aCBkaXNwbGF5OmlubGlu
ZSBsaWtlIHRoZXkncmUgaW5saW5lLWJsb2Nrcy4gIEZvciB1cywKLSAgICAvLyBhbiBpbmxpbmUt
YmxvY2sgaXMganVzdCBhIGJsb2NrIGVsZW1lbnQgd2l0aCByZXBsYWNlZCBzZXQgdG8gdHJ1ZSBh
bmQgaW5saW5lIHNldAotICAgIC8vIHRvIHRydWUuICBFbnN1cmUgdGhhdCBpZiB3ZSBlbmRlZCB1
cCBiZWluZyBpbmxpbmUgdGhhdCB3ZSBzZXQgb3VyIHJlcGxhY2VkIGZsYWcKLSAgICAvLyBzbyB0
aGF0IHdlJ3JlIHRyZWF0ZWQgbGlrZSBhbiBpbmxpbmUtYmxvY2suCi0gICAgaWYgKGlzSW5saW5l
KCkpCi0gICAgICAgIHNldFJlcGxhY2VkKHRydWUpOwotfSAgICAKLSAgICAKLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotUmVuZGVyRmlsZUJ1dHRvbjo6UmVuZGVyRmlsZUJ1dHRvbihIVE1MSW5wdXRF
bGVtZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCkKLXsKLSAg
ICBzZXRXaWRnZXQobmV3IEtXUUZpbGVCdXR0b24odmlldygpLT5mcmFtZSgpKSk7Ci19Ci0KLXZv
aWQgUmVuZGVyRmlsZUJ1dHRvbjo6Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2Vy
dCghbWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBi
aWcgaXQgd2FudHMgdG8gYmUuCi0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIEludFNpemUgcyhzdGF0aWNfY2FzdDxLV1FG
aWxlQnV0dG9uICo+KHdpZGdldCgpKS0+c2l6ZUZvckNoYXJhY3RlcldpZHRoKHNpemUgPiAwID8g
c2l6ZSA6IDIwKSk7Ci0KLSAgICBzZXRJbnRyaW5zaWNXaWR0aChzLndpZHRoKCkpOwotICAgIHNl
dEludHJpbnNpY0hlaWdodChzLmhlaWdodCgpKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojpj
YWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjp1cGRhdGVGcm9t
RWxlbWVudCgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+
c2V0RmlsZW5hbWUoCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2Rl
KCkpLT52YWx1ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKSk7Ci0KLSAgICBSZW5kZXJGb3JtRWxlbWVu
dDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotdm9pZCBSZW5kZXJGaWxlQnV0dG9uOjpyZXR1
cm5QcmVzc2VkKFdpZGdldCopCi17Ci0gICAgaWYgKHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihub2RlKCkpLT5mb3JtKCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihub2RlKCkpLT5mb3JtKCktPnByZXBhcmVTdWJtaXQoKTsKLX0KLQotdm9pZCBSZW5kZXJG
aWxlQnV0dG9uOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVGcm9tUmVuZGVyZXIoc3RhdGljX2Nhc3Q8
S1dRRmlsZUJ1dHRvbio+KHdpZGdldCgpKS0+ZmlsZW5hbWUoKSk7Ci0gICAgc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPm9uQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgUmVuZGVy
RmlsZUJ1dHRvbjo6c2VsZWN0KCkKLXsKLX0KLQotCi12b2lkIFJlbmRlckZpbGVCdXR0b246OmNs
aWNrKGJvb2wgc2VuZE1vdXNlRXZlbnRzKQotewotICAgIHN0YXRpY19jYXN0PEtXUUZpbGVCdXR0
b24gKj4od2lkZ2V0KCkpLT5jbGljayhzZW5kTW91c2VFdmVudHMpOwotfQotCi0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotUmVuZGVyTGFiZWw6OlJlbmRlckxhYmVsKEhUTUxHZW5lcmljRm9ybUVs
ZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChlbGVtZW50KQotewotCi19
Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyTGVnZW5kOjpSZW5kZXJMZWdlbmQoSFRN
TEdlbmVyaWNGb3JtRWxlbWVudCAqZWxlbWVudCkKLSAgICA6IFJlbmRlckJsb2NrKGVsZW1lbnQp
Ci17Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2VsZWN0OjpSZW5kZXJTZWxl
Y3QoSFRNTFNlbGVjdEVsZW1lbnQgKmVsZW1lbnQpCi0gICAgOiBSZW5kZXJGb3JtRWxlbWVudChl
bGVtZW50KQotewotICAgIG1faWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgbV9tdWx0
aXBsZSA9IGVsZW1lbnQtPm11bHRpcGxlKCk7Ci0gICAgbV9zaXplID0gZWxlbWVudC0+c2l6ZSgp
OwotICAgIG1fdXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1fc2l6ZSA+IDEpOwotICAgIG1f
c2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IHRydWU7Ci0K
LSAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAgICBzZXRXaWRnZXQoY3JlYXRlTGlzdEJveCgp
KTsKLSAgICBlbHNlCi0gICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLX0KLQotCi12
b2lkIFJlbmRlclNlbGVjdDo6c2V0V2lkZ2V0V3JpdGluZ0RpcmVjdGlvbigpCi17Ci0gICAgVGV4
dERpcmVjdGlvbiBkID0gc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSOwot
ICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgIHN0YXRpY19jYXN0PFFMaXN0Qm94ICo+KG1f
d2lkZ2V0KS0+c2V0V3JpdGluZ0RpcmVjdGlvbihkKTsKLSAgICBlbHNlCi0gICAgICAgIHN0YXRp
Y19jYXN0PFFDb21ib0JveCAqPihtX3dpZGdldCktPnNldFdyaXRpbmdEaXJlY3Rpb24oZCk7Ci19
Ci0KLXZvaWQgUmVuZGVyU2VsZWN0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAqcykKLXsKLSAgICBS
ZW5kZXJGb3JtRWxlbWVudDo6c2V0U3R5bGUocyk7Ci0gICAgc2V0V2lkZ2V0V3JpdGluZ0RpcmVj
dGlvbigpOwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17
Ci0gICAgbV9pZ25vcmVTZWxlY3RFdmVudHMgPSB0cnVlOwotCi0gICAgLy8gY2hhbmdlIHdpZGdl
dCB0eXBlCi0gICAgYm9vbCBvbGRNdWx0aXBsZSA9IG1fbXVsdGlwbGU7Ci0gICAgdW5zaWduZWQg
b2xkU2l6ZSA9IG1fc2l6ZTsKLSAgICBib29sIG9sZExpc3Rib3ggPSBtX3VzZUxpc3RCb3g7Ci0K
LSAgICBtX211bHRpcGxlID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkp
LT5tdWx0aXBsZSgpOwotICAgIG1fc2l6ZSA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50
Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgIG1fdXNlTGlzdEJveCA9IChtX211bHRpcGxlIHx8IG1f
c2l6ZSA+IDEpOwotCi0gICAgaWYgKG9sZE11bHRpcGxlICE9IG1fbXVsdGlwbGUgfHwgb2xkU2l6
ZSAhPSBtX3NpemUpIHsKLSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCAhPSBvbGRMaXN0Ym94KSB7
Ci0gICAgICAgICAgICAvLyB0eXBlIG9mIHNlbGVjdCBoYXMgY2hhbmdlZAotICAgICAgICAgICAg
ZGVsZXRlIG1fd2lkZ2V0OwotCi0gICAgICAgICAgICBpZiAobV91c2VMaXN0Qm94KQotICAgICAg
ICAgICAgICAgIHNldFdpZGdldChjcmVhdGVMaXN0Qm94KCkpOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHNldFdpZGdldChuZXcgUUNvbWJvQm94KTsKLSAgICAgICAgICAgIHNl
dFdpZGdldFdyaXRpbmdEaXJlY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3Vz
ZUxpc3RCb3ggJiYgb2xkTXVsdGlwbGUgIT0gbV9tdWx0aXBsZSkgewotICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPnNldFNlbGVjdGlvbk1vZGUobV9tdWx0aXBs
ZSA/IFFMaXN0Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgICAgICB9Ci0g
ICAgICAgIG1fc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5n
ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIHVwZGF0ZSBjb250ZW50cyBsaXN0Ym94L2NvbWJv
Ym94IGJhc2VkIG9uIG9wdGlvbnMgaW4gbV9lbGVtZW50Ci0gICAgaWYgKCBtX29wdGlvbnNDaGFu
Z2VkICkgewotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2Rl
KCkpLT5tX3JlY2FsY0xpc3RJdGVtcykKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxTZWxl
Y3RFbGVtZW50Kj4obm9kZSgpKS0+cmVjYWxjTGlzdEl0ZW1zKCk7Ci0gICAgICAgIERlcHJlY2F0
ZWRBcnJheTxIVE1MRWxlbWVudCo+IGxpc3RJdGVtcyA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RF
bGVtZW50Kj4obm9kZSgpKS0+bGlzdEl0ZW1zKCk7Ci0gICAgICAgIGludCBsaXN0SW5kZXg7Ci0K
LSAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFFMaXN0
Qm94Kj4obV93aWRnZXQpLT5jbGVhcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdldCktPmNsZWFyKCk7Ci0KLSAgICAgICAgYm9vbCBn
cm91cEVuYWJsZWQgPSB0cnVlOwotICAgICAgICBmb3IgKGxpc3RJbmRleCA9IDA7IGxpc3RJbmRl
eCA8IGludChsaXN0SXRlbXMuc2l6ZSgpKTsgbGlzdEluZGV4KyspIHsKLSAgICAgICAgICAgIGlm
IChsaXN0SXRlbXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpIHsKLSAgICAg
ICAgICAgICAgICBIVE1MT3B0R3JvdXBFbGVtZW50ICpvcHRncm91cEVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MT3B0R3JvdXBFbGVtZW50Kj4obGlzdEl0ZW1zW2xpc3RJbmRleF0pOwotICAgICAg
ICAgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgbGFiZWwgPSBvcHRncm91cEVsZW1lbnQtPmdldEF0
dHJpYnV0ZShsYWJlbEF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBs
YWJlbC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0gICAgICAg
ICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSW4gV2luSUUsIGFuIG9wdGdyb3VwIGNhbid0
IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UgKG90aGVyIHRoYW4gdGhlIGluZGVudAotICAg
ICAgICAgICAgICAgIC8vIHdlIGdpdmUgaXQpLiAgV2UgbWF0Y2ggdGhpcyBiZWhhdmlvci4KLSAg
ICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAg
ICAgICAgIC8vIFdlIHdhbnQgdG8gY29sbGFwc2Ugb3VyIHdoaXRlc3BhY2UgdG9vLiAgVGhpcyB3
aWxsIG1hdGNoIG90aGVyIGJyb3dzZXJzLgotICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwu
c2ltcGxpZnlXaGl0ZVNwYWNlKCk7Ci0KLSAgICAgICAgICAgICAgICBncm91cEVuYWJsZWQgPSBv
cHRncm91cEVsZW1lbnQtPmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PFFMaXN0Qm94Kj4obV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsLCBncm91cEVuYWJs
ZWQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5hcHBlbmRHcm91cExhYmVsKGxhYmVsKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxpc3RJdGVtc1tsaXN0SW5kZXhdLT5oYXNU
YWdOYW1lKG9wdGlvblRhZykpIHsKLSAgICAgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCAq
b3B0aW9uRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxPcHRpb25FbGVtZW50Kj4obGlzdEl0ZW1z
W2xpc3RJbmRleF0pOwotICAgICAgICAgICAgICAgIERlcHJlY2F0ZWRTdHJpbmcgaXRlbVRleHQ7
Ci0gICAgICAgICAgICAgICAgaWYgKG9wdGlvbkVsZW1lbnQtPmhhc0F0dHJpYnV0ZShsYWJlbEF0
dHIpKQotICAgICAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IG9wdGlvbkVsZW1lbnQtPmdldEF0
dHJpYnV0ZShsYWJlbEF0dHIpLmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgICAgIGl0ZW1UZXh0ID0gb3B0aW9uRWxlbWVudC0+dGV4dCgp
LmRlcHJlY2F0ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBp
dGVtVGV4dC5yZXBsYWNlKCdcXCcsIGJhY2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSk7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBJbiBXaW5JRSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFj
ZSBpcyBpZ25vcmVkIGluIG9wdGlvbnMuIFdlIG1hdGNoIHRoaXMgYmVoYXZpb3IuCi0gICAgICAg
ICAgICAgICAgaXRlbVRleHQgPSBpdGVtVGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAg
ICAgICAgICAvLyBXZSB3YW50IHRvIGNvbGxhcHNlIG91ciB3aGl0ZXNwYWNlIHRvby4gIFRoaXMg
d2lsbCBtYXRjaCBvdGhlciBicm93c2Vycy4KLSAgICAgICAgICAgICAgICBpdGVtVGV4dCA9IGl0
ZW1UZXh0LnNpbXBsaWZ5V2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIGlmIChsaXN0SXRlbXNbbGlzdEluZGV4XS0+cGFyZW50Tm9kZSgpLT5oYXNUYWdOYW1l
KG9wdGdyb3VwVGFnKSkKLSAgICAgICAgICAgICAgICAgICAgaXRlbVRleHQucHJlcGVuZCgiICAg
ICIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UUxpc3RCb3gqPihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRl
eHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25FbGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gq
PihtX3dpZGdldCktPmFwcGVuZEl0ZW0oaXRlbVRleHQsIGdyb3VwRW5hYmxlZCAmJiBvcHRpb25F
bGVtZW50LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlm
IChsaXN0SXRlbXNbbGlzdEluZGV4XS0+aGFzVGFnTmFtZShoclRhZykpIHsKLSAgICAgICAgICAg
ICAgICBpZiAoIW1fdXNlTGlzdEJveCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
UUNvbWJvQm94Kj4obV93aWRnZXQpLT5hcHBlbmRTZXBhcmF0b3IoKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBLSFRNTEFzc2VydChmYWxzZSk7Ci0g
ICAgICAgICAgICBtX3NlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAg
IGlmIChtX3VzZUxpc3RCb3gpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1f
d2lkZ2V0KS0+ZG9uZUFwcGVuZGluZ0l0ZW1zKCk7Ci0gICAgICAgIHNldE5lZWRzTGF5b3V0QW5k
TWluTWF4UmVjYWxjKCk7Ci0gICAgICAgIG1fb3B0aW9uc0NoYW5nZWQgPSBmYWxzZTsKLSAgICB9
Ci0KLSAgICAvLyB1cGRhdGUgc2VsZWN0aW9uCi0gICAgaWYgKG1fc2VsZWN0aW9uQ2hhbmdlZCkg
ewotICAgICAgICB1cGRhdGVTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBtX2lnbm9yZVNlbGVj
dEV2ZW50cyA9IGZhbHNlOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVwZGF0ZUZyb21FbGVt
ZW50KCk7Ci19Ci0KLQotc2hvcnQgUmVuZGVyU2VsZWN0OjpiYXNlbGluZVBvc2l0aW9uKCBib29s
IGYsIGJvb2wgaXNSb290TGluZUJveCApIGNvbnN0Ci17Ci0gICAgaWYgKG1fdXNlTGlzdEJveCkg
ewotICAgICAgICAvLyBGSVhNRTogU2hvdWxkIGdldCB0aGUgaGFyZGNvZGVkIGNvbnN0YW50IG9m
IDcgYnkgY2FsbGluZyBhIFFMaXN0Qm94IGZ1bmN0aW9uLAotICAgICAgICAvLyBhcyB3ZSBkbyBm
b3Igb3RoZXIgd2lkZ2V0IGNsYXNzZXMuCi0gICAgICAgIHJldHVybiBSZW5kZXJXaWRnZXQ6OmJh
c2VsaW5lUG9zaXRpb24oIGYsIGlzUm9vdExpbmVCb3ggKSAtIDc7Ci0gICAgfQotICAgIHJldHVy
biBSZW5kZXJGb3JtRWxlbWVudDo6YmFzZWxpbmVQb3NpdGlvbiggZiwgaXNSb290TGluZUJveCAp
OwotfQotCi0KLXZvaWQgUmVuZGVyU2VsZWN0OjpjYWxjTWluTWF4V2lkdGgoKQotewotICAgIEtI
VE1MQXNzZXJ0KCAhbWluTWF4S25vd24oKSApOwotCi0gICAgaWYgKG1fb3B0aW9uc0NoYW5nZWQp
Ci0gICAgICAgIHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICAvLyAjIyMgdWdseSBIQUNLIEZJ
WE1FISEhCi0gICAgc2V0TWluTWF4S25vd24oKTsKLSAgICBsYXlvdXRJZk5lZWRlZCgpOwotICAg
IHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0gICAgLy8gIyMjIGVuZCBGSVhNRQot
Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJl
bmRlclNlbGVjdDo6bGF5b3V0KCApCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7
Ci0gICAgS0hUTUxBc3NlcnQobWluTWF4S25vd24oKSk7Ci0KLSAgICAvLyAjIyMgbWFpbnRhaW4g
c2VsZWN0aW9uIHByb3Blcmx5IGJldHdlZW4gdHlwZS9zaXplIGNoYW5nZXMsIGFuZCB3b3JrCi0g
ICAgLy8gb3V0IGhvdyB0byBoYW5kbGUgbXVsdGlzZWxlY3QtPnNpbmdsZXNlbGVjdCAocHJvYmFi
bHkganVzdCBzZWxlY3QKLSAgICAvLyBmaXJzdCBzZWxlY3RlZCBvbmUpCi0KLSAgICAvLyBjYWxj
dWxhdGUgc2l6ZQotICAgIGlmKG1fdXNlTGlzdEJveCkgewotICAgICAgICBRTGlzdEJveCogdyA9
IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4obV93aWRnZXQpOwotCi0KLSAgICAgICAgaW50IHNpemUg
PSBtX3NpemU7Ci0gICAgICAgIC8vIGNoZWNrIGlmIG11bHRpcGxlIGFuZCBzaXplIHdhcyBub3Qg
Z2l2ZW4gb3IgaW52YWxpZAotICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb2RlciBzZXRzIHNpemUg
dG8gbWluKG51bWJlciBvZiBlbGVtZW50cywgNCkKLSAgICAgICAgLy8gTmV0c2NhcGUgc2VlbXMg
dG8gc2ltcGx5IHNldCBpdCB0byAibnVtYmVyIG9mIGVsZW1lbnRzIgotICAgICAgICAvLyB0aGUg
YXZlcmFnZSBvZiB0aGF0IGlzIElNSE8gbWluKG51bWJlciBvZiBlbGVtZW50cywgMTApCi0gICAg
ICAgIC8vIHNvIEkgZGlkIHRoYXQgOy0pCi0gICAgICAgIGlmKHNpemUgPCAxKQotICAgICAgICAg
ICAgc2l6ZSA9IG1pbihzdGF0aWNfY2FzdDxRTGlzdEJveCo+KG1fd2lkZ2V0KS0+Y291bnQoKSwg
MTBVKTsKLQotICAgICAgICAvLyBMZXQgdGhlIHdpZGdldCB0ZWxsIHVzIGhvdyBiaWcgaXQgd2Fu
dHMgdG8gYmUuCi0gICAgICAgIEludFNpemUgcyh3LT5zaXplRm9yTnVtYmVyT2ZMaW5lcyhzaXpl
KSk7Ci0gICAgICAgIHNldEludHJpbnNpY1dpZHRoKCBzLndpZHRoKCkgKTsKLSAgICAgICAgc2V0
SW50cmluc2ljSGVpZ2h0KCBzLmhlaWdodCgpICk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICBJbnRTaXplIHMobV93aWRnZXQtPnNpemVIaW50KCkpOwotICAgICAgICBzZXRJbnRyaW5zaWNX
aWR0aCggcy53aWR0aCgpICk7Ci0gICAgICAgIHNldEludHJpbnNpY0hlaWdodCggcy5oZWlnaHQo
KSApOwotICAgIH0KLQotICAgIFJlbmRlckZvcm1FbGVtZW50OjpsYXlvdXQoKTsKLQotICAgIC8v
IGFuZCBub3cgZGlzYWJsZSB0aGUgd2lkZ2V0IGluIGNhc2UgdGhlcmUgaXMgbm8gPG9wdGlvbj4g
Z2l2ZW4KLSAgICBEZXByZWNhdGVkQXJyYXk8SFRNTEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0
aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5vZGUoKSktPmxpc3RJdGVtcygpOwotCi0gICAg
Ym9vbCBmb3VuZE9wdGlvbiA9IGZhbHNlOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBs
aXN0SXRlbXMuc2l6ZSgpICYmICFmb3VuZE9wdGlvbjsgaSsrKQotICAgICAgICBmb3VuZE9wdGlv
biA9IChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSk7Ci0KLSAgICBtX3dpZGdl
dC0+c2V0RW5hYmxlZChmb3VuZE9wdGlvbiAmJiAhIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVt
ZW50Kj4obm9kZSgpKS0+ZGlzYWJsZWQoKSk7Ci19Ci0KLXZvaWQgUmVuZGVyU2VsZWN0Ojp2YWx1
ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAgICBpZiAobV9pZ25vcmVTZWxlY3RFdmVudHMpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIEtIVE1MQXNzZXJ0KCFtX3VzZUxpc3RCb3gpOwotCi0gICAgaW50
IGluZGV4ID0gc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50SXRlbSgp
OwotCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50Kj4gbGlzdEl0ZW1zID0gc3RhdGlj
X2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5saXN0SXRlbXMoKTsKLSAgICBpZiAo
aW5kZXggPj0gMCAmJiBpbmRleCA8IChpbnQpbGlzdEl0ZW1zLnNpemUoKSkgewotICAgICAgICBi
b29sIGZvdW5kID0gbGlzdEl0ZW1zW2luZGV4XS0+aGFzVGFnTmFtZShvcHRpb25UYWcpOwotICAg
ICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBub3Qgc2VsZWN0
YWJsZSwgIHdlIG5lZWQgdG8gZmluZCBhbiBvcHRpb24gZWxlbWVudAotICAgICAgICAgICAgd2hp
bGUgKCh1bnNpZ25lZCkgaW5kZXggPCBsaXN0SXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAg
ICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGlu
ZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtc1tpbmRleF0tPmhh
c1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgLS1pbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAg
IGlmICggaW5kZXggIT0gc3RhdGljX2Nhc3Q8UUNvbWJvQm94Kj4obV93aWRnZXQpLT5jdXJyZW50
SXRlbSgpICkKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRQ29tYm9Cb3gqPihtX3dpZGdl
dCktPnNldEN1cnJlbnRJdGVtKCBpbmRleCApOwotCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbGlzdEl0ZW1zLnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIGlmIChs
aXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJiBpICE9ICh1bnNpZ25lZCBpbnQp
IGluZGV4KQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dCo+KCBsaXN0SXRlbXNbaV0gKS0+bV9zZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBz
dGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KGxpc3RJdGVtc1tpbmRleF0pLT5tX3NlbGVj
dGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxl
Y3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2UoKTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVj
dDo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIGlmIChtX2lnbm9yZVNlbGVjdEV2
ZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gZG9uJ3QgdXNlIGxpc3RJdGVtcygpIGhl
cmUgYXMgd2UgaGF2ZSB0byBhdm9pZCByZWNhbGN1bGF0aW9ucyAtIGNoYW5naW5nIHRoZQotICAg
IC8vIG9wdGlvbiBsaXN0IHdpbGwgbWFrZSB1c2UgdXBkYXRlIG9wdGlvbnMgbm90IGluIHRoZSB3
YXkgdGhlIHVzZXIgZXhwZWN0cyB0aGVtCi0gICAgRGVwcmVjYXRlZEFycmF5PEhUTUxFbGVtZW50
Kj4gbGlzdEl0ZW1zID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKCkpLT5t
X2xpc3RJdGVtczsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGxpc3RJdGVtcy5jb3VudCgpOyBpKyspIHsKLSAgICAgICAgLy8gZG9uJ3QgdXNlIHNldFNlbGVj
dGVkKCkgaGVyZSBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdXMgdG8gYmUgY2FsbGVkCi0gICAgICAg
IC8vIGFnYWluIHdpdGggdXBkYXRlU2VsZWN0aW9uLgotICAgICAgICBpZiAobGlzdEl0ZW1zW2ld
LT5oYXNUYWdOYW1lKG9wdGlvblRhZykpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0
aW9uRWxlbWVudCo+KCBsaXN0SXRlbXNbaV0gKQotICAgICAgICAgICAgICAgIC0+bV9zZWxlY3Rl
ZCA9IHN0YXRpY19jYXN0PFFMaXN0Qm94Kj4oIG1fd2lkZ2V0ICktPmlzU2VsZWN0ZWQoIGogKTsK
LSAgICAgICAgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJ
dGVtc1tpXS0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgICAgICArK2o7Ci0gICAg
fQotICAgIHN0YXRpY19jYXN0PEhUTUxTZWxlY3RFbGVtZW50Kj4obm9kZSgpKS0+b25DaGFuZ2Uo
KTsKLX0KLQotCi12b2lkIFJlbmRlclNlbGVjdDo6c2V0T3B0aW9uc0NoYW5nZWQoYm9vbCBfb3B0
aW9uc0NoYW5nZWQpCi17Ci0gICAgbV9vcHRpb25zQ2hhbmdlZCA9IF9vcHRpb25zQ2hhbmdlZDsK
LX0KLQotUUxpc3RCb3gqIFJlbmRlclNlbGVjdDo6Y3JlYXRlTGlzdEJveCgpCi17Ci0gICAgUUxp
c3RCb3ggKmxiID0gbmV3IFFMaXN0Qm94KCk7Ci0gICAgbGItPnNldFNlbGVjdGlvbk1vZGUobV9t
dWx0aXBsZSA/IFFMaXN0Qm94OjpFeHRlbmRlZCA6IFFMaXN0Qm94OjpTaW5nbGUpOwotICAgIG1f
aWdub3JlU2VsZWN0RXZlbnRzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGxiOwotfQotCi12b2lkIFJl
bmRlclNlbGVjdDo6dXBkYXRlU2VsZWN0aW9uKCkKLXsKLSAgICBEZXByZWNhdGVkQXJyYXk8SFRN
TEVsZW1lbnQqPiBsaXN0SXRlbXMgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG5v
ZGUoKSktPmxpc3RJdGVtcygpOwotICAgIGludCBpOwotICAgIGlmIChtX3VzZUxpc3RCb3gpIHsK
LSAgICAgICAgLy8gaWYgbXVsdGktc2VsZWN0LCB3ZSBzZWxlY3Qgb25seSB0aGUgbmV3IHNlbGVj
dGVkIGluZGV4Ci0gICAgICAgIFFMaXN0Qm94ICpsaXN0Qm94ID0gc3RhdGljX2Nhc3Q8UUxpc3RC
b3gqPihtX3dpZGdldCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsg
aSA8IGludChsaXN0SXRlbXMuc2l6ZSgpKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0Qm94LT5z
ZXRTZWxlY3RlZChqLCBsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSAmJgotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVu
dCo+KGxpc3RJdGVtc1tpXSktPnNlbGVjdGVkKCkpOwotICAgICAgICAgICAgaWYgKGxpc3RJdGVt
c1tpXS0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShv
cHRncm91cFRhZykpCi0gICAgICAgICAgICAgICAgKytqOwotICAgICAgICAgICAgCi0gICAgICAg
IH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAg
ICAgdW5zaWduZWQgZmlyc3RPcHRpb24gPSBsaXN0SXRlbXMuc2l6ZSgpOwotICAgICAgICBpID0g
bGlzdEl0ZW1zLnNpemUoKTsKLSAgICAgICAgd2hpbGUgKGktLSkKLSAgICAgICAgICAgIGlmIChs
aXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUob3B0aW9uVGFnKSkgewotICAgICAgICAgICAgICAgIGlm
IChmb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1l
bnQqPihsaXN0SXRlbXNbaV0pLT5tX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
ZWxzZSBpZiAoc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pLT5z
ZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFFDb21ib0JveCo+
KCBtX3dpZGdldCApLT5zZXRDdXJyZW50SXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgZm91
bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJzdE9wdGlv
biA9IGk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgQVNTRVJUKGZpcnN0T3B0aW9uID09IGxp
c3RJdGVtcy5zaXplKCkgfHwgZm91bmQpOwotICAgIH0KLQotICAgIG1fc2VsZWN0aW9uQ2hhbmdl
ZCA9IGZhbHNlOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLVJlbmRlclRleHRBcmVhOjpSZW5kZXJUZXh0QXJlYShIVE1MVGV4dEFyZWFFbGVt
ZW50ICplbGVtZW50KQotICAgIDogUmVuZGVyRm9ybUVsZW1lbnQoZWxlbWVudCksIG1fZGlydHko
ZmFsc2UpLCBtX3VwZGF0aW5nKGZhbHNlKQotewotICAgIFFUZXh0RWRpdCAqZWRpdCA9IG5ldyBR
VGV4dEVkaXQodmlldygpKTsKLQotICAgIGlmIChlbGVtZW50LT53cmFwKCkgIT0gSFRNTFRleHRB
cmVhRWxlbWVudDo6dGFfTm9XcmFwKQotICAgICAgICBlZGl0LT5zZXRXb3JkV3JhcChRVGV4dEVk
aXQ6OldpZGdldFdpZHRoKTsKLSAgICBlbHNlCi0gICAgICAgIGVkaXQtPnNldFdvcmRXcmFwKFFU
ZXh0RWRpdDo6Tm9XcmFwKTsKLQotICAgIHNldFdpZGdldChlZGl0KTsKLX0KLQotdm9pZCBSZW5k
ZXJUZXh0QXJlYTo6ZGVzdHJveSgpCi17Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxl
bWVudCo+KG5vZGUoKSktPnJlbmRlcmVyV2lsbEJlRGVzdHJveWVkKCk7Ci0gICAgUmVuZGVyRm9y
bUVsZW1lbnQ6OmRlc3Ryb3koKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6Y2FsY01pbk1h
eFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCggIW1pbk1heEtub3duKCkgKTsKLQotICAgIFFU
ZXh0RWRpdCogdyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLSAgICBJbnRT
aXplIHNpemUody0+c2l6ZVdpdGhDb2x1bW5zQW5kUm93cygKLSAgICAgICAgbWF4KHN0YXRpY19j
YXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5jb2xzKCksIDEpLAotICAgICAgICBt
YXgoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPnJvd3MoKSwgMSkp
KTsKLQotICAgIHNldEludHJpbnNpY1dpZHRoKCBzaXplLndpZHRoKCkgKTsKLSAgICBzZXRJbnRy
aW5zaWNIZWlnaHQoIHNpemUuaGVpZ2h0KCkgKTsKLQotICAgIFJlbmRlckZvcm1FbGVtZW50Ojpj
YWxjTWluTWF4V2lkdGgoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U3R5bGUoUmVu
ZGVyU3R5bGUgKnMpCi17Ci0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnNldFN0eWxlKHMpOwotCi0g
ICAgUVRleHRFZGl0KiB3ID0gc3RhdGljX2Nhc3Q8UVRleHRFZGl0Kj4obV93aWRnZXQpOwotICAg
IHctPnNldEFsaWdubWVudCh0ZXh0QWxpZ25tZW50KCkpOwotICAgIHctPnNldExpbmVIZWlnaHQo
UmVuZGVyT2JqZWN0OjpsaW5lSGVpZ2h0KHRydWUpKTsKLQotICAgIHctPnNldFdyaXRpbmdEaXJl
Y3Rpb24oc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gUlRMIDogTFRSKTsKLQotICAgIFNj
cm9sbEJhck1vZGUgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckF1dG87Ci0gICAgc3dpdGNoIChzdHls
ZSgpLT5vdmVyZmxvdygpKSB7Ci0gICAgICAgIGNhc2UgT0FVVE86Ci0gICAgICAgIGNhc2UgT01B
UlFVRUU6IC8vIG1ha2VzIG5vIHNlbnNlLCBtYXAgdG8gYXV0bwotICAgICAgICBjYXNlIE9PVkVS
TEFZOiAvLyBub3QgaW1wbGVtZW50ZWQgZm9yIHRleHQsIG1hcCB0byBhdXRvCi0gICAgICAgIGNh
c2UgT1ZJU0lCTEU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSElEREVOOgot
ICAgICAgICAgICAgc2Nyb2xsTW9kZSA9IFNjcm9sbEJhckFsd2F5c09mZjsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIE9TQ1JPTEw6Ci0gICAgICAgICAgICBzY3JvbGxNb2RlID0g
U2Nyb2xsQmFyQWx3YXlzT247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgU2Nyb2xs
QmFyTW9kZSBob3Jpem9udGFsU2Nyb2xsTW9kZSA9IHNjcm9sbE1vZGU7Ci0gICAgaWYgKHN0YXRp
Y19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT53cmFwKCkgIT0gSFRNTFRleHRB
cmVhRWxlbWVudDo6dGFfTm9XcmFwKQotICAgICAgICBob3Jpem9udGFsU2Nyb2xsTW9kZSA9IFNj
cm9sbEJhckFsd2F5c09mZjsKLQotICAgIHctPnNldFNjcm9sbEJhck1vZGVzKGhvcml6b250YWxT
Y3JvbGxNb2RlLCBzY3JvbGxNb2RlKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0RWRp
dGVkKGJvb2wgeCkKLXsKLSAgICBtX2RpcnR5ID0geDsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJl
YTo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIEhUTUxUZXh0QXJlYUVsZW1lbnQqIGUgPSBz
dGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBRVGV4dEVkaXQq
IHcgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQqPihtX3dpZGdldCk7Ci0KLSAgICB3LT5zZXRSZWFk
T25seShlLT5pc1JlYWRPbmx5Q29udHJvbCgpKTsKLSAgICB3LT5zZXREaXNhYmxlZChlLT5kaXNh
YmxlZCgpKTsKLQotICAgIFN0cmluZyB3aWRnZXRUZXh0ID0gdGV4dCgpOwotICAgIFN0cmluZyB0
ZXh0ID0gZS0+dmFsdWUoKTsKLSAgICB0ZXh0LnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXNDdXJy
ZW5jeVN5bWJvbCgpKTsKLSAgICBpZiAod2lkZ2V0VGV4dCAhPSB0ZXh0KSB7Ci0gICAgICAgIGlu
dCBsaW5lLCBjb2w7Ci0gICAgICAgIHctPmdldEN1cnNvclBvc2l0aW9uKCAmbGluZSwgJmNvbCAp
OwotICAgICAgICBtX3VwZGF0aW5nID0gdHJ1ZTsKLSAgICAgICAgdy0+c2V0VGV4dCh0ZXh0KTsK
LSAgICAgICAgbV91cGRhdGluZyA9IGZhbHNlOwotICAgICAgICB3LT5zZXRDdXJzb3JQb3NpdGlv
biggbGluZSwgY29sICk7Ci0gICAgfQotICAgIG1fZGlydHkgPSBmYWxzZTsKLQotICAgIHctPnNl
dENvbG9ycyhzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Y29sb3IoKSk7Ci0K
LSAgICBSZW5kZXJGb3JtRWxlbWVudDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKLX0KLQotU3RyaW5n
IFJlbmRlclRleHRBcmVhOjp0ZXh0KCkKLXsKLSAgICBTdHJpbmcgdHh0ID0gc3RhdGljX2Nhc3Q8
UVRleHRFZGl0Kj4obV93aWRnZXQpLT50ZXh0KCk7Ci0gICAgcmV0dXJuIHR4dC5yZXBsYWNlKGJh
Y2tzbGFzaEFzQ3VycmVuY3lTeW1ib2woKSwgJ1xcJyk7Ci19Ci0KLVN0cmluZyBSZW5kZXJUZXh0
QXJlYTo6dGV4dFdpdGhIYXJkTGluZUJyZWFrcygpCi17Ci0gICAgU3RyaW5nIHR4dCA9IHN0YXRp
Y19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KS0+dGV4dFdpdGhIYXJkTGluZUJyZWFrcygpOwot
ICAgIHJldHVybiB0eHQucmVwbGFjZShiYWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCksICdcXCcp
OwotfQotCi12b2lkIFJlbmRlclRleHRBcmVhOjp2YWx1ZUNoYW5nZWQoV2lkZ2V0KikKLXsKLSAg
ICBpZiAobV91cGRhdGluZykKLSAgICAgICAgcmV0dXJuOwotICAgIHN0YXRpY19jYXN0PEhUTUxU
ZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5pbnZhbGlkYXRlVmFsdWUoKTsKLSAgICBtX2RpcnR5
ID0gdHJ1ZTsKLX0KLQotaW50IFJlbmRlclRleHRBcmVhOjpzZWxlY3Rpb25TdGFydCgpCi17Ci0g
ICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdl
dCk7Ci0gICAgcmV0dXJuIHRleHRFZGl0LT5zZWxlY3Rpb25TdGFydCgpOwotfQotCi1pbnQgUmVu
ZGVyVGV4dEFyZWE6OnNlbGVjdGlvbkVuZCgpCi17Ci0gICAgUVRleHRFZGl0ICp0ZXh0RWRpdCA9
IHN0YXRpY19jYXN0PFFUZXh0RWRpdCAqPihtX3dpZGdldCk7Ci0gICAgcmV0dXJuIHRleHRFZGl0
LT5zZWxlY3Rpb25FbmQoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6c2V0U2VsZWN0aW9u
U3RhcnQoaW50IHN0YXJ0KQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2Fz
dDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25TdGFy
dChzdGFydCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvbkVuZChpbnQg
ZW5kKQotewotICAgIFFUZXh0RWRpdCAqdGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQg
Kj4obV93aWRnZXQpOwotICAgIHRleHRFZGl0LT5zZXRTZWxlY3Rpb25FbmQoZW5kKTsKLX0KLQot
dm9pZCBSZW5kZXJUZXh0QXJlYTo6c2VsZWN0KCkKLXsKLSAgICBzdGF0aWNfY2FzdDxRVGV4dEVk
aXQgKj4obV93aWRnZXQpLT5zZWxlY3RBbGwoKTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0QXJlYTo6
c2V0U2VsZWN0aW9uUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgIFFUZXh0RWRpdCAq
dGV4dEVkaXQgPSBzdGF0aWNfY2FzdDxRVGV4dEVkaXQgKj4obV93aWRnZXQpOwotICAgIHRleHRF
ZGl0LT5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kLXN0YXJ0KTsKLX0KLQotdm9pZCBSZW5k
ZXJUZXh0QXJlYTo6c2VsZWN0aW9uQ2hhbmdlZChXaWRnZXQqKQotewotICAgIFFUZXh0RWRpdCog
dyA9IHN0YXRpY19jYXN0PFFUZXh0RWRpdCo+KG1fd2lkZ2V0KTsKLQotICAgIC8vIFdlIG9ubHkg
d2FudCB0byBjYWxsIG9uc2VsZWN0IGlmIHRoZXJlIGFjdHVhbGx5IGlzIGEgc2VsZWN0aW9uCi0g
ICAgaWYgKCF3LT5oYXNTZWxlY3RlZFRleHQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAg
IHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5vblNlbGVjdCgpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyU2xpZGVyOjpSZW5kZXJTbGlkZXIo
SFRNTElucHV0RWxlbWVudCogZWxlbWVudCkKLSAgICA6IFJlbmRlckZvcm1FbGVtZW50KGVsZW1l
bnQpCi17Ci0gICAgc2V0V2lkZ2V0KG5ldyBRU2xpZGVyKTsKLX0KLQotdm9pZCBSZW5kZXJTbGlk
ZXI6OmNhbGNNaW5NYXhXaWR0aCgpCi17Ci0gICAgS0hUTUxBc3NlcnQoIW1pbk1heEtub3duKCkp
OwotICAgIAotICAgIC8vIExldCB0aGUgd2lkZ2V0IHRlbGwgdXMgaG93IGJpZyBpdCB3YW50cyB0
byBiZS4KLSAgICBJbnRTaXplIHMod2lkZ2V0KCktPnNpemVIaW50KCkpOwotICAgIGJvb2wgd2lk
dGhTZXQgPSAhc3R5bGUoKS0+d2lkdGgoKS5pc0F1dG8oKTsKLSAgICBib29sIGhlaWdodFNldCA9
ICFzdHlsZSgpLT5oZWlnaHQoKS5pc0F1dG8oKTsKLSAgICBpZiAoaGVpZ2h0U2V0ICYmICF3aWR0
aFNldCkgewotICAgICAgICAvLyBGbGlwIHRoZSBpbnRyaW5zaWMgZGltZW5zaW9ucy4KLSAgICAg
ICAgaW50IGJhckxlbmd0aCA9IHMud2lkdGgoKTsKLSAgICAgICAgcyA9IEludFNpemUocy5oZWln
aHQoKSwgYmFyTGVuZ3RoKTsKLSAgICB9Ci0gICAgc2V0SW50cmluc2ljV2lkdGgocy53aWR0aCgp
KTsKLSAgICBzZXRJbnRyaW5zaWNIZWlnaHQocy5oZWlnaHQoKSk7Ci0gICAgCi0gICAgUmVuZGVy
Rm9ybUVsZW1lbnQ6OmNhbGNNaW5NYXhXaWR0aCgpOwotfQotCi12b2lkIFJlbmRlclNsaWRlcjo6
dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIFN0cmluZyB2YWx1ZSA9IHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT52YWx1ZSgpOwotICAgIGNvbnN0IEF0b21pY1N0cmlu
ZyYgbWluU3RyID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmdldEF0
dHJpYnV0ZShtaW5BdHRyKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1heFN0ciA9IHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1dGUobWF4QXR0cik7
Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwcmVjaXNpb24gPSBzdGF0aWNfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4obm9kZSgpKS0+Z2V0QXR0cmlidXRlKHByZWNpc2lvbkF0dHIpOwotICAgIAot
ICAgIGRvdWJsZSBtaW5WYWwgPSBtaW5TdHIuaXNOdWxsKCkgPyAwLjAgOiBtaW5TdHIuZGVwcmVj
YXRlZFN0cmluZygpLnRvRG91YmxlKCk7Ci0gICAgZG91YmxlIG1heFZhbCA9IG1heFN0ci5pc051
bGwoKSA/IDEwMC4wIDogbWF4U3RyLmRlcHJlY2F0ZWRTdHJpbmcoKS50b0RvdWJsZSgpOwotICAg
IG1pblZhbCA9IG1pbihtaW5WYWwsIG1heFZhbCk7IC8vIE1ha2Ugc3VyZSB0aGUgcmFuZ2UgaXMg
c2FuZS4KLSAgICAKLSAgICBkb3VibGUgdmFsID0gdmFsdWUuaXNOdWxsKCkgPyAobWF4VmFsICsg
bWluVmFsKS8yLjAgOiB2YWx1ZS5kZXByZWNhdGVkU3RyaW5nKCkudG9Eb3VibGUoKTsKLSAgICB2
YWwgPSBtYXgobWluVmFsLCBtaW4odmFsLCBtYXhWYWwpKTsgLy8gTWFrZSBzdXJlIHZhbCBpcyB3
aXRoaW4gbWluL21heC4KLSAgICAKLSAgICAvLyBGb3JjZSBpbnRlZ2VyIHZhbHVlIGlmIG5vdCBm
bG9hdC4KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKHByZWNpc2lvbiwgImZsb2F0IikpCi0g
ICAgICAgIHZhbCA9IChpbnQpKHZhbCArIDAuNSk7Ci0KLSAgICBzdGF0aWNfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoU3RyaW5nOjpudW1iZXIodmFsKSk7Ci0KLSAg
ICBRU2xpZGVyKiBzbGlkZXIgPSAoUVNsaWRlciopd2lkZ2V0KCk7Ci0gICAgIAotICAgIHNsaWRl
ci0+c2V0TWluVmFsdWUobWluVmFsKTsKLSAgICBzbGlkZXItPnNldE1heFZhbHVlKG1heFZhbCk7
Ci0gICAgc2xpZGVyLT5zZXRWYWx1ZSh2YWwpOwotCi0gICAgUmVuZGVyRm9ybUVsZW1lbnQ6OnVw
ZGF0ZUZyb21FbGVtZW50KCk7Ci19Ci0KLXZvaWQgUmVuZGVyU2xpZGVyOjp2YWx1ZUNoYW5nZWQo
V2lkZ2V0KikKLXsKLSAgICBRU2xpZGVyKiBzbGlkZXIgPSBzdGF0aWNfY2FzdDxRU2xpZGVyKj4o
d2lkZ2V0KCkpOwotCi0gICAgZG91YmxlIHZhbCA9IHNsaWRlci0+dmFsdWUoKTsKLSAgICBjb25z
dCBBdG9taWNTdHJpbmcmIHByZWNpc2lvbiA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQq
Pihub2RlKCkpLT5nZXRBdHRyaWJ1dGUocHJlY2lzaW9uQXR0cik7Ci0KLSAgICAvLyBGb3JjZSBp
bnRlZ2VyIHZhbHVlIGlmIG5vdCBmbG9hdC4KLSAgICBpZiAoIWVxdWFsSWdub3JpbmdDYXNlKHBy
ZWNpc2lvbiwgImZsb2F0IikpCi0gICAgICAgIHZhbCA9IChpbnQpKHZhbCArIDAuNSk7Ci0KLSAg
ICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoU3RyaW5n
OjpudW1iZXIodmFsKSk7Ci0gICAgCi0gICAgLy8gRmlyZSB0aGUgImlucHV0IiBET00gZXZlbnQu
Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmRpc3BhdGNoSFRN
TEV2ZW50KGlucHV0RXZlbnQsIHRydWUsIGZhbHNlKTsKLX0KLQotfQorfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTIzMSw2ICsyMzEsMjYgQEAKIAkJN0U2RkVFRDkwODk4
NTgyMzAwQzQ0QzNGIC8qIFdlYkNvcmVTY3JpcHREZWJ1Z2dlci5tbSBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdFNkZFRUQ3MDg5ODU4MjMwMEM0NEMzRiAv
KiBXZWJDb3JlU2NyaXB0RGVidWdnZXIubW0gKi87IH07CiAJCTgxMTY4OTVGMDlGMkE0QTAwMDc3
MkNBMCAvKiBTVkdUUmVmRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4MTE2ODk1RDA5RjJBNEEwMDA3NzJDQTAgLyogU1ZHVFJlZkVsZW1l
bnQuY3BwICovOyB9OwogCQk4MTE2ODk2MDA5RjJBNEEwMDA3NzJDQTAgLyogU1ZHVFJlZkVsZW1l
bnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDgxMTY4
OTVFMDlGMkE0QTAwMDc3MkNBMCAvKiBTVkdUUmVmRWxlbWVudC5oICovOyB9OworCQk4NUI3MThC
OTBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyRmllbGRzZXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVCNzE4QTUwQTE1NjU1MjAwMEMwQzNDIC8q
IFJlbmRlckZpZWxkc2V0LmNwcCAqLzsgfTsKKwkJODVCNzE4QkEwQTE1NjU1MjAwMEMwQzNDIC8q
IFJlbmRlckZpZWxkc2V0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA4NUI3MThBNjBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyRmllbGRzZXQuaCAqLzsg
fTsKKwkJODVCNzE4QkIwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckZpbGVCdXR0b24uY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVCNzE4QTcwQTE1
NjU1MjAwMEMwQzNDIC8qIFJlbmRlckZpbGVCdXR0b24uY3BwICovOyB9OworCQk4NUI3MThCQzBB
MTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyRmlsZUJ1dHRvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVCNzE4QTgwQTE1NjU1MjAwMEMwQzNDIC8qIFJl
bmRlckZpbGVCdXR0b24uaCAqLzsgfTsKKwkJODVCNzE4QkQwQTE1NjU1MjAwMEMwQzNDIC8qIFJl
bmRlckZvcm1FbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDg1QjcxOEE5MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJGb3JtRWxlbWVudC5j
cHAgKi87IH07CisJCTg1QjcxOEJFMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJGb3JtRWxlbWVu
dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVCNzE4
QUEwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckZvcm1FbGVtZW50LmggKi87IH07CisJCTg1Qjcx
OEJGMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJJbWFnZUJ1dHRvbi5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NUI3MThBQjBBMTU2NTUyMDAwQzBD
M0MgLyogUmVuZGVySW1hZ2VCdXR0b24uY3BwICovOyB9OworCQk4NUI3MThDMDBBMTU2NTUyMDAw
QzBDM0MgLyogUmVuZGVySW1hZ2VCdXR0b24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IDg1QjcxOEFDMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJJbWFn
ZUJ1dHRvbi5oICovOyB9OworCQk4NUI3MThDMTBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyTGFi
ZWwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVC
NzE4QUQwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxhYmVsLmNwcCAqLzsgfTsKKwkJODVCNzE4
QzIwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxhYmVsLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NUI3MThBRTBBMTU2NTUyMDAwQzBDM0MgLyogUmVu
ZGVyTGFiZWwuaCAqLzsgfTsKKwkJODVCNzE4QzMwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxl
Z2VuZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4
NUI3MThBRjBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyTGVnZW5kLmNwcCAqLzsgfTsKKwkJODVC
NzE4QzQwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxlZ2VuZC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVCNzE4QjAwQTE1NjU1MjAwMEMwQzNDIC8q
IFJlbmRlckxlZ2VuZC5oICovOyB9OworCQk4NUI3MThDNTBBMTU2NTUyMDAwQzBDM0MgLyogUmVu
ZGVyTGluZUVkaXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gODVCNzE4QjEwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxpbmVFZGl0LmNwcCAqLzsg
fTsKKwkJODVCNzE4QzYwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxpbmVFZGl0LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NUI3MThCMjBBMTU2NTUy
MDAwQzBDM0MgLyogUmVuZGVyTGluZUVkaXQuaCAqLzsgfTsKKwkJODVCNzE4QzcwQTE1NjU1MjAw
MEMwQzNDIC8qIFJlbmRlclNlbGVjdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA4NUI3MThCMzBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyU2VsZWN0
LmNwcCAqLzsgfTsKKwkJODVCNzE4QzgwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlclNlbGVjdC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODVCNzE4QjQw
QTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlclNlbGVjdC5oICovOyB9OworCQk4NUI3MThDOTBBMTU2
NTUyMDAwQzBDM0MgLyogUmVuZGVyU2xpZGVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg1QjcxOEI1MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJT
bGlkZXIuY3BwICovOyB9OworCQk4NUI3MThDQTBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyU2xp
ZGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NUI3
MThCNjBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyU2xpZGVyLmggKi87IH07CisJCTg1QjcxOENC
MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJUZXh0QXJlYS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NUI3MThCNzBBMTU2NTUyMDAwQzBDM0MgLyog
UmVuZGVyVGV4dEFyZWEuY3BwICovOyB9OworCQk4NUI3MThDQzBBMTU2NTUyMDAwQzBDM0MgLyog
UmVuZGVyVGV4dEFyZWEuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDg1QjcxOEI4MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJUZXh0QXJlYS5oICovOyB9
OwogCQk5MzAzMkNDODA5QUVDMzQzMDBGODJBMTggLyogUGF0aENHLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDkzMDMyQ0M3MDlBRUMzNDMwMEY4MkEx
OCAvKiBQYXRoQ0cuY3BwICovOyB9OwogCQk5MzAzMkNDQTA5QUVDMzRCMDBGODJBMTggLyogUGF0
aC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTMwMzJD
QzkwOUFFQzM0QjAwRjgyQTE4IC8qIFBhdGguaCAqLzsgfTsKIAkJOTMwNUIyNEQwOThGMUI2QjAw
QzI4ODU1IC8qIFRpbWVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA5MzA1QjI0QzA5OEYxQjZCMDBDMjg4NTUgLyogVGltZXIuaCAqLzsgfTsKQEAgLTEy
MTcsOCArMTIzNyw2IEBACiAJCUJDRUE0ODZFMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbGV4
aWJsZUJveC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFQTQ4MkYwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckZsZXhpYmxlQm94LmggKi87IH07CiAJ
CUJDRUE0ODZGMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbG93LmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODMwMDk3RDkzMDIwMDk0QzlF
NCAvKiBSZW5kZXJGbG93LmNwcCAqLzsgfTsKIAkJQkNFQTQ4NzAwOTdEOTMwMjAwOTRDOUU0IC8q
IFJlbmRlckZsb3cuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEJDRUE0ODMxMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbG93LmggKi87IH07Ci0JCUJD
RUE0ODcxMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZm9ybS5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgzMjA5N0Q5MzAyMDA5NEM5RTQg
LyogcmVuZGVyX2Zvcm0uY3BwICovOyB9OwotCQlCQ0VBNDg3MjA5N0Q5MzAyMDA5NEM5RTQgLyog
cmVuZGVyX2Zvcm0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEJDRUE0ODMzMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZm9ybS5oICovOyB9OwogCQlC
Q0VBNDg3NTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW1hZ2UuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MzYwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckltYWdlLmNwcCAqLzsgfTsKIAkJQkNFQTQ4NzYwOTdEOTMwMjAwOTRDOUU0IC8q
IFJlbmRlckltYWdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBCQ0VBNDgzNzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW1hZ2UuaCAqLzsgfTsKIAkJ
QkNFQTQ4NzcwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlcklubGluZS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgzODA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVySW5saW5lLmNwcCAqLzsgfTsKQEAgLTE1OTQsNiArMTYxMiwyNiBAQAogCQk4
NEMwRkEyQzA1MkI5NjZEMDAwNDQwQTEgLyogc291dGhXZXN0UmVzaXplQ3Vyc29yLnRpZmYgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS50aWZm
OyBwYXRoID0gc291dGhXZXN0UmVzaXplQ3Vyc29yLnRpZmY7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTg0QzBGQTJEMDUyQjk2NkQwMDA0NDBBMSAvKiB3YWl0Q3Vyc29yLnRpZmYgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS50aWZm
OyBwYXRoID0gd2FpdEN1cnNvci50aWZmOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4
NEMwRkEyRTA1MkI5NjZEMDAwNDQwQTEgLyogd2VzdFJlc2l6ZUN1cnNvci50aWZmICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UudGlmZjsgcGF0
aCA9IHdlc3RSZXNpemVDdXJzb3IudGlmZjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
ODVCNzE4QTUwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckZpZWxkc2V0LmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJGaWVsZHNldC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCTg1QjcxOEE2MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJG
aWVsZHNldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyRmllbGRz
ZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODVCNzE4QTcwQTE1NjU1MjAwMEMw
QzNDIC8qIFJlbmRlckZpbGVCdXR0b24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFJlbmRlckZpbGVCdXR0b24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQk4NUI3MThBODBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyRmlsZUJ1dHRvbi5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyRmlsZUJ1dHRvbi5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQk4NUI3MThBOTBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVy
Rm9ybUVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJl
bmRlckZvcm1FbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODVCNzE4
QUEwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckZvcm1FbGVtZW50LmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJGb3JtRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQk4NUI3MThBQjBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVySW1hZ2VCdXR0
b24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlckltYWdl
QnV0dG9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODVCNzE4QUMwQTE1NjU1
MjAwMEMwQzNDIC8qIFJlbmRlckltYWdlQnV0dG9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBSZW5kZXJJbWFnZUJ1dHRvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQk4NUI3MThBRDBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyTGFiZWwuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlckxhYmVsLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODVCNzE4QUUwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxh
YmVsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJMYWJlbC5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4NUI3MThBRjBBMTU2NTUyMDAwQzBDM0MgLyog
UmVuZGVyTGVnZW5kLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBS
ZW5kZXJMZWdlbmQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4NUI3MThCMDBB
MTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyTGVnZW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBSZW5kZXJMZWdlbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
ODVCNzE4QjEwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxpbmVFZGl0LmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJMaW5lRWRpdC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCTg1QjcxOEIyMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJM
aW5lRWRpdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyTGluZUVk
aXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODVCNzE4QjMwQTE1NjU1MjAwMEMw
QzNDIC8qIFJlbmRlclNlbGVjdC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gUmVuZGVyU2VsZWN0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJODVC
NzE4QjQwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlclNlbGVjdC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyU2VsZWN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCTg1QjcxOEI1MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJTbGlkZXIuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlclNsaWRlci5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTg1QjcxOEI2MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5k
ZXJTbGlkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlclNsaWRl
ci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4NUI3MThCNzBBMTU2NTUyMDAwQzBD
M0MgLyogUmVuZGVyVGV4dEFyZWEuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IFJlbmRlclRleHRBcmVhLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
ODVCNzE4QjgwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlclRleHRBcmVhLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJUZXh0QXJlYS5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk5MzAzMkNDNzA5QUVDMzQzMDBGODJBMTggLyogUGF0aENHLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhdGhDRy5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTkzMDMyQ0M5MDlBRUMzNEIwMEY4MkExOCAvKiBQYXRoLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBhdGguaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJOTMwNUIyNEMwOThGMUI2QjAwQzI4ODU1IC8qIFRpbWVyLmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRpbWVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CkBAIC0yNjI1LDggKzI2NjMsNiBAQAogCQlCQ0VBNDgyRjA5N0Q5MzAyMDA5NEM5RTQgLyog
UmVuZGVyRmxleGlibGVCb3guaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJl
bmRlckZsZXhpYmxlQm94Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0ODMw
MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbG93LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBSZW5kZXJGbG93LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJQkNFQTQ4MzEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckZsb3cuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlckZsb3cuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKLQkJQkNFQTQ4MzIwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mb3JtLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSByZW5kZXJfZm9ybS5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCUJDRUE0ODMzMDk3RDkzMDIwMDk0QzlFNCAvKiBy
ZW5kZXJfZm9ybS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gcmVuZGVyX2Zv
cm0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4MzYwOTdEOTMwMjAwOTRD
OUU0IC8qIFJlbmRlckltYWdlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBSZW5kZXJJbWFnZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0
ODM3MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbWFnZS5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gUmVuZGVySW1hZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJQkNFQTQ4MzgwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlcklubGluZS5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVySW5saW5lLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTQzNTUsOCArNDM5MSw2IEBACiAJCQkJQkNFQTQ4MUEwOTdE
OTMwMjAwOTRDOUU0IC8qIElubGluZVRleHRCb3guY3BwICovLAogCQkJCUJDRUE0ODFCMDk3RDkz
MDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmggKi8sCiAJCQkJOTM1QzQ3NjAwOUFDNENEMTAw
QTZBQUI0IC8qIExlbmd0aC5oICovLAotCQkJCUJDRUE0ODMyMDk3RDkzMDIwMDk0QzlFNCAvKiBy
ZW5kZXJfZm9ybS5jcHAgKi8sCi0JCQkJQkNFQTQ4MzMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRl
cl9mb3JtLmggKi8sCiAJCQkJQkNFQTQ4M0MwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9saW5l
LmNwcCAqLywKIAkJCQlCQ0VBNDgzRDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2xpbmUuaCAq
LywKIAkJCQlCQ0VBNDgzRTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2xpc3QuY3BwICovLApA
QCAtNDM4MSwxMCArNDQxNSwxNiBAQAogCQkJCUJDRUE0ODJEMDk3RDkzMDIwMDk0QzlFNCAvKiBS
ZW5kZXJDb250YWluZXIuaCAqLywKIAkJCQk5M0I3MEVCMDA5RUVFNUI1MDA5RDg0NjggLyogUmVu
ZGVyRW1wdHlBcHBsZXQuY3BwICovLAogCQkJCTkzQjcwRUIxMDlFRUU1QjUwMDlEODQ2OCAvKiBS
ZW5kZXJFbXB0eUFwcGxldC5oICovLAorCQkJCTg1QjcxOEE1MEExNTY1NTIwMDBDMEMzQyAvKiBS
ZW5kZXJGaWVsZHNldC5jcHAgKi8sCisJCQkJODVCNzE4QTYwQTE1NjU1MjAwMEMwQzNDIC8qIFJl
bmRlckZpZWxkc2V0LmggKi8sCisJCQkJODVCNzE4QTcwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRl
ckZpbGVCdXR0b24uY3BwICovLAorCQkJCTg1QjcxOEE4MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5k
ZXJGaWxlQnV0dG9uLmggKi8sCiAJCQkJQkNFQTQ4MkUwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRl
ckZsZXhpYmxlQm94LmNwcCAqLywKIAkJCQlCQ0VBNDgyRjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVu
ZGVyRmxleGlibGVCb3guaCAqLywKIAkJCQlCQ0VBNDgzMDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVu
ZGVyRmxvdy5jcHAgKi8sCiAJCQkJQkNFQTQ4MzEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckZs
b3cuaCAqLywKKwkJCQk4NUI3MThBOTBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyRm9ybUVsZW1l
bnQuY3BwICovLAorCQkJCTg1QjcxOEFBMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJGb3JtRWxl
bWVudC5oICovLAogCQkJCUE4NzFERUNDMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJGcmFtZS5j
cHAgKi8sCiAJCQkJQTg3MURFQ0IwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lLmggKi8s
CiAJCQkJQTg3MURFQ0EwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lU2V0LmNwcCAqLywK
QEAgLTQzOTMsMTAgKzQ0MzMsMTggQEAKIAkJCQlCQ0VBNDgyQjA5N0Q5MzAyMDA5NEM5RTQgLyog
UmVuZGVySFRNTENhbnZhcy5oICovLAogCQkJCUJDRUE0ODM2MDk3RDkzMDIwMDk0QzlFNCAvKiBS
ZW5kZXJJbWFnZS5jcHAgKi8sCiAJCQkJQkNFQTQ4MzcwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRl
ckltYWdlLmggKi8sCisJCQkJODVCNzE4QUIwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckltYWdl
QnV0dG9uLmNwcCAqLywKKwkJCQk4NUI3MThBQzBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVySW1h
Z2VCdXR0b24uaCAqLywKIAkJCQlCQ0VBNDgzODA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW5s
aW5lLmNwcCAqLywKIAkJCQlCQ0VBNDgzOTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW5saW5l
LmggKi8sCisJCQkJODVCNzE4QUQwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxhYmVsLmNwcCAq
LywKKwkJCQk4NUI3MThBRTBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyTGFiZWwuaCAqLywKIAkJ
CQlCQ0VBNDgzQTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyTGF5ZXIuY3BwICovLAogCQkJCUJD
RUE0ODNCMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJMYXllci5oICovLAorCQkJCTg1QjcxOEFG
MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJMZWdlbmQuY3BwICovLAorCQkJCTg1QjcxOEIwMEEx
NTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJMZWdlbmQuaCAqLywKKwkJCQk4NUI3MThCMTBBMTU2NTUy
MDAwQzBDM0MgLyogUmVuZGVyTGluZUVkaXQuY3BwICovLAorCQkJCTg1QjcxOEIyMEExNTY1NTIw
MDBDMEMzQyAvKiBSZW5kZXJMaW5lRWRpdC5oICovLAogCQkJCUJDRUE0ODQwMDk3RDkzMDIwMDk0
QzlFNCAvKiBSZW5kZXJPYmplY3QuY3BwICovLAogCQkJCUJDRUE0ODQxMDk3RDkzMDIwMDk0QzlF
NCAvKiBSZW5kZXJPYmplY3QuaCAqLywKIAkJCQlBODcxREVDODBBMTUzMEM3MDBCMTJBNjggLyog
UmVuZGVyUGFydC5jcHAgKi8sCkBAIC00NDA1LDYgKzQ0NTMsMTAgQEAKIAkJCQlBODcxREVDRDBB
MTUzMEM3MDBCMTJBNjggLyogUmVuZGVyUGFydE9iamVjdC5oICovLAogCQkJCUE4NzFERkRFMEEx
NTM3NkIwMEIxMkE2OCAvKiBSZW5kZXJSZXBsYWNlZC5jcHAgKi8sCiAJCQkJQTg3MURGREYwQTE1
Mzc2QjAwQjEyQTY4IC8qIFJlbmRlclJlcGxhY2VkLmggKi8sCisJCQkJODVCNzE4QjMwQTE1NjU1
MjAwMEMwQzNDIC8qIFJlbmRlclNlbGVjdC5jcHAgKi8sCisJCQkJODVCNzE4QjQwQTE1NjU1MjAw
MEMwQzNDIC8qIFJlbmRlclNlbGVjdC5oICovLAorCQkJCTg1QjcxOEI1MEExNTY1NTIwMDBDMEMz
QyAvKiBSZW5kZXJTbGlkZXIuY3BwICovLAorCQkJCTg1QjcxOEI2MEExNTY1NTIwMDBDMEMzQyAv
KiBSZW5kZXJTbGlkZXIuaCAqLywKIAkJCQlBOERGNEFFMjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVu
ZGVyVGFibGUuY3BwICovLAogCQkJCUE4REY0QUUxMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJU
YWJsZS5oICovLAogCQkJCUE4REY0QUUwMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZUNl
bGwuY3BwICovLApAQCAtNDQxNyw2ICs0NDY5LDggQEAKIAkJCQlBOERGNEFFNTA5ODBDNDJDMDA1
Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmggKi8sCiAJCQkJQkNFQTQ4NEMwOTdEOTMwMjAw
OTRDOUU0IC8qIFJlbmRlclRleHQuY3BwICovLAogCQkJCUJDRUE0ODREMDk3RDkzMDIwMDk0QzlF
NCAvKiBSZW5kZXJUZXh0LmggKi8sCisJCQkJODVCNzE4QjcwQTE1NjU1MjAwMEMwQzNDIC8qIFJl
bmRlclRleHRBcmVhLmNwcCAqLywKKwkJCQk4NUI3MThCODBBMTU2NTUyMDAwQzBDM0MgLyogUmVu
ZGVyVGV4dEFyZWEuaCAqLywKIAkJCQlBQjY3RDFBNjA5N0YzQUUzMDBGOTM5MkUgLyogUmVuZGVy
VGV4dEZpZWxkLmNwcCAqLywKIAkJCQlBQjY3RDFBNzA5N0YzQUUzMDBGOTM5MkUgLyogUmVuZGVy
VGV4dEZpZWxkLmggKi8sCiAJCQkJQkNFQTQ4NEUwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRl
eHRGcmFnbWVudC5jcHAgKi8sCkBAIC00OTM5LDcgKzQ5OTMsNiBAQAogCQkJCUJDRUE0ODZDMDk3
RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJDb250YWluZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCUJD
RUE0ODZFMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbGV4aWJsZUJveC5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQkNFQTQ4NzAwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckZsb3cuaCBpbiBIZWFk
ZXJzICovLAotCQkJCUJDRUE0ODcyMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZm9ybS5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4NzYwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckltYWdl
LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg3ODA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
SW5saW5lLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg3QTA5N0Q5MzAyMDA5NEM5RTQgLyog
UmVuZGVyTGF5ZXIuaCBpbiBIZWFkZXJzICovLApAQCAtNTIyMyw2ICs1Mjc2LDE2IEBACiAJCQkJ
QThDRkYwNEUwQTE1NEYwOTAwMEE0MjM0IC8qIEF1dG9UYWJsZUxheW91dC5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQThDRkYwNEYwQTE1NEYwOTAwMEE0MjM0IC8qIEZpeGVkVGFibGVMYXlvdXQuaCBp
biBIZWFkZXJzICovLAogCQkJCUE4Q0ZGMDUxMEExNTRGMDkwMDBBNDIzNCAvKiBUYWJsZUxheW91
dC5oIGluIEhlYWRlcnMgKi8sCisJCQkJODVCNzE4QkEwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRl
ckZpZWxkc2V0LmggaW4gSGVhZGVycyAqLywKKwkJCQk4NUI3MThCQzBBMTU2NTUyMDAwQzBDM0Mg
LyogUmVuZGVyRmlsZUJ1dHRvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJODVCNzE4QkUwQTE1NjU1
MjAwMEMwQzNDIC8qIFJlbmRlckZvcm1FbGVtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQk4NUI3
MThDMDBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVySW1hZ2VCdXR0b24uaCBpbiBIZWFkZXJzICov
LAorCQkJCTg1QjcxOEMyMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJMYWJlbC5oIGluIEhlYWRl
cnMgKi8sCisJCQkJODVCNzE4QzQwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxlZ2VuZC5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJODVCNzE4QzYwQTE1NjU1MjAwMEMwQzNDIC8qIFJlbmRlckxpbmVF
ZGl0LmggaW4gSGVhZGVycyAqLywKKwkJCQk4NUI3MThDODBBMTU2NTUyMDAwQzBDM0MgLyogUmVu
ZGVyU2VsZWN0LmggaW4gSGVhZGVycyAqLywKKwkJCQk4NUI3MThDQTBBMTU2NTUyMDAwQzBDM0Mg
LyogUmVuZGVyU2xpZGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQk4NUI3MThDQzBBMTU2NTUyMDAw
QzBDM0MgLyogUmVuZGVyVGV4dEFyZWEuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9u
bHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtNTczMiw3ICs1Nzk1
LDYgQEAKIAkJCQlCQ0VBNDg2QjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyQ29udGFpbmVyLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODZEMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJG
bGV4aWJsZUJveC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg2RjA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVyRmxvdy5jcHAgaW4gU291cmNlcyAqLywKLQkJCQlCQ0VBNDg3MTA5N0Q5MzAy
MDA5NEM5RTQgLyogcmVuZGVyX2Zvcm0uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4NzUw
OTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckltYWdlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJD
RUE0ODc3MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbmxpbmUuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJQkNFQTQ4NzkwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckxheWVyLmNwcCBpbiBTb3Vy
Y2VzICovLApAQCAtNTk5Miw2ICs2MDU0LDE2IEBACiAJCQkJQTg3MURGRTUwQTE1Mzc2QjAwQjEy
QTY4IC8qIFJlbmRlcldpZGdldC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBOENGRjA0RDBBMTU0
RjA5MDAwQTQyMzQgLyogRml4ZWRUYWJsZUxheW91dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlB
OENGRjA1MDBBMTU0RjA5MDAwQTQyMzQgLyogQXV0b1RhYmxlTGF5b3V0LmNwcCBpbiBTb3VyY2Vz
ICovLAorCQkJCTg1QjcxOEI5MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJGaWVsZHNldC5jcHAg
aW4gU291cmNlcyAqLywKKwkJCQk4NUI3MThCQjBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyRmls
ZUJ1dHRvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk4NUI3MThCRDBBMTU2NTUyMDAwQzBDM0Mg
LyogUmVuZGVyRm9ybUVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJODVCNzE4QkYwQTE1
NjU1MjAwMEMwQzNDIC8qIFJlbmRlckltYWdlQnV0dG9uLmNwcCBpbiBTb3VyY2VzICovLAorCQkJ
CTg1QjcxOEMxMEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJMYWJlbC5jcHAgaW4gU291cmNlcyAq
LywKKwkJCQk4NUI3MThDMzBBMTU2NTUyMDAwQzBDM0MgLyogUmVuZGVyTGVnZW5kLmNwcCBpbiBT
b3VyY2VzICovLAorCQkJCTg1QjcxOEM1MEExNTY1NTIwMDBDMEMzQyAvKiBSZW5kZXJMaW5lRWRp
dC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk4NUI3MThDNzBBMTU2NTUyMDAwQzBDM0MgLyogUmVu
ZGVyU2VsZWN0LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTg1QjcxOEM5MEExNTY1NTIwMDBDMEMz
QyAvKiBSZW5kZXJTbGlkZXIuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJODVCNzE4Q0IwQTE1NjU1
MjAwMEMwQzNDIC8qIFJlbmRlclRleHRBcmVhLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2Vi
Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9DaGFuZ2VMb2cJKHJldmlzaW9u
IDE0MzU5KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwx
MTYgQEAKKzIwMDYtMDUtMTMgIFNhbSBXZWluaWcgIDxzYW0ud2VpbmlnQGdtYWlsLmNvbT4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXQVJOSU5HOiBO
TyBURVNUIENBU0VTIEFEREVEIE9SIENIQU5HRUQKKworICAgICAgICAqIFdlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBodG1sL0hUTUxCdXR0b25FbGVtZW50LmNw
cDoKKyAgICAgICAgKiBodG1sL0hUTUxGaWVsZFNldEVsZW1lbnQuY3BwOgorICAgICAgICAqIGh0
bWwvSFRNTEZvcm1FbGVtZW50LmNwcDoKKyAgICAgICAgKiBodG1sL0hUTUxJbnB1dEVsZW1lbnQu
Y3BwOgorICAgICAgICAqIGh0bWwvSFRNTExhYmVsRWxlbWVudC5jcHA6CisgICAgICAgICogaHRt
bC9IVE1MTGVnZW5kRWxlbWVudC5jcHA6CisgICAgICAgICogaHRtbC9IVE1MT2JqZWN0RWxlbWVu
dC5jcHA6CisgICAgICAgICogaHRtbC9IVE1MT3B0aW9uRWxlbWVudC5jcHA6CisgICAgICAgICog
aHRtbC9IVE1MU2VsZWN0RWxlbWVudC5jcHA6CisgICAgICAgICogaHRtbC9IVE1MVGV4dEFyZWFF
bGVtZW50LmNwcDoKKyAgICAgICAgKiBrd3EvS1dRQ29tYm9Cb3gubW06CisgICAgICAgICoga3dx
L0tXUUZpbGVCdXR0b24ubW06CisgICAgICAgICoga3dxL0tXUUxpc3RCb3gubW06CisgICAgICAg
ICoga3dxL0tXUVNsaWRlci5tbToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMvV2ViQ29yZVRleHRG
aWVsZC5tbToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyRmllbGRzZXQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZpZWxkc2V0OjpSZW5kZXJGaWVsZHNldCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJGaWVsZHNldDo6ZmluZExlZ2VuZCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJGaWVsZHNldDo6cGFpbnRCb3JkZXJNaW51c0xlZ2VuZCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJGaWVsZHNldDo6c2V0U3R5bGUpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJGaWVsZHNldC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZpZWxkc2V0
OjpyZW5kZXJOYW1lKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyRmlsZUJ1dHRvbi5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRmlsZUJ1dHRvbjo6UmVuZGVyRmlsZUJ1
dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJGaWxlQnV0dG9uOjpjYWxjTWluTWF4V2lk
dGgpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRmlsZUJ1dHRvbjo6Y2xpY2spOgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJGaWxlQnV0dG9uLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyRmlsZUJ1dHRvbjo6cmVuZGVyTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJGaWxlQnV0dG9uOjpjYWxjUmVwbGFjZWRIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyRmlsZUJ1dHRvbjo6aXNFZGl0YWJsZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckZv
cm1FbGVtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJGb3JtRWxlbWVu
dDo6UmVuZGVyRm9ybUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRm9ybUVsZW1l
bnQ6OmJhc2VsaW5lUG9zaXRpb24pOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJGb3JtRWxl
bWVudC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZvcm1FbGVtZW50OjpyZW5k
ZXJOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZvcm1FbGVtZW50Ojppc0Zvcm1FbGVt
ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZvcm1FbGVtZW50Ojpib3JkZXJUb3ApOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRm9ybUVsZW1lbnQ6OmJvcmRlckJvdHRvbSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJGb3JtRWxlbWVudDo6Ym9yZGVyTGVmdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJGb3JtRWxlbWVudDo6Ym9yZGVyUmlnaHQpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyRm9ybUVsZW1lbnQ6OnBhZGRpbmdUb3ApOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyRm9ybUVsZW1lbnQ6OnBhZGRpbmdCb3R0b20pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
Rm9ybUVsZW1lbnQ6OnBhZGRpbmdMZWZ0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZvcm1F
bGVtZW50OjpwYWRkaW5nUmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRm9ybUVsZW1l
bnQ6OmNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZv
cm1FbGVtZW50OjppbnRyaW5zaWNNYXJnaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRm9y
bUVsZW1lbnQ6OmlzRWRpdGFibGUpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJJbWFnZUJ1
dHRvbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVySW1hZ2VCdXR0b246OlJl
bmRlckltYWdlQnV0dG9uKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVySW1hZ2VCdXR0b24u
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFnZUJ1dHRvbjo6cmVuZGVyTmFt
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFnZUJ1dHRvbjo6aXNJbWFnZUJ1dHRvbik6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxhYmVsLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJMYWJlbDo6UmVuZGVyTGFiZWwpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJMYWJlbC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxhYmVsOjpyZW5k
ZXJOYW1lKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyTGVnZW5kLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJMZWdlbmQ6OlJlbmRlckxlZ2VuZCk6CisgICAgICAgICog
cmVuZGVyaW5nL1JlbmRlckxlZ2VuZC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckxlZ2VuZDo6cmVuZGVyTmFtZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxpbmVFZGl0
LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJMaW5lRWRpdDo6UmVuZGVyTGlu
ZUVkaXQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJMaW5lRWRpdC5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlckxpbmVFZGl0OjpyZW5kZXJOYW1lKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckxpbmVFZGl0OjpjYWxjUmVwbGFjZWRIZWlnaHQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyTGluZUVkaXQ6OmNhbkhhdmVJbnRyaW5zaWNNYXJnaW5zKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckxpbmVFZGl0Ojppc1RleHRGaWVsZCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJMaW5lRWRpdDo6aXNFZGl0YWJsZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
clNlbGVjdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU2VsZWN0OjpSZW5k
ZXJTZWxlY3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU2VsZWN0OjpzZXRXaWRnZXRXcml0
aW5nRGlyZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNlbGVjdDo6c2V0U3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU2VsZWN0Ojp1cGRhdGVGcm9tRWxlbWVudCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJTZWxlY3Q6OmJhc2VsaW5lUG9zaXRpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyU2VsZWN0OjpjYWxjTWluTWF4V2lkdGgpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyU2VsZWN0OjpsYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU2Vs
ZWN0Ojp2YWx1ZUNoYW5nZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJTZWxlY3QuaDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTZWxlY3Q6OnJlbmRlck5hbWUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyU2VsZWN0OjpjYWxjUmVwbGFjZWRIZWlnaHQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyU2VsZWN0OjpjYW5IYXZlSW50cmluc2ljTWFyZ2lucyk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJTZWxlY3Q6OnNlbGVjdGlvbkNoYW5nZWQpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyU2VsZWN0OjpzZXRTZWxlY3Rpb25DaGFuZ2VkKToKKyAgICAgICAgKiBy
ZW5kZXJpbmcvUmVuZGVyU2xpZGVyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJTbGlkZXI6OmNhbGNNaW5NYXhXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTbGlk
ZXI6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyU2xpZGVy
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU2xpZGVyOjpyZW5kZXJOYW1lKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNsaWRlcjo6Y2FuSGF2ZUludHJpbnNpY01hcmdpbnMp
OgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0QXJlYS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dEFyZWE6OlJlbmRlclRleHRBcmVhKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRleHRBcmVhOjpjYWxjTWluTWF4V2lkdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGV4dEFyZWE6OnNldFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRl
eHRBcmVhOjpzZWxlY3Rpb25TdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0QXJl
YTo6c2VsZWN0aW9uRW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRBcmVhOjpzZXRT
ZWxlY3Rpb25TdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0QXJlYTo6c2V0U2Vs
ZWN0aW9uRW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRBcmVhOjpzZWxlY3QpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dEFyZWE6OnNldFNlbGVjdGlvblJhbmdlKToKKyAg
ICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dEFyZWEuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUZXh0QXJlYTo6cmVuZGVyTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUZXh0QXJlYTo6aXNUZXh0QXJlYSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0QXJl
YTo6aXNFZGl0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dEFyZWE6OmNhbkhhdmVJ
bnRyaW5zaWNNYXJnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRBcmVhOjppc0Vk
aXRhYmxlKToKKwogMjAwNi0wNS0xMyAgS2V2aW4gTS4gT2xsaXZpZXIgIDxrZXZpbm9AdGhlb2xs
aXZpZXJzLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiwgbGFuZGVkIGJ5IGFwLgpJ
bmRleDogV2ViQ29yZS9rd3EvS1dRQ29tYm9Cb3gubW0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9r
d3EvS1dRQ29tYm9Cb3gubW0JKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9rd3EvS1dRQ29t
Ym9Cb3gubW0JKHdvcmtpbmcgY29weSkKQEAgLTI3LDE1ICsyNywxNSBAQAogI2ltcG9ydCAiS1dR
Q29tYm9Cb3guaCIKIAogI2ltcG9ydCAiQmxvY2tFeGNlcHRpb25zLmgiCisjaW1wb3J0ICJGb250
LmgiCisjaW1wb3J0ICJGb250RGF0YS5oIgogI2ltcG9ydCAiRm91bmRhdGlvbkV4dHJhcy5oIgog
I2ltcG9ydCAiRnJhbWVNYWMuaCIKICNpbXBvcnQgIktXUUxpbmVFZGl0LmgiCiAjaW1wb3J0ICJX
ZWJDb3JlRnJhbWVCcmlkZ2UuaCIKLSNpbXBvcnQgIkZvbnREYXRhLmgiCi0jaW1wb3J0ICJXZWJU
ZXh0UmVuZGVyZXJGYWN0b3J5LmgiCiAjaW1wb3J0ICJXZWJDb3JlV2lkZ2V0SG9sZGVyLmgiCi0j
aW1wb3J0ICJyZW5kZXJfZm9ybS5oIgotI2ltcG9ydCAiRm9udC5oIgorI2ltcG9ydCAiV2ViVGV4
dFJlbmRlcmVyRmFjdG9yeS5oIgorI2ltcG9ydCAiV2lkZ2V0Q2xpZW50LmgiCiAKIHVzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOwogCkluZGV4OiBXZWJDb3JlL2t3cS9LV1FMaXN0Qm94Lm1tCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUva3dxL0tXUUxpc3RCb3gubW0JKHJldmlzaW9uIDE0MzQyKQorKysg
V2ViQ29yZS9rd3EvS1dRTGlzdEJveC5tbQkod29ya2luZyBjb3B5KQpAQCAtMjcsMTQgKzI3LDE0
IEBACiAjaW1wb3J0ICJLV1FMaXN0Qm94LmgiCiAKICNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5o
IgorI2ltcG9ydCAiRm9udERhdGEuaCIKICNpbXBvcnQgIkZyYW1lTWFjLmgiCiAjaW1wb3J0ICJX
ZWJDb3JlRnJhbWVCcmlkZ2UuaCIKLSNpbXBvcnQgIkZvbnREYXRhLmgiCi0jaW1wb3J0ICJXZWJU
ZXh0UmVuZGVyZXJGYWN0b3J5LmgiCiAjaW1wb3J0ICJXZWJDb3JlV2lkZ2V0SG9sZGVyLmgiCisj
aW1wb3J0ICJXZWJUZXh0UmVuZGVyZXJGYWN0b3J5LmgiCisjaW1wb3J0ICJXaWRnZXRDbGllbnQu
aCIKICNpbXBvcnQgPHd0Zi9Bc3NlcnRpb25zLmg+CiAKLSNpbXBvcnQgInJlbmRlcl9mb3JtLmgi
CiAjaW1wb3J0ICJHcmFwaGljc0NvbnRleHQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
CkluZGV4OiBXZWJDb3JlL2t3cS9LV1FGaWxlQnV0dG9uLm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUva3dxL0tXUUZpbGVCdXR0b24ubW0JKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9rd3Ev
S1dRRmlsZUJ1dHRvbi5tbQkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsNyBAQAogI2ltcG9y
dCAiV2ViQ29yZUZyYW1lQnJpZGdlLmgiCiAjaW1wb3J0ICJXZWJDb3JlU3RyaW5nVHJ1bmNhdG9y
LmgiCiAjaW1wb3J0ICJXZWJDb3JlVmlld0ZhY3RvcnkuaCIKLSNpbXBvcnQgInJlbmRlcl9mb3Jt
LmgiCisjaW1wb3J0ICJXaWRnZXRDbGllbnQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
CiAKSW5kZXg6IFdlYkNvcmUva3dxL0tXUVNsaWRlci5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2t3cS9LV1FTbGlkZXIubW0JKHJldmlzaW9uIDE0MzQyKQorKysgV2ViQ29yZS9rd3EvS1dRU2xp
ZGVyLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yNywxMSArMjcsMTEgQEAKICNpbXBvcnQgIktXUVNs
aWRlci5oIgogCiAjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKLSNpbXBvcnQgIktXUUxpbmVF
ZGl0LmgiCiAjaW1wb3J0ICJGcmFtZU1hYy5oIgorI2ltcG9ydCAiS1dRTGluZUVkaXQuaCIKICNp
bXBvcnQgIldlYkNvcmVGcmFtZUJyaWRnZS5oIgogI2ltcG9ydCAiV2ViQ29yZVdpZGdldEhvbGRl
ci5oIgotI2ltcG9ydCAicmVuZGVyX2Zvcm0uaCIKKyNpbXBvcnQgIldpZGdldENsaWVudC5oIgog
CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Cg==
</data>
<flag name="review"
          id="2332"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>8285</attachid>
            <date>2006-05-13 10:42:11 -0700</date>
            <delta_ts>2006-05-13 10:42:11 -0700</delta_ts>
            <desc>folder with all the new files in it</desc>
            <filename>render_form.zip</filename>
            <type>application/zip</type>
            <size>29436</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">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
RFBLAQIVAxQACAAIAE9rrTTDk/+3IQEAAAQYAAAVAAwAAAAAAAAAAECkgToAAAByZW5kZXJfZm9y
bS8uRFNfU3RvcmVVWAgAqRlmRMYWZkRQSwECFQMKAAAAAADZbK00AAAAAAAAAAAAAAAACQAMAAAA
AAAAAABA/UGuAQAAX19NQUNPU1gvVVgIAKkZZkSpGWZEUEsBAhUDCgAAAAAA2WytNAAAAAAAAAAA
AAAAABUADAAAAAAAAAAAQP1B5QEAAF9fTUFDT1NYL3JlbmRlcl9mb3JtL1VYCACpGWZEqRlmRFBL
AQIVAxQACAAIAE9rrTQNjiN3HAAAAFIAAAAgAAwAAAAAAAAAAECkgSgCAABfX01BQ09TWC9yZW5k
ZXJfZm9ybS8uXy5EU19TdG9yZVVYCACpGWZExhZmRFBLAQIVAxQACAAIAIdbrTRP3bJMvQcAAFYY
AAAeAAwAAAAAAAAAAECkgaICAAByZW5kZXJfZm9ybS9SZW5kZXJGaWVsZHNldC5jcHBVWAgAqRlm
RA77ZURQSwECFQMUAAgACADouaw0moB+OXADAAD9BgAAHAAMAAAAAAAAAABApIG7CgAAcmVuZGVy
X2Zvcm0vUmVuZGVyRmllbGRzZXQuaFVYCACpGWZERE9lRFBLAQIVAxQACAAIANlGrTTUUVvaJAQA
ACwKAAAgAAwAAAAAAAAAAECkgYUOAAByZW5kZXJfZm9ybS9SZW5kZXJGaWxlQnV0dG9uLmNwcFVY
CACpGWZEGtdlRFBLAQIVAxQACAAIADWqrDSnBBkScQMAADEHAAAeAAwAAAAAAAAAAECkgQcTAABy
ZW5kZXJfZm9ybS9SZW5kZXJGaWxlQnV0dG9uLmhVWAgAqRlmRLUzZURQSwECFQMUAAgACAB3W600
BPzXLDgGAABXDwAAIQAMAAAAAAAAAABApIHUFgAAcmVuZGVyX2Zvcm0vUmVuZGVyRm9ybUVsZW1l
bnQuY3BwVVgIAKkZZkTy+mVEUEsBAhUDFAAIAAgAkWKtNP/IYajXBAAA2gsAAB8ADAAAAAAAAAAA
QKSBax0AAHJlbmRlcl9mb3JtL1JlbmRlckZvcm1FbGVtZW50LmhVWAgAqRlmRFEHZkRQSwECFQMU
AAgACAAOTK006tk61r0CAAAvBQAAIQAMAAAAAAAAAABApIGfIgAAcmVuZGVyX2Zvcm0vUmVuZGVy
SW1hZ2VCdXR0b24uY3BwVVgIAKkZZkTr32VEUEsBAhUDFAAIAAgA0WKtNGckE13sAgAA1AUAAB8A
DAAAAAAAAAAAQKSBuyUAAHJlbmRlcl9mb3JtL1JlbmRlckltYWdlQnV0dG9uLmhVWAgAqRlmRMkH
ZkRQSwECFQMUAAgACAC0paw0BsAXvZgCAADYBAAAGwAMAAAAAAAAAABApIEEKQAAcmVuZGVyX2Zv
cm0vUmVuZGVyTGFiZWwuY3BwVVgIAKkZZkQ0LGVEUEsBAhUDFAAIAAgAkmGtNEoTEpPZAgAAaQUA
ABkADAAAAAAAAAAAQKSB9SsAAHJlbmRlcl9mb3JtL1JlbmRlckxhYmVsLmhVWAgAqRlmRHQFZkRQ
SwECFQMUAAgACAB2TK00ZOJ56qACAAD6BAAAHAAMAAAAAAAAAABApIElLwAAcmVuZGVyX2Zvcm0v
UmVuZGVyTGVnZW5kLmNwcFVYCACpGWZEr+BlRFBLAQIVAxQACAAIAO1irTR+dknq4gIAAIYFAAAa
AAwAAAAAAAAAAECkgR8yAAByZW5kZXJfZm9ybS9SZW5kZXJMZWdlbmQuaFVYCACpGWZE/QdmRFBL
AQIVAxQACAAIAKNbrTSp4bc8cQkAACocAAAeAAwAAAAAAAAAAECkgVk1AAByZW5kZXJfZm9ybS9S
ZW5kZXJMaW5lRWRpdC5jcHBVWAgAqRlmREH7ZURQSwECFQMUAAgACAAJY600pMfhMdwDAAATCQAA
HAAMAAAAAAAAAABApIEmPwAAcmVuZGVyX2Zvcm0vUmVuZGVyTGluZUVkaXQuaFVYCACpGWZEMQhm
RFBLAQIVAxQACAAIAFJirTSropKsXQ0AAGQzAAAcAAwAAAAAAAAAAECkgVxDAAByZW5kZXJfZm9y
bS9SZW5kZXJTZWxlY3QuY3BwVVgIAKkZZkTbBmZEUEsBAhUDFAAIAAgAMmOtNOIUIcMqBAAAswkA
ABoADAAAAAAAAAAAQKSBE1EAAHJlbmRlcl9mb3JtL1JlbmRlclNlbGVjdC5oVVgIAKkZZkR/CGZE
UEsBAhUDFAAIAAgAQVutNHt59lp/BQAAvQ4AABwADAAAAAAAAAAAQKSBlVUAAHJlbmRlcl9mb3Jt
L1JlbmRlclNsaWRlci5jcHBVWAgAqRlmRIr6ZURQSwECFQMUAAgACAA3Y600AHCDmjUDAABmBgAA
GgAMAAAAAAAAAABApIFuWwAAcmVuZGVyX2Zvcm0vUmVuZGVyU2xpZGVyLmhVWAgAqRlmRIoIZkRQ
SwECFQMUAAgACADRXK00uJC5WBIHAADvFQAAHgAMAAAAAAAAAABApIH7XgAAcmVuZGVyX2Zvcm0v
UmVuZGVyVGV4dEFyZWEuY3BwVVgIAKkZZkR6/WVEUEsBAhUDFAAIAAgAd2OtNFBk7rLYAwAADAkA
ABwADAAAAAAAAAAAQKSBaWYAAHJlbmRlcl9mb3JtL1JlbmRlclRleHRBcmVhLmhVWAgAqRlmRAEJ
ZkRQSwUGAAAAABkAGQBLCAAAm2oAAAAA
</data>

          </attachment>
      

    </bug>

</bugzilla>