<?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>8878</bug_id>
          
          <creation_ts>2006-05-12 15:48:33 -0700</creation_ts>
          <short_desc>Split render_frames.* render_replaced.* and html_baseimpl.* into separate files (one class per file).</short_desc>
          <delta_ts>2006-05-15 10:09:42 -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="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>42142</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-12 15:48:33 -0700</bug_when>
    <thetext>so there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42145</commentid>
    <comment_count>1</comment_count>
      <attachid>8274</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-12 15:49:40 -0700</bug_when>
    <thetext>Created attachment 8274
split a few more files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42147</commentid>
    <comment_count>2</comment_count>
      <attachid>8274</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2006-05-12 15:50:15 -0700</bug_when>
    <thetext>Comment on attachment 8274
split a few more files.

r=me</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>8274</attachid>
            <date>2006-05-12 15:49:40 -0700</date>
            <delta_ts>2006-05-12 15:50:15 -0700</delta_ts>
            <desc>split a few more files.</desc>
            <filename>split.patch</filename>
            <type>text/plain</type>
            <size>506090</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGJpbmRpbmdzL2pzL2tqc19odG1sLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9q
cy9ranNfaHRtbC5jcHAJKHJldmlzaW9uIDE0MzMyKQorKysgYmluZGluZ3MvanMva2pzX2h0bWwu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCwxMSArMjgsMTYgQEAKICNpbmNsdWRlICJIVE1MQXBw
bGV0RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxCYXNlRWxlbWVudC5oIgogI2luY2x1ZGUgIkhU
TUxCYXNlRm9udEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MQm9keUVsZW1lbnQuaCIKICNpbmNs
dWRlICJIVE1MQnV0dG9uRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgogI2lu
Y2x1ZGUgIkhUTUxFbWJlZEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MRmllbGRTZXRFbGVtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lU2V0
RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxIZWFkRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxI
dG1sRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCiAjaW5jbHVkZSAi
SFRNTElzSW5kZXhFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTExhYmVsRWxlbWVudC5oIgogI2lu
Y2x1ZGUgIkhUTUxMZWdlbmRFbGVtZW50LmgiCkBAIC01OSw3ICs2NCw2IEBACiAjaW5jbHVkZSAi
VGV4dC5oIgogI2luY2x1ZGUgImNzc19ydWxlaW1wbC5oIgogI2luY2x1ZGUgImRvbTJfZXZlbnRz
aW1wbC5oIgotI2luY2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKICNpbmNsdWRlICJodG1sX2Jsb2Nr
aW1wbC5oIgogI2luY2x1ZGUgImh0bWxfaW1hZ2VpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbF9pbmxp
bmVpbXBsLmgiCkBAIC0xMDQsNyArMTA4LDcgQEAgSlNWYWx1ZSAqSlNIVE1MRG9jdW1lbnRQcm90
b0Z1bmM6OmNhbGxBcwogewogICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMoJkpTSFRNTERvY3Vt
ZW50OjppbmZvKSkKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsK
LSAgICBIVE1MRG9jdW1lbnQgJmRvYyA9ICpzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oc3Rh
dGljX2Nhc3Q8SlNIVE1MRG9jdW1lbnQgKj4odGhpc09iaiktPmltcGwoKSk7CisgICAgSFRNTERv
Y3VtZW50ICZkb2MgPSAqc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50Kj4oc3RhdGljX2Nhc3Q8SlNI
VE1MRG9jdW1lbnQqPih0aGlzT2JqKS0+aW1wbCgpKTsKICAgICAKICAgICBzd2l0Y2ggKGlkKSB7
CiAgICAgICAgIGNhc2UgSlNIVE1MRG9jdW1lbnQ6OkNsZWFyOiAvLyBldmVuIElFIGRvZXNuJ3Qg
c3VwcG9ydCB0aGF0IG9uZS4uLgpAQCAtMjA0LDggKzIwOCw4IEBAIEpTSFRNTERvY3VtZW50OjpK
U0hUTUxEb2N1bWVudChFeGVjU3RhdGUKIAogSlNWYWx1ZSAqSlNIVE1MRG9jdW1lbnQ6Om5hbWVk
SXRlbUdldHRlcihFeGVjU3RhdGUgKmV4ZWMsIEpTT2JqZWN0ICpvcmlnaW5hbE9iamVjdCwgY29u
c3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7
Ci0gIEpTSFRNTERvY3VtZW50ICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MRG9jdW1lbnQg
Kj4oc2xvdC5zbG90QmFzZSgpKTsKLSAgSFRNTERvY3VtZW50ICZkb2MgPSAqc3RhdGljX2Nhc3Q8
SFRNTERvY3VtZW50ICo+KHRoaXNPYmotPmltcGwoKSk7CisgIEpTSFRNTERvY3VtZW50ICp0aGlz
T2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MRG9jdW1lbnQqPihzbG90LnNsb3RCYXNlKCkpOworICBI
VE1MRG9jdW1lbnQgJmRvYyA9ICpzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPih0aGlzT2JqLT5p
bXBsKCkpOwogCiAgIFN0cmluZyBuYW1lID0gcHJvcGVydHlOYW1lOwogICBSZWZQdHI8V2ViQ29y
ZTo6SFRNTENvbGxlY3Rpb24+IGNvbGxlY3Rpb24gPSBkb2MuZG9jdW1lbnROYW1lZEl0ZW1zKG5h
bWUpOwpAQCAtMjEzLDcgKzIxNyw3IEBAIEpTVmFsdWUgKkpTSFRNTERvY3VtZW50OjpuYW1lZEl0
ZW1HZXR0ZXIKICAgaWYgKGNvbGxlY3Rpb24tPmxlbmd0aCgpID09IDEpIHsKICAgICBXZWJDb3Jl
OjpOb2RlKiBub2RlID0gY29sbGVjdGlvbi0+Zmlyc3RJdGVtKCk7CiAgICAgRnJhbWUgKmZyYW1l
OwotICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYgKGZyYW1lID0gc3RhdGlj
X2Nhc3Q8V2ViQ29yZTo6SFRNTElGcmFtZUVsZW1lbnQgKj4obm9kZSktPmNvbnRlbnRGcmFtZSgp
KSkKKyAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpICYmIChmcmFtZSA9IHN0YXRp
Y19jYXN0PFdlYkNvcmU6OkhUTUxJRnJhbWVFbGVtZW50Kj4obm9kZSktPmNvbnRlbnRGcmFtZSgp
KSkKICAgICAgIHJldHVybiBXaW5kb3c6OnJldHJpZXZlKGZyYW1lKTsKICAgICByZXR1cm4gdG9K
UyhleGVjLCBub2RlKTsKICAgfQpAQCAtMjIzLDEzICsyMjcsMTMgQEAgSlNWYWx1ZSAqSlNIVE1M
RG9jdW1lbnQ6Om5hbWVkSXRlbUdldHRlcgogCiBKU1ZhbHVlICpKU0hUTUxEb2N1bWVudDo6Z2V0
VmFsdWVQcm9wZXJ0eShFeGVjU3RhdGUgKmV4ZWMsIGludCB0b2tlbikgY29uc3QKIHsKLSAgSFRN
TERvY3VtZW50ICZkb2MgPSAqc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50ICo+KGltcGwoKSk7Cisg
IEhUTUxEb2N1bWVudCYgZG9jID0gKnN0YXRpY19jYXN0PEhUTUxEb2N1bWVudCo+KGltcGwoKSk7
CiAKLSAgRnJhbWVWaWV3ICp2aWV3ID0gZG9jLnZpZXcoKTsKLSAgRnJhbWUgKmZyYW1lID0gZG9j
LmZyYW1lKCk7CisgIEZyYW1lVmlldyogdmlldyA9IGRvYy52aWV3KCk7CisgIEZyYW1lKiBmcmFt
ZSA9IGRvYy5mcmFtZSgpOwogCi0gIEhUTUxFbGVtZW50ICpib2R5ID0gZG9jLmJvZHkoKTsKLSAg
SFRNTEJvZHlFbGVtZW50ICpib2R5RWxlbWVudCA9IChib2R5ICYmIGJvZHktPmhhc1RhZ05hbWUo
Ym9keVRhZykpID8gc3RhdGljX2Nhc3Q8SFRNTEJvZHlFbGVtZW50ICo+KGJvZHkpIDogMDsKKyAg
SFRNTEVsZW1lbnQqIGJvZHkgPSBkb2MuYm9keSgpOworICBIVE1MQm9keUVsZW1lbnQqIGJvZHlF
bGVtZW50ID0gKGJvZHkgJiYgYm9keS0+aGFzVGFnTmFtZShib2R5VGFnKSkgPyBzdGF0aWNfY2Fz
dDxIVE1MQm9keUVsZW1lbnQqPihib2R5KSA6IDA7CiAgICAgCiAgIHN3aXRjaCAodG9rZW4pIHsK
ICAgY2FzZSBUaXRsZToKQEAgLTMxMyw3ICszMTcsNyBAQCBKU1ZhbHVlICpKU0hUTUxEb2N1bWVu
dDo6Z2V0VmFsdWVQcm9wZXJ0CiAKIGJvb2wgSlNIVE1MRG9jdW1lbnQ6OmdldE93blByb3BlcnR5
U2xvdChFeGVjU3RhdGUgKmV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJv
cGVydHlTbG90JiBzbG90KQogewotICBIVE1MRG9jdW1lbnQgJmRvYyA9ICpzdGF0aWNfY2FzdDxI
VE1MRG9jdW1lbnQgKj4oaW1wbCgpKTsKKyAgSFRNTERvY3VtZW50ICZkb2MgPSAqc3RhdGljX2Nh
c3Q8SFRNTERvY3VtZW50Kj4oaW1wbCgpKTsKIAogICBTdHJpbmcgbmFtZSA9IHByb3BlcnR5TmFt
ZTsKICAgaWYgKGRvYy5oYXNOYW1lZEl0ZW0obmFtZSkgfHwgZG9jLmhhc0RvY0V4dHJhTmFtZWRJ
dGVtKG5hbWUpKSB7CkBAIC0zNDAsOSArMzQ0LDkgQEAgdm9pZCBKU0hUTUxEb2N1bWVudDo6cHV0
KEV4ZWNTdGF0ZSAqZXhlYwogdm9pZCBKU0hUTUxEb2N1bWVudDo6cHV0VmFsdWVQcm9wZXJ0eShF
eGVjU3RhdGUgKmV4ZWMsIGludCB0b2tlbiwgSlNWYWx1ZSAqdmFsdWUsIGludCAvKmF0dHIqLykK
IHsKICAgRE9NRXhjZXB0aW9uVHJhbnNsYXRvciBleGNlcHRpb24oZXhlYyk7Ci0gIEhUTUxEb2N1
bWVudCAmZG9jID0gKnN0YXRpY19jYXN0PEhUTUxEb2N1bWVudCAqPihpbXBsKCkpOworICBIVE1M
RG9jdW1lbnQgJmRvYyA9ICpzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQqPihpbXBsKCkpOwogICBI
VE1MRWxlbWVudCAqYm9keSA9IGRvYy5ib2R5KCk7Ci0gIEhUTUxCb2R5RWxlbWVudCAqYm9keUVs
ZW1lbnQgPSAoYm9keSAmJiBib2R5LT5oYXNUYWdOYW1lKGJvZHlUYWcpKSA/IHN0YXRpY19jYXN0
PEhUTUxCb2R5RWxlbWVudCAqPihib2R5KSA6IDA7CisgIEhUTUxCb2R5RWxlbWVudCAqYm9keUVs
ZW1lbnQgPSAoYm9keSAmJiBib2R5LT5oYXNUYWdOYW1lKGJvZHlUYWcpKSA/IHN0YXRpY19jYXN0
PEhUTUxCb2R5RWxlbWVudCo+KGJvZHkpIDogMDsKIAogICBzd2l0Y2ggKHRva2VuKSB7CiAgIGNh
c2UgVGl0bGU6CkBAIC0zNjYsMTIgKzM3MCwxMiBAQCB2b2lkIEpTSFRNTERvY3VtZW50OjpwdXRW
YWx1ZVByb3BlcnR5KEV4CiAgICAgICAvLyBXaGVuIGFzc2lnbmluZyBsb2NhdGlvbiwgSUUgYW5k
IE1vemlsbGEgYm90aCByZXNvbHZlIHRoZSBVUkwKICAgICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBm
cmFtZSB3aGVyZSB0aGUgSmF2YVNjcmlwdCBpcyBleGVjdXRpbmcgbm90CiAgICAgICAvLyB0aGUg
dGFyZ2V0IGZyYW1lLgotICAgICAgRnJhbWUgKmFjdGl2ZVBhcnQgPSBzdGF0aWNfY2FzdDxTY3Jp
cHRJbnRlcnByZXRlciAqPiggZXhlYy0+ZHluYW1pY0ludGVycHJldGVyKCkgKS0+ZnJhbWUoKTsK
KyAgICAgIEZyYW1lICphY3RpdmVQYXJ0ID0gc3RhdGljX2Nhc3Q8U2NyaXB0SW50ZXJwcmV0ZXIq
PiggZXhlYy0+ZHluYW1pY0ludGVycHJldGVyKCkgKS0+ZnJhbWUoKTsKICAgICAgIGlmIChhY3Rp
dmVQYXJ0KQogICAgICAgICBzdHIgPSBhY3RpdmVQYXJ0LT5kb2N1bWVudCgpLT5jb21wbGV0ZVVS
TChzdHIpOwogCiAgICAgICAvLyBXZSB3YW50IGEgbmV3IGhpc3RvcnkgaXRlbSBpZiB0aGlzIEpT
IHdhcyBjYWxsZWQgdmlhIGEgdXNlciBnZXN0dXJlCi0gICAgICBib29sIHVzZXJHZXN0dXJlID0g
c3RhdGljX2Nhc3Q8U2NyaXB0SW50ZXJwcmV0ZXIgKj4oZXhlYy0+ZHluYW1pY0ludGVycHJldGVy
KCkpLT53YXNSdW5CeVVzZXJHZXN0dXJlKCk7CisgICAgICBib29sIHVzZXJHZXN0dXJlID0gc3Rh
dGljX2Nhc3Q8U2NyaXB0SW50ZXJwcmV0ZXIqPihleGVjLT5keW5hbWljSW50ZXJwcmV0ZXIoKSkt
Pndhc1J1bkJ5VXNlckdlc3R1cmUoKTsKICAgICAgIGZyYW1lLT5zY2hlZHVsZUxvY2F0aW9uQ2hh
bmdlKHN0ciwgYWN0aXZlUGFydC0+cmVmZXJyZXIoKSwgIXVzZXJHZXN0dXJlKTsKICAgICB9CiAg
ICAgYnJlYWs7CkBAIC0xMjEyLDM1ICsxMjE2LDM1IEBAIEpTSFRNTEVsZW1lbnQ6OkpTSFRNTEVs
ZW1lbnQoRXhlY1N0YXRlICoKIAogSlNWYWx1ZSAqSlNIVE1MRWxlbWVudDo6Zm9ybUluZGV4R2V0
dGVyKEV4ZWNTdGF0ZSAqZXhlYywgSlNPYmplY3QgKm9yaWdpbmFsT2JqZWN0LCBjb25zdCBJZGVu
dGlmaWVyJiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKIHsKLSAgICBK
U0hUTUxFbGVtZW50ICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MRWxlbWVudCAqPihzbG90
LnNsb3RCYXNlKCkpOwotICAgIEhUTUxGb3JtRWxlbWVudCAqZm9ybSA9IHN0YXRpY19jYXN0PEhU
TUxGb3JtRWxlbWVudCAqPih0aGlzT2JqLT5pbXBsKCkpOworICAgIEpTSFRNTEVsZW1lbnQgKnRo
aXNPYmogPSBzdGF0aWNfY2FzdDxKU0hUTUxFbGVtZW50Kj4oc2xvdC5zbG90QmFzZSgpKTsKKyAg
ICBIVE1MRm9ybUVsZW1lbnQgKmZvcm0gPSBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnQqPih0
aGlzT2JqLT5pbXBsKCkpOwogCiAgICAgcmV0dXJuIHRvSlMoZXhlYywgZm9ybS0+ZWxlbWVudHMo
KS0+aXRlbShzbG90LmluZGV4KCkpKTsKIH0KIAogSlNWYWx1ZSAqSlNIVE1MRWxlbWVudDo6Zm9y
bU5hbWVHZXR0ZXIoRXhlY1N0YXRlICpleGVjLCBKU09iamVjdCAqb3JpZ2luYWxPYmplY3QsIGNv
bnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90JiBzbG90KQog
ewotICAgIEpTSFRNTEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0hUTUxFbGVtZW50
ICo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0gICAgSFRNTEZvcm1FbGVtZW50ICpmb3JtID0gc3RhdGlj
X2Nhc3Q8SFRNTEZvcm1FbGVtZW50ICo+KHRoaXNPYmotPmltcGwoKSk7CisgICAgSlNIVE1MRWxl
bWVudCAqdGhpc09iaiA9IHN0YXRpY19jYXN0PEpTSFRNTEVsZW1lbnQqPihzbG90LnNsb3RCYXNl
KCkpOworICAgIEhUTUxGb3JtRWxlbWVudCAqZm9ybSA9IHN0YXRpY19jYXN0PEhUTUxGb3JtRWxl
bWVudCo+KHRoaXNPYmotPmltcGwoKSk7CiAgICAgCiAgICAgcmV0dXJuIEpTSFRNTENvbGxlY3Rp
b24oZXhlYywgZm9ybS0+ZWxlbWVudHMoKS5nZXQoKSkuZ2V0TmFtZWRJdGVtcyhleGVjLCBwcm9w
ZXJ0eU5hbWUpOwogfQogCiBKU1ZhbHVlICpKU0hUTUxFbGVtZW50OjpzZWxlY3RJbmRleEdldHRl
cihFeGVjU3RhdGUgKmV4ZWMsIEpTT2JqZWN0ICpvcmlnaW5hbE9iamVjdCwgY29uc3QgSWRlbnRp
ZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7Ci0gICAgSlNI
VE1MRWxlbWVudCAqdGhpc09iaiA9IHN0YXRpY19jYXN0PEpTSFRNTEVsZW1lbnQgKj4oc2xvdC5z
bG90QmFzZSgpKTsKLSAgICBIVE1MU2VsZWN0RWxlbWVudCAqc2VsZWN0ID0gc3RhdGljX2Nhc3Q8
SFRNTFNlbGVjdEVsZW1lbnQgKj4odGhpc09iai0+aW1wbCgpKTsKKyAgICBKU0hUTUxFbGVtZW50
ICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MRWxlbWVudCo+KHNsb3Quc2xvdEJhc2UoKSk7
CisgICAgSFRNTFNlbGVjdEVsZW1lbnQgKnNlbGVjdCA9IHN0YXRpY19jYXN0PEhUTUxTZWxlY3RF
bGVtZW50Kj4odGhpc09iai0+aW1wbCgpKTsKIAogICAgIHJldHVybiB0b0pTKGV4ZWMsIHNlbGVj
dC0+b3B0aW9ucygpLT5pdGVtKHNsb3QuaW5kZXgoKSkpOwogfQogCiBKU1ZhbHVlICpKU0hUTUxF
bGVtZW50OjpmcmFtZXNldE5hbWVHZXR0ZXIoRXhlY1N0YXRlICpleGVjLCBKU09iamVjdCAqb3Jp
Z2luYWxPYmplY3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVy
dHlTbG90JiBzbG90KQogewotICAgIEpTSFRNTEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2Fz
dDxKU0hUTUxFbGVtZW50ICo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0gICAgSFRNTEVsZW1lbnQgKmVs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPih0aGlzT2JqLT5pbXBsKCkpOworICAg
IEpTSFRNTEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0hUTUxFbGVtZW50Kj4oc2xv
dC5zbG90QmFzZSgpKTsKKyAgICBIVE1MRWxlbWVudCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxFbGVtZW50Kj4odGhpc09iai0+aW1wbCgpKTsKIAogICAgIFdlYkNvcmU6Ok5vZGUgKmZyYW1l
ID0gZWxlbWVudC0+Y2hpbGRyZW4oKS0+bmFtZWRJdGVtKHByb3BlcnR5TmFtZSk7Ci0gICAgaWYg
KERvY3VtZW50KiBkb2MgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50ICo+KGZyYW1lKS0+
Y29udGVudERvY3VtZW50KCkpCisgICAgaWYgKERvY3VtZW50KiBkb2MgPSBzdGF0aWNfY2FzdDxI
VE1MRnJhbWVFbGVtZW50Kj4oZnJhbWUpLT5jb250ZW50RG9jdW1lbnQoKSkKICAgICAgICAgaWYg
KFdpbmRvdyAqd2luZG93ID0gV2luZG93OjpyZXRyaWV2ZVdpbmRvdyhkb2MtPmZyYW1lKCkpKQog
ICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKIApAQCAtMTI0OSwyNSArMTI1MywyNSBAQCBKU1Zh
bHVlICpKU0hUTUxFbGVtZW50OjpmcmFtZXNldE5hbWVHZXR0CiAKIEpTVmFsdWUgKkpTSFRNTEVs
ZW1lbnQ6OnJ1bnRpbWVPYmplY3RHZXR0ZXIoRXhlY1N0YXRlICpleGVjLCBKU09iamVjdCAqb3Jp
Z2luYWxPYmplY3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVy
dHlTbG90JiBzbG90KQogewotICAgIEpTSFRNTEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2Fz
dDxKU0hUTUxFbGVtZW50ICo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0gICAgSFRNTEVsZW1lbnQgKmVs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPih0aGlzT2JqLT5pbXBsKCkpOworICAg
IEpTSFRNTEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0hUTUxFbGVtZW50Kj4oc2xv
dC5zbG90QmFzZSgpKTsKKyAgICBIVE1MRWxlbWVudCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxFbGVtZW50Kj4odGhpc09iai0+aW1wbCgpKTsKIAogICAgIHJldHVybiBnZXRSdW50aW1lT2Jq
ZWN0KGV4ZWMsIGVsZW1lbnQpOwogfQogCiBKU1ZhbHVlICpKU0hUTUxFbGVtZW50OjpydW50aW1l
T2JqZWN0UHJvcGVydHlHZXR0ZXIoRXhlY1N0YXRlICpleGVjLCBKU09iamVjdCAqb3JpZ2luYWxP
YmplY3QsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgY29uc3QgUHJvcGVydHlTbG90
JiBzbG90KQogewotICAgIEpTSFRNTEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0hU
TUxFbGVtZW50ICo+KHNsb3Quc2xvdEJhc2UoKSk7Ci0gICAgSFRNTEVsZW1lbnQgKmVsZW1lbnQg
PSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPih0aGlzT2JqLT5pbXBsKCkpOworICAgIEpTSFRN
TEVsZW1lbnQgKnRoaXNPYmogPSBzdGF0aWNfY2FzdDxKU0hUTUxFbGVtZW50Kj4oc2xvdC5zbG90
QmFzZSgpKTsKKyAgICBIVE1MRWxlbWVudCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVt
ZW50Kj4odGhpc09iai0+aW1wbCgpKTsKIAogICAgIGlmIChKU1ZhbHVlICpydW50aW1lT2JqZWN0
ID0gZ2V0UnVudGltZU9iamVjdChleGVjLCBlbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PEpTT2JqZWN0ICo+KHJ1bnRpbWVPYmplY3QpLT5nZXQoZXhlYywgcHJvcGVydHlOYW1l
KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4ocnVudGltZU9iamVjdCkt
PmdldChleGVjLCBwcm9wZXJ0eU5hbWUpOwogICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwogfQog
CiBib29sIEpTSFRNTEVsZW1lbnQ6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUgKmV4ZWMs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQogewot
ICAgIEhUTUxFbGVtZW50ICZlbGVtZW50ID0gKnN0YXRpY19jYXN0PEhUTUxFbGVtZW50ICo+KGlt
cGwoKSk7CisgICAgSFRNTEVsZW1lbnQgJmVsZW1lbnQgPSAqc3RhdGljX2Nhc3Q8SFRNTEVsZW1l
bnQqPihpbXBsKCkpOwogCiAgICAgLy8gRmlyc3QgbG9vayBhdCBkeW5hbWljIHByb3BlcnRpZXMK
ICAgICBpZiAoZWxlbWVudC5oYXNMb2NhbE5hbWUoZm9ybVRhZykpIHsKQEAgLTEzMDcsNyArMTMx
MSw3IEBAIGJvb2wgSlNIVE1MRWxlbWVudDo6Z2V0T3duUHJvcGVydHlTbG90KEUKICAgICAgICAg
fQogICAgICAgICBKU1ZhbHVlICpydW50aW1lT2JqZWN0ID0gZ2V0UnVudGltZU9iamVjdChleGVj
LCZlbGVtZW50KTsKICAgICAgICAgaWYgKHJ1bnRpbWVPYmplY3QpIHsKLSAgICAgICAgICAgIEpT
T2JqZWN0ICppbXAgPSBzdGF0aWNfY2FzdDxKU09iamVjdCAqPihydW50aW1lT2JqZWN0KTsKKyAg
ICAgICAgICAgIEpTT2JqZWN0ICppbXAgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHJ1bnRpbWVP
YmplY3QpOwogICAgICAgICAgICAgaWYgKGltcC0+aGFzUHJvcGVydHkoZXhlYywgcHJvcGVydHlO
YW1lKSkgewogICAgICAgICAgICAgICAgIHNsb3Quc2V0Q3VzdG9tKHRoaXMsIHJ1bnRpbWVPYmpl
Y3RQcm9wZXJ0eUdldHRlcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMzE5
LDcgKzEzMjMsNyBAQCBib29sIEpTSFRNTEVsZW1lbnQ6OmdldE93blByb3BlcnR5U2xvdChFCiAg
ICAgY29uc3QgSGFzaEVudHJ5KiBlbnRyeSA9IExvb2t1cDo6ZmluZEVudHJ5KHRhYmxlLCBwcm9w
ZXJ0eU5hbWUpOwogICAgIGlmIChlbnRyeSkgewogICAgICAgICAvLyBkb24ndCBleHBvc2Ugc2Vs
ZWN0aW9uIHByb3BlcnRpZXMgZm9yIGlucHV0IHR5cGVzIHRoYXQgY2FuJ3QgaGF2ZSBhIHNlbGVj
dGlvbgotICAgICAgICBpZiAoZWxlbWVudC5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpICYmICFzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50ICo+KGltcGwoKSktPmNhbkhhdmVTZWxlY3Rpb24oKSkg
eworICAgICAgICBpZiAoZWxlbWVudC5oYXNMb2NhbE5hbWUoaW5wdXRUYWcpICYmICFzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oaW1wbCgpKS0+Y2FuSGF2ZVNlbGVjdGlvbigpKSB7CiAg
ICAgICAgICAgICBzd2l0Y2ggKGVudHJ5LT52YWx1ZSkgewogICAgICAgICAgICAgY2FzZSBJbnB1
dFNldFNlbGVjdGlvblJhbmdlOgogICAgICAgICAgICAgY2FzZSBJbnB1dFNlbGVjdGlvblN0YXJ0
OgpAQCAtMTM0NywyMyArMTM1MSwyMyBAQCBib29sIEpTSFRNTEVsZW1lbnQ6OmdldE93blByb3Bl
cnR5U2xvdChFCiAKIGJvb2wgSlNIVE1MRWxlbWVudDo6aW1wbGVtZW50c0NhbGwoKSBjb25zdAog
ewotICAgIEhUTUxFbGVtZW50ICplbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQgKj4o
aW1wbCgpKTsKKyAgICBIVE1MRWxlbWVudCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVt
ZW50Kj4oaW1wbCgpKTsKICAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShlbWJlZFRhZykgfHwg
ZWxlbWVudC0+aGFzVGFnTmFtZShvYmplY3RUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXBw
bGV0VGFnKSkgewogICAgICAgICBEb2N1bWVudCogZG9jID0gZWxlbWVudC0+ZG9jdW1lbnQoKTsK
ICAgICAgICAgS0pTUHJveHkgKnByb3h5ID0gZG9jLT5mcmFtZSgpLT5qU2NyaXB0KCk7CiAgICAg
ICAgIEV4ZWNTdGF0ZSAqZXhlYyA9IHByb3h5LT5pbnRlcnByZXRlcigpLT5nbG9iYWxFeGVjKCk7
CiAgICAgICAgIGlmIChKU1ZhbHVlICpydW50aW1lT2JqZWN0ID0gZ2V0UnVudGltZU9iamVjdChl
eGVjLCBlbGVtZW50KSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU09iamVjdCAq
PihydW50aW1lT2JqZWN0KS0+aW1wbGVtZW50c0NhbGwoKTsKKyAgICAgICAgICAgIHJldHVybiBz
dGF0aWNfY2FzdDxKU09iamVjdCo+KHJ1bnRpbWVPYmplY3QpLT5pbXBsZW1lbnRzQ2FsbCgpOwog
ICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKIEpTVmFsdWUgKkpTSFRNTEVsZW1lbnQ6OmNh
bGxBc0Z1bmN0aW9uKEV4ZWNTdGF0ZSAqZXhlYywgSlNPYmplY3QgKnRoaXNPYmosIGNvbnN0IExp
c3QmYXJncykKIHsKLSAgICBIVE1MRWxlbWVudCAqZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxF
bGVtZW50ICo+KGltcGwoKSk7CisgICAgSFRNTEVsZW1lbnQgKmVsZW1lbnQgPSBzdGF0aWNfY2Fz
dDxIVE1MRWxlbWVudCo+KGltcGwoKSk7CiAgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoZW1i
ZWRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGFwcGxldFRhZykpIHsKICAgICAgICAgaWYgKEpTVmFsdWUgKnJ1bnRpbWVPYmplY3Qg
PSBnZXRSdW50aW1lT2JqZWN0KGV4ZWMsIGVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PEpTT2JqZWN0ICo+KHJ1bnRpbWVPYmplY3QpLT5jYWxsKGV4ZWMsIHRoaXNPYmos
IGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4ocnVudGlt
ZU9iamVjdCktPmNhbGwoZXhlYywgdGhpc09iaiwgYXJncyk7CiAgICAgfQogICAgIHJldHVybiBq
c1VuZGVmaW5lZCgpOwogfQpAQCAtMjE3Miw3ICsyMTc2LDcgQEAgSlNWYWx1ZSAqSlNIVE1MRWxl
bWVudDo6bWFycXVlZUdldHRlcihFeAogSlNWYWx1ZSAqSlNIVE1MRWxlbWVudDo6Z2V0VmFsdWVQ
cm9wZXJ0eShFeGVjU3RhdGUgKmV4ZWMsIGludCB0b2tlbikgY29uc3QKIHsKICAgICAvLyBDaGVj
ayBvdXIgc2V0IG9mIGdlbmVyaWMgcHJvcGVydGllcyBmaXJzdC4KLSAgICBIVE1MRWxlbWVudCAm
ZWxlbWVudCA9ICpzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPihpbXBsKCkpOworICAgIEhUTUxF
bGVtZW50ICZlbGVtZW50ID0gKnN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4oaW1wbCgpKTsKICAg
ICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgIGNhc2UgRWxlbWVudElkOgogICAgICAgICAgICAg
Ly8gaWh0LmNvbSByZWxpZXMgb24gdGhpcyB2YWx1ZSBiZWluZyAiIiB3aGVuIG5vIGlkIGlzIHBy
ZXNlbnQuIE90aGVyIGJyb3dzZXJzIGRvIHRoaXMgYXMgd2VsbC4KQEAgLTIyMTMsNyArMjIxNyw3
IEBAIEpTVmFsdWUgKkpTSFRNTEVsZW1lbnQ6OmdldFZhbHVlUHJvcGVydHkKIFVTdHJpbmcgSlNI
VE1MRWxlbWVudDo6dG9TdHJpbmcoRXhlY1N0YXRlICpleGVjKSBjb25zdAogewogICAgIGlmIChp
bXBsKCktPmhhc1RhZ05hbWUoYVRhZykpCi0gICAgICAgIHJldHVybiBVU3RyaW5nKHN0YXRpY19j
YXN0PGNvbnN0IEhUTUxBbmNob3JFbGVtZW50ICo+KGltcGwoKSktPmhyZWYoKSk7CisgICAgICAg
IHJldHVybiBVU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IEhUTUxBbmNob3JFbGVtZW50Kj4oaW1w
bCgpKS0+aHJlZigpKTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBKU0VsZW1lbnQ6OnRvU3Ry
aW5nKGV4ZWMpOwogfQpAQCAtMjIyMSwyMSArMjIyNSwyMSBAQCBVU3RyaW5nIEpTSFRNTEVsZW1l
bnQ6OnRvU3RyaW5nKEV4ZWNTdGF0CiBzdGF0aWMgSFRNTEZvcm1FbGVtZW50ICpnZXRGb3JtKEhU
TUxFbGVtZW50ICplbGVtZW50KQogewogICAgIGlmIChlbGVtZW50LT5pc0dlbmVyaWNGb3JtRWxl
bWVudCgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVu
dCAqPihlbGVtZW50KS0+Zm9ybSgpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEdl
bmVyaWNGb3JtRWxlbWVudCo+KGVsZW1lbnQpLT5mb3JtKCk7CiAgICAgaWYgKGVsZW1lbnQtPmhh
c1RhZ05hbWUobGFiZWxUYWcpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTExhYmVs
RWxlbWVudCAqPihlbGVtZW50KS0+Zm9ybSgpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
SFRNTExhYmVsRWxlbWVudCo+KGVsZW1lbnQpLT5mb3JtKCk7CiAgICAgaWYgKGVsZW1lbnQtPmhh
c1RhZ05hbWUob2JqZWN0VGFnKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxPYmpl
Y3RFbGVtZW50ICo+KGVsZW1lbnQpLT5mb3JtKCk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxIVE1MT2JqZWN0RWxlbWVudCo+KGVsZW1lbnQpLT5mb3JtKCk7CiAKICAgICByZXR1cm4gMDsK
IH0KIAogdm9pZCBKU0hUTUxFbGVtZW50OjpwdXNoRXZlbnRIYW5kbGVyU2NvcGUoRXhlY1N0YXRl
ICpleGVjLCBTY29wZUNoYWluICZzY29wZSkgY29uc3QKIHsKLSAgSFRNTEVsZW1lbnQgKmVsZW1l
bnQgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPihpbXBsKCkpOworICBIVE1MRWxlbWVudCAq
ZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4oaW1wbCgpKTsKIAogICAvLyBUaGUg
ZG9jdW1lbnQgaXMgcHV0IG9uIGZpcnN0LCBmYWxsIGJhY2sgdG8gc2VhcmNoaW5nIGl0IG9ubHkg
YWZ0ZXIgdGhlIGVsZW1lbnQgYW5kIGZvcm0uCi0gIHNjb3BlLnB1c2goc3RhdGljX2Nhc3Q8SlNP
YmplY3QgKj4odG9KUyhleGVjLCBlbGVtZW50LT5vd25lckRvY3VtZW50KCkpKSk7CisgIHNjb3Bl
LnB1c2goc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih0b0pTKGV4ZWMsIGVsZW1lbnQtPm93bmVyRG9j
dW1lbnQoKSkpKTsKIAogICAvLyBUaGUgZm9ybSBpcyBuZXh0LCBzZWFyY2hlZCBiZWZvcmUgdGhl
IGRvY3VtZW50LCBidXQgYWZ0ZXIgdGhlIGVsZW1lbnQgaXRzZWxmLgogICAKQEAgLTIyNDQsMTgg
KzIyNDgsMTggQEAgdm9pZCBKU0hUTUxFbGVtZW50OjpwdXNoRXZlbnRIYW5kbGVyU2NvcAogICAv
LyA8dGFibGU+IG9yIDx0Ym9keT4uCiAgIEhUTUxGb3JtRWxlbWVudCAqZm9ybSA9IGdldEZvcm0o
ZWxlbWVudCk7CiAgIGlmIChmb3JtKQotICAgIHNjb3BlLnB1c2goc3RhdGljX2Nhc3Q8SlNPYmpl
Y3QgKj4odG9KUyhleGVjLCBmb3JtKSkpOworICAgIHNjb3BlLnB1c2goc3RhdGljX2Nhc3Q8SlNP
YmplY3QqPih0b0pTKGV4ZWMsIGZvcm0pKSk7CiAgIGVsc2UgewogICAgIFdlYkNvcmU6Ok5vZGUq
IGZvcm0gPSBlbGVtZW50LT5wYXJlbnROb2RlKCk7CiAgICAgd2hpbGUgKGZvcm0gJiYgIWZvcm0t
Pmhhc1RhZ05hbWUoZm9ybVRhZykpCiAgICAgICBmb3JtID0gZm9ybS0+cGFyZW50Tm9kZSgpOwog
ICAgIAogICAgIGlmIChmb3JtKQotICAgICAgc2NvcGUucHVzaChzdGF0aWNfY2FzdDxKU09iamVj
dCAqPih0b0pTKGV4ZWMsIGZvcm0pKSk7CisgICAgICBzY29wZS5wdXNoKHN0YXRpY19jYXN0PEpT
T2JqZWN0Kj4odG9KUyhleGVjLCBmb3JtKSkpOwogICB9CiAgIAogICAvLyBUaGUgZWxlbWVudCBp
cyBvbiB0b3AsIHNlYXJjaGVkIGZpcnN0LgotICBzY29wZS5wdXNoKHN0YXRpY19jYXN0PEpTT2Jq
ZWN0ICo+KHRvSlMoZXhlYywgZWxlbWVudCkpKTsKKyAgc2NvcGUucHVzaChzdGF0aWNfY2FzdDxK
U09iamVjdCo+KHRvSlMoZXhlYywgZWxlbWVudCkpKTsKIH0KIAogSFRNTEVsZW1lbnRGdW5jdGlv
bjo6SFRNTEVsZW1lbnRGdW5jdGlvbihFeGVjU3RhdGUgKmV4ZWMsIGludCBpLCBpbnQgbGVuLCBj
b25zdCBJZGVudGlmaWVyJiBuYW1lKQpAQCAtMjI3MCw3ICsyMjc0LDcgQEAgSlNWYWx1ZSAqSFRN
TEVsZW1lbnRGdW5jdGlvbjo6Y2FsbEFzRnVuYwogICAgIGlmICghdGhpc09iai0+aW5oZXJpdHMo
JkpTSFRNTEVsZW1lbnQ6OmluZm8pKQogICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBU
eXBlRXJyb3IpOwogICAgIERPTUV4Y2VwdGlvblRyYW5zbGF0b3IgZXhjZXB0aW9uKGV4ZWMpOwot
ICAgIEhUTUxFbGVtZW50ICZlbGVtZW50ID0gKnN0YXRpY19jYXN0PEhUTUxFbGVtZW50ICo+KHN0
YXRpY19jYXN0PEpTSFRNTEVsZW1lbnQgKj4odGhpc09iaiktPmltcGwoKSk7CisgICAgSFRNTEVs
ZW1lbnQgJmVsZW1lbnQgPSAqc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQqPihzdGF0aWNfY2FzdDxK
U0hUTUxFbGVtZW50Kj4odGhpc09iaiktPmltcGwoKSk7CiAKICAgICBpZiAoZWxlbWVudC5oYXNM
b2NhbE5hbWUoZm9ybVRhZykpIHsKICAgICAgICAgSFRNTEZvcm1FbGVtZW50ICZmb3JtID0gc3Rh
dGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50ICY+KGVsZW1lbnQpOwpAQCAtMjQ0OSwyMSArMjQ1Mywy
MSBAQCBKU1ZhbHVlICpIVE1MRWxlbWVudEZ1bmN0aW9uOjpjYWxsQXNGdW5jCiAKIHZvaWQgSlNI
VE1MRWxlbWVudDo6cHV0KEV4ZWNTdGF0ZSAqZXhlYywgY29uc3QgSWRlbnRpZmllciAmcHJvcGVy
dHlOYW1lLCBKU1ZhbHVlICp2YWx1ZSwgaW50IGF0dHIpCiB7Ci0gICAgSFRNTEVsZW1lbnQgJmVs
ZW1lbnQgPSAqc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQgKj4oaW1wbCgpKTsKKyAgICBIVE1MRWxl
bWVudCAmZWxlbWVudCA9ICpzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KGltcGwoKSk7CiAgICAg
Ly8gRmlyc3QgbG9vayBhdCBkeW5hbWljIHByb3BlcnRpZXMKICAgICBpZiAoZWxlbWVudC5oYXNM
b2NhbE5hbWUoc2VsZWN0VGFnKSkgewogICAgICAgICBIVE1MU2VsZWN0RWxlbWVudCAmc2VsZWN0
ID0gc3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQgJj4oZWxlbWVudCk7CiAgICAgICAgIGJv
b2wgb2s7CiAgICAgICAgIC8qdW5zaWduZWQgdSA9Ki8gcHJvcGVydHlOYW1lLnRvVUludDMyKCZv
ayk7CiAgICAgICAgIGlmIChvaykgewotICAgICAgICAgICAgSlNPYmplY3QgKmNvbGwgPSBzdGF0
aWNfY2FzdDxKU09iamVjdCAqPihnZXRTZWxlY3RIVE1MQ29sbGVjdGlvbihleGVjLCBzZWxlY3Qu
b3B0aW9ucygpLmdldCgpLCAmc2VsZWN0KSk7CisgICAgICAgICAgICBKU09iamVjdCAqY29sbCA9
IHN0YXRpY19jYXN0PEpTT2JqZWN0Kj4oZ2V0U2VsZWN0SFRNTENvbGxlY3Rpb24oZXhlYywgc2Vs
ZWN0Lm9wdGlvbnMoKS5nZXQoKSwgJnNlbGVjdCkpOwogICAgICAgICAgICAgY29sbC0+cHV0KGV4
ZWMscHJvcGVydHlOYW1lLHZhbHVlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQog
ICAgIH0KICAgICBlbHNlIGlmIChlbGVtZW50Lmhhc0xvY2FsTmFtZShlbWJlZFRhZykgfHwgZWxl
bWVudC5oYXNMb2NhbE5hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50Lmhhc0xvY2FsTmFtZShhcHBs
ZXRUYWcpKSB7CiAgICAgICAgIGlmIChKU1ZhbHVlICpydW50aW1lT2JqZWN0ID0gZ2V0UnVudGlt
ZU9iamVjdChleGVjLCAmZWxlbWVudCkpIHsKLSAgICAgICAgICAgIEpTT2JqZWN0ICppbXAgPSBz
dGF0aWNfY2FzdDxKU09iamVjdCAqPihydW50aW1lT2JqZWN0KTsKKyAgICAgICAgICAgIEpTT2Jq
ZWN0ICppbXAgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KHJ1bnRpbWVPYmplY3QpOwogICAgICAg
ICAgICAgaWYgKGltcC0+Y2FuUHV0KGV4ZWMsIHByb3BlcnR5TmFtZSkpCiAgICAgICAgICAgICAg
ICAgcmV0dXJuIGltcC0+cHV0KGV4ZWMsIHByb3BlcnR5TmFtZSwgdmFsdWUpOwogICAgICAgICB9
CkBAIC0yNjA4LDcgKzI2MTIsNyBAQCB2b2lkIEpTSFRNTEVsZW1lbnQ6OnNlbGVjdFNldHRlcihF
eGVjU3RhCiAgICAgICAgIGNhc2UgU2VsZWN0U2VsZWN0ZWRJbmRleDogICB7IHNlbGVjdC5zZXRT
ZWxlY3RlZEluZGV4KHZhbHVlLT50b0ludDMyKGV4ZWMpKTsgcmV0dXJuOyB9CiAgICAgICAgIGNh
c2UgU2VsZWN0VmFsdWU6ICAgICAgICAgICB7IHNlbGVjdC5zZXRWYWx1ZShzdHIpOyByZXR1cm47
IH0KICAgICAgICAgY2FzZSBTZWxlY3RMZW5ndGg6ICAgICAgICAgIHsgLy8gcmVhZC1vbmx5IGFj
Y29yZGluZyB0byB0aGUgTlMgc3BlYywgYnV0IHdlYnBhZ2VzIG5lZWQgaXQgd3JpdGVhYmxlCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPYmplY3QgKmNvbGwgPSBz
dGF0aWNfY2FzdDxKU09iamVjdCAqPihnZXRTZWxlY3RIVE1MQ29sbGVjdGlvbihleGVjLCBzZWxl
Y3Qub3B0aW9ucygpLmdldCgpLCAmc2VsZWN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgSlNPYmplY3QgKmNvbGwgPSBzdGF0aWNfY2FzdDxKU09iamVjdCo+KGdl
dFNlbGVjdEhUTUxDb2xsZWN0aW9uKGV4ZWMsIHNlbGVjdC5vcHRpb25zKCkuZ2V0KCksICZzZWxl
Y3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsLT5wdXQo
ZXhlYyxsZW5ndGhQcm9wZXJ0eU5hbWUsdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0KQEAgLTMxNjEsNyArMzE2NSw3IEBAIHZvaWQgSlNIVE1MRWxlbWVudDo6cHV0VmFsdWVQ
cm9wZXJ0eShFeGUKICAgICBXZWJDb3JlOjpTdHJpbmcgc3RyID0gdmFsdWUtPnRvU3RyaW5nKGV4
ZWMpOwogIAogICAgIC8vIENoZWNrIG91ciBzZXQgb2YgZ2VuZXJpYyBwcm9wZXJ0aWVzIGZpcnN0
LgotICAgIEhUTUxFbGVtZW50ICZlbGVtZW50ID0gKnN0YXRpY19jYXN0PEhUTUxFbGVtZW50ICo+
KGltcGwoKSk7CisgICAgSFRNTEVsZW1lbnQgJmVsZW1lbnQgPSAqc3RhdGljX2Nhc3Q8SFRNTEVs
ZW1lbnQqPihpbXBsKCkpOwogICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgY2FzZSBFbGVt
ZW50SWQ6CiAgICAgICAgICAgICBlbGVtZW50LnNldElkKHN0cik7CkBAIC0zMjAyLDE0ICszMjA2
LDE0IEBAIEhUTUxFbGVtZW50ICp0b0hUTUxFbGVtZW50KEpTVmFsdWUgKnZhbCkKIHsKICAgICBp
ZiAoIXZhbCB8fCAhdmFsLT5pc09iamVjdCgmSlNIVE1MRWxlbWVudDo6aW5mbykpCiAgICAgICAg
IHJldHVybiAwOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPihzdGF0aWNf
Y2FzdDxKU0hUTUxFbGVtZW50ICo+KHZhbCktPmltcGwoKSk7CisgICAgcmV0dXJuIHN0YXRpY19j
YXN0PEhUTUxFbGVtZW50Kj4oc3RhdGljX2Nhc3Q8SlNIVE1MRWxlbWVudCo+KHZhbCktPmltcGwo
KSk7CiB9CiAKIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50ICp0b0hUTUxUYWJsZUNhcHRpb25FbGVt
ZW50KEpTVmFsdWUgKnZhbCkKIHsKICAgICBIVE1MRWxlbWVudCAqZSA9IHRvSFRNTEVsZW1lbnQo
dmFsKTsKICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcpKQotICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgKj4oZSk7CisgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxIVE1MVGFibGVDYXB0aW9uRWxlbWVudCo+KGUpOwogICAgIHJl
dHVybiAwOwogfQogCkBAIC0zMjE3LDcgKzMyMjEsNyBAQCBIVE1MVGFibGVTZWN0aW9uRWxlbWVu
dCAqdG9IVE1MVGFibGVTZWN0CiB7CiAgICAgSFRNTEVsZW1lbnQgKmUgPSB0b0hUTUxFbGVtZW50
KHZhbCk7CiAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUodGhlYWRUYWcpIHx8IGUtPmhhc1Rh
Z05hbWUodGJvZHlUYWcpIHx8IGUtPmhhc1RhZ05hbWUodGZvb3RUYWcpKSkKLSAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGUpOworICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqPihlKTsKICAgICByZXR1
cm4gMDsKIH0KIApAQCAtMzI0OCwxOSArMzI1MiwxOSBAQCBKU0hUTUxDb2xsZWN0aW9uOjp+SlNI
VE1MQ29sbGVjdGlvbigpCiAKIEpTVmFsdWUgKkpTSFRNTENvbGxlY3Rpb246Omxlbmd0aEdldHRl
cihFeGVjU3RhdGUgKmV4ZWMsIEpTT2JqZWN0ICpvcmlnaW5hbE9iamVjdCwgY29uc3QgSWRlbnRp
ZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNsb3QpCiB7Ci0gICAgSlNI
VE1MQ29sbGVjdGlvbiAqdGhpc09iaiA9IHN0YXRpY19jYXN0PEpTSFRNTENvbGxlY3Rpb24gKj4o
c2xvdC5zbG90QmFzZSgpKTsKKyAgICBKU0hUTUxDb2xsZWN0aW9uICp0aGlzT2JqID0gc3RhdGlj
X2Nhc3Q8SlNIVE1MQ29sbGVjdGlvbio+KHNsb3Quc2xvdEJhc2UoKSk7CiAgICAgcmV0dXJuIGpz
TnVtYmVyKHRoaXNPYmotPm1faW1wbC0+bGVuZ3RoKCkpOwogfQogCiBKU1ZhbHVlICpKU0hUTUxD
b2xsZWN0aW9uOjppbmRleEdldHRlcihFeGVjU3RhdGUgKmV4ZWMsIEpTT2JqZWN0ICpvcmlnaW5h
bE9iamVjdCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNs
b3QmIHNsb3QpCiB7Ci0gICAgSlNIVE1MQ29sbGVjdGlvbiAqdGhpc09iaiA9IHN0YXRpY19jYXN0
PEpTSFRNTENvbGxlY3Rpb24gKj4oc2xvdC5zbG90QmFzZSgpKTsKKyAgICBKU0hUTUxDb2xsZWN0
aW9uICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MQ29sbGVjdGlvbio+KHNsb3Quc2xvdEJh
c2UoKSk7CiAgICAgcmV0dXJuIHRvSlMoZXhlYywgdGhpc09iai0+bV9pbXBsLT5pdGVtKHNsb3Qu
aW5kZXgoKSkpOwogfQogCiBKU1ZhbHVlICpKU0hUTUxDb2xsZWN0aW9uOjpuYW1lR2V0dGVyKEV4
ZWNTdGF0ZSAqZXhlYywgSlNPYmplY3QgKm9yaWdpbmFsT2JqZWN0LCBjb25zdCBJZGVudGlmaWVy
JiBwcm9wZXJ0eU5hbWUsIGNvbnN0IFByb3BlcnR5U2xvdCYgc2xvdCkKIHsKLSAgICBKU0hUTUxD
b2xsZWN0aW9uICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MQ29sbGVjdGlvbiAqPihzbG90
LnNsb3RCYXNlKCkpOworICAgIEpTSFRNTENvbGxlY3Rpb24gKnRoaXNPYmogPSBzdGF0aWNfY2Fz
dDxKU0hUTUxDb2xsZWN0aW9uKj4oc2xvdC5zbG90QmFzZSgpKTsKICAgICByZXR1cm4gdGhpc09i
ai0+Z2V0TmFtZWRJdGVtcyhleGVjLCBwcm9wZXJ0eU5hbWUpOwogfQogCkBAIC0zMjcyLDcgKzMy
NzYsNyBAQCBib29sIEpTSFRNTENvbGxlY3Rpb246OmdldE93blByb3BlcnR5U2xvCiAgIH0gZWxz
ZSB7CiAgICAgLy8gTG9vayBpbiB0aGUgcHJvdG90eXBlIChmb3IgZnVuY3Rpb25zKSBiZWZvcmUg
YXNzdW1pbmcgaXQncyBhbiBpdGVtJ3MgbmFtZQogICAgIEpTVmFsdWUgKnByb3RvID0gcHJvdG90
eXBlKCk7Ci0gICAgaWYgKHByb3RvLT5pc09iamVjdCgpICYmIHN0YXRpY19jYXN0PEpTT2JqZWN0
ICo+KHByb3RvKS0+aGFzUHJvcGVydHkoZXhlYywgcHJvcGVydHlOYW1lKSkKKyAgICBpZiAocHJv
dG8tPmlzT2JqZWN0KCkgJiYgc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihwcm90byktPmhhc1Byb3Bl
cnR5KGV4ZWMsIHByb3BlcnR5TmFtZSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBu
YW1lIG9yIGluZGV4ID8KQEAgLTMzNDgsNyArMzM1Miw3IEBAIEpTVmFsdWUgKkhUTUxDb2xsZWN0
aW9uUHJvdG9GdW5jOjpjYWxsQXMKIHsKICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmSlNIVE1M
Q29sbGVjdGlvbjo6aW5mbykpCiAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9y
KTsKLSAgSFRNTENvbGxlY3Rpb24gJmNvbGwgPSAqc3RhdGljX2Nhc3Q8SlNIVE1MQ29sbGVjdGlv
biAqPih0aGlzT2JqKS0+aW1wbCgpOworICBIVE1MQ29sbGVjdGlvbiAmY29sbCA9ICpzdGF0aWNf
Y2FzdDxKU0hUTUxDb2xsZWN0aW9uKj4odGhpc09iaiktPmltcGwoKTsKIAogICBzd2l0Y2ggKGlk
KSB7CiAgIGNhc2UgSlNIVE1MQ29sbGVjdGlvbjo6SXRlbToKQEAgLTMzNTYsNyArMzM2MCw3IEBA
IEpTVmFsdWUgKkhUTUxDb2xsZWN0aW9uUHJvdG9GdW5jOjpjYWxsQXMKICAgY2FzZSBKU0hUTUxD
b2xsZWN0aW9uOjpUYWdzOgogICAgIHJldHVybiB0b0pTKGV4ZWMsIGNvbGwuYmFzZSgpLT5nZXRF
bGVtZW50c0J5VGFnTmFtZShhcmdzWzBdLT50b1N0cmluZyhleGVjKSkuZ2V0KCkpOwogICBjYXNl
IEpTSFRNTENvbGxlY3Rpb246Ok5hbWVkSXRlbToKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNI
VE1MQ29sbGVjdGlvbiAqPih0aGlzT2JqKS0+Z2V0TmFtZWRJdGVtcyhleGVjLCBJZGVudGlmaWVy
KGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTSFRN
TENvbGxlY3Rpb24qPih0aGlzT2JqKS0+Z2V0TmFtZWRJdGVtcyhleGVjLCBJZGVudGlmaWVyKGFy
Z3NbMF0tPnRvU3RyaW5nKGV4ZWMpKSk7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIGpzVW5kZWZp
bmVkKCk7CiAgIH0KQEAgLTMzNzEsNyArMzM3NSw3IEBAIEpTSFRNTFNlbGVjdENvbGxlY3Rpb246
OkpTSFRNTFNlbGVjdENvbGwKIAogSlNWYWx1ZSAqSlNIVE1MU2VsZWN0Q29sbGVjdGlvbjo6c2Vs
ZWN0ZWRJbmRleEdldHRlcihFeGVjU3RhdGUgKmV4ZWMsIEpTT2JqZWN0ICpvcmlnaW5hbE9iamVj
dCwgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBjb25zdCBQcm9wZXJ0eVNsb3QmIHNs
b3QpCiB7Ci0gICAgSlNIVE1MU2VsZWN0Q29sbGVjdGlvbiAqdGhpc09iaiA9IHN0YXRpY19jYXN0
PEpTSFRNTFNlbGVjdENvbGxlY3Rpb24gKj4oc2xvdC5zbG90QmFzZSgpKTsKKyAgICBKU0hUTUxT
ZWxlY3RDb2xsZWN0aW9uICp0aGlzT2JqID0gc3RhdGljX2Nhc3Q8SlNIVE1MU2VsZWN0Q29sbGVj
dGlvbio+KHNsb3Quc2xvdEJhc2UoKSk7CiAgICAgcmV0dXJuIGpzTnVtYmVyKHRoaXNPYmotPm1f
ZWxlbWVudC0+c2VsZWN0ZWRJbmRleCgpKTsKIH0KIApAQCAtMzQxMiw3ICszNDE2LDcgQEAgdm9p
ZCBKU0hUTUxTZWxlY3RDb2xsZWN0aW9uOjpwdXQoRXhlY1N0YQogICAgICAgICBSZWZQdHI8RWxl
bWVudD4gb3B0aW9uID0gbV9lbGVtZW50LT5vd25lckRvY3VtZW50KCktPmNyZWF0ZUVsZW1lbnQo
Im9wdGlvbiIsIGV4Y2VwdGlvbik7CiAgICAgICAgIGlmIChleGNlcHRpb24pCiAgICAgICAgICAg
YnJlYWs7ICAgICAgICAgCi0gICAgICAgIG1fZWxlbWVudC0+YWRkKHN0YXRpY19jYXN0PEhUTUxF
bGVtZW50ICo+KG9wdGlvbi5nZXQoKSksIDAsIGV4Y2VwdGlvbik7CisgICAgICAgIG1fZWxlbWVu
dC0+YWRkKHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4ob3B0aW9uLmdldCgpKSwgMCwgZXhjZXB0
aW9uKTsKICAgICAgICAgaWYgKGV4Y2VwdGlvbikKICAgICAgICAgICBicmVhazsKICAgICAgIH0g
d2hpbGUgKCsrZGlmZik7CkBAIC0zNDUwLDE4ICszNDU0LDE4IEBAIHZvaWQgSlNIVE1MU2VsZWN0
Q29sbGVjdGlvbjo6cHV0KEV4ZWNTdGEKICAgICAgIFJlZlB0cjxFbGVtZW50PiBkdW1teU9wdGlv
biA9IG1fZWxlbWVudC0+b3duZXJEb2N1bWVudCgpLT5jcmVhdGVFbGVtZW50KCJvcHRpb24iLCBl
eGNlcHRpb24pOwogICAgICAgaWYgKCFkdW1teU9wdGlvbikKICAgICAgICAgYnJlYWs7ICAgICAg
Ci0gICAgICBtX2VsZW1lbnQtPmFkZChzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCAqPihkdW1teU9w
dGlvbi5nZXQoKSksIDAsIGV4Y2VwdGlvbik7CisgICAgICBtX2VsZW1lbnQtPmFkZChzdGF0aWNf
Y2FzdDxIVE1MRWxlbWVudCo+KGR1bW15T3B0aW9uLmdldCgpKSwgMCwgZXhjZXB0aW9uKTsKICAg
ICAgIGlmIChleGNlcHRpb24pIAogICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICAvLyByZXBs
YWNlIGFuIGV4aXN0aW5nIGVudHJ5ID8KICAgfSBlbHNlIGlmIChkaWZmIDwgMCkgewotICAgIGJl
Zm9yZSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50ICo+KG1fZWxlbWVudC0+b3B0aW9ucygpLT5p
dGVtKHUrMSkpOworICAgIGJlZm9yZSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4obV9lbGVt
ZW50LT5vcHRpb25zKCktPml0ZW0odSsxKSk7CiAgICAgbV9lbGVtZW50LT5yZW1vdmUodSk7CiAg
IH0KICAgLy8gZmluYWxseSBhZGQgdGhlIG5ldyBlbGVtZW50CiAgIGlmIChleGNlcHRpb24gPT0g
MCkKLSAgICBtX2VsZW1lbnQtPmFkZChzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCAqPihv
cHRpb24pLCBiZWZvcmUsIGV4Y2VwdGlvbik7CisgICAgbV9lbGVtZW50LT5hZGQoc3RhdGljX2Nh
c3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihvcHRpb24pLCBiZWZvcmUsIGV4Y2VwdGlvbik7CiAKICAg
c2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGV4Y2VwdGlvbik7CiB9CkBAIC0zNDg1LDcgKzM0ODksNyBA
QCBKU09iamVjdCAqT3B0aW9uQ29uc3RydWN0b3JJbXA6OmNvbnN0cnVjCiAgIFJlZlB0cjxFbGVt
ZW50PiBlbChtX2RvYy0+Y3JlYXRlRWxlbWVudCgib3B0aW9uIiwgZXhjZXB0aW9uKSk7CiAgIEhU
TUxPcHRpb25FbGVtZW50ICpvcHQgPSAwOwogICBpZiAoZWwpIHsKLSAgICBvcHQgPSBzdGF0aWNf
Y2FzdDxIVE1MT3B0aW9uRWxlbWVudCAqPihlbC5nZXQoKSk7CisgICAgb3B0ID0gc3RhdGljX2Nh
c3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihlbC5nZXQoKSk7CiAgICAgaW50IHN6ID0gYXJncy5zaXpl
KCk7CiAgICAgUmVmUHRyPFRleHQ+IHQgPSBtX2RvYy0+Y3JlYXRlVGV4dE5vZGUoIiIpOwogICAg
IG9wdC0+YXBwZW5kQ2hpbGQodCwgZXhjZXB0aW9uKTsKQEAgLTM1MDAsNyArMzUwNCw3IEBAIEpT
T2JqZWN0ICpPcHRpb25Db25zdHJ1Y3RvckltcDo6Y29uc3RydWMKICAgfQogCiAgIHNldERPTUV4
Y2VwdGlvbihleGVjLCBleGNlcHRpb24pOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNPYmplY3Qg
Kj4odG9KUyhleGVjLG9wdCkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPih0b0pT
KGV4ZWMsb3B0KSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW1hZ2UgT2JqZWN0IC8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMzU1Nyw3ICszNTYxLDcgQEAgSlNWYWx1ZSAqZ2V0
U2VsZWN0SFRNTENvbGxlY3Rpb24oRXhlY1N0YQogICBET01PYmplY3QgKnJldDsKICAgaWYgKCFj
KQogICAgIHJldHVybiBqc051bGwoKTsKLSAgU2NyaXB0SW50ZXJwcmV0ZXIqIGludGVycCA9IHN0
YXRpY19jYXN0PFNjcmlwdEludGVycHJldGVyICo+KGV4ZWMtPmR5bmFtaWNJbnRlcnByZXRlcigp
KTsKKyAgU2NyaXB0SW50ZXJwcmV0ZXIqIGludGVycCA9IHN0YXRpY19jYXN0PFNjcmlwdEludGVy
cHJldGVyKj4oZXhlYy0+ZHluYW1pY0ludGVycHJldGVyKCkpOwogICBpZiAoKHJldCA9IGludGVy
cC0+Z2V0RE9NT2JqZWN0KGMpKSkKICAgICByZXR1cm4gcmV0OwogICBlbHNlIHsKSW5kZXg6IGJp
bmRpbmdzL29iamMvRE9NSFRNTC5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBiaW5kaW5ncy9vYmpjL0RPTUhU
TUwubW0JKHJldmlzaW9uIDE0MzMyKQorKysgYmluZGluZ3Mvb2JqYy9ET01IVE1MLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNCwxMiArMzQsMTcgQEAKICNpbXBvcnQgIkhUTUxBcHBsZXRFbGVtZW50
LmgiCiAjaW1wb3J0ICJIVE1MQmFzZUVsZW1lbnQuaCIKICNpbXBvcnQgIkhUTUxCYXNlRm9udEVs
ZW1lbnQuaCIKKyNpbXBvcnQgIkhUTUxCb2R5RWxlbWVudC5oIgogI2ltcG9ydCAiSFRNTEJ1dHRv
bkVsZW1lbnQuaCIKICNpbXBvcnQgIkhUTUxEb2N1bWVudC5oIgogI2ltcG9ydCAiSFRNTEVtYmVk
RWxlbWVudC5oIgogI2ltcG9ydCAiSFRNTEZpZWxkU2V0RWxlbWVudC5oIgogI2ltcG9ydCAiSFRN
TEZvcm1Db2xsZWN0aW9uLmgiCiAjaW1wb3J0ICJIVE1MRm9ybUVsZW1lbnQuaCIKKyNpbXBvcnQg
IkhUTUxGcmFtZVNldEVsZW1lbnQuaCIKKyNpbXBvcnQgIkhUTUxIZWFkRWxlbWVudC5oIgorI2lt
cG9ydCAiSFRNTEh0bWxFbGVtZW50LmgiCisjaW1wb3J0ICJIVE1MSUZyYW1lRWxlbWVudC5oIgog
I2ltcG9ydCAiSFRNTElzSW5kZXhFbGVtZW50LmgiCiAjaW1wb3J0ICJIVE1MTGFiZWxFbGVtZW50
LmgiCiAjaW1wb3J0ICJIVE1MTGVnZW5kRWxlbWVudC5oIgpAQCAtNjIsNyArNjcsNiBAQAogI2lt
cG9ydCAiSFRNTFRleHRBcmVhRWxlbWVudC5oIgogI2ltcG9ydCAiSFRNTFRpdGxlRWxlbWVudC5o
IgogI2ltcG9ydCAiTmFtZU5vZGVMaXN0LmgiCi0jaW1wb3J0ICJodG1sX2Jhc2VpbXBsLmgiCiAj
aW1wb3J0ICJodG1sX2Jsb2NraW1wbC5oIgogI2ltcG9ydCAiaHRtbF9pbWFnZWltcGwuaCIKICNp
bXBvcnQgImh0bWxfbGlzdGltcGwuaCIKQEAgLTM5NjQsNyArMzk2OCw3IEBAIHVzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOjpIVE1MTmFtZXM7CiAKIC8vIFRoZXNlICNpbXBvcnRzIGFuZCAidXNpbmdz
IiBhcmUgdXNlZCBvbmx5IGJ5IHZpZXdGb3JFbGVtZW50IGFuZCBzaG91bGQgYmUgZGVsZXRlZCAK
IC8vIHdoZW4gdGhhdCBmdW5jdGlvbiBnb2VzIGF3YXkuCi0jaW1wb3J0ICJyZW5kZXJfcmVwbGFj
ZWQuaCIKKyNpbXBvcnQgIlJlbmRlcldpZGdldC5oIgogdXNpbmcgV2ViQ29yZTo6UmVuZGVyT2Jq
ZWN0OwogdXNpbmcgV2ViQ29yZTo6UmVuZGVyV2lkZ2V0OwogCkluZGV4OiBodG1sL0hUTUxPYmpl
Y3RFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxPYmplY3RFbGVtZW50LmNwcAko
cmV2aXNpb24gMTQzMjcpCisrKyBodG1sL0hUTUxPYmplY3RFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzAsMTEgKzMwLDExIEBACiAjaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCiAjaW5j
bHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJS
ZW5kZXJQYXJ0T2JqZWN0LmgiCisjaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCiAjaW5jbHVkZSAi
VGV4dC5oIgogI2luY2x1ZGUgImNzc2hlbHBlci5oIgogI2luY2x1ZGUgImh0bWxfaW1hZ2VpbXBs
LmgiCi0jaW5jbHVkZSAicmVuZGVyX2ZyYW1lcy5oIgotI2luY2x1ZGUgInJlbmRlcl9yZXBsYWNl
ZC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKSW5kZXg6IGh0bWwvSFRNTEh0bWxFbGVtZW50
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MSHRtbEVsZW1lbnQuaAkocmV2aXNpb24gMTQzMjUp
CisrKyBodG1sL0hUTUxIdG1sRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMywyMTQgKzIz
LDE3IEBACiAgKgogICovCiAKLSNpZm5kZWYgSFRNTF9CQVNFSU1QTF9ICi0jZGVmaW5lIEhUTUxf
QkFTRUlNUExfSAorI2lmbmRlZiBIVE1MSHRtbEVsZW1lbnRfSAorI2RlZmluZSBIVE1MSHRtbEVs
ZW1lbnRfSAogCiAjaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKLSNpbmNsdWRlICJTY3JvbGxCYXJN
b2RlLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNs
YXNzIFN0cmluZzsKLWNsYXNzIEZyYW1lOwotY2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKLWNsYXNz
IFJlbmRlckZyYW1lU2V0OwotY2xhc3MgUmVuZGVyRnJhbWU7Ci1jbGFzcyBSZW5kZXJQYXJ0T2Jq
ZWN0OwotCi1zdHJ1Y3QgTGVuZ3RoOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhU
TUxCb2R5RWxlbWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxC
b2R5RWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEJvZHlFbGVtZW50KCk7Ci0KLSAg
ICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVy
biBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29u
c3QgeyByZXR1cm4gMTA7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0g
ICAgdm9pZCBjcmVhdGVMaW5rRGVjbCgpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0
dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFMaW5rKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRBTGluayhjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIGJhY2tn
cm91bmQoKSBjb25zdDsKLSAgICB2b2lkIHNldEJhY2tncm91bmQoY29uc3QgU3RyaW5nICYpOwot
ICAgIFN0cmluZyBiZ0NvbG9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRCZ0NvbG9yKGNvbnN0IFN0
cmluZyAmKTsKLSAgICBTdHJpbmcgbGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0TGluayhjb25z
dCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIHRleHQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHQo
Y29uc3QgU3RyaW5nICYpOwotICAgIFN0cmluZyB2TGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0
VkxpbmsoY29uc3QgU3RyaW5nICYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFi
bGVTdHlsZURlY2xhcmF0aW9uPiBtX2xpbmtEZWNsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBIVE1MRnJhbWVFbGVtZW50IDogcHVibGljIEhUTUxFbGVtZW50Ci17Ci0gICAg
ZnJpZW5kIGNsYXNzIFJlbmRlckZyYW1lOwotICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0T2Jq
ZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTEZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAg
ICBIVE1MRnJhbWVFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50
KiBkb2MpOwotICAgIH5IVE1MRnJhbWVFbGVtZW50KCk7Ci0KLSAgICB2b2lkIGluaXQoKTsKLQot
ICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkg
Y29uc3QgeyByZXR1cm4gMDsgfQotICAKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlICopOwotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAg
ICB2b2lkIGNsb3NlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2aXJ0
dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVu
ZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hICosIFJlbmRlclN0eWxlICopOwotCi0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0
dXJuIG1fbm9SZXNpemU7IH0KLQotICAgIHZvaWQgc2V0TG9jYXRpb24oY29uc3QgU3RyaW5nJik7
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZv
aWQgc2V0Rm9jdXMoYm9vbCk7Ci0KLSAgICBGcmFtZSogY29udGVudEZyYW1lKCkgY29uc3Q7Ci0g
ICAgRG9jdW1lbnQqIGNvbnRlbnREb2N1bWVudCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwg
Ym9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU2Nyb2xs
QmFyTW9kZSBzY3JvbGxpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0KLSAg
ICBpbnQgZ2V0TWFyZ2luV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9Ci0g
ICAgaW50IGdldE1hcmdpbkhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0OyB9
Ci0KLSAgICBTdHJpbmcgZnJhbWVCb3JkZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lQm9y
ZGVyKGNvbnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBsb25nRGVzYygpIGNvbnN0OwotICAg
IHZvaWQgc2V0TG9uZ0Rlc2MoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG1hcmdpbkhl
aWdodCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAmKTsK
LQotICAgIFN0cmluZyBtYXJnaW5XaWR0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luV2lk
dGgoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lk
IHNldE5hbWUoY29uc3QgU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXROb1Jlc2l6ZShib29sKTsK
LQotICAgIFN0cmluZyBzY3JvbGxpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldFNjcm9sbGluZyhj
b25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLSAgICB2
b2lkIHNldFNyYyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBpbnQgZnJhbWVXaWR0aCgpIGNvbnN0
OwotICAgIGludCBmcmFtZUhlaWdodCgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBp
c1VSTEFsbG93ZWQoY29uc3QgQXRvbWljU3RyaW5nICYpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9p
ZCBvcGVuVVJMKCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9VUkw7Ci0gICAgQXRvbWljU3RyaW5n
IG1fbmFtZTsKLQotICAgIGludCBtX21hcmdpbldpZHRoOwotICAgIGludCBtX21hcmdpbkhlaWdo
dDsKLSAgICBTY3JvbGxCYXJNb2RlIG1fc2Nyb2xsaW5nOwotCi0gICAgYm9vbCBtX2ZyYW1lQm9y
ZGVyIDogMTsKLSAgICBib29sIG1fZnJhbWVCb3JkZXJTZXQgOiAxOwotICAgIGJvb2wgbV9ub1Jl
c2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGcmFtZVNl
dEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLSAgICBmcmllbmQgY2xhc3MgUmVuZGVy
RnJhbWVTZXQ7Ci1wdWJsaWM6Ci0gICAgSFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9j
KTsKLSAgICB+SFRNTEZyYW1lU2V0RWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3Rh
dHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7
IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDEwOyB9Ci0g
ICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAgIHZp
cnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7Ci0gICAg
dmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVk
KFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJl
cihSZW5kZXJBcmVuYSAqLCBSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZWZh
dWx0RXZlbnRIYW5kbGVyKEV2ZW50ICpldnQpOwotCi0gICAgYm9vbCBmcmFtZUJvcmRlcigpIHsg
cmV0dXJuIGZyYW1lYm9yZGVyOyB9Ci0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG5vcmVz
aXplOyB9Ci0KLSAgICBpbnQgdG90YWxSb3dzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbFJvd3M7
IH0KLSAgICBpbnQgdG90YWxDb2xzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbENvbHM7IH0KLSAg
ICBpbnQgYm9yZGVyKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXI7IH0KLQotICAgIHZpcnR1YWwg
dm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKTsKLSAgICAKLSAgICBTdHJpbmcgY29s
cygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29scyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJp
bmcgcm93cygpIGNvbnN0OwotICAgIHZvaWQgc2V0Um93cyhjb25zdCBTdHJpbmcgJik7Ci0KLXBy
b3RlY3RlZDoKLSAgICBMZW5ndGgqIG1fcm93czsKLSAgICBMZW5ndGgqIG1fY29sczsKLQotICAg
IGludCBtX3RvdGFsUm93czsKLSAgICBpbnQgbV90b3RhbENvbHM7Ci0gICAgaW50IG1fYm9yZGVy
OwotCi0gICAgYm9vbCBmcmFtZWJvcmRlciA6IDE7Ci0gICAgYm9vbCBmcmFtZUJvcmRlclNldCA6
IDE7Ci0gICAgYm9vbCBub3Jlc2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxIZWFkRWxlbWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgot
ICAgIEhUTUxIZWFkRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEhlYWRFbGVtZW50
KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25z
dCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9y
aXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29u
c3QgTm9kZSogbmV3Q2hpbGQpOwotCi0gICAgU3RyaW5nIHByb2ZpbGUoKSBjb25zdDsKLSAgICB2
b2lkIHNldFByb2ZpbGUoY29uc3QgU3RyaW5nICYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCiBjbGFzcyBIVE1MSHRtbEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKIHsKIHB1Ymxp
YzoKLSAgICBIVE1MSHRtbEVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7CisgICAgSFRNTEh0bWxFbGVt
ZW50KERvY3VtZW50Kik7CiAgICAgfkhUTUxIdG1sRWxlbWVudCgpOwogCiAgICAgdmlydHVhbCBI
VE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVz
UmVxdWlyZWQ7IH0KQEAgLTIzOCw1MiArNDEsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29s
IGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKIAogICAgIFN0cmluZyB2ZXJzaW9uKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRWZXJzaW9uKGNvbnN0IFN0cmluZyAmKTsKLX07Ci0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSUZyYW1lRWxlbWVudCA6IHB1YmxpYyBIVE1M
RnJhbWVFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTElGcmFtZUVsZW1lbnQoRG9jdW1lbnQg
KmRvYyk7Ci0gICAgfkhUTUxJRnJhbWVFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdT
dGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJl
ZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQot
Ci0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5h
bWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9p
ZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpOwotCi0gICAgdmly
dHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92
ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0
dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIFJl
bmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwgUmVuZGVyU3R5bGUgKik7
Ci0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApOwotICAgIAot
ICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Owot
Ci0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJp
bmcgJik7Ci0KLSAgICBTdHJpbmcgaGVpZ2h0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQo
Y29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRXaWR0aChjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25z
dDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBib29s
IG5lZWRXaWRnZXRVcGRhdGU7Ci0KLSBwcml2YXRlOgotICAgIFN0cmluZyBvbGROYW1lQXR0cjsK
KyAgICB2b2lkIHNldFZlcnNpb24oY29uc3QgU3RyaW5nJik7CiB9OwogCiB9IC8vbmFtZXNwYWNl
CkluZGV4OiBodG1sL2h0bWxfYmFzZWltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvaHRtbF9i
YXNlaW1wbC5jcHAJKHJldmlzaW9uIDE0MzI1KQorKysgaHRtbC9odG1sX2Jhc2VpbXBsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMSw5NTUgKzAsMCBAQAotLyoqCi0gKiBUaGlzIGZpbGUgaXMgcGFy
dCBvZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGZvciBLREUuCi0gKgotICogQ29weXJpZ2h0IChD
KSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDE5OTkg
QW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDAg
U2ltb24gSGF1c21hbm4gKGhhdXNtYW5uQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDEg
RGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIw
MDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTEx
LTEzMDcsIFVTQS4KLSAqLwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaW5jbHVkZSAiY29uZmln
LmgiCi0jaW5jbHVkZSAiaHRtbF9iYXNlaW1wbC5oIgotCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlO
YW1lcy5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKLSNpbmNsdWRlICJFdmVudE5h
bWVzLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVRyZWUuaCIKLSNpbmNs
dWRlICJIVE1MRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJQ
YWdlLmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzaGVs
cGVyLmgiCi0jaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImRvbTJfZXZl
bnRzaW1wbC5oIgotI2luY2x1ZGUgInJlbmRlcl9mcmFtZXMuaCIKLQotbmFtZXNwYWNlIFdlYkNv
cmUgewotCi11c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKLXVzaW5nIG5hbWVzcGFjZSBIVE1M
TmFtZXM7Ci0KLUhUTUxCb2R5RWxlbWVudDo6SFRNTEJvZHlFbGVtZW50KERvY3VtZW50ICpkb2Mp
Ci0gICAgOiBIVE1MRWxlbWVudChib2R5VGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxCb2R5RWxlbWVu
dDo6fkhUTUxCb2R5RWxlbWVudCgpCi17Ci0gICAgaWYgKG1fbGlua0RlY2wpIHsKLSAgICAgICAg
bV9saW5rRGVjbC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgbV9saW5rRGVjbC0+c2V0UGFyZW50KDAp
OwotICAgIH0KLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6OmNyZWF0ZUxpbmtEZWNsKCkKLXsK
LSAgICBtX2xpbmtEZWNsID0gbmV3IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uOwotICAgIG1f
bGlua0RlY2wtPnNldFBhcmVudChkb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgbV9s
aW5rRGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICBtX2xpbmtEZWNsLT5zZXRTdHJpY3RQYXJzaW5n
KCFkb2N1bWVudCgpLT5pbkNvbXBhdE1vZGUoKSk7Ci19Ci0KLWJvb2wgSFRNTEJvZHlFbGVtZW50
OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1
dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSBiYWNrZ3JvdW5k
QXR0cikgewotICAgICAgICByZXN1bHQgPSAoTWFwcGVkQXR0cmlidXRlRW50cnkpKGVMYXN0RW50
cnkgKyBkb2N1bWVudCgpLT5kb2NJRCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0g
Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGJnY29sb3JBdHRyIHx8Ci0gICAgICAgIGF0dHJO
YW1lID09IHRleHRBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IG1hcmdpbndpZHRoQXR0ciB8
fAotICAgICAgICBhdHRyTmFtZSA9PSBsZWZ0bWFyZ2luQXR0ciB8fAotICAgICAgICBhdHRyTmFt
ZSA9PSBtYXJnaW5oZWlnaHRBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHRvcG1hcmdpbkF0
dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gYmdwcm9wZXJ0aWVzQXR0cikgewotICAgICAgICBy
ZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAg
cmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12
b2lkIEhUTUxCb2R5RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
ICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gYmFja2dyb3VuZEF0dHIpIHsKLSAg
ICAgICAgU3RyaW5nIHVybCA9IFdlYkNvcmU6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpOwotICAg
ICAgICBpZiAoIXVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRDU1NJbWFnZVByb3BlcnR5
KGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfSU1BR0UsIGRvY3VtZW50KCktPmNvbXBsZXRlVVJM
KHVybCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1hcmdpbndpZHRoQXR0ciB8
fCBhdHRyLT5uYW1lKCkgPT0gbGVmdG1hcmdpbkF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3Ro
KGF0dHIsIENTU19QUk9QX01BUkdJTl9SSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFk
ZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWFyZ2luaGVpZ2h0QXR0ciB8fCBhdHRyLT5u
YW1lKCkgPT0gdG9wbWFyZ2luQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfTUFSR0lOX0JPVFRPTSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fVE9QLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBiZ2NvbG9yQXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihh
dHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSB0ZXh0QXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihh
dHRyLCBDU1NfUFJPUF9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gYmdwcm9wZXJ0aWVzQXR0cikgewotICAgICAgICBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoYXR0ci0+dmFsdWUoKSwgImZpeGVkIikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0
eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0FUVEFDSE1FTlQsIENTU19WQUxfRklYRUQpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZsaW5rQXR0ciB8fAotICAgICAgICAgICAg
ICAgYXR0ci0+bmFtZSgpID09IGFsaW5rQXR0ciB8fAotICAgICAgICAgICAgICAgYXR0ci0+bmFt
ZSgpID09IGxpbmtBdHRyKSB7Ci0gICAgICAgIGlmIChhdHRyLT5pc051bGwoKSkgewotICAgICAg
ICAgICAgaWYgKGF0dHItPm5hbWUoKSA9PSBsaW5rQXR0cikKLSAgICAgICAgICAgICAgICBkb2N1
bWVudCgpLT5yZXNldExpbmtDb2xvcigpOwotICAgICAgICAgICAgZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IHZsaW5rQXR0cikKLSAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5yZXNldFZpc2l0
ZWRMaW5rQ29sb3IoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkb2N1bWVu
dCgpLT5yZXNldEFjdGl2ZUxpbmtDb2xvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2Ugewot
ICAgICAgICAgICAgaWYgKCFtX2xpbmtEZWNsKQotICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmtE
ZWNsKCk7Ci0gICAgICAgICAgICBtX2xpbmtEZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9DT0xP
UiwgYXR0ci0+dmFsdWUoKSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIFJlZlB0cjxDU1NW
YWx1ZT4gdmFsID0gbV9saW5rRGVjbC0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NfUFJPUF9DT0xP
Uik7Ci0gICAgICAgICAgICBpZiAodmFsICYmIHZhbC0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0g
ICAgICAgICAgICAgICAgQ29sb3IgY29sID0gZG9jdW1lbnQoKS0+c3R5bGVTZWxlY3RvcigpLT5n
ZXRDb2xvckZyb21QcmltaXRpdmVWYWx1ZShzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHZhbC5nZXQoKSkpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbGlua0F0
dHIpCi0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnNldExpbmtDb2xvcihjb2wpOwot
ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2bGlua0F0dHIpCi0gICAg
ICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnNldFZpc2l0ZWRMaW5rQ29sb3IoY29sKTsKLSAg
ICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnNldEFj
dGl2ZUxpbmtDb2xvcihjb2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBpZiAoYXR0YWNoZWQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50KCktPnJlY2FsY1N0
eWxlKEZvcmNlKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmxvYWRBdHRyKSB7
Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGxvYWRFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25iZWZvcmV1bmxvYWRB
dHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGJl
Zm9yZXVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bnVubG9hZEF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlz
dGVuZXIodW5sb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG9uYmx1ckF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlz
dGVuZXIoYmx1ckV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bmZvY3VzQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0
ZW5lcihmb2N1c0V2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bnJlc2l6ZUF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlz
dGVuZXIocmVzaXplRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG9uc2Nyb2xsQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRM
aXN0ZW5lcihzY3JvbGxFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVt
ZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1l
bnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBIVE1MRWxlbWVudDo6aW5zZXJ0ZWRJ
bnRvRG9jdW1lbnQoKTsKLQotICAgIC8vIEZJWE1FOiBwZXJoYXBzIHRoaXMgY29kZSBzaG91bGQg
YmUgaW4gYXR0YWNoKCkgaW5zdGVhZCBvZiBoZXJlCi0KLSAgICBGcmFtZVZpZXcgKncgPSBkb2N1
bWVudCgpLT52aWV3KCk7Ci0gICAgaWYgKHcgJiYgdy0+bWFyZ2luV2lkdGgoKSAhPSAtMSkKLSAg
ICAgICAgc2V0QXR0cmlidXRlKG1hcmdpbndpZHRoQXR0ciwgU3RyaW5nOjpudW1iZXIody0+bWFy
Z2luV2lkdGgoKSkpOwotICAgIGlmICh3ICYmIHctPm1hcmdpbkhlaWdodCgpICE9IC0xKQotICAg
ICAgICBzZXRBdHRyaWJ1dGUobWFyZ2luaGVpZ2h0QXR0ciwgU3RyaW5nOjpudW1iZXIody0+bWFy
Z2luSGVpZ2h0KCkpKTsKLQotICAgIGlmICh3KQotICAgICAgICB3LT5zY2hlZHVsZVJlbGF5b3V0
KCk7Ci19Ci0KLWJvb2wgSFRNTEJvZHlFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUg
KmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0
cjsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6YUxpbmsoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYWxpbmtBdHRyKTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6
OnNldEFMaW5rKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaW5r
QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEJvZHlFbGVtZW50OjpiYWNrZ3JvdW5kKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGJhY2tncm91bmRBdHRyKTsKLX0KLQot
dm9pZCBIVE1MQm9keUVsZW1lbnQ6OnNldEJhY2tncm91bmQoY29uc3QgU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYmFja2dyb3VuZEF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxCb2R5RWxlbWVudDo6YmdDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZShiZ2NvbG9yQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRCZ0NvbG9y
KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OmxpbmsoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUobGlua0F0dHIpOwotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVu
dDo6c2V0TGluayhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsaW5r
QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEJvZHlFbGVtZW50Ojp0ZXh0KCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHRleHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MQm9k
eUVsZW1lbnQ6OnNldFRleHQoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUodGV4dEF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6dkxpbmso
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmxpbmtBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MQm9keUVsZW1lbnQ6OnNldFZMaW5rKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKHZsaW5rQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLUhUTUxGcmFtZUVsZW1lbnQ6OkhUTUxGcmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAg
ICA6IEhUTUxFbGVtZW50KGZyYW1lVGFnLCBkb2MpCi17Ci0gICAgaW5pdCgpOwotfQotCi1IVE1M
RnJhbWVFbGVtZW50OjpIVE1MRnJhbWVFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05h
bWUsIERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudCh0YWdOYW1lLCBkb2MpCi17Ci0g
ICAgaW5pdCgpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OmluaXQoKQotewotICAgIG1f
ZnJhbWVCb3JkZXIgPSB0cnVlOwotICAgIG1fZnJhbWVCb3JkZXJTZXQgPSBmYWxzZTsKLSAgICBt
X21hcmdpbldpZHRoID0gLTE7Ci0gICAgbV9tYXJnaW5IZWlnaHQgPSAtMTsKLSAgICBtX3Njcm9s
bGluZyA9IFNjcm9sbEJhckF1dG87Ci0gICAgbV9ub1Jlc2l6ZSA9IGZhbHNlOwotfQotCi1IVE1M
RnJhbWVFbGVtZW50Ojp+SFRNTEZyYW1lRWxlbWVudCgpCi17Ci19Ci0KLWJvb2wgSFRNTEZyYW1l
RWxlbWVudDo6aXNVUkxBbGxvd2VkKGNvbnN0IEF0b21pY1N0cmluZyAmVVJMU3RyaW5nKSBjb25z
dAotewotICAgIGlmIChVUkxTdHJpbmcuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICAKLSAgICBGcmFtZVZpZXcgKncgPSBkb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgaWYgKCF3
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBLVVJMIG5ld1VSTChkb2N1bWVudCgpLT5j
b21wbGV0ZVVSTChVUkxTdHJpbmcuZGVwcmVjYXRlZFN0cmluZygpKSk7Ci0gICAgbmV3VVJMLnNl
dFJlZihEZXByZWNhdGVkU3RyaW5nOjpudWxsKTsKLQotICAgIC8vIERvbid0IGFsbG93IG1vcmUg
dGhhbiAxMDAwIHRvdGFsIGZyYW1lcyBpbiBhIHNldC4gVGhpcyBzZWVtcwotICAgIC8vIGxpa2Ug
YSByZWFzb25hYmxlIHVwcGVyIGJvdW5kLCBhbmQgb3RoZXJ3aXNlIG11dHVhbGx5IHJlY3Vyc2l2
ZQotICAgIC8vIGZyYW1lc2V0IHBhZ2VzIGNhbiBxdWlja2x5IGJyaW5nIHRoZSBwcm9ncmFtIHRv
IGl0cyBrbmVlcyB3aXRoCi0gICAgLy8gZXhwb25lbnRpYWwgZ3Jvd3RoIGluIHRoZSBudW1iZXIg
b2YgZnJhbWVzLgotCi0gICAgLy8gRklYTUU6IFRoaXMgbGltaXQgY291bGQgYmUgaGlnaGVyLCBi
dXQgV2ViS2l0IGhhcyBzb21lCi0gICAgLy8gYWxnb3JpdGhtcyB0aGF0IGhhcHBlbiB3aGlsZSBs
b2FkaW5nIHdoaWNoIGFwcGVhciB0byBiZSBOXjIgb3IKLSAgICAvLyB3b3JzZSBpbiB0aGUgbnVt
YmVyIG9mIGZyYW1lcwotICAgIGlmICh3LT5mcmFtZSgpLT5wYWdlKCktPmZyYW1lQ291bnQoKSA+
PSAyMDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFdlIGFsbG93
IG9uZSBsZXZlbCBvZiBzZWxmLXJlZmVyZW5jZSBiZWNhdXNlIHNvbWUgc2l0ZXMgZGVwZW5kIG9u
IHRoYXQuCi0gICAgLy8gQnV0IHdlIGRvbid0IGFsbG93IG1vcmUgdGhhbiBvbmUuCi0gICAgYm9v
bCBmb3VuZFNlbGZSZWZlcmVuY2UgPSBmYWxzZTsKLSAgICBmb3IgKEZyYW1lICpmcmFtZSA9IHct
PmZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnBhcmVudCgpKSB7Ci0gICAg
ICAgIEtVUkwgZnJhbWVVUkwgPSBmcmFtZS0+dXJsKCk7Ci0gICAgICAgIGZyYW1lVVJMLnNldFJl
ZihEZXByZWNhdGVkU3RyaW5nOjpudWxsKTsKLSAgICAgICAgaWYgKGZyYW1lVVJMID09IG5ld1VS
TCkgewotICAgICAgICAgICAgaWYgKGZvdW5kU2VsZlJlZmVyZW5jZSkgewotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvdW5kU2VsZlJl
ZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6b3BlblVSTCgpCi17Ci0gICAgRnJhbWVWaWV3
ICp3ID0gZG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlmICghdykKLSAgICAgICAgcmV0dXJuOwot
ICAgIAotICAgIEF0b21pY1N0cmluZyByZWxhdGl2ZVVSTCA9IG1fVVJMOwotICAgIGlmIChyZWxh
dGl2ZVVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJlbGF0aXZlVVJMID0gImFib3V0OmJsYW5rIjsK
LQotICAgIC8vIExvYWQgdGhlIGZyYW1lIGNvbnRlbnRzLgotICAgIEZyYW1lKiBwYXJlbnRGcmFt
ZSA9IHctPmZyYW1lKCk7Ci0gICAgaWYgKEZyYW1lKiBjaGlsZEZyYW1lID0gcGFyZW50RnJhbWUt
PnRyZWUoKS0+Y2hpbGQobV9uYW1lKSkKLSAgICAgICAgY2hpbGRGcmFtZS0+b3BlblVSTChkb2N1
bWVudCgpLT5jb21wbGV0ZVVSTChyZWxhdGl2ZVVSTC5kZXByZWNhdGVkU3RyaW5nKCkpKTsKLSAg
ICBlbHNlCi0gICAgICAgIHBhcmVudEZyYW1lLT5yZXF1ZXN0RnJhbWUoc3RhdGljX2Nhc3Q8UmVu
ZGVyRnJhbWUgKj4ocmVuZGVyZXIoKSksIHJlbGF0aXZlVVJMLCBtX25hbWUpOwotfQotCi0KLXZv
aWQgSFRNTEZyYW1lRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
ICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cikgewotICAgICAgICBz
ZXRMb2NhdGlvbihXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKSk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gaWRBdHRyKSB7Ci0gICAgICAgIC8vIEltcG9ydGFudCB0byBj
YWxsIHRocm91Z2ggdG8gYmFzZSBmb3IgdGhlIGlkIGF0dHJpYnV0ZSBzbyB0aGUgaGFzSUQgYml0
IGdldHMgc2V0LgotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0
cik7Ci0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgbV9uYW1lID0gYXR0ci0+dmFsdWUoKTsK
LSAgICAgICAgLy8gRklYTUU6IElmIHdlIGFyZSBhbHJlYWR5IGF0dGFjaGVkLCB0aGlzIGRvZXNu
J3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBmcmFtZSdzIG5hbWUuCi0gICAgICAgIC8vIEZJWE1FOiBJ
ZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBkb2Vzbid0IGNoZWNrIGZvciBmcmFtZSBu
YW1lCi0gICAgICAgIC8vIGNvbmZsaWN0cyBhbmQgZ2VuZXJhdGUgYSB1bmlxdWUgZnJhbWUgbmFt
ZS4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBmcmFtZWJvcmRlckF0dHIpIHsKLSAg
ICAgICAgbV9mcmFtZUJvcmRlciA9IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgbV9m
cmFtZUJvcmRlclNldCA9ICFhdHRyLT5pc051bGwoKTsKLSAgICAgICAgLy8gRklYTUU6IElmIHdl
IGFyZSBhbHJlYWR5IGF0dGFjaGVkLCB0aGlzIGhhcyBubyBlZmZlY3QuCi0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gbWFyZ2lud2lkdGhBdHRyKSB7Ci0gICAgICAgIG1fbWFyZ2luV2lk
dGggPSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUg
YWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IG1hcmdpbmhlaWdodEF0dHIpIHsKLSAgICAgICAgbV9tYXJnaW5IZWlnaHQg
PSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxy
ZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG5vcmVzaXplQXR0cikgewotICAgICAgICBtX25vUmVzaXplID0gdHJ1ZTsKLSAg
ICAgICAgLy8gRklYTUU6IElmIHdlIGFyZSBhbHJlYWR5IGF0dGFjaGVkLCB0aGlzIGhhcyBubyBl
ZmZlY3QuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gc2Nyb2xsaW5nQXR0cikgewot
ICAgICAgICAvLyBBdXRvIGFuZCB5ZXMgYm90aCBzaW1wbHkgbWVhbiAiYWxsb3cgc2Nyb2xsaW5n
LiIgTm8gbWVhbnMgImRvbid0IGFsbG93IHNjcm9sbGluZy4iCi0gICAgICAgIGlmIChlcXVhbEln
bm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAiYXV0byIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGF0
dHItPnZhbHVlKCksICJ5ZXMiKSkKLSAgICAgICAgICAgIG1fc2Nyb2xsaW5nID0gU2Nyb2xsQmFy
QXV0bzsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwg
Im5vIikpCi0gICAgICAgICAgICBtX3Njcm9sbGluZyA9IFNjcm9sbEJhckFsd2F5c09mZjsKLSAg
ICAgICAgLy8gRklYTUU6IElmIHdlIGFyZSBhbHJlYWR5IGF0dGFjaGVkLCB0aGlzIGhhcyBubyBl
ZmZlY3QuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25sb2FkQXR0cikgewotICAg
ICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihsb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG9uYmVmb3JldW5sb2FkQXR0cikgewotICAgICAgICAvLyBGSVhN
RTogc2hvdWxkIDxmcmFtZT4gZWxlbWVudHMgaGF2ZSBiZWZvcmV1bmxvYWQgaGFuZGxlcnM/Ci0g
ICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGJlZm9yZXVubG9hZEV2ZW50LCBhdHRyKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnVubG9hZEF0dHIpIHsKLSAgICAgICAgc2V0
SFRNTEV2ZW50TGlzdGVuZXIodW5sb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAg
ICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRN
TEZyYW1lRWxlbWVudDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0g
ICAgLy8gSWdub3JlIGRpc3BsYXk6IG5vbmUuCi0gICAgcmV0dXJuIGlzVVJMQWxsb3dlZChtX1VS
TCk7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTEZyYW1lRWxlbWVudDo6Y3JlYXRlUmVuZGVyZXIo
UmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5l
dyAoYXJlbmEpIFJlbmRlckZyYW1lKHRoaXMpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6
OmF0dGFjaCgpCi17Ci0gICAgbV9uYW1lID0gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLSAgICBp
ZiAobV9uYW1lLmlzTnVsbCgpKQotICAgICAgICBtX25hbWUgPSBnZXRBdHRyaWJ1dGUoaWRBdHRy
KTsKLQotICAgIC8vIGluaGVyaXQgZGVmYXVsdCBzZXR0aW5ncyBmcm9tIHBhcmVudCBmcmFtZXNl
dAotICAgIGZvciAoTm9kZSAqbm9kZSA9IHBhcmVudE5vZGUoKTsgbm9kZTsgbm9kZSA9IG5vZGUt
PnBhcmVudE5vZGUoKSkKLSAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcp
KSB7Ci0gICAgICAgICAgICBIVE1MRnJhbWVTZXRFbGVtZW50KiBmcmFtZXNldCA9IHN0YXRpY19j
YXN0PEhUTUxGcmFtZVNldEVsZW1lbnQqPihub2RlKTsKLSAgICAgICAgICAgIGlmICghbV9mcmFt
ZUJvcmRlclNldCkKLSAgICAgICAgICAgICAgICBtX2ZyYW1lQm9yZGVyID0gZnJhbWVzZXQtPmZy
YW1lQm9yZGVyKCk7Ci0gICAgICAgICAgICBpZiAoIW1fbm9SZXNpemUpCi0gICAgICAgICAgICAg
ICAgbV9ub1Jlc2l6ZSA9IGZyYW1lc2V0LT5ub1Jlc2l6ZSgpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLQotICAgIEhUTUxFbGVtZW50OjphdHRhY2goKTsKLQotICAgIGlmICghcmVu
ZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQo
KS0+ZnJhbWUoKTsKLQotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZy
YW1lLT5wYWdlKCktPmluY3JlbWVudEZyYW1lQ291bnQoKTsKLSAgICAKLSAgICBBdG9taWNTdHJp
bmcgcmVsYXRpdmVVUkwgPSBtX1VSTDsKLSAgICBpZiAocmVsYXRpdmVVUkwuaXNFbXB0eSgpKQot
ICAgICAgICByZWxhdGl2ZVVSTCA9ICJhYm91dDpibGFuayI7Ci0KLSAgICBtX25hbWUgPSBmcmFt
ZS0+dHJlZSgpLT51bmlxdWVDaGlsZE5hbWUobV9uYW1lKTsKLQotICAgIC8vIGxvYWQgdGhlIGZy
YW1lIGNvbnRlbnRzCi0gICAgZnJhbWUtPnJlcXVlc3RGcmFtZShzdGF0aWNfY2FzdDxSZW5kZXJG
cmFtZSo+KHJlbmRlcmVyKCkpLCByZWxhdGl2ZVVSTCwgbV9uYW1lKTsKLX0KLQotdm9pZCBIVE1M
RnJhbWVFbGVtZW50OjpjbG9zZSgpCi17Ci0gICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQoKS0+
ZnJhbWUoKTsKLSAgICBpZiAocmVuZGVyZXIoKSAmJiBmcmFtZSkgewotICAgICAgICBmcmFtZS0+
cGFnZSgpLT5kZWNyZW1lbnRGcmFtZUNvdW50KCk7Ci0gICAgICAgIGlmIChGcmFtZSogY2hpbGRG
cmFtZSA9IGZyYW1lLT50cmVlKCktPmNoaWxkKG1fbmFtZSkpCi0gICAgICAgICAgICBjaGlsZEZy
YW1lLT5mcmFtZURldGFjaGVkKCk7Ci0gICAgfQotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6
OndpbGxSZW1vdmUoKQotewotICAgIC8vIGNsb3NlIHRoZSBmcmFtZSBhbmQgZGlzc29jaWF0ZSB0
aGUgcmVuZGVyZXIsIGJ1dCBsZWF2ZSB0aGUKLSAgICAvLyBub2RlIGF0dGFjaGVkIHNvIHRoYXQg
ZnJhbWUgZG9lcyBub3QgZ2V0IHJlLWF0dGFjaGVkIGJlZm9yZQotICAgIC8vIGFjdHVhbGx5IGxl
YXZpbmcgdGhlIGRvY3VtZW50LiAgc2VlIDxyZGFyOi8vcHJvYmxlbS80MTMyNTgxPgotICAgIGNs
b3NlKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgcmVuZGVyZXIoKS0+ZGVzdHJv
eSgpOwotICAgICAgICBzZXRSZW5kZXJlcigwKTsKLSAgICB9Ci0gICAgCi0gICAgSFRNTEVsZW1l
bnQ6OndpbGxSZW1vdmUoKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpkZXRhY2goKQot
ewotICAgIGNsb3NlKCk7Ci0gICAgSFRNTEVsZW1lbnQ6OmRldGFjaCgpOwotfQotCi12b2lkIEhU
TUxGcmFtZUVsZW1lbnQ6OnNldExvY2F0aW9uKGNvbnN0IFN0cmluZyYgc3RyKQotewotICAgIG1f
VVJMID0gQXRvbWljU3RyaW5nKHN0cik7Ci0KLSAgICBpZiAoIWF0dGFjaGVkKCkpIHsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyBIYW5kbGUgdGhlIGNvbW1vbiBjYXNlIHdo
ZXJlIHdlIGRlY2lkZWQgbm90IHRvIG1ha2UgYSBmcmFtZSB0aGUgZmlyc3QgdGltZS4KLSAgICAv
LyBEZXRhY2ggYW5kIHRoZSBsZXQgYXR0YWNoKCkgZGVjaWRlIGFnYWluIHdoZXRoZXIgdG8gbWFr
ZSB0aGUgZnJhbWUgZm9yIHRoaXMgVVJMLgotICAgIGlmICghcmVuZGVyZXIoKSkgewotICAgICAg
ICBkZXRhY2goKTsKLSAgICAgICAgYXR0YWNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgCi0gICAgaWYgKCFpc1VSTEFsbG93ZWQobV9VUkwpKSB7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICBvcGVuVVJMKCk7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lRWxlbWVudDo6aXNGb2N1
c2FibGUoKSBjb25zdAotewotICAgIHJldHVybiByZW5kZXJlcigpOwotfQotCi12b2lkIEhUTUxG
cmFtZUVsZW1lbnQ6OnNldEZvY3VzKGJvb2wgcmVjZWl2ZWQpCi17Ci0gICAgSFRNTEVsZW1lbnQ6
OnNldEZvY3VzKHJlY2VpdmVkKTsKLSAgICBXZWJDb3JlOjpSZW5kZXJGcmFtZSAqcmVuZGVyRnJh
bWUgPSBzdGF0aWNfY2FzdDxXZWJDb3JlOjpSZW5kZXJGcmFtZSAqPihyZW5kZXJlcigpKTsKLSAg
ICBpZiAoIXJlbmRlckZyYW1lIHx8ICFyZW5kZXJGcmFtZS0+d2lkZ2V0KCkpCi0gICAgICAgIHJl
dHVybjsKLSAgICBpZiAocmVjZWl2ZWQpCi0gICAgICAgIHJlbmRlckZyYW1lLT53aWRnZXQoKS0+
c2V0Rm9jdXMoKTsKLSAgICBlbHNlCi0gICAgICAgIHJlbmRlckZyYW1lLT53aWRnZXQoKS0+Y2xl
YXJGb2N1cygpOwotfQotCi1GcmFtZSogSFRNTEZyYW1lRWxlbWVudDo6Y29udGVudEZyYW1lKCkg
Y29uc3QKLXsKLSAgICAvLyBTdGFydCB3aXRoIHRoZSBwYXJ0IHRoYXQgY29udGFpbnMgdGhpcyBl
bGVtZW50LCBvdXIgb3duZXJEb2N1bWVudC4KLSAgICBGcmFtZSogcGFyZW50RnJhbWUgPSBkb2N1
bWVudCgpLT5mcmFtZSgpOwotICAgIGlmICghcGFyZW50RnJhbWUpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgLy8gRmluZCB0aGUgcGFydCBmb3IgdGhlIHN1YmZyYW1lIHRoYXQgdGhpcyBlbGVt
ZW50IHJlcHJlc2VudHMuCi0gICAgcmV0dXJuIHBhcmVudEZyYW1lLT50cmVlKCktPmNoaWxkKG1f
bmFtZSk7Ci19Ci0KLURvY3VtZW50KiBIVE1MRnJhbWVFbGVtZW50Ojpjb250ZW50RG9jdW1lbnQo
KSBjb25zdAotewotICAgIEZyYW1lKiBmcmFtZSA9IGNvbnRlbnRGcmFtZSgpOwotICAgIGlmICgh
ZnJhbWUpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmcmFtZS0+ZG9jdW1lbnQoKTsK
LX0KLQotYm9vbCBIVE1MRnJhbWVFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0
dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyOwotfQotCi1T
dHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6ZnJhbWVCb3JkZXIoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoZnJhbWVib3JkZXJBdHRyKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVt
ZW50OjpzZXRGcmFtZUJvcmRlcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShmcmFtZWJvcmRlckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxGcmFtZUVsZW1l
bnQ6OmxvbmdEZXNjKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxvbmdkZXNj
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0TG9uZ0Rlc2MoY29uc3QgU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobG9uZ2Rlc2NBdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjptYXJnaW5IZWlnaHQoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUobWFyZ2luaGVpZ2h0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZy
YW1lRWxlbWVudDo6c2V0TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKG1hcmdpbmhlaWdodEF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxG
cmFtZUVsZW1lbnQ6Om1hcmdpbldpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKG1hcmdpbndpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0TWFy
Z2luV2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobWFyZ2lu
d2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjpuYW1lKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLX0KLQotdm9pZCBI
VE1MRnJhbWVFbGVtZW50OjpzZXROYW1lKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKG5hbWVBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6
c2V0Tm9SZXNpemUoYm9vbCBub1Jlc2l6ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobm9yZXNpemVB
dHRyLCBub1Jlc2l6ZSA/ICIiIDogMCk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50Ojpz
Y3JvbGxpbmcoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoc2Nyb2xsaW5nQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0U2Nyb2xsaW5nKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNjcm9sbGluZ0F0dHIsIHZhbHVlKTsKLX0K
LQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShzcmNBdHRyKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRTcmMo
Y29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc3JjQXR0ciwgdmFsdWUp
OwotfQotCi1pbnQgSFRNTEZyYW1lRWxlbWVudDo6ZnJhbWVXaWR0aCgpIGNvbnN0Ci17Ci0gICAg
aWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBkb2N1bWVudCgp
LT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKLSAgICByZXR1cm4gcmVu
ZGVyZXIoKS0+d2lkdGgoKTsKLX0KLQotaW50IEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lSGVpZ2h0
KCkgY29uc3QKLXsKLSAgICBpZiAoIXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybiAwOwotICAg
IAotICAgIGRvY3VtZW50KCktPnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygp
OwotICAgIHJldHVybiByZW5kZXJlcigpLT5oZWlnaHQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1IVE1MRnJhbWVTZXRFbGVtZW50OjpIVE1MRnJhbWVTZXRFbGVtZW50KERvY3VtZW50
ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudChmcmFtZXNldFRhZywgZG9jKQotewotICAgIC8vIGRl
ZmF1bHQgdmFsdWUgZm9yIHJvd3MgYW5kIGNvbHMuLi4KLSAgICBtX3RvdGFsUm93cyA9IDE7Ci0g
ICAgbV90b3RhbENvbHMgPSAxOwotCi0gICAgbV9yb3dzID0gbV9jb2xzID0gMDsKLQotICAgIGZy
YW1lYm9yZGVyID0gdHJ1ZTsKLSAgICBmcmFtZUJvcmRlclNldCA9IGZhbHNlOwotICAgIG1fYm9y
ZGVyID0gNDsKLSAgICBub3Jlc2l6ZSA9IGZhbHNlOwotfQotCi1IVE1MRnJhbWVTZXRFbGVtZW50
Ojp+SFRNTEZyYW1lU2V0RWxlbWVudCgpCi17Ci0gICAgaWYgKG1fcm93cykKLSAgICAgICAgZGVs
ZXRlIFtdIG1fcm93czsKLSAgICBpZiAobV9jb2xzKQotICAgICAgICBkZWxldGUgW10gbV9jb2xz
OwotfQotCi1ib29sIEhUTUxGcmFtZVNldEVsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5l
d0NoaWxkKQotewotICAgIC8vIEZJWE1FOiBPbGQgY29kZSBoYWQgYWRqYWNlbnQgZG91YmxlIHJl
dHVybnMgYW5kIHNlZW1lZCB0byB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIE5PRlJBTUVTIChi
dXQgZGlkbid0KS4KLSAgICAvLyBXaGF0IGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yPwotICAgIHJl
dHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykgfHwgbmV3Q2hpbGQtPmhhc1Rh
Z05hbWUoZnJhbWVUYWcpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFt
ZSgpID09IHJvd3NBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAg
ICAgICAgIGlmIChtX3Jvd3MpIGRlbGV0ZSBbXSBtX3Jvd3M7Ci0gICAgICAgICAgICBtX3Jvd3Mg
PSBhdHRyLT52YWx1ZSgpLnRvTGVuZ3RoQXJyYXkobV90b3RhbFJvd3MpOwotICAgICAgICAgICAg
c2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
Y29sc0F0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT5pc051bGwoKSkgewotICAgICAgICAgICAg
ZGVsZXRlIFtdIG1fY29sczsKLSAgICAgICAgICAgIG1fY29scyA9IGF0dHItPnZhbHVlKCkudG9M
ZW5ndGhBcnJheShtX3RvdGFsQ29scyk7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKCk7Ci0gICAg
ICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBmcmFtZWJvcmRlckF0dHIpIHsK
LSAgICAgICAgLy8gZmFsc2Ugb3IgIm5vIiBvciAiMCIuLgotICAgICAgICBpZiAoIGF0dHItPnZh
bHVlKCkudG9JbnQoKSA9PSAwICkgewotICAgICAgICAgICAgZnJhbWVib3JkZXIgPSBmYWxzZTsK
LSAgICAgICAgICAgIG1fYm9yZGVyID0gMDsKLSAgICAgICAgfQotICAgICAgICBmcmFtZUJvcmRl
clNldCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbm9yZXNpemVBdHRy
KSB7Ci0gICAgICAgIG5vcmVzaXplID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBib3JkZXJBdHRyKSB7Ci0gICAgICAgIG1fYm9yZGVyID0gYXR0ci0+dmFsdWUoKS50b0lu
dCgpOwotICAgICAgICBpZighbV9ib3JkZXIpCi0gICAgICAgICAgICBmcmFtZWJvcmRlciA9IGZh
bHNlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9ubG9hZEF0dHIpIHsKLSAgICAg
ICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIobG9hZEV2ZW50LCBhdHRy
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJlZm9yZXVubG9hZEF0dHIpIHsK
LSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoYmVmb3JldW5s
b2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9udW5sb2Fk
QXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcih1
bmxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1MRnJhbWVTZXRFbGVtZW50Ojpy
ZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICAvLyBJZ25vcmUgZGlz
cGxheTogbm9uZSBidXQgZG8gcGF5IGF0dGVudGlvbiBpZiBhIHN0eWxlc2hlZXQgaGFzIGNhdXNl
ZCB1cyB0byBkZWxheSBvdXIgbG9hZGluZy4KLSAgICByZXR1cm4gc3R5bGUtPmlzU3R5bGVBdmFp
bGFibGUoKTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MRnJhbWVTZXRFbGVtZW50OjpjcmVhdGVS
ZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICBy
ZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyRnJhbWVTZXQodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEZy
YW1lU2V0RWxlbWVudDo6YXR0YWNoKCkKLXsKLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgc2V0dGlu
Z3MgZnJvbSBwYXJlbnQgZnJhbWVzZXQKLSAgICBIVE1MRWxlbWVudCogbm9kZSA9IHN0YXRpY19j
YXN0PEhUTUxFbGVtZW50Kj4ocGFyZW50Tm9kZSgpKTsKLSAgICB3aGlsZShub2RlKQotICAgIHsK
LSAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKSB7Ci0gICAgICAgICAg
ICBIVE1MRnJhbWVTZXRFbGVtZW50KiBmcmFtZXNldCA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZVNl
dEVsZW1lbnQqPihub2RlKTsKLSAgICAgICAgICAgIGlmKCFmcmFtZUJvcmRlclNldCkgIGZyYW1l
Ym9yZGVyID0gZnJhbWVzZXQtPmZyYW1lQm9yZGVyKCk7Ci0gICAgICAgICAgICBpZighbm9yZXNp
emUpICBub3Jlc2l6ZSA9IGZyYW1lc2V0LT5ub1Jlc2l6ZSgpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4obm9k
ZS0+cGFyZW50Tm9kZSgpKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci19
Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudCAq
ZXZ0KQotewotICAgIGlmIChldnQtPmlzTW91c2VFdmVudCgpICYmICFub3Jlc2l6ZSAmJiByZW5k
ZXJlcigpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PFdlYkNvcmU6OlJlbmRlckZyYW1lU2V0ICo+
KHJlbmRlcmVyKCkpLT51c2VyUmVzaXplKHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldnQpKTsK
LSAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgIH0KLQotICAgIEhUTUxFbGVt
ZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxl
bWVudDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAgICBpZiAoY2hhbmdlZCgp
ICYmIHJlbmRlcmVyKCkpIHsKLSAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXQodHJ1
ZSk7Ci0gICAgICAgIHNldENoYW5nZWQoZmFsc2UpOwotICAgIH0KLSAgICBIVE1MRWxlbWVudDo6
cmVjYWxjU3R5bGUoIGNoICk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVTZXRFbGVtZW50Ojpjb2xz
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNvbHNBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpzZXRDb2xzKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGNvbHNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVT
ZXRFbGVtZW50Ojpyb3dzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHJvd3NB
dHRyKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpzZXRSb3dzKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJvd3NBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEhlYWRFbGVtZW50OjpIVE1MSGVhZEVsZW1lbnQoRG9j
dW1lbnQgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50KGhlYWRUYWcsIGRvYykKLXsKLX0KLQotSFRN
TEhlYWRFbGVtZW50Ojp+SFRNTEhlYWRFbGVtZW50KCkKLXsKLX0KLQotU3RyaW5nIEhUTUxIZWFk
RWxlbWVudDo6cHJvZmlsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShwcm9m
aWxlQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEhlYWRFbGVtZW50OjpzZXRQcm9maWxlKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHByb2ZpbGVBdHRyLCB2YWx1ZSk7Ci19
Ci0KLWJvb2wgSFRNTEhlYWRFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkK
LXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGl0bGVUYWcpIHx8IG5ld0NoaWxk
LT5oYXNUYWdOYW1lKGlzaW5kZXhUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdO
YW1lKGJhc2VUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZykgfHwKLSAgICAg
ICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc3R5bGVUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdO
YW1lKG1ldGFUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGxpbmtUYWcp
IHx8IG5ld0NoaWxkLT5pc1RleHROb2RlKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
SFRNTEh0bWxFbGVtZW50OjpIVE1MSHRtbEVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgICA6IEhU
TUxFbGVtZW50KGh0bWxUYWcsIGRvYykKLXsKLX0KLQotSFRNTEh0bWxFbGVtZW50Ojp+SFRNTEh0
bWxFbGVtZW50KCkKLXsKLX0KLQotU3RyaW5nIEhUTUxIdG1sRWxlbWVudDo6dmVyc2lvbigpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2ZXJzaW9uQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTEh0bWxFbGVtZW50OjpzZXRWZXJzaW9uKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKHZlcnNpb25BdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTEh0bWxFbGVt
ZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsKLSAgICAvLyBGSVhNRTogV2h5
IGlzIDxzY3JpcHQ+IGFsbG93ZWQgaGVyZT8KLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05h
bWUoaGVhZFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoYm9keVRhZykgfHwKLSAgICAgICAg
ICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdO
YW1lKG5vZnJhbWVzVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3Jp
cHRUYWcpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJRnJhbWVFbGVtZW50OjpI
VE1MSUZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKSA6IEhUTUxGcmFtZUVsZW1lbnQoaWZyYW1l
VGFnLCBkb2MpCi17Ci0gICAgbV9mcmFtZUJvcmRlciA9IGZhbHNlOwotICAgIG1fbWFyZ2luV2lk
dGggPSAtMTsKLSAgICBtX21hcmdpbkhlaWdodCA9IC0xOwotICAgIG5lZWRXaWRnZXRVcGRhdGUg
PSBmYWxzZTsKLX0KLQotSFRNTElGcmFtZUVsZW1lbnQ6On5IVE1MSUZyYW1lRWxlbWVudCgpCi17
Ci19Ci0KLWJvb2wgSFRNTElGcmFtZUVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVk
TmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0g
ICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0ciB8fCBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyKSB7
Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1
bHQgPSBlUmVwbGFjZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBi
ZWhhdmlvciBpcyB0aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAK
LSAgICByZXR1cm4gSFRNTEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19
Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0
dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikKLSAg
ICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsK
LSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikKLSAgICAgICAgYWRkQ1NT
TGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikKLSAgICAgICAgYWRkSFRNTEFsaWdubWVudChh
dHRyKTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAg
U3RyaW5nIG5ld05hbWVBdHRyID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgaWYgKGluRG9jdW1l
bnQoKSAmJiBkb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICBIVE1M
RG9jdW1lbnQgKmRvYyA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudCAqPihkb2N1bWVudCgpKTsK
LSAgICAgICAgICAgIGRvYy0+cmVtb3ZlRG9jRXh0cmFOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwot
ICAgICAgICAgICAgZG9jLT5hZGREb2NFeHRyYU5hbWVkSXRlbShuZXdOYW1lQXR0cik7Ci0gICAg
ICAgIH0KLSAgICAgICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1lQXR0cjsKLSAgICB9IGVsc2UKLSAg
ICAgICAgSFRNTEZyYW1lRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0K
LXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBp
ZiAoZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBIVE1MRG9jdW1lbnQg
KmRvYyA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudCAqPihkb2N1bWVudCgpKTsKLSAgICAgICAg
ZG9jLT5hZGREb2NFeHRyYU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRN
TEVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVs
ZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChkb2N1bWVudCgpLT5pc0hU
TUxEb2N1bWVudCgpKSB7Ci0gICAgICAgIEhUTUxEb2N1bWVudCAqZG9jID0gc3RhdGljX2Nhc3Q8
SFRNTERvY3VtZW50ICo+KGRvY3VtZW50KCkpOwotICAgICAgICBkb2MtPnJlbW92ZURvY0V4dHJh
TmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6cmVtb3Zl
ZEZyb21Eb2N1bWVudCgpOwotfQotCi1ib29sIEhUTUxJRnJhbWVFbGVtZW50OjpyZW5kZXJlcklz
TmVlZGVkKFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICAvLyBEb24ndCBpZ25vcmUgZGlzcGxh
eTogbm9uZSB0aGUgd2F5IGZyYW1lIGRvZXMuCi0gICAgcmV0dXJuIGlzVVJMQWxsb3dlZChtX1VS
TCkgJiYgc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxJ
RnJhbWVFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0
eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyUGFydE9iamVjdCh0
aGlzKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6YXR0YWNoKCkKLXsKLSAgICBtX25h
bWUgPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIGlmIChtX25hbWUuaXNOdWxsKCkpCi0g
ICAgICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShpZEF0dHIpOwotCi0gICAgSFRNTEVsZW1lbnQ6
OmF0dGFjaCgpOwotCi0gICAgRnJhbWUqIHBhcmVudEZyYW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUo
KTsKLSAgICBpZiAocmVuZGVyZXIoKSAmJiBwYXJlbnRGcmFtZSkgewotICAgICAgICBwYXJlbnRG
cmFtZS0+cGFnZSgpLT5pbmNyZW1lbnRGcmFtZUNvdW50KCk7Ci0gICAgICAgIG1fbmFtZSA9IHBh
cmVudEZyYW1lLT50cmVlKCktPnVuaXF1ZUNoaWxkTmFtZShtX25hbWUpOwotICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJQYXJ0T2JqZWN0Kj4ocmVuZGVyZXIoKSktPnVwZGF0ZVdpZGdldCgpOwot
ICAgICAgICBuZWVkV2lkZ2V0VXBkYXRlID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJ
RnJhbWVFbGVtZW50OjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKQotewotICAgIGlmIChu
ZWVkV2lkZ2V0VXBkYXRlKSB7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8UmVuZGVyUGFydE9iamVjdCo+KHJlbmRlcmVyKCkpLT51cGRhdGVXaWRnZXQo
KTsKLSAgICAgICAgbmVlZFdpZGdldFVwZGF0ZSA9IGZhbHNlOwotICAgIH0KLSAgICBIVE1MRWxl
bWVudDo6cmVjYWxjU3R5bGUoIGNoICk7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6Om9w
ZW5VUkwoKQotewotICAgIG5lZWRXaWRnZXRVcGRhdGUgPSB0cnVlOwotICAgIHNldENoYW5nZWQo
KTsKLX0KLQotYm9vbCBIVE1MSUZyYW1lRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRl
ICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cjsKLX0K
LQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50Ojpz
ZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0
dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50OjpoZWlnaHQoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoaGVpZ2h0QXR0cik7Ci19Ci0KLXZvaWQgSFRN
TElGcmFtZUVsZW1lbnQ6OnNldEhlaWdodChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZShoZWlnaHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxl
bWVudDo6c3JjKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwo
Z2V0QXR0cmlidXRlKHNyY0F0dHIpKTsKLX0KLQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50Ojp3
aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpOwotfQot
Ci12b2lkIEhUTUxJRnJhbWVFbGVtZW50OjpzZXRXaWR0aChjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKLX0KLQotfQpJbmRleDogaHRt
bC9IVE1MUGFyc2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxQYXJzZXIuY3BwCShyZXZp
c2lvbiAxNDMzMikKKysrIGh0bWwvSFRNTFBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMx
LDkgKzMxLDEyIEBACiAjaW5jbHVkZSAiQ29tbWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50RnJh
Z21lbnQuaCIKICNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkhUTUxCb2R5RWxlbWVudC5o
IgogI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTEVsZW1lbnRG
YWN0b3J5LmgiCiAjaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEhl
YWRFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTEh0bWxFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRN
TElzSW5kZXhFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKICNp
bmNsdWRlICJIVE1MVGFibGVSb3dFbGVtZW50LmgiCkBAIC00MSw3ICs0NCw2IEBACiAjaW5jbHVk
ZSAiSFRNTFRva2VuaXplci5oIgogI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKICNpbmNs
dWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiaHRtbF9iYXNlaW1wbC5oIgogI2luY2x1ZGUgImh0bWxf
YmxvY2tpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbF9saXN0aW1wbC5oIgogCkluZGV4OiBodG1sL0hU
TUxIdG1sRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MSHRtbEVsZW1lbnQuY3Bw
CShyZXZpc2lvbiAxNDMyNSkKKysrIGh0bWwvSFRNTEh0bWxFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjIsNzU3ICsyMiwxNiBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjEx
MS0xMzA3LCBVU0EuCiAgKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKKyNpbmNsdWRlICJIVE1MSHRtbEVsZW1l
bnQuaCIKIAotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJDU1NWYWx1
ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lLmgi
Ci0jaW5jbHVkZSAiRnJhbWVUcmVlLmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCiAjaW5j
bHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgImNzc19zdHls
ZXNoZWV0aW1wbC5oIgotI2luY2x1ZGUgImNzc2hlbHBlci5oIgotI2luY2x1ZGUgImNzc3N0eWxl
c2VsZWN0b3IuaCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJyZW5k
ZXJfZnJhbWVzLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2
ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1IVE1MQm9keUVsZW1lbnQ6
OkhUTUxCb2R5RWxlbWVudChEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQoYm9keVRh
ZywgZG9jKQotewotfQotCi1IVE1MQm9keUVsZW1lbnQ6On5IVE1MQm9keUVsZW1lbnQoKQotewot
ICAgIGlmIChtX2xpbmtEZWNsKSB7Ci0gICAgICAgIG1fbGlua0RlY2wtPnNldE5vZGUoMCk7Ci0g
ICAgICAgIG1fbGlua0RlY2wtPnNldFBhcmVudCgwKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEJv
ZHlFbGVtZW50OjpjcmVhdGVMaW5rRGVjbCgpCi17Ci0gICAgbV9saW5rRGVjbCA9IG5ldyBDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbjsKLSAgICBtX2xpbmtEZWNsLT5zZXRQYXJlbnQoZG9jdW1l
bnQoKS0+ZWxlbWVudFNoZWV0KCkpOwotICAgIG1fbGlua0RlY2wtPnNldE5vZGUodGhpcyk7Ci0g
ICAgbV9saW5rRGVjbC0+c2V0U3RyaWN0UGFyc2luZyghZG9jdW1lbnQoKS0+aW5Db21wYXRNb2Rl
KCkpOwotfQotCi1ib29sIEhUTUxCb2R5RWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZp
ZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsK
LSAgICBpZiAoYXR0ck5hbWUgPT0gYmFja2dyb3VuZEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0g
KE1hcHBlZEF0dHJpYnV0ZUVudHJ5KShlTGFzdEVudHJ5ICsgZG9jdW1lbnQoKS0+ZG9jSUQoKSk7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIAotICAgIGlmIChhdHRyTmFtZSA9
PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB0ZXh0QXR0ciB8fAotICAgICAg
ICBhdHRyTmFtZSA9PSBtYXJnaW53aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gbGVm
dG1hcmdpbkF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gbWFyZ2luaGVpZ2h0QXR0ciB8fAot
ICAgICAgICBhdHRyTmFtZSA9PSB0b3BtYXJnaW5BdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09
IGJncHJvcGVydGllc0F0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBIVE1MRWxlbWVudDo6bWFwVG9F
bnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+
bmFtZSgpID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBXZWJDb3Jl
OjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5E
X0lNQUdFLCBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBtYXJnaW53aWR0aEF0dHIgfHwgYXR0ci0+bmFtZSgpID09IGxlZnRtYXJn
aW5BdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklH
SFQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1Bf
TUFSR0lOX0xFRlQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG1hcmdpbmhlaWdodEF0dHIgfHwgYXR0ci0+bmFtZSgpID09IHRvcG1hcmdpbkF0dHIpIHsK
LSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9CT1RUT00sIGF0dHIt
PnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RP
UCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYmdjb2xv
ckF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9D
T0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdGV4
dEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQ09MT1IsIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJncHJvcGVydGllc0F0
dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJmaXhl
ZCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VO
RF9BVFRBQ0hNRU5ULCBDU1NfVkFMX0ZJWEVEKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSB2bGlua0F0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBhbGlua0F0
dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBsaW5rQXR0cikgewotICAgICAg
ICBpZiAoYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmIChhdHRyLT5uYW1lKCkgPT0g
bGlua0F0dHIpCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRMaW5rQ29sb3IoKTsK
LSAgICAgICAgICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2bGlua0F0dHIpCi0gICAgICAg
ICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRWaXNpdGVkTGlua0NvbG9yKCk7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRBY3RpdmVMaW5rQ29sb3Io
KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICghbV9saW5rRGVj
bCkKLSAgICAgICAgICAgICAgICBjcmVhdGVMaW5rRGVjbCgpOwotICAgICAgICAgICAgbV9saW5r
RGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQ09MT1IsIGF0dHItPnZhbHVlKCksIGZhbHNlLCBm
YWxzZSk7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTVmFsdWU+IHZhbCA9IG1fbGlua0RlY2wtPmdl
dFByb3BlcnR5Q1NTVmFsdWUoQ1NTX1BST1BfQ09MT1IpOwotICAgICAgICAgICAgaWYgKHZhbCAm
JiB2YWwtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgIENvbG9yIGNvbCA9
IGRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Z2V0Q29sb3JGcm9tUHJpbWl0aXZlVmFsdWUo
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWwuZ2V0KCkpKTsKLSAgICAgICAgICAg
ICAgICBpZiAoYXR0ci0+bmFtZSgpID09IGxpbmtBdHRyKQotICAgICAgICAgICAgICAgICAgICBk
b2N1bWVudCgpLT5zZXRMaW5rQ29sb3IoY29sKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gdmxpbmtBdHRyKQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCgp
LT5zZXRWaXNpdGVkTGlua0NvbG9yKGNvbCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRBY3RpdmVMaW5rQ29sb3IoY29sKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGF0dGFjaGVkKCkpCi0g
ICAgICAgICAgICBkb2N1bWVudCgpLT5yZWNhbGNTdHlsZShGb3JjZSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25sb2FkQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRI
VE1MV2luZG93RXZlbnRMaXN0ZW5lcihsb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG9uYmVmb3JldW5sb2FkQXR0cikgewotICAgICAgICBkb2N1bWVudCgp
LT5zZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihiZWZvcmV1bmxvYWRFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb251bmxvYWRBdHRyKSB7Ci0gICAgICAgIGRv
Y3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKHVubG9hZEV2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIGRv
Y3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgZG9j
dW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25yZXNpemVBdHRyKSB7Ci0gICAgICAgIGRv
Y3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKHJlc2l6ZUV2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNjcm9sbEF0dHIpIHsKLSAgICAgICAg
ZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoc2Nyb2xsRXZlbnQsIGF0dHIp
OwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
YXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgp
Ci17Ci0gICAgSFRNTEVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0KLSAgICAvLyBG
SVhNRTogcGVyaGFwcyB0aGlzIGNvZGUgc2hvdWxkIGJlIGluIGF0dGFjaCgpIGluc3RlYWQgb2Yg
aGVyZQotCi0gICAgRnJhbWVWaWV3ICp3ID0gZG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlmICh3
ICYmIHctPm1hcmdpbldpZHRoKCkgIT0gLTEpCi0gICAgICAgIHNldEF0dHJpYnV0ZShtYXJnaW53
aWR0aEF0dHIsIFN0cmluZzo6bnVtYmVyKHctPm1hcmdpbldpZHRoKCkpKTsKLSAgICBpZiAodyAm
JiB3LT5tYXJnaW5IZWlnaHQoKSAhPSAtMSkKLSAgICAgICAgc2V0QXR0cmlidXRlKG1hcmdpbmhl
aWdodEF0dHIsIFN0cmluZzo6bnVtYmVyKHctPm1hcmdpbkhlaWdodCgpKSk7Ci0KLSAgICBpZiAo
dykKLSAgICAgICAgdy0+c2NoZWR1bGVSZWxheW91dCgpOwotfQotCi1ib29sIEhUTUxCb2R5RWxl
bWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVy
biBhdHRyLT5uYW1lKCkgPT0gYmFja2dyb3VuZEF0dHI7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVs
ZW1lbnQ6OmFMaW5rKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaW5rQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRBTGluayhjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlua0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxCb2R5RWxlbWVudDo6YmFja2dyb3VuZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShiYWNrZ3JvdW5kQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRC
YWNrZ3JvdW5kKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJhY2tn
cm91bmRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OmJnQ29sb3Io
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIpOwotfQotCi12
b2lkIEhUTUxCb2R5RWxlbWVudDo6c2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEJv
ZHlFbGVtZW50OjpsaW5rKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxpbmtB
dHRyKTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnNldExpbmsoY29uc3QgU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobGlua0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxCb2R5RWxlbWVudDo6dGV4dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZSh0ZXh0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRUZXh0KGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHRleHRBdHRyLCB2YWx1ZSk7Ci19Ci0K
LVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OnZMaW5rKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHZsaW5rQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRWTGlu
ayhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2bGlua0F0dHIsIHZh
bHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MRnJhbWVFbGVtZW50OjpIVE1M
RnJhbWVFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudChmcmFtZVRhZywg
ZG9jKQotewotICAgIGluaXQoKTsKLX0KLQotSFRNTEZyYW1lRWxlbWVudDo6SFRNTEZyYW1lRWxl
bWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jKQotICAgIDog
SFRNTEVsZW1lbnQodGFnTmFtZSwgZG9jKQotewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1M
RnJhbWVFbGVtZW50Ojppbml0KCkKLXsKLSAgICBtX2ZyYW1lQm9yZGVyID0gdHJ1ZTsKLSAgICBt
X2ZyYW1lQm9yZGVyU2V0ID0gZmFsc2U7Ci0gICAgbV9tYXJnaW5XaWR0aCA9IC0xOwotICAgIG1f
bWFyZ2luSGVpZ2h0ID0gLTE7Ci0gICAgbV9zY3JvbGxpbmcgPSBTY3JvbGxCYXJBdXRvOwotICAg
IG1fbm9SZXNpemUgPSBmYWxzZTsKLX0KLQotSFRNTEZyYW1lRWxlbWVudDo6fkhUTUxGcmFtZUVs
ZW1lbnQoKQotewotfQotCi1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6OmlzVVJMQWxsb3dlZChjb25z
dCBBdG9taWNTdHJpbmcgJlVSTFN0cmluZykgY29uc3QKLXsKLSAgICBpZiAoVVJMU3RyaW5nLmlz
RW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgRnJhbWVWaWV3ICp3ID0g
ZG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlmICghdykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgS1VSTCBuZXdVUkwoZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoVVJMU3RyaW5nLmRlcHJl
Y2F0ZWRTdHJpbmcoKSkpOwotICAgIG5ld1VSTC5zZXRSZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVs
bCk7Ci0KLSAgICAvLyBEb24ndCBhbGxvdyBtb3JlIHRoYW4gMTAwMCB0b3RhbCBmcmFtZXMgaW4g
YSBzZXQuIFRoaXMgc2VlbXMKLSAgICAvLyBsaWtlIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwg
YW5kIG90aGVyd2lzZSBtdXR1YWxseSByZWN1cnNpdmUKLSAgICAvLyBmcmFtZXNldCBwYWdlcyBj
YW4gcXVpY2tseSBicmluZyB0aGUgcHJvZ3JhbSB0byBpdHMga25lZXMgd2l0aAotICAgIC8vIGV4
cG9uZW50aWFsIGdyb3d0aCBpbiB0aGUgbnVtYmVyIG9mIGZyYW1lcy4KLQotICAgIC8vIEZJWE1F
OiBUaGlzIGxpbWl0IGNvdWxkIGJlIGhpZ2hlciwgYnV0IFdlYktpdCBoYXMgc29tZQotICAgIC8v
IGFsZ29yaXRobXMgdGhhdCBoYXBwZW4gd2hpbGUgbG9hZGluZyB3aGljaCBhcHBlYXIgdG8gYmUg
Tl4yIG9yCi0gICAgLy8gd29yc2UgaW4gdGhlIG51bWJlciBvZiBmcmFtZXMKLSAgICBpZiAody0+
ZnJhbWUoKS0+cGFnZSgpLT5mcmFtZUNvdW50KCkgPj0gMjAwKSB7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBvbmUgbGV2ZWwgb2Ygc2VsZi1yZWZlcmVu
Y2UgYmVjYXVzZSBzb21lIHNpdGVzIGRlcGVuZCBvbiB0aGF0LgotICAgIC8vIEJ1dCB3ZSBkb24n
dCBhbGxvdyBtb3JlIHRoYW4gb25lLgotICAgIGJvb2wgZm91bmRTZWxmUmVmZXJlbmNlID0gZmFs
c2U7Ci0gICAgZm9yIChGcmFtZSAqZnJhbWUgPSB3LT5mcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBm
cmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewotICAgICAgICBLVVJMIGZyYW1lVVJMID0gZnJhbWUt
PnVybCgpOwotICAgICAgICBmcmFtZVVSTC5zZXRSZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7
Ci0gICAgICAgIGlmIChmcmFtZVVSTCA9PSBuZXdVUkwpIHsKLSAgICAgICAgICAgIGlmIChmb3Vu
ZFNlbGZSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBmb3VuZFNlbGZSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICB9
Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1l
bnQ6Om9wZW5VUkwoKQotewotICAgIEZyYW1lVmlldyAqdyA9IGRvY3VtZW50KCktPnZpZXcoKTsK
LSAgICBpZiAoIXcpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBBdG9taWNTdHJpbmcgcmVs
YXRpdmVVUkwgPSBtX1VSTDsKLSAgICBpZiAocmVsYXRpdmVVUkwuaXNFbXB0eSgpKQotICAgICAg
ICByZWxhdGl2ZVVSTCA9ICJhYm91dDpibGFuayI7Ci0KLSAgICAvLyBMb2FkIHRoZSBmcmFtZSBj
b250ZW50cy4KLSAgICBGcmFtZSogcGFyZW50RnJhbWUgPSB3LT5mcmFtZSgpOwotICAgIGlmIChG
cmFtZSogY2hpbGRGcmFtZSA9IHBhcmVudEZyYW1lLT50cmVlKCktPmNoaWxkKG1fbmFtZSkpCi0g
ICAgICAgIGNoaWxkRnJhbWUtPm9wZW5VUkwoZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwocmVsYXRp
dmVVUkwuZGVwcmVjYXRlZFN0cmluZygpKSk7Ci0gICAgZWxzZQotICAgICAgICBwYXJlbnRGcmFt
ZS0+cmVxdWVzdEZyYW1lKHN0YXRpY19jYXN0PFJlbmRlckZyYW1lICo+KHJlbmRlcmVyKCkpLCBy
ZWxhdGl2ZVVSTCwgbV9uYW1lKTsKLX0KLQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+
bmFtZSgpID09IHNyY0F0dHIpIHsKLSAgICAgICAgc2V0TG9jYXRpb24oV2ViQ29yZTo6cGFyc2VV
UkwoYXR0ci0+dmFsdWUoKSkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGlkQXR0
cikgewotICAgICAgICAvLyBJbXBvcnRhbnQgdG8gY2FsbCB0aHJvdWdoIHRvIGJhc2UgZm9yIHRo
ZSBpZCBhdHRyaWJ1dGUgc28gdGhlIGhhc0lEIGJpdCBnZXRzIHNldC4KLSAgICAgICAgSFRNTEVs
ZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotICAgICAgICBtX25hbWUgPSBhdHRy
LT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0g
ICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBh
cmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZSB0aGUgZnJh
bWUncyBuYW1lLgotICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQs
IHRoaXMgZG9lc24ndCBjaGVjayBmb3IgZnJhbWUgbmFtZQotICAgICAgICAvLyBjb25mbGljdHMg
YW5kIGdlbmVyYXRlIGEgdW5pcXVlIGZyYW1lIG5hbWUuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gZnJhbWVib3JkZXJBdHRyKSB7Ci0gICAgICAgIG1fZnJhbWVCb3JkZXIgPSBhdHRy
LT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAgIG1fZnJhbWVCb3JkZXJTZXQgPSAhYXR0ci0+aXNO
dWxsKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhp
cyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1hcmdpbndp
ZHRoQXR0cikgewotICAgICAgICBtX21hcmdpbldpZHRoID0gYXR0ci0+dmFsdWUoKS50b0ludCgp
OwotICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFz
IG5vIGVmZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXJnaW5oZWlnaHRB
dHRyKSB7Ci0gICAgICAgIG1fbWFyZ2luSGVpZ2h0ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwot
ICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5v
IGVmZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBub3Jlc2l6ZUF0dHIpIHsK
LSAgICAgICAgbV9ub1Jlc2l6ZSA9IHRydWU7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUg
YWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IHNjcm9sbGluZ0F0dHIpIHsKLSAgICAgICAgLy8gQXV0byBhbmQgeWVzIGJv
dGggc2ltcGx5IG1lYW4gImFsbG93IHNjcm9sbGluZy4iIE5vIG1lYW5zICJkb24ndCBhbGxvdyBz
Y3JvbGxpbmcuIgotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwg
ImF1dG8iKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAieWVzIikpCi0gICAg
ICAgICAgICBtX3Njcm9sbGluZyA9IFNjcm9sbEJhckF1dG87Ci0gICAgICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJubyIpKQotICAgICAgICAgICAgbV9zY3Jv
bGxpbmcgPSBTY3JvbGxCYXJBbHdheXNPZmY7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUg
YWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IG9ubG9hZEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIo
bG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJlZm9y
ZXVubG9hZEF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6IHNob3VsZCA8ZnJhbWU+IGVsZW1lbnRz
IGhhdmUgYmVmb3JldW5sb2FkIGhhbmRsZXJzPwotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5l
cihiZWZvcmV1bmxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gb251bmxvYWRBdHRyKSB7Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHVubG9hZEV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6OnJlbmRlcmVySXNO
ZWVkZWQoUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIC8vIElnbm9yZSBkaXNwbGF5OiBub25l
LgotICAgIHJldHVybiBpc1VSTEFsbG93ZWQobV9VUkwpOwotfQotCi1SZW5kZXJPYmplY3QgKkhU
TUxGcmFtZUVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVy
U3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGcmFtZSh0aGlz
KTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjphdHRhY2goKQotewotICAgIG1fbmFtZSA9
IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0gICAgaWYgKG1fbmFtZS5pc051bGwoKSkKLSAgICAg
ICAgbV9uYW1lID0gZ2V0QXR0cmlidXRlKGlkQXR0cik7Ci0KLSAgICAvLyBpbmhlcml0IGRlZmF1
bHQgc2V0dGluZ3MgZnJvbSBwYXJlbnQgZnJhbWVzZXQKLSAgICBmb3IgKE5vZGUgKm5vZGUgPSBw
YXJlbnROb2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpCi0gICAgICAgIGlm
IChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkgewotICAgICAgICAgICAgSFRNTEZyYW1l
U2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4o
bm9kZSk7Ci0gICAgICAgICAgICBpZiAoIW1fZnJhbWVCb3JkZXJTZXQpCi0gICAgICAgICAgICAg
ICAgbV9mcmFtZUJvcmRlciA9IGZyYW1lc2V0LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAgICAg
aWYgKCFtX25vUmVzaXplKQotICAgICAgICAgICAgICAgIG1fbm9SZXNpemUgPSBmcmFtZXNldC0+
bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBIVE1MRWxl
bWVudDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAoIXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCktPmZyYW1lKCk7Ci0KLSAgICBpZiAoIWZy
YW1lKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmcmFtZS0+cGFnZSgpLT5pbmNyZW1lbnRGcmFt
ZUNvdW50KCk7Ci0gICAgCi0gICAgQXRvbWljU3RyaW5nIHJlbGF0aXZlVVJMID0gbV9VUkw7Ci0g
ICAgaWYgKHJlbGF0aXZlVVJMLmlzRW1wdHkoKSkKLSAgICAgICAgcmVsYXRpdmVVUkwgPSAiYWJv
dXQ6YmxhbmsiOwotCi0gICAgbV9uYW1lID0gZnJhbWUtPnRyZWUoKS0+dW5pcXVlQ2hpbGROYW1l
KG1fbmFtZSk7Ci0KLSAgICAvLyBsb2FkIHRoZSBmcmFtZSBjb250ZW50cwotICAgIGZyYW1lLT5y
ZXF1ZXN0RnJhbWUoc3RhdGljX2Nhc3Q8UmVuZGVyRnJhbWUqPihyZW5kZXJlcigpKSwgcmVsYXRp
dmVVUkwsIG1fbmFtZSk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6Y2xvc2UoKQotewot
ICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYgKHJlbmRlcmVy
KCkgJiYgZnJhbWUpIHsKLSAgICAgICAgZnJhbWUtPnBhZ2UoKS0+ZGVjcmVtZW50RnJhbWVDb3Vu
dCgpOwotICAgICAgICBpZiAoRnJhbWUqIGNoaWxkRnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5jaGls
ZChtX25hbWUpKQotICAgICAgICAgICAgY2hpbGRGcmFtZS0+ZnJhbWVEZXRhY2hlZCgpOwotICAg
IH0KLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojp3aWxsUmVtb3ZlKCkKLXsKLSAgICAvLyBj
bG9zZSB0aGUgZnJhbWUgYW5kIGRpc3NvY2lhdGUgdGhlIHJlbmRlcmVyLCBidXQgbGVhdmUgdGhl
Ci0gICAgLy8gbm9kZSBhdHRhY2hlZCBzbyB0aGF0IGZyYW1lIGRvZXMgbm90IGdldCByZS1hdHRh
Y2hlZCBiZWZvcmUKLSAgICAvLyBhY3R1YWxseSBsZWF2aW5nIHRoZSBkb2N1bWVudC4gIHNlZSA8
cmRhcjovL3Byb2JsZW0vNDEzMjU4MT4KLSAgICBjbG9zZSgpOwotICAgIGlmIChyZW5kZXJlcigp
KSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPmRlc3Ryb3koKTsKLSAgICAgICAgc2V0UmVuZGVyZXIo
MCk7Ci0gICAgfQotICAgIAotICAgIEhUTUxFbGVtZW50Ojp3aWxsUmVtb3ZlKCk7Ci19Ci0KLXZv
aWQgSFRNTEZyYW1lRWxlbWVudDo6ZGV0YWNoKCkKLXsKLSAgICBjbG9zZSgpOwotICAgIEhUTUxF
bGVtZW50OjpkZXRhY2goKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRMb2NhdGlv
bihjb25zdCBTdHJpbmcmIHN0cikKLXsKLSAgICBtX1VSTCA9IEF0b21pY1N0cmluZyhzdHIpOwot
Ci0gICAgaWYgKCFhdHRhY2hlZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gSGFuZGxlIHRoZSBjb21tb24gY2FzZSB3aGVyZSB3ZSBkZWNpZGVkIG5vdCB0byBtYWtl
IGEgZnJhbWUgdGhlIGZpcnN0IHRpbWUuCi0gICAgLy8gRGV0YWNoIGFuZCB0aGUgbGV0IGF0dGFj
aCgpIGRlY2lkZSBhZ2FpbiB3aGV0aGVyIHRvIG1ha2UgdGhlIGZyYW1lIGZvciB0aGlzIFVSTC4K
LSAgICBpZiAoIXJlbmRlcmVyKCkpIHsKLSAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgIGF0dGFj
aCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmICghaXNVUkxBbGxvd2Vk
KG1fVVJMKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgb3BlblVSTCgpOwotfQot
Ci1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gcmVuZGVyZXIoKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRGb2N1cyhib29s
IHJlY2VpdmVkKQotewotICAgIEhUTUxFbGVtZW50OjpzZXRGb2N1cyhyZWNlaXZlZCk7Ci0gICAg
V2ViQ29yZTo6UmVuZGVyRnJhbWUgKnJlbmRlckZyYW1lID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6
UmVuZGVyRnJhbWUgKj4ocmVuZGVyZXIoKSk7Ci0gICAgaWYgKCFyZW5kZXJGcmFtZSB8fCAhcmVu
ZGVyRnJhbWUtPndpZGdldCgpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKHJlY2VpdmVkKQot
ICAgICAgICByZW5kZXJGcmFtZS0+d2lkZ2V0KCktPnNldEZvY3VzKCk7Ci0gICAgZWxzZQotICAg
ICAgICByZW5kZXJGcmFtZS0+d2lkZ2V0KCktPmNsZWFyRm9jdXMoKTsKLX0KLQotRnJhbWUqIEhU
TUxGcmFtZUVsZW1lbnQ6OmNvbnRlbnRGcmFtZSgpIGNvbnN0Ci17Ci0gICAgLy8gU3RhcnQgd2l0
aCB0aGUgcGFydCB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudCwgb3VyIG93bmVyRG9jdW1lbnQu
Ci0gICAgRnJhbWUqIHBhcmVudEZyYW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAo
IXBhcmVudEZyYW1lKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgdGhlIHBhcnQg
Zm9yIHRoZSBzdWJmcmFtZSB0aGF0IHRoaXMgZWxlbWVudCByZXByZXNlbnRzLgotICAgIHJldHVy
biBwYXJlbnRGcmFtZS0+dHJlZSgpLT5jaGlsZChtX25hbWUpOwotfQotCi1Eb2N1bWVudCogSFRN
TEZyYW1lRWxlbWVudDo6Y29udGVudERvY3VtZW50KCkgY29uc3QKLXsKLSAgICBGcmFtZSogZnJh
bWUgPSBjb250ZW50RnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gMDsK
LSAgICByZXR1cm4gZnJhbWUtPmRvY3VtZW50KCk7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lRWxlbWVu
dDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBh
dHRyLT5uYW1lKCkgPT0gc3JjQXR0cjsKLX0KLQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6OmZy
YW1lQm9yZGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZyYW1lYm9yZGVy
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0RnJhbWVCb3JkZXIoY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZnJhbWVib3JkZXJBdHRyLCB2YWx1
ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50Ojpsb25nRGVzYygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsb25nZGVzY0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFt
ZUVsZW1lbnQ6OnNldExvbmdEZXNjKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKGxvbmdkZXNjQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVu
dDo6bWFyZ2luSGVpZ2h0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG1hcmdp
bmhlaWdodEF0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldE1hcmdpbkhlaWdo
dChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShtYXJnaW5oZWlnaHRB
dHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjptYXJnaW5XaWR0aCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShtYXJnaW53aWR0aEF0dHIpOwotfQot
Ci12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldE1hcmdpbldpZHRoKGNvbnN0IFN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG1hcmdpbndpZHRoQXR0ciwgdmFsdWUpOwotfQotCi1T
dHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShuYW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0TmFtZShj
b25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUp
OwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldE5vUmVzaXplKGJvb2wgbm9SZXNpemUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKG5vcmVzaXplQXR0ciwgbm9SZXNpemUgPyAiIiA6IDApOwot
fQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6c2Nyb2xsaW5nKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKHNjcm9sbGluZ0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVs
ZW1lbnQ6OnNldFNjcm9sbGluZyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShzY3JvbGxpbmdBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50
OjpzcmMoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoc3JjQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0U3JjKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsKLX0KLQotaW50IEhUTUxGcmFtZUVsZW1l
bnQ6OmZyYW1lV2lkdGgoKSBjb25zdAotewotICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgCi0gICAgZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGlu
Z1N0eWxlc2hlZXRzKCk7Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCktPndpZHRoKCk7Ci19Ci0KLWlu
dCBIVE1MRnJhbWVFbGVtZW50OjpmcmFtZUhlaWdodCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFyZW5k
ZXJlcigpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBkb2N1bWVudCgpLT51cGRhdGVM
YXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKLSAgICByZXR1cm4gcmVuZGVyZXIoKS0+
aGVpZ2h0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEZyYW1lU2V0RWxlbWVu
dDo6SFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQo
ZnJhbWVzZXRUYWcsIGRvYykKLXsKLSAgICAvLyBkZWZhdWx0IHZhbHVlIGZvciByb3dzIGFuZCBj
b2xzLi4uCi0gICAgbV90b3RhbFJvd3MgPSAxOwotICAgIG1fdG90YWxDb2xzID0gMTsKLQotICAg
IG1fcm93cyA9IG1fY29scyA9IDA7Ci0KLSAgICBmcmFtZWJvcmRlciA9IHRydWU7Ci0gICAgZnJh
bWVCb3JkZXJTZXQgPSBmYWxzZTsKLSAgICBtX2JvcmRlciA9IDQ7Ci0gICAgbm9yZXNpemUgPSBm
YWxzZTsKLX0KLQotSFRNTEZyYW1lU2V0RWxlbWVudDo6fkhUTUxGcmFtZVNldEVsZW1lbnQoKQot
ewotICAgIGlmIChtX3Jvd3MpCi0gICAgICAgIGRlbGV0ZSBbXSBtX3Jvd3M7Ci0gICAgaWYgKG1f
Y29scykKLSAgICAgICAgZGVsZXRlIFtdIG1fY29sczsKLX0KLQotYm9vbCBIVE1MRnJhbWVTZXRF
bGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsKLSAgICAvLyBGSVhNRTog
T2xkIGNvZGUgaGFkIGFkamFjZW50IGRvdWJsZSByZXR1cm5zIGFuZCBzZWVtZWQgdG8gd2FudCB0
byBkbyBzb21ldGhpbmcgd2l0aCBOT0ZSQU1FUyAoYnV0IGRpZG4ndCkuCi0gICAgLy8gV2hhdCBp
cyB0aGUgY29ycmVjdCBiZWhhdmlvcj8KLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
ZnJhbWVzZXRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZyYW1lVGFnKTsKLX0KLQotdm9p
ZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewotICAgICAg
ICBpZiAoIWF0dHItPmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBpZiAobV9yb3dzKSBkZWxldGUg
W10gbV9yb3dzOwotICAgICAgICAgICAgbV9yb3dzID0gYXR0ci0+dmFsdWUoKS50b0xlbmd0aEFy
cmF5KG1fdG90YWxSb3dzKTsKLSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgfQot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNvbHNBdHRyKSB7Ci0gICAgICAgIGlmICgh
YXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBbXSBtX2NvbHM7Ci0gICAgICAg
ICAgICBtX2NvbHMgPSBhdHRyLT52YWx1ZSgpLnRvTGVuZ3RoQXJyYXkobV90b3RhbENvbHMpOwot
ICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gZnJhbWVib3JkZXJBdHRyKSB7Ci0gICAgICAgIC8vIGZhbHNlIG9yICJubyIg
b3IgIjAiLi4KLSAgICAgICAgaWYgKCBhdHRyLT52YWx1ZSgpLnRvSW50KCkgPT0gMCApIHsKLSAg
ICAgICAgICAgIGZyYW1lYm9yZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICBtX2JvcmRlciA9IDA7
Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVCb3JkZXJTZXQgPSB0cnVlOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IG5vcmVzaXplQXR0cikgewotICAgICAgICBub3Jlc2l6ZSA9IHRy
dWU7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyQXR0cikgewotICAgICAg
ICBtX2JvcmRlciA9IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgaWYoIW1fYm9yZGVy
KQotICAgICAgICAgICAgZnJhbWVib3JkZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBvbmxvYWRBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5k
b3dFdmVudExpc3RlbmVyKGxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gb25iZWZvcmV1bmxvYWRBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhU
TUxXaW5kb3dFdmVudExpc3RlbmVyKGJlZm9yZXVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnVubG9hZEF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQo
KS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIodW5sb2FkRXZlbnQsIGF0dHIpOwotICAgIH0g
ZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19
Ci0KLWJvb2wgSFRNTEZyYW1lU2V0RWxlbWVudDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHls
ZSAqc3R5bGUpCi17Ci0gICAgLy8gSWdub3JlIGRpc3BsYXk6IG5vbmUgYnV0IGRvIHBheSBhdHRl
bnRpb24gaWYgYSBzdHlsZXNoZWV0IGhhcyBjYXVzZWQgdXMgdG8gZGVsYXkgb3VyIGxvYWRpbmcu
Ci0gICAgcmV0dXJuIHN0eWxlLT5pc1N0eWxlQXZhaWxhYmxlKCk7Ci19Ci0KLVJlbmRlck9iamVj
dCAqSFRNTEZyYW1lU2V0RWxlbWVudDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5h
LCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZy
YW1lU2V0KHRoaXMpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OmF0dGFjaCgpCi17
Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IHNldHRpbmdzIGZyb20gcGFyZW50IGZyYW1lc2V0Ci0g
ICAgSFRNTEVsZW1lbnQqIG5vZGUgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KHBhcmVudE5v
ZGUoKSk7Ci0gICAgd2hpbGUobm9kZSkKLSAgICB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNUYWdO
YW1lKGZyYW1lc2V0VGFnKSkgewotICAgICAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJh
bWVzZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAg
ICAgICBpZighZnJhbWVCb3JkZXJTZXQpICBmcmFtZWJvcmRlciA9IGZyYW1lc2V0LT5mcmFtZUJv
cmRlcigpOwotICAgICAgICAgICAgaWYoIW5vcmVzaXplKSAgbm9yZXNpemUgPSBmcmFtZXNldC0+
bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUg
PSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KG5vZGUtPnBhcmVudE5vZGUoKSk7Ci0gICAgfQot
Ci0gICAgSFRNTEVsZW1lbnQ6OmF0dGFjaCgpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1l
bnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQgKmV2dCkKLXsKLSAgICBpZiAoZXZ0LT5pc01v
dXNlRXZlbnQoKSAmJiAhbm9yZXNpemUgJiYgcmVuZGVyZXIoKSkgewotICAgICAgICBzdGF0aWNf
Y2FzdDxXZWJDb3JlOjpSZW5kZXJGcmFtZVNldCAqPihyZW5kZXJlcigpKS0+dXNlclJlc2l6ZShz
dGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KSk7Ci0gICAgICAgIGV2dC0+c2V0RGVmYXVsdEhh
bmRsZWQoKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihl
dnQpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBTdHlsZUNo
YW5nZSBjaCApCi17Ci0gICAgaWYgKGNoYW5nZWQoKSAmJiByZW5kZXJlcigpKSB7Ci0gICAgICAg
IHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICBzZXRDaGFuZ2VkKGZh
bHNlKTsKLSAgICB9Ci0gICAgSFRNTEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBjaCApOwotfQotCi1T
dHJpbmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6Y29scygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShjb2xzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0
Q29scyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjb2xzQXR0ciwg
dmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6cm93cygpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShyb3dzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1l
U2V0RWxlbWVudDo6c2V0Um93cyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShyb3dzQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxI
ZWFkRWxlbWVudDo6SFRNTEhlYWRFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MRWxl
bWVudChoZWFkVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxIZWFkRWxlbWVudDo6fkhUTUxIZWFkRWxl
bWVudCgpCi17Ci19Ci0KLVN0cmluZyBIVE1MSGVhZEVsZW1lbnQ6OnByb2ZpbGUoKSBjb25zdAot
ewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUocHJvZmlsZUF0dHIpOwotfQotCi12b2lkIEhUTUxI
ZWFkRWxlbWVudDo6c2V0UHJvZmlsZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShwcm9maWxlQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhUTUxIZWFkRWxlbWVudDo6
Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5o
YXNUYWdOYW1lKHRpdGxlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShpc2luZGV4VGFnKSB8
fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShiYXNlVGFnKSB8fCBuZXdDaGlsZC0+
aGFzVGFnTmFtZShzY3JpcHRUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1l
KHN0eWxlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShtZXRhVGFnKSB8fAotICAgICAgICAg
ICBuZXdDaGlsZC0+aGFzVGFnTmFtZShsaW5rVGFnKSB8fCBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxIdG1sRWxlbWVudDo6SFRNTEh0bWxF
bGVtZW50KERvY3VtZW50ICpkb2MpCitIVE1MSHRtbEVsZW1lbnQ6OkhUTUxIdG1sRWxlbWVudChE
b2N1bWVudCogZG9jKQogICAgIDogSFRNTEVsZW1lbnQoaHRtbFRhZywgZG9jKQogewogfQpAQCAt
Nzk5LDE1NyArNTgsNCBAQCBib29sIEhUTUxIdG1sRWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9k
CiAgICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7CiB9CiAKLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotSFRNTElGcmFtZUVsZW1lbnQ6OkhUTUxJRnJhbWVFbGVtZW50KERv
Y3VtZW50ICpkb2MpIDogSFRNTEZyYW1lRWxlbWVudChpZnJhbWVUYWcsIGRvYykKLXsKLSAgICBt
X2ZyYW1lQm9yZGVyID0gZmFsc2U7Ci0gICAgbV9tYXJnaW5XaWR0aCA9IC0xOwotICAgIG1fbWFy
Z2luSGVpZ2h0ID0gLTE7Ci0gICAgbmVlZFdpZGdldFVwZGF0ZSA9IGZhbHNlOwotfQotCi1IVE1M
SUZyYW1lRWxlbWVudDo6fkhUTUxJRnJhbWVFbGVtZW50KCkKLXsKLX0KLQotYm9vbCBIVE1MSUZy
YW1lRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFw
cGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0g
d2lkdGhBdHRyIHx8IGF0dHJOYW1lID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0g
ZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAo
YXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVSZXBsYWNlZDsgLy8g
U2hhcmUgd2l0aCA8aW1nPiBzaW5jZSB0aGUgYWxpZ25tZW50IGJlaGF2aW9yIGlzIHRoZSBzYW1l
LgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBIVE1MRWxl
bWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MSUZyYW1l
RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQotewot
ICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKQotICAgICAgICBhZGRDU1NMZW5ndGgo
YXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBoZWlnaHRBdHRyKQotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfSEVJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
YWxpZ25BdHRyKQotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOwotICAgIGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBTdHJpbmcgbmV3TmFtZUF0dHIg
PSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoaW5Eb2N1bWVudCgpICYmIGRvY3VtZW50KCkt
PmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxEb2N1bWVudCAqZG9jID0gc3Rh
dGljX2Nhc3Q8SFRNTERvY3VtZW50ICo+KGRvY3VtZW50KCkpOwotICAgICAgICAgICAgZG9jLT5y
ZW1vdmVEb2NFeHRyYU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2MtPmFk
ZERvY0V4dHJhTmFtZWRJdGVtKG5ld05hbWVBdHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGRO
YW1lQXR0ciA9IG5ld05hbWVBdHRyOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRnJhbWVFbGVt
ZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxl
bWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIGlmIChkb2N1bWVudCgpLT5pc0hU
TUxEb2N1bWVudCgpKSB7Ci0gICAgICAgIEhUTUxEb2N1bWVudCAqZG9jID0gc3RhdGljX2Nhc3Q8
SFRNTERvY3VtZW50ICo+KGRvY3VtZW50KCkpOwotICAgICAgICBkb2MtPmFkZERvY0V4dHJhTmFt
ZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6aW5zZXJ0ZWRJ
bnRvRG9jdW1lbnQoKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6cmVtb3ZlZEZyb21E
b2N1bWVudCgpCi17Ci0gICAgaWYgKGRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAg
ICAgICAgSFRNTERvY3VtZW50ICpkb2MgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oZG9j
dW1lbnQoKSk7Ci0gICAgICAgIGRvYy0+cmVtb3ZlRG9jRXh0cmFOYW1lZEl0ZW0ob2xkTmFtZUF0
dHIpOwotICAgIH0KLQotICAgIEhUTUxFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19
Ci0KLWJvb2wgSFRNTElGcmFtZUVsZW1lbnQ6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUg
KnN0eWxlKQotewotICAgIC8vIERvbid0IGlnbm9yZSBkaXNwbGF5OiBub25lIHRoZSB3YXkgZnJh
bWUgZG9lcy4KLSAgICByZXR1cm4gaXNVUkxBbGxvd2VkKG1fVVJMKSAmJiBzdHlsZS0+ZGlzcGxh
eSgpICE9IE5PTkU7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTElGcmFtZUVsZW1lbnQ6OmNyZWF0
ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAg
IHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJQYXJ0T2JqZWN0KHRoaXMpOwotfQotCi12b2lkIEhU
TUxJRnJhbWVFbGVtZW50OjphdHRhY2goKQotewotICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShu
YW1lQXR0cik7Ci0gICAgaWYgKG1fbmFtZS5pc051bGwoKSkKLSAgICAgICAgbV9uYW1lID0gZ2V0
QXR0cmlidXRlKGlkQXR0cik7Ci0KLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0KLSAgICBG
cmFtZSogcGFyZW50RnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmIChyZW5kZXJl
cigpICYmIHBhcmVudEZyYW1lKSB7Ci0gICAgICAgIHBhcmVudEZyYW1lLT5wYWdlKCktPmluY3Jl
bWVudEZyYW1lQ291bnQoKTsKLSAgICAgICAgbV9uYW1lID0gcGFyZW50RnJhbWUtPnRyZWUoKS0+
dW5pcXVlQ2hpbGROYW1lKG1fbmFtZSk7Ci0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclBhcnRP
YmplY3QqPihyZW5kZXJlcigpKS0+dXBkYXRlV2lkZ2V0KCk7Ci0gICAgICAgIG5lZWRXaWRnZXRV
cGRhdGUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnJlY2Fs
Y1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKG5lZWRXaWRnZXRVcGRhdGUpIHsK
LSAgICAgICAgaWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJQ
YXJ0T2JqZWN0Kj4ocmVuZGVyZXIoKSktPnVwZGF0ZVdpZGdldCgpOwotICAgICAgICBuZWVkV2lk
Z2V0VXBkYXRlID0gZmFsc2U7Ci0gICAgfQotICAgIEhUTUxFbGVtZW50OjpyZWNhbGNTdHlsZSgg
Y2ggKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6b3BlblVSTCgpCi17Ci0gICAgbmVl
ZFdpZGdldFVwZGF0ZSA9IHRydWU7Ci0gICAgc2V0Q2hhbmdlZCgpOwotfQotCi1ib29sIEhUTUxJ
RnJhbWVFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyOwotfQotCi1TdHJpbmcgSFRNTElGcmFt
ZUVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWdu
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1T
dHJpbmcgSFRNTElGcmFtZUVsZW1lbnQ6OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShoZWlnaHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6c2V0
SGVpZ2h0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGhlaWdodEF0
dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50OjpzcmMoKSBjb25zdAot
ewotICAgIHJldHVybiBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTChnZXRBdHRyaWJ1dGUoc3JjQXR0
cikpOwotfQotCi1TdHJpbmcgSFRNTElGcmFtZUVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVs
ZW1lbnQ6OnNldFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHdpZHRoQXR0ciwgdmFsdWUpOwotfQotCiB9CkluZGV4OiBodG1sL0hUTUxJRnJhbWVFbGVtZW50
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxJRnJhbWVFbGVtZW50LmNwcAkocmV2aXNpb24g
MTQzMjUpCisrKyBodG1sL0hUTUxJRnJhbWVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjIsNzkxICsyMiwyOCBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBV
U0EuCiAgKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgog
CiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29y
ZHMuaCIKLSNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNs
dWRlICJGcmFtZVRyZWUuaCIKICNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKICNpbmNsdWRlICJI
VE1MTmFtZXMuaCIKICNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRp
bXBsLmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rv
ci5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInJlbmRlcl9mcmFt
ZXMuaCIKKyNpbmNsdWRlICJSZW5kZXJQYXJ0T2JqZWN0LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOwogCi1IVE1MQm9keUVsZW1lbnQ6OkhUTUxCb2R5RWxlbWVudChEb2N1bWVudCAqZG9jKQot
ICAgIDogSFRNTEVsZW1lbnQoYm9keVRhZywgZG9jKQotewotfQotCi1IVE1MQm9keUVsZW1lbnQ6
On5IVE1MQm9keUVsZW1lbnQoKQotewotICAgIGlmIChtX2xpbmtEZWNsKSB7Ci0gICAgICAgIG1f
bGlua0RlY2wtPnNldE5vZGUoMCk7Ci0gICAgICAgIG1fbGlua0RlY2wtPnNldFBhcmVudCgwKTsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpjcmVhdGVMaW5rRGVjbCgpCi17Ci0g
ICAgbV9saW5rRGVjbCA9IG5ldyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjsKLSAgICBtX2xp
bmtEZWNsLT5zZXRQYXJlbnQoZG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0KCkpOwotICAgIG1fbGlu
a0RlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgbV9saW5rRGVjbC0+c2V0U3RyaWN0UGFyc2luZygh
ZG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpOwotfQotCi1ib29sIEhUTUxCb2R5RWxlbWVudDo6
bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRl
RW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmFja2dyb3VuZEF0
dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gKE1hcHBlZEF0dHJpYnV0ZUVudHJ5KShlTGFzdEVudHJ5
ICsgZG9jdW1lbnQoKS0+ZG9jSUQoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAot
ICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFt
ZSA9PSB0ZXh0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBtYXJnaW53aWR0aEF0dHIgfHwK
LSAgICAgICAgYXR0ck5hbWUgPT0gbGVmdG1hcmdpbkF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUg
PT0gbWFyZ2luaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB0b3BtYXJnaW5BdHRy
IHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGJncHJvcGVydGllc0F0dHIpIHsKLSAgICAgICAgcmVz
dWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJl
dHVybiBIVE1MRWxlbWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9p
ZCBIVE1MQm9keUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAq
YXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAg
ICAgIFN0cmluZyB1cmwgPSBXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAg
ICAgaWYgKCF1cmwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShh
dHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0lNQUdFLCBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1
cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXJnaW53aWR0aEF0dHIgfHwg
YXR0ci0+bmFtZSgpID09IGxlZnRtYXJnaW5BdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChh
dHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRD
U1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX0xFRlQsIGF0dHItPnZhbHVlKCkpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1hcmdpbmhlaWdodEF0dHIgfHwgYXR0ci0+bmFt
ZSgpID09IHRvcG1hcmdpbkF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19Q
Uk9QX01BUkdJTl9CT1RUT00sIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgo
YXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYmdjb2xvckF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0
ciwgQ1NTX1BST1BfQkFDS0dST1VORF9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gdGV4dEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0
ciwgQ1NTX1BST1BfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGJncHJvcGVydGllc0F0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKGF0dHItPnZhbHVlKCksICJmaXhlZCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9BVFRBQ0hNRU5ULCBDU1NfVkFMX0ZJWEVEKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2bGlua0F0dHIgfHwKLSAgICAgICAgICAgICAg
IGF0dHItPm5hbWUoKSA9PSBhbGlua0F0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUo
KSA9PSBsaW5rQXR0cikgewotICAgICAgICBpZiAoYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAg
ICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbGlua0F0dHIpCi0gICAgICAgICAgICAgICAgZG9jdW1l
bnQoKS0+cmVzZXRMaW5rQ29sb3IoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSB2bGlua0F0dHIpCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRWaXNpdGVk
TGlua0NvbG9yKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQo
KS0+cmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgIGlmICghbV9saW5rRGVjbCkKLSAgICAgICAgICAgICAgICBjcmVhdGVMaW5rRGVj
bCgpOwotICAgICAgICAgICAgbV9saW5rRGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQ09MT1Is
IGF0dHItPnZhbHVlKCksIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTVmFs
dWU+IHZhbCA9IG1fbGlua0RlY2wtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTX1BST1BfQ09MT1Ip
OwotICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAg
ICAgICAgICAgICAgIENvbG9yIGNvbCA9IGRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Z2V0
Q29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2
YWwuZ2V0KCkpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bmFtZSgpID09IGxpbmtBdHRy
KQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRMaW5rQ29sb3IoY29sKTsKLSAg
ICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmxpbmtBdHRyKQotICAgICAg
ICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRWaXNpdGVkTGlua0NvbG9yKGNvbCk7Ci0gICAg
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRBY3Rp
dmVMaW5rQ29sb3IoY29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAg
ICAgICAgaWYgKGF0dGFjaGVkKCkpCi0gICAgICAgICAgICBkb2N1bWVudCgpLT5yZWNhbGNTdHls
ZShGb3JjZSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25sb2FkQXR0cikgewot
ICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihsb2FkRXZlbnQs
IGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmVmb3JldW5sb2FkQXR0
cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihiZWZv
cmV1bmxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb251
bmxvYWRBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3Rl
bmVyKHVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bmJsdXJBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3Rl
bmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25m
b2N1c0F0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVu
ZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25y
ZXNpemVBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3Rl
bmVyKHJlc2l6ZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBv
bnNjcm9sbEF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlz
dGVuZXIoc2Nyb2xsRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVu
dDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50
OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgSFRNTEVsZW1lbnQ6Omluc2VydGVkSW50
b0RvY3VtZW50KCk7Ci0KLSAgICAvLyBGSVhNRTogcGVyaGFwcyB0aGlzIGNvZGUgc2hvdWxkIGJl
IGluIGF0dGFjaCgpIGluc3RlYWQgb2YgaGVyZQotCi0gICAgRnJhbWVWaWV3ICp3ID0gZG9jdW1l
bnQoKS0+dmlldygpOwotICAgIGlmICh3ICYmIHctPm1hcmdpbldpZHRoKCkgIT0gLTEpCi0gICAg
ICAgIHNldEF0dHJpYnV0ZShtYXJnaW53aWR0aEF0dHIsIFN0cmluZzo6bnVtYmVyKHctPm1hcmdp
bldpZHRoKCkpKTsKLSAgICBpZiAodyAmJiB3LT5tYXJnaW5IZWlnaHQoKSAhPSAtMSkKLSAgICAg
ICAgc2V0QXR0cmlidXRlKG1hcmdpbmhlaWdodEF0dHIsIFN0cmluZzo6bnVtYmVyKHctPm1hcmdp
bkhlaWdodCgpKSk7Ci0KLSAgICBpZiAodykKLSAgICAgICAgdy0+c2NoZWR1bGVSZWxheW91dCgp
OwotfQotCi1ib29sIEhUTUxCb2R5RWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICph
dHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gYmFja2dyb3VuZEF0dHI7
Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OmFMaW5rKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFsaW5rQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50Ojpz
ZXRBTGluayhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlua0F0
dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6YmFja2dyb3VuZCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShiYWNrZ3JvdW5kQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTEJvZHlFbGVtZW50OjpzZXRCYWNrZ3JvdW5kKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17
Ci0gICAgc2V0QXR0cmlidXRlKGJhY2tncm91bmRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBI
VE1MQm9keUVsZW1lbnQ6OmJnQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoYmdjb2xvckF0dHIpOwotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVudDo6c2V0QmdDb2xvcihj
b25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFs
dWUpOwotfQotCi1TdHJpbmcgSFRNTEJvZHlFbGVtZW50OjpsaW5rKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKGxpbmtBdHRyKTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6
OnNldExpbmsoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobGlua0F0
dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6dGV4dCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0ZXh0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlF
bGVtZW50OjpzZXRUZXh0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHRleHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OnZMaW5rKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZsaW5rQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTEJvZHlFbGVtZW50OjpzZXRWTGluayhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZSh2bGlua0F0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1IVE1MRnJhbWVFbGVtZW50OjpIVE1MRnJhbWVFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gICAg
OiBIVE1MRWxlbWVudChmcmFtZVRhZywgZG9jKQotewotICAgIGluaXQoKTsKLX0KLQotSFRNTEZy
YW1lRWxlbWVudDo6SFRNTEZyYW1lRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1l
LCBEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQodGFnTmFtZSwgZG9jKQotewotICAg
IGluaXQoKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojppbml0KCkKLXsKLSAgICBtX2Zy
YW1lQm9yZGVyID0gdHJ1ZTsKLSAgICBtX2ZyYW1lQm9yZGVyU2V0ID0gZmFsc2U7Ci0gICAgbV9t
YXJnaW5XaWR0aCA9IC0xOwotICAgIG1fbWFyZ2luSGVpZ2h0ID0gLTE7Ci0gICAgbV9zY3JvbGxp
bmcgPSBTY3JvbGxCYXJBdXRvOwotICAgIG1fbm9SZXNpemUgPSBmYWxzZTsKLX0KLQotSFRNTEZy
YW1lRWxlbWVudDo6fkhUTUxGcmFtZUVsZW1lbnQoKQotewotfQotCi1ib29sIEhUTUxGcmFtZUVs
ZW1lbnQ6OmlzVVJMQWxsb3dlZChjb25zdCBBdG9taWNTdHJpbmcgJlVSTFN0cmluZykgY29uc3QK
LXsKLSAgICBpZiAoVVJMU3RyaW5nLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgCi0gICAgRnJhbWVWaWV3ICp3ID0gZG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlmICghdykK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgS1VSTCBuZXdVUkwoZG9jdW1lbnQoKS0+Y29t
cGxldGVVUkwoVVJMU3RyaW5nLmRlcHJlY2F0ZWRTdHJpbmcoKSkpOwotICAgIG5ld1VSTC5zZXRS
ZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0KLSAgICAvLyBEb24ndCBhbGxvdyBtb3JlIHRo
YW4gMTAwMCB0b3RhbCBmcmFtZXMgaW4gYSBzZXQuIFRoaXMgc2VlbXMKLSAgICAvLyBsaWtlIGEg
cmVhc29uYWJsZSB1cHBlciBib3VuZCwgYW5kIG90aGVyd2lzZSBtdXR1YWxseSByZWN1cnNpdmUK
LSAgICAvLyBmcmFtZXNldCBwYWdlcyBjYW4gcXVpY2tseSBicmluZyB0aGUgcHJvZ3JhbSB0byBp
dHMga25lZXMgd2l0aAotICAgIC8vIGV4cG9uZW50aWFsIGdyb3d0aCBpbiB0aGUgbnVtYmVyIG9m
IGZyYW1lcy4KLQotICAgIC8vIEZJWE1FOiBUaGlzIGxpbWl0IGNvdWxkIGJlIGhpZ2hlciwgYnV0
IFdlYktpdCBoYXMgc29tZQotICAgIC8vIGFsZ29yaXRobXMgdGhhdCBoYXBwZW4gd2hpbGUgbG9h
ZGluZyB3aGljaCBhcHBlYXIgdG8gYmUgTl4yIG9yCi0gICAgLy8gd29yc2UgaW4gdGhlIG51bWJl
ciBvZiBmcmFtZXMKLSAgICBpZiAody0+ZnJhbWUoKS0+cGFnZSgpLT5mcmFtZUNvdW50KCkgPj0g
MjAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBv
bmUgbGV2ZWwgb2Ygc2VsZi1yZWZlcmVuY2UgYmVjYXVzZSBzb21lIHNpdGVzIGRlcGVuZCBvbiB0
aGF0LgotICAgIC8vIEJ1dCB3ZSBkb24ndCBhbGxvdyBtb3JlIHRoYW4gb25lLgotICAgIGJvb2wg
Zm91bmRTZWxmUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgZm9yIChGcmFtZSAqZnJhbWUgPSB3LT5m
cmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewotICAgICAg
ICBLVVJMIGZyYW1lVVJMID0gZnJhbWUtPnVybCgpOwotICAgICAgICBmcmFtZVVSTC5zZXRSZWYo
RGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0gICAgICAgIGlmIChmcmFtZVVSTCA9PSBuZXdVUkwp
IHsKLSAgICAgICAgICAgIGlmIChmb3VuZFNlbGZSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3VuZFNlbGZSZWZl
cmVuY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwot
fQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6Om9wZW5VUkwoKQotewotICAgIEZyYW1lVmlldyAq
dyA9IGRvY3VtZW50KCktPnZpZXcoKTsKLSAgICBpZiAoIXcpCi0gICAgICAgIHJldHVybjsKLSAg
ICAKLSAgICBBdG9taWNTdHJpbmcgcmVsYXRpdmVVUkwgPSBtX1VSTDsKLSAgICBpZiAocmVsYXRp
dmVVUkwuaXNFbXB0eSgpKQotICAgICAgICByZWxhdGl2ZVVSTCA9ICJhYm91dDpibGFuayI7Ci0K
LSAgICAvLyBMb2FkIHRoZSBmcmFtZSBjb250ZW50cy4KLSAgICBGcmFtZSogcGFyZW50RnJhbWUg
PSB3LT5mcmFtZSgpOwotICAgIGlmIChGcmFtZSogY2hpbGRGcmFtZSA9IHBhcmVudEZyYW1lLT50
cmVlKCktPmNoaWxkKG1fbmFtZSkpCi0gICAgICAgIGNoaWxkRnJhbWUtPm9wZW5VUkwoZG9jdW1l
bnQoKS0+Y29tcGxldGVVUkwocmVsYXRpdmVVUkwuZGVwcmVjYXRlZFN0cmluZygpKSk7Ci0gICAg
ZWxzZQotICAgICAgICBwYXJlbnRGcmFtZS0+cmVxdWVzdEZyYW1lKHN0YXRpY19jYXN0PFJlbmRl
ckZyYW1lICo+KHJlbmRlcmVyKCkpLCByZWxhdGl2ZVVSTCwgbV9uYW1lKTsKLX0KLQotCi12b2lk
IEhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAq
YXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpIHsKLSAgICAgICAgc2V0
TG9jYXRpb24oV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGlkQXR0cikgewotICAgICAgICAvLyBJbXBvcnRhbnQgdG8gY2Fs
bCB0aHJvdWdoIHRvIGJhc2UgZm9yIHRoZSBpZCBhdHRyaWJ1dGUgc28gdGhlIGhhc0lEIGJpdCBn
ZXRzIHNldC4KLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIp
OwotICAgICAgICBtX25hbWUgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVlKCk7Ci0g
ICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBkb2Vzbid0
IGFjdHVhbGx5IGNoYW5nZSB0aGUgZnJhbWUncyBuYW1lLgotICAgICAgICAvLyBGSVhNRTogSWYg
d2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgZG9lc24ndCBjaGVjayBmb3IgZnJhbWUgbmFt
ZQotICAgICAgICAvLyBjb25mbGljdHMgYW5kIGdlbmVyYXRlIGEgdW5pcXVlIGZyYW1lIG5hbWUu
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVib3JkZXJBdHRyKSB7Ci0gICAg
ICAgIG1fZnJhbWVCb3JkZXIgPSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAgIG1fZnJh
bWVCb3JkZXJTZXQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBh
cmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG1hcmdpbndpZHRoQXR0cikgewotICAgICAgICBtX21hcmdpbldpZHRo
ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFs
cmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBtYXJnaW5oZWlnaHRBdHRyKSB7Ci0gICAgICAgIG1fbWFyZ2luSGVpZ2h0ID0g
YXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVh
ZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBub3Jlc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9ub1Jlc2l6ZSA9IHRydWU7Ci0gICAg
ICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZm
ZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHNjcm9sbGluZ0F0dHIpIHsKLSAg
ICAgICAgLy8gQXV0byBhbmQgeWVzIGJvdGggc2ltcGx5IG1lYW4gImFsbG93IHNjcm9sbGluZy4i
IE5vIG1lYW5zICJkb24ndCBhbGxvdyBzY3JvbGxpbmcuIgotICAgICAgICBpZiAoZXF1YWxJZ25v
cmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImF1dG8iKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShhdHRy
LT52YWx1ZSgpLCAieWVzIikpCi0gICAgICAgICAgICBtX3Njcm9sbGluZyA9IFNjcm9sbEJhckF1
dG87Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJu
byIpKQotICAgICAgICAgICAgbV9zY3JvbGxpbmcgPSBTY3JvbGxCYXJBbHdheXNPZmY7Ci0gICAg
ICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZm
ZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9ubG9hZEF0dHIpIHsKLSAgICAg
ICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIobG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBvbmJlZm9yZXVubG9hZEF0dHIpIHsKLSAgICAgICAgLy8gRklYTUU6
IHNob3VsZCA8ZnJhbWU+IGVsZW1lbnRzIGhhdmUgYmVmb3JldW5sb2FkIGhhbmRsZXJzPwotICAg
ICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihiZWZvcmV1bmxvYWRFdmVudCwgYXR0cik7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb251bmxvYWRBdHRyKSB7Ci0gICAgICAgIHNldEhU
TUxFdmVudExpc3RlbmVyKHVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAg
SFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ib29sIEhUTUxG
cmFtZUVsZW1lbnQ6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAg
IC8vIElnbm9yZSBkaXNwbGF5OiBub25lLgotICAgIHJldHVybiBpc1VSTEFsbG93ZWQobV9VUkwp
OwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxGcmFtZUVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBuZXcg
KGFyZW5hKSBSZW5kZXJGcmFtZSh0aGlzKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojph
dHRhY2goKQotewotICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0gICAgaWYg
KG1fbmFtZS5pc051bGwoKSkKLSAgICAgICAgbV9uYW1lID0gZ2V0QXR0cmlidXRlKGlkQXR0cik7
Ci0KLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBwYXJlbnQgZnJhbWVzZXQK
LSAgICBmb3IgKE5vZGUgKm5vZGUgPSBwYXJlbnROb2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5w
YXJlbnROb2RlKCkpCi0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkg
ewotICAgICAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0aWNfY2Fz
dDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICBpZiAoIW1fZnJhbWVC
b3JkZXJTZXQpCi0gICAgICAgICAgICAgICAgbV9mcmFtZUJvcmRlciA9IGZyYW1lc2V0LT5mcmFt
ZUJvcmRlcigpOwotICAgICAgICAgICAgaWYgKCFtX25vUmVzaXplKQotICAgICAgICAgICAgICAg
IG1fbm9SZXNpemUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAoIXJlbmRl
cmVyKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCkt
PmZyYW1lKCk7Ci0KLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmcmFt
ZS0+cGFnZSgpLT5pbmNyZW1lbnRGcmFtZUNvdW50KCk7Ci0gICAgCi0gICAgQXRvbWljU3RyaW5n
IHJlbGF0aXZlVVJMID0gbV9VUkw7Ci0gICAgaWYgKHJlbGF0aXZlVVJMLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmVsYXRpdmVVUkwgPSAiYWJvdXQ6YmxhbmsiOwotCi0gICAgbV9uYW1lID0gZnJhbWUt
PnRyZWUoKS0+dW5pcXVlQ2hpbGROYW1lKG1fbmFtZSk7Ci0KLSAgICAvLyBsb2FkIHRoZSBmcmFt
ZSBjb250ZW50cwotICAgIGZyYW1lLT5yZXF1ZXN0RnJhbWUoc3RhdGljX2Nhc3Q8UmVuZGVyRnJh
bWUqPihyZW5kZXJlcigpKSwgcmVsYXRpdmVVUkwsIG1fbmFtZSk7Ci19Ci0KLXZvaWQgSFRNTEZy
YW1lRWxlbWVudDo6Y2xvc2UoKQotewotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCktPmZy
YW1lKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgZnJhbWUpIHsKLSAgICAgICAgZnJhbWUtPnBh
Z2UoKS0+ZGVjcmVtZW50RnJhbWVDb3VudCgpOwotICAgICAgICBpZiAoRnJhbWUqIGNoaWxkRnJh
bWUgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChtX25hbWUpKQotICAgICAgICAgICAgY2hpbGRGcmFt
ZS0+ZnJhbWVEZXRhY2hlZCgpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojp3
aWxsUmVtb3ZlKCkKLXsKLSAgICAvLyBjbG9zZSB0aGUgZnJhbWUgYW5kIGRpc3NvY2lhdGUgdGhl
IHJlbmRlcmVyLCBidXQgbGVhdmUgdGhlCi0gICAgLy8gbm9kZSBhdHRhY2hlZCBzbyB0aGF0IGZy
YW1lIGRvZXMgbm90IGdldCByZS1hdHRhY2hlZCBiZWZvcmUKLSAgICAvLyBhY3R1YWxseSBsZWF2
aW5nIHRoZSBkb2N1bWVudC4gIHNlZSA8cmRhcjovL3Byb2JsZW0vNDEzMjU4MT4KLSAgICBjbG9z
ZSgpOwotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPmRlc3Ryb3ko
KTsKLSAgICAgICAgc2V0UmVuZGVyZXIoMCk7Ci0gICAgfQotICAgIAotICAgIEhUTUxFbGVtZW50
Ojp3aWxsUmVtb3ZlKCk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6ZGV0YWNoKCkKLXsK
LSAgICBjbG9zZSgpOwotICAgIEhUTUxFbGVtZW50OjpkZXRhY2goKTsKLX0KLQotdm9pZCBIVE1M
RnJhbWVFbGVtZW50OjpzZXRMb2NhdGlvbihjb25zdCBTdHJpbmcmIHN0cikKLXsKLSAgICBtX1VS
TCA9IEF0b21pY1N0cmluZyhzdHIpOwotCi0gICAgaWYgKCFhdHRhY2hlZCgpKSB7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8gSGFuZGxlIHRoZSBjb21tb24gY2FzZSB3aGVy
ZSB3ZSBkZWNpZGVkIG5vdCB0byBtYWtlIGEgZnJhbWUgdGhlIGZpcnN0IHRpbWUuCi0gICAgLy8g
RGV0YWNoIGFuZCB0aGUgbGV0IGF0dGFjaCgpIGRlY2lkZSBhZ2FpbiB3aGV0aGVyIHRvIG1ha2Ug
dGhlIGZyYW1lIGZvciB0aGlzIFVSTC4KLSAgICBpZiAoIXJlbmRlcmVyKCkpIHsKLSAgICAgICAg
ZGV0YWNoKCk7Ci0gICAgICAgIGF0dGFjaCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAg
IAotICAgIGlmICghaXNVUkxBbGxvd2VkKG1fVVJMKSkgewotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgb3BlblVSTCgpOwotfQotCi1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6OmlzRm9jdXNh
YmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKTsKLX0KLQotdm9pZCBIVE1MRnJh
bWVFbGVtZW50OjpzZXRGb2N1cyhib29sIHJlY2VpdmVkKQotewotICAgIEhUTUxFbGVtZW50Ojpz
ZXRGb2N1cyhyZWNlaXZlZCk7Ci0gICAgV2ViQ29yZTo6UmVuZGVyRnJhbWUgKnJlbmRlckZyYW1l
ID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6UmVuZGVyRnJhbWUgKj4ocmVuZGVyZXIoKSk7Ci0gICAg
aWYgKCFyZW5kZXJGcmFtZSB8fCAhcmVuZGVyRnJhbWUtPndpZGdldCgpKQotICAgICAgICByZXR1
cm47Ci0gICAgaWYgKHJlY2VpdmVkKQotICAgICAgICByZW5kZXJGcmFtZS0+d2lkZ2V0KCktPnNl
dEZvY3VzKCk7Ci0gICAgZWxzZQotICAgICAgICByZW5kZXJGcmFtZS0+d2lkZ2V0KCktPmNsZWFy
Rm9jdXMoKTsKLX0KLQotRnJhbWUqIEhUTUxGcmFtZUVsZW1lbnQ6OmNvbnRlbnRGcmFtZSgpIGNv
bnN0Ci17Ci0gICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFydCB0aGF0IGNvbnRhaW5zIHRoaXMgZWxl
bWVudCwgb3VyIG93bmVyRG9jdW1lbnQuCi0gICAgRnJhbWUqIHBhcmVudEZyYW1lID0gZG9jdW1l
bnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXBhcmVudEZyYW1lKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIC8vIEZpbmQgdGhlIHBhcnQgZm9yIHRoZSBzdWJmcmFtZSB0aGF0IHRoaXMgZWxlbWVu
dCByZXByZXNlbnRzLgotICAgIHJldHVybiBwYXJlbnRGcmFtZS0+dHJlZSgpLT5jaGlsZChtX25h
bWUpOwotfQotCi1Eb2N1bWVudCogSFRNTEZyYW1lRWxlbWVudDo6Y29udGVudERvY3VtZW50KCkg
Y29uc3QKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBjb250ZW50RnJhbWUoKTsKLSAgICBpZiAoIWZy
YW1lKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZnJhbWUtPmRvY3VtZW50KCk7Ci19
Ci0KLWJvb2wgSFRNTEZyYW1lRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRy
KSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cjsKLX0KLQotU3Ry
aW5nIEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lQm9yZGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGZyYW1lYm9yZGVyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVu
dDo6c2V0RnJhbWVCb3JkZXIoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUoZnJhbWVib3JkZXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50
Ojpsb25nRGVzYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsb25nZGVzY0F0
dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldExvbmdEZXNjKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxvbmdkZXNjQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6bWFyZ2luSGVpZ2h0KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKG1hcmdpbmhlaWdodEF0dHIpOwotfQotCi12b2lkIEhUTUxGcmFt
ZUVsZW1lbnQ6OnNldE1hcmdpbkhlaWdodChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZShtYXJnaW5oZWlnaHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJh
bWVFbGVtZW50OjptYXJnaW5XaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShtYXJnaW53aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldE1hcmdp
bldpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG1hcmdpbndp
ZHRoQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6bmFtZSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TEZyYW1lRWxlbWVudDo6c2V0TmFtZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNl
dE5vUmVzaXplKGJvb2wgbm9SZXNpemUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5vcmVzaXplQXR0
ciwgbm9SZXNpemUgPyAiIiA6IDApOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6c2Ny
b2xsaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHNjcm9sbGluZ0F0dHIp
OwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldFNjcm9sbGluZyhjb25zdCBTdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzY3JvbGxpbmdBdHRyLCB2YWx1ZSk7Ci19Ci0K
LVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjpzcmMoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoc3JjQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0U3JjKGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZhbHVlKTsK
LX0KLQotaW50IEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lV2lkdGgoKSBjb25zdAotewotICAgIGlm
ICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgZG9jdW1lbnQoKS0+
dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7Ci0gICAgcmV0dXJuIHJlbmRl
cmVyKCktPndpZHRoKCk7Ci19Ci0KLWludCBIVE1MRnJhbWVFbGVtZW50OjpmcmFtZUhlaWdodCgp
IGNvbnN0Ci17Ci0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAK
LSAgICBkb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsK
LSAgICByZXR1cm4gcmVuZGVyZXIoKS0+aGVpZ2h0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotSFRNTEZyYW1lU2V0RWxlbWVudDo6SFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAq
ZG9jKQotICAgIDogSFRNTEVsZW1lbnQoZnJhbWVzZXRUYWcsIGRvYykKLXsKLSAgICAvLyBkZWZh
dWx0IHZhbHVlIGZvciByb3dzIGFuZCBjb2xzLi4uCi0gICAgbV90b3RhbFJvd3MgPSAxOwotICAg
IG1fdG90YWxDb2xzID0gMTsKLQotICAgIG1fcm93cyA9IG1fY29scyA9IDA7Ci0KLSAgICBmcmFt
ZWJvcmRlciA9IHRydWU7Ci0gICAgZnJhbWVCb3JkZXJTZXQgPSBmYWxzZTsKLSAgICBtX2JvcmRl
ciA9IDQ7Ci0gICAgbm9yZXNpemUgPSBmYWxzZTsKLX0KLQotSFRNTEZyYW1lU2V0RWxlbWVudDo6
fkhUTUxGcmFtZVNldEVsZW1lbnQoKQotewotICAgIGlmIChtX3Jvd3MpCi0gICAgICAgIGRlbGV0
ZSBbXSBtX3Jvd3M7Ci0gICAgaWYgKG1fY29scykKLSAgICAgICAgZGVsZXRlIFtdIG1fY29sczsK
LX0KLQotYm9vbCBIVE1MRnJhbWVTZXRFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdD
aGlsZCkKLXsKLSAgICAvLyBGSVhNRTogT2xkIGNvZGUgaGFkIGFkamFjZW50IGRvdWJsZSByZXR1
cm5zIGFuZCBzZWVtZWQgdG8gd2FudCB0byBkbyBzb21ldGhpbmcgd2l0aCBOT0ZSQU1FUyAoYnV0
IGRpZG4ndCkuCi0gICAgLy8gV2hhdCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvcj8KLSAgICByZXR1
cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdO
YW1lKGZyYW1lVGFnKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSByb3dzQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPmlzTnVsbCgpKSB7Ci0gICAgICAg
ICAgICBpZiAobV9yb3dzKSBkZWxldGUgW10gbV9yb3dzOwotICAgICAgICAgICAgbV9yb3dzID0g
YXR0ci0+dmFsdWUoKS50b0xlbmd0aEFycmF5KG1fdG90YWxSb3dzKTsKLSAgICAgICAgICAgIHNl
dENoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNv
bHNBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGRl
bGV0ZSBbXSBtX2NvbHM7Ci0gICAgICAgICAgICBtX2NvbHMgPSBhdHRyLT52YWx1ZSgpLnRvTGVu
Z3RoQXJyYXkobV90b3RhbENvbHMpOwotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVib3JkZXJBdHRyKSB7Ci0g
ICAgICAgIC8vIGZhbHNlIG9yICJubyIgb3IgIjAiLi4KLSAgICAgICAgaWYgKCBhdHRyLT52YWx1
ZSgpLnRvSW50KCkgPT0gMCApIHsKLSAgICAgICAgICAgIGZyYW1lYm9yZGVyID0gZmFsc2U7Ci0g
ICAgICAgICAgICBtX2JvcmRlciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVCb3JkZXJT
ZXQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5vcmVzaXplQXR0cikg
ewotICAgICAgICBub3Jlc2l6ZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gYm9yZGVyQXR0cikgewotICAgICAgICBtX2JvcmRlciA9IGF0dHItPnZhbHVlKCkudG9JbnQo
KTsKLSAgICAgICAgaWYoIW1fYm9yZGVyKQotICAgICAgICAgICAgZnJhbWVib3JkZXIgPSBmYWxz
ZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmxvYWRBdHRyKSB7Ci0gICAgICAg
IGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGxvYWRFdmVudCwgYXR0cik7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25iZWZvcmV1bmxvYWRBdHRyKSB7Ci0g
ICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGJlZm9yZXVubG9h
ZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnVubG9hZEF0
dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIodW5s
b2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lU2V0RWxlbWVudDo6cmVu
ZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgLy8gSWdub3JlIGRpc3Bs
YXk6IG5vbmUgYnV0IGRvIHBheSBhdHRlbnRpb24gaWYgYSBzdHlsZXNoZWV0IGhhcyBjYXVzZWQg
dXMgdG8gZGVsYXkgb3VyIGxvYWRpbmcuCi0gICAgcmV0dXJuIHN0eWxlLT5pc1N0eWxlQXZhaWxh
YmxlKCk7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTEZyYW1lU2V0RWxlbWVudDo6Y3JlYXRlUmVu
ZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0
dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZyYW1lU2V0KHRoaXMpOwotfQotCi12b2lkIEhUTUxGcmFt
ZVNldEVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IHNldHRpbmdz
IGZyb20gcGFyZW50IGZyYW1lc2V0Ci0gICAgSFRNTEVsZW1lbnQqIG5vZGUgPSBzdGF0aWNfY2Fz
dDxIVE1MRWxlbWVudCo+KHBhcmVudE5vZGUoKSk7Ci0gICAgd2hpbGUobm9kZSkKLSAgICB7Ci0g
ICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkgewotICAgICAgICAgICAg
SFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRF
bGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICBpZighZnJhbWVCb3JkZXJTZXQpICBmcmFtZWJv
cmRlciA9IGZyYW1lc2V0LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAgICAgaWYoIW5vcmVzaXpl
KSAgbm9yZXNpemUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KG5vZGUt
PnBhcmVudE5vZGUoKSk7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6OmF0dGFjaCgpOwotfQot
Ci12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQgKmV2
dCkKLXsKLSAgICBpZiAoZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiAhbm9yZXNpemUgJiYgcmVuZGVy
ZXIoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpSZW5kZXJGcmFtZVNldCAqPihy
ZW5kZXJlcigpKS0+dXNlclJlc2l6ZShzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KSk7Ci0g
ICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVu
dDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1l
bnQ6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGNoYW5nZWQoKSAm
JiByZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0KHRydWUp
OwotICAgICAgICBzZXRDaGFuZ2VkKGZhbHNlKTsKLSAgICB9Ci0gICAgSFRNTEVsZW1lbnQ6OnJl
Y2FsY1N0eWxlKCBjaCApOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6Y29scygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjb2xzQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Q29scyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShjb2xzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0
RWxlbWVudDo6cm93cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShyb3dzQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Um93cyhjb25zdCBTdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgdmFsdWUpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxIZWFkRWxlbWVudDo6SFRNTEhlYWRFbGVtZW50KERvY3Vt
ZW50ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudChoZWFkVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxI
ZWFkRWxlbWVudDo6fkhUTUxIZWFkRWxlbWVudCgpCi17Ci19Ci0KLVN0cmluZyBIVE1MSGVhZEVs
ZW1lbnQ6OnByb2ZpbGUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUocHJvZmls
ZUF0dHIpOwotfQotCi12b2lkIEhUTUxIZWFkRWxlbWVudDo6c2V0UHJvZmlsZShjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShwcm9maWxlQXR0ciwgdmFsdWUpOwotfQot
Ci1ib29sIEhUTUxIZWFkRWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17
Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRpdGxlVGFnKSB8fCBuZXdDaGlsZC0+
aGFzVGFnTmFtZShpc2luZGV4VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFt
ZShiYXNlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpIHx8Ci0gICAgICAg
ICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHN0eWxlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFt
ZShtZXRhVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShsaW5rVGFnKSB8
fCBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhU
TUxIdG1sRWxlbWVudDo6SFRNTEh0bWxFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1M
RWxlbWVudChodG1sVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxIdG1sRWxlbWVudDo6fkhUTUxIdG1s
RWxlbWVudCgpCi17Ci19Ci0KLVN0cmluZyBIVE1MSHRtbEVsZW1lbnQ6OnZlcnNpb24oKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmVyc2lvbkF0dHIpOwotfQotCi12b2lkIEhU
TUxIdG1sRWxlbWVudDo6c2V0VmVyc2lvbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNl
dEF0dHJpYnV0ZSh2ZXJzaW9uQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhUTUxIdG1sRWxlbWVu
dDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgLy8gRklYTUU6IFdoeSBp
cyA8c2NyaXB0PiBhbGxvd2VkIGhlcmU/Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1l
KGhlYWRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGJvZHlUYWcpIHx8Ci0gICAgICAgICAg
IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFt
ZShub2ZyYW1lc1RhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0
VGFnKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSUZyYW1lRWxlbWVudDo6SFRN
TElGcmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYykgOiBIVE1MRnJhbWVFbGVtZW50KGlmcmFtZVRh
ZywgZG9jKQorSFRNTElGcmFtZUVsZW1lbnQ6OkhUTUxJRnJhbWVFbGVtZW50KERvY3VtZW50KiBk
b2MpCisgICAgOiBIVE1MRnJhbWVFbGVtZW50KGlmcmFtZVRhZywgZG9jKQorICAgICwgbmVlZFdp
ZGdldFVwZGF0ZShmYWxzZSkKIHsKICAgICBtX2ZyYW1lQm9yZGVyID0gZmFsc2U7CiAgICAgbV9t
YXJnaW5XaWR0aCA9IC0xOwogICAgIG1fbWFyZ2luSGVpZ2h0ID0gLTE7Ci0gICAgbmVlZFdpZGdl
dFVwZGF0ZSA9IGZhbHNlOwogfQogCiBIVE1MSUZyYW1lRWxlbWVudDo6fkhUTUxJRnJhbWVFbGVt
ZW50KCkKSW5kZXg6IGh0bWwvSFRNTEhlYWRFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9I
VE1MSGVhZEVsZW1lbnQuaAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxIZWFkRWxlbWVu
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMywxOTggKzIzLDE3IEBACiAgKgogICovCiAKLSNpZm5k
ZWYgSFRNTF9CQVNFSU1QTF9ICi0jZGVmaW5lIEhUTUxfQkFTRUlNUExfSAorI2lmbmRlZiBIVE1M
SGVhZEVsZW1lbnRfSAorI2RlZmluZSBIVE1MSGVhZEVsZW1lbnRfSAogCiAjaW5jbHVkZSAiSFRN
TEVsZW1lbnQuaCIKLSNpbmNsdWRlICJTY3JvbGxCYXJNb2RlLmgiCiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNsYXNzIFN0cmluZzsKLWNsYXNzIEZyYW1l
OwotY2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKLWNsYXNzIFJlbmRlckZyYW1lU2V0OwotY2xhc3Mg
UmVuZGVyRnJhbWU7Ci1jbGFzcyBSZW5kZXJQYXJ0T2JqZWN0OwotCi1zdHJ1Y3QgTGVuZ3RoOwot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCb2R5RWxlbWVudCA6IHB1YmxpYyBI
VE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxCb2R5RWxlbWVudChEb2N1bWVudCAqZG9j
KTsKLSAgICB+SFRNTEJvZHlFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMg
ZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0KLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFt
ZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lk
IHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqKTsKLQotICAgIHZpcnR1YWwg
dm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgdm9pZCBjcmVhdGVMaW5rRGVjbCgp
OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIp
IGNvbnN0OwotCi0gICAgU3RyaW5nIGFMaW5rKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBTGluayhj
b25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIGJhY2tncm91bmQoKSBjb25zdDsKLSAgICB2b2lk
IHNldEJhY2tncm91bmQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0cmluZyBiZ0NvbG9yKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmKTsKLSAgICBTdHJpbmcgbGlu
aygpIGNvbnN0OwotICAgIHZvaWQgc2V0TGluayhjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5n
IHRleHQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0
cmluZyB2TGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0VkxpbmsoY29uc3QgU3RyaW5nICYpOwot
Ci1wcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtX2xp
bmtEZWNsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MRnJhbWVFbGVt
ZW50IDogcHVibGljIEhUTUxFbGVtZW50Ci17Ci0gICAgZnJpZW5kIGNsYXNzIFJlbmRlckZyYW1l
OwotICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0T2JqZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRN
TEZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICBIVE1MRnJhbWVFbGVtZW50KGNvbnN0
IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2MpOwotICAgIH5IVE1MRnJhbWVF
bGVtZW50KCk7Ci0KLSAgICB2b2lkIGluaXQoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1
cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAK
LSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICop
OwotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdmly
dHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAg
dmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVh
bCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIFJlbmRlclN0eWxl
ICopOwotCi0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG1fbm9SZXNpemU7IH0KLQotICAg
IHZvaWQgc2V0TG9jYXRpb24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNG
b2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoYm9vbCk7Ci0KLSAg
ICBGcmFtZSogY29udGVudEZyYW1lKCkgY29uc3Q7Ci0gICAgRG9jdW1lbnQqIGNvbnRlbnREb2N1
bWVudCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRy
aWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU2Nyb2xsQmFyTW9kZSBzY3JvbGxpbmdNb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0KLSAgICBpbnQgZ2V0TWFyZ2luV2lkdGgoKSBj
b25zdCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9Ci0gICAgaW50IGdldE1hcmdpbkhlaWdodCgp
IGNvbnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0OyB9Ci0KLSAgICBTdHJpbmcgZnJhbWVCb3Jk
ZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lQm9yZGVyKGNvbnN0IFN0cmluZyAmKTsKLQot
ICAgIFN0cmluZyBsb25nRGVzYygpIGNvbnN0OwotICAgIHZvaWQgc2V0TG9uZ0Rlc2MoY29uc3Qg
U3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG1hcmdpbkhlaWdodCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBtYXJnaW5XaWR0
aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luV2lkdGgoY29uc3QgU3RyaW5nICYpOwotCi0g
ICAgU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nICYp
OwotCi0gICAgdm9pZCBzZXROb1Jlc2l6ZShib29sKTsKLQotICAgIFN0cmluZyBzY3JvbGxpbmco
KSBjb25zdDsKLSAgICB2b2lkIHNldFNjcm9sbGluZyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2
aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLSAgICB2b2lkIHNldFNyYyhjb25zdCBTdHJpbmcg
Jik7Ci0KLSAgICBpbnQgZnJhbWVXaWR0aCgpIGNvbnN0OwotICAgIGludCBmcmFtZUhlaWdodCgp
IGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBpc1VSTEFsbG93ZWQoY29uc3QgQXRvbWlj
U3RyaW5nICYpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBBdG9t
aWNTdHJpbmcgbV9VUkw7Ci0gICAgQXRvbWljU3RyaW5nIG1fbmFtZTsKLQotICAgIGludCBtX21h
cmdpbldpZHRoOwotICAgIGludCBtX21hcmdpbkhlaWdodDsKLSAgICBTY3JvbGxCYXJNb2RlIG1f
c2Nyb2xsaW5nOwotCi0gICAgYm9vbCBtX2ZyYW1lQm9yZGVyIDogMTsKLSAgICBib29sIG1fZnJh
bWVCb3JkZXJTZXQgOiAxOwotICAgIGJvb2wgbV9ub1Jlc2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGcmFtZVNldEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVs
ZW1lbnQKLXsKLSAgICBmcmllbmQgY2xhc3MgUmVuZGVyRnJhbWVTZXQ7Ci1wdWJsaWM6Ci0gICAg
SFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEZyYW1lU2V0RWxl
bWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDEwOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFRE
KGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwot
ICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICopOwotICAgIHZp
cnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJT
dHlsZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50ICpl
dnQpOwotCi0gICAgYm9vbCBmcmFtZUJvcmRlcigpIHsgcmV0dXJuIGZyYW1lYm9yZGVyOyB9Ci0g
ICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG5vcmVzaXplOyB9Ci0KLSAgICBpbnQgdG90YWxS
b3dzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbFJvd3M7IH0KLSAgICBpbnQgdG90YWxDb2xzKCkg
Y29uc3QgeyByZXR1cm4gbV90b3RhbENvbHM7IH0KLSAgICBpbnQgYm9yZGVyKCkgY29uc3QgeyBy
ZXR1cm4gbV9ib3JkZXI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVD
aGFuZ2UgY2ggKTsKLSAgICAKLSAgICBTdHJpbmcgY29scygpIGNvbnN0OwotICAgIHZvaWQgc2V0
Q29scyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgcm93cygpIGNvbnN0OwotICAgIHZv
aWQgc2V0Um93cyhjb25zdCBTdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBMZW5ndGgqIG1f
cm93czsKLSAgICBMZW5ndGgqIG1fY29sczsKLQotICAgIGludCBtX3RvdGFsUm93czsKLSAgICBp
bnQgbV90b3RhbENvbHM7Ci0gICAgaW50IG1fYm9yZGVyOwotCi0gICAgYm9vbCBmcmFtZWJvcmRl
ciA6IDE7Ci0gICAgYm9vbCBmcmFtZUJvcmRlclNldCA6IDE7Ci0gICAgYm9vbCBub3Jlc2l6ZSA6
IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIGNsYXNzIEhUTUxIZWFkRWxlbWVudCA6
IHB1YmxpYyBIVE1MRWxlbWVudAogewogcHVibGljOgotICAgIEhUTUxIZWFkRWxlbWVudChEb2N1
bWVudCAqZG9jKTsKKyAgICBIVE1MSGVhZEVsZW1lbnQoRG9jdW1lbnQqKTsKICAgICB+SFRNTEhl
YWRFbGVtZW50KCk7CiAKICAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1l
bnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQpAQCAtMjIyLDY4ICs0MSw3
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hp
bGQpOwogCiAgICAgU3RyaW5nIHByb2ZpbGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFByb2ZpbGUo
Y29uc3QgU3RyaW5nICYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1M
SHRtbEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MSHRt
bEVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxIdG1sRWxlbWVudCgpOwotCi0gICAg
dmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4g
VGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0
IHsgcmV0dXJuIDExOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5l
d0NoaWxkKTsKLQotICAgIFN0cmluZyB2ZXJzaW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWZXJz
aW9uKGNvbnN0IFN0cmluZyAmKTsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFz
cyBIVE1MSUZyYW1lRWxlbWVudCA6IHB1YmxpYyBIVE1MRnJhbWVFbGVtZW50Ci17Ci1wdWJsaWM6
Ci0gICAgSFRNTElGcmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxJRnJhbWVF
bGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQo
KSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRh
Z1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgdmlydHVhbCBib29sIG1hcFRv
RW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5
JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShN
YXBwZWRBdHRyaWJ1dGUgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0Rv
Y3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAg
IHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRl
ZChSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVy
ZXIoUmVuZGVyQXJlbmEgKiwgUmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHJlY2Fs
Y1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0
dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgaGVp
Z2h0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nICYpOwotCi0gICAg
U3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcgJik7
Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZp
cnR1YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBib29sIG5lZWRXaWRnZXRVcGRhdGU7Ci0KLSBw
cml2YXRlOgotICAgIFN0cmluZyBvbGROYW1lQXR0cjsKKyAgICB2b2lkIHNldFByb2ZpbGUoY29u
c3QgU3RyaW5nJik7CiB9OwogCiB9IC8vbmFtZXNwYWNlCkluZGV4OiBodG1sL0hUTUxGcmFtZUVs
ZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTEZyYW1lRWxlbWVudC5jcHAJKHJldmlz
aW9uIDE0MzI1KQorKysgaHRtbC9IVE1MRnJhbWVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjIsMjIxICsyMiwyNSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3
LCBVU0EuCiAgKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogI2luY2x1ZGUgImNvbmZpZy5oIgot
I2luY2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVFbGVtZW50Lmgi
CiAKLSNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVLZXl3
b3Jkcy5oIgorI2luY2x1ZGUgImNzc2hlbHBlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAj
aW5jbHVkZSAiRXZlbnROYW1lcy5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJh
bWVUcmVlLmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3
LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lU2V0RWxlbWVu
dC5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIK
LSNpbmNsdWRlICJjc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNlbGVjdG9yLmgiCi0j
aW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVkZSAicmVuZGVyX2ZyYW1lcy5oIgor
I2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcg
bmFtZXNwYWNlIEV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1IVE1M
Qm9keUVsZW1lbnQ6OkhUTUxCb2R5RWxlbWVudChEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVs
ZW1lbnQoYm9keVRhZywgZG9jKQotewotfQotCi1IVE1MQm9keUVsZW1lbnQ6On5IVE1MQm9keUVs
ZW1lbnQoKQotewotICAgIGlmIChtX2xpbmtEZWNsKSB7Ci0gICAgICAgIG1fbGlua0RlY2wtPnNl
dE5vZGUoMCk7Ci0gICAgICAgIG1fbGlua0RlY2wtPnNldFBhcmVudCgwKTsKLSAgICB9Ci19Ci0K
LXZvaWQgSFRNTEJvZHlFbGVtZW50OjpjcmVhdGVMaW5rRGVjbCgpCi17Ci0gICAgbV9saW5rRGVj
bCA9IG5ldyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjsKLSAgICBtX2xpbmtEZWNsLT5zZXRQ
YXJlbnQoZG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0KCkpOwotICAgIG1fbGlua0RlY2wtPnNldE5v
ZGUodGhpcyk7Ci0gICAgbV9saW5rRGVjbC0+c2V0U3RyaWN0UGFyc2luZyghZG9jdW1lbnQoKS0+
aW5Db21wYXRNb2RlKCkpOwotfQotCi1ib29sIEhUTUxCb2R5RWxlbWVudDo6bWFwVG9FbnRyeShj
b25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3Vs
dCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmFja2dyb3VuZEF0dHIpIHsKLSAgICAg
ICAgcmVzdWx0ID0gKE1hcHBlZEF0dHJpYnV0ZUVudHJ5KShlTGFzdEVudHJ5ICsgZG9jdW1lbnQo
KS0+ZG9jSUQoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIAotICAgIGlm
IChhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB0ZXh0QXR0
ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBtYXJnaW53aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0
ck5hbWUgPT0gbGVmdG1hcmdpbkF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gbWFyZ2luaGVp
Z2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB0b3BtYXJnaW5BdHRyIHx8Ci0gICAgICAg
IGF0dHJOYW1lID09IGJncHJvcGVydGllc0F0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZl
cnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBIVE1MRWxl
bWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MQm9keUVs
ZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAg
ICBpZiAoYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1
cmwgPSBXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwu
aXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJP
UF9CQUNLR1JPVU5EX0lNQUdFLCBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXJnaW53aWR0aEF0dHIgfHwgYXR0ci0+bmFtZSgp
ID09IGxlZnRtYXJnaW5BdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJP
UF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0
ciwgQ1NTX1BST1BfTUFSR0lOX0xFRlQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG1hcmdpbmhlaWdodEF0dHIgfHwgYXR0ci0+bmFtZSgpID09IHRvcG1h
cmdpbkF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9C
T1RUT00sIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gYmdjb2xvckF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1Bf
QkFDS0dST1VORF9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gdGV4dEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1Bf
Q09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJn
cHJvcGVydGllc0F0dHIpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZh
bHVlKCksICJmaXhlZCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BS
T1BfQkFDS0dST1VORF9BVFRBQ0hNRU5ULCBDU1NfVkFMX0ZJWEVEKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSB2bGlua0F0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUo
KSA9PSBhbGlua0F0dHIgfHwKLSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBsaW5rQXR0
cikgewotICAgICAgICBpZiAoYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmIChhdHRy
LT5uYW1lKCkgPT0gbGlua0F0dHIpCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRM
aW5rQ29sb3IoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2bGlua0F0
dHIpCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRWaXNpdGVkTGlua0NvbG9yKCk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRBY3Rp
dmVMaW5rQ29sb3IoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlm
ICghbV9saW5rRGVjbCkKLSAgICAgICAgICAgICAgICBjcmVhdGVMaW5rRGVjbCgpOwotICAgICAg
ICAgICAgbV9saW5rRGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQ09MT1IsIGF0dHItPnZhbHVl
KCksIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTVmFsdWU+IHZhbCA9IG1f
bGlua0RlY2wtPmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTX1BST1BfQ09MT1IpOwotICAgICAgICAg
ICAgaWYgKHZhbCAmJiB2YWwtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAg
IENvbG9yIGNvbCA9IGRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Z2V0Q29sb3JGcm9tUHJp
bWl0aXZlVmFsdWUoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWwuZ2V0KCkpKTsK
LSAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bmFtZSgpID09IGxpbmtBdHRyKQotICAgICAgICAg
ICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRMaW5rQ29sb3IoY29sKTsKLSAgICAgICAgICAgICAg
ICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmxpbmtBdHRyKQotICAgICAgICAgICAgICAgICAg
ICBkb2N1bWVudCgpLT5zZXRWaXNpdGVkTGlua0NvbG9yKGNvbCk7Ci0gICAgICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRBY3RpdmVMaW5rQ29sb3Io
Y29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGF0
dGFjaGVkKCkpCi0gICAgICAgICAgICBkb2N1bWVudCgpLT5yZWNhbGNTdHlsZShGb3JjZSk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25sb2FkQXR0cikgewotICAgICAgICBkb2N1
bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihsb2FkRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9uYmVmb3JldW5sb2FkQXR0cikgewotICAgICAg
ICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihiZWZvcmV1bmxvYWRFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb251bmxvYWRBdHRyKSB7
Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKHVubG9hZEV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7
Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGJsdXJFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsK
LSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoZm9jdXNFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25yZXNpemVBdHRyKSB7
Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKHJlc2l6ZUV2
ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnNjcm9sbEF0dHIp
IHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoc2Nyb2xs
RXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjppbnNlcnRlZElu
dG9Eb2N1bWVudCgpCi17Ci0gICAgSFRNTEVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCk7
Ci0KLSAgICAvLyBGSVhNRTogcGVyaGFwcyB0aGlzIGNvZGUgc2hvdWxkIGJlIGluIGF0dGFjaCgp
IGluc3RlYWQgb2YgaGVyZQotCi0gICAgRnJhbWVWaWV3ICp3ID0gZG9jdW1lbnQoKS0+dmlldygp
OwotICAgIGlmICh3ICYmIHctPm1hcmdpbldpZHRoKCkgIT0gLTEpCi0gICAgICAgIHNldEF0dHJp
YnV0ZShtYXJnaW53aWR0aEF0dHIsIFN0cmluZzo6bnVtYmVyKHctPm1hcmdpbldpZHRoKCkpKTsK
LSAgICBpZiAodyAmJiB3LT5tYXJnaW5IZWlnaHQoKSAhPSAtMSkKLSAgICAgICAgc2V0QXR0cmli
dXRlKG1hcmdpbmhlaWdodEF0dHIsIFN0cmluZzo6bnVtYmVyKHctPm1hcmdpbkhlaWdodCgpKSk7
Ci0KLSAgICBpZiAodykKLSAgICAgICAgdy0+c2NoZWR1bGVSZWxheW91dCgpOwotfQotCi1ib29s
IEhUTUxCb2R5RWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAot
ewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gYmFja2dyb3VuZEF0dHI7Ci19Ci0KLVN0cmlu
ZyBIVE1MQm9keUVsZW1lbnQ6OmFMaW5rKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGFsaW5rQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRBTGluayhjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlua0F0dHIsIHZhbHVlKTsK
LX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6YmFja2dyb3VuZCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShiYWNrZ3JvdW5kQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlF
bGVtZW50OjpzZXRCYWNrZ3JvdW5kKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKGJhY2tncm91bmRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1l
bnQ6OmJnQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYmdjb2xvckF0
dHIpOwotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVudDo6c2V0QmdDb2xvcihjb25zdCBTdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFsdWUpOwotfQotCi1T
dHJpbmcgSFRNTEJvZHlFbGVtZW50OjpsaW5rKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGxpbmtBdHRyKTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnNldExpbmsoY29u
c3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUobGlua0F0dHIsIHZhbHVlKTsK
LX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6dGV4dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZSh0ZXh0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRU
ZXh0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHRleHRBdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OnZMaW5rKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKHZsaW5rQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVt
ZW50OjpzZXRWTGluayhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2
bGlua0F0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBIVE1MRnJhbWVF
bGVtZW50OjpIVE1MRnJhbWVFbGVtZW50KERvY3VtZW50ICpkb2MpCiAgICAgOiBIVE1MRWxlbWVu
dChmcmFtZVRhZywgZG9jKQogewpAQCAtMjY4LDcgKzcyLDcgQEAgYm9vbCBIVE1MRnJhbWVFbGVt
ZW50Ojppc1VSTEFsbG93ZWQoY29ucwogICAgIGlmIChVUkxTdHJpbmcuaXNFbXB0eSgpKQogICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICAKLSAgICBGcmFtZVZpZXcgKncgPSBkb2N1bWVudCgpLT52
aWV3KCk7CisgICAgRnJhbWVWaWV3KiB3ID0gZG9jdW1lbnQoKS0+dmlldygpOwogICAgIGlmICgh
dykKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0yODMsOSArODcsOCBAQCBib29sIEhUTUxG
cmFtZUVsZW1lbnQ6OmlzVVJMQWxsb3dlZChjb25zCiAgICAgLy8gRklYTUU6IFRoaXMgbGltaXQg
Y291bGQgYmUgaGlnaGVyLCBidXQgV2ViS2l0IGhhcyBzb21lCiAgICAgLy8gYWxnb3JpdGhtcyB0
aGF0IGhhcHBlbiB3aGlsZSBsb2FkaW5nIHdoaWNoIGFwcGVhciB0byBiZSBOXjIgb3IKICAgICAv
LyB3b3JzZSBpbiB0aGUgbnVtYmVyIG9mIGZyYW1lcwotICAgIGlmICh3LT5mcmFtZSgpLT5wYWdl
KCktPmZyYW1lQ291bnQoKSA+PSAyMDApIHsKKyAgICBpZiAody0+ZnJhbWUoKS0+cGFnZSgpLT5m
cmFtZUNvdW50KCkgPj0gMjAwKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCiAgICAg
Ly8gV2UgYWxsb3cgb25lIGxldmVsIG9mIHNlbGYtcmVmZXJlbmNlIGJlY2F1c2Ugc29tZSBzaXRl
cyBkZXBlbmQgb24gdGhhdC4KICAgICAvLyBCdXQgd2UgZG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9u
ZS4KQEAgLTI5NCw5ICs5Nyw4IEBAIGJvb2wgSFRNTEZyYW1lRWxlbWVudDo6aXNVUkxBbGxvd2Vk
KGNvbnMKICAgICAgICAgS1VSTCBmcmFtZVVSTCA9IGZyYW1lLT51cmwoKTsKICAgICAgICAgZnJh
bWVVUkwuc2V0UmVmKERlcHJlY2F0ZWRTdHJpbmc6Om51bGwpOwogICAgICAgICBpZiAoZnJhbWVV
UkwgPT0gbmV3VVJMKSB7Ci0gICAgICAgICAgICBpZiAoZm91bmRTZWxmUmVmZXJlbmNlKSB7Cisg
ICAgICAgICAgICBpZiAoZm91bmRTZWxmUmVmZXJlbmNlKQogICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvdW5kU2VsZlJlZmVyZW5jZSA9
IHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjIsMTIgKzEyNCwxMSBAQCB2b2lkIEhUTUxG
cmFtZUVsZW1lbnQ6Om9wZW5VUkwoKQogICAgICAgICBwYXJlbnRGcmFtZS0+cmVxdWVzdEZyYW1l
KHN0YXRpY19jYXN0PFJlbmRlckZyYW1lICo+KHJlbmRlcmVyKCkpLCByZWxhdGl2ZVVSTCwgbV9u
YW1lKTsKIH0KIAotCiB2b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKIHsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0
dHIpIHsKKyAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpCiAgICAgICAgIHNldExvY2F0
aW9uKFdlYkNvcmU6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBpZEF0dHIpIHsKKyAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaWRB
dHRyKSB7CiAgICAgICAgIC8vIEltcG9ydGFudCB0byBjYWxsIHRocm91Z2ggdG8gYmFzZSBmb3Ig
dGhlIGlkIGF0dHJpYnV0ZSBzbyB0aGUgaGFzSUQgYml0IGdldHMgc2V0LgogICAgICAgICBIVE1M
RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgIG1fbmFtZSA9IGF0
dHItPnZhbHVlKCk7CkBAIC00NjMsOSArMjY0LDggQEAgdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojpz
ZXRMb2NhdGlvbihjb25zdAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIAotICAgIGlmICgh
aXNVUkxBbGxvd2VkKG1fVVJMKSkgeworICAgIGlmICghaXNVUkxBbGxvd2VkKG1fVVJMKSkKICAg
ICAgICAgcmV0dXJuOwotICAgIH0KIAogICAgIG9wZW5VUkwoKTsKIH0KQEAgLTYwNCwzNTIgKzQw
NCw0IEBAIGludCBIVE1MRnJhbWVFbGVtZW50OjpmcmFtZUhlaWdodCgpIGNvbnMKICAgICByZXR1
cm4gcmVuZGVyZXIoKS0+aGVpZ2h0KCk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRN
TEZyYW1lU2V0RWxlbWVudDo6SFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKQotICAg
IDogSFRNTEVsZW1lbnQoZnJhbWVzZXRUYWcsIGRvYykKLXsKLSAgICAvLyBkZWZhdWx0IHZhbHVl
IGZvciByb3dzIGFuZCBjb2xzLi4uCi0gICAgbV90b3RhbFJvd3MgPSAxOwotICAgIG1fdG90YWxD
b2xzID0gMTsKLQotICAgIG1fcm93cyA9IG1fY29scyA9IDA7Ci0KLSAgICBmcmFtZWJvcmRlciA9
IHRydWU7Ci0gICAgZnJhbWVCb3JkZXJTZXQgPSBmYWxzZTsKLSAgICBtX2JvcmRlciA9IDQ7Ci0g
ICAgbm9yZXNpemUgPSBmYWxzZTsKLX0KLQotSFRNTEZyYW1lU2V0RWxlbWVudDo6fkhUTUxGcmFt
ZVNldEVsZW1lbnQoKQotewotICAgIGlmIChtX3Jvd3MpCi0gICAgICAgIGRlbGV0ZSBbXSBtX3Jv
d3M7Ci0gICAgaWYgKG1fY29scykKLSAgICAgICAgZGVsZXRlIFtdIG1fY29sczsKLX0KLQotYm9v
bCBIVE1MRnJhbWVTZXRFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsK
LSAgICAvLyBGSVhNRTogT2xkIGNvZGUgaGFkIGFkamFjZW50IGRvdWJsZSByZXR1cm5zIGFuZCBz
ZWVtZWQgdG8gd2FudCB0byBkbyBzb21ldGhpbmcgd2l0aCBOT0ZSQU1FUyAoYnV0IGRpZG4ndCku
Ci0gICAgLy8gV2hhdCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvcj8KLSAgICByZXR1cm4gbmV3Q2hp
bGQtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZyYW1l
VGFnKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dz
QXR0cikgewotICAgICAgICBpZiAoIWF0dHItPmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBpZiAo
bV9yb3dzKSBkZWxldGUgW10gbV9yb3dzOwotICAgICAgICAgICAgbV9yb3dzID0gYXR0ci0+dmFs
dWUoKS50b0xlbmd0aEFycmF5KG1fdG90YWxSb3dzKTsKLSAgICAgICAgICAgIHNldENoYW5nZWQo
KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNvbHNBdHRyKSB7
Ci0gICAgICAgIGlmICghYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBbXSBt
X2NvbHM7Ci0gICAgICAgICAgICBtX2NvbHMgPSBhdHRyLT52YWx1ZSgpLnRvTGVuZ3RoQXJyYXko
bV90b3RhbENvbHMpOwotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVib3JkZXJBdHRyKSB7Ci0gICAgICAgIC8v
IGZhbHNlIG9yICJubyIgb3IgIjAiLi4KLSAgICAgICAgaWYgKCBhdHRyLT52YWx1ZSgpLnRvSW50
KCkgPT0gMCApIHsKLSAgICAgICAgICAgIGZyYW1lYm9yZGVyID0gZmFsc2U7Ci0gICAgICAgICAg
ICBtX2JvcmRlciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVCb3JkZXJTZXQgPSB0cnVl
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5vcmVzaXplQXR0cikgewotICAgICAg
ICBub3Jlc2l6ZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9yZGVy
QXR0cikgewotICAgICAgICBtX2JvcmRlciA9IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAg
ICAgaWYoIW1fYm9yZGVyKQotICAgICAgICAgICAgZnJhbWVib3JkZXIgPSBmYWxzZTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmxvYWRBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50
KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25iZWZvcmV1bmxvYWRBdHRyKSB7Ci0gICAgICAgIGRv
Y3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGJlZm9yZXVubG9hZEV2ZW50LCBh
dHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnVubG9hZEF0dHIpIHsKLSAg
ICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIodW5sb2FkRXZlbnQs
IGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRy
aWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lU2V0RWxlbWVudDo6cmVuZGVyZXJJc05l
ZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgLy8gSWdub3JlIGRpc3BsYXk6IG5vbmUg
YnV0IGRvIHBheSBhdHRlbnRpb24gaWYgYSBzdHlsZXNoZWV0IGhhcyBjYXVzZWQgdXMgdG8gZGVs
YXkgb3VyIGxvYWRpbmcuCi0gICAgcmV0dXJuIHN0eWxlLT5pc1N0eWxlQXZhaWxhYmxlKCk7Ci19
Ci0KLVJlbmRlck9iamVjdCAqSFRNTEZyYW1lU2V0RWxlbWVudDo6Y3JlYXRlUmVuZGVyZXIoUmVu
ZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAo
YXJlbmEpIFJlbmRlckZyYW1lU2V0KHRoaXMpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1l
bnQ6OmF0dGFjaCgpCi17Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IHNldHRpbmdzIGZyb20gcGFy
ZW50IGZyYW1lc2V0Ci0gICAgSFRNTEVsZW1lbnQqIG5vZGUgPSBzdGF0aWNfY2FzdDxIVE1MRWxl
bWVudCo+KHBhcmVudE5vZGUoKSk7Ci0gICAgd2hpbGUobm9kZSkKLSAgICB7Ci0gICAgICAgIGlm
IChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkgewotICAgICAgICAgICAgSFRNTEZyYW1l
U2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4o
bm9kZSk7Ci0gICAgICAgICAgICBpZighZnJhbWVCb3JkZXJTZXQpICBmcmFtZWJvcmRlciA9IGZy
YW1lc2V0LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAgICAgaWYoIW5vcmVzaXplKSAgbm9yZXNp
emUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9
Ci0gICAgICAgIG5vZGUgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KG5vZGUtPnBhcmVudE5v
ZGUoKSk7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6OmF0dGFjaCgpOwotfQotCi12b2lkIEhU
TUxGcmFtZVNldEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQgKmV2dCkKLXsKLSAg
ICBpZiAoZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiAhbm9yZXNpemUgJiYgcmVuZGVyZXIoKSkgewot
ICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpSZW5kZXJGcmFtZVNldCAqPihyZW5kZXJlcigp
KS0+dXNlclJlc2l6ZShzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KSk7Ci0gICAgICAgIGV2
dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6ZGVmYXVs
dEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OnJlY2Fs
Y1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGNoYW5nZWQoKSAmJiByZW5kZXJl
cigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAg
ICBzZXRDaGFuZ2VkKGZhbHNlKTsKLSAgICB9Ci0gICAgSFRNTEVsZW1lbnQ6OnJlY2FsY1N0eWxl
KCBjaCApOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6Y29scygpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjb2xzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1l
U2V0RWxlbWVudDo6c2V0Q29scyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShjb2xzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6
cm93cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShyb3dzQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Um93cyhjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLUhUTUxIZWFkRWxlbWVudDo6SFRNTEhlYWRFbGVtZW50KERvY3VtZW50ICpkb2Mp
Ci0gICAgOiBIVE1MRWxlbWVudChoZWFkVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxIZWFkRWxlbWVu
dDo6fkhUTUxIZWFkRWxlbWVudCgpCi17Ci19Ci0KLVN0cmluZyBIVE1MSGVhZEVsZW1lbnQ6OnBy
b2ZpbGUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUocHJvZmlsZUF0dHIpOwot
fQotCi12b2lkIEhUTUxIZWFkRWxlbWVudDo6c2V0UHJvZmlsZShjb25zdCBTdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShwcm9maWxlQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhU
TUxIZWFkRWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgcmV0
dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRpdGxlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFt
ZShpc2luZGV4VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShiYXNlVGFn
KSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpIHx8Ci0gICAgICAgICAgIG5ld0No
aWxkLT5oYXNUYWdOYW1lKHN0eWxlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShtZXRhVGFn
KSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShsaW5rVGFnKSB8fCBuZXdDaGls
ZC0+aXNUZXh0Tm9kZSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxIdG1sRWxl
bWVudDo6SFRNTEh0bWxFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudCho
dG1sVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxIdG1sRWxlbWVudDo6fkhUTUxIdG1sRWxlbWVudCgp
Ci17Ci19Ci0KLVN0cmluZyBIVE1MSHRtbEVsZW1lbnQ6OnZlcnNpb24oKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUodmVyc2lvbkF0dHIpOwotfQotCi12b2lkIEhUTUxIdG1sRWxl
bWVudDo6c2V0VmVyc2lvbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh2ZXJzaW9uQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhUTUxIdG1sRWxlbWVudDo6Y2hlY2tE
VEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgLy8gRklYTUU6IFdoeSBpcyA8c2NyaXB0
PiBhbGxvd2VkIGhlcmU/Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGhlYWRUYWcp
IHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGJvZHlUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxk
LT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShub2ZyYW1l
c1RhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSUZyYW1lRWxlbWVudDo6SFRNTElGcmFtZUVs
ZW1lbnQoRG9jdW1lbnQgKmRvYykgOiBIVE1MRnJhbWVFbGVtZW50KGlmcmFtZVRhZywgZG9jKQot
ewotICAgIG1fZnJhbWVCb3JkZXIgPSBmYWxzZTsKLSAgICBtX21hcmdpbldpZHRoID0gLTE7Ci0g
ICAgbV9tYXJnaW5IZWlnaHQgPSAtMTsKLSAgICBuZWVkV2lkZ2V0VXBkYXRlID0gZmFsc2U7Ci19
Ci0KLUhUTUxJRnJhbWVFbGVtZW50Ojp+SFRNTElGcmFtZUVsZW1lbnQoKQotewotfQotCi1ib29s
IEhUTUxJRnJhbWVFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJO
YW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRy
TmFtZSA9PSB3aWR0aEF0dHIgfHwgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBy
ZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAot
ICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVJlcGxh
Y2VkOyAvLyBTaGFyZSB3aXRoIDxpbWc+IHNpbmNlIHRoZSBhbGlnbm1lbnQgYmVoYXZpb3IgaXMg
dGhlIHNhbWUuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJu
IEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhU
TUxJRnJhbWVFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0
dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpCi0gICAgICAgIGFkZENT
U0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpCi0gICAgICAgIGFkZENTU0xlbmd0aChhdHRy
LCBDU1NfUFJPUF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBhbGlnbkF0dHIpCi0gICAgICAgIGFkZEhUTUxBbGlnbm1lbnQoYXR0cik7Ci0gICAg
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAgIFN0cmluZyBuZXdO
YW1lQXR0ciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChpbkRvY3VtZW50KCkgJiYgZG9j
dW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICAgICAgSFRNTERvY3VtZW50ICpk
b2MgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oZG9jdW1lbnQoKSk7Ci0gICAgICAgICAg
ICBkb2MtPnJlbW92ZURvY0V4dHJhTmFtZWRJdGVtKG9sZE5hbWVBdHRyKTsKLSAgICAgICAgICAg
IGRvYy0+YWRkRG9jRXh0cmFOYW1lZEl0ZW0obmV3TmFtZUF0dHIpOwotICAgICAgICB9Ci0gICAg
ICAgIG9sZE5hbWVBdHRyID0gbmV3TmFtZUF0dHI7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxG
cmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi12b2lkIEhUTUxJ
RnJhbWVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKGRvY3VtZW50
KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRNTERvY3VtZW50ICpkb2MgPSBzdGF0
aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oZG9jdW1lbnQoKSk7Ci0gICAgICAgIGRvYy0+YWRkRG9j
RXh0cmFOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLQotICAgIEhUTUxFbGVtZW50Ojpp
bnNlcnRlZEludG9Eb2N1bWVudCgpOwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50OjpyZW1v
dmVkRnJvbURvY3VtZW50KCkKLXsKLSAgICBpZiAoZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQo
KSkgewotICAgICAgICBIVE1MRG9jdW1lbnQgKmRvYyA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVu
dCAqPihkb2N1bWVudCgpKTsKLSAgICAgICAgZG9jLT5yZW1vdmVEb2NFeHRyYU5hbWVkSXRlbShv
bGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6OnJlbW92ZWRGcm9tRG9jdW1l
bnQoKTsKLX0KLQotYm9vbCBIVE1MSUZyYW1lRWxlbWVudDo6cmVuZGVyZXJJc05lZWRlZChSZW5k
ZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgLy8gRG9uJ3QgaWdub3JlIGRpc3BsYXk6IG5vbmUgdGhl
IHdheSBmcmFtZSBkb2VzLgotICAgIHJldHVybiBpc1VSTEFsbG93ZWQobV9VUkwpICYmIHN0eWxl
LT5kaXNwbGF5KCkgIT0gTk9ORTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MSUZyYW1lRWxlbWVu
dDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUp
Ci17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclBhcnRPYmplY3QodGhpcyk7Ci19Ci0K
LXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgbV9uYW1lID0gZ2V0QXR0
cmlidXRlKG5hbWVBdHRyKTsKLSAgICBpZiAobV9uYW1lLmlzTnVsbCgpKQotICAgICAgICBtX25h
bWUgPSBnZXRBdHRyaWJ1dGUoaWRBdHRyKTsKLQotICAgIEhUTUxFbGVtZW50OjphdHRhY2goKTsK
LQotICAgIEZyYW1lKiBwYXJlbnRGcmFtZSA9IGRvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYg
KHJlbmRlcmVyKCkgJiYgcGFyZW50RnJhbWUpIHsKLSAgICAgICAgcGFyZW50RnJhbWUtPnBhZ2Uo
KS0+aW5jcmVtZW50RnJhbWVDb3VudCgpOwotICAgICAgICBtX25hbWUgPSBwYXJlbnRGcmFtZS0+
dHJlZSgpLT51bmlxdWVDaGlsZE5hbWUobV9uYW1lKTsKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVu
ZGVyUGFydE9iamVjdCo+KHJlbmRlcmVyKCkpLT51cGRhdGVXaWRnZXQoKTsKLSAgICAgICAgbmVl
ZFdpZGdldFVwZGF0ZSA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVu
dDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAgICBpZiAobmVlZFdpZGdldFVw
ZGF0ZSkgewotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlclBhcnRPYmplY3QqPihyZW5kZXJlcigpKS0+dXBkYXRlV2lkZ2V0KCk7Ci0gICAgICAg
IG5lZWRXaWRnZXRVcGRhdGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgSFRNTEVsZW1lbnQ6OnJlY2Fs
Y1N0eWxlKCBjaCApOwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50OjpvcGVuVVJMKCkKLXsK
LSAgICBuZWVkV2lkZ2V0VXBkYXRlID0gdHJ1ZTsKLSAgICBzZXRDaGFuZ2VkKCk7Ci19Ci0KLWJv
b2wgSFRNTElGcmFtZUVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cikgY29u
c3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IHNyY0F0dHI7Ci19Ci0KLVN0cmluZyBI
VE1MSUZyYW1lRWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6c2V0QWxpZ24oY29u
c3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7
Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxlbWVudDo6aGVpZ2h0KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKGhlaWdodEF0dHIpOwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVt
ZW50OjpzZXRIZWlnaHQoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
aGVpZ2h0QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTElGcmFtZUVsZW1lbnQ6OnNyYygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRvY3VtZW50KCktPmNvbXBsZXRlVVJMKGdldEF0dHJpYnV0
ZShzcmNBdHRyKSk7Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxlbWVudDo6d2lkdGgoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsKLX0KLQotdm9pZCBIVE1M
SUZyYW1lRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0KIH0KSW5kZXg6IGh0bWwvSFRNTEZyYW1l
U2V0RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MRnJhbWVTZXRFbGVtZW50LmNw
cAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxGcmFtZVNldEVsZW1lbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMiw2MDMgKzIyLDMyIEBACiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCiAgKiBCb3N0b24sIE1B
IDAyMTExLTEzMDcsIFVTQS4KICAqLwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiAjaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaW5jbHVkZSAiaHRtbF9iYXNlaW1wbC5oIgorI2luY2x1ZGUgIkhUTUxGcmFt
ZVNldEVsZW1lbnQuaCIKIAotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJF
dmVudE5hbWVzLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVRyZWUuaCIK
LSNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNs
dWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAi
Y3NzaGVscGVyLmgiCi0jaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rvci5oIgorI2luY2x1ZGUgIkxl
bmd0aC5oIgogI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInJlbmRlcl9m
cmFtZXMuaCIKKyNpbmNsdWRlICJSZW5kZXJGcmFtZVNldC5oIgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwogdXNpbmcgbmFtZXNwYWNlIEhUTUxO
YW1lczsKIAotSFRNTEJvZHlFbGVtZW50OjpIVE1MQm9keUVsZW1lbnQoRG9jdW1lbnQgKmRvYykK
LSAgICA6IEhUTUxFbGVtZW50KGJvZHlUYWcsIGRvYykKLXsKLX0KLQotSFRNTEJvZHlFbGVtZW50
Ojp+SFRNTEJvZHlFbGVtZW50KCkKLXsKLSAgICBpZiAobV9saW5rRGVjbCkgewotICAgICAgICBt
X2xpbmtEZWNsLT5zZXROb2RlKDApOwotICAgICAgICBtX2xpbmtEZWNsLT5zZXRQYXJlbnQoMCk7
Ci0gICAgfQotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVudDo6Y3JlYXRlTGlua0RlY2woKQotewot
ICAgIG1fbGlua0RlY2wgPSBuZXcgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb247Ci0gICAgbV9s
aW5rRGVjbC0+c2V0UGFyZW50KGRvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICBtX2xp
bmtEZWNsLT5zZXROb2RlKHRoaXMpOwotICAgIG1fbGlua0RlY2wtPnNldFN0cmljdFBhcnNpbmco
IWRvY3VtZW50KCktPmluQ29tcGF0TW9kZSgpKTsKLX0KLQotYm9vbCBIVE1MQm9keUVsZW1lbnQ6
Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0
ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRB
dHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IChNYXBwZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRy
eSArIGRvY3VtZW50KCktPmRvY0lEKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAK
LSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAgICAgICAgYXR0ck5h
bWUgPT0gdGV4dEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gbWFyZ2lud2lkdGhBdHRyIHx8
Ci0gICAgICAgIGF0dHJOYW1lID09IGxlZnRtYXJnaW5BdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1l
ID09IG1hcmdpbmhlaWdodEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdG9wbWFyZ2luQXR0
ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBiZ3Byb3BlcnRpZXNBdHRyKSB7Ci0gICAgICAgIHJl
c3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gSFRNTEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZv
aWQgSFRNTEJvZHlFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUg
KmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAg
ICAgICBTdHJpbmcgdXJsID0gV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAg
ICAgIGlmICghdXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0ltYWdlUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9JTUFHRSwgZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwo
dXJsKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbWFyZ2lud2lkdGhBdHRyIHx8
IGF0dHItPm5hbWUoKSA9PSBsZWZ0bWFyZ2luQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgo
YXR0ciwgQ1NTX1BST1BfTUFSR0lOX1JJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRk
Q1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9MRUZULCBhdHRyLT52YWx1ZSgpKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXJnaW5oZWlnaHRBdHRyIHx8IGF0dHItPm5h
bWUoKSA9PSB0b3BtYXJnaW5BdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1Nf
UFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3Ro
KGF0dHIsIENTU19QUk9QX01BUkdJTl9UT1AsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKSB7Ci0gICAgICAgIGFkZENTU0NvbG9yKGF0
dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IHRleHRBdHRyKSB7Ci0gICAgICAgIGFkZENTU0NvbG9yKGF0
dHIsIENTU19QUk9QX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBiZ3Byb3BlcnRpZXNBdHRyKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShhdHRyLT52YWx1ZSgpLCAiZml4ZWQiKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5
KGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfQVRUQUNITUVOVCwgQ1NTX1ZBTF9GSVhFRCk7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmxpbmtBdHRyIHx8Ci0gICAgICAgICAgICAg
ICBhdHRyLT5uYW1lKCkgPT0gYWxpbmtBdHRyIHx8Ci0gICAgICAgICAgICAgICBhdHRyLT5uYW1l
KCkgPT0gbGlua0F0dHIpIHsKLSAgICAgICAgaWYgKGF0dHItPmlzTnVsbCgpKSB7Ci0gICAgICAg
ICAgICBpZiAoYXR0ci0+bmFtZSgpID09IGxpbmtBdHRyKQotICAgICAgICAgICAgICAgIGRvY3Vt
ZW50KCktPnJlc2V0TGlua0NvbG9yKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gdmxpbmtBdHRyKQotICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnJlc2V0VmlzaXRl
ZExpbmtDb2xvcigpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRvY3VtZW50
KCktPnJlc2V0QWN0aXZlTGlua0NvbG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICBpZiAoIW1fbGlua0RlY2wpCi0gICAgICAgICAgICAgICAgY3JlYXRlTGlua0Rl
Y2woKTsKLSAgICAgICAgICAgIG1fbGlua0RlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0NPTE9S
LCBhdHRyLT52YWx1ZSgpLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgUmVmUHRyPENTU1Zh
bHVlPiB2YWwgPSBtX2xpbmtEZWNsLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU19QUk9QX0NPTE9S
KTsKLSAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAg
ICAgICAgICAgICAgICBDb2xvciBjb2wgPSBkb2N1bWVudCgpLT5zdHlsZVNlbGVjdG9yKCktPmdl
dENvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dmFsLmdldCgpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHItPm5hbWUoKSA9PSBsaW5rQXR0
cikKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+c2V0TGlua0NvbG9yKGNvbCk7Ci0g
ICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZsaW5rQXR0cikKLSAgICAg
ICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+c2V0VmlzaXRlZExpbmtDb2xvcihjb2wpOwotICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQoKS0+c2V0QWN0
aXZlTGlua0NvbG9yKGNvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0g
ICAgICAgIGlmIChhdHRhY2hlZCgpKQotICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVjYWxjU3R5
bGUoRm9yY2UpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9ubG9hZEF0dHIpIHsK
LSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIobG9hZEV2ZW50
LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJlZm9yZXVubG9hZEF0
dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoYmVm
b3JldW5sb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
dW5sb2FkQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0
ZW5lcih1bmxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25ibHVyQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0
ZW5lcihibHVyRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
Zm9jdXNBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3Rl
bmVyKGZvY3VzRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
cmVzaXplQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0
ZW5lcihyZXNpemVFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25zY3JvbGxBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExp
c3RlbmVyKHNjcm9sbEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1l
bnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVu
dDo6aW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIEhUTUxFbGVtZW50OjppbnNlcnRlZElu
dG9Eb2N1bWVudCgpOwotCi0gICAgLy8gRklYTUU6IHBlcmhhcHMgdGhpcyBjb2RlIHNob3VsZCBi
ZSBpbiBhdHRhY2goKSBpbnN0ZWFkIG9mIGhlcmUKLQotICAgIEZyYW1lVmlldyAqdyA9IGRvY3Vt
ZW50KCktPnZpZXcoKTsKLSAgICBpZiAodyAmJiB3LT5tYXJnaW5XaWR0aCgpICE9IC0xKQotICAg
ICAgICBzZXRBdHRyaWJ1dGUobWFyZ2lud2lkdGhBdHRyLCBTdHJpbmc6Om51bWJlcih3LT5tYXJn
aW5XaWR0aCgpKSk7Ci0gICAgaWYgKHcgJiYgdy0+bWFyZ2luSGVpZ2h0KCkgIT0gLTEpCi0gICAg
ICAgIHNldEF0dHJpYnV0ZShtYXJnaW5oZWlnaHRBdHRyLCBTdHJpbmc6Om51bWJlcih3LT5tYXJn
aW5IZWlnaHQoKSkpOwotCi0gICAgaWYgKHcpCi0gICAgICAgIHctPnNjaGVkdWxlUmVsYXlvdXQo
KTsKLX0KLQotYm9vbCBIVE1MQm9keUVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAq
YXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRy
OwotfQotCi1TdHJpbmcgSFRNTEJvZHlFbGVtZW50OjphTGluaygpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShhbGlua0F0dHIpOwotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVudDo6
c2V0QUxpbmsoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpbmtB
dHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OmJhY2tncm91bmQoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYmFja2dyb3VuZEF0dHIpOwotfQotCi12
b2lkIEhUTUxCb2R5RWxlbWVudDo6c2V0QmFja2dyb3VuZChjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShiYWNrZ3JvdW5kQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcg
SFRNTEJvZHlFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnNldEJnQ29sb3Io
Y29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIsIHZh
bHVlKTsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6bGluaygpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShsaW5rQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50
OjpzZXRMaW5rKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxpbmtB
dHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OnRleHQoKSBjb25zdAot
ewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodGV4dEF0dHIpOwotfQotCi12b2lkIEhUTUxCb2R5
RWxlbWVudDo6c2V0VGV4dChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh0ZXh0QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEJvZHlFbGVtZW50Ojp2TGluaygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2bGlua0F0dHIpOwotfQotCi12b2lk
IEhUTUxCb2R5RWxlbWVudDo6c2V0VkxpbmsoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUodmxpbmtBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotSFRNTEZyYW1lRWxlbWVudDo6SFRNTEZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKQotICAg
IDogSFRNTEVsZW1lbnQoZnJhbWVUYWcsIGRvYykKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUhUTUxG
cmFtZUVsZW1lbnQ6OkhUTUxGcmFtZUVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFt
ZSwgRG9jdW1lbnQgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50KHRhZ05hbWUsIGRvYykKLXsKLSAg
ICBpbml0KCk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6aW5pdCgpCi17Ci0gICAgbV9m
cmFtZUJvcmRlciA9IHRydWU7Ci0gICAgbV9mcmFtZUJvcmRlclNldCA9IGZhbHNlOwotICAgIG1f
bWFyZ2luV2lkdGggPSAtMTsKLSAgICBtX21hcmdpbkhlaWdodCA9IC0xOwotICAgIG1fc2Nyb2xs
aW5nID0gU2Nyb2xsQmFyQXV0bzsKLSAgICBtX25vUmVzaXplID0gZmFsc2U7Ci19Ci0KLUhUTUxG
cmFtZUVsZW1lbnQ6On5IVE1MRnJhbWVFbGVtZW50KCkKLXsKLX0KLQotYm9vbCBIVE1MRnJhbWVF
bGVtZW50Ojppc1VSTEFsbG93ZWQoY29uc3QgQXRvbWljU3RyaW5nICZVUkxTdHJpbmcpIGNvbnN0
Ci17Ci0gICAgaWYgKFVSTFN0cmluZy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIAotICAgIEZyYW1lVmlldyAqdyA9IGRvY3VtZW50KCktPnZpZXcoKTsKLSAgICBpZiAoIXcp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEtVUkwgbmV3VVJMKGRvY3VtZW50KCktPmNv
bXBsZXRlVVJMKFVSTFN0cmluZy5kZXByZWNhdGVkU3RyaW5nKCkpKTsKLSAgICBuZXdVUkwuc2V0
UmVmKERlcHJlY2F0ZWRTdHJpbmc6Om51bGwpOwotCi0gICAgLy8gRG9uJ3QgYWxsb3cgbW9yZSB0
aGFuIDEwMDAgdG90YWwgZnJhbWVzIGluIGEgc2V0LiBUaGlzIHNlZW1zCi0gICAgLy8gbGlrZSBh
IHJlYXNvbmFibGUgdXBwZXIgYm91bmQsIGFuZCBvdGhlcndpc2UgbXV0dWFsbHkgcmVjdXJzaXZl
Ci0gICAgLy8gZnJhbWVzZXQgcGFnZXMgY2FuIHF1aWNrbHkgYnJpbmcgdGhlIHByb2dyYW0gdG8g
aXRzIGtuZWVzIHdpdGgKLSAgICAvLyBleHBvbmVudGlhbCBncm93dGggaW4gdGhlIG51bWJlciBv
ZiBmcmFtZXMuCi0KLSAgICAvLyBGSVhNRTogVGhpcyBsaW1pdCBjb3VsZCBiZSBoaWdoZXIsIGJ1
dCBXZWJLaXQgaGFzIHNvbWUKLSAgICAvLyBhbGdvcml0aG1zIHRoYXQgaGFwcGVuIHdoaWxlIGxv
YWRpbmcgd2hpY2ggYXBwZWFyIHRvIGJlIE5eMiBvcgotICAgIC8vIHdvcnNlIGluIHRoZSBudW1i
ZXIgb2YgZnJhbWVzCi0gICAgaWYgKHctPmZyYW1lKCktPnBhZ2UoKS0+ZnJhbWVDb3VudCgpID49
IDIwMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gV2UgYWxsb3cg
b25lIGxldmVsIG9mIHNlbGYtcmVmZXJlbmNlIGJlY2F1c2Ugc29tZSBzaXRlcyBkZXBlbmQgb24g
dGhhdC4KLSAgICAvLyBCdXQgd2UgZG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZS4KLSAgICBib29s
IGZvdW5kU2VsZlJlZmVyZW5jZSA9IGZhbHNlOwotICAgIGZvciAoRnJhbWUgKmZyYW1lID0gdy0+
ZnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpIHsKLSAgICAg
ICAgS1VSTCBmcmFtZVVSTCA9IGZyYW1lLT51cmwoKTsKLSAgICAgICAgZnJhbWVVUkwuc2V0UmVm
KERlcHJlY2F0ZWRTdHJpbmc6Om51bGwpOwotICAgICAgICBpZiAoZnJhbWVVUkwgPT0gbmV3VVJM
KSB7Ci0gICAgICAgICAgICBpZiAoZm91bmRTZWxmUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm91bmRTZWxmUmVm
ZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpvcGVuVVJMKCkKLXsKLSAgICBGcmFtZVZpZXcg
KncgPSBkb2N1bWVudCgpLT52aWV3KCk7Ci0gICAgaWYgKCF3KQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgQXRvbWljU3RyaW5nIHJlbGF0aXZlVVJMID0gbV9VUkw7Ci0gICAgaWYgKHJlbGF0
aXZlVVJMLmlzRW1wdHkoKSkKLSAgICAgICAgcmVsYXRpdmVVUkwgPSAiYWJvdXQ6YmxhbmsiOwot
Ci0gICAgLy8gTG9hZCB0aGUgZnJhbWUgY29udGVudHMuCi0gICAgRnJhbWUqIHBhcmVudEZyYW1l
ID0gdy0+ZnJhbWUoKTsKLSAgICBpZiAoRnJhbWUqIGNoaWxkRnJhbWUgPSBwYXJlbnRGcmFtZS0+
dHJlZSgpLT5jaGlsZChtX25hbWUpKQotICAgICAgICBjaGlsZEZyYW1lLT5vcGVuVVJMKGRvY3Vt
ZW50KCktPmNvbXBsZXRlVVJMKHJlbGF0aXZlVVJMLmRlcHJlY2F0ZWRTdHJpbmcoKSkpOwotICAg
IGVsc2UKLSAgICAgICAgcGFyZW50RnJhbWUtPnJlcXVlc3RGcmFtZShzdGF0aWNfY2FzdDxSZW5k
ZXJGcmFtZSAqPihyZW5kZXJlcigpKSwgcmVsYXRpdmVVUkwsIG1fbmFtZSk7Ci19Ci0KLQotdm9p
ZCBIVE1MRnJhbWVFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUg
KmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyKSB7Ci0gICAgICAgIHNl
dExvY2F0aW9uKFdlYkNvcmU6OnBhcnNlVVJMKGF0dHItPnZhbHVlKCkpKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBpZEF0dHIpIHsKLSAgICAgICAgLy8gSW1wb3J0YW50IHRvIGNh
bGwgdGhyb3VnaCB0byBiYXNlIGZvciB0aGUgaWQgYXR0cmlidXRlIHNvIHRoZSBoYXNJRCBiaXQg
Z2V0cyBzZXQuCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRy
KTsKLSAgICAgICAgbV9uYW1lID0gYXR0ci0+dmFsdWUoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBtX25hbWUgPSBhdHRyLT52YWx1ZSgpOwot
ICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgZG9lc24n
dCBhY3R1YWxseSBjaGFuZ2UgdGhlIGZyYW1lJ3MgbmFtZS4KLSAgICAgICAgLy8gRklYTUU6IElm
IHdlIGFyZSBhbHJlYWR5IGF0dGFjaGVkLCB0aGlzIGRvZXNuJ3QgY2hlY2sgZm9yIGZyYW1lIG5h
bWUKLSAgICAgICAgLy8gY29uZmxpY3RzIGFuZCBnZW5lcmF0ZSBhIHVuaXF1ZSBmcmFtZSBuYW1l
LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGZyYW1lYm9yZGVyQXR0cikgewotICAg
ICAgICBtX2ZyYW1lQm9yZGVyID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICBtX2Zy
YW1lQm9yZGVyU2V0ID0gIWF0dHItPmlzTnVsbCgpOwotICAgICAgICAvLyBGSVhNRTogSWYgd2Ug
YXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBtYXJnaW53aWR0aEF0dHIpIHsKLSAgICAgICAgbV9tYXJnaW5XaWR0
aCA9IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgLy8gRklYTUU6IElmIHdlIGFyZSBh
bHJlYWR5IGF0dGFjaGVkLCB0aGlzIGhhcyBubyBlZmZlY3QuCi0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gbWFyZ2luaGVpZ2h0QXR0cikgewotICAgICAgICBtX21hcmdpbkhlaWdodCA9
IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgLy8gRklYTUU6IElmIHdlIGFyZSBhbHJl
YWR5IGF0dGFjaGVkLCB0aGlzIGhhcyBubyBlZmZlY3QuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gbm9yZXNpemVBdHRyKSB7Ci0gICAgICAgIG1fbm9SZXNpemUgPSB0cnVlOwotICAg
ICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVm
ZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBzY3JvbGxpbmdBdHRyKSB7Ci0g
ICAgICAgIC8vIEF1dG8gYW5kIHllcyBib3RoIHNpbXBseSBtZWFuICJhbGxvdyBzY3JvbGxpbmcu
IiBObyBtZWFucyAiZG9uJ3QgYWxsb3cgc2Nyb2xsaW5nLiIKLSAgICAgICAgaWYgKGVxdWFsSWdu
b3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJhdXRvIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoYXR0
ci0+dmFsdWUoKSwgInllcyIpKQotICAgICAgICAgICAgbV9zY3JvbGxpbmcgPSBTY3JvbGxCYXJB
dXRvOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAi
bm8iKSkKLSAgICAgICAgICAgIG1fc2Nyb2xsaW5nID0gU2Nyb2xsQmFyQWx3YXlzT2ZmOwotICAg
ICAgICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVm
ZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmxvYWRBdHRyKSB7Ci0gICAg
ICAgIHNldEhUTUxFdmVudExpc3RlbmVyKGxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gb25iZWZvcmV1bmxvYWRBdHRyKSB7Ci0gICAgICAgIC8vIEZJWE1F
OiBzaG91bGQgPGZyYW1lPiBlbGVtZW50cyBoYXZlIGJlZm9yZXVubG9hZCBoYW5kbGVycz8KLSAg
ICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIoYmVmb3JldW5sb2FkRXZlbnQsIGF0dHIpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9udW5sb2FkQXR0cikgewotICAgICAgICBzZXRI
VE1MRXZlbnRMaXN0ZW5lcih1bmxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotYm9vbCBIVE1M
RnJhbWVFbGVtZW50OjpyZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAg
ICAvLyBJZ25vcmUgZGlzcGxheTogbm9uZS4KLSAgICByZXR1cm4gaXNVUkxBbGxvd2VkKG1fVVJM
KTsKLX0KLQotUmVuZGVyT2JqZWN0ICpIVE1MRnJhbWVFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihS
ZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkKLXsKLSAgICByZXR1cm4gbmV3
IChhcmVuYSkgUmVuZGVyRnJhbWUodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6
YXR0YWNoKCkKLXsKLSAgICBtX25hbWUgPSBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotICAgIGlm
IChtX25hbWUuaXNOdWxsKCkpCi0gICAgICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShpZEF0dHIp
OwotCi0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IHNldHRpbmdzIGZyb20gcGFyZW50IGZyYW1lc2V0
Ci0gICAgZm9yIChOb2RlICpub2RlID0gcGFyZW50Tm9kZSgpOyBub2RlOyBub2RlID0gbm9kZS0+
cGFyZW50Tm9kZSgpKQotICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykp
IHsKLSAgICAgICAgICAgIEhUTUxGcmFtZVNldEVsZW1lbnQqIGZyYW1lc2V0ID0gc3RhdGljX2Nh
c3Q8SFRNTEZyYW1lU2V0RWxlbWVudCo+KG5vZGUpOwotICAgICAgICAgICAgaWYgKCFtX2ZyYW1l
Qm9yZGVyU2V0KQotICAgICAgICAgICAgICAgIG1fZnJhbWVCb3JkZXIgPSBmcmFtZXNldC0+ZnJh
bWVCb3JkZXIoKTsKLSAgICAgICAgICAgIGlmICghbV9ub1Jlc2l6ZSkKLSAgICAgICAgICAgICAg
ICBtX25vUmVzaXplID0gZnJhbWVzZXQtPm5vUmVzaXplKCk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6OmF0dGFjaCgpOwotCi0gICAgaWYgKCFyZW5k
ZXJlcigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgp
LT5mcmFtZSgpOwotCi0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZnJh
bWUtPnBhZ2UoKS0+aW5jcmVtZW50RnJhbWVDb3VudCgpOwotICAgIAotICAgIEF0b21pY1N0cmlu
ZyByZWxhdGl2ZVVSTCA9IG1fVVJMOwotICAgIGlmIChyZWxhdGl2ZVVSTC5pc0VtcHR5KCkpCi0g
ICAgICAgIHJlbGF0aXZlVVJMID0gImFib3V0OmJsYW5rIjsKLQotICAgIG1fbmFtZSA9IGZyYW1l
LT50cmVlKCktPnVuaXF1ZUNoaWxkTmFtZShtX25hbWUpOwotCi0gICAgLy8gbG9hZCB0aGUgZnJh
bWUgY29udGVudHMKLSAgICBmcmFtZS0+cmVxdWVzdEZyYW1lKHN0YXRpY19jYXN0PFJlbmRlckZy
YW1lKj4ocmVuZGVyZXIoKSksIHJlbGF0aXZlVVJMLCBtX25hbWUpOwotfQotCi12b2lkIEhUTUxG
cmFtZUVsZW1lbnQ6OmNsb3NlKCkKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5m
cmFtZSgpOwotICAgIGlmIChyZW5kZXJlcigpICYmIGZyYW1lKSB7Ci0gICAgICAgIGZyYW1lLT5w
YWdlKCktPmRlY3JlbWVudEZyYW1lQ291bnQoKTsKLSAgICAgICAgaWYgKEZyYW1lKiBjaGlsZEZy
YW1lID0gZnJhbWUtPnRyZWUoKS0+Y2hpbGQobV9uYW1lKSkKLSAgICAgICAgICAgIGNoaWxkRnJh
bWUtPmZyYW1lRGV0YWNoZWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6
d2lsbFJlbW92ZSgpCi17Ci0gICAgLy8gY2xvc2UgdGhlIGZyYW1lIGFuZCBkaXNzb2NpYXRlIHRo
ZSByZW5kZXJlciwgYnV0IGxlYXZlIHRoZQotICAgIC8vIG5vZGUgYXR0YWNoZWQgc28gdGhhdCBm
cmFtZSBkb2VzIG5vdCBnZXQgcmUtYXR0YWNoZWQgYmVmb3JlCi0gICAgLy8gYWN0dWFsbHkgbGVh
dmluZyB0aGUgZG9jdW1lbnQuICBzZWUgPHJkYXI6Ly9wcm9ibGVtLzQxMzI1ODE+Ci0gICAgY2xv
c2UoKTsKLSAgICBpZiAocmVuZGVyZXIoKSkgewotICAgICAgICByZW5kZXJlcigpLT5kZXN0cm95
KCk7Ci0gICAgICAgIHNldFJlbmRlcmVyKDApOwotICAgIH0KLSAgICAKLSAgICBIVE1MRWxlbWVu
dDo6d2lsbFJlbW92ZSgpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OmRldGFjaCgpCi17
Ci0gICAgY2xvc2UoKTsKLSAgICBIVE1MRWxlbWVudDo6ZGV0YWNoKCk7Ci19Ci0KLXZvaWQgSFRN
TEZyYW1lRWxlbWVudDo6c2V0TG9jYXRpb24oY29uc3QgU3RyaW5nJiBzdHIpCi17Ci0gICAgbV9V
UkwgPSBBdG9taWNTdHJpbmcoc3RyKTsKLQotICAgIGlmICghYXR0YWNoZWQoKSkgewotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8vIEhhbmRsZSB0aGUgY29tbW9uIGNhc2Ugd2hl
cmUgd2UgZGVjaWRlZCBub3QgdG8gbWFrZSBhIGZyYW1lIHRoZSBmaXJzdCB0aW1lLgotICAgIC8v
IERldGFjaCBhbmQgdGhlIGxldCBhdHRhY2goKSBkZWNpZGUgYWdhaW4gd2hldGhlciB0byBtYWtl
IHRoZSBmcmFtZSBmb3IgdGhpcyBVUkwuCi0gICAgaWYgKCFyZW5kZXJlcigpKSB7Ci0gICAgICAg
IGRldGFjaCgpOwotICAgICAgICBhdHRhY2goKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICAKLSAgICBpZiAoIWlzVVJMQWxsb3dlZChtX1VSTCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIG9wZW5VUkwoKTsKLX0KLQotYm9vbCBIVE1MRnJhbWVFbGVtZW50Ojppc0ZvY3Vz
YWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCk7Ci19Ci0KLXZvaWQgSFRNTEZy
YW1lRWxlbWVudDo6c2V0Rm9jdXMoYm9vbCByZWNlaXZlZCkKLXsKLSAgICBIVE1MRWxlbWVudDo6
c2V0Rm9jdXMocmVjZWl2ZWQpOwotICAgIFdlYkNvcmU6OlJlbmRlckZyYW1lICpyZW5kZXJGcmFt
ZSA9IHN0YXRpY19jYXN0PFdlYkNvcmU6OlJlbmRlckZyYW1lICo+KHJlbmRlcmVyKCkpOwotICAg
IGlmICghcmVuZGVyRnJhbWUgfHwgIXJlbmRlckZyYW1lLT53aWRnZXQoKSkKLSAgICAgICAgcmV0
dXJuOwotICAgIGlmIChyZWNlaXZlZCkKLSAgICAgICAgcmVuZGVyRnJhbWUtPndpZGdldCgpLT5z
ZXRGb2N1cygpOwotICAgIGVsc2UKLSAgICAgICAgcmVuZGVyRnJhbWUtPndpZGdldCgpLT5jbGVh
ckZvY3VzKCk7Ci19Ci0KLUZyYW1lKiBIVE1MRnJhbWVFbGVtZW50Ojpjb250ZW50RnJhbWUoKSBj
b25zdAotewotICAgIC8vIFN0YXJ0IHdpdGggdGhlIHBhcnQgdGhhdCBjb250YWlucyB0aGlzIGVs
ZW1lbnQsIG91ciBvd25lckRvY3VtZW50LgotICAgIEZyYW1lKiBwYXJlbnRGcmFtZSA9IGRvY3Vt
ZW50KCktPmZyYW1lKCk7Ci0gICAgaWYgKCFwYXJlbnRGcmFtZSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICAvLyBGaW5kIHRoZSBwYXJ0IGZvciB0aGUgc3ViZnJhbWUgdGhhdCB0aGlzIGVsZW1l
bnQgcmVwcmVzZW50cy4KLSAgICByZXR1cm4gcGFyZW50RnJhbWUtPnRyZWUoKS0+Y2hpbGQobV9u
YW1lKTsKLX0KLQotRG9jdW1lbnQqIEhUTUxGcmFtZUVsZW1lbnQ6OmNvbnRlbnREb2N1bWVudCgp
IGNvbnN0Ci17Ci0gICAgRnJhbWUqIGZyYW1lID0gY29udGVudEZyYW1lKCk7Ci0gICAgaWYgKCFm
cmFtZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGZyYW1lLT5kb2N1bWVudCgpOwot
fQotCi1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0
cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IHNyY0F0dHI7Ci19Ci0KLVN0
cmluZyBIVE1MRnJhbWVFbGVtZW50OjpmcmFtZUJvcmRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShmcmFtZWJvcmRlckF0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1l
bnQ6OnNldEZyYW1lQm9yZGVyKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKGZyYW1lYm9yZGVyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVu
dDo6bG9uZ0Rlc2MoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobG9uZ2Rlc2NB
dHRyKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRMb25nRGVzYyhjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShsb25nZGVzY0F0dHIsIHZhbHVlKTsKLX0K
LQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6Om1hcmdpbkhlaWdodCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShtYXJnaW5oZWlnaHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MRnJh
bWVFbGVtZW50OjpzZXRNYXJnaW5IZWlnaHQoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUobWFyZ2luaGVpZ2h0QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZy
YW1lRWxlbWVudDo6bWFyZ2luV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUobWFyZ2lud2lkdGhBdHRyKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRNYXJn
aW5XaWR0aChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShtYXJnaW53
aWR0aEF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6Om5hbWUoKSBj
b25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobmFtZUF0dHIpOwotfQotCi12b2lkIEhU
TUxGcmFtZUVsZW1lbnQ6OnNldE5hbWUoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUobmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojpz
ZXROb1Jlc2l6ZShib29sIG5vUmVzaXplKQotewotICAgIHNldEF0dHJpYnV0ZShub3Jlc2l6ZUF0
dHIsIG5vUmVzaXplID8gIiIgOiAwKTsKLX0KLQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6OnNj
cm9sbGluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShzY3JvbGxpbmdBdHRy
KTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRTY3JvbGxpbmcoY29uc3QgU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2Nyb2xsaW5nQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6c3JjKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHNyY0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldFNyYyhj
b25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzcmNBdHRyLCB2YWx1ZSk7
Ci19Ci0KLWludCBIVE1MRnJhbWVFbGVtZW50OjpmcmFtZVdpZHRoKCkgY29uc3QKLXsKLSAgICBp
ZiAoIXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIGRvY3VtZW50KCkt
PnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwotICAgIHJldHVybiByZW5k
ZXJlcigpLT53aWR0aCgpOwotfQotCi1pbnQgSFRNTEZyYW1lRWxlbWVudDo6ZnJhbWVIZWlnaHQo
KSBjb25zdAotewotICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Ci0gICAgZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7
Ci0gICAgcmV0dXJuIHJlbmRlcmVyKCktPmhlaWdodCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KIEhUTUxGcmFtZVNldEVsZW1lbnQ6OkhUTUxGcmFtZVNldEVsZW1lbnQoRG9jdW1lbnQg
KmRvYykKICAgICA6IEhUTUxFbGVtZW50KGZyYW1lc2V0VGFnLCBkb2MpCisgICAgLCBtX3Jvd3Mo
MCkKKyAgICAsIG1fY29scygwKQorICAgICwgbV90b3RhbFJvd3MoMSkKKyAgICAsIG1fdG90YWxD
b2xzKDEpCisgICAgLCBtX2JvcmRlcig0KQorICAgICwgZnJhbWVib3JkZXIodHJ1ZSkKKyAgICAs
IGZyYW1lQm9yZGVyU2V0KGZhbHNlKQorICAgICwgbm9yZXNpemUoZmFsc2UpCiB7Ci0gICAgLy8g
ZGVmYXVsdCB2YWx1ZSBmb3Igcm93cyBhbmQgY29scy4uLgotICAgIG1fdG90YWxSb3dzID0gMTsK
LSAgICBtX3RvdGFsQ29scyA9IDE7Ci0KLSAgICBtX3Jvd3MgPSBtX2NvbHMgPSAwOwotCi0gICAg
ZnJhbWVib3JkZXIgPSB0cnVlOwotICAgIGZyYW1lQm9yZGVyU2V0ID0gZmFsc2U7Ci0gICAgbV9i
b3JkZXIgPSA0OwotICAgIG5vcmVzaXplID0gZmFsc2U7CiB9CiAKIEhUTUxGcmFtZVNldEVsZW1l
bnQ6On5IVE1MRnJhbWVTZXRFbGVtZW50KCkKQEAgLTY1Miw3ICs4MSw3IEBAIHZvaWQgSFRNTEZy
YW1lU2V0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHQKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IGZyYW1lYm9yZGVyQXR0cikgewogICAgICAgICAvLyBmYWxzZSBvciAi
bm8iIG9yICIwIi4uCi0gICAgICAgIGlmICggYXR0ci0+dmFsdWUoKS50b0ludCgpID09IDAgKSB7
CisgICAgICAgIGlmIChhdHRyLT52YWx1ZSgpLnRvSW50KCkgPT0gMCkgewogICAgICAgICAgICAg
ZnJhbWVib3JkZXIgPSBmYWxzZTsKICAgICAgICAgICAgIG1fYm9yZGVyID0gMDsKICAgICAgICAg
fQpAQCAtNjg4LDggKzExNyw3IEBAIHZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6YXR0YWNoKCkK
IHsKICAgICAvLyBpbmhlcml0IGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBwYXJlbnQgZnJhbWVzZXQK
ICAgICBIVE1MRWxlbWVudCogbm9kZSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4ocGFyZW50
Tm9kZSgpKTsKLSAgICB3aGlsZShub2RlKQotICAgIHsKKyAgICB3aGlsZSAobm9kZSkgewogICAg
ICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpIHsKICAgICAgICAgICAgIEhU
TUxGcmFtZVNldEVsZW1lbnQqIGZyYW1lc2V0ID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lU2V0RWxl
bWVudCo+KG5vZGUpOwogICAgICAgICAgICAgaWYoIWZyYW1lQm9yZGVyU2V0KSAgZnJhbWVib3Jk
ZXIgPSBmcmFtZXNldC0+ZnJhbWVCb3JkZXIoKTsKQEAgLTcwMiwyMyArMTMwLDIzIEBAIHZvaWQg
SFRNTEZyYW1lU2V0RWxlbWVudDo6YXR0YWNoKCkKICAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7
CiB9CiAKLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVu
dCAqZXZ0KQordm9pZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2
ZW50KiBldnQpCiB7CiAgICAgaWYgKGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgIW5vcmVzaXplICYm
IHJlbmRlcmVyKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8V2ViQ29yZTo6UmVuZGVyRnJhbWVT
ZXQgKj4ocmVuZGVyZXIoKSktPnVzZXJSZXNpemUoc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2
dCkpOworICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpSZW5kZXJGcmFtZVNldCo+KHJlbmRl
cmVyKCkpLT51c2VyUmVzaXplKHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldnQpKTsKICAgICAg
ICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwogICAgIH0KIAogICAgIEhUTUxFbGVtZW50Ojpk
ZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7CiB9CiAKLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6
cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKK3ZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6
cmVjYWxjU3R5bGUoU3R5bGVDaGFuZ2UgY2gpCiB7CiAgICAgaWYgKGNoYW5nZWQoKSAmJiByZW5k
ZXJlcigpKSB7CiAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0KHRydWUpOwogICAg
ICAgICBzZXRDaGFuZ2VkKGZhbHNlKTsKICAgICB9Ci0gICAgSFRNTEVsZW1lbnQ6OnJlY2FsY1N0
eWxlKCBjaCApOworICAgIEhUTUxFbGVtZW50OjpyZWNhbGNTdHlsZShjaCk7CiB9CiAKIFN0cmlu
ZyBIVE1MRnJhbWVTZXRFbGVtZW50Ojpjb2xzKCkgY29uc3QKQEAgLTc0MSwyMTUgKzE2OSw0IEBA
IHZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Um93cyhjb25zdCAKICAgICBzZXRBdHRyaWJ1
dGUocm93c0F0dHIsIHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSGVh
ZEVsZW1lbnQ6OkhUTUxIZWFkRWxlbWVudChEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1l
bnQoaGVhZFRhZywgZG9jKQotewotfQotCi1IVE1MSGVhZEVsZW1lbnQ6On5IVE1MSGVhZEVsZW1l
bnQoKQotewotfQotCi1TdHJpbmcgSFRNTEhlYWRFbGVtZW50Ojpwcm9maWxlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHByb2ZpbGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MSGVh
ZEVsZW1lbnQ6OnNldFByb2ZpbGUoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUocHJvZmlsZUF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MSGVhZEVsZW1lbnQ6OmNo
ZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFz
VGFnTmFtZSh0aXRsZVRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoaXNpbmRleFRhZykgfHwK
LSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoYmFzZVRhZykgfHwgbmV3Q2hpbGQtPmhh
c1RhZ05hbWUoc2NyaXB0VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShz
dHlsZVRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUobWV0YVRhZykgfHwKLSAgICAgICAgICAg
bmV3Q2hpbGQtPmhhc1RhZ05hbWUobGlua1RhZykgfHwgbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKTsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSHRtbEVsZW1lbnQ6OkhUTUxIdG1sRWxl
bWVudChEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQoaHRtbFRhZywgZG9jKQotewot
fQotCi1IVE1MSHRtbEVsZW1lbnQ6On5IVE1MSHRtbEVsZW1lbnQoKQotewotfQotCi1TdHJpbmcg
SFRNTEh0bWxFbGVtZW50Ojp2ZXJzaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKHZlcnNpb25BdHRyKTsKLX0KLQotdm9pZCBIVE1MSHRtbEVsZW1lbnQ6OnNldFZlcnNpb24o
Y29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmVyc2lvbkF0dHIsIHZh
bHVlKTsKLX0KLQotYm9vbCBIVE1MSHRtbEVsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5l
d0NoaWxkKQotewotICAgIC8vIEZJWE1FOiBXaHkgaXMgPHNjcmlwdD4gYWxsb3dlZCBoZXJlPwot
ICAgIHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZShoZWFkVGFnKSB8fCBuZXdDaGlsZC0+aGFz
VGFnTmFtZShib2R5VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShmcmFt
ZXNldFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUobm9mcmFtZXNUYWcpIHx8Ci0gICAgICAg
ICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotSFRNTElGcmFtZUVsZW1lbnQ6OkhUTUxJRnJhbWVFbGVtZW50KERvY3VtZW50ICpk
b2MpIDogSFRNTEZyYW1lRWxlbWVudChpZnJhbWVUYWcsIGRvYykKLXsKLSAgICBtX2ZyYW1lQm9y
ZGVyID0gZmFsc2U7Ci0gICAgbV9tYXJnaW5XaWR0aCA9IC0xOwotICAgIG1fbWFyZ2luSGVpZ2h0
ID0gLTE7Ci0gICAgbmVlZFdpZGdldFVwZGF0ZSA9IGZhbHNlOwotfQotCi1IVE1MSUZyYW1lRWxl
bWVudDo6fkhUTUxJRnJhbWVFbGVtZW50KCkKLXsKLX0KLQotYm9vbCBIVE1MSUZyYW1lRWxlbWVu
dDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmli
dXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gd2lkdGhBdHRy
IHx8IGF0dHJOYW1lID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNh
bDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUg
PT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVSZXBsYWNlZDsgLy8gU2hhcmUgd2l0
aCA8aW1nPiBzaW5jZSB0aGUgYWxpZ25tZW50IGJlaGF2aW9yIGlzIHRoZSBzYW1lLgotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBIVE1MRWxlbWVudDo6bWFw
VG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQotewotICAgIGlmIChh
dHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKQotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBoZWlnaHRBdHRyKQotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfSEVJR0hU
LCBhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYWxpZ25BdHRy
KQotICAgICAgICBhZGRIVE1MQWxpZ25tZW50KGF0dHIpOwotICAgIGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBuYW1lQXR0cikgewotICAgICAgICBTdHJpbmcgbmV3TmFtZUF0dHIgPSBhdHRyLT52
YWx1ZSgpOwotICAgICAgICBpZiAoaW5Eb2N1bWVudCgpICYmIGRvY3VtZW50KCktPmlzSFRNTERv
Y3VtZW50KCkpIHsKLSAgICAgICAgICAgIEhUTUxEb2N1bWVudCAqZG9jID0gc3RhdGljX2Nhc3Q8
SFRNTERvY3VtZW50ICo+KGRvY3VtZW50KCkpOwotICAgICAgICAgICAgZG9jLT5yZW1vdmVEb2NF
eHRyYU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgICAgICAgICBkb2MtPmFkZERvY0V4dHJh
TmFtZWRJdGVtKG5ld05hbWVBdHRyKTsKLSAgICAgICAgfQotICAgICAgICBvbGROYW1lQXR0ciA9
IG5ld05hbWVBdHRyOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRnJhbWVFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6aW5z
ZXJ0ZWRJbnRvRG9jdW1lbnQoKQotewotICAgIGlmIChkb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVu
dCgpKSB7Ci0gICAgICAgIEhUTUxEb2N1bWVudCAqZG9jID0gc3RhdGljX2Nhc3Q8SFRNTERvY3Vt
ZW50ICo+KGRvY3VtZW50KCkpOwotICAgICAgICBkb2MtPmFkZERvY0V4dHJhTmFtZWRJdGVtKG9s
ZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6aW5zZXJ0ZWRJbnRvRG9jdW1l
bnQoKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6cmVtb3ZlZEZyb21Eb2N1bWVudCgp
Ci17Ci0gICAgaWYgKGRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRN
TERvY3VtZW50ICpkb2MgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oZG9jdW1lbnQoKSk7
Ci0gICAgICAgIGRvYy0+cmVtb3ZlRG9jRXh0cmFOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAg
IH0KLQotICAgIEhUTUxFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50KCk7Ci19Ci0KLWJvb2wg
SFRNTElGcmFtZUVsZW1lbnQ6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKnN0eWxlKQot
ewotICAgIC8vIERvbid0IGlnbm9yZSBkaXNwbGF5OiBub25lIHRoZSB3YXkgZnJhbWUgZG9lcy4K
LSAgICByZXR1cm4gaXNVUkxBbGxvd2VkKG1fVVJMKSAmJiBzdHlsZS0+ZGlzcGxheSgpICE9IE5P
TkU7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTElGcmFtZUVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVybiBu
ZXcgKGFyZW5hKSBSZW5kZXJQYXJ0T2JqZWN0KHRoaXMpOwotfQotCi12b2lkIEhUTUxJRnJhbWVF
bGVtZW50OjphdHRhY2goKQotewotICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7
Ci0gICAgaWYgKG1fbmFtZS5pc051bGwoKSkKLSAgICAgICAgbV9uYW1lID0gZ2V0QXR0cmlidXRl
KGlkQXR0cik7Ci0KLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0KLSAgICBGcmFtZSogcGFy
ZW50RnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpOwotICAgIGlmIChyZW5kZXJlcigpICYmIHBh
cmVudEZyYW1lKSB7Ci0gICAgICAgIHBhcmVudEZyYW1lLT5wYWdlKCktPmluY3JlbWVudEZyYW1l
Q291bnQoKTsKLSAgICAgICAgbV9uYW1lID0gcGFyZW50RnJhbWUtPnRyZWUoKS0+dW5pcXVlQ2hp
bGROYW1lKG1fbmFtZSk7Ci0gICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclBhcnRPYmplY3QqPihy
ZW5kZXJlcigpKS0+dXBkYXRlV2lkZ2V0KCk7Ci0gICAgICAgIG5lZWRXaWRnZXRVcGRhdGUgPSBm
YWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBT
dHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKG5lZWRXaWRnZXRVcGRhdGUpIHsKLSAgICAgICAg
aWYgKHJlbmRlcmVyKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJQYXJ0T2JqZWN0
Kj4ocmVuZGVyZXIoKSktPnVwZGF0ZVdpZGdldCgpOwotICAgICAgICBuZWVkV2lkZ2V0VXBkYXRl
ID0gZmFsc2U7Ci0gICAgfQotICAgIEhUTUxFbGVtZW50OjpyZWNhbGNTdHlsZSggY2ggKTsKLX0K
LQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6b3BlblVSTCgpCi17Ci0gICAgbmVlZFdpZGdldFVw
ZGF0ZSA9IHRydWU7Ci0gICAgc2V0Q2hhbmdlZCgpOwotfQotCi1ib29sIEhUTUxJRnJhbWVFbGVt
ZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGF0dHItPm5hbWUoKSA9PSBzcmNBdHRyOwotfQotCi1TdHJpbmcgSFRNTElGcmFtZUVsZW1lbnQ6
OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19
Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRN
TElGcmFtZUVsZW1lbnQ6OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShoZWlnaHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6c2V0SGVpZ2h0KGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGhlaWdodEF0dHIsIHZhbHVl
KTsKLX0KLQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50OjpzcmMoKSBjb25zdAotewotICAgIHJl
dHVybiBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTChnZXRBdHRyaWJ1dGUoc3JjQXR0cikpOwotfQot
Ci1TdHJpbmcgSFRNTElGcmFtZUVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnNl
dFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0
ciwgdmFsdWUpOwotfQotCiB9CkluZGV4OiBodG1sL0hUTUxJRnJhbWVFbGVtZW50LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gaHRtbC9IVE1MSUZyYW1lRWxlbWVudC5oCShyZXZpc2lvbiAxNDMyNSkKKysrIGh0
bWwvSFRNTElGcmFtZUVsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsMjI3ICsyMywxMyBA
QAogICoKICAqLwogCi0jaWZuZGVmIEhUTUxfQkFTRUlNUExfSAotI2RlZmluZSBIVE1MX0JBU0VJ
TVBMX0gKKyNpZm5kZWYgSFRNTElGcmFtZUVsZW1lbnRfSAorI2RlZmluZSBIVE1MSUZyYW1lRWxl
bWVudF9ICiAKLSNpbmNsdWRlICJIVE1MRWxlbWVudC5oIgotI2luY2x1ZGUgIlNjcm9sbEJhck1v
ZGUuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVFbGVtZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNsYXNzIFN0cmluZzsKLWNsYXNzIEZyYW1lOwot
Y2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKLWNsYXNzIFJlbmRlckZyYW1lU2V0OwotY2xhc3MgUmVu
ZGVyRnJhbWU7Ci1jbGFzcyBSZW5kZXJQYXJ0T2JqZWN0OwotCi1zdHJ1Y3QgTGVuZ3RoOwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCb2R5RWxlbWVudCA6IHB1YmxpYyBIVE1M
RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxCb2R5RWxlbWVudChEb2N1bWVudCAqZG9jKTsK
LSAgICB+SFRNTEJvZHlFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5k
VGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAg
IHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0KLSAgICAKLSAg
ICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqKTsKLQotICAgIHZpcnR1YWwgdm9p
ZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgdm9pZCBjcmVhdGVMaW5rRGVjbCgpOwot
ICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNv
bnN0OwotCi0gICAgU3RyaW5nIGFMaW5rKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBTGluayhjb25z
dCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIGJhY2tncm91bmQoKSBjb25zdDsKLSAgICB2b2lkIHNl
dEJhY2tncm91bmQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0cmluZyBiZ0NvbG9yKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmKTsKLSAgICBTdHJpbmcgbGluaygp
IGNvbnN0OwotICAgIHZvaWQgc2V0TGluayhjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIHRl
eHQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0cmlu
ZyB2TGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0VkxpbmsoY29uc3QgU3RyaW5nICYpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtX2xpbmtE
ZWNsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MRnJhbWVFbGVtZW50
IDogcHVibGljIEhUTUxFbGVtZW50Ci17Ci0gICAgZnJpZW5kIGNsYXNzIFJlbmRlckZyYW1lOwot
ICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0T2JqZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTEZy
YW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICBIVE1MRnJhbWVFbGVtZW50KGNvbnN0IFF1
YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2MpOwotICAgIH5IVE1MRnJhbWVFbGVt
ZW50KCk7Ci0KLSAgICB2b2lkIGluaXQoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBl
bmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAKLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICopOwot
ICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdmlydHVh
bCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmly
dHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCBS
ZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIFJlbmRlclN0eWxlICop
OwotCi0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG1fbm9SZXNpemU7IH0KLQotICAgIHZv
aWQgc2V0TG9jYXRpb24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoYm9vbCk7Ci0KLSAgICBG
cmFtZSogY29udGVudEZyYW1lKCkgY29uc3Q7Ci0gICAgRG9jdW1lbnQqIGNvbnRlbnREb2N1bWVu
dCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1
dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU2Nyb2xsQmFyTW9kZSBzY3JvbGxpbmdNb2RlKCkgY29u
c3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0KLSAgICBpbnQgZ2V0TWFyZ2luV2lkdGgoKSBjb25z
dCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9Ci0gICAgaW50IGdldE1hcmdpbkhlaWdodCgpIGNv
bnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0OyB9Ci0KLSAgICBTdHJpbmcgZnJhbWVCb3JkZXIo
KSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lQm9yZGVyKGNvbnN0IFN0cmluZyAmKTsKLQotICAg
IFN0cmluZyBsb25nRGVzYygpIGNvbnN0OwotICAgIHZvaWQgc2V0TG9uZ0Rlc2MoY29uc3QgU3Ry
aW5nICYpOwotCi0gICAgU3RyaW5nIG1hcmdpbkhlaWdodCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBtYXJnaW5XaWR0aCgp
IGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luV2lkdGgoY29uc3QgU3RyaW5nICYpOwotCi0gICAg
U3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nICYpOwot
Ci0gICAgdm9pZCBzZXROb1Jlc2l6ZShib29sKTsKLQotICAgIFN0cmluZyBzY3JvbGxpbmcoKSBj
b25zdDsKLSAgICB2b2lkIHNldFNjcm9sbGluZyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0
dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLSAgICB2b2lkIHNldFNyYyhjb25zdCBTdHJpbmcgJik7
Ci0KLSAgICBpbnQgZnJhbWVXaWR0aCgpIGNvbnN0OwotICAgIGludCBmcmFtZUhlaWdodCgpIGNv
bnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBpc1VSTEFsbG93ZWQoY29uc3QgQXRvbWljU3Ry
aW5nICYpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBBdG9taWNT
dHJpbmcgbV9VUkw7Ci0gICAgQXRvbWljU3RyaW5nIG1fbmFtZTsKLQotICAgIGludCBtX21hcmdp
bldpZHRoOwotICAgIGludCBtX21hcmdpbkhlaWdodDsKLSAgICBTY3JvbGxCYXJNb2RlIG1fc2Ny
b2xsaW5nOwotCi0gICAgYm9vbCBtX2ZyYW1lQm9yZGVyIDogMTsKLSAgICBib29sIG1fZnJhbWVC
b3JkZXJTZXQgOiAxOwotICAgIGJvb2wgbV9ub1Jlc2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGcmFtZVNldEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1l
bnQKLXsKLSAgICBmcmllbmQgY2xhc3MgUmVuZGVyRnJhbWVTZXQ7Ci1wdWJsaWM6Ci0gICAgSFRN
TEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEZyYW1lU2V0RWxlbWVu
dCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29u
c3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlv
cml0eSgpIGNvbnN0IHsgcmV0dXJuIDEwOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNv
bnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJp
YnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAg
IHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1
YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJTdHls
ZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50ICpldnQp
OwotCi0gICAgYm9vbCBmcmFtZUJvcmRlcigpIHsgcmV0dXJuIGZyYW1lYm9yZGVyOyB9Ci0gICAg
Ym9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG5vcmVzaXplOyB9Ci0KLSAgICBpbnQgdG90YWxSb3dz
KCkgY29uc3QgeyByZXR1cm4gbV90b3RhbFJvd3M7IH0KLSAgICBpbnQgdG90YWxDb2xzKCkgY29u
c3QgeyByZXR1cm4gbV90b3RhbENvbHM7IH0KLSAgICBpbnQgYm9yZGVyKCkgY29uc3QgeyByZXR1
cm4gbV9ib3JkZXI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFu
Z2UgY2ggKTsKLSAgICAKLSAgICBTdHJpbmcgY29scygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29s
cyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgcm93cygpIGNvbnN0OwotICAgIHZvaWQg
c2V0Um93cyhjb25zdCBTdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBMZW5ndGgqIG1fcm93
czsKLSAgICBMZW5ndGgqIG1fY29sczsKLQotICAgIGludCBtX3RvdGFsUm93czsKLSAgICBpbnQg
bV90b3RhbENvbHM7Ci0gICAgaW50IG1fYm9yZGVyOwotCi0gICAgYm9vbCBmcmFtZWJvcmRlciA6
IDE7Ci0gICAgYm9vbCBmcmFtZUJvcmRlclNldCA6IDE7Ci0gICAgYm9vbCBub3Jlc2l6ZSA6IDE7
Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxIZWFkRWxlbWVudCA6IHB1
YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxIZWFkRWxlbWVudChEb2N1bWVu
dCAqZG9jKTsKLSAgICB+SFRNTEhlYWRFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdT
dGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25h
bDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpOwotCi0gICAg
U3RyaW5nIHByb2ZpbGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFByb2ZpbGUoY29uc3QgU3RyaW5n
ICYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSHRtbEVsZW1lbnQg
OiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MSHRtbEVsZW1lbnQoRG9j
dW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxIdG1sRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1M
VGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVx
dWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDEx
OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQot
ICAgIFN0cmluZyB2ZXJzaW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWZXJzaW9uKGNvbnN0IFN0
cmluZyAmKTsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBjbGFzcyBIVE1MSUZyYW1l
RWxlbWVudCA6IHB1YmxpYyBIVE1MRnJhbWVFbGVtZW50CiB7CiBwdWJsaWM6CkBAIC0yNTMsMjcg
KzM5LDI3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWly
ZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQogICAgIHZpcnR1YWwg
aW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQogCi0gICAgdmlydHVhbCBib29s
IG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0
ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJp
YnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpOworICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5
KGNvbnN0IFF1YWxpZmllZE5hbWUmLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYpIGNvbnN0OworICAg
IHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKIAog
ICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwogICAgIHZpcnR1YWwgdm9p
ZCByZW1vdmVkRnJvbURvY3VtZW50KCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0g
ICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKik7Ci0gICAgdmly
dHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIFJlbmRlclN0
eWxlICopOwotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKTsK
KyAgICB2aXJ0dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSopOworICAgIHZp
cnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSosIFJlbmRlclN0
eWxlKik7CisgICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKFN0eWxlQ2hhbmdlKTsKICAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdDsK
KyAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlKikgY29uc3Q7CiAKICAg
ICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyAm
KTsKKyAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwogCiAgICAgU3RyaW5nIGhlaWdo
dCgpIGNvbnN0OwotICAgIHZvaWQgc2V0SGVpZ2h0KGNvbnN0IFN0cmluZyAmKTsKKyAgICB2b2lk
IHNldEhlaWdodChjb25zdCBTdHJpbmcmKTsKIAogICAgIFN0cmluZyB3aWR0aCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0V2lkdGgoY29uc3QgU3RyaW5nICYpOworICAgIHZvaWQgc2V0V2lkdGgoY29u
c3QgU3RyaW5nJik7CiAKICAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKIApJbmRleDog
aHRtbC9IVE1MQm9keUVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxCb2R5RWxlbWVu
dC5oCShyZXZpc2lvbiAxNDMyNSkKKysrIGh0bWwvSFRNTEJvZHlFbGVtZW50LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTIzLDI2OSArMjMsNDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBIVE1MX0JBU0VJ
TVBMX0gKLSNkZWZpbmUgSFRNTF9CQVNFSU1QTF9ICisjaWZuZGVmIEhUTUxCb2R5RWxlbWVudF9I
CisjZGVmaW5lIEhUTUxCb2R5RWxlbWVudF9ICiAKICNpbmNsdWRlICJIVE1MRWxlbWVudC5oIgot
I2luY2x1ZGUgIlNjcm9sbEJhck1vZGUuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFz
cyBDU1NTdHlsZVNoZWV0OwotY2xhc3MgU3RyaW5nOwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBIVE1M
RnJhbWVFbGVtZW50OwotY2xhc3MgUmVuZGVyRnJhbWVTZXQ7Ci1jbGFzcyBSZW5kZXJGcmFtZTsK
LWNsYXNzIFJlbmRlclBhcnRPYmplY3Q7Ci0KLXN0cnVjdCBMZW5ndGg7Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQogY2xhc3MgSFRNTEJvZHlFbGVtZW50IDogcHVibGljIEhUTUxFbGVtZW50CiB7
CiBwdWJsaWM6Ci0gICAgSFRNTEJvZHlFbGVtZW50KERvY3VtZW50ICpkb2MpOworICAgIEhUTUxC
b2R5RWxlbWVudChEb2N1bWVudCopOwogICAgIH5IVE1MQm9keUVsZW1lbnQoKTsKIAogICAgIHZp
cnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRh
Z1N0YXR1c1JlcXVpcmVkOyB9CiAgICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7
IHJldHVybiAxMDsgfQogICAgIAotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1
YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25z
dDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
ICopOworICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmLCBN
YXBwZWRBdHRyaWJ1dGVFbnRyeSYpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKIAogICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRl
ZEludG9Eb2N1bWVudCgpOwogCiAgICAgdm9pZCBjcmVhdGVMaW5rRGVjbCgpOwogICAgIAotICAg
IHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OworICAg
IHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUqKSBjb25zdDsKIAogICAgIFN0
cmluZyBhTGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0QUxpbmsoY29uc3QgU3RyaW5nICYpOwor
ICAgIHZvaWQgc2V0QUxpbmsoY29uc3QgU3RyaW5nJik7CiAgICAgU3RyaW5nIGJhY2tncm91bmQo
KSBjb25zdDsKLSAgICB2b2lkIHNldEJhY2tncm91bmQoY29uc3QgU3RyaW5nICYpOworICAgIHZv
aWQgc2V0QmFja2dyb3VuZChjb25zdCBTdHJpbmcmKTsKICAgICBTdHJpbmcgYmdDb2xvcigpIGNv
bnN0OwotICAgIHZvaWQgc2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJik7CisgICAgdm9pZCBzZXRC
Z0NvbG9yKGNvbnN0IFN0cmluZyYpOwogICAgIFN0cmluZyBsaW5rKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRMaW5rKGNvbnN0IFN0cmluZyAmKTsKKyAgICB2b2lkIHNldExpbmsoY29uc3QgU3RyaW5n
Jik7CiAgICAgU3RyaW5nIHRleHQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHQoY29uc3QgU3Ry
aW5nICYpOworICAgIHZvaWQgc2V0VGV4dChjb25zdCBTdHJpbmcmKTsKICAgICBTdHJpbmcgdkxp
bmsoKSBjb25zdDsKLSAgICB2b2lkIHNldFZMaW5rKGNvbnN0IFN0cmluZyAmKTsKKyAgICB2b2lk
IHNldFZMaW5rKGNvbnN0IFN0cmluZyYpOwogCiBwcm90ZWN0ZWQ6CiAgICAgUmVmUHRyPENTU011
dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtX2xpbmtEZWNsOwogfTsKIAotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBIVE1MRnJhbWVFbGVtZW50IDogcHVibGljIEhUTUxFbGVtZW50Ci17Ci0g
ICAgZnJpZW5kIGNsYXNzIFJlbmRlckZyYW1lOwotICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0
T2JqZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTEZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsK
LSAgICBIVE1MRnJhbWVFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3Vt
ZW50KiBkb2MpOwotICAgIH5IVE1MRnJhbWVFbGVtZW50KCk7Ci0KLSAgICB2b2lkIGluaXQoKTsK
LQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsg
cmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5
KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICopOwotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsK
LSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2
aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQo
UmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVy
KFJlbmRlckFyZW5hICosIFJlbmRlclN0eWxlICopOwotCi0gICAgYm9vbCBub1Jlc2l6ZSgpIHsg
cmV0dXJuIG1fbm9SZXNpemU7IH0KLQotICAgIHZvaWQgc2V0TG9jYXRpb24oY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IHZvaWQgc2V0Rm9jdXMoYm9vbCk7Ci0KLSAgICBGcmFtZSogY29udGVudEZyYW1lKCkgY29uc3Q7
Ci0gICAgRG9jdW1lbnQqIGNvbnRlbnREb2N1bWVudCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1
YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU2Ny
b2xsQmFyTW9kZSBzY3JvbGxpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0K
LSAgICBpbnQgZ2V0TWFyZ2luV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9
Ci0gICAgaW50IGdldE1hcmdpbkhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0
OyB9Ci0KLSAgICBTdHJpbmcgZnJhbWVCb3JkZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1l
Qm9yZGVyKGNvbnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBsb25nRGVzYygpIGNvbnN0Owot
ICAgIHZvaWQgc2V0TG9uZ0Rlc2MoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG1hcmdp
bkhlaWdodCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAm
KTsKLQotICAgIFN0cmluZyBtYXJnaW5XaWR0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2lu
V2lkdGgoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2
b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXROb1Jlc2l6ZShib29s
KTsKLQotICAgIFN0cmluZyBzY3JvbGxpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldFNjcm9sbGlu
Zyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFNyYyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBpbnQgZnJhbWVXaWR0aCgpIGNv
bnN0OwotICAgIGludCBmcmFtZUhlaWdodCgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9v
bCBpc1VSTEFsbG93ZWQoY29uc3QgQXRvbWljU3RyaW5nICYpIGNvbnN0OwotICAgIHZpcnR1YWwg
dm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9VUkw7Ci0gICAgQXRvbWljU3Ry
aW5nIG1fbmFtZTsKLQotICAgIGludCBtX21hcmdpbldpZHRoOwotICAgIGludCBtX21hcmdpbkhl
aWdodDsKLSAgICBTY3JvbGxCYXJNb2RlIG1fc2Nyb2xsaW5nOwotCi0gICAgYm9vbCBtX2ZyYW1l
Qm9yZGVyIDogMTsKLSAgICBib29sIG1fZnJhbWVCb3JkZXJTZXQgOiAxOwotICAgIGJvb2wgbV9u
b1Jlc2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGcmFt
ZVNldEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLSAgICBmcmllbmQgY2xhc3MgUmVu
ZGVyRnJhbWVTZXQ7Ci1wdWJsaWM6Ci0gICAgSFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAq
ZG9jKTsKLSAgICB+SFRNTEZyYW1lU2V0RWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFn
U3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWly
ZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDEwOyB9
Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAg
IHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7Ci0g
ICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVl
ZGVkKFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5k
ZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBk
ZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50ICpldnQpOwotCi0gICAgYm9vbCBmcmFtZUJvcmRlcigp
IHsgcmV0dXJuIGZyYW1lYm9yZGVyOyB9Ci0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG5v
cmVzaXplOyB9Ci0KLSAgICBpbnQgdG90YWxSb3dzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbFJv
d3M7IH0KLSAgICBpbnQgdG90YWxDb2xzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbENvbHM7IH0K
LSAgICBpbnQgYm9yZGVyKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXI7IH0KLQotICAgIHZpcnR1
YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKTsKLSAgICAKLSAgICBTdHJpbmcg
Y29scygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29scyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBT
dHJpbmcgcm93cygpIGNvbnN0OwotICAgIHZvaWQgc2V0Um93cyhjb25zdCBTdHJpbmcgJik7Ci0K
LXByb3RlY3RlZDoKLSAgICBMZW5ndGgqIG1fcm93czsKLSAgICBMZW5ndGgqIG1fY29sczsKLQot
ICAgIGludCBtX3RvdGFsUm93czsKLSAgICBpbnQgbV90b3RhbENvbHM7Ci0gICAgaW50IG1fYm9y
ZGVyOwotCi0gICAgYm9vbCBmcmFtZWJvcmRlciA6IDE7Ci0gICAgYm9vbCBmcmFtZUJvcmRlclNl
dCA6IDE7Ci0gICAgYm9vbCBub3Jlc2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxIZWFkRWxlbWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudAotewotcHVibGlj
OgotICAgIEhUTUxIZWFkRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEhlYWRFbGVt
ZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBj
b25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1By
aW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZSogbmV3Q2hpbGQpOwotCi0gICAgU3RyaW5nIHByb2ZpbGUoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFByb2ZpbGUoY29uc3QgU3RyaW5nICYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1jbGFzcyBIVE1MSHRtbEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLXB1
YmxpYzoKLSAgICBIVE1MSHRtbEVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxIdG1s
RWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50
KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0
YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDExOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNr
RFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAgIFN0cmluZyB2ZXJzaW9uKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRWZXJzaW9uKGNvbnN0IFN0cmluZyAmKTsKLX07Ci0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSUZyYW1lRWxlbWVudCA6IHB1YmxpYyBIVE1MRnJhbWVF
bGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTElGcmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7
Ci0gICAgfkhUTUxJRnJhbWVFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMg
ZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAg
dmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1h
cHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2
b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9t
RG9jdW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIGJv
b2wgcmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIFJlbmRlck9i
amVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKiwgUmVuZGVyU3R5bGUgKik7Ci0gICAg
dmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApOwotICAgIAotICAgIHZp
cnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAg
U3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcgJik7
Ci0KLSAgICBTdHJpbmcgaGVpZ2h0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQoY29uc3Qg
U3RyaW5nICYpOwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0
aChjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLQot
cHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBib29sIG5lZWRX
aWRnZXRVcGRhdGU7Ci0KLSBwcml2YXRlOgotICAgIFN0cmluZyBvbGROYW1lQXR0cjsKLX07Ci0K
IH0gLy9uYW1lc3BhY2UKIAogI2VuZGlmCkluZGV4OiBodG1sL0hUTUxEb2N1bWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gaHRtbC9IVE1MRG9jdW1lbnQuY3BwCShyZXZpc2lvbiAxNDMzMikKKysrIGh0
bWwvSFRNTERvY3VtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjEsNyArNjEsNiBAQAogI2lu
Y2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiY3Nzc3R5bGVzZWxlY3Rvci5oIgogI2luY2x1ZGUg
IkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJodG1sX2Jhc2VpbXBsLmgiCiAjaW5jbHVk
ZSAiaHRtbF9pbWFnZWltcGwuaCIKICNpbmNsdWRlICJIVE1MVG9rZW5pemVyLmgiCiAjaW5jbHVk
ZSAiSFRNTEVsZW1lbnRGYWN0b3J5LmgiCkluZGV4OiBodG1sL0hUTUxIZWFkRWxlbWVudC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gaHRtbC9IVE1MSGVhZEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNDMyNSkK
KysrIGh0bWwvSFRNTEhlYWRFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNzI4ICsy
MiwxNiBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl
IFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImh0
bWxfYmFzZWltcGwuaCIKKyNpbmNsdWRlICJIVE1MSGVhZEVsZW1lbnQuaCIKIAotI2luY2x1ZGUg
IkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5j
bHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVU
cmVlLmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgi
Ci0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgImNzc19zdHlsZXNoZWV0aW1wbC5oIgotI2lu
Y2x1ZGUgImNzc2hlbHBlci5oIgotI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNs
dWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJyZW5kZXJfZnJhbWVzLmgiCiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CiB1c2luZyBu
YW1lc3BhY2UgSFRNTE5hbWVzOwogCi1IVE1MQm9keUVsZW1lbnQ6OkhUTUxCb2R5RWxlbWVudChE
b2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQoYm9keVRhZywgZG9jKQotewotfQotCi1I
VE1MQm9keUVsZW1lbnQ6On5IVE1MQm9keUVsZW1lbnQoKQotewotICAgIGlmIChtX2xpbmtEZWNs
KSB7Ci0gICAgICAgIG1fbGlua0RlY2wtPnNldE5vZGUoMCk7Ci0gICAgICAgIG1fbGlua0RlY2wt
PnNldFBhcmVudCgwKTsKLSAgICB9Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpjcmVhdGVM
aW5rRGVjbCgpCi17Ci0gICAgbV9saW5rRGVjbCA9IG5ldyBDU1NNdXRhYmxlU3R5bGVEZWNsYXJh
dGlvbjsKLSAgICBtX2xpbmtEZWNsLT5zZXRQYXJlbnQoZG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0
KCkpOwotICAgIG1fbGlua0RlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgbV9saW5rRGVjbC0+c2V0
U3RyaWN0UGFyc2luZyghZG9jdW1lbnQoKS0+aW5Db21wYXRNb2RlKCkpOwotfQotCi1ib29sIEhU
TUxCb2R5RWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUg
PT0gYmFja2dyb3VuZEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gKE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5KShlTGFzdEVudHJ5ICsgZG9jdW1lbnQoKS0+ZG9jSUQoKSk7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9IAotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAot
ICAgICAgICBhdHRyTmFtZSA9PSB0ZXh0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBtYXJn
aW53aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gbGVmdG1hcmdpbkF0dHIgfHwKLSAg
ICAgICAgYXR0ck5hbWUgPT0gbWFyZ2luaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9
PSB0b3BtYXJnaW5BdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGJncHJvcGVydGllc0F0dHIp
IHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIH0KLQotICAgIHJldHVybiBIVE1MRWxlbWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVz
dWx0KTsKLX0KLQotdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGJhY2tncm91
bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52
YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NT
SW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0lNQUdFLCBkb2N1bWVudCgp
LT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXJn
aW53aWR0aEF0dHIgfHwgYXR0ci0+bmFtZSgpID09IGxlZnRtYXJnaW5BdHRyKSB7Ci0gICAgICAg
IGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkp
OwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX0xFRlQsIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1hcmdpbmhlaWdodEF0
dHIgfHwgYXR0ci0+bmFtZSgpID09IHRvcG1hcmdpbkF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVu
Z3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9CT1RUT00sIGF0dHItPnZhbHVlKCkpOwotICAgICAg
ICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYmdjb2xvckF0dHIpIHsKLSAgICAgICAg
YWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9DT0xPUiwgYXR0ci0+dmFsdWUo
KSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdGV4dEF0dHIpIHsKLSAgICAgICAg
YWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJncHJvcGVydGllc0F0dHIpIHsKLSAgICAgICAgaWYg
KGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVlKCksICJmaXhlZCIpKQotICAgICAgICAgICAg
YWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9BVFRBQ0hNRU5ULCBDU1Nf
VkFMX0ZJWEVEKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2bGlua0F0dHIgfHwK
LSAgICAgICAgICAgICAgIGF0dHItPm5hbWUoKSA9PSBhbGlua0F0dHIgfHwKLSAgICAgICAgICAg
ICAgIGF0dHItPm5hbWUoKSA9PSBsaW5rQXR0cikgewotICAgICAgICBpZiAoYXR0ci0+aXNOdWxs
KCkpIHsKLSAgICAgICAgICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gbGlua0F0dHIpCi0gICAgICAg
ICAgICAgICAgZG9jdW1lbnQoKS0+cmVzZXRMaW5rQ29sb3IoKTsKLSAgICAgICAgICAgIGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSB2bGlua0F0dHIpCi0gICAgICAgICAgICAgICAgZG9jdW1lbnQo
KS0+cmVzZXRWaXNpdGVkTGlua0NvbG9yKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgZG9jdW1lbnQoKS0+cmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKLSAgICAgICAgfQotICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICghbV9saW5rRGVjbCkKLSAgICAgICAgICAgICAg
ICBjcmVhdGVMaW5rRGVjbCgpOwotICAgICAgICAgICAgbV9saW5rRGVjbC0+c2V0UHJvcGVydHko
Q1NTX1BST1BfQ09MT1IsIGF0dHItPnZhbHVlKCksIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAg
ICBSZWZQdHI8Q1NTVmFsdWU+IHZhbCA9IG1fbGlua0RlY2wtPmdldFByb3BlcnR5Q1NTVmFsdWUo
Q1NTX1BST1BfQ09MT1IpOwotICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwtPmlzUHJpbWl0aXZl
VmFsdWUoKSkgewotICAgICAgICAgICAgICAgIENvbG9yIGNvbCA9IGRvY3VtZW50KCktPnN0eWxl
U2VsZWN0b3IoKS0+Z2V0Q29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih2YWwuZ2V0KCkpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bmFt
ZSgpID09IGxpbmtBdHRyKQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRMaW5r
Q29sb3IoY29sKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmxp
bmtBdHRyKQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCgpLT5zZXRWaXNpdGVkTGlua0Nv
bG9yKGNvbCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkb2N1
bWVudCgpLT5zZXRBY3RpdmVMaW5rQ29sb3IoY29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgICAgICAKLSAgICAgICAgaWYgKGF0dGFjaGVkKCkpCi0gICAgICAgICAgICBkb2N1bWVu
dCgpLT5yZWNhbGNTdHlsZShGb3JjZSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
b25sb2FkQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZlbnRMaXN0
ZW5lcihsb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9u
YmVmb3JldW5sb2FkQXR0cikgewotICAgICAgICBkb2N1bWVudCgpLT5zZXRIVE1MV2luZG93RXZl
bnRMaXN0ZW5lcihiZWZvcmV1bmxvYWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb251bmxvYWRBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxX
aW5kb3dFdmVudExpc3RlbmVyKHVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbmJsdXJBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxX
aW5kb3dFdmVudExpc3RlbmVyKGJsdXJFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25mb2N1c0F0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdp
bmRvd0V2ZW50TGlzdGVuZXIoZm9jdXNFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gb25yZXNpemVBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxX
aW5kb3dFdmVudExpc3RlbmVyKHJlc2l6ZUV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBvbnNjcm9sbEF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRN
TFdpbmRvd0V2ZW50TGlzdGVuZXIoc2Nyb2xsRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAg
ICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQg
SFRNTEJvZHlFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0gICAgSFRNTEVsZW1l
bnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0KLSAgICAvLyBGSVhNRTogcGVyaGFwcyB0aGlz
IGNvZGUgc2hvdWxkIGJlIGluIGF0dGFjaCgpIGluc3RlYWQgb2YgaGVyZQotCi0gICAgRnJhbWVW
aWV3ICp3ID0gZG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlmICh3ICYmIHctPm1hcmdpbldpZHRo
KCkgIT0gLTEpCi0gICAgICAgIHNldEF0dHJpYnV0ZShtYXJnaW53aWR0aEF0dHIsIFN0cmluZzo6
bnVtYmVyKHctPm1hcmdpbldpZHRoKCkpKTsKLSAgICBpZiAodyAmJiB3LT5tYXJnaW5IZWlnaHQo
KSAhPSAtMSkKLSAgICAgICAgc2V0QXR0cmlidXRlKG1hcmdpbmhlaWdodEF0dHIsIFN0cmluZzo6
bnVtYmVyKHctPm1hcmdpbkhlaWdodCgpKSk7Ci0KLSAgICBpZiAodykKLSAgICAgICAgdy0+c2No
ZWR1bGVSZWxheW91dCgpOwotfQotCi1ib29sIEhUTUxCb2R5RWxlbWVudDo6aXNVUkxBdHRyaWJ1
dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0g
YmFja2dyb3VuZEF0dHI7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OmFMaW5rKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaW5rQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TEJvZHlFbGVtZW50OjpzZXRBTGluayhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShhbGlua0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6
YmFja2dyb3VuZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShiYWNrZ3JvdW5k
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRCYWNrZ3JvdW5kKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJhY2tncm91bmRBdHRyLCB2YWx1ZSk7
Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVsZW1lbnQ6OmJnQ29sb3IoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIpOwotfQotCi12b2lkIEhUTUxCb2R5RWxlbWVu
dDo6c2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShi
Z2NvbG9yQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEJvZHlFbGVtZW50OjpsaW5rKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGxpbmtBdHRyKTsKLX0KLQotdm9pZCBI
VE1MQm9keUVsZW1lbnQ6OnNldExpbmsoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUobGlua0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxCb2R5RWxlbWVudDo6
dGV4dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh0ZXh0QXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRUZXh0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHRleHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MQm9keUVs
ZW1lbnQ6OnZMaW5rKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZsaW5rQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEJvZHlFbGVtZW50OjpzZXRWTGluayhjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2bGlua0F0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1IVE1MRnJhbWVFbGVtZW50OjpIVE1MRnJhbWVFbGVtZW50KERvY3Vt
ZW50ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudChmcmFtZVRhZywgZG9jKQotewotICAgIGluaXQo
KTsKLX0KLQotSFRNTEZyYW1lRWxlbWVudDo6SFRNTEZyYW1lRWxlbWVudChjb25zdCBRdWFsaWZp
ZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQodGFnTmFt
ZSwgZG9jKQotewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojppbml0
KCkKLXsKLSAgICBtX2ZyYW1lQm9yZGVyID0gdHJ1ZTsKLSAgICBtX2ZyYW1lQm9yZGVyU2V0ID0g
ZmFsc2U7Ci0gICAgbV9tYXJnaW5XaWR0aCA9IC0xOwotICAgIG1fbWFyZ2luSGVpZ2h0ID0gLTE7
Ci0gICAgbV9zY3JvbGxpbmcgPSBTY3JvbGxCYXJBdXRvOwotICAgIG1fbm9SZXNpemUgPSBmYWxz
ZTsKLX0KLQotSFRNTEZyYW1lRWxlbWVudDo6fkhUTUxGcmFtZUVsZW1lbnQoKQotewotfQotCi1i
b29sIEhUTUxGcmFtZUVsZW1lbnQ6OmlzVVJMQWxsb3dlZChjb25zdCBBdG9taWNTdHJpbmcgJlVS
TFN0cmluZykgY29uc3QKLXsKLSAgICBpZiAoVVJMU3RyaW5nLmlzRW1wdHkoKSkKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgCi0gICAgRnJhbWVWaWV3ICp3ID0gZG9jdW1lbnQoKS0+dmlldygp
OwotICAgIGlmICghdykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgS1VSTCBuZXdVUkwo
ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoVVJMU3RyaW5nLmRlcHJlY2F0ZWRTdHJpbmcoKSkpOwot
ICAgIG5ld1VSTC5zZXRSZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0KLSAgICAvLyBEb24n
dCBhbGxvdyBtb3JlIHRoYW4gMTAwMCB0b3RhbCBmcmFtZXMgaW4gYSBzZXQuIFRoaXMgc2VlbXMK
LSAgICAvLyBsaWtlIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgYW5kIG90aGVyd2lzZSBtdXR1
YWxseSByZWN1cnNpdmUKLSAgICAvLyBmcmFtZXNldCBwYWdlcyBjYW4gcXVpY2tseSBicmluZyB0
aGUgcHJvZ3JhbSB0byBpdHMga25lZXMgd2l0aAotICAgIC8vIGV4cG9uZW50aWFsIGdyb3d0aCBp
biB0aGUgbnVtYmVyIG9mIGZyYW1lcy4KLQotICAgIC8vIEZJWE1FOiBUaGlzIGxpbWl0IGNvdWxk
IGJlIGhpZ2hlciwgYnV0IFdlYktpdCBoYXMgc29tZQotICAgIC8vIGFsZ29yaXRobXMgdGhhdCBo
YXBwZW4gd2hpbGUgbG9hZGluZyB3aGljaCBhcHBlYXIgdG8gYmUgTl4yIG9yCi0gICAgLy8gd29y
c2UgaW4gdGhlIG51bWJlciBvZiBmcmFtZXMKLSAgICBpZiAody0+ZnJhbWUoKS0+cGFnZSgpLT5m
cmFtZUNvdW50KCkgPj0gMjAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAg
ICAvLyBXZSBhbGxvdyBvbmUgbGV2ZWwgb2Ygc2VsZi1yZWZlcmVuY2UgYmVjYXVzZSBzb21lIHNp
dGVzIGRlcGVuZCBvbiB0aGF0LgotICAgIC8vIEJ1dCB3ZSBkb24ndCBhbGxvdyBtb3JlIHRoYW4g
b25lLgotICAgIGJvb2wgZm91bmRTZWxmUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgZm9yIChGcmFt
ZSAqZnJhbWUgPSB3LT5mcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5wYXJl
bnQoKSkgewotICAgICAgICBLVVJMIGZyYW1lVVJMID0gZnJhbWUtPnVybCgpOwotICAgICAgICBm
cmFtZVVSTC5zZXRSZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0gICAgICAgIGlmIChmcmFt
ZVVSTCA9PSBuZXdVUkwpIHsKLSAgICAgICAgICAgIGlmIChmb3VuZFNlbGZSZWZlcmVuY2UpIHsK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBmb3VuZFNlbGZSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAg
IHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6Om9wZW5VUkwoKQotewot
ICAgIEZyYW1lVmlldyAqdyA9IGRvY3VtZW50KCktPnZpZXcoKTsKLSAgICBpZiAoIXcpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBBdG9taWNTdHJpbmcgcmVsYXRpdmVVUkwgPSBtX1VSTDsK
LSAgICBpZiAocmVsYXRpdmVVUkwuaXNFbXB0eSgpKQotICAgICAgICByZWxhdGl2ZVVSTCA9ICJh
Ym91dDpibGFuayI7Ci0KLSAgICAvLyBMb2FkIHRoZSBmcmFtZSBjb250ZW50cy4KLSAgICBGcmFt
ZSogcGFyZW50RnJhbWUgPSB3LT5mcmFtZSgpOwotICAgIGlmIChGcmFtZSogY2hpbGRGcmFtZSA9
IHBhcmVudEZyYW1lLT50cmVlKCktPmNoaWxkKG1fbmFtZSkpCi0gICAgICAgIGNoaWxkRnJhbWUt
Pm9wZW5VUkwoZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwocmVsYXRpdmVVUkwuZGVwcmVjYXRlZFN0
cmluZygpKSk7Ci0gICAgZWxzZQotICAgICAgICBwYXJlbnRGcmFtZS0+cmVxdWVzdEZyYW1lKHN0
YXRpY19jYXN0PFJlbmRlckZyYW1lICo+KHJlbmRlcmVyKCkpLCByZWxhdGl2ZVVSTCwgbV9uYW1l
KTsKLX0KLQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIp
IHsKLSAgICAgICAgc2V0TG9jYXRpb24oV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSkp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGlkQXR0cikgewotICAgICAgICAvLyBJ
bXBvcnRhbnQgdG8gY2FsbCB0aHJvdWdoIHRvIGJhc2UgZm9yIHRoZSBpZCBhdHRyaWJ1dGUgc28g
dGhlIGhhc0lEIGJpdCBnZXRzIHNldC4KLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKGF0dHIpOwotICAgICAgICBtX25hbWUgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAgIG1fbmFtZSA9IGF0
dHItPnZhbHVlKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hl
ZCwgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZSB0aGUgZnJhbWUncyBuYW1lLgotICAgICAg
ICAvLyBGSVhNRTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgZG9lc24ndCBjaGVj
ayBmb3IgZnJhbWUgbmFtZQotICAgICAgICAvLyBjb25mbGljdHMgYW5kIGdlbmVyYXRlIGEgdW5p
cXVlIGZyYW1lIG5hbWUuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVib3Jk
ZXJBdHRyKSB7Ci0gICAgICAgIG1fZnJhbWVCb3JkZXIgPSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7
Ci0gICAgICAgIG1fZnJhbWVCb3JkZXJTZXQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIC8v
IEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0Lgot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG1hcmdpbndpZHRoQXR0cikgewotICAgICAg
ICBtX21hcmdpbldpZHRoID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAvLyBGSVhN
RTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBtYXJnaW5oZWlnaHRBdHRyKSB7Ci0gICAgICAgIG1f
bWFyZ2luSGVpZ2h0ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAvLyBGSVhNRTog
SWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBub3Jlc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9ub1Jlc2l6
ZSA9IHRydWU7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwg
dGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHNjcm9s
bGluZ0F0dHIpIHsKLSAgICAgICAgLy8gQXV0byBhbmQgeWVzIGJvdGggc2ltcGx5IG1lYW4gImFs
bG93IHNjcm9sbGluZy4iIE5vIG1lYW5zICJkb24ndCBhbGxvdyBzY3JvbGxpbmcuIgotICAgICAg
ICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImF1dG8iKSB8fCBlcXVhbEln
bm9yaW5nQ2FzZShhdHRyLT52YWx1ZSgpLCAieWVzIikpCi0gICAgICAgICAgICBtX3Njcm9sbGlu
ZyA9IFNjcm9sbEJhckF1dG87Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0
dHItPnZhbHVlKCksICJubyIpKQotICAgICAgICAgICAgbV9zY3JvbGxpbmcgPSBTY3JvbGxCYXJB
bHdheXNPZmY7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwg
dGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9ubG9h
ZEF0dHIpIHsKLSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIobG9hZEV2ZW50LCBhdHRyKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJlZm9yZXVubG9hZEF0dHIpIHsKLSAg
ICAgICAgLy8gRklYTUU6IHNob3VsZCA8ZnJhbWU+IGVsZW1lbnRzIGhhdmUgYmVmb3JldW5sb2Fk
IGhhbmRsZXJzPwotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihiZWZvcmV1bmxvYWRFdmVu
dCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb251bmxvYWRBdHRyKSB7
Ci0gICAgICAgIHNldEhUTUxFdmVudExpc3RlbmVyKHVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9
IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwot
fQotCi1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUg
KnN0eWxlKQotewotICAgIC8vIElnbm9yZSBkaXNwbGF5OiBub25lLgotICAgIHJldHVybiBpc1VS
TEFsbG93ZWQobV9VUkwpOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxGcmFtZUVsZW1lbnQ6OmNy
ZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewot
ICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJGcmFtZSh0aGlzKTsKLX0KLQotdm9pZCBIVE1M
RnJhbWVFbGVtZW50OjphdHRhY2goKQotewotICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShuYW1l
QXR0cik7Ci0gICAgaWYgKG1fbmFtZS5pc051bGwoKSkKLSAgICAgICAgbV9uYW1lID0gZ2V0QXR0
cmlidXRlKGlkQXR0cik7Ci0KLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBw
YXJlbnQgZnJhbWVzZXQKLSAgICBmb3IgKE5vZGUgKm5vZGUgPSBwYXJlbnROb2RlKCk7IG5vZGU7
IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpCi0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1l
KGZyYW1lc2V0VGFnKSkgewotICAgICAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVz
ZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAg
ICBpZiAoIW1fZnJhbWVCb3JkZXJTZXQpCi0gICAgICAgICAgICAgICAgbV9mcmFtZUJvcmRlciA9
IGZyYW1lc2V0LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAgICAgaWYgKCFtX25vUmVzaXplKQot
ICAgICAgICAgICAgICAgIG1fbm9SZXNpemUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0K
LSAgICBpZiAoIXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEZyYW1lKiBmcmFt
ZSA9IGRvY3VtZW50KCktPmZyYW1lKCk7Ci0KLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBmcmFtZS0+cGFnZSgpLT5pbmNyZW1lbnRGcmFtZUNvdW50KCk7Ci0gICAgCi0g
ICAgQXRvbWljU3RyaW5nIHJlbGF0aXZlVVJMID0gbV9VUkw7Ci0gICAgaWYgKHJlbGF0aXZlVVJM
LmlzRW1wdHkoKSkKLSAgICAgICAgcmVsYXRpdmVVUkwgPSAiYWJvdXQ6YmxhbmsiOwotCi0gICAg
bV9uYW1lID0gZnJhbWUtPnRyZWUoKS0+dW5pcXVlQ2hpbGROYW1lKG1fbmFtZSk7Ci0KLSAgICAv
LyBsb2FkIHRoZSBmcmFtZSBjb250ZW50cwotICAgIGZyYW1lLT5yZXF1ZXN0RnJhbWUoc3RhdGlj
X2Nhc3Q8UmVuZGVyRnJhbWUqPihyZW5kZXJlcigpKSwgcmVsYXRpdmVVUkwsIG1fbmFtZSk7Ci19
Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6Y2xvc2UoKQotewotICAgIEZyYW1lKiBmcmFtZSA9
IGRvY3VtZW50KCktPmZyYW1lKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgZnJhbWUpIHsKLSAg
ICAgICAgZnJhbWUtPnBhZ2UoKS0+ZGVjcmVtZW50RnJhbWVDb3VudCgpOwotICAgICAgICBpZiAo
RnJhbWUqIGNoaWxkRnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChtX25hbWUpKQotICAgICAg
ICAgICAgY2hpbGRGcmFtZS0+ZnJhbWVEZXRhY2hlZCgpOwotICAgIH0KLX0KLQotdm9pZCBIVE1M
RnJhbWVFbGVtZW50Ojp3aWxsUmVtb3ZlKCkKLXsKLSAgICAvLyBjbG9zZSB0aGUgZnJhbWUgYW5k
IGRpc3NvY2lhdGUgdGhlIHJlbmRlcmVyLCBidXQgbGVhdmUgdGhlCi0gICAgLy8gbm9kZSBhdHRh
Y2hlZCBzbyB0aGF0IGZyYW1lIGRvZXMgbm90IGdldCByZS1hdHRhY2hlZCBiZWZvcmUKLSAgICAv
LyBhY3R1YWxseSBsZWF2aW5nIHRoZSBkb2N1bWVudC4gIHNlZSA8cmRhcjovL3Byb2JsZW0vNDEz
MjU4MT4KLSAgICBjbG9zZSgpOwotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRl
cmVyKCktPmRlc3Ryb3koKTsKLSAgICAgICAgc2V0UmVuZGVyZXIoMCk7Ci0gICAgfQotICAgIAot
ICAgIEhUTUxFbGVtZW50Ojp3aWxsUmVtb3ZlKCk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVu
dDo6ZGV0YWNoKCkKLXsKLSAgICBjbG9zZSgpOwotICAgIEhUTUxFbGVtZW50OjpkZXRhY2goKTsK
LX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRMb2NhdGlvbihjb25zdCBTdHJpbmcmIHN0
cikKLXsKLSAgICBtX1VSTCA9IEF0b21pY1N0cmluZyhzdHIpOwotCi0gICAgaWYgKCFhdHRhY2hl
ZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8gSGFuZGxlIHRoZSBj
b21tb24gY2FzZSB3aGVyZSB3ZSBkZWNpZGVkIG5vdCB0byBtYWtlIGEgZnJhbWUgdGhlIGZpcnN0
IHRpbWUuCi0gICAgLy8gRGV0YWNoIGFuZCB0aGUgbGV0IGF0dGFjaCgpIGRlY2lkZSBhZ2FpbiB3
aGV0aGVyIHRvIG1ha2UgdGhlIGZyYW1lIGZvciB0aGlzIFVSTC4KLSAgICBpZiAoIXJlbmRlcmVy
KCkpIHsKLSAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgIGF0dGFjaCgpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIAotICAgIGlmICghaXNVUkxBbGxvd2VkKG1fVVJMKSkgewotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgb3BlblVSTCgpOwotfQotCi1ib29sIEhUTUxGcmFtZUVs
ZW1lbnQ6OmlzRm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKTsKLX0K
LQotdm9pZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRGb2N1cyhib29sIHJlY2VpdmVkKQotewotICAg
IEhUTUxFbGVtZW50OjpzZXRGb2N1cyhyZWNlaXZlZCk7Ci0gICAgV2ViQ29yZTo6UmVuZGVyRnJh
bWUgKnJlbmRlckZyYW1lID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6UmVuZGVyRnJhbWUgKj4ocmVu
ZGVyZXIoKSk7Ci0gICAgaWYgKCFyZW5kZXJGcmFtZSB8fCAhcmVuZGVyRnJhbWUtPndpZGdldCgp
KQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKHJlY2VpdmVkKQotICAgICAgICByZW5kZXJGcmFt
ZS0+d2lkZ2V0KCktPnNldEZvY3VzKCk7Ci0gICAgZWxzZQotICAgICAgICByZW5kZXJGcmFtZS0+
d2lkZ2V0KCktPmNsZWFyRm9jdXMoKTsKLX0KLQotRnJhbWUqIEhUTUxGcmFtZUVsZW1lbnQ6OmNv
bnRlbnRGcmFtZSgpIGNvbnN0Ci17Ci0gICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFydCB0aGF0IGNv
bnRhaW5zIHRoaXMgZWxlbWVudCwgb3VyIG93bmVyRG9jdW1lbnQuCi0gICAgRnJhbWUqIHBhcmVu
dEZyYW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXBhcmVudEZyYW1lKQotICAg
ICAgICByZXR1cm4gMDsKLQotICAgIC8vIEZpbmQgdGhlIHBhcnQgZm9yIHRoZSBzdWJmcmFtZSB0
aGF0IHRoaXMgZWxlbWVudCByZXByZXNlbnRzLgotICAgIHJldHVybiBwYXJlbnRGcmFtZS0+dHJl
ZSgpLT5jaGlsZChtX25hbWUpOwotfQotCi1Eb2N1bWVudCogSFRNTEZyYW1lRWxlbWVudDo6Y29u
dGVudERvY3VtZW50KCkgY29uc3QKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBjb250ZW50RnJhbWUo
KTsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZnJhbWUt
PmRvY3VtZW50KCk7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUo
QXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gc3Jj
QXR0cjsKLX0KLQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lQm9yZGVyKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZyYW1lYm9yZGVyQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTEZyYW1lRWxlbWVudDo6c2V0RnJhbWVCb3JkZXIoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoZnJhbWVib3JkZXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBI
VE1MRnJhbWVFbGVtZW50Ojpsb25nRGVzYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZShsb25nZGVzY0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldExvbmdE
ZXNjKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxvbmdkZXNjQXR0
ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6bWFyZ2luSGVpZ2h0KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG1hcmdpbmhlaWdodEF0dHIpOwotfQot
Ci12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldE1hcmdpbkhlaWdodChjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShtYXJnaW5oZWlnaHRBdHRyLCB2YWx1ZSk7Ci19Ci0K
LVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjptYXJnaW5XaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShtYXJnaW53aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVs
ZW1lbnQ6OnNldE1hcmdpbldpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKG1hcmdpbndpZHRoQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxl
bWVudDo6bmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7
Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0TmFtZShjb25zdCBTdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxG
cmFtZUVsZW1lbnQ6OnNldE5vUmVzaXplKGJvb2wgbm9SZXNpemUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKG5vcmVzaXplQXR0ciwgbm9SZXNpemUgPyAiIiA6IDApOwotfQotCi1TdHJpbmcgSFRNTEZy
YW1lRWxlbWVudDo6c2Nyb2xsaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KHNjcm9sbGluZ0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldFNjcm9sbGlu
Zyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzY3JvbGxpbmdBdHRy
LCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjpzcmMoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoc3JjQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxl
bWVudDo6c2V0U3JjKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNy
Y0F0dHIsIHZhbHVlKTsKLX0KLQotaW50IEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lV2lkdGgoKSBj
b25zdAotewotICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0g
ICAgZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7Ci0g
ICAgcmV0dXJuIHJlbmRlcmVyKCktPndpZHRoKCk7Ci19Ci0KLWludCBIVE1MRnJhbWVFbGVtZW50
OjpmcmFtZUhlaWdodCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICAKLSAgICBkb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5n
U3R5bGVzaGVldHMoKTsKLSAgICByZXR1cm4gcmVuZGVyZXIoKS0+aGVpZ2h0KCk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEZyYW1lU2V0RWxlbWVudDo6SFRNTEZyYW1lU2V0RWxl
bWVudChEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQoZnJhbWVzZXRUYWcsIGRvYykK
LXsKLSAgICAvLyBkZWZhdWx0IHZhbHVlIGZvciByb3dzIGFuZCBjb2xzLi4uCi0gICAgbV90b3Rh
bFJvd3MgPSAxOwotICAgIG1fdG90YWxDb2xzID0gMTsKLQotICAgIG1fcm93cyA9IG1fY29scyA9
IDA7Ci0KLSAgICBmcmFtZWJvcmRlciA9IHRydWU7Ci0gICAgZnJhbWVCb3JkZXJTZXQgPSBmYWxz
ZTsKLSAgICBtX2JvcmRlciA9IDQ7Ci0gICAgbm9yZXNpemUgPSBmYWxzZTsKLX0KLQotSFRNTEZy
YW1lU2V0RWxlbWVudDo6fkhUTUxGcmFtZVNldEVsZW1lbnQoKQotewotICAgIGlmIChtX3Jvd3Mp
Ci0gICAgICAgIGRlbGV0ZSBbXSBtX3Jvd3M7Ci0gICAgaWYgKG1fY29scykKLSAgICAgICAgZGVs
ZXRlIFtdIG1fY29sczsKLX0KLQotYm9vbCBIVE1MRnJhbWVTZXRFbGVtZW50OjpjaGVja0RURChj
b25zdCBOb2RlKiBuZXdDaGlsZCkKLXsKLSAgICAvLyBGSVhNRTogT2xkIGNvZGUgaGFkIGFkamFj
ZW50IGRvdWJsZSByZXR1cm5zIGFuZCBzZWVtZWQgdG8gd2FudCB0byBkbyBzb21ldGhpbmcgd2l0
aCBOT0ZSQU1FUyAoYnV0IGRpZG4ndCkuCi0gICAgLy8gV2hhdCBpcyB0aGUgY29ycmVjdCBiZWhh
dmlvcj8KLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpIHx8IG5l
d0NoaWxkLT5oYXNUYWdOYW1lKGZyYW1lVGFnKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVTZXRFbGVt
ZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAg
aWYgKGF0dHItPm5hbWUoKSA9PSByb3dzQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPmlzTnVs
bCgpKSB7Ci0gICAgICAgICAgICBpZiAobV9yb3dzKSBkZWxldGUgW10gbV9yb3dzOwotICAgICAg
ICAgICAgbV9yb3dzID0gYXR0ci0+dmFsdWUoKS50b0xlbmd0aEFycmF5KG1fdG90YWxSb3dzKTsK
LSAgICAgICAgICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGNvbHNBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+aXNOdWxsKCkpIHsK
LSAgICAgICAgICAgIGRlbGV0ZSBbXSBtX2NvbHM7Ci0gICAgICAgICAgICBtX2NvbHMgPSBhdHRy
LT52YWx1ZSgpLnRvTGVuZ3RoQXJyYXkobV90b3RhbENvbHMpOwotICAgICAgICAgICAgc2V0Q2hh
bmdlZCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVi
b3JkZXJBdHRyKSB7Ci0gICAgICAgIC8vIGZhbHNlIG9yICJubyIgb3IgIjAiLi4KLSAgICAgICAg
aWYgKCBhdHRyLT52YWx1ZSgpLnRvSW50KCkgPT0gMCApIHsKLSAgICAgICAgICAgIGZyYW1lYm9y
ZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICBtX2JvcmRlciA9IDA7Ci0gICAgICAgIH0KLSAgICAg
ICAgZnJhbWVCb3JkZXJTZXQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IG5vcmVzaXplQXR0cikgewotICAgICAgICBub3Jlc2l6ZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyQXR0cikgewotICAgICAgICBtX2JvcmRlciA9IGF0dHIt
PnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgaWYoIW1fYm9yZGVyKQotICAgICAgICAgICAgZnJh
bWVib3JkZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmxvYWRB
dHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGxv
YWRFdmVudCwgYXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25iZWZvcmV1
bmxvYWRBdHRyKSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3Rl
bmVyKGJlZm9yZXVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBvbnVubG9hZEF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2
ZW50TGlzdGVuZXIodW5sb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1M
RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEZyYW1l
U2V0RWxlbWVudDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAg
Ly8gSWdub3JlIGRpc3BsYXk6IG5vbmUgYnV0IGRvIHBheSBhdHRlbnRpb24gaWYgYSBzdHlsZXNo
ZWV0IGhhcyBjYXVzZWQgdXMgdG8gZGVsYXkgb3VyIGxvYWRpbmcuCi0gICAgcmV0dXJuIHN0eWxl
LT5pc1N0eWxlQXZhaWxhYmxlKCk7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTEZyYW1lU2V0RWxl
bWVudDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5
bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZyYW1lU2V0KHRoaXMpOwotfQot
Ci12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgLy8gaW5oZXJpdCBk
ZWZhdWx0IHNldHRpbmdzIGZyb20gcGFyZW50IGZyYW1lc2V0Ci0gICAgSFRNTEVsZW1lbnQqIG5v
ZGUgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+KHBhcmVudE5vZGUoKSk7Ci0gICAgd2hpbGUo
bm9kZSkKLSAgICB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkg
ewotICAgICAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0aWNfY2Fz
dDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICBpZighZnJhbWVCb3Jk
ZXJTZXQpICBmcmFtZWJvcmRlciA9IGZyYW1lc2V0LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAg
ICAgaWYoIW5vcmVzaXplKSAgbm9yZXNpemUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBzdGF0aWNfY2FzdDxIVE1M
RWxlbWVudCo+KG5vZGUtPnBhcmVudE5vZGUoKSk7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6
OmF0dGFjaCgpOwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhh
bmRsZXIoRXZlbnQgKmV2dCkKLXsKLSAgICBpZiAoZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiAhbm9y
ZXNpemUgJiYgcmVuZGVyZXIoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpSZW5k
ZXJGcmFtZVNldCAqPihyZW5kZXJlcigpKS0+dXNlclJlc2l6ZShzdGF0aWNfY2FzdDxNb3VzZUV2
ZW50Kj4oZXZ0KSk7Ci0gICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICB9Ci0K
LSAgICBIVE1MRWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhU
TUxGcmFtZVNldEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAg
aWYgKGNoYW5nZWQoKSAmJiByZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPnNldE5l
ZWRzTGF5b3V0KHRydWUpOwotICAgICAgICBzZXRDaGFuZ2VkKGZhbHNlKTsKLSAgICB9Ci0gICAg
SFRNTEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBjaCApOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0
RWxlbWVudDo6Y29scygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjb2xzQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Q29scyhjb25zdCBTdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjb2xzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJp
bmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6cm93cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShyb3dzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Um93
cyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgdmFs
dWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxIZWFkRWxlbWVudDo6SFRNTEhl
YWRFbGVtZW50KERvY3VtZW50ICpkb2MpCitIVE1MSGVhZEVsZW1lbnQ6OkhUTUxIZWFkRWxlbWVu
dChEb2N1bWVudCogZG9jKQogICAgIDogSFRNTEVsZW1lbnQoaGVhZFRhZywgZG9jKQogewogfQpA
QCAtNzcwLDE4NiArNTgsNCBAQCBib29sIEhUTUxIZWFkRWxlbWVudDo6Y2hlY2tEVEQoY29uc3Qg
Tm9kCiAgICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGxpbmtUYWcpIHx8IG5ld0NoaWxk
LT5pc1RleHROb2RlKCk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTEh0bWxFbGVt
ZW50OjpIVE1MSHRtbEVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgICA6IEhUTUxFbGVtZW50KGh0
bWxUYWcsIGRvYykKLXsKLX0KLQotSFRNTEh0bWxFbGVtZW50Ojp+SFRNTEh0bWxFbGVtZW50KCkK
LXsKLX0KLQotU3RyaW5nIEhUTUxIdG1sRWxlbWVudDo6dmVyc2lvbigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZSh2ZXJzaW9uQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEh0bWxFbGVt
ZW50OjpzZXRWZXJzaW9uKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHZlcnNpb25BdHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTEh0bWxFbGVtZW50OjpjaGVja0RU
RChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsKLSAgICAvLyBGSVhNRTogV2h5IGlzIDxzY3JpcHQ+
IGFsbG93ZWQgaGVyZT8KLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUoaGVhZFRhZykg
fHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoYm9keVRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQt
Pmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKG5vZnJhbWVz
VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxJRnJhbWVFbGVtZW50OjpIVE1MSUZyYW1lRWxl
bWVudChEb2N1bWVudCAqZG9jKSA6IEhUTUxGcmFtZUVsZW1lbnQoaWZyYW1lVGFnLCBkb2MpCi17
Ci0gICAgbV9mcmFtZUJvcmRlciA9IGZhbHNlOwotICAgIG1fbWFyZ2luV2lkdGggPSAtMTsKLSAg
ICBtX21hcmdpbkhlaWdodCA9IC0xOwotICAgIG5lZWRXaWRnZXRVcGRhdGUgPSBmYWxzZTsKLX0K
LQotSFRNTElGcmFtZUVsZW1lbnQ6On5IVE1MSUZyYW1lRWxlbWVudCgpCi17Ci19Ci0KLWJvb2wg
SFRNTElGcmFtZUVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5h
bWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJO
YW1lID09IHdpZHRoQXR0ciB8fCBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIHJl
c3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0g
ICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlUmVwbGFj
ZWQ7IC8vIFNoYXJlIHdpdGggPGltZz4gc2luY2UgdGhlIGFsaWdubWVudCBiZWhhdmlvciBpcyB0
aGUgc2FtZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
SFRNTEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRN
TElGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0
cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikKLSAgICAgICAgYWRkQ1NT
TGVuZ3RoKGF0dHIsIENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsKLSAgICBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIs
IENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGFsaWduQXR0cikKLSAgICAgICAgYWRkSFRNTEFsaWdubWVudChhdHRyKTsKLSAgICBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbmFtZUF0dHIpIHsKLSAgICAgICAgU3RyaW5nIG5ld05h
bWVBdHRyID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgaWYgKGluRG9jdW1lbnQoKSAmJiBkb2N1
bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7Ci0gICAgICAgICAgICBIVE1MRG9jdW1lbnQgKmRv
YyA9IHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudCAqPihkb2N1bWVudCgpKTsKLSAgICAgICAgICAg
IGRvYy0+cmVtb3ZlRG9jRXh0cmFOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgICAgICAgICAg
ZG9jLT5hZGREb2NFeHRyYU5hbWVkSXRlbShuZXdOYW1lQXR0cik7Ci0gICAgICAgIH0KLSAgICAg
ICAgb2xkTmFtZUF0dHIgPSBuZXdOYW1lQXR0cjsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEZy
YW1lRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLXZvaWQgSFRNTElG
cmFtZUVsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKLXsKLSAgICBpZiAoZG9jdW1lbnQo
KS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBIVE1MRG9jdW1lbnQgKmRvYyA9IHN0YXRp
Y19jYXN0PEhUTUxEb2N1bWVudCAqPihkb2N1bWVudCgpKTsKLSAgICAgICAgZG9jLT5hZGREb2NF
eHRyYU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6Omlu
c2VydGVkSW50b0RvY3VtZW50KCk7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OnJlbW92
ZWRGcm9tRG9jdW1lbnQoKQotewotICAgIGlmIChkb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgp
KSB7Ci0gICAgICAgIEhUTUxEb2N1bWVudCAqZG9jID0gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50
ICo+KGRvY3VtZW50KCkpOwotICAgICAgICBkb2MtPnJlbW92ZURvY0V4dHJhTmFtZWRJdGVtKG9s
ZE5hbWVBdHRyKTsKLSAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6cmVtb3ZlZEZyb21Eb2N1bWVu
dCgpOwotfQotCi1ib29sIEhUTUxJRnJhbWVFbGVtZW50OjpyZW5kZXJlcklzTmVlZGVkKFJlbmRl
clN0eWxlICpzdHlsZSkKLXsKLSAgICAvLyBEb24ndCBpZ25vcmUgZGlzcGxheTogbm9uZSB0aGUg
d2F5IGZyYW1lIGRvZXMuCi0gICAgcmV0dXJuIGlzVVJMQWxsb3dlZChtX1VSTCkgJiYgc3R5bGUt
PmRpc3BsYXkoKSAhPSBOT05FOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxJRnJhbWVFbGVtZW50
OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqYXJlbmEsIFJlbmRlclN0eWxlICpzdHlsZSkK
LXsKLSAgICByZXR1cm4gbmV3IChhcmVuYSkgUmVuZGVyUGFydE9iamVjdCh0aGlzKTsKLX0KLQot
dm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6YXR0YWNoKCkKLXsKLSAgICBtX25hbWUgPSBnZXRBdHRy
aWJ1dGUobmFtZUF0dHIpOwotICAgIGlmIChtX25hbWUuaXNOdWxsKCkpCi0gICAgICAgIG1fbmFt
ZSA9IGdldEF0dHJpYnV0ZShpZEF0dHIpOwotCi0gICAgSFRNTEVsZW1lbnQ6OmF0dGFjaCgpOwot
Ci0gICAgRnJhbWUqIHBhcmVudEZyYW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAo
cmVuZGVyZXIoKSAmJiBwYXJlbnRGcmFtZSkgewotICAgICAgICBwYXJlbnRGcmFtZS0+cGFnZSgp
LT5pbmNyZW1lbnRGcmFtZUNvdW50KCk7Ci0gICAgICAgIG1fbmFtZSA9IHBhcmVudEZyYW1lLT50
cmVlKCktPnVuaXF1ZUNoaWxkTmFtZShtX25hbWUpOwotICAgICAgICBzdGF0aWNfY2FzdDxSZW5k
ZXJQYXJ0T2JqZWN0Kj4ocmVuZGVyZXIoKSktPnVwZGF0ZVdpZGdldCgpOwotICAgICAgICBuZWVk
V2lkZ2V0VXBkYXRlID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50
OjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKQotewotICAgIGlmIChuZWVkV2lkZ2V0VXBk
YXRlKSB7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
UmVuZGVyUGFydE9iamVjdCo+KHJlbmRlcmVyKCkpLT51cGRhdGVXaWRnZXQoKTsKLSAgICAgICAg
bmVlZFdpZGdldFVwZGF0ZSA9IGZhbHNlOwotICAgIH0KLSAgICBIVE1MRWxlbWVudDo6cmVjYWxj
U3R5bGUoIGNoICk7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6Om9wZW5VUkwoKQotewot
ICAgIG5lZWRXaWRnZXRVcGRhdGUgPSB0cnVlOwotICAgIHNldENoYW5nZWQoKTsKLX0KLQotYm9v
bCBIVE1MSUZyYW1lRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25z
dAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cjsKLX0KLQotU3RyaW5nIEhU
TUxJRnJhbWVFbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50OjpzZXRBbGlnbihjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsK
LX0KLQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50OjpoZWlnaHQoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoaGVpZ2h0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1l
bnQ6OnNldEhlaWdodChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSho
ZWlnaHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxlbWVudDo6c3JjKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoZ2V0QXR0cmlidXRl
KHNyY0F0dHIpKTsKLX0KLQotU3RyaW5nIEhUTUxJRnJhbWVFbGVtZW50Ojp3aWR0aCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxJ
RnJhbWVFbGVtZW50OjpzZXRXaWR0aChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKLX0KLQogfQpJbmRleDogaHRtbC9IVE1MRWxlbWVu
dEZhY3RvcnkuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTEVsZW1lbnRGYWN0b3J5LmNwcAko
cmV2aXNpb24gMTQzMzIpCisrKyBodG1sL0hUTUxFbGVtZW50RmFjdG9yeS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI2LDEyICsyNiwxNyBAQAogI2luY2x1ZGUgIkhUTUxBcHBsZXRFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiSFRNTEJhc2VGb250RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxCYXNlRWxl
bWVudC5oIgorI2luY2x1ZGUgIkhUTUxCb2R5RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxCdXR0
b25FbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKICNpbmNsdWRlICJI
VE1MRG9jdW1lbnQuaCIKICNpbmNsdWRlICJIVE1MRW1iZWRFbGVtZW50LmgiCisjaW5jbHVkZSAi
SFRNTEZyYW1lU2V0RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxGaWVsZFNldEVsZW1lbnQuaCIK
ICNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSGVhZEVsZW1lbnQu
aCIKKyNpbmNsdWRlICJIVE1MSHRtbEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxl
bWVudC5oIgogI2luY2x1ZGUgIkhUTUxJc0luZGV4RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxM
YWJlbEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTGVnZW5kRWxlbWVudC5oIgpAQCAtNTIsNyAr
NTcsNiBAQAogI2luY2x1ZGUgIkhUTUxUYWJsZVJvd0VsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1M
VGFibGVTZWN0aW9uRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxUaXRsZUVsZW1lbnQuaCIKLSNp
bmNsdWRlICJodG1sX2Jhc2VpbXBsLmgiCiAjaW5jbHVkZSAiaHRtbF9ibG9ja2ltcGwuaCIKICNp
bmNsdWRlICJodG1sX2xpc3RpbXBsLmgiCiAKSW5kZXg6IGh0bWwvaHRtbF9iYXNlaW1wbC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGh0bWwvaHRtbF9iYXNlaW1wbC5oCShyZXZpc2lvbiAxNDMyNSkKKysrIGh0
bWwvaHRtbF9iYXNlaW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDI5MSArMCwwIEBACi0vKgot
ICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBmb3IgS0RFLgot
ICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQotICog
ICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQotICog
ICAgICAgICAgIChDKSAyMDAwIFNpbW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3JnPgotICog
Q29weXJpZ2h0IChDKSAyMDA0LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCi0gKgotICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMw
LAotICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgSFRN
TF9CQVNFSU1QTF9ICi0jZGVmaW5lIEhUTUxfQkFTRUlNUExfSAotCi0jaW5jbHVkZSAiSFRNTEVs
ZW1lbnQuaCIKLSNpbmNsdWRlICJTY3JvbGxCYXJNb2RlLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNsYXNzIFN0cmluZzsKLWNsYXNzIEZyYW1lOwot
Y2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKLWNsYXNzIFJlbmRlckZyYW1lU2V0OwotY2xhc3MgUmVu
ZGVyRnJhbWU7Ci1jbGFzcyBSZW5kZXJQYXJ0T2JqZWN0OwotCi1zdHJ1Y3QgTGVuZ3RoOwotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCb2R5RWxlbWVudCA6IHB1YmxpYyBIVE1M
RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxCb2R5RWxlbWVudChEb2N1bWVudCAqZG9jKTsK
LSAgICB+SFRNTEJvZHlFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5k
VGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAg
IHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0KLSAgICAKLSAg
ICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqKTsKLQotICAgIHZpcnR1YWwgdm9p
ZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgdm9pZCBjcmVhdGVMaW5rRGVjbCgpOwot
ICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNv
bnN0OwotCi0gICAgU3RyaW5nIGFMaW5rKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBTGluayhjb25z
dCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIGJhY2tncm91bmQoKSBjb25zdDsKLSAgICB2b2lkIHNl
dEJhY2tncm91bmQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0cmluZyBiZ0NvbG9yKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmKTsKLSAgICBTdHJpbmcgbGluaygp
IGNvbnN0OwotICAgIHZvaWQgc2V0TGluayhjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIHRl
eHQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0cmlu
ZyB2TGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0VkxpbmsoY29uc3QgU3RyaW5nICYpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBtX2xpbmtE
ZWNsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MRnJhbWVFbGVtZW50
IDogcHVibGljIEhUTUxFbGVtZW50Ci17Ci0gICAgZnJpZW5kIGNsYXNzIFJlbmRlckZyYW1lOwot
ICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0T2JqZWN0OwotCi1wdWJsaWM6Ci0gICAgSFRNTEZy
YW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICBIVE1MRnJhbWVFbGVtZW50KGNvbnN0IFF1
YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2MpOwotICAgIH5IVE1MRnJhbWVFbGVt
ZW50KCk7Ci0KLSAgICB2b2lkIGluaXQoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBl
bmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c0ZvcmJpZGRlbjsgfQot
ICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMDsgfQotICAKLSAg
ICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICopOwot
ICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdmlydHVh
bCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmly
dHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCBS
ZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIFJlbmRlclN0eWxlICop
OwotCi0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG1fbm9SZXNpemU7IH0KLQotICAgIHZv
aWQgc2V0TG9jYXRpb24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGb2N1
c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoYm9vbCk7Ci0KLSAgICBG
cmFtZSogY29udGVudEZyYW1lKCkgY29uc3Q7Ci0gICAgRG9jdW1lbnQqIGNvbnRlbnREb2N1bWVu
dCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1
dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU2Nyb2xsQmFyTW9kZSBzY3JvbGxpbmdNb2RlKCkgY29u
c3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0KLSAgICBpbnQgZ2V0TWFyZ2luV2lkdGgoKSBjb25z
dCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9Ci0gICAgaW50IGdldE1hcmdpbkhlaWdodCgpIGNv
bnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0OyB9Ci0KLSAgICBTdHJpbmcgZnJhbWVCb3JkZXIo
KSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lQm9yZGVyKGNvbnN0IFN0cmluZyAmKTsKLQotICAg
IFN0cmluZyBsb25nRGVzYygpIGNvbnN0OwotICAgIHZvaWQgc2V0TG9uZ0Rlc2MoY29uc3QgU3Ry
aW5nICYpOwotCi0gICAgU3RyaW5nIG1hcmdpbkhlaWdodCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBtYXJnaW5XaWR0aCgp
IGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luV2lkdGgoY29uc3QgU3RyaW5nICYpOwotCi0gICAg
U3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nICYpOwot
Ci0gICAgdm9pZCBzZXROb1Jlc2l6ZShib29sKTsKLQotICAgIFN0cmluZyBzY3JvbGxpbmcoKSBj
b25zdDsKLSAgICB2b2lkIHNldFNjcm9sbGluZyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0
dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLSAgICB2b2lkIHNldFNyYyhjb25zdCBTdHJpbmcgJik7
Ci0KLSAgICBpbnQgZnJhbWVXaWR0aCgpIGNvbnN0OwotICAgIGludCBmcmFtZUhlaWdodCgpIGNv
bnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBpc1VSTEFsbG93ZWQoY29uc3QgQXRvbWljU3Ry
aW5nICYpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBBdG9taWNT
dHJpbmcgbV9VUkw7Ci0gICAgQXRvbWljU3RyaW5nIG1fbmFtZTsKLQotICAgIGludCBtX21hcmdp
bldpZHRoOwotICAgIGludCBtX21hcmdpbkhlaWdodDsKLSAgICBTY3JvbGxCYXJNb2RlIG1fc2Ny
b2xsaW5nOwotCi0gICAgYm9vbCBtX2ZyYW1lQm9yZGVyIDogMTsKLSAgICBib29sIG1fZnJhbWVC
b3JkZXJTZXQgOiAxOwotICAgIGJvb2wgbV9ub1Jlc2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGcmFtZVNldEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1l
bnQKLXsKLSAgICBmcmllbmQgY2xhc3MgUmVuZGVyRnJhbWVTZXQ7Ci1wdWJsaWM6Ci0gICAgSFRN
TEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEZyYW1lU2V0RWxlbWVu
dCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29u
c3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlv
cml0eSgpIGNvbnN0IHsgcmV0dXJuIDEwOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNv
bnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJp
YnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAg
IHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICopOwotICAgIHZpcnR1
YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBSZW5kZXJTdHls
ZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50ICpldnQp
OwotCi0gICAgYm9vbCBmcmFtZUJvcmRlcigpIHsgcmV0dXJuIGZyYW1lYm9yZGVyOyB9Ci0gICAg
Ym9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG5vcmVzaXplOyB9Ci0KLSAgICBpbnQgdG90YWxSb3dz
KCkgY29uc3QgeyByZXR1cm4gbV90b3RhbFJvd3M7IH0KLSAgICBpbnQgdG90YWxDb2xzKCkgY29u
c3QgeyByZXR1cm4gbV90b3RhbENvbHM7IH0KLSAgICBpbnQgYm9yZGVyKCkgY29uc3QgeyByZXR1
cm4gbV9ib3JkZXI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFu
Z2UgY2ggKTsKLSAgICAKLSAgICBTdHJpbmcgY29scygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29s
cyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgcm93cygpIGNvbnN0OwotICAgIHZvaWQg
c2V0Um93cyhjb25zdCBTdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBMZW5ndGgqIG1fcm93
czsKLSAgICBMZW5ndGgqIG1fY29sczsKLQotICAgIGludCBtX3RvdGFsUm93czsKLSAgICBpbnQg
bV90b3RhbENvbHM7Ci0gICAgaW50IG1fYm9yZGVyOwotCi0gICAgYm9vbCBmcmFtZWJvcmRlciA6
IDE7Ci0gICAgYm9vbCBmcmFtZUJvcmRlclNldCA6IDE7Ci0gICAgYm9vbCBub3Jlc2l6ZSA6IDE7
Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxIZWFkRWxlbWVudCA6IHB1
YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxIZWFkRWxlbWVudChEb2N1bWVu
dCAqZG9jKTsKLSAgICB+SFRNTEhlYWRFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdT
dGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25h
bDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTA7IH0K
LSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpOwotCi0gICAg
U3RyaW5nIHByb2ZpbGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFByb2ZpbGUoY29uc3QgU3RyaW5n
ICYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSHRtbEVsZW1lbnQg
OiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MSHRtbEVsZW1lbnQoRG9j
dW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxIdG1sRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1M
VGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVx
dWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDEx
OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQot
ICAgIFN0cmluZyB2ZXJzaW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWZXJzaW9uKGNvbnN0IFN0
cmluZyAmKTsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSUZyYW1l
RWxlbWVudCA6IHB1YmxpYyBIVE1MRnJhbWVFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTElG
cmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxJRnJhbWVFbGVtZW50KCk7Ci0K
LSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJl
dHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkg
Y29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3Qg
UXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNv
bnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGUgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3VtZW50KCk7Ci0g
ICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAgIHZpcnR1YWwgdm9p
ZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHls
ZSAqKTsKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJl
bmEgKiwgUmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0eWxlKCBTdHls
ZUNoYW5nZSBjaCApOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0ZShBdHRy
aWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRBbGlnbihjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgaGVpZ2h0KCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIHdpZHRo
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcgJik7Ci0KLSAgICB2aXJ0
dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBv
cGVuVVJMKCk7Ci0KLSAgICBib29sIG5lZWRXaWRnZXRVcGRhdGU7Ci0KLSBwcml2YXRlOgotICAg
IFN0cmluZyBvbGROYW1lQXR0cjsKLX07Ci0KLX0gLy9uYW1lc3BhY2UKLQotI2VuZGlmCkluZGV4
OiBodG1sL0hUTUxGcmFtZUVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxGcmFtZUVs
ZW1lbnQuaAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxGcmFtZUVsZW1lbnQuaAkod29y
a2luZyBjb3B5KQpAQCAtMjMsNjIgKzIzLDE1IEBACiAgKgogICovCiAKLSNpZm5kZWYgSFRNTF9C
QVNFSU1QTF9ICi0jZGVmaW5lIEhUTUxfQkFTRUlNUExfSAorI2lmbmRlZiBIVE1MRnJhbWVFbGVt
ZW50X0gKKyNkZWZpbmUgSFRNTEZyYW1lRWxlbWVudF9ICiAKICNpbmNsdWRlICJIVE1MRWxlbWVu
dC5oIgogI2luY2x1ZGUgIlNjcm9sbEJhck1vZGUuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
Ci1jbGFzcyBDU1NTdHlsZVNoZWV0OwotY2xhc3MgU3RyaW5nOwogY2xhc3MgRnJhbWU7Ci1jbGFz
cyBIVE1MRnJhbWVFbGVtZW50OwotY2xhc3MgUmVuZGVyRnJhbWVTZXQ7Ci1jbGFzcyBSZW5kZXJG
cmFtZTsKLWNsYXNzIFJlbmRlclBhcnRPYmplY3Q7Ci0KLXN0cnVjdCBMZW5ndGg7Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEJvZHlFbGVtZW50IDogcHVibGljIEhUTUxFbGVt
ZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTEJvZHlFbGVtZW50KERvY3VtZW50ICpkb2MpOwotICAg
IH5IVE1MQm9keUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdS
ZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAgdmly
dHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAxMDsgfQotICAgIAotICAgIHZp
cnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBw
ZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICopOwotCi0gICAgdmlydHVhbCB2b2lkIGlu
c2VydGVkSW50b0RvY3VtZW50KCk7Ci0KLSAgICB2b2lkIGNyZWF0ZUxpbmtEZWNsKCk7Ci0gICAg
Ci0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cikgY29uc3Q7
Ci0KLSAgICBTdHJpbmcgYUxpbmsoKSBjb25zdDsKLSAgICB2b2lkIHNldEFMaW5rKGNvbnN0IFN0
cmluZyAmKTsKLSAgICBTdHJpbmcgYmFja2dyb3VuZCgpIGNvbnN0OwotICAgIHZvaWQgc2V0QmFj
a2dyb3VuZChjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25zdDsKLSAg
ICB2b2lkIHNldEJnQ29sb3IoY29uc3QgU3RyaW5nICYpOwotICAgIFN0cmluZyBsaW5rKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRMaW5rKGNvbnN0IFN0cmluZyAmKTsKLSAgICBTdHJpbmcgdGV4dCgp
IGNvbnN0OwotICAgIHZvaWQgc2V0VGV4dChjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIHZM
aW5rKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWTGluayhjb25zdCBTdHJpbmcgJik7Ci0KLXByb3Rl
Y3RlZDoKLSAgICBSZWZQdHI8Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24+IG1fbGlua0RlY2w7
Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEhUTUxGcmFtZUVsZW1lbnQgOiBw
dWJsaWMgSFRNTEVsZW1lbnQKIHsKQEAgLTg2LDggKzM5LDggQEAgY2xhc3MgSFRNTEZyYW1lRWxl
bWVudCA6IHB1YmxpYyBIVE1MRWxlbQogICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0T2JqZWN0
OwogCiBwdWJsaWM6Ci0gICAgSFRNTEZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICBI
VE1MRnJhbWVFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBk
b2MpOworICAgIEhUTUxGcmFtZUVsZW1lbnQoRG9jdW1lbnQqKTsKKyAgICBIVE1MRnJhbWVFbGVt
ZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmLCBEb2N1bWVudCopOwogICAgIH5IVE1MRnJhbWVFbGVt
ZW50KCk7CiAKICAgICB2b2lkIGluaXQoKTsKQEAgLTk1LDEzICs0OCwxMyBAQCBwdWJsaWM6CiAg
ICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1
cm4gVGFnU3RhdHVzRm9yYmlkZGVuOyB9CiAgICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBj
b25zdCB7IHJldHVybiAwOyB9CiAgIAotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJp
YnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7CisgICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKICAg
ICB2b2lkIGNsb3NlKCk7CiAgICAgdmlydHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKICAgICB2aXJ0
dWFsIHZvaWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVu
ZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hICosIFJlbmRlclN0eWxlICopOworICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklz
TmVlZGVkKFJlbmRlclN0eWxlKik7CisgICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJl
bmRlcmVyKFJlbmRlckFyZW5hKiwgUmVuZGVyU3R5bGUqKTsKIAogICAgIGJvb2wgbm9SZXNpemUo
KSB7IHJldHVybiBtX25vUmVzaXplOyB9CiAKQEAgLTExMyw0MCArNjYsNDAgQEAgcHVibGljOgog
ICAgIEZyYW1lKiBjb250ZW50RnJhbWUoKSBjb25zdDsKICAgICBEb2N1bWVudCogY29udGVudERv
Y3VtZW50KCkgY29uc3Q7CiAgICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0
dHJpYnV0ZSAqYXR0cikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0
dHJpYnV0ZSopIGNvbnN0OwogCiAgICAgU2Nyb2xsQmFyTW9kZSBzY3JvbGxpbmdNb2RlKCkgY29u
c3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0KICAgICBpbnQgZ2V0TWFyZ2luV2lkdGgoKSBjb25z
dCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9CiAgICAgaW50IGdldE1hcmdpbkhlaWdodCgpIGNv
bnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0OyB9CiAKICAgICBTdHJpbmcgZnJhbWVCb3JkZXIo
KSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lQm9yZGVyKGNvbnN0IFN0cmluZyAmKTsKKyAgICB2
b2lkIHNldEZyYW1lQm9yZGVyKGNvbnN0IFN0cmluZyYpOwogCiAgICAgU3RyaW5nIGxvbmdEZXNj
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRMb25nRGVzYyhjb25zdCBTdHJpbmcgJik7CisgICAgdm9p
ZCBzZXRMb25nRGVzYyhjb25zdCBTdHJpbmcmKTsKIAogICAgIFN0cmluZyBtYXJnaW5IZWlnaHQo
KSBjb25zdDsKLSAgICB2b2lkIHNldE1hcmdpbkhlaWdodChjb25zdCBTdHJpbmcgJik7CisgICAg
dm9pZCBzZXRNYXJnaW5IZWlnaHQoY29uc3QgU3RyaW5nJik7CiAKICAgICBTdHJpbmcgbWFyZ2lu
V2lkdGgoKSBjb25zdDsKLSAgICB2b2lkIHNldE1hcmdpbldpZHRoKGNvbnN0IFN0cmluZyAmKTsK
KyAgICB2b2lkIHNldE1hcmdpbldpZHRoKGNvbnN0IFN0cmluZyYpOwogCiAgICAgU3RyaW5nIG5h
bWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nICYpOworICAgIHZvaWQg
c2V0TmFtZShjb25zdCBTdHJpbmcmKTsKIAogICAgIHZvaWQgc2V0Tm9SZXNpemUoYm9vbCk7CiAK
ICAgICBTdHJpbmcgc2Nyb2xsaW5nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTY3JvbGxpbmcoY29u
c3QgU3RyaW5nICYpOworICAgIHZvaWQgc2V0U2Nyb2xsaW5nKGNvbnN0IFN0cmluZyYpOwogCiAg
ICAgdmlydHVhbCBTdHJpbmcgc3JjKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTcmMoY29uc3QgU3Ry
aW5nICYpOworICAgIHZvaWQgc2V0U3JjKGNvbnN0IFN0cmluZyYpOwogCiAgICAgaW50IGZyYW1l
V2lkdGgoKSBjb25zdDsKICAgICBpbnQgZnJhbWVIZWlnaHQoKSBjb25zdDsKIAogcHJvdGVjdGVk
OgotICAgIGJvb2wgaXNVUkxBbGxvd2VkKGNvbnN0IEF0b21pY1N0cmluZyAmKSBjb25zdDsKKyAg
ICBib29sIGlzVVJMQWxsb3dlZChjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKICAgICB2aXJ0
dWFsIHZvaWQgb3BlblVSTCgpOwogCiAgICAgQXRvbWljU3RyaW5nIG1fVVJMOwpAQCAtMTYxLDEz
MSArMTE0LDYgQEAgcHJvdGVjdGVkOgogICAgIGJvb2wgbV9ub1Jlc2l6ZSA6IDE7CiB9OwogCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxGcmFtZVNldEVsZW1lbnQgOiBwdWJsaWMg
SFRNTEVsZW1lbnQKLXsKLSAgICBmcmllbmQgY2xhc3MgUmVuZGVyRnJhbWVTZXQ7Ci1wdWJsaWM6
Ci0gICAgSFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEZyYW1l
U2V0RWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVt
ZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGlu
dCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDEwOyB9Ci0gICAgdmlydHVhbCBib29sIGNo
ZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIGF0dGFj
aCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlICopOwot
ICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSAqLCBS
ZW5kZXJTdHlsZSAqKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2
ZW50ICpldnQpOwotCi0gICAgYm9vbCBmcmFtZUJvcmRlcigpIHsgcmV0dXJuIGZyYW1lYm9yZGVy
OyB9Ci0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG5vcmVzaXplOyB9Ci0KLSAgICBpbnQg
dG90YWxSb3dzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbFJvd3M7IH0KLSAgICBpbnQgdG90YWxD
b2xzKCkgY29uc3QgeyByZXR1cm4gbV90b3RhbENvbHM7IH0KLSAgICBpbnQgYm9yZGVyKCkgY29u
c3QgeyByZXR1cm4gbV9ib3JkZXI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSgg
U3R5bGVDaGFuZ2UgY2ggKTsKLSAgICAKLSAgICBTdHJpbmcgY29scygpIGNvbnN0OwotICAgIHZv
aWQgc2V0Q29scyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgcm93cygpIGNvbnN0Owot
ICAgIHZvaWQgc2V0Um93cyhjb25zdCBTdHJpbmcgJik7Ci0KLXByb3RlY3RlZDoKLSAgICBMZW5n
dGgqIG1fcm93czsKLSAgICBMZW5ndGgqIG1fY29sczsKLQotICAgIGludCBtX3RvdGFsUm93czsK
LSAgICBpbnQgbV90b3RhbENvbHM7Ci0gICAgaW50IG1fYm9yZGVyOwotCi0gICAgYm9vbCBmcmFt
ZWJvcmRlciA6IDE7Ci0gICAgYm9vbCBmcmFtZUJvcmRlclNldCA6IDE7Ci0gICAgYm9vbCBub3Jl
c2l6ZSA6IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxIZWFkRWxl
bWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxIZWFkRWxlbWVu
dChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEhlYWRFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFs
IEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0
dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1
cm4gMTA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQp
OwotCi0gICAgU3RyaW5nIHByb2ZpbGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFByb2ZpbGUoY29u
c3QgU3RyaW5nICYpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MSHRt
bEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MSHRtbEVs
ZW1lbnQoRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxIdG1sRWxlbWVudCgpOwotCi0gICAgdmly
dHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFn
U3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsg
cmV0dXJuIDExOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0No
aWxkKTsKLQotICAgIFN0cmluZyB2ZXJzaW9uKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWZXJzaW9u
KGNvbnN0IFN0cmluZyAmKTsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBI
VE1MSUZyYW1lRWxlbWVudCA6IHB1YmxpYyBIVE1MRnJhbWVFbGVtZW50Ci17Ci1wdWJsaWM6Ci0g
ICAgSFRNTElGcmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYyk7Ci0gICAgfkhUTUxJRnJhbWVFbGVt
ZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBj
b25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1By
aW9yaXR5KCkgY29uc3QgeyByZXR1cm4gMTsgfQotCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50
cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiBy
ZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBw
ZWRBdHRyaWJ1dGUgKmF0dHIpOwotCi0gICAgdmlydHVhbCB2b2lkIGluc2VydGVkSW50b0RvY3Vt
ZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbW92ZWRGcm9tRG9jdW1lbnQoKTsKLQotICAgIHZp
cnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVuZGVyZXJJc05lZWRlZChS
ZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCAqY3JlYXRlUmVuZGVyZXIo
UmVuZGVyQXJlbmEgKiwgUmVuZGVyU3R5bGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHJlY2FsY1N0
eWxlKCBTdHlsZUNoYW5nZSBjaCApOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJp
YnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgaGVpZ2h0
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3Ry
aW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcgJik7Ci0K
LSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1
YWwgdm9pZCBvcGVuVVJMKCk7Ci0KLSAgICBib29sIG5lZWRXaWRnZXRVcGRhdGU7Ci0KLSBwcml2
YXRlOgotICAgIFN0cmluZyBvbGROYW1lQXR0cjsKLX07Ci0KIH0gLy9uYW1lc3BhY2UKIAogI2Vu
ZGlmCkluZGV4OiBodG1sL0hUTUxGcmFtZVNldEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1s
L0hUTUxGcmFtZVNldEVsZW1lbnQuaAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxGcmFt
ZVNldEVsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsMTYzICsyMywzMCBAQAogICoKICAq
LwogCi0jaWZuZGVmIEhUTUxfQkFTRUlNUExfSAotI2RlZmluZSBIVE1MX0JBU0VJTVBMX0gKKyNp
Zm5kZWYgSFRNTEZyYW1lU2V0RWxlbWVudF9ICisjZGVmaW5lIEhUTUxGcmFtZVNldEVsZW1lbnRf
SAogCiAjaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKLSNpbmNsdWRlICJTY3JvbGxCYXJNb2RlLmgi
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNsYXNzIFN0
cmluZzsKLWNsYXNzIEZyYW1lOwotY2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKLWNsYXNzIFJlbmRl
ckZyYW1lU2V0OwotY2xhc3MgUmVuZGVyRnJhbWU7Ci1jbGFzcyBSZW5kZXJQYXJ0T2JqZWN0Owot
Ci1zdHJ1Y3QgTGVuZ3RoOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxCb2R5
RWxlbWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxCb2R5RWxl
bWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEJvZHlFbGVtZW50KCk7Ci0KLSAgICB2aXJ0
dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdT
dGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyBy
ZXR1cm4gMTA7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFs
aWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7
Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAq
KTsKLQotICAgIHZpcnR1YWwgdm9pZCBpbnNlcnRlZEludG9Eb2N1bWVudCgpOwotCi0gICAgdm9p
ZCBjcmVhdGVMaW5rRGVjbCgpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0
ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFMaW5rKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRBTGluayhjb25zdCBTdHJpbmcgJik7Ci0gICAgU3RyaW5nIGJhY2tncm91bmQo
KSBjb25zdDsKLSAgICB2b2lkIHNldEJhY2tncm91bmQoY29uc3QgU3RyaW5nICYpOwotICAgIFN0
cmluZyBiZ0NvbG9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAm
KTsKLSAgICBTdHJpbmcgbGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0TGluayhjb25zdCBTdHJp
bmcgJik7Ci0gICAgU3RyaW5nIHRleHQoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHQoY29uc3Qg
U3RyaW5nICYpOwotICAgIFN0cmluZyB2TGluaygpIGNvbnN0OwotICAgIHZvaWQgc2V0Vkxpbmso
Y29uc3QgU3RyaW5nICYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHls
ZURlY2xhcmF0aW9uPiBtX2xpbmtEZWNsOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1j
bGFzcyBIVE1MRnJhbWVFbGVtZW50IDogcHVibGljIEhUTUxFbGVtZW50Ci17Ci0gICAgZnJpZW5k
IGNsYXNzIFJlbmRlckZyYW1lOwotICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJQYXJ0T2JqZWN0Owot
Ci1wdWJsaWM6Ci0gICAgSFRNTEZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICBIVE1M
RnJhbWVFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2Mp
OwotICAgIH5IVE1MRnJhbWVFbGVtZW50KCk7Ci0KLSAgICB2b2lkIGluaXQoKTsKLQotICAgIHZp
cnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRh
Z1N0YXR1c0ZvcmJpZGRlbjsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3Qg
eyByZXR1cm4gMDsgfQotICAKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlICopOwotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICB2b2lk
IGNsb3NlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHdpbGxSZW1vdmUoKTsKLSAgICB2aXJ0dWFsIHZv
aWQgZGV0YWNoKCk7Ci0gICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5
bGUgKik7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFy
ZW5hICosIFJlbmRlclN0eWxlICopOwotCi0gICAgYm9vbCBub1Jlc2l6ZSgpIHsgcmV0dXJuIG1f
bm9SZXNpemU7IH0KLQotICAgIHZvaWQgc2V0TG9jYXRpb24oY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgaXNGb2N1c2FibGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0
Rm9jdXMoYm9vbCk7Ci0KLSAgICBGcmFtZSogY29udGVudEZyYW1lKCkgY29uc3Q7Ci0gICAgRG9j
dW1lbnQqIGNvbnRlbnREb2N1bWVudCgpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBp
c1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0OwotCi0gICAgU2Nyb2xsQmFyTW9k
ZSBzY3JvbGxpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zY3JvbGxpbmc7IH0KLSAgICBpbnQg
Z2V0TWFyZ2luV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21hcmdpbldpZHRoOyB9Ci0gICAgaW50
IGdldE1hcmdpbkhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fbWFyZ2luSGVpZ2h0OyB9Ci0KLSAg
ICBTdHJpbmcgZnJhbWVCb3JkZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lQm9yZGVyKGNv
bnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBsb25nRGVzYygpIGNvbnN0OwotICAgIHZvaWQg
c2V0TG9uZ0Rlc2MoY29uc3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG1hcmdpbkhlaWdodCgp
IGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KGNvbnN0IFN0cmluZyAmKTsKLQotICAg
IFN0cmluZyBtYXJnaW5XaWR0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0TWFyZ2luV2lkdGgoY29u
c3QgU3RyaW5nICYpOwotCi0gICAgU3RyaW5nIG5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldE5h
bWUoY29uc3QgU3RyaW5nICYpOwotCi0gICAgdm9pZCBzZXROb1Jlc2l6ZShib29sKTsKLQotICAg
IFN0cmluZyBzY3JvbGxpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldFNjcm9sbGluZyhjb25zdCBT
dHJpbmcgJik7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZyBzcmMoKSBjb25zdDsKLSAgICB2b2lkIHNl
dFNyYyhjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBpbnQgZnJhbWVXaWR0aCgpIGNvbnN0OwotICAg
IGludCBmcmFtZUhlaWdodCgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBpc1VSTEFs
bG93ZWQoY29uc3QgQXRvbWljU3RyaW5nICYpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBvcGVu
VVJMKCk7Ci0KLSAgICBBdG9taWNTdHJpbmcgbV9VUkw7Ci0gICAgQXRvbWljU3RyaW5nIG1fbmFt
ZTsKLQotICAgIGludCBtX21hcmdpbldpZHRoOwotICAgIGludCBtX21hcmdpbkhlaWdodDsKLSAg
ICBTY3JvbGxCYXJNb2RlIG1fc2Nyb2xsaW5nOwotCi0gICAgYm9vbCBtX2ZyYW1lQm9yZGVyIDog
MTsKLSAgICBib29sIG1fZnJhbWVCb3JkZXJTZXQgOiAxOwotICAgIGJvb2wgbV9ub1Jlc2l6ZSA6
IDE7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIGNsYXNzIEhUTUxGcmFtZVNldEVsZW1l
bnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKIHsKICAgICBmcmllbmQgY2xhc3MgUmVuZGVyRnJhbWVT
ZXQ7CiBwdWJsaWM6Ci0gICAgSFRNTEZyYW1lU2V0RWxlbWVudChEb2N1bWVudCAqZG9jKTsKKyAg
ICBIVE1MRnJhbWVTZXRFbGVtZW50KERvY3VtZW50Kik7CiAgICAgfkhUTUxGcmFtZVNldEVsZW1l
bnQoKTsKIAogICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNv
bnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9CiAgICAgdmlydHVhbCBpbnQgdGFnUHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiAxMDsgfQogICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChj
b25zdCBOb2RlKiBuZXdDaGlsZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRy
aWJ1dGUoTWFwcGVkQXR0cmlidXRlICopOworICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0g
ICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKik7Ci0gICAgdmly
dHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hICosIFJlbmRlclN0
eWxlICopOworICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0eWxlKik7
CisgICAgdmlydHVhbCBSZW5kZXJPYmplY3QgKmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwg
UmVuZGVyU3R5bGUqKTsKIAotICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2
ZW50ICpldnQpOworICAgIHZpcnR1YWwgdm9pZCBkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50Kik7
CiAKICAgICBib29sIGZyYW1lQm9yZGVyKCkgeyByZXR1cm4gZnJhbWVib3JkZXI7IH0KICAgICBi
b29sIG5vUmVzaXplKCkgeyByZXR1cm4gbm9yZXNpemU7IH0KQEAgLTE5MSwxMCArNTgsMTAgQEAg
cHVibGljOgogICAgIHZpcnR1YWwgdm9pZCByZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2ggKTsK
ICAgICAKICAgICBTdHJpbmcgY29scygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q29scyhjb25zdCBT
dHJpbmcgJik7CisgICAgdm9pZCBzZXRDb2xzKGNvbnN0IFN0cmluZyYpOwogCiAgICAgU3RyaW5n
IHJvd3MoKSBjb25zdDsKLSAgICB2b2lkIHNldFJvd3MoY29uc3QgU3RyaW5nICYpOworICAgIHZv
aWQgc2V0Um93cyhjb25zdCBTdHJpbmcmKTsKIAogcHJvdGVjdGVkOgogICAgIExlbmd0aCogbV9y
b3dzOwpAQCAtMjA5LDgzICs3Niw2IEBAIHByb3RlY3RlZDoKICAgICBib29sIG5vcmVzaXplIDog
MTsKIH07CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTEhlYWRFbGVtZW50IDog
cHVibGljIEhUTUxFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTEhlYWRFbGVtZW50KERvY3Vt
ZW50ICpkb2MpOwotICAgIH5IVE1MSGVhZEVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRh
Z1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlv
bmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiAxMDsg
fQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCk7Ci0KLSAg
ICBTdHJpbmcgcHJvZmlsZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0UHJvZmlsZShjb25zdCBTdHJp
bmcgJik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxIdG1sRWxlbWVu
dCA6IHB1YmxpYyBIVE1MRWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxIdG1sRWxlbWVudChE
b2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTEh0bWxFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhU
TUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNS
ZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4g
MTE7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpOwot
Ci0gICAgU3RyaW5nIHZlcnNpb24oKSBjb25zdDsKLSAgICB2b2lkIHNldFZlcnNpb24oY29uc3Qg
U3RyaW5nICYpOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxJRnJh
bWVFbGVtZW50IDogcHVibGljIEhUTUxGcmFtZUVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1M
SUZyYW1lRWxlbWVudChEb2N1bWVudCAqZG9jKTsKLSAgICB+SFRNTElGcmFtZUVsZW1lbnQoKTsK
LQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsg
cmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHko
KSBjb25zdCB7IHJldHVybiAxOyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZSAqYXR0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgaW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKTsK
LSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlZEZyb21Eb2N1bWVudCgpOwotCi0gICAgdmlydHVhbCB2
b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKFJlbmRlclN0
eWxlICopOwotICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0ICpjcmVhdGVSZW5kZXJlcihSZW5kZXJB
cmVuYSAqLCBSZW5kZXJTdHlsZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0
eWxlQ2hhbmdlIGNoICk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0
dHJpYnV0ZSAqYXR0cikgY29uc3Q7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2
b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyAmKTsKLQotICAgIFN0cmluZyBoZWlnaHQoKSBjb25z
dDsKLSAgICB2b2lkIHNldEhlaWdodChjb25zdCBTdHJpbmcgJik7Ci0KLSAgICBTdHJpbmcgd2lk
dGgoKSBjb25zdDsKLSAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyAmKTsKLQotICAgIHZp
cnR1YWwgU3RyaW5nIHNyYygpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lk
IG9wZW5VUkwoKTsKLQotICAgIGJvb2wgbmVlZFdpZGdldFVwZGF0ZTsKLQotIHByaXZhdGU6Ci0g
ICAgU3RyaW5nIG9sZE5hbWVBdHRyOwotfTsKLQogfSAvL25hbWVzcGFjZQogCiAjZW5kaWYKSW5k
ZXg6IGh0bWwvSFRNTEJvZHlFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxCb2R5
RWxlbWVudC5jcHAJKHJldmlzaW9uIDE0MzI1KQorKysgaHRtbC9IVE1MQm9keUVsZW1lbnQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yMiwzMSArMjIsMjUgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3Rv
biwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KICNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sX2Jhc2VpbXBsLmgiCisjaW5jbHVkZSAiSFRN
TEJvZHlFbGVtZW50LmgiCiAKKyNpbmNsdWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIKICNpbmNs
dWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCisjaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgog
I2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgogI2lu
Y2x1ZGUgIkV2ZW50TmFtZXMuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1l
VHJlZS5oIgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5o
IgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJj
c3Nfc3R5bGVzaGVldGltcGwuaCIKICNpbmNsdWRlICJjc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJj
c3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVk
ZSAicmVuZGVyX2ZyYW1lcy5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVz
cGFjZSBFdmVudE5hbWVzOwogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotSFRNTEJvZHlF
bGVtZW50OjpIVE1MQm9keUVsZW1lbnQoRG9jdW1lbnQgKmRvYykKK0hUTUxCb2R5RWxlbWVudDo6
SFRNTEJvZHlFbGVtZW50KERvY3VtZW50KiBkb2MpCiAgICAgOiBIVE1MRWxlbWVudChib2R5VGFn
LCBkb2MpCiB7CiB9CkBAIC0xMTcsOCArMTExLDcgQEAgdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnBh
cnNlTWFwcGVkQXR0cmlidQogICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnJlc2V0VmlzaXRl
ZExpbmtDb2xvcigpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGRvY3VtZW50
KCktPnJlc2V0QWN0aXZlTGlua0NvbG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Cisg
ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoIW1fbGlua0RlY2wpCiAgICAgICAgICAg
ICAgICAgY3JlYXRlTGlua0RlY2woKTsKICAgICAgICAgICAgIG1fbGlua0RlY2wtPnNldFByb3Bl
cnR5KENTU19QUk9QX0NPTE9SLCBhdHRyLT52YWx1ZSgpLCBmYWxzZSwgZmFsc2UpOwpAQCAtMjM1
LDcyMSArMjI4LDQgQEAgdm9pZCBIVE1MQm9keUVsZW1lbnQ6OnNldFZMaW5rKGNvbnN0IFN0cgog
ICAgIHNldEF0dHJpYnV0ZSh2bGlua0F0dHIsIHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1IVE1MRnJhbWVFbGVtZW50OjpIVE1MRnJhbWVFbGVtZW50KERvY3VtZW50ICpkb2Mp
Ci0gICAgOiBIVE1MRWxlbWVudChmcmFtZVRhZywgZG9jKQotewotICAgIGluaXQoKTsKLX0KLQot
SFRNTEZyYW1lRWxlbWVudDo6SFRNTEZyYW1lRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lLCBEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQodGFnTmFtZSwgZG9jKQot
ewotICAgIGluaXQoKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVtZW50Ojppbml0KCkKLXsKLSAg
ICBtX2ZyYW1lQm9yZGVyID0gdHJ1ZTsKLSAgICBtX2ZyYW1lQm9yZGVyU2V0ID0gZmFsc2U7Ci0g
ICAgbV9tYXJnaW5XaWR0aCA9IC0xOwotICAgIG1fbWFyZ2luSGVpZ2h0ID0gLTE7Ci0gICAgbV9z
Y3JvbGxpbmcgPSBTY3JvbGxCYXJBdXRvOwotICAgIG1fbm9SZXNpemUgPSBmYWxzZTsKLX0KLQot
SFRNTEZyYW1lRWxlbWVudDo6fkhUTUxGcmFtZUVsZW1lbnQoKQotewotfQotCi1ib29sIEhUTUxG
cmFtZUVsZW1lbnQ6OmlzVVJMQWxsb3dlZChjb25zdCBBdG9taWNTdHJpbmcgJlVSTFN0cmluZykg
Y29uc3QKLXsKLSAgICBpZiAoVVJMU3RyaW5nLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgCi0gICAgRnJhbWVWaWV3ICp3ID0gZG9jdW1lbnQoKS0+dmlldygpOwotICAgIGlm
ICghdykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgS1VSTCBuZXdVUkwoZG9jdW1lbnQo
KS0+Y29tcGxldGVVUkwoVVJMU3RyaW5nLmRlcHJlY2F0ZWRTdHJpbmcoKSkpOwotICAgIG5ld1VS
TC5zZXRSZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0KLSAgICAvLyBEb24ndCBhbGxvdyBt
b3JlIHRoYW4gMTAwMCB0b3RhbCBmcmFtZXMgaW4gYSBzZXQuIFRoaXMgc2VlbXMKLSAgICAvLyBs
aWtlIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgYW5kIG90aGVyd2lzZSBtdXR1YWxseSByZWN1
cnNpdmUKLSAgICAvLyBmcmFtZXNldCBwYWdlcyBjYW4gcXVpY2tseSBicmluZyB0aGUgcHJvZ3Jh
bSB0byBpdHMga25lZXMgd2l0aAotICAgIC8vIGV4cG9uZW50aWFsIGdyb3d0aCBpbiB0aGUgbnVt
YmVyIG9mIGZyYW1lcy4KLQotICAgIC8vIEZJWE1FOiBUaGlzIGxpbWl0IGNvdWxkIGJlIGhpZ2hl
ciwgYnV0IFdlYktpdCBoYXMgc29tZQotICAgIC8vIGFsZ29yaXRobXMgdGhhdCBoYXBwZW4gd2hp
bGUgbG9hZGluZyB3aGljaCBhcHBlYXIgdG8gYmUgTl4yIG9yCi0gICAgLy8gd29yc2UgaW4gdGhl
IG51bWJlciBvZiBmcmFtZXMKLSAgICBpZiAody0+ZnJhbWUoKS0+cGFnZSgpLT5mcmFtZUNvdW50
KCkgPj0gMjAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXZSBh
bGxvdyBvbmUgbGV2ZWwgb2Ygc2VsZi1yZWZlcmVuY2UgYmVjYXVzZSBzb21lIHNpdGVzIGRlcGVu
ZCBvbiB0aGF0LgotICAgIC8vIEJ1dCB3ZSBkb24ndCBhbGxvdyBtb3JlIHRoYW4gb25lLgotICAg
IGJvb2wgZm91bmRTZWxmUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgZm9yIChGcmFtZSAqZnJhbWUg
PSB3LT5mcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewot
ICAgICAgICBLVVJMIGZyYW1lVVJMID0gZnJhbWUtPnVybCgpOwotICAgICAgICBmcmFtZVVSTC5z
ZXRSZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0gICAgICAgIGlmIChmcmFtZVVSTCA9PSBu
ZXdVUkwpIHsKLSAgICAgICAgICAgIGlmIChmb3VuZFNlbGZSZWZlcmVuY2UpIHsKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3VuZFNl
bGZSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6Om9wZW5VUkwoKQotewotICAgIEZyYW1l
VmlldyAqdyA9IGRvY3VtZW50KCktPnZpZXcoKTsKLSAgICBpZiAoIXcpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBBdG9taWNTdHJpbmcgcmVsYXRpdmVVUkwgPSBtX1VSTDsKLSAgICBpZiAo
cmVsYXRpdmVVUkwuaXNFbXB0eSgpKQotICAgICAgICByZWxhdGl2ZVVSTCA9ICJhYm91dDpibGFu
ayI7Ci0KLSAgICAvLyBMb2FkIHRoZSBmcmFtZSBjb250ZW50cy4KLSAgICBGcmFtZSogcGFyZW50
RnJhbWUgPSB3LT5mcmFtZSgpOwotICAgIGlmIChGcmFtZSogY2hpbGRGcmFtZSA9IHBhcmVudEZy
YW1lLT50cmVlKCktPmNoaWxkKG1fbmFtZSkpCi0gICAgICAgIGNoaWxkRnJhbWUtPm9wZW5VUkwo
ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwocmVsYXRpdmVVUkwuZGVwcmVjYXRlZFN0cmluZygpKSk7
Ci0gICAgZWxzZQotICAgICAgICBwYXJlbnRGcmFtZS0+cmVxdWVzdEZyYW1lKHN0YXRpY19jYXN0
PFJlbmRlckZyYW1lICo+KHJlbmRlcmVyKCkpLCByZWxhdGl2ZVVSTCwgbV9uYW1lKTsKLX0KLQot
Ci12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNyY0F0dHIpIHsKLSAgICAg
ICAgc2V0TG9jYXRpb24oV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSkpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGlkQXR0cikgewotICAgICAgICAvLyBJbXBvcnRhbnQg
dG8gY2FsbCB0aHJvdWdoIHRvIGJhc2UgZm9yIHRoZSBpZCBhdHRyaWJ1dGUgc28gdGhlIGhhc0lE
IGJpdCBnZXRzIHNldC4KLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KGF0dHIpOwotICAgICAgICBtX25hbWUgPSBhdHRyLT52YWx1ZSgpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAgICAgIG1fbmFtZSA9IGF0dHItPnZhbHVl
KCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBk
b2Vzbid0IGFjdHVhbGx5IGNoYW5nZSB0aGUgZnJhbWUncyBuYW1lLgotICAgICAgICAvLyBGSVhN
RTogSWYgd2UgYXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgZG9lc24ndCBjaGVjayBmb3IgZnJh
bWUgbmFtZQotICAgICAgICAvLyBjb25mbGljdHMgYW5kIGdlbmVyYXRlIGEgdW5pcXVlIGZyYW1l
IG5hbWUuCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVib3JkZXJBdHRyKSB7
Ci0gICAgICAgIG1fZnJhbWVCb3JkZXIgPSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAg
IG1fZnJhbWVCb3JkZXJTZXQgPSAhYXR0ci0+aXNOdWxsKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBJ
ZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMgbm8gZWZmZWN0LgotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IG1hcmdpbndpZHRoQXR0cikgewotICAgICAgICBtX21hcmdp
bldpZHRoID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAvLyBGSVhNRTogSWYgd2Ug
YXJlIGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBtYXJnaW5oZWlnaHRBdHRyKSB7Ci0gICAgICAgIG1fbWFyZ2luSGVp
Z2h0ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAvLyBGSVhNRTogSWYgd2UgYXJl
IGFscmVhZHkgYXR0YWNoZWQsIHRoaXMgaGFzIG5vIGVmZmVjdC4KLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBub3Jlc2l6ZUF0dHIpIHsKLSAgICAgICAgbV9ub1Jlc2l6ZSA9IHRydWU7
Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMg
bm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHNjcm9sbGluZ0F0dHIp
IHsKLSAgICAgICAgLy8gQXV0byBhbmQgeWVzIGJvdGggc2ltcGx5IG1lYW4gImFsbG93IHNjcm9s
bGluZy4iIE5vIG1lYW5zICJkb24ndCBhbGxvdyBzY3JvbGxpbmcuIgotICAgICAgICBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoYXR0ci0+dmFsdWUoKSwgImF1dG8iKSB8fCBlcXVhbElnbm9yaW5nQ2Fz
ZShhdHRyLT52YWx1ZSgpLCAieWVzIikpCi0gICAgICAgICAgICBtX3Njcm9sbGluZyA9IFNjcm9s
bEJhckF1dG87Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGF0dHItPnZhbHVl
KCksICJubyIpKQotICAgICAgICAgICAgbV9zY3JvbGxpbmcgPSBTY3JvbGxCYXJBbHdheXNPZmY7
Ci0gICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBhcmUgYWxyZWFkeSBhdHRhY2hlZCwgdGhpcyBoYXMg
bm8gZWZmZWN0LgotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG9ubG9hZEF0dHIpIHsK
LSAgICAgICAgc2V0SFRNTEV2ZW50TGlzdGVuZXIobG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmJlZm9yZXVubG9hZEF0dHIpIHsKLSAgICAgICAgLy8g
RklYTUU6IHNob3VsZCA8ZnJhbWU+IGVsZW1lbnRzIGhhdmUgYmVmb3JldW5sb2FkIGhhbmRsZXJz
PwotICAgICAgICBzZXRIVE1MRXZlbnRMaXN0ZW5lcihiZWZvcmV1bmxvYWRFdmVudCwgYXR0cik7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb251bmxvYWRBdHRyKSB7Ci0gICAgICAg
IHNldEhUTUxFdmVudExpc3RlbmVyKHVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1ib29s
IEhUTUxGcmFtZUVsZW1lbnQ6OnJlbmRlcmVySXNOZWVkZWQoUmVuZGVyU3R5bGUgKnN0eWxlKQot
ewotICAgIC8vIElnbm9yZSBkaXNwbGF5OiBub25lLgotICAgIHJldHVybiBpc1VSTEFsbG93ZWQo
bV9VUkwpOwotfQotCi1SZW5kZXJPYmplY3QgKkhUTUxGcmFtZUVsZW1lbnQ6OmNyZWF0ZVJlbmRl
cmVyKFJlbmRlckFyZW5hICphcmVuYSwgUmVuZGVyU3R5bGUgKnN0eWxlKQotewotICAgIHJldHVy
biBuZXcgKGFyZW5hKSBSZW5kZXJGcmFtZSh0aGlzKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVt
ZW50OjphdHRhY2goKQotewotICAgIG1fbmFtZSA9IGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci0g
ICAgaWYgKG1fbmFtZS5pc051bGwoKSkKLSAgICAgICAgbV9uYW1lID0gZ2V0QXR0cmlidXRlKGlk
QXR0cik7Ci0KLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBwYXJlbnQgZnJh
bWVzZXQKLSAgICBmb3IgKE5vZGUgKm5vZGUgPSBwYXJlbnROb2RlKCk7IG5vZGU7IG5vZGUgPSBu
b2RlLT5wYXJlbnROb2RlKCkpCi0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0
VGFnKSkgewotICAgICAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0
aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICBpZiAoIW1f
ZnJhbWVCb3JkZXJTZXQpCi0gICAgICAgICAgICAgICAgbV9mcmFtZUJvcmRlciA9IGZyYW1lc2V0
LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAgICAgaWYgKCFtX25vUmVzaXplKQotICAgICAgICAg
ICAgICAgIG1fbm9SZXNpemUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0KLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0KLSAgICBpZiAo
IXJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3Vt
ZW50KCktPmZyYW1lKCk7Ci0KLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBmcmFtZS0+cGFnZSgpLT5pbmNyZW1lbnRGcmFtZUNvdW50KCk7Ci0gICAgCi0gICAgQXRvbWlj
U3RyaW5nIHJlbGF0aXZlVVJMID0gbV9VUkw7Ci0gICAgaWYgKHJlbGF0aXZlVVJMLmlzRW1wdHko
KSkKLSAgICAgICAgcmVsYXRpdmVVUkwgPSAiYWJvdXQ6YmxhbmsiOwotCi0gICAgbV9uYW1lID0g
ZnJhbWUtPnRyZWUoKS0+dW5pcXVlQ2hpbGROYW1lKG1fbmFtZSk7Ci0KLSAgICAvLyBsb2FkIHRo
ZSBmcmFtZSBjb250ZW50cwotICAgIGZyYW1lLT5yZXF1ZXN0RnJhbWUoc3RhdGljX2Nhc3Q8UmVu
ZGVyRnJhbWUqPihyZW5kZXJlcigpKSwgcmVsYXRpdmVVUkwsIG1fbmFtZSk7Ci19Ci0KLXZvaWQg
SFRNTEZyYW1lRWxlbWVudDo6Y2xvc2UoKQotewotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50
KCktPmZyYW1lKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgZnJhbWUpIHsKLSAgICAgICAgZnJh
bWUtPnBhZ2UoKS0+ZGVjcmVtZW50RnJhbWVDb3VudCgpOwotICAgICAgICBpZiAoRnJhbWUqIGNo
aWxkRnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5jaGlsZChtX25hbWUpKQotICAgICAgICAgICAgY2hp
bGRGcmFtZS0+ZnJhbWVEZXRhY2hlZCgpOwotICAgIH0KLX0KLQotdm9pZCBIVE1MRnJhbWVFbGVt
ZW50Ojp3aWxsUmVtb3ZlKCkKLXsKLSAgICAvLyBjbG9zZSB0aGUgZnJhbWUgYW5kIGRpc3NvY2lh
dGUgdGhlIHJlbmRlcmVyLCBidXQgbGVhdmUgdGhlCi0gICAgLy8gbm9kZSBhdHRhY2hlZCBzbyB0
aGF0IGZyYW1lIGRvZXMgbm90IGdldCByZS1hdHRhY2hlZCBiZWZvcmUKLSAgICAvLyBhY3R1YWxs
eSBsZWF2aW5nIHRoZSBkb2N1bWVudC4gIHNlZSA8cmRhcjovL3Byb2JsZW0vNDEzMjU4MT4KLSAg
ICBjbG9zZSgpOwotICAgIGlmIChyZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPmRl
c3Ryb3koKTsKLSAgICAgICAgc2V0UmVuZGVyZXIoMCk7Ci0gICAgfQotICAgIAotICAgIEhUTUxF
bGVtZW50Ojp3aWxsUmVtb3ZlKCk7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6ZGV0YWNo
KCkKLXsKLSAgICBjbG9zZSgpOwotICAgIEhUTUxFbGVtZW50OjpkZXRhY2goKTsKLX0KLQotdm9p
ZCBIVE1MRnJhbWVFbGVtZW50OjpzZXRMb2NhdGlvbihjb25zdCBTdHJpbmcmIHN0cikKLXsKLSAg
ICBtX1VSTCA9IEF0b21pY1N0cmluZyhzdHIpOwotCi0gICAgaWYgKCFhdHRhY2hlZCgpKSB7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8gSGFuZGxlIHRoZSBjb21tb24gY2Fz
ZSB3aGVyZSB3ZSBkZWNpZGVkIG5vdCB0byBtYWtlIGEgZnJhbWUgdGhlIGZpcnN0IHRpbWUuCi0g
ICAgLy8gRGV0YWNoIGFuZCB0aGUgbGV0IGF0dGFjaCgpIGRlY2lkZSBhZ2FpbiB3aGV0aGVyIHRv
IG1ha2UgdGhlIGZyYW1lIGZvciB0aGlzIFVSTC4KLSAgICBpZiAoIXJlbmRlcmVyKCkpIHsKLSAg
ICAgICAgZGV0YWNoKCk7Ci0gICAgICAgIGF0dGFjaCgpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIAotICAgIGlmICghaXNVUkxBbGxvd2VkKG1fVVJMKSkgewotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgb3BlblVSTCgpOwotfQotCi1ib29sIEhUTUxGcmFtZUVsZW1lbnQ6Omlz
Rm9jdXNhYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVuZGVyZXIoKTsKLX0KLQotdm9pZCBI
VE1MRnJhbWVFbGVtZW50OjpzZXRGb2N1cyhib29sIHJlY2VpdmVkKQotewotICAgIEhUTUxFbGVt
ZW50OjpzZXRGb2N1cyhyZWNlaXZlZCk7Ci0gICAgV2ViQ29yZTo6UmVuZGVyRnJhbWUgKnJlbmRl
ckZyYW1lID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6UmVuZGVyRnJhbWUgKj4ocmVuZGVyZXIoKSk7
Ci0gICAgaWYgKCFyZW5kZXJGcmFtZSB8fCAhcmVuZGVyRnJhbWUtPndpZGdldCgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgaWYgKHJlY2VpdmVkKQotICAgICAgICByZW5kZXJGcmFtZS0+d2lkZ2V0
KCktPnNldEZvY3VzKCk7Ci0gICAgZWxzZQotICAgICAgICByZW5kZXJGcmFtZS0+d2lkZ2V0KCkt
PmNsZWFyRm9jdXMoKTsKLX0KLQotRnJhbWUqIEhUTUxGcmFtZUVsZW1lbnQ6OmNvbnRlbnRGcmFt
ZSgpIGNvbnN0Ci17Ci0gICAgLy8gU3RhcnQgd2l0aCB0aGUgcGFydCB0aGF0IGNvbnRhaW5zIHRo
aXMgZWxlbWVudCwgb3VyIG93bmVyRG9jdW1lbnQuCi0gICAgRnJhbWUqIHBhcmVudEZyYW1lID0g
ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKLSAgICBpZiAoIXBhcmVudEZyYW1lKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIC8vIEZpbmQgdGhlIHBhcnQgZm9yIHRoZSBzdWJmcmFtZSB0aGF0IHRoaXMg
ZWxlbWVudCByZXByZXNlbnRzLgotICAgIHJldHVybiBwYXJlbnRGcmFtZS0+dHJlZSgpLT5jaGls
ZChtX25hbWUpOwotfQotCi1Eb2N1bWVudCogSFRNTEZyYW1lRWxlbWVudDo6Y29udGVudERvY3Vt
ZW50KCkgY29uc3QKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBjb250ZW50RnJhbWUoKTsKLSAgICBp
ZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZnJhbWUtPmRvY3VtZW50
KCk7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRl
ICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gc3JjQXR0cjsKLX0K
LQotU3RyaW5nIEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lQm9yZGVyKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKGZyYW1lYm9yZGVyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1l
RWxlbWVudDo6c2V0RnJhbWVCb3JkZXIoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoZnJhbWVib3JkZXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVF
bGVtZW50Ojpsb25nRGVzYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShsb25n
ZGVzY0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldExvbmdEZXNjKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGxvbmdkZXNjQXR0ciwgdmFsdWUp
OwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6bWFyZ2luSGVpZ2h0KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG1hcmdpbmhlaWdodEF0dHIpOwotfQotCi12b2lkIEhU
TUxGcmFtZUVsZW1lbnQ6OnNldE1hcmdpbkhlaWdodChjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShtYXJnaW5oZWlnaHRBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBI
VE1MRnJhbWVFbGVtZW50OjptYXJnaW5XaWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShtYXJnaW53aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNl
dE1hcmdpbldpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG1h
cmdpbndpZHRoQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVudDo6bmFt
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShuYW1lQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0TmFtZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShuYW1lQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1l
bnQ6OnNldE5vUmVzaXplKGJvb2wgbm9SZXNpemUpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5vcmVz
aXplQXR0ciwgbm9SZXNpemUgPyAiIiA6IDApOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lRWxlbWVu
dDo6c2Nyb2xsaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHNjcm9sbGlu
Z0F0dHIpOwotfQotCi12b2lkIEhUTUxGcmFtZUVsZW1lbnQ6OnNldFNjcm9sbGluZyhjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzY3JvbGxpbmdBdHRyLCB2YWx1ZSk7
Ci19Ci0KLVN0cmluZyBIVE1MRnJhbWVFbGVtZW50OjpzcmMoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoc3JjQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lRWxlbWVudDo6c2V0
U3JjKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNyY0F0dHIsIHZh
bHVlKTsKLX0KLQotaW50IEhUTUxGcmFtZUVsZW1lbnQ6OmZyYW1lV2lkdGgoKSBjb25zdAotewot
ICAgIGlmICghcmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgZG9jdW1l
bnQoKS0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7Ci0gICAgcmV0dXJu
IHJlbmRlcmVyKCktPndpZHRoKCk7Ci19Ci0KLWludCBIVE1MRnJhbWVFbGVtZW50OjpmcmFtZUhl
aWdodCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFyZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gMDsK
LSAgICAKLSAgICBkb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVl
dHMoKTsKLSAgICByZXR1cm4gcmVuZGVyZXIoKS0+aGVpZ2h0KCk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotSFRNTEZyYW1lU2V0RWxlbWVudDo6SFRNTEZyYW1lU2V0RWxlbWVudChEb2N1
bWVudCAqZG9jKQotICAgIDogSFRNTEVsZW1lbnQoZnJhbWVzZXRUYWcsIGRvYykKLXsKLSAgICAv
LyBkZWZhdWx0IHZhbHVlIGZvciByb3dzIGFuZCBjb2xzLi4uCi0gICAgbV90b3RhbFJvd3MgPSAx
OwotICAgIG1fdG90YWxDb2xzID0gMTsKLQotICAgIG1fcm93cyA9IG1fY29scyA9IDA7Ci0KLSAg
ICBmcmFtZWJvcmRlciA9IHRydWU7Ci0gICAgZnJhbWVCb3JkZXJTZXQgPSBmYWxzZTsKLSAgICBt
X2JvcmRlciA9IDQ7Ci0gICAgbm9yZXNpemUgPSBmYWxzZTsKLX0KLQotSFRNTEZyYW1lU2V0RWxl
bWVudDo6fkhUTUxGcmFtZVNldEVsZW1lbnQoKQotewotICAgIGlmIChtX3Jvd3MpCi0gICAgICAg
IGRlbGV0ZSBbXSBtX3Jvd3M7Ci0gICAgaWYgKG1fY29scykKLSAgICAgICAgZGVsZXRlIFtdIG1f
Y29sczsKLX0KLQotYm9vbCBIVE1MRnJhbWVTZXRFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2Rl
KiBuZXdDaGlsZCkKLXsKLSAgICAvLyBGSVhNRTogT2xkIGNvZGUgaGFkIGFkamFjZW50IGRvdWJs
ZSByZXR1cm5zIGFuZCBzZWVtZWQgdG8gd2FudCB0byBkbyBzb21ldGhpbmcgd2l0aCBOT0ZSQU1F
UyAoYnV0IGRpZG4ndCkuCi0gICAgLy8gV2hhdCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvcj8KLSAg
ICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpIHx8IG5ld0NoaWxkLT5o
YXNUYWdOYW1lKGZyYW1lVGFnKTsKLX0KLQotdm9pZCBIVE1MRnJhbWVTZXRFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHIt
Pm5hbWUoKSA9PSByb3dzQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPmlzTnVsbCgpKSB7Ci0g
ICAgICAgICAgICBpZiAobV9yb3dzKSBkZWxldGUgW10gbV9yb3dzOwotICAgICAgICAgICAgbV9y
b3dzID0gYXR0ci0+dmFsdWUoKS50b0xlbmd0aEFycmF5KG1fdG90YWxSb3dzKTsKLSAgICAgICAg
ICAgIHNldENoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGNvbHNBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAgICAg
ICAgIGRlbGV0ZSBbXSBtX2NvbHM7Ci0gICAgICAgICAgICBtX2NvbHMgPSBhdHRyLT52YWx1ZSgp
LnRvTGVuZ3RoQXJyYXkobV90b3RhbENvbHMpOwotICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOwot
ICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVib3JkZXJBdHRy
KSB7Ci0gICAgICAgIC8vIGZhbHNlIG9yICJubyIgb3IgIjAiLi4KLSAgICAgICAgaWYgKCBhdHRy
LT52YWx1ZSgpLnRvSW50KCkgPT0gMCApIHsKLSAgICAgICAgICAgIGZyYW1lYm9yZGVyID0gZmFs
c2U7Ci0gICAgICAgICAgICBtX2JvcmRlciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhbWVC
b3JkZXJTZXQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5vcmVzaXpl
QXR0cikgewotICAgICAgICBub3Jlc2l6ZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gYm9yZGVyQXR0cikgewotICAgICAgICBtX2JvcmRlciA9IGF0dHItPnZhbHVlKCku
dG9JbnQoKTsKLSAgICAgICAgaWYoIW1fYm9yZGVyKQotICAgICAgICAgICAgZnJhbWVib3JkZXIg
PSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbmxvYWRBdHRyKSB7Ci0g
ICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGxvYWRFdmVudCwg
YXR0cik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gb25iZWZvcmV1bmxvYWRBdHRy
KSB7Ci0gICAgICAgIGRvY3VtZW50KCktPnNldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGJlZm9y
ZXVubG9hZEV2ZW50LCBhdHRyKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBvbnVu
bG9hZEF0dHIpIHsKLSAgICAgICAgZG9jdW1lbnQoKS0+c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVu
ZXIodW5sb2FkRXZlbnQsIGF0dHIpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6
cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLWJvb2wgSFRNTEZyYW1lU2V0RWxlbWVu
dDo6cmVuZGVyZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgLy8gSWdub3Jl
IGRpc3BsYXk6IG5vbmUgYnV0IGRvIHBheSBhdHRlbnRpb24gaWYgYSBzdHlsZXNoZWV0IGhhcyBj
YXVzZWQgdXMgdG8gZGVsYXkgb3VyIGxvYWRpbmcuCi0gICAgcmV0dXJuIHN0eWxlLT5pc1N0eWxl
QXZhaWxhYmxlKCk7Ci19Ci0KLVJlbmRlck9iamVjdCAqSFRNTEZyYW1lU2V0RWxlbWVudDo6Y3Jl
YXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0g
ICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlckZyYW1lU2V0KHRoaXMpOwotfQotCi12b2lkIEhU
TUxGcmFtZVNldEVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IHNl
dHRpbmdzIGZyb20gcGFyZW50IGZyYW1lc2V0Ci0gICAgSFRNTEVsZW1lbnQqIG5vZGUgPSBzdGF0
aWNfY2FzdDxIVE1MRWxlbWVudCo+KHBhcmVudE5vZGUoKSk7Ci0gICAgd2hpbGUobm9kZSkKLSAg
ICB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkgewotICAgICAg
ICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVzZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJh
bWVTZXRFbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICBpZighZnJhbWVCb3JkZXJTZXQpICBm
cmFtZWJvcmRlciA9IGZyYW1lc2V0LT5mcmFtZUJvcmRlcigpOwotICAgICAgICAgICAgaWYoIW5v
cmVzaXplKSAgbm9yZXNpemUgPSBmcmFtZXNldC0+bm9SZXNpemUoKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBzdGF0aWNfY2FzdDxIVE1MRWxlbWVudCo+
KG5vZGUtPnBhcmVudE5vZGUoKSk7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6OmF0dGFjaCgp
OwotfQotCi12b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZl
bnQgKmV2dCkKLXsKLSAgICBpZiAoZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiAhbm9yZXNpemUgJiYg
cmVuZGVyZXIoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpSZW5kZXJGcmFtZVNl
dCAqPihyZW5kZXJlcigpKS0+dXNlclJlc2l6ZShzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0
KSk7Ci0gICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICB9Ci0KLSAgICBIVE1M
RWxlbWVudDo6ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotfQotCi12b2lkIEhUTUxGcmFtZVNl
dEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBTdHlsZUNoYW5nZSBjaCApCi17Ci0gICAgaWYgKGNoYW5n
ZWQoKSAmJiByZW5kZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0
KHRydWUpOwotICAgICAgICBzZXRDaGFuZ2VkKGZhbHNlKTsKLSAgICB9Ci0gICAgSFRNTEVsZW1l
bnQ6OnJlY2FsY1N0eWxlKCBjaCApOwotfQotCi1TdHJpbmcgSFRNTEZyYW1lU2V0RWxlbWVudDo6
Y29scygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjb2xzQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Q29scyhjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShjb2xzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTEZy
YW1lU2V0RWxlbWVudDo6cm93cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShy
b3dzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTEZyYW1lU2V0RWxlbWVudDo6c2V0Um93cyhjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzQXR0ciwgdmFsdWUpOwotfQot
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxIZWFkRWxlbWVudDo6SFRNTEhlYWRFbGVtZW50
KERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MRWxlbWVudChoZWFkVGFnLCBkb2MpCi17Ci19Ci0K
LUhUTUxIZWFkRWxlbWVudDo6fkhUTUxIZWFkRWxlbWVudCgpCi17Ci19Ci0KLVN0cmluZyBIVE1M
SGVhZEVsZW1lbnQ6OnByb2ZpbGUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
cHJvZmlsZUF0dHIpOwotfQotCi12b2lkIEhUTUxIZWFkRWxlbWVudDo6c2V0UHJvZmlsZShjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShwcm9maWxlQXR0ciwgdmFsdWUp
OwotfQotCi1ib29sIEhUTUxIZWFkRWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hp
bGQpCi17Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRpdGxlVGFnKSB8fCBuZXdD
aGlsZC0+aGFzVGFnTmFtZShpc2luZGV4VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFz
VGFnTmFtZShiYXNlVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpIHx8Ci0g
ICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHN0eWxlVGFnKSB8fCBuZXdDaGlsZC0+aGFz
VGFnTmFtZShtZXRhVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShsaW5r
VGFnKSB8fCBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLUhUTUxIdG1sRWxlbWVudDo6SFRNTEh0bWxFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gICAg
OiBIVE1MRWxlbWVudChodG1sVGFnLCBkb2MpCi17Ci19Ci0KLUhUTUxIdG1sRWxlbWVudDo6fkhU
TUxIdG1sRWxlbWVudCgpCi17Ci19Ci0KLVN0cmluZyBIVE1MSHRtbEVsZW1lbnQ6OnZlcnNpb24o
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmVyc2lvbkF0dHIpOwotfQotCi12
b2lkIEhUTUxIdG1sRWxlbWVudDo6c2V0VmVyc2lvbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZSh2ZXJzaW9uQXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhUTUxIdG1s
RWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgLy8gRklYTUU6
IFdoeSBpcyA8c2NyaXB0PiBhbGxvd2VkIGhlcmU/Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNU
YWdOYW1lKGhlYWRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGJvZHlUYWcpIHx8Ci0gICAg
ICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSB8fCBuZXdDaGlsZC0+aGFz
VGFnTmFtZShub2ZyYW1lc1RhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
c2NyaXB0VGFnKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MSUZyYW1lRWxlbWVu
dDo6SFRNTElGcmFtZUVsZW1lbnQoRG9jdW1lbnQgKmRvYykgOiBIVE1MRnJhbWVFbGVtZW50KGlm
cmFtZVRhZywgZG9jKQotewotICAgIG1fZnJhbWVCb3JkZXIgPSBmYWxzZTsKLSAgICBtX21hcmdp
bldpZHRoID0gLTE7Ci0gICAgbV9tYXJnaW5IZWlnaHQgPSAtMTsKLSAgICBuZWVkV2lkZ2V0VXBk
YXRlID0gZmFsc2U7Ci19Ci0KLUhUTUxJRnJhbWVFbGVtZW50Ojp+SFRNTElGcmFtZUVsZW1lbnQo
KQotewotfQotCi1ib29sIEhUTUxJRnJhbWVFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxp
ZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAot
ewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0
cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAg
cmVzdWx0ID0gZVJlcGxhY2VkOyAvLyBTaGFyZSB3aXRoIDxpbWc+IHNpbmNlIHRoZSBhbGlnbm1l
bnQgYmVoYXZpb3IgaXMgdGhlIHNhbWUuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0g
ICAgCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQp
OwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBw
ZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIp
Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUo
KSk7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpCi0gICAgICAgIGFk
ZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpCi0gICAgICAgIGFkZEhUTUxBbGlnbm1l
bnQoYXR0cik7Ci0gICAgZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5hbWVBdHRyKSB7Ci0gICAg
ICAgIFN0cmluZyBuZXdOYW1lQXR0ciA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChpbkRv
Y3VtZW50KCkgJiYgZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICAgICAg
SFRNTERvY3VtZW50ICpkb2MgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oZG9jdW1lbnQo
KSk7Ci0gICAgICAgICAgICBkb2MtPnJlbW92ZURvY0V4dHJhTmFtZWRJdGVtKG9sZE5hbWVBdHRy
KTsKLSAgICAgICAgICAgIGRvYy0+YWRkRG9jRXh0cmFOYW1lZEl0ZW0obmV3TmFtZUF0dHIpOwot
ICAgICAgICB9Ci0gICAgICAgIG9sZE5hbWVBdHRyID0gbmV3TmFtZUF0dHI7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIEhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwot
fQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCi17Ci0g
ICAgaWYgKGRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgSFRNTERvY3Vt
ZW50ICpkb2MgPSBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnQgKj4oZG9jdW1lbnQoKSk7Ci0gICAg
ICAgIGRvYy0+YWRkRG9jRXh0cmFOYW1lZEl0ZW0ob2xkTmFtZUF0dHIpOwotICAgIH0KLQotICAg
IEhUTUxFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpOwotfQotCi12b2lkIEhUTUxJRnJh
bWVFbGVtZW50OjpyZW1vdmVkRnJvbURvY3VtZW50KCkKLXsKLSAgICBpZiAoZG9jdW1lbnQoKS0+
aXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBIVE1MRG9jdW1lbnQgKmRvYyA9IHN0YXRpY19j
YXN0PEhUTUxEb2N1bWVudCAqPihkb2N1bWVudCgpKTsKLSAgICAgICAgZG9jLT5yZW1vdmVEb2NF
eHRyYU5hbWVkSXRlbShvbGROYW1lQXR0cik7Ci0gICAgfQotCi0gICAgSFRNTEVsZW1lbnQ6OnJl
bW92ZWRGcm9tRG9jdW1lbnQoKTsKLX0KLQotYm9vbCBIVE1MSUZyYW1lRWxlbWVudDo6cmVuZGVy
ZXJJc05lZWRlZChSZW5kZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgLy8gRG9uJ3QgaWdub3JlIGRp
c3BsYXk6IG5vbmUgdGhlIHdheSBmcmFtZSBkb2VzLgotICAgIHJldHVybiBpc1VSTEFsbG93ZWQo
bV9VUkwpICYmIHN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORTsKLX0KLQotUmVuZGVyT2JqZWN0ICpI
VE1MSUZyYW1lRWxlbWVudDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEgKmFyZW5hLCBSZW5k
ZXJTdHlsZSAqc3R5bGUpCi17Ci0gICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJlbmRlclBhcnRPYmpl
Y3QodGhpcyk7Ci19Ci0KLXZvaWQgSFRNTElGcmFtZUVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAg
bV9uYW1lID0gZ2V0QXR0cmlidXRlKG5hbWVBdHRyKTsKLSAgICBpZiAobV9uYW1lLmlzTnVsbCgp
KQotICAgICAgICBtX25hbWUgPSBnZXRBdHRyaWJ1dGUoaWRBdHRyKTsKLQotICAgIEhUTUxFbGVt
ZW50OjphdHRhY2goKTsKLQotICAgIEZyYW1lKiBwYXJlbnRGcmFtZSA9IGRvY3VtZW50KCktPmZy
YW1lKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcGFyZW50RnJhbWUpIHsKLSAgICAgICAgcGFy
ZW50RnJhbWUtPnBhZ2UoKS0+aW5jcmVtZW50RnJhbWVDb3VudCgpOwotICAgICAgICBtX25hbWUg
PSBwYXJlbnRGcmFtZS0+dHJlZSgpLT51bmlxdWVDaGlsZE5hbWUobV9uYW1lKTsKLSAgICAgICAg
c3RhdGljX2Nhc3Q8UmVuZGVyUGFydE9iamVjdCo+KHJlbmRlcmVyKCkpLT51cGRhdGVXaWRnZXQo
KTsKLSAgICAgICAgbmVlZFdpZGdldFVwZGF0ZSA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBI
VE1MSUZyYW1lRWxlbWVudDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoICkKLXsKLSAgICBp
ZiAobmVlZFdpZGdldFVwZGF0ZSkgewotICAgICAgICBpZiAocmVuZGVyZXIoKSkKLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlclBhcnRPYmplY3QqPihyZW5kZXJlcigpKS0+dXBkYXRlV2lk
Z2V0KCk7Ci0gICAgICAgIG5lZWRXaWRnZXRVcGRhdGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgSFRN
TEVsZW1lbnQ6OnJlY2FsY1N0eWxlKCBjaCApOwotfQotCi12b2lkIEhUTUxJRnJhbWVFbGVtZW50
OjpvcGVuVVJMKCkKLXsKLSAgICBuZWVkV2lkZ2V0VXBkYXRlID0gdHJ1ZTsKLSAgICBzZXRDaGFu
Z2VkKCk7Ci19Ci0KLWJvb2wgSFRNTElGcmFtZUVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZSAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IHNyY0F0dHI7
Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVu
dDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxp
Z25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxlbWVudDo6aGVpZ2h0KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGhlaWdodEF0dHIpOwotfQotCi12b2lk
IEhUTUxJRnJhbWVFbGVtZW50OjpzZXRIZWlnaHQoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoaGVpZ2h0QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTElGcmFt
ZUVsZW1lbnQ6OnNyYygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRvY3VtZW50KCktPmNvbXBsZXRl
VVJMKGdldEF0dHJpYnV0ZShzcmNBdHRyKSk7Ci19Ci0KLVN0cmluZyBIVE1MSUZyYW1lRWxlbWVu
dDo6d2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsK
LX0KLQotdm9pZCBIVE1MSUZyYW1lRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0KIH0KSW5kZXg6
IGh0bWwvSFRNTEVtYmVkRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MRW1iZWRF
bGVtZW50LmNwcAkocmV2aXNpb24gMTQzMjcpCisrKyBodG1sL0hUTUxFbWJlZEVsZW1lbnQuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yOSw4ICsyOSw3IEBACiAjaW5jbHVkZSAiSFRNTERvY3VtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5j
bHVkZSAicmVuZGVyX2ZyYW1lcy5oIgotI2luY2x1ZGUgInJlbmRlcl9yZXBsYWNlZC5oIgorI2lu
Y2x1ZGUgIlJlbmRlclBhcnRPYmplY3QuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkluZGV4
OiByZW5kZXJpbmcvUmVuZGVyUGFydC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRl
clBhcnQuY3BwCShyZXZpc2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9SZW5kZXJQYXJ0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjIsNTY3ICsyMiwyNCBAQAogICogQm9zdG9uLCBNQSAwMjExMS0x
MzA3LCBVU0EuCiAgKgogICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5k
ZXJfZnJhbWVzLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgogCi0jaW5jbHVkZSAiQ3Vyc29y
LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudE5hbWVzLmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZVRyZWUuaCIKICNpbmNsdWRlICJGcmFtZVZp
ZXcuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0j
aW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUg
Imh0bWxfYmFzZWltcGwuaCIKLSNpbmNsdWRlICJIVE1MRW1iZWRFbGVtZW50LmgiCisjaW5jbHVk
ZSAiSFRNTEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJIVE1M
T2JqZWN0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxQYXJhbUVsZW1lbnQuaCIKLSNpbmNsdWRl
ICJIVE1MVG9rZW5pemVyLmgiCi0jaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRlICJS
ZW5kZXJDYW52YXMuaCIKLSNpbmNsdWRlICJLV1FUZXh0U3RyZWFtLmgiCisjaW5jbHVkZSAiUGFn
ZS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVz
OwogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotUmVuZGVyRnJhbWVTZXQ6OlJlbmRlckZy
YW1lU2V0KCBIVE1MRnJhbWVTZXRFbGVtZW50ICpmcmFtZVNldCkKLSAgICA6IFJlbmRlckNvbnRh
aW5lcihmcmFtZVNldCkKLXsKLSAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAg
IHNldElubGluZShmYWxzZSk7Ci0KLSAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKLSAg
ICAgIG1fZ3JpZExlbltrXSA9IC0xOwotICAgICAgbV9ncmlkRGVsdGFba10gPSAwOwotICAgICAg
bV9ncmlkTGF5b3V0W2tdID0gMDsKLSAgfQotCi0gIG1fcmVzaXppbmcgPSBtX2NsaWVudFJlc2l6
aW5nID0gZmFsc2U7Ci0KLSAgbV9oU3BsaXQgPSAtMTsKLSAgbV92U3BsaXQgPSAtMTsKLQotICBt
X2hTcGxpdFZhciA9IDA7Ci0gIG1fdlNwbGl0VmFyID0gMDsKLX0KLQotUmVuZGVyRnJhbWVTZXQ6
On5SZW5kZXJGcmFtZVNldCgpCi17Ci0gICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsK
LSAgICAgICAgaWYgKG1fZ3JpZExheW91dFtrXSkgZGVsZXRlIFtdIG1fZ3JpZExheW91dFtrXTsK
LSAgICAgICAgaWYgKG1fZ3JpZERlbHRhW2tdKSBkZWxldGUgW10gbV9ncmlkRGVsdGFba107Ci0g
ICAgfQotICBpZiAobV9oU3BsaXRWYXIpCi0gICAgICBkZWxldGUgW10gbV9oU3BsaXRWYXI7Ci0g
IGlmIChtX3ZTcGxpdFZhcikKLSAgICAgIGRlbGV0ZSBbXSBtX3ZTcGxpdFZhcjsKLX0KLQotYm9v
bCBSZW5kZXJGcmFtZVNldDo6bm9kZUF0UG9pbnQoTm9kZUluZm8mIGluZm8sIGludCBfeCwgaW50
IF95LCBpbnQgX3R4LCBpbnQgX3R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
SGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKQotewotICAgIGlmIChoaXRUZXN0QWN0aW9uICE9
IEhpdFRlc3RGb3JlZ3JvdW5kKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGlu
c2lkZSA9IFJlbmRlckNvbnRhaW5lcjo6bm9kZUF0UG9pbnQoaW5mbywgX3gsIF95LCBfdHgsIF90
eSwgaGl0VGVzdEFjdGlvbikgfHwgCi0gICAgICAgICAgICAgICAgICBtX3Jlc2l6aW5nIHx8IGNh
blJlc2l6ZShfeCwgX3kpOwotICAgIGlmIChpbnNpZGUgJiYgZWxlbWVudCgpICYmICFlbGVtZW50
KCktPm5vUmVzaXplKCkgJiYgIWluZm8ucmVhZG9ubHkoKSAmJiAhaW5mby5pbm5lck5vZGUoKSkg
ewotICAgICAgICBpbmZvLnNldElubmVyTm9kZShlbGVtZW50KCkpOwotICAgICAgICBpbmZvLnNl
dElubmVyTm9uU2hhcmVkTm9kZShlbGVtZW50KCkpOwotICAgIH0KLQotICAgIHJldHVybiBpbnNp
ZGUgfHwgbV9jbGllbnRSZXNpemluZzsKLX0KLQotdm9pZCBSZW5kZXJGcmFtZVNldDo6bGF5b3V0
KCApCi17Ci0gICAgS0hUTUxBc3NlcnQoIG5lZWRzTGF5b3V0KCkgKTsKLSAgICBLSFRNTEFzc2Vy
dCggbWluTWF4S25vd24oKSApOwotCi0gICAgaWYgKCAhcGFyZW50KCktPmlzRnJhbWVTZXQoKSAp
IHsKLSAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gY2FudmFzKCktPnZpZXcoKTsKLSAgICAgICAg
bV93aWR0aCA9IHZpZXctPnZpc2libGVXaWR0aCgpOwotICAgICAgICBtX2hlaWdodCA9IHZpZXct
PnZpc2libGVIZWlnaHQoKTsKLSAgICB9Ci0KLSAgICBpbnQgcmVtYWluaW5nTGVuWzJdOwotICAg
IHJlbWFpbmluZ0xlblsxXSA9IG1fd2lkdGggLSAoZWxlbWVudCgpLT50b3RhbENvbHMoKS0xKSpl
bGVtZW50KCktPmJvcmRlcigpOwotICAgIGlmKHJlbWFpbmluZ0xlblsxXTwwKSByZW1haW5pbmdM
ZW5bMV09MDsKLSAgICByZW1haW5pbmdMZW5bMF0gPSBtX2hlaWdodCAtIChlbGVtZW50KCktPnRv
dGFsUm93cygpLTEpKmVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAgaWYocmVtYWluaW5nTGVuWzBd
PDApIHJlbWFpbmluZ0xlblswXT0wOwotCi0gICAgaW50IGF2YWlsYWJsZUxlblsyXTsKLSAgICBh
dmFpbGFibGVMZW5bMF0gPSByZW1haW5pbmdMZW5bMF07Ci0gICAgYXZhaWxhYmxlTGVuWzFdID0g
cmVtYWluaW5nTGVuWzFdOwotCi0gICAgaWYgKG1fZ3JpZExlblswXSAhPSBlbGVtZW50KCktPnRv
dGFsUm93cygpIHx8IG1fZ3JpZExlblsxXSAhPSBlbGVtZW50KCktPnRvdGFsQ29scygpKSB7Ci0g
ICAgICAgIC8vIG51bWJlciBvZiByb3dzIG9yIGNvbHMgY2hhbmdlZAotICAgICAgICAvLyBuZWVk
IHRvIHplcm8gb3V0IHRoZSBkZWx0YXMKLSAgICAgICAgbV9ncmlkTGVuWzBdID0gZWxlbWVudCgp
LT50b3RhbFJvd3MoKTsKLSAgICAgICAgbV9ncmlkTGVuWzFdID0gZWxlbWVudCgpLT50b3RhbENv
bHMoKTsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKLSAgICAgICAgICAg
IGlmIChtX2dyaWREZWx0YVtrXSkgZGVsZXRlIFtdIG1fZ3JpZERlbHRhW2tdOwotICAgICAgICAg
ICAgbV9ncmlkRGVsdGFba10gPSBuZXcgaW50W21fZ3JpZExlbltrXV07Ci0gICAgICAgICAgICBp
ZiAobV9ncmlkTGF5b3V0W2tdKSBkZWxldGUgW10gbV9ncmlkTGF5b3V0W2tdOwotICAgICAgICAg
ICAgbV9ncmlkTGF5b3V0W2tdID0gbmV3IGludFttX2dyaWRMZW5ba11dOwotICAgICAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBtX2dyaWRMZW5ba107ICsraSkKLSAgICAgICAgICAgICAgICBt
X2dyaWREZWx0YVtrXVtpXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBr
ID0gMDsgayA8IDI7ICsraykgewotICAgICAgICBpbnQgdG90YWxSZWxhdGl2ZSA9IDA7Ci0gICAg
ICAgIGludCB0b3RhbEZpeGVkID0gMDsKLSAgICAgICAgaW50IHRvdGFsUGVyY2VudCA9IDA7Ci0g
ICAgICAgIGludCBjb3VudFJlbGF0aXZlID0gMDsKLSAgICAgICAgaW50IGNvdW50Rml4ZWQgPSAw
OwotICAgICAgICBpbnQgY291bnRQZXJjZW50ID0gMDsKLSAgICAgICAgaW50IGdyaWRMZW4gPSBt
X2dyaWRMZW5ba107Ci0gICAgICAgIGludCogZ3JpZERlbHRhID0gbV9ncmlkRGVsdGFba107Ci0g
ICAgICAgIFdlYkNvcmU6Okxlbmd0aCogZ3JpZCA9ICBrID8gZWxlbWVudCgpLT5tX2NvbHMgOiBl
bGVtZW50KCktPm1fcm93czsKLSAgICAgICAgaW50KiBncmlkTGF5b3V0ID0gbV9ncmlkTGF5b3V0
W2tdOwotCi0gICAgICAgIGlmIChncmlkKSB7Ci0gICAgICAgICAgICBhc3NlcnQoZ3JpZExlbik7
Ci0gICAgICAgICAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGludmVzdGlnYXRlIGhvdyBtYW55IGNv
bHVtbnMgb2YgZWFjaCB0eXBlIHdlIGhhdmUgYW5kCi0gICAgICAgICAgICAvLyBob3cgbXVjaCBz
cGFjZSB0aGVzZSBjb2x1bW5zIGFyZSBnb2luZyB0byByZXF1aXJlLgotICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAvLyBDb3Vu
dCB0aGUgdG90YWwgbGVuZ3RoIG9mIGFsbCBvZiB0aGUgZml4ZWQgY29sdW1ucy9yb3dzIC0+IHRv
dGFsRml4ZWQKLSAgICAgICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMv
cm93cyB3aGljaCBhcmUgZml4ZWQgLT4gY291bnRGaXhlZAotICAgICAgICAgICAgICAgIGlmIChn
cmlkW2ldLmlzRml4ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldID0g
bWF4KGdyaWRbaV0udmFsdWUoKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsRml4ZWQg
Kz0gZ3JpZExheW91dFtpXTsKLSAgICAgICAgICAgICAgICAgICAgY291bnRGaXhlZCsrOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDb3Vu
dCB0aGUgdG90YWwgcGVyY2VudGFnZSBvZiBhbGwgb2YgdGhlIHBlcmNlbnRhZ2UgY29sdW1ucy9y
b3dzIC0+IHRvdGFsUGVyY2VudAotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIg
b2YgY29sdW1ucy9yb3dzIHdoaWNoIGFyZSBwZXJjZW50YWdlcyAtPiBjb3VudFBlcmNlbnQKLSAg
ICAgICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc1BlcmNlbnQoKSkgewotICAgICAgICAgICAgICAg
ICAgICBncmlkTGF5b3V0W2ldID0gbWF4KGdyaWRbaV0uY2FsY1ZhbHVlKGF2YWlsYWJsZUxlbltr
XSksIDApOwotICAgICAgICAgICAgICAgICAgICB0b3RhbFBlcmNlbnQgKz0gZ3JpZExheW91dFtp
XTsKLSAgICAgICAgICAgICAgICAgICAgY291bnRQZXJjZW50Kys7Ci0gICAgICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICAgICAgLy8gQ291bnQgdGhlIHRvdGFsIHJlbGF0aXZlIG9mIGFsbCB0
aGUgcmVsYXRpdmUgY29sdW1ucy9yb3dzIC0+IHRvdGFsUmVsYXRpdmUKLSAgICAgICAgICAgICAg
ICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMvcm93cyB3aGljaCBhcmUgcmVsYXRpdmUg
LT4gY291bnRSZWxhdGl2ZQotICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzUmVsYXRpdmUo
KSkgewotICAgICAgICAgICAgICAgICAgICB0b3RhbFJlbGF0aXZlICs9IG1heChncmlkW2ldLnZh
bHVlKCksIDEpOwotICAgICAgICAgICAgICAgICAgICBjb3VudFJlbGF0aXZlKys7Ci0gICAgICAg
ICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBG
aXhlZCBjb2x1bW5zL3Jvd3MgYXJlIG91ciBmaXJzdCBwcmlvcml0eS4gSWYgdGhlcmUgaXMgbm90
IGVub3VnaCBzcGFjZSB0byBmaXQgYWxsIGZpeGVkCi0gICAgICAgICAgICAvLyBjb2x1bW5zL3Jv
d3Mgd2UgbmVlZCB0byBwcm9wb3J0aW9uYWxseSBhZGp1c3QgdGhlaXIgc2l6ZS4gCi0gICAgICAg
ICAgICBpZiAodG90YWxGaXhlZCA+IHJlbWFpbmluZ0xlbltrXSkgewotICAgICAgICAgICAgICAg
IGludCByZW1haW5pbmdGaXhlZCA9IHJlbWFpbmluZ0xlbltrXTsKLQotICAgICAgICAgICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChncmlkW2ldLmlzRml4ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZExh
eW91dFtpXSA9IChncmlkTGF5b3V0W2ldICogcmVtYWluaW5nRml4ZWQpIC8gdG90YWxGaXhlZDsK
LSAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBncmlkTGF5b3V0W2ld
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gdG90YWxGaXhlZDsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUGVyY2VudGFnZSBjb2x1bW5zL3Jvd3Mg
YXJlIG91ciBzZWNvbmQgcHJpb3JpdHkuIERpdmlkZSB0aGUgcmVtYWluaW5nIHNwYWNlIHByb3Bv
cnRpb25hbGx5IAotICAgICAgICAgICAgLy8gb3ZlciBhbGwgcGVyY2VudGFnZSBjb2x1bW5zL3Jv
d3MuIElNUE9SVEFOVDogdGhlIHNpemUgb2YgZWFjaCBjb2x1bW4vcm93IGlzIG5vdCByZWxhdGl2
ZSAKLSAgICAgICAgICAgIC8vIHRvIDEwMCUsIGJ1dCB0byB0aGUgdG90YWwgcGVyY2VudGFnZS4g
Rm9yIGV4YW1wbGUsIGlmIHRoZXJlIGFyZSB0aHJlZSBjb2x1bW5zLCBlYWNoIG9mIDc1JSwKLSAg
ICAgICAgICAgIC8vIGFuZCB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzIDMwMHB4LCBlYWNoIGNvbHVt
biB3aWxsIGJlY29tZSAxMDBweCBpbiB3aWR0aC4KLSAgICAgICAgICAgIGlmICh0b3RhbFBlcmNl
bnQgPiByZW1haW5pbmdMZW5ba10pIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nUGVy
Y2VudCA9IHJlbWFpbmluZ0xlbltrXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlz
UGVyY2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldID0gKGdy
aWRMYXlvdXRbaV0gKiByZW1haW5pbmdQZXJjZW50KSAvIHRvdGFsUGVyY2VudDsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBncmlkTGF5b3V0W2ldOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsK
LSAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gdG90YWxQZXJjZW50OwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZWxhdGl2ZSBjb2x1bW5zL3Jvd3MgYXJlIG91ciBs
YXN0IHByaW9yaXR5LiBEaXZpZGUgdGhlIHJlbWFpbmluZyBzcGFjZSBwcm9wb3J0aW9uYWxseQot
ICAgICAgICAgICAgLy8gb3ZlciBhbGwgcmVsYXRpdmUgY29sdW1ucy9yb3dzLiBJTVBPUlRBTlQ6
IHRoZSByZWxhdGl2ZSB2YWx1ZSBvZiAwKiBpcyB0cmVhdGVkIGFzIDEqLgotICAgICAgICAgICAg
aWYgKGNvdW50UmVsYXRpdmUpIHsKLSAgICAgICAgICAgICAgICBpbnQgbGFzdFJlbGF0aXZlID0g
MDsKLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nUmVsYXRpdmUgPSByZW1haW5pbmdMZW5b
a107Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkg
ewotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc1JlbGF0aXZlKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gPSAobWF4KGdyaWRbaV0udmFsdWUoKSwg
MSkgKiByZW1haW5pbmdSZWxhdGl2ZSkgLyB0b3RhbFJlbGF0aXZlOwotICAgICAgICAgICAgICAg
ICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGdyaWRMYXlvdXRbaV07Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBsYXN0UmVsYXRpdmUgPSBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHdl
IGNvdWxkIG5vdCBldmVudGx5IGRpc3RyaWJ1dGUgdGhlIGF2YWlsYWJsZSBzcGFjZSBvZiBhbGwg
b2YgdGhlIHJlbGF0aXZlICAKLSAgICAgICAgICAgICAgICAvLyBjb2x1bW5zL3Jvd3MsIHRoZSBy
ZW1haW5kZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGFzdCBjb2x1bW4vcm93LgotICAgICAgICAg
ICAgICAgIC8vIEZvciBleGFtcGxlOiBpZiB3ZSBoYXZlIGEgc3BhY2Ugb2YgMTAwcHggYW5kIHRo
cmVlIGNvbHVtbnMgKCosKiwqKSwgdGhlIHJlbWFpbmRlciB3aWxsCi0gICAgICAgICAgICAgICAg
Ly8gYmUgMXB4IGFuZCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsYXN0IGNvbHVtbjogMzNweCwgMzNw
eCwgMzRweC4KLSAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nTGVuW2tdKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIGdyaWRMYXlvdXRbbGFzdFJlbGF0aXZlXSArPSByZW1haW5pbmdMZW5ba107
Ci0gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSA9IDA7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIHNv
bWUgbGVmdCBvdmVyIHNwYWNlIHdlIG5lZWQgdG8gZGl2aWRlIGl0IG92ZXIgdGhlIGFscmVhZHkg
ZXhpc3RpbmcKLSAgICAgICAgICAgIC8vIGNvbHVtbnMvcm93cwotICAgICAgICAgICAgaWYgKHJl
bWFpbmluZ0xlbltrXSkgewotICAgICAgICAgICAgICAgIC8vIE91ciBmaXJzdCBwcmlvcml0eSBp
cyB0byBzcHJlYWQgaWYgb3ZlciB0aGUgcGVyY2VudGFnZSBjb2x1bW5zLiBUaGUgcmVtYWluaW5n
Ci0gICAgICAgICAgICAgICAgLy8gc3BhY2UgaXMgc3ByZWFkIGV2ZW5seSwgZm9yIGV4YW1wbGU6
IGlmIHdlIGhhdmUgYSBzcGFjZSBvZiAxMDBweCwgdGhlIGNvbHVtbnMgCi0gICAgICAgICAgICAg
ICAgLy8gZGVmaW5pdGlvbiBvZiAyNSUsMjUlIHVzZWQgdG8gcmVzdWx0IGluIHR3byBjb2x1bW5z
IG9mIDI1cHguIEFmdGVyIHRoaXMgdGhlIAotICAgICAgICAgICAgICAgIC8vIGNvbHVtbnMgd2ls
bCBlYWNoIGJlIDUwcHggaW4gd2lkdGguIAotICAgICAgICAgICAgICAgIGlmIChjb3VudFBlcmNl
bnQgJiYgdG90YWxQZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdQ
ZXJjZW50ID0gcmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdl
UGVyY2VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBn
cmlkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzUGVy
Y2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlUGVyY2VudCA9IChy
ZW1haW5pbmdQZXJjZW50ICogZ3JpZExheW91dFtpXSkgLyB0b3RhbFBlcmNlbnQ7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSArPSBjaGFuZ2VQZXJjZW50OwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBjaGFuZ2VQZXJjZW50
OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfSBlbHNlIGlmICh0b3RhbEZpeGVkKSB7Ci0gICAgICAgICAgICAgICAgICAg
IC8vIE91ciBsYXN0IHByaW9yaXR5IGlzIHRvIHNwcmVhZCB0aGUgcmVtYWluaW5nIHNwYWNlIG92
ZXIgdGhlIGZpeGVkIGNvbHVtbnMuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxl
IGlmIHdlIGhhdmUgMTAwcHggb2Ygc3BhY2UgYW5kIHR3byBjb2x1bW4gb2YgZWFjaCA0MHB4LCBi
b3RoCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvbHVtbnMgd2lsbCBiZWNvbWUgZXhhY3RseSA1
MHB4LgotICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nRml4ZWQgPSByZW1haW5pbmdM
ZW5ba107Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaGFuZ2VGaXhlZCA9IDA7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzRml4ZWQoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNoYW5nZUZpeGVkID0gKHJlbWFpbmluZ0ZpeGVkICogZ3JpZExheW91
dFtpXSkgLyB0b3RhbEZpeGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRMYXlv
dXRbaV0gKz0gY2hhbmdlRml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWlu
aW5nTGVuW2tdIC09IGNoYW5nZUZpeGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBzb21lIGxlZnQgb3Zl
ciBzcGFjZSB3ZSBwcm9iYWJseSBlbmRlZCB1cCB3aXRoIGEgcmVtYWluZGVyIG9mCi0gICAgICAg
ICAgICAvLyBhIGRpdmlzaW9uLiBXZSBjYW4gbm90IHNwcmVhZCBpdCBldmVubHkgYW55bW9yZS4g
SWYgd2UgaGF2ZSBhbnkgcGVyY2VudGFnZSAKLSAgICAgICAgICAgIC8vIGNvbHVtbnMvcm93cyBz
aW1wbHkgc3ByZWFkIHRoZSByZW1haW5kZXIgZXF1YWxseSBvdmVyIGFsbCBhdmFpbGFibGUgcGVy
Y2VudGFnZSBjb2x1bW5zLCAKLSAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgc2l6
ZS4KLSAgICAgICAgICAgIGlmIChyZW1haW5pbmdMZW5ba10gJiYgY291bnRQZXJjZW50KSB7Ci0g
ICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ1BlcmNlbnQgPSByZW1haW5pbmdMZW5ba107Ci0g
ICAgICAgICAgICAgICAgaW50IGNoYW5nZVBlcmNlbnQgPSAwOwotCi0gICAgICAgICAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKGdyaWRbaV0uaXNQZXJjZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n
ZVBlcmNlbnQgPSByZW1haW5pbmdQZXJjZW50IC8gY291bnRQZXJjZW50OwotICAgICAgICAgICAg
ICAgICAgICAgICAgZ3JpZExheW91dFtpXSArPSBjaGFuZ2VQZXJjZW50OwotICAgICAgICAgICAg
ICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGNoYW5nZVBlcmNlbnQ7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAg
ICAgCi0gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBwZXJjZW50YWdlIGNvbHVt
bnMvcm93cyB3ZSBvbmx5IGhhdmUgZml4ZWQgY29sdW1ucy4gU3ByZWFkCi0gICAgICAgICAgICAv
LyB0aGUgcmVtYWluZGVyIGVxdWFsbHkgb3ZlciBhbGwgZml4ZWQgY29sdW1ucy9yb3dzLgotICAg
ICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nTGVuW2tdICYmIGNvdW50Rml4ZWQpIHsKLSAgICAg
ICAgICAgICAgICBpbnQgcmVtYWluaW5nRml4ZWQgPSByZW1haW5pbmdMZW5ba107Ci0gICAgICAg
ICAgICAgICAgaW50IGNoYW5nZUZpeGVkID0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAg
ICAgICAgICBpZiAoZ3JpZFtpXS5pc0ZpeGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGNoYW5nZUZpeGVkID0gcmVtYWluaW5nRml4ZWQgLyBjb3VudEZpeGVkOwotICAgICAgICAgICAg
ICAgICAgICAgICAgZ3JpZExheW91dFtpXSArPSBjaGFuZ2VGaXhlZDsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBjaGFuZ2VGaXhlZDsKLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
Ly8gU3RpbGwgc29tZSBsZWZ0IG92ZXIuLi4gc2ltcGx5IGFkZCBpdCB0byB0aGUgbGFzdCBjb2x1
bW4sIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZQotICAgICAgICAgICAgLy8gc3ByZWFkIGl0IGV2
ZW5seSBvciBlcXVhbGx5LgotICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0xlbltrXSkgewotICAg
ICAgICAgICAgICAgIGdyaWRMYXlvdXRbZ3JpZExlbiAtIDFdICs9IHJlbWFpbmluZ0xlbltrXTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgdGhlIGZpbmFsIGxh
eW91dCwgZGlzdHJpYnV0ZSB0aGUgZGVsdGEgb3ZlciBpdAotICAgICAgICAgICAgYm9vbCB3b3Jr
ZWQgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kp
IHsKLSAgICAgICAgICAgICAgICBpZiAoZ3JpZExheW91dFtpXSAmJiBncmlkTGF5b3V0W2ldICsg
Z3JpZERlbHRhW2ldIDw9IDApCi0gICAgICAgICAgICAgICAgICAgIHdvcmtlZCA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gKz0gZ3JpZERlbHRhW2ldOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgLy8gbm93IHRoZSBkZWx0YSdzIGJyb2tlIHNvbWV0aGluZywgdW5k
byBpdCBhbmQgcmVzZXQgZGVsdGFzCi0gICAgICAgICAgICBpZiAoIXdvcmtlZCkKLSAgICAgICAg
ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAg
ICAgICAgICBncmlkTGF5b3V0W2ldIC09IGdyaWREZWx0YVtpXTsKLSAgICAgICAgICAgICAgICAg
ICAgZ3JpZERlbHRhW2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgZ3JpZExheW91dFswXSA9IHJlbWFpbmluZ0xlbltrXTsKLSAg
ICB9Ci0KLSAgICBwb3NpdGlvbkZyYW1lcygpOwotCi0gICAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9
IGZpcnN0Q2hpbGQoKTsKLSAgICBpZiAoICFjaGlsZCApCi0gICAgICAgIGdvdG8gZW5kMjsKLQot
ICAgIGlmKCFtX2hTcGxpdFZhciAmJiAhbV92U3BsaXRWYXIpCi0gICAgewotICAgICAgICBpZigh
bV92U3BsaXRWYXIgJiYgZWxlbWVudCgpLT50b3RhbENvbHMoKSA+IDEpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIG1fdlNwbGl0VmFyID0gbmV3IGJvb2xbZWxlbWVudCgpLT50b3RhbENvbHMoKV07
Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZWxlbWVudCgpLT50b3RhbENvbHMoKTsg
aSsrKSBtX3ZTcGxpdFZhcltpXSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIW1faFNw
bGl0VmFyICYmIGVsZW1lbnQoKS0+dG90YWxSb3dzKCkgPiAxKQotICAgICAgICB7Ci0gICAgICAg
ICAgICBtX2hTcGxpdFZhciA9IG5ldyBib29sW2VsZW1lbnQoKS0+dG90YWxSb3dzKCldOwotICAg
ICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IGkrKykg
bV9oU3BsaXRWYXJbaV0gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKGludCByID0g
MDsgciA8IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IHIrKykKLSAgICAgICAgewotICAgICAgICAg
ICAgZm9yKGludCBjID0gMDsgYyA8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7IGMrKykKLSAgICAg
ICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sIGZpeGVkID0gZmFsc2U7Ci0KLSAgICAgICAg
ICAgICAgICBpZiAoIGNoaWxkLT5pc0ZyYW1lU2V0KCkgKQotICAgICAgICAgICAgICAgICAgZml4
ZWQgPSBzdGF0aWNfY2FzdDxSZW5kZXJGcmFtZVNldCAqPihjaGlsZCktPmVsZW1lbnQoKS0+bm9S
ZXNpemUoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBmaXhlZCA9
IHN0YXRpY19jYXN0PFJlbmRlckZyYW1lICo+KGNoaWxkKS0+ZWxlbWVudCgpLT5ub1Jlc2l6ZSgp
OwotCi0gICAgICAgICAgICAgICAgaWYoZml4ZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAg
ICAgICAgICAgICAgICBpZiggZWxlbWVudCgpLT50b3RhbENvbHMoKSA+IDEpCi0gICAgICAgICAg
ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM+MCkgbV92U3BsaXRWYXJb
Yy0xXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbV92U3BsaXRWYXJbY10gPSBm
YWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiggZWxl
bWVudCgpLT50b3RhbFJvd3MoKSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmKHI+MCkgbV9oU3BsaXRWYXJbci0xXSA9IGZhbHNlOwotICAgICAg
ICAgICAgICAgICAgICAgICAgbV9oU3BsaXRWYXJbcl0gPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
OwotICAgICAgICAgICAgICAgICAgICBpZighY2hpbGQpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBnb3RvIGVuZDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICB9Ci0gZW5kMToKLSAgICBSZW5kZXJDb250YWluZXI6OmxheW91dCgpOwotIGVuZDI6
Ci0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckZyYW1lU2V0Ojpw
b3NpdGlvbkZyYW1lcygpCi17Ci0gIGludCByOwotICBpbnQgYzsKLQotICBSZW5kZXJPYmplY3Qg
KmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICBpZiAoICFjaGlsZCApCi0gICAgcmV0dXJuOwotCi0g
IC8vICBOb2RlICpjaGlsZCA9IF9maXJzdDsKLSAgLy8gIGlmKCFjaGlsZCkgcmV0dXJuOwotCi0g
IGludCB5UG9zID0gMDsKLQotICBmb3IociA9IDA7IHIgPCBlbGVtZW50KCktPnRvdGFsUm93cygp
OyByKyspCi0gIHsKLSAgICBpbnQgeFBvcyA9IDA7Ci0gICAgZm9yKGMgPSAwOyBjIDwgZWxlbWVu
dCgpLT50b3RhbENvbHMoKTsgYysrKQotICAgIHsKLSAgICAgIGNoaWxkLT5zZXRQb3MoIHhQb3Ms
IHlQb3MgKTsKLSAgICAgIC8vIGhhcyB0byBiZSByZXNpemVkIGFuZCBpdHNlbGYgcmVzaXplIGl0
cyBjb250ZW50cwotICAgICAgaWYgKChtX2dyaWRMYXlvdXRbMV1bY10gIT0gY2hpbGQtPndpZHRo
KCkpIHx8IChtX2dyaWRMYXlvdXRbMF1bcl0gIT0gY2hpbGQtPmhlaWdodCgpKSkgewotICAgICAg
ICAgIGNoaWxkLT5zZXRXaWR0aCggbV9ncmlkTGF5b3V0WzFdW2NdICk7Ci0gICAgICAgICAgY2hp
bGQtPnNldEhlaWdodCggbV9ncmlkTGF5b3V0WzBdW3JdICk7Ci0gICAgICAgICAgY2hpbGQtPnNl
dE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICAgIGNoaWxkLT5sYXlvdXQoKTsKLSAgICAgIH0K
LQotICAgICAgeFBvcyArPSBtX2dyaWRMYXlvdXRbMV1bY10gKyBlbGVtZW50KCktPmJvcmRlcigp
OwotICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLQotICAgICAgaWYgKCAhY2hp
bGQgKQotICAgICAgICByZXR1cm47Ci0KLSAgICB9Ci0KLSAgICB5UG9zICs9IG1fZ3JpZExheW91
dFswXVtyXSArIGVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gIH0KLQotICAvLyBhbGwgdGhlIHJlbWFp
bmluZyBmcmFtZXMgYXJlIGhpZGRlbiB0byBhdm9pZCB1Z2x5Ci0gIC8vIHNwdXJpb3VzIHVuZmxv
d2VkIGZyYW1lcwotICB3aGlsZSAoIGNoaWxkICkgewotICAgICAgY2hpbGQtPnNldFdpZHRoKCAw
ICk7Ci0gICAgICBjaGlsZC0+c2V0SGVpZ2h0KCAwICk7Ci0gICAgICBjaGlsZC0+c2V0TmVlZHNM
YXlvdXQoZmFsc2UpOwotCi0gICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICB9
Ci19Ci0KLWJvb2wgUmVuZGVyRnJhbWVTZXQ6OnVzZXJSZXNpemUoIE1vdXNlRXZlbnQgKmV2dCAp
Ci17Ci0gICAgaWYgKG5lZWRzTGF5b3V0KCkpIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBib29s
IHJlcyA9IGZhbHNlOwotICAgIGludCBfeCA9IGV2dC0+Y2xpZW50WCgpOwotICAgIGludCBfeSA9
IGV2dC0+Y2xpZW50WSgpOwotICAgIAotICAgIGlmICggIW1fcmVzaXppbmcgJiYgZXZ0LT50eXBl
KCkgPT0gbW91c2Vtb3ZlRXZlbnQgfHwgZXZ0LT50eXBlKCkgPT0gbW91c2Vkb3duRXZlbnQgKQot
ICAgIHsKLSAgICAgICAgbV9oU3BsaXQgPSAtMTsKLSAgICAgICAgbV92U3BsaXQgPSAtMTsKLSAg
ICAgICAgLy9ib29sIHJlc2l6ZVBvc3NpYmxlID0gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIC8v
IGNoZWNrIGlmIHdlJ3JlIG92ZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGJvdW5kYXJ5Ci0g
ICAgICAgIGludCBwb3MgPSBtX2dyaWRMYXlvdXRbMV1bMF0gKyB4UG9zKCk7Ci0gICAgICAgIGZv
ciAoaW50IGMgPSAxOyBjIDwgZWxlbWVudCgpLT50b3RhbENvbHMoKTsgYysrKSB7Ci0gICAgICAg
ICAgICBpZiAoX3ggPj0gcG9zICYmIF94IDw9IHBvcytlbGVtZW50KCktPmJvcmRlcigpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKG1fdlNwbGl0VmFyICYmIG1fdlNwbGl0VmFyW2MgLSAxXSkKLSAg
ICAgICAgICAgICAgICAgICAgbV92U3BsaXQgPSBjIC0gMTsKLSAgICAgICAgICAgICAgICByZXMg
PSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgcG9zICs9IG1fZ3JpZExheW91dFsxXVtjXSArIGVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIHBvcyA9IG1fZ3JpZExheW91dFswXVswXSArIHlQb3Mo
KTsKLSAgICAgICAgZm9yIChpbnQgciA9IDE7IHIgPCBlbGVtZW50KCktPnRvdGFsUm93cygpOyBy
KyspIHsKLSAgICAgICAgICAgIGlmICggX3kgPj0gcG9zICYmIF95IDw9IHBvcytlbGVtZW50KCkt
PmJvcmRlcigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1faFNwbGl0VmFyICYmIG1faFNwbGl0
VmFyW3IgLSAxXSkKLSAgICAgICAgICAgICAgICAgICAgbV9oU3BsaXQgPSByIC0gMTsKLSAgICAg
ICAgICAgICAgICByZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgcG9zICs9IG1fZ3JpZExheW91dFswXVtyXSArIGVsZW1lbnQoKS0+
Ym9yZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChldnQtPnR5cGUoKSA9
PSBtb3VzZWRvd25FdmVudCkgewotICAgICAgICAgICAgc2V0UmVzaXppbmcodHJ1ZSk7Ci0gICAg
ICAgICAgICBtX3ZTcGxpdFBvcyA9IF94OwotICAgICAgICAgICAgbV9oU3BsaXRQb3MgPSBfeTsK
LSAgICAgICAgICAgIG1fb2xkcG9zID0gLTE7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
Y2FudmFzKCktPnZpZXcoKS0+c2V0Q3Vyc29yKHBvaW50ZXJDdXJzb3IoKSk7Ci0gICAgfQotICAg
IAotICAgIC8vICMjIyBjaGVjayB0aGUgcmVzaXplIGlzIG5vdCBnb2luZyBvdXQgb2YgYm91bmRz
LgotICAgIGlmIChtX3Jlc2l6aW5nICYmIGV2dC0+dHlwZSgpID09IG1vdXNldXBFdmVudCkgewot
ICAgICAgICBzZXRSZXNpemluZyhmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBpZihtX3ZTcGxp
dCAhPSAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBkZWx0YSA9IG1fdlNwbGl0UG9z
IC0gX3g7Ci0gICAgICAgICAgICBtX2dyaWREZWx0YVsxXVttX3ZTcGxpdF0gLT0gZGVsdGE7Ci0g
ICAgICAgICAgICBtX2dyaWREZWx0YVsxXVttX3ZTcGxpdCsxXSArPSBkZWx0YTsKLSAgICAgICAg
fQotICAgICAgICBpZihtX2hTcGxpdCAhPSAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlu
dCBkZWx0YSA9IG1faFNwbGl0UG9zIC0gX3k7Ci0gICAgICAgICAgICBtX2dyaWREZWx0YVswXVtt
X2hTcGxpdF0gLT0gZGVsdGE7Ci0gICAgICAgICAgICBtX2dyaWREZWx0YVswXVttX2hTcGxpdCsx
XSArPSBkZWx0YTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gdGhpcyBqdXN0IHNj
aGVkdWxlcyB0aGUgcmVsYXlvdXQKLSAgICAgICAgLy8gaW1wb3J0YW50LCBvdGhlcndpc2UgdGhl
IG1vdmluZyBpbmRpY2F0b3IgaXMgbm90IGNvcnJlY3RseSBlcmFzZWQKLSAgICAgICAgc2V0TmVl
ZHNMYXlvdXQodHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIGVsc2UgaWYgKG1fcmVzaXppbmcgfHwg
ZXZ0LT50eXBlKCkgPT0gbW91c2V1cEV2ZW50KSB7Ci0gICAgICAgIEZyYW1lVmlldyAqdiA9IGNh
bnZhcygpLT52aWV3KCk7ICAgICAgICAKLSAgICAgICAgdi0+ZGlzYWJsZUZsdXNoRHJhd2luZygp
OwotICAgICAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSB2LT5sb2NrRHJhd2luZ0ZvY3Vz
KCk7Ci0gICAgICAgIAotICAgICAgICBJbnRSZWN0IHIoeFBvcygpLCB5UG9zKCksIHdpZHRoKCks
IGhlaWdodCgpKTsKLSAgICAgICAgY29uc3QgaW50IHJCb3JkID0gMzsKLSAgICAgICAgaW50IHN3
ID0gZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICAgICAgaW50IHAgPSBtX3Jlc2l6aW5nID8gKG1f
dlNwbGl0ID4gLTEgPyBfeCA6IF95KSA6IC0xOwotICAgICAgICBjb25zdCBSR0JBMzIgZ3JleVF1
YXJ0ZXJPcGFjaXR5ID0gMHg0MEEwQTBBMDsKLSAgICAgICAgaWYgKG1fdlNwbGl0ID4gLTEpIHsK
LSAgICAgICAgICAgIGlmIChtX29sZHBvcyA+PSAwKQotICAgICAgICAgICAgICAgIHYtPnVwZGF0
ZUNvbnRlbnRzKEludFJlY3QobV9vbGRwb3MgKyBzdy8yIC0gckJvcmQsIHIueSgpLCAyICogckJv
cmQsIHIuaGVpZ2h0KCkpLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChwID49IDApIHsKLSAgICAg
ICAgICAgICAgICBjb250ZXh0LT5zZXRQZW4oUGVuOjpOb1Blbik7Ci0gICAgICAgICAgICAgICAg
Y29udGV4dC0+c2V0RmlsbENvbG9yKGdyZXlRdWFydGVyT3BhY2l0eSk7Ci0gICAgICAgICAgICAg
ICAgY29udGV4dC0+ZHJhd1JlY3QoSW50UmVjdChwICsgc3cvMiAtIHJCb3JkLCByLnkoKSwgMiAq
IHJCb3JkLCByLmhlaWdodCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBpZiAobV9vbGRwb3MgPj0gMCkKLSAgICAgICAgICAgICAgICB2LT51cGRhdGVD
b250ZW50cyhJbnRSZWN0KHIueCgpLCBtX29sZHBvcyArIHN3LzIgLSByQm9yZCwgci53aWR0aCgp
LCAyICogckJvcmQpLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChwID49IDApIHsKLSAgICAgICAg
ICAgICAgICBjb250ZXh0LT5zZXRQZW4oUGVuOjpOb1Blbik7Ci0gICAgICAgICAgICAgICAgY29u
dGV4dC0+c2V0RmlsbENvbG9yKGdyZXlRdWFydGVyT3BhY2l0eSk7Ci0gICAgICAgICAgICAgICAg
Y29udGV4dC0+ZHJhd1JlY3QoSW50UmVjdChyLngoKSwgcCArIHN3LzIgLSByQm9yZCwgci53aWR0
aCgpLCAyICogckJvcmQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX29s
ZHBvcyA9IHA7Ci0KLSAgICAgICAgdi0+dW5sb2NrRHJhd2luZ0ZvY3VzKGNvbnRleHQpOwotICAg
ICAgICB2LT5lbmFibGVGbHVzaERyYXdpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJl
czsKLX0KLQotdm9pZCBSZW5kZXJGcmFtZVNldDo6c2V0UmVzaXppbmcoYm9vbCBlKQotewotICAg
IG1fcmVzaXppbmcgPSBlOwotICAgIGZvciAoUmVuZGVyT2JqZWN0KiBwID0gcGFyZW50KCk7IHA7
IHAgPSBwLT5wYXJlbnQoKSkKLSAgICAgICAgaWYgKHAtPmlzRnJhbWVTZXQoKSkKLSAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlckZyYW1lU2V0Kj4ocCktPm1fY2xpZW50UmVzaXppbmcgPSBt
X3Jlc2l6aW5nOwotICAgIGNhbnZhcygpLT52aWV3KCktPnNldFJlc2l6aW5nRnJhbWVTZXQoZSA/
IGVsZW1lbnQoKSA6IDApOwotfQotCi1ib29sIFJlbmRlckZyYW1lU2V0OjpjYW5SZXNpemUoIGlu
dCBfeCwgaW50IF95ICkKLXsKLSAgICAvLyBpZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGEgbGF5b3V0
LCB0aGVuIHRoZSBncmlkTGF5b3V0IGRvZXNuJ3QgY29udGFpbiB1c2VmdWwgZGF0YSB5ZXQKLSAg
ICBpZiAobmVlZHNMYXlvdXQoKSB8fCAhbV9ncmlkTGF5b3V0WzBdIHx8ICFtX2dyaWRMYXlvdXRb
MV0gKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBjaGVjayBpZiB3ZSdyZSBvdmVyIGEgaG9yaXpv
bnRhbCBvciB2ZXJ0aWNhbCBib3VuZGFyeQotICAgIGludCBwb3MgPSBtX2dyaWRMYXlvdXRbMV1b
MF07Ci0gICAgZm9yKGludCBjID0gMTsgYyA8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7IGMrKykK
LSAgICAgICAgaWYoX3ggPj0gcG9zICYmIF94IDw9IHBvcytlbGVtZW50KCktPmJvcmRlcigpKQot
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBwb3MgPSBtX2dyaWRMYXlvdXRbMF1bMF07
Ci0gICAgZm9yKGludCByID0gMTsgciA8IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IHIrKykKLSAg
ICAgICAgaWYoIF95ID49IHBvcyAmJiBfeSA8PSBwb3MrZWxlbWVudCgpLT5ib3JkZXIoKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVm
IE5ERUJVRwotdm9pZCBSZW5kZXJGcmFtZVNldDo6ZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBE
ZXByZWNhdGVkU3RyaW5nIGluZCkgY29uc3QKLXsKLSAgKnN0cmVhbSA8PCAiIHRvdGFscm93cz0i
IDw8IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7Ci0gICpzdHJlYW0gPDwgIiB0b3RhbGNvbHM9IiA8
PCBlbGVtZW50KCktPnRvdGFsQ29scygpOwotCi0gIHVuc2lnbmVkIGk7Ci0gIGZvciAoaSA9IDA7
IGkgPCAodW5zaWduZWQpZWxlbWVudCgpLT50b3RhbFJvd3MoKTsgaSsrKQotICAgICpzdHJlYW0g
PDwgIiBoU3BsaXR2YXIoIiA8PCBpIDw8ICIpPSIgPDwgbV9oU3BsaXRWYXJbaV07Ci0KLSAgZm9y
IChpID0gMDsgaSA8ICh1bnNpZ25lZCllbGVtZW50KCktPnRvdGFsQ29scygpOyBpKyspCi0gICAg
KnN0cmVhbSA8PCAiIHZTcGxpdHZhcigiIDw8IGkgPDwgIik9IiA8PCBtX3ZTcGxpdFZhcltpXTsK
LQotICBSZW5kZXJDb250YWluZXI6OmR1bXAoc3RyZWFtLGluZCk7Ci19Ci0jZW5kaWYKLQotLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBSZW5kZXJQYXJ0OjpSZW5kZXJQYXJ0KEhU
TUxFbGVtZW50KiBub2RlKQotICAgIDogUmVuZGVyV2lkZ2V0KG5vZGUpLCBtX2ZyYW1lKDApCisg
ICAgOiBSZW5kZXJXaWRnZXQobm9kZSkKKyAgICAsIG1fZnJhbWUoMCkKIHsKICAgICAvLyBpbml0
IFJlbmRlck9iamVjdCBhdHRyaWJ1dGVzCiAgICAgc2V0SW5saW5lKGZhbHNlKTsKQEAgLTYzOCwy
NzcgKzk1LDYgQEAgdm9pZCBSZW5kZXJQYXJ0OjpkZWxldGVXaWRnZXQoKQogICAgICAgICBkZWxl
dGUgbV93aWRnZXQ7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVJl
bmRlckZyYW1lOjpSZW5kZXJGcmFtZShIVE1MRnJhbWVFbGVtZW50KiBmcmFtZSkKLSAgICA6IFJl
bmRlclBhcnQoZnJhbWUpCi17Ci0gICAgc2V0SW5saW5lKGZhbHNlKTsKLX0KLQotdm9pZCBSZW5k
ZXJGcmFtZTo6dmlld0NsZWFyZWQoKQotewotICAgIGlmIChlbGVtZW50KCkgJiYgbV93aWRnZXQg
JiYgbV93aWRnZXQtPmlzRnJhbWVWaWV3KCkpIHsKLSAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0g
c3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV93aWRnZXQpOwotICAgICAgICBIVE1MRnJhbWVTZXRF
bGVtZW50KiBmcmFtZVNldCA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZVNldEVsZW1lbnQgKj4oZWxl
bWVudCgpLT5wYXJlbnROb2RlKCkpOwotICAgICAgICBib29sIGhhc0JvcmRlciA9IGVsZW1lbnQo
KS0+bV9mcmFtZUJvcmRlciAmJiBmcmFtZVNldC0+ZnJhbWVCb3JkZXIoKTsKLSAgICAgICAgaW50
IG1hcmdpbncgPSBlbGVtZW50KCktPm1fbWFyZ2luV2lkdGg7Ci0gICAgICAgIGludCBtYXJnaW5o
ID0gZWxlbWVudCgpLT5tX21hcmdpbkhlaWdodDsKLQotICAgICAgICB2aWV3LT5zZXRIYXNCb3Jk
ZXIoaGFzQm9yZGVyKTsKLSAgICAgICAgaWYgKG1hcmdpbncgIT0gLTEpCi0gICAgICAgICAgICB2
aWV3LT5zZXRNYXJnaW5XaWR0aChtYXJnaW53KTsKLSAgICAgICAgaWYgKG1hcmdpbmggIT0gLTEp
Ci0gICAgICAgICAgICB2aWV3LT5zZXRNYXJnaW5IZWlnaHQobWFyZ2luaCk7Ci0gICAgfQotfQot
Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotUmVuZGVyUGFydE9iamVjdDo6
UmVuZGVyUGFydE9iamVjdChIVE1MRWxlbWVudCogZWxlbWVudCkKLSAgICA6IFJlbmRlclBhcnQo
ZWxlbWVudCkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1dGVzCi0gICAgc2V0
SW5saW5lKHRydWUpOwotICAgIG1faGFzRmFsbGJhY2tDb250ZW50ID0gZmFsc2U7Ci19Ci0KLXN0
YXRpYyBib29sIGlzVVJMQWxsb3dlZChXZWJDb3JlOjpEb2N1bWVudCAqZG9jLCBjb25zdCBTdHJp
bmcgJnVybCkKLXsKLSAgICBLVVJMIG5ld1VSTChkb2MtPmNvbXBsZXRlVVJMKHVybC5kZXByZWNh
dGVkU3RyaW5nKCkpKTsKLSAgICBuZXdVUkwuc2V0UmVmKERlcHJlY2F0ZWRTdHJpbmc6Om51bGwp
OwotICAgIAotICAgIGlmIChkb2MtPmZyYW1lKCktPnBhZ2UoKS0+ZnJhbWVDb3VudCgpID49IDIw
MCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gV2UgYWxsb3cgb25lIGxldmVsIG9m
IHNlbGYtcmVmZXJlbmNlIGJlY2F1c2Ugc29tZSBzaXRlcyBkZXBlbmQgb24gdGhhdC4KLSAgICAv
LyBCdXQgd2UgZG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZS4KLSAgICBib29sIGZvdW5kU2VsZlJl
ZmVyZW5jZSA9IGZhbHNlOwotICAgIGZvciAoRnJhbWUgKmZyYW1lID0gZG9jLT5mcmFtZSgpOyBm
cmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewotICAgICAgICBLVVJMIGZy
YW1lVVJMID0gZnJhbWUtPnVybCgpOwotICAgICAgICBmcmFtZVVSTC5zZXRSZWYoRGVwcmVjYXRl
ZFN0cmluZzo6bnVsbCk7Ci0gICAgICAgIGlmIChmcmFtZVVSTCA9PSBuZXdVUkwpIHsKLSAgICAg
ICAgICAgIGlmIChmb3VuZFNlbGZSZWZlcmVuY2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICAgICAgZm91bmRTZWxmUmVmZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hcENsYXNz
SWRUb1NlcnZpY2VUeXBlKGNvbnN0IFN0cmluZyYgY2xhc3NJZCwgU3RyaW5nJiBzZXJ2aWNlVHlw
ZSkKLXsKLSAgICAvLyBJdCBpcyBBY3RpdmVYLCBidXQgdGhlIG5zcGx1Z2luIHN5c3RlbSBoYW5k
bGluZwotICAgIC8vIHNob3VsZCBhbHNvIHdvcmssIHRoYXQncyB3aHkgd2UgZG9uJ3Qgb3ZlcnJp
ZGUgdGhlCi0gICAgLy8gc2VydmljZVR5cGUgd2l0aCBhcHBsaWNhdGlvbi94LWFjdGl2ZXgtaGFu
ZGxlcgotICAgIC8vIGJ1dCBsZXQgdGhlIEtUcmFkZXIgaW4ga2h0bWxwYXJ0OjpjcmVhdGVQYXJ0
KCkgZGV0ZWN0Ci0gICAgLy8gdGhlIHVzZXIncyBwcmVmZXJlbmNlOiBsYXVuY2ggd2l0aCBhY3Rp
dmV4IHZpZXdlciBvcgotICAgIC8vIHdpdGggbnNwbHVnaW52aWV3ZXIgKE5pa28pCi0gICAgaWYg
KGNsYXNzSWQuY29udGFpbnMoIkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIp
KQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCI7
Ci0gICAgZWxzZSBpZiAoY2xhc3NJZC5jb250YWlucygiQ0ZDREFBMDMtOEJFNC0xMWNmLUI4NEIt
MDAyMEFGQkJDQ0ZBIikpCi0gICAgICAgIHNlcnZpY2VUeXBlID0gImF1ZGlvL3gtcG4tcmVhbGF1
ZGlvLXBsdWdpbiI7Ci0gICAgZWxzZSBpZiAoY2xhc3NJZC5jb250YWlucygiMDJCRjI1RDUtOEMx
Ny00QjIzLUJDODAtRDM0ODhBQkREQzZCIikpCi0gICAgICAgIHNlcnZpY2VUeXBlID0gInZpZGVv
L3F1aWNrdGltZSI7Ci0gICAgZWxzZSBpZiAoY2xhc3NJZC5jb250YWlucygiMTY2QjFCQ0EtM0Y5
Qy0xMUNGLTgwNzUtNDQ0NTUzNTQwMDAwIikpCi0gICAgICAgIHNlcnZpY2VUeXBlID0gImFwcGxp
Y2F0aW9uL3gtZGlyZWN0b3IiOwotICAgIGVsc2UgaWYgKGNsYXNzSWQuY29udGFpbnMoIjZCRjUy
QTUyLTM5NEEtMTFkMy1CMTUzLTAwQzA0Rjc5RkFBNiIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9
ICJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIjsKLSAgICBlbHNlIGlmICghY2xhc3NJZC5pc0VtcHR5
KCkpCi0gICAgICAgIC8vIFdlIGhhdmUgYSBjbHNpZCwgbWVhbnMgdGhpcyBpcyBhY3RpdmV4IChO
aWtvKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LWFjdGl2ZXgtaGFuZGxl
ciI7Ci0gICAgLy8gVE9ETzogYWRkIG1vcmUgcGx1Z2lucyBoZXJlCi19Ci0KLXZvaWQgUmVuZGVy
UGFydE9iamVjdDo6dXBkYXRlV2lkZ2V0KCkKLXsKLSAgU3RyaW5nIHVybDsKLSAgU3RyaW5nIHNl
cnZpY2VUeXBlOwotICBWZWN0b3I8U3RyaW5nPiBwYXJhbU5hbWVzOwotICBWZWN0b3I8U3RyaW5n
PiBwYXJhbVZhbHVlczsKLSAgRnJhbWUgKmZyYW1lID0gbV92aWV3LT5mcmFtZSgpOwotCi0gIHNl
dE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0KLSAgaWYgKGVsZW1lbnQoKS0+aGFzVGFn
TmFtZShvYmplY3RUYWcpKSB7Ci0KLSAgICAgIEhUTUxPYmplY3RFbGVtZW50ICpvID0gc3RhdGlj
X2Nhc3Q8SFRNTE9iamVjdEVsZW1lbnQgKj4oZWxlbWVudCgpKTsKLQotICAgICAgaWYgKCFvLT5p
c0NvbXBsZXRlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgIC8vIENoZWNrIGZvciBhIGNoaWxk
IEVNQkVEIHRhZy4KLSAgICAgIEhUTUxFbWJlZEVsZW1lbnQqIGVtYmVkID0gMDsKLSAgICAgIGZv
ciAoTm9kZSAqY2hpbGQgPSBvLT5maXJzdENoaWxkKCk7IGNoaWxkOyApIHsKLSAgICAgICAgICBp
ZiAoY2hpbGQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpKSB7Ci0gICAgICAgICAgICAgIGVtYmVkID0g
c3RhdGljX2Nhc3Q8SFRNTEVtYmVkRWxlbWVudCAqPiggY2hpbGQgKTsKLSAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC0+aGFzVGFnTmFtZShvYmplY3RUYWcp
KQotICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOyAgICAgICAgIC8v
IERvbid0IGRlc2NlbmQgaW50byBuZXN0ZWQgT0JKRUNUIHRhZ3MKLSAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPnRyYXZlcnNlTmV4dE5vZGUobyk7ICAgLy8gT3Ro
ZXJ3aXNlIGRlc2NlbmQgKEVNQkVEcyBtYXkgYmUgaW5zaWRlIENPTU1FTlQgdGFncykKLSAgICAg
IH0KLSAgICAgIAotICAgICAgLy8gVXNlIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIEVNQkVEIHRh
ZyBpbnN0ZWFkIG9mIHRoZSBPQkpFQ1QgdGFnIGluY2x1ZGluZyBXSURUSCBhbmQgSEVJR0hULgot
ICAgICAgSFRNTEVsZW1lbnQgKmVtYmVkT3JPYmplY3Q7Ci0gICAgICBpZiAoZW1iZWQpIHsKLSAg
ICAgICAgICBlbWJlZE9yT2JqZWN0ID0gKEhUTUxFbGVtZW50ICopZW1iZWQ7Ci0gICAgICAgICAg
U3RyaW5nIGF0dHJpYnV0ZSA9IGVtYmVkT3JPYmplY3QtPmdldEF0dHJpYnV0ZSh3aWR0aEF0dHIp
OwotICAgICAgICAgIGlmICghYXR0cmlidXRlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgby0+
c2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgYXR0cmlidXRlKTsKLSAgICAgICAgICBhdHRyaWJ1dGUg
PSBlbWJlZE9yT2JqZWN0LT5nZXRBdHRyaWJ1dGUoaGVpZ2h0QXR0cik7Ci0gICAgICAgICAgaWYg
KCFhdHRyaWJ1dGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICBvLT5zZXRBdHRyaWJ1dGUoaGVp
Z2h0QXR0ciwgYXR0cmlidXRlKTsKLSAgICAgICAgICB1cmwgPSBlbWJlZC0+dXJsOwotICAgICAg
ICAgIHNlcnZpY2VUeXBlID0gZW1iZWQtPnNlcnZpY2VUeXBlOwotICAgICAgfSBlbHNlCi0gICAg
ICAgICAgZW1iZWRPck9iamVjdCA9IChIVE1MRWxlbWVudCAqKW87Ci0gICAgICAKLSAgICAgIC8v
IElmIHRoZXJlIHdhcyBubyBVUkwgb3IgdHlwZSBkZWZpbmVkIGluIEVNQkVELCB0cnkgdGhlIE9C
SkVDVCB0YWcuCi0gICAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICB1cmwgPSBvLT51
cmw7Ci0gICAgICBpZiAoc2VydmljZVR5cGUuaXNFbXB0eSgpKQotICAgICAgICAgIHNlcnZpY2VU
eXBlID0gby0+c2VydmljZVR5cGU7Ci0gICAgICAKLSAgICAgIEhhc2hTZXQ8U3RyaW5nSW1wbCos
IENhc2VJbnNlbnNpdGl2ZUhhc2g+IHVuaXF1ZVBhcmFtTmFtZXM7Ci0gICAgICAKLSAgICAgIC8v
IFNjYW4gdGhlIFBBUkFNIGNoaWxkcmVuLgotICAgICAgLy8gR2V0IHRoZSBVUkwgYW5kIHR5cGUg
ZnJvbSB0aGUgcGFyYW1zIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGVtLgotICAgICAgLy8g
R2V0IHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHBhcmFtcyBpZiB0aGVyZSBpcyBubyBFTUJFRCB0
YWcuCi0gICAgICBOb2RlICpjaGlsZCA9IG8tPmZpcnN0Q2hpbGQoKTsKLSAgICAgIHdoaWxlIChj
aGlsZCAmJiAodXJsLmlzRW1wdHkoKSB8fCBzZXJ2aWNlVHlwZS5pc0VtcHR5KCkgfHwgIWVtYmVk
KSkgewotICAgICAgICAgIGlmIChjaGlsZC0+aGFzVGFnTmFtZShwYXJhbVRhZykpIHsKLSAgICAg
ICAgICAgICAgSFRNTFBhcmFtRWxlbWVudCogcCA9IHN0YXRpY19jYXN0PEhUTUxQYXJhbUVsZW1l
bnQqPihjaGlsZCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcC0+bmFtZSgpLmxvd2Vy
KCk7Ci0gICAgICAgICAgICAgIGlmICh1cmwuaXNFbXB0eSgpICYmIChuYW1lID09ICJzcmMiIHx8
IG5hbWUgPT0gIm1vdmllIiB8fCBuYW1lID09ICJjb2RlIiB8fCBuYW1lID09ICJ1cmwiKSkKLSAg
ICAgICAgICAgICAgICAgIHVybCA9IHAtPnZhbHVlKCk7Ci0gICAgICAgICAgICAgIGlmIChzZXJ2
aWNlVHlwZS5pc0VtcHR5KCkgJiYgbmFtZSA9PSAidHlwZSIpIHsKLSAgICAgICAgICAgICAgICAg
IHNlcnZpY2VUeXBlID0gcC0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBz
ZXJ2aWNlVHlwZS5maW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgICBpZiAocG9zICE9IC0xKQot
ICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gc2VydmljZVR5cGUubGVmdChwb3Mp
OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICghZW1iZWQgJiYgIW5hbWUuaXNF
bXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICB1bmlxdWVQYXJhbU5hbWVzLmFkZChwLT5uYW1l
KCkuaW1wbCgpKTsKLSAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMuYXBwZW5kKHAtPm5hbWUo
KSk7Ci0gICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlcy5hcHBlbmQocC0+dmFsdWUoKSk7Ci0g
ICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4
dFNpYmxpbmcoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gV2hlbiBPQkpFQ1QgaXMgdXNl
ZCBmb3IgYW4gYXBwbGV0IHZpYSBTdW4ncyBKYXZhIHBsdWdpbiwgdGhlIENPREVCQVNFIGF0dHJp
YnV0ZSBpbiB0aGUgdGFnCi0gICAgICAvLyBwb2ludHMgdG8gdGhlIEphdmEgcGx1Z2luIGl0c2Vs
ZiAoYW4gQWN0aXZlWCBjb21wb25lbnQpIHdoaWxlIHRoZSBhY3R1YWwgYXBwbGV0IENPREVCQVNF
IGlzCi0gICAgICAvLyBpbiBhIFBBUkFNIHRhZy4gU2VlIDxodHRwOi8vamF2YS5zdW4uY29tL3By
b2R1Y3RzL3BsdWdpbi8xLjIvZG9jcy90YWdzLmh0bWw+LiBUaGlzIG1lYW5zCi0gICAgICAvLyB3
ZSBoYXZlIHRvIGV4cGxpY2l0bHkgc3VwcHJlc3MgdGhlIHRhZydzIENPREVCQVNFIGF0dHJpYnV0
ZSBpZiB0aGVyZSBpcyBub25lIGluIGEgUEFSQU0sCi0gICAgICAvLyBlbHNlIG91ciBKYXZhIHBs
dWdpbiB3aWxsIG1pc2ludGVycHJldCBpdC4gWzQwMDQ1MzFdCi0gICAgICBTdHJpbmcgY29kZWJh
c2U7Ci0gICAgICBpZiAoIWVtYmVkICYmIHNlcnZpY2VUeXBlLmxvd2VyKCkgPT0gImFwcGxpY2F0
aW9uL3gtamF2YS1hcHBsZXQiKSB7Ci0gICAgICAgICAgY29kZWJhc2UgPSAiY29kZWJhc2UiOwot
ICAgICAgICAgIHVuaXF1ZVBhcmFtTmFtZXMuYWRkKGNvZGViYXNlLmltcGwoKSk7IC8vIHByZXRl
bmQgd2UgZm91bmQgaXQgaW4gYSBQQVJBTSBhbHJlYWR5Ci0gICAgICB9Ci0gICAgICAKLSAgICAg
IC8vIFR1cm4gdGhlIGF0dHJpYnV0ZXMgb2YgZWl0aGVyIHRoZSBFTUJFRCB0YWcgb3IgT0JKRUNU
IHRhZyBpbnRvIGFycmF5cywgYnV0IGRvbid0IG92ZXJyaWRlIFBBUkFNIHZhbHVlcy4KLSAgICAg
IE5hbWVkQXR0ck1hcCogYXR0cmlidXRlcyA9IGVtYmVkT3JPYmplY3QtPmF0dHJpYnV0ZXMoKTsK
LSAgICAgIGlmIChhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGF0dHJpYnV0ZXMtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAgICAgQXR0cmlidXRl
KiBpdCA9IGF0dHJpYnV0ZXMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAgICAgICAgIGNvbnN0
IEF0b21pY1N0cmluZyYgbmFtZSA9IGl0LT5uYW1lKCkubG9jYWxOYW1lKCk7Ci0gICAgICAgICAg
ICAgIGlmIChlbWJlZCB8fCAhdW5pcXVlUGFyYW1OYW1lcy5jb250YWlucyhuYW1lLmltcGwoKSkp
IHsKLSAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMuYXBwZW5kKG5hbWUuZG9tU3RyaW5nKCkp
OwotICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52YWx1ZSgpLmRvbVN0
cmluZygpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAot
ICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUsIHRyeSB0byBtYXAgZnJvbSBh
IHNwZWNpZmljIENMQVNTSUQgdG8gYSB0eXBlLgotICAgICAgaWYgKHNlcnZpY2VUeXBlLmlzRW1w
dHkoKSAmJiAhby0+Y2xhc3NJZC5pc0VtcHR5KCkpCi0gICAgICAgICAgbWFwQ2xhc3NJZFRvU2Vy
dmljZVR5cGUoby0+Y2xhc3NJZCwgc2VydmljZVR5cGUpOwotICAgICAgCi0gICAgICAvLyBJZiBu
byBVUkwgYW5kIHR5cGUsIGFib3J0LgotICAgICAgaWYgKHVybC5pc0VtcHR5KCkgJiYgc2Vydmlj
ZVR5cGUuaXNFbXB0eSgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIGlmICghaXNVUkxBbGxv
d2VkKGRvY3VtZW50KCksIHVybCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBGaW5k
IG91dCBpZiB3ZSBzdXBwb3J0IGZhbGxiYWNrIGNvbnRlbnQuCi0gICAgICBtX2hhc0ZhbGxiYWNr
Q29udGVudCA9IGZhbHNlOwotICAgICAgZm9yIChOb2RlICpjaGlsZCA9IG8tPmZpcnN0Q2hpbGQo
KTsgY2hpbGQgJiYgIW1faGFzRmFsbGJhY2tDb250ZW50OyBjaGlsZCA9IGNoaWxkLT5uZXh0U2li
bGluZygpKSB7Ci0gICAgICAgICAgaWYgKCghY2hpbGQtPmlzVGV4dE5vZGUoKSAmJiAhY2hpbGQt
Pmhhc1RhZ05hbWUoZW1iZWRUYWcpICYmICFjaGlsZC0+aGFzVGFnTmFtZShwYXJhbVRhZykpIHx8
IC8vIERpc2NvdW50IDxlbWJlZD4gYW5kIDxwYXJhbT4KLSAgICAgICAgICAgICAgKGNoaWxkLT5p
c1RleHROb2RlKCkgJiYgIXN0YXRpY19jYXN0PFRleHQqPihjaGlsZCktPmNvbnRhaW5zT25seVdo
aXRlc3BhY2UoKSkpCi0gICAgICAgICAgICAgIG1faGFzRmFsbGJhY2tDb250ZW50ID0gdHJ1ZTsK
LSAgICAgIH0KLSAgICAgIGJvb2wgc3VjY2VzcyA9IGZyYW1lLT5yZXF1ZXN0T2JqZWN0KHRoaXMs
IHVybCwgQXRvbWljU3RyaW5nKG8tPm5hbWUoKSksIHNlcnZpY2VUeXBlLCBwYXJhbU5hbWVzLCBw
YXJhbVZhbHVlcyk7Ci0gICAgICBpZiAoIXN1Y2Nlc3MgJiYgbV9oYXNGYWxsYmFja0NvbnRlbnQp
Ci0gICAgICAgICAgby0+cmVuZGVyRmFsbGJhY2tDb250ZW50KCk7Ci0gIH0gZWxzZSBpZiAoZWxl
bWVudCgpLT5oYXNUYWdOYW1lKGVtYmVkVGFnKSkgewotICAgICAgSFRNTEVtYmVkRWxlbWVudCAq
byA9IHN0YXRpY19jYXN0PEhUTUxFbWJlZEVsZW1lbnQgKj4oZWxlbWVudCgpKTsKLSAgICAgIHVy
bCA9IG8tPnVybDsKLSAgICAgIHNlcnZpY2VUeXBlID0gby0+c2VydmljZVR5cGU7Ci0KLSAgICAg
IGlmICh1cmwuaXNFbXB0eSgpICYmIHNlcnZpY2VUeXBlLmlzRW1wdHkoKSkKLSAgICAgICAgICBy
ZXR1cm47Ci0gICAgICBpZiAoIWlzVVJMQWxsb3dlZChkb2N1bWVudCgpLCB1cmwpKQotICAgICAg
ICAgIHJldHVybjsKLSAgICAgIAotICAgICAgLy8gYWRkIGFsbCBhdHRyaWJ1dGVzIHNldCBvbiB0
aGUgZW1iZWQgb2JqZWN0Ci0gICAgICBOYW1lZEF0dHJNYXAqIGEgPSBvLT5hdHRyaWJ1dGVzKCk7
Ci0gICAgICBpZiAoYSkgewotICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhLT5s
ZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgIEF0dHJpYnV0ZSogaXQgPSBhLT5hdHRyaWJ1
dGVJdGVtKGkpOwotICAgICAgICAgICAgICBwYXJhbU5hbWVzLmFwcGVuZChpdC0+bmFtZSgpLmxv
Y2FsTmFtZSgpLmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5k
KGl0LT52YWx1ZSgpLmRvbVN0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBm
cmFtZS0+cmVxdWVzdE9iamVjdCh0aGlzLCB1cmwsIG8tPmdldEF0dHJpYnV0ZShuYW1lQXR0ciks
IHNlcnZpY2VUeXBlLCBwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcyk7Ci0gIH0gZWxzZSB7Ci0gICAg
ICBhc3NlcnQoZWxlbWVudCgpLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpOwotICAgICAgSFRNTElG
cmFtZUVsZW1lbnQgKm8gPSBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCAqPihlbGVtZW50
KCkpOwotICAgICAgdXJsID0gby0+bV9VUkw7Ci0gICAgICBpZiAoIWlzVVJMQWxsb3dlZChkb2N1
bWVudCgpLCB1cmwpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIGlmICh1cmwuaXNFbXB0eSgp
KQotICAgICAgICAgIHVybCA9ICJhYm91dDpibGFuayI7Ci0gICAgICBGcmFtZVZpZXcgKnYgPSBz
dGF0aWNfY2FzdDxGcmFtZVZpZXcgKj4obV92aWV3KTsKLSAgICAgIHYtPmZyYW1lKCktPnJlcXVl
c3RGcmFtZSh0aGlzLCB1cmwsIG8tPm1fbmFtZSk7Ci0gIH0KLX0KLQotdm9pZCBSZW5kZXJQYXJ0
T2JqZWN0OjpsYXlvdXQoKQotewotICAgIEtIVE1MQXNzZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAg
IEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOwotCi0gICAgY2FsY1dpZHRoKCk7Ci0gICAgY2Fs
Y0hlaWdodCgpOwotCi0gICAgUmVuZGVyUGFydDo6bGF5b3V0KCk7Ci0KLSAgICBzZXROZWVkc0xh
eW91dChmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyUGFydE9iamVjdDo6dmlld0NsZWFyZWQoKQot
ewotICAgIGlmIChlbGVtZW50KCkgJiYgbV93aWRnZXQgJiYgbV93aWRnZXQtPmlzRnJhbWVWaWV3
KCkpIHsKLSAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
bV93aWRnZXQpOwotICAgICAgICBib29sIGhhc0JvcmRlciA9IGZhbHNlOwotICAgICAgICBpbnQg
bWFyZ2ludyA9IC0xOwotICAgICAgICBpbnQgbWFyZ2luaCA9IC0xOwotICAgICAgICBpZiAoZWxl
bWVudCgpLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpIHsKLSAgICAgICAgICAgIEhUTUxJRnJhbWVF
bGVtZW50KiBmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50ICo+KGVsZW1lbnQo
KSk7Ci0gICAgICAgICAgICBoYXNCb3JkZXIgPSBmcmFtZS0+bV9mcmFtZUJvcmRlcjsKLSAgICAg
ICAgICAgIG1hcmdpbncgPSBmcmFtZS0+bV9tYXJnaW5XaWR0aDsKLSAgICAgICAgICAgIG1hcmdp
bmggPSBmcmFtZS0+bV9tYXJnaW5IZWlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWV3LT5z
ZXRIYXNCb3JkZXIoaGFzQm9yZGVyKTsKLSAgICAgICAgdmlldy0+c2V0SWdub3JlV2hlZWxFdmVu
dHMoZWxlbWVudCgpLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpOwotICAgICAgICBpZiAobWFyZ2lu
dyAhPSAtMSkKLSAgICAgICAgICAgIHZpZXctPnNldE1hcmdpbldpZHRoKG1hcmdpbncpOwotICAg
ICAgICBpZiAobWFyZ2luaCAhPSAtMSkKLSAgICAgICAgICAgIHZpZXctPnNldE1hcmdpbkhlaWdo
dChtYXJnaW5oKTsKLSAgICB9Ci19Ci0KIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgbmVj
ZXNzYXJ5LiAgUmVtb3ZlIHRoaXMgb25jZSBXZWJLaXQga25vd3MgdG8gcHJvcGVybHkgc2NoZWR1
bGUKIC8vIGxheW91dHMgdXNpbmcgV2ViQ29yZSB3aGVuIG9iamVjdHMgcmVzaXplLgogdm9pZCBS
ZW5kZXJQYXJ0Ojp1cGRhdGVXaWRnZXRQb3NpdGlvbigpCkluZGV4OiByZW5kZXJpbmcvcmVuZGVy
X2Zvcm0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAkocmV2aXNpb24g
MTQzMjUpCisrKyByZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaAkod29ya2luZyBjb3B5KQpAQCAtMjYs
NiArMjYsNyBAQAogI2lmbmRlZiBSRU5ERVJfRk9STV9ICiAjZGVmaW5lIFJFTkRFUl9GT1JNX0gK
IAorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIK
ICNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgogI2luY2x1ZGUgIlJlbmRlckltYWdlLmgiCkluZGV4
OiByZW5kZXJpbmcvUmVuZGVyV2lkZ2V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVu
ZGVyV2lkZ2V0LmNwcAkocmV2aXNpb24gMTQzMjUpCisrKyByZW5kZXJpbmcvUmVuZGVyV2lkZ2V0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjEsMTkgKzIxLDE1IEBACiAgKiBCb3N0b24sIE1BIDAy
MTExLTEzMDcsIFVTQS4KICAqCiAgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
InJlbmRlcl9yZXBsYWNlZC5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgogCi0jaW5jbHVk
ZSAiQnJvd3NlckV4dGVuc2lvbi5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiIC8vICMjIyByZW1v
dmUgZGVwZW5kZW5jeQorI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiRWxlbWVudC5o
IgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgogI2luY2x1
ZGUgIlJlbmRlckNhbnZhcy5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgogCiB1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwogCkBAIC00MSwyMDEgKzM3LDEwIEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAogdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CiAKLVJlbmRlclJlcGxhY2VkOjpSZW5k
ZXJSZXBsYWNlZChOb2RlKiBub2RlKQotICAgIDogUmVuZGVyQm94KG5vZGUpCi17Ci0gICAgLy8g
aW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNldFJlcGxhY2VkKHRydWUpOwotCi0g
ICAgbV9pbnRyaW5zaWNXaWR0aCA9IDMwMDsKLSAgICBtX2ludHJpbnNpY0hlaWdodCA9IDE1MDsK
LSAgICBtX3NlbGVjdGlvblN0YXRlID0gU2VsZWN0aW9uTm9uZTsKLX0KLQotYm9vbCBSZW5kZXJS
ZXBsYWNlZDo6c2hvdWxkUGFpbnQoUGFpbnRJbmZvJiBpLCBpbnQmIF90eCwgaW50JiBfdHkpCi17
Ci0gICAgaWYgKGkucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgJiYgaS5waGFzZSAhPSBQ
YWludFBoYXNlT3V0bGluZSAmJiBpLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSAKLSAg
ICAgICAgJiYgaS5waGFzZSAhPSBQYWludFBoYXNlU2VsZWN0aW9uKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBpZiAoIXNob3VsZFBhaW50V2l0aGluUm9vdChpKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAvLyBpZiB3ZSdyZSBpbnZpc2libGUgb3IgaGF2ZW4n
dCByZWNlaXZlZCBhIGxheW91dCB5ZXQsIHRoZW4ganVzdCBiYWlsLgotICAgIGlmIChzdHlsZSgp
LT52aXNpYmlsaXR5KCkgIT0gVklTSUJMRSB8fCBtX3kgPD0gIC01MDAwMDApICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpbnQgdHggPSBfdHggKyBtX3g7Ci0gICAgaW50IHR5ID0gX3R5ICsgbV95Owot
Ci0gICAgLy8gRWFybHkgZXhpdCBpZiB0aGUgZWxlbWVudCB0b3VjaGVzIHRoZSBlZGdlcy4KLSAg
ICBpbnQgdG9wID0gdHk7Ci0gICAgaW50IGJvdHRvbSA9IHR5ICsgbV9oZWlnaHQ7Ci0gICAgaWYg
KGlzU2VsZWN0ZWQoKSAmJiBtX2lubGluZUJveFdyYXBwZXIpIHsKLSAgICAgICAgaW50IHNlbFRv
cCA9IF90eSArIG1faW5saW5lQm94V3JhcHBlci0+cm9vdCgpLT5zZWxlY3Rpb25Ub3AoKTsKLSAg
ICAgICAgaW50IHNlbEJvdHRvbSA9IF90eSArIHNlbFRvcCArIG1faW5saW5lQm94V3JhcHBlci0+
cm9vdCgpLT5zZWxlY3Rpb25IZWlnaHQoKTsKLSAgICAgICAgdG9wID0gbWluKHNlbFRvcCwgdG9w
KTsKLSAgICAgICAgYm90dG9tID0gbWF4KHNlbEJvdHRvbSwgYm90dG9tKTsKLSAgICB9Ci0gICAg
Ci0gICAgaW50IG9zID0gMiptYXhpbWFsT3V0bGluZVNpemUoaS5waGFzZSk7Ci0gICAgaWYgKHR4
ID49IGkuci5yaWdodCgpICsgb3MgfHwgdHggKyBtX3dpZHRoIDw9IGkuci54KCkgLSBvcykKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh0b3AgPj0gaS5yLmJvdHRvbSgpICsgb3MgfHwg
Ym90dG9tIDw9IGkuci55KCkgLSBvcykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVuZGVyUmVwbGFjZWQ6OmNhbGNNaW5NYXhXaWR0aCgpCi17
Ci0gICAgS0hUTUxBc3NlcnQoICFtaW5NYXhLbm93bigpKTsKLQotI2lmZGVmIERFQlVHX0xBWU9V
VAotICAgIGtkRGVidWcoIDYwNDAgKSA8PCAiUmVuZGVyUmVwbGFjZWQ6OmNhbGNNaW5NYXhXaWR0
aCgpIGtub3duPSIgPDwgbWluTWF4S25vd24oKSA8PCBlbmRsOwotI2VuZGlmCi0KLSAgICBpbnQg
d2lkdGggPSBjYWxjUmVwbGFjZWRXaWR0aCgpICsgcGFkZGluZ0xlZnQoKSArIHBhZGRpbmdSaWdo
dCgpICsgYm9yZGVyTGVmdCgpICsgYm9yZGVyUmlnaHQoKTsKLSAgICBpZiAoc3R5bGUoKS0+d2lk
dGgoKS5pc1BlcmNlbnQoKSB8fCAoc3R5bGUoKS0+d2lkdGgoKS5pc0F1dG8oKSAmJiBzdHlsZSgp
LT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkpIHsKLSAgICAgICAgbV9taW5XaWR0aCA9IDA7Ci0gICAg
ICAgIG1fbWF4V2lkdGggPSB3aWR0aDsKLSAgICB9IGVsc2UKLSAgICAgICAgbV9taW5XaWR0aCA9
IG1fbWF4V2lkdGggPSB3aWR0aDsKLQotICAgIHNldE1pbk1heEtub3duKCk7Ci19Ci0KLXNob3J0
IFJlbmRlclJlcGxhY2VkOjpsaW5lSGVpZ2h0KCBib29sLCBib29sICkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gaGVpZ2h0KCkrbWFyZ2luVG9wKCkrbWFyZ2luQm90dG9tKCk7Ci19Ci0KLXNob3J0IFJl
bmRlclJlcGxhY2VkOjpiYXNlbGluZVBvc2l0aW9uKCBib29sLCBib29sICkgY29uc3QKLXsKLSAg
ICByZXR1cm4gaGVpZ2h0KCkrbWFyZ2luVG9wKCkrbWFyZ2luQm90dG9tKCk7Ci19Ci0KLWludCBS
ZW5kZXJSZXBsYWNlZDo6Y2FyZXRNaW5PZmZzZXQoKSBjb25zdCAKLXsgCi0gICAgcmV0dXJuIDA7
IAotfQotCiAvLyBSZXR1cm5zIDEgc2luY2UgYSByZXBsYWNlZCBlbGVtZW50IGNhbiBoYXZlIHRo
ZSBjYXJldCBwb3NpdGlvbmVkIAogLy8gYXQgaXRzIGJlZ2lubmluZyAoMCksIG9yIGF0IGl0cyBl
bmQgKDEpLgogLy8gTk9URTogWWV0LCAic2VsZWN0IiBlbGVtZW50cyBjYW4gaGF2ZSBhbnkgbnVt
YmVyIG9mICJvcHRpb24iIGVsZW1lbnRzCiAvLyBhcyBjaGlsZHJlbiwgc28gdGhpcyAiMCBvciAx
IiBpZGVhIGRvZXMgbm90IHJlYWxseSBob2xkIHVwLgotaW50IFJlbmRlclJlcGxhY2VkOjpjYXJl
dE1heE9mZnNldCgpIGNvbnN0IAoteyAKLSAgICByZXR1cm4gMTsgCi19Ci0KLXVuc2lnbmVkIFJl
bmRlclJlcGxhY2VkOjpjYXJldE1heFJlbmRlcmVkT2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gMTsgCi19Ci0KLVZpc2libGVQb3NpdGlvbiBSZW5kZXJSZXBsYWNlZDo6cG9zaXRpb25Gb3JD
b29yZGluYXRlcyhpbnQgX3gsIGludCBfeSkKLXsKLSAgICBJbmxpbmVCb3ggKmJveCA9IGlubGlu
ZUJveFdyYXBwZXIoKTsKLSAgICBpZiAoIWJveCkKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3Np
dGlvbihlbGVtZW50KCksIDAsIERPV05TVFJFQU0pOwotCi0gICAgUm9vdElubGluZUJveCAqcm9v
dCA9IGJveC0+cm9vdCgpOwotCi0gICAgaW50IGFic3gsIGFic3k7Ci0gICAgY29udGFpbmluZ0Js
b2NrKCktPmFic29sdXRlUG9zaXRpb24oYWJzeCwgYWJzeSk7Ci0KLSAgICBpbnQgdG9wID0gYWJz
eSArIHJvb3QtPnRvcE92ZXJmbG93KCk7Ci0gICAgaW50IGJvdHRvbSA9IHJvb3QtPm5leHRSb290
Qm94KCkgPyBhYnN5ICsgcm9vdC0+bmV4dFJvb3RCb3goKS0+dG9wT3ZlcmZsb3coKSA6IGFic3kg
KyByb290LT5ib3R0b21PdmVyZmxvdygpOwotCi0gICAgaWYgKF95IDwgdG9wKQotICAgICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKGVsZW1lbnQoKSwgY2FyZXRNaW5PZmZzZXQoKSwgRE9XTlNU
UkVBTSk7IC8vIGNvb3JkaW5hdGVzIGFyZSBhYm92ZQotICAgIAotICAgIGlmIChfeSA+PSBib3R0
b20pCi0gICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oZWxlbWVudCgpLCBjYXJldE1heE9m
ZnNldCgpLCBET1dOU1RSRUFNKTsgLy8gY29vcmRpbmF0ZXMgYXJlIGJlbG93Ci0gICAgCi0gICAg
aWYgKGVsZW1lbnQoKSkgewotICAgICAgICBpZiAoX3ggPD0gYWJzeCArIHhQb3MoKSArICh3aWR0
aCgpIC8gMikpCi0gICAgICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKGVsZW1lbnQoKSwg
MCwgRE9XTlNUUkVBTSk7Ci0KLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihlbGVtZW50
KCksIDEsIERPV05TVFJFQU0pOwotICAgIH0KLQotICAgIHJldHVybiBSZW5kZXJCb3g6OnBvc2l0
aW9uRm9yQ29vcmRpbmF0ZXMoX3gsIF95KTsKLX0KLQotSW50UmVjdCBSZW5kZXJSZXBsYWNlZDo6
c2VsZWN0aW9uUmVjdCgpCi17Ci0gICAgaWYgKCFpc1NlbGVjdGVkKCkpCi0gICAgICAgIHJldHVy
biBJbnRSZWN0KCk7Ci0gICAgaWYgKCFtX2lubGluZUJveFdyYXBwZXIpCi0gICAgICAgIC8vIFdl
J3JlIGEgYmxvY2stbGV2ZWwgcmVwbGFjZWQgZWxlbWVudC4gIEp1c3QgcmV0dXJuIG91ciBvd24g
ZGltZW5zaW9ucy4KLSAgICAgICAgcmV0dXJuIGFic29sdXRlQm91bmRpbmdCb3hSZWN0KCk7Ci0K
LSAgICBSZW5kZXJCbG9jayogY2IgPSAgY29udGFpbmluZ0Jsb2NrKCk7Ci0gICAgaWYgKCFjYikK
LSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLSAgICAKLSAgICBSb290SW5saW5lQm94KiByb290
ID0gbV9pbmxpbmVCb3hXcmFwcGVyLT5yb290KCk7Ci0gICAgaW50IHNlbGVjdGlvblRvcCA9IHJv
b3QtPnNlbGVjdGlvblRvcCgpOwotICAgIGludCBzZWxlY3Rpb25IZWlnaHQgPSByb290LT5zZWxl
Y3Rpb25IZWlnaHQoKTsKLSAgICBpbnQgc2VsZWN0aW9uTGVmdCA9IHhQb3MoKTsKLSAgICBpbnQg
c2VsZWN0aW9uUmlnaHQgPSB4UG9zKCkgKyB3aWR0aCgpOwotICAgIAotICAgIGludCBhYnN4LCBh
YnN5OwotICAgIGNiLT5hYnNvbHV0ZVBvc2l0aW9uKGFic3gsIGFic3kpOwotICAgIGlmIChjYi0+
aGFzT3ZlcmZsb3dDbGlwKCkpCi0gICAgICAgIGNiLT5sYXllcigpLT5zdWJ0cmFjdFNjcm9sbE9m
ZnNldChhYnN4LCBhYnN5KTsKLQotICAgIHJldHVybiBJbnRSZWN0KHNlbGVjdGlvbkxlZnQgKyBh
YnN4LCBzZWxlY3Rpb25Ub3AgKyBhYnN5LCBzZWxlY3Rpb25SaWdodCAtIHNlbGVjdGlvbkxlZnQs
IHNlbGVjdGlvbkhlaWdodCk7Ci19Ci0KLXZvaWQgUmVuZGVyUmVwbGFjZWQ6OnNldFNlbGVjdGlv
blN0YXRlKFNlbGVjdGlvblN0YXRlIHMpCi17Ci0gICAgbV9zZWxlY3Rpb25TdGF0ZSA9IHM7Ci0g
ICAgaWYgKG1faW5saW5lQm94V3JhcHBlcikgewotICAgICAgICBSb290SW5saW5lQm94KiBsaW5l
ID0gbV9pbmxpbmVCb3hXcmFwcGVyLT5yb290KCk7Ci0gICAgICAgIGlmIChsaW5lKQotICAgICAg
ICAgICAgbGluZS0+c2V0SGFzU2VsZWN0ZWRDaGlsZHJlbihpc1NlbGVjdGVkKCkpOwotICAgIH0K
LSAgICAKLSAgICBjb250YWluaW5nQmxvY2soKS0+c2V0U2VsZWN0aW9uU3RhdGUocyk7Ci19Ci0K
LWJvb2wgUmVuZGVyUmVwbGFjZWQ6OmlzU2VsZWN0ZWQoKQotewotICAgIFNlbGVjdGlvblN0YXRl
IHMgPSBzZWxlY3Rpb25TdGF0ZSgpOwotICAgIGlmIChzID09IFNlbGVjdGlvbk5vbmUpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAocyA9PSBTZWxlY3Rpb25JbnNpZGUpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgaW50IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQ7Ci0g
ICAgUmVuZGVyT2JqZWN0OjpzZWxlY3Rpb25TdGFydEVuZChzZWxlY3Rpb25TdGFydCwgc2VsZWN0
aW9uRW5kKTsKLSAgICBpZiAocyA9PSBTZWxlY3Rpb25TdGFydCkKLSAgICAgICAgcmV0dXJuIHNl
bGVjdGlvblN0YXJ0ID09IDA7Ci0gICAgICAgIAotICAgIGludCBlbmQgPSBlbGVtZW50KCktPmhh
c0NoaWxkTm9kZXMoKSA/IGVsZW1lbnQoKS0+Y2hpbGROb2RlQ291bnQoKSA6IDE7Ci0gICAgaWYg
KHMgPT0gU2VsZWN0aW9uRW5kKQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uRW5kID09IGVuZDsK
LSAgICBpZiAocyA9PSBTZWxlY3Rpb25Cb3RoKQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uU3Rh
cnQgPT0gMCAmJiBzZWxlY3Rpb25FbmQgPT0gZW5kOwotICAgICAgICAKLSAgICBBU1NFUlQoMCk7
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Db2xvciBSZW5kZXJSZXBsYWNlZDo6c2VsZWN0aW9u
Q29sb3IoR3JhcGhpY3NDb250ZXh0KiBwKSBjb25zdAotewotICAgIENvbG9yIGNvbG9yID0gUmVu
ZGVyQm94OjpzZWxlY3Rpb25Db2xvcihwKTsKLSAgICAgICAgIAotICAgIC8vIExpbWl0IHRoZSBv
cGFjaXR5IHNvIHRoYXQgbm8gdXNlci1zcGVjaWZpZWQgc2VsZWN0aW9uIGNvbG9yIGNhbiBvYnNj
dXJlIHNlbGVjdGVkIGltYWdlcy4KLSAgICBpZiAoY29sb3IuYWxwaGEoKSA+IHNlbGVjdGlvbkNv
bG9ySW1hZ2VPdmVybGF5QWxwaGEpCi0gICAgICAgIGNvbG9yID0gQ29sb3IoY29sb3IucmVkKCks
IGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgc2VsZWN0aW9uQ29sb3JJbWFnZU92ZXJsYXlB
bHBoYSk7Ci0KLSAgICByZXR1cm4gY29sb3I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAKIFJlbmRlcldpZGdldDo6UmVuZGVyV2lkZ2V0KE5vZGUqIG5vZGUpCiAgICAgICA6IFJlbmRl
clJlcGxhY2VkKG5vZGUpCkBAIC00NzYsNSArMjgxLDQgQEAgdm9pZCBSZW5kZXJXaWRnZXQ6OmRl
bGV0ZVdpZGdldCgpCiB7CiAgICAgZGVsZXRlIG1fd2lkZ2V0OwogfQotCiB9CkluZGV4OiByZW5k
ZXJpbmcvcmVuZGVyX3JlcGxhY2VkLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9y
ZXBsYWNlZC5oCShyZXZpc2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQu
aAkod29ya2luZyBjb3B5KQpAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBw
YXJ0IG9mIHRoZSBIVE1MIHdpZGdldCBmb3IgS0RFLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5
OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1
LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgot
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAw
MjExMS0xMzA3LCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgcmVuZGVyX3JlcGxhY2VkX2gKLSNk
ZWZpbmUgcmVuZGVyX3JlcGxhY2VkX2gKLQotI2luY2x1ZGUgIlJlbmRlckJveC5oIgotCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIEZyYW1lVmlldzsKLWNsYXNzIFBvc2l0aW9uOwotY2xh
c3MgV2lkZ2V0OwotCi1jbGFzcyBSZW5kZXJSZXBsYWNlZCA6IHB1YmxpYyBSZW5kZXJCb3gKLXsK
LXB1YmxpYzoKLSAgICBSZW5kZXJSZXBsYWNlZChOb2RlKik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0
IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyUmVwbGFjZWQiOyB9Ci0K
LSAgICB2aXJ0dWFsIHNob3J0IGxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290
TGluZUJveCA9IGZhbHNlKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9zaXRp
b24oYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNlKSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKLQotICAgIGJvb2wgc2hvdWxkUGFp
bnQoUGFpbnRJbmZvJiwgaW50JiB0eCwgaW50JiB0eSk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50
KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCBpbnRy
aW5zaWNXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1faW50cmluc2ljV2lkdGg7IH0KLSAgICB2aXJ0
dWFsIGludCBpbnRyaW5zaWNIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpY0hlaWdo
dDsgfQotCi0gICAgdm9pZCBzZXRJbnRyaW5zaWNXaWR0aChpbnQgdykgeyBtX2ludHJpbnNpY1dp
ZHRoID0gdzsgfQotICAgIHZvaWQgc2V0SW50cmluc2ljSGVpZ2h0KGludCBoKSB7IG1faW50cmlu
c2ljSGVpZ2h0ID0gaDsgfQotCi0gICAgdmlydHVhbCBpbnQgY2FyZXRNaW5PZmZzZXQoKSBjb25z
dDsKLSAgICB2aXJ0dWFsIGludCBjYXJldE1heE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwg
dW5zaWduZWQgY2FyZXRNYXhSZW5kZXJlZE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgVmlz
aWJsZVBvc2l0aW9uIHBvc2l0aW9uRm9yQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KTsKLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVTZWxlY3Rpb25MZWFmKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotICAgIHZpcnR1YWwgU2VsZWN0aW9uU3RhdGUgc2VsZWN0aW9uU3RhdGUoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxTZWxlY3Rpb25TdGF0ZT4obV9zZWxlY3Rpb25TdGF0ZSk7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUpOwotICAg
IHZpcnR1YWwgSW50UmVjdCBzZWxlY3Rpb25SZWN0KCk7Ci0gICAgYm9vbCBpc1NlbGVjdGVkKCk7
Ci0gICAgdmlydHVhbCBDb2xvciBzZWxlY3Rpb25Db2xvcihHcmFwaGljc0NvbnRleHQqKSBjb25z
dDsKLQotcHJvdGVjdGVkOgotICAgIGludCBtX2ludHJpbnNpY1dpZHRoOwotICAgIGludCBtX2lu
dHJpbnNpY0hlaWdodDsKLSAgICAKLSAgICB1bnNpZ25lZCBtX3NlbGVjdGlvblN0YXRlIDogMzsg
Ly8gU2VsZWN0aW9uU3RhdGUKLX07Ci0KLQotY2xhc3MgUmVuZGVyV2lkZ2V0IDogcHVibGljIFJl
bmRlclJlcGxhY2VkLCBwdWJsaWMgV2lkZ2V0Q2xpZW50Ci17Ci1wdWJsaWM6Ci0gICAgUmVuZGVy
V2lkZ2V0KE5vZGUqKTsKLSAgICB2aXJ0dWFsIH5SZW5kZXJXaWRnZXQoKTsKLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRTdHlsZShSZW5kZXJTdHlsZSopOwotCi0gICAgdmlydHVhbCB2b2lkIHBhaW50
KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1dpZGdl
dCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgp
OwotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoICk7Ci0KLSAgICBXaWRnZXQqIHdpZGdldCgpIGNv
bnN0IHsgcmV0dXJuIG1fd2lkZ2V0OyB9Ci0gICAgRnJhbWVWaWV3KiB2aWV3KCkgY29uc3QgeyBy
ZXR1cm4gbV92aWV3OyB9Ci0KLSAgICBSZW5kZXJBcmVuYSogcmVmKCkgeyArK21fcmVmQ291bnQ7
IHJldHVybiByZW5kZXJBcmVuYSgpOyB9Ci0gICAgdm9pZCBkZXJlZihSZW5kZXJBcmVuYSopOwot
ICAgIAotICAgIHZpcnR1YWwgdm9pZCBzZXRTZWxlY3Rpb25TdGF0ZShTZWxlY3Rpb25TdGF0ZSk7
Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlV2lkZ2V0UG9zaXRpb24oKTsKLQotICAgIHZpcnR1
YWwgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0Kik7Ci0KLSAgICB1c2luZyBSZW5kZXJSZXBsYWNlZDo6
ZWxlbWVudDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgZm9jdXNJbihXaWRnZXQqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgZm9jdXNPdXQoV2lkZ2V0Kik7Ci0gICAgdmlydHVhbCB2b2lkIHNj
cm9sbFRvVmlzaWJsZShXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIEVsZW1lbnQqIGVsZW1lbnQoV2lk
Z2V0Kik7Ci0gICAgdmlydHVhbCBib29sIGlzVmlzaWJsZShXaWRnZXQqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgc2VuZENvbnN1bWVkTW91c2VVcChXaWRnZXQqKTsKLQotICAgIHZvaWQgcmVzaXplV2lk
Z2V0KFdpZGdldCosIGludCB3LCBpbnQgaCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVsZXRlV2lk
Z2V0KCk7Ci0KLXByb3RlY3RlZDoKLSAgICBXaWRnZXQqIG1fd2lkZ2V0OwotICAgIEZyYW1lVmll
dyogbV92aWV3OwotcHJpdmF0ZToKLSAgICBpbnQgbV9yZWZDb3VudDsKLX07Ci0KLX0KLQotI2Vu
ZGlmCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyRnJhbWUuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvUmVuZGVyRnJhbWUuaAkocmV2aXNpb24gMTQzMjUpCisrKyByZW5kZXJpbmcvUmVuZGVyRnJh
bWUuaAkod29ya2luZyBjb3B5KQpAQCAtMjIsOTYgKzIyLDE0IEBACiAgKgogICovCiAKLSNpZm5k
ZWYgcmVuZGVyX2ZyYW1lc19oX18KLSNkZWZpbmUgcmVuZGVyX2ZyYW1lc19oX18KKyNpZm5kZWYg
UmVuZGVyRnJhbWVfSAorI2RlZmluZSBSZW5kZXJGcmFtZV9ICiAKLSNpbmNsdWRlICJSZW5kZXJD
b250YWluZXIuaCIKLSNpbmNsdWRlICJyZW5kZXJfcmVwbGFjZWQuaCIKLSNpbmNsdWRlICJodG1s
X2Jhc2VpbXBsLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydC5oIgorI2luY2x1ZGUgIkhUTUxGcmFt
ZUVsZW1lbnQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBGcmFtZVZpZXc7Ci1j
bGFzcyBIVE1MRWxlbWVudDsKLWNsYXNzIEhUTUxGcmFtZUVsZW1lbnQ7Ci1jbGFzcyBNb3VzZUV2
ZW50OwotCi1zdHJ1Y3QgQ2hpbGRGcmFtZTsKLQotY2xhc3MgUmVuZGVyRnJhbWVTZXQgOiBwdWJs
aWMgUmVuZGVyQ29udGFpbmVyCi17Ci0gICAgZnJpZW5kIGNsYXNzIEhUTUxGcmFtZVNldEVsZW1l
bnQ7Ci1wdWJsaWM6Ci0gICAgUmVuZGVyRnJhbWVTZXQoSFRNTEZyYW1lU2V0RWxlbWVudCopOwot
ICAgIHZpcnR1YWwgflJlbmRlckZyYW1lU2V0KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIq
IHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyRnJhbWVTZXQiOyB9Ci0gICAgdmly
dHVhbCBib29sIGlzRnJhbWVTZXQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2aXJ0
dWFsIHZvaWQgbGF5b3V0KCk7Ci0KLSAgICB2b2lkIHBvc2l0aW9uRnJhbWVzKCk7Ci0KLSAgICBi
b29sIHJlc2l6aW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZXNpemluZzsgfQotCi0gICAgYm9vbCB1
c2VyUmVzaXplKE1vdXNlRXZlbnQqKTsKLSAgICBib29sIGNhblJlc2l6ZShpbnQgeCwgaW50IHkp
OwotICAgIHZvaWQgc2V0UmVzaXppbmcoYm9vbCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0
UG9pbnQoTm9kZUluZm8mLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0
aW9uKTsKLQotICAgIEhUTUxGcmFtZVNldEVsZW1lbnQqIGVsZW1lbnQoKSBjb25zdAotICAgICAg
ICB7IHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50Kj4oUmVuZGVyQ29udGFp
bmVyOjplbGVtZW50KCkpOyB9Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgdmlydHVhbCB2b2lkIGR1
bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRlZFN0cmluZyBpbmQgPSAiIikgY29uc3Q7
Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgICBpbnQgbV9vbGRwb3M7Ci0gICAgaW50IG1fZ3JpZExl
blsyXTsKLSAgICBpbnQqIG1fZ3JpZERlbHRhWzJdOwotICAgIGludCogbV9ncmlkTGF5b3V0WzJd
OwotCi0gICAgYm9vbCogbV9oU3BsaXRWYXI7IC8vIGlzIHRoaXMgc3BsaXQgdmFyaWFibGU/Ci0g
ICAgYm9vbCogbV92U3BsaXRWYXI7Ci0KLSAgICBpbnQgbV9oU3BsaXQ7IC8vIHRoZSBzcGxpdCBj
dXJyZW50bHkgcmVzaXplZAotICAgIGludCBtX3ZTcGxpdDsKLSAgICBpbnQgbV9oU3BsaXRQb3M7
Ci0gICAgaW50IG1fdlNwbGl0UG9zOwotCi0gICAgYm9vbCBtX3Jlc2l6aW5nOwotICAgIGJvb2wg
bV9jbGllbnRSZXNpemluZzsKLX07Ci0KLWNsYXNzIFJlbmRlclBhcnQgOiBwdWJsaWMgUmVuZGVy
V2lkZ2V0IHsKLXB1YmxpYzoKLSAgICBSZW5kZXJQYXJ0KEhUTUxFbGVtZW50Kik7Ci0gICAgdmly
dHVhbCB+UmVuZGVyUGFydCgpOwotICAgIAotICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVy
TmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJQYXJ0IjsgfQotCi0gICAgdm9pZCBzZXRGcmFt
ZShGcmFtZSopOwotICAgIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCopOwotCi0gICAgLy8gRklYTUU6
IFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCi0gICAgLy8gUmVtb3ZlIHRoaXMgb25jZSBX
ZWJLaXQga25vd3MgdG8gcHJvcGVybHkgc2NoZWR1bGUgbGF5b3V0cyB1c2luZyBXZWJDb3JlIHdo
ZW4gb2JqZWN0cyByZXNpemUuCi0gICAgdm9pZCB1cGRhdGVXaWRnZXRQb3NpdGlvbigpOwotCi0g
ICAgYm9vbCBoYXNGYWxsYmFja0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZhbGxiYWNr
Q29udGVudDsgfQotCi0gICAgdmlydHVhbCB2b2lkIHZpZXdDbGVhcmVkKCk7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBib29sIG1faGFzRmFsbGJhY2tDb250ZW50OwotCi1wcml2YXRlOgotICAgIHZpcnR1
YWwgdm9pZCBkZWxldGVXaWRnZXQoKTsKLQotICAgIEZyYW1lKiBtX2ZyYW1lOwotfTsKLQogY2xh
c3MgUmVuZGVyRnJhbWUgOiBwdWJsaWMgUmVuZGVyUGFydAogewogcHVibGljOgpAQCAtMTI1LDIw
ICs0Myw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgdmlld0NsZWFyZWQoKTsKIH07CiAK
LS8vIEkgY2FuIGhhcmRseSBjYWxsIHRoZSBjbGFzcyBSZW5kZXJPYmplY3QgOy0pCi1jbGFzcyBS
ZW5kZXJQYXJ0T2JqZWN0IDogcHVibGljIFJlbmRlclBhcnQKLXsKLXB1YmxpYzoKLSAgICBSZW5k
ZXJQYXJ0T2JqZWN0KEhUTUxFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJl
bmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyUGFydE9iamVjdCI7IH0KLQotICAgIHZp
cnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlV2lkZ2V0KCk7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgdmlld0NsZWFyZWQoKTsKLX07Ci0KIH0KIAogI2VuZGlmCkluZGV4
OiByZW5kZXJpbmcvUmVuZGVyRnJhbWVTZXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9S
ZW5kZXJGcmFtZVNldC5jcHAJKHJldmlzaW9uIDE0MzI1KQorKysgcmVuZGVyaW5nL1JlbmRlckZy
YW1lU2V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsMjggKzIyLDE4IEBACiAgKiBCb3N0b24s
IE1BIDAyMTExLTEzMDcsIFVTQS4KICAqCiAgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgInJlbmRlcl9mcmFtZXMuaCIKKyNpbmNsdWRlICJSZW5kZXJGcmFtZVNldC5oIgogCiAj
aW5jbHVkZSAiQ3Vyc29yLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFdmVu
dE5hbWVzLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVRyZWUuaCIKICNp
bmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNs
dWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1w
bC5oIgotI2luY2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKLSNpbmNsdWRlICJIVE1MRW1iZWRFbGVt
ZW50LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTE9iamVjdEVsZW1l
bnQuaCIKLSNpbmNsdWRlICJIVE1MUGFyYW1FbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTFRva2Vu
aXplci5oIgotI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lU2V0
RWxlbWVudC5oIgorI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5oIgogI2luY2x1ZGUgIlJlbmRl
ckNhbnZhcy5oIgorI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCiAjaW5jbHVkZSAiS1dRVGV4dFN0
cmVhbS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC01MSw4ICs0MSwxNCBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiB1c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKIHVzaW5nIG5hbWVzcGFj
ZSBIVE1MTmFtZXM7CiAKLVJlbmRlckZyYW1lU2V0OjpSZW5kZXJGcmFtZVNldCggSFRNTEZyYW1l
U2V0RWxlbWVudCAqZnJhbWVTZXQpCitSZW5kZXJGcmFtZVNldDo6UmVuZGVyRnJhbWVTZXQoSFRN
TEZyYW1lU2V0RWxlbWVudCogZnJhbWVTZXQpCiAgICAgOiBSZW5kZXJDb250YWluZXIoZnJhbWVT
ZXQpCisgICAgLCBtX2hTcGxpdFZhcigwKQorICAgICwgbV92U3BsaXRWYXIoMCkKKyAgICAsIG1f
aFNwbGl0KC0xKQorICAgICwgbV92U3BsaXQoLTEpCisgICAgLCBtX3Jlc2l6aW5nKGZhbHNlKQor
ICAgICwgbV9jbGllbnRSZXNpemluZyhmYWxzZSkKIHsKICAgLy8gaW5pdCBSZW5kZXJPYmplY3Qg
YXR0cmlidXRlcwogICAgIHNldElubGluZShmYWxzZSk7CkBAIC02MiwyMSArNTgsMTUgQEAgUmVu
ZGVyRnJhbWVTZXQ6OlJlbmRlckZyYW1lU2V0KCBIVE1MRnJhbQogICAgICAgbV9ncmlkRGVsdGFb
a10gPSAwOwogICAgICAgbV9ncmlkTGF5b3V0W2tdID0gMDsKICAgfQotCi0gIG1fcmVzaXppbmcg
PSBtX2NsaWVudFJlc2l6aW5nID0gZmFsc2U7Ci0KLSAgbV9oU3BsaXQgPSAtMTsKLSAgbV92U3Bs
aXQgPSAtMTsKLQotICBtX2hTcGxpdFZhciA9IDA7Ci0gIG1fdlNwbGl0VmFyID0gMDsKIH0KIAog
UmVuZGVyRnJhbWVTZXQ6On5SZW5kZXJGcmFtZVNldCgpCiB7CiAgICAgZm9yIChpbnQgayA9IDA7
IGsgPCAyOyArK2spIHsKLSAgICAgICAgaWYgKG1fZ3JpZExheW91dFtrXSkgZGVsZXRlIFtdIG1f
Z3JpZExheW91dFtrXTsKLSAgICAgICAgaWYgKG1fZ3JpZERlbHRhW2tdKSBkZWxldGUgW10gbV9n
cmlkRGVsdGFba107CisgICAgICAgIGlmIChtX2dyaWRMYXlvdXRba10pCisgICAgICAgICAgICBk
ZWxldGUgW10gbV9ncmlkTGF5b3V0W2tdOworICAgICAgICBpZiAobV9ncmlkRGVsdGFba10pCisg
ICAgICAgICAgICBkZWxldGUgW10gbV9ncmlkRGVsdGFba107CiAgICAgfQogICBpZiAobV9oU3Bs
aXRWYXIpCiAgICAgICBkZWxldGUgW10gbV9oU3BsaXRWYXI7CkBAIC0xMDAsMTIgKzkwLDEyIEBA
IGJvb2wgUmVuZGVyRnJhbWVTZXQ6Om5vZGVBdFBvaW50KE5vZGVJbmYKICAgICByZXR1cm4gaW5z
aWRlIHx8IG1fY2xpZW50UmVzaXppbmc7CiB9CiAKLXZvaWQgUmVuZGVyRnJhbWVTZXQ6OmxheW91
dCggKQordm9pZCBSZW5kZXJGcmFtZVNldDo6bGF5b3V0KCkKIHsKLSAgICBLSFRNTEFzc2VydCgg
bmVlZHNMYXlvdXQoKSApOwotICAgIEtIVE1MQXNzZXJ0KCBtaW5NYXhLbm93bigpICk7CisgICAg
S0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7CisgICAgS0hUTUxBc3NlcnQobWluTWF4S25vd24o
KSk7CiAKLSAgICBpZiAoICFwYXJlbnQoKS0+aXNGcmFtZVNldCgpICkgeworICAgIGlmICghcGFy
ZW50KCktPmlzRnJhbWVTZXQoKSkgewogICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjYW52YXMo
KS0+dmlldygpOwogICAgICAgICBtX3dpZHRoID0gdmlldy0+dmlzaWJsZVdpZHRoKCk7CiAgICAg
ICAgIG1faGVpZ2h0ID0gdmlldy0+dmlzaWJsZUhlaWdodCgpOwpAQCAtMTEzLDkgKzEwMywxMSBA
QCB2b2lkIFJlbmRlckZyYW1lU2V0OjpsYXlvdXQoICkKIAogICAgIGludCByZW1haW5pbmdMZW5b
Ml07CiAgICAgcmVtYWluaW5nTGVuWzFdID0gbV93aWR0aCAtIChlbGVtZW50KCktPnRvdGFsQ29s
cygpLTEpKmVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAgaWYocmVtYWluaW5nTGVuWzFdPDApIHJl
bWFpbmluZ0xlblsxXT0wOworICAgIGlmIChyZW1haW5pbmdMZW5bMV0gPCAwKQorICAgICAgICBy
ZW1haW5pbmdMZW5bMV0gPSAwOwogICAgIHJlbWFpbmluZ0xlblswXSA9IG1faGVpZ2h0IC0gKGVs
ZW1lbnQoKS0+dG90YWxSb3dzKCktMSkqZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICBpZihyZW1h
aW5pbmdMZW5bMF08MCkgcmVtYWluaW5nTGVuWzBdPTA7CisgICAgaWYgKHJlbWFpbmluZ0xlblsw
XSA8IDApCisgICAgICAgIHJlbWFpbmluZ0xlblswXSA9IDA7CiAKICAgICBpbnQgYXZhaWxhYmxl
TGVuWzJdOwogICAgIGF2YWlsYWJsZUxlblswXSA9IHJlbWFpbmluZ0xlblswXTsKQEAgLTE0NSw3
ICsxMzcsNyBAQCB2b2lkIFJlbmRlckZyYW1lU2V0OjpsYXlvdXQoICkKICAgICAgICAgaW50IGNv
dW50UGVyY2VudCA9IDA7CiAgICAgICAgIGludCBncmlkTGVuID0gbV9ncmlkTGVuW2tdOwogICAg
ICAgICBpbnQqIGdyaWREZWx0YSA9IG1fZ3JpZERlbHRhW2tdOwotICAgICAgICBXZWJDb3JlOjpM
ZW5ndGgqIGdyaWQgPSAgayA/IGVsZW1lbnQoKS0+bV9jb2xzIDogZWxlbWVudCgpLT5tX3Jvd3M7
CisgICAgICAgIExlbmd0aCogZ3JpZCA9ICBrID8gZWxlbWVudCgpLT5tX2NvbHMgOiBlbGVtZW50
KCktPm1fcm93czsKICAgICAgICAgaW50KiBncmlkTGF5b3V0ID0gbV9ncmlkTGF5b3V0W2tdOwog
CiAgICAgICAgIGlmIChncmlkKSB7CkBAIC0xODgsOSArMTgwLDggQEAgdm9pZCBSZW5kZXJGcmFt
ZVNldDo6bGF5b3V0KCApCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10g
LT0gZ3JpZExheW91dFtpXTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAg
ICAgICByZW1haW5pbmdMZW5ba10gLT0gdG90YWxGaXhlZDsKLSAgICAgICAgICAgIH0KIAogICAg
ICAgICAgICAgLy8gUGVyY2VudGFnZSBjb2x1bW5zL3Jvd3MgYXJlIG91ciBzZWNvbmQgcHJpb3Jp
dHkuIERpdmlkZSB0aGUgcmVtYWluaW5nIHNwYWNlIHByb3BvcnRpb25hbGx5IAogICAgICAgICAg
ICAgLy8gb3ZlciBhbGwgcGVyY2VudGFnZSBjb2x1bW5zL3Jvd3MuIElNUE9SVEFOVDogdGhlIHNp
emUgb2YgZWFjaCBjb2x1bW4vcm93IGlzIG5vdCByZWxhdGl2ZSAKQEAgLTIwNSw5ICsxOTYsOCBA
QCB2b2lkIFJlbmRlckZyYW1lU2V0OjpsYXlvdXQoICkKICAgICAgICAgICAgICAgICAgICAgICAg
IHJlbWFpbmluZ0xlbltrXSAtPSBncmlkTGF5b3V0W2ldOwogICAgICAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0g
ZWxzZQogICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSB0b3RhbFBlcmNlbnQ7Ci0g
ICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFJlbGF0aXZlIGNvbHVtbnMvcm93cyBhcmUg
b3VyIGxhc3QgcHJpb3JpdHkuIERpdmlkZSB0aGUgcmVtYWluaW5nIHNwYWNlIHByb3BvcnRpb25h
bGx5CiAgICAgICAgICAgICAvLyBvdmVyIGFsbCByZWxhdGl2ZSBjb2x1bW5zL3Jvd3MuIElNUE9S
VEFOVDogdGhlIHJlbGF0aXZlIHZhbHVlIG9mIDAqIGlzIHRyZWF0ZWQgYXMgMSouCkBAIC0zMDIs
OSArMjkyLDggQEAgdm9pZCBSZW5kZXJGcmFtZVNldDo6bGF5b3V0KCApCiAKICAgICAgICAgICAg
IC8vIFN0aWxsIHNvbWUgbGVmdCBvdmVyLi4uIHNpbXBseSBhZGQgaXQgdG8gdGhlIGxhc3QgY29s
dW1uLCBiZWNhdXNlIGl0IGlzIGltcG9zc2libGUKICAgICAgICAgICAgIC8vIHNwcmVhZCBpdCBl
dmVubHkgb3IgZXF1YWxseS4KLSAgICAgICAgICAgIGlmIChyZW1haW5pbmdMZW5ba10pIHsKKyAg
ICAgICAgICAgIGlmIChyZW1haW5pbmdMZW5ba10pCiAgICAgICAgICAgICAgICAgZ3JpZExheW91
dFtncmlkTGVuIC0gMV0gKz0gcmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgfQogCiAgICAg
ICAgICAgICAvLyBub3cgd2UgaGF2ZSB0aGUgZmluYWwgbGF5b3V0LCBkaXN0cmlidXRlIHRoZSBk
ZWx0YSBvdmVyIGl0CiAgICAgICAgICAgICBib29sIHdvcmtlZCA9IHRydWU7CkBAIC0zMTQsMTEg
KzMwMywxMiBAQCB2b2lkIFJlbmRlckZyYW1lU2V0OjpsYXlvdXQoICkKICAgICAgICAgICAgICAg
ICBncmlkTGF5b3V0W2ldICs9IGdyaWREZWx0YVtpXTsKICAgICAgICAgICAgIH0KICAgICAgICAg
ICAgIC8vIG5vdyB0aGUgZGVsdGEncyBicm9rZSBzb21ldGhpbmcsIHVuZG8gaXQgYW5kIHJlc2V0
IGRlbHRhcwotICAgICAgICAgICAgaWYgKCF3b3JrZWQpCisgICAgICAgICAgICBpZiAoIXdvcmtl
ZCkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7
CiAgICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gLT0gZ3JpZERlbHRhW2ldOwogICAg
ICAgICAgICAgICAgICAgICBncmlkRGVsdGFbaV0gPSAwOwogICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBncmlkTGF5
b3V0WzBdID0gcmVtYWluaW5nTGVuW2tdOwpAQCAtMzI3LDQ3ICszMTcsMzkgQEAgdm9pZCBSZW5k
ZXJGcmFtZVNldDo6bGF5b3V0KCApCiAgICAgcG9zaXRpb25GcmFtZXMoKTsKIAogICAgIFJlbmRl
ck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKCAhY2hpbGQgKQorICAgIGlm
ICghY2hpbGQpCiAgICAgICAgIGdvdG8gZW5kMjsKIAotICAgIGlmKCFtX2hTcGxpdFZhciAmJiAh
bV92U3BsaXRWYXIpCi0gICAgewotICAgICAgICBpZighbV92U3BsaXRWYXIgJiYgZWxlbWVudCgp
LT50b3RhbENvbHMoKSA+IDEpCi0gICAgICAgIHsKKyAgICBpZiAoIW1faFNwbGl0VmFyICYmICFt
X3ZTcGxpdFZhcikgeworICAgICAgICBpZiAoIW1fdlNwbGl0VmFyICYmIGVsZW1lbnQoKS0+dG90
YWxDb2xzKCkgPiAxKSB7CiAgICAgICAgICAgICBtX3ZTcGxpdFZhciA9IG5ldyBib29sW2VsZW1l
bnQoKS0+dG90YWxDb2xzKCldOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGVsZW1l
bnQoKS0+dG90YWxDb2xzKCk7IGkrKykgbV92U3BsaXRWYXJbaV0gPSB0cnVlOworICAgICAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBpKyspIG1fdlNw
bGl0VmFyW2ldID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZighbV9oU3BsaXRWYXIgJiYg
ZWxlbWVudCgpLT50b3RhbFJvd3MoKSA+IDEpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKCFtX2hT
cGxpdFZhciAmJiBlbGVtZW50KCktPnRvdGFsUm93cygpID4gMSkgewogICAgICAgICAgICAgbV9o
U3BsaXRWYXIgPSBuZXcgYm9vbFtlbGVtZW50KCktPnRvdGFsUm93cygpXTsKLSAgICAgICAgICAg
IGZvcihpbnQgaSA9IDA7IGkgPCBlbGVtZW50KCktPnRvdGFsUm93cygpOyBpKyspIG1faFNwbGl0
VmFyW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudCgp
LT50b3RhbFJvd3MoKTsgaSsrKSBtX2hTcGxpdFZhcltpXSA9IHRydWU7CiAgICAgICAgIH0KIAot
ICAgICAgICBmb3IoaW50IHIgPSAwOyByIDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsgcisrKQot
ICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaW50IGMgPSAwOyBjIDwgZWxlbWVudCgpLT50b3Rh
bENvbHMoKTsgYysrKQotICAgICAgICAgICAgeworICAgICAgICBmb3IgKGludCByID0gMDsgciA8
IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IHIrKykgeworICAgICAgICAgICAgZm9yIChpbnQgYyA9
IDA7IGMgPCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBjKyspIHsKICAgICAgICAgICAgICAgICBi
b29sIGZpeGVkID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICBpZiAoIGNoaWxkLT5pc0ZyYW1l
U2V0KCkgKQotICAgICAgICAgICAgICAgICAgZml4ZWQgPSBzdGF0aWNfY2FzdDxSZW5kZXJGcmFt
ZVNldCAqPihjaGlsZCktPmVsZW1lbnQoKS0+bm9SZXNpemUoKTsKKyAgICAgICAgICAgICAgICBp
ZiAoY2hpbGQtPmlzRnJhbWVTZXQoKSkKKyAgICAgICAgICAgICAgICAgIGZpeGVkID0gc3RhdGlj
X2Nhc3Q8UmVuZGVyRnJhbWVTZXQqPihjaGlsZCktPmVsZW1lbnQoKS0+bm9SZXNpemUoKTsKICAg
ICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBmaXhlZCA9IHN0YXRpY19jYXN0
PFJlbmRlckZyYW1lICo+KGNoaWxkKS0+ZWxlbWVudCgpLT5ub1Jlc2l6ZSgpOworICAgICAgICAg
ICAgICAgICAgZml4ZWQgPSBzdGF0aWNfY2FzdDxSZW5kZXJGcmFtZSo+KGNoaWxkKS0+ZWxlbWVu
dCgpLT5ub1Jlc2l6ZSgpOwogCi0gICAgICAgICAgICAgICAgaWYoZml4ZWQpCi0gICAgICAgICAg
ICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggZWxlbWVudCgpLT50b3RhbENvbHMoKSA+
IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM+
MCkgbV92U3BsaXRWYXJbYy0xXSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChmaXhlZCkg
eworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCgpLT50b3RhbENvbHMoKSA+IDEpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjPjApIG1fdlNwbGl0VmFyW2MtMV0gPSBmYWxz
ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1fdlNwbGl0VmFyW2NdID0gZmFsc2U7CiAgICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVsZW1lbnQoKS0+dG90
YWxSb3dzKCkgPiAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZihyPjApIG1faFNwbGl0VmFyW3ItMV0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGVsZW1lbnQoKS0+dG90YWxSb3dzKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAocj4wKSBtX2hTcGxpdFZhcltyLTFdID0gZmFsc2U7CiAgICAgICAgICAgICAgICAg
ICAgICAgICBtX2hTcGxpdFZhcltyXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmKCFjaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkK
ICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kMTsKICAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICB9CkBAIC0zODYsMjQgKzM2OCwyMiBAQCB2b2lkIFJlbmRlckZyYW1lU2V0Ojpw
b3NpdGlvbkZyYW1lcygpCiAgIGludCBjOwogCiAgIFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJz
dENoaWxkKCk7Ci0gIGlmICggIWNoaWxkICkKKyAgaWYgKCFjaGlsZCkKICAgICByZXR1cm47CiAK
ICAgLy8gIE5vZGUgKmNoaWxkID0gX2ZpcnN0OwotICAvLyAgaWYoIWNoaWxkKSByZXR1cm47Cisg
IC8vICBpZiAoIWNoaWxkKSByZXR1cm47CiAKICAgaW50IHlQb3MgPSAwOwogCi0gIGZvcihyID0g
MDsgciA8IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IHIrKykKLSAgeworICBmb3IgKHIgPSAwOyBy
IDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsgcisrKSB7CiAgICAgaW50IHhQb3MgPSAwOwotICAg
IGZvcihjID0gMDsgYyA8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7IGMrKykKLSAgICB7Ci0gICAg
ICBjaGlsZC0+c2V0UG9zKCB4UG9zLCB5UG9zICk7CisgICAgZm9yIChjID0gMDsgYyA8IGVsZW1l
bnQoKS0+dG90YWxDb2xzKCk7IGMrKykgeworICAgICAgY2hpbGQtPnNldFBvcyh4UG9zLCB5UG9z
KTsKICAgICAgIC8vIGhhcyB0byBiZSByZXNpemVkIGFuZCBpdHNlbGYgcmVzaXplIGl0cyBjb250
ZW50cwogICAgICAgaWYgKChtX2dyaWRMYXlvdXRbMV1bY10gIT0gY2hpbGQtPndpZHRoKCkpIHx8
IChtX2dyaWRMYXlvdXRbMF1bcl0gIT0gY2hpbGQtPmhlaWdodCgpKSkgewotICAgICAgICAgIGNo
aWxkLT5zZXRXaWR0aCggbV9ncmlkTGF5b3V0WzFdW2NdICk7Ci0gICAgICAgICAgY2hpbGQtPnNl
dEhlaWdodCggbV9ncmlkTGF5b3V0WzBdW3JdICk7CisgICAgICAgICAgY2hpbGQtPnNldFdpZHRo
KG1fZ3JpZExheW91dFsxXVtjXSk7CisgICAgICAgICAgY2hpbGQtPnNldEhlaWdodChtX2dyaWRM
YXlvdXRbMF1bcl0pOwogICAgICAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dCh0cnVlKTsKICAg
ICAgICAgICBjaGlsZC0+bGF5b3V0KCk7CiAgICAgICB9CkBAIC00MTEsNyArMzkxLDcgQEAgdm9p
ZCBSZW5kZXJGcmFtZVNldDo6cG9zaXRpb25GcmFtZXMoKQogICAgICAgeFBvcyArPSBtX2dyaWRM
YXlvdXRbMV1bY10gKyBlbGVtZW50KCktPmJvcmRlcigpOwogICAgICAgY2hpbGQgPSBjaGlsZC0+
bmV4dFNpYmxpbmcoKTsKIAotICAgICAgaWYgKCAhY2hpbGQgKQorICAgICAgaWYgKCFjaGlsZCkK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgfQpAQCAtNDIxLDI1ICs0MDEsMjUgQEAgdm9pZCBSZW5k
ZXJGcmFtZVNldDo6cG9zaXRpb25GcmFtZXMoKQogCiAgIC8vIGFsbCB0aGUgcmVtYWluaW5nIGZy
YW1lcyBhcmUgaGlkZGVuIHRvIGF2b2lkIHVnbHkKICAgLy8gc3B1cmlvdXMgdW5mbG93ZWQgZnJh
bWVzCi0gIHdoaWxlICggY2hpbGQgKSB7Ci0gICAgICBjaGlsZC0+c2V0V2lkdGgoIDAgKTsKLSAg
ICAgIGNoaWxkLT5zZXRIZWlnaHQoIDAgKTsKKyAgd2hpbGUgKGNoaWxkKSB7CisgICAgICBjaGls
ZC0+c2V0V2lkdGgoMCk7CisgICAgICBjaGlsZC0+c2V0SGVpZ2h0KDApOwogICAgICAgY2hpbGQt
PnNldE5lZWRzTGF5b3V0KGZhbHNlKTsKIAogICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxp
bmcoKTsKICAgfQogfQogCi1ib29sIFJlbmRlckZyYW1lU2V0Ojp1c2VyUmVzaXplKCBNb3VzZUV2
ZW50ICpldnQgKQorYm9vbCBSZW5kZXJGcmFtZVNldDo6dXNlclJlc2l6ZShNb3VzZUV2ZW50KiBl
dnQpCiB7Ci0gICAgaWYgKG5lZWRzTGF5b3V0KCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAobmVl
ZHNMYXlvdXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIAogICAgIGJvb2wgcmVzID0g
ZmFsc2U7CiAgICAgaW50IF94ID0gZXZ0LT5jbGllbnRYKCk7CiAgICAgaW50IF95ID0gZXZ0LT5j
bGllbnRZKCk7CiAgICAgCi0gICAgaWYgKCAhbV9yZXNpemluZyAmJiBldnQtPnR5cGUoKSA9PSBt
b3VzZW1vdmVFdmVudCB8fCBldnQtPnR5cGUoKSA9PSBtb3VzZWRvd25FdmVudCApCi0gICAgewor
ICAgIGlmICghbV9yZXNpemluZyAmJiBldnQtPnR5cGUoKSA9PSBtb3VzZW1vdmVFdmVudCB8fCBl
dnQtPnR5cGUoKSA9PSBtb3VzZWRvd25FdmVudCkgewogICAgICAgICBtX2hTcGxpdCA9IC0xOwog
ICAgICAgICBtX3ZTcGxpdCA9IC0xOwogICAgICAgICAvL2Jvb2wgcmVzaXplUG9zc2libGUgPSB0
cnVlOwpAQCAtNDU4LDcgKzQzOCw3IEBAIGJvb2wgUmVuZGVyRnJhbWVTZXQ6OnVzZXJSZXNpemUo
IE1vdXNlRXYKICAgICAgICAgCiAgICAgICAgIHBvcyA9IG1fZ3JpZExheW91dFswXVswXSArIHlQ
b3MoKTsKICAgICAgICAgZm9yIChpbnQgciA9IDE7IHIgPCBlbGVtZW50KCktPnRvdGFsUm93cygp
OyByKyspIHsKLSAgICAgICAgICAgIGlmICggX3kgPj0gcG9zICYmIF95IDw9IHBvcytlbGVtZW50
KCktPmJvcmRlcigpKSB7CisgICAgICAgICAgICBpZiAoX3kgPj0gcG9zICYmIF95IDw9IHBvcytl
bGVtZW50KCktPmJvcmRlcigpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1faFNwbGl0VmFyICYm
IG1faFNwbGl0VmFyW3IgLSAxXSkKICAgICAgICAgICAgICAgICAgICAgbV9oU3BsaXQgPSByIC0g
MTsKICAgICAgICAgICAgICAgICByZXMgPSB0cnVlOwpAQCAtNDgwLDE0ICs0NjAsMTIgQEAgYm9v
bCBSZW5kZXJGcmFtZVNldDo6dXNlclJlc2l6ZSggTW91c2VFdgogICAgIGlmIChtX3Jlc2l6aW5n
ICYmIGV2dC0+dHlwZSgpID09IG1vdXNldXBFdmVudCkgewogICAgICAgICBzZXRSZXNpemluZyhm
YWxzZSk7CiAgICAgICAgIAotICAgICAgICBpZihtX3ZTcGxpdCAhPSAtMSApCi0gICAgICAgIHsK
KyAgICAgICAgaWYgKG1fdlNwbGl0ICE9IC0xKSB7CiAgICAgICAgICAgICBpbnQgZGVsdGEgPSBt
X3ZTcGxpdFBvcyAtIF94OwogICAgICAgICAgICAgbV9ncmlkRGVsdGFbMV1bbV92U3BsaXRdIC09
IGRlbHRhOwogICAgICAgICAgICAgbV9ncmlkRGVsdGFbMV1bbV92U3BsaXQrMV0gKz0gZGVsdGE7
CiAgICAgICAgIH0KLSAgICAgICAgaWYobV9oU3BsaXQgIT0gLTEgKQotICAgICAgICB7CisgICAg
ICAgIGlmIChtX2hTcGxpdCAhPSAtMSkgewogICAgICAgICAgICAgaW50IGRlbHRhID0gbV9oU3Bs
aXRQb3MgLSBfeTsKICAgICAgICAgICAgIG1fZ3JpZERlbHRhWzBdW21faFNwbGl0XSAtPSBkZWx0
YTsKICAgICAgICAgICAgIG1fZ3JpZERlbHRhWzBdW21faFNwbGl0KzFdICs9IGRlbHRhOwpAQCAt
NDk2LDEwICs0NzQsOCBAQCBib29sIFJlbmRlckZyYW1lU2V0Ojp1c2VyUmVzaXplKCBNb3VzZUV2
CiAgICAgICAgIC8vIHRoaXMganVzdCBzY2hlZHVsZXMgdGhlIHJlbGF5b3V0CiAgICAgICAgIC8v
IGltcG9ydGFudCwgb3RoZXJ3aXNlIHRoZSBtb3ZpbmcgaW5kaWNhdG9yIGlzIG5vdCBjb3JyZWN0
bHkgZXJhc2VkCiAgICAgICAgIHNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgIH0KLSAgICAKLSAg
ICBlbHNlIGlmIChtX3Jlc2l6aW5nIHx8IGV2dC0+dHlwZSgpID09IG1vdXNldXBFdmVudCkgewot
ICAgICAgICBGcmFtZVZpZXcgKnYgPSBjYW52YXMoKS0+dmlldygpOyAgICAgICAgCisgICAgfSBl
bHNlIGlmIChtX3Jlc2l6aW5nIHx8IGV2dC0+dHlwZSgpID09IG1vdXNldXBFdmVudCkgeworICAg
ICAgICBGcmFtZVZpZXcqIHYgPSBjYW52YXMoKS0+dmlldygpOyAgICAgICAgCiAgICAgICAgIHYt
PmRpc2FibGVGbHVzaERyYXdpbmcoKTsKICAgICAgICAgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
ID0gdi0+bG9ja0RyYXdpbmdGb2N1cygpOwogICAgICAgICAKQEAgLTU0MywyNyArNTE5LDI4IEBA
IHZvaWQgUmVuZGVyRnJhbWVTZXQ6OnNldFJlc2l6aW5nKGJvb2wgZSkKICAgICBjYW52YXMoKS0+
dmlldygpLT5zZXRSZXNpemluZ0ZyYW1lU2V0KGUgPyBlbGVtZW50KCkgOiAwKTsKIH0KIAotYm9v
bCBSZW5kZXJGcmFtZVNldDo6Y2FuUmVzaXplKCBpbnQgX3gsIGludCBfeSApCitib29sIFJlbmRl
ckZyYW1lU2V0OjpjYW5SZXNpemUoaW50IF94LCBpbnQgX3kpCiB7CiAgICAgLy8gaWYgd2UgaGF2
ZW4ndCByZWNlaXZlZCBhIGxheW91dCwgdGhlbiB0aGUgZ3JpZExheW91dCBkb2Vzbid0IGNvbnRh
aW4gdXNlZnVsIGRhdGEgeWV0Ci0gICAgaWYgKG5lZWRzTGF5b3V0KCkgfHwgIW1fZ3JpZExheW91
dFswXSB8fCAhbV9ncmlkTGF5b3V0WzFdICkgcmV0dXJuIGZhbHNlOworICAgIGlmIChuZWVkc0xh
eW91dCgpIHx8ICFtX2dyaWRMYXlvdXRbMF0gfHwgIW1fZ3JpZExheW91dFsxXSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOwogCiAgICAgLy8gY2hlY2sgaWYgd2UncmUgb3ZlciBhIGhvcml6b250YWwg
b3IgdmVydGljYWwgYm91bmRhcnkKICAgICBpbnQgcG9zID0gbV9ncmlkTGF5b3V0WzFdWzBdOwot
ICAgIGZvcihpbnQgYyA9IDE7IGMgPCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBjKyspCi0gICAg
ICAgIGlmKF94ID49IHBvcyAmJiBfeCA8PSBwb3MrZWxlbWVudCgpLT5ib3JkZXIoKSkKKyAgICBm
b3IgKGludCBjID0gMTsgYyA8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7IGMrKykKKyAgICAgICAg
aWYgKF94ID49IHBvcyAmJiBfeCA8PSBwb3MrZWxlbWVudCgpLT5ib3JkZXIoKSkKICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogCiAgICAgcG9zID0gbV9ncmlkTGF5b3V0WzBdWzBdOwotICAgIGZv
cihpbnQgciA9IDE7IHIgPCBlbGVtZW50KCktPnRvdGFsUm93cygpOyByKyspCi0gICAgICAgIGlm
KCBfeSA+PSBwb3MgJiYgX3kgPD0gcG9zK2VsZW1lbnQoKS0+Ym9yZGVyKCkpCisgICAgZm9yIChp
bnQgciA9IDE7IHIgPCBlbGVtZW50KCktPnRvdGFsUm93cygpOyByKyspCisgICAgICAgIGlmIChf
eSA+PSBwb3MgJiYgX3kgPD0gcG9zK2VsZW1lbnQoKS0+Ym9yZGVyKCkpCiAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAogI2lmbmRlZiBOREVCVUcKLXZv
aWQgUmVuZGVyRnJhbWVTZXQ6OmR1bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRlZFN0
cmluZyBpbmQpIGNvbnN0Cit2b2lkIFJlbmRlckZyYW1lU2V0OjpkdW1wKFFUZXh0U3RyZWFtKiBz
dHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kKSBjb25zdAogewogICAqc3RyZWFtIDw8ICIgdG90
YWxyb3dzPSIgPDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsKICAgKnN0cmVhbSA8PCAiIHRvdGFs
Y29scz0iIDw8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7CkBAIC01NzksMzYxICs1NTYsNCBAQCB2
b2lkIFJlbmRlckZyYW1lU2V0OjpkdW1wKFFUZXh0U3RyZWFtICpzCiB9CiAjZW5kaWYKIAotLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1SZW5kZXJQYXJ0OjpSZW5kZXJQYXJ0KEhU
TUxFbGVtZW50KiBub2RlKQotICAgIDogUmVuZGVyV2lkZ2V0KG5vZGUpLCBtX2ZyYW1lKDApCi17
Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNldElubGluZShmYWxz
ZSk7Ci19Ci0KLVJlbmRlclBhcnQ6On5SZW5kZXJQYXJ0KCkKLXsKLSAgICAvLyBTaW5jZSBkZXJl
ZiBlbmRzIHVwIGNhbGxpbmcgc2V0V2lkZ2V0IGJhY2sgb24gdXMsIG5lZWQgdG8gbWFrZSBzdXJl
Ci0gICAgLy8gdGhhdCB3aWRnZXQgaXMgYWxyZWFkeSAwIHNvIGl0IHdvbid0IGRvIGFueSB3b3Jr
LgotICAgIFdpZGdldCogd2lkZ2V0ID0gbV93aWRnZXQ7Ci0gICAgbV93aWRnZXQgPSAwOwotICAg
IGlmICh3aWRnZXQgJiYgd2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICBzdGF0aWNfY2Fz
dDxGcmFtZVZpZXcqPih3aWRnZXQpLT5kZXJlZigpOwotICAgIGVsc2UKLSAgICAgICAgZGVsZXRl
IHdpZGdldDsKLQotICAgIHNldEZyYW1lKDApOwotfQotCi12b2lkIFJlbmRlclBhcnQ6OnNldEZy
YW1lKEZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoZnJhbWUgPT0gbV9mcmFtZSkKLSAgICAgICAg
cmV0dXJuOwotICAgIGlmIChtX2ZyYW1lKQotICAgICAgICBtX2ZyYW1lLT5kaXNjb25uZWN0T3du
ZXJSZW5kZXJlcigpOwotICAgIG1fZnJhbWUgPSBmcmFtZTsKLX0KLQotdm9pZCBSZW5kZXJQYXJ0
OjpzZXRXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgaWYgKHdpZGdldCAhPSBtX3dpZGdl
dCkgewotICAgICAgICBpZiAod2lkZ2V0ICYmIHdpZGdldC0+aXNGcmFtZVZpZXcoKSkKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHdpZGdldCktPnJlZigpOwotICAgICAgICBS
ZW5kZXJXaWRnZXQ6OnNldFdpZGdldCh3aWRnZXQpOwotCi0gICAgICAgIHNldE5lZWRzTGF5b3V0
QW5kTWluTWF4UmVjYWxjKCk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzY3JvbGxiYXJz
IGFyZSBzZXQgY29ycmVjdGx5IGZvciByZXN0b3JlCi0gICAgICAgIC8vICMjIyBmaW5kIGJldHRl
ciBmaXgKLSAgICAgICAgdmlld0NsZWFyZWQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyUGFy
dDo6dmlld0NsZWFyZWQoKQotewotfQotCi12b2lkIFJlbmRlclBhcnQ6OmRlbGV0ZVdpZGdldCgp
Ci17Ci0gICAgaWYgKG1fd2lkZ2V0ICYmIG1fd2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAg
ICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3dpZGdldCktPmRlcmVmKCk7Ci0gICAgZWxzZQot
ICAgICAgICBkZWxldGUgbV93aWRnZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKiovCi0KLVJlbmRlckZyYW1lOjpSZW5kZXJGcmFtZShIVE1MRnJhbWVFbGVtZW50KiBmcmFt
ZSkKLSAgICA6IFJlbmRlclBhcnQoZnJhbWUpCi17Ci0gICAgc2V0SW5saW5lKGZhbHNlKTsKLX0K
LQotdm9pZCBSZW5kZXJGcmFtZTo6dmlld0NsZWFyZWQoKQotewotICAgIGlmIChlbGVtZW50KCkg
JiYgbV93aWRnZXQgJiYgbV93aWRnZXQtPmlzRnJhbWVWaWV3KCkpIHsKLSAgICAgICAgRnJhbWVW
aWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV93aWRnZXQpOwotICAgICAgICBI
VE1MRnJhbWVTZXRFbGVtZW50KiBmcmFtZVNldCA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZVNldEVs
ZW1lbnQgKj4oZWxlbWVudCgpLT5wYXJlbnROb2RlKCkpOwotICAgICAgICBib29sIGhhc0JvcmRl
ciA9IGVsZW1lbnQoKS0+bV9mcmFtZUJvcmRlciAmJiBmcmFtZVNldC0+ZnJhbWVCb3JkZXIoKTsK
LSAgICAgICAgaW50IG1hcmdpbncgPSBlbGVtZW50KCktPm1fbWFyZ2luV2lkdGg7Ci0gICAgICAg
IGludCBtYXJnaW5oID0gZWxlbWVudCgpLT5tX21hcmdpbkhlaWdodDsKLQotICAgICAgICB2aWV3
LT5zZXRIYXNCb3JkZXIoaGFzQm9yZGVyKTsKLSAgICAgICAgaWYgKG1hcmdpbncgIT0gLTEpCi0g
ICAgICAgICAgICB2aWV3LT5zZXRNYXJnaW5XaWR0aChtYXJnaW53KTsKLSAgICAgICAgaWYgKG1h
cmdpbmggIT0gLTEpCi0gICAgICAgICAgICB2aWV3LT5zZXRNYXJnaW5IZWlnaHQobWFyZ2luaCk7
Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotUmVuZGVy
UGFydE9iamVjdDo6UmVuZGVyUGFydE9iamVjdChIVE1MRWxlbWVudCogZWxlbWVudCkKLSAgICA6
IFJlbmRlclBhcnQoZWxlbWVudCkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1
dGVzCi0gICAgc2V0SW5saW5lKHRydWUpOwotICAgIG1faGFzRmFsbGJhY2tDb250ZW50ID0gZmFs
c2U7Ci19Ci0KLXN0YXRpYyBib29sIGlzVVJMQWxsb3dlZChXZWJDb3JlOjpEb2N1bWVudCAqZG9j
LCBjb25zdCBTdHJpbmcgJnVybCkKLXsKLSAgICBLVVJMIG5ld1VSTChkb2MtPmNvbXBsZXRlVVJM
KHVybC5kZXByZWNhdGVkU3RyaW5nKCkpKTsKLSAgICBuZXdVUkwuc2V0UmVmKERlcHJlY2F0ZWRT
dHJpbmc6Om51bGwpOwotICAgIAotICAgIGlmIChkb2MtPmZyYW1lKCktPnBhZ2UoKS0+ZnJhbWVD
b3VudCgpID49IDIwMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gV2UgYWxsb3cg
b25lIGxldmVsIG9mIHNlbGYtcmVmZXJlbmNlIGJlY2F1c2Ugc29tZSBzaXRlcyBkZXBlbmQgb24g
dGhhdC4KLSAgICAvLyBCdXQgd2UgZG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZS4KLSAgICBib29s
IGZvdW5kU2VsZlJlZmVyZW5jZSA9IGZhbHNlOwotICAgIGZvciAoRnJhbWUgKmZyYW1lID0gZG9j
LT5mcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5wYXJlbnQoKSkgewotICAg
ICAgICBLVVJMIGZyYW1lVVJMID0gZnJhbWUtPnVybCgpOwotICAgICAgICBmcmFtZVVSTC5zZXRS
ZWYoRGVwcmVjYXRlZFN0cmluZzo6bnVsbCk7Ci0gICAgICAgIGlmIChmcmFtZVVSTCA9PSBuZXdV
UkwpIHsKLSAgICAgICAgICAgIGlmIChmb3VuZFNlbGZSZWZlcmVuY2UpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZm91bmRTZWxmUmVmZXJlbmNlID0gdHJ1ZTsK
LSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2
b2lkIG1hcENsYXNzSWRUb1NlcnZpY2VUeXBlKGNvbnN0IFN0cmluZyYgY2xhc3NJZCwgU3RyaW5n
JiBzZXJ2aWNlVHlwZSkKLXsKLSAgICAvLyBJdCBpcyBBY3RpdmVYLCBidXQgdGhlIG5zcGx1Z2lu
IHN5c3RlbSBoYW5kbGluZwotICAgIC8vIHNob3VsZCBhbHNvIHdvcmssIHRoYXQncyB3aHkgd2Ug
ZG9uJ3Qgb3ZlcnJpZGUgdGhlCi0gICAgLy8gc2VydmljZVR5cGUgd2l0aCBhcHBsaWNhdGlvbi94
LWFjdGl2ZXgtaGFuZGxlcgotICAgIC8vIGJ1dCBsZXQgdGhlIEtUcmFkZXIgaW4ga2h0bWxwYXJ0
OjpjcmVhdGVQYXJ0KCkgZGV0ZWN0Ci0gICAgLy8gdGhlIHVzZXIncyBwcmVmZXJlbmNlOiBsYXVu
Y2ggd2l0aCBhY3RpdmV4IHZpZXdlciBvcgotICAgIC8vIHdpdGggbnNwbHVnaW52aWV3ZXIgKE5p
a28pCi0gICAgaWYgKGNsYXNzSWQuY29udGFpbnMoIkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0
NDU1MzU0MDAwMCIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LXNob2Nr
d2F2ZS1mbGFzaCI7Ci0gICAgZWxzZSBpZiAoY2xhc3NJZC5jb250YWlucygiQ0ZDREFBMDMtOEJF
NC0xMWNmLUI4NEItMDAyMEFGQkJDQ0ZBIikpCi0gICAgICAgIHNlcnZpY2VUeXBlID0gImF1ZGlv
L3gtcG4tcmVhbGF1ZGlvLXBsdWdpbiI7Ci0gICAgZWxzZSBpZiAoY2xhc3NJZC5jb250YWlucygi
MDJCRjI1RDUtOEMxNy00QjIzLUJDODAtRDM0ODhBQkREQzZCIikpCi0gICAgICAgIHNlcnZpY2VU
eXBlID0gInZpZGVvL3F1aWNrdGltZSI7Ci0gICAgZWxzZSBpZiAoY2xhc3NJZC5jb250YWlucygi
MTY2QjFCQ0EtM0Y5Qy0xMUNGLTgwNzUtNDQ0NTUzNTQwMDAwIikpCi0gICAgICAgIHNlcnZpY2VU
eXBlID0gImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiOwotICAgIGVsc2UgaWYgKGNsYXNzSWQuY29u
dGFpbnMoIjZCRjUyQTUyLTM5NEEtMTFkMy1CMTUzLTAwQzA0Rjc5RkFBNiIpKQotICAgICAgICBz
ZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LW1wbGF5ZXIyIjsKLSAgICBlbHNlIGlmICghY2xh
c3NJZC5pc0VtcHR5KCkpCi0gICAgICAgIC8vIFdlIGhhdmUgYSBjbHNpZCwgbWVhbnMgdGhpcyBp
cyBhY3RpdmV4IChOaWtvKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LWFj
dGl2ZXgtaGFuZGxlciI7Ci0gICAgLy8gVE9ETzogYWRkIG1vcmUgcGx1Z2lucyBoZXJlCi19Ci0K
LXZvaWQgUmVuZGVyUGFydE9iamVjdDo6dXBkYXRlV2lkZ2V0KCkKLXsKLSAgU3RyaW5nIHVybDsK
LSAgU3RyaW5nIHNlcnZpY2VUeXBlOwotICBWZWN0b3I8U3RyaW5nPiBwYXJhbU5hbWVzOwotICBW
ZWN0b3I8U3RyaW5nPiBwYXJhbVZhbHVlczsKLSAgRnJhbWUgKmZyYW1lID0gbV92aWV3LT5mcmFt
ZSgpOwotCi0gIHNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVjYWxjKCk7Ci0KLSAgaWYgKGVsZW1l
bnQoKS0+aGFzVGFnTmFtZShvYmplY3RUYWcpKSB7Ci0KLSAgICAgIEhUTUxPYmplY3RFbGVtZW50
ICpvID0gc3RhdGljX2Nhc3Q8SFRNTE9iamVjdEVsZW1lbnQgKj4oZWxlbWVudCgpKTsKLQotICAg
ICAgaWYgKCFvLT5pc0NvbXBsZXRlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgIC8vIENoZWNr
IGZvciBhIGNoaWxkIEVNQkVEIHRhZy4KLSAgICAgIEhUTUxFbWJlZEVsZW1lbnQqIGVtYmVkID0g
MDsKLSAgICAgIGZvciAoTm9kZSAqY2hpbGQgPSBvLT5maXJzdENoaWxkKCk7IGNoaWxkOyApIHsK
LSAgICAgICAgICBpZiAoY2hpbGQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpKSB7Ci0gICAgICAgICAg
ICAgIGVtYmVkID0gc3RhdGljX2Nhc3Q8SFRNTEVtYmVkRWxlbWVudCAqPiggY2hpbGQgKTsKLSAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC0+aGFzVGFnTmFt
ZShvYmplY3RUYWcpKQotICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygp
OyAgICAgICAgIC8vIERvbid0IGRlc2NlbmQgaW50byBuZXN0ZWQgT0JKRUNUIHRhZ3MKLSAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPnRyYXZlcnNlTmV4dE5vZGUo
byk7ICAgLy8gT3RoZXJ3aXNlIGRlc2NlbmQgKEVNQkVEcyBtYXkgYmUgaW5zaWRlIENPTU1FTlQg
dGFncykKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gVXNlIHRoZSBhdHRyaWJ1dGVzIGZyb20g
dGhlIEVNQkVEIHRhZyBpbnN0ZWFkIG9mIHRoZSBPQkpFQ1QgdGFnIGluY2x1ZGluZyBXSURUSCBh
bmQgSEVJR0hULgotICAgICAgSFRNTEVsZW1lbnQgKmVtYmVkT3JPYmplY3Q7Ci0gICAgICBpZiAo
ZW1iZWQpIHsKLSAgICAgICAgICBlbWJlZE9yT2JqZWN0ID0gKEhUTUxFbGVtZW50ICopZW1iZWQ7
Ci0gICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IGVtYmVkT3JPYmplY3QtPmdldEF0dHJpYnV0
ZSh3aWR0aEF0dHIpOwotICAgICAgICAgIGlmICghYXR0cmlidXRlLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgICAgby0+c2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgYXR0cmlidXRlKTsKLSAgICAgICAg
ICBhdHRyaWJ1dGUgPSBlbWJlZE9yT2JqZWN0LT5nZXRBdHRyaWJ1dGUoaGVpZ2h0QXR0cik7Ci0g
ICAgICAgICAgaWYgKCFhdHRyaWJ1dGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICBvLT5zZXRB
dHRyaWJ1dGUoaGVpZ2h0QXR0ciwgYXR0cmlidXRlKTsKLSAgICAgICAgICB1cmwgPSBlbWJlZC0+
dXJsOwotICAgICAgICAgIHNlcnZpY2VUeXBlID0gZW1iZWQtPnNlcnZpY2VUeXBlOwotICAgICAg
fSBlbHNlCi0gICAgICAgICAgZW1iZWRPck9iamVjdCA9IChIVE1MRWxlbWVudCAqKW87Ci0gICAg
ICAKLSAgICAgIC8vIElmIHRoZXJlIHdhcyBubyBVUkwgb3IgdHlwZSBkZWZpbmVkIGluIEVNQkVE
LCB0cnkgdGhlIE9CSkVDVCB0YWcuCi0gICAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAg
ICB1cmwgPSBvLT51cmw7Ci0gICAgICBpZiAoc2VydmljZVR5cGUuaXNFbXB0eSgpKQotICAgICAg
ICAgIHNlcnZpY2VUeXBlID0gby0+c2VydmljZVR5cGU7Ci0gICAgICAKLSAgICAgIEhhc2hTZXQ8
U3RyaW5nSW1wbCosIENhc2VJbnNlbnNpdGl2ZUhhc2g+IHVuaXF1ZVBhcmFtTmFtZXM7Ci0gICAg
ICAKLSAgICAgIC8vIFNjYW4gdGhlIFBBUkFNIGNoaWxkcmVuLgotICAgICAgLy8gR2V0IHRoZSBV
UkwgYW5kIHR5cGUgZnJvbSB0aGUgcGFyYW1zIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGVt
LgotICAgICAgLy8gR2V0IHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHBhcmFtcyBpZiB0aGVyZSBp
cyBubyBFTUJFRCB0YWcuCi0gICAgICBOb2RlICpjaGlsZCA9IG8tPmZpcnN0Q2hpbGQoKTsKLSAg
ICAgIHdoaWxlIChjaGlsZCAmJiAodXJsLmlzRW1wdHkoKSB8fCBzZXJ2aWNlVHlwZS5pc0VtcHR5
KCkgfHwgIWVtYmVkKSkgewotICAgICAgICAgIGlmIChjaGlsZC0+aGFzVGFnTmFtZShwYXJhbVRh
ZykpIHsKLSAgICAgICAgICAgICAgSFRNTFBhcmFtRWxlbWVudCogcCA9IHN0YXRpY19jYXN0PEhU
TUxQYXJhbUVsZW1lbnQqPihjaGlsZCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcC0+
bmFtZSgpLmxvd2VyKCk7Ci0gICAgICAgICAgICAgIGlmICh1cmwuaXNFbXB0eSgpICYmIChuYW1l
ID09ICJzcmMiIHx8IG5hbWUgPT0gIm1vdmllIiB8fCBuYW1lID09ICJjb2RlIiB8fCBuYW1lID09
ICJ1cmwiKSkKLSAgICAgICAgICAgICAgICAgIHVybCA9IHAtPnZhbHVlKCk7Ci0gICAgICAgICAg
ICAgIGlmIChzZXJ2aWNlVHlwZS5pc0VtcHR5KCkgJiYgbmFtZSA9PSAidHlwZSIpIHsKLSAgICAg
ICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gcC0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICAg
IGludCBwb3MgPSBzZXJ2aWNlVHlwZS5maW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgICBpZiAo
cG9zICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VUeXBlID0gc2VydmljZVR5
cGUubGVmdChwb3MpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICghZW1iZWQg
JiYgIW5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICB1bmlxdWVQYXJhbU5hbWVz
LmFkZChwLT5uYW1lKCkuaW1wbCgpKTsKLSAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMuYXBw
ZW5kKHAtPm5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlcy5hcHBlbmQocC0+
dmFsdWUoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hpbGQg
PSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gV2hlbiBP
QkpFQ1QgaXMgdXNlZCBmb3IgYW4gYXBwbGV0IHZpYSBTdW4ncyBKYXZhIHBsdWdpbiwgdGhlIENP
REVCQVNFIGF0dHJpYnV0ZSBpbiB0aGUgdGFnCi0gICAgICAvLyBwb2ludHMgdG8gdGhlIEphdmEg
cGx1Z2luIGl0c2VsZiAoYW4gQWN0aXZlWCBjb21wb25lbnQpIHdoaWxlIHRoZSBhY3R1YWwgYXBw
bGV0IENPREVCQVNFIGlzCi0gICAgICAvLyBpbiBhIFBBUkFNIHRhZy4gU2VlIDxodHRwOi8vamF2
YS5zdW4uY29tL3Byb2R1Y3RzL3BsdWdpbi8xLjIvZG9jcy90YWdzLmh0bWw+LiBUaGlzIG1lYW5z
Ci0gICAgICAvLyB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgc3VwcHJlc3MgdGhlIHRhZydzIENPREVC
QVNFIGF0dHJpYnV0ZSBpZiB0aGVyZSBpcyBub25lIGluIGEgUEFSQU0sCi0gICAgICAvLyBlbHNl
IG91ciBKYXZhIHBsdWdpbiB3aWxsIG1pc2ludGVycHJldCBpdC4gWzQwMDQ1MzFdCi0gICAgICBT
dHJpbmcgY29kZWJhc2U7Ci0gICAgICBpZiAoIWVtYmVkICYmIHNlcnZpY2VUeXBlLmxvd2VyKCkg
PT0gImFwcGxpY2F0aW9uL3gtamF2YS1hcHBsZXQiKSB7Ci0gICAgICAgICAgY29kZWJhc2UgPSAi
Y29kZWJhc2UiOwotICAgICAgICAgIHVuaXF1ZVBhcmFtTmFtZXMuYWRkKGNvZGViYXNlLmltcGwo
KSk7IC8vIHByZXRlbmQgd2UgZm91bmQgaXQgaW4gYSBQQVJBTSBhbHJlYWR5Ci0gICAgICB9Ci0g
ICAgICAKLSAgICAgIC8vIFR1cm4gdGhlIGF0dHJpYnV0ZXMgb2YgZWl0aGVyIHRoZSBFTUJFRCB0
YWcgb3IgT0JKRUNUIHRhZyBpbnRvIGFycmF5cywgYnV0IGRvbid0IG92ZXJyaWRlIFBBUkFNIHZh
bHVlcy4KLSAgICAgIE5hbWVkQXR0ck1hcCogYXR0cmlidXRlcyA9IGVtYmVkT3JPYmplY3QtPmF0
dHJpYnV0ZXMoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgICAg
ICAgQXR0cmlidXRlKiBpdCA9IGF0dHJpYnV0ZXMtPmF0dHJpYnV0ZUl0ZW0oaSk7Ci0gICAgICAg
ICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSA9IGl0LT5uYW1lKCkubG9jYWxOYW1lKCk7
Ci0gICAgICAgICAgICAgIGlmIChlbWJlZCB8fCAhdW5pcXVlUGFyYW1OYW1lcy5jb250YWlucyhu
YW1lLmltcGwoKSkpIHsKLSAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMuYXBwZW5kKG5hbWUu
ZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKGl0LT52
YWx1ZSgpLmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAg
IH0KLSAgICAgIAotICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUsIHRyeSB0
byBtYXAgZnJvbSBhIHNwZWNpZmljIENMQVNTSUQgdG8gYSB0eXBlLgotICAgICAgaWYgKHNlcnZp
Y2VUeXBlLmlzRW1wdHkoKSAmJiAhby0+Y2xhc3NJZC5pc0VtcHR5KCkpCi0gICAgICAgICAgbWFw
Q2xhc3NJZFRvU2VydmljZVR5cGUoby0+Y2xhc3NJZCwgc2VydmljZVR5cGUpOwotICAgICAgCi0g
ICAgICAvLyBJZiBubyBVUkwgYW5kIHR5cGUsIGFib3J0LgotICAgICAgaWYgKHVybC5pc0VtcHR5
KCkgJiYgc2VydmljZVR5cGUuaXNFbXB0eSgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIGlm
ICghaXNVUkxBbGxvd2VkKGRvY3VtZW50KCksIHVybCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0g
ICAgICAvLyBGaW5kIG91dCBpZiB3ZSBzdXBwb3J0IGZhbGxiYWNrIGNvbnRlbnQuCi0gICAgICBt
X2hhc0ZhbGxiYWNrQ29udGVudCA9IGZhbHNlOwotICAgICAgZm9yIChOb2RlICpjaGlsZCA9IG8t
PmZpcnN0Q2hpbGQoKTsgY2hpbGQgJiYgIW1faGFzRmFsbGJhY2tDb250ZW50OyBjaGlsZCA9IGNo
aWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgaWYgKCghY2hpbGQtPmlzVGV4dE5vZGUo
KSAmJiAhY2hpbGQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpICYmICFjaGlsZC0+aGFzVGFnTmFtZShw
YXJhbVRhZykpIHx8IC8vIERpc2NvdW50IDxlbWJlZD4gYW5kIDxwYXJhbT4KLSAgICAgICAgICAg
ICAgKGNoaWxkLT5pc1RleHROb2RlKCkgJiYgIXN0YXRpY19jYXN0PFRleHQqPihjaGlsZCktPmNv
bnRhaW5zT25seVdoaXRlc3BhY2UoKSkpCi0gICAgICAgICAgICAgIG1faGFzRmFsbGJhY2tDb250
ZW50ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJvb2wgc3VjY2VzcyA9IGZyYW1lLT5yZXF1ZXN0
T2JqZWN0KHRoaXMsIHVybCwgQXRvbWljU3RyaW5nKG8tPm5hbWUoKSksIHNlcnZpY2VUeXBlLCBw
YXJhbU5hbWVzLCBwYXJhbVZhbHVlcyk7Ci0gICAgICBpZiAoIXN1Y2Nlc3MgJiYgbV9oYXNGYWxs
YmFja0NvbnRlbnQpCi0gICAgICAgICAgby0+cmVuZGVyRmFsbGJhY2tDb250ZW50KCk7Ci0gIH0g
ZWxzZSBpZiAoZWxlbWVudCgpLT5oYXNUYWdOYW1lKGVtYmVkVGFnKSkgewotICAgICAgSFRNTEVt
YmVkRWxlbWVudCAqbyA9IHN0YXRpY19jYXN0PEhUTUxFbWJlZEVsZW1lbnQgKj4oZWxlbWVudCgp
KTsKLSAgICAgIHVybCA9IG8tPnVybDsKLSAgICAgIHNlcnZpY2VUeXBlID0gby0+c2VydmljZVR5
cGU7Ci0KLSAgICAgIGlmICh1cmwuaXNFbXB0eSgpICYmIHNlcnZpY2VUeXBlLmlzRW1wdHkoKSkK
LSAgICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoIWlzVVJMQWxsb3dlZChkb2N1bWVudCgpLCB1
cmwpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIAotICAgICAgLy8gYWRkIGFsbCBhdHRyaWJ1
dGVzIHNldCBvbiB0aGUgZW1iZWQgb2JqZWN0Ci0gICAgICBOYW1lZEF0dHJNYXAqIGEgPSBvLT5h
dHRyaWJ1dGVzKCk7Ci0gICAgICBpZiAoYSkgewotICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBhLT5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgIEF0dHJpYnV0ZSogaXQg
PSBhLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICBwYXJhbU5hbWVzLmFwcGVuZChp
dC0+bmFtZSgpLmxvY2FsTmFtZSgpLmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgcGFyYW1W
YWx1ZXMuYXBwZW5kKGl0LT52YWx1ZSgpLmRvbVN0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAg
ICB9Ci0gICAgICBmcmFtZS0+cmVxdWVzdE9iamVjdCh0aGlzLCB1cmwsIG8tPmdldEF0dHJpYnV0
ZShuYW1lQXR0ciksIHNlcnZpY2VUeXBlLCBwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcyk7Ci0gIH0g
ZWxzZSB7Ci0gICAgICBhc3NlcnQoZWxlbWVudCgpLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpOwot
ICAgICAgSFRNTElGcmFtZUVsZW1lbnQgKm8gPSBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVu
dCAqPihlbGVtZW50KCkpOwotICAgICAgdXJsID0gby0+bV9VUkw7Ci0gICAgICBpZiAoIWlzVVJM
QWxsb3dlZChkb2N1bWVudCgpLCB1cmwpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIGlmICh1
cmwuaXNFbXB0eSgpKQotICAgICAgICAgIHVybCA9ICJhYm91dDpibGFuayI7Ci0gICAgICBGcmFt
ZVZpZXcgKnYgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcgKj4obV92aWV3KTsKLSAgICAgIHYtPmZy
YW1lKCktPnJlcXVlc3RGcmFtZSh0aGlzLCB1cmwsIG8tPm1fbmFtZSk7Ci0gIH0KLX0KLQotdm9p
ZCBSZW5kZXJQYXJ0T2JqZWN0OjpsYXlvdXQoKQotewotICAgIEtIVE1MQXNzZXJ0KG5lZWRzTGF5
b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1pbk1heEtub3duKCkpOwotCi0gICAgY2FsY1dpZHRo
KCk7Ci0gICAgY2FsY0hlaWdodCgpOwotCi0gICAgUmVuZGVyUGFydDo6bGF5b3V0KCk7Ci0KLSAg
ICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyUGFydE9iamVjdDo6dmll
d0NsZWFyZWQoKQotewotICAgIGlmIChlbGVtZW50KCkgJiYgbV93aWRnZXQgJiYgbV93aWRnZXQt
PmlzRnJhbWVWaWV3KCkpIHsKLSAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4obV93aWRnZXQpOwotICAgICAgICBib29sIGhhc0JvcmRlciA9IGZhbHNlOwot
ICAgICAgICBpbnQgbWFyZ2ludyA9IC0xOwotICAgICAgICBpbnQgbWFyZ2luaCA9IC0xOwotICAg
ICAgICBpZiAoZWxlbWVudCgpLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpIHsKLSAgICAgICAgICAg
IEhUTUxJRnJhbWVFbGVtZW50KiBmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50
ICo+KGVsZW1lbnQoKSk7Ci0gICAgICAgICAgICBoYXNCb3JkZXIgPSBmcmFtZS0+bV9mcmFtZUJv
cmRlcjsKLSAgICAgICAgICAgIG1hcmdpbncgPSBmcmFtZS0+bV9tYXJnaW5XaWR0aDsKLSAgICAg
ICAgICAgIG1hcmdpbmggPSBmcmFtZS0+bV9tYXJnaW5IZWlnaHQ7Ci0gICAgICAgIH0KLQotICAg
ICAgICB2aWV3LT5zZXRIYXNCb3JkZXIoaGFzQm9yZGVyKTsKLSAgICAgICAgdmlldy0+c2V0SWdu
b3JlV2hlZWxFdmVudHMoZWxlbWVudCgpLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykpOwotICAgICAg
ICBpZiAobWFyZ2ludyAhPSAtMSkKLSAgICAgICAgICAgIHZpZXctPnNldE1hcmdpbldpZHRoKG1h
cmdpbncpOwotICAgICAgICBpZiAobWFyZ2luaCAhPSAtMSkKLSAgICAgICAgICAgIHZpZXctPnNl
dE1hcmdpbkhlaWdodChtYXJnaW5oKTsKLSAgICB9Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIHNob3Vs
ZCBub3QgYmUgbmVjZXNzYXJ5LiAgUmVtb3ZlIHRoaXMgb25jZSBXZWJLaXQga25vd3MgdG8gcHJv
cGVybHkgc2NoZWR1bGUKLS8vIGxheW91dHMgdXNpbmcgV2ViQ29yZSB3aGVuIG9iamVjdHMgcmVz
aXplLgotdm9pZCBSZW5kZXJQYXJ0Ojp1cGRhdGVXaWRnZXRQb3NpdGlvbigpCi17Ci0gICAgaWYg
KCFtX3dpZGdldCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGludCB4LCB5LCB3aWR0aCwg
aGVpZ2h0OwotICAgIGFic29sdXRlUG9zaXRpb24oeCwgeSk7Ci0gICAgeCArPSBib3JkZXJMZWZ0
KCkgKyBwYWRkaW5nTGVmdCgpOwotICAgIHkgKz0gYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCk7
Ci0gICAgd2lkdGggPSBtX3dpZHRoIC0gYm9yZGVyTGVmdCgpIC0gYm9yZGVyUmlnaHQoKSAtIHBh
ZGRpbmdMZWZ0KCkgLSBwYWRkaW5nUmlnaHQoKTsKLSAgICBoZWlnaHQgPSBtX2hlaWdodCAtIGJv
cmRlclRvcCgpIC0gYm9yZGVyQm90dG9tKCkgLSBwYWRkaW5nVG9wKCkgLSBwYWRkaW5nQm90dG9t
KCk7Ci0gICAgSW50UmVjdCBuZXdCb3VuZHMoeCx5LHdpZHRoLGhlaWdodCk7Ci0gICAgaWYgKG5l
d0JvdW5kcyAhPSBtX3dpZGdldC0+ZnJhbWVHZW9tZXRyeSgpKSB7Ci0gICAgICAgIC8vIFRoZSB3
aWRnZXQgY2hhbmdlZCBwb3NpdGlvbnMuICBVcGRhdGUgdGhlIGZyYW1lIGdlb21ldHJ5LgotICAg
ICAgICBSZW5kZXJBcmVuYSAqYXJlbmEgPSByZWYoKTsKLSAgICAgICAgZWxlbWVudCgpLT5yZWYo
KTsKLSAgICAgICAgbV93aWRnZXQtPnNldEZyYW1lR2VvbWV0cnkobmV3Qm91bmRzKTsKLSAgICAg
ICAgZWxlbWVudCgpLT5kZXJlZigpOwotICAgICAgICBkZXJlZihhcmVuYSk7Ci0gICAgICAgIAot
ICAgICAgICBpZiAobV93aWRnZXQgJiYgbV93aWRnZXQtPmlzRnJhbWVWaWV3KCkpCi0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3dpZGdldCktPmxheW91dCgpOwotICAgIH0K
LX0KLQogfQpJbmRleDogcmVuZGVyaW5nL1JlbmRlclBhcnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5k
ZXJpbmcvUmVuZGVyUGFydC5oCShyZXZpc2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9SZW5kZXJQ
YXJ0LmgJKHdvcmtpbmcgY29weSkKQEAgLTIyLDY4ICsyMiwxNSBAQAogICoKICAqLwogCi0jaWZu
ZGVmIHJlbmRlcl9mcmFtZXNfaF9fCi0jZGVmaW5lIHJlbmRlcl9mcmFtZXNfaF9fCisjaWZuZGVm
IFJlbmRlclBhcnRfSAorI2RlZmluZSBSZW5kZXJQYXJ0X0gKIAotI2luY2x1ZGUgIlJlbmRlckNv
bnRhaW5lci5oIgotI2luY2x1ZGUgInJlbmRlcl9yZXBsYWNlZC5oIgotI2luY2x1ZGUgImh0bWxf
YmFzZWltcGwuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCi1jbGFzcyBGcmFtZVZpZXc7CitjbGFzcyBGcmFtZTsKIGNsYXNzIEhUTUxFbGVtZW50
OwotY2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKLWNsYXNzIE1vdXNlRXZlbnQ7Ci0KLXN0cnVjdCBD
aGlsZEZyYW1lOwotCi1jbGFzcyBSZW5kZXJGcmFtZVNldCA6IHB1YmxpYyBSZW5kZXJDb250YWlu
ZXIKLXsKLSAgICBmcmllbmQgY2xhc3MgSFRNTEZyYW1lU2V0RWxlbWVudDsKLXB1YmxpYzoKLSAg
ICBSZW5kZXJGcmFtZVNldChIVE1MRnJhbWVTZXRFbGVtZW50Kik7Ci0gICAgdmlydHVhbCB+UmVu
ZGVyRnJhbWVTZXQoKTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNv
bnN0IHsgcmV0dXJuICJSZW5kZXJGcmFtZVNldCI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGcmFt
ZVNldCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQo
KTsKLQotICAgIHZvaWQgcG9zaXRpb25GcmFtZXMoKTsKLQotICAgIGJvb2wgcmVzaXppbmcoKSBj
b25zdCB7IHJldHVybiBtX3Jlc2l6aW5nOyB9Ci0KLSAgICBib29sIHVzZXJSZXNpemUoTW91c2VF
dmVudCopOwotICAgIGJvb2wgY2FuUmVzaXplKGludCB4LCBpbnQgeSk7Ci0gICAgdm9pZCBzZXRS
ZXNpemluZyhib29sKTsKLQotICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChOb2RlSW5mbyYs
IGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24pOwotCi0gICAgSFRN
TEZyYW1lU2V0RWxlbWVudCogZWxlbWVudCgpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIHN0YXRp
Y19jYXN0PEhUTUxGcmFtZVNldEVsZW1lbnQqPihSZW5kZXJDb250YWluZXI6OmVsZW1lbnQoKSk7
IH0KLQotI2lmbmRlZiBOREVCVUcKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAq
c3RyZWFtLCBEZXByZWNhdGVkU3RyaW5nIGluZCA9ICIiKSBjb25zdDsKLSNlbmRpZgotCi1wcml2
YXRlOgotICAgIGludCBtX29sZHBvczsKLSAgICBpbnQgbV9ncmlkTGVuWzJdOwotICAgIGludCog
bV9ncmlkRGVsdGFbMl07Ci0gICAgaW50KiBtX2dyaWRMYXlvdXRbMl07Ci0KLSAgICBib29sKiBt
X2hTcGxpdFZhcjsgLy8gaXMgdGhpcyBzcGxpdCB2YXJpYWJsZT8KLSAgICBib29sKiBtX3ZTcGxp
dFZhcjsKLQotICAgIGludCBtX2hTcGxpdDsgLy8gdGhlIHNwbGl0IGN1cnJlbnRseSByZXNpemVk
Ci0gICAgaW50IG1fdlNwbGl0OwotICAgIGludCBtX2hTcGxpdFBvczsKLSAgICBpbnQgbV92U3Bs
aXRQb3M7Ci0KLSAgICBib29sIG1fcmVzaXppbmc7Ci0gICAgYm9vbCBtX2NsaWVudFJlc2l6aW5n
OwotfTsKIAogY2xhc3MgUmVuZGVyUGFydCA6IHB1YmxpYyBSZW5kZXJXaWRnZXQgewogcHVibGlj
OgpAQCAtMTEyLDMzICs1OSw2IEBAIHByaXZhdGU6CiAgICAgRnJhbWUqIG1fZnJhbWU7CiB9Owog
Ci1jbGFzcyBSZW5kZXJGcmFtZSA6IHB1YmxpYyBSZW5kZXJQYXJ0Ci17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyRnJhbWUoSFRNTEZyYW1lRWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFy
KiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZyYW1lIjsgfQotCi0gICAgSFRN
TEZyYW1lRWxlbWVudCogZWxlbWVudCgpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIHN0YXRpY19j
YXN0PEhUTUxGcmFtZUVsZW1lbnQqPihSZW5kZXJQYXJ0OjplbGVtZW50KCkpOyB9Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgdmlld0NsZWFyZWQoKTsKLX07Ci0KLS8vIEkgY2FuIGhhcmRseSBjYWxsIHRo
ZSBjbGFzcyBSZW5kZXJPYmplY3QgOy0pCi1jbGFzcyBSZW5kZXJQYXJ0T2JqZWN0IDogcHVibGlj
IFJlbmRlclBhcnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJQYXJ0T2JqZWN0KEhUTUxFbGVtZW50
Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVy
biAiUmVuZGVyUGFydE9iamVjdCI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgdXBkYXRlV2lkZ2V0KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdmlld0Ns
ZWFyZWQoKTsKLX07Ci0KIH0KIAogI2VuZGlmCkluZGV4OiByZW5kZXJpbmcvcmVuZGVyX2ZyYW1l
cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9mcmFtZXMuY3BwCShyZXZpc2lv
biAxNDMyNSkKKysrIHJlbmRlcmluZy9yZW5kZXJfZnJhbWVzLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw5MzkgKzAsMCBAQAotLyoqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgS0RFIHBy
b2plY3QuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5v
cmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDAgU2ltb24gSGF1c21hbm4gPGhhdXNtYW5uQGtkZS5v
cmc+Ci0gKiAgICAgICAgICAgKEMpIDIwMDAgU3RlZmFuIFNjaGltYW5za2kgKDFTdGVpbkBnbXgu
ZGUpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
Ci0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxh
Y2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInJlbmRlcl9mcmFtZXMuaCIKLQotI2lu
Y2x1ZGUgIkN1cnNvci5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRXZlbnRO
YW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVUcmVlLmgiCi0jaW5j
bHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVk
ZSAiUGFnZS5oIgotI2luY2x1ZGUgIlRleHQuaCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwu
aCIKLSNpbmNsdWRlICJodG1sX2Jhc2VpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTEVtYmVkRWxlbWVu
dC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgotI2luY2x1ZGUgIkhUTUxPYmplY3RFbGVtZW50
LmgiCi0jaW5jbHVkZSAiSFRNTFBhcmFtRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUb2tlbml6
ZXIuaCIKLSNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgotI2luY2x1ZGUgIlJlbmRlckNhbnZhcy5o
IgotI2luY2x1ZGUgIktXUVRleHRTdHJlYW0uaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi11
c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0K
LVJlbmRlckZyYW1lU2V0OjpSZW5kZXJGcmFtZVNldCggSFRNTEZyYW1lU2V0RWxlbWVudCAqZnJh
bWVTZXQpCi0gICAgOiBSZW5kZXJDb250YWluZXIoZnJhbWVTZXQpCi17Ci0gIC8vIGluaXQgUmVu
ZGVyT2JqZWN0IGF0dHJpYnV0ZXMKLSAgICBzZXRJbmxpbmUoZmFsc2UpOwotCi0gIGZvciAoaW50
IGsgPSAwOyBrIDwgMjsgKytrKSB7Ci0gICAgICBtX2dyaWRMZW5ba10gPSAtMTsKLSAgICAgIG1f
Z3JpZERlbHRhW2tdID0gMDsKLSAgICAgIG1fZ3JpZExheW91dFtrXSA9IDA7Ci0gIH0KLQotICBt
X3Jlc2l6aW5nID0gbV9jbGllbnRSZXNpemluZyA9IGZhbHNlOwotCi0gIG1faFNwbGl0ID0gLTE7
Ci0gIG1fdlNwbGl0ID0gLTE7Ci0KLSAgbV9oU3BsaXRWYXIgPSAwOwotICBtX3ZTcGxpdFZhciA9
IDA7Ci19Ci0KLVJlbmRlckZyYW1lU2V0Ojp+UmVuZGVyRnJhbWVTZXQoKQotewotICAgIGZvciAo
aW50IGsgPSAwOyBrIDwgMjsgKytrKSB7Ci0gICAgICAgIGlmIChtX2dyaWRMYXlvdXRba10pIGRl
bGV0ZSBbXSBtX2dyaWRMYXlvdXRba107Ci0gICAgICAgIGlmIChtX2dyaWREZWx0YVtrXSkgZGVs
ZXRlIFtdIG1fZ3JpZERlbHRhW2tdOwotICAgIH0KLSAgaWYgKG1faFNwbGl0VmFyKQotICAgICAg
ZGVsZXRlIFtdIG1faFNwbGl0VmFyOwotICBpZiAobV92U3BsaXRWYXIpCi0gICAgICBkZWxldGUg
W10gbV92U3BsaXRWYXI7Ci19Ci0KLWJvb2wgUmVuZGVyRnJhbWVTZXQ6Om5vZGVBdFBvaW50KE5v
ZGVJbmZvJiBpbmZvLCBpbnQgX3gsIGludCBfeSwgaW50IF90eCwgaW50IF90eSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKLXsK
LSAgICBpZiAoaGl0VGVzdEFjdGlvbiAhPSBIaXRUZXN0Rm9yZWdyb3VuZCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgYm9vbCBpbnNpZGUgPSBSZW5kZXJDb250YWluZXI6Om5vZGVBdFBv
aW50KGluZm8sIF94LCBfeSwgX3R4LCBfdHksIGhpdFRlc3RBY3Rpb24pIHx8IAotICAgICAgICAg
ICAgICAgICAgbV9yZXNpemluZyB8fCBjYW5SZXNpemUoX3gsIF95KTsKLSAgICBpZiAoaW5zaWRl
ICYmIGVsZW1lbnQoKSAmJiAhZWxlbWVudCgpLT5ub1Jlc2l6ZSgpICYmICFpbmZvLnJlYWRvbmx5
KCkgJiYgIWluZm8uaW5uZXJOb2RlKCkpIHsKLSAgICAgICAgaW5mby5zZXRJbm5lck5vZGUoZWxl
bWVudCgpKTsKLSAgICAgICAgaW5mby5zZXRJbm5lck5vblNoYXJlZE5vZGUoZWxlbWVudCgpKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gaW5zaWRlIHx8IG1fY2xpZW50UmVzaXppbmc7Ci19Ci0KLXZv
aWQgUmVuZGVyRnJhbWVTZXQ6OmxheW91dCggKQotewotICAgIEtIVE1MQXNzZXJ0KCBuZWVkc0xh
eW91dCgpICk7Ci0gICAgS0hUTUxBc3NlcnQoIG1pbk1heEtub3duKCkgKTsKLQotICAgIGlmICgg
IXBhcmVudCgpLT5pc0ZyYW1lU2V0KCkgKSB7Ci0gICAgICAgIEZyYW1lVmlldyogdmlldyA9IGNh
bnZhcygpLT52aWV3KCk7Ci0gICAgICAgIG1fd2lkdGggPSB2aWV3LT52aXNpYmxlV2lkdGgoKTsK
LSAgICAgICAgbV9oZWlnaHQgPSB2aWV3LT52aXNpYmxlSGVpZ2h0KCk7Ci0gICAgfQotCi0gICAg
aW50IHJlbWFpbmluZ0xlblsyXTsKLSAgICByZW1haW5pbmdMZW5bMV0gPSBtX3dpZHRoIC0gKGVs
ZW1lbnQoKS0+dG90YWxDb2xzKCktMSkqZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICBpZihyZW1h
aW5pbmdMZW5bMV08MCkgcmVtYWluaW5nTGVuWzFdPTA7Ci0gICAgcmVtYWluaW5nTGVuWzBdID0g
bV9oZWlnaHQgLSAoZWxlbWVudCgpLT50b3RhbFJvd3MoKS0xKSplbGVtZW50KCktPmJvcmRlcigp
OwotICAgIGlmKHJlbWFpbmluZ0xlblswXTwwKSByZW1haW5pbmdMZW5bMF09MDsKLQotICAgIGlu
dCBhdmFpbGFibGVMZW5bMl07Ci0gICAgYXZhaWxhYmxlTGVuWzBdID0gcmVtYWluaW5nTGVuWzBd
OwotICAgIGF2YWlsYWJsZUxlblsxXSA9IHJlbWFpbmluZ0xlblsxXTsKLQotICAgIGlmIChtX2dy
aWRMZW5bMF0gIT0gZWxlbWVudCgpLT50b3RhbFJvd3MoKSB8fCBtX2dyaWRMZW5bMV0gIT0gZWxl
bWVudCgpLT50b3RhbENvbHMoKSkgewotICAgICAgICAvLyBudW1iZXIgb2Ygcm93cyBvciBjb2xz
IGNoYW5nZWQKLSAgICAgICAgLy8gbmVlZCB0byB6ZXJvIG91dCB0aGUgZGVsdGFzCi0gICAgICAg
IG1fZ3JpZExlblswXSA9IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7Ci0gICAgICAgIG1fZ3JpZExl
blsxXSA9IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7Ci0gICAgICAgIGZvciAoaW50IGsgPSAwOyBr
IDwgMjsgKytrKSB7Ci0gICAgICAgICAgICBpZiAobV9ncmlkRGVsdGFba10pIGRlbGV0ZSBbXSBt
X2dyaWREZWx0YVtrXTsKLSAgICAgICAgICAgIG1fZ3JpZERlbHRhW2tdID0gbmV3IGludFttX2dy
aWRMZW5ba11dOwotICAgICAgICAgICAgaWYgKG1fZ3JpZExheW91dFtrXSkgZGVsZXRlIFtdIG1f
Z3JpZExheW91dFtrXTsKLSAgICAgICAgICAgIG1fZ3JpZExheW91dFtrXSA9IG5ldyBpbnRbbV9n
cmlkTGVuW2tdXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9ncmlkTGVuW2td
OyArK2kpCi0gICAgICAgICAgICAgICAgbV9ncmlkRGVsdGFba11baV0gPSAwOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKLSAgICAgICAgaW50
IHRvdGFsUmVsYXRpdmUgPSAwOwotICAgICAgICBpbnQgdG90YWxGaXhlZCA9IDA7Ci0gICAgICAg
IGludCB0b3RhbFBlcmNlbnQgPSAwOwotICAgICAgICBpbnQgY291bnRSZWxhdGl2ZSA9IDA7Ci0g
ICAgICAgIGludCBjb3VudEZpeGVkID0gMDsKLSAgICAgICAgaW50IGNvdW50UGVyY2VudCA9IDA7
Ci0gICAgICAgIGludCBncmlkTGVuID0gbV9ncmlkTGVuW2tdOwotICAgICAgICBpbnQqIGdyaWRE
ZWx0YSA9IG1fZ3JpZERlbHRhW2tdOwotICAgICAgICBXZWJDb3JlOjpMZW5ndGgqIGdyaWQgPSAg
ayA/IGVsZW1lbnQoKS0+bV9jb2xzIDogZWxlbWVudCgpLT5tX3Jvd3M7Ci0gICAgICAgIGludCog
Z3JpZExheW91dCA9IG1fZ3JpZExheW91dFtrXTsKLQotICAgICAgICBpZiAoZ3JpZCkgewotICAg
ICAgICAgICAgYXNzZXJ0KGdyaWRMZW4pOwotICAgICAgICAgICAgLy8gRmlyc3Qgd2UgbmVlZCB0
byBpbnZlc3RpZ2F0ZSBob3cgbWFueSBjb2x1bW5zIG9mIGVhY2ggdHlwZSB3ZSBoYXZlIGFuZAot
ICAgICAgICAgICAgLy8gaG93IG11Y2ggc3BhY2UgdGhlc2UgY29sdW1ucyBhcmUgZ29pbmcgdG8g
cmVxdWlyZS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7
Ci0gICAgICAgICAgICAgICAgLy8gQ291bnQgdGhlIHRvdGFsIGxlbmd0aCBvZiBhbGwgb2YgdGhl
IGZpeGVkIGNvbHVtbnMvcm93cyAtPiB0b3RhbEZpeGVkCi0gICAgICAgICAgICAgICAgLy8gQ291
bnQgdGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3Mgd2hpY2ggYXJlIGZpeGVkIC0+IGNvdW50Rml4
ZWQKLSAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc0ZpeGVkKCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgZ3JpZExheW91dFtpXSA9IG1heChncmlkW2ldLnZhbHVlKCksIDApOwotICAgICAg
ICAgICAgICAgICAgICB0b3RhbEZpeGVkICs9IGdyaWRMYXlvdXRbaV07Ci0gICAgICAgICAgICAg
ICAgICAgIGNvdW50Rml4ZWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gQ291bnQgdGhlIHRvdGFsIHBlcmNlbnRhZ2Ugb2YgYWxsIG9m
IHRoZSBwZXJjZW50YWdlIGNvbHVtbnMvcm93cyAtPiB0b3RhbFBlcmNlbnQKLSAgICAgICAgICAg
ICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMvcm93cyB3aGljaCBhcmUgcGVyY2Vu
dGFnZXMgLT4gY291bnRQZXJjZW50Ci0gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNQZXJj
ZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSA9IG1heChncmlkW2ld
LmNhbGNWYWx1ZShhdmFpbGFibGVMZW5ba10pLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgdG90
YWxQZXJjZW50ICs9IGdyaWRMYXlvdXRbaV07Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50UGVy
Y2VudCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENvdW50IHRo
ZSB0b3RhbCByZWxhdGl2ZSBvZiBhbGwgdGhlIHJlbGF0aXZlIGNvbHVtbnMvcm93cyAtPiB0b3Rh
bFJlbGF0aXZlCi0gICAgICAgICAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBjb2x1bW5z
L3Jvd3Mgd2hpY2ggYXJlIHJlbGF0aXZlIC0+IGNvdW50UmVsYXRpdmUKLSAgICAgICAgICAgICAg
ICBpZiAoZ3JpZFtpXS5pc1JlbGF0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdG90YWxS
ZWxhdGl2ZSArPSBtYXgoZ3JpZFtpXS52YWx1ZSgpLCAxKTsKLSAgICAgICAgICAgICAgICAgICAg
Y291bnRSZWxhdGl2ZSsrOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgLy8gRml4ZWQgY29sdW1ucy9yb3dzIGFyZSBvdXIgZmlyc3Qg
cHJpb3JpdHkuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgdG8gZml0IGFsbCBmaXhlZAot
ICAgICAgICAgICAgLy8gY29sdW1ucy9yb3dzIHdlIG5lZWQgdG8gcHJvcG9ydGlvbmFsbHkgYWRq
dXN0IHRoZWlyIHNpemUuIAotICAgICAgICAgICAgaWYgKHRvdGFsRml4ZWQgPiByZW1haW5pbmdM
ZW5ba10pIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nRml4ZWQgPSByZW1haW5pbmdM
ZW5ba107Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsr
aSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc0ZpeGVkKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gPSAoZ3JpZExheW91dFtpXSAqIHJlbWFp
bmluZ0ZpeGVkKSAvIHRvdGFsRml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5p
bmdMZW5ba10gLT0gZ3JpZExheW91dFtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVtYWlu
aW5nTGVuW2tdIC09IHRvdGFsRml4ZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IFBlcmNlbnRhZ2UgY29sdW1ucy9yb3dzIGFyZSBvdXIgc2Vjb25kIHByaW9yaXR5LiBEaXZpZGUg
dGhlIHJlbWFpbmluZyBzcGFjZSBwcm9wb3J0aW9uYWxseSAKLSAgICAgICAgICAgIC8vIG92ZXIg
YWxsIHBlcmNlbnRhZ2UgY29sdW1ucy9yb3dzLiBJTVBPUlRBTlQ6IHRoZSBzaXplIG9mIGVhY2gg
Y29sdW1uL3JvdyBpcyBub3QgcmVsYXRpdmUgCi0gICAgICAgICAgICAvLyB0byAxMDAlLCBidXQg
dG8gdGhlIHRvdGFsIHBlcmNlbnRhZ2UuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBhcmUgdGhyZWUg
Y29sdW1ucywgZWFjaCBvZiA3NSUsCi0gICAgICAgICAgICAvLyBhbmQgdGhlIGF2YWlsYWJsZSBz
cGFjZSBpcyAzMDBweCwgZWFjaCBjb2x1bW4gd2lsbCBiZWNvbWUgMTAwcHggaW4gd2lkdGguCi0g
ICAgICAgICAgICBpZiAodG90YWxQZXJjZW50ID4gcmVtYWluaW5nTGVuW2tdKSB7Ci0gICAgICAg
ICAgICAgICAgaW50IHJlbWFpbmluZ1BlcmNlbnQgPSByZW1haW5pbmdMZW5ba107Ci0KLSAgICAg
ICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAg
ICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc1BlcmNlbnQoKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgZ3JpZExheW91dFtpXSA9IChncmlkTGF5b3V0W2ldICogcmVtYWluaW5nUGVyY2VudCkg
LyB0b3RhbFBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10g
LT0gZ3JpZExheW91dFtpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2td
IC09IHRvdGFsUGVyY2VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVsYXRp
dmUgY29sdW1ucy9yb3dzIGFyZSBvdXIgbGFzdCBwcmlvcml0eS4gRGl2aWRlIHRoZSByZW1haW5p
bmcgc3BhY2UgcHJvcG9ydGlvbmFsbHkKLSAgICAgICAgICAgIC8vIG92ZXIgYWxsIHJlbGF0aXZl
IGNvbHVtbnMvcm93cy4gSU1QT1JUQU5UOiB0aGUgcmVsYXRpdmUgdmFsdWUgb2YgMCogaXMgdHJl
YXRlZCBhcyAxKi4KLSAgICAgICAgICAgIGlmIChjb3VudFJlbGF0aXZlKSB7Ci0gICAgICAgICAg
ICAgICAgaW50IGxhc3RSZWxhdGl2ZSA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmlu
Z1JlbGF0aXZlID0gcmVtYWluaW5nTGVuW2tdOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRb
aV0uaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ld
ID0gKG1heChncmlkW2ldLnZhbHVlKCksIDEpICogcmVtYWluaW5nUmVsYXRpdmUpIC8gdG90YWxS
ZWxhdGl2ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBncmlk
TGF5b3V0W2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJlbGF0aXZlID0gaTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZCBub3QgZXZlbnRseSBkaXN0cmlidXRlIHRo
ZSBhdmFpbGFibGUgc3BhY2Ugb2YgYWxsIG9mIHRoZSByZWxhdGl2ZSAgCi0gICAgICAgICAgICAg
ICAgLy8gY29sdW1ucy9yb3dzLCB0aGUgcmVtYWluZGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxh
c3QgY29sdW1uL3Jvdy4KLSAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogaWYgd2UgaGF2
ZSBhIHNwYWNlIG9mIDEwMHB4IGFuZCB0aHJlZSBjb2x1bW5zICgqLCosKiksIHRoZSByZW1haW5k
ZXIgd2lsbAotICAgICAgICAgICAgICAgIC8vIGJlIDFweCBhbmQgd2lsbCBiZSBhZGRlZCB0byB0
aGUgbGFzdCBjb2x1bW46IDMzcHgsIDMzcHgsIDM0cHguCi0gICAgICAgICAgICAgICAgaWYgKHJl
bWFpbmluZ0xlbltrXSkgewotICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2xhc3RSZWxh
dGl2ZV0gKz0gcmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdM
ZW5ba10gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBzb21lIGxlZnQgb3ZlciBzcGFjZSB3ZSBuZWVkIHRvIGRp
dmlkZSBpdCBvdmVyIHRoZSBhbHJlYWR5IGV4aXN0aW5nCi0gICAgICAgICAgICAvLyBjb2x1bW5z
L3Jvd3MKLSAgICAgICAgICAgIGlmIChyZW1haW5pbmdMZW5ba10pIHsKLSAgICAgICAgICAgICAg
ICAvLyBPdXIgZmlyc3QgcHJpb3JpdHkgaXMgdG8gc3ByZWFkIGlmIG92ZXIgdGhlIHBlcmNlbnRh
Z2UgY29sdW1ucy4gVGhlIHJlbWFpbmluZwotICAgICAgICAgICAgICAgIC8vIHNwYWNlIGlzIHNw
cmVhZCBldmVubHksIGZvciBleGFtcGxlOiBpZiB3ZSBoYXZlIGEgc3BhY2Ugb2YgMTAwcHgsIHRo
ZSBjb2x1bW5zIAotICAgICAgICAgICAgICAgIC8vIGRlZmluaXRpb24gb2YgMjUlLDI1JSB1c2Vk
IHRvIHJlc3VsdCBpbiB0d28gY29sdW1ucyBvZiAyNXB4LiBBZnRlciB0aGlzIHRoZSAKLSAgICAg
ICAgICAgICAgICAvLyBjb2x1bW5zIHdpbGwgZWFjaCBiZSA1MHB4IGluIHdpZHRoLiAKLSAgICAg
ICAgICAgICAgICBpZiAoY291bnRQZXJjZW50ICYmIHRvdGFsUGVyY2VudCkgewotICAgICAgICAg
ICAgICAgICAgICBpbnQgcmVtYWluaW5nUGVyY2VudCA9IHJlbWFpbmluZ0xlbltrXTsKLSAgICAg
ICAgICAgICAgICAgICAgaW50IGNoYW5nZVBlcmNlbnQgPSAwOwotCi0gICAgICAgICAgICAgICAg
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoZ3JpZFtpXS5pc1BlcmNlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNoYW5nZVBlcmNlbnQgPSAocmVtYWluaW5nUGVyY2VudCAqIGdyaWRMYXlvdXRbaV0p
IC8gdG90YWxQZXJjZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRb
aV0gKz0gY2hhbmdlUGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5p
bmdMZW5ba10gLT0gY2hhbmdlUGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG90YWxGaXhl
ZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBPdXIgbGFzdCBwcmlvcml0eSBpcyB0byBzcHJl
YWQgdGhlIHJlbWFpbmluZyBzcGFjZSBvdmVyIHRoZSBmaXhlZCBjb2x1bW5zLgotICAgICAgICAg
ICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBpZiB3ZSBoYXZlIDEwMHB4IG9mIHNwYWNlIGFuZCB0
d28gY29sdW1uIG9mIGVhY2ggNDBweCwgYm90aAotICAgICAgICAgICAgICAgICAgICAvLyBjb2x1
bW5zIHdpbGwgYmVjb21lIGV4YWN0bHkgNTBweC4KLSAgICAgICAgICAgICAgICAgICAgaW50IHJl
bWFpbmluZ0ZpeGVkID0gcmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgICAgICAgICBpbnQg
Y2hhbmdlRml4ZWQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgZ3JpZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXS5p
c0ZpeGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGaXhlZCA9IChy
ZW1haW5pbmdGaXhlZCAqIGdyaWRMYXlvdXRbaV0pIC8gdG90YWxGaXhlZDsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9IGNoYW5nZUZpeGVkOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBjaGFuZ2VGaXhlZDsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHdl
IHN0aWxsIGhhdmUgc29tZSBsZWZ0IG92ZXIgc3BhY2Ugd2UgcHJvYmFibHkgZW5kZWQgdXAgd2l0
aCBhIHJlbWFpbmRlciBvZgotICAgICAgICAgICAgLy8gYSBkaXZpc2lvbi4gV2UgY2FuIG5vdCBz
cHJlYWQgaXQgZXZlbmx5IGFueW1vcmUuIElmIHdlIGhhdmUgYW55IHBlcmNlbnRhZ2UgCi0gICAg
ICAgICAgICAvLyBjb2x1bW5zL3Jvd3Mgc2ltcGx5IHNwcmVhZCB0aGUgcmVtYWluZGVyIGVxdWFs
bHkgb3ZlciBhbGwgYXZhaWxhYmxlIHBlcmNlbnRhZ2UgY29sdW1ucywgCi0gICAgICAgICAgICAv
LyByZWdhcmRsZXNzIG9mIHRoZWlyIHNpemUuCi0gICAgICAgICAgICBpZiAocmVtYWluaW5nTGVu
W2tdICYmIGNvdW50UGVyY2VudCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdQZXJj
ZW50ID0gcmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgICAgIGludCBjaGFuZ2VQZXJjZW50
ID0gMDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzUGVyY2VudCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQZXJjZW50ID0gcmVtYWluaW5nUGVyY2VudCAvIGNv
dW50UGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gKz0gY2hh
bmdlUGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSBj
aGFuZ2VQZXJjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3Qg
aGF2ZSBhbnkgcGVyY2VudGFnZSBjb2x1bW5zL3Jvd3Mgd2Ugb25seSBoYXZlIGZpeGVkIGNvbHVt
bnMuIFNwcmVhZAotICAgICAgICAgICAgLy8gdGhlIHJlbWFpbmRlciBlcXVhbGx5IG92ZXIgYWxs
IGZpeGVkIGNvbHVtbnMvcm93cy4KLSAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZ0xlbltr
XSAmJiBjb3VudEZpeGVkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ0ZpeGVkID0g
cmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgICAgIGludCBjaGFuZ2VGaXhlZCA9IDA7Ci0g
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlk
TGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNGaXhlZCgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGaXhlZCA9IHJlbWFpbmluZ0ZpeGVkIC8g
Y291bnRGaXhlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gKz0gY2hh
bmdlRml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gY2hh
bmdlRml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN0aWxsIHNvbWUgbGVmdCBvdmVyLi4uIHNpbXBs
eSBhZGQgaXQgdG8gdGhlIGxhc3QgY29sdW1uLCBiZWNhdXNlIGl0IGlzIGltcG9zc2libGUKLSAg
ICAgICAgICAgIC8vIHNwcmVhZCBpdCBldmVubHkgb3IgZXF1YWxseS4KLSAgICAgICAgICAgIGlm
IChyZW1haW5pbmdMZW5ba10pIHsKLSAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2dyaWRMZW4g
LSAxXSArPSByZW1haW5pbmdMZW5ba107Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8v
IG5vdyB3ZSBoYXZlIHRoZSBmaW5hbCBsYXlvdXQsIGRpc3RyaWJ1dGUgdGhlIGRlbHRhIG92ZXIg
aXQKLSAgICAgICAgICAgIGJvb2wgd29ya2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdyaWRMYXlv
dXRbaV0gJiYgZ3JpZExheW91dFtpXSArIGdyaWREZWx0YVtpXSA8PSAwKQotICAgICAgICAgICAg
ICAgICAgICB3b3JrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9
IGdyaWREZWx0YVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG5vdyB0aGUgZGVs
dGEncyBicm9rZSBzb21ldGhpbmcsIHVuZG8gaXQgYW5kIHJlc2V0IGRlbHRhcwotICAgICAgICAg
ICAgaWYgKCF3b3JrZWQpCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlk
TGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSAtPSBncmlkRGVs
dGFbaV07Ci0gICAgICAgICAgICAgICAgICAgIGdyaWREZWx0YVtpXSA9IDA7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdyaWRMYXlvdXRb
MF0gPSByZW1haW5pbmdMZW5ba107Ci0gICAgfQotCi0gICAgcG9zaXRpb25GcmFtZXMoKTsKLQot
ICAgIFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gICAgaWYgKCAhY2hpbGQg
KQotICAgICAgICBnb3RvIGVuZDI7Ci0KLSAgICBpZighbV9oU3BsaXRWYXIgJiYgIW1fdlNwbGl0
VmFyKQotICAgIHsKLSAgICAgICAgaWYoIW1fdlNwbGl0VmFyICYmIGVsZW1lbnQoKS0+dG90YWxD
b2xzKCkgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ZTcGxpdFZhciA9IG5ldyBib29s
W2VsZW1lbnQoKS0+dG90YWxDb2xzKCldOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8
IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7IGkrKykgbV92U3BsaXRWYXJbaV0gPSB0cnVlOwotICAg
ICAgICB9Ci0gICAgICAgIGlmKCFtX2hTcGxpdFZhciAmJiBlbGVtZW50KCktPnRvdGFsUm93cygp
ID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgbV9oU3BsaXRWYXIgPSBuZXcgYm9vbFtlbGVt
ZW50KCktPnRvdGFsUm93cygpXTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBlbGVt
ZW50KCktPnRvdGFsUm93cygpOyBpKyspIG1faFNwbGl0VmFyW2ldID0gdHJ1ZTsKLSAgICAgICAg
fQotCi0gICAgICAgIGZvcihpbnQgciA9IDA7IHIgPCBlbGVtZW50KCktPnRvdGFsUm93cygpOyBy
KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpbnQgYyA9IDA7IGMgPCBlbGVtZW50KCkt
PnRvdGFsQ29scygpOyBjKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbCBm
aXhlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKCBjaGlsZC0+aXNGcmFtZVNldCgp
ICkKLSAgICAgICAgICAgICAgICAgIGZpeGVkID0gc3RhdGljX2Nhc3Q8UmVuZGVyRnJhbWVTZXQg
Kj4oY2hpbGQpLT5lbGVtZW50KCktPm5vUmVzaXplKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgICAgZml4ZWQgPSBzdGF0aWNfY2FzdDxSZW5kZXJGcmFtZSAqPihjaGls
ZCktPmVsZW1lbnQoKS0+bm9SZXNpemUoKTsKLQotICAgICAgICAgICAgICAgIGlmKGZpeGVkKQot
ICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGVsZW1lbnQoKS0+dG90
YWxDb2xzKCkgPiAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZihjPjApIG1fdlNwbGl0VmFyW2MtMV0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIG1fdlNwbGl0VmFyW2NdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgaWYoIGVsZW1lbnQoKS0+dG90YWxSb3dzKCkgPiAxKQotICAgICAg
ICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihyPjApIG1faFNwbGl0
VmFyW3ItMV0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1faFNwbGl0VmFyW3Jd
ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIWNoaWxk
KQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQxOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotIGVuZDE6Ci0gICAgUmVuZGVyQ29u
dGFpbmVyOjpsYXlvdXQoKTsKLSBlbmQyOgotICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLX0K
LQotdm9pZCBSZW5kZXJGcmFtZVNldDo6cG9zaXRpb25GcmFtZXMoKQotewotICBpbnQgcjsKLSAg
aW50IGM7Ci0KLSAgUmVuZGVyT2JqZWN0ICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsKLSAgaWYgKCAh
Y2hpbGQgKQotICAgIHJldHVybjsKLQotICAvLyAgTm9kZSAqY2hpbGQgPSBfZmlyc3Q7Ci0gIC8v
ICBpZighY2hpbGQpIHJldHVybjsKLQotICBpbnQgeVBvcyA9IDA7Ci0KLSAgZm9yKHIgPSAwOyBy
IDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsgcisrKQotICB7Ci0gICAgaW50IHhQb3MgPSAwOwot
ICAgIGZvcihjID0gMDsgYyA8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7IGMrKykKLSAgICB7Ci0g
ICAgICBjaGlsZC0+c2V0UG9zKCB4UG9zLCB5UG9zICk7Ci0gICAgICAvLyBoYXMgdG8gYmUgcmVz
aXplZCBhbmQgaXRzZWxmIHJlc2l6ZSBpdHMgY29udGVudHMKLSAgICAgIGlmICgobV9ncmlkTGF5
b3V0WzFdW2NdICE9IGNoaWxkLT53aWR0aCgpKSB8fCAobV9ncmlkTGF5b3V0WzBdW3JdICE9IGNo
aWxkLT5oZWlnaHQoKSkpIHsKLSAgICAgICAgICBjaGlsZC0+c2V0V2lkdGgoIG1fZ3JpZExheW91
dFsxXVtjXSApOwotICAgICAgICAgIGNoaWxkLT5zZXRIZWlnaHQoIG1fZ3JpZExheW91dFswXVty
XSApOwotICAgICAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dCh0cnVlKTsKLSAgICAgICAgICBj
aGlsZC0+bGF5b3V0KCk7Ci0gICAgICB9Ci0KLSAgICAgIHhQb3MgKz0gbV9ncmlkTGF5b3V0WzFd
W2NdICsgZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJs
aW5nKCk7Ci0KLSAgICAgIGlmICggIWNoaWxkICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgfQot
Ci0gICAgeVBvcyArPSBtX2dyaWRMYXlvdXRbMF1bcl0gKyBlbGVtZW50KCktPmJvcmRlcigpOwot
ICB9Ci0KLSAgLy8gYWxsIHRoZSByZW1haW5pbmcgZnJhbWVzIGFyZSBoaWRkZW4gdG8gYXZvaWQg
dWdseQotICAvLyBzcHVyaW91cyB1bmZsb3dlZCBmcmFtZXMKLSAgd2hpbGUgKCBjaGlsZCApIHsK
LSAgICAgIGNoaWxkLT5zZXRXaWR0aCggMCApOwotICAgICAgY2hpbGQtPnNldEhlaWdodCggMCAp
OwotICAgICAgY2hpbGQtPnNldE5lZWRzTGF5b3V0KGZhbHNlKTsKLQotICAgICAgY2hpbGQgPSBj
aGlsZC0+bmV4dFNpYmxpbmcoKTsKLSAgfQotfQotCi1ib29sIFJlbmRlckZyYW1lU2V0Ojp1c2Vy
UmVzaXplKCBNb3VzZUV2ZW50ICpldnQgKQotewotICAgIGlmIChuZWVkc0xheW91dCgpKSByZXR1
cm4gZmFsc2U7Ci0gICAgCi0gICAgYm9vbCByZXMgPSBmYWxzZTsKLSAgICBpbnQgX3ggPSBldnQt
PmNsaWVudFgoKTsKLSAgICBpbnQgX3kgPSBldnQtPmNsaWVudFkoKTsKLSAgICAKLSAgICBpZiAo
ICFtX3Jlc2l6aW5nICYmIGV2dC0+dHlwZSgpID09IG1vdXNlbW92ZUV2ZW50IHx8IGV2dC0+dHlw
ZSgpID09IG1vdXNlZG93bkV2ZW50ICkKLSAgICB7Ci0gICAgICAgIG1faFNwbGl0ID0gLTE7Ci0g
ICAgICAgIG1fdlNwbGl0ID0gLTE7Ci0gICAgICAgIC8vYm9vbCByZXNpemVQb3NzaWJsZSA9IHRy
dWU7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBvdmVyIGEgaG9yaXpvbnRh
bCBvciB2ZXJ0aWNhbCBib3VuZGFyeQotICAgICAgICBpbnQgcG9zID0gbV9ncmlkTGF5b3V0WzFd
WzBdICsgeFBvcygpOwotICAgICAgICBmb3IgKGludCBjID0gMTsgYyA8IGVsZW1lbnQoKS0+dG90
YWxDb2xzKCk7IGMrKykgewotICAgICAgICAgICAgaWYgKF94ID49IHBvcyAmJiBfeCA8PSBwb3Mr
ZWxlbWVudCgpLT5ib3JkZXIoKSkgewotICAgICAgICAgICAgICAgIGlmIChtX3ZTcGxpdFZhciAm
JiBtX3ZTcGxpdFZhcltjIC0gMV0pCi0gICAgICAgICAgICAgICAgICAgIG1fdlNwbGl0ID0gYyAt
IDE7Ci0gICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyArPSBtX2dyaWRMYXlvdXRbMV1bY10gKyBl
bGVtZW50KCktPmJvcmRlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwb3MgPSBt
X2dyaWRMYXlvdXRbMF1bMF0gKyB5UG9zKCk7Ci0gICAgICAgIGZvciAoaW50IHIgPSAxOyByIDwg
ZWxlbWVudCgpLT50b3RhbFJvd3MoKTsgcisrKSB7Ci0gICAgICAgICAgICBpZiAoIF95ID49IHBv
cyAmJiBfeSA8PSBwb3MrZWxlbWVudCgpLT5ib3JkZXIoKSkgewotICAgICAgICAgICAgICAgIGlm
IChtX2hTcGxpdFZhciAmJiBtX2hTcGxpdFZhcltyIC0gMV0pCi0gICAgICAgICAgICAgICAgICAg
IG1faFNwbGl0ID0gciAtIDE7Ci0gICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyArPSBtX2dyaWRM
YXlvdXRbMF1bcl0gKyBlbGVtZW50KCktPmJvcmRlcigpOwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBpZiAoZXZ0LT50eXBlKCkgPT0gbW91c2Vkb3duRXZlbnQpIHsKLSAgICAgICAgICAg
IHNldFJlc2l6aW5nKHRydWUpOwotICAgICAgICAgICAgbV92U3BsaXRQb3MgPSBfeDsKLSAgICAg
ICAgICAgIG1faFNwbGl0UG9zID0gX3k7Ci0gICAgICAgICAgICBtX29sZHBvcyA9IC0xOwotICAg
ICAgICB9IGVsc2UKLSAgICAgICAgICAgIGNhbnZhcygpLT52aWV3KCktPnNldEN1cnNvcihwb2lu
dGVyQ3Vyc29yKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyAjIyMgY2hlY2sgdGhlIHJlc2l6ZSBp
cyBub3QgZ29pbmcgb3V0IG9mIGJvdW5kcy4KLSAgICBpZiAobV9yZXNpemluZyAmJiBldnQtPnR5
cGUoKSA9PSBtb3VzZXVwRXZlbnQpIHsKLSAgICAgICAgc2V0UmVzaXppbmcoZmFsc2UpOwotICAg
ICAgICAKLSAgICAgICAgaWYobV92U3BsaXQgIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAg
ICBpbnQgZGVsdGEgPSBtX3ZTcGxpdFBvcyAtIF94OwotICAgICAgICAgICAgbV9ncmlkRGVsdGFb
MV1bbV92U3BsaXRdIC09IGRlbHRhOwotICAgICAgICAgICAgbV9ncmlkRGVsdGFbMV1bbV92U3Bs
aXQrMV0gKz0gZGVsdGE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobV9oU3BsaXQgIT0gLTEgKQot
ICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZGVsdGEgPSBtX2hTcGxpdFBvcyAtIF95OwotICAg
ICAgICAgICAgbV9ncmlkRGVsdGFbMF1bbV9oU3BsaXRdIC09IGRlbHRhOwotICAgICAgICAgICAg
bV9ncmlkRGVsdGFbMF1bbV9oU3BsaXQrMV0gKz0gZGVsdGE7Ci0gICAgICAgIH0KLSAgICAgICAg
Ci0gICAgICAgIC8vIHRoaXMganVzdCBzY2hlZHVsZXMgdGhlIHJlbGF5b3V0Ci0gICAgICAgIC8v
IGltcG9ydGFudCwgb3RoZXJ3aXNlIHRoZSBtb3ZpbmcgaW5kaWNhdG9yIGlzIG5vdCBjb3JyZWN0
bHkgZXJhc2VkCi0gICAgICAgIHNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgIH0KLSAgICAKLSAg
ICBlbHNlIGlmIChtX3Jlc2l6aW5nIHx8IGV2dC0+dHlwZSgpID09IG1vdXNldXBFdmVudCkgewot
ICAgICAgICBGcmFtZVZpZXcgKnYgPSBjYW52YXMoKS0+dmlldygpOyAgICAgICAgCi0gICAgICAg
IHYtPmRpc2FibGVGbHVzaERyYXdpbmcoKTsKLSAgICAgICAgR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0ID0gdi0+bG9ja0RyYXdpbmdGb2N1cygpOwotICAgICAgICAKLSAgICAgICAgSW50UmVjdCBy
KHhQb3MoKSwgeVBvcygpLCB3aWR0aCgpLCBoZWlnaHQoKSk7Ci0gICAgICAgIGNvbnN0IGludCBy
Qm9yZCA9IDM7Ci0gICAgICAgIGludCBzdyA9IGVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAgICAg
IGludCBwID0gbV9yZXNpemluZyA/IChtX3ZTcGxpdCA+IC0xID8gX3ggOiBfeSkgOiAtMTsKLSAg
ICAgICAgY29uc3QgUkdCQTMyIGdyZXlRdWFydGVyT3BhY2l0eSA9IDB4NDBBMEEwQTA7Ci0gICAg
ICAgIGlmIChtX3ZTcGxpdCA+IC0xKSB7Ci0gICAgICAgICAgICBpZiAobV9vbGRwb3MgPj0gMCkK
LSAgICAgICAgICAgICAgICB2LT51cGRhdGVDb250ZW50cyhJbnRSZWN0KG1fb2xkcG9zICsgc3cv
MiAtIHJCb3JkLCByLnkoKSwgMiAqIHJCb3JkLCByLmhlaWdodCgpKSwgdHJ1ZSk7Ci0gICAgICAg
ICAgICBpZiAocCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0UGVuKFBlbjo6
Tm9QZW4pOwotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihncmV5UXVhcnRl
ck9wYWNpdHkpOwotICAgICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdSZWN0KEludFJlY3QocCAr
IHN3LzIgLSByQm9yZCwgci55KCksIDIgKiByQm9yZCwgci5oZWlnaHQoKSkpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fb2xkcG9zID49IDApCi0g
ICAgICAgICAgICAgICAgdi0+dXBkYXRlQ29udGVudHMoSW50UmVjdChyLngoKSwgbV9vbGRwb3Mg
KyBzdy8yIC0gckJvcmQsIHIud2lkdGgoKSwgMiAqIHJCb3JkKSwgdHJ1ZSk7Ci0gICAgICAgICAg
ICBpZiAocCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0UGVuKFBlbjo6Tm9Q
ZW4pOwotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihncmV5UXVhcnRlck9w
YWNpdHkpOwotICAgICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdSZWN0KEludFJlY3Qoci54KCks
IHAgKyBzdy8yIC0gckJvcmQsIHIud2lkdGgoKSwgMiAqIHJCb3JkKSk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgbV9vbGRwb3MgPSBwOwotCi0gICAgICAgIHYtPnVubG9ja0Ry
YXdpbmdGb2N1cyhjb250ZXh0KTsKLSAgICAgICAgdi0+ZW5hYmxlRmx1c2hEcmF3aW5nKCk7Ci0g
ICAgfQotICAgIAotICAgIHJldHVybiByZXM7Ci19Ci0KLXZvaWQgUmVuZGVyRnJhbWVTZXQ6OnNl
dFJlc2l6aW5nKGJvb2wgZSkKLXsKLSAgICBtX3Jlc2l6aW5nID0gZTsKLSAgICBmb3IgKFJlbmRl
ck9iamVjdCogcCA9IHBhcmVudCgpOyBwOyBwID0gcC0+cGFyZW50KCkpCi0gICAgICAgIGlmIChw
LT5pc0ZyYW1lU2V0KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJGcmFtZVNldCo+
KHApLT5tX2NsaWVudFJlc2l6aW5nID0gbV9yZXNpemluZzsKLSAgICBjYW52YXMoKS0+dmlldygp
LT5zZXRSZXNpemluZ0ZyYW1lU2V0KGUgPyBlbGVtZW50KCkgOiAwKTsKLX0KLQotYm9vbCBSZW5k
ZXJGcmFtZVNldDo6Y2FuUmVzaXplKCBpbnQgX3gsIGludCBfeSApCi17Ci0gICAgLy8gaWYgd2Ug
aGF2ZW4ndCByZWNlaXZlZCBhIGxheW91dCwgdGhlbiB0aGUgZ3JpZExheW91dCBkb2Vzbid0IGNv
bnRhaW4gdXNlZnVsIGRhdGEgeWV0Ci0gICAgaWYgKG5lZWRzTGF5b3V0KCkgfHwgIW1fZ3JpZExh
eW91dFswXSB8fCAhbV9ncmlkTGF5b3V0WzFdICkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gY2hl
Y2sgaWYgd2UncmUgb3ZlciBhIGhvcml6b250YWwgb3IgdmVydGljYWwgYm91bmRhcnkKLSAgICBp
bnQgcG9zID0gbV9ncmlkTGF5b3V0WzFdWzBdOwotICAgIGZvcihpbnQgYyA9IDE7IGMgPCBlbGVt
ZW50KCktPnRvdGFsQ29scygpOyBjKyspCi0gICAgICAgIGlmKF94ID49IHBvcyAmJiBfeCA8PSBw
b3MrZWxlbWVudCgpLT5ib3JkZXIoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg
cG9zID0gbV9ncmlkTGF5b3V0WzBdWzBdOwotICAgIGZvcihpbnQgciA9IDE7IHIgPCBlbGVtZW50
KCktPnRvdGFsUm93cygpOyByKyspCi0gICAgICAgIGlmKCBfeSA+PSBwb3MgJiYgX3kgPD0gcG9z
K2VsZW1lbnQoKS0+Ym9yZGVyKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBOREVCVUcKLXZvaWQgUmVuZGVyRnJhbWVTZXQ6OmR1
bXAoUVRleHRTdHJlYW0gKnN0cmVhbSwgRGVwcmVjYXRlZFN0cmluZyBpbmQpIGNvbnN0Ci17Ci0g
ICpzdHJlYW0gPDwgIiB0b3RhbHJvd3M9IiA8PCBlbGVtZW50KCktPnRvdGFsUm93cygpOwotICAq
c3RyZWFtIDw8ICIgdG90YWxjb2xzPSIgPDwgZWxlbWVudCgpLT50b3RhbENvbHMoKTsKLQotICB1
bnNpZ25lZCBpOwotICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKWVsZW1lbnQoKS0+dG90YWxS
b3dzKCk7IGkrKykKLSAgICAqc3RyZWFtIDw8ICIgaFNwbGl0dmFyKCIgPDwgaSA8PCAiKT0iIDw8
IG1faFNwbGl0VmFyW2ldOwotCi0gIGZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQpZWxlbWVudCgp
LT50b3RhbENvbHMoKTsgaSsrKQotICAgICpzdHJlYW0gPDwgIiB2U3BsaXR2YXIoIiA8PCBpIDw8
ICIpPSIgPDwgbV92U3BsaXRWYXJbaV07Ci0KLSAgUmVuZGVyQ29udGFpbmVyOjpkdW1wKHN0cmVh
bSxpbmQpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQot
UmVuZGVyUGFydDo6UmVuZGVyUGFydChIVE1MRWxlbWVudCogbm9kZSkKLSAgICA6IFJlbmRlcldp
ZGdldChub2RlKSwgbV9mcmFtZSgwKQotewotICAgIC8vIGluaXQgUmVuZGVyT2JqZWN0IGF0dHJp
YnV0ZXMKLSAgICBzZXRJbmxpbmUoZmFsc2UpOwotfQotCi1SZW5kZXJQYXJ0Ojp+UmVuZGVyUGFy
dCgpCi17Ci0gICAgLy8gU2luY2UgZGVyZWYgZW5kcyB1cCBjYWxsaW5nIHNldFdpZGdldCBiYWNr
IG9uIHVzLCBuZWVkIHRvIG1ha2Ugc3VyZQotICAgIC8vIHRoYXQgd2lkZ2V0IGlzIGFscmVhZHkg
MCBzbyBpdCB3b24ndCBkbyBhbnkgd29yay4KLSAgICBXaWRnZXQqIHdpZGdldCA9IG1fd2lkZ2V0
OwotICAgIG1fd2lkZ2V0ID0gMDsKLSAgICBpZiAod2lkZ2V0ICYmIHdpZGdldC0+aXNGcmFtZVZp
ZXcoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4od2lkZ2V0KS0+ZGVyZWYoKTsK
LSAgICBlbHNlCi0gICAgICAgIGRlbGV0ZSB3aWRnZXQ7Ci0KLSAgICBzZXRGcmFtZSgwKTsKLX0K
LQotdm9pZCBSZW5kZXJQYXJ0OjpzZXRGcmFtZShGcmFtZSogZnJhbWUpCi17Ci0gICAgaWYgKGZy
YW1lID09IG1fZnJhbWUpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAobV9mcmFtZSkKLSAgICAg
ICAgbV9mcmFtZS0+ZGlzY29ubmVjdE93bmVyUmVuZGVyZXIoKTsKLSAgICBtX2ZyYW1lID0gZnJh
bWU7Ci19Ci0KLXZvaWQgUmVuZGVyUGFydDo6c2V0V2lkZ2V0KFdpZGdldCogd2lkZ2V0KQotewot
ICAgIGlmICh3aWRnZXQgIT0gbV93aWRnZXQpIHsKLSAgICAgICAgaWYgKHdpZGdldCAmJiB3aWRn
ZXQtPmlzRnJhbWVWaWV3KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih3
aWRnZXQpLT5yZWYoKTsKLSAgICAgICAgUmVuZGVyV2lkZ2V0OjpzZXRXaWRnZXQod2lkZ2V0KTsK
LQotICAgICAgICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotCi0gICAgICAgIC8v
IG1ha2Ugc3VyZSB0aGUgc2Nyb2xsYmFycyBhcmUgc2V0IGNvcnJlY3RseSBmb3IgcmVzdG9yZQot
ICAgICAgICAvLyAjIyMgZmluZCBiZXR0ZXIgZml4Ci0gICAgICAgIHZpZXdDbGVhcmVkKCk7Ci0g
ICAgfQotfQotCi12b2lkIFJlbmRlclBhcnQ6OnZpZXdDbGVhcmVkKCkKLXsKLX0KLQotdm9pZCBS
ZW5kZXJQYXJ0OjpkZWxldGVXaWRnZXQoKQotewotICAgIGlmIChtX3dpZGdldCAmJiBtX3dpZGdl
dC0+aXNGcmFtZVZpZXcoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV93aWRn
ZXQpLT5kZXJlZigpOwotICAgIGVsc2UKLSAgICAgICAgZGVsZXRlIG1fd2lkZ2V0OwotfQotCi0v
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1SZW5kZXJGcmFtZTo6UmVuZGVyRnJh
bWUoSFRNTEZyYW1lRWxlbWVudCogZnJhbWUpCi0gICAgOiBSZW5kZXJQYXJ0KGZyYW1lKQotewot
ICAgIHNldElubGluZShmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVyRnJhbWU6OnZpZXdDbGVhcmVk
KCkKLXsKLSAgICBpZiAoZWxlbWVudCgpICYmIG1fd2lkZ2V0ICYmIG1fd2lkZ2V0LT5pc0ZyYW1l
VmlldygpKSB7Ci0gICAgICAgIEZyYW1lVmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KG1fd2lkZ2V0KTsKLSAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVTZXQgPSBz
dGF0aWNfY2FzdDxIVE1MRnJhbWVTZXRFbGVtZW50ICo+KGVsZW1lbnQoKS0+cGFyZW50Tm9kZSgp
KTsKLSAgICAgICAgYm9vbCBoYXNCb3JkZXIgPSBlbGVtZW50KCktPm1fZnJhbWVCb3JkZXIgJiYg
ZnJhbWVTZXQtPmZyYW1lQm9yZGVyKCk7Ci0gICAgICAgIGludCBtYXJnaW53ID0gZWxlbWVudCgp
LT5tX21hcmdpbldpZHRoOwotICAgICAgICBpbnQgbWFyZ2luaCA9IGVsZW1lbnQoKS0+bV9tYXJn
aW5IZWlnaHQ7Ci0KLSAgICAgICAgdmlldy0+c2V0SGFzQm9yZGVyKGhhc0JvcmRlcik7Ci0gICAg
ICAgIGlmIChtYXJnaW53ICE9IC0xKQotICAgICAgICAgICAgdmlldy0+c2V0TWFyZ2luV2lkdGgo
bWFyZ2ludyk7Ci0gICAgICAgIGlmIChtYXJnaW5oICE9IC0xKQotICAgICAgICAgICAgdmlldy0+
c2V0TWFyZ2luSGVpZ2h0KG1hcmdpbmgpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKiovCi0KLVJlbmRlclBhcnRPYmplY3Q6OlJlbmRlclBhcnRPYmplY3QoSFRN
TEVsZW1lbnQqIGVsZW1lbnQpCi0gICAgOiBSZW5kZXJQYXJ0KGVsZW1lbnQpCi17Ci0gICAgLy8g
aW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNldElubGluZSh0cnVlKTsKLSAgICBt
X2hhc0ZhbGxiYWNrQ29udGVudCA9IGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBpc1VSTEFsbG93
ZWQoV2ViQ29yZTo6RG9jdW1lbnQgKmRvYywgY29uc3QgU3RyaW5nICZ1cmwpCi17Ci0gICAgS1VS
TCBuZXdVUkwoZG9jLT5jb21wbGV0ZVVSTCh1cmwuZGVwcmVjYXRlZFN0cmluZygpKSk7Ci0gICAg
bmV3VVJMLnNldFJlZihEZXByZWNhdGVkU3RyaW5nOjpudWxsKTsKLSAgICAKLSAgICBpZiAoZG9j
LT5mcmFtZSgpLT5wYWdlKCktPmZyYW1lQ291bnQoKSA+PSAyMDApCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIFdlIGFsbG93IG9uZSBsZXZlbCBvZiBzZWxmLXJlZmVyZW5jZSBiZWNh
dXNlIHNvbWUgc2l0ZXMgZGVwZW5kIG9uIHRoYXQuCi0gICAgLy8gQnV0IHdlIGRvbid0IGFsbG93
IG1vcmUgdGhhbiBvbmUuCi0gICAgYm9vbCBmb3VuZFNlbGZSZWZlcmVuY2UgPSBmYWxzZTsKLSAg
ICBmb3IgKEZyYW1lICpmcmFtZSA9IGRvYy0+ZnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUt
PnRyZWUoKS0+cGFyZW50KCkpIHsKLSAgICAgICAgS1VSTCBmcmFtZVVSTCA9IGZyYW1lLT51cmwo
KTsKLSAgICAgICAgZnJhbWVVUkwuc2V0UmVmKERlcHJlY2F0ZWRTdHJpbmc6Om51bGwpOwotICAg
ICAgICBpZiAoZnJhbWVVUkwgPT0gbmV3VVJMKSB7Ci0gICAgICAgICAgICBpZiAoZm91bmRTZWxm
UmVmZXJlbmNlKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGZv
dW5kU2VsZlJlZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXBDbGFzc0lkVG9TZXJ2aWNlVHlwZShjb25z
dCBTdHJpbmcmIGNsYXNzSWQsIFN0cmluZyYgc2VydmljZVR5cGUpCi17Ci0gICAgLy8gSXQgaXMg
QWN0aXZlWCwgYnV0IHRoZSBuc3BsdWdpbiBzeXN0ZW0gaGFuZGxpbmcKLSAgICAvLyBzaG91bGQg
YWxzbyB3b3JrLCB0aGF0J3Mgd2h5IHdlIGRvbid0IG92ZXJyaWRlIHRoZQotICAgIC8vIHNlcnZp
Y2VUeXBlIHdpdGggYXBwbGljYXRpb24veC1hY3RpdmV4LWhhbmRsZXIKLSAgICAvLyBidXQgbGV0
IHRoZSBLVHJhZGVyIGluIGtodG1scGFydDo6Y3JlYXRlUGFydCgpIGRldGVjdAotICAgIC8vIHRo
ZSB1c2VyJ3MgcHJlZmVyZW5jZTogbGF1bmNoIHdpdGggYWN0aXZleCB2aWV3ZXIgb3IKLSAgICAv
LyB3aXRoIG5zcGx1Z2ludmlld2VyIChOaWtvKQotICAgIGlmIChjbGFzc0lkLmNvbnRhaW5zKCJE
MjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiKSkKLSAgICAgICAgc2VydmljZVR5
cGUgPSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giOwotICAgIGVsc2UgaWYgKGNsYXNz
SWQuY29udGFpbnMoIkNGQ0RBQTAzLThCRTQtMTFjZi1CODRCLTAwMjBBRkJCQ0NGQSIpKQotICAg
ICAgICBzZXJ2aWNlVHlwZSA9ICJhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4iOwotICAgIGVs
c2UgaWYgKGNsYXNzSWQuY29udGFpbnMoIjAyQkYyNUQ1LThDMTctNEIyMy1CQzgwLUQzNDg4QUJE
REM2QiIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJ2aWRlby9xdWlja3RpbWUiOwotICAgIGVs
c2UgaWYgKGNsYXNzSWQuY29udGFpbnMoIjE2NkIxQkNBLTNGOUMtMTFDRi04MDc1LTQ0NDU1MzU0
MDAwMCIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIjsK
LSAgICBlbHNlIGlmIChjbGFzc0lkLmNvbnRhaW5zKCI2QkY1MkE1Mi0zOTRBLTExZDMtQjE1My0w
MEMwNEY3OUZBQTYiKSkKLSAgICAgICAgc2VydmljZVR5cGUgPSAiYXBwbGljYXRpb24veC1tcGxh
eWVyMiI7Ci0gICAgZWxzZSBpZiAoIWNsYXNzSWQuaXNFbXB0eSgpKQotICAgICAgICAvLyBXZSBo
YXZlIGEgY2xzaWQsIG1lYW5zIHRoaXMgaXMgYWN0aXZleCAoTmlrbykKLSAgICAgICAgc2Vydmlj
ZVR5cGUgPSAiYXBwbGljYXRpb24veC1hY3RpdmV4LWhhbmRsZXIiOwotICAgIC8vIFRPRE86IGFk
ZCBtb3JlIHBsdWdpbnMgaGVyZQotfQotCi12b2lkIFJlbmRlclBhcnRPYmplY3Q6OnVwZGF0ZVdp
ZGdldCgpCi17Ci0gIFN0cmluZyB1cmw7Ci0gIFN0cmluZyBzZXJ2aWNlVHlwZTsKLSAgVmVjdG9y
PFN0cmluZz4gcGFyYW1OYW1lczsKLSAgVmVjdG9yPFN0cmluZz4gcGFyYW1WYWx1ZXM7Ci0gIEZy
YW1lICpmcmFtZSA9IG1fdmlldy0+ZnJhbWUoKTsKLQotICBzZXROZWVkc0xheW91dEFuZE1pbk1h
eFJlY2FsYygpOwotCi0gIGlmIChlbGVtZW50KCktPmhhc1RhZ05hbWUob2JqZWN0VGFnKSkgewot
Ci0gICAgICBIVE1MT2JqZWN0RWxlbWVudCAqbyA9IHN0YXRpY19jYXN0PEhUTUxPYmplY3RFbGVt
ZW50ICo+KGVsZW1lbnQoKSk7Ci0KLSAgICAgIGlmICghby0+aXNDb21wbGV0ZSgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgICAvLyBDaGVjayBmb3IgYSBjaGlsZCBFTUJFRCB0YWcuCi0gICAgICBI
VE1MRW1iZWRFbGVtZW50KiBlbWJlZCA9IDA7Ci0gICAgICBmb3IgKE5vZGUgKmNoaWxkID0gby0+
Zmlyc3RDaGlsZCgpOyBjaGlsZDsgKSB7Ci0gICAgICAgICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1l
KGVtYmVkVGFnKSkgewotICAgICAgICAgICAgICBlbWJlZCA9IHN0YXRpY19jYXN0PEhUTUxFbWJl
ZEVsZW1lbnQgKj4oIGNoaWxkICk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0g
ZWxzZSBpZiAoY2hpbGQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSkKLSAgICAgICAgICAgICAgY2hp
bGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsgICAgICAgICAvLyBEb24ndCBkZXNjZW5kIGludG8g
bmVzdGVkIE9CSkVDVCB0YWdzCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBjaGlsZCA9
IGNoaWxkLT50cmF2ZXJzZU5leHROb2RlKG8pOyAgIC8vIE90aGVyd2lzZSBkZXNjZW5kIChFTUJF
RHMgbWF5IGJlIGluc2lkZSBDT01NRU5UIHRhZ3MpCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8v
IFVzZSB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBFTUJFRCB0YWcgaW5zdGVhZCBvZiB0aGUgT0JK
RUNUIHRhZyBpbmNsdWRpbmcgV0lEVEggYW5kIEhFSUdIVC4KLSAgICAgIEhUTUxFbGVtZW50ICpl
bWJlZE9yT2JqZWN0OwotICAgICAgaWYgKGVtYmVkKSB7Ci0gICAgICAgICAgZW1iZWRPck9iamVj
dCA9IChIVE1MRWxlbWVudCAqKWVtYmVkOwotICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBl
bWJlZE9yT2JqZWN0LT5nZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsKLSAgICAgICAgICBpZiAoIWF0
dHJpYnV0ZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgIG8tPnNldEF0dHJpYnV0ZSh3aWR0aEF0
dHIsIGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgYXR0cmlidXRlID0gZW1iZWRPck9iamVjdC0+Z2V0
QXR0cmlidXRlKGhlaWdodEF0dHIpOwotICAgICAgICAgIGlmICghYXR0cmlidXRlLmlzRW1wdHko
KSkKLSAgICAgICAgICAgICAgby0+c2V0QXR0cmlidXRlKGhlaWdodEF0dHIsIGF0dHJpYnV0ZSk7
Ci0gICAgICAgICAgdXJsID0gZW1iZWQtPnVybDsKLSAgICAgICAgICBzZXJ2aWNlVHlwZSA9IGVt
YmVkLT5zZXJ2aWNlVHlwZTsKLSAgICAgIH0gZWxzZQotICAgICAgICAgIGVtYmVkT3JPYmplY3Qg
PSAoSFRNTEVsZW1lbnQgKilvOwotICAgICAgCi0gICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gVVJM
IG9yIHR5cGUgZGVmaW5lZCBpbiBFTUJFRCwgdHJ5IHRoZSBPQkpFQ1QgdGFnLgotICAgICAgaWYg
KHVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgdXJsID0gby0+dXJsOwotICAgICAgaWYgKHNlcnZp
Y2VUeXBlLmlzRW1wdHkoKSkKLSAgICAgICAgICBzZXJ2aWNlVHlwZSA9IG8tPnNlcnZpY2VUeXBl
OwotICAgICAgCi0gICAgICBIYXNoU2V0PFN0cmluZ0ltcGwqLCBDYXNlSW5zZW5zaXRpdmVIYXNo
PiB1bmlxdWVQYXJhbU5hbWVzOwotICAgICAgCi0gICAgICAvLyBTY2FuIHRoZSBQQVJBTSBjaGls
ZHJlbi4KLSAgICAgIC8vIEdldCB0aGUgVVJMIGFuZCB0eXBlIGZyb20gdGhlIHBhcmFtcyBpZiB3
ZSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlbS4KLSAgICAgIC8vIEdldCB0aGUgYXR0cmlidXRlcyBm
cm9tIHRoZSBwYXJhbXMgaWYgdGhlcmUgaXMgbm8gRU1CRUQgdGFnLgotICAgICAgTm9kZSAqY2hp
bGQgPSBvLT5maXJzdENoaWxkKCk7Ci0gICAgICB3aGlsZSAoY2hpbGQgJiYgKHVybC5pc0VtcHR5
KCkgfHwgc2VydmljZVR5cGUuaXNFbXB0eSgpIHx8ICFlbWJlZCkpIHsKLSAgICAgICAgICBpZiAo
Y2hpbGQtPmhhc1RhZ05hbWUocGFyYW1UYWcpKSB7Ci0gICAgICAgICAgICAgIEhUTUxQYXJhbUVs
ZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxIVE1MUGFyYW1FbGVtZW50Kj4oY2hpbGQpOwotICAgICAg
ICAgICAgICBTdHJpbmcgbmFtZSA9IHAtPm5hbWUoKS5sb3dlcigpOwotICAgICAgICAgICAgICBp
ZiAodXJsLmlzRW1wdHkoKSAmJiAobmFtZSA9PSAic3JjIiB8fCBuYW1lID09ICJtb3ZpZSIgfHwg
bmFtZSA9PSAiY29kZSIgfHwgbmFtZSA9PSAidXJsIikpCi0gICAgICAgICAgICAgICAgICB1cmwg
PSBwLT52YWx1ZSgpOwotICAgICAgICAgICAgICBpZiAoc2VydmljZVR5cGUuaXNFbXB0eSgpICYm
IG5hbWUgPT0gInR5cGUiKSB7Ci0gICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSA9IHAtPnZh
bHVlKCk7Ci0gICAgICAgICAgICAgICAgICBpbnQgcG9zID0gc2VydmljZVR5cGUuZmluZCgiOyIp
OwotICAgICAgICAgICAgICAgICAgaWYgKHBvcyAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAg
ICBzZXJ2aWNlVHlwZSA9IHNlcnZpY2VUeXBlLmxlZnQocG9zKTsKLSAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICBpZiAoIWVtYmVkICYmICFuYW1lLmlzRW1wdHkoKSkgewotICAgICAgICAg
ICAgICAgICAgdW5pcXVlUGFyYW1OYW1lcy5hZGQocC0+bmFtZSgpLmltcGwoKSk7Ci0gICAgICAg
ICAgICAgICAgICBwYXJhbU5hbWVzLmFwcGVuZChwLT5uYW1lKCkpOwotICAgICAgICAgICAgICAg
ICAgcGFyYW1WYWx1ZXMuYXBwZW5kKHAtPnZhbHVlKCkpOwotICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgfQotICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICB9
Ci0gICAgICAKLSAgICAgIC8vIFdoZW4gT0JKRUNUIGlzIHVzZWQgZm9yIGFuIGFwcGxldCB2aWEg
U3VuJ3MgSmF2YSBwbHVnaW4sIHRoZSBDT0RFQkFTRSBhdHRyaWJ1dGUgaW4gdGhlIHRhZwotICAg
ICAgLy8gcG9pbnRzIHRvIHRoZSBKYXZhIHBsdWdpbiBpdHNlbGYgKGFuIEFjdGl2ZVggY29tcG9u
ZW50KSB3aGlsZSB0aGUgYWN0dWFsIGFwcGxldCBDT0RFQkFTRSBpcwotICAgICAgLy8gaW4gYSBQ
QVJBTSB0YWcuIFNlZSA8aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9wbHVnaW4vMS4yL2Rv
Y3MvdGFncy5odG1sPi4gVGhpcyBtZWFucwotICAgICAgLy8gd2UgaGF2ZSB0byBleHBsaWNpdGx5
IHN1cHByZXNzIHRoZSB0YWcncyBDT0RFQkFTRSBhdHRyaWJ1dGUgaWYgdGhlcmUgaXMgbm9uZSBp
biBhIFBBUkFNLAotICAgICAgLy8gZWxzZSBvdXIgSmF2YSBwbHVnaW4gd2lsbCBtaXNpbnRlcnBy
ZXQgaXQuIFs0MDA0NTMxXQotICAgICAgU3RyaW5nIGNvZGViYXNlOwotICAgICAgaWYgKCFlbWJl
ZCAmJiBzZXJ2aWNlVHlwZS5sb3dlcigpID09ICJhcHBsaWNhdGlvbi94LWphdmEtYXBwbGV0Iikg
ewotICAgICAgICAgIGNvZGViYXNlID0gImNvZGViYXNlIjsKLSAgICAgICAgICB1bmlxdWVQYXJh
bU5hbWVzLmFkZChjb2RlYmFzZS5pbXBsKCkpOyAvLyBwcmV0ZW5kIHdlIGZvdW5kIGl0IGluIGEg
UEFSQU0gYWxyZWFkeQotICAgICAgfQotICAgICAgCi0gICAgICAvLyBUdXJuIHRoZSBhdHRyaWJ1
dGVzIG9mIGVpdGhlciB0aGUgRU1CRUQgdGFnIG9yIE9CSkVDVCB0YWcgaW50byBhcnJheXMsIGJ1
dCBkb24ndCBvdmVycmlkZSBQQVJBTSB2YWx1ZXMuCi0gICAgICBOYW1lZEF0dHJNYXAqIGF0dHJp
YnV0ZXMgPSBlbWJlZE9yT2JqZWN0LT5hdHRyaWJ1dGVzKCk7Ci0gICAgICBpZiAoYXR0cmlidXRl
cykgewotICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLT5sZW5n
dGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgIEF0dHJpYnV0ZSogaXQgPSBhdHRyaWJ1dGVzLT5h
dHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUg
PSBpdC0+bmFtZSgpLmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgICBpZiAoZW1iZWQgfHwgIXVu
aXF1ZVBhcmFtTmFtZXMuY29udGFpbnMobmFtZS5pbXBsKCkpKSB7Ci0gICAgICAgICAgICAgICAg
ICBwYXJhbU5hbWVzLmFwcGVuZChuYW1lLmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAg
IHBhcmFtVmFsdWVzLmFwcGVuZChpdC0+dmFsdWUoKS5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAg
ICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIElmIHdlIHN0aWxs
IGRvbid0IGhhdmUgYSB0eXBlLCB0cnkgdG8gbWFwIGZyb20gYSBzcGVjaWZpYyBDTEFTU0lEIHRv
IGEgdHlwZS4KLSAgICAgIGlmIChzZXJ2aWNlVHlwZS5pc0VtcHR5KCkgJiYgIW8tPmNsYXNzSWQu
aXNFbXB0eSgpKQotICAgICAgICAgIG1hcENsYXNzSWRUb1NlcnZpY2VUeXBlKG8tPmNsYXNzSWQs
IHNlcnZpY2VUeXBlKTsKLSAgICAgIAotICAgICAgLy8gSWYgbm8gVVJMIGFuZCB0eXBlLCBhYm9y
dC4KLSAgICAgIGlmICh1cmwuaXNFbXB0eSgpICYmIHNlcnZpY2VUeXBlLmlzRW1wdHkoKSkKLSAg
ICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoIWlzVVJMQWxsb3dlZChkb2N1bWVudCgpLCB1cmwp
KQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgLy8gRmluZCBvdXQgaWYgd2Ugc3VwcG9ydCBm
YWxsYmFjayBjb250ZW50LgotICAgICAgbV9oYXNGYWxsYmFja0NvbnRlbnQgPSBmYWxzZTsKLSAg
ICAgIGZvciAoTm9kZSAqY2hpbGQgPSBvLT5maXJzdENoaWxkKCk7IGNoaWxkICYmICFtX2hhc0Zh
bGxiYWNrQ29udGVudDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAg
IGlmICgoIWNoaWxkLT5pc1RleHROb2RlKCkgJiYgIWNoaWxkLT5oYXNUYWdOYW1lKGVtYmVkVGFn
KSAmJiAhY2hpbGQtPmhhc1RhZ05hbWUocGFyYW1UYWcpKSB8fCAvLyBEaXNjb3VudCA8ZW1iZWQ+
IGFuZCA8cGFyYW0+Ci0gICAgICAgICAgICAgIChjaGlsZC0+aXNUZXh0Tm9kZSgpICYmICFzdGF0
aWNfY2FzdDxUZXh0Kj4oY2hpbGQpLT5jb250YWluc09ubHlXaGl0ZXNwYWNlKCkpKQotICAgICAg
ICAgICAgICBtX2hhc0ZhbGxiYWNrQ29udGVudCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBib29s
IHN1Y2Nlc3MgPSBmcmFtZS0+cmVxdWVzdE9iamVjdCh0aGlzLCB1cmwsIEF0b21pY1N0cmluZyhv
LT5uYW1lKCkpLCBzZXJ2aWNlVHlwZSwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOwotICAgICAg
aWYgKCFzdWNjZXNzICYmIG1faGFzRmFsbGJhY2tDb250ZW50KQotICAgICAgICAgIG8tPnJlbmRl
ckZhbGxiYWNrQ29udGVudCgpOwotICB9IGVsc2UgaWYgKGVsZW1lbnQoKS0+aGFzVGFnTmFtZShl
bWJlZFRhZykpIHsKLSAgICAgIEhUTUxFbWJlZEVsZW1lbnQgKm8gPSBzdGF0aWNfY2FzdDxIVE1M
RW1iZWRFbGVtZW50ICo+KGVsZW1lbnQoKSk7Ci0gICAgICB1cmwgPSBvLT51cmw7Ci0gICAgICBz
ZXJ2aWNlVHlwZSA9IG8tPnNlcnZpY2VUeXBlOwotCi0gICAgICBpZiAodXJsLmlzRW1wdHkoKSAm
JiBzZXJ2aWNlVHlwZS5pc0VtcHR5KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgaWYgKCFp
c1VSTEFsbG93ZWQoZG9jdW1lbnQoKSwgdXJsKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAK
LSAgICAgIC8vIGFkZCBhbGwgYXR0cmlidXRlcyBzZXQgb24gdGhlIGVtYmVkIG9iamVjdAotICAg
ICAgTmFtZWRBdHRyTWFwKiBhID0gby0+YXR0cmlidXRlcygpOwotICAgICAgaWYgKGEpIHsKLSAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYS0+bGVuZ3RoKCk7ICsraSkgewotICAg
ICAgICAgICAgICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAg
ICAgICAgcGFyYW1OYW1lcy5hcHBlbmQoaXQtPm5hbWUoKS5sb2NhbE5hbWUoKS5kb21TdHJpbmco
KSk7Ci0gICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFwcGVuZChpdC0+dmFsdWUoKS5kb21TdHJp
bmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgZnJhbWUtPnJlcXVlc3RPYmplY3Qo
dGhpcywgdXJsLCBvLT5nZXRBdHRyaWJ1dGUobmFtZUF0dHIpLCBzZXJ2aWNlVHlwZSwgcGFyYW1O
YW1lcywgcGFyYW1WYWx1ZXMpOwotICB9IGVsc2UgewotICAgICAgYXNzZXJ0KGVsZW1lbnQoKS0+
aGFzVGFnTmFtZShpZnJhbWVUYWcpKTsKLSAgICAgIEhUTUxJRnJhbWVFbGVtZW50ICpvID0gc3Rh
dGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQgKj4oZWxlbWVudCgpKTsKLSAgICAgIHVybCA9IG8t
Pm1fVVJMOwotICAgICAgaWYgKCFpc1VSTEFsbG93ZWQoZG9jdW1lbnQoKSwgdXJsKSkKLSAgICAg
ICAgICByZXR1cm47Ci0gICAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICB1cmwgPSAi
YWJvdXQ6YmxhbmsiOwotICAgICAgRnJhbWVWaWV3ICp2ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3
ICo+KG1fdmlldyk7Ci0gICAgICB2LT5mcmFtZSgpLT5yZXF1ZXN0RnJhbWUodGhpcywgdXJsLCBv
LT5tX25hbWUpOwotICB9Ci19Ci0KLXZvaWQgUmVuZGVyUGFydE9iamVjdDo6bGF5b3V0KCkKLXsK
LSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBLSFRNTEFzc2VydChtaW5NYXhL
bm93bigpKTsKLQotICAgIGNhbGNXaWR0aCgpOwotICAgIGNhbGNIZWlnaHQoKTsKLQotICAgIFJl
bmRlclBhcnQ6OmxheW91dCgpOwotCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12
b2lkIFJlbmRlclBhcnRPYmplY3Q6OnZpZXdDbGVhcmVkKCkKLXsKLSAgICBpZiAoZWxlbWVudCgp
ICYmIG1fd2lkZ2V0ICYmIG1fd2lkZ2V0LT5pc0ZyYW1lVmlldygpKSB7Ci0gICAgICAgIEZyYW1l
VmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fd2lkZ2V0KTsKLSAgICAgICAg
Ym9vbCBoYXNCb3JkZXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG1hcmdpbncgPSAtMTsKLSAgICAg
ICAgaW50IG1hcmdpbmggPSAtMTsKLSAgICAgICAgaWYgKGVsZW1lbnQoKS0+aGFzVGFnTmFtZShp
ZnJhbWVUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MSUZyYW1lRWxlbWVudCogZnJhbWUgPSBzdGF0
aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCAqPihlbGVtZW50KCkpOwotICAgICAgICAgICAgaGFz
Qm9yZGVyID0gZnJhbWUtPm1fZnJhbWVCb3JkZXI7Ci0gICAgICAgICAgICBtYXJnaW53ID0gZnJh
bWUtPm1fbWFyZ2luV2lkdGg7Ci0gICAgICAgICAgICBtYXJnaW5oID0gZnJhbWUtPm1fbWFyZ2lu
SGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgdmlldy0+c2V0SGFzQm9yZGVyKGhhc0JvcmRl
cik7Ci0gICAgICAgIHZpZXctPnNldElnbm9yZVdoZWVsRXZlbnRzKGVsZW1lbnQoKS0+aGFzVGFn
TmFtZShpZnJhbWVUYWcpKTsKLSAgICAgICAgaWYgKG1hcmdpbncgIT0gLTEpCi0gICAgICAgICAg
ICB2aWV3LT5zZXRNYXJnaW5XaWR0aChtYXJnaW53KTsKLSAgICAgICAgaWYgKG1hcmdpbmggIT0g
LTEpCi0gICAgICAgICAgICB2aWV3LT5zZXRNYXJnaW5IZWlnaHQobWFyZ2luaCk7Ci0gICAgfQot
fQotCi0vLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gIFJlbW92ZSB0aGlz
IG9uY2UgV2ViS2l0IGtub3dzIHRvIHByb3Blcmx5IHNjaGVkdWxlCi0vLyBsYXlvdXRzIHVzaW5n
IFdlYkNvcmUgd2hlbiBvYmplY3RzIHJlc2l6ZS4KLXZvaWQgUmVuZGVyUGFydDo6dXBkYXRlV2lk
Z2V0UG9zaXRpb24oKQotewotICAgIGlmICghbV93aWRnZXQpCi0gICAgICAgIHJldHVybjsKLSAg
ICAKLSAgICBpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKLSAgICBhYnNvbHV0ZVBvc2l0aW9uKHgs
IHkpOwotICAgIHggKz0gYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKTsKLSAgICB5ICs9IGJv
cmRlclRvcCgpICsgcGFkZGluZ1RvcCgpOwotICAgIHdpZHRoID0gbV93aWR0aCAtIGJvcmRlckxl
ZnQoKSAtIGJvcmRlclJpZ2h0KCkgLSBwYWRkaW5nTGVmdCgpIC0gcGFkZGluZ1JpZ2h0KCk7Ci0g
ICAgaGVpZ2h0ID0gbV9oZWlnaHQgLSBib3JkZXJUb3AoKSAtIGJvcmRlckJvdHRvbSgpIC0gcGFk
ZGluZ1RvcCgpIC0gcGFkZGluZ0JvdHRvbSgpOwotICAgIEludFJlY3QgbmV3Qm91bmRzKHgseSx3
aWR0aCxoZWlnaHQpOwotICAgIGlmIChuZXdCb3VuZHMgIT0gbV93aWRnZXQtPmZyYW1lR2VvbWV0
cnkoKSkgewotICAgICAgICAvLyBUaGUgd2lkZ2V0IGNoYW5nZWQgcG9zaXRpb25zLiAgVXBkYXRl
IHRoZSBmcmFtZSBnZW9tZXRyeS4KLSAgICAgICAgUmVuZGVyQXJlbmEgKmFyZW5hID0gcmVmKCk7
Ci0gICAgICAgIGVsZW1lbnQoKS0+cmVmKCk7Ci0gICAgICAgIG1fd2lkZ2V0LT5zZXRGcmFtZUdl
b21ldHJ5KG5ld0JvdW5kcyk7Ci0gICAgICAgIGVsZW1lbnQoKS0+ZGVyZWYoKTsKLSAgICAgICAg
ZGVyZWYoYXJlbmEpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1fd2lkZ2V0ICYmIG1fd2lkZ2V0
LT5pc0ZyYW1lVmlldygpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV93
aWRnZXQpLT5sYXlvdXQoKTsKLSAgICB9Ci19Ci0KLX0KSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJS
ZXBsYWNlZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJSZXBsYWNlZC5oCShyZXZp
c2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9SZW5kZXJSZXBsYWNlZC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yMSw4ICsyMSw4IEBACiAgKgogICovCiAKLSNpZm5kZWYgcmVuZGVyX3JlcGxhY2VkX2gK
LSNkZWZpbmUgcmVuZGVyX3JlcGxhY2VkX2gKKyNpZm5kZWYgUmVuZGVyUmVwbGFjZWRfSAorI2Rl
ZmluZSBSZW5kZXJSZXBsYWNlZF9ICiAKICNpbmNsdWRlICJSZW5kZXJCb3guaCIKIApAQCAtNzMs
NTMgKzczLDcgQEAgcHJvdGVjdGVkOgogfTsKIAogCi1jbGFzcyBSZW5kZXJXaWRnZXQgOiBwdWJs
aWMgUmVuZGVyUmVwbGFjZWQsIHB1YmxpYyBXaWRnZXRDbGllbnQKLXsKLXB1YmxpYzoKLSAgICBS
ZW5kZXJXaWRnZXQoTm9kZSopOwotICAgIHZpcnR1YWwgflJlbmRlcldpZGdldCgpOwotCi0gICAg
dmlydHVhbCB2b2lkIHNldFN0eWxlKFJlbmRlclN0eWxlKik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFpbnQoUGFpbnRJbmZvJiwgaW50IHR4LCBpbnQgdHkpOwotCi0gICAgdmlydHVhbCBib29sIGlz
V2lkZ2V0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXN0
cm95KCk7Ci0gICAgdmlydHVhbCB2b2lkIGxheW91dCggKTsKLQotICAgIFdpZGdldCogd2lkZ2V0
KCkgY29uc3QgeyByZXR1cm4gbV93aWRnZXQ7IH0KLSAgICBGcmFtZVZpZXcqIHZpZXcoKSBjb25z
dCB7IHJldHVybiBtX3ZpZXc7IH0KLQotICAgIFJlbmRlckFyZW5hKiByZWYoKSB7ICsrbV9yZWZD
b3VudDsgcmV0dXJuIHJlbmRlckFyZW5hKCk7IH0KLSAgICB2b2lkIGRlcmVmKFJlbmRlckFyZW5h
Kik7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0
YXRlKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVXaWRnZXRQb3NpdGlvbigpOwotCi0gICAg
dmlydHVhbCB2b2lkIHNldFdpZGdldChXaWRnZXQqKTsKLQotICAgIHVzaW5nIFJlbmRlclJlcGxh
Y2VkOjplbGVtZW50OwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBmb2N1c0luKFdpZGdl
dCopOwotICAgIHZpcnR1YWwgdm9pZCBmb2N1c091dChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIHZv
aWQgc2Nyb2xsVG9WaXNpYmxlKFdpZGdldCopOwotICAgIHZpcnR1YWwgRWxlbWVudCogZWxlbWVu
dChXaWRnZXQqKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNWaXNpYmxlKFdpZGdldCopOwotICAgIHZp
cnR1YWwgdm9pZCBzZW5kQ29uc3VtZWRNb3VzZVVwKFdpZGdldCopOwogCi0gICAgdm9pZCByZXNp
emVXaWRnZXQoV2lkZ2V0KiwgaW50IHcsIGludCBoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZWxl
dGVXaWRnZXQoKTsKLQotcHJvdGVjdGVkOgotICAgIFdpZGdldCogbV93aWRnZXQ7Ci0gICAgRnJh
bWVWaWV3KiBtX3ZpZXc7Ci1wcml2YXRlOgotICAgIGludCBtX3JlZkNvdW50OwotfTsKIAogfQog
CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyUGFydE9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRl
cmluZy9SZW5kZXJQYXJ0T2JqZWN0LmgJKHJldmlzaW9uIDE0MzI1KQorKysgcmVuZGVyaW5nL1Jl
bmRlclBhcnRPYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtMjIsMTEwICsyMiwxMyBAQAogICoK
ICAqLwogCi0jaWZuZGVmIHJlbmRlcl9mcmFtZXNfaF9fCi0jZGVmaW5lIHJlbmRlcl9mcmFtZXNf
aF9fCisjaWZuZGVmIFJlbmRlclBhcnRPYmplY3RfSAorI2RlZmluZSBSZW5kZXJQYXJ0T2JqZWN0
X0gKIAotI2luY2x1ZGUgIlJlbmRlckNvbnRhaW5lci5oIgotI2luY2x1ZGUgInJlbmRlcl9yZXBs
YWNlZC5oIgotI2luY2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKKyNpbmNsdWRlICJSZW5kZXJQYXJ0
LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRnJhbWVWaWV3OwotY2xhc3MgSFRN
TEVsZW1lbnQ7Ci1jbGFzcyBIVE1MRnJhbWVFbGVtZW50OwotY2xhc3MgTW91c2VFdmVudDsKLQot
c3RydWN0IENoaWxkRnJhbWU7Ci0KLWNsYXNzIFJlbmRlckZyYW1lU2V0IDogcHVibGljIFJlbmRl
ckNvbnRhaW5lcgotewotICAgIGZyaWVuZCBjbGFzcyBIVE1MRnJhbWVTZXRFbGVtZW50OwotcHVi
bGljOgotICAgIFJlbmRlckZyYW1lU2V0KEhUTUxGcmFtZVNldEVsZW1lbnQqKTsKLSAgICB2aXJ0
dWFsIH5SZW5kZXJGcmFtZVNldCgpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJO
YW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZyYW1lU2V0IjsgfQotICAgIHZpcnR1YWwgYm9v
bCBpc0ZyYW1lU2V0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCB2b2lk
IGxheW91dCgpOwotCi0gICAgdm9pZCBwb3NpdGlvbkZyYW1lcygpOwotCi0gICAgYm9vbCByZXNp
emluZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVzaXppbmc7IH0KLQotICAgIGJvb2wgdXNlclJlc2l6
ZShNb3VzZUV2ZW50Kik7Ci0gICAgYm9vbCBjYW5SZXNpemUoaW50IHgsIGludCB5KTsKLSAgICB2
b2lkIHNldFJlc2l6aW5nKGJvb2wpOwotCi0gICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KE5v
ZGVJbmZvJiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbik7Ci0K
LSAgICBIVE1MRnJhbWVTZXRFbGVtZW50KiBlbGVtZW50KCkgY29uc3QKLSAgICAgICAgeyByZXR1
cm4gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lU2V0RWxlbWVudCo+KFJlbmRlckNvbnRhaW5lcjo6ZWxl
bWVudCgpKTsgfQotCi0jaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0
U3RyZWFtICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwotI2VuZGlm
Ci0KLXByaXZhdGU6Ci0gICAgaW50IG1fb2xkcG9zOwotICAgIGludCBtX2dyaWRMZW5bMl07Ci0g
ICAgaW50KiBtX2dyaWREZWx0YVsyXTsKLSAgICBpbnQqIG1fZ3JpZExheW91dFsyXTsKLQotICAg
IGJvb2wqIG1faFNwbGl0VmFyOyAvLyBpcyB0aGlzIHNwbGl0IHZhcmlhYmxlPwotICAgIGJvb2wq
IG1fdlNwbGl0VmFyOwotCi0gICAgaW50IG1faFNwbGl0OyAvLyB0aGUgc3BsaXQgY3VycmVudGx5
IHJlc2l6ZWQKLSAgICBpbnQgbV92U3BsaXQ7Ci0gICAgaW50IG1faFNwbGl0UG9zOwotICAgIGlu
dCBtX3ZTcGxpdFBvczsKLQotICAgIGJvb2wgbV9yZXNpemluZzsKLSAgICBib29sIG1fY2xpZW50
UmVzaXppbmc7Ci19OwotCi1jbGFzcyBSZW5kZXJQYXJ0IDogcHVibGljIFJlbmRlcldpZGdldCB7
Ci1wdWJsaWM6Ci0gICAgUmVuZGVyUGFydChIVE1MRWxlbWVudCopOwotICAgIHZpcnR1YWwgflJl
bmRlclBhcnQoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBj
b25zdCB7IHJldHVybiAiUmVuZGVyUGFydCI7IH0KLQotICAgIHZvaWQgc2V0RnJhbWUoRnJhbWUq
KTsKLSAgICB2b2lkIHNldFdpZGdldChXaWRnZXQqKTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIHNo
b3VsZCBub3QgYmUgbmVjZXNzYXJ5LgotICAgIC8vIFJlbW92ZSB0aGlzIG9uY2UgV2ViS2l0IGtu
b3dzIHRvIHByb3Blcmx5IHNjaGVkdWxlIGxheW91dHMgdXNpbmcgV2ViQ29yZSB3aGVuIG9iamVj
dHMgcmVzaXplLgotICAgIHZvaWQgdXBkYXRlV2lkZ2V0UG9zaXRpb24oKTsKLQotICAgIGJvb2wg
aGFzRmFsbGJhY2tDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV9oYXNGYWxsYmFja0NvbnRlbnQ7
IH0KLQotICAgIHZpcnR1YWwgdm9pZCB2aWV3Q2xlYXJlZCgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAg
Ym9vbCBtX2hhc0ZhbGxiYWNrQ29udGVudDsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQg
ZGVsZXRlV2lkZ2V0KCk7Ci0KLSAgICBGcmFtZSogbV9mcmFtZTsKLX07Ci0KLWNsYXNzIFJlbmRl
ckZyYW1lIDogcHVibGljIFJlbmRlclBhcnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJGcmFtZShI
VE1MRnJhbWVFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUo
KSBjb25zdCB7IHJldHVybiAiUmVuZGVyRnJhbWUiOyB9Ci0KLSAgICBIVE1MRnJhbWVFbGVtZW50
KiBlbGVtZW50KCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZyYW1l
RWxlbWVudCo+KFJlbmRlclBhcnQ6OmVsZW1lbnQoKSk7IH0KLQotICAgIHZpcnR1YWwgdm9pZCB2
aWV3Q2xlYXJlZCgpOwotfTsKLQotLy8gSSBjYW4gaGFyZGx5IGNhbGwgdGhlIGNsYXNzIFJlbmRl
ck9iamVjdCA7LSkKIGNsYXNzIFJlbmRlclBhcnRPYmplY3QgOiBwdWJsaWMgUmVuZGVyUGFydAog
ewogcHVibGljOgpJbmRleDogcmVuZGVyaW5nL1JlbmRlckZyYW1lU2V0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gcmVuZGVyaW5nL1JlbmRlckZyYW1lU2V0LmgJKHJldmlzaW9uIDE0MzI1KQorKysgcmVuZGVy
aW5nL1JlbmRlckZyYW1lU2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTIyLDIyICsyMiwxOCBAQAog
ICoKICAqLwogCi0jaWZuZGVmIHJlbmRlcl9mcmFtZXNfaF9fCi0jZGVmaW5lIHJlbmRlcl9mcmFt
ZXNfaF9fCisjaWZuZGVmIFJlbmRlckZyYW1lU2V0X0gKKyNkZWZpbmUgUmVuZGVyRnJhbWVTZXRf
SAogCiAjaW5jbHVkZSAiUmVuZGVyQ29udGFpbmVyLmgiCi0jaW5jbHVkZSAicmVuZGVyX3JlcGxh
Y2VkLmgiCi0jaW5jbHVkZSAiaHRtbF9iYXNlaW1wbC5oIgorI2luY2x1ZGUgIkhUTUxGcmFtZVNl
dEVsZW1lbnQuaCIKKwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEZyYW1lVmlldzsK
LWNsYXNzIEhUTUxFbGVtZW50OwotY2xhc3MgSFRNTEZyYW1lRWxlbWVudDsKK2NsYXNzIEhUTUxG
cmFtZVNldEVsZW1lbnQ7CiBjbGFzcyBNb3VzZUV2ZW50OwogCi1zdHJ1Y3QgQ2hpbGRGcmFtZTsK
LQogY2xhc3MgUmVuZGVyRnJhbWVTZXQgOiBwdWJsaWMgUmVuZGVyQ29udGFpbmVyCiB7CiAgICAg
ZnJpZW5kIGNsYXNzIEhUTUxGcmFtZVNldEVsZW1lbnQ7CkBAIC02NCw3ICs2MCw3IEBAIHB1Ymxp
YzoKICAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lU2V0RWxlbWVudCo+KFJl
bmRlckNvbnRhaW5lcjo6ZWxlbWVudCgpKTsgfQogCiAjaWZuZGVmIE5ERUJVRwotICAgIHZpcnR1
YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kID0g
IiIpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFFUZXh0U3RyZWFtKiBzdHJlYW0sIERl
cHJlY2F0ZWRTdHJpbmcgaW5kID0gIiIpIGNvbnN0OwogI2VuZGlmCiAKIHByaXZhdGU6CkBAIC04
NSw2MCArODEsNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9jbGllbnRSZXNpemluZzsKIH07CiAK
LWNsYXNzIFJlbmRlclBhcnQgOiBwdWJsaWMgUmVuZGVyV2lkZ2V0IHsKLXB1YmxpYzoKLSAgICBS
ZW5kZXJQYXJ0KEhUTUxFbGVtZW50Kik7Ci0gICAgdmlydHVhbCB+UmVuZGVyUGFydCgpOwotICAg
IAotICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJS
ZW5kZXJQYXJ0IjsgfQotCi0gICAgdm9pZCBzZXRGcmFtZShGcmFtZSopOwotICAgIHZvaWQgc2V0
V2lkZ2V0KFdpZGdldCopOwotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNl
c3NhcnkuCi0gICAgLy8gUmVtb3ZlIHRoaXMgb25jZSBXZWJLaXQga25vd3MgdG8gcHJvcGVybHkg
c2NoZWR1bGUgbGF5b3V0cyB1c2luZyBXZWJDb3JlIHdoZW4gb2JqZWN0cyByZXNpemUuCi0gICAg
dm9pZCB1cGRhdGVXaWRnZXRQb3NpdGlvbigpOwotCi0gICAgYm9vbCBoYXNGYWxsYmFja0NvbnRl
bnQoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZhbGxiYWNrQ29udGVudDsgfQotCi0gICAgdmlydHVh
bCB2b2lkIHZpZXdDbGVhcmVkKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIG1faGFzRmFsbGJh
Y2tDb250ZW50OwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgdm9pZCBkZWxldGVXaWRnZXQoKTsK
LQotICAgIEZyYW1lKiBtX2ZyYW1lOwotfTsKLQotY2xhc3MgUmVuZGVyRnJhbWUgOiBwdWJsaWMg
UmVuZGVyUGFydAotewotcHVibGljOgotICAgIFJlbmRlckZyYW1lKEhUTUxGcmFtZUVsZW1lbnQq
KTsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJu
ICJSZW5kZXJGcmFtZSI7IH0KLQotICAgIEhUTUxGcmFtZUVsZW1lbnQqIGVsZW1lbnQoKSBjb25z
dAotICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50Kj4oUmVuZGVy
UGFydDo6ZWxlbWVudCgpKTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHZpZXdDbGVhcmVkKCk7Ci19
OwotCi0vLyBJIGNhbiBoYXJkbHkgY2FsbCB0aGUgY2xhc3MgUmVuZGVyT2JqZWN0IDstKQotY2xh
c3MgUmVuZGVyUGFydE9iamVjdCA6IHB1YmxpYyBSZW5kZXJQYXJ0Ci17Ci1wdWJsaWM6Ci0gICAg
UmVuZGVyUGFydE9iamVjdChIVE1MRWxlbWVudCopOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFy
KiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclBhcnRPYmplY3QiOyB9Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVdpZGdldCgp
OwotCi0gICAgdmlydHVhbCB2b2lkIHZpZXdDbGVhcmVkKCk7Ci19OwotCiB9CiAKICNlbmRpZgpJ
bmRleDogcmVuZGVyaW5nL1JlbmRlclJlcGxhY2VkLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvUmVuZGVyUmVwbGFjZWQuY3BwCShyZXZpc2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9SZW5k
ZXJSZXBsYWNlZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxLDI2ICsyMSwxNiBAQAogICogQm9z
dG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0KICNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJyZW5kZXJfcmVwbGFjZWQuaCIKKyNpbmNsdWRlICJSZW5kZXJSZXBsYWNlZC5o
IgogCi0jaW5jbHVkZSAiQnJvd3NlckV4dGVuc2lvbi5oIgotI2luY2x1ZGUgIkRvY3VtZW50Lmgi
IC8vICMjIyByZW1vdmUgZGVwZW5kZW5jeQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRl
ICJFdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRlICJSZW5kZXJD
YW52YXMuaCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKKyNpbmNsdWRlICJyZW5kZXJf
bGluZS5oIgorI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7Ci0K
IFJlbmRlclJlcGxhY2VkOjpSZW5kZXJSZXBsYWNlZChOb2RlKiBub2RlKQogICAgIDogUmVuZGVy
Qm94KG5vZGUpCiB7CkBAIC0yMzQsMjQ3ICsyMjQsNCBAQCBDb2xvciBSZW5kZXJSZXBsYWNlZDo6
c2VsZWN0aW9uQ29sb3IoR3JhCiAKICAgICByZXR1cm4gY29sb3I7CiB9Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLVJlbmRlcldpZGdldDo6UmVuZGVyV2lkZ2V0KE5vZGUqIG5vZGUpCi0g
ICAgICA6IFJlbmRlclJlcGxhY2VkKG5vZGUpCi0gICAgICAsIG1fd2lkZ2V0KDApCi0gICAgICAs
IG1fcmVmQ291bnQoMCkKLXsKLSAgICAvLyBhIHJlcGxhY2VkIGVsZW1lbnQgZG9lc24ndCBzdXBw
b3J0IGJlaW5nIGFub255bW91cwotICAgIEFTU0VSVChub2RlKTsKLSAgICBtX3ZpZXcgPSBub2Rl
LT5kb2N1bWVudCgpLT52aWV3KCk7Ci0KLSAgICBjYW52YXMoKS0+YWRkV2lkZ2V0KHRoaXMpOwot
Ci0gICAgLy8gdGhpcyBpcyBubyByZWFsIHJlZmVyZW5jZSBjb3VudGluZywgaXRzIGp1c3QgdGhl
cmUKLSAgICAvLyB0byBtYWtlIHN1cmUgdGhhdCB3ZSdyZSBub3QgZGVsZXRlZCB3aGlsZSB3ZSdy
ZSByZWN1cnNlZAotICAgIC8vIGluIGFuIGV2ZW50RmlsdGVyIG9mIHRoZSB3aWRnZXQKLSAgICBy
ZWYoKTsKLX0KLQotdm9pZCBSZW5kZXJXaWRnZXQ6OmRlc3Ryb3koKQotewotICAgIC8vIFdlIGNh
bid0IGNhbGwgdGhlIGJhc2UgY2xhc3MncyBkZXN0cm95IGJlY2F1c2Ugd2UgZG9uJ3QKLSAgICAv
LyB3YW50IHRvIHVuY29uZGl0aW9uYWxseSBkZWxldGUgb3Vyc2VsdmVzICh3ZSdyZSByZWYtY291
bnRlZCkuCi0gICAgLy8gU28gdGhlIGNvZGUgYmVsb3cgaW5jbHVkZXMgY29waWVkIGFuZCBwYXN0
ZWQgY29udGVudHMgb2YKLSAgICAvLyBib3RoIFJlbmRlckJveDo6ZGVzdHJveSgpIGFuZCBSZW5k
ZXJPYmplY3Q6OmRlc3Ryb3koKS4KLSAgICAvLyBGaXggb3JpZ2luYWxseSBtYWRlIGZvciA8cmRh
cjovL3Byb2JsZW0vNDIyODgxOD4uCi0KLSAgICBpZiAoUmVuZGVyQ2FudmFzICpjID0gY2FudmFz
KCkpCi0gICAgICAgIGMtPnJlbW92ZVdpZGdldCh0aGlzKTsKLQotICAgIHJlbW92ZSgpOwotCi0g
ICAgaWYgKG1fd2lkZ2V0KSB7Ci0gICAgICAgIGlmIChtX3ZpZXcpCi0gICAgICAgICAgICBtX3Zp
ZXctPnJlbW92ZUNoaWxkKG1fd2lkZ2V0KTsKLSAgICAgICAgbV93aWRnZXQtPnNldENsaWVudCgw
KTsKLSAgICB9Ci0KLSAgICBSZW5kZXJMYXllciogbGF5ZXIgPSBtX2xheWVyOwotICAgIFJlbmRl
ckFyZW5hKiBhcmVuYSA9IHJlbmRlckFyZW5hKCk7Ci0gICAgCi0gICAgaWYgKGxheWVyKQotICAg
ICAgICBsYXllci0+Y2xlYXJDbGlwUmVjdCgpOwotICAgIAotICAgIHNldE5vZGUoMCk7Ci0gICAg
ZGVyZWYoYXJlbmEpOwotICAgIAotICAgIGlmIChsYXllcikKLSAgICAgICAgbGF5ZXItPmRlc3Ry
b3koYXJlbmEpOwotfQotCi1SZW5kZXJXaWRnZXQ6On5SZW5kZXJXaWRnZXQoKQotewotICAgIEtI
VE1MQXNzZXJ0KG1fcmVmQ291bnQgPD0gMCk7Ci0gICAgZGVsZXRlV2lkZ2V0KCk7Ci19Ci0KLXZv
aWQgUmVuZGVyV2lkZ2V0OjpyZXNpemVXaWRnZXQoV2lkZ2V0KiB3aWRnZXQsIGludCB3LCBpbnQg
aCkKLXsKLSAgICBpZiAoZWxlbWVudCgpICYmICh3aWRnZXQtPndpZHRoKCkgIT0gdyB8fCB3aWRn
ZXQtPmhlaWdodCgpICE9IGgpKSB7Ci0gICAgICAgIFJlbmRlckFyZW5hICphcmVuYSA9IHJlZigp
OwotICAgICAgICBlbGVtZW50KCktPnJlZigpOwotICAgICAgICB3aWRnZXQtPnJlc2l6ZSh3LCBo
KTsKLSAgICAgICAgZWxlbWVudCgpLT5kZXJlZigpOwotICAgICAgICBkZXJlZihhcmVuYSk7Ci0g
ICAgfQotfQotCi12b2lkIFJlbmRlcldpZGdldDo6c2V0V2lkZ2V0KFdpZGdldCogd2lkZ2V0KQot
ewotICAgIGlmICh3aWRnZXQgIT0gbV93aWRnZXQpIHsKLSAgICAgICAgaWYgKG1fd2lkZ2V0KSB7
Ci0gICAgICAgICAgICBtX3dpZGdldC0+c2V0Q2xpZW50KDApOwotICAgICAgICAgICAgZGVsZXRl
V2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV93aWRnZXQgPSB3aWRnZXQ7Ci0gICAgICAg
IGlmIChtX3dpZGdldCkgewotICAgICAgICAgICAgbV93aWRnZXQtPnNldENsaWVudCh0aGlzKTsK
LSAgICAgICAgICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgcmVjZWl2ZWQgYSBsYXlvdXQsIGFwcGx5
IHRoZSBjYWxjdWxhdGVkIHNwYWNlIHRvIHRoZQotICAgICAgICAgICAgLy8gd2lkZ2V0IGltbWVk
aWF0ZWx5LCBidXQgd2UgaGF2ZSB0byBoYXZlIHJlYWxseSBiZWVuIGZ1bGwgY29uc3RydWN0ZWQg
KHdpdGggYSBub24tbnVsbAotICAgICAgICAgICAgLy8gc3R5bGUgcG9pbnRlcikuCi0gICAgICAg
ICAgICBpZiAoIW5lZWRzTGF5b3V0KCkgJiYgc3R5bGUoKSkKLSAgICAgICAgICAgICAgICByZXNp
emVXaWRnZXQobV93aWRnZXQsCi0gICAgICAgICAgICAgICAgICAgIG1fd2lkdGggLSBib3JkZXJM
ZWZ0KCkgLSBib3JkZXJSaWdodCgpIC0gcGFkZGluZ0xlZnQoKSAtIHBhZGRpbmdSaWdodCgpLAot
ICAgICAgICAgICAgICAgICAgICBtX2hlaWdodCAtIGJvcmRlclRvcCgpIC0gYm9yZGVyQm90dG9t
KCkgLSBwYWRkaW5nVG9wKCkgLSBwYWRkaW5nQm90dG9tKCkpOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHNldFBvcyh4UG9zKCksIC01MDAwMDApOwotICAgICAgICAgICAgaWYg
KHN0eWxlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9
IFZJU0lCTEUpCi0gICAgICAgICAgICAgICAgICAgIG1fd2lkZ2V0LT5oaWRlKCk7Ci0gICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtX3dpZGdldC0+c2hvdygpOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgbV92aWV3LT5hZGRDaGlsZChtX3dpZGdldCwgLTUwMDAw
MCwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0OjpsYXlvdXQo
KQotewotICAgIEtIVE1MQXNzZXJ0KG5lZWRzTGF5b3V0KCkpOwotICAgIEtIVE1MQXNzZXJ0KG1p
bk1heEtub3duKCkpOwotCi0gICAgc2V0TmVlZHNMYXlvdXQoZmFsc2UpOwotfQotCi12b2lkIFJl
bmRlcldpZGdldDo6c2VuZENvbnN1bWVkTW91c2VVcChXaWRnZXQqKQotewotICAgIFJlbmRlckFy
ZW5hKiBhcmVuYSA9IHJlZigpOwotICAgIEV2ZW50VGFyZ2V0Tm9kZUNhc3Qobm9kZSgpKS0+ZGlz
cGF0Y2hTaW11bGF0ZWRNb3VzZUV2ZW50KG1vdXNldXBFdmVudCk7Ci0gICAgZGVyZWYoYXJlbmEp
OwotfQotCi12b2lkIFJlbmRlcldpZGdldDo6c2V0U3R5bGUoUmVuZGVyU3R5bGUgKl9zdHlsZSkK
LXsKLSAgICBSZW5kZXJSZXBsYWNlZDo6c2V0U3R5bGUoX3N0eWxlKTsKLSAgICBpZiAobV93aWRn
ZXQpIHsKLSAgICAgICAgbV93aWRnZXQtPnNldEZvbnQoc3R5bGUoKS0+Zm9udCgpKTsKLSAgICAg
ICAgaWYgKHN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFKQotICAgICAgICAgICAgbV93
aWRnZXQtPmhpZGUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV93aWRnZXQtPnNob3co
KTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0OjpwYWludChQYWludEluZm8mIGksIGlu
dCB0eCwgaW50IHR5KQotewotICAgIGlmICghc2hvdWxkUGFpbnQoaSwgdHgsIHR5KSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgdHggKz0gbV94OwotICAgIHR5ICs9IG1feTsKLQotICAgIGlmIChz
aG91bGRQYWludEJhY2tncm91bmRPckJvcmRlcigpICYmIGkucGhhc2UgIT0gUGFpbnRQaGFzZU91
dGxpbmUgJiYgaS5waGFzZSAhPSBQYWludFBoYXNlU2VsZk91dGxpbmUpIAotICAgICAgICBwYWlu
dEJveERlY29yYXRpb25zKGksIHR4LCB0eSk7Ci0KLSAgICBpZiAoIW1fdmlldyB8fCBpLnBoYXNl
ICE9IFBhaW50UGhhc2VGb3JlZ3JvdW5kIHx8IHN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJ
QkxFKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV93aWRnZXQpIHsKLSAgICAgICAgLy8g
TW92ZSB0aGUgd2lkZ2V0IGlmIG5lY2Vzc2FyeS4gIFdlIG5vcm1hbGx5IG1vdmUgYW5kIHJlc2l6
ZSB3aWRnZXRzIGR1cmluZyBsYXlvdXQsIGJ1dCBzb21ldGltZXMKLSAgICAgICAgLy8gd2lkZ2V0
cyBjYW4gbW92ZSB3aXRob3V0IGxheW91dCBvY2N1cnJpbmcgKG1vc3Qgbm90YWJseSB3aGVuIHlv
dSBzY3JvbGwgYSBkb2N1bWVudCB0aGF0Ci0gICAgICAgIC8vIGNvbnRhaW5zIGZpeGVkIHBvc2l0
aW9uZWQgZWxlbWVudHMpLgotICAgICAgICBtX3dpZGdldC0+bW92ZSh0eCArIGJvcmRlckxlZnQo
KSArIHBhZGRpbmdMZWZ0KCksIHR5ICsgYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCkpOwotCi0g
ICAgICAgIC8vIFRlbGwgdGhlIHdpZGdldCB0byBwYWludCBub3cuICBUaGlzIGlzIHRoZSBvbmx5
IHRpbWUgdGhlIHdpZGdldCBpcyBhbGxvd2VkCi0gICAgICAgIC8vIHRvIHBhaW50IGl0c2VsZi4g
IFRoYXQgd2F5IGl0IHdpbGwgY29tcG9zaXRlIHByb3Blcmx5IHdpdGggei1pbmRleGVkIGxheWVy
cy4KLSAgICAgICAgbV93aWRnZXQtPnBhaW50KGkucCwgaS5yKTsKLSAgICB9Ci0KLSAgICAvLyBQ
YWludCBhIHBhcnRpYWxseSB0cmFuc3BhcmVudCB3YXNoIG92ZXIgc2VsZWN0ZWQgd2lkZ2V0cy4K
LSAgICBpZiAoaXNTZWxlY3RlZCgpICYmICFkb2N1bWVudCgpLT5wcmludGluZygpKQotICAgICAg
ICBpLnAtPmZpbGxSZWN0KHNlbGVjdGlvblJlY3QoKSwgc2VsZWN0aW9uQ29sb3IoaS5wKSk7Ci19
Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0Ojpmb2N1c0luKFdpZGdldCopCi17Ci0gICAgUmVuZGVyQXJl
bmEqIGFyZW5hID0gcmVmKCk7Ci0gICAgUmVmUHRyPE5vZGU+IGVsZW0gPSBlbGVtZW50KCk7Ci0g
ICAgaWYgKGVsZW0pCi0gICAgICAgIGVsZW0tPmRvY3VtZW50KCktPnNldEZvY3VzTm9kZShlbGVt
KTsKLSAgICBkZXJlZihhcmVuYSk7Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0Ojpmb2N1c091dChX
aWRnZXQqKQotewotICAgIFJlbmRlckFyZW5hKiBhcmVuYSA9IHJlZigpOwotICAgIFJlZlB0cjxO
b2RlPiBlbGVtID0gZWxlbWVudCgpOwotICAgIGlmIChlbGVtICYmIGVsZW0gPT0gZWxlbS0+ZG9j
dW1lbnQoKS0+Zm9jdXNOb2RlKCkpCi0gICAgICAgIGVsZW0tPmRvY3VtZW50KCktPnNldEZvY3Vz
Tm9kZSgwKTsKLSAgICBkZXJlZihhcmVuYSk7Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0OjpzY3Jv
bGxUb1Zpc2libGUoV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgaWYgKFJlbmRlckxheWVyKiBsYXll
ciA9IGVuY2xvc2luZ0xheWVyKCkpCi0gICAgICAgIGxheWVyLT5zY3JvbGxSZWN0VG9WaXNpYmxl
KGFic29sdXRlQm91bmRpbmdCb3hSZWN0KCkpOwotfQotCi1ib29sIFJlbmRlcldpZGdldDo6aXNW
aXNpYmxlKFdpZGdldCogd2lkZ2V0KQotewotICAgIHJldHVybiBzdHlsZSgpLT52aXNpYmlsaXR5
KCkgPT0gVklTSUJMRTsKLX0KLQotRWxlbWVudCogUmVuZGVyV2lkZ2V0OjplbGVtZW50KFdpZGdl
dCogd2lkZ2V0KQotewotICAgIE5vZGUqIG4gPSBub2RlKCk7Ci0gICAgcmV0dXJuIG4tPmlzRWxl
bWVudE5vZGUoKSA/IHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKSA6IDA7Ci19Ci0KLXZvaWQgUmVu
ZGVyV2lkZ2V0OjpkZXJlZihSZW5kZXJBcmVuYSAqYXJlbmEpCi17Ci0gICAgaWYgKC0tbV9yZWZD
b3VudCA8PSAwKQotICAgICAgICBhcmVuYURlbGV0ZShhcmVuYSwgdGhpcyk7Ci19Ci0KLXZvaWQg
UmVuZGVyV2lkZ2V0Ojp1cGRhdGVXaWRnZXRQb3NpdGlvbigpCi17Ci0gICAgaWYgKCFtX3dpZGdl
dCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGludCB4LCB5LCB3aWR0aCwgaGVpZ2h0Owot
ICAgIGFic29sdXRlUG9zaXRpb24oeCwgeSk7Ci0gICAgeCArPSBib3JkZXJMZWZ0KCkgKyBwYWRk
aW5nTGVmdCgpOwotICAgIHkgKz0gYm9yZGVyVG9wKCkgKyBwYWRkaW5nVG9wKCk7Ci0gICAgd2lk
dGggPSBtX3dpZHRoIC0gYm9yZGVyTGVmdCgpIC0gYm9yZGVyUmlnaHQoKSAtIHBhZGRpbmdMZWZ0
KCkgLSBwYWRkaW5nUmlnaHQoKTsKLSAgICBoZWlnaHQgPSBtX2hlaWdodCAtIGJvcmRlclRvcCgp
IC0gYm9yZGVyQm90dG9tKCkgLSBwYWRkaW5nVG9wKCkgLSBwYWRkaW5nQm90dG9tKCk7Ci0gICAg
SW50UmVjdCBuZXdCb3VuZHMoeCx5LHdpZHRoLGhlaWdodCk7Ci0gICAgSW50UmVjdCBvbGRCb3Vu
ZHMobV93aWRnZXQtPmZyYW1lR2VvbWV0cnkoKSk7Ci0gICAgaWYgKG5ld0JvdW5kcyAhPSBvbGRC
b3VuZHMpIHsKLSAgICAgICAgLy8gVGhlIHdpZGdldCBjaGFuZ2VkIHBvc2l0aW9ucy4gIFVwZGF0
ZSB0aGUgZnJhbWUgZ2VvbWV0cnkuCi0gICAgICAgIGlmIChjaGVja0ZvclJlcGFpbnREdXJpbmdM
YXlvdXQoKSkgewotICAgICAgICAgICAgUmVuZGVyQ2FudmFzKiBjID0gY2FudmFzKCk7Ci0gICAg
ICAgICAgICBpZiAoIWMtPnByaW50aW5nTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgYy0+cmVw
YWludFZpZXdSZWN0YW5nbGUob2xkQm91bmRzKTsKLSAgICAgICAgICAgICAgICBjLT5yZXBhaW50
Vmlld1JlY3RhbmdsZShuZXdCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgUmVuZGVyQXJlbmEgKmFyZW5hID0gcmVmKCk7Ci0gICAgICAgIGVsZW1lbnQoKS0+cmVm
KCk7Ci0gICAgICAgIG1fd2lkZ2V0LT5zZXRGcmFtZUdlb21ldHJ5KG5ld0JvdW5kcyk7Ci0gICAg
ICAgIGVsZW1lbnQoKS0+ZGVyZWYoKTsKLSAgICAgICAgZGVyZWYoYXJlbmEpOwotICAgIH0KLX0K
LQotdm9pZCBSZW5kZXJXaWRnZXQ6OnNldFNlbGVjdGlvblN0YXRlKFNlbGVjdGlvblN0YXRlIHMp
IAotewotICAgIGlmIChzZWxlY3Rpb25TdGF0ZSgpICE9IHMpIHsKLSAgICAgICAgUmVuZGVyUmVw
bGFjZWQ6OnNldFNlbGVjdGlvblN0YXRlKHMpOwotICAgICAgICBtX3NlbGVjdGlvblN0YXRlID0g
czsKLSAgICAgICAgaWYgKG1fd2lkZ2V0KQotICAgICAgICAgICAgbV93aWRnZXQtPnNldElzU2Vs
ZWN0ZWQoaXNTZWxlY3RlZCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0OjpkZWxl
dGVXaWRnZXQoKQotewotICAgIGRlbGV0ZSBtX3dpZGdldDsKLX0KLQogfQpJbmRleDogcmVuZGVy
aW5nL3JlbmRlcl9mcmFtZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvcmVuZGVyX2ZyYW1l
cy5oCShyZXZpc2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9yZW5kZXJfZnJhbWVzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0
aGUgS0RFIHByb2plY3QuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtu
b2xsQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDAgU2ltb24gSGF1c21hbm4gPGhhdXNt
YW5uQGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4K
LSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0g
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2Ug
LSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8KLQot
I2lmbmRlZiByZW5kZXJfZnJhbWVzX2hfXwotI2RlZmluZSByZW5kZXJfZnJhbWVzX2hfXwotCi0j
aW5jbHVkZSAiUmVuZGVyQ29udGFpbmVyLmgiCi0jaW5jbHVkZSAicmVuZGVyX3JlcGxhY2VkLmgi
Ci0jaW5jbHVkZSAiaHRtbF9iYXNlaW1wbC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNs
YXNzIEZyYW1lVmlldzsKLWNsYXNzIEhUTUxFbGVtZW50OwotY2xhc3MgSFRNTEZyYW1lRWxlbWVu
dDsKLWNsYXNzIE1vdXNlRXZlbnQ7Ci0KLXN0cnVjdCBDaGlsZEZyYW1lOwotCi1jbGFzcyBSZW5k
ZXJGcmFtZVNldCA6IHB1YmxpYyBSZW5kZXJDb250YWluZXIKLXsKLSAgICBmcmllbmQgY2xhc3Mg
SFRNTEZyYW1lU2V0RWxlbWVudDsKLXB1YmxpYzoKLSAgICBSZW5kZXJGcmFtZVNldChIVE1MRnJh
bWVTZXRFbGVtZW50Kik7Ci0gICAgdmlydHVhbCB+UmVuZGVyRnJhbWVTZXQoKTsKLQotICAgIHZp
cnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJSZW5kZXJGcmFt
ZVNldCI7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGcmFtZVNldCgpIGNvbnN0IHsgcmV0dXJuIHRy
dWU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKLQotICAgIHZvaWQgcG9zaXRpb25G
cmFtZXMoKTsKLQotICAgIGJvb2wgcmVzaXppbmcoKSBjb25zdCB7IHJldHVybiBtX3Jlc2l6aW5n
OyB9Ci0KLSAgICBib29sIHVzZXJSZXNpemUoTW91c2VFdmVudCopOwotICAgIGJvb2wgY2FuUmVz
aXplKGludCB4LCBpbnQgeSk7Ci0gICAgdm9pZCBzZXRSZXNpemluZyhib29sKTsKLQotICAgIHZp
cnR1YWwgYm9vbCBub2RlQXRQb2ludChOb2RlSW5mbyYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBp
bnQgdHksIEhpdFRlc3RBY3Rpb24pOwotCi0gICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZWxlbWVu
dCgpIGNvbnN0Ci0gICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGcmFtZVNldEVsZW1l
bnQqPihSZW5kZXJDb250YWluZXI6OmVsZW1lbnQoKSk7IH0KLQotI2lmbmRlZiBOREVCVUcKLSAg
ICB2aXJ0dWFsIHZvaWQgZHVtcChRVGV4dFN0cmVhbSAqc3RyZWFtLCBEZXByZWNhdGVkU3RyaW5n
IGluZCA9ICIiKSBjb25zdDsKLSNlbmRpZgotCi1wcml2YXRlOgotICAgIGludCBtX29sZHBvczsK
LSAgICBpbnQgbV9ncmlkTGVuWzJdOwotICAgIGludCogbV9ncmlkRGVsdGFbMl07Ci0gICAgaW50
KiBtX2dyaWRMYXlvdXRbMl07Ci0KLSAgICBib29sKiBtX2hTcGxpdFZhcjsgLy8gaXMgdGhpcyBz
cGxpdCB2YXJpYWJsZT8KLSAgICBib29sKiBtX3ZTcGxpdFZhcjsKLQotICAgIGludCBtX2hTcGxp
dDsgLy8gdGhlIHNwbGl0IGN1cnJlbnRseSByZXNpemVkCi0gICAgaW50IG1fdlNwbGl0OwotICAg
IGludCBtX2hTcGxpdFBvczsKLSAgICBpbnQgbV92U3BsaXRQb3M7Ci0KLSAgICBib29sIG1fcmVz
aXppbmc7Ci0gICAgYm9vbCBtX2NsaWVudFJlc2l6aW5nOwotfTsKLQotY2xhc3MgUmVuZGVyUGFy
dCA6IHB1YmxpYyBSZW5kZXJXaWRnZXQgewotcHVibGljOgotICAgIFJlbmRlclBhcnQoSFRNTEVs
ZW1lbnQqKTsKLSAgICB2aXJ0dWFsIH5SZW5kZXJQYXJ0KCk7Ci0gICAgCi0gICAgdmlydHVhbCBj
b25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlclBhcnQiOyB9Ci0K
LSAgICB2b2lkIHNldEZyYW1lKEZyYW1lKik7Ci0gICAgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0Kik7
Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4KLSAgICAvLyBS
ZW1vdmUgdGhpcyBvbmNlIFdlYktpdCBrbm93cyB0byBwcm9wZXJseSBzY2hlZHVsZSBsYXlvdXRz
IHVzaW5nIFdlYkNvcmUgd2hlbiBvYmplY3RzIHJlc2l6ZS4KLSAgICB2b2lkIHVwZGF0ZVdpZGdl
dFBvc2l0aW9uKCk7Ci0KLSAgICBib29sIGhhc0ZhbGxiYWNrQ29udGVudCgpIGNvbnN0IHsgcmV0
dXJuIG1faGFzRmFsbGJhY2tDb250ZW50OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdmlld0NsZWFy
ZWQoKTsKLQotcHJvdGVjdGVkOgotICAgIGJvb2wgbV9oYXNGYWxsYmFja0NvbnRlbnQ7Ci0KLXBy
aXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIGRlbGV0ZVdpZGdldCgpOwotCi0gICAgRnJhbWUqIG1f
ZnJhbWU7Ci19OwotCi1jbGFzcyBSZW5kZXJGcmFtZSA6IHB1YmxpYyBSZW5kZXJQYXJ0Ci17Ci1w
dWJsaWM6Ci0gICAgUmVuZGVyRnJhbWUoSFRNTEZyYW1lRWxlbWVudCopOwotCi0gICAgdmlydHVh
bCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gIlJlbmRlckZyYW1lIjsg
fQotCi0gICAgSFRNTEZyYW1lRWxlbWVudCogZWxlbWVudCgpIGNvbnN0Ci0gICAgICAgIHsgcmV0
dXJuIHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnQqPihSZW5kZXJQYXJ0OjplbGVtZW50KCkp
OyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdmlld0NsZWFyZWQoKTsKLX07Ci0KLS8vIEkgY2FuIGhh
cmRseSBjYWxsIHRoZSBjbGFzcyBSZW5kZXJPYmplY3QgOy0pCi1jbGFzcyBSZW5kZXJQYXJ0T2Jq
ZWN0IDogcHVibGljIFJlbmRlclBhcnQKLXsKLXB1YmxpYzoKLSAgICBSZW5kZXJQYXJ0T2JqZWN0
KEhUTUxFbGVtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBj
b25zdCB7IHJldHVybiAiUmVuZGVyUGFydE9iamVjdCI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBs
YXlvdXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlV2lkZ2V0KCk7Ci0KLSAgICB2aXJ0dWFs
IHZvaWQgdmlld0NsZWFyZWQoKTsKLX07Ci0KLX0KLQotI2VuZGlmCkluZGV4OiByZW5kZXJpbmcv
UmVuZGVyUGFydE9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclBhcnRP
YmplY3QuY3BwCShyZXZpc2lvbiAxNDMyNSkKKysrIHJlbmRlcmluZy9SZW5kZXJQYXJ0T2JqZWN0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNjQ5ICsyMiwyNCBAQAogICogQm9zdG9uLCBNQSAw
MjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJyZW5kZXJfZnJhbWVzLmgiCisjaW5jbHVkZSAiUmVuZGVyUGFydE9iamVjdC5oIgogCi0jaW5j
bHVkZSAiQ3Vyc29yLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudE5h
bWVzLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZVRyZWUuaCIKLSNpbmNs
dWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRl
ICJQYWdlLmgiCi0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgImRvbTJfZXZlbnRzaW1wbC5o
IgotI2luY2x1ZGUgImh0bWxfYmFzZWltcGwuaCIKLSNpbmNsdWRlICJIVE1MRW1iZWRFbGVtZW50
LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTEVtYmVkRWxlbWVudC5o
IgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTE9iamVjdEVs
ZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MUGFyYW1FbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTFRv
a2VuaXplci5oIgotI2luY2x1ZGUgIlJlbmRlckFyZW5hLmgiCi0jaW5jbHVkZSAiUmVuZGVyQ2Fu
dmFzLmgiCi0jaW5jbHVkZSAiS1dRVGV4dFN0cmVhbS5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNp
bmNsdWRlICJUZXh0LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNl
IEV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1SZW5kZXJGcmFtZVNl
dDo6UmVuZGVyRnJhbWVTZXQoIEhUTUxGcmFtZVNldEVsZW1lbnQgKmZyYW1lU2V0KQotICAgIDog
UmVuZGVyQ29udGFpbmVyKGZyYW1lU2V0KQotewotICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRy
aWJ1dGVzCi0gICAgc2V0SW5saW5lKGZhbHNlKTsKLQotICBmb3IgKGludCBrID0gMDsgayA8IDI7
ICsraykgewotICAgICAgbV9ncmlkTGVuW2tdID0gLTE7Ci0gICAgICBtX2dyaWREZWx0YVtrXSA9
IDA7Ci0gICAgICBtX2dyaWRMYXlvdXRba10gPSAwOwotICB9Ci0KLSAgbV9yZXNpemluZyA9IG1f
Y2xpZW50UmVzaXppbmcgPSBmYWxzZTsKLQotICBtX2hTcGxpdCA9IC0xOwotICBtX3ZTcGxpdCA9
IC0xOwotCi0gIG1faFNwbGl0VmFyID0gMDsKLSAgbV92U3BsaXRWYXIgPSAwOwotfQotCi1SZW5k
ZXJGcmFtZVNldDo6flJlbmRlckZyYW1lU2V0KCkKLXsKLSAgICBmb3IgKGludCBrID0gMDsgayA8
IDI7ICsraykgewotICAgICAgICBpZiAobV9ncmlkTGF5b3V0W2tdKSBkZWxldGUgW10gbV9ncmlk
TGF5b3V0W2tdOwotICAgICAgICBpZiAobV9ncmlkRGVsdGFba10pIGRlbGV0ZSBbXSBtX2dyaWRE
ZWx0YVtrXTsKLSAgICB9Ci0gIGlmIChtX2hTcGxpdFZhcikKLSAgICAgIGRlbGV0ZSBbXSBtX2hT
cGxpdFZhcjsKLSAgaWYgKG1fdlNwbGl0VmFyKQotICAgICAgZGVsZXRlIFtdIG1fdlNwbGl0VmFy
OwotfQotCi1ib29sIFJlbmRlckZyYW1lU2V0Ojpub2RlQXRQb2ludChOb2RlSW5mbyYgaW5mbywg
aW50IF94LCBpbnQgX3ksIGludCBfdHgsIGludCBfdHksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCi17Ci0gICAgaWYgKGhpdFRl
c3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGJvb2wgaW5zaWRlID0gUmVuZGVyQ29udGFpbmVyOjpub2RlQXRQb2ludChpbmZvLCBfeCwg
X3ksIF90eCwgX3R5LCBoaXRUZXN0QWN0aW9uKSB8fCAKLSAgICAgICAgICAgICAgICAgIG1fcmVz
aXppbmcgfHwgY2FuUmVzaXplKF94LCBfeSk7Ci0gICAgaWYgKGluc2lkZSAmJiBlbGVtZW50KCkg
JiYgIWVsZW1lbnQoKS0+bm9SZXNpemUoKSAmJiAhaW5mby5yZWFkb25seSgpICYmICFpbmZvLmlu
bmVyTm9kZSgpKSB7Ci0gICAgICAgIGluZm8uc2V0SW5uZXJOb2RlKGVsZW1lbnQoKSk7Ci0gICAg
ICAgIGluZm8uc2V0SW5uZXJOb25TaGFyZWROb2RlKGVsZW1lbnQoKSk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGluc2lkZSB8fCBtX2NsaWVudFJlc2l6aW5nOwotfQotCi12b2lkIFJlbmRlckZyYW1l
U2V0OjpsYXlvdXQoICkKLXsKLSAgICBLSFRNTEFzc2VydCggbmVlZHNMYXlvdXQoKSApOwotICAg
IEtIVE1MQXNzZXJ0KCBtaW5NYXhLbm93bigpICk7Ci0KLSAgICBpZiAoICFwYXJlbnQoKS0+aXNG
cmFtZVNldCgpICkgewotICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjYW52YXMoKS0+dmlldygp
OwotICAgICAgICBtX3dpZHRoID0gdmlldy0+dmlzaWJsZVdpZHRoKCk7Ci0gICAgICAgIG1faGVp
Z2h0ID0gdmlldy0+dmlzaWJsZUhlaWdodCgpOwotICAgIH0KLQotICAgIGludCByZW1haW5pbmdM
ZW5bMl07Ci0gICAgcmVtYWluaW5nTGVuWzFdID0gbV93aWR0aCAtIChlbGVtZW50KCktPnRvdGFs
Q29scygpLTEpKmVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAgaWYocmVtYWluaW5nTGVuWzFdPDAp
IHJlbWFpbmluZ0xlblsxXT0wOwotICAgIHJlbWFpbmluZ0xlblswXSA9IG1faGVpZ2h0IC0gKGVs
ZW1lbnQoKS0+dG90YWxSb3dzKCktMSkqZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICBpZihyZW1h
aW5pbmdMZW5bMF08MCkgcmVtYWluaW5nTGVuWzBdPTA7Ci0KLSAgICBpbnQgYXZhaWxhYmxlTGVu
WzJdOwotICAgIGF2YWlsYWJsZUxlblswXSA9IHJlbWFpbmluZ0xlblswXTsKLSAgICBhdmFpbGFi
bGVMZW5bMV0gPSByZW1haW5pbmdMZW5bMV07Ci0KLSAgICBpZiAobV9ncmlkTGVuWzBdICE9IGVs
ZW1lbnQoKS0+dG90YWxSb3dzKCkgfHwgbV9ncmlkTGVuWzFdICE9IGVsZW1lbnQoKS0+dG90YWxD
b2xzKCkpIHsKLSAgICAgICAgLy8gbnVtYmVyIG9mIHJvd3Mgb3IgY29scyBjaGFuZ2VkCi0gICAg
ICAgIC8vIG5lZWQgdG8gemVybyBvdXQgdGhlIGRlbHRhcwotICAgICAgICBtX2dyaWRMZW5bMF0g
PSBlbGVtZW50KCktPnRvdGFsUm93cygpOwotICAgICAgICBtX2dyaWRMZW5bMV0gPSBlbGVtZW50
KCktPnRvdGFsQ29scygpOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgewot
ICAgICAgICAgICAgaWYgKG1fZ3JpZERlbHRhW2tdKSBkZWxldGUgW10gbV9ncmlkRGVsdGFba107
Ci0gICAgICAgICAgICBtX2dyaWREZWx0YVtrXSA9IG5ldyBpbnRbbV9ncmlkTGVuW2tdXTsKLSAg
ICAgICAgICAgIGlmIChtX2dyaWRMYXlvdXRba10pIGRlbGV0ZSBbXSBtX2dyaWRMYXlvdXRba107
Ci0gICAgICAgICAgICBtX2dyaWRMYXlvdXRba10gPSBuZXcgaW50W21fZ3JpZExlbltrXV07Ci0g
ICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fZ3JpZExlbltrXTsgKytpKQotICAgICAg
ICAgICAgICAgIG1fZ3JpZERlbHRhW2tdW2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSB7Ci0gICAgICAgIGludCB0b3RhbFJlbGF0aXZl
ID0gMDsKLSAgICAgICAgaW50IHRvdGFsRml4ZWQgPSAwOwotICAgICAgICBpbnQgdG90YWxQZXJj
ZW50ID0gMDsKLSAgICAgICAgaW50IGNvdW50UmVsYXRpdmUgPSAwOwotICAgICAgICBpbnQgY291
bnRGaXhlZCA9IDA7Ci0gICAgICAgIGludCBjb3VudFBlcmNlbnQgPSAwOwotICAgICAgICBpbnQg
Z3JpZExlbiA9IG1fZ3JpZExlbltrXTsKLSAgICAgICAgaW50KiBncmlkRGVsdGEgPSBtX2dyaWRE
ZWx0YVtrXTsKLSAgICAgICAgV2ViQ29yZTo6TGVuZ3RoKiBncmlkID0gIGsgPyBlbGVtZW50KCkt
Pm1fY29scyA6IGVsZW1lbnQoKS0+bV9yb3dzOwotICAgICAgICBpbnQqIGdyaWRMYXlvdXQgPSBt
X2dyaWRMYXlvdXRba107Ci0KLSAgICAgICAgaWYgKGdyaWQpIHsKLSAgICAgICAgICAgIGFzc2Vy
dChncmlkTGVuKTsKLSAgICAgICAgICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUg
aG93IG1hbnkgY29sdW1ucyBvZiBlYWNoIHR5cGUgd2UgaGF2ZSBhbmQKLSAgICAgICAgICAgIC8v
IGhvdyBtdWNoIHNwYWNlIHRoZXNlIGNvbHVtbnMgYXJlIGdvaW5nIHRvIHJlcXVpcmUuCi0gICAg
ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAg
ICAgIC8vIENvdW50IHRoZSB0b3RhbCBsZW5ndGggb2YgYWxsIG9mIHRoZSBmaXhlZCBjb2x1bW5z
L3Jvd3MgLT4gdG90YWxGaXhlZAotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIg
b2YgY29sdW1ucy9yb3dzIHdoaWNoIGFyZSBmaXhlZCAtPiBjb3VudEZpeGVkCi0gICAgICAgICAg
ICAgICAgaWYgKGdyaWRbaV0uaXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyaWRM
YXlvdXRbaV0gPSBtYXgoZ3JpZFtpXS52YWx1ZSgpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAg
dG90YWxGaXhlZCArPSBncmlkTGF5b3V0W2ldOwotICAgICAgICAgICAgICAgICAgICBjb3VudEZp
eGVkKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAg
ICAgIC8vIENvdW50IHRoZSB0b3RhbCBwZXJjZW50YWdlIG9mIGFsbCBvZiB0aGUgcGVyY2VudGFn
ZSBjb2x1bW5zL3Jvd3MgLT4gdG90YWxQZXJjZW50Ci0gICAgICAgICAgICAgICAgLy8gQ291bnQg
dGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3Mgd2hpY2ggYXJlIHBlcmNlbnRhZ2VzIC0+IGNvdW50
UGVyY2VudAotICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzUGVyY2VudCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gPSBtYXgoZ3JpZFtpXS5jYWxjVmFsdWUoYXZh
aWxhYmxlTGVuW2tdKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsUGVyY2VudCArPSBn
cmlkTGF5b3V0W2ldOwotICAgICAgICAgICAgICAgICAgICBjb3VudFBlcmNlbnQrKzsKLSAgICAg
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDb3VudCB0aGUgdG90YWwgcmVsYXRp
dmUgb2YgYWxsIHRoZSByZWxhdGl2ZSBjb2x1bW5zL3Jvd3MgLT4gdG90YWxSZWxhdGl2ZQotICAg
ICAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgY29sdW1ucy9yb3dzIHdoaWNoIGFy
ZSByZWxhdGl2ZSAtPiBjb3VudFJlbGF0aXZlCi0gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0u
aXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsUmVsYXRpdmUgKz0gbWF4
KGdyaWRbaV0udmFsdWUoKSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50UmVsYXRpdmUr
KzsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIC8vIEZpeGVkIGNvbHVtbnMvcm93cyBhcmUgb3VyIGZpcnN0IHByaW9yaXR5LiBJZiB0
aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIHRvIGZpdCBhbGwgZml4ZWQKLSAgICAgICAgICAgIC8v
IGNvbHVtbnMvcm93cyB3ZSBuZWVkIHRvIHByb3BvcnRpb25hbGx5IGFkanVzdCB0aGVpciBzaXpl
LiAKLSAgICAgICAgICAgIGlmICh0b3RhbEZpeGVkID4gcmVtYWluaW5nTGVuW2tdKSB7Ci0gICAg
ICAgICAgICAgICAgaW50IHJlbWFpbmluZ0ZpeGVkID0gcmVtYWluaW5nTGVuW2tdOwotCi0gICAg
ICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBncmlkTGF5b3V0W2ldID0gKGdyaWRMYXlvdXRbaV0gKiByZW1haW5pbmdGaXhlZCkgLyB0
b3RhbEZpeGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGdy
aWRMYXlvdXRbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSB0
b3RhbEZpeGVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQZXJjZW50YWdlIGNv
bHVtbnMvcm93cyBhcmUgb3VyIHNlY29uZCBwcmlvcml0eS4gRGl2aWRlIHRoZSByZW1haW5pbmcg
c3BhY2UgcHJvcG9ydGlvbmFsbHkgCi0gICAgICAgICAgICAvLyBvdmVyIGFsbCBwZXJjZW50YWdl
IGNvbHVtbnMvcm93cy4gSU1QT1JUQU5UOiB0aGUgc2l6ZSBvZiBlYWNoIGNvbHVtbi9yb3cgaXMg
bm90IHJlbGF0aXZlIAotICAgICAgICAgICAgLy8gdG8gMTAwJSwgYnV0IHRvIHRoZSB0b3RhbCBw
ZXJjZW50YWdlLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlIHRocmVlIGNvbHVtbnMsIGVhY2gg
b2YgNzUlLAotICAgICAgICAgICAgLy8gYW5kIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgMzAwcHgs
IGVhY2ggY29sdW1uIHdpbGwgYmVjb21lIDEwMHB4IGluIHdpZHRoLgotICAgICAgICAgICAgaWYg
KHRvdGFsUGVyY2VudCA+IHJlbWFpbmluZ0xlbltrXSkgewotICAgICAgICAgICAgICAgIGludCBy
ZW1haW5pbmdQZXJjZW50ID0gcmVtYWluaW5nTGVuW2tdOwotCi0gICAgICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGdyaWRbaV0uaXNQZXJjZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRMYXlv
dXRbaV0gPSAoZ3JpZExheW91dFtpXSAqIHJlbWFpbmluZ1BlcmNlbnQpIC8gdG90YWxQZXJjZW50
OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGdyaWRMYXlvdXRb
aV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltrXSAtPSB0b3RhbFBlcmNl
bnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlbGF0aXZlIGNvbHVtbnMvcm93
cyBhcmUgb3VyIGxhc3QgcHJpb3JpdHkuIERpdmlkZSB0aGUgcmVtYWluaW5nIHNwYWNlIHByb3Bv
cnRpb25hbGx5Ci0gICAgICAgICAgICAvLyBvdmVyIGFsbCByZWxhdGl2ZSBjb2x1bW5zL3Jvd3Mu
IElNUE9SVEFOVDogdGhlIHJlbGF0aXZlIHZhbHVlIG9mIDAqIGlzIHRyZWF0ZWQgYXMgMSouCi0g
ICAgICAgICAgICBpZiAoY291bnRSZWxhdGl2ZSkgewotICAgICAgICAgICAgICAgIGludCBsYXN0
UmVsYXRpdmUgPSAwOwotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdSZWxhdGl2ZSA9IHJl
bWFpbmluZ0xlbltrXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3Jp
ZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzUmVsYXRpdmUo
KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSA9IChtYXgoZ3JpZFtp
XS52YWx1ZSgpLCAxKSAqIHJlbWFpbmluZ1JlbGF0aXZlKSAvIHRvdGFsUmVsYXRpdmU7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gZ3JpZExheW91dFtpXTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZWxhdGl2ZSA9IGk7Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgLy8gSWYgd2UgY291bGQgbm90IGV2ZW50bHkgZGlzdHJpYnV0ZSB0aGUgYXZhaWxhYmxlIHNw
YWNlIG9mIGFsbCBvZiB0aGUgcmVsYXRpdmUgIAotICAgICAgICAgICAgICAgIC8vIGNvbHVtbnMv
cm93cywgdGhlIHJlbWFpbmRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsYXN0IGNvbHVtbi9yb3cu
Ci0gICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGlmIHdlIGhhdmUgYSBzcGFjZSBvZiAx
MDBweCBhbmQgdGhyZWUgY29sdW1ucyAoKiwqLCopLCB0aGUgcmVtYWluZGVyIHdpbGwKLSAgICAg
ICAgICAgICAgICAvLyBiZSAxcHggYW5kIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxhc3QgY29sdW1u
OiAzM3B4LCAzM3B4LCAzNHB4LgotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdMZW5ba10p
IHsKLSAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtsYXN0UmVsYXRpdmVdICs9IHJlbWFp
bmluZ0xlbltrXTsKLSAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdID0gMDsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIHN0
aWxsIGhhdmUgc29tZSBsZWZ0IG92ZXIgc3BhY2Ugd2UgbmVlZCB0byBkaXZpZGUgaXQgb3ZlciB0
aGUgYWxyZWFkeSBleGlzdGluZwotICAgICAgICAgICAgLy8gY29sdW1ucy9yb3dzCi0gICAgICAg
ICAgICBpZiAocmVtYWluaW5nTGVuW2tdKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3VyIGZpcnN0
IHByaW9yaXR5IGlzIHRvIHNwcmVhZCBpZiBvdmVyIHRoZSBwZXJjZW50YWdlIGNvbHVtbnMuIFRo
ZSByZW1haW5pbmcKLSAgICAgICAgICAgICAgICAvLyBzcGFjZSBpcyBzcHJlYWQgZXZlbmx5LCBm
b3IgZXhhbXBsZTogaWYgd2UgaGF2ZSBhIHNwYWNlIG9mIDEwMHB4LCB0aGUgY29sdW1ucyAKLSAg
ICAgICAgICAgICAgICAvLyBkZWZpbml0aW9uIG9mIDI1JSwyNSUgdXNlZCB0byByZXN1bHQgaW4g
dHdvIGNvbHVtbnMgb2YgMjVweC4gQWZ0ZXIgdGhpcyB0aGUgCi0gICAgICAgICAgICAgICAgLy8g
Y29sdW1ucyB3aWxsIGVhY2ggYmUgNTBweCBpbiB3aWR0aC4gCi0gICAgICAgICAgICAgICAgaWYg
KGNvdW50UGVyY2VudCAmJiB0b3RhbFBlcmNlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50
IHJlbWFpbmluZ1BlcmNlbnQgPSByZW1haW5pbmdMZW5ba107Ci0gICAgICAgICAgICAgICAgICAg
IGludCBjaGFuZ2VQZXJjZW50ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdy
aWRbaV0uaXNQZXJjZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQ
ZXJjZW50ID0gKHJlbWFpbmluZ1BlcmNlbnQgKiBncmlkTGF5b3V0W2ldKSAvIHRvdGFsUGVyY2Vu
dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9IGNoYW5nZVBl
cmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGNo
YW5nZVBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvdGFsRml4ZWQpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gT3VyIGxhc3QgcHJpb3JpdHkgaXMgdG8gc3ByZWFkIHRoZSByZW1haW5p
bmcgc3BhY2Ugb3ZlciB0aGUgZml4ZWQgY29sdW1ucy4KLSAgICAgICAgICAgICAgICAgICAgLy8g
Rm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSAxMDBweCBvZiBzcGFjZSBhbmQgdHdvIGNvbHVtbiBvZiBl
YWNoIDQwcHgsIGJvdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1ucyB3aWxsIGJlY29t
ZSBleGFjdGx5IDUwcHguCi0gICAgICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdGaXhlZCA9
IHJlbWFpbmluZ0xlbltrXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZUZpeGVkID0g
MDsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsr
aSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNGaXhlZCgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRml4ZWQgPSAocmVtYWluaW5nRml4ZWQg
KiBncmlkTGF5b3V0W2ldKSAvIHRvdGFsRml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZ3JpZExheW91dFtpXSArPSBjaGFuZ2VGaXhlZDsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZW1haW5pbmdMZW5ba10gLT0gY2hhbmdlRml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9IAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIHNv
bWUgbGVmdCBvdmVyIHNwYWNlIHdlIHByb2JhYmx5IGVuZGVkIHVwIHdpdGggYSByZW1haW5kZXIg
b2YKLSAgICAgICAgICAgIC8vIGEgZGl2aXNpb24uIFdlIGNhbiBub3Qgc3ByZWFkIGl0IGV2ZW5s
eSBhbnltb3JlLiBJZiB3ZSBoYXZlIGFueSBwZXJjZW50YWdlIAotICAgICAgICAgICAgLy8gY29s
dW1ucy9yb3dzIHNpbXBseSBzcHJlYWQgdGhlIHJlbWFpbmRlciBlcXVhbGx5IG92ZXIgYWxsIGF2
YWlsYWJsZSBwZXJjZW50YWdlIGNvbHVtbnMsIAotICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBv
ZiB0aGVpciBzaXplLgotICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0xlbltrXSAmJiBjb3VudFBl
cmNlbnQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nUGVyY2VudCA9IHJlbWFpbmlu
Z0xlbltrXTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhbmdlUGVyY2VudCA9IDA7Ci0KLSAgICAg
ICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAg
ICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc1BlcmNlbnQoKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgY2hhbmdlUGVyY2VudCA9IHJlbWFpbmluZ1BlcmNlbnQgLyBjb3VudFBlcmNlbnQ7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9IGNoYW5nZVBlcmNlbnQ7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gY2hhbmdlUGVyY2VudDsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0g
Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IHBlcmNl
bnRhZ2UgY29sdW1ucy9yb3dzIHdlIG9ubHkgaGF2ZSBmaXhlZCBjb2x1bW5zLiBTcHJlYWQKLSAg
ICAgICAgICAgIC8vIHRoZSByZW1haW5kZXIgZXF1YWxseSBvdmVyIGFsbCBmaXhlZCBjb2x1bW5z
L3Jvd3MuCi0gICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmdMZW5ba10gJiYgY291bnRGaXhl
ZCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdGaXhlZCA9IHJlbWFpbmluZ0xlbltr
XTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhbmdlRml4ZWQgPSAwOwotICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzRml4ZWQoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgY2hhbmdlRml4ZWQgPSByZW1haW5pbmdGaXhlZCAvIGNvdW50Rml4ZWQ7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9IGNoYW5nZUZpeGVkOwotICAg
ICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGNoYW5nZUZpeGVkOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICAvLyBTdGlsbCBzb21lIGxlZnQgb3Zlci4uLiBzaW1wbHkgYWRkIGl0IHRvIHRo
ZSBsYXN0IGNvbHVtbiwgYmVjYXVzZSBpdCBpcyBpbXBvc3NpYmxlCi0gICAgICAgICAgICAvLyBz
cHJlYWQgaXQgZXZlbmx5IG9yIGVxdWFsbHkuCi0gICAgICAgICAgICBpZiAocmVtYWluaW5nTGVu
W2tdKSB7Ci0gICAgICAgICAgICAgICAgZ3JpZExheW91dFtncmlkTGVuIC0gMV0gKz0gcmVtYWlu
aW5nTGVuW2tdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgd2UgaGF2ZSB0
aGUgZmluYWwgbGF5b3V0LCBkaXN0cmlidXRlIHRoZSBkZWx0YSBvdmVyIGl0Ci0gICAgICAgICAg
ICBib29sIHdvcmtlZCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdy
aWRMZW47ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChncmlkTGF5b3V0W2ldICYmIGdyaWRM
YXlvdXRbaV0gKyBncmlkRGVsdGFbaV0gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgd29ya2Vk
ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSArPSBncmlkRGVsdGFbaV07
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBub3cgdGhlIGRlbHRhJ3MgYnJva2Ugc29t
ZXRoaW5nLCB1bmRvIGl0IGFuZCByZXNldCBkZWx0YXMKLSAgICAgICAgICAgIGlmICghd29ya2Vk
KQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gLT0gZ3JpZERlbHRhW2ldOwotICAgICAg
ICAgICAgICAgICAgICBncmlkRGVsdGFbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBncmlkTGF5b3V0WzBdID0gcmVtYWluaW5n
TGVuW2tdOwotICAgIH0KLQotICAgIHBvc2l0aW9uRnJhbWVzKCk7Ci0KLSAgICBSZW5kZXJPYmpl
Y3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIGlmICggIWNoaWxkICkKLSAgICAgICAgZ290
byBlbmQyOwotCi0gICAgaWYoIW1faFNwbGl0VmFyICYmICFtX3ZTcGxpdFZhcikKLSAgICB7Ci0g
ICAgICAgIGlmKCFtX3ZTcGxpdFZhciAmJiBlbGVtZW50KCktPnRvdGFsQ29scygpID4gMSkKLSAg
ICAgICAgewotICAgICAgICAgICAgbV92U3BsaXRWYXIgPSBuZXcgYm9vbFtlbGVtZW50KCktPnRv
dGFsQ29scygpXTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBlbGVtZW50KCktPnRv
dGFsQ29scygpOyBpKyspIG1fdlNwbGl0VmFyW2ldID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAg
ICBpZighbV9oU3BsaXRWYXIgJiYgZWxlbWVudCgpLT50b3RhbFJvd3MoKSA+IDEpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIG1faFNwbGl0VmFyID0gbmV3IGJvb2xbZWxlbWVudCgpLT50b3RhbFJv
d3MoKV07Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZWxlbWVudCgpLT50b3RhbFJv
d3MoKTsgaSsrKSBtX2hTcGxpdFZhcltpXSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBm
b3IoaW50IHIgPSAwOyByIDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsgcisrKQotICAgICAgICB7
Ci0gICAgICAgICAgICBmb3IoaW50IGMgPSAwOyBjIDwgZWxlbWVudCgpLT50b3RhbENvbHMoKTsg
YysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2wgZml4ZWQgPSBmYWxzZTsK
LQotICAgICAgICAgICAgICAgIGlmICggY2hpbGQtPmlzRnJhbWVTZXQoKSApCi0gICAgICAgICAg
ICAgICAgICBmaXhlZCA9IHN0YXRpY19jYXN0PFJlbmRlckZyYW1lU2V0ICo+KGNoaWxkKS0+ZWxl
bWVudCgpLT5ub1Jlc2l6ZSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICAgIGZpeGVkID0gc3RhdGljX2Nhc3Q8UmVuZGVyRnJhbWUgKj4oY2hpbGQpLT5lbGVtZW50KCkt
Pm5vUmVzaXplKCk7Ci0KLSAgICAgICAgICAgICAgICBpZihmaXhlZCkKLSAgICAgICAgICAgICAg
ICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBlbGVtZW50KCktPnRvdGFsQ29scygpID4gMSkK
LSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz4wKSBt
X3ZTcGxpdFZhcltjLTFdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3ZTcGxp
dFZhcltjXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgIGlmKCBlbGVtZW50KCktPnRvdGFsUm93cygpID4gMSkKLSAgICAgICAgICAgICAgICAgICAg
ewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocj4wKSBtX2hTcGxpdFZhcltyLTFdID0gZmFs
c2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2hTcGxpdFZhcltyXSA9IGZhbHNlOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5l
eHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFjaGlsZCkKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGdvdG8gZW5kMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLQotICAgIH0KLSBlbmQxOgotICAgIFJlbmRlckNvbnRhaW5lcjo6bGF5b3V0
KCk7Ci0gZW5kMjoKLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0KLXZvaWQgUmVuZGVy
RnJhbWVTZXQ6OnBvc2l0aW9uRnJhbWVzKCkKLXsKLSAgaW50IHI7Ci0gIGludCBjOwotCi0gIFJl
bmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gIGlmICggIWNoaWxkICkKLSAgICBy
ZXR1cm47Ci0KLSAgLy8gIE5vZGUgKmNoaWxkID0gX2ZpcnN0OwotICAvLyAgaWYoIWNoaWxkKSBy
ZXR1cm47Ci0KLSAgaW50IHlQb3MgPSAwOwotCi0gIGZvcihyID0gMDsgciA8IGVsZW1lbnQoKS0+
dG90YWxSb3dzKCk7IHIrKykKLSAgewotICAgIGludCB4UG9zID0gMDsKLSAgICBmb3IoYyA9IDA7
IGMgPCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBjKyspCi0gICAgewotICAgICAgY2hpbGQtPnNl
dFBvcyggeFBvcywgeVBvcyApOwotICAgICAgLy8gaGFzIHRvIGJlIHJlc2l6ZWQgYW5kIGl0c2Vs
ZiByZXNpemUgaXRzIGNvbnRlbnRzCi0gICAgICBpZiAoKG1fZ3JpZExheW91dFsxXVtjXSAhPSBj
aGlsZC0+d2lkdGgoKSkgfHwgKG1fZ3JpZExheW91dFswXVtyXSAhPSBjaGlsZC0+aGVpZ2h0KCkp
KSB7Ci0gICAgICAgICAgY2hpbGQtPnNldFdpZHRoKCBtX2dyaWRMYXlvdXRbMV1bY10gKTsKLSAg
ICAgICAgICBjaGlsZC0+c2V0SGVpZ2h0KCBtX2dyaWRMYXlvdXRbMF1bcl0gKTsKLSAgICAgICAg
ICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0gICAgICAgICAgY2hpbGQtPmxheW91dCgp
OwotICAgICAgfQotCi0gICAgICB4UG9zICs9IG1fZ3JpZExheW91dFsxXVtjXSArIGVsZW1lbnQo
KS0+Ym9yZGVyKCk7Ci0gICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotCi0gICAg
ICBpZiAoICFjaGlsZCApCi0gICAgICAgIHJldHVybjsKLQotICAgIH0KLQotICAgIHlQb3MgKz0g
bV9ncmlkTGF5b3V0WzBdW3JdICsgZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgfQotCi0gIC8vIGFs
bCB0aGUgcmVtYWluaW5nIGZyYW1lcyBhcmUgaGlkZGVuIHRvIGF2b2lkIHVnbHkKLSAgLy8gc3B1
cmlvdXMgdW5mbG93ZWQgZnJhbWVzCi0gIHdoaWxlICggY2hpbGQgKSB7Ci0gICAgICBjaGlsZC0+
c2V0V2lkdGgoIDAgKTsKLSAgICAgIGNoaWxkLT5zZXRIZWlnaHQoIDAgKTsKLSAgICAgIGNoaWxk
LT5zZXROZWVkc0xheW91dChmYWxzZSk7Ci0KLSAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJs
aW5nKCk7Ci0gIH0KLX0KLQotYm9vbCBSZW5kZXJGcmFtZVNldDo6dXNlclJlc2l6ZSggTW91c2VF
dmVudCAqZXZ0ICkKLXsKLSAgICBpZiAobmVlZHNMYXlvdXQoKSkgcmV0dXJuIGZhbHNlOwotICAg
IAotICAgIGJvb2wgcmVzID0gZmFsc2U7Ci0gICAgaW50IF94ID0gZXZ0LT5jbGllbnRYKCk7Ci0g
ICAgaW50IF95ID0gZXZ0LT5jbGllbnRZKCk7Ci0gICAgCi0gICAgaWYgKCAhbV9yZXNpemluZyAm
JiBldnQtPnR5cGUoKSA9PSBtb3VzZW1vdmVFdmVudCB8fCBldnQtPnR5cGUoKSA9PSBtb3VzZWRv
d25FdmVudCApCi0gICAgewotICAgICAgICBtX2hTcGxpdCA9IC0xOwotICAgICAgICBtX3ZTcGxp
dCA9IC0xOwotICAgICAgICAvL2Jvb2wgcmVzaXplUG9zc2libGUgPSB0cnVlOwotICAgICAgICAK
LSAgICAgICAgLy8gY2hlY2sgaWYgd2UncmUgb3ZlciBhIGhvcml6b250YWwgb3IgdmVydGljYWwg
Ym91bmRhcnkKLSAgICAgICAgaW50IHBvcyA9IG1fZ3JpZExheW91dFsxXVswXSArIHhQb3MoKTsK
LSAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBjKysp
IHsKLSAgICAgICAgICAgIGlmIChfeCA+PSBwb3MgJiYgX3ggPD0gcG9zK2VsZW1lbnQoKS0+Ym9y
ZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobV92U3BsaXRWYXIgJiYgbV92U3BsaXRWYXJb
YyAtIDFdKQotICAgICAgICAgICAgICAgICAgICBtX3ZTcGxpdCA9IGMgLSAxOwotICAgICAgICAg
ICAgICAgIHJlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBwb3MgKz0gbV9ncmlkTGF5b3V0WzFdW2NdICsgZWxlbWVudCgpLT5ib3Jk
ZXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcG9zID0gbV9ncmlkTGF5b3V0WzBd
WzBdICsgeVBvcygpOwotICAgICAgICBmb3IgKGludCByID0gMTsgciA8IGVsZW1lbnQoKS0+dG90
YWxSb3dzKCk7IHIrKykgewotICAgICAgICAgICAgaWYgKCBfeSA+PSBwb3MgJiYgX3kgPD0gcG9z
K2VsZW1lbnQoKS0+Ym9yZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9oU3BsaXRWYXIg
JiYgbV9oU3BsaXRWYXJbciAtIDFdKQotICAgICAgICAgICAgICAgICAgICBtX2hTcGxpdCA9IHIg
LSAxOwotICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgKz0gbV9ncmlkTGF5b3V0WzBdW3JdICsg
ZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGV2
dC0+dHlwZSgpID09IG1vdXNlZG93bkV2ZW50KSB7Ci0gICAgICAgICAgICBzZXRSZXNpemluZyh0
cnVlKTsKLSAgICAgICAgICAgIG1fdlNwbGl0UG9zID0gX3g7Ci0gICAgICAgICAgICBtX2hTcGxp
dFBvcyA9IF95OwotICAgICAgICAgICAgbV9vbGRwb3MgPSAtMTsKLSAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICBjYW52YXMoKS0+dmlldygpLT5zZXRDdXJzb3IocG9pbnRlckN1cnNvcigpKTsK
LSAgICB9Ci0gICAgCi0gICAgLy8gIyMjIGNoZWNrIHRoZSByZXNpemUgaXMgbm90IGdvaW5nIG91
dCBvZiBib3VuZHMuCi0gICAgaWYgKG1fcmVzaXppbmcgJiYgZXZ0LT50eXBlKCkgPT0gbW91c2V1
cEV2ZW50KSB7Ci0gICAgICAgIHNldFJlc2l6aW5nKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAg
IGlmKG1fdlNwbGl0ICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGRlbHRhID0g
bV92U3BsaXRQb3MgLSBfeDsKLSAgICAgICAgICAgIG1fZ3JpZERlbHRhWzFdW21fdlNwbGl0XSAt
PSBkZWx0YTsKLSAgICAgICAgICAgIG1fZ3JpZERlbHRhWzFdW21fdlNwbGl0KzFdICs9IGRlbHRh
OwotICAgICAgICB9Ci0gICAgICAgIGlmKG1faFNwbGl0ICE9IC0xICkKLSAgICAgICAgewotICAg
ICAgICAgICAgaW50IGRlbHRhID0gbV9oU3BsaXRQb3MgLSBfeTsKLSAgICAgICAgICAgIG1fZ3Jp
ZERlbHRhWzBdW21faFNwbGl0XSAtPSBkZWx0YTsKLSAgICAgICAgICAgIG1fZ3JpZERlbHRhWzBd
W21faFNwbGl0KzFdICs9IGRlbHRhOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyB0
aGlzIGp1c3Qgc2NoZWR1bGVzIHRoZSByZWxheW91dAotICAgICAgICAvLyBpbXBvcnRhbnQsIG90
aGVyd2lzZSB0aGUgbW92aW5nIGluZGljYXRvciBpcyBub3QgY29ycmVjdGx5IGVyYXNlZAotICAg
ICAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgZWxzZSBpZiAobV9y
ZXNpemluZyB8fCBldnQtPnR5cGUoKSA9PSBtb3VzZXVwRXZlbnQpIHsKLSAgICAgICAgRnJhbWVW
aWV3ICp2ID0gY2FudmFzKCktPnZpZXcoKTsgICAgICAgIAotICAgICAgICB2LT5kaXNhYmxlRmx1
c2hEcmF3aW5nKCk7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCA9IHYtPmxvY2tE
cmF3aW5nRm9jdXMoKTsKLSAgICAgICAgCi0gICAgICAgIEludFJlY3Qgcih4UG9zKCksIHlQb3Mo
KSwgd2lkdGgoKSwgaGVpZ2h0KCkpOwotICAgICAgICBjb25zdCBpbnQgckJvcmQgPSAzOwotICAg
ICAgICBpbnQgc3cgPSBlbGVtZW50KCktPmJvcmRlcigpOwotICAgICAgICBpbnQgcCA9IG1fcmVz
aXppbmcgPyAobV92U3BsaXQgPiAtMSA/IF94IDogX3kpIDogLTE7Ci0gICAgICAgIGNvbnN0IFJH
QkEzMiBncmV5UXVhcnRlck9wYWNpdHkgPSAweDQwQTBBMEEwOwotICAgICAgICBpZiAobV92U3Bs
aXQgPiAtMSkgewotICAgICAgICAgICAgaWYgKG1fb2xkcG9zID49IDApCi0gICAgICAgICAgICAg
ICAgdi0+dXBkYXRlQ29udGVudHMoSW50UmVjdChtX29sZHBvcyArIHN3LzIgLSByQm9yZCwgci55
KCksIDIgKiByQm9yZCwgci5oZWlnaHQoKSksIHRydWUpOwotICAgICAgICAgICAgaWYgKHAgPj0g
MCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFBlbihQZW46Ok5vUGVuKTsKLSAgICAg
ICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoZ3JleVF1YXJ0ZXJPcGFjaXR5KTsKLSAg
ICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3UmVjdChJbnRSZWN0KHAgKyBzdy8yIC0gckJvcmQs
IHIueSgpLCAyICogckJvcmQsIHIuaGVpZ2h0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX29sZHBvcyA+PSAwKQotICAgICAgICAgICAgICAg
IHYtPnVwZGF0ZUNvbnRlbnRzKEludFJlY3Qoci54KCksIG1fb2xkcG9zICsgc3cvMiAtIHJCb3Jk
LCByLndpZHRoKCksIDIgKiByQm9yZCksIHRydWUpOwotICAgICAgICAgICAgaWYgKHAgPj0gMCkg
ewotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFBlbihQZW46Ok5vUGVuKTsKLSAgICAgICAg
ICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoZ3JleVF1YXJ0ZXJPcGFjaXR5KTsKLSAgICAg
ICAgICAgICAgICBjb250ZXh0LT5kcmF3UmVjdChJbnRSZWN0KHIueCgpLCBwICsgc3cvMiAtIHJC
b3JkLCByLndpZHRoKCksIDIgKiByQm9yZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgICAgIG1fb2xkcG9zID0gcDsKLQotICAgICAgICB2LT51bmxvY2tEcmF3aW5nRm9jdXMoY29u
dGV4dCk7Ci0gICAgICAgIHYtPmVuYWJsZUZsdXNoRHJhd2luZygpOwotICAgIH0KLSAgICAKLSAg
ICByZXR1cm4gcmVzOwotfQotCi12b2lkIFJlbmRlckZyYW1lU2V0OjpzZXRSZXNpemluZyhib29s
IGUpCi17Ci0gICAgbV9yZXNpemluZyA9IGU7Ci0gICAgZm9yIChSZW5kZXJPYmplY3QqIHAgPSBw
YXJlbnQoKTsgcDsgcCA9IHAtPnBhcmVudCgpKQotICAgICAgICBpZiAocC0+aXNGcmFtZVNldCgp
KQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRnJhbWVTZXQqPihwKS0+bV9jbGllbnRS
ZXNpemluZyA9IG1fcmVzaXppbmc7Ci0gICAgY2FudmFzKCktPnZpZXcoKS0+c2V0UmVzaXppbmdG
cmFtZVNldChlID8gZWxlbWVudCgpIDogMCk7Ci19Ci0KLWJvb2wgUmVuZGVyRnJhbWVTZXQ6OmNh
blJlc2l6ZSggaW50IF94LCBpbnQgX3kgKQotewotICAgIC8vIGlmIHdlIGhhdmVuJ3QgcmVjZWl2
ZWQgYSBsYXlvdXQsIHRoZW4gdGhlIGdyaWRMYXlvdXQgZG9lc24ndCBjb250YWluIHVzZWZ1bCBk
YXRhIHlldAotICAgIGlmIChuZWVkc0xheW91dCgpIHx8ICFtX2dyaWRMYXlvdXRbMF0gfHwgIW1f
Z3JpZExheW91dFsxXSApIHJldHVybiBmYWxzZTsKLQotICAgIC8vIGNoZWNrIGlmIHdlJ3JlIG92
ZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGJvdW5kYXJ5Ci0gICAgaW50IHBvcyA9IG1fZ3Jp
ZExheW91dFsxXVswXTsKLSAgICBmb3IoaW50IGMgPSAxOyBjIDwgZWxlbWVudCgpLT50b3RhbENv
bHMoKTsgYysrKQotICAgICAgICBpZihfeCA+PSBwb3MgJiYgX3ggPD0gcG9zK2VsZW1lbnQoKS0+
Ym9yZGVyKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHBvcyA9IG1fZ3JpZExh
eW91dFswXVswXTsKLSAgICBmb3IoaW50IHIgPSAxOyByIDwgZWxlbWVudCgpLT50b3RhbFJvd3Mo
KTsgcisrKQotICAgICAgICBpZiggX3kgPj0gcG9zICYmIF95IDw9IHBvcytlbGVtZW50KCktPmJv
cmRlcigpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlckZyYW1lU2V0OjpkdW1wKFFUZXh0U3RyZWFt
ICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kKSBjb25zdAotewotICAqc3RyZWFtIDw8ICIg
dG90YWxyb3dzPSIgPDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsKLSAgKnN0cmVhbSA8PCAiIHRv
dGFsY29scz0iIDw8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7Ci0KLSAgdW5zaWduZWQgaTsKLSAg
Zm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCllbGVtZW50KCktPnRvdGFsUm93cygpOyBpKyspCi0g
ICAgKnN0cmVhbSA8PCAiIGhTcGxpdHZhcigiIDw8IGkgPDwgIik9IiA8PCBtX2hTcGxpdFZhcltp
XTsKLQotICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKWVsZW1lbnQoKS0+dG90YWxDb2xzKCk7
IGkrKykKLSAgICAqc3RyZWFtIDw8ICIgdlNwbGl0dmFyKCIgPDwgaSA8PCAiKT0iIDw8IG1fdlNw
bGl0VmFyW2ldOwotCi0gIFJlbmRlckNvbnRhaW5lcjo6ZHVtcChzdHJlYW0saW5kKTsKLX0KLSNl
bmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVJlbmRlclBhcnQ6OlJl
bmRlclBhcnQoSFRNTEVsZW1lbnQqIG5vZGUpCi0gICAgOiBSZW5kZXJXaWRnZXQobm9kZSksIG1f
ZnJhbWUoMCkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1dGVzCi0gICAgc2V0
SW5saW5lKGZhbHNlKTsKLX0KLQotUmVuZGVyUGFydDo6flJlbmRlclBhcnQoKQotewotICAgIC8v
IFNpbmNlIGRlcmVmIGVuZHMgdXAgY2FsbGluZyBzZXRXaWRnZXQgYmFjayBvbiB1cywgbmVlZCB0
byBtYWtlIHN1cmUKLSAgICAvLyB0aGF0IHdpZGdldCBpcyBhbHJlYWR5IDAgc28gaXQgd29uJ3Qg
ZG8gYW55IHdvcmsuCi0gICAgV2lkZ2V0KiB3aWRnZXQgPSBtX3dpZGdldDsKLSAgICBtX3dpZGdl
dCA9IDA7Ci0gICAgaWYgKHdpZGdldCAmJiB3aWRnZXQtPmlzRnJhbWVWaWV3KCkpCi0gICAgICAg
IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHdpZGdldCktPmRlcmVmKCk7Ci0gICAgZWxzZQotICAg
ICAgICBkZWxldGUgd2lkZ2V0OwotCi0gICAgc2V0RnJhbWUoMCk7Ci19Ci0KLXZvaWQgUmVuZGVy
UGFydDo6c2V0RnJhbWUoRnJhbWUqIGZyYW1lKQotewotICAgIGlmIChmcmFtZSA9PSBtX2ZyYW1l
KQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKG1fZnJhbWUpCi0gICAgICAgIG1fZnJhbWUtPmRp
c2Nvbm5lY3RPd25lclJlbmRlcmVyKCk7Ci0gICAgbV9mcmFtZSA9IGZyYW1lOwotfQotCi12b2lk
IFJlbmRlclBhcnQ6OnNldFdpZGdldChXaWRnZXQqIHdpZGdldCkKLXsKLSAgICBpZiAod2lkZ2V0
ICE9IG1fd2lkZ2V0KSB7Ci0gICAgICAgIGlmICh3aWRnZXQgJiYgd2lkZ2V0LT5pc0ZyYW1lVmll
dygpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4od2lkZ2V0KS0+cmVmKCk7
Ci0gICAgICAgIFJlbmRlcldpZGdldDo6c2V0V2lkZ2V0KHdpZGdldCk7Ci0KLSAgICAgICAgc2V0
TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhl
IHNjcm9sbGJhcnMgYXJlIHNldCBjb3JyZWN0bHkgZm9yIHJlc3RvcmUKLSAgICAgICAgLy8gIyMj
IGZpbmQgYmV0dGVyIGZpeAotICAgICAgICB2aWV3Q2xlYXJlZCgpOwotICAgIH0KLX0KLQotdm9p
ZCBSZW5kZXJQYXJ0Ojp2aWV3Q2xlYXJlZCgpCi17Ci19Ci0KLXZvaWQgUmVuZGVyUGFydDo6ZGVs
ZXRlV2lkZ2V0KCkKLXsKLSAgICBpZiAobV93aWRnZXQgJiYgbV93aWRnZXQtPmlzRnJhbWVWaWV3
KCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fd2lkZ2V0KS0+ZGVyZWYoKTsK
LSAgICBlbHNlCi0gICAgICAgIGRlbGV0ZSBtX3dpZGdldDsKLX0KLQotLyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8KLQotUmVuZGVyRnJhbWU6OlJlbmRlckZyYW1lKEhUTUxGcmFtZUVs
ZW1lbnQqIGZyYW1lKQotICAgIDogUmVuZGVyUGFydChmcmFtZSkKLXsKLSAgICBzZXRJbmxpbmUo
ZmFsc2UpOwotfQotCi12b2lkIFJlbmRlckZyYW1lOjp2aWV3Q2xlYXJlZCgpCi17Ci0gICAgaWYg
KGVsZW1lbnQoKSAmJiBtX3dpZGdldCAmJiBtX3dpZGdldC0+aXNGcmFtZVZpZXcoKSkgewotICAg
ICAgICBGcmFtZVZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3dpZGdldCk7
Ci0gICAgICAgIEhUTUxGcmFtZVNldEVsZW1lbnQqIGZyYW1lU2V0ID0gc3RhdGljX2Nhc3Q8SFRN
TEZyYW1lU2V0RWxlbWVudCAqPihlbGVtZW50KCktPnBhcmVudE5vZGUoKSk7Ci0gICAgICAgIGJv
b2wgaGFzQm9yZGVyID0gZWxlbWVudCgpLT5tX2ZyYW1lQm9yZGVyICYmIGZyYW1lU2V0LT5mcmFt
ZUJvcmRlcigpOwotICAgICAgICBpbnQgbWFyZ2ludyA9IGVsZW1lbnQoKS0+bV9tYXJnaW5XaWR0
aDsKLSAgICAgICAgaW50IG1hcmdpbmggPSBlbGVtZW50KCktPm1fbWFyZ2luSGVpZ2h0OwotCi0g
ICAgICAgIHZpZXctPnNldEhhc0JvcmRlcihoYXNCb3JkZXIpOwotICAgICAgICBpZiAobWFyZ2lu
dyAhPSAtMSkKLSAgICAgICAgICAgIHZpZXctPnNldE1hcmdpbldpZHRoKG1hcmdpbncpOwotICAg
ICAgICBpZiAobWFyZ2luaCAhPSAtMSkKLSAgICAgICAgICAgIHZpZXctPnNldE1hcmdpbkhlaWdo
dChtYXJnaW5oKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
LwotCiBSZW5kZXJQYXJ0T2JqZWN0OjpSZW5kZXJQYXJ0T2JqZWN0KEhUTUxFbGVtZW50KiBlbGVt
ZW50KQogICAgIDogUmVuZGVyUGFydChlbGVtZW50KQogewpAQCAtNjczLDcgKzQ4LDcgQEAgUmVu
ZGVyUGFydE9iamVjdDo6UmVuZGVyUGFydE9iamVjdChIVE1MRQogICAgIG1faGFzRmFsbGJhY2tD
b250ZW50ID0gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGlzVVJMQWxsb3dlZChXZWJDb3JlOjpE
b2N1bWVudCAqZG9jLCBjb25zdCBTdHJpbmcgJnVybCkKK3N0YXRpYyBib29sIGlzVVJMQWxsb3dl
ZChEb2N1bWVudCAqZG9jLCBjb25zdCBTdHJpbmcgJnVybCkKIHsKICAgICBLVVJMIG5ld1VSTChk
b2MtPmNvbXBsZXRlVVJMKHVybC5kZXByZWNhdGVkU3RyaW5nKCkpKTsKICAgICBuZXdVUkwuc2V0
UmVmKERlcHJlY2F0ZWRTdHJpbmc6Om51bGwpOwpAQCAtNzI2LDIxICsxMDEsMjEgQEAgdm9pZCBS
ZW5kZXJQYXJ0T2JqZWN0Ojp1cGRhdGVXaWRnZXQoKQogICBTdHJpbmcgc2VydmljZVR5cGU7CiAg
IFZlY3RvcjxTdHJpbmc+IHBhcmFtTmFtZXM7CiAgIFZlY3RvcjxTdHJpbmc+IHBhcmFtVmFsdWVz
OwotICBGcmFtZSAqZnJhbWUgPSBtX3ZpZXctPmZyYW1lKCk7CisgIEZyYW1lKiBmcmFtZSA9IG1f
dmlldy0+ZnJhbWUoKTsKIAogICBzZXROZWVkc0xheW91dEFuZE1pbk1heFJlY2FsYygpOwogCiAg
IGlmIChlbGVtZW50KCktPmhhc1RhZ05hbWUob2JqZWN0VGFnKSkgewogCi0gICAgICBIVE1MT2Jq
ZWN0RWxlbWVudCAqbyA9IHN0YXRpY19jYXN0PEhUTUxPYmplY3RFbGVtZW50ICo+KGVsZW1lbnQo
KSk7CisgICAgICBIVE1MT2JqZWN0RWxlbWVudCogbyA9IHN0YXRpY19jYXN0PEhUTUxPYmplY3RF
bGVtZW50Kj4oZWxlbWVudCgpKTsKIAogICAgICAgaWYgKCFvLT5pc0NvbXBsZXRlKCkpCiAgICAg
ICAgIHJldHVybjsKICAgICAgIC8vIENoZWNrIGZvciBhIGNoaWxkIEVNQkVEIHRhZy4KICAgICAg
IEhUTUxFbWJlZEVsZW1lbnQqIGVtYmVkID0gMDsKLSAgICAgIGZvciAoTm9kZSAqY2hpbGQgPSBv
LT5maXJzdENoaWxkKCk7IGNoaWxkOyApIHsKKyAgICAgIGZvciAoTm9kZSogY2hpbGQgPSBvLT5m
aXJzdENoaWxkKCk7IGNoaWxkOykgewogICAgICAgICAgIGlmIChjaGlsZC0+aGFzVGFnTmFtZShl
bWJlZFRhZykpIHsKLSAgICAgICAgICAgICAgZW1iZWQgPSBzdGF0aWNfY2FzdDxIVE1MRW1iZWRF
bGVtZW50ICo+KCBjaGlsZCApOworICAgICAgICAgICAgICBlbWJlZCA9IHN0YXRpY19jYXN0PEhU
TUxFbWJlZEVsZW1lbnQqPihjaGlsZCk7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg
IH0gZWxzZSBpZiAoY2hpbGQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSkKICAgICAgICAgICAgICAg
Y2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsgICAgICAgICAvLyBEb24ndCBkZXNjZW5kIGlu
dG8gbmVzdGVkIE9CSkVDVCB0YWdzCkBAIC04NDEsNyArMjE2LDcgQEAgdm9pZCBSZW5kZXJQYXJ0
T2JqZWN0Ojp1cGRhdGVXaWRnZXQoKQogICAgICAgaWYgKCFzdWNjZXNzICYmIG1faGFzRmFsbGJh
Y2tDb250ZW50KQogICAgICAgICAgIG8tPnJlbmRlckZhbGxiYWNrQ29udGVudCgpOwogICB9IGVs
c2UgaWYgKGVsZW1lbnQoKS0+aGFzVGFnTmFtZShlbWJlZFRhZykpIHsKLSAgICAgIEhUTUxFbWJl
ZEVsZW1lbnQgKm8gPSBzdGF0aWNfY2FzdDxIVE1MRW1iZWRFbGVtZW50ICo+KGVsZW1lbnQoKSk7
CisgICAgICBIVE1MRW1iZWRFbGVtZW50ICpvID0gc3RhdGljX2Nhc3Q8SFRNTEVtYmVkRWxlbWVu
dCo+KGVsZW1lbnQoKSk7CiAgICAgICB1cmwgPSBvLT51cmw7CiAgICAgICBzZXJ2aWNlVHlwZSA9
IG8tPnNlcnZpY2VUeXBlOwogCkBAIC04NjIsMTMgKzIzNywxMyBAQCB2b2lkIFJlbmRlclBhcnRP
YmplY3Q6OnVwZGF0ZVdpZGdldCgpCiAgICAgICBmcmFtZS0+cmVxdWVzdE9iamVjdCh0aGlzLCB1
cmwsIG8tPmdldEF0dHJpYnV0ZShuYW1lQXR0ciksIHNlcnZpY2VUeXBlLCBwYXJhbU5hbWVzLCBw
YXJhbVZhbHVlcyk7CiAgIH0gZWxzZSB7CiAgICAgICBhc3NlcnQoZWxlbWVudCgpLT5oYXNUYWdO
YW1lKGlmcmFtZVRhZykpOwotICAgICAgSFRNTElGcmFtZUVsZW1lbnQgKm8gPSBzdGF0aWNfY2Fz
dDxIVE1MSUZyYW1lRWxlbWVudCAqPihlbGVtZW50KCkpOworICAgICAgSFRNTElGcmFtZUVsZW1l
bnQqIG8gPSBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+KGVsZW1lbnQoKSk7CiAgICAg
ICB1cmwgPSBvLT5tX1VSTDsKICAgICAgIGlmICghaXNVUkxBbGxvd2VkKGRvY3VtZW50KCksIHVy
bCkpCiAgICAgICAgICAgcmV0dXJuOwogICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCiAgICAgICAg
ICAgdXJsID0gImFib3V0OmJsYW5rIjsKLSAgICAgIEZyYW1lVmlldyAqdiA9IHN0YXRpY19jYXN0
PEZyYW1lVmlldyAqPihtX3ZpZXcpOworICAgICAgRnJhbWVWaWV3KiB2ID0gc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4obV92aWV3KTsKICAgICAgIHYtPmZyYW1lKCktPnJlcXVlc3RGcmFtZSh0aGlz
LCB1cmwsIG8tPm1fbmFtZSk7CiAgIH0KIH0KQEAgLTg5NCw3ICsyNjksNyBAQCB2b2lkIFJlbmRl
clBhcnRPYmplY3Q6OnZpZXdDbGVhcmVkKCkKICAgICAgICAgaW50IG1hcmdpbncgPSAtMTsKICAg
ICAgICAgaW50IG1hcmdpbmggPSAtMTsKICAgICAgICAgaWYgKGVsZW1lbnQoKS0+aGFzVGFnTmFt
ZShpZnJhbWVUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MSUZyYW1lRWxlbWVudCogZnJhbWUgPSBz
dGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCAqPihlbGVtZW50KCkpOworICAgICAgICAgICAg
SFRNTElGcmFtZUVsZW1lbnQqIGZyYW1lID0gc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQq
PihlbGVtZW50KCkpOwogICAgICAgICAgICAgaGFzQm9yZGVyID0gZnJhbWUtPm1fZnJhbWVCb3Jk
ZXI7CiAgICAgICAgICAgICBtYXJnaW53ID0gZnJhbWUtPm1fbWFyZ2luV2lkdGg7CiAgICAgICAg
ICAgICBtYXJnaW5oID0gZnJhbWUtPm1fbWFyZ2luSGVpZ2h0OwpAQCAtOTA5LDMxICsyODQsNCBA
QCB2b2lkIFJlbmRlclBhcnRPYmplY3Q6OnZpZXdDbGVhcmVkKCkKICAgICB9CiB9CiAKLS8vIEZJ
WE1FOiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAgUmVtb3ZlIHRoaXMgb25jZSBXZWJL
aXQga25vd3MgdG8gcHJvcGVybHkgc2NoZWR1bGUKLS8vIGxheW91dHMgdXNpbmcgV2ViQ29yZSB3
aGVuIG9iamVjdHMgcmVzaXplLgotdm9pZCBSZW5kZXJQYXJ0Ojp1cGRhdGVXaWRnZXRQb3NpdGlv
bigpCi17Ci0gICAgaWYgKCFtX3dpZGdldCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlu
dCB4LCB5LCB3aWR0aCwgaGVpZ2h0OwotICAgIGFic29sdXRlUG9zaXRpb24oeCwgeSk7Ci0gICAg
eCArPSBib3JkZXJMZWZ0KCkgKyBwYWRkaW5nTGVmdCgpOwotICAgIHkgKz0gYm9yZGVyVG9wKCkg
KyBwYWRkaW5nVG9wKCk7Ci0gICAgd2lkdGggPSBtX3dpZHRoIC0gYm9yZGVyTGVmdCgpIC0gYm9y
ZGVyUmlnaHQoKSAtIHBhZGRpbmdMZWZ0KCkgLSBwYWRkaW5nUmlnaHQoKTsKLSAgICBoZWlnaHQg
PSBtX2hlaWdodCAtIGJvcmRlclRvcCgpIC0gYm9yZGVyQm90dG9tKCkgLSBwYWRkaW5nVG9wKCkg
LSBwYWRkaW5nQm90dG9tKCk7Ci0gICAgSW50UmVjdCBuZXdCb3VuZHMoeCx5LHdpZHRoLGhlaWdo
dCk7Ci0gICAgaWYgKG5ld0JvdW5kcyAhPSBtX3dpZGdldC0+ZnJhbWVHZW9tZXRyeSgpKSB7Ci0g
ICAgICAgIC8vIFRoZSB3aWRnZXQgY2hhbmdlZCBwb3NpdGlvbnMuICBVcGRhdGUgdGhlIGZyYW1l
IGdlb21ldHJ5LgotICAgICAgICBSZW5kZXJBcmVuYSAqYXJlbmEgPSByZWYoKTsKLSAgICAgICAg
ZWxlbWVudCgpLT5yZWYoKTsKLSAgICAgICAgbV93aWRnZXQtPnNldEZyYW1lR2VvbWV0cnkobmV3
Qm91bmRzKTsKLSAgICAgICAgZWxlbWVudCgpLT5kZXJlZigpOwotICAgICAgICBkZXJlZihhcmVu
YSk7Ci0gICAgICAgIAotICAgICAgICBpZiAobV93aWRnZXQgJiYgbV93aWRnZXQtPmlzRnJhbWVW
aWV3KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3dpZGdldCktPmxh
eW91dCgpOwotICAgIH0KLX0KLQogfQpJbmRleDogcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5jcHAJKHJldmlzaW9u
IDE0MzI1KQorKysgcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNDgwICswLDAgQEAKLS8qKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEhUTUwg
d2lkZ2V0IGZvciBLREUuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtu
b2xsQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGlyayBNdWVsbGVyIChtdWVsbGVy
QGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
Ci0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxh
Y2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInJlbmRlcl9yZXBsYWNlZC5oIgotCi0j
aW5jbHVkZSAiQnJvd3NlckV4dGVuc2lvbi5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiIC8vICMj
IyByZW1vdmUgZGVwZW5kZW5jeQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJFdmVu
dE5hbWVzLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRlICJSZW5kZXJDYW52YXMu
aCIKLSNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsK
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi11c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsKLQot
UmVuZGVyUmVwbGFjZWQ6OlJlbmRlclJlcGxhY2VkKE5vZGUqIG5vZGUpCi0gICAgOiBSZW5kZXJC
b3gobm9kZSkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRyaWJ1dGVzCi0gICAgc2V0
UmVwbGFjZWQodHJ1ZSk7Ci0KLSAgICBtX2ludHJpbnNpY1dpZHRoID0gMzAwOwotICAgIG1faW50
cmluc2ljSGVpZ2h0ID0gMTUwOwotICAgIG1fc2VsZWN0aW9uU3RhdGUgPSBTZWxlY3Rpb25Ob25l
OwotfQotCi1ib29sIFJlbmRlclJlcGxhY2VkOjpzaG91bGRQYWludChQYWludEluZm8mIGksIGlu
dCYgX3R4LCBpbnQmIF90eSkKLXsKLSAgICBpZiAoaS5waGFzZSAhPSBQYWludFBoYXNlRm9yZWdy
b3VuZCAmJiBpLnBoYXNlICE9IFBhaW50UGhhc2VPdXRsaW5lICYmIGkucGhhc2UgIT0gUGFpbnRQ
aGFzZVNlbGZPdXRsaW5lIAotICAgICAgICAmJiBpLnBoYXNlICE9IFBhaW50UGhhc2VTZWxlY3Rp
b24pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghc2hvdWxkUGFpbnRXaXRoaW5S
b290KGkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgIC8vIGlmIHdlJ3Jl
IGludmlzaWJsZSBvciBoYXZlbid0IHJlY2VpdmVkIGEgbGF5b3V0IHlldCwgdGhlbiBqdXN0IGJh
aWwuCi0gICAgaWYgKHN0eWxlKCktPnZpc2liaWxpdHkoKSAhPSBWSVNJQkxFIHx8IG1feSA8PSAg
LTUwMDAwMCkgIHJldHVybiBmYWxzZTsKLQotICAgIGludCB0eCA9IF90eCArIG1feDsKLSAgICBp
bnQgdHkgPSBfdHkgKyBtX3k7Ci0KLSAgICAvLyBFYXJseSBleGl0IGlmIHRoZSBlbGVtZW50IHRv
dWNoZXMgdGhlIGVkZ2VzLgotICAgIGludCB0b3AgPSB0eTsKLSAgICBpbnQgYm90dG9tID0gdHkg
KyBtX2hlaWdodDsKLSAgICBpZiAoaXNTZWxlY3RlZCgpICYmIG1faW5saW5lQm94V3JhcHBlcikg
ewotICAgICAgICBpbnQgc2VsVG9wID0gX3R5ICsgbV9pbmxpbmVCb3hXcmFwcGVyLT5yb290KCkt
PnNlbGVjdGlvblRvcCgpOwotICAgICAgICBpbnQgc2VsQm90dG9tID0gX3R5ICsgc2VsVG9wICsg
bV9pbmxpbmVCb3hXcmFwcGVyLT5yb290KCktPnNlbGVjdGlvbkhlaWdodCgpOwotICAgICAgICB0
b3AgPSBtaW4oc2VsVG9wLCB0b3ApOwotICAgICAgICBib3R0b20gPSBtYXgoc2VsQm90dG9tLCBi
b3R0b20pOwotICAgIH0KLSAgICAKLSAgICBpbnQgb3MgPSAyKm1heGltYWxPdXRsaW5lU2l6ZShp
LnBoYXNlKTsKLSAgICBpZiAodHggPj0gaS5yLnJpZ2h0KCkgKyBvcyB8fCB0eCArIG1fd2lkdGgg
PD0gaS5yLngoKSAtIG9zKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRvcCA+PSBp
LnIuYm90dG9tKCkgKyBvcyB8fCBib3R0b20gPD0gaS5yLnkoKSAtIG9zKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZW5kZXJSZXBsYWNlZDo6
Y2FsY01pbk1heFdpZHRoKCkKLXsKLSAgICBLSFRNTEFzc2VydCggIW1pbk1heEtub3duKCkpOwot
Ci0jaWZkZWYgREVCVUdfTEFZT1VUCi0gICAga2REZWJ1ZyggNjA0MCApIDw8ICJSZW5kZXJSZXBs
YWNlZDo6Y2FsY01pbk1heFdpZHRoKCkga25vd249IiA8PCBtaW5NYXhLbm93bigpIDw8IGVuZGw7
Ci0jZW5kaWYKLQotICAgIGludCB3aWR0aCA9IGNhbGNSZXBsYWNlZFdpZHRoKCkgKyBwYWRkaW5n
TGVmdCgpICsgcGFkZGluZ1JpZ2h0KCkgKyBib3JkZXJMZWZ0KCkgKyBib3JkZXJSaWdodCgpOwot
ICAgIGlmIChzdHlsZSgpLT53aWR0aCgpLmlzUGVyY2VudCgpIHx8IChzdHlsZSgpLT53aWR0aCgp
LmlzQXV0bygpICYmIHN0eWxlKCktPmhlaWdodCgpLmlzUGVyY2VudCgpKSkgewotICAgICAgICBt
X21pbldpZHRoID0gMDsKLSAgICAgICAgbV9tYXhXaWR0aCA9IHdpZHRoOwotICAgIH0gZWxzZQot
ICAgICAgICBtX21pbldpZHRoID0gbV9tYXhXaWR0aCA9IHdpZHRoOwotCi0gICAgc2V0TWluTWF4
S25vd24oKTsKLX0KLQotc2hvcnQgUmVuZGVyUmVwbGFjZWQ6OmxpbmVIZWlnaHQoIGJvb2wsIGJv
b2wgKSBjb25zdAotewotICAgIHJldHVybiBoZWlnaHQoKSttYXJnaW5Ub3AoKSttYXJnaW5Cb3R0
b20oKTsKLX0KLQotc2hvcnQgUmVuZGVyUmVwbGFjZWQ6OmJhc2VsaW5lUG9zaXRpb24oIGJvb2ws
IGJvb2wgKSBjb25zdAotewotICAgIHJldHVybiBoZWlnaHQoKSttYXJnaW5Ub3AoKSttYXJnaW5C
b3R0b20oKTsKLX0KLQotaW50IFJlbmRlclJlcGxhY2VkOjpjYXJldE1pbk9mZnNldCgpIGNvbnN0
IAoteyAKLSAgICByZXR1cm4gMDsgCi19Ci0KLS8vIFJldHVybnMgMSBzaW5jZSBhIHJlcGxhY2Vk
IGVsZW1lbnQgY2FuIGhhdmUgdGhlIGNhcmV0IHBvc2l0aW9uZWQgCi0vLyBhdCBpdHMgYmVnaW5u
aW5nICgwKSwgb3IgYXQgaXRzIGVuZCAoMSkuCi0vLyBOT1RFOiBZZXQsICJzZWxlY3QiIGVsZW1l
bnRzIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgIm9wdGlvbiIgZWxlbWVudHMKLS8vIGFzIGNoaWxk
cmVuLCBzbyB0aGlzICIwIG9yIDEiIGlkZWEgZG9lcyBub3QgcmVhbGx5IGhvbGQgdXAuCi1pbnQg
UmVuZGVyUmVwbGFjZWQ6OmNhcmV0TWF4T2Zmc2V0KCkgY29uc3QgCi17IAotICAgIHJldHVybiAx
OyAKLX0KLQotdW5zaWduZWQgUmVuZGVyUmVwbGFjZWQ6OmNhcmV0TWF4UmVuZGVyZWRPZmZzZXQo
KSBjb25zdAotewotICAgIHJldHVybiAxOyAKLX0KLQotVmlzaWJsZVBvc2l0aW9uIFJlbmRlclJl
cGxhY2VkOjpwb3NpdGlvbkZvckNvb3JkaW5hdGVzKGludCBfeCwgaW50IF95KQotewotICAgIElu
bGluZUJveCAqYm94ID0gaW5saW5lQm94V3JhcHBlcigpOwotICAgIGlmICghYm94KQotICAgICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKGVsZW1lbnQoKSwgMCwgRE9XTlNUUkVBTSk7Ci0KLSAg
ICBSb290SW5saW5lQm94ICpyb290ID0gYm94LT5yb290KCk7Ci0KLSAgICBpbnQgYWJzeCwgYWJz
eTsKLSAgICBjb250YWluaW5nQmxvY2soKS0+YWJzb2x1dGVQb3NpdGlvbihhYnN4LCBhYnN5KTsK
LQotICAgIGludCB0b3AgPSBhYnN5ICsgcm9vdC0+dG9wT3ZlcmZsb3coKTsKLSAgICBpbnQgYm90
dG9tID0gcm9vdC0+bmV4dFJvb3RCb3goKSA/IGFic3kgKyByb290LT5uZXh0Um9vdEJveCgpLT50
b3BPdmVyZmxvdygpIDogYWJzeSArIHJvb3QtPmJvdHRvbU92ZXJmbG93KCk7Ci0KLSAgICBpZiAo
X3kgPCB0b3ApCi0gICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oZWxlbWVudCgpLCBjYXJl
dE1pbk9mZnNldCgpLCBET1dOU1RSRUFNKTsgLy8gY29vcmRpbmF0ZXMgYXJlIGFib3ZlCi0gICAg
Ci0gICAgaWYgKF95ID49IGJvdHRvbSkKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihl
bGVtZW50KCksIGNhcmV0TWF4T2Zmc2V0KCksIERPV05TVFJFQU0pOyAvLyBjb29yZGluYXRlcyBh
cmUgYmVsb3cKLSAgICAKLSAgICBpZiAoZWxlbWVudCgpKSB7Ci0gICAgICAgIGlmIChfeCA8PSBh
YnN4ICsgeFBvcygpICsgKHdpZHRoKCkgLyAyKSkKLSAgICAgICAgICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oZWxlbWVudCgpLCAwLCBET1dOU1RSRUFNKTsKLQotICAgICAgICByZXR1cm4gVmlz
aWJsZVBvc2l0aW9uKGVsZW1lbnQoKSwgMSwgRE9XTlNUUkVBTSk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIFJlbmRlckJveDo6cG9zaXRpb25Gb3JDb29yZGluYXRlcyhfeCwgX3kpOwotfQotCi1JbnRS
ZWN0IFJlbmRlclJlcGxhY2VkOjpzZWxlY3Rpb25SZWN0KCkKLXsKLSAgICBpZiAoIWlzU2VsZWN0
ZWQoKSkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLSAgICBpZiAoIW1faW5saW5lQm94V3Jh
cHBlcikKLSAgICAgICAgLy8gV2UncmUgYSBibG9jay1sZXZlbCByZXBsYWNlZCBlbGVtZW50LiAg
SnVzdCByZXR1cm4gb3VyIG93biBkaW1lbnNpb25zLgotICAgICAgICByZXR1cm4gYWJzb2x1dGVC
b3VuZGluZ0JveFJlY3QoKTsKLQotICAgIFJlbmRlckJsb2NrKiBjYiA9ICBjb250YWluaW5nQmxv
Y2soKTsKLSAgICBpZiAoIWNiKQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotICAgIAotICAg
IFJvb3RJbmxpbmVCb3gqIHJvb3QgPSBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKTsKLSAgICBp
bnQgc2VsZWN0aW9uVG9wID0gcm9vdC0+c2VsZWN0aW9uVG9wKCk7Ci0gICAgaW50IHNlbGVjdGlv
bkhlaWdodCA9IHJvb3QtPnNlbGVjdGlvbkhlaWdodCgpOwotICAgIGludCBzZWxlY3Rpb25MZWZ0
ID0geFBvcygpOwotICAgIGludCBzZWxlY3Rpb25SaWdodCA9IHhQb3MoKSArIHdpZHRoKCk7Ci0g
ICAgCi0gICAgaW50IGFic3gsIGFic3k7Ci0gICAgY2ItPmFic29sdXRlUG9zaXRpb24oYWJzeCwg
YWJzeSk7Ci0gICAgaWYgKGNiLT5oYXNPdmVyZmxvd0NsaXAoKSkKLSAgICAgICAgY2ItPmxheWVy
KCktPnN1YnRyYWN0U2Nyb2xsT2Zmc2V0KGFic3gsIGFic3kpOwotCi0gICAgcmV0dXJuIEludFJl
Y3Qoc2VsZWN0aW9uTGVmdCArIGFic3gsIHNlbGVjdGlvblRvcCArIGFic3ksIHNlbGVjdGlvblJp
Z2h0IC0gc2VsZWN0aW9uTGVmdCwgc2VsZWN0aW9uSGVpZ2h0KTsKLX0KLQotdm9pZCBSZW5kZXJS
ZXBsYWNlZDo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUgcykKLXsKLSAgICBtX3Nl
bGVjdGlvblN0YXRlID0gczsKLSAgICBpZiAobV9pbmxpbmVCb3hXcmFwcGVyKSB7Ci0gICAgICAg
IFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBtX2lubGluZUJveFdyYXBwZXItPnJvb3QoKTsKLSAgICAg
ICAgaWYgKGxpbmUpCi0gICAgICAgICAgICBsaW5lLT5zZXRIYXNTZWxlY3RlZENoaWxkcmVuKGlz
U2VsZWN0ZWQoKSk7Ci0gICAgfQotICAgIAotICAgIGNvbnRhaW5pbmdCbG9jaygpLT5zZXRTZWxl
Y3Rpb25TdGF0ZShzKTsKLX0KLQotYm9vbCBSZW5kZXJSZXBsYWNlZDo6aXNTZWxlY3RlZCgpCi17
Ci0gICAgU2VsZWN0aW9uU3RhdGUgcyA9IHNlbGVjdGlvblN0YXRlKCk7Ci0gICAgaWYgKHMgPT0g
U2VsZWN0aW9uTm9uZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzID09IFNlbGVj
dGlvbkluc2lkZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpbnQgc2VsZWN0aW9uU3Rh
cnQsIHNlbGVjdGlvbkVuZDsKLSAgICBSZW5kZXJPYmplY3Q6OnNlbGVjdGlvblN0YXJ0RW5kKHNl
bGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwotICAgIGlmIChzID09IFNlbGVjdGlvblN0YXJ0
KQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uU3RhcnQgPT0gMDsKLSAgICAgICAgCi0gICAgaW50
IGVuZCA9IGVsZW1lbnQoKS0+aGFzQ2hpbGROb2RlcygpID8gZWxlbWVudCgpLT5jaGlsZE5vZGVD
b3VudCgpIDogMTsKLSAgICBpZiAocyA9PSBTZWxlY3Rpb25FbmQpCi0gICAgICAgIHJldHVybiBz
ZWxlY3Rpb25FbmQgPT0gZW5kOwotICAgIGlmIChzID09IFNlbGVjdGlvbkJvdGgpCi0gICAgICAg
IHJldHVybiBzZWxlY3Rpb25TdGFydCA9PSAwICYmIHNlbGVjdGlvbkVuZCA9PSBlbmQ7Ci0gICAg
ICAgIAotICAgIEFTU0VSVCgwKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNvbG9yIFJlbmRl
clJlcGxhY2VkOjpzZWxlY3Rpb25Db2xvcihHcmFwaGljc0NvbnRleHQqIHApIGNvbnN0Ci17Ci0g
ICAgQ29sb3IgY29sb3IgPSBSZW5kZXJCb3g6OnNlbGVjdGlvbkNvbG9yKHApOwotICAgICAgICAg
Ci0gICAgLy8gTGltaXQgdGhlIG9wYWNpdHkgc28gdGhhdCBubyB1c2VyLXNwZWNpZmllZCBzZWxl
Y3Rpb24gY29sb3IgY2FuIG9ic2N1cmUgc2VsZWN0ZWQgaW1hZ2VzLgotICAgIGlmIChjb2xvci5h
bHBoYSgpID4gc2VsZWN0aW9uQ29sb3JJbWFnZU92ZXJsYXlBbHBoYSkKLSAgICAgICAgY29sb3Ig
PSBDb2xvcihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpLCBzZWxlY3Rp
b25Db2xvckltYWdlT3ZlcmxheUFscGhhKTsKLQotICAgIHJldHVybiBjb2xvcjsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVuZGVyV2lkZ2V0OjpSZW5kZXJXaWRnZXQoTm9kZSog
bm9kZSkKLSAgICAgIDogUmVuZGVyUmVwbGFjZWQobm9kZSkKLSAgICAgICwgbV93aWRnZXQoMCkK
LSAgICAgICwgbV9yZWZDb3VudCgwKQotewotICAgIC8vIGEgcmVwbGFjZWQgZWxlbWVudCBkb2Vz
bid0IHN1cHBvcnQgYmVpbmcgYW5vbnltb3VzCi0gICAgQVNTRVJUKG5vZGUpOwotICAgIG1fdmll
dyA9IG5vZGUtPmRvY3VtZW50KCktPnZpZXcoKTsKLQotICAgIGNhbnZhcygpLT5hZGRXaWRnZXQo
dGhpcyk7Ci0KLSAgICAvLyB0aGlzIGlzIG5vIHJlYWwgcmVmZXJlbmNlIGNvdW50aW5nLCBpdHMg
anVzdCB0aGVyZQotICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCBkZWxldGVkIHdo
aWxlIHdlJ3JlIHJlY3Vyc2VkCi0gICAgLy8gaW4gYW4gZXZlbnRGaWx0ZXIgb2YgdGhlIHdpZGdl
dAotICAgIHJlZigpOwotfQotCi12b2lkIFJlbmRlcldpZGdldDo6ZGVzdHJveSgpCi17Ci0gICAg
Ly8gV2UgY2FuJ3QgY2FsbCB0aGUgYmFzZSBjbGFzcydzIGRlc3Ryb3kgYmVjYXVzZSB3ZSBkb24n
dAotICAgIC8vIHdhbnQgdG8gdW5jb25kaXRpb25hbGx5IGRlbGV0ZSBvdXJzZWx2ZXMgKHdlJ3Jl
IHJlZi1jb3VudGVkKS4KLSAgICAvLyBTbyB0aGUgY29kZSBiZWxvdyBpbmNsdWRlcyBjb3BpZWQg
YW5kIHBhc3RlZCBjb250ZW50cyBvZgotICAgIC8vIGJvdGggUmVuZGVyQm94OjpkZXN0cm95KCkg
YW5kIFJlbmRlck9iamVjdDo6ZGVzdHJveSgpLgotICAgIC8vIEZpeCBvcmlnaW5hbGx5IG1hZGUg
Zm9yIDxyZGFyOi8vcHJvYmxlbS80MjI4ODE4Pi4KLQotICAgIGlmIChSZW5kZXJDYW52YXMgKmMg
PSBjYW52YXMoKSkKLSAgICAgICAgYy0+cmVtb3ZlV2lkZ2V0KHRoaXMpOwotCi0gICAgcmVtb3Zl
KCk7Ci0KLSAgICBpZiAobV93aWRnZXQpIHsKLSAgICAgICAgaWYgKG1fdmlldykKLSAgICAgICAg
ICAgIG1fdmlldy0+cmVtb3ZlQ2hpbGQobV93aWRnZXQpOwotICAgICAgICBtX3dpZGdldC0+c2V0
Q2xpZW50KDApOwotICAgIH0KLQotICAgIFJlbmRlckxheWVyKiBsYXllciA9IG1fbGF5ZXI7Ci0g
ICAgUmVuZGVyQXJlbmEqIGFyZW5hID0gcmVuZGVyQXJlbmEoKTsKLSAgICAKLSAgICBpZiAobGF5
ZXIpCi0gICAgICAgIGxheWVyLT5jbGVhckNsaXBSZWN0KCk7Ci0gICAgCi0gICAgc2V0Tm9kZSgw
KTsKLSAgICBkZXJlZihhcmVuYSk7Ci0gICAgCi0gICAgaWYgKGxheWVyKQotICAgICAgICBsYXll
ci0+ZGVzdHJveShhcmVuYSk7Ci19Ci0KLVJlbmRlcldpZGdldDo6flJlbmRlcldpZGdldCgpCi17
Ci0gICAgS0hUTUxBc3NlcnQobV9yZWZDb3VudCA8PSAwKTsKLSAgICBkZWxldGVXaWRnZXQoKTsK
LX0KLQotdm9pZCBSZW5kZXJXaWRnZXQ6OnJlc2l6ZVdpZGdldChXaWRnZXQqIHdpZGdldCwgaW50
IHcsIGludCBoKQotewotICAgIGlmIChlbGVtZW50KCkgJiYgKHdpZGdldC0+d2lkdGgoKSAhPSB3
IHx8IHdpZGdldC0+aGVpZ2h0KCkgIT0gaCkpIHsKLSAgICAgICAgUmVuZGVyQXJlbmEgKmFyZW5h
ID0gcmVmKCk7Ci0gICAgICAgIGVsZW1lbnQoKS0+cmVmKCk7Ci0gICAgICAgIHdpZGdldC0+cmVz
aXplKHcsIGgpOwotICAgICAgICBlbGVtZW50KCktPmRlcmVmKCk7Ci0gICAgICAgIGRlcmVmKGFy
ZW5hKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0OjpzZXRXaWRnZXQoV2lkZ2V0KiB3
aWRnZXQpCi17Ci0gICAgaWYgKHdpZGdldCAhPSBtX3dpZGdldCkgewotICAgICAgICBpZiAobV93
aWRnZXQpIHsKLSAgICAgICAgICAgIG1fd2lkZ2V0LT5zZXRDbGllbnQoMCk7Ci0gICAgICAgICAg
ICBkZWxldGVXaWRnZXQoKTsKLSAgICAgICAgfQotICAgICAgICBtX3dpZGdldCA9IHdpZGdldDsK
LSAgICAgICAgaWYgKG1fd2lkZ2V0KSB7Ci0gICAgICAgICAgICBtX3dpZGdldC0+c2V0Q2xpZW50
KHRoaXMpOwotICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZWNlaXZlZCBhIGxheW91
dCwgYXBwbHkgdGhlIGNhbGN1bGF0ZWQgc3BhY2UgdG8gdGhlCi0gICAgICAgICAgICAvLyB3aWRn
ZXQgaW1tZWRpYXRlbHksIGJ1dCB3ZSBoYXZlIHRvIGhhdmUgcmVhbGx5IGJlZW4gZnVsbCBjb25z
dHJ1Y3RlZCAod2l0aCBhIG5vbi1udWxsCi0gICAgICAgICAgICAvLyBzdHlsZSBwb2ludGVyKS4K
LSAgICAgICAgICAgIGlmICghbmVlZHNMYXlvdXQoKSAmJiBzdHlsZSgpKQotICAgICAgICAgICAg
ICAgIHJlc2l6ZVdpZGdldChtX3dpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgbV93aWR0aCAt
IGJvcmRlckxlZnQoKSAtIGJvcmRlclJpZ2h0KCkgLSBwYWRkaW5nTGVmdCgpIC0gcGFkZGluZ1Jp
Z2h0KCksCi0gICAgICAgICAgICAgICAgICAgIG1faGVpZ2h0IC0gYm9yZGVyVG9wKCkgLSBib3Jk
ZXJCb3R0b20oKSAtIHBhZGRpbmdUb3AoKSAtIHBhZGRpbmdCb3R0b20oKSk7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0UG9zKHhQb3MoKSwgLTUwMDAwMCk7Ci0gICAgICAg
ICAgICBpZiAoc3R5bGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChzdHlsZSgpLT52aXNpYmls
aXR5KCkgIT0gVklTSUJMRSkKLSAgICAgICAgICAgICAgICAgICAgbV93aWRnZXQtPmhpZGUoKTsK
LSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1fd2lkZ2V0LT5zaG93
KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3ZpZXctPmFkZENoaWxkKG1fd2lkZ2V0
LCAtNTAwMDAwLCAwKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJXaWRnZXQ6
OmxheW91dCgpCi17Ci0gICAgS0hUTUxBc3NlcnQobmVlZHNMYXlvdXQoKSk7Ci0gICAgS0hUTUxB
c3NlcnQobWluTWF4S25vd24oKSk7Ci0KLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19Ci0K
LXZvaWQgUmVuZGVyV2lkZ2V0OjpzZW5kQ29uc3VtZWRNb3VzZVVwKFdpZGdldCopCi17Ci0gICAg
UmVuZGVyQXJlbmEqIGFyZW5hID0gcmVmKCk7Ci0gICAgRXZlbnRUYXJnZXROb2RlQ2FzdChub2Rl
KCkpLT5kaXNwYXRjaFNpbXVsYXRlZE1vdXNlRXZlbnQobW91c2V1cEV2ZW50KTsKLSAgICBkZXJl
ZihhcmVuYSk7Ci19Ci0KLXZvaWQgUmVuZGVyV2lkZ2V0OjpzZXRTdHlsZShSZW5kZXJTdHlsZSAq
X3N0eWxlKQotewotICAgIFJlbmRlclJlcGxhY2VkOjpzZXRTdHlsZShfc3R5bGUpOwotICAgIGlm
IChtX3dpZGdldCkgewotICAgICAgICBtX3dpZGdldC0+c2V0Rm9udChzdHlsZSgpLT5mb250KCkp
OwotICAgICAgICBpZiAoc3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IFZJU0lCTEUpCi0gICAgICAg
ICAgICBtX3dpZGdldC0+aGlkZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX3dpZGdl
dC0+c2hvdygpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJXaWRnZXQ6OnBhaW50KFBhaW50SW5m
byYgaSwgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgaWYgKCFzaG91bGRQYWludChpLCB0eCwgdHkp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICB0eCArPSBtX3g7Ci0gICAgdHkgKz0gbV95OwotCi0g
ICAgaWYgKHNob3VsZFBhaW50QmFja2dyb3VuZE9yQm9yZGVyKCkgJiYgaS5waGFzZSAhPSBQYWlu
dFBoYXNlT3V0bGluZSAmJiBpLnBoYXNlICE9IFBhaW50UGhhc2VTZWxmT3V0bGluZSkgCi0gICAg
ICAgIHBhaW50Qm94RGVjb3JhdGlvbnMoaSwgdHgsIHR5KTsKLQotICAgIGlmICghbV92aWV3IHx8
IGkucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgc3R5bGUoKS0+dmlzaWJpbGl0eSgp
ICE9IFZJU0lCTEUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3dpZGdldCkgewotICAg
ICAgICAvLyBNb3ZlIHRoZSB3aWRnZXQgaWYgbmVjZXNzYXJ5LiAgV2Ugbm9ybWFsbHkgbW92ZSBh
bmQgcmVzaXplIHdpZGdldHMgZHVyaW5nIGxheW91dCwgYnV0IHNvbWV0aW1lcwotICAgICAgICAv
LyB3aWRnZXRzIGNhbiBtb3ZlIHdpdGhvdXQgbGF5b3V0IG9jY3VycmluZyAobW9zdCBub3RhYmx5
IHdoZW4geW91IHNjcm9sbCBhIGRvY3VtZW50IHRoYXQKLSAgICAgICAgLy8gY29udGFpbnMgZml4
ZWQgcG9zaXRpb25lZCBlbGVtZW50cykuCi0gICAgICAgIG1fd2lkZ2V0LT5tb3ZlKHR4ICsgYm9y
ZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKSwgdHkgKyBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3Ao
KSk7Ci0KLSAgICAgICAgLy8gVGVsbCB0aGUgd2lkZ2V0IHRvIHBhaW50IG5vdy4gIFRoaXMgaXMg
dGhlIG9ubHkgdGltZSB0aGUgd2lkZ2V0IGlzIGFsbG93ZWQKLSAgICAgICAgLy8gdG8gcGFpbnQg
aXRzZWxmLiAgVGhhdCB3YXkgaXQgd2lsbCBjb21wb3NpdGUgcHJvcGVybHkgd2l0aCB6LWluZGV4
ZWQgbGF5ZXJzLgotICAgICAgICBtX3dpZGdldC0+cGFpbnQoaS5wLCBpLnIpOwotICAgIH0KLQot
ICAgIC8vIFBhaW50IGEgcGFydGlhbGx5IHRyYW5zcGFyZW50IHdhc2ggb3ZlciBzZWxlY3RlZCB3
aWRnZXRzLgotICAgIGlmIChpc1NlbGVjdGVkKCkgJiYgIWRvY3VtZW50KCktPnByaW50aW5nKCkp
Ci0gICAgICAgIGkucC0+ZmlsbFJlY3Qoc2VsZWN0aW9uUmVjdCgpLCBzZWxlY3Rpb25Db2xvcihp
LnApKTsKLX0KLQotdm9pZCBSZW5kZXJXaWRnZXQ6OmZvY3VzSW4oV2lkZ2V0KikKLXsKLSAgICBS
ZW5kZXJBcmVuYSogYXJlbmEgPSByZWYoKTsKLSAgICBSZWZQdHI8Tm9kZT4gZWxlbSA9IGVsZW1l
bnQoKTsKLSAgICBpZiAoZWxlbSkKLSAgICAgICAgZWxlbS0+ZG9jdW1lbnQoKS0+c2V0Rm9jdXNO
b2RlKGVsZW0pOwotICAgIGRlcmVmKGFyZW5hKTsKLX0KLQotdm9pZCBSZW5kZXJXaWRnZXQ6OmZv
Y3VzT3V0KFdpZGdldCopCi17Ci0gICAgUmVuZGVyQXJlbmEqIGFyZW5hID0gcmVmKCk7Ci0gICAg
UmVmUHRyPE5vZGU+IGVsZW0gPSBlbGVtZW50KCk7Ci0gICAgaWYgKGVsZW0gJiYgZWxlbSA9PSBl
bGVtLT5kb2N1bWVudCgpLT5mb2N1c05vZGUoKSkKLSAgICAgICAgZWxlbS0+ZG9jdW1lbnQoKS0+
c2V0Rm9jdXNOb2RlKDApOwotICAgIGRlcmVmKGFyZW5hKTsKLX0KLQotdm9pZCBSZW5kZXJXaWRn
ZXQ6OnNjcm9sbFRvVmlzaWJsZShXaWRnZXQqIHdpZGdldCkKLXsKLSAgICBpZiAoUmVuZGVyTGF5
ZXIqIGxheWVyID0gZW5jbG9zaW5nTGF5ZXIoKSkKLSAgICAgICAgbGF5ZXItPnNjcm9sbFJlY3RU
b1Zpc2libGUoYWJzb2x1dGVCb3VuZGluZ0JveFJlY3QoKSk7Ci19Ci0KLWJvb2wgUmVuZGVyV2lk
Z2V0Ojppc1Zpc2libGUoV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgcmV0dXJuIHN0eWxlKCktPnZp
c2liaWxpdHkoKSA9PSBWSVNJQkxFOwotfQotCi1FbGVtZW50KiBSZW5kZXJXaWRnZXQ6OmVsZW1l
bnQoV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgTm9kZSogbiA9IG5vZGUoKTsKLSAgICByZXR1cm4g
bi0+aXNFbGVtZW50Tm9kZSgpID8gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG4pIDogMDsKLX0KLQot
dm9pZCBSZW5kZXJXaWRnZXQ6OmRlcmVmKFJlbmRlckFyZW5hICphcmVuYSkKLXsKLSAgICBpZiAo
LS1tX3JlZkNvdW50IDw9IDApCi0gICAgICAgIGFyZW5hRGVsZXRlKGFyZW5hLCB0aGlzKTsKLX0K
LQotdm9pZCBSZW5kZXJXaWRnZXQ6OnVwZGF0ZVdpZGdldFBvc2l0aW9uKCkKLXsKLSAgICBpZiAo
IW1fd2lkZ2V0KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaW50IHgsIHksIHdpZHRoLCBo
ZWlnaHQ7Ci0gICAgYWJzb2x1dGVQb3NpdGlvbih4LCB5KTsKLSAgICB4ICs9IGJvcmRlckxlZnQo
KSArIHBhZGRpbmdMZWZ0KCk7Ci0gICAgeSArPSBib3JkZXJUb3AoKSArIHBhZGRpbmdUb3AoKTsK
LSAgICB3aWR0aCA9IG1fd2lkdGggLSBib3JkZXJMZWZ0KCkgLSBib3JkZXJSaWdodCgpIC0gcGFk
ZGluZ0xlZnQoKSAtIHBhZGRpbmdSaWdodCgpOwotICAgIGhlaWdodCA9IG1faGVpZ2h0IC0gYm9y
ZGVyVG9wKCkgLSBib3JkZXJCb3R0b20oKSAtIHBhZGRpbmdUb3AoKSAtIHBhZGRpbmdCb3R0b20o
KTsKLSAgICBJbnRSZWN0IG5ld0JvdW5kcyh4LHksd2lkdGgsaGVpZ2h0KTsKLSAgICBJbnRSZWN0
IG9sZEJvdW5kcyhtX3dpZGdldC0+ZnJhbWVHZW9tZXRyeSgpKTsKLSAgICBpZiAobmV3Qm91bmRz
ICE9IG9sZEJvdW5kcykgewotICAgICAgICAvLyBUaGUgd2lkZ2V0IGNoYW5nZWQgcG9zaXRpb25z
LiAgVXBkYXRlIHRoZSBmcmFtZSBnZW9tZXRyeS4KLSAgICAgICAgaWYgKGNoZWNrRm9yUmVwYWlu
dER1cmluZ0xheW91dCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJDYW52YXMqIGMgPSBjYW52YXMo
KTsKLSAgICAgICAgICAgIGlmICghYy0+cHJpbnRpbmdNb2RlKCkpIHsKLSAgICAgICAgICAgICAg
ICBjLT5yZXBhaW50Vmlld1JlY3RhbmdsZShvbGRCb3VuZHMpOwotICAgICAgICAgICAgICAgIGMt
PnJlcGFpbnRWaWV3UmVjdGFuZ2xlKG5ld0JvdW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLQotICAgICAgICBSZW5kZXJBcmVuYSAqYXJlbmEgPSByZWYoKTsKLSAgICAgICAgZWxlbWVu
dCgpLT5yZWYoKTsKLSAgICAgICAgbV93aWRnZXQtPnNldEZyYW1lR2VvbWV0cnkobmV3Qm91bmRz
KTsKLSAgICAgICAgZWxlbWVudCgpLT5kZXJlZigpOwotICAgICAgICBkZXJlZihhcmVuYSk7Ci0g
ICAgfQotfQotCi12b2lkIFJlbmRlcldpZGdldDo6c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9u
U3RhdGUgcykgCi17Ci0gICAgaWYgKHNlbGVjdGlvblN0YXRlKCkgIT0gcykgewotICAgICAgICBS
ZW5kZXJSZXBsYWNlZDo6c2V0U2VsZWN0aW9uU3RhdGUocyk7Ci0gICAgICAgIG1fc2VsZWN0aW9u
U3RhdGUgPSBzOwotICAgICAgICBpZiAobV93aWRnZXQpCi0gICAgICAgICAgICBtX3dpZGdldC0+
c2V0SXNTZWxlY3RlZChpc1NlbGVjdGVkKCkpOwotICAgIH0KLX0KLQotdm9pZCBSZW5kZXJXaWRn
ZXQ6OmRlbGV0ZVdpZGdldCgpCi17Ci0gICAgZGVsZXRlIG1fd2lkZ2V0OwotfQotCi19CkluZGV4
OiByZW5kZXJpbmcvUmVuZGVySW1hZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVy
SW1hZ2UuaAkocmV2aXNpb24gMTQzMjUpCisrKyByZW5kZXJpbmcvUmVuZGVySW1hZ2UuaAkod29y
a2luZyBjb3B5KQpAQCAtMjksNyArMjksNyBAQAogCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIK
ICNpbmNsdWRlICJIVE1MRWxlbWVudC5oIgotI2luY2x1ZGUgInJlbmRlcl9yZXBsYWNlZC5oIgor
I2luY2x1ZGUgIlJlbmRlclJlcGxhY2VkLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApJbmRl
eDogcmVuZGVyaW5nL1JlbmRlcldpZGdldC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5k
ZXJXaWRnZXQuaAkocmV2aXNpb24gMTQzMjUpCisrKyByZW5kZXJpbmcvUmVuZGVyV2lkZ2V0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIxLDU4ICsyMSwxMyBAQAogICoKICAqLwogCi0jaWZuZGVmIHJl
bmRlcl9yZXBsYWNlZF9oCi0jZGVmaW5lIHJlbmRlcl9yZXBsYWNlZF9oCisjaWZuZGVmIFJlbmRl
cldpZGdldF9ICisjZGVmaW5lIFJlbmRlcldpZGdldF9ICiAKLSNpbmNsdWRlICJSZW5kZXJCb3gu
aCIKKyNpbmNsdWRlICJSZW5kZXJSZXBsYWNlZC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LWNsYXNzIEZyYW1lVmlldzsKLWNsYXNzIFBvc2l0aW9uOwotY2xhc3MgV2lkZ2V0OwotCi1jbGFz
cyBSZW5kZXJSZXBsYWNlZCA6IHB1YmxpYyBSZW5kZXJCb3gKLXsKLXB1YmxpYzoKLSAgICBSZW5k
ZXJSZXBsYWNlZChOb2RlKik7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUo
KSBjb25zdCB7IHJldHVybiAiUmVuZGVyUmVwbGFjZWQiOyB9Ci0KLSAgICB2aXJ0dWFsIHNob3J0
IGxpbmVIZWlnaHQoYm9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNlKSBj
b25zdDsKLSAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oYm9vbCBmaXJzdExpbmUs
IGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBj
YWxjTWluTWF4V2lkdGgoKTsKLQotICAgIGJvb2wgc2hvdWxkUGFpbnQoUGFpbnRJbmZvJiwgaW50
JiB0eCwgaW50JiB0eSk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0
eCwgaW50IHR5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCBpbnRyaW5zaWNXaWR0aCgpIGNvbnN0
IHsgcmV0dXJuIG1faW50cmluc2ljV2lkdGg7IH0KLSAgICB2aXJ0dWFsIGludCBpbnRyaW5zaWNI
ZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2ludHJpbnNpY0hlaWdodDsgfQotCi0gICAgdm9pZCBz
ZXRJbnRyaW5zaWNXaWR0aChpbnQgdykgeyBtX2ludHJpbnNpY1dpZHRoID0gdzsgfQotICAgIHZv
aWQgc2V0SW50cmluc2ljSGVpZ2h0KGludCBoKSB7IG1faW50cmluc2ljSGVpZ2h0ID0gaDsgfQot
Ci0gICAgdmlydHVhbCBpbnQgY2FyZXRNaW5PZmZzZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGlu
dCBjYXJldE1heE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdW5zaWduZWQgY2FyZXRNYXhS
ZW5kZXJlZE9mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0aW9uIHBvc2l0
aW9uRm9yQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
Y2FuQmVTZWxlY3Rpb25MZWFmKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwg
U2VsZWN0aW9uU3RhdGUgc2VsZWN0aW9uU3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2Fz
dDxTZWxlY3Rpb25TdGF0ZT4obV9zZWxlY3Rpb25TdGF0ZSk7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
c2V0U2VsZWN0aW9uU3RhdGUoU2VsZWN0aW9uU3RhdGUpOwotICAgIHZpcnR1YWwgSW50UmVjdCBz
ZWxlY3Rpb25SZWN0KCk7Ci0gICAgYm9vbCBpc1NlbGVjdGVkKCk7Ci0gICAgdmlydHVhbCBDb2xv
ciBzZWxlY3Rpb25Db2xvcihHcmFwaGljc0NvbnRleHQqKSBjb25zdDsKLQotcHJvdGVjdGVkOgot
ICAgIGludCBtX2ludHJpbnNpY1dpZHRoOwotICAgIGludCBtX2ludHJpbnNpY0hlaWdodDsKLSAg
ICAKLSAgICB1bnNpZ25lZCBtX3NlbGVjdGlvblN0YXRlIDogMzsgLy8gU2VsZWN0aW9uU3RhdGUK
LX07Ci0KLQogY2xhc3MgUmVuZGVyV2lkZ2V0IDogcHVibGljIFJlbmRlclJlcGxhY2VkLCBwdWJs
aWMgV2lkZ2V0Q2xpZW50CiB7CiBwdWJsaWM6CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyRnJhbWUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJGcmFtZS5jcHAJKHJldmlzaW9uIDE0
MzI1KQorKysgcmVuZGVyaW5nL1JlbmRlckZyYW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIs
NjI0ICsyMiwxNyBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0K
ICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJyZW5kZXJfZnJhbWVzLmgiCisjaW5jbHVk
ZSAiUmVuZGVyRnJhbWUuaCIKIAotI2luY2x1ZGUgIkN1cnNvci5oIgotI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5j
bHVkZSAiRnJhbWVUcmVlLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlRleHQuaCIKLSNp
bmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNsdWRlICJodG1sX2Jhc2VpbXBsLmgiCi0j
aW5jbHVkZSAiSFRNTEVtYmVkRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxGcmFtZVNldEVsZW1l
bnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MT2JqZWN0RWxlbWVu
dC5oIgotI2luY2x1ZGUgIkhUTUxQYXJhbUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MVG9rZW5p
emVyLmgiCi0jaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRlICJSZW5kZXJDYW52YXMu
aCIKLSNpbmNsdWRlICJLV1FUZXh0U3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
dXNpbmcgbmFtZXNwYWNlIEV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwog
Ci1SZW5kZXJGcmFtZVNldDo6UmVuZGVyRnJhbWVTZXQoIEhUTUxGcmFtZVNldEVsZW1lbnQgKmZy
YW1lU2V0KQotICAgIDogUmVuZGVyQ29udGFpbmVyKGZyYW1lU2V0KQotewotICAvLyBpbml0IFJl
bmRlck9iamVjdCBhdHRyaWJ1dGVzCi0gICAgc2V0SW5saW5lKGZhbHNlKTsKLQotICBmb3IgKGlu
dCBrID0gMDsgayA8IDI7ICsraykgewotICAgICAgbV9ncmlkTGVuW2tdID0gLTE7Ci0gICAgICBt
X2dyaWREZWx0YVtrXSA9IDA7Ci0gICAgICBtX2dyaWRMYXlvdXRba10gPSAwOwotICB9Ci0KLSAg
bV9yZXNpemluZyA9IG1fY2xpZW50UmVzaXppbmcgPSBmYWxzZTsKLQotICBtX2hTcGxpdCA9IC0x
OwotICBtX3ZTcGxpdCA9IC0xOwotCi0gIG1faFNwbGl0VmFyID0gMDsKLSAgbV92U3BsaXRWYXIg
PSAwOwotfQotCi1SZW5kZXJGcmFtZVNldDo6flJlbmRlckZyYW1lU2V0KCkKLXsKLSAgICBmb3Ig
KGludCBrID0gMDsgayA8IDI7ICsraykgewotICAgICAgICBpZiAobV9ncmlkTGF5b3V0W2tdKSBk
ZWxldGUgW10gbV9ncmlkTGF5b3V0W2tdOwotICAgICAgICBpZiAobV9ncmlkRGVsdGFba10pIGRl
bGV0ZSBbXSBtX2dyaWREZWx0YVtrXTsKLSAgICB9Ci0gIGlmIChtX2hTcGxpdFZhcikKLSAgICAg
IGRlbGV0ZSBbXSBtX2hTcGxpdFZhcjsKLSAgaWYgKG1fdlNwbGl0VmFyKQotICAgICAgZGVsZXRl
IFtdIG1fdlNwbGl0VmFyOwotfQotCi1ib29sIFJlbmRlckZyYW1lU2V0Ojpub2RlQXRQb2ludChO
b2RlSW5mbyYgaW5mbywgaW50IF94LCBpbnQgX3ksIGludCBfdHgsIGludCBfdHksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCi17
Ci0gICAgaWYgKGhpdFRlc3RBY3Rpb24gIT0gSGl0VGVzdEZvcmVncm91bmQpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIGJvb2wgaW5zaWRlID0gUmVuZGVyQ29udGFpbmVyOjpub2RlQXRQ
b2ludChpbmZvLCBfeCwgX3ksIF90eCwgX3R5LCBoaXRUZXN0QWN0aW9uKSB8fCAKLSAgICAgICAg
ICAgICAgICAgIG1fcmVzaXppbmcgfHwgY2FuUmVzaXplKF94LCBfeSk7Ci0gICAgaWYgKGluc2lk
ZSAmJiBlbGVtZW50KCkgJiYgIWVsZW1lbnQoKS0+bm9SZXNpemUoKSAmJiAhaW5mby5yZWFkb25s
eSgpICYmICFpbmZvLmlubmVyTm9kZSgpKSB7Ci0gICAgICAgIGluZm8uc2V0SW5uZXJOb2RlKGVs
ZW1lbnQoKSk7Ci0gICAgICAgIGluZm8uc2V0SW5uZXJOb25TaGFyZWROb2RlKGVsZW1lbnQoKSk7
Ci0gICAgfQotCi0gICAgcmV0dXJuIGluc2lkZSB8fCBtX2NsaWVudFJlc2l6aW5nOwotfQotCi12
b2lkIFJlbmRlckZyYW1lU2V0OjpsYXlvdXQoICkKLXsKLSAgICBLSFRNTEFzc2VydCggbmVlZHNM
YXlvdXQoKSApOwotICAgIEtIVE1MQXNzZXJ0KCBtaW5NYXhLbm93bigpICk7Ci0KLSAgICBpZiAo
ICFwYXJlbnQoKS0+aXNGcmFtZVNldCgpICkgewotICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBj
YW52YXMoKS0+dmlldygpOwotICAgICAgICBtX3dpZHRoID0gdmlldy0+dmlzaWJsZVdpZHRoKCk7
Ci0gICAgICAgIG1faGVpZ2h0ID0gdmlldy0+dmlzaWJsZUhlaWdodCgpOwotICAgIH0KLQotICAg
IGludCByZW1haW5pbmdMZW5bMl07Ci0gICAgcmVtYWluaW5nTGVuWzFdID0gbV93aWR0aCAtIChl
bGVtZW50KCktPnRvdGFsQ29scygpLTEpKmVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAgaWYocmVt
YWluaW5nTGVuWzFdPDApIHJlbWFpbmluZ0xlblsxXT0wOwotICAgIHJlbWFpbmluZ0xlblswXSA9
IG1faGVpZ2h0IC0gKGVsZW1lbnQoKS0+dG90YWxSb3dzKCktMSkqZWxlbWVudCgpLT5ib3JkZXIo
KTsKLSAgICBpZihyZW1haW5pbmdMZW5bMF08MCkgcmVtYWluaW5nTGVuWzBdPTA7Ci0KLSAgICBp
bnQgYXZhaWxhYmxlTGVuWzJdOwotICAgIGF2YWlsYWJsZUxlblswXSA9IHJlbWFpbmluZ0xlblsw
XTsKLSAgICBhdmFpbGFibGVMZW5bMV0gPSByZW1haW5pbmdMZW5bMV07Ci0KLSAgICBpZiAobV9n
cmlkTGVuWzBdICE9IGVsZW1lbnQoKS0+dG90YWxSb3dzKCkgfHwgbV9ncmlkTGVuWzFdICE9IGVs
ZW1lbnQoKS0+dG90YWxDb2xzKCkpIHsKLSAgICAgICAgLy8gbnVtYmVyIG9mIHJvd3Mgb3IgY29s
cyBjaGFuZ2VkCi0gICAgICAgIC8vIG5lZWQgdG8gemVybyBvdXQgdGhlIGRlbHRhcwotICAgICAg
ICBtX2dyaWRMZW5bMF0gPSBlbGVtZW50KCktPnRvdGFsUm93cygpOwotICAgICAgICBtX2dyaWRM
ZW5bMV0gPSBlbGVtZW50KCktPnRvdGFsQ29scygpOwotICAgICAgICBmb3IgKGludCBrID0gMDsg
ayA8IDI7ICsraykgewotICAgICAgICAgICAgaWYgKG1fZ3JpZERlbHRhW2tdKSBkZWxldGUgW10g
bV9ncmlkRGVsdGFba107Ci0gICAgICAgICAgICBtX2dyaWREZWx0YVtrXSA9IG5ldyBpbnRbbV9n
cmlkTGVuW2tdXTsKLSAgICAgICAgICAgIGlmIChtX2dyaWRMYXlvdXRba10pIGRlbGV0ZSBbXSBt
X2dyaWRMYXlvdXRba107Ci0gICAgICAgICAgICBtX2dyaWRMYXlvdXRba10gPSBuZXcgaW50W21f
Z3JpZExlbltrXV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fZ3JpZExlbltr
XTsgKytpKQotICAgICAgICAgICAgICAgIG1fZ3JpZERlbHRhW2tdW2ldID0gMDsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSB7Ci0gICAgICAgIGlu
dCB0b3RhbFJlbGF0aXZlID0gMDsKLSAgICAgICAgaW50IHRvdGFsRml4ZWQgPSAwOwotICAgICAg
ICBpbnQgdG90YWxQZXJjZW50ID0gMDsKLSAgICAgICAgaW50IGNvdW50UmVsYXRpdmUgPSAwOwot
ICAgICAgICBpbnQgY291bnRGaXhlZCA9IDA7Ci0gICAgICAgIGludCBjb3VudFBlcmNlbnQgPSAw
OwotICAgICAgICBpbnQgZ3JpZExlbiA9IG1fZ3JpZExlbltrXTsKLSAgICAgICAgaW50KiBncmlk
RGVsdGEgPSBtX2dyaWREZWx0YVtrXTsKLSAgICAgICAgV2ViQ29yZTo6TGVuZ3RoKiBncmlkID0g
IGsgPyBlbGVtZW50KCktPm1fY29scyA6IGVsZW1lbnQoKS0+bV9yb3dzOwotICAgICAgICBpbnQq
IGdyaWRMYXlvdXQgPSBtX2dyaWRMYXlvdXRba107Ci0KLSAgICAgICAgaWYgKGdyaWQpIHsKLSAg
ICAgICAgICAgIGFzc2VydChncmlkTGVuKTsKLSAgICAgICAgICAgIC8vIEZpcnN0IHdlIG5lZWQg
dG8gaW52ZXN0aWdhdGUgaG93IG1hbnkgY29sdW1ucyBvZiBlYWNoIHR5cGUgd2UgaGF2ZSBhbmQK
LSAgICAgICAgICAgIC8vIGhvdyBtdWNoIHNwYWNlIHRoZXNlIGNvbHVtbnMgYXJlIGdvaW5nIHRv
IHJlcXVpcmUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkg
ewotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSB0b3RhbCBsZW5ndGggb2YgYWxsIG9mIHRo
ZSBmaXhlZCBjb2x1bW5zL3Jvd3MgLT4gdG90YWxGaXhlZAotICAgICAgICAgICAgICAgIC8vIENv
dW50IHRoZSBudW1iZXIgb2YgY29sdW1ucy9yb3dzIHdoaWNoIGFyZSBmaXhlZCAtPiBjb3VudEZp
eGVkCi0gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNGaXhlZCgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGdyaWRMYXlvdXRbaV0gPSBtYXgoZ3JpZFtpXS52YWx1ZSgpLCAwKTsKLSAgICAg
ICAgICAgICAgICAgICAgdG90YWxGaXhlZCArPSBncmlkTGF5b3V0W2ldOwotICAgICAgICAgICAg
ICAgICAgICBjb3VudEZpeGVkKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSB0b3RhbCBwZXJjZW50YWdlIG9mIGFsbCBv
ZiB0aGUgcGVyY2VudGFnZSBjb2x1bW5zL3Jvd3MgLT4gdG90YWxQZXJjZW50Ci0gICAgICAgICAg
ICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3Mgd2hpY2ggYXJlIHBlcmNl
bnRhZ2VzIC0+IGNvdW50UGVyY2VudAotICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzUGVy
Y2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gPSBtYXgoZ3JpZFtp
XS5jYWxjVmFsdWUoYXZhaWxhYmxlTGVuW2tdKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHRv
dGFsUGVyY2VudCArPSBncmlkTGF5b3V0W2ldOwotICAgICAgICAgICAgICAgICAgICBjb3VudFBl
cmNlbnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDb3VudCB0
aGUgdG90YWwgcmVsYXRpdmUgb2YgYWxsIHRoZSByZWxhdGl2ZSBjb2x1bW5zL3Jvd3MgLT4gdG90
YWxSZWxhdGl2ZQotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgY29sdW1u
cy9yb3dzIHdoaWNoIGFyZSByZWxhdGl2ZSAtPiBjb3VudFJlbGF0aXZlCi0gICAgICAgICAgICAg
ICAgaWYgKGdyaWRbaV0uaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFs
UmVsYXRpdmUgKz0gbWF4KGdyaWRbaV0udmFsdWUoKSwgMSk7Ci0gICAgICAgICAgICAgICAgICAg
IGNvdW50UmVsYXRpdmUrKzsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpeGVkIGNvbHVtbnMvcm93cyBhcmUgb3VyIGZpcnN0
IHByaW9yaXR5LiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIHRvIGZpdCBhbGwgZml4ZWQK
LSAgICAgICAgICAgIC8vIGNvbHVtbnMvcm93cyB3ZSBuZWVkIHRvIHByb3BvcnRpb25hbGx5IGFk
anVzdCB0aGVpciBzaXplLiAKLSAgICAgICAgICAgIGlmICh0b3RhbEZpeGVkID4gcmVtYWluaW5n
TGVuW2tdKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ0ZpeGVkID0gcmVtYWluaW5n
TGVuW2tdOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyAr
K2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNGaXhlZCgpKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldID0gKGdyaWRMYXlvdXRbaV0gKiByZW1h
aW5pbmdGaXhlZCkgLyB0b3RhbEZpeGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWlu
aW5nTGVuW2tdIC09IGdyaWRMYXlvdXRbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbWFp
bmluZ0xlbltrXSAtPSB0b3RhbEZpeGVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAv
LyBQZXJjZW50YWdlIGNvbHVtbnMvcm93cyBhcmUgb3VyIHNlY29uZCBwcmlvcml0eS4gRGl2aWRl
IHRoZSByZW1haW5pbmcgc3BhY2UgcHJvcG9ydGlvbmFsbHkgCi0gICAgICAgICAgICAvLyBvdmVy
IGFsbCBwZXJjZW50YWdlIGNvbHVtbnMvcm93cy4gSU1QT1JUQU5UOiB0aGUgc2l6ZSBvZiBlYWNo
IGNvbHVtbi9yb3cgaXMgbm90IHJlbGF0aXZlIAotICAgICAgICAgICAgLy8gdG8gMTAwJSwgYnV0
IHRvIHRoZSB0b3RhbCBwZXJjZW50YWdlLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlIHRocmVl
IGNvbHVtbnMsIGVhY2ggb2YgNzUlLAotICAgICAgICAgICAgLy8gYW5kIHRoZSBhdmFpbGFibGUg
c3BhY2UgaXMgMzAwcHgsIGVhY2ggY29sdW1uIHdpbGwgYmVjb21lIDEwMHB4IGluIHdpZHRoLgot
ICAgICAgICAgICAgaWYgKHRvdGFsUGVyY2VudCA+IHJlbWFpbmluZ0xlbltrXSkgewotICAgICAg
ICAgICAgICAgIGludCByZW1haW5pbmdQZXJjZW50ID0gcmVtYWluaW5nTGVuW2tdOwotCi0gICAg
ICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkTGVuOyArK2kpIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKGdyaWRbaV0uaXNQZXJjZW50KCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGdyaWRMYXlvdXRbaV0gPSAoZ3JpZExheW91dFtpXSAqIHJlbWFpbmluZ1BlcmNlbnQp
IC8gdG90YWxQZXJjZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2td
IC09IGdyaWRMYXlvdXRbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbWFpbmluZ0xlbltr
XSAtPSB0b3RhbFBlcmNlbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlbGF0
aXZlIGNvbHVtbnMvcm93cyBhcmUgb3VyIGxhc3QgcHJpb3JpdHkuIERpdmlkZSB0aGUgcmVtYWlu
aW5nIHNwYWNlIHByb3BvcnRpb25hbGx5Ci0gICAgICAgICAgICAvLyBvdmVyIGFsbCByZWxhdGl2
ZSBjb2x1bW5zL3Jvd3MuIElNUE9SVEFOVDogdGhlIHJlbGF0aXZlIHZhbHVlIG9mIDAqIGlzIHRy
ZWF0ZWQgYXMgMSouCi0gICAgICAgICAgICBpZiAoY291bnRSZWxhdGl2ZSkgewotICAgICAgICAg
ICAgICAgIGludCBsYXN0UmVsYXRpdmUgPSAwOwotICAgICAgICAgICAgICAgIGludCByZW1haW5p
bmdSZWxhdGl2ZSA9IHJlbWFpbmluZ0xlbltrXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgZ3JpZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmlk
W2ldLmlzUmVsYXRpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtp
XSA9IChtYXgoZ3JpZFtpXS52YWx1ZSgpLCAxKSAqIHJlbWFpbmluZ1JlbGF0aXZlKSAvIHRvdGFs
UmVsYXRpdmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gZ3Jp
ZExheW91dFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZWxhdGl2ZSA9IGk7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGQgbm90IGV2ZW50bHkgZGlzdHJpYnV0ZSB0
aGUgYXZhaWxhYmxlIHNwYWNlIG9mIGFsbCBvZiB0aGUgcmVsYXRpdmUgIAotICAgICAgICAgICAg
ICAgIC8vIGNvbHVtbnMvcm93cywgdGhlIHJlbWFpbmRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBs
YXN0IGNvbHVtbi9yb3cuCi0gICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGlmIHdlIGhh
dmUgYSBzcGFjZSBvZiAxMDBweCBhbmQgdGhyZWUgY29sdW1ucyAoKiwqLCopLCB0aGUgcmVtYWlu
ZGVyIHdpbGwKLSAgICAgICAgICAgICAgICAvLyBiZSAxcHggYW5kIHdpbGwgYmUgYWRkZWQgdG8g
dGhlIGxhc3QgY29sdW1uOiAzM3B4LCAzM3B4LCAzNHB4LgotICAgICAgICAgICAgICAgIGlmIChy
ZW1haW5pbmdMZW5ba10pIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtsYXN0UmVs
YXRpdmVdICs9IHJlbWFpbmluZ0xlbltrXTsKLSAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5n
TGVuW2tdID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgc29tZSBsZWZ0IG92ZXIgc3BhY2Ugd2UgbmVlZCB0byBk
aXZpZGUgaXQgb3ZlciB0aGUgYWxyZWFkeSBleGlzdGluZwotICAgICAgICAgICAgLy8gY29sdW1u
cy9yb3dzCi0gICAgICAgICAgICBpZiAocmVtYWluaW5nTGVuW2tdKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gT3VyIGZpcnN0IHByaW9yaXR5IGlzIHRvIHNwcmVhZCBpZiBvdmVyIHRoZSBwZXJjZW50
YWdlIGNvbHVtbnMuIFRoZSByZW1haW5pbmcKLSAgICAgICAgICAgICAgICAvLyBzcGFjZSBpcyBz
cHJlYWQgZXZlbmx5LCBmb3IgZXhhbXBsZTogaWYgd2UgaGF2ZSBhIHNwYWNlIG9mIDEwMHB4LCB0
aGUgY29sdW1ucyAKLSAgICAgICAgICAgICAgICAvLyBkZWZpbml0aW9uIG9mIDI1JSwyNSUgdXNl
ZCB0byByZXN1bHQgaW4gdHdvIGNvbHVtbnMgb2YgMjVweC4gQWZ0ZXIgdGhpcyB0aGUgCi0gICAg
ICAgICAgICAgICAgLy8gY29sdW1ucyB3aWxsIGVhY2ggYmUgNTBweCBpbiB3aWR0aC4gCi0gICAg
ICAgICAgICAgICAgaWYgKGNvdW50UGVyY2VudCAmJiB0b3RhbFBlcmNlbnQpIHsKLSAgICAgICAg
ICAgICAgICAgICAgaW50IHJlbWFpbmluZ1BlcmNlbnQgPSByZW1haW5pbmdMZW5ba107Ci0gICAg
ICAgICAgICAgICAgICAgIGludCBjaGFuZ2VQZXJjZW50ID0gMDsKLQotICAgICAgICAgICAgICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGdyaWRbaV0uaXNQZXJjZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjaGFuZ2VQZXJjZW50ID0gKHJlbWFpbmluZ1BlcmNlbnQgKiBncmlkTGF5b3V0W2ld
KSAvIHRvdGFsUGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0
W2ldICs9IGNoYW5nZVBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWlu
aW5nTGVuW2tdIC09IGNoYW5nZVBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvdGFsRml4
ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT3VyIGxhc3QgcHJpb3JpdHkgaXMgdG8gc3By
ZWFkIHRoZSByZW1haW5pbmcgc3BhY2Ugb3ZlciB0aGUgZml4ZWQgY29sdW1ucy4KLSAgICAgICAg
ICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSAxMDBweCBvZiBzcGFjZSBhbmQg
dHdvIGNvbHVtbiBvZiBlYWNoIDQwcHgsIGJvdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gY29s
dW1ucyB3aWxsIGJlY29tZSBleGFjdGx5IDUwcHguCi0gICAgICAgICAgICAgICAgICAgIGludCBy
ZW1haW5pbmdGaXhlZCA9IHJlbWFpbmluZ0xlbltrXTsKLSAgICAgICAgICAgICAgICAgICAgaW50
IGNoYW5nZUZpeGVkID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRbaV0u
aXNGaXhlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRml4ZWQgPSAo
cmVtYWluaW5nRml4ZWQgKiBncmlkTGF5b3V0W2ldKSAvIHRvdGFsRml4ZWQ7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSArPSBjaGFuZ2VGaXhlZDsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0gY2hhbmdlRml4ZWQ7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB3
ZSBzdGlsbCBoYXZlIHNvbWUgbGVmdCBvdmVyIHNwYWNlIHdlIHByb2JhYmx5IGVuZGVkIHVwIHdp
dGggYSByZW1haW5kZXIgb2YKLSAgICAgICAgICAgIC8vIGEgZGl2aXNpb24uIFdlIGNhbiBub3Qg
c3ByZWFkIGl0IGV2ZW5seSBhbnltb3JlLiBJZiB3ZSBoYXZlIGFueSBwZXJjZW50YWdlIAotICAg
ICAgICAgICAgLy8gY29sdW1ucy9yb3dzIHNpbXBseSBzcHJlYWQgdGhlIHJlbWFpbmRlciBlcXVh
bGx5IG92ZXIgYWxsIGF2YWlsYWJsZSBwZXJjZW50YWdlIGNvbHVtbnMsIAotICAgICAgICAgICAg
Ly8gcmVnYXJkbGVzcyBvZiB0aGVpciBzaXplLgotICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0xl
bltrXSAmJiBjb3VudFBlcmNlbnQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nUGVy
Y2VudCA9IHJlbWFpbmluZ0xlbltrXTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhbmdlUGVyY2Vu
dCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyaWRMZW47ICsr
aSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXS5pc1BlcmNlbnQoKSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgY2hhbmdlUGVyY2VudCA9IHJlbWFpbmluZ1BlcmNlbnQgLyBj
b3VudFBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9IGNo
YW5nZVBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdMZW5ba10gLT0g
Y2hhbmdlUGVyY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIHdlIGRvbid0
IGhhdmUgYW55IHBlcmNlbnRhZ2UgY29sdW1ucy9yb3dzIHdlIG9ubHkgaGF2ZSBmaXhlZCBjb2x1
bW5zLiBTcHJlYWQKLSAgICAgICAgICAgIC8vIHRoZSByZW1haW5kZXIgZXF1YWxseSBvdmVyIGFs
bCBmaXhlZCBjb2x1bW5zL3Jvd3MuCi0gICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmdMZW5b
a10gJiYgY291bnRGaXhlZCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdGaXhlZCA9
IHJlbWFpbmluZ0xlbltrXTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhbmdlRml4ZWQgPSAwOwot
ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3Jp
ZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmlkW2ldLmlzRml4ZWQoKSkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRml4ZWQgPSByZW1haW5pbmdGaXhlZCAv
IGNvdW50Rml4ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkTGF5b3V0W2ldICs9IGNo
YW5nZUZpeGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nTGVuW2tdIC09IGNo
YW5nZUZpeGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdGlsbCBzb21lIGxlZnQgb3Zlci4uLiBzaW1w
bHkgYWRkIGl0IHRvIHRoZSBsYXN0IGNvbHVtbiwgYmVjYXVzZSBpdCBpcyBpbXBvc3NpYmxlCi0g
ICAgICAgICAgICAvLyBzcHJlYWQgaXQgZXZlbmx5IG9yIGVxdWFsbHkuCi0gICAgICAgICAgICBp
ZiAocmVtYWluaW5nTGVuW2tdKSB7Ci0gICAgICAgICAgICAgICAgZ3JpZExheW91dFtncmlkTGVu
IC0gMV0gKz0gcmVtYWluaW5nTGVuW2tdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAv
LyBub3cgd2UgaGF2ZSB0aGUgZmluYWwgbGF5b3V0LCBkaXN0cmlidXRlIHRoZSBkZWx0YSBvdmVy
IGl0Ci0gICAgICAgICAgICBib29sIHdvcmtlZCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGdyaWRMZW47ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChncmlkTGF5
b3V0W2ldICYmIGdyaWRMYXlvdXRbaV0gKyBncmlkRGVsdGFbaV0gPD0gMCkKLSAgICAgICAgICAg
ICAgICAgICAgd29ya2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZ3JpZExheW91dFtpXSAr
PSBncmlkRGVsdGFbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBub3cgdGhlIGRl
bHRhJ3MgYnJva2Ugc29tZXRoaW5nLCB1bmRvIGl0IGFuZCByZXNldCBkZWx0YXMKLSAgICAgICAg
ICAgIGlmICghd29ya2VkKQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3Jp
ZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyaWRMYXlvdXRbaV0gLT0gZ3JpZERl
bHRhW2ldOwotICAgICAgICAgICAgICAgICAgICBncmlkRGVsdGFbaV0gPSAwOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBncmlkTGF5b3V0
WzBdID0gcmVtYWluaW5nTGVuW2tdOwotICAgIH0KLQotICAgIHBvc2l0aW9uRnJhbWVzKCk7Ci0K
LSAgICBSZW5kZXJPYmplY3QgKmNoaWxkID0gZmlyc3RDaGlsZCgpOwotICAgIGlmICggIWNoaWxk
ICkKLSAgICAgICAgZ290byBlbmQyOwotCi0gICAgaWYoIW1faFNwbGl0VmFyICYmICFtX3ZTcGxp
dFZhcikKLSAgICB7Ci0gICAgICAgIGlmKCFtX3ZTcGxpdFZhciAmJiBlbGVtZW50KCktPnRvdGFs
Q29scygpID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgbV92U3BsaXRWYXIgPSBuZXcgYm9v
bFtlbGVtZW50KCktPnRvdGFsQ29scygpXTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkg
PCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBpKyspIG1fdlNwbGl0VmFyW2ldID0gdHJ1ZTsKLSAg
ICAgICAgfQotICAgICAgICBpZighbV9oU3BsaXRWYXIgJiYgZWxlbWVudCgpLT50b3RhbFJvd3Mo
KSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1faFNwbGl0VmFyID0gbmV3IGJvb2xbZWxl
bWVudCgpLT50b3RhbFJvd3MoKV07Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZWxl
bWVudCgpLT50b3RhbFJvd3MoKTsgaSsrKSBtX2hTcGxpdFZhcltpXSA9IHRydWU7Ci0gICAgICAg
IH0KLQotICAgICAgICBmb3IoaW50IHIgPSAwOyByIDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsg
cisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaW50IGMgPSAwOyBjIDwgZWxlbWVudCgp
LT50b3RhbENvbHMoKTsgYysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2wg
Zml4ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmICggY2hpbGQtPmlzRnJhbWVTZXQo
KSApCi0gICAgICAgICAgICAgICAgICBmaXhlZCA9IHN0YXRpY19jYXN0PFJlbmRlckZyYW1lU2V0
ICo+KGNoaWxkKS0+ZWxlbWVudCgpLT5ub1Jlc2l6ZSgpOwotICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICAgIGZpeGVkID0gc3RhdGljX2Nhc3Q8UmVuZGVyRnJhbWUgKj4oY2hp
bGQpLT5lbGVtZW50KCktPm5vUmVzaXplKCk7Ci0KLSAgICAgICAgICAgICAgICBpZihmaXhlZCkK
LSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBlbGVtZW50KCktPnRv
dGFsQ29scygpID4gMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYoYz4wKSBtX3ZTcGxpdFZhcltjLTFdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBtX3ZTcGxpdFZhcltjXSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIGlmKCBlbGVtZW50KCktPnRvdGFsUm93cygpID4gMSkKLSAgICAg
ICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocj4wKSBtX2hTcGxp
dFZhcltyLTFdID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2hTcGxpdFZhclty
XSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNo
aWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFjaGls
ZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kMTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSBlbmQxOgotICAgIFJlbmRlckNv
bnRhaW5lcjo6bGF5b3V0KCk7Ci0gZW5kMjoKLSAgICBzZXROZWVkc0xheW91dChmYWxzZSk7Ci19
Ci0KLXZvaWQgUmVuZGVyRnJhbWVTZXQ6OnBvc2l0aW9uRnJhbWVzKCkKLXsKLSAgaW50IHI7Ci0g
IGludCBjOwotCi0gIFJlbmRlck9iamVjdCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7Ci0gIGlmICgg
IWNoaWxkICkKLSAgICByZXR1cm47Ci0KLSAgLy8gIE5vZGUgKmNoaWxkID0gX2ZpcnN0OwotICAv
LyAgaWYoIWNoaWxkKSByZXR1cm47Ci0KLSAgaW50IHlQb3MgPSAwOwotCi0gIGZvcihyID0gMDsg
ciA8IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IHIrKykKLSAgewotICAgIGludCB4UG9zID0gMDsK
LSAgICBmb3IoYyA9IDA7IGMgPCBlbGVtZW50KCktPnRvdGFsQ29scygpOyBjKyspCi0gICAgewot
ICAgICAgY2hpbGQtPnNldFBvcyggeFBvcywgeVBvcyApOwotICAgICAgLy8gaGFzIHRvIGJlIHJl
c2l6ZWQgYW5kIGl0c2VsZiByZXNpemUgaXRzIGNvbnRlbnRzCi0gICAgICBpZiAoKG1fZ3JpZExh
eW91dFsxXVtjXSAhPSBjaGlsZC0+d2lkdGgoKSkgfHwgKG1fZ3JpZExheW91dFswXVtyXSAhPSBj
aGlsZC0+aGVpZ2h0KCkpKSB7Ci0gICAgICAgICAgY2hpbGQtPnNldFdpZHRoKCBtX2dyaWRMYXlv
dXRbMV1bY10gKTsKLSAgICAgICAgICBjaGlsZC0+c2V0SGVpZ2h0KCBtX2dyaWRMYXlvdXRbMF1b
cl0gKTsKLSAgICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSk7Ci0gICAgICAgICAg
Y2hpbGQtPmxheW91dCgpOwotICAgICAgfQotCi0gICAgICB4UG9zICs9IG1fZ3JpZExheW91dFsx
XVtjXSArIGVsZW1lbnQoKS0+Ym9yZGVyKCk7Ci0gICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0U2li
bGluZygpOwotCi0gICAgICBpZiAoICFjaGlsZCApCi0gICAgICAgIHJldHVybjsKLQotICAgIH0K
LQotICAgIHlQb3MgKz0gbV9ncmlkTGF5b3V0WzBdW3JdICsgZWxlbWVudCgpLT5ib3JkZXIoKTsK
LSAgfQotCi0gIC8vIGFsbCB0aGUgcmVtYWluaW5nIGZyYW1lcyBhcmUgaGlkZGVuIHRvIGF2b2lk
IHVnbHkKLSAgLy8gc3B1cmlvdXMgdW5mbG93ZWQgZnJhbWVzCi0gIHdoaWxlICggY2hpbGQgKSB7
Ci0gICAgICBjaGlsZC0+c2V0V2lkdGgoIDAgKTsKLSAgICAgIGNoaWxkLT5zZXRIZWlnaHQoIDAg
KTsKLSAgICAgIGNoaWxkLT5zZXROZWVkc0xheW91dChmYWxzZSk7Ci0KLSAgICAgIGNoaWxkID0g
Y2hpbGQtPm5leHRTaWJsaW5nKCk7Ci0gIH0KLX0KLQotYm9vbCBSZW5kZXJGcmFtZVNldDo6dXNl
clJlc2l6ZSggTW91c2VFdmVudCAqZXZ0ICkKLXsKLSAgICBpZiAobmVlZHNMYXlvdXQoKSkgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIGJvb2wgcmVzID0gZmFsc2U7Ci0gICAgaW50IF94ID0gZXZ0
LT5jbGllbnRYKCk7Ci0gICAgaW50IF95ID0gZXZ0LT5jbGllbnRZKCk7Ci0gICAgCi0gICAgaWYg
KCAhbV9yZXNpemluZyAmJiBldnQtPnR5cGUoKSA9PSBtb3VzZW1vdmVFdmVudCB8fCBldnQtPnR5
cGUoKSA9PSBtb3VzZWRvd25FdmVudCApCi0gICAgewotICAgICAgICBtX2hTcGxpdCA9IC0xOwot
ICAgICAgICBtX3ZTcGxpdCA9IC0xOwotICAgICAgICAvL2Jvb2wgcmVzaXplUG9zc2libGUgPSB0
cnVlOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgaWYgd2UncmUgb3ZlciBhIGhvcml6b250
YWwgb3IgdmVydGljYWwgYm91bmRhcnkKLSAgICAgICAgaW50IHBvcyA9IG1fZ3JpZExheW91dFsx
XVswXSArIHhQb3MoKTsKLSAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPCBlbGVtZW50KCktPnRv
dGFsQ29scygpOyBjKyspIHsKLSAgICAgICAgICAgIGlmIChfeCA+PSBwb3MgJiYgX3ggPD0gcG9z
K2VsZW1lbnQoKS0+Ym9yZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobV92U3BsaXRWYXIg
JiYgbV92U3BsaXRWYXJbYyAtIDFdKQotICAgICAgICAgICAgICAgICAgICBtX3ZTcGxpdCA9IGMg
LSAxOwotICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgKz0gbV9ncmlkTGF5b3V0WzFdW2NdICsg
ZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcG9zID0g
bV9ncmlkTGF5b3V0WzBdWzBdICsgeVBvcygpOwotICAgICAgICBmb3IgKGludCByID0gMTsgciA8
IGVsZW1lbnQoKS0+dG90YWxSb3dzKCk7IHIrKykgewotICAgICAgICAgICAgaWYgKCBfeSA+PSBw
b3MgJiYgX3kgPD0gcG9zK2VsZW1lbnQoKS0+Ym9yZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBp
ZiAobV9oU3BsaXRWYXIgJiYgbV9oU3BsaXRWYXJbciAtIDFdKQotICAgICAgICAgICAgICAgICAg
ICBtX2hTcGxpdCA9IHIgLSAxOwotICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgKz0gbV9ncmlk
TGF5b3V0WzBdW3JdICsgZWxlbWVudCgpLT5ib3JkZXIoKTsKLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgaWYgKGV2dC0+dHlwZSgpID09IG1vdXNlZG93bkV2ZW50KSB7Ci0gICAgICAgICAg
ICBzZXRSZXNpemluZyh0cnVlKTsKLSAgICAgICAgICAgIG1fdlNwbGl0UG9zID0gX3g7Ci0gICAg
ICAgICAgICBtX2hTcGxpdFBvcyA9IF95OwotICAgICAgICAgICAgbV9vbGRwb3MgPSAtMTsKLSAg
ICAgICAgfSBlbHNlCi0gICAgICAgICAgICBjYW52YXMoKS0+dmlldygpLT5zZXRDdXJzb3IocG9p
bnRlckN1cnNvcigpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gIyMjIGNoZWNrIHRoZSByZXNpemUg
aXMgbm90IGdvaW5nIG91dCBvZiBib3VuZHMuCi0gICAgaWYgKG1fcmVzaXppbmcgJiYgZXZ0LT50
eXBlKCkgPT0gbW91c2V1cEV2ZW50KSB7Ci0gICAgICAgIHNldFJlc2l6aW5nKGZhbHNlKTsKLSAg
ICAgICAgCi0gICAgICAgIGlmKG1fdlNwbGl0ICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAg
ICAgaW50IGRlbHRhID0gbV92U3BsaXRQb3MgLSBfeDsKLSAgICAgICAgICAgIG1fZ3JpZERlbHRh
WzFdW21fdlNwbGl0XSAtPSBkZWx0YTsKLSAgICAgICAgICAgIG1fZ3JpZERlbHRhWzFdW21fdlNw
bGl0KzFdICs9IGRlbHRhOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1faFNwbGl0ICE9IC0xICkK
LSAgICAgICAgewotICAgICAgICAgICAgaW50IGRlbHRhID0gbV9oU3BsaXRQb3MgLSBfeTsKLSAg
ICAgICAgICAgIG1fZ3JpZERlbHRhWzBdW21faFNwbGl0XSAtPSBkZWx0YTsKLSAgICAgICAgICAg
IG1fZ3JpZERlbHRhWzBdW21faFNwbGl0KzFdICs9IGRlbHRhOwotICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICAvLyB0aGlzIGp1c3Qgc2NoZWR1bGVzIHRoZSByZWxheW91dAotICAgICAgICAv
LyBpbXBvcnRhbnQsIG90aGVyd2lzZSB0aGUgbW92aW5nIGluZGljYXRvciBpcyBub3QgY29ycmVj
dGx5IGVyYXNlZAotICAgICAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKLSAgICB9Ci0gICAgCi0g
ICAgZWxzZSBpZiAobV9yZXNpemluZyB8fCBldnQtPnR5cGUoKSA9PSBtb3VzZXVwRXZlbnQpIHsK
LSAgICAgICAgRnJhbWVWaWV3ICp2ID0gY2FudmFzKCktPnZpZXcoKTsgICAgICAgIAotICAgICAg
ICB2LT5kaXNhYmxlRmx1c2hEcmF3aW5nKCk7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCA9IHYtPmxvY2tEcmF3aW5nRm9jdXMoKTsKLSAgICAgICAgCi0gICAgICAgIEludFJlY3Qg
cih4UG9zKCksIHlQb3MoKSwgd2lkdGgoKSwgaGVpZ2h0KCkpOwotICAgICAgICBjb25zdCBpbnQg
ckJvcmQgPSAzOwotICAgICAgICBpbnQgc3cgPSBlbGVtZW50KCktPmJvcmRlcigpOwotICAgICAg
ICBpbnQgcCA9IG1fcmVzaXppbmcgPyAobV92U3BsaXQgPiAtMSA/IF94IDogX3kpIDogLTE7Ci0g
ICAgICAgIGNvbnN0IFJHQkEzMiBncmV5UXVhcnRlck9wYWNpdHkgPSAweDQwQTBBMEEwOwotICAg
ICAgICBpZiAobV92U3BsaXQgPiAtMSkgewotICAgICAgICAgICAgaWYgKG1fb2xkcG9zID49IDAp
Ci0gICAgICAgICAgICAgICAgdi0+dXBkYXRlQ29udGVudHMoSW50UmVjdChtX29sZHBvcyArIHN3
LzIgLSByQm9yZCwgci55KCksIDIgKiByQm9yZCwgci5oZWlnaHQoKSksIHRydWUpOwotICAgICAg
ICAgICAgaWYgKHAgPj0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFBlbihQZW46
Ok5vUGVuKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoZ3JleVF1YXJ0
ZXJPcGFjaXR5KTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3UmVjdChJbnRSZWN0KHAg
KyBzdy8yIC0gckJvcmQsIHIueSgpLCAyICogckJvcmQsIHIuaGVpZ2h0KCkpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX29sZHBvcyA+PSAwKQot
ICAgICAgICAgICAgICAgIHYtPnVwZGF0ZUNvbnRlbnRzKEludFJlY3Qoci54KCksIG1fb2xkcG9z
ICsgc3cvMiAtIHJCb3JkLCByLndpZHRoKCksIDIgKiByQm9yZCksIHRydWUpOwotICAgICAgICAg
ICAgaWYgKHAgPj0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFBlbihQZW46Ok5v
UGVuKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoZ3JleVF1YXJ0ZXJP
cGFjaXR5KTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3UmVjdChJbnRSZWN0KHIueCgp
LCBwICsgc3cvMiAtIHJCb3JkLCByLndpZHRoKCksIDIgKiByQm9yZCkpOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgICAgIG1fb2xkcG9zID0gcDsKLQotICAgICAgICB2LT51bmxvY2tE
cmF3aW5nRm9jdXMoY29udGV4dCk7Ci0gICAgICAgIHYtPmVuYWJsZUZsdXNoRHJhd2luZygpOwot
ICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIFJlbmRlckZyYW1lU2V0Ojpz
ZXRSZXNpemluZyhib29sIGUpCi17Ci0gICAgbV9yZXNpemluZyA9IGU7Ci0gICAgZm9yIChSZW5k
ZXJPYmplY3QqIHAgPSBwYXJlbnQoKTsgcDsgcCA9IHAtPnBhcmVudCgpKQotICAgICAgICBpZiAo
cC0+aXNGcmFtZVNldCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyRnJhbWVTZXQq
PihwKS0+bV9jbGllbnRSZXNpemluZyA9IG1fcmVzaXppbmc7Ci0gICAgY2FudmFzKCktPnZpZXco
KS0+c2V0UmVzaXppbmdGcmFtZVNldChlID8gZWxlbWVudCgpIDogMCk7Ci19Ci0KLWJvb2wgUmVu
ZGVyRnJhbWVTZXQ6OmNhblJlc2l6ZSggaW50IF94LCBpbnQgX3kgKQotewotICAgIC8vIGlmIHdl
IGhhdmVuJ3QgcmVjZWl2ZWQgYSBsYXlvdXQsIHRoZW4gdGhlIGdyaWRMYXlvdXQgZG9lc24ndCBj
b250YWluIHVzZWZ1bCBkYXRhIHlldAotICAgIGlmIChuZWVkc0xheW91dCgpIHx8ICFtX2dyaWRM
YXlvdXRbMF0gfHwgIW1fZ3JpZExheW91dFsxXSApIHJldHVybiBmYWxzZTsKLQotICAgIC8vIGNo
ZWNrIGlmIHdlJ3JlIG92ZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGJvdW5kYXJ5Ci0gICAg
aW50IHBvcyA9IG1fZ3JpZExheW91dFsxXVswXTsKLSAgICBmb3IoaW50IGMgPSAxOyBjIDwgZWxl
bWVudCgpLT50b3RhbENvbHMoKTsgYysrKQotICAgICAgICBpZihfeCA+PSBwb3MgJiYgX3ggPD0g
cG9zK2VsZW1lbnQoKS0+Ym9yZGVyKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAg
IHBvcyA9IG1fZ3JpZExheW91dFswXVswXTsKLSAgICBmb3IoaW50IHIgPSAxOyByIDwgZWxlbWVu
dCgpLT50b3RhbFJvd3MoKTsgcisrKQotICAgICAgICBpZiggX3kgPj0gcG9zICYmIF95IDw9IHBv
cytlbGVtZW50KCktPmJvcmRlcigpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIFJlbmRlckZyYW1lU2V0Ojpk
dW1wKFFUZXh0U3RyZWFtICpzdHJlYW0sIERlcHJlY2F0ZWRTdHJpbmcgaW5kKSBjb25zdAotewot
ICAqc3RyZWFtIDw8ICIgdG90YWxyb3dzPSIgPDwgZWxlbWVudCgpLT50b3RhbFJvd3MoKTsKLSAg
KnN0cmVhbSA8PCAiIHRvdGFsY29scz0iIDw8IGVsZW1lbnQoKS0+dG90YWxDb2xzKCk7Ci0KLSAg
dW5zaWduZWQgaTsKLSAgZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCllbGVtZW50KCktPnRvdGFs
Um93cygpOyBpKyspCi0gICAgKnN0cmVhbSA8PCAiIGhTcGxpdHZhcigiIDw8IGkgPDwgIik9IiA8
PCBtX2hTcGxpdFZhcltpXTsKLQotICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKWVsZW1lbnQo
KS0+dG90YWxDb2xzKCk7IGkrKykKLSAgICAqc3RyZWFtIDw8ICIgdlNwbGl0dmFyKCIgPDwgaSA8
PCAiKT0iIDw8IG1fdlNwbGl0VmFyW2ldOwotCi0gIFJlbmRlckNvbnRhaW5lcjo6ZHVtcChzdHJl
YW0saW5kKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0K
LVJlbmRlclBhcnQ6OlJlbmRlclBhcnQoSFRNTEVsZW1lbnQqIG5vZGUpCi0gICAgOiBSZW5kZXJX
aWRnZXQobm9kZSksIG1fZnJhbWUoMCkKLXsKLSAgICAvLyBpbml0IFJlbmRlck9iamVjdCBhdHRy
aWJ1dGVzCi0gICAgc2V0SW5saW5lKGZhbHNlKTsKLX0KLQotUmVuZGVyUGFydDo6flJlbmRlclBh
cnQoKQotewotICAgIC8vIFNpbmNlIGRlcmVmIGVuZHMgdXAgY2FsbGluZyBzZXRXaWRnZXQgYmFj
ayBvbiB1cywgbmVlZCB0byBtYWtlIHN1cmUKLSAgICAvLyB0aGF0IHdpZGdldCBpcyBhbHJlYWR5
IDAgc28gaXQgd29uJ3QgZG8gYW55IHdvcmsuCi0gICAgV2lkZ2V0KiB3aWRnZXQgPSBtX3dpZGdl
dDsKLSAgICBtX3dpZGdldCA9IDA7Ci0gICAgaWYgKHdpZGdldCAmJiB3aWRnZXQtPmlzRnJhbWVW
aWV3KCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHdpZGdldCktPmRlcmVmKCk7
Ci0gICAgZWxzZQotICAgICAgICBkZWxldGUgd2lkZ2V0OwotCi0gICAgc2V0RnJhbWUoMCk7Ci19
Ci0KLXZvaWQgUmVuZGVyUGFydDo6c2V0RnJhbWUoRnJhbWUqIGZyYW1lKQotewotICAgIGlmIChm
cmFtZSA9PSBtX2ZyYW1lKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKG1fZnJhbWUpCi0gICAg
ICAgIG1fZnJhbWUtPmRpc2Nvbm5lY3RPd25lclJlbmRlcmVyKCk7Ci0gICAgbV9mcmFtZSA9IGZy
YW1lOwotfQotCi12b2lkIFJlbmRlclBhcnQ6OnNldFdpZGdldChXaWRnZXQqIHdpZGdldCkKLXsK
LSAgICBpZiAod2lkZ2V0ICE9IG1fd2lkZ2V0KSB7Ci0gICAgICAgIGlmICh3aWRnZXQgJiYgd2lk
Z2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
d2lkZ2V0KS0+cmVmKCk7Ci0gICAgICAgIFJlbmRlcldpZGdldDo6c2V0V2lkZ2V0KHdpZGdldCk7
Ci0KLSAgICAgICAgc2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLQotICAgICAgICAv
LyBtYWtlIHN1cmUgdGhlIHNjcm9sbGJhcnMgYXJlIHNldCBjb3JyZWN0bHkgZm9yIHJlc3RvcmUK
LSAgICAgICAgLy8gIyMjIGZpbmQgYmV0dGVyIGZpeAotICAgICAgICB2aWV3Q2xlYXJlZCgpOwot
ICAgIH0KLX0KLQotdm9pZCBSZW5kZXJQYXJ0Ojp2aWV3Q2xlYXJlZCgpCi17Ci19Ci0KLXZvaWQg
UmVuZGVyUGFydDo6ZGVsZXRlV2lkZ2V0KCkKLXsKLSAgICBpZiAobV93aWRnZXQgJiYgbV93aWRn
ZXQtPmlzRnJhbWVWaWV3KCkpCi0gICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fd2lk
Z2V0KS0+ZGVyZWYoKTsKLSAgICBlbHNlCi0gICAgICAgIGRlbGV0ZSBtX3dpZGdldDsKLX0KLQot
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogUmVuZGVyRnJhbWU6OlJlbmRlckZy
YW1lKEhUTUxGcmFtZUVsZW1lbnQqIGZyYW1lKQogICAgIDogUmVuZGVyUGFydChmcmFtZSkKIHsK
QEAgLTY1MCw3ICs0Myw3IEBAIHZvaWQgUmVuZGVyRnJhbWU6OnZpZXdDbGVhcmVkKCkKIHsKICAg
ICBpZiAoZWxlbWVudCgpICYmIG1fd2lkZ2V0ICYmIG1fd2lkZ2V0LT5pc0ZyYW1lVmlldygpKSB7
CiAgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fd2lk
Z2V0KTsKLSAgICAgICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVTZXQgPSBzdGF0aWNfY2Fz
dDxIVE1MRnJhbWVTZXRFbGVtZW50ICo+KGVsZW1lbnQoKS0+cGFyZW50Tm9kZSgpKTsKKyAgICAg
ICAgSFRNTEZyYW1lU2V0RWxlbWVudCogZnJhbWVTZXQgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVT
ZXRFbGVtZW50Kj4oZWxlbWVudCgpLT5wYXJlbnROb2RlKCkpOwogICAgICAgICBib29sIGhhc0Jv
cmRlciA9IGVsZW1lbnQoKS0+bV9mcmFtZUJvcmRlciAmJiBmcmFtZVNldC0+ZnJhbWVCb3JkZXIo
KTsKICAgICAgICAgaW50IG1hcmdpbncgPSBlbGVtZW50KCktPm1fbWFyZ2luV2lkdGg7CiAgICAg
ICAgIGludCBtYXJnaW5oID0gZWxlbWVudCgpLT5tX21hcmdpbkhlaWdodDsKQEAgLTY2MywyNzcg
KzU2LDQgQEAgdm9pZCBSZW5kZXJGcmFtZTo6dmlld0NsZWFyZWQoKQogICAgIH0KIH0KIAotLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVJlbmRlclBhcnRPYmplY3Q6OlJlbmRl
clBhcnRPYmplY3QoSFRNTEVsZW1lbnQqIGVsZW1lbnQpCi0gICAgOiBSZW5kZXJQYXJ0KGVsZW1l
bnQpCi17Ci0gICAgLy8gaW5pdCBSZW5kZXJPYmplY3QgYXR0cmlidXRlcwotICAgIHNldElubGlu
ZSh0cnVlKTsKLSAgICBtX2hhc0ZhbGxiYWNrQ29udGVudCA9IGZhbHNlOwotfQotCi1zdGF0aWMg
Ym9vbCBpc1VSTEFsbG93ZWQoV2ViQ29yZTo6RG9jdW1lbnQgKmRvYywgY29uc3QgU3RyaW5nICZ1
cmwpCi17Ci0gICAgS1VSTCBuZXdVUkwoZG9jLT5jb21wbGV0ZVVSTCh1cmwuZGVwcmVjYXRlZFN0
cmluZygpKSk7Ci0gICAgbmV3VVJMLnNldFJlZihEZXByZWNhdGVkU3RyaW5nOjpudWxsKTsKLSAg
ICAKLSAgICBpZiAoZG9jLT5mcmFtZSgpLT5wYWdlKCktPmZyYW1lQ291bnQoKSA+PSAyMDApCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFdlIGFsbG93IG9uZSBsZXZlbCBvZiBzZWxm
LXJlZmVyZW5jZSBiZWNhdXNlIHNvbWUgc2l0ZXMgZGVwZW5kIG9uIHRoYXQuCi0gICAgLy8gQnV0
IHdlIGRvbid0IGFsbG93IG1vcmUgdGhhbiBvbmUuCi0gICAgYm9vbCBmb3VuZFNlbGZSZWZlcmVu
Y2UgPSBmYWxzZTsKLSAgICBmb3IgKEZyYW1lICpmcmFtZSA9IGRvYy0+ZnJhbWUoKTsgZnJhbWU7
IGZyYW1lID0gZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpIHsKLSAgICAgICAgS1VSTCBmcmFtZVVS
TCA9IGZyYW1lLT51cmwoKTsKLSAgICAgICAgZnJhbWVVUkwuc2V0UmVmKERlcHJlY2F0ZWRTdHJp
bmc6Om51bGwpOwotICAgICAgICBpZiAoZnJhbWVVUkwgPT0gbmV3VVJMKSB7Ci0gICAgICAgICAg
ICBpZiAoZm91bmRTZWxmUmVmZXJlbmNlKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgICAgIGZvdW5kU2VsZlJlZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXBDbGFzc0lkVG9T
ZXJ2aWNlVHlwZShjb25zdCBTdHJpbmcmIGNsYXNzSWQsIFN0cmluZyYgc2VydmljZVR5cGUpCi17
Ci0gICAgLy8gSXQgaXMgQWN0aXZlWCwgYnV0IHRoZSBuc3BsdWdpbiBzeXN0ZW0gaGFuZGxpbmcK
LSAgICAvLyBzaG91bGQgYWxzbyB3b3JrLCB0aGF0J3Mgd2h5IHdlIGRvbid0IG92ZXJyaWRlIHRo
ZQotICAgIC8vIHNlcnZpY2VUeXBlIHdpdGggYXBwbGljYXRpb24veC1hY3RpdmV4LWhhbmRsZXIK
LSAgICAvLyBidXQgbGV0IHRoZSBLVHJhZGVyIGluIGtodG1scGFydDo6Y3JlYXRlUGFydCgpIGRl
dGVjdAotICAgIC8vIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZTogbGF1bmNoIHdpdGggYWN0aXZleCB2
aWV3ZXIgb3IKLSAgICAvLyB3aXRoIG5zcGx1Z2ludmlld2VyIChOaWtvKQotICAgIGlmIChjbGFz
c0lkLmNvbnRhaW5zKCJEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiKSkKLSAg
ICAgICAgc2VydmljZVR5cGUgPSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giOwotICAg
IGVsc2UgaWYgKGNsYXNzSWQuY29udGFpbnMoIkNGQ0RBQTAzLThCRTQtMTFjZi1CODRCLTAwMjBB
RkJCQ0NGQSIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhdWRpby94LXBuLXJlYWxhdWRpby1w
bHVnaW4iOwotICAgIGVsc2UgaWYgKGNsYXNzSWQuY29udGFpbnMoIjAyQkYyNUQ1LThDMTctNEIy
My1CQzgwLUQzNDg4QUJEREM2QiIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJ2aWRlby9xdWlj
a3RpbWUiOwotICAgIGVsc2UgaWYgKGNsYXNzSWQuY29udGFpbnMoIjE2NkIxQkNBLTNGOUMtMTFD
Ri04MDc1LTQ0NDU1MzU0MDAwMCIpKQotICAgICAgICBzZXJ2aWNlVHlwZSA9ICJhcHBsaWNhdGlv
bi94LWRpcmVjdG9yIjsKLSAgICBlbHNlIGlmIChjbGFzc0lkLmNvbnRhaW5zKCI2QkY1MkE1Mi0z
OTRBLTExZDMtQjE1My0wMEMwNEY3OUZBQTYiKSkKLSAgICAgICAgc2VydmljZVR5cGUgPSAiYXBw
bGljYXRpb24veC1tcGxheWVyMiI7Ci0gICAgZWxzZSBpZiAoIWNsYXNzSWQuaXNFbXB0eSgpKQot
ICAgICAgICAvLyBXZSBoYXZlIGEgY2xzaWQsIG1lYW5zIHRoaXMgaXMgYWN0aXZleCAoTmlrbykK
LSAgICAgICAgc2VydmljZVR5cGUgPSAiYXBwbGljYXRpb24veC1hY3RpdmV4LWhhbmRsZXIiOwot
ICAgIC8vIFRPRE86IGFkZCBtb3JlIHBsdWdpbnMgaGVyZQotfQotCi12b2lkIFJlbmRlclBhcnRP
YmplY3Q6OnVwZGF0ZVdpZGdldCgpCi17Ci0gIFN0cmluZyB1cmw7Ci0gIFN0cmluZyBzZXJ2aWNl
VHlwZTsKLSAgVmVjdG9yPFN0cmluZz4gcGFyYW1OYW1lczsKLSAgVmVjdG9yPFN0cmluZz4gcGFy
YW1WYWx1ZXM7Ci0gIEZyYW1lICpmcmFtZSA9IG1fdmlldy0+ZnJhbWUoKTsKLQotICBzZXROZWVk
c0xheW91dEFuZE1pbk1heFJlY2FsYygpOwotCi0gIGlmIChlbGVtZW50KCktPmhhc1RhZ05hbWUo
b2JqZWN0VGFnKSkgewotCi0gICAgICBIVE1MT2JqZWN0RWxlbWVudCAqbyA9IHN0YXRpY19jYXN0
PEhUTUxPYmplY3RFbGVtZW50ICo+KGVsZW1lbnQoKSk7Ci0KLSAgICAgIGlmICghby0+aXNDb21w
bGV0ZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgICAvLyBDaGVjayBmb3IgYSBjaGlsZCBFTUJF
RCB0YWcuCi0gICAgICBIVE1MRW1iZWRFbGVtZW50KiBlbWJlZCA9IDA7Ci0gICAgICBmb3IgKE5v
ZGUgKmNoaWxkID0gby0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgKSB7Ci0gICAgICAgICAgaWYgKGNo
aWxkLT5oYXNUYWdOYW1lKGVtYmVkVGFnKSkgewotICAgICAgICAgICAgICBlbWJlZCA9IHN0YXRp
Y19jYXN0PEhUTUxFbWJlZEVsZW1lbnQgKj4oIGNoaWxkICk7Ci0gICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSkKLSAg
ICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKTsgICAgICAgICAvLyBEb24n
dCBkZXNjZW5kIGludG8gbmVzdGVkIE9CSkVDVCB0YWdzCi0gICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICBjaGlsZCA9IGNoaWxkLT50cmF2ZXJzZU5leHROb2RlKG8pOyAgIC8vIE90aGVyd2lz
ZSBkZXNjZW5kIChFTUJFRHMgbWF5IGJlIGluc2lkZSBDT01NRU5UIHRhZ3MpCi0gICAgICB9Ci0g
ICAgICAKLSAgICAgIC8vIFVzZSB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBFTUJFRCB0YWcgaW5z
dGVhZCBvZiB0aGUgT0JKRUNUIHRhZyBpbmNsdWRpbmcgV0lEVEggYW5kIEhFSUdIVC4KLSAgICAg
IEhUTUxFbGVtZW50ICplbWJlZE9yT2JqZWN0OwotICAgICAgaWYgKGVtYmVkKSB7Ci0gICAgICAg
ICAgZW1iZWRPck9iamVjdCA9IChIVE1MRWxlbWVudCAqKWVtYmVkOwotICAgICAgICAgIFN0cmlu
ZyBhdHRyaWJ1dGUgPSBlbWJlZE9yT2JqZWN0LT5nZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsKLSAg
ICAgICAgICBpZiAoIWF0dHJpYnV0ZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgIG8tPnNldEF0
dHJpYnV0ZSh3aWR0aEF0dHIsIGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgYXR0cmlidXRlID0gZW1i
ZWRPck9iamVjdC0+Z2V0QXR0cmlidXRlKGhlaWdodEF0dHIpOwotICAgICAgICAgIGlmICghYXR0
cmlidXRlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgby0+c2V0QXR0cmlidXRlKGhlaWdodEF0
dHIsIGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgdXJsID0gZW1iZWQtPnVybDsKLSAgICAgICAgICBz
ZXJ2aWNlVHlwZSA9IGVtYmVkLT5zZXJ2aWNlVHlwZTsKLSAgICAgIH0gZWxzZQotICAgICAgICAg
IGVtYmVkT3JPYmplY3QgPSAoSFRNTEVsZW1lbnQgKilvOwotICAgICAgCi0gICAgICAvLyBJZiB0
aGVyZSB3YXMgbm8gVVJMIG9yIHR5cGUgZGVmaW5lZCBpbiBFTUJFRCwgdHJ5IHRoZSBPQkpFQ1Qg
dGFnLgotICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgdXJsID0gby0+dXJsOwot
ICAgICAgaWYgKHNlcnZpY2VUeXBlLmlzRW1wdHkoKSkKLSAgICAgICAgICBzZXJ2aWNlVHlwZSA9
IG8tPnNlcnZpY2VUeXBlOwotICAgICAgCi0gICAgICBIYXNoU2V0PFN0cmluZ0ltcGwqLCBDYXNl
SW5zZW5zaXRpdmVIYXNoPiB1bmlxdWVQYXJhbU5hbWVzOwotICAgICAgCi0gICAgICAvLyBTY2Fu
IHRoZSBQQVJBTSBjaGlsZHJlbi4KLSAgICAgIC8vIEdldCB0aGUgVVJMIGFuZCB0eXBlIGZyb20g
dGhlIHBhcmFtcyBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlbS4KLSAgICAgIC8vIEdldCB0
aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBwYXJhbXMgaWYgdGhlcmUgaXMgbm8gRU1CRUQgdGFnLgot
ICAgICAgTm9kZSAqY2hpbGQgPSBvLT5maXJzdENoaWxkKCk7Ci0gICAgICB3aGlsZSAoY2hpbGQg
JiYgKHVybC5pc0VtcHR5KCkgfHwgc2VydmljZVR5cGUuaXNFbXB0eSgpIHx8ICFlbWJlZCkpIHsK
LSAgICAgICAgICBpZiAoY2hpbGQtPmhhc1RhZ05hbWUocGFyYW1UYWcpKSB7Ci0gICAgICAgICAg
ICAgIEhUTUxQYXJhbUVsZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxIVE1MUGFyYW1FbGVtZW50Kj4o
Y2hpbGQpOwotICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHAtPm5hbWUoKS5sb3dlcigpOwot
ICAgICAgICAgICAgICBpZiAodXJsLmlzRW1wdHkoKSAmJiAobmFtZSA9PSAic3JjIiB8fCBuYW1l
ID09ICJtb3ZpZSIgfHwgbmFtZSA9PSAiY29kZSIgfHwgbmFtZSA9PSAidXJsIikpCi0gICAgICAg
ICAgICAgICAgICB1cmwgPSBwLT52YWx1ZSgpOwotICAgICAgICAgICAgICBpZiAoc2VydmljZVR5
cGUuaXNFbXB0eSgpICYmIG5hbWUgPT0gInR5cGUiKSB7Ci0gICAgICAgICAgICAgICAgICBzZXJ2
aWNlVHlwZSA9IHAtPnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICBpbnQgcG9zID0gc2Vydmlj
ZVR5cGUuZmluZCgiOyIpOwotICAgICAgICAgICAgICAgICAgaWYgKHBvcyAhPSAtMSkKLSAgICAg
ICAgICAgICAgICAgICAgICBzZXJ2aWNlVHlwZSA9IHNlcnZpY2VUeXBlLmxlZnQocG9zKTsKLSAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoIWVtYmVkICYmICFuYW1lLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgICAgICAgdW5pcXVlUGFyYW1OYW1lcy5hZGQocC0+bmFtZSgpLmlt
cGwoKSk7Ci0gICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzLmFwcGVuZChwLT5uYW1lKCkpOwot
ICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZXMuYXBwZW5kKHAtPnZhbHVlKCkpOwotICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHRTaWJs
aW5nKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFdoZW4gT0JKRUNUIGlzIHVzZWQgZm9y
IGFuIGFwcGxldCB2aWEgU3VuJ3MgSmF2YSBwbHVnaW4sIHRoZSBDT0RFQkFTRSBhdHRyaWJ1dGUg
aW4gdGhlIHRhZwotICAgICAgLy8gcG9pbnRzIHRvIHRoZSBKYXZhIHBsdWdpbiBpdHNlbGYgKGFu
IEFjdGl2ZVggY29tcG9uZW50KSB3aGlsZSB0aGUgYWN0dWFsIGFwcGxldCBDT0RFQkFTRSBpcwot
ICAgICAgLy8gaW4gYSBQQVJBTSB0YWcuIFNlZSA8aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0
cy9wbHVnaW4vMS4yL2RvY3MvdGFncy5odG1sPi4gVGhpcyBtZWFucwotICAgICAgLy8gd2UgaGF2
ZSB0byBleHBsaWNpdGx5IHN1cHByZXNzIHRoZSB0YWcncyBDT0RFQkFTRSBhdHRyaWJ1dGUgaWYg
dGhlcmUgaXMgbm9uZSBpbiBhIFBBUkFNLAotICAgICAgLy8gZWxzZSBvdXIgSmF2YSBwbHVnaW4g
d2lsbCBtaXNpbnRlcnByZXQgaXQuIFs0MDA0NTMxXQotICAgICAgU3RyaW5nIGNvZGViYXNlOwot
ICAgICAgaWYgKCFlbWJlZCAmJiBzZXJ2aWNlVHlwZS5sb3dlcigpID09ICJhcHBsaWNhdGlvbi94
LWphdmEtYXBwbGV0IikgewotICAgICAgICAgIGNvZGViYXNlID0gImNvZGViYXNlIjsKLSAgICAg
ICAgICB1bmlxdWVQYXJhbU5hbWVzLmFkZChjb2RlYmFzZS5pbXBsKCkpOyAvLyBwcmV0ZW5kIHdl
IGZvdW5kIGl0IGluIGEgUEFSQU0gYWxyZWFkeQotICAgICAgfQotICAgICAgCi0gICAgICAvLyBU
dXJuIHRoZSBhdHRyaWJ1dGVzIG9mIGVpdGhlciB0aGUgRU1CRUQgdGFnIG9yIE9CSkVDVCB0YWcg
aW50byBhcnJheXMsIGJ1dCBkb24ndCBvdmVycmlkZSBQQVJBTSB2YWx1ZXMuCi0gICAgICBOYW1l
ZEF0dHJNYXAqIGF0dHJpYnV0ZXMgPSBlbWJlZE9yT2JqZWN0LT5hdHRyaWJ1dGVzKCk7Ci0gICAg
ICBpZiAoYXR0cmlidXRlcykgewotICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBh
dHRyaWJ1dGVzLT5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgICAgICAgIEF0dHJpYnV0ZSogaXQg
PSBhdHRyaWJ1dGVzLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIG5hbWUgPSBpdC0+bmFtZSgpLmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgICBp
ZiAoZW1iZWQgfHwgIXVuaXF1ZVBhcmFtTmFtZXMuY29udGFpbnMobmFtZS5pbXBsKCkpKSB7Ci0g
ICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzLmFwcGVuZChuYW1lLmRvbVN0cmluZygpKTsKLSAg
ICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFwcGVuZChpdC0+dmFsdWUoKS5kb21TdHJpbmco
KSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAg
IC8vIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlLCB0cnkgdG8gbWFwIGZyb20gYSBzcGVj
aWZpYyBDTEFTU0lEIHRvIGEgdHlwZS4KLSAgICAgIGlmIChzZXJ2aWNlVHlwZS5pc0VtcHR5KCkg
JiYgIW8tPmNsYXNzSWQuaXNFbXB0eSgpKQotICAgICAgICAgIG1hcENsYXNzSWRUb1NlcnZpY2VU
eXBlKG8tPmNsYXNzSWQsIHNlcnZpY2VUeXBlKTsKLSAgICAgIAotICAgICAgLy8gSWYgbm8gVVJM
IGFuZCB0eXBlLCBhYm9ydC4KLSAgICAgIGlmICh1cmwuaXNFbXB0eSgpICYmIHNlcnZpY2VUeXBl
LmlzRW1wdHkoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoIWlzVVJMQWxsb3dlZChk
b2N1bWVudCgpLCB1cmwpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgLy8gRmluZCBvdXQg
aWYgd2Ugc3VwcG9ydCBmYWxsYmFjayBjb250ZW50LgotICAgICAgbV9oYXNGYWxsYmFja0NvbnRl
bnQgPSBmYWxzZTsKLSAgICAgIGZvciAoTm9kZSAqY2hpbGQgPSBvLT5maXJzdENoaWxkKCk7IGNo
aWxkICYmICFtX2hhc0ZhbGxiYWNrQ29udGVudDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmco
KSkgewotICAgICAgICAgIGlmICgoIWNoaWxkLT5pc1RleHROb2RlKCkgJiYgIWNoaWxkLT5oYXNU
YWdOYW1lKGVtYmVkVGFnKSAmJiAhY2hpbGQtPmhhc1RhZ05hbWUocGFyYW1UYWcpKSB8fCAvLyBE
aXNjb3VudCA8ZW1iZWQ+IGFuZCA8cGFyYW0+Ci0gICAgICAgICAgICAgIChjaGlsZC0+aXNUZXh0
Tm9kZSgpICYmICFzdGF0aWNfY2FzdDxUZXh0Kj4oY2hpbGQpLT5jb250YWluc09ubHlXaGl0ZXNw
YWNlKCkpKQotICAgICAgICAgICAgICBtX2hhc0ZhbGxiYWNrQ29udGVudCA9IHRydWU7Ci0gICAg
ICB9Ci0gICAgICBib29sIHN1Y2Nlc3MgPSBmcmFtZS0+cmVxdWVzdE9iamVjdCh0aGlzLCB1cmws
IEF0b21pY1N0cmluZyhvLT5uYW1lKCkpLCBzZXJ2aWNlVHlwZSwgcGFyYW1OYW1lcywgcGFyYW1W
YWx1ZXMpOwotICAgICAgaWYgKCFzdWNjZXNzICYmIG1faGFzRmFsbGJhY2tDb250ZW50KQotICAg
ICAgICAgIG8tPnJlbmRlckZhbGxiYWNrQ29udGVudCgpOwotICB9IGVsc2UgaWYgKGVsZW1lbnQo
KS0+aGFzVGFnTmFtZShlbWJlZFRhZykpIHsKLSAgICAgIEhUTUxFbWJlZEVsZW1lbnQgKm8gPSBz
dGF0aWNfY2FzdDxIVE1MRW1iZWRFbGVtZW50ICo+KGVsZW1lbnQoKSk7Ci0gICAgICB1cmwgPSBv
LT51cmw7Ci0gICAgICBzZXJ2aWNlVHlwZSA9IG8tPnNlcnZpY2VUeXBlOwotCi0gICAgICBpZiAo
dXJsLmlzRW1wdHkoKSAmJiBzZXJ2aWNlVHlwZS5pc0VtcHR5KCkpCi0gICAgICAgICAgcmV0dXJu
OwotICAgICAgaWYgKCFpc1VSTEFsbG93ZWQoZG9jdW1lbnQoKSwgdXJsKSkKLSAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAKLSAgICAgIC8vIGFkZCBhbGwgYXR0cmlidXRlcyBzZXQgb24gdGhlIGVt
YmVkIG9iamVjdAotICAgICAgTmFtZWRBdHRyTWFwKiBhID0gby0+YXR0cmlidXRlcygpOwotICAg
ICAgaWYgKGEpIHsKLSAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYS0+bGVuZ3Ro
KCk7ICsraSkgewotICAgICAgICAgICAgICBBdHRyaWJ1dGUqIGl0ID0gYS0+YXR0cmlidXRlSXRl
bShpKTsKLSAgICAgICAgICAgICAgcGFyYW1OYW1lcy5hcHBlbmQoaXQtPm5hbWUoKS5sb2NhbE5h
bWUoKS5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFwcGVuZChpdC0+
dmFsdWUoKS5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgZnJhbWUt
PnJlcXVlc3RPYmplY3QodGhpcywgdXJsLCBvLT5nZXRBdHRyaWJ1dGUobmFtZUF0dHIpLCBzZXJ2
aWNlVHlwZSwgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOwotICB9IGVsc2UgewotICAgICAgYXNz
ZXJ0KGVsZW1lbnQoKS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKTsKLSAgICAgIEhUTUxJRnJhbWVF
bGVtZW50ICpvID0gc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQgKj4oZWxlbWVudCgpKTsK
LSAgICAgIHVybCA9IG8tPm1fVVJMOwotICAgICAgaWYgKCFpc1VSTEFsbG93ZWQoZG9jdW1lbnQo
KSwgdXJsKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAg
ICAgICAgICB1cmwgPSAiYWJvdXQ6YmxhbmsiOwotICAgICAgRnJhbWVWaWV3ICp2ID0gc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3ICo+KG1fdmlldyk7Ci0gICAgICB2LT5mcmFtZSgpLT5yZXF1ZXN0RnJh
bWUodGhpcywgdXJsLCBvLT5tX25hbWUpOwotICB9Ci19Ci0KLXZvaWQgUmVuZGVyUGFydE9iamVj
dDo6bGF5b3V0KCkKLXsKLSAgICBLSFRNTEFzc2VydChuZWVkc0xheW91dCgpKTsKLSAgICBLSFRN
TEFzc2VydChtaW5NYXhLbm93bigpKTsKLQotICAgIGNhbGNXaWR0aCgpOwotICAgIGNhbGNIZWln
aHQoKTsKLQotICAgIFJlbmRlclBhcnQ6OmxheW91dCgpOwotCi0gICAgc2V0TmVlZHNMYXlvdXQo
ZmFsc2UpOwotfQotCi12b2lkIFJlbmRlclBhcnRPYmplY3Q6OnZpZXdDbGVhcmVkKCkKLXsKLSAg
ICBpZiAoZWxlbWVudCgpICYmIG1fd2lkZ2V0ICYmIG1fd2lkZ2V0LT5pc0ZyYW1lVmlldygpKSB7
Ci0gICAgICAgIEZyYW1lVmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fd2lk
Z2V0KTsKLSAgICAgICAgYm9vbCBoYXNCb3JkZXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG1hcmdp
bncgPSAtMTsKLSAgICAgICAgaW50IG1hcmdpbmggPSAtMTsKLSAgICAgICAgaWYgKGVsZW1lbnQo
KS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MSUZyYW1lRWxlbWVu
dCogZnJhbWUgPSBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCAqPihlbGVtZW50KCkpOwot
ICAgICAgICAgICAgaGFzQm9yZGVyID0gZnJhbWUtPm1fZnJhbWVCb3JkZXI7Ci0gICAgICAgICAg
ICBtYXJnaW53ID0gZnJhbWUtPm1fbWFyZ2luV2lkdGg7Ci0gICAgICAgICAgICBtYXJnaW5oID0g
ZnJhbWUtPm1fbWFyZ2luSGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgdmlldy0+c2V0SGFz
Qm9yZGVyKGhhc0JvcmRlcik7Ci0gICAgICAgIHZpZXctPnNldElnbm9yZVdoZWVsRXZlbnRzKGVs
ZW1lbnQoKS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKTsKLSAgICAgICAgaWYgKG1hcmdpbncgIT0g
LTEpCi0gICAgICAgICAgICB2aWV3LT5zZXRNYXJnaW5XaWR0aChtYXJnaW53KTsKLSAgICAgICAg
aWYgKG1hcmdpbmggIT0gLTEpCi0gICAgICAgICAgICB2aWV3LT5zZXRNYXJnaW5IZWlnaHQobWFy
Z2luaCk7Ci0gICAgfQotfQotCi0vLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2Fy
eS4gIFJlbW92ZSB0aGlzIG9uY2UgV2ViS2l0IGtub3dzIHRvIHByb3Blcmx5IHNjaGVkdWxlCi0v
LyBsYXlvdXRzIHVzaW5nIFdlYkNvcmUgd2hlbiBvYmplY3RzIHJlc2l6ZS4KLXZvaWQgUmVuZGVy
UGFydDo6dXBkYXRlV2lkZ2V0UG9zaXRpb24oKQotewotICAgIGlmICghbV93aWRnZXQpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKLSAgICBhYnNv
bHV0ZVBvc2l0aW9uKHgsIHkpOwotICAgIHggKz0gYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQo
KTsKLSAgICB5ICs9IGJvcmRlclRvcCgpICsgcGFkZGluZ1RvcCgpOwotICAgIHdpZHRoID0gbV93
aWR0aCAtIGJvcmRlckxlZnQoKSAtIGJvcmRlclJpZ2h0KCkgLSBwYWRkaW5nTGVmdCgpIC0gcGFk
ZGluZ1JpZ2h0KCk7Ci0gICAgaGVpZ2h0ID0gbV9oZWlnaHQgLSBib3JkZXJUb3AoKSAtIGJvcmRl
ckJvdHRvbSgpIC0gcGFkZGluZ1RvcCgpIC0gcGFkZGluZ0JvdHRvbSgpOwotICAgIEludFJlY3Qg
bmV3Qm91bmRzKHgseSx3aWR0aCxoZWlnaHQpOwotICAgIGlmIChuZXdCb3VuZHMgIT0gbV93aWRn
ZXQtPmZyYW1lR2VvbWV0cnkoKSkgewotICAgICAgICAvLyBUaGUgd2lkZ2V0IGNoYW5nZWQgcG9z
aXRpb25zLiAgVXBkYXRlIHRoZSBmcmFtZSBnZW9tZXRyeS4KLSAgICAgICAgUmVuZGVyQXJlbmEg
KmFyZW5hID0gcmVmKCk7Ci0gICAgICAgIGVsZW1lbnQoKS0+cmVmKCk7Ci0gICAgICAgIG1fd2lk
Z2V0LT5zZXRGcmFtZUdlb21ldHJ5KG5ld0JvdW5kcyk7Ci0gICAgICAgIGVsZW1lbnQoKS0+ZGVy
ZWYoKTsKLSAgICAgICAgZGVyZWYoYXJlbmEpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1fd2lk
Z2V0ICYmIG1fd2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4obV93aWRnZXQpLT5sYXlvdXQoKTsKLSAgICB9Ci19Ci0KLX0KK30KXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCkluZGV4OiBkb20vRG9jdW1lbnQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGRvbS9Eb2N1bWVudC5jcHAJKHJldmlzaW9uIDE0MzMyKQorKysgZG9tL0RvY3VtZW50LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgIkV4Y2VwdGlvbkNv
ZGUuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgorI2luY2x1
ZGUgIkhUTUxCb2R5RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgogI2luY2x1
ZGUgIkhUTUxFbGVtZW50RmFjdG9yeS5oIgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIK
QEAgLTU0LDYgKzU1LDcgQEAKICNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgogI2luY2x1
ZGUgIlJlbmRlckFyZW5hLmgiCiAjaW5jbHVkZSAiUmVuZGVyQ2FudmFzLmgiCisjaW5jbHVkZSAi
UmVuZGVyV2lkZ2V0LmgiCiAjaW5jbHVkZSAiU2VnbWVudGVkU3RyaW5nLmgiCiAjaW5jbHVkZSAi
U2VsZWN0aW9uQ29udHJvbGxlci5oIgogI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKQEAgLTY3LDcg
KzY5LDYgQEAKICNpbmNsdWRlICJodG1sX2ltYWdlaW1wbC5oIgogI2luY2x1ZGUgImtqc19iaW5k
aW5nLmgiCiAjaW5jbHVkZSAia2pzX3Byb3h5LmgiCi0jaW5jbHVkZSAicmVuZGVyX2ZyYW1lcy5o
IgogI2luY2x1ZGUgInhtbF90b2tlbml6ZXIuaCIKICNpbmNsdWRlICJ4bWxodHRwcmVxdWVzdC5o
IgogI2luY2x1ZGUgIlhQYXRoRXZhbHVhdG9yLmgiCkBAIC0xOTk2LDcgKzE5OTcsNyBAQCBzdGF0
aWMgV2lkZ2V0ICp3aWRnZXRGb3JOb2RlKE5vZGUgKmZvY3VzCiAgICAgUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciA9IGZvY3VzTm9kZS0+cmVuZGVyZXIoKTsKICAgICBpZiAoIXJlbmRlcmVyIHx8ICFy
ZW5kZXJlci0+aXNXaWRnZXQoKSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlbmRlcldpZGdldCAqPihyZW5kZXJlciktPndpZGdldCgpOworICAgIHJldHVybiBz
dGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPihyZW5kZXJlciktPndpZGdldCgpOwogfQogCiBib29s
IERvY3VtZW50OjpzZXRGb2N1c05vZGUoUGFzc1JlZlB0cjxOb2RlPiBuZXdGb2N1c05vZGUpCklu
ZGV4OiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxNDMzMikKKysrIFdlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNDIwLDcgKzQy
MCw2IEBACiAJCTkzRUVDMjA0MDlDMjg3NzcwMEM1MTVEMSAvKiBDYW52YXNQYXR0ZXJuLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5M0VFQzFGMjA5QzI4
Nzc3MDBDNTE1RDEgLyogQ2FudmFzUGF0dGVybi5oICovOyB9OwogCQk5M0VFQzI2RjA5QzMyMTgw
MDBDNTE1RDEgLyogQ2FudmFzUGF0dGVybi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA5M0VFQzI2RTA5QzMyMTgwMDBDNTE1RDEgLyogQ2FudmFzUGF0
dGVybi5jcHAgKi87IH07CiAJCTkzRUVDMjcxMDlDMzIxODgwMEM1MTVEMSAvKiBDYW52YXNTdHls
ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5M0VF
QzI3MDA5QzMyMTg4MDBDNTE1RDEgLyogQ2FudmFzU3R5bGUuY3BwICovOyB9OwotCQk5M0YxOThF
MzA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9iYXNlaW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyMzgwMkRFNDM5NjAxODYzNUNBIC8qIGh0
bWxfYmFzZWltcGwuaCAqLzsgfTsKIAkJOTNGMTk4RTQwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxf
YmxvY2tpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGNTIzRDIzQTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9ibG9ja2ltcGwuaCAqLzsgfTsKIAkJ
OTNGMTk4RTUwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxEb2N1bWVudC5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyM0MwMkRFNDM5NjAxODYzNUNB
IC8qIEhUTUxEb2N1bWVudC5oICovOyB9OwogCQk5M0YxOThFNjA4MjQ1RTU5MDAxRTlBQkMgLyog
SFRNTEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEY1MjNEMjNGMDJERTQzOTYwMTg2MzVDQSAvKiBIVE1MRWxlbWVudC5oICovOyB9OwpAQCAt
NTE1LDcgKzUxNCw2IEBACiAJCTkzRjE5QTU2MDgyNDVFNTkwMDFFOUFCQyAvKiBEZXByZWNhdGVk
VmFsdWVMaXN0SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBGNTg3ODUzQzAyREUzNzU5MDFFQTQxMjIgLyogRGVwcmVjYXRlZFZhbHVlTGlzdElt
cGwuY3BwICovOyB9OwogCQk5M0YxOUE1RDA4MjQ1RTU5MDAxRTlBQkMgLyogV2ViQ29yZUltYWdl
UmVuZGVyZXJGYWN0b3J5Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBGNTg3ODU0RjAyREUzNzU5MDFFQTQxMjIgLyogV2ViQ29yZUltYWdlUmVuZGVyZXJG
YWN0b3J5Lm0gKi87IH07CiAJCTkzRjE5QTVGMDgyNDVFNTkwMDFFOUFCQyAvKiBXZWJDb3JlVmll
d0ZhY3RvcnkubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEY1ODc4NTU1MDJERTM3NTkwMUVBNDEyMiAvKiBXZWJDb3JlVmlld0ZhY3RvcnkubSAqLzsgfTsK
LQkJOTNGMTlBOEYwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfYmFzZWltcGwuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyMzcwMkRFNDM5NjAx
ODYzNUNBIC8qIGh0bWxfYmFzZWltcGwuY3BwICovOyB9OwogCQk5M0YxOUE5MDA4MjQ1RTU5MDAx
RTlBQkMgLyogaHRtbF9ibG9ja2ltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyMzkwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfYmxvY2tp
bXBsLmNwcCAqLzsgfTsKIAkJOTNGMTlBOTEwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxEb2N1bWVu
dC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIz
RDIzQjAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTERvY3VtZW50LmNwcCAqLzsgfTsKIAkJOTNGMTlB
OTIwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjNFMDJERTQzOTYwMTg2MzVDQSAvKiBI
VE1MRWxlbWVudC5jcHAgKi87IH07CkBAIC02ODEsNiArNjc5LDMwIEBACiAJCUE4NzFEQzI4MEEx
NTIwNTcwMEIxMkE2OCAvKiBIVE1MVGl0bGVFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREMxQzBBMTUyMDU3MDBCMTJBNjggLyogSFRN
TFRpdGxlRWxlbWVudC5oICovOyB9OwogCQlBODcxREMyOTBBMTUyMDU3MDBCMTJBNjggLyogSFRN
TFRpdGxlRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBODcxREMxRDBBMTUyMDU3MDBCMTJBNjggLyogSFRNTFRpdGxlRWxlbWVudC5jcHAg
Ki87IH07CiAJCUE4NzFEQzJBMEExNTIwNTcwMEIxMkE2OCAvKiBIVE1MQmFzZUVsZW1lbnQuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg3MURDMUUw
QTE1MjA1NzAwQjEyQTY4IC8qIEhUTUxCYXNlRWxlbWVudC5jcHAgKi87IH07CisJCUE4NzFERTIz
MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJhbWVFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFERTE3MEExNTJBQzgwMEIxMkE2OCAv
KiBIVE1MRnJhbWVFbGVtZW50LmNwcCAqLzsgfTsKKwkJQTg3MURFMjQwQTE1MkFDODAwQjEyQTY4
IC8qIEhUTUxJRnJhbWVFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEE4NzFERTE4MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSUZyYW1lRWxl
bWVudC5jcHAgKi87IH07CisJCUE4NzFERTI1MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSGVhZEVs
ZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTg3MURFMTkwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxIZWFkRWxlbWVudC5jcHAgKi87IH07CisJ
CUE4NzFERTI2MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg3MURFMUEwQTE1MkFDODAw
QjEyQTY4IC8qIEhUTUxIdG1sRWxlbWVudC5jcHAgKi87IH07CisJCUE4NzFERTI3MEExNTJBQzgw
MEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFERTFCMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVs
ZW1lbnQuaCAqLzsgfTsKKwkJQTg3MURFMjgwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxGcmFtZVNl
dEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEE4NzFERTFDMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJhbWVTZXRFbGVtZW50LmggKi87IH07
CisJCUE4NzFERTI5MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MQm9keUVsZW1lbnQuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg3MURFMUQwQTE1MkFD
ODAwQjEyQTY4IC8qIEhUTUxCb2R5RWxlbWVudC5jcHAgKi87IH07CisJCUE4NzFERTJBMEExNTJB
QzgwMEIxMkE2OCAvKiBIVE1MSUZyYW1lRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg3MURFMUUwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxJ
RnJhbWVFbGVtZW50LmggKi87IH07CisJCUE4NzFERTJCMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1M
RnJhbWVFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBODcxREUxRjBBMTUyQUM4MDBCMTJBNjggLyogSFRNTEZyYW1lRWxlbWVudC5oICovOyB9
OworCQlBODcxREUyQzBBMTUyQUM4MDBCMTJBNjggLyogSFRNTEJvZHlFbGVtZW50LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREUyMDBBMTUyQUM4
MDBCMTJBNjggLyogSFRNTEJvZHlFbGVtZW50LmggKi87IH07CisJCUE4NzFERTJEMEExNTJBQzgw
MEIxMkE2OCAvKiBIVE1MSGVhZEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFERTIxMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSGVhZEVs
ZW1lbnQuaCAqLzsgfTsKKwkJQTg3MURFMkUwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxGcmFtZVNl
dEVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTg3MURFMjIwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxGcmFtZVNldEVsZW1lbnQuY3BwICov
OyB9OworCQlBODcxREVEMDBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyUGFydC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREVDODBBMTUzMEM3
MDBCMTJBNjggLyogUmVuZGVyUGFydC5jcHAgKi87IH07CisJCUE4NzFERUQxMEExNTMwQzcwMEIx
MkE2OCAvKiBSZW5kZXJGcmFtZVNldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQTg3MURFQzkwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lU2V0
LmggKi87IH07CisJCUE4NzFERUQyMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJGcmFtZVNldC5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREVD
QTBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyRnJhbWVTZXQuY3BwICovOyB9OworCQlBODcxREVE
MzBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyRnJhbWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFERUNCMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5k
ZXJGcmFtZS5oICovOyB9OworCQlBODcxREVENDBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyRnJh
bWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg3
MURFQ0MwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lLmNwcCAqLzsgfTsKKwkJQTg3MURF
RDUwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlclBhcnRPYmplY3QuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFERUNEMEExNTMwQzcwMEIxMkE2OCAv
KiBSZW5kZXJQYXJ0T2JqZWN0LmggKi87IH07CisJCUE4NzFERUQ2MEExNTMwQzcwMEIxMkE2OCAv
KiBSZW5kZXJQYXJ0T2JqZWN0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEE4NzFERUNFMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJQYXJ0T2JqZWN0
LmNwcCAqLzsgfTsKKwkJQTg3MURFRDcwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlclBhcnQuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFERUNGMEEx
NTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJQYXJ0LmggKi87IH07CisJCUE4NzFERkUyMEExNTM3NkIw
MEIxMkE2OCAvKiBSZW5kZXJSZXBsYWNlZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREZERTBBMTUzNzZCMDBCMTJBNjggLyogUmVuZGVyUmVw
bGFjZWQuY3BwICovOyB9OworCQlBODcxREZFMzBBMTUzNzZCMDBCMTJBNjggLyogUmVuZGVyUmVw
bGFjZWQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4
NzFERkRGMEExNTM3NkIwMEIxMkE2OCAvKiBSZW5kZXJSZXBsYWNlZC5oICovOyB9OworCQlBODcx
REZFNDBBMTUzNzZCMDBCMTJBNjggLyogUmVuZGVyV2lkZ2V0LmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREZFMDBBMTUzNzZCMDBCMTJBNjggLyog
UmVuZGVyV2lkZ2V0LmggKi87IH07CisJCUE4NzFERkU1MEExNTM3NkIwMEIxMkE2OCAvKiBSZW5k
ZXJXaWRnZXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTg3MURGRTEwQTE1Mzc2QjAwQjEyQTY4IC8qIFJlbmRlcldpZGdldC5jcHAgKi87IH07CiAJ
CUE4OEFEMzg2MDk1MjQ4NkQwMDFERDE5NiAvKiBLUmVuZGVyaW5nRGV2aWNlLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4QzBGQjU0MDg5NzAxRjcw
MEJBNTExNCAvKiBLUmVuZGVyaW5nRGV2aWNlLmNwcCAqLzsgfTsKIAkJQTg4QUQzODcwOTUyNDg2
RDAwMUREMTk2IC8qIEtSZW5kZXJpbmdEZXZpY2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4QzBGQjU1MDg5NzAxRjcwMEJBNTExNCAvKiBLUmVuZGVy
aW5nRGV2aWNlLmggKi87IH07CiAJCUE4OEFEMzg4MDk1MjQ4NkQwMDFERDE5NiAvKiBLUmVuZGVy
aW5nRmlsbFBhaW50ZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQThDMEZCNTkwODk3MDFGNzAwQkE1MTE0IC8qIEtSZW5kZXJpbmdGaWxsUGFpbnRl
ci5jcHAgKi87IH07CkBAIC0xMTkyLDggKzEyMTQsNiBAQAogCQlCQ0VBNDg3MDA5N0Q5MzAyMDA5
NEM5RTQgLyogUmVuZGVyRmxvdy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkNFQTQ4MzEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckZsb3cuaCAqLzsg
fTsKIAkJQkNFQTQ4NzEwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mb3JtLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODMyMDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfZm9ybS5jcHAgKi87IH07CiAJCUJDRUE0ODcyMDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfZm9ybS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkNFQTQ4MzMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mb3JtLmggKi87
IH07Ci0JCUJDRUE0ODczMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZnJhbWVzLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODM0MDk3RDkz
MDIwMDk0QzlFNCAvKiByZW5kZXJfZnJhbWVzLmNwcCAqLzsgfTsKLQkJQkNFQTQ4NzQwOTdEOTMw
MjAwOTRDOUU0IC8qIHJlbmRlcl9mcmFtZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODM1MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZnJh
bWVzLmggKi87IH07CiAJCUJDRUE0ODc1MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbWFnZS5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgz
NjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW1hZ2UuY3BwICovOyB9OwogCQlCQ0VBNDg3NjA5
N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW1hZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODM3MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJ
bWFnZS5oICovOyB9OwogCQlCQ0VBNDg3NzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW5saW5l
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0
ODM4MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbmxpbmUuY3BwICovOyB9OwpAQCAtMTIwNiw4
ICsxMjI2LDYgQEAKIAkJQkNFQTQ4N0UwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9saXN0Lmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgzRjA5
N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2xpc3QuaCAqLzsgfTsKIAkJQkNFQTQ4N0YwOTdEOTMw
MjAwOTRDOUU0IC8qIFJlbmRlck9iamVjdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDg0MDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyT2Jq
ZWN0LmNwcCAqLzsgfTsKIAkJQkNFQTQ4ODAwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlck9iamVj
dC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4
NDEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlck9iamVjdC5oICovOyB9OwotCQlCQ0VBNDg4MTA5
N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODQyMDk3RDkzMDIwMDk0QzlFNCAvKiBy
ZW5kZXJfcmVwbGFjZWQuY3BwICovOyB9OwotCQlCQ0VBNDg4MjA5N0Q5MzAyMDA5NEM5RTQgLyog
cmVuZGVyX3JlcGxhY2VkLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBCQ0VBNDg0MzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3JlcGxhY2VkLmggKi87
IH07CiAJCUJDRUE0ODgzMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4NDQwOTdEOTMw
MjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5jcHAgKi87IH07CiAJCUJDRUE0ODg0MDk3RDkzMDIw
MDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRUE0ODQ1MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUu
aCAqLzsgfTsKIAkJQkNFQTQ4ODcwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1lTWFjLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDg0ODA5
N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWVNYWMuaCAqLzsgfTsKQEAgLTIwNDcsNiArMjA2
NSwzMCBAQAogCQlBODcxREMxQzBBMTUyMDU3MDBCMTJBNjggLyogSFRNTFRpdGxlRWxlbWVudC5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRNTFRpdGxlRWxlbWVudC5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBODcxREMxRDBBMTUyMDU3MDBCMTJBNjggLyog
SFRNTFRpdGxlRWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gSFRNTFRpdGxlRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE4
NzFEQzFFMEExNTIwNTcwMEIxMkE2OCAvKiBIVE1MQmFzZUVsZW1lbnQuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEhUTUxCYXNlRWxlbWVudC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFERTE3MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJh
bWVFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1M
RnJhbWVFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTg3MURFMTgw
QTE1MkFDODAwQjEyQTY4IC8qIEhUTUxJRnJhbWVFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1MSUZyYW1lRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUE4NzFERTE5MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSGVhZEVs
ZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEhUTUxIZWFk
RWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFERTFBMEExNTJB
QzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IEhUTUxIdG1sRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUE4NzFERTFCMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxIdG1sRWxlbWVudC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODcxREUxQzBBMTUyQUM4MDBCMTJBNjggLyogSFRN
TEZyYW1lU2V0RWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRN
TEZyYW1lU2V0RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODcxREUx
RDBBMTUyQUM4MDBCMTJBNjggLyogSFRNTEJvZHlFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1MQm9keUVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlBODcxREUxRTBBMTUyQUM4MDBCMTJBNjggLyogSFRNTElGcmFtZUVs
ZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxJRnJhbWVFbGVt
ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFERTFGMEExNTJBQzgwMEIx
MkE2OCAvKiBIVE1MRnJhbWVFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBIVE1MRnJhbWVFbGVtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4
NzFERTIwMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MQm9keUVsZW1lbnQuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxCb2R5RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlBODcxREUyMTBBMTUyQUM4MDBCMTJBNjggLyogSFRNTEhlYWRFbGVtZW50
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MSGVhZEVsZW1lbnQuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTg3MURFMjIwQTE1MkFDODAwQjEyQTY4IC8q
IEhUTUxGcmFtZVNldEVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IEhUTUxGcmFtZVNldEVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQlBODcxREVDODBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyUGFydC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyUGFydC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUE4NzFERUM5MEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJGcmFt
ZVNldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyRnJhbWVTZXQu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTg3MURFQ0EwQTE1MzBDNzAwQjEyQTY4
IC8qIFJlbmRlckZyYW1lU2V0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBSZW5kZXJGcmFtZVNldC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4
NzFERUNCMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJGcmFtZS5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyRnJhbWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQTg3MURFQ0MwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJGcmFtZS5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFERUNEMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJQ
YXJ0T2JqZWN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
MzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJQYXJ0
T2JqZWN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFERUNFMEExNTMwQzcw
MEIxMkE2OCAvKiBSZW5kZXJQYXJ0T2JqZWN0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBSZW5kZXJQYXJ0T2JqZWN0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQTg3MURFQ0YwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlclBhcnQuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlclBhcnQuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJQTg3MURGREUwQTE1Mzc2QjAwQjEyQTY4IC8qIFJlbmRlclJlcGxhY2Vk
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJSZXBsYWNl
ZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFERkRGMEExNTM3NkIwMEIx
MkE2OCAvKiBSZW5kZXJSZXBsYWNlZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gUmVuZGVyUmVwbGFjZWQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTg3MURG
RTAwQTE1Mzc2QjAwQjEyQTY4IC8qIFJlbmRlcldpZGdldC5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gUmVuZGVyV2lkZ2V0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4NzFERkUxMEExNTM3NkIwMEIxMkE2OCAvKiBSZW5kZXJXaWRnZXQuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlcldpZGdldC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUE4ODQyODM4MDkzMDhDMUMwMEI2RDQ2MSAvKiBTVkdOYW1l
c1dyYXBwZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBTVkdOYW1lc1dyYXBwZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0
YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJQTg4NDI4MzkwOTMwOEMxQzAwQjZENDYx
IC8qIFNWR0VsZW1lbnRGYWN0b3J5V3JhcHBlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFNWR0VsZW1lbnRGYWN0b3J5V3JhcHBlci5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9
OwogCQlBODg0MjgzRDA5MzA4QzFDMDBCNkQ0NjEgLyogRE9NTGlzdC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERPTUxpc3QuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CkBAIC0yNTc3LDgg
KzI2MTksNiBAQAogCQlCQ0VBNDgzMTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyRmxvdy5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyRmxvdy5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQlCQ0VBNDgzMjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zv
cm0uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IHJlbmRlcl9mb3Jt
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4MzMwOTdEOTMwMjAwOTRD
OUU0IC8qIHJlbmRlcl9mb3JtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBy
ZW5kZXJfZm9ybS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlCQ0VBNDgzNDA5N0Q5
MzAyMDA5NEM5RTQgLyogcmVuZGVyX2ZyYW1lcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gcmVuZGVyX2ZyYW1lcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07Ci0JCUJDRUE0ODM1MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZnJhbWVzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSByZW5kZXJfZnJhbWVzLmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0ODM2MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbWFn
ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVySW1hZ2Uu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0VBNDgzNzA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVySW1hZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJl
bmRlckltYWdlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0ODM4MDk3RDkz
MDIwMDk0QzlFNCAvKiBSZW5kZXJJbmxpbmUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IFJlbmRlcklubGluZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CkBAIC0yNTkxLDggKzI2MzEsNiBAQAogCQlCQ0VBNDgzRjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX2xpc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IHJlbmRlcl9saXN0
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0ODQwMDk3RDkzMDIwMDk0QzlF
NCAvKiBSZW5kZXJPYmplY3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IFJlbmRlck9iamVjdC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDRUE0
ODQxMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJPYmplY3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFJlbmRlck9iamVjdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwotCQlCQ0VBNDg0MjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSByZW5kZXJfcmVwbGFjZWQuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlCQ0VBNDg0MzA5N0Q5MzAyMDA5NEM5RTQgLyog
cmVuZGVyX3JlcGxhY2VkLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSByZW5k
ZXJfcmVwbGFjZWQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4NDQwOTdE
OTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gcmVuZGVyX3N0eWxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJQkNFQTQ4NDUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9zdHlsZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gcmVuZGVyX3N0eWxlLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCUJDRUE0ODQ4MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUaGVtZU1h
Yy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyVGhlbWVNYWMuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTI2NDAsOCArMjY3OCw2IEBACiAJCUUxRjA0
MjQ1MDk4MzkzODkwMDY2OTRFQSAvKiB4bWxodHRwcmVxdWVzdC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSB4bWxodHRwcmVxdWVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlFRDA0OEFCQjA4MzNGMTMyMDA2RTFFNjcgLyogdGV4dEFyZWFSZXNpemVDb3JuZXIu
dGlmZiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGlt
YWdlLnRpZmY7IHBhdGggPSB0ZXh0QXJlYVJlc2l6ZUNvcm5lci50aWZmOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlFRDJCQTgzQjA5QTI0QjkxMDA2QzBBQzQgLyogRG9jdW1lbnRNYXJr
ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRG9jdW1lbnRNYXJrZXIuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJRjUyM0QyMzcwMkRFNDM5NjAxODYzNUNBIC8q
IGh0bWxfYmFzZWltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gaHRtbF9iYXNlaW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwotCQlGNTIzRDIzODAyREU0Mzk2MDE4
NjM1Q0EgLyogaHRtbF9iYXNlaW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBodG1sX2Jhc2VpbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDIzOTAyREU0Mzk2MDE4
NjM1Q0EgLyogaHRtbF9ibG9ja2ltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gaHRtbF9ibG9ja2ltcGwuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRjUyM0QyM0Ew
MkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfYmxvY2tpbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGh0bWxfYmxvY2tpbXBsLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDIz
QjAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTERvY3VtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEhUTUxEb2N1bWVudC5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpAQCAt
MzI2OSw4ICszMzA1LDYgQEAKIAkJCQk5M0VFQzFFRjA5QzI4Nzc3MDBDNTE1RDEgLyogQ2FudmFz
U3R5bGUuaCAqLywKIAkJCQlBODEzNkQzNzA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0
LmNwcCAqLywKIAkJCQlBODEzNkQzNjA5NzNBOEU3MDBENzQ0NjMgLyogRm9ybURhdGFMaXN0Lmgg
Ki8sCi0JCQkJRjUyM0QyMzcwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfYmFzZWltcGwuY3BwICov
LAotCQkJCUY1MjNEMjM4MDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2Jhc2VpbXBsLmggKi8sCiAJ
CQkJRjUyM0QyMzkwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfYmxvY2tpbXBsLmNwcCAqLywKIAkJ
CQlGNTIzRDIzQTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9ibG9ja2ltcGwuaCAqLywKIAkJCQlG
NTIzRDI0NDAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9pbWFnZWltcGwuY3BwICovLApAQCAtMzI4
NSw2ICszMzE5LDggQEAKIAkJCQlBODcxREMxMzBBMTUyMDU3MDBCMTJBNjggLyogSFRNTEJhc2VF
bGVtZW50LmggKi8sCiAJCQkJQThERjNGQ0IwOTdGQTBGQjAwNTI5ODFCIC8qIEhUTUxCYXNlRm9u
dEVsZW1lbnQuY3BwICovLAogCQkJCUE4REYzRkNBMDk3RkEwRkIwMDUyOTgxQiAvKiBIVE1MQmFz
ZUZvbnRFbGVtZW50LmggKi8sCisJCQkJQTg3MURFMUQwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxC
b2R5RWxlbWVudC5jcHAgKi8sCisJCQkJQTg3MURFMjAwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxC
b2R5RWxlbWVudC5oICovLAogCQkJCUE4MTM2OUI3MDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MQnV0
dG9uRWxlbWVudC5jcHAgKi8sCiAJCQkJQTgxMzY5QjYwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxC
dXR0b25FbGVtZW50LmggKi8sCiAJCQkJNTFGNkEzRDUwNjYzQkYwNDAwNEQyOTE5IC8qIEhUTUxD
YW52YXNFbGVtZW50LmNwcCAqLywKQEAgLTMzMDgsOCArMzM0NCwxOCBAQAogCQkJCUE4REYzRkM2
MDk3RkEwRkIwMDUyOTgxQiAvKiBIVE1MRm9ybUNvbGxlY3Rpb24uaCAqLywKIAkJCQlBODEzNjlC
NTA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEZvcm1FbGVtZW50LmNwcCAqLywKIAkJCQlBODEzNjlC
NDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTEZvcm1FbGVtZW50LmggKi8sCisJCQkJQTg3MURFMTcw
QTE1MkFDODAwQjEyQTY4IC8qIEhUTUxGcmFtZUVsZW1lbnQuY3BwICovLAorCQkJCUE4NzFERTFG
MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJhbWVFbGVtZW50LmggKi8sCisJCQkJQTg3MURFMjIw
QTE1MkFDODAwQjEyQTY4IC8qIEhUTUxGcmFtZVNldEVsZW1lbnQuY3BwICovLAorCQkJCUE4NzFE
RTFDMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJhbWVTZXRFbGVtZW50LmggKi8sCiAJCQkJQTgx
MzY5QjMwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxHZW5lcmljRm9ybUVsZW1lbnQuY3BwICovLAog
CQkJCUE4MTM2OUIyMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Lmgg
Ki8sCisJCQkJQTg3MURFMTkwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxIZWFkRWxlbWVudC5jcHAg
Ki8sCisJCQkJQTg3MURFMjEwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxIZWFkRWxlbWVudC5oICov
LAorCQkJCUE4NzFERTFBMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuY3BwICov
LAorCQkJCUE4NzFERTFCMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuaCAqLywK
KwkJCQlBODcxREUxODBBMTUyQUM4MDBCMTJBNjggLyogSFRNTElGcmFtZUVsZW1lbnQuY3BwICov
LAorCQkJCUE4NzFERTFFMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSUZyYW1lRWxlbWVudC5oICov
LAogCQkJCUE4MTM2OUIxMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MSW5wdXRFbGVtZW50LmNwcCAq
LywKIAkJCQlBODEzNjlCMDA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTElucHV0RWxlbWVudC5oICov
LAogCQkJCUE4MTM2OUFGMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MSXNJbmRleEVsZW1lbnQuY3Bw
ICovLApAQCAtNDMwMywxNiArNDM0OSwxNiBAQAogCQkJCUJDRUE0ODI3MDk3RDkzMDIwMDk0QzlF
NCAvKiByZW5kZXJfYnV0dG9uLmggKi8sCiAJCQkJQkNFQTQ4MzIwOTdEOTMwMjAwOTRDOUU0IC8q
IHJlbmRlcl9mb3JtLmNwcCAqLywKIAkJCQlCQ0VBNDgzMzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX2Zvcm0uaCAqLywKLQkJCQlCQ0VBNDgzNDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zy
YW1lcy5jcHAgKi8sCi0JCQkJQkNFQTQ4MzUwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9mcmFt
ZXMuaCAqLywKIAkJCQlCQ0VBNDgzQzA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2xpbmUuY3Bw
ICovLAogCQkJCUJDRUE0ODNEMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfbGluZS5oICovLAog
CQkJCUJDRUE0ODNFMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfbGlzdC5jcHAgKi8sCiAJCQkJ
QkNFQTQ4M0YwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9saXN0LmggKi8sCi0JCQkJQkNFQTQ4
NDIwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9yZXBsYWNlZC5jcHAgKi8sCi0JCQkJQkNFQTQ4
NDMwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9yZXBsYWNlZC5oICovLAogCQkJCUJDRUE0ODQ0
MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuY3BwICovLAogCQkJCUJDRUE0ODQ1MDk3
RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuaCAqLywKKwkJCQlBODcxREZERTBBMTUzNzZC
MDBCMTJBNjggLyogUmVuZGVyUmVwbGFjZWQuY3BwICovLAorCQkJCUE4NzFERkRGMEExNTM3NkIw
MEIxMkE2OCAvKiBSZW5kZXJSZXBsYWNlZC5oICovLAorCQkJCUE4NzFERkUwMEExNTM3NkIwMEIx
MkE2OCAvKiBSZW5kZXJXaWRnZXQuaCAqLywKKwkJCQlBODcxREZFMTBBMTUzNzZCMDBCMTJBNjgg
LyogUmVuZGVyV2lkZ2V0LmNwcCAqLywKIAkJCQlCQ0VBNDgxQzA5N0Q5MzAyMDA5NEM5RTQgLyog
UmVuZGVyQXBwbGV0LmNwcCAqLywKIAkJCQlCQ0VBNDgxRDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVu
ZGVyQXBwbGV0LmggKi8sCiAJCQkJQkNFQTQ4MUUwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckFy
ZW5hLmNwcCAqLywKQEAgLTQzMzMsNiArNDM3OSwxMCBAQAogCQkJCUJDRUE0ODJGMDk3RDkzMDIw
MDk0QzlFNCAvKiBSZW5kZXJGbGV4aWJsZUJveC5oICovLAogCQkJCUJDRUE0ODMwMDk3RDkzMDIw
MDk0QzlFNCAvKiBSZW5kZXJGbG93LmNwcCAqLywKIAkJCQlCQ0VBNDgzMTA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVyRmxvdy5oICovLAorCQkJCUE4NzFERUNDMEExNTMwQzcwMEIxMkE2OCAvKiBS
ZW5kZXJGcmFtZS5jcHAgKi8sCisJCQkJQTg3MURFQ0IwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRl
ckZyYW1lLmggKi8sCisJCQkJQTg3MURFQ0EwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlckZyYW1l
U2V0LmNwcCAqLywKKwkJCQlBODcxREVDOTBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyRnJhbWVT
ZXQuaCAqLywKIAkJCQlCQ0VBNDgyQTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySFRNTENhbnZh
cy5jcHAgKi8sCiAJCQkJQkNFQTQ4MkIwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckhUTUxDYW52
YXMuaCAqLywKIAkJCQlCQ0VBNDgzNjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW1hZ2UuY3Bw
ICovLApAQCAtNDM0Myw2ICs0MzkzLDEwIEBACiAJCQkJQkNFQTQ4M0IwOTdEOTMwMjAwOTRDOUU0
IC8qIFJlbmRlckxheWVyLmggKi8sCiAJCQkJQkNFQTQ4NDAwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlck9iamVjdC5jcHAgKi8sCiAJCQkJQkNFQTQ4NDEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRl
ck9iamVjdC5oICovLAorCQkJCUE4NzFERUM4MEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJQYXJ0
LmNwcCAqLywKKwkJCQlBODcxREVDRjBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyUGFydC5oICov
LAorCQkJCUE4NzFERUNFMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJQYXJ0T2JqZWN0LmNwcCAq
LywKKwkJCQlBODcxREVDRDBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyUGFydE9iamVjdC5oICov
LAogCQkJCUE4REY0QUUyMDk4MEM0MkMwMDUyOTgxQiAvKiBSZW5kZXJUYWJsZS5jcHAgKi8sCiAJ
CQkJQThERjRBRTEwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlLmggKi8sCiAJCQkJQThE
RjRBRTAwOTgwQzQyQzAwNTI5ODFCIC8qIFJlbmRlclRhYmxlQ2VsbC5jcHAgKi8sCkBAIC00NTMw
LDcgKzQ1ODQsNiBAQAogCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CiAJCQlidWlsZEFj
dGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OwogCQkJZmlsZXMgPSAoCi0JCQkJOTNGMTk4RTMwODI0NUU1
OTAwMUU5QUJDIC8qIGh0bWxfYmFzZWltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OEU0
MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2Jsb2NraW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
OTNGMTk4RTUwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxEb2N1bWVudC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJOTNGMTk4RTYwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxFbGVtZW50LmggaW4gSGVhZGVy
cyAqLywKQEAgLTQ4NzgsMTQgKzQ5MzEsMTIgQEAKIAkJCQlCQ0VBNDg2RTA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVyRmxleGlibGVCb3guaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODcwMDk3
RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbG93LmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg3
MjA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2Zvcm0uaCBpbiBIZWFkZXJzICovLAotCQkJCUJD
RUE0ODc0MDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfZnJhbWVzLmggaW4gSGVhZGVycyAqLywK
IAkJCQlCQ0VBNDg3NjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVySW1hZ2UuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRUE0ODc4MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbmxpbmUuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDRUE0ODdBMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJMYXllci5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4N0MwOTdEOTMwMjAwOTRDOUU0IC8qIHJlbmRlcl9s
aW5lLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VBNDg3RTA5N0Q5MzAyMDA5NEM5RTQgLyogcmVu
ZGVyX2xpc3QuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODgwMDk3RDkzMDIwMDk0QzlFNCAv
KiBSZW5kZXJPYmplY3QuaCBpbiBIZWFkZXJzICovLAotCQkJCUJDRUE0ODgyMDk3RDkzMDIwMDk0
QzlFNCAvKiByZW5kZXJfcmVwbGFjZWQuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODg0MDk3
RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0
ODg3MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUaGVtZU1hYy5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJQkNFQTQ4OEEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1lLmggaW4gSGVhZGVycyAq
LywKQEAgLTUxNDksNiArNTIwMCwxOCBAQAogCQkJCUE4NzFEQzI0MEExNTIwNTcwMEIxMkE2OCAv
KiBIVE1MTWV0YUVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4NzFEQzI1MEExNTIwNTcw
MEIxMkE2OCAvKiBIVE1MU2NyaXB0RWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTg3MURD
MjgwQTE1MjA1NzAwQjEyQTY4IC8qIEhUTUxUaXRsZUVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAor
CQkJCUE4NzFERTI3MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuaCBpbiBIZWFk
ZXJzICovLAorCQkJCUE4NzFERTI4MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJhbWVTZXRFbGVt
ZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlBODcxREUyQTBBMTUyQUM4MDBCMTJBNjggLyogSFRN
TElGcmFtZUVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4NzFERTJCMEExNTJBQzgwMEIx
MkE2OCAvKiBIVE1MRnJhbWVFbGVtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlBODcxREUyQzBB
MTUyQUM4MDBCMTJBNjggLyogSFRNTEJvZHlFbGVtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlB
ODcxREUyRDBBMTUyQUM4MDBCMTJBNjggLyogSFRNTEhlYWRFbGVtZW50LmggaW4gSGVhZGVycyAq
LywKKwkJCQlBODcxREVEMTBBMTUzMEM3MDBCMTJBNjggLyogUmVuZGVyRnJhbWVTZXQuaCBpbiBI
ZWFkZXJzICovLAorCQkJCUE4NzFERUQzMEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJGcmFtZS5o
IGluIEhlYWRlcnMgKi8sCisJCQkJQTg3MURFRDUwQTE1MzBDNzAwQjEyQTY4IC8qIFJlbmRlclBh
cnRPYmplY3QuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4NzFERUQ3MEExNTMwQzcwMEIxMkE2OCAv
KiBSZW5kZXJQYXJ0LmggaW4gSGVhZGVycyAqLywKKwkJCQlBODcxREZFMzBBMTUzNzZCMDBCMTJB
NjggLyogUmVuZGVyUmVwbGFjZWQuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4NzFERkU0MEExNTM3
NkIwMEIxMkE2OCAvKiBSZW5kZXJXaWRnZXQuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtNTM1OSw3ICs1
NDIyLDYgQEAKIAkJCQk5M0YxOUE1NjA4MjQ1RTU5MDAxRTlBQkMgLyogRGVwcmVjYXRlZFZhbHVl
TGlzdEltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBNUQwODI0NUU1OTAwMUU5QUJD
IC8qIFdlYkNvcmVJbWFnZVJlbmRlcmVyRmFjdG9yeS5tIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNG
MTlBNUYwODI0NUU1OTAwMUU5QUJDIC8qIFdlYkNvcmVWaWV3RmFjdG9yeS5tIGluIFNvdXJjZXMg
Ki8sCi0JCQkJOTNGMTlBOEYwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfYmFzZWltcGwuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBOTAwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfYmxvY2tp
bXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzRjE5QTkxMDgyNDVFNTkwMDFFOUFCQyAvKiBI
VE1MRG9jdW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBOTIwODI0NUU1OTAwMUU5
QUJDIC8qIEhUTUxFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLApAQCAtNTY2MCwxNCArNTcyMiwx
MiBAQAogCQkJCUJDRUE0ODZEMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJGbGV4aWJsZUJveC5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg2RjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
Rmxvdy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg3MTA5N0Q5MzAyMDA5NEM5RTQgLyog
cmVuZGVyX2Zvcm0uY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJQkNFQTQ4NzMwOTdEOTMwMjAwOTRD
OUU0IC8qIHJlbmRlcl9mcmFtZXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4NzUwOTdE
OTMwMjAwOTRDOUU0IC8qIFJlbmRlckltYWdlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0
ODc3MDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJJbmxpbmUuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQkNFQTQ4NzkwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckxheWVyLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUJDRUE0ODdCMDk3RDkzMDIwMDk0QzlFNCAvKiByZW5kZXJfbGluZS5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQlCQ0VBNDg3RDA5N0Q5MzAyMDA5NEM5RTQgLyogcmVuZGVyX2xpc3Qu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4N0YwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRl
ck9iamVjdC5jcHAgaW4gU291cmNlcyAqLywKLQkJCQlCQ0VBNDg4MTA5N0Q5MzAyMDA5NEM5RTQg
LyogcmVuZGVyX3JlcGxhY2VkLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODgzMDk3RDkz
MDIwMDk0QzlFNCAvKiByZW5kZXJfc3R5bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4
ODgwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1lTWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQkNFQTQ4ODkwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1lLmNwcCBpbiBTb3VyY2Vz
ICovLApAQCAtNTkwOCw2ICs1OTY4LDE4IEBACiAJCQkJQTg3MURDMjcwQTE1MjA1NzAwQjEyQTY4
IC8qIEhUTUxNZXRhRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODcxREMyOTBBMTUy
MDU3MDBCMTJBNjggLyogSFRNTFRpdGxlRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlB
ODcxREMyQTBBMTUyMDU3MDBCMTJBNjggLyogSFRNTEJhc2VFbGVtZW50LmNwcCBpbiBTb3VyY2Vz
ICovLAorCQkJCUE4NzFERTIzMEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MRnJhbWVFbGVtZW50LmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCUE4NzFERTI0MEExNTJBQzgwMEIxMkE2OCAvKiBIVE1MSUZy
YW1lRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODcxREUyNTBBMTUyQUM4MDBCMTJB
NjggLyogSFRNTEhlYWRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4NzFERTI2MEEx
NTJBQzgwMEIxMkE2OCAvKiBIVE1MSHRtbEVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
QTg3MURFMjkwQTE1MkFDODAwQjEyQTY4IC8qIEhUTUxCb2R5RWxlbWVudC5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQlBODcxREUyRTBBMTUyQUM4MDBCMTJBNjggLyogSFRNTEZyYW1lU2V0RWxlbWVu
dC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODcxREVEMDBBMTUzMEM3MDBCMTJBNjggLyogUmVu
ZGVyUGFydC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODcxREVEMjBBMTUzMEM3MDBCMTJBNjgg
LyogUmVuZGVyRnJhbWVTZXQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTg3MURFRDQwQTE1MzBD
NzAwQjEyQTY4IC8qIFJlbmRlckZyYW1lLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4NzFERUQ2
MEExNTMwQzcwMEIxMkE2OCAvKiBSZW5kZXJQYXJ0T2JqZWN0LmNwcCBpbiBTb3VyY2VzICovLAor
CQkJCUE4NzFERkUyMEExNTM3NkIwMEIxMkE2OCAvKiBSZW5kZXJSZXBsYWNlZC5jcHAgaW4gU291
cmNlcyAqLywKKwkJCQlBODcxREZFNTBBMTUzNzZCMDBCMTJBNjggLyogUmVuZGVyV2lkZ2V0LmNw
cCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nl
c3NpbmcgPSAwOwogCQl9OwpJbmRleDogQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIENoYW5nZUxv
ZwkocmV2aXNpb24gMTQzMzMpCisrKyBDaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSwxMzcgQEAKIDIwMDYtMDUtMTIgIEVyaWMgU2VpZGVsICA8ZXNlaWRlbEBhcHBsZS5jb20+CiAK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3BsaXQgcmVu
ZGVyX2ZyYW1lcy4qIHJlbmRlcl9yZXBsYWNlZC4qIGFuZCBodG1sX2Jhc2VpbXBsLiogaW50byBz
ZXBhcmF0ZSBmaWxlcyAob25lIGNsYXNzIHBlciBmaWxlKS4KKyAgICAgICAgaHR0cDovL2J1Z3pp
bGxhLm9wZW5kYXJ3aW4ub3JnL3Nob3dfYnVnLmNnaT9pZD04ODc4CisKKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogYmluZGluZ3MvanMva2pz
X2h0bWwuY3BwOgorICAgICAgICAoS0pTOjpKU0hUTUxEb2N1bWVudFByb3RvRnVuYzo6Y2FsbEFz
RnVuY3Rpb24pOgorICAgICAgICAoS0pTOjpKU0hUTUxEb2N1bWVudDo6bmFtZWRJdGVtR2V0dGVy
KToKKyAgICAgICAgKEtKUzo6SlNIVE1MRG9jdW1lbnQ6OmdldFZhbHVlUHJvcGVydHkpOgorICAg
ICAgICAoS0pTOjpKU0hUTUxEb2N1bWVudDo6Z2V0T3duUHJvcGVydHlTbG90KToKKyAgICAgICAg
KEtKUzo6SlNIVE1MRG9jdW1lbnQ6OnB1dFZhbHVlUHJvcGVydHkpOgorICAgICAgICAoS0pTOjpK
U0hUTUxFbGVtZW50Ojpmb3JtSW5kZXhHZXR0ZXIpOgorICAgICAgICAoS0pTOjpKU0hUTUxFbGVt
ZW50Ojpmb3JtTmFtZUdldHRlcik6CisgICAgICAgIChLSlM6OkpTSFRNTEVsZW1lbnQ6OnNlbGVj
dEluZGV4R2V0dGVyKToKKyAgICAgICAgKEtKUzo6SlNIVE1MRWxlbWVudDo6ZnJhbWVzZXROYW1l
R2V0dGVyKToKKyAgICAgICAgKEtKUzo6SlNIVE1MRWxlbWVudDo6cnVudGltZU9iamVjdEdldHRl
cik6CisgICAgICAgIChLSlM6OkpTSFRNTEVsZW1lbnQ6OnJ1bnRpbWVPYmplY3RQcm9wZXJ0eUdl
dHRlcik6CisgICAgICAgIChLSlM6OkpTSFRNTEVsZW1lbnQ6OmdldE93blByb3BlcnR5U2xvdCk6
CisgICAgICAgIChLSlM6OkpTSFRNTEVsZW1lbnQ6OmltcGxlbWVudHNDYWxsKToKKyAgICAgICAg
KEtKUzo6SlNIVE1MRWxlbWVudDo6Y2FsbEFzRnVuY3Rpb24pOgorICAgICAgICAoS0pTOjpKU0hU
TUxFbGVtZW50OjpnZXRWYWx1ZVByb3BlcnR5KToKKyAgICAgICAgKEtKUzo6SlNIVE1MRWxlbWVu
dDo6dG9TdHJpbmcpOgorICAgICAgICAoS0pTOjpnZXRGb3JtKToKKyAgICAgICAgKEtKUzo6SlNI
VE1MRWxlbWVudDo6cHVzaEV2ZW50SGFuZGxlclNjb3BlKToKKyAgICAgICAgKEtKUzo6SFRNTEVs
ZW1lbnRGdW5jdGlvbjo6Y2FsbEFzRnVuY3Rpb24pOgorICAgICAgICAoS0pTOjpKU0hUTUxFbGVt
ZW50OjpwdXQpOgorICAgICAgICAoS0pTOjpKU0hUTUxFbGVtZW50OjpzZWxlY3RTZXR0ZXIpOgor
ICAgICAgICAoS0pTOjpKU0hUTUxFbGVtZW50OjpwdXRWYWx1ZVByb3BlcnR5KToKKyAgICAgICAg
KEtKUzo6dG9IVE1MRWxlbWVudCk6CisgICAgICAgIChLSlM6OnRvSFRNTFRhYmxlQ2FwdGlvbkVs
ZW1lbnQpOgorICAgICAgICAoS0pTOjp0b0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50KToKKyAgICAg
ICAgKEtKUzo6SlNIVE1MQ29sbGVjdGlvbjo6bGVuZ3RoR2V0dGVyKToKKyAgICAgICAgKEtKUzo6
SlNIVE1MQ29sbGVjdGlvbjo6aW5kZXhHZXR0ZXIpOgorICAgICAgICAoS0pTOjpKU0hUTUxDb2xs
ZWN0aW9uOjpuYW1lR2V0dGVyKToKKyAgICAgICAgKEtKUzo6SlNIVE1MQ29sbGVjdGlvbjo6Z2V0
T3duUHJvcGVydHlTbG90KToKKyAgICAgICAgKEtKUzo6SFRNTENvbGxlY3Rpb25Qcm90b0Z1bmM6
OmNhbGxBc0Z1bmN0aW9uKToKKyAgICAgICAgKEtKUzo6SlNIVE1MU2VsZWN0Q29sbGVjdGlvbjo6
c2VsZWN0ZWRJbmRleEdldHRlcik6CisgICAgICAgIChLSlM6OkpTSFRNTFNlbGVjdENvbGxlY3Rp
b246OnB1dCk6CisgICAgICAgIChLSlM6Ok9wdGlvbkNvbnN0cnVjdG9ySW1wOjpjb25zdHJ1Y3Qp
OgorICAgICAgICAoS0pTOjpnZXRTZWxlY3RIVE1MQ29sbGVjdGlvbik6CisgICAgICAgICogYmlu
ZGluZ3Mvb2JqYy9ET01IVE1MLm1tOgorICAgICAgICAqIGJyaWRnZS9tYWMvRnJhbWVNYWMubW06
CisgICAgICAgIChXZWJDb3JlOjpGcmFtZU1hYzo6Y3JlYXRlRnJhbWUpOgorICAgICAgICAqIGJy
aWRnZS9tYWMvV2ViQ29yZUZyYW1lQnJpZGdlLm1tOgorICAgICAgICAoLVtXZWJDb3JlRnJhbWVC
cmlkZ2UgY29weVJlbmRlck5vZGU6Y29waWVyOl0pOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjp3aWRnZXRGb3JOb2RlKToKKyAgICAgICAgKiBodG1sL0hU
TUxCb2R5RWxlbWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTEJvZHlFbGVt
ZW50OjpIVE1MQm9keUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTEJvZHlFbGVtZW50
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZSk6CisgICAgICAgICogaHRtbC9IVE1MQm9keUVsZW1lbnQu
aDogQWRkZWQuCisgICAgICAgICogaHRtbC9IVE1MRG9jdW1lbnQuY3BwOgorICAgICAgICAqIGh0
bWwvSFRNTEVsZW1lbnRGYWN0b3J5LmNwcDoKKyAgICAgICAgKiBodG1sL0hUTUxFbWJlZEVsZW1l
bnQuY3BwOgorICAgICAgICAqIGh0bWwvSFRNTEZyYW1lRWxlbWVudC5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTEZyYW1lRWxlbWVudDo6aXNVUkxBbGxvd2VkKToKKyAgICAgICAg
KFdlYkNvcmU6OkhUTUxGcmFtZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxGcmFtZUVsZW1lbnQ6OnNldExvY2F0aW9uKToKKyAgICAgICAgKiBo
dG1sL0hUTUxGcmFtZUVsZW1lbnQuaDogQWRkZWQuCisgICAgICAgICogaHRtbC9IVE1MRnJhbWVT
ZXRFbGVtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRnJhbWVTZXRFbGVt
ZW50OjpIVE1MRnJhbWVTZXRFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxGcmFtZVNl
dEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxG
cmFtZVNldEVsZW1lbnQ6OmF0dGFjaCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MRnJhbWVTZXRF
bGVtZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxGcmFt
ZVNldEVsZW1lbnQ6OnJlY2FsY1N0eWxlKToKKyAgICAgICAgKiBodG1sL0hUTUxGcmFtZVNldEVs
ZW1lbnQuaDogQWRkZWQuCisgICAgICAgICogaHRtbC9IVE1MSGVhZEVsZW1lbnQuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxIZWFkRWxlbWVudDo6SFRNTEhlYWRFbGVtZW50KToK
KyAgICAgICAgKiBodG1sL0hUTUxIZWFkRWxlbWVudC5oOiBBZGRlZC4KKyAgICAgICAgKiBodG1s
L0hUTUxIdG1sRWxlbWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTEh0bWxF
bGVtZW50OjpIVE1MSHRtbEVsZW1lbnQpOgorICAgICAgICAqIGh0bWwvSFRNTEh0bWxFbGVtZW50
Lmg6IEFkZGVkLgorICAgICAgICAqIGh0bWwvSFRNTElGcmFtZUVsZW1lbnQuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkhUTUxJRnJhbWVFbGVtZW50OjpIVE1MSUZyYW1lRWxlbWVudCk6
CisgICAgICAgICogaHRtbC9IVE1MSUZyYW1lRWxlbWVudC5oOiBBZGRlZC4KKyAgICAgICAgKiBo
dG1sL0hUTUxPYmplY3RFbGVtZW50LmNwcDoKKyAgICAgICAgKiBodG1sL0hUTUxQYXJzZXIuY3Bw
OgorICAgICAgICAqIGh0bWwvaHRtbF9iYXNlaW1wbC5jcHA6IFJlbW92ZWQuCisgICAgICAgICog
aHRtbC9odG1sX2Jhc2VpbXBsLmg6IFJlbW92ZWQuCisgICAgICAgICoga3dxL1dlYkNvcmVBWE9i
amVjdC5tbToKKyAgICAgICAgKiBwYWdlL0ZyYW1lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Omlz
RnJhbWVFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lOjphcHBseUVkaXRpbmdTdHls
ZVRvQm9keUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWU6OnJlbW92ZUVkaXRpbmdT
dHlsZUZyb21Cb2R5RWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZTo6YXBwbHlFZGl0
aW5nU3R5bGVUb0VsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWU6OnJlbW92ZUVkaXRp
bmdTdHlsZUZyb21FbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lOjpzZWxlY3Rpb25S
ZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lOjppc0ZyYW1lU2V0KToKKyAgICAgICAgKFdl
YkNvcmU6OnNjYW5Gb3JGb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lOjpjdXJyZW50Rm9y
bSk6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZTo6bm9kZUluZm9BdFBvaW50KToKKyAgICAgICAg
KFdlYkNvcmU6OkZyYW1lOjphZGp1c3RQYWdlSGVpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OkZy
YW1lOjpmcmFtZUZvcldpZGdldCk6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZTo6Zm9yY2VMYXlv
dXRXaXRoUGFnZVdpZHRoUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWU6OnBhc3NXaWRn
ZXRNb3VzZURvd25FdmVudFRvV2lkZ2V0KToKKyAgICAgICAgKiBwYWdlL0ZyYW1lVmlldy5jcHA6
CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckZyYW1lLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJGcmFtZTo6dmlld0NsZWFyZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJGcmFtZS5oOiBBZGRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyRnJhbWVTZXQu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZyYW1lU2V0OjpSZW5kZXJGcmFt
ZVNldCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJGcmFtZVNldDo6flJlbmRlckZyYW1lU2V0
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZyYW1lU2V0OjpsYXlvdXQpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyRnJhbWVTZXQ6OnBvc2l0aW9uRnJhbWVzKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckZyYW1lU2V0Ojp1c2VyUmVzaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckZyYW1lU2V0OjpjYW5SZXNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRnJhbWVTZXQ6
OmR1bXApOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJGcmFtZVNldC5oOiBBZGRlZC4KKyAg
ICAgICAgKiByZW5kZXJpbmcvUmVuZGVySW1hZ2UuaDoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVu
ZGVyUGFydC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyUGFydDo6UmVuZGVy
UGFydCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclBhcnQuaDogQWRkZWQuCisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlclBhcnRPYmplY3QuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OmlzVVJMQWxsb3dlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJQYXJ0T2JqZWN0Ojp1
cGRhdGVXaWRnZXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyUGFydE9iamVjdDo6dmlld0Ns
ZWFyZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJQYXJ0T2JqZWN0Lmg6IEFkZGVkLgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJSZXBsYWNlZC5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyUmVwbGFjZWQ6OnNlbGVjdGlvbkNvbG9yKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyUmVwbGFjZWQuaDogQWRkZWQuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
cldpZGdldC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyV2lkZ2V0OjpkZWxl
dGVXaWRnZXQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJXaWRnZXQuaDogQWRkZWQuCisg
ICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9mb3JtLmg6CisgICAgICAgICogcmVuZGVyaW5nL3Jl
bmRlcl9mcmFtZXMuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHJlbmRlcmluZy9yZW5kZXJfZnJh
bWVzLmg6IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5jcHA6
IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5nL3JlbmRlcl9yZXBsYWNlZC5oOiBSZW1vdmVk
LgorCisyMDA2LTA1LTEyICBFcmljIFNlaWRlbCAgPGVzZWlkZWxAYXBwbGUuY29tPgorCiAgICAg
ICAgIFJldmlld2VkIGJ5IGJldGguCiAKICAgICAgICAgU3BsaXQgaHRtbF9oZWFkaW1wbC4qIGlu
dG8gc2VwYXJhdGUgZmlsZXMgKG9uZSBwZXIgY2xhc3MpCkluZGV4OiBicmlkZ2UvbWFjL0ZyYW1l
TWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGJyaWRnZS9tYWMvRnJhbWVNYWMubW0JKHJldmlzaW9uIDE0
MzMyKQorKysgYnJpZGdlL21hYy9GcmFtZU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtNDEsNiAr
NDEsNyBAQAogI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW1wb3J0ICJIVE1MRG9jdW1l
bnQuaCIKICNpbXBvcnQgIkhUTUxGb3JtRWxlbWVudC5oIgorI2ltcG9ydCAiSFRNTEZyYW1lRWxl
bWVudC5oIgogI2ltcG9ydCAiSFRNTEdlbmVyaWNGb3JtRWxlbWVudC5oIgogI2ltcG9ydCAiSFRN
TE5hbWVzLmgiCiAjaW1wb3J0ICJIVE1MVGFibGVDZWxsRWxlbWVudC5oIgpAQCAtNTUsNiArNTYs
NyBAQAogI2ltcG9ydCAiUmVndWxhckV4cHJlc3Npb24uaCIKICNpbXBvcnQgIlJlbmRlckNhbnZh
cy5oIgogI2ltcG9ydCAiUmVuZGVySW1hZ2UuaCIKKyNpbXBvcnQgIlJlbmRlclBhcnQuaCIKICNp
bXBvcnQgIlJlbmRlclRhYmxlQ2VsbC5oIgogI2ltcG9ydCAiUmVuZGVyVGhlbWUuaCIKICNpbXBv
cnQgIlRleHRJdGVyYXRvci5oIgpAQCAtNjQsMTMgKzY2LDEzIEBACiAjaW1wb3J0ICJXZWJEYXNo
Ym9hcmRSZWdpb24uaCIKICNpbXBvcnQgImNzc2hlbHBlci5oIgogI2ltcG9ydCAia2pzX3dpbmRv
dy5oIgotI2ltcG9ydCAicmVuZGVyX2ZyYW1lcy5oIgogI2ltcG9ydCAicmVuZGVyX2xpc3QuaCIK
ICNpbXBvcnQgInZpc2libGVfdW5pdHMuaCIKICNpbXBvcnQgPEphdmFTY3JpcHRDb3JlL05QX2pz
b2JqZWN0Lmg+CiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9XZWJTY3JpcHRPYmplY3RQcml2YXRl
Lmg+CiAjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9ucHJ1bnRpbWVfaW1wbC5oPgogCisKICN1bmRl
ZiBfS1dRX1RJTUlORwogCiBAaW50ZXJmYWNlIE5TT2JqZWN0IChXZWJQbHVnSW4pCkBAIC01ODMs
NyArNTg1LDcgQEAgRnJhbWUqIEZyYW1lTWFjOjpjcmVhdGVGcmFtZShjb25zdCBLVVJMJgogICAg
IGludCBtYXJnaW5XaWR0aCA9IC0xOwogICAgIGludCBtYXJnaW5IZWlnaHQgPSAtMTsKICAgICBp
ZiAocmVuZGVyZXItPmVsZW1lbnQoKS0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgcmVuZGVyZXIt
PmVsZW1lbnQoKS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKSB7Ci0gICAgICAgIEhUTUxGcmFtZUVs
ZW1lbnQgKm8gPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50Kj4ocmVuZGVyZXItPmVsZW1l
bnQoKSk7CisgICAgICAgIEhUTUxGcmFtZUVsZW1lbnQqIG8gPSBzdGF0aWNfY2FzdDxIVE1MRnJh
bWVFbGVtZW50Kj4ocmVuZGVyZXItPmVsZW1lbnQoKSk7CiAgICAgICAgIGFsbG93c1Njcm9sbGlu
ZyA9IG8tPnNjcm9sbGluZ01vZGUoKSAhPSBTY3JvbGxCYXJBbHdheXNPZmY7CiAgICAgICAgIG1h
cmdpbldpZHRoID0gby0+Z2V0TWFyZ2luV2lkdGgoKTsKICAgICAgICAgbWFyZ2luSGVpZ2h0ID0g
by0+Z2V0TWFyZ2luSGVpZ2h0KCk7CkluZGV4OiBicmlkZ2UvbWFjL1dlYkNvcmVGcmFtZUJyaWRn
ZS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBicmlkZ2UvbWFjL1dlYkNvcmVGcmFtZUJyaWRnZS5tbQkocmV2
aXNpb24gMTQzMjUpCisrKyBicmlkZ2UvbWFjL1dlYkNvcmVGcmFtZUJyaWRnZS5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtNjMsOSArNjMsMTAgQEAKICNpbXBvcnQgIk1vZGlmeVNlbGVjdGlvbkxpc3RM
ZXZlbENvbW1hbmQuaCIKICNpbXBvcnQgIk1vdmVTZWxlY3Rpb25Db21tYW5kLmgiCiAjaW1wb3J0
ICJSZW5kZXJDYW52YXMuaCIKLSNpbXBvcnQgInJlbmRlcl9mcmFtZXMuaCIKICNpbXBvcnQgIlJl
bmRlckltYWdlLmgiCisjaW1wb3J0ICJSZW5kZXJQYXJ0LmgiCiAjaW1wb3J0ICJSZXBsYWNlU2Vs
ZWN0aW9uQ29tbWFuZC5oIgorI2ltcG9ydCAiUmVuZGVyV2lkZ2V0LmgiCiAjaW1wb3J0ICJUeXBp
bmdDb21tYW5kLmgiCiAjaW1wb3J0ICJUZXh0SXRlcmF0b3IuaCIKICNpbXBvcnQgInZpc2libGVf
dW5pdHMuaCIKQEAgLTkxNiw4ICs5MTcsOCBAQCBzdGF0aWMgQk9PTCBub3dQcmludGluZyhXZWJD
b3JlRnJhbWVCcmlkCiAgICAgICAgICAgCiAgICAgTlNTdHJpbmcgKm5hbWUgPSBbW05TU3RyaW5n
IGFsbG9jXSBpbml0V2l0aFVURjhTdHJpbmc6bm9kZS0+cmVuZGVyTmFtZSgpXTsKICAgICAKLSAg
ICBSZW5kZXJXaWRnZXQgKnJlbmRlcldpZGdldCA9IG5vZGUtPmlzV2lkZ2V0KCkgPyBzdGF0aWNf
Y2FzdDxSZW5kZXJXaWRnZXQgKj4obm9kZSkgOiAwOwotICAgIFdpZGdldCAqd2lkZ2V0ID0gcmVu
ZGVyV2lkZ2V0ID8gcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSA6IDA7CisgICAgUmVuZGVyV2lkZ2V0
KiByZW5kZXJXaWRnZXQgPSBub2RlLT5pc1dpZGdldCgpID8gc3RhdGljX2Nhc3Q8UmVuZGVyV2lk
Z2V0Kj4obm9kZSkgOiAwOworICAgIFdpZGdldCogd2lkZ2V0ID0gcmVuZGVyV2lkZ2V0ID8gcmVu
ZGVyV2lkZ2V0LT53aWRnZXQoKSA6IDA7CiAgICAgTlNWaWV3ICp2aWV3ID0gd2lkZ2V0ID8gd2lk
Z2V0LT5nZXRWaWV3KCkgOiBuaWw7CiAgICAgCiAgICAgaW50IG54LCBueTsKSW5kZXg6IGt3cS9X
ZWJDb3JlQVhPYmplY3QubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3dxL1dlYkNvcmVBWE9iamVjdC5tbQko
cmV2aXNpb24gMTQzMjUpCisrKyBrd3EvV2ViQ29yZUFYT2JqZWN0Lm1tCSh3b3JraW5nIGNvcHkp
CkBAIC00Miw2ICs0Miw3IEBACiAjaW1wb3J0ICJSZW5kZXJDYW52YXMuaCIKICNpbXBvcnQgIlJl
bmRlckltYWdlLmgiCiAjaW1wb3J0ICJSZW5kZXJUaGVtZS5oIgorI2ltcG9ydCAiUmVuZGVyV2lk
Z2V0LmgiCiAjaW1wb3J0ICJTZWxlY3Rpb25Db250cm9sbGVyLmgiCiAjaW1wb3J0ICJUZXh0SXRl
cmF0b3IuaCIKICNpbXBvcnQgIldlYkNvcmVGcmFtZUJyaWRnZS5oIgpJbmRleDogcGFnZS9GcmFt
ZVZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIHBhZ2UvRnJhbWVWaWV3LmNwcAkocmV2aXNpb24gMTQz
MjUpCisrKyBwYWdlL0ZyYW1lVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDExICsyOSwx
MyBAQAogI2luY2x1ZGUgIkN1cnNvci5oIgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKICNpbmNs
dWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkhUTUxGcmFtZVNldEVsZW1lbnQuaCIKICNpbmNsdWRl
ICJIVE1MSW5wdXRFbGVtZW50LmgiCiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJBY2Nl
c3NpYmlsaXR5T2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQu
aCIKICNpbmNsdWRlICJNb3VzZUV2ZW50V2l0aEhpdFRlc3RSZXN1bHRzLmgiCisjaW5jbHVkZSAi
UmVuZGVyUGFydC5oIgogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKICNpbmNsdWRlICJTZWxlY3Rp
b25Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCkBAIC00NCw3
ICs0Niw2IEBACiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiUmVuZGVyQXJlbmEu
aCIKICNpbmNsdWRlICJSZW5kZXJDYW52YXMuaCIKLSNpbmNsdWRlICJyZW5kZXJfZnJhbWVzLmgi
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApJbmRleDogcGFnZS9GcmFtZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gcGFnZS9GcmFtZS5jcHAJKHJldmlzaW9uIDE0MzI3KQorKysgcGFnZS9GcmFtZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKICNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKICNpbmNsdWRlICJIVE1MRm9ybUVsZW1l
bnQuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVFbGVtZW50LmgiCiAjaW5jbHVkZSAiSFRNTEdlbmVy
aWNGb3JtRWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIkhUTUxP
YmplY3RFbGVtZW50LmgiCkBAIC01Miw2ICs1Myw3IEBACiAjaW5jbHVkZSAiTm9kZUxpc3QuaCIK
ICNpbmNsdWRlICJQbHVnaW4uaCIKICNpbmNsdWRlICJSZW5kZXJDYW52YXMuaCIKKyNpbmNsdWRl
ICJSZW5kZXJQYXJ0LmgiCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKICNpbmNsdWRlICJTZWdt
ZW50ZWRTdHJpbmcuaCIKICNpbmNsdWRlICJUZXh0RG9jdW1lbnQuaCIKQEAgLTY0LDcgKzY2LDYg
QEAKICNpbmNsdWRlICJodG1sZWRpdGluZy5oIgogI2luY2x1ZGUgImtqc193aW5kb3cuaCIKICNp
bmNsdWRlICJtYXJrdXAuaCIKLSNpbmNsdWRlICJyZW5kZXJfZnJhbWVzLmgiCiAjaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgogI2luY2x1ZGUgInhtbF90b2tlbml6ZXIuaCIKICNpbmNsdWRlICJ4
bWxodHRwcmVxdWVzdC5oIgpAQCAtMTE5OSw3ICsxMjAwLDcgQEAgc3RhdGljIGJvb2wgaXNGcmFt
ZUVsZW1lbnQoY29uc3QgTm9kZSAqbgogICAgIFJlbmRlck9iamVjdCAqcmVuZGVyZXIgPSBuLT5y
ZW5kZXJlcigpOwogICAgIGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5pc1dpZGdldCgpKQog
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgV2lkZ2V0ICp3aWRnZXQgPSBzdGF0aWNfY2FzdDxS
ZW5kZXJXaWRnZXQgKj4ocmVuZGVyZXIpLT53aWRnZXQoKTsKKyAgICBXaWRnZXQqIHdpZGdldCA9
IHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KHJlbmRlcmVyKS0+d2lkZ2V0KCk7CiAgICAgcmV0
dXJuIHdpZGdldCAmJiB3aWRnZXQtPmlzRnJhbWVWaWV3KCk7CiB9CiAKQEAgLTIzNDIsNyArMjM0
Myw3IEBAIHZvaWQgRnJhbWU6OmFwcGx5RWRpdGluZ1N0eWxlVG9Cb2R5RWxlbWUKICAgICBSZWZQ
dHI8Tm9kZUxpc3Q+IGxpc3QgPSBkLT5tX2RvYy0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHki
KTsKICAgICB1bnNpZ25lZCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgYXBwbHlFZGl0aW5nU3R5bGVUb0VsZW1l
bnQoc3RhdGljX2Nhc3Q8RWxlbWVudCAqPihsaXN0LT5pdGVtKGkpKSk7ICAgIAorICAgICAgICBh
cHBseUVkaXRpbmdTdHlsZVRvRWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obGlzdC0+aXRl
bShpKSkpOyAgICAKICAgICB9CiB9CiAKQEAgLTIzNTQsNyArMjM1NSw3IEBAIHZvaWQgRnJhbWU6
OnJlbW92ZUVkaXRpbmdTdHlsZUZyb21Cb2R5RWwKICAgICBSZWZQdHI8Tm9kZUxpc3Q+IGxpc3Qg
PSBkLT5tX2RvYy0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKTsKICAgICB1bnNpZ25lZCBs
ZW4gPSBsaXN0LT5sZW5ndGgoKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBp
KyspIHsKLSAgICAgICAgcmVtb3ZlRWRpdGluZ1N0eWxlRnJvbUVsZW1lbnQoc3RhdGljX2Nhc3Q8
RWxlbWVudCAqPihsaXN0LT5pdGVtKGkpKSk7ICAgIAorICAgICAgICByZW1vdmVFZGl0aW5nU3R5
bGVGcm9tRWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4obGlzdC0+aXRlbShpKSkpOyAgICAK
ICAgICB9CiB9CiAKQEAgLTIzNjMsNyArMjM2NCw3IEBAIHZvaWQgRnJhbWU6OmFwcGx5RWRpdGlu
Z1N0eWxlVG9FbGVtZW50KEUKICAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQtPmlzSFRNTEVs
ZW1lbnQoKSkKICAgICAgICAgcmV0dXJuOwogICAgIAotICAgIHN0YXRpY19jYXN0PEhUTUxFbGVt
ZW50ICo+KGVsZW1lbnQpLT5zZXRDb250ZW50RWRpdGFibGUoInRydWUiKTsKKyAgICBzdGF0aWNf
Y2FzdDxIVE1MRWxlbWVudCo+KGVsZW1lbnQpLT5zZXRDb250ZW50RWRpdGFibGUoInRydWUiKTsK
IH0KIAogdm9pZCBGcmFtZTo6cmVtb3ZlRWRpdGluZ1N0eWxlRnJvbUVsZW1lbnQoRWxlbWVudCAq
ZWxlbWVudCkgY29uc3QKQEAgLTIzNzEsNyArMjM3Miw3IEBAIHZvaWQgRnJhbWU6OnJlbW92ZUVk
aXRpbmdTdHlsZUZyb21FbGVtZW4KICAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQtPmlzSFRN
TEVsZW1lbnQoKSkKICAgICAgICAgcmV0dXJuOwogICAgICAgICAKLSAgICBzdGF0aWNfY2FzdDxI
VE1MRWxlbWVudCAqPihlbGVtZW50KS0+c2V0Q29udGVudEVkaXRhYmxlKCJmYWxzZSIpOyAgICAg
ICAgCisgICAgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQqPihlbGVtZW50KS0+c2V0Q29udGVudEVk
aXRhYmxlKCJmYWxzZSIpOyAgICAgICAgCiB9CiAKIApAQCAtMjUyOSw3ICsyNTMwLDcgQEAgUmVu
ZGVyUGFydCogRnJhbWU6Om93bmVyUmVuZGVyZXIoKQogCiBJbnRSZWN0IEZyYW1lOjpzZWxlY3Rp
b25SZWN0KCkgY29uc3QKIHsKLSAgICBSZW5kZXJDYW52YXMgKnJvb3QgPSBzdGF0aWNfY2FzdDxS
ZW5kZXJDYW52YXMgKj4ocmVuZGVyZXIoKSk7CisgICAgUmVuZGVyQ2FudmFzICpyb290ID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyQ2FudmFzKj4ocmVuZGVyZXIoKSk7CiAgICAgaWYgKCFyb290KQogICAg
ICAgICByZXR1cm4gSW50UmVjdCgpOwogCkBAIC0yNTUwLDcgKzI1NTEsNyBAQCBib29sIEZyYW1l
Ojppc0ZyYW1lU2V0KCkgY29uc3QKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBkLT5tX2RvYy5n
ZXQoKTsKICAgICBpZiAoIWRvY3VtZW50IHx8ICFkb2N1bWVudC0+aXNIVE1MRG9jdW1lbnQoKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIE5vZGUgKmJvZHkgPSBzdGF0aWNfY2FzdDxIVE1M
RG9jdW1lbnQgKj4oZG9jdW1lbnQpLT5ib2R5KCk7CisgICAgTm9kZSAqYm9keSA9IHN0YXRpY19j
YXN0PEhUTUxEb2N1bWVudCo+KGRvY3VtZW50KS0+Ym9keSgpOwogICAgIHJldHVybiBib2R5ICYm
IGJvZHktPnJlbmRlcmVyKCkgJiYgYm9keS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZyk7CiB9CiAK
QEAgLTI1NzIsMTEgKzI1NzMsMTEgQEAgc3RhdGljIEhUTUxGb3JtRWxlbWVudCAqc2NhbkZvckZv
cm0oTm9kZQogICAgIE5vZGUgKm47CiAgICAgZm9yIChuID0gc3RhcnQ7IG47IG4gPSBuLT50cmF2
ZXJzZU5leHROb2RlKCkpIHsKICAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUoZm9ybVRhZykpCi0g
ICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEZvcm1FbGVtZW50ICo+KG4pOworICAg
ICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudCo+KG4pOwogICAgICAg
ICBlbHNlIGlmIChuLT5pc0hUTUxFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnQq
PihuKS0+aXNHZW5lcmljRm9ybUVsZW1lbnQoKSkKICAgICAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxIVE1MR2VuZXJpY0Zvcm1FbGVtZW50Kj4obiktPmZvcm0oKTsKICAgICAgICAgZWxzZSBp
ZiAobi0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgbi0+aGFzVGFnTmFtZShpZnJhbWVUYWcpKSB7
Ci0gICAgICAgICAgICBOb2RlICpjaGlsZERvYyA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1l
bnQgKj4obiktPmNvbnRlbnREb2N1bWVudCgpOworICAgICAgICAgICAgTm9kZSAqY2hpbGREb2Mg
PSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVFbGVtZW50Kj4obiktPmNvbnRlbnREb2N1bWVudCgpOwog
ICAgICAgICAgICAgaWYgKEhUTUxGb3JtRWxlbWVudCAqZnJhbWVSZXN1bHQgPSBzY2FuRm9yRm9y
bShjaGlsZERvYykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lUmVzdWx0OwogICAgICAg
ICB9CkBAIC0yNTk2LDEwICsyNTk3LDEwIEBAIEhUTUxGb3JtRWxlbWVudCAqRnJhbWU6OmN1cnJl
bnRGb3JtKCkgY28KICAgICBOb2RlICpuOwogICAgIGZvciAobiA9IHN0YXJ0OyBuOyBuID0gbi0+
cGFyZW50Tm9kZSgpKSB7CiAgICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKGZvcm1UYWcpKQotICAg
ICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxGb3JtRWxlbWVudCAqPihuKTsKKyAgICAg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MRm9ybUVsZW1lbnQqPihuKTsKICAgICAgICAg
ZWxzZSBpZiAobi0+aXNIVE1MRWxlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgJiYgc3RhdGlj
X2Nhc3Q8SFRNTEVsZW1lbnQgKj4obiktPmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkpCi0gICAgICAg
ICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEdlbmVyaWNGb3JtRWxlbWVudCAqPihuKS0+Zm9y
bSgpOworICAgICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PEhUTUxFbGVtZW50Kj4obikt
PmlzR2VuZXJpY0Zvcm1FbGVtZW50KCkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
SFRNTEdlbmVyaWNGb3JtRWxlbWVudCo+KG4pLT5mb3JtKCk7CiAgICAgfQogICAgIAogICAgIC8v
IHRyeSB3YWxraW5nIGZvcndhcmQgaW4gdGhlIG5vZGUgdHJlZSB0byBmaW5kIGEgZm9ybSBlbGVt
ZW50CkBAIC0yNzA4LDE1ICsyNzA5LDE1IEBAIFJlbmRlck9iamVjdDo6Tm9kZUluZm8gRnJhbWU6
Om5vZGVJbmZvQXQKICAgICAgICAgbiA9IG5vZGVJbmZvLmlubmVyTm9kZSgpOwogICAgICAgICBp
ZiAoIW4gfHwgIW4tPnJlbmRlcmVyKCkgfHwgIW4tPnJlbmRlcmVyKCktPmlzV2lkZ2V0KCkpCiAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgd2lkZ2V0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyV2lk
Z2V0ICo+KG4tPnJlbmRlcmVyKCkpLT53aWRnZXQoKTsKKyAgICAgICAgd2lkZ2V0ID0gc3RhdGlj
X2Nhc3Q8UmVuZGVyV2lkZ2V0Kj4obi0+cmVuZGVyZXIoKSktPndpZGdldCgpOwogICAgICAgICBp
ZiAoIXdpZGdldCB8fCAhd2lkZ2V0LT5pc0ZyYW1lVmlldygpKQogICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIEZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PEhUTUxGcmFtZUVsZW1lbnQgKj4o
biktPmNvbnRlbnRGcmFtZSgpOworICAgICAgICBGcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxI
VE1MRnJhbWVFbGVtZW50Kj4obiktPmNvbnRlbnRGcmFtZSgpOwogICAgICAgICBpZiAoIWZyYW1l
IHx8ICFmcmFtZS0+cmVuZGVyZXIoKSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpbnQg
YWJzWCwgYWJzWTsKICAgICAgICAgbi0+cmVuZGVyZXIoKS0+YWJzb2x1dGVQb3NpdGlvbihhYnNY
LCBhYnNZLCB0cnVlKTsKLSAgICAgICAgRnJhbWVWaWV3ICp2aWV3ID0gc3RhdGljX2Nhc3Q8RnJh
bWVWaWV3ICo+KHdpZGdldCk7CisgICAgICAgIEZyYW1lVmlldyAqdmlldyA9IHN0YXRpY19jYXN0
PEZyYW1lVmlldyo+KHdpZGdldCk7CiAgICAgICAgIHdpZGdldFBvaW50LnNldFgod2lkZ2V0UG9p
bnQueCgpIC0gYWJzWCArIHZpZXctPmNvbnRlbnRzWCgpKTsKICAgICAgICAgd2lkZ2V0UG9pbnQu
c2V0WSh3aWRnZXRQb2ludC55KCkgLSBhYnNZICsgdmlldy0+Y29udGVudHNZKCkpOwogCkBAIC0y
ODAwLDcgKzI4MDEsNyBAQCB2b2lkIEZyYW1lOjpwYWludChHcmFwaGljc0NvbnRleHQqIHAsIGNv
CiAKIHZvaWQgRnJhbWU6OmFkanVzdFBhZ2VIZWlnaHQoZmxvYXQgKm5ld0JvdHRvbSwgZmxvYXQg
b2xkVG9wLCBmbG9hdCBvbGRCb3R0b20sIGZsb2F0IGJvdHRvbUxpbWl0KQogewotICAgIFJlbmRl
ckNhbnZhcyAqcm9vdCA9IHN0YXRpY19jYXN0PFJlbmRlckNhbnZhcyAqPihkb2N1bWVudCgpLT5y
ZW5kZXJlcigpKTsKKyAgICBSZW5kZXJDYW52YXMgKnJvb3QgPSBzdGF0aWNfY2FzdDxSZW5kZXJD
YW52YXMqPihkb2N1bWVudCgpLT5yZW5kZXJlcigpKTsKICAgICBpZiAocm9vdCkgewogICAgICAg
ICAvLyBVc2UgYSBjb250ZXh0IHdpdGggcGFpbnRpbmcgZGlzYWJsZWQuCiAgICAgICAgIEdyYXBo
aWNzQ29udGV4dCBjb250ZXh0KDApOwpAQCAtMjkxOCw3ICsyOTE5LDcgQEAgRnJhbWUgKkZyYW1l
OjpmcmFtZUZvcldpZGdldChjb25zdCBXaWRnZQogICAgIAogICAgIC8vIEFzc3VtZSBhbGwgd2lk
Z2V0cyBhcmUgZWl0aGVyIGZvcm0gY29udHJvbHMsIG9yIEZyYW1lVmlld3MuCiAgICAgQVNTRVJU
KHdpZGdldC0+aXNGcmFtZVZpZXcoKSk7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEZy
YW1lVmlldyAqPih3aWRnZXQpLT5mcmFtZSgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25z
dCBGcmFtZVZpZXcqPih3aWRnZXQpLT5mcmFtZSgpOwogfQogCiBGcmFtZSAqRnJhbWU6OmZyYW1l
Rm9yTm9kZShOb2RlICpub2RlKQpAQCAtMjk3Nyw3ICsyOTc4LDcgQEAgdm9pZCBGcmFtZTo6Zm9y
Y2VMYXlvdXRXaXRoUGFnZVdpZHRoUmFuZwogewogICAgIC8vIER1bXBpbmcgZXh0ZXJuYWxSZXBy
ZXNlbnRhdGlvbihtX2ZyYW1lLT5yZW5kZXJlcigpKS5hc2NpaSgpIGlzIGEgZ29vZCB0cmljayB0
byBzZWUKICAgICAvLyB0aGUgc3RhdGUgb2YgdGhpbmdzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGxh
eW91dAotICAgIFJlbmRlckNhbnZhcyAqcm9vdCA9IHN0YXRpY19jYXN0PFJlbmRlckNhbnZhcyAq
Pihkb2N1bWVudCgpLT5yZW5kZXJlcigpKTsKKyAgICBSZW5kZXJDYW52YXMgKnJvb3QgPSBzdGF0
aWNfY2FzdDxSZW5kZXJDYW52YXMqPihkb2N1bWVudCgpLT5yZW5kZXJlcigpKTsKICAgICBpZiAo
cm9vdCkgewogICAgICAgICAvLyBUaGlzIG1hZ2ljIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbSBr
aHRtbHZpZXc6OnByaW50CiAgICAgICAgIGludCBwYWdlVyA9IChpbnQpY2VpbGYobWluUGFnZVdp
ZHRoKTsKQEAgLTMwODksNyArMzA5MCw3IEBAIGJvb2wgRnJhbWU6OnBhc3NXaWRnZXRNb3VzZURv
d25FdmVudFRvV2kKICAgICBpZiAoIXdpZGdldCkgewogICAgICAgICBpZiAoIXRhcmdldC0+aXNX
aWRnZXQoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgd2lkZ2V0ID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyV2lkZ2V0ICo+KHRhcmdldCktPndpZGdldCgpOworICAgICAgICB3aWRn
ZXQgPSBzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQqPih0YXJnZXQpLT53aWRnZXQoKTsKICAgICB9
CiAgICAgCiAgICAgLy8gRG91YmxlY2xpY2sgZXZlbnRzIGRvbid0IGV4aXN0IGluIENvY29hLiAg
U2luY2UgcGFzc1dpZGdldE1vdXNlRG93bkV2ZW50VG9XaWRnZXQgd2lsbAo=
</data>
<flag name="review"
          id="2326"
          type_id="1"
          status="+"
          setter="mjs"
    />
          </attachment>
      

    </bug>

</bugzilla>