<?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>8873</bug_id>
          
          <creation_ts>2006-05-12 12:34:34 -0700</creation_ts>
          <short_desc>Split out html_tableimpl.* into multiple files (one per class)</short_desc>
          <delta_ts>2006-05-12 13:40:08 -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>WebKit Misc.</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P4</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>42121</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-12 12:34:34 -0700</bug_when>
    <thetext>Was evil.  Now less evil.  Unicorns are smiling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42122</commentid>
    <comment_count>1</comment_count>
      <attachid>8267</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-05-12 12:35:24 -0700</bug_when>
    <thetext>Created attachment 8267
Do the splits!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>42123</commentid>
    <comment_count>2</comment_count>
      <attachid>8267</attachid>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2006-05-12 12:37:58 -0700</bug_when>
    <thetext>Comment on attachment 8267
Do the splits!

r=me!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>8267</attachid>
            <date>2006-05-12 12:35:24 -0700</date>
            <delta_ts>2006-05-12 12:37:58 -0700</delta_ts>
            <desc>Do the splits!</desc>
            <filename>split.patch</filename>
            <type>text/plain</type>
            <size>384443</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGh0bWwvSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1s
L0hUTUxUYWJsZUNhcHRpb25FbGVtZW50LmgJKHJldmlzaW9uIDE0MzI1KQorKysgaHRtbC9IVE1M
VGFibGVDYXB0aW9uRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSwzNDkgKzI1LDIyIEBA
CiAgKgogICovCiAKLSNpZm5kZWYgSFRNTFRhYmxlRWxlbWVudEltcGxfSAotI2RlZmluZSBIVE1M
VGFibGVFbGVtZW50SW1wbF9ICisjaWZuZGVmIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50X0gKKyNk
ZWZpbmUgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnRfSAogCi0jaW5jbHVkZSAiSFRNTEVsZW1lbnQu
aCIKLSNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MVGFibGVQYXJ0RWxlbWVu
dC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEhUTUxDb2xsZWN0aW9uOwotY2xh
c3MgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7Ci1jbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudDsK
LWNsYXNzIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OwotCi1jbGFzcyBIVE1MVGFibGVFbGVtZW50
IDogcHVibGljIEhUTUxFbGVtZW50IHsKLXB1YmxpYzoKLSAgICBlbnVtIFJ1bGVzIHsKLSAgICAg
ICAgTm9uZSAgICA9IDB4MDAsCi0gICAgICAgIFJHcm91cHMgPSAweDAxLAotICAgICAgICBDR3Jv
dXBzID0gMHgwMiwKLSAgICAgICAgR3JvdXBzICA9IDB4MDMsCi0gICAgICAgIFJvd3MgICAgPSAw
eDA1LAotICAgICAgICBDb2xzICAgID0gMHgwYSwKLSAgICAgICAgQWxsICAgICA9IDB4MGYKLSAg
ICB9OwotICAgIGVudW0gRnJhbWUgewotICAgICAgICBWb2lkICAgPSAweDAwLAotICAgICAgICBB
Ym92ZSAgPSAweDAxLAotICAgICAgICBCZWxvdyAgPSAweDAyLAotICAgICAgICBMaHMgICAgPSAw
eDA0LAotICAgICAgICBSaHMgICAgPSAweDA4LAotICAgICAgICBIc2lkZXMgPSAweDAzLAotICAg
ICAgICBWc2lkZXMgPSAweDBjLAotICAgICAgICBCb3ggICAgPSAweDBmCi0gICAgfTsKLQotICAg
IEhUTUxUYWJsZUVsZW1lbnQoRG9jdW1lbnQqKTsKLSAgICB+SFRNTFRhYmxlRWxlbWVudCgpOwot
Ci0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyBy
ZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgp
IGNvbnN0IHsgcmV0dXJuIDk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9k
ZSopOwotCi0gICAgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQqIGNhcHRpb24oKSBjb25zdCB7IHJl
dHVybiB0Q2FwdGlvbjsgfQotICAgIE5vZGUqIHNldENhcHRpb24oSFRNTFRhYmxlQ2FwdGlvbkVs
ZW1lbnQqKTsKLQotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiB0SGVhZCgpIGNvbnN0IHsg
cmV0dXJuIGhlYWQ7IH0KLSAgICBOb2RlKiBzZXRUSGVhZChIVE1MVGFibGVTZWN0aW9uRWxlbWVu
dCopOwotCi0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHRGb290KCkgY29uc3QgeyByZXR1
cm4gZm9vdDsgfQotICAgIE5vZGUqIHNldFRGb290KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kik7
Ci0KLSAgICBOb2RlKiBzZXRUQm9keShIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAg
SFRNTEVsZW1lbnQqIGNyZWF0ZVRIZWFkKCk7Ci0gICAgdm9pZCBkZWxldGVUSGVhZCgpOwotICAg
IEhUTUxFbGVtZW50KiBjcmVhdGVURm9vdCgpOwotICAgIHZvaWQgZGVsZXRlVEZvb3QoKTsKLSAg
ICBIVE1MRWxlbWVudCogY3JlYXRlQ2FwdGlvbigpOwotICAgIHZvaWQgZGVsZXRlQ2FwdGlvbigp
OwotICAgIEhUTUxFbGVtZW50KiBpbnNlcnRSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7
Ci0gICAgdm9pZCBkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBS
ZWZQdHI8SFRNTENvbGxlY3Rpb24+IHJvd3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+
IHRCb2RpZXMoKTsKLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxp
Z24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZv
aWQgc2V0QmdDb2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBib3JkZXIoKSBjb25z
dDsKLSAgICB2b2lkIHNldEJvcmRlcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjZWxs
UGFkZGluZygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2VsbFBhZGRpbmcoY29uc3QgU3RyaW5nJik7
Ci0KLSAgICBTdHJpbmcgY2VsbFNwYWNpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldENlbGxTcGFj
aW5nKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGZyYW1lKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRGcmFtZShjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBydWxlcygpIGNvbnN0Owot
ICAgIHZvaWQgc2V0UnVsZXMoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgc3VtbWFyeSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0U3VtbWFyeShjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmlu
ZyB3aWR0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0V2lkdGgoY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NS
ZWZQdHI8Tm9kZT4pOwotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFt
ZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lk
IHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cik7Ci0KLSAgICAvLyBV
c2VkIHRvIG9idGFpbiBlaXRoZXIgYSBzb2xpZCBvciBvdXRzZXQgYm9yZGVyIGRlY2wuCi0gICAg
dmlydHVhbCBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0
eWxlRGVjbCgpOwotICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRTaGFyZWRDZWxs
RGVjbCgpOwotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIAotICAgIHZpcnR1YWwg
Ym9vbCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUqKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAg
IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBoZWFkOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50KiBmb290OwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmaXJzdEJvZHk7Ci0gICAg
SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQqIHRDYXB0aW9uOwotCi0gICAgYm9vbCBtX25vQm9yZGVy
ICAgICA6IDE7Ci0gICAgYm9vbCBtX3NvbGlkICAgICAgICA6IDE7Ci0gICAgLy8gMTQgYml0cyB1
bnVzZWQKLSAgICB1bnNpZ25lZCBzaG9ydCBwYWRkaW5nOwotICAgIGZyaWVuZCBjbGFzcyBIVE1M
VGFibGVDZWxsRWxlbWVudDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRN
TFRhYmxlUGFydEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLQotewotcHVibGljOgotICAg
IEhUTUxUYWJsZVBhcnRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3Vt
ZW50KiBkb2MpCi0gICAgICAgIDogSFRNTEVsZW1lbnQodGFnTmFtZSwgZG9jKQotICAgICAgICB7
IH0KLQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0
dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFs
IHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50IDogcHVibGlj
IEhUTUxUYWJsZVBhcnRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVs
ZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqLCBib29sIGltcGxp
Y2l0KTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNv
bnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiA4OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNv
bnN0IE5vZGUqKTsKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQ
dHI8Tm9kZT4pOwotICAgIAotICAgIEhUTUxFbGVtZW50KiBpbnNlcnRSb3coaW50IGluZGV4LCBF
eGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25D
b2RlJik7Ci0KLSAgICBpbnQgbnVtUm93cygpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBj
aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcg
Y2hPZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiByb3dzKCk7Ci19OwotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVJvd0VsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxl
UGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVSb3dFbGVtZW50KERvY3VtZW50
KiBkb2MpCi0gICAgICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5hbWVzOjp0clRhZywg
ZG9jKSB7fQotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDc7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZSopOwotICAgIHZpcnR1YWwgQ29udGFpbmVyTm9kZSogYWRkQ2hpbGQoUGFzc1Jl
ZlB0cjxOb2RlPik7Ci0gICAgCi0gICAgaW50IHJvd0luZGV4KCkgY29uc3Q7Ci0gICAgaW50IHNl
Y3Rpb25Sb3dJbmRleCgpIGNvbnN0OwotCi0gICAgSFRNTEVsZW1lbnQqIGluc2VydENlbGwoaW50
IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVDZWxsKGludCBpbmRleCwg
RXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzZXRSb3dJbmRleChpbnQpOwotCi0gICAgdm9p
ZCBzZXRTZWN0aW9uUm93SW5kZXgoaW50KTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4g
Y2VsbHMoKTsKLSAgICB2b2lkIHNldENlbGxzKEhUTUxDb2xsZWN0aW9uICosIEV4Y2VwdGlvbkNv
ZGUmKTsKLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29u
c3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0
QmdDb2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsKLSAg
ICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNv
bnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgaW50IG5jb2xzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFi
bGVDZWxsRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgot
ICAgIEhUTUxUYWJsZUNlbGxFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERv
Y3VtZW50Kik7Ci0gICAgfkhUTUxUYWJsZUNlbGxFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhU
TUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNP
cHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4g
NjsgfQotCi0gICAgaW50IGNlbGxJbmRleCgpIGNvbnN0OwotCi0gICAgaW50IGNvbCgpIGNvbnN0
IHsgcmV0dXJuIF9jb2w7IH0KLSAgICB2b2lkIHNldENvbChpbnQgY29sKSB7IF9jb2wgPSBjb2w7
IH0KLSAgICBpbnQgcm93KCkgY29uc3QgeyByZXR1cm4gX3JvdzsgfQotICAgIHZvaWQgc2V0Um93
KGludCByKSB7IF9yb3cgPSByOyB9Ci0KLSAgICBpbnQgY29sU3BhbigpIGNvbnN0IHsgcmV0dXJu
IGNTcGFuOyB9Ci0gICAgaW50IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiByU3BhbjsgfQotCi0g
ICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUs
IE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAgIC8vIHVzZWQgYnkg
dGFibGUgY2VsbHMgdG8gc2hhcmUgc3R5bGUgZGVjbHMgY3JlYXRlZCBieSB0aGUgZW5jbG9zaW5n
IHRhYmxlLgotICAgIHZpcnR1YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGFkZGl0aW9u
YWxBdHRyaWJ1dGVTdHlsZURlY2woKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRy
aWJ1dGUoQXR0cmlidXRlKikgY29uc3Q7Ci0KLSAgICB2b2lkIHNldENlbGxJbmRleChpbnQpOwot
Ci0gICAgU3RyaW5nIGFiYnIoKSBjb25zdDsKLSAgICB2b2lkIHNldEFiYnIoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0
IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGF4aXMoKSBjb25zdDsKLSAgICB2b2lkIHNldEF4aXMo
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQg
c2V0QmdDb2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsK
LSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgdm9pZCBzZXRDb2xTcGFu
KGludCk7Ci0KLSAgICBTdHJpbmcgaGVhZGVycygpIGNvbnN0OwotICAgIHZvaWQgc2V0SGVhZGVy
cyhjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBoZWlnaHQoKSBjb25zdDsKLSAgICB2b2lk
IHNldEhlaWdodChjb25zdCBTdHJpbmcmKTsKLQotICAgIGJvb2wgbm9XcmFwKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXROb1dyYXAoYm9vbCk7Ci0KLSAgICB2b2lkIHNldFJvd1NwYW4oaW50KTsKLQot
ICAgIFN0cmluZyBzY29wZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0U2NvcGUoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICBTdHJpbmcgdkFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWQWxpZ24oY29u
c3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgd2lkdGgoKSBjb25zdDsKLSAgICB2b2lkIHNldFdp
ZHRoKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IF9yb3c7Ci0gICAgaW50
IF9jb2w7Ci0gICAgaW50IHJTcGFuOwotICAgIGludCBjU3BhbjsKLSAgICBpbnQgcm93SGVpZ2h0
OwotICAgIGJvb2wgbV9zb2xpZCAgICAgICAgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBIVE1MVGFibGVDb2xFbGVtZW50IDogcHVibGljIEhUTUxUYWJsZVBhcnRFbGVt
ZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlQ29sRWxlbWVudChjb25zdCBRdWFsaWZpZWRO
YW1lJiB0YWdOYW1lLCBEb2N1bWVudCopOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVu
ZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gaGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6
Y29sVGFnKSA/IFRhZ1N0YXR1c0ZvcmJpZGRlbiA6IFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBoYXNMb2NhbE5hbWUoSFRN
TE5hbWVzOjpjb2xUYWcpID8gMCA6IDE7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29u
c3QgTm9kZSogbmV3Q2hpbGQpIHsgcmV0dXJuIGhhc0xvY2FsTmFtZShIVE1MTmFtZXM6OmNvbGdy
b3VwVGFnKSAmJiBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmNvbFRhZyk7IH0KLSAg
ICB2b2lkIHNldFRhYmxlKEhUTUxUYWJsZUVsZW1lbnQqIHQpIHsgdGFibGUgPSB0OyB9Ci0KLSAg
ICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZp
ZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwot
Ci0gICAgaW50IHNwYW4oKSBjb25zdCB7IHJldHVybiBfc3BhbjsgfQotCi0gICAgU3RyaW5nIGFs
aWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0
cmluZyBjaCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBT
dHJpbmcgY2hPZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwot
Ci0gICAgdm9pZCBzZXRTcGFuKGludCk7Ci0KLSAgICBTdHJpbmcgdkFsaWduKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRWQWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgd2lkdGgoKSBj
b25zdDsKLSAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgaW50IF9zcGFuOwotICAgIEhUTUxUYWJsZUVsZW1lbnQgKnRhYmxlOwotfTsKLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCiBjbGFzcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudCA6IHB1YmxpYyBI
VE1MVGFibGVQYXJ0RWxlbWVudAogewogcHVibGljOgotICAgIEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50KERvY3VtZW50ICpkb2MpCi0gICAgICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5h
bWVzOjpjYXB0aW9uVGFnLCBkb2MpIHt9Ci0KKyAgICBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChE
b2N1bWVudCopOworICAgIAogICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJl
bWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9CiAgICAgdmlydHVhbCBp
bnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA1OyB9CiAgICAgCi0gICAgdmlydHVhbCBi
b29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJp
YnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNv
bnN0IFF1YWxpZmllZE5hbWUmLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYpIGNvbnN0OwogICAgIHZp
cnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKIAogICAg
IFN0cmluZyBhbGlnbigpIGNvbnN0OwpJbmRleDogaHRtbC9IVE1MVGFibGVTZWN0aW9uRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MVGFibGVTZWN0aW9uRWxlbWVudC5jcHAJKHJl
dmlzaW9uIDE0MzI1KQorKysgaHRtbC9IVE1MVGFibGVTZWN0aW9uRWxlbWVudC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIzLDY2OSArMjMsMTkgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3RvbiwgTUEg
MDIxMTEtMTMwNywgVVNBLgogICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJo
dG1sX3RhYmxlaW1wbC5oIgorI2luY2x1ZGUgIkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50LmgiCiAK
ICNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCisjaW5jbHVkZSAiSFRNTENvbGxlY3Rpb24uaCIK
KyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MVGFibGVSb3dFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiTm9kZUxpc3QuaCIKLSNpbmNsdWRlICJSZW5kZXJUYWJsZS5oIgotI2luY2x1
ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlQ29sLmgiCi0jaW5j
bHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgot
I2luY2x1ZGUgImNzc2hlbHBlci5oIgotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNp
bmNsdWRlICJjc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5o
IgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVz
aW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLUhUTUxUYWJsZUVsZW1lbnQ6OkhUTUxUYWJsZUVs
ZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgOiBIVE1MRWxlbWVudCh0YWJsZVRhZywgZG9jKQotewot
ICAgIHRDYXB0aW9uID0gMDsKLSAgICBoZWFkID0gMDsKLSAgICBmb290ID0gMDsKLSAgICBmaXJz
dEJvZHkgPSAwOwotCi0gCi0gICAgcGFkZGluZyA9IDE7Ci0gICAgCi0gICAgbV9ub0JvcmRlciA9
IHRydWU7Ci0gICAgbV9zb2xpZCA9IGZhbHNlOwotfQotCi1IVE1MVGFibGVFbGVtZW50Ojp+SFRN
TFRhYmxlRWxlbWVudCgpCi17Ci0gICAgaWYgKGZpcnN0Qm9keSkKLSAgICAgICAgZmlyc3RCb2R5
LT5kZXJlZigpOwotfQotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5v
ZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpIHx8IG5l
d0NoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5o
YXNUYWdOYW1lKGNvbFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoY29sZ3JvdXBUYWcpIHx8
Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBuZXdDaGlsZC0+
aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
dGJvZHlUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpIHx8Ci0gICAgICAgICAg
IG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVs
ZW1lbnQ6OnNldENhcHRpb24oIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50ICpjICkKLXsKLSAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqb2MgPSB0Q2FwdGlvbikKLSAgICAg
ICAgcmVwbGFjZUNoaWxkKGMsIG9jLCBlYyk7Ci0gICAgZWxzZQotICAgICAgICBpbnNlcnRCZWZv
cmUoYywgZmlyc3RDaGlsZCgpLCBlYyk7Ci0gICAgdENhcHRpb24gPSBjOwotICAgIHJldHVybiB0
Q2FwdGlvbjsKLX0KLQotTm9kZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0VEhlYWQoIEhUTUxUYWJs
ZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBp
ZiAoTm9kZSAqaCA9IGhlYWQpCi0gICAgICAgIHJlcGxhY2VDaGlsZChzLCBoLCBlYyk7Ci0gICAg
ZWxzZSBpZiAoZm9vdCkKLSAgICAgICAgaW5zZXJ0QmVmb3JlKHMsIGZvb3QsIGVjKTsKLSAgICBl
bHNlIGlmIChmaXJzdEJvZHkpCi0gICAgICAgIGluc2VydEJlZm9yZShzLCBmaXJzdEJvZHksIGVj
KTsKLSAgICBlbHNlCi0gICAgICAgIGFwcGVuZENoaWxkKHMsIGVjKTsKLSAgICBoZWFkID0gczsK
LSAgICByZXR1cm4gaGVhZDsKLX0KLQotTm9kZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0VEZvb3Qo
IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKLSAgICBpZiAoTm9kZSAqZiA9IGZvb3QpCi0gICAgICAgIHJlcGxhY2VDaGlsZChzLCBmLCBl
Yyk7Ci0gICAgZWxzZSBpZiAoZmlyc3RCb2R5KQotICAgICAgICBpbnNlcnRCZWZvcmUocywgZmly
c3RCb2R5LCBlYyk7Ci0gICAgZWxzZQotICAgICAgICBhcHBlbmRDaGlsZChzLCBlYyk7Ci0gICAg
Zm9vdCA9IHM7Ci0gICAgcmV0dXJuIGZvb3Q7Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6
OnNldFRCb2R5KCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqcyApCi17Ci0gICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7Ci0gICAgTm9kZSogcjsKLSAgICBzLT5yZWYoKTsKLSAgICBpZiAoTm9kZSAq
ZmIgPSBmaXJzdEJvZHkpIHsKLSAgICAgICAgcmVwbGFjZUNoaWxkKHMsIGZiLCBlYyk7Ci0gICAg
ICAgIGZiLT5kZXJlZigpOwotICAgICAgICByID0gczsKLSAgICB9IGVsc2UKLSAgICAgICAgYXBw
ZW5kQ2hpbGQocywgZWMpOwotICAgIGZpcnN0Qm9keSA9IHM7Ci0gICAgcmV0dXJuIGZpcnN0Qm9k
eTsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6OmNyZWF0ZVRIZWFkKCAgKQot
ewotICAgIGlmKCFoZWFkKQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0g
ICAgICAgIGhlYWQgPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQodGhlYWRUYWcsIGRvY3Vt
ZW50KCksIHRydWUgLyogaW1wbGljaXQgKi8pOwotICAgICAgICBpZihmb290KQotICAgICAgICAg
ICAgaW5zZXJ0QmVmb3JlKCBoZWFkLCBmb290LCBlYyApOwotICAgICAgICBlbHNlIGlmKGZpcnN0
Qm9keSkKLSAgICAgICAgICAgIGluc2VydEJlZm9yZSggaGVhZCwgZmlyc3RCb2R5LCBlYyk7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGVuZENoaWxkKGhlYWQsIGVjKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlVEhlYWQo
ICApCi17Ci0gICAgaWYoaGVhZCkgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAg
ICAgICAgaGVhZC0+cmVmKCk7Ci0gICAgICAgIEhUTUxFbGVtZW50OjpyZW1vdmVDaGlsZChoZWFk
LCBlYyk7Ci0gICAgICAgIGhlYWQtPmRlcmVmKCk7Ci0gICAgfQotICAgIGhlYWQgPSAwOwotfQot
Ci1IVE1MRWxlbWVudCAqSFRNTFRhYmxlRWxlbWVudDo6Y3JlYXRlVEZvb3QoICApCi17Ci0gICAg
aWYgKCFmb290KQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAg
IGZvb3QgPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQodGZvb3RUYWcsIGRvY3VtZW50KCks
IHRydWUgLyppbXBsaWNpdCAqLyk7Ci0gICAgICAgIGlmIChmaXJzdEJvZHkpCi0gICAgICAgICAg
ICBpbnNlcnRCZWZvcmUoIGZvb3QsIGZpcnN0Qm9keSwgZWMgKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgYXBwZW5kQ2hpbGQoZm9vdCwgZWMpOwotICAgIH0KLSAgICByZXR1cm4gZm9vdDsK
LX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVURm9vdCggICkKLXsKLSAgICBpZihm
b290KSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICBmb290LT5yZWYo
KTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxkKGZvb3QsIGVjKTsKLSAgICAgICAg
Zm9vdC0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgZm9vdCA9IDA7Ci19Ci0KLUhUTUxFbGVtZW50ICpI
VE1MVGFibGVFbGVtZW50OjpjcmVhdGVDYXB0aW9uKCAgKQotewotICAgIGlmKCF0Q2FwdGlvbikK
LSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAgICB0Q2FwdGlvbiA9
IG5ldyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChkb2N1bWVudCgpKTsKLSAgICAgICAgaW5zZXJ0
QmVmb3JlKCB0Q2FwdGlvbiwgZmlyc3RDaGlsZCgpLCBlYyApOwotICAgIH0KLSAgICByZXR1cm4g
dENhcHRpb247Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlQ2FwdGlvbiggICkK
LXsKLSAgICBpZih0Q2FwdGlvbikgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAg
ICAgICAgdENhcHRpb24tPnJlZigpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQo
dENhcHRpb24sIGVjKTsKLSAgICAgICAgdENhcHRpb24tPmRlcmVmKCk7Ci0gICAgfQotICAgIHRD
YXB0aW9uID0gMDsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6Omluc2VydFJv
dyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICAvLyBUaGUgRE9NIHJlcXVp
cmVzIHRoYXQgd2UgY3JlYXRlIGEgdGJvZHkgaWYgdGhlIHRhYmxlIGlzIGVtcHR5Ci0gICAgLy8g
KGNmIERPTTJUUyBIVE1MVGFibGVFbGVtZW50MzEgdGVzdCkKLSAgICAvLyAobm90ZTogdGhpcyBp
cyBkaWZmZXJlbnQgZnJvbSAiaWYgdGhlIHRhYmxlIGhhcyBubyBzZWN0aW9ucyIsIHNpbmNlIHdl
IGNhbiBoYXZlCi0gICAgLy8gPFRBQkxFPjxUUj4pCi0gICAgaWYoIWZpcnN0Qm9keSAmJiAhaGVh
ZCAmJiAhZm9vdCkKLSAgICAgICAgc2V0VEJvZHkoIG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVu
dCh0Ym9keVRhZywgZG9jdW1lbnQoKSwgdHJ1ZSAvKiBpbXBsaWNpdCAqLykgKTsKLQotICAgIC8v
IElFIHRyZWF0cyBpbmRleD0tMSBhcyBkZWZhdWx0IHZhbHVlIG1lYW5pbmcgJ2FwcGVuZCBhZnRl
ciBsYXN0JwotICAgIC8vIFRoaXMgaXNuJ3QgaW4gdGhlIERPTS4gU28sIG5vdCBpbXBsZW1lbnRl
ZCB5ZXQuCi0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHNlY3Rpb24gPSAwTDsKLSAgICBI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCogbGFzdFNlY3Rpb24gPSAwTDsKLSAgICBOb2RlICpub2Rl
ID0gZmlyc3RDaGlsZCgpOwotICAgIGJvb2wgYXBwZW5kID0gKGluZGV4ID09IC0xKTsKLSAgICBi
b29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICggOyBub2RlICYmIChpbmRleD49MCB8fCBhcHBl
bmQpIDsgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCkgKQotICAgIHsKLSAgICAgICAgLy8gdGhl
cmUgY291bGQgYmUgMiB0Zm9vdCBlbGVtZW50cyBpbiB0aGUgdGFibGUuIE9ubHkgdGhlIGZpcnN0
IG9uZSBpcyB0aGUgImZvb3QiLCB0aGF0J3Mgd2h5IHdlIGhhdmUgdGhlIG1vcmUKLSAgICAgICAg
Ly8gY29tcGxpY2F0ZWQgaWYgc3RhdGVtZW50IGJlbG93LgotICAgICAgICBpZiAobm9kZSAhPSBm
b290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRm
b290VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkpCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihu
b2RlKTsKLSAgICAgICAgICAgIGxhc3RTZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgICAgICAgIGlm
ICghYXBwZW5kKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dz
KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvd3MgPj0gaW5kZXgpIHsKLSAgICAgICAgICAgICAg
ICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggLT0gcm93czsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoICFmb3VuZCAmJiBmb290ICkKLSAg
ICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGZv
b3QpOwotCi0gICAgLy8gSW5kZXggPT0gMCBtZWFucyAiaW5zZXJ0IGJlZm9yZSBmaXJzdCByb3cg
aW4gY3VycmVudCBzZWN0aW9uIgotICAgIC8vIG9yICJhcHBlbmQgYWZ0ZXIgbGFzdCByb3ciIChp
ZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VjdGlvbiBhbnltb3JlKQotICAgIGlmICggIXNlY3Rpb24g
JiYgKCBpbmRleCA9PSAwIHx8IGFwcGVuZCApICkKLSAgICB7Ci0gICAgICAgIHNlY3Rpb24gPSBs
YXN0U2VjdGlvbjsKLSAgICAgICAgaW5kZXggPSBzZWN0aW9uID8gc2VjdGlvbi0+bnVtUm93cygp
IDogMDsKLSAgICB9Ci0gICAgaWYgKHNlY3Rpb24gJiYgKGluZGV4ID49IDAgfHwgYXBwZW5kKSkK
LSAgICAgICAgcmV0dXJuIHNlY3Rpb24tPmluc2VydFJvdyhpbmRleCwgZWMpOwotICAgIGVsc2Ug
ewotICAgICAgICAvLyBObyBtb3JlIHNlY3Rpb25zID0+IGluZGV4IGlzIHRvbyBiaWcKLSAgICAg
ICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsKLSAgICAgICAgcmV0dXJuIDBMOwotICAgIH0KLX0KLQot
dm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVSb3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29k
ZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHNlY3Rpb24gPSAwTDsKLSAg
ICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIGJvb2wgbGFzdFJvdyA9IGluZGV4ID09
IC0xOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBsYXN0U2VjdGlvbiA9IDBMOwotICAg
IGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKCA7IG5vZGUgOyBub2RlID0gbm9kZS0+bmV4
dFNpYmxpbmcoKSApCi0gICAgewotICAgICAgICBpZiAobm9kZSAhPSBmb290ICYmIChub2RlLT5o
YXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRmb290VGFnKSB8fCAKLSAg
ICAgICAgICAgIG5vZGUtPmhhc1RhZ05hbWUodGJvZHlUYWcpKSkgewotICAgICAgICAgICAgc2Vj
dGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KG5vZGUpOwotICAg
ICAgICAgICAgbGFzdFNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgICAgICAgaW50IHJvd3MgPSBz
ZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAgICAgICBpZiAoICFsYXN0Um93ICkKLSAgICAgICAg
ICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHJvd3MgPiBpbmRleCApIHsKLSAgICAgICAgICAg
ICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggLT0gcm93czsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZWN0aW9uID0gMEw7Ci0gICAgfQotICAg
IGlmICggIWZvdW5kICYmIGZvb3QgKQotICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRN
TFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oZm9vdCk7Ci0KLSAgICBpZiAoIGxhc3RSb3cgKQotICAg
ICAgICBsYXN0U2VjdGlvbi0+ZGVsZXRlUm93KCAtMSwgZWMgKTsKLSAgICBlbHNlIGlmICggc2Vj
dGlvbiAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgc2VjdGlvbi0+bnVtUm93cygpICkKLSAgICAg
ICAgc2VjdGlvbi0+ZGVsZXRlUm93KCBpbmRleCwgZWMgKTsKLSAgICBlbHNlCi0gICAgICAgIGVj
ID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6
OmFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4gY2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5oYXNU
YWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAgIC8vIEZpcnN0IGFkZCB0aGUgY2hpbGQuCi0gICAg
ICAgIEhUTUxFbGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBs
eSByZXR1cm4gb3Vyc2VsdmVzIGFzIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAg
ICAgIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFm
IGFuZCBtb3ZpbmcgaXQgc2FmZWx5IG91dCBvZiB0aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhp
czsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY3JlYXRpb24gb2YgPHRib2R5PiBlbGVtZW50cyByZWxp
ZXMgb24gdGhlICJjaGlsZEFsbG93ZWQiIGNoZWNrLAotICAgIC8vIHNvIHdlIG5lZWQgdG8gZG8g
aXQgZXZlbiBmb3IgWE1MIGRvY3VtZW50cy4KLSAgICBhc3NlcnQoY2hpbGQtPm5vZGVUeXBlKCkg
IT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk7Ci0gICAgaWYgKCFkb2N1bWVudCgpLT5pc0hUTUxE
b2N1bWVudCgpICYmICFjaGlsZEFsbG93ZWQoY2hpbGQuZ2V0KCkpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIENvbnRhaW5lck5vZGUqIGNvbnRhaW5lciA9IEhUTUxFbGVtZW50OjphZGRDaGls
ZChjaGlsZC5nZXQoKSk7Ci0gICAgaWYgKGNvbnRhaW5lcikgewotICAgICAgICBpZiAoIXRDYXB0
aW9uICYmIGNoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcpKQotICAgICAgICAgICAgdENhcHRp
b24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVDYXB0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7
Ci0gICAgICAgIGVsc2UgaWYgKCFoZWFkICYmIGNoaWxkLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSkK
LSAgICAgICAgICAgIGhlYWQgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAq
PihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFmb290ICYmIGNoaWxkLT5oYXNUYWdO
YW1lKHRmb290VGFnKSkKLSAgICAgICAgICAgIGZvb3QgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFmaXJzdEJv
ZHkgJiYgY2hpbGQtPmhhc1RhZ05hbWUodGJvZHlUYWcpKSB7Ci0gICAgICAgICAgICBmaXJzdEJv
ZHkgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7
Ci0gICAgICAgICAgICBmaXJzdEJvZHktPnJlZigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJl
dHVybiBjb250YWluZXI7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6Y2hpbGRyZW5DaGFu
Z2VkKCkKLXsKLSAgICBIVE1MRWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0gICAg
aWYgKGZpcnN0Qm9keSAmJiBmaXJzdEJvZHktPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAg
ICAgIGZpcnN0Qm9keS0+ZGVyZWYoKTsKLSAgICAgICAgZmlyc3RCb2R5ID0gMDsKLSAgICB9Ci19
IAotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFt
ZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAg
aWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IChNYXBw
ZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRyeSArIGRvY3VtZW50KCktPmRvY0lEKCkpOwotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0
aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRy
TmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBjZWxsc3BhY2luZ0F0
dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdnNwYWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFt
ZSA9PSBoc3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZhbGlnbkF0dHIpIHsKLSAg
ICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYm9yZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIHJl
c3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAg
ICBpZiAoYXR0ck5hbWUgPT0gYm9yZGVyQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVGFibGU7
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0g
YWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVUYWJsZTsKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0gCi0gICAgCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0
dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgp
ID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lE
VEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdo
dEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0
ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyQXR0cikg
IHsKLSAgICAgICAgbV9ub0JvcmRlciA9IHRydWU7Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkp
IHsKLSAgICAgICAgICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsID0gYXR0ci0+ZGVjbCgpLT5nZXRQ
cm9wZXJ0eUNTU1ZhbHVlKENTU19QUk9QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLSAgICAgICAgICAg
IGlmICh2YWwgJiYgdmFsLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbVZhbCA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odmFsLmdldCgpKTsKLSAgICAgICAgICAgICAgICBtX25vQm9yZGVyID0gIXByaW1WYWwtPmdl
dEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFhdHRyLT5pc051bGwoKSkgewotICAgICAg
ICAgICAgLy8gIyMjIHRoaXMgbmVlZHMgbW9yZSB3b3JrLCBhcyB0aGUgYm9yZGVyIHZhbHVlIGlz
IG5vdCBvbmx5Ci0gICAgICAgICAgICAvLyAgICAgdGhlIGJvcmRlciBvZiB0aGUgYm94LCBidXQg
YWxzbyBiZXR3ZWVuIHRoZSBjZWxscwotICAgICAgICAgICAgaW50IGJvcmRlciA9IDA7Ci0gICAg
ICAgICAgICBpZiAoYXR0ci0+aXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGJvcmRlciA9IDE7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYm9yZGVyID0gYXR0ci0+dmFsdWUo
KS50b0ludCgpOwotI2lmZGVmIERFQlVHX0RSQVdfQk9SREVSCi0gICAgICAgICAgICBib3JkZXI9
MTsKLSNlbmRpZgotICAgICAgICAgICAgbV9ub0JvcmRlciA9ICFib3JkZXI7Ci0gICAgICAgICAg
ICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1dJRFRILCBTdHJpbmc6Om51bWJl
cihib3JkZXIpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJn
Y29sb3JBdHRyKSB7Ci0gICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JBQ0tHUk9V
TkRfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGJvcmRlcmNvbG9yQXR0cikgewotICAgICAgICBtX3NvbGlkID0gYXR0ci0+ZGVjbCgpOwotICAg
ICAgICBpZiAoIWF0dHItPmRlY2woKSAmJiAhYXR0ci0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAg
ICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9CT1JERVJfQ09MT1IsIGF0dHItPnZhbHVlKCkp
OwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1RPUF9T
VFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBD
U1NfUFJPUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAg
IGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9MRUZUX1NUWUxFLCBDU1NfVkFM
X1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRF
Ul9SSUdIVF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBtX3NvbGlkID0gdHJ1
ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRB
dHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1
ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTSW1h
Z2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0lNQUdFLCBkb2N1bWVudCgpLT5j
b21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBmcmFtZUF0
dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBydWxlc0F0dHIpIHsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjZWxsc3BhY2luZ0F0dHIpIHsKLSAgICAgICAgaWYg
KCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRy
LCBDU1NfUFJPUF9CT1JERVJfU1BBQ0lORywgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gY2VsbHBhZGRpbmdBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+
dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBwYWRkaW5nID0gbWF4KCAwLCBhdHRyLT52
YWx1ZSgpLnRvSW50KCkgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFkZGluZyA9IDE7
Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFibGUoKSkgewotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGUgKj4ocmVuZGVyZXIoKSktPnNldENlbGxQ
YWRkaW5nKHBhZGRpbmcpOwotICAgICAgICAgICAgaWYgKCFyZW5kZXJlcigpLT5uZWVkc0xheW91
dCgpKQotICAgICAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0KHRydWUpOwot
ICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY29sc0F0dHIpIHsKLSAg
ICAgICAgLy8gIyMjCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikg
ewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+
dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9U
VE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3Bh
Y2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVG
VCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9N
QVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGFsaWduQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfRkxPQVQsIGF0dHItPnZh
bHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbGlnbkF0dHIpIHsKLSAg
ICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU1By
b3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJQ0FMX0FMSUdOLCBhdHRyLT52YWx1ZSgpKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIp
OwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogSFRNTFRhYmxlRWxlbWVudDo6YWRk
aXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpCi17Ci0gICAgaWYgKG1fbm9Cb3JkZXIpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIE1hcHBlZEF0dHJpYnV0ZSBhdHRyKHRhYmxlYm9yZGVyQXR0ciwg
bV9zb2xpZCA/ICJzb2xpZCIgOiAib3V0c2V0Iik7Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVj
bGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0
cik7Ci0gICAgaWYgKCFkZWNsKSB7Ci0gICAgICAgIGRlY2wgPSBuZXcgQ1NTTWFwcGVkQXR0cmli
dXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVudChkb2N1bWVudCgpLT5l
bGVtZW50U2hlZXQoKSk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgICAgIGRl
Y2wtPnNldFN0cmljdFBhcnNpbmcoZmFsc2UpOyAvLyBNYXBwZWQgYXR0cmlidXRlcyBhcmUganVz
dCBhbHdheXMgcXVpcmt5LgotICAgICAgICAKLSAgICAgICAgZGVjbC0+cmVmKCk7IC8vIFRoaXMg
c2luZ2xlIHJlZiBwaW5zIHVzIGluIHRoZSB0YWJsZSB1bnRpbCB0aGUgZG9jdW1lbnQgZGllcy4K
LQotICAgICAgICBpbnQgdiA9IG1fc29saWQgPyBDU1NfVkFMX1NPTElEIDogQ1NTX1ZBTF9PVVRT
RVQ7Ci0gICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9UT1BfU1RZTEUs
IHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0JP
VFRPTV9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJP
UF9CT1JERVJfTEVGVF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0
eShDU1NfUFJPUF9CT1JERVJfUklHSFRfU1RZTEUsIHYsIGZhbHNlKTsKLQotICAgICAgICBzZXRN
YXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0ciwgZGVjbCk7Ci0gICAgICAgIGRl
Y2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgZGVj
bC0+c2V0TWFwcGVkU3RhdGUoZVBlcnNpc3RlbnQsIGF0dHIubmFtZSgpLCBhdHRyLnZhbHVlKCkp
OwotICAgIH0KLSAgICByZXR1cm4gZGVjbDsKLX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b24qIEhUTUxUYWJsZUVsZW1lbnQ6OmdldFNoYXJlZENlbGxEZWNsKCkKLXsKLSAgICBNYXBwZWRB
dHRyaWJ1dGUgYXR0cihjZWxsYm9yZGVyQXR0ciwgbV9ub0JvcmRlciA/ICJub25lIiA6IChtX3Nv
bGlkID8gInNvbGlkIiA6ICJpbnNldCIpKTsKLSAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJh
dGlvbiogZGVjbCA9IGdldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQsICZhdHRyKTsK
LSAgICBpZiAoIWRlY2wpIHsKLSAgICAgICAgZGVjbCA9IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVE
ZWNsYXJhdGlvbigwKTsKLSAgICAgICAgZGVjbC0+c2V0UGFyZW50KGRvY3VtZW50KCktPmVsZW1l
bnRTaGVldCgpKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICAgICAgZGVjbC0+
c2V0U3RyaWN0UGFyc2luZyhmYWxzZSk7IC8vIE1hcHBlZCBhdHRyaWJ1dGVzIGFyZSBqdXN0IGFs
d2F5cyBxdWlya3kuCi0gICAgICAgIAotICAgICAgICBkZWNsLT5yZWYoKTsgLy8gVGhpcyBzaW5n
bGUgcmVmIHBpbnMgdXMgaW4gdGhlIHRhYmxlIHVudGlsIHRoZSB0YWJsZSBkaWVzLgotICAgICAg
ICAKLSAgICAgICAgaWYgKG1fbm9Cb3JkZXIpCi0gICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0
eShDU1NfUFJPUF9CT1JERVJfV0lEVEgsICIwIiwgZmFsc2UpOwotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9XSURUSCwgIjFweCIs
IGZhbHNlKTsKLSAgICAgICAgICAgIGludCB2ID0gbV9zb2xpZCA/IENTU19WQUxfU09MSUQgOiBD
U1NfVkFMX0lOU0VUOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9S
REVSX1RPUF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHko
Q1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVj
bC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZTEUsIHYsIGZhbHNlKTsKLSAg
ICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwg
diwgZmFsc2UpOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVS
X0NPTE9SLCAiaW5oZXJpdCIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1hcHBl
ZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQsICZhdHRyLCBkZWNsKTsKLSAgICAgICAgZGVjbC0+
c2V0UGFyZW50KDApOwotICAgICAgICBkZWNsLT5zZXROb2RlKDApOwotICAgICAgICBkZWNsLT5z
ZXRNYXBwZWRTdGF0ZShlUGVyc2lzdGVudCwgYXR0ci5uYW1lKCksIGF0dHIudmFsdWUoKSk7Ci0g
ICAgfQotICAgIHJldHVybiBkZWNsOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmF0dGFj
aCgpCi17Ci0gICAgYXNzZXJ0KCFtX2F0dGFjaGVkKTsKLSAgICBIVE1MRWxlbWVudDo6YXR0YWNo
KCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZSgpKQotICAgICAg
ICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihyZW5kZXJlcigpKS0+c2V0Q2VsbFBhZGRpbmco
IHBhZGRpbmcgKTsKLX0KLQotYm9vbCBIVE1MVGFibGVFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShB
dHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBiYWNr
Z3JvdW5kQXR0cjsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVFbGVtZW50
Ojpyb3dzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENv
bGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246OlRBQkxFX1JPV1MpKTsKLX0KLQotUmVmUHRy
PEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVFbGVtZW50Ojp0Qm9kaWVzKCkKLXsKLSAgICByZXR1
cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENv
bGxlY3Rpb246OlRBQkxFX1RCT0RJRVMpKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6
OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19
Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1M
VGFibGVFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRCZ0NvbG9yKGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2YWx1
ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50Ojpib3JkZXIoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoYm9yZGVyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxl
bWVudDo6c2V0Qm9yZGVyKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KGJvcmRlckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmNlbGxQ
YWRkaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNlbGxwYWRkaW5nQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0Q2VsbFBhZGRpbmcoY29uc3QgU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2VsbHBhZGRpbmdBdHRyLCB2YWx1ZSk7
Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpjZWxsU3BhY2luZygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjZWxsc3BhY2luZ0F0dHIpOwotfQotCi12b2lkIEhUTUxU
YWJsZUVsZW1lbnQ6OnNldENlbGxTcGFjaW5nKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGNlbGxzcGFjaW5nQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRh
YmxlRWxlbWVudDo6ZnJhbWUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoZnJh
bWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRGcmFtZShjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShmcmFtZUF0dHIsIHZhbHVlKTsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OnJ1bGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHJ1bGVzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0UnVs
ZXMoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUocnVsZXNBdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpzdW1tYXJ5KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHN1bW1hcnlBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFi
bGVFbGVtZW50OjpzZXRTdW1tYXJ5KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKHN1bW1hcnlBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50
Ojp3aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpOwot
fQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1ib29sIEhUTUxUYWJsZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0
IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBj
b25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICBy
ZXN1bHQgPSAoTWFwcGVkQXR0cmlidXRlRW50cnkpKGVMYXN0RW50cnkgKyBkb2N1bWVudCgpLT5k
b2NJRCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0
ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gYm9yZGVyY29sb3JB
dHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZhbGlnbkF0dHIgfHwKLSAgICAgICAgYXR0ck5h
bWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0
dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNlbGw7IC8vIEFsbCB0YWJsZSBwYXJ0cyB3aWxsIGp1
c3Qgc2hhcmUgaW4gdGhlIFREIHNwYWNlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwot
fQotCi12b2lkIEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBw
ZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBiZ2NvbG9yQXR0
cikgewotICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0NPTE9S
LCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3Jv
dW5kQXR0cikgewotICAgICAgICBTdHJpbmcgdXJsID0gV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+
dmFsdWUoKSk7Ci0gICAgICAgIGlmICghdXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENT
U0ltYWdlUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9JTUFHRSwgZG9jdW1lbnQo
KS0+Y29tcGxldGVVUkwodXJsKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9y
ZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpIHsK
LSAgICAgICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JPUkRFUl9DT0xPUiwgYXR0
ci0+dmFsdWUoKSk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9C
T1JERVJfVE9QX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3Bl
cnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9CT1RUT01fU1RZTEUsIENTU19WQUxfU09MSUQpOwot
ICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZ
TEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NT
X1BST1BfQk9SREVSX1JJR0hUX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFh
dHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIs
IENTU19QUk9QX1ZFUlRJQ0FMX0FMSUdOLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiB2ID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHYsICJt
aWRkbGUiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZSh2LCAiY2VudGVyIikpCi0gICAgICAgICAgICBh
ZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9URVhUX0FMSUdOLCBDU1NfVkFMX19XRUJLSVRf
Q0VOVEVSKTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodiwgImFic21pZGRs
ZSIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElH
TiwgQ1NTX1ZBTF9DRU5URVIpOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2
LCAibGVmdCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVY
VF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lUX0xFRlQpOwotICAgICAgICBlbHNlIGlmIChlcXVhbEln
bm9yaW5nQ2FzZSh2LCAicmlnaHQiKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIs
IENTU19QUk9QX1RFWFRfQUxJR04sIENTU19WQUxfX1dFQktJVF9SSUdIVCk7Ci0gICAgICAgIGVs
c2UKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04s
IHYpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAg
ICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZQotICAg
ICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OkhUTUxUYWJsZVNlY3Rp
b25FbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MsIGJv
b2wgaW1wbGljaXQpCiAgICAgOiBIVE1MVGFibGVQYXJ0RWxlbWVudCh0YWdOYW1lLCBkb2MpCiB7
CkBAIC03MTQsMTYgKzY0LDE0IEBAIENvbnRhaW5lck5vZGUqIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50OjoKIAogLy8gdGhlc2UgZnVuY3Rpb25zIGFyZSByYXRoZXIgc2xvdywgc2luY2Ugd2UgbmVl
ZCB0byBnZXQgdGhlIHJvdyBhdAogLy8gdGhlIGluZGV4Li4uIGJ1dCB0aGV5IGFyZW4ndCB1c2Vk
IGR1cmluZyB1c3VhbCBIVE1MIHBhcnNpbmcgYW55d2F5Ci1IVE1MRWxlbWVudCAqSFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQ6Omluc2VydFJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykK
K0hUTUxFbGVtZW50KiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6aW5zZXJ0Um93KGludCBpbmRl
eCwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7Ci0gICAgSFRNTFRhYmxlUm93RWxlbWVudCAqciA9IDBM
OworICAgIEhUTUxUYWJsZVJvd0VsZW1lbnQqIHIgPSAwTDsKICAgICBSZWZQdHI8Tm9kZUxpc3Q+
IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwogICAgIGludCBudW1Sb3dzID0gY2hpbGRyZW4gPyAo
aW50KWNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKCBpbmRleCA8IC0xIHx8IGluZGV4
ID4gbnVtUm93cyApIHsKKyAgICBpZiAoaW5kZXggPCAtMSB8fCBpbmRleCA+IG51bVJvd3MpCiAg
ICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7IC8vIHBlciB0aGUgRE9NCi0gICAgfQotICAgIGVs
c2UKLSAgICB7CisgICAgZWxzZSB7CiAgICAgICAgIHIgPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVu
dChkb2N1bWVudCgpKTsKICAgICAgICAgaWYgKCBudW1Sb3dzID09IGluZGV4IHx8IGluZGV4ID09
IC0xICkKICAgICAgICAgICAgIGFwcGVuZENoaWxkKHIsIGVjKTsKQEAgLTgxMCw1MjUgKzE1OCw0
IEBAIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlU2VjdGlvbkUKICAgICByZXR1cm4g
UmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxl
Y3Rpb246OlRBQkxFX1JPV1MpKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIEhU
TUxUYWJsZVJvd0VsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAg
IHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0ZFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05h
bWUodGhUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpIHx8
IG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhU
TUxUYWJsZVJvd0VsZW1lbnQ6OmFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4gY2hpbGQpCi17Ci0g
ICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAgIC8vIEZpcnN0IGFk
ZCB0aGUgY2hpbGQuCi0gICAgICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50OjphZGRDaGlsZChjaGls
ZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBseSByZXR1cm4gb3Vyc2VsdmVzIGFzIHRoZSBjb250
YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Yg
ZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFmIGFuZCBtb3ZpbmcgaXQgc2FmZWx5IG91dCBvZiB0
aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICByZXR1cm4gSFRNTFRh
YmxlUGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsKLX0KLQotaW50IEhUTUxUYWJsZVJvd0Vs
ZW1lbnQ6OnJvd0luZGV4KCkgY29uc3QKLXsKLSAgICBOb2RlICp0YWJsZSA9IHBhcmVudE5vZGUo
KTsKLSAgICBpZiAoIXRhYmxlKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgdGFibGUgPSB0YWJs
ZS0+cGFyZW50Tm9kZSgpOwotICAgIGlmICghdGFibGUgfHwgIXRhYmxlLT5oYXNUYWdOYW1lKHRh
YmxlVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLy8gVG8gbWF0Y2ggRmlyZWZveCwg
dGhlIHJvdyBpbmRpY2VzIHdvcmsgbGlrZSB0aGlzOgotICAgIC8vICAgUm93cyBmcm9tIHRoZSBm
aXJzdCA8dGhlYWQ+IGFyZSBudW1iZXJlZCBiZWZvcmUgYWxsIDx0Ym9keT4gcm93cy4KLSAgICAv
LyAgIFJvd3MgZnJvbSB0aGUgZmlyc3QgPHRmb290PiBhcmUgbnVtYmVyZWQgYWZ0ZXIgYWxsIDx0
Ym9keT4gcm93cy4KLSAgICAvLyAgIFJvd3MgZnJvbSBvdGhlciA8dGhlYWQ+IGFuZCA8dGZvb3Q+
IGVsZW1lbnRzIGRvbid0IGdldCByb3cgaW5kaWNlcyBhdCBhbGwuCi0KLSAgICBpbnQgckluZGV4
ID0gMDsKLQotICAgIGlmIChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogaGVhZCA9IHN0YXRpY19j
YXN0PEhUTUxUYWJsZUVsZW1lbnQqPih0YWJsZSktPnRIZWFkKCkpIHsKLSAgICAgICAgZm9yIChO
b2RlICpyb3cgPSBoZWFkLT5maXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgICAgICBpZiAocm93ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIHJJbmRleDsKLSAgICAgICAgICAgICsrckluZGV4OwotICAgICAgICB9Ci0gICAgfQotICAg
IAotICAgIGZvciAoTm9kZSAqbm9kZSA9IHRhYmxlLT5maXJzdENoaWxkKCk7IG5vZGU7IG5vZGUg
PSBub2RlLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKHRi
b2R5VGFnKSkgewotICAgICAgICAgICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHNlY3Rpb24g
PSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCo+KG5vZGUpOwotICAgICAgICAg
ICAgZm9yIChOb2RlKiByb3cgPSBzZWN0aW9uLT5maXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93
LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdyA9PSB0aGlzKQotICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gckluZGV4OwotICAgICAgICAgICAgICAgICsrckluZGV4
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKEhUTUxUYWJsZVNl
Y3Rpb25FbGVtZW50KiBmb290ID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlRWxlbWVudCAqPih0YWJs
ZSktPnRGb290KCkpIHsKLSAgICAgICAgZm9yIChOb2RlICpyb3cgPSBmb290LT5maXJzdENoaWxk
KCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAocm93
ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJJbmRleDsKLSAgICAgICAgICAgICsr
ckluZGV4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2UgZ2V0IGhlcmUgZm9yIHJvd3Mg
dGhhdCBhcmUgaW4gPHRoZWFkPiBvciA8dGZvb3Q+IHNlY3Rpb25zIG90aGVyIHRoYW4gdGhlIG1h
aW4gaGVhZGVyIGFuZCBmb290ZXIuCi0gICAgcmV0dXJuIC0xOwotfQotCi1pbnQgSFRNTFRhYmxl
Um93RWxlbWVudDo6c2VjdGlvblJvd0luZGV4KCkgY29uc3QKLXsKLSAgICBpbnQgckluZGV4ID0g
MDsKLSAgICBjb25zdCBOb2RlICpuID0gdGhpczsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSBuLT5w
cmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgaWYgKG4gJiYgbi0+aGFzVGFnTmFtZSh0clRhZykp
Ci0gICAgICAgICAgICBySW5kZXgrKzsKLSAgICB9Ci0gICAgd2hpbGUgKG4pOwotCi0gICAgcmV0
dXJuIHJJbmRleDsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZVJvd0VsZW1lbnQ6Omluc2Vy
dENlbGwoIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlQ2Vs
bEVsZW1lbnQgKmMgPSAwTDsKLSAgICBSZWZQdHI8Tm9kZUxpc3Q+IGNoaWxkcmVuID0gY2hpbGRO
b2RlcygpOwotICAgIGludCBudW1DZWxscyA9IGNoaWxkcmVuID8gY2hpbGRyZW4tPmxlbmd0aCgp
IDogMDsKLSAgICBpZiAoIGluZGV4IDwgLTEgfHwgaW5kZXggPiBudW1DZWxscyApCi0gICAgICAg
IGVjID0gSU5ERVhfU0laRV9FUlI7IC8vIHBlciB0aGUgRE9NCi0gICAgZWxzZQotICAgIHsKLSAg
ICAgICAgYyA9IG5ldyBIVE1MVGFibGVDZWxsRWxlbWVudCh0ZFRhZywgZG9jdW1lbnQoKSk7Ci0g
ICAgICAgIGlmKG51bUNlbGxzID09IGluZGV4IHx8IGluZGV4ID09IC0xKQotICAgICAgICAgICAg
YXBwZW5kQ2hpbGQoYywgZWMpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIE5vZGUgKm47
Ci0gICAgICAgICAgICBpZihpbmRleCA8IDEpCi0gICAgICAgICAgICAgICAgbiA9IGZpcnN0Q2hp
bGQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuID0gY2hpbGRyZW4tPml0
ZW0oaW5kZXgpOwotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKGMsIG4sIGVjKTsKLSAgICAgICAg
fQotICAgIH0KLSAgICByZXR1cm4gYzsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50Ojpk
ZWxldGVDZWxsKCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIFJlZlB0cjxO
b2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50IG51bUNlbGxzID0gY2hp
bGRyZW4gPyBjaGlsZHJlbi0+bGVuZ3RoKCkgOiAwOwotICAgIGlmIChpbmRleCA9PSAtMSApCi0g
ICAgICAgIGluZGV4ID0gbnVtQ2VsbHMtMTsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8
IG51bUNlbGxzKSB7Ci0gICAgICAgIFJlZlB0cjxOb2RlPiByb3cgPSBjaGlsZHJlbi0+aXRlbShp
bmRleCk7Ci0gICAgICAgIEhUTUxFbGVtZW50OjpyZW1vdmVDaGlsZChyb3cuZ2V0KCksIGVjKTsK
LSAgICB9IGVsc2UKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsKLX0KLQotUmVmUHRyPEhU
TUxDb2xsZWN0aW9uPiBIVE1MVGFibGVSb3dFbGVtZW50OjpjZWxscygpCi17Ci0gICAgcmV0dXJu
IFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xsZWN0aW9uKHRoaXMsIEhUTUxDb2xs
ZWN0aW9uOjpUUl9DRUxMUykpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldENl
bGxzKEhUTUxDb2xsZWN0aW9uICosIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIGVjID0gTk9f
TU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVu
dDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsK
LX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmJnQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoYmdjb2xvckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNl
dEJnQ29sb3IoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYmdjb2xv
ckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmNoKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJBdHRyKTsKLX0KLQotdm9pZCBIVE1M
VGFibGVSb3dFbGVtZW50OjpzZXRDaChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShjaGFyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVu
dDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIp
OwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldENoT2ZmKGNvbnN0IFN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0
cmluZyBIVE1MVGFibGVSb3dFbGVtZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6
c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGln
bkF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MVGFibGVDZWxs
RWxlbWVudDo6SFRNTFRhYmxlQ2VsbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFt
ZSwgRG9jdW1lbnQgKmRvYykKLSAgOiBIVE1MVGFibGVQYXJ0RWxlbWVudCh0YWdOYW1lLCBkb2Mp
Ci17Ci0gICAgX2NvbCA9IC0xOwotICAgIF9yb3cgPSAtMTsKLSAgICBjU3BhbiA9IHJTcGFuID0g
MTsKLSAgICByb3dIZWlnaHQgPSAwOwotICAgIG1fc29saWQgPSBmYWxzZTsKLX0KLQotSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ6On5IVE1MVGFibGVDZWxsRWxlbWVudCgpCi17Ci19Ci0KLWludCBIVE1M
VGFibGVDZWxsRWxlbWVudDo6Y2VsbEluZGV4KCkgY29uc3QKLXsKLSAgICBpbnQgaW5kZXggPSAw
OwotICAgIGZvciAoY29uc3QgTm9kZSAqIG5vZGUgPSBwcmV2aW91c1NpYmxpbmcoKTsgbm9kZTsg
bm9kZSA9IG5vZGUtPnByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNU
YWdOYW1lKHRkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRoVGFnKSkKLSAgICAgICAgICAgIGlu
ZGV4Kys7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpbmRleDsKLX0KLQotYm9vbCBIVE1MVGFi
bGVDZWxsRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUg
PT0gbm93cmFwQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIg
fHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICByZXN1bHQgPSBl
Q2VsbDsgLy8gQmVjYXVzZSBvZiB0aGUgcXVpcmt5IGJlaGF2aW9yIG9mIGlnbm9yaW5nIDAgdmFs
dWVzLCBjZWxscyBhcmUgc3BlY2lhbC4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQot
ICAgIHJldHVybiBIVE1MVGFibGVQYXJ0RWxlbWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVz
dWx0KTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1
dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcm93
c3BhbkF0dHIpIHsKLSAgICAgICAgclNwYW4gPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1
ZSgpLnRvSW50KCkgOiAxOwotICAgICAgICBpZiAoclNwYW4gPCAxKSByU3BhbiA9IDE7Ci0gICAg
ICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFibGVDZWxsKCkpCi0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJv
bUVsZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjb2xzcGFuQXR0cikg
ewotICAgICAgICBjU3BhbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQo
KSA6IDE7Ci0gICAgICAgIGlmIChjU3BhbiA8IDEpIGNTcGFuID0gMTsKLSAgICAgICAgaWYgKHJl
bmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNlbGwoKSkKLSAgICAgICAgICAgIHN0YXRp
Y19jYXN0PFJlbmRlclRhYmxlQ2VsbCo+KHJlbmRlcmVyKCkpLT51cGRhdGVGcm9tRWxlbWVudCgp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5vd3JhcEF0dHIpIHsKLSAgICAgICAg
aWYgKCFhdHRyLT5pc051bGwoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENT
U19QUk9QX1dISVRFX1NQQUNFLCBDU1NfVkFMX19XRUJLSVRfTk9XUkFQKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1
ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IHdpZHRoSW50ID0gYXR0ci0+dmFsdWUo
KS50b0ludCgpOwotICAgICAgICAgICAgaWYgKHdpZHRoSW50ID4gMCkgLy8gd2lkdGg9IjAiIGlz
IGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5JRS4KLSAgICAgICAgICAgICAgICBh
ZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAg
ICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0
SW50ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAgICAgaWYgKGhlaWdodEludCA+
IDApIC8vIGhlaWdodD0iMCIgaXMgaWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFdpbklF
LgotICAgICAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0
dHItPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxUYWJsZVBh
cnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotLy8gdXNlZCBieSB0
YWJsZSBjZWxscyB0byBzaGFyZSBzdHlsZSBkZWNscyBjcmVhdGVkIGJ5IHRoZSBlbmNsb3Npbmcg
dGFibGUuCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6
OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKQotewotICAgIE5vZGUqIHAgPSBwYXJlbnRO
b2RlKCk7Ci0gICAgd2hpbGUgKHAgJiYgIXAtPmhhc1RhZ05hbWUodGFibGVUYWcpKQotICAgICAg
ICBwID0gcC0+cGFyZW50Tm9kZSgpOwotCi0gICAgaWYgKHApIHsKLSAgICAgICAgSFRNTFRhYmxl
RWxlbWVudCogdGFibGUgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50Kj4ocCk7Ci0gICAg
ICAgIHJldHVybiB0YWJsZS0+Z2V0U2hhcmVkQ2VsbERlY2woKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gMDsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxsRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0
cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gYmFja2dy
b3VuZEF0dHI7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6YWJicigpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhYmJyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ6OnNldEFiYnIoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoYWJickF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVt
ZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIp
OwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3Ry
aW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpheGlzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKGF4aXNBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0
QXhpcyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShheGlzQXR0ciwg
dmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmJnQ29sb3IoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIpOwotfQotCi12b2lkIEhU
TUxUYWJsZUNlbGxFbGVtZW50OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFi
bGVDZWxsRWxlbWVudDo6Y2goKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hh
ckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRDaChjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyQXR0ciwgdmFsdWUpOwotfQotCi1T
dHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVu
dDo6c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hh
cm9mZkF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Q29s
U3BhbihpbnQgbikKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY29sc3BhbkF0dHIsIFN0cmluZzo6bnVt
YmVyKG4pKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpoZWFkZXJzKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGhlYWRlcnNBdHRyKTsKLX0KLQotdm9pZCBI
VE1MVGFibGVDZWxsRWxlbWVudDo6c2V0SGVhZGVycyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShoZWFkZXJzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ6OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShoZWlnaHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0SGVpZ2h0
KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGhlaWdodEF0dHIsIHZh
bHVlKTsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxsRWxlbWVudDo6bm9XcmFwKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShub3dyYXBBdHRyKS5pc051bGwoKTsKLX0KLQotdm9p
ZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Tm9XcmFwKGJvb2wgYikKLXsKLSAgICBzZXRBdHRy
aWJ1dGUobm93cmFwQXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQ6OnNldFJvd1NwYW4oaW50IG4pCi17Ci0gICAgc2V0QXR0cmlidXRlKHJvd3NwYW5BdHRy
LCBTdHJpbmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6
c2NvcGUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoc2NvcGVBdHRyKTsKLX0K
LQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0U2NvcGUoY29uc3QgU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2NvcGVBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBI
VE1MVGFibGVDZWxsRWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRW
QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsaWduQXR0
ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OndpZHRoKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLUhUTUxUYWJsZUNvbEVsZW1lbnQ6OkhUTUxUYWJsZUNvbEVsZW1lbnQoY29uc3QgUXVhbGlm
aWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgICA6IEhUTUxUYWJsZVBhcnRFbGVt
ZW50KHRhZ05hbWUsIGRvYykKLXsKLSAgICBfc3BhbiA9ICh0YWdOYW1lLm1hdGNoZXMoY29sZ3Jv
dXBUYWcpID8gMCA6IDEpOwotfQotCi1ib29sIEhUTUxUYWJsZUNvbEVsZW1lbnQ6Om1hcFRvRW50
cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiBy
ZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0cikgewotICAgICAg
ICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1
bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNwYW5B
dHRyKSB7Ci0gICAgICAgIF9zcGFuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50
b0ludCgpIDogMTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJs
ZUNvbCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDb2wqPihyZW5kZXJl
cigpKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUo
KSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmFsaWdu
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFi
bGVDb2xFbGVtZW50OjpjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFy
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3Ry
aW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDb2xFbGVtZW50Ojpz
ZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2Zm
QXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldFNwYW4oaW50
IG4pCi17Ci0gICAgc2V0QXR0cmlidXRlKHNwYW5BdHRyLCBTdHJpbmc6Om51bWJlcihuKSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxl
bWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6Ondp
ZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotYm9vbCBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDo6bWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkg
Y29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3Vs
dCA9IGVDYXB0aW9uOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJu
IEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhU
TUxUYWJsZUNhcHRpb25FbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAg
ICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3Bl
cnR5KGF0dHIsIENTU19QUk9QX0NBUFRJT05fU0lERSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBl
bHNlCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0K
LQotU3RyaW5nIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNhcHRp
b25FbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQogfQpJbmRleDogaHRtbC9IVE1MVGFibGVQYXJ0
RWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTFRhYmxlUGFydEVsZW1lbnQuaAkocmV2
aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxUYWJsZVBhcnRFbGVtZW50LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTI1LDM1NSArMjUsMjMgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBIVE1MVGFibGVFbGVt
ZW50SW1wbF9ICi0jZGVmaW5lIEhUTUxUYWJsZUVsZW1lbnRJbXBsX0gKKyNpZm5kZWYgSFRNTFRh
YmxlUGFydEVsZW1lbnRfSAorI2RlZmluZSBIVE1MVGFibGVQYXJ0RWxlbWVudF9ICiAKICNpbmNs
dWRlICJIVE1MRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLWNsYXNzIEhUTUxDb2xsZWN0aW9uOwotY2xhc3MgSFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQ7Ci1jbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudDsKLWNsYXNzIEhUTUxUYWJsZUNh
cHRpb25FbGVtZW50OwotCi1jbGFzcyBIVE1MVGFibGVFbGVtZW50IDogcHVibGljIEhUTUxFbGVt
ZW50IHsKLXB1YmxpYzoKLSAgICBlbnVtIFJ1bGVzIHsKLSAgICAgICAgTm9uZSAgICA9IDB4MDAs
Ci0gICAgICAgIFJHcm91cHMgPSAweDAxLAotICAgICAgICBDR3JvdXBzID0gMHgwMiwKLSAgICAg
ICAgR3JvdXBzICA9IDB4MDMsCi0gICAgICAgIFJvd3MgICAgPSAweDA1LAotICAgICAgICBDb2xz
ICAgID0gMHgwYSwKLSAgICAgICAgQWxsICAgICA9IDB4MGYKLSAgICB9OwotICAgIGVudW0gRnJh
bWUgewotICAgICAgICBWb2lkICAgPSAweDAwLAotICAgICAgICBBYm92ZSAgPSAweDAxLAotICAg
ICAgICBCZWxvdyAgPSAweDAyLAotICAgICAgICBMaHMgICAgPSAweDA0LAotICAgICAgICBSaHMg
ICAgPSAweDA4LAotICAgICAgICBIc2lkZXMgPSAweDAzLAotICAgICAgICBWc2lkZXMgPSAweDBj
LAotICAgICAgICBCb3ggICAgPSAweDBmCi0gICAgfTsKLQotICAgIEhUTUxUYWJsZUVsZW1lbnQo
RG9jdW1lbnQqKTsKLSAgICB+SFRNTFRhYmxlRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1M
VGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVx
dWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDk7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSopOwotCi0gICAgSFRNTFRh
YmxlQ2FwdGlvbkVsZW1lbnQqIGNhcHRpb24oKSBjb25zdCB7IHJldHVybiB0Q2FwdGlvbjsgfQot
ICAgIE5vZGUqIHNldENhcHRpb24oSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQqKTsKLQotICAgIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50KiB0SGVhZCgpIGNvbnN0IHsgcmV0dXJuIGhlYWQ7IH0KLSAg
ICBOb2RlKiBzZXRUSGVhZChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAgSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQqIHRGb290KCkgY29uc3QgeyByZXR1cm4gZm9vdDsgfQotICAgIE5v
ZGUqIHNldFRGb290KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kik7Ci0KLSAgICBOb2RlKiBzZXRU
Qm9keShIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAgSFRNTEVsZW1lbnQqIGNyZWF0
ZVRIZWFkKCk7Ci0gICAgdm9pZCBkZWxldGVUSGVhZCgpOwotICAgIEhUTUxFbGVtZW50KiBjcmVh
dGVURm9vdCgpOwotICAgIHZvaWQgZGVsZXRlVEZvb3QoKTsKLSAgICBIVE1MRWxlbWVudCogY3Jl
YXRlQ2FwdGlvbigpOwotICAgIHZvaWQgZGVsZXRlQ2FwdGlvbigpOwotICAgIEhUTUxFbGVtZW50
KiBpbnNlcnRSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVS
b3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rp
b24+IHJvd3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IHRCb2RpZXMoKTsKLQotICAg
IFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7
Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0QmdDb2xvcihjb25z
dCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBib3JkZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEJv
cmRlcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjZWxsUGFkZGluZygpIGNvbnN0Owot
ICAgIHZvaWQgc2V0Q2VsbFBhZGRpbmcoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2Vs
bFNwYWNpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldENlbGxTcGFjaW5nKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIGZyYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRGcmFtZShjb25zdCBT
dHJpbmcmKTsKLQotICAgIFN0cmluZyBydWxlcygpIGNvbnN0OwotICAgIHZvaWQgc2V0UnVsZXMo
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgc3VtbWFyeSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0U3VtbWFyeShjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyB3aWR0aCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0V2lkdGgoY29uc3QgU3RyaW5nJik7Ci0KLSAgICAvLyBvdmVycmlkZXMKLSAg
ICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4pOwotICAg
IHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRl
RW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmli
dXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cik7Ci0KLSAgICAvLyBVc2VkIHRvIG9idGFpbiBlaXRo
ZXIgYSBzb2xpZCBvciBvdXRzZXQgYm9yZGVyIGRlY2wuCi0gICAgdmlydHVhbCBDU1NNdXRhYmxl
U3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpOwotICAgIENT
U011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRTaGFyZWRDZWxsRGVjbCgpOwotCi0gICAgdmly
dHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0
ZShBdHRyaWJ1dGUqKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50KiBoZWFkOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmb290OwotICAgIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmaXJzdEJvZHk7Ci0gICAgSFRNTFRhYmxlQ2FwdGlvbkVs
ZW1lbnQqIHRDYXB0aW9uOwotCi0gICAgYm9vbCBtX25vQm9yZGVyICAgICA6IDE7Ci0gICAgYm9v
bCBtX3NvbGlkICAgICAgICA6IDE7Ci0gICAgLy8gMTQgYml0cyB1bnVzZWQKLSAgICB1bnNpZ25l
ZCBzaG9ydCBwYWRkaW5nOwotICAgIGZyaWVuZCBjbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudDsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlUGFydEVsZW1lbnQg
OiBwdWJsaWMgSFRNTEVsZW1lbnQKLQoteworY2xhc3MgSFRNTFRhYmxlUGFydEVsZW1lbnQgOiBw
dWJsaWMgSFRNTEVsZW1lbnQgewogcHVibGljOgogICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50KGNv
bnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2MpCiAgICAgICAgIDogSFRN
TEVsZW1lbnQodGFnTmFtZSwgZG9jKQogICAgICAgICB7IH0KIAotICAgIHZpcnR1YWwgYm9vbCBt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBR
dWFsaWZpZWROYW1lJiwgTWFwcGVkQXR0cmlidXRlRW50cnkmKSBjb25zdDsKICAgICB2aXJ0dWFs
IHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7CiB9OwogCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50IDogcHVibGlj
IEhUTUxUYWJsZVBhcnRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVs
ZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqLCBib29sIGltcGxp
Y2l0KTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNv
bnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJp
b3JpdHkoKSBjb25zdCB7IHJldHVybiA4OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNv
bnN0IE5vZGUqKTsKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQ
dHI8Tm9kZT4pOwotICAgIAotICAgIEhUTUxFbGVtZW50KiBpbnNlcnRSb3coaW50IGluZGV4LCBF
eGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25D
b2RlJik7Ci0KLSAgICBpbnQgbnVtUm93cygpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBj
aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcg
Y2hPZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiByb3dzKCk7Ci19OwotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVJvd0VsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxl
UGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVSb3dFbGVtZW50KERvY3VtZW50
KiBkb2MpCi0gICAgICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5hbWVzOjp0clRhZywg
ZG9jKSB7fQotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDc7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQo
Y29uc3QgTm9kZSopOwotICAgIHZpcnR1YWwgQ29udGFpbmVyTm9kZSogYWRkQ2hpbGQoUGFzc1Jl
ZlB0cjxOb2RlPik7Ci0gICAgCi0gICAgaW50IHJvd0luZGV4KCkgY29uc3Q7Ci0gICAgaW50IHNl
Y3Rpb25Sb3dJbmRleCgpIGNvbnN0OwotCi0gICAgSFRNTEVsZW1lbnQqIGluc2VydENlbGwoaW50
IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVDZWxsKGludCBpbmRleCwg
RXhjZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzZXRSb3dJbmRleChpbnQpOwotCi0gICAgdm9p
ZCBzZXRTZWN0aW9uUm93SW5kZXgoaW50KTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4g
Y2VsbHMoKTsKLSAgICB2b2lkIHNldENlbGxzKEhUTUxDb2xsZWN0aW9uICosIEV4Y2VwdGlvbkNv
ZGUmKTsKLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29u
c3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0
QmdDb2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsKLSAg
ICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNv
bnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgaW50IG5jb2xzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFi
bGVDZWxsRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgot
ICAgIEhUTUxUYWJsZUNlbGxFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERv
Y3VtZW50Kik7Ci0gICAgfkhUTUxUYWJsZUNlbGxFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhU
TUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNP
cHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4g
NjsgfQotCi0gICAgaW50IGNlbGxJbmRleCgpIGNvbnN0OwotCi0gICAgaW50IGNvbCgpIGNvbnN0
IHsgcmV0dXJuIF9jb2w7IH0KLSAgICB2b2lkIHNldENvbChpbnQgY29sKSB7IF9jb2wgPSBjb2w7
IH0KLSAgICBpbnQgcm93KCkgY29uc3QgeyByZXR1cm4gX3JvdzsgfQotICAgIHZvaWQgc2V0Um93
KGludCByKSB7IF9yb3cgPSByOyB9Ci0KLSAgICBpbnQgY29sU3BhbigpIGNvbnN0IHsgcmV0dXJu
IGNTcGFuOyB9Ci0gICAgaW50IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiByU3BhbjsgfQotCi0g
ICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUs
IE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAgIC8vIHVzZWQgYnkg
dGFibGUgY2VsbHMgdG8gc2hhcmUgc3R5bGUgZGVjbHMgY3JlYXRlZCBieSB0aGUgZW5jbG9zaW5n
IHRhYmxlLgotICAgIHZpcnR1YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGFkZGl0aW9u
YWxBdHRyaWJ1dGVTdHlsZURlY2woKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRy
aWJ1dGUoQXR0cmlidXRlKikgY29uc3Q7Ci0KLSAgICB2b2lkIHNldENlbGxJbmRleChpbnQpOwot
Ci0gICAgU3RyaW5nIGFiYnIoKSBjb25zdDsKLSAgICB2b2lkIHNldEFiYnIoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0
IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGF4aXMoKSBjb25zdDsKLSAgICB2b2lkIHNldEF4aXMo
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQg
c2V0QmdDb2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAg
IHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsK
LSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgdm9pZCBzZXRDb2xTcGFu
KGludCk7Ci0KLSAgICBTdHJpbmcgaGVhZGVycygpIGNvbnN0OwotICAgIHZvaWQgc2V0SGVhZGVy
cyhjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBoZWlnaHQoKSBjb25zdDsKLSAgICB2b2lk
IHNldEhlaWdodChjb25zdCBTdHJpbmcmKTsKLQotICAgIGJvb2wgbm9XcmFwKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXROb1dyYXAoYm9vbCk7Ci0KLSAgICB2b2lkIHNldFJvd1NwYW4oaW50KTsKLQot
ICAgIFN0cmluZyBzY29wZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0U2NvcGUoY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICBTdHJpbmcgdkFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWQWxpZ24oY29u
c3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgd2lkdGgoKSBjb25zdDsKLSAgICB2b2lkIHNldFdp
ZHRoKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IF9yb3c7Ci0gICAgaW50
IF9jb2w7Ci0gICAgaW50IHJTcGFuOwotICAgIGludCBjU3BhbjsKLSAgICBpbnQgcm93SGVpZ2h0
OwotICAgIGJvb2wgbV9zb2xpZCAgICAgICAgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1jbGFzcyBIVE1MVGFibGVDb2xFbGVtZW50IDogcHVibGljIEhUTUxUYWJsZVBhcnRFbGVt
ZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlQ29sRWxlbWVudChjb25zdCBRdWFsaWZpZWRO
YW1lJiB0YWdOYW1lLCBEb2N1bWVudCopOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVu
ZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gaGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6
Y29sVGFnKSA/IFRhZ1N0YXR1c0ZvcmJpZGRlbiA6IFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBoYXNMb2NhbE5hbWUoSFRN
TE5hbWVzOjpjb2xUYWcpID8gMCA6IDE7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29u
c3QgTm9kZSogbmV3Q2hpbGQpIHsgcmV0dXJuIGhhc0xvY2FsTmFtZShIVE1MTmFtZXM6OmNvbGdy
b3VwVGFnKSAmJiBuZXdDaGlsZC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmNvbFRhZyk7IH0KLSAg
ICB2b2lkIHNldFRhYmxlKEhUTUxUYWJsZUVsZW1lbnQqIHQpIHsgdGFibGUgPSB0OyB9Ci0KLSAg
ICAvLyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZp
ZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0g
ICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwot
Ci0gICAgaW50IHNwYW4oKSBjb25zdCB7IHJldHVybiBfc3BhbjsgfQotCi0gICAgU3RyaW5nIGFs
aWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0
cmluZyBjaCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBT
dHJpbmcgY2hPZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwot
Ci0gICAgdm9pZCBzZXRTcGFuKGludCk7Ci0KLSAgICBTdHJpbmcgdkFsaWduKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRWQWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgd2lkdGgoKSBj
b25zdDsKLSAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgaW50IF9zcGFuOwotICAgIEhUTUxUYWJsZUVsZW1lbnQgKnRhYmxlOwotfTsKLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudCA6IHB1YmxpYyBI
VE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50KERvY3VtZW50ICpkb2MpCi0gICAgICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5h
bWVzOjpjYXB0aW9uVGFnLCBkb2MpIHt9Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5k
VGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAg
IHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotICAgIAotICAg
IHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBN
YXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFy
c2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci0KLSAgICBTdHJpbmcgYWxpZ24o
KSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwotfTsKLQogfSAvL25h
bWVzcGFjZQogCiAjZW5kaWYKSW5kZXg6IGh0bWwvSFRNTFRhYmxlUm93RWxlbWVudC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGh0bWwvSFRNTFRhYmxlUm93RWxlbWVudC5oCShyZXZpc2lvbiAxNDMyNSkKKysr
IGh0bWwvSFRNTFRhYmxlUm93RWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSwxNzkgKzI1
LDE3IEBACiAgKgogICovCiAKLSNpZm5kZWYgSFRNTFRhYmxlRWxlbWVudEltcGxfSAotI2RlZmlu
ZSBIVE1MVGFibGVFbGVtZW50SW1wbF9ICisjaWZuZGVmIEhUTUxUYWJsZVJvd0VsZW1lbnRfSAor
I2RlZmluZSBIVE1MVGFibGVSb3dFbGVtZW50X0gKIAotI2luY2x1ZGUgIkhUTUxFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlUGFydEVsZW1lbnQu
aCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBIVE1MQ29sbGVjdGlvbjsKLWNsYXNz
IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OwotY2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7Ci1j
bGFzcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDsKLQotY2xhc3MgSFRNTFRhYmxlRWxlbWVudCA6
IHB1YmxpYyBIVE1MRWxlbWVudCB7Ci1wdWJsaWM6Ci0gICAgZW51bSBSdWxlcyB7Ci0gICAgICAg
IE5vbmUgICAgPSAweDAwLAotICAgICAgICBSR3JvdXBzID0gMHgwMSwKLSAgICAgICAgQ0dyb3Vw
cyA9IDB4MDIsCi0gICAgICAgIEdyb3VwcyAgPSAweDAzLAotICAgICAgICBSb3dzICAgID0gMHgw
NSwKLSAgICAgICAgQ29scyAgICA9IDB4MGEsCi0gICAgICAgIEFsbCAgICAgPSAweDBmCi0gICAg
fTsKLSAgICBlbnVtIEZyYW1lIHsKLSAgICAgICAgVm9pZCAgID0gMHgwMCwKLSAgICAgICAgQWJv
dmUgID0gMHgwMSwKLSAgICAgICAgQmVsb3cgID0gMHgwMiwKLSAgICAgICAgTGhzICAgID0gMHgw
NCwKLSAgICAgICAgUmhzICAgID0gMHgwOCwKLSAgICAgICAgSHNpZGVzID0gMHgwMywKLSAgICAg
ICAgVnNpZGVzID0gMHgwYywKLSAgICAgICAgQm94ICAgID0gMHgwZgotICAgIH07Ci0KLSAgICBI
VE1MVGFibGVFbGVtZW50KERvY3VtZW50Kik7Ci0gICAgfkhUTUxUYWJsZUVsZW1lbnQoKTsKLQot
ICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBj
b25zdCB7IHJldHVybiA5OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUq
KTsKLQotICAgIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KiBjYXB0aW9uKCkgY29uc3QgeyByZXR1
cm4gdENhcHRpb247IH0KLSAgICBOb2RlKiBzZXRDYXB0aW9uKEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50Kik7Ci0KLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogdEhlYWQoKSBjb25zdCB7IHJl
dHVybiBoZWFkOyB9Ci0gICAgTm9kZSogc2V0VEhlYWQoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQq
KTsKLQotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiB0Rm9vdCgpIGNvbnN0IHsgcmV0dXJu
IGZvb3Q7IH0KLSAgICBOb2RlKiBzZXRURm9vdChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwot
Ci0gICAgTm9kZSogc2V0VEJvZHkoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqKTsKLQotICAgIEhU
TUxFbGVtZW50KiBjcmVhdGVUSGVhZCgpOwotICAgIHZvaWQgZGVsZXRlVEhlYWQoKTsKLSAgICBI
VE1MRWxlbWVudCogY3JlYXRlVEZvb3QoKTsKLSAgICB2b2lkIGRlbGV0ZVRGb290KCk7Ci0gICAg
SFRNTEVsZW1lbnQqIGNyZWF0ZUNhcHRpb24oKTsKLSAgICB2b2lkIGRlbGV0ZUNhcHRpb24oKTsK
LSAgICBIVE1MRWxlbWVudCogaW5zZXJ0Um93KGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwot
ICAgIHZvaWQgZGVsZXRlUm93KGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgUmVm
UHRyPEhUTUxDb2xsZWN0aW9uPiByb3dzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiB0
Qm9kaWVzKCk7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWdu
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25zdDsKLSAgICB2b2lk
IHNldEJnQ29sb3IoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYm9yZGVyKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRCb3JkZXIoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2VsbFBh
ZGRpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldENlbGxQYWRkaW5nKGNvbnN0IFN0cmluZyYpOwot
Ci0gICAgU3RyaW5nIGNlbGxTcGFjaW5nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDZWxsU3BhY2lu
Zyhjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBmcmFtZSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0RnJhbWUoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgcnVsZXMoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFJ1bGVzKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHN1bW1hcnkoKSBj
b25zdDsKLSAgICB2b2lkIHNldFN1bW1hcnkoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcg
d2lkdGgoKSBjb25zdDsKLSAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
Ly8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCBDb250YWluZXJOb2RlKiBhZGRDaGlsZChQYXNzUmVm
UHRyPE5vZGU+KTsKLSAgICB2aXJ0dWFsIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0g
ICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUs
IE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpOwotCi0gICAgLy8gVXNl
ZCB0byBvYnRhaW4gZWl0aGVyIGEgc29saWQgb3Igb3V0c2V0IGJvcmRlciBkZWNsLgotICAgIHZp
cnR1YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGFkZGl0aW9uYWxBdHRyaWJ1dGVTdHls
ZURlY2woKTsKLSAgICBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogZ2V0U2hhcmVkQ2VsbERl
Y2woKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJv
b2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlKikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCogaGVhZDsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVu
dCogZm9vdDsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogZmlyc3RCb2R5OwotICAgIEhU
TUxUYWJsZUNhcHRpb25FbGVtZW50KiB0Q2FwdGlvbjsKLQotICAgIGJvb2wgbV9ub0JvcmRlciAg
ICAgOiAxOwotICAgIGJvb2wgbV9zb2xpZCAgICAgICAgOiAxOwotICAgIC8vIDE0IGJpdHMgdW51
c2VkCi0gICAgdW5zaWduZWQgc2hvcnQgcGFkZGluZzsKLSAgICBmcmllbmQgY2xhc3MgSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxU
YWJsZVBhcnRFbGVtZW50IDogcHVibGljIEhUTUxFbGVtZW50Ci0KLXsKLXB1YmxpYzoKLSAgICBI
VE1MVGFibGVQYXJ0RWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVu
dCogZG9jKQotICAgICAgICA6IEhUTUxFbGVtZW50KHRhZ05hbWUsIGRvYykKLSAgICAgICAgeyB9
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRy
TmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2
b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwotfTsKLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCA6IHB1YmxpYyBI
VE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiwgYm9vbCBpbXBsaWNp
dCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25z
dCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9y
aXR5KCkgY29uc3QgeyByZXR1cm4gODsgfQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25z
dCBOb2RlKik7Ci0gICAgdmlydHVhbCBDb250YWluZXJOb2RlKiBhZGRDaGlsZChQYXNzUmVmUHRy
PE5vZGU+KTsKLSAgICAKLSAgICBIVE1MRWxlbWVudCogaW5zZXJ0Um93KGludCBpbmRleCwgRXhj
ZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgZGVsZXRlUm93KGludCBpbmRleCwgRXhjZXB0aW9uQ29k
ZSYpOwotCi0gICAgaW50IG51bVJvd3MoKSBjb25zdDsKLQotICAgIFN0cmluZyBhbGlnbigpIGNv
bnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2go
KSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNo
T2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0
cmluZyB2QWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldFZBbGlnbihjb25zdCBTdHJpbmcmKTsK
LQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gcm93cygpOwotfTsKLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCiBjbGFzcyBIVE1MVGFibGVSb3dFbGVtZW50IDogcHVibGljIEhUTUxUYWJsZVBh
cnRFbGVtZW50CiB7CiBwdWJsaWM6Ci0gICAgSFRNTFRhYmxlUm93RWxlbWVudChEb2N1bWVudCog
ZG9jKQotICAgICAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KEhUTUxOYW1lczo6dHJUYWcsIGRv
Yykge30KKyAgICBIVE1MVGFibGVSb3dFbGVtZW50KERvY3VtZW50KiBkb2MpOwogCiAgICAgdmly
dHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFn
U3RhdHVzT3B0aW9uYWw7IH0KICAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsg
cmV0dXJuIDc7IH0KQEAgLTIzNiwxNDQgKzc0LDYgQEAgcHJvdGVjdGVkOgogICAgIGludCBuY29s
czsKIH07CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1l
bnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFi
bGVDZWxsRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCopOwot
ICAgIH5IVE1MVGFibGVDZWxsRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVz
IGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0K
LSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7IH0KLQotICAg
IGludCBjZWxsSW5kZXgoKSBjb25zdDsKLQotICAgIGludCBjb2woKSBjb25zdCB7IHJldHVybiBf
Y29sOyB9Ci0gICAgdm9pZCBzZXRDb2woaW50IGNvbCkgeyBfY29sID0gY29sOyB9Ci0gICAgaW50
IHJvdygpIGNvbnN0IHsgcmV0dXJuIF9yb3c7IH0KLSAgICB2b2lkIHNldFJvdyhpbnQgcikgeyBf
cm93ID0gcjsgfQotCi0gICAgaW50IGNvbFNwYW4oKSBjb25zdCB7IHJldHVybiBjU3BhbjsgfQot
ICAgIGludCByb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gclNwYW47IH0KLQotICAgIHZpcnR1YWwg
Ym9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRy
aWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci0KLSAgICAvLyB1c2VkIGJ5IHRhYmxlIGNlbGxz
IHRvIHNoYXJlIHN0eWxlIGRlY2xzIGNyZWF0ZWQgYnkgdGhlIGVuY2xvc2luZyB0YWJsZS4KLSAg
ICB2aXJ0dWFsIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRl
U3R5bGVEZWNsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZSopIGNvbnN0OwotCi0gICAgdm9pZCBzZXRDZWxsSW5kZXgoaW50KTsKLQotICAgIFN0cmlu
ZyBhYmJyKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBYmJyKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsK
LQotICAgIFN0cmluZyBheGlzKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBeGlzKGNvbnN0IFN0cmlu
ZyYpOwotCi0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25zdDsKLSAgICB2b2lkIHNldEJnQ29sb3Io
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENo
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIHZvaWQgc2V0Q29sU3BhbihpbnQpOwotCi0g
ICAgU3RyaW5nIGhlYWRlcnMoKSBjb25zdDsKLSAgICB2b2lkIHNldEhlYWRlcnMoY29uc3QgU3Ry
aW5nJik7Ci0KLSAgICBTdHJpbmcgaGVpZ2h0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQo
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBib29sIG5vV3JhcCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
Tm9XcmFwKGJvb2wpOwotCi0gICAgdm9pZCBzZXRSb3dTcGFuKGludCk7Ci0KLSAgICBTdHJpbmcg
c2NvcGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFNjb3BlKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBT
dHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBfcm93OwotICAgIGludCBfY29sOwotICAg
IGludCByU3BhbjsKLSAgICBpbnQgY1NwYW47Ci0gICAgaW50IHJvd0hlaWdodDsKLSAgICBib29s
IG1fc29saWQgICAgICAgIDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
SFRNTFRhYmxlQ29sRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVi
bGljOgotICAgIEhUTUxUYWJsZUNvbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFt
ZSwgRG9jdW1lbnQqKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJl
bWVudCgpIGNvbnN0IHsgcmV0dXJuIGhhc0xvY2FsTmFtZShIVE1MTmFtZXM6OmNvbFRhZykgPyBU
YWdTdGF0dXNGb3JiaWRkZW4gOiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50
IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gaGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6Y29s
VGFnKSA/IDAgOiAxOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5l
d0NoaWxkKSB7IHJldHVybiBoYXNMb2NhbE5hbWUoSFRNTE5hbWVzOjpjb2xncm91cFRhZykgJiYg
bmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpjb2xUYWcpOyB9Ci0gICAgdm9pZCBzZXRU
YWJsZShIVE1MVGFibGVFbGVtZW50KiB0KSB7IHRhYmxlID0gdDsgfQotCi0gICAgLy8gb3ZlcnJp
ZGVzCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwg
dm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAgIGludCBz
cGFuKCkgY29uc3QgeyByZXR1cm4gX3NwYW47IH0KLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0
OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBj
b25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2Zm
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIHZvaWQg
c2V0U3BhbihpbnQpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0
VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBfc3Bh
bjsKLSAgICBIVE1MVGFibGVFbGVtZW50ICp0YWJsZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFy
dEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChEb2N1bWVu
dCAqZG9jKQotICAgICAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KEhUTUxOYW1lczo6Y2FwdGlv
blRhZywgZG9jKSB7fQotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVt
ZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGlu
dCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDU7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJv
b2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmli
dXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLX07Ci0KIH0gLy9uYW1lc3BhY2UKIAog
I2VuZGlmCkluZGV4OiBodG1sL0hUTUxUYWJsZUVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1s
L0hUTUxUYWJsZUVsZW1lbnQuaAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxUYWJsZUVs
ZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjUsMTEgKzI1LDEwIEBACiAgKgogICovCiAKLSNp
Zm5kZWYgSFRNTFRhYmxlRWxlbWVudEltcGxfSAotI2RlZmluZSBIVE1MVGFibGVFbGVtZW50SW1w
bF9ICisjaWZuZGVmIEhUTUxUYWJsZUVsZW1lbnRfSAorI2RlZmluZSBIVE1MVGFibGVFbGVtZW50
X0gKIAogI2luY2x1ZGUgIkhUTUxFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtMTIxLDggKzEyMCw4IEBAIHB1YmxpYzoKICAgICB2
aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4pOwogICAgIHZp
cnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKICAgICAKLSAgICB2aXJ0dWFsIGJvb2wgbWFw
VG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50
cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZSAqYXR0cik7CisgICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29u
c3QgUXVhbGlmaWVkTmFtZSYsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JikgY29uc3Q7CisgICAgdmly
dHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwogCiAgICAg
Ly8gVXNlZCB0byBvYnRhaW4gZWl0aGVyIGEgc29saWQgb3Igb3V0c2V0IGJvcmRlciBkZWNsLgog
ICAgIHZpcnR1YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGFkZGl0aW9uYWxBdHRyaWJ1
dGVTdHlsZURlY2woKTsKQEAgLTE0NSwyMzUgKzE0NCw2IEBAIHByb3RlY3RlZDoKICAgICBmcmll
bmQgY2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7CiB9OwogCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLWNsYXNzIEhUTUxUYWJsZVBhcnRFbGVtZW50IDogcHVibGljIEhUTUxFbGVtZW50Ci0KLXsK
LXB1YmxpYzoKLSAgICBIVE1MVGFibGVQYXJ0RWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lLCBEb2N1bWVudCogZG9jKQotICAgICAgICA6IEhUTUxFbGVtZW50KHRhZ05hbWUsIGRv
YykKLSAgICAgICAgeyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFs
aWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7
Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSop
OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVTZWN0aW9uRWxl
bWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxU
YWJsZVNlY3Rpb25FbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50
KiwgYm9vbCBpbXBsaWNpdCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVx
dWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1
YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gODsgfQotICAgIHZpcnR1YWwgYm9v
bCBjaGVja0RURChjb25zdCBOb2RlKik7Ci0gICAgdmlydHVhbCBDb250YWluZXJOb2RlKiBhZGRD
aGlsZChQYXNzUmVmUHRyPE5vZGU+KTsKLSAgICAKLSAgICBIVE1MRWxlbWVudCogaW5zZXJ0Um93
KGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgZGVsZXRlUm93KGludCBpbmRl
eCwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgaW50IG51bVJvd3MoKSBjb25zdDsKLQotICAgIFN0
cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7Ci0K
LSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwot
Ci0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJp
bmcmKTsKLQotICAgIFN0cmluZyB2QWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldFZBbGlnbihj
b25zdCBTdHJpbmcmKTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gcm93cygpOwotfTsK
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVSb3dFbGVtZW50IDogcHVi
bGljIEhUTUxUYWJsZVBhcnRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlUm93RWxl
bWVudChEb2N1bWVudCogZG9jKQotICAgICAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KEhUTUxO
YW1lczo6dHJUYWcsIGRvYykge30KLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdS
ZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmly
dHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA3OyB9Ci0gICAgdmlydHVhbCBi
b29sIGNoZWNrRFREKGNvbnN0IE5vZGUqKTsKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFk
ZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4pOwotICAgIAotICAgIGludCByb3dJbmRleCgpIGNvbnN0
OwotICAgIGludCBzZWN0aW9uUm93SW5kZXgoKSBjb25zdDsKLQotICAgIEhUTUxFbGVtZW50KiBp
bnNlcnRDZWxsKGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgZGVsZXRlQ2Vs
bChpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZvaWQgc2V0Um93SW5kZXgoaW50
KTsKLQotICAgIHZvaWQgc2V0U2VjdGlvblJvd0luZGV4KGludCk7Ci0KLSAgICBSZWZQdHI8SFRN
TENvbGxlY3Rpb24+IGNlbGxzKCk7Ci0gICAgdm9pZCBzZXRDZWxscyhIVE1MQ29sbGVjdGlvbiAq
LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lk
IHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25zdDsK
LSAgICB2b2lkIHNldEJnQ29sb3IoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBj
b25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2Zm
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmlu
ZyB2QWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldFZBbGlnbihjb25zdCBTdHJpbmcmKTsKLQot
cHJvdGVjdGVkOgotICAgIGludCBuY29sczsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
Y2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFydEVsZW1lbnQK
LXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVDZWxsRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lLCBEb2N1bWVudCopOwotICAgIH5IVE1MVGFibGVDZWxsRWxlbWVudCgpOwotCi0g
ICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1
cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIDY7IH0KLQotICAgIGludCBjZWxsSW5kZXgoKSBjb25zdDsKLQotICAgIGlu
dCBjb2woKSBjb25zdCB7IHJldHVybiBfY29sOyB9Ci0gICAgdm9pZCBzZXRDb2woaW50IGNvbCkg
eyBfY29sID0gY29sOyB9Ci0gICAgaW50IHJvdygpIGNvbnN0IHsgcmV0dXJuIF9yb3c7IH0KLSAg
ICB2b2lkIHNldFJvdyhpbnQgcikgeyBfcm93ID0gcjsgfQotCi0gICAgaW50IGNvbFNwYW4oKSBj
b25zdCB7IHJldHVybiBjU3BhbjsgfQotICAgIGludCByb3dTcGFuKCkgY29uc3QgeyByZXR1cm4g
clNwYW47IH0KLQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5h
bWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2
aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci0KLSAg
ICAvLyB1c2VkIGJ5IHRhYmxlIGNlbGxzIHRvIHNoYXJlIHN0eWxlIGRlY2xzIGNyZWF0ZWQgYnkg
dGhlIGVuY2xvc2luZyB0YWJsZS4KLSAgICB2aXJ0dWFsIENTU011dGFibGVTdHlsZURlY2xhcmF0
aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBi
b29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSopIGNvbnN0OwotCi0gICAgdm9pZCBzZXRDZWxs
SW5kZXgoaW50KTsKLQotICAgIFN0cmluZyBhYmJyKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBYmJy
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBheGlzKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRBeGlzKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25z
dDsKLSAgICB2b2lkIHNldEJnQ29sb3IoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2go
KSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNo
T2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIHZv
aWQgc2V0Q29sU3BhbihpbnQpOwotCi0gICAgU3RyaW5nIGhlYWRlcnMoKSBjb25zdDsKLSAgICB2
b2lkIHNldEhlYWRlcnMoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgaGVpZ2h0KCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBib29sIG5vV3Jh
cCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Tm9XcmFwKGJvb2wpOwotCi0gICAgdm9pZCBzZXRSb3dT
cGFuKGludCk7Ci0KLSAgICBTdHJpbmcgc2NvcGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFNjb3Bl
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQg
c2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBf
cm93OwotICAgIGludCBfY29sOwotICAgIGludCByU3BhbjsKLSAgICBpbnQgY1NwYW47Ci0gICAg
aW50IHJvd0hlaWdodDsKLSAgICBib29sIG1fc29saWQgICAgICAgIDogMTsKLX07Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlQ29sRWxlbWVudCA6IHB1YmxpYyBIVE1M
VGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxUYWJsZUNvbEVsZW1lbnQoY29u
c3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqKTsKLQotICAgIHZpcnR1YWwgSFRN
TFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGhhc0xvY2FsTmFt
ZShIVE1MTmFtZXM6OmNvbFRhZykgPyBUYWdTdGF0dXNGb3JiaWRkZW4gOiBUYWdTdGF0dXNPcHRp
b25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gaGFz
TG9jYWxOYW1lKEhUTUxOYW1lczo6Y29sVGFnKSA/IDAgOiAxOyB9Ci0gICAgdmlydHVhbCBib29s
IGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKSB7IHJldHVybiBoYXNMb2NhbE5hbWUoSFRN
TE5hbWVzOjpjb2xncm91cFRhZykgJiYgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpj
b2xUYWcpOyB9Ci0gICAgdm9pZCBzZXRUYWJsZShIVE1MVGFibGVFbGVtZW50KiB0KSB7IHRhYmxl
ID0gdDsgfQotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnko
Y29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1
bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRB
dHRyaWJ1dGUqKTsKLQotICAgIGludCBzcGFuKCkgY29uc3QgeyByZXR1cm4gX3NwYW47IH0KLQot
ICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5n
Jik7Ci0KLSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmlu
ZyYpOwotCi0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25z
dCBTdHJpbmcmKTsKLQotICAgIHZvaWQgc2V0U3BhbihpbnQpOwotCi0gICAgU3RyaW5nIHZBbGln
bigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3Ry
aW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmKTsKLQot
cHJvdGVjdGVkOgotICAgIGludCBfc3BhbjsKLSAgICBIVE1MVGFibGVFbGVtZW50ICp0YWJsZTsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlQ2FwdGlvbkVsZW1l
bnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFi
bGVDYXB0aW9uRWxlbWVudChEb2N1bWVudCAqZG9jKQotICAgICAgICA6IEhUTUxUYWJsZVBhcnRF
bGVtZW50KEhUTUxOYW1lczo6Y2FwdGlvblRhZywgZG9jKSB7fQotCi0gICAgdmlydHVhbCBIVE1M
VGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVx
dWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDU7
IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1l
JiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmly
dHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwotCi0gICAg
U3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsK
LX07Ci0KIH0gLy9uYW1lc3BhY2UKIAogI2VuZGlmCkluZGV4OiBodG1sL0hUTUxUYWJsZVBhcnRF
bGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxUYWJsZVBhcnRFbGVtZW50LmNwcAko
cmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxUYWJsZVBhcnRFbGVtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjMsNjA2ICsyMywxOSBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAw
MjExMS0xMzA3LCBVU0EuCiAgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImh0
bWxfdGFibGVpbXBsLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlUGFydEVsZW1lbnQuaCIKIAotI2lu
Y2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKLSNpbmNsdWRlICJOb2RlTGlzdC5oIgotI2luY2x1ZGUg
IlJlbmRlclRhYmxlLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAi
UmVuZGVyVGFibGVDb2wuaCIKLSNpbmNsdWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIKLSNpbmNs
dWRlICJjc3NfdmFsdWVpbXBsLmgiCiAjaW5jbHVkZSAiY3NzaGVscGVyLmgiCiAjaW5jbHVkZSAi
Q1NTUHJvcGVydHlOYW1lcy5oIgotI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKICNpbmNs
dWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5j
bHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1IVE1MVGFibGVFbGVtZW50
OjpIVE1MVGFibGVFbGVtZW50KERvY3VtZW50ICpkb2MpCi0gIDogSFRNTEVsZW1lbnQodGFibGVU
YWcsIGRvYykKLXsKLSAgICB0Q2FwdGlvbiA9IDA7Ci0gICAgaGVhZCA9IDA7Ci0gICAgZm9vdCA9
IDA7Ci0gICAgZmlyc3RCb2R5ID0gMDsKLQotIAotICAgIHBhZGRpbmcgPSAxOwotICAgIAotICAg
IG1fbm9Cb3JkZXIgPSB0cnVlOwotICAgIG1fc29saWQgPSBmYWxzZTsKLX0KLQotSFRNTFRhYmxl
RWxlbWVudDo6fkhUTUxUYWJsZUVsZW1lbnQoKQotewotICAgIGlmIChmaXJzdEJvZHkpCi0gICAg
ICAgIGZpcnN0Qm9keS0+ZGVyZWYoKTsKLX0KLQotYm9vbCBIVE1MVGFibGVFbGVtZW50OjpjaGVj
a0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4
dE5vZGUoKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShjYXB0aW9uVGFnKSB8fAotICAgICAgICAg
ICBuZXdDaGlsZC0+aGFzVGFnTmFtZShjb2xUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNv
bGdyb3VwVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0aGVhZFRhZykg
fHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGZvb3RUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxk
LT5oYXNUYWdOYW1lKHRib2R5VGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSB8
fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi1Ob2Rl
KiBIVE1MVGFibGVFbGVtZW50OjpzZXRDYXB0aW9uKCBIVE1MVGFibGVDYXB0aW9uRWxlbWVudCAq
YyApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgaWYgKE5vZGUgKm9jID0gdENh
cHRpb24pCi0gICAgICAgIHJlcGxhY2VDaGlsZChjLCBvYywgZWMpOwotICAgIGVsc2UKLSAgICAg
ICAgaW5zZXJ0QmVmb3JlKGMsIGZpcnN0Q2hpbGQoKSwgZWMpOwotICAgIHRDYXB0aW9uID0gYzsK
LSAgICByZXR1cm4gdENhcHRpb247Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRI
ZWFkKCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqcyApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBl
YyA9IDA7Ci0gICAgaWYgKE5vZGUgKmggPSBoZWFkKQotICAgICAgICByZXBsYWNlQ2hpbGQocywg
aCwgZWMpOwotICAgIGVsc2UgaWYgKGZvb3QpCi0gICAgICAgIGluc2VydEJlZm9yZShzLCBmb290
LCBlYyk7Ci0gICAgZWxzZSBpZiAoZmlyc3RCb2R5KQotICAgICAgICBpbnNlcnRCZWZvcmUocywg
Zmlyc3RCb2R5LCBlYyk7Ci0gICAgZWxzZQotICAgICAgICBhcHBlbmRDaGlsZChzLCBlYyk7Ci0g
ICAgaGVhZCA9IHM7Ci0gICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1l
bnQ6OnNldFRGb290KCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqcyApCi17Ci0gICAgRXhjZXB0
aW9uQ29kZSBlYyA9IDA7Ci0gICAgaWYgKE5vZGUgKmYgPSBmb290KQotICAgICAgICByZXBsYWNl
Q2hpbGQocywgZiwgZWMpOwotICAgIGVsc2UgaWYgKGZpcnN0Qm9keSkKLSAgICAgICAgaW5zZXJ0
QmVmb3JlKHMsIGZpcnN0Qm9keSwgZWMpOwotICAgIGVsc2UKLSAgICAgICAgYXBwZW5kQ2hpbGQo
cywgZWMpOwotICAgIGZvb3QgPSBzOwotICAgIHJldHVybiBmb290OwotfQotCi1Ob2RlKiBIVE1M
VGFibGVFbGVtZW50OjpzZXRUQm9keSggSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKnMgKQotewot
ICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIE5vZGUqIHI7Ci0gICAgcy0+cmVmKCk7Ci0g
ICAgaWYgKE5vZGUgKmZiID0gZmlyc3RCb2R5KSB7Ci0gICAgICAgIHJlcGxhY2VDaGlsZChzLCBm
YiwgZWMpOwotICAgICAgICBmYi0+ZGVyZWYoKTsKLSAgICAgICAgciA9IHM7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIGFwcGVuZENoaWxkKHMsIGVjKTsKLSAgICBmaXJzdEJvZHkgPSBzOwotICAgIHJl
dHVybiBmaXJzdEJvZHk7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVh
dGVUSGVhZCggICkKLXsKLSAgICBpZighaGVhZCkKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwotICAgICAgICBoZWFkID0gbmV3IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KHRo
ZWFkVGFnLCBkb2N1bWVudCgpLCB0cnVlIC8qIGltcGxpY2l0ICovKTsKLSAgICAgICAgaWYoZm9v
dCkKLSAgICAgICAgICAgIGluc2VydEJlZm9yZSggaGVhZCwgZm9vdCwgZWMgKTsKLSAgICAgICAg
ZWxzZSBpZihmaXJzdEJvZHkpCi0gICAgICAgICAgICBpbnNlcnRCZWZvcmUoIGhlYWQsIGZpcnN0
Qm9keSwgZWMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcHBlbmRDaGlsZChoZWFkLCBl
Yyk7Ci0gICAgfQotICAgIHJldHVybiBoZWFkOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6
OmRlbGV0ZVRIZWFkKCAgKQotewotICAgIGlmKGhlYWQpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgICAgIGhlYWQtPnJlZigpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVt
b3ZlQ2hpbGQoaGVhZCwgZWMpOwotICAgICAgICBoZWFkLT5kZXJlZigpOwotICAgIH0KLSAgICBo
ZWFkID0gMDsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6OmNyZWF0ZVRGb290
KCAgKQotewotICAgIGlmICghZm9vdCkKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgICAgICBmb290ID0gbmV3IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KHRmb290VGFn
LCBkb2N1bWVudCgpLCB0cnVlIC8qaW1wbGljaXQgKi8pOwotICAgICAgICBpZiAoZmlyc3RCb2R5
KQotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKCBmb290LCBmaXJzdEJvZHksIGVjICk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGVuZENoaWxkKGZvb3QsIGVjKTsKLSAgICB9Ci0gICAg
cmV0dXJuIGZvb3Q7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlVEZvb3QoICAp
Ci17Ci0gICAgaWYoZm9vdCkgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAg
ICAgZm9vdC0+cmVmKCk7Ci0gICAgICAgIEhUTUxFbGVtZW50OjpyZW1vdmVDaGlsZChmb290LCBl
Yyk7Ci0gICAgICAgIGZvb3QtPmRlcmVmKCk7Ci0gICAgfQotICAgIGZvb3QgPSAwOwotfQotCi1I
VE1MRWxlbWVudCAqSFRNTFRhYmxlRWxlbWVudDo6Y3JlYXRlQ2FwdGlvbiggICkKLXsKLSAgICBp
ZighdENhcHRpb24pCi0gICAgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAg
ICAgdENhcHRpb24gPSBuZXcgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQoZG9jdW1lbnQoKSk7Ci0g
ICAgICAgIGluc2VydEJlZm9yZSggdENhcHRpb24sIGZpcnN0Q2hpbGQoKSwgZWMgKTsKLSAgICB9
Ci0gICAgcmV0dXJuIHRDYXB0aW9uOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0
ZUNhcHRpb24oICApCi17Ci0gICAgaWYodENhcHRpb24pIHsKLSAgICAgICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7Ci0gICAgICAgIHRDYXB0aW9uLT5yZWYoKTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6
OnJlbW92ZUNoaWxkKHRDYXB0aW9uLCBlYyk7Ci0gICAgICAgIHRDYXB0aW9uLT5kZXJlZigpOwot
ICAgIH0KLSAgICB0Q2FwdGlvbiA9IDA7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVt
ZW50OjppbnNlcnRSb3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8g
VGhlIERPTSByZXF1aXJlcyB0aGF0IHdlIGNyZWF0ZSBhIHRib2R5IGlmIHRoZSB0YWJsZSBpcyBl
bXB0eQotICAgIC8vIChjZiBET00yVFMgSFRNTFRhYmxlRWxlbWVudDMxIHRlc3QpCi0gICAgLy8g
KG5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gImlmIHRoZSB0YWJsZSBoYXMgbm8gc2VjdGlv
bnMiLCBzaW5jZSB3ZSBjYW4gaGF2ZQotICAgIC8vIDxUQUJMRT48VFI+KQotICAgIGlmKCFmaXJz
dEJvZHkgJiYgIWhlYWQgJiYgIWZvb3QpCi0gICAgICAgIHNldFRCb2R5KCBuZXcgSFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQodGJvZHlUYWcsIGRvY3VtZW50KCksIHRydWUgLyogaW1wbGljaXQgKi8p
ICk7Ci0KLSAgICAvLyBJRSB0cmVhdHMgaW5kZXg9LTEgYXMgZGVmYXVsdCB2YWx1ZSBtZWFuaW5n
ICdhcHBlbmQgYWZ0ZXIgbGFzdCcKLSAgICAvLyBUaGlzIGlzbid0IGluIHRoZSBET00uIFNvLCBu
b3QgaW1wbGVtZW50ZWQgeWV0LgotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBzZWN0aW9u
ID0gMEw7Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGxhc3RTZWN0aW9uID0gMEw7Ci0g
ICAgTm9kZSAqbm9kZSA9IGZpcnN0Q2hpbGQoKTsKLSAgICBib29sIGFwcGVuZCA9IChpbmRleCA9
PSAtMSk7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoIDsgbm9kZSAmJiAoaW5k
ZXg+PTAgfHwgYXBwZW5kKSA7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpICkKLSAgICB7Ci0g
ICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIDIgdGZvb3QgZWxlbWVudHMgaW4gdGhlIHRhYmxlLiBP
bmx5IHRoZSBmaXJzdCBvbmUgaXMgdGhlICJmb290IiwgdGhhdCdzIHdoeSB3ZSBoYXZlIHRoZSBt
b3JlCi0gICAgICAgIC8vIGNvbXBsaWNhdGVkIGlmIHN0YXRlbWVudCBiZWxvdy4KLSAgICAgICAg
aWYgKG5vZGUgIT0gZm9vdCAmJiAobm9kZS0+aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbm9kZS0+
aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0Ym9keVRhZykpKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQgKj4obm9kZSk7Ci0gICAgICAgICAgICBsYXN0U2VjdGlvbiA9IHNlY3Rpb247Ci0g
ICAgICAgICAgICBpZiAoIWFwcGVuZCkgewotICAgICAgICAgICAgICAgIGludCByb3dzID0gc2Vj
dGlvbi0+bnVtUm93cygpOwotICAgICAgICAgICAgICAgIGlmIChyb3dzID49IGluZGV4KSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4IC09
IHJvd3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCAhZm91bmQg
JiYgZm9vdCApCi0gICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9u
RWxlbWVudCAqPihmb290KTsKLQotICAgIC8vIEluZGV4ID09IDAgbWVhbnMgImluc2VydCBiZWZv
cmUgZmlyc3Qgcm93IGluIGN1cnJlbnQgc2VjdGlvbiIKLSAgICAvLyBvciAiYXBwZW5kIGFmdGVy
IGxhc3Qgcm93IiAoaWYgdGhlcmUncyBubyBjdXJyZW50IHNlY3Rpb24gYW55bW9yZSkKLSAgICBp
ZiAoICFzZWN0aW9uICYmICggaW5kZXggPT0gMCB8fCBhcHBlbmQgKSApCi0gICAgewotICAgICAg
ICBzZWN0aW9uID0gbGFzdFNlY3Rpb247Ci0gICAgICAgIGluZGV4ID0gc2VjdGlvbiA/IHNlY3Rp
b24tPm51bVJvd3MoKSA6IDA7Ci0gICAgfQotICAgIGlmIChzZWN0aW9uICYmIChpbmRleCA+PSAw
IHx8IGFwcGVuZCkpCi0gICAgICAgIHJldHVybiBzZWN0aW9uLT5pbnNlcnRSb3coaW5kZXgsIGVj
KTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gTm8gbW9yZSBzZWN0aW9ucyA9PiBpbmRleCBpcyB0
b28gYmlnCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci0gICAgICAgIHJldHVybiAwTDsK
LSAgICB9Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlUm93KCBpbnQgaW5kZXgs
IEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBzZWN0
aW9uID0gMEw7Ci0gICAgTm9kZSAqbm9kZSA9IGZpcnN0Q2hpbGQoKTsKLSAgICBib29sIGxhc3RS
b3cgPSBpbmRleCA9PSAtMTsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogbGFzdFNlY3Rp
b24gPSAwTDsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICggOyBub2RlIDsgbm9k
ZSA9IG5vZGUtPm5leHRTaWJsaW5nKCkgKQotICAgIHsKLSAgICAgICAgaWYgKG5vZGUgIT0gZm9v
dCAmJiAobm9kZS0+aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0Zm9v
dFRhZykgfHwgCi0gICAgICAgICAgICBub2RlLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkpIHsKLSAg
ICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAq
Pihub2RlKTsKLSAgICAgICAgICAgIGxhc3RTZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgICAgICAg
IGludCByb3dzID0gc2VjdGlvbi0+bnVtUm93cygpOwotICAgICAgICAgICAgaWYgKCAhbGFzdFJv
dyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCByb3dzID4gaW5kZXggKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4
IC09IHJvd3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VjdGlvbiA9IDBM
OwotICAgIH0KLSAgICBpZiAoICFmb3VuZCAmJiBmb290ICkKLSAgICAgICAgc2VjdGlvbiA9IHN0
YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGZvb3QpOwotCi0gICAgaWYgKCBs
YXN0Um93ICkKLSAgICAgICAgbGFzdFNlY3Rpb24tPmRlbGV0ZVJvdyggLTEsIGVjICk7Ci0gICAg
ZWxzZSBpZiAoIHNlY3Rpb24gJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IHNlY3Rpb24tPm51bVJv
d3MoKSApCi0gICAgICAgIHNlY3Rpb24tPmRlbGV0ZVJvdyggaW5kZXgsIGVjICk7Ci0gICAgZWxz
ZQotICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOwotfQotCi1Db250YWluZXJOb2RlKiBIVE1M
VGFibGVFbGVtZW50OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQotewotICAgIGlm
IChjaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJzdCBhZGQgdGhl
IGNoaWxkLgotICAgICAgICBIVE1MRWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgICAg
IC8vIE5vdyBzaW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUgY29udGFpbmVyIHRvIGluc2Vy
dCBpbnRvLgotICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRlbW90aW5nIHRoZSBm
b3JtIHRvIGEgbGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQgb2YgdGhlIHdheS4KLSAgICAg
ICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNyZWF0aW9uIG9mIDx0Ym9keT4g
ZWxlbWVudHMgcmVsaWVzIG9uIHRoZSAiY2hpbGRBbGxvd2VkIiBjaGVjaywKLSAgICAvLyBzbyB3
ZSBuZWVkIHRvIGRvIGl0IGV2ZW4gZm9yIFhNTCBkb2N1bWVudHMuCi0gICAgYXNzZXJ0KGNoaWxk
LT5ub2RlVHlwZSgpICE9IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpOwotICAgIGlmICghZG9jdW1l
bnQoKS0+aXNIVE1MRG9jdW1lbnQoKSAmJiAhY2hpbGRBbGxvd2VkKGNoaWxkLmdldCgpKSkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0KLSAgICBDb250YWluZXJOb2RlKiBjb250YWluZXIgPSBIVE1MRWxl
bWVudDo6YWRkQ2hpbGQoY2hpbGQuZ2V0KCkpOwotICAgIGlmIChjb250YWluZXIpIHsKLSAgICAg
ICAgaWYgKCF0Q2FwdGlvbiAmJiBjaGlsZC0+aGFzVGFnTmFtZShjYXB0aW9uVGFnKSkKLSAgICAg
ICAgICAgIHRDYXB0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgKj4o
Y2hpbGQuZ2V0KCkpOwotICAgICAgICBlbHNlIGlmICghaGVhZCAmJiBjaGlsZC0+aGFzVGFnTmFt
ZSh0aGVhZFRhZykpCi0gICAgICAgICAgICBoZWFkID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkpOwotICAgICAgICBlbHNlIGlmICghZm9vdCAmJiBj
aGlsZC0+aGFzVGFnTmFtZSh0Zm9vdFRhZykpCi0gICAgICAgICAgICBmb290ID0gc3RhdGljX2Nh
c3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkpOwotICAgICAgICBlbHNl
IGlmICghZmlyc3RCb2R5ICYmIGNoaWxkLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkgewotICAgICAg
ICAgICAgZmlyc3RCb2R5ID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4o
Y2hpbGQuZ2V0KCkpOwotICAgICAgICAgICAgZmlyc3RCb2R5LT5yZWYoKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICByZXR1cm4gY29udGFpbmVyOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6
OmNoaWxkcmVuQ2hhbmdlZCgpCi17Ci0gICAgSFRNTEVsZW1lbnQ6OmNoaWxkcmVuQ2hhbmdlZCgp
OwotICAgIAotICAgIGlmIChmaXJzdEJvZHkgJiYgZmlyc3RCb2R5LT5wYXJlbnROb2RlKCkgIT0g
dGhpcykgewotICAgICAgICBmaXJzdEJvZHktPmRlcmVmKCk7Ci0gICAgICAgIGZpcnN0Qm9keSA9
IDA7Ci0gICAgfQotfSAKLQotYm9vbCBIVE1MVGFibGVFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0
IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBj
b25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICBy
ZXN1bHQgPSAoTWFwcGVkQXR0cmlidXRlRW50cnkpKGVMYXN0RW50cnkgKyBkb2N1bWVudCgpLT5k
b2NJRCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0
ck5hbWUgPT0gd2lkdGhBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIgfHwK
LSAgICAgICAgYXR0ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0g
Y2VsbHNwYWNpbmdBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZzcGFjZUF0dHIgfHwKLSAg
ICAgICAgYXR0ck5hbWUgPT0gaHNwYWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2YWxp
Z25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGJvcmRlcmNvbG9yQXR0cikg
ewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGJvcmRlckF0dHIpIHsKLSAgICAgICAgcmVz
dWx0ID0gZVRhYmxlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYg
KGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVGFibGU7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIAotICAgIHJldHVybiBIVE1MRWxlbWVudDo6
bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYg
KGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIs
IENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJP
UF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGJvcmRlckF0dHIpICB7Ci0gICAgICAgIG1fbm9Cb3JkZXIgPSB0cnVlOwotICAgICAgICBpZiAo
YXR0ci0+ZGVjbCgpKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTVmFsdWU+IHZhbCA9IGF0dHIt
PmRlY2woKS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShDU1NfUFJPUF9CT1JERVJfTEVGVF9XSURUSCk7
Ci0gICAgICAgICAgICBpZiAodmFsICYmIHZhbC0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAg
ICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1WYWwgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHZhbC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgbV9ub0JvcmRlciA9
ICFwcmltVmFsLT5nZXRGbG9hdFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghYXR0ci0+aXNOdWxs
KCkpIHsKLSAgICAgICAgICAgIC8vICMjIyB0aGlzIG5lZWRzIG1vcmUgd29yaywgYXMgdGhlIGJv
cmRlciB2YWx1ZSBpcyBub3Qgb25seQotICAgICAgICAgICAgLy8gICAgIHRoZSBib3JkZXIgb2Yg
dGhlIGJveCwgYnV0IGFsc28gYmV0d2VlbiB0aGUgY2VsbHMKLSAgICAgICAgICAgIGludCBib3Jk
ZXIgPSAwOwotICAgICAgICAgICAgaWYgKGF0dHItPmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAg
ICBib3JkZXIgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJvcmRlciA9
IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSNpZmRlZiBERUJVR19EUkFXX0JPUkRFUgotICAgICAg
ICAgICAgYm9yZGVyPTE7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1fbm9Cb3JkZXIgPSAhYm9yZGVy
OwotICAgICAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0JPUkRFUl9XSURUSCwg
U3RyaW5nOjpudW1iZXIoYm9yZGVyKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBiZ2NvbG9yQXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1Nf
UFJPUF9CQUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBib3JkZXJjb2xvckF0dHIpIHsKLSAgICAgICAgbV9zb2xpZCA9IGF0dHIt
PmRlY2woKTsKLSAgICAgICAgaWYgKCFhdHRyLT5kZWNsKCkgJiYgIWF0dHItPmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0NPTE9SLCBh
dHRyLT52YWx1ZSgpKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9Q
X0JPUkRFUl9UT1BfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJv
cGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7
Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfTEVGVF9T
VFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBD
U1NfUFJPUF9CT1JERVJfUklHSFRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAg
bV9zb2xpZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICBTdHJpbmcgdXJsID0gV2ViQ29yZTo6cGFyc2VV
UkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGlmICghdXJsLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIGFkZENTU0ltYWdlUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9JTUFHRSwg
ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gZnJhbWVBdHRyKSB7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gcnVsZXNB
dHRyKSB7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2VsbHNwYWNpbmdBdHRyKSB7
Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRD
U1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1NQQUNJTkcsIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNlbGxwYWRkaW5nQXR0cikgewotICAgICAg
ICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcGFkZGluZyA9IG1h
eCggMCwgYXR0ci0+dmFsdWUoKS50b0ludCgpICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHBhZGRpbmcgPSAxOwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1Rh
YmxlKCkpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlICo+KHJlbmRlcmVy
KCkpLT5zZXRDZWxsUGFkZGluZyhwYWRkaW5nKTsKLSAgICAgICAgICAgIGlmICghcmVuZGVyZXIo
KS0+bmVlZHNMYXlvdXQoKSkKLSAgICAgICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xh
eW91dCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNv
bHNBdHRyKSB7Ci0gICAgICAgIC8vICMjIwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IHZzcGFjZUF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJ
Tl9UT1AsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfTUFSR0lOX0JPVFRPTSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gaHNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfTUFSR0lOX0xFRlQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0
ciwgQ1NTX1BST1BfTUFSR0lOX1JJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYg
KGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgp
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0ZM
T0FULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWxp
Z25BdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9WRVJUSUNBTF9BTElHTiwgYXR0ci0+
dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShhdHRyKTsKLX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJs
ZUVsZW1lbnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKQotewotICAgIGlmIChtX25v
Qm9yZGVyKQotICAgICAgICByZXR1cm4gMDsKLSAgICBNYXBwZWRBdHRyaWJ1dGUgYXR0cih0YWJs
ZWJvcmRlckF0dHIsIG1fc29saWQgPyAic29saWQiIDogIm91dHNldCIpOwotICAgIENTU01hcHBl
ZEF0dHJpYnV0ZURlY2xhcmF0aW9uKiBkZWNsID0gZ2V0TWFwcGVkQXR0cmlidXRlRGVjbChlUGVy
c2lzdGVudCwgJmF0dHIpOwotICAgIGlmICghZGVjbCkgewotICAgICAgICBkZWNsID0gbmV3IENT
U01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKDApOwotICAgICAgICBkZWNsLT5zZXRQYXJlbnQo
ZG9jdW1lbnQoKS0+ZWxlbWVudFNoZWV0KCkpOwotICAgICAgICBkZWNsLT5zZXROb2RlKHRoaXMp
OwotICAgICAgICBkZWNsLT5zZXRTdHJpY3RQYXJzaW5nKGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJp
YnV0ZXMgYXJlIGp1c3QgYWx3YXlzIHF1aXJreS4KLSAgICAgICAgCi0gICAgICAgIGRlY2wtPnJl
ZigpOyAvLyBUaGlzIHNpbmdsZSByZWYgcGlucyB1cyBpbiB0aGUgdGFibGUgdW50aWwgdGhlIGRv
Y3VtZW50IGRpZXMuCi0KLSAgICAgICAgaW50IHYgPSBtX3NvbGlkID8gQ1NTX1ZBTF9TT0xJRCA6
IENTU19WQUxfT1VUU0VUOwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JE
RVJfVE9QX1NUWUxFLCB2LCBmYWxzZSk7Ci0gICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19Q
Uk9QX0JPUkRFUl9CT1RUT01fU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+c2V0UHJv
cGVydHkoQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVj
bC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1JJR0hUX1NUWUxFLCB2LCBmYWxzZSk7Ci0K
LSAgICAgICAgc2V0TWFwcGVkQXR0cmlidXRlRGVjbChlUGVyc2lzdGVudCwgJmF0dHIsIGRlY2wp
OwotICAgICAgICBkZWNsLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUoMCk7
Ci0gICAgICAgIGRlY2wtPnNldE1hcHBlZFN0YXRlKGVQZXJzaXN0ZW50LCBhdHRyLm5hbWUoKSwg
YXR0ci52YWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlY2w7Ci19Ci0KLUNTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uKiBIVE1MVGFibGVFbGVtZW50OjpnZXRTaGFyZWRDZWxsRGVjbCgpCi17
Ci0gICAgTWFwcGVkQXR0cmlidXRlIGF0dHIoY2VsbGJvcmRlckF0dHIsIG1fbm9Cb3JkZXIgPyAi
bm9uZSIgOiAobV9zb2xpZCA/ICJzb2xpZCIgOiAiaW5zZXQiKSk7Ci0gICAgQ1NTTWFwcGVkQXR0
cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0
ZW50LCAmYXR0cik7Ci0gICAgaWYgKCFkZWNsKSB7Ci0gICAgICAgIGRlY2wgPSBuZXcgQ1NTTWFw
cGVkQXR0cmlidXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVudChkb2N1
bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUodGhpcyk7Ci0g
ICAgICAgIGRlY2wtPnNldFN0cmljdFBhcnNpbmcoZmFsc2UpOyAvLyBNYXBwZWQgYXR0cmlidXRl
cyBhcmUganVzdCBhbHdheXMgcXVpcmt5LgotICAgICAgICAKLSAgICAgICAgZGVjbC0+cmVmKCk7
IC8vIFRoaXMgc2luZ2xlIHJlZiBwaW5zIHVzIGluIHRoZSB0YWJsZSB1bnRpbCB0aGUgdGFibGUg
ZGllcy4KLSAgICAgICAgCi0gICAgICAgIGlmIChtX25vQm9yZGVyKQotICAgICAgICAgICAgZGVj
bC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1dJRFRILCAiMCIsIGZhbHNlKTsKLSAgICAg
ICAgZWxzZSB7Ci0gICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJf
V0lEVEgsICIxcHgiLCBmYWxzZSk7Ci0gICAgICAgICAgICBpbnQgdiA9IG1fc29saWQgPyBDU1Nf
VkFMX1NPTElEIDogQ1NTX1ZBTF9JTlNFVDsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5
KENTU19QUk9QX0JPUkRFUl9UT1BfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wt
PnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9CT1RUT01fU1RZTEUsIHYsIGZhbHNlKTsKLSAg
ICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9MRUZUX1NUWUxFLCB2
LCBmYWxzZSk7Ci0gICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJf
UklHSFRfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENT
U19QUk9QX0JPUkRFUl9DT0xPUiwgImluaGVyaXQiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0ciwgZGVjbCk7Ci0g
ICAgICAgIGRlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSgwKTsKLSAg
ICAgICAgZGVjbC0+c2V0TWFwcGVkU3RhdGUoZVBlcnNpc3RlbnQsIGF0dHIubmFtZSgpLCBhdHRy
LnZhbHVlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZGVjbDsKLX0KLQotdm9pZCBIVE1MVGFibGVF
bGVtZW50OjphdHRhY2goKQotewotICAgIGFzc2VydCghbV9hdHRhY2hlZCk7Ci0gICAgSFRNTEVs
ZW1lbnQ6OmF0dGFjaCgpOwotICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFi
bGUoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGUgKj4ocmVuZGVyZXIoKSktPnNl
dENlbGxQYWRkaW5nKCBwYWRkaW5nICk7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlRWxlbWVudDo6aXNV
UkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5u
YW1lKCkgPT0gYmFja2dyb3VuZEF0dHI7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gSFRN
TFRhYmxlRWxlbWVudDo6cm93cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlv
bj4obmV3IEhUTUxDb2xsZWN0aW9uKHRoaXMsIEhUTUxDb2xsZWN0aW9uOjpUQUJMRV9ST1dTKSk7
Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlRWxlbWVudDo6dEJvZGllcygp
Ci17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xsZWN0aW9u
KHRoaXMsIEhUTUxDb2xsZWN0aW9uOjpUQUJMRV9UQk9ESUVTKSk7Ci19Ci0KLVN0cmluZyBIVE1M
VGFibGVFbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShh
bGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6YmdDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShiZ2NvbG9yQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6
c2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShiZ2Nv
bG9yQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6Ym9yZGVyKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGJvcmRlckF0dHIpOwotfQotCi12b2lk
IEhUTUxUYWJsZUVsZW1lbnQ6OnNldEJvcmRlcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShib3JkZXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVF
bGVtZW50OjpjZWxsUGFkZGluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShj
ZWxscGFkZGluZ0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENlbGxQYWRk
aW5nKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNlbGxwYWRkaW5n
QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6Y2VsbFNwYWNpbmco
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2VsbHNwYWNpbmdBdHRyKTsKLX0K
LQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRDZWxsU3BhY2luZyhjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjZWxsc3BhY2luZ0F0dHIsIHZhbHVlKTsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKGZyYW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0RnJh
bWUoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZnJhbWVBdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpydWxlcygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShydWxlc0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVs
ZW1lbnQ6OnNldFJ1bGVzKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHJ1bGVzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6c3VtbWFy
eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShzdW1tYXJ5QXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0U3VtbWFyeShjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShzdW1tYXJ5QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRN
TFRhYmxlRWxlbWVudDo6d2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
d2lkdGhBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRXaWR0aChjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogYm9vbCBIVE1MVGFibGVQYXJ0RWxlbWVudDo6bWFw
VG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50
cnkmIHJlc3VsdCkgY29uc3QKIHsKICAgICBpZiAoYXR0ck5hbWUgPT0gYmFja2dyb3VuZEF0dHIp
IHsKQEAgLTY0OCw5ICs2MSw5IEBAIGJvb2wgSFRNTFRhYmxlUGFydEVsZW1lbnQ6Om1hcFRvRW50
cnkoY28KIAogdm9pZCBIVE1MVGFibGVQYXJ0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
TWFwcGVkQXR0cmlidXRlICphdHRyKQogewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gYmdjb2xv
ckF0dHIpIHsKKyAgICBpZiAoYXR0ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKQogICAgICAgICBh
ZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgp
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cikgeworICAg
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cikgewogICAgICAgICBTdHJp
bmcgdXJsID0gV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7CiAgICAgICAgIGlmICgh
dXJsLmlzRW1wdHkoKSkKICAgICAgICAgICAgIGFkZENTU0ltYWdlUHJvcGVydHkoYXR0ciwgQ1NT
X1BST1BfQkFDS0dST1VORF9JTUFHRSwgZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKSk7CkBA
IC02ODQsNjUxICs5Nyw0IEBAIHZvaWQgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXQKICAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwogfQog
Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAq
ZG9jLCBib29sIGltcGxpY2l0KQotICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQodGFnTmFtZSwg
ZG9jKQotewotICAgIG1faW1wbGljaXQgPSBpbXBsaWNpdDsKLX0KLQotYm9vbCBIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgcmV0
dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRyVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShm
b3JtVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwot
fQotCi1Db250YWluZXJOb2RlKiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6YWRkQ2hpbGQoUGFz
c1JlZlB0cjxOb2RlPiBjaGlsZCkKLXsKLSAgICBpZiAoY2hpbGQtPmhhc1RhZ05hbWUoZm9ybVRh
ZykpIHsKLSAgICAgICAgLy8gRmlyc3QgYWRkIHRoZSBjaGlsZC4KLSAgICAgICAgSFRNTFRhYmxl
UGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICAvLyBOb3cgc2ltcGx5IHJl
dHVybiBvdXJzZWx2ZXMgYXMgdGhlIGNvbnRhaW5lciB0byBpbnNlcnQgaW50by4KLSAgICAgICAg
Ly8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBkZW1vdGluZyB0aGUgZm9ybSB0byBhIGxlYWYgYW5k
IG1vdmluZyBpdCBzYWZlbHkgb3V0IG9mIHRoZSB3YXkuCi0gICAgICAgIHJldHVybiB0aGlzOwot
ICAgIH0KLQotICAgIHJldHVybiBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQp
OwotfQotCi0vLyB0aGVzZSBmdW5jdGlvbnMgYXJlIHJhdGhlciBzbG93LCBzaW5jZSB3ZSBuZWVk
IHRvIGdldCB0aGUgcm93IGF0Ci0vLyB0aGUgaW5kZXguLi4gYnV0IHRoZXkgYXJlbid0IHVzZWQg
ZHVyaW5nIHVzdWFsIEhUTUwgcGFyc2luZyBhbnl3YXkKLUhUTUxFbGVtZW50ICpIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDo6aW5zZXJ0Um93KCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQot
ewotICAgIEhUTUxUYWJsZVJvd0VsZW1lbnQgKnIgPSAwTDsKLSAgICBSZWZQdHI8Tm9kZUxpc3Q+
IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1Sb3dzID0gY2hpbGRyZW4gPyAo
aW50KWNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKCBpbmRleCA8IC0xIHx8IGluZGV4
ID4gbnVtUm93cyApIHsKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsgLy8gcGVyIHRoZSBE
T00KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgciA9IG5ldyBIVE1MVGFibGVSb3dF
bGVtZW50KGRvY3VtZW50KCkpOwotICAgICAgICBpZiAoIG51bVJvd3MgPT0gaW5kZXggfHwgaW5k
ZXggPT0gLTEgKQotICAgICAgICAgICAgYXBwZW5kQ2hpbGQociwgZWMpOwotICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgIE5vZGUgKm47Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAxKQotICAg
ICAgICAgICAgICAgIG4gPSBmaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgbiA9IGNoaWxkcmVuLT5pdGVtKGluZGV4KTsKLSAgICAgICAgICAgIGluc2VydEJl
Zm9yZShyLCBuLCBlYyApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByOwotfQotCi12
b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpkZWxldGVSb3coIGludCBpbmRleCwgRXhjZXB0
aW9uQ29kZSYgZWMpCi17Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJlbiA9IGNoaWxkTm9k
ZXMoKTsKLSAgICBpbnQgbnVtUm93cyA9IGNoaWxkcmVuID8gKGludCljaGlsZHJlbi0+bGVuZ3Ro
KCkgOiAwOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgICAgaW5kZXggPSBudW1Sb3dzIC0g
MTsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bVJvd3MpIHsKLSAgICAgICAgUmVm
UHRyPE5vZGU+IHJvdyA9IGNoaWxkcmVuLT5pdGVtKGluZGV4KTsKLSAgICAgICAgSFRNTEVsZW1l
bnQ6OnJlbW92ZUNoaWxkKHJvdy5nZXQoKSwgZWMpOwotICAgIH0gZWxzZQotICAgICAgICBlYyA9
IElOREVYX1NJWkVfRVJSOwotfQotCi1pbnQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Om51bVJv
d3MoKSBjb25zdAotewotICAgIGludCByb3dzID0gMDsKLSAgICBjb25zdCBOb2RlICpuID0gZmly
c3RDaGlsZCgpOwotICAgIHdoaWxlIChuKSB7Ci0gICAgICAgIGlmIChuLT5oYXNUYWdOYW1lKHRy
VGFnKSkKLSAgICAgICAgICAgIHJvd3MrKzsKLSAgICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHJvd3M7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVTZWN0aW9u
RWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25B
dHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6c2V0QWxpZ24oY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6Y2goKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoY2hhckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50OjpzZXRDaChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShj
aGFyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmNo
T2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0K
LQotdm9pZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIsIHZhbHVlKTsKLX0KLQotU3Ry
aW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVs
ZW1lbnQ6OnNldFZBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh2YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQ6OnJvd3MoKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxl
Y3Rpb24+KG5ldyBIVE1MQ29sbGVjdGlvbih0aGlzLCBIVE1MQ29sbGVjdGlvbjo6VEFCTEVfUk9X
UykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJvb2wgSFRNTFRhYmxlUm93RWxlbWVu
dDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgcmV0dXJuIG5ld0NoaWxk
LT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0aFRhZykgfHwKLSAg
ICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZm9ybVRhZykgfHwgbmV3Q2hpbGQtPmhhc1Rh
Z05hbWUoc2NyaXB0VGFnKTsKLX0KLQotQ29udGFpbmVyTm9kZSogSFRNTFRhYmxlUm93RWxlbWVu
dDo6YWRkQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPiBjaGlsZCkKLXsKLSAgICBpZiAoY2hpbGQtPmhh
c1RhZ05hbWUoZm9ybVRhZykpIHsKLSAgICAgICAgLy8gRmlyc3QgYWRkIHRoZSBjaGlsZC4KLSAg
ICAgICAgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICAv
LyBOb3cgc2ltcGx5IHJldHVybiBvdXJzZWx2ZXMgYXMgdGhlIGNvbnRhaW5lciB0byBpbnNlcnQg
aW50by4KLSAgICAgICAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBkZW1vdGluZyB0aGUgZm9y
bSB0byBhIGxlYWYgYW5kIG1vdmluZyBpdCBzYWZlbHkgb3V0IG9mIHRoZSB3YXkuCi0gICAgICAg
IHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHJldHVybiBIVE1MVGFibGVQYXJ0RWxlbWVudDo6
YWRkQ2hpbGQoY2hpbGQpOwotfQotCi1pbnQgSFRNTFRhYmxlUm93RWxlbWVudDo6cm93SW5kZXgo
KSBjb25zdAotewotICAgIE5vZGUgKnRhYmxlID0gcGFyZW50Tm9kZSgpOwotICAgIGlmICghdGFi
bGUpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB0YWJsZSA9IHRhYmxlLT5wYXJlbnROb2RlKCk7
Ci0gICAgaWYgKCF0YWJsZSB8fCAhdGFibGUtPmhhc1RhZ05hbWUodGFibGVUYWcpKQotICAgICAg
ICByZXR1cm4gLTE7Ci0KLSAgICAvLyBUbyBtYXRjaCBGaXJlZm94LCB0aGUgcm93IGluZGljZXMg
d29yayBsaWtlIHRoaXM6Ci0gICAgLy8gICBSb3dzIGZyb20gdGhlIGZpcnN0IDx0aGVhZD4gYXJl
IG51bWJlcmVkIGJlZm9yZSBhbGwgPHRib2R5PiByb3dzLgotICAgIC8vICAgUm93cyBmcm9tIHRo
ZSBmaXJzdCA8dGZvb3Q+IGFyZSBudW1iZXJlZCBhZnRlciBhbGwgPHRib2R5PiByb3dzLgotICAg
IC8vICAgUm93cyBmcm9tIG90aGVyIDx0aGVhZD4gYW5kIDx0Zm9vdD4gZWxlbWVudHMgZG9uJ3Qg
Z2V0IHJvdyBpbmRpY2VzIGF0IGFsbC4KLQotICAgIGludCBySW5kZXggPSAwOwotCi0gICAgaWYg
KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBoZWFkID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlRWxl
bWVudCo+KHRhYmxlKS0+dEhlYWQoKSkgewotICAgICAgICBmb3IgKE5vZGUgKnJvdyA9IGhlYWQt
PmZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAg
ICAgIGlmIChyb3cgPT0gdGhpcykKLSAgICAgICAgICAgICAgICByZXR1cm4gckluZGV4OwotICAg
ICAgICAgICAgKytySW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZm9yIChOb2Rl
ICpub2RlID0gdGFibGUtPmZpcnN0Q2hpbGQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHRTaWJs
aW5nKCkpIHsKLSAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUodGJvZHlUYWcpKSB7Ci0gICAg
ICAgICAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50Kj4obm9kZSk7Ci0gICAgICAgICAgICBmb3IgKE5vZGUqIHJv
dyA9IHNlY3Rpb24tPmZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ctPm5leHRTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgICAgICBpZiAocm93ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgICAg
IHJldHVybiBySW5kZXg7Ci0gICAgICAgICAgICAgICAgKytySW5kZXg7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGZv
b3QgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50ICo+KHRhYmxlKS0+dEZvb3QoKSkgewot
ICAgICAgICBmb3IgKE5vZGUgKnJvdyA9IGZvb3QtPmZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSBy
b3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChyb3cgPT0gdGhpcykKLSAgICAg
ICAgICAgICAgICByZXR1cm4gckluZGV4OwotICAgICAgICAgICAgKytySW5kZXg7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBXZSBnZXQgaGVyZSBmb3Igcm93cyB0aGF0IGFyZSBpbiA8dGhl
YWQ+IG9yIDx0Zm9vdD4gc2VjdGlvbnMgb3RoZXIgdGhhbiB0aGUgbWFpbiBoZWFkZXIgYW5kIGZv
b3Rlci4KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZWN0
aW9uUm93SW5kZXgoKSBjb25zdAotewotICAgIGludCBySW5kZXggPSAwOwotICAgIGNvbnN0IE5v
ZGUgKm4gPSB0aGlzOwotICAgIGRvIHsKLSAgICAgICAgbiA9IG4tPnByZXZpb3VzU2libGluZygp
OwotICAgICAgICBpZiAobiAmJiBuLT5oYXNUYWdOYW1lKHRyVGFnKSkKLSAgICAgICAgICAgIHJJ
bmRleCsrOwotICAgIH0KLSAgICB3aGlsZSAobik7Ci0KLSAgICByZXR1cm4gckluZGV4OwotfQot
Ci1IVE1MRWxlbWVudCAqSFRNTFRhYmxlUm93RWxlbWVudDo6aW5zZXJ0Q2VsbCggaW50IGluZGV4
LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBIVE1MVGFibGVDZWxsRWxlbWVudCAqYyA9IDBM
OwotICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50
IG51bUNlbGxzID0gY2hpbGRyZW4gPyBjaGlsZHJlbi0+bGVuZ3RoKCkgOiAwOwotICAgIGlmICgg
aW5kZXggPCAtMSB8fCBpbmRleCA+IG51bUNlbGxzICkKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpF
X0VSUjsgLy8gcGVyIHRoZSBET00KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjID0gbmV3IEhU
TUxUYWJsZUNlbGxFbGVtZW50KHRkVGFnLCBkb2N1bWVudCgpKTsKLSAgICAgICAgaWYobnVtQ2Vs
bHMgPT0gaW5kZXggfHwgaW5kZXggPT0gLTEpCi0gICAgICAgICAgICBhcHBlbmRDaGlsZChjLCBl
Yyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgTm9kZSAqbjsKLSAgICAgICAgICAgIGlm
KGluZGV4IDwgMSkKLSAgICAgICAgICAgICAgICBuID0gZmlyc3RDaGlsZCgpOwotICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIG4gPSBjaGlsZHJlbi0+aXRlbShpbmRleCk7Ci0gICAg
ICAgICAgICBpbnNlcnRCZWZvcmUoYywgbiwgZWMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJl
dHVybiBjOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmRlbGV0ZUNlbGwoIGludCBp
bmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJl
biA9IGNoaWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtQ2VsbHMgPSBjaGlsZHJlbiA/IGNoaWxkcmVu
LT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKGluZGV4ID09IC0xICkKLSAgICAgICAgaW5kZXggPSBu
dW1DZWxscy0xOwotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtQ2VsbHMpIHsKLSAg
ICAgICAgUmVmUHRyPE5vZGU+IHJvdyA9IGNoaWxkcmVuLT5pdGVtKGluZGV4KTsKLSAgICAgICAg
SFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxkKHJvdy5nZXQoKSwgZWMpOwotICAgIH0gZWxzZQotICAg
ICAgICBlYyA9IElOREVYX1NJWkVfRVJSOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb24+IEhU
TUxUYWJsZVJvd0VsZW1lbnQ6OmNlbGxzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xs
ZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246OlRSX0NFTExT
KSk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0Q2VsbHMoSFRNTENvbGxlY3Rp
b24gKiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgZWMgPSBOT19NT0RJRklDQVRJT05fQUxM
T1dFRF9FUlI7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50OjphbGlnbigpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxU
YWJsZVJvd0VsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlUm93RWxl
bWVudDo6YmdDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShiZ2NvbG9y
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0QmdDb2xvcihjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFsdWUpOwot
fQotCi1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6Y2goKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoY2hhckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6
OnNldENoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJBdHRy
LCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50OjpjaE9mZigpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyb2ZmQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlUm93RWxlbWVudDo6c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJv
d0VsZW1lbnQ6OnZBbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWxp
Z25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRWQWxpZ24oY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsaWduQXR0ciwgdmFsdWUpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJsZUNlbGxFbGVtZW50OjpIVE1MVGFi
bGVDZWxsRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9j
KQotICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05hbWUsIGRvYykKLXsKLSAgICBfY29sID0g
LTE7Ci0gICAgX3JvdyA9IC0xOwotICAgIGNTcGFuID0gclNwYW4gPSAxOwotICAgIHJvd0hlaWdo
dCA9IDA7Ci0gICAgbV9zb2xpZCA9IGZhbHNlOwotfQotCi1IVE1MVGFibGVDZWxsRWxlbWVudDo6
fkhUTUxUYWJsZUNlbGxFbGVtZW50KCkKLXsKLX0KLQotaW50IEhUTUxUYWJsZUNlbGxFbGVtZW50
OjpjZWxsSW5kZXgoKSBjb25zdAotewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgZm9yIChjb25z
dCBOb2RlICogbm9kZSA9IHByZXZpb3VzU2libGluZygpOyBub2RlOyBub2RlID0gbm9kZS0+cHJl
dmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8
IG5vZGUtPmhhc1RhZ05hbWUodGhUYWcpKQotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICB9Ci0g
ICAgCi0gICAgcmV0dXJuIGluZGV4OwotfQotCi1ib29sIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSBub3dyYXBBdHRyKSB7
Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0ciB8fAotICAgICAgICBhdHRy
TmFtZSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVDZWxsOyAvLyBCZWNhdXNl
IG9mIHRoZSBxdWlya3kgYmVoYXZpb3Igb2YgaWdub3JpbmcgMCB2YWx1ZXMsIGNlbGxzIGFyZSBz
cGVjaWFsLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxU
YWJsZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lk
IEhUTUxUYWJsZUNlbGxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1
dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSByb3dzcGFuQXR0cikgewotICAg
ICAgICByU3BhbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IDE7
Ci0gICAgICAgIGlmIChyU3BhbiA8IDEpIHJTcGFuID0gMTsKLSAgICAgICAgaWYgKHJlbmRlcmVy
KCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNlbGwoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlclRhYmxlQ2VsbCo+KHJlbmRlcmVyKCkpLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNvbHNwYW5BdHRyKSB7Ci0gICAgICAgIGNTcGFu
ID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMTsKLSAgICAgICAg
aWYgKGNTcGFuIDwgMSkgY1NwYW4gPSAxOwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5k
ZXJlcigpLT5pc1RhYmxlQ2VsbCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFi
bGVDZWxsKj4ocmVuZGVyZXIoKSktPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gbm93cmFwQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPmlzTnVs
bCgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfV0hJVEVfU1BB
Q0UsIENTU19WQUxfX1dFQktJVF9OT1dSQVApOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IHdpZHRoQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKSB7
Ci0gICAgICAgICAgICBpbnQgd2lkdGhJbnQgPSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7Ci0gICAg
ICAgICAgICBpZiAod2lkdGhJbnQgPiAwKSAvLyB3aWR0aD0iMCIgaXMgaWdub3JlZCBmb3IgY29t
cGF0aWJpbGl0eSB3aXRoIFdpbklFLgotICAgICAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRy
LCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFs
dWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBoZWlnaHRJbnQgPSBhdHRyLT52YWx1
ZSgpLnRvSW50KCk7Ci0gICAgICAgICAgICBpZiAoaGVpZ2h0SW50ID4gMCkgLy8gaGVpZ2h0PSIw
IiBpcyBpZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggV2luSUUuCi0gICAgICAgICAgICAg
ICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OnBhcnNl
TWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi0vLyB1c2VkIGJ5IHRhYmxlIGNlbGxzIHRvIHNo
YXJlIHN0eWxlIGRlY2xzIGNyZWF0ZWQgYnkgdGhlIGVuY2xvc2luZyB0YWJsZS4KLUNTU011dGFi
bGVTdHlsZURlY2xhcmF0aW9uKiBIVE1MVGFibGVDZWxsRWxlbWVudDo6YWRkaXRpb25hbEF0dHJp
YnV0ZVN0eWxlRGVjbCgpCi17Ci0gICAgTm9kZSogcCA9IHBhcmVudE5vZGUoKTsKLSAgICB3aGls
ZSAocCAmJiAhcC0+aGFzVGFnTmFtZSh0YWJsZVRhZykpCi0gICAgICAgIHAgPSBwLT5wYXJlbnRO
b2RlKCk7Ci0KLSAgICBpZiAocCkgewotICAgICAgICBIVE1MVGFibGVFbGVtZW50KiB0YWJsZSA9
IHN0YXRpY19jYXN0PEhUTUxUYWJsZUVsZW1lbnQqPihwKTsKLSAgICAgICAgcmV0dXJuIHRhYmxl
LT5nZXRTaGFyZWRDZWxsRGVjbCgpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29s
IEhUTUxUYWJsZUNlbGxFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cjsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjphYmJyKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGFiYnJBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6
c2V0QWJicihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhYmJyQXR0
ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmFsaWduKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2Vs
bEVsZW1lbnQ6OmF4aXMoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYXhpc0F0
dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRBeGlzKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGF4aXNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0
cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6YmdDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShiZ2NvbG9yQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1l
bnQ6OnNldEJnQ29sb3IoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
Ymdjb2xvckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpj
aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldENoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVD
ZWxsRWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hh
cm9mZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRDaE9mZihjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUp
OwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRDb2xTcGFuKGludCBuKQotewot
ICAgIHNldEF0dHJpYnV0ZShjb2xzcGFuQXR0ciwgU3RyaW5nOjpudW1iZXIobikpOwotfQotCi1T
dHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmhlYWRlcnMoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoaGVhZGVyc0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVt
ZW50OjpzZXRIZWFkZXJzKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KGhlYWRlcnNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6
aGVpZ2h0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGhlaWdodEF0dHIpOwot
fQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRIZWlnaHQoY29uc3QgU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoaGVpZ2h0QXR0ciwgdmFsdWUpOwotfQotCi1ib29s
IEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpub1dyYXAoKSBjb25zdAotewotICAgIHJldHVybiAhZ2V0
QXR0cmlidXRlKG5vd3JhcEF0dHIpLmlzTnVsbCgpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxF
bGVtZW50OjpzZXROb1dyYXAoYm9vbCBiKQotewotICAgIHNldEF0dHJpYnV0ZShub3dyYXBBdHRy
LCBiID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Um93U3Bh
bihpbnQgbikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocm93c3BhbkF0dHIsIFN0cmluZzo6bnVtYmVy
KG4pKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzY29wZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShzY29wZUF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJs
ZUNlbGxFbGVtZW50OjpzZXRTY29wZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShzY29wZUF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVt
ZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsaWduQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFZBbGlnbihjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0K
LVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6d2lkdGgoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVu
dDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUod2lk
dGhBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRhYmxlQ29s
RWxlbWVudDo6SFRNTFRhYmxlQ29sRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1l
LCBEb2N1bWVudCAqZG9jKQotICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQodGFnTmFtZSwgZG9j
KQotewotICAgIF9zcGFuID0gKHRhZ05hbWUubWF0Y2hlcyhjb2xncm91cFRhZykgPyAwIDogMSk7
Ci19Ci0KLWJvb2wgSFRNTFRhYmxlQ29sRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZp
ZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsK
LSAgICBpZiAoYXR0ck5hbWUgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2
ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSFRNTFRh
YmxlUGFydEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQg
SFRNTFRhYmxlQ29sRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRl
ICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gc3BhbkF0dHIpIHsKLSAgICAgICAg
X3NwYW4gPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAxOwotICAg
ICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlQ29sKCkpCi0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNvbCo+KHJlbmRlcmVyKCkpLT51cGRhdGVGcm9t
RWxlbWVudCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewot
ICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NT
TGVuZ3RoKGF0dHIsIENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIp
OwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ29sRWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDb2xF
bGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmNo
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MVGFibGVDb2xFbGVtZW50OjpzZXRDaChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShjaGFyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ29s
RWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhcm9m
ZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldENoT2ZmKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyLCB2YWx1ZSk7Ci19
Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0U3BhbihpbnQgbikKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoc3BhbkF0dHIsIFN0cmluZzo6bnVtYmVyKG4pKTsKLX0KLQotU3RyaW5nIEhUTUxU
YWJsZUNvbEVsZW1lbnQ6OnZBbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZSh2YWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDb2xFbGVtZW50OjpzZXRWQWxpZ24o
Y29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsaWduQXR0ciwgdmFs
dWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ29sRWxlbWVudDo6d2lkdGgoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVD
b2xFbGVtZW50OjpzZXRXaWR0aChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29s
IEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUm
IGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlm
IChhdHRyTmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNhcHRpb247Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSFRNTEVsZW1lbnQ6Om1h
cFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2FwdGlvbkVs
ZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAg
ICBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZh
bHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BS
T1BfQ0FQVElPTl9TSURFLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRN
TEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1TdHJpbmcgSFRNTFRh
YmxlQ2FwdGlvbkVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6OnNldEFs
aWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwg
dmFsdWUpOwotfQotCiB9CkluZGV4OiBodG1sL0hUTUxUYWJsZUNvbEVsZW1lbnQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGh0bWwvSFRNTFRhYmxlQ29sRWxlbWVudC5jcHAJKHJldmlzaW9uIDE0MzI1KQor
KysgaHRtbC9IVE1MVGFibGVDb2xFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsMTIw
MyArMjMsMzYgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRl
bXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgog
ICovCi0KICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJodG1sX3RhYmxlaW1wbC5oIgor
I2luY2x1ZGUgIkhUTUxUYWJsZUNvbEVsZW1lbnQuaCIKIAotI2luY2x1ZGUgIkV4Y2VwdGlvbkNv
ZGUuaCIKLSNpbmNsdWRlICJOb2RlTGlzdC5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlLmgiCi0j
aW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDb2wuaCIK
LSNpbmNsdWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBs
LmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5o
IgotI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdv
cmRzLmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgi
CisjaW5jbHVkZSAiUmVuZGVyVGFibGVDb2wuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1
c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1IVE1MVGFibGVFbGVtZW50OjpIVE1MVGFibGVF
bGVtZW50KERvY3VtZW50ICpkb2MpCi0gIDogSFRNTEVsZW1lbnQodGFibGVUYWcsIGRvYykKLXsK
LSAgICB0Q2FwdGlvbiA9IDA7Ci0gICAgaGVhZCA9IDA7Ci0gICAgZm9vdCA9IDA7Ci0gICAgZmly
c3RCb2R5ID0gMDsKLQotIAotICAgIHBhZGRpbmcgPSAxOwotICAgIAotICAgIG1fbm9Cb3JkZXIg
PSB0cnVlOwotICAgIG1fc29saWQgPSBmYWxzZTsKLX0KLQotSFRNTFRhYmxlRWxlbWVudDo6fkhU
TUxUYWJsZUVsZW1lbnQoKQotewotICAgIGlmIChmaXJzdEJvZHkpCi0gICAgICAgIGZpcnN0Qm9k
eS0+ZGVyZWYoKTsKLX0KLQotYm9vbCBIVE1MVGFibGVFbGVtZW50OjpjaGVja0RURChjb25zdCBO
b2RlKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmlzVGV4dE5vZGUoKSB8fCBu
ZXdDaGlsZC0+aGFzVGFnTmFtZShjYXB0aW9uVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+
aGFzVGFnTmFtZShjb2xUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNvbGdyb3VwVGFnKSB8
fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbmV3Q2hpbGQt
Pmhhc1RhZ05hbWUodGZvb3RUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1l
KHRib2R5VGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSB8fAotICAgICAgICAg
ICBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi1Ob2RlKiBIVE1MVGFibGVF
bGVtZW50OjpzZXRDYXB0aW9uKCBIVE1MVGFibGVDYXB0aW9uRWxlbWVudCAqYyApCi17Ci0gICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgaWYgKE5vZGUgKm9jID0gdENhcHRpb24pCi0gICAg
ICAgIHJlcGxhY2VDaGlsZChjLCBvYywgZWMpOwotICAgIGVsc2UKLSAgICAgICAgaW5zZXJ0QmVm
b3JlKGMsIGZpcnN0Q2hpbGQoKSwgZWMpOwotICAgIHRDYXB0aW9uID0gYzsKLSAgICByZXR1cm4g
dENhcHRpb247Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRIZWFkKCBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudCAqcyApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAg
aWYgKE5vZGUgKmggPSBoZWFkKQotICAgICAgICByZXBsYWNlQ2hpbGQocywgaCwgZWMpOwotICAg
IGVsc2UgaWYgKGZvb3QpCi0gICAgICAgIGluc2VydEJlZm9yZShzLCBmb290LCBlYyk7Ci0gICAg
ZWxzZSBpZiAoZmlyc3RCb2R5KQotICAgICAgICBpbnNlcnRCZWZvcmUocywgZmlyc3RCb2R5LCBl
Yyk7Ci0gICAgZWxzZQotICAgICAgICBhcHBlbmRDaGlsZChzLCBlYyk7Ci0gICAgaGVhZCA9IHM7
Ci0gICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRGb290
KCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqcyApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7Ci0gICAgaWYgKE5vZGUgKmYgPSBmb290KQotICAgICAgICByZXBsYWNlQ2hpbGQocywgZiwg
ZWMpOwotICAgIGVsc2UgaWYgKGZpcnN0Qm9keSkKLSAgICAgICAgaW5zZXJ0QmVmb3JlKHMsIGZp
cnN0Qm9keSwgZWMpOwotICAgIGVsc2UKLSAgICAgICAgYXBwZW5kQ2hpbGQocywgZWMpOwotICAg
IGZvb3QgPSBzOwotICAgIHJldHVybiBmb290OwotfQotCi1Ob2RlKiBIVE1MVGFibGVFbGVtZW50
OjpzZXRUQm9keSggSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKnMgKQotewotICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwotICAgIE5vZGUqIHI7Ci0gICAgcy0+cmVmKCk7Ci0gICAgaWYgKE5vZGUg
KmZiID0gZmlyc3RCb2R5KSB7Ci0gICAgICAgIHJlcGxhY2VDaGlsZChzLCBmYiwgZWMpOwotICAg
ICAgICBmYi0+ZGVyZWYoKTsKLSAgICAgICAgciA9IHM7Ci0gICAgfSBlbHNlCi0gICAgICAgIGFw
cGVuZENoaWxkKHMsIGVjKTsKLSAgICBmaXJzdEJvZHkgPSBzOwotICAgIHJldHVybiBmaXJzdEJv
ZHk7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVUSGVhZCggICkK
LXsKLSAgICBpZighaGVhZCkKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwot
ICAgICAgICBoZWFkID0gbmV3IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KHRoZWFkVGFnLCBkb2N1
bWVudCgpLCB0cnVlIC8qIGltcGxpY2l0ICovKTsKLSAgICAgICAgaWYoZm9vdCkKLSAgICAgICAg
ICAgIGluc2VydEJlZm9yZSggaGVhZCwgZm9vdCwgZWMgKTsKLSAgICAgICAgZWxzZSBpZihmaXJz
dEJvZHkpCi0gICAgICAgICAgICBpbnNlcnRCZWZvcmUoIGhlYWQsIGZpcnN0Qm9keSwgZWMpOwot
ICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcHBlbmRDaGlsZChoZWFkLCBlYyk7Ci0gICAgfQot
ICAgIHJldHVybiBoZWFkOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0ZVRIZWFk
KCAgKQotewotICAgIGlmKGhlYWQpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0g
ICAgICAgIGhlYWQtPnJlZigpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQoaGVh
ZCwgZWMpOwotICAgICAgICBoZWFkLT5kZXJlZigpOwotICAgIH0KLSAgICBoZWFkID0gMDsKLX0K
LQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6OmNyZWF0ZVRGb290KCAgKQotewotICAg
IGlmICghZm9vdCkKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgICAg
ICBmb290ID0gbmV3IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KHRmb290VGFnLCBkb2N1bWVudCgp
LCB0cnVlIC8qaW1wbGljaXQgKi8pOwotICAgICAgICBpZiAoZmlyc3RCb2R5KQotICAgICAgICAg
ICAgaW5zZXJ0QmVmb3JlKCBmb290LCBmaXJzdEJvZHksIGVjICk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIGFwcGVuZENoaWxkKGZvb3QsIGVjKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvb3Q7
Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlVEZvb3QoICApCi17Ci0gICAgaWYo
Zm9vdCkgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgZm9vdC0+cmVm
KCk7Ci0gICAgICAgIEhUTUxFbGVtZW50OjpyZW1vdmVDaGlsZChmb290LCBlYyk7Ci0gICAgICAg
IGZvb3QtPmRlcmVmKCk7Ci0gICAgfQotICAgIGZvb3QgPSAwOwotfQotCi1IVE1MRWxlbWVudCAq
SFRNTFRhYmxlRWxlbWVudDo6Y3JlYXRlQ2FwdGlvbiggICkKLXsKLSAgICBpZighdENhcHRpb24p
Ci0gICAgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgdENhcHRpb24g
PSBuZXcgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQoZG9jdW1lbnQoKSk7Ci0gICAgICAgIGluc2Vy
dEJlZm9yZSggdENhcHRpb24sIGZpcnN0Q2hpbGQoKSwgZWMgKTsKLSAgICB9Ci0gICAgcmV0dXJu
IHRDYXB0aW9uOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0ZUNhcHRpb24oICAp
Ci17Ci0gICAgaWYodENhcHRpb24pIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0g
ICAgICAgIHRDYXB0aW9uLT5yZWYoKTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxk
KHRDYXB0aW9uLCBlYyk7Ci0gICAgICAgIHRDYXB0aW9uLT5kZXJlZigpOwotICAgIH0KLSAgICB0
Q2FwdGlvbiA9IDA7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjppbnNlcnRS
b3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgLy8gVGhlIERPTSByZXF1
aXJlcyB0aGF0IHdlIGNyZWF0ZSBhIHRib2R5IGlmIHRoZSB0YWJsZSBpcyBlbXB0eQotICAgIC8v
IChjZiBET00yVFMgSFRNTFRhYmxlRWxlbWVudDMxIHRlc3QpCi0gICAgLy8gKG5vdGU6IHRoaXMg
aXMgZGlmZmVyZW50IGZyb20gImlmIHRoZSB0YWJsZSBoYXMgbm8gc2VjdGlvbnMiLCBzaW5jZSB3
ZSBjYW4gaGF2ZQotICAgIC8vIDxUQUJMRT48VFI+KQotICAgIGlmKCFmaXJzdEJvZHkgJiYgIWhl
YWQgJiYgIWZvb3QpCi0gICAgICAgIHNldFRCb2R5KCBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1l
bnQodGJvZHlUYWcsIGRvY3VtZW50KCksIHRydWUgLyogaW1wbGljaXQgKi8pICk7Ci0KLSAgICAv
LyBJRSB0cmVhdHMgaW5kZXg9LTEgYXMgZGVmYXVsdCB2YWx1ZSBtZWFuaW5nICdhcHBlbmQgYWZ0
ZXIgbGFzdCcKLSAgICAvLyBUaGlzIGlzbid0IGluIHRoZSBET00uIFNvLCBub3QgaW1wbGVtZW50
ZWQgeWV0LgotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBzZWN0aW9uID0gMEw7Ci0gICAg
SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGxhc3RTZWN0aW9uID0gMEw7Ci0gICAgTm9kZSAqbm9k
ZSA9IGZpcnN0Q2hpbGQoKTsKLSAgICBib29sIGFwcGVuZCA9IChpbmRleCA9PSAtMSk7Ci0gICAg
Ym9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoIDsgbm9kZSAmJiAoaW5kZXg+PTAgfHwgYXBw
ZW5kKSA7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpICkKLSAgICB7Ci0gICAgICAgIC8vIHRo
ZXJlIGNvdWxkIGJlIDIgdGZvb3QgZWxlbWVudHMgaW4gdGhlIHRhYmxlLiBPbmx5IHRoZSBmaXJz
dCBvbmUgaXMgdGhlICJmb290IiwgdGhhdCdzIHdoeSB3ZSBoYXZlIHRoZSBtb3JlCi0gICAgICAg
IC8vIGNvbXBsaWNhdGVkIGlmIHN0YXRlbWVudCBiZWxvdy4KLSAgICAgICAgaWYgKG5vZGUgIT0g
Zm9vdCAmJiAobm9kZS0+aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0
Zm9vdFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0Ym9keVRhZykpKQotICAgICAgICB7Ci0gICAg
ICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4o
bm9kZSk7Ci0gICAgICAgICAgICBsYXN0U2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICAgICAgICBp
ZiAoIWFwcGVuZCkgewotICAgICAgICAgICAgICAgIGludCByb3dzID0gc2VjdGlvbi0+bnVtUm93
cygpOwotICAgICAgICAgICAgICAgIGlmIChyb3dzID49IGluZGV4KSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4IC09IHJvd3M7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCAhZm91bmQgJiYgZm9vdCApCi0g
ICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihm
b290KTsKLQotICAgIC8vIEluZGV4ID09IDAgbWVhbnMgImluc2VydCBiZWZvcmUgZmlyc3Qgcm93
IGluIGN1cnJlbnQgc2VjdGlvbiIKLSAgICAvLyBvciAiYXBwZW5kIGFmdGVyIGxhc3Qgcm93IiAo
aWYgdGhlcmUncyBubyBjdXJyZW50IHNlY3Rpb24gYW55bW9yZSkKLSAgICBpZiAoICFzZWN0aW9u
ICYmICggaW5kZXggPT0gMCB8fCBhcHBlbmQgKSApCi0gICAgewotICAgICAgICBzZWN0aW9uID0g
bGFzdFNlY3Rpb247Ci0gICAgICAgIGluZGV4ID0gc2VjdGlvbiA/IHNlY3Rpb24tPm51bVJvd3Mo
KSA6IDA7Ci0gICAgfQotICAgIGlmIChzZWN0aW9uICYmIChpbmRleCA+PSAwIHx8IGFwcGVuZCkp
Ci0gICAgICAgIHJldHVybiBzZWN0aW9uLT5pbnNlcnRSb3coaW5kZXgsIGVjKTsKLSAgICBlbHNl
IHsKLSAgICAgICAgLy8gTm8gbW9yZSBzZWN0aW9ucyA9PiBpbmRleCBpcyB0b28gYmlnCi0gICAg
ICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci0gICAgICAgIHJldHVybiAwTDsKLSAgICB9Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlUm93KCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNv
ZGUmIGVjKQotewotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBzZWN0aW9uID0gMEw7Ci0g
ICAgTm9kZSAqbm9kZSA9IGZpcnN0Q2hpbGQoKTsKLSAgICBib29sIGxhc3RSb3cgPSBpbmRleCA9
PSAtMTsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogbGFzdFNlY3Rpb24gPSAwTDsKLSAg
ICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICggOyBub2RlIDsgbm9kZSA9IG5vZGUtPm5l
eHRTaWJsaW5nKCkgKQotICAgIHsKLSAgICAgICAgaWYgKG5vZGUgIT0gZm9vdCAmJiAobm9kZS0+
aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwgCi0g
ICAgICAgICAgICBub2RlLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkpIHsKLSAgICAgICAgICAgIHNl
Y3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihub2RlKTsKLSAg
ICAgICAgICAgIGxhc3RTZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgICAgICAgIGludCByb3dzID0g
c2VjdGlvbi0+bnVtUm93cygpOwotICAgICAgICAgICAgaWYgKCAhbGFzdFJvdyApCi0gICAgICAg
ICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCByb3dzID4gaW5kZXggKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4IC09IHJvd3M7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VjdGlvbiA9IDBMOwotICAgIH0KLSAg
ICBpZiAoICFmb3VuZCAmJiBmb290ICkKLSAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGZvb3QpOwotCi0gICAgaWYgKCBsYXN0Um93ICkKLSAg
ICAgICAgbGFzdFNlY3Rpb24tPmRlbGV0ZVJvdyggLTEsIGVjICk7Ci0gICAgZWxzZSBpZiAoIHNl
Y3Rpb24gJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IHNlY3Rpb24tPm51bVJvd3MoKSApCi0gICAg
ICAgIHNlY3Rpb24tPmRlbGV0ZVJvdyggaW5kZXgsIGVjICk7Ci0gICAgZWxzZQotICAgICAgICBl
YyA9IElOREVYX1NJWkVfRVJSOwotfQotCi1Db250YWluZXJOb2RlKiBIVE1MVGFibGVFbGVtZW50
OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQotewotICAgIGlmIChjaGlsZC0+aGFz
VGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJzdCBhZGQgdGhlIGNoaWxkLgotICAg
ICAgICBIVE1MRWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgICAgIC8vIE5vdyBzaW1w
bHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUgY29udGFpbmVyIHRvIGluc2VydCBpbnRvLgotICAg
ICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRlbW90aW5nIHRoZSBmb3JtIHRvIGEgbGVh
ZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQgb2YgdGhlIHdheS4KLSAgICAgICAgcmV0dXJuIHRo
aXM7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNyZWF0aW9uIG9mIDx0Ym9keT4gZWxlbWVudHMgcmVs
aWVzIG9uIHRoZSAiY2hpbGRBbGxvd2VkIiBjaGVjaywKLSAgICAvLyBzbyB3ZSBuZWVkIHRvIGRv
IGl0IGV2ZW4gZm9yIFhNTCBkb2N1bWVudHMuCi0gICAgYXNzZXJ0KGNoaWxkLT5ub2RlVHlwZSgp
ICE9IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpOwotICAgIGlmICghZG9jdW1lbnQoKS0+aXNIVE1M
RG9jdW1lbnQoKSAmJiAhY2hpbGRBbGxvd2VkKGNoaWxkLmdldCgpKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBDb250YWluZXJOb2RlKiBjb250YWluZXIgPSBIVE1MRWxlbWVudDo6YWRkQ2hp
bGQoY2hpbGQuZ2V0KCkpOwotICAgIGlmIChjb250YWluZXIpIHsKLSAgICAgICAgaWYgKCF0Q2Fw
dGlvbiAmJiBjaGlsZC0+aGFzVGFnTmFtZShjYXB0aW9uVGFnKSkKLSAgICAgICAgICAgIHRDYXB0
aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkp
OwotICAgICAgICBlbHNlIGlmICghaGVhZCAmJiBjaGlsZC0+aGFzVGFnTmFtZSh0aGVhZFRhZykp
Ci0gICAgICAgICAgICBoZWFkID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQg
Kj4oY2hpbGQuZ2V0KCkpOwotICAgICAgICBlbHNlIGlmICghZm9vdCAmJiBjaGlsZC0+aGFzVGFn
TmFtZSh0Zm9vdFRhZykpCi0gICAgICAgICAgICBmb290ID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkpOwotICAgICAgICBlbHNlIGlmICghZmlyc3RC
b2R5ICYmIGNoaWxkLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkgewotICAgICAgICAgICAgZmlyc3RC
b2R5ID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkp
OwotICAgICAgICAgICAgZmlyc3RCb2R5LT5yZWYoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBy
ZXR1cm4gY29udGFpbmVyOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmNoaWxkcmVuQ2hh
bmdlZCgpCi17Ci0gICAgSFRNTEVsZW1lbnQ6OmNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIAotICAg
IGlmIChmaXJzdEJvZHkgJiYgZmlyc3RCb2R5LT5wYXJlbnROb2RlKCkgIT0gdGhpcykgewotICAg
ICAgICBmaXJzdEJvZHktPmRlcmVmKCk7Ci0gICAgICAgIGZpcnN0Qm9keSA9IDA7Ci0gICAgfQot
fSAKLQotYm9vbCBIVE1MVGFibGVFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5h
bWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAg
IGlmIChhdHRyTmFtZSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICByZXN1bHQgPSAoTWFw
cGVkQXR0cmlidXRlRW50cnkpKGVMYXN0RW50cnkgKyBkb2N1bWVudCgpLT5kb2NJRCgpKTsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gd2lk
dGhBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIgfHwKLSAgICAgICAgYXR0
ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gY2VsbHNwYWNpbmdB
dHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZzcGFjZUF0dHIgfHwKLSAgICAgICAgYXR0ck5h
bWUgPT0gaHNwYWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2YWxpZ25BdHRyKSB7Ci0g
ICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGJvcmRlcmNvbG9yQXR0cikgewotICAgICAgICBy
ZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0g
ICAgaWYgKGF0dHJOYW1lID09IGJvcmRlckF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVRhYmxl
OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09
IGFsaWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVGFibGU7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9IAotICAgIAotICAgIHJldHVybiBIVE1MRWxlbWVudDo6bWFwVG9FbnRyeShh
dHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX1dJ
RFRILCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoZWln
aHRBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0
dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJvcmRlckF0dHIp
ICB7Ci0gICAgICAgIG1fbm9Cb3JkZXIgPSB0cnVlOwotICAgICAgICBpZiAoYXR0ci0+ZGVjbCgp
KSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q1NTVmFsdWU+IHZhbCA9IGF0dHItPmRlY2woKS0+Z2V0
UHJvcGVydHlDU1NWYWx1ZShDU1NfUFJPUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0gICAgICAgICAg
ICBpZiAodmFsICYmIHZhbC0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHByaW1WYWwgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHZhbC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgbV9ub0JvcmRlciA9ICFwcmltVmFsLT5n
ZXRGbG9hdFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghYXR0ci0+aXNOdWxsKCkpIHsKLSAgICAg
ICAgICAgIC8vICMjIyB0aGlzIG5lZWRzIG1vcmUgd29yaywgYXMgdGhlIGJvcmRlciB2YWx1ZSBp
cyBub3Qgb25seQotICAgICAgICAgICAgLy8gICAgIHRoZSBib3JkZXIgb2YgdGhlIGJveCwgYnV0
IGFsc28gYmV0d2VlbiB0aGUgY2VsbHMKLSAgICAgICAgICAgIGludCBib3JkZXIgPSAwOwotICAg
ICAgICAgICAgaWYgKGF0dHItPmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBib3JkZXIgPSAx
OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJvcmRlciA9IGF0dHItPnZhbHVl
KCkudG9JbnQoKTsKLSNpZmRlZiBERUJVR19EUkFXX0JPUkRFUgotICAgICAgICAgICAgYm9yZGVy
PTE7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1fbm9Cb3JkZXIgPSAhYm9yZGVyOwotICAgICAgICAg
ICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0JPUkRFUl9XSURUSCwgU3RyaW5nOjpudW1i
ZXIoYm9yZGVyKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBi
Z2NvbG9yQXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9CQUNLR1JP
VU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBib3JkZXJjb2xvckF0dHIpIHsKLSAgICAgICAgbV9zb2xpZCA9IGF0dHItPmRlY2woKTsKLSAg
ICAgICAgaWYgKCFhdHRyLT5kZWNsKCkgJiYgIWF0dHItPmlzRW1wdHkoKSkgewotICAgICAgICAg
ICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0NPTE9SLCBhdHRyLT52YWx1ZSgp
KTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9UT1Bf
U1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwg
Q1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAg
ICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfTEVGVF9TVFlMRSwgQ1NTX1ZB
TF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JE
RVJfUklHSFRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgbV9zb2xpZCA9IHRy
dWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5k
QXR0cikgewotICAgICAgICBTdHJpbmcgdXJsID0gV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFs
dWUoKSk7Ci0gICAgICAgIGlmICghdXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0lt
YWdlUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9JTUFHRSwgZG9jdW1lbnQoKS0+
Y29tcGxldGVVUkwodXJsKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gZnJhbWVB
dHRyKSB7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gcnVsZXNBdHRyKSB7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2VsbHNwYWNpbmdBdHRyKSB7Ci0gICAgICAgIGlm
ICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0
ciwgQ1NTX1BST1BfQk9SREVSX1NQQUNJTkcsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGNlbGxwYWRkaW5nQXR0cikgewotICAgICAgICBpZiAoIWF0dHIt
PnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcGFkZGluZyA9IG1heCggMCwgYXR0ci0+
dmFsdWUoKS50b0ludCgpICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhZGRpbmcgPSAx
OwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlKCkpIHsKLSAg
ICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlICo+KHJlbmRlcmVyKCkpLT5zZXRDZWxs
UGFkZGluZyhwYWRkaW5nKTsKLSAgICAgICAgICAgIGlmICghcmVuZGVyZXIoKS0+bmVlZHNMYXlv
dXQoKSkKLSAgICAgICAgICAgICAgICByZW5kZXJlcigpLT5zZXROZWVkc0xheW91dCh0cnVlKTsK
LSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNvbHNBdHRyKSB7Ci0g
ICAgICAgIC8vICMjIwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZzcGFjZUF0dHIp
IHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJTl9UT1AsIGF0dHIt
PnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX0JP
VFRPTSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaHNw
YWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFSR0lOX0xF
RlQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1Bf
TUFSR0lOX1JJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUo
KSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0ZMT0FULCBhdHRyLT52
YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWxpZ25BdHRyKSB7Ci0g
ICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRDU1NQ
cm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9WRVJUSUNBTF9BTElHTiwgYXR0ci0+dmFsdWUoKSk7Ci0g
ICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRy
KTsKLX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJsZUVsZW1lbnQ6OmFk
ZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKQotewotICAgIGlmIChtX25vQm9yZGVyKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBNYXBwZWRBdHRyaWJ1dGUgYXR0cih0YWJsZWJvcmRlckF0dHIs
IG1fc29saWQgPyAic29saWQiIDogIm91dHNldCIpOwotICAgIENTU01hcHBlZEF0dHJpYnV0ZURl
Y2xhcmF0aW9uKiBkZWNsID0gZ2V0TWFwcGVkQXR0cmlidXRlRGVjbChlUGVyc2lzdGVudCwgJmF0
dHIpOwotICAgIGlmICghZGVjbCkgewotICAgICAgICBkZWNsID0gbmV3IENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKDApOwotICAgICAgICBkZWNsLT5zZXRQYXJlbnQoZG9jdW1lbnQoKS0+
ZWxlbWVudFNoZWV0KCkpOwotICAgICAgICBkZWNsLT5zZXROb2RlKHRoaXMpOwotICAgICAgICBk
ZWNsLT5zZXRTdHJpY3RQYXJzaW5nKGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJpYnV0ZXMgYXJlIGp1
c3QgYWx3YXlzIHF1aXJreS4KLSAgICAgICAgCi0gICAgICAgIGRlY2wtPnJlZigpOyAvLyBUaGlz
IHNpbmdsZSByZWYgcGlucyB1cyBpbiB0aGUgdGFibGUgdW50aWwgdGhlIGRvY3VtZW50IGRpZXMu
Ci0KLSAgICAgICAgaW50IHYgPSBtX3NvbGlkID8gQ1NTX1ZBTF9TT0xJRCA6IENTU19WQUxfT1VU
U0VUOwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfVE9QX1NUWUxF
LCB2LCBmYWxzZSk7Ci0gICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9C
T1RUT01fU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BS
T1BfQk9SREVSX0xFRlRfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+c2V0UHJvcGVy
dHkoQ1NTX1BST1BfQk9SREVSX1JJR0hUX1NUWUxFLCB2LCBmYWxzZSk7Ci0KLSAgICAgICAgc2V0
TWFwcGVkQXR0cmlidXRlRGVjbChlUGVyc2lzdGVudCwgJmF0dHIsIGRlY2wpOwotICAgICAgICBk
ZWNsLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUoMCk7Ci0gICAgICAgIGRl
Y2wtPnNldE1hcHBlZFN0YXRlKGVQZXJzaXN0ZW50LCBhdHRyLm5hbWUoKSwgYXR0ci52YWx1ZSgp
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlY2w7Ci19Ci0KLUNTU011dGFibGVTdHlsZURlY2xhcmF0
aW9uKiBIVE1MVGFibGVFbGVtZW50OjpnZXRTaGFyZWRDZWxsRGVjbCgpCi17Ci0gICAgTWFwcGVk
QXR0cmlidXRlIGF0dHIoY2VsbGJvcmRlckF0dHIsIG1fbm9Cb3JkZXIgPyAibm9uZSIgOiAobV9z
b2xpZCA/ICJzb2xpZCIgOiAiaW5zZXQiKSk7Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFy
YXRpb24qIGRlY2wgPSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0cik7
Ci0gICAgaWYgKCFkZWNsKSB7Ci0gICAgICAgIGRlY2wgPSBuZXcgQ1NTTWFwcGVkQXR0cmlidXRl
RGVjbGFyYXRpb24oMCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVudChkb2N1bWVudCgpLT5lbGVt
ZW50U2hlZXQoKSk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUodGhpcyk7Ci0gICAgICAgIGRlY2wt
PnNldFN0cmljdFBhcnNpbmcoZmFsc2UpOyAvLyBNYXBwZWQgYXR0cmlidXRlcyBhcmUganVzdCBh
bHdheXMgcXVpcmt5LgotICAgICAgICAKLSAgICAgICAgZGVjbC0+cmVmKCk7IC8vIFRoaXMgc2lu
Z2xlIHJlZiBwaW5zIHVzIGluIHRoZSB0YWJsZSB1bnRpbCB0aGUgdGFibGUgZGllcy4KLSAgICAg
ICAgCi0gICAgICAgIGlmIChtX25vQm9yZGVyKQotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVy
dHkoQ1NTX1BST1BfQk9SREVSX1dJRFRILCAiMCIsIGZhbHNlKTsKLSAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfV0lEVEgsICIxcHgi
LCBmYWxzZSk7Ci0gICAgICAgICAgICBpbnQgdiA9IG1fc29saWQgPyBDU1NfVkFMX1NPTElEIDog
Q1NTX1ZBTF9JTlNFVDsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JP
UkRFUl9UT1BfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5
KENTU19QUk9QX0JPUkRFUl9CT1RUT01fU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRl
Y2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRFUl9MRUZUX1NUWUxFLCB2LCBmYWxzZSk7Ci0g
ICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfUklHSFRfU1RZTEUs
IHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRF
Ul9DT0xPUiwgImluaGVyaXQiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRNYXBw
ZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0ciwgZGVjbCk7Ci0gICAgICAgIGRlY2wt
PnNldFBhcmVudCgwKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgZGVjbC0+
c2V0TWFwcGVkU3RhdGUoZVBlcnNpc3RlbnQsIGF0dHIubmFtZSgpLCBhdHRyLnZhbHVlKCkpOwot
ICAgIH0KLSAgICByZXR1cm4gZGVjbDsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjphdHRh
Y2goKQotewotICAgIGFzc2VydCghbV9hdHRhY2hlZCk7Ci0gICAgSFRNTEVsZW1lbnQ6OmF0dGFj
aCgpOwotICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFibGUoKSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGUgKj4ocmVuZGVyZXIoKSktPnNldENlbGxQYWRkaW5n
KCBwYWRkaW5nICk7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlRWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUo
QXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1lKCkgPT0gYmFj
a2dyb3VuZEF0dHI7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlRWxlbWVu
dDo6cm93cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxD
b2xsZWN0aW9uKHRoaXMsIEhUTUxDb2xsZWN0aW9uOjpUQUJMRV9ST1dTKSk7Ci19Ci0KLVJlZlB0
cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlRWxlbWVudDo6dEJvZGllcygpCi17Ci0gICAgcmV0
dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xsZWN0aW9uKHRoaXMsIEhUTUxD
b2xsZWN0aW9uOjpUQUJMRV9UQk9ESUVTKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50
OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwot
fQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRN
TFRhYmxlRWxlbWVudDo6YmdDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShiZ2NvbG9yQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0QmdDb2xvcihj
b25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFs
dWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6Ym9yZGVyKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGJvcmRlckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVs
ZW1lbnQ6OnNldEJvcmRlcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShib3JkZXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpjZWxs
UGFkZGluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjZWxscGFkZGluZ0F0
dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENlbGxQYWRkaW5nKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNlbGxwYWRkaW5nQXR0ciwgdmFsdWUp
OwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6Y2VsbFNwYWNpbmcoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2VsbHNwYWNpbmdBdHRyKTsKLX0KLQotdm9pZCBIVE1M
VGFibGVFbGVtZW50OjpzZXRDZWxsU3BhY2luZyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAg
IHNldEF0dHJpYnV0ZShjZWxsc3BhY2luZ0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxU
YWJsZUVsZW1lbnQ6OmZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGZy
YW1lQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0RnJhbWUoY29uc3QgU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoZnJhbWVBdHRyLCB2YWx1ZSk7Ci19Ci0K
LVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpydWxlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEF0dHJpYnV0ZShydWxlc0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFJ1
bGVzKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHJ1bGVzQXR0ciwg
dmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6c3VtbWFyeSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShzdW1tYXJ5QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlRWxlbWVudDo6c2V0U3VtbWFyeShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShzdW1tYXJ5QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVu
dDo6d2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUod2lkdGhBdHRyKTsK
LX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRXaWR0aChjb25zdCBTdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotYm9vbCBIVE1MVGFibGVQYXJ0RWxlbWVudDo6bWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkg
Y29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmFja2dyb3VuZEF0dHIpIHsKLSAgICAgICAg
cmVzdWx0ID0gKE1hcHBlZEF0dHJpYnV0ZUVudHJ5KShlTGFzdEVudHJ5ICsgZG9jdW1lbnQoKS0+
ZG9jSUQoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0
dHJOYW1lID09IGJnY29sb3JBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGJvcmRlcmNvbG9y
QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2YWxpZ25BdHRyIHx8Ci0gICAgICAgIGF0dHJO
YW1lID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25B
dHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVDZWxsOyAvLyBBbGwgdGFibGUgcGFydHMgd2lsbCBq
dXN0IHNoYXJlIGluIHRoZSBURCBzcGFjZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIHJldHVybiBIVE1MRWxlbWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsK
LX0KLQotdm9pZCBIVE1MVGFibGVQYXJ0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFw
cGVkQXR0cmlidXRlICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gYmdjb2xvckF0
dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9DT0xP
UiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYmFja2dy
b3VuZEF0dHIpIHsKLSAgICAgICAgU3RyaW5nIHVybCA9IFdlYkNvcmU6OnBhcnNlVVJMKGF0dHIt
PnZhbHVlKCkpOwotICAgICAgICBpZiAoIXVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRD
U1NJbWFnZVByb3BlcnR5KGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfSU1BR0UsIGRvY3VtZW50
KCktPmNvbXBsZXRlVVJMKHVybCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJv
cmRlcmNvbG9yQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKSB7
Ci0gICAgICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9CT1JERVJfQ09MT1IsIGF0
dHItPnZhbHVlKCkpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1Bf
Qk9SREVSX1RPUF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9w
ZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsK
LSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9MRUZUX1NU
WUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENT
U19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgIH0KLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2YWxpZ25BdHRyKSB7Ci0gICAgICAgIGlmICgh
YXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRy
LCBDU1NfUFJPUF9WRVJUSUNBTF9BTElHTiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmlu
ZyYgdiA9IGF0dHItPnZhbHVlKCk7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAi
bWlkZGxlIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UodiwgImNlbnRlciIpKQotICAgICAgICAgICAg
YWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lU
X0NFTlRFUik7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHYsICJhYnNtaWRk
bGUiKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJ
R04sIENTU19WQUxfQ0VOVEVSKTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
diwgImxlZnQiKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RF
WFRfQUxJR04sIENTU19WQUxfX1dFQktJVF9MRUZUKTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJ
Z25vcmluZ0Nhc2UodiwgInJpZ2h0IikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRy
LCBDU1NfUFJPUF9URVhUX0FMSUdOLCBDU1NfVkFMX19XRUJLSVRfUklHSFQpOwotICAgICAgICBl
bHNlCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9URVhUX0FMSUdO
LCB2KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAg
ICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRDU1NMZW5n
dGgoYXR0ciwgQ1NTX1BST1BfSEVJR0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpIVE1MVGFibGVTZWN0
aW9uRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jLCBi
b29sIGltcGxpY2l0KQorSFRNTFRhYmxlQ29sRWxlbWVudDo6SFRNTFRhYmxlQ29sRWxlbWVudChj
b25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jKQogICAgIDogSFRNTFRh
YmxlUGFydEVsZW1lbnQodGFnTmFtZSwgZG9jKQogewotICAgIG1faW1wbGljaXQgPSBpbXBsaWNp
dDsKLX0KLQotYm9vbCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9k
ZSogbmV3Q2hpbGQpCi17Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRyVGFnKSB8
fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+
aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi1Db250YWluZXJOb2RlKiBIVE1MVGFibGVTZWN0
aW9uRWxlbWVudDo6YWRkQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPiBjaGlsZCkKLXsKLSAgICBpZiAo
Y2hpbGQtPmhhc1RhZ05hbWUoZm9ybVRhZykpIHsKLSAgICAgICAgLy8gRmlyc3QgYWRkIHRoZSBj
aGlsZC4KLSAgICAgICAgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsKLQot
ICAgICAgICAvLyBOb3cgc2ltcGx5IHJldHVybiBvdXJzZWx2ZXMgYXMgdGhlIGNvbnRhaW5lciB0
byBpbnNlcnQgaW50by4KLSAgICAgICAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBkZW1vdGlu
ZyB0aGUgZm9ybSB0byBhIGxlYWYgYW5kIG1vdmluZyBpdCBzYWZlbHkgb3V0IG9mIHRoZSB3YXku
Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHJldHVybiBIVE1MVGFibGVQYXJ0
RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotfQotCi0vLyB0aGVzZSBmdW5jdGlvbnMgYXJlIHJh
dGhlciBzbG93LCBzaW5jZSB3ZSBuZWVkIHRvIGdldCB0aGUgcm93IGF0Ci0vLyB0aGUgaW5kZXgu
Li4gYnV0IHRoZXkgYXJlbid0IHVzZWQgZHVyaW5nIHVzdWFsIEhUTUwgcGFyc2luZyBhbnl3YXkK
LUhUTUxFbGVtZW50ICpIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6aW5zZXJ0Um93KCBpbnQgaW5k
ZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIEhUTUxUYWJsZVJvd0VsZW1lbnQgKnIgPSAw
TDsKLSAgICBSZWZQdHI8Tm9kZUxpc3Q+IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGlu
dCBudW1Sb3dzID0gY2hpbGRyZW4gPyAoaW50KWNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0gICAg
aWYgKCBpbmRleCA8IC0xIHx8IGluZGV4ID4gbnVtUm93cyApIHsKLSAgICAgICAgZWMgPSBJTkRF
WF9TSVpFX0VSUjsgLy8gcGVyIHRoZSBET00KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAg
ICAgciA9IG5ldyBIVE1MVGFibGVSb3dFbGVtZW50KGRvY3VtZW50KCkpOwotICAgICAgICBpZiAo
IG51bVJvd3MgPT0gaW5kZXggfHwgaW5kZXggPT0gLTEgKQotICAgICAgICAgICAgYXBwZW5kQ2hp
bGQociwgZWMpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIE5vZGUgKm47Ci0gICAgICAg
ICAgICBpZiAoaW5kZXggPCAxKQotICAgICAgICAgICAgICAgIG4gPSBmaXJzdENoaWxkKCk7Ci0g
ICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbiA9IGNoaWxkcmVuLT5pdGVtKGluZGV4
KTsKLSAgICAgICAgICAgIGluc2VydEJlZm9yZShyLCBuLCBlYyApOwotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiByOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpkZWxl
dGVSb3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgUmVmUHRyPE5vZGVM
aXN0PiBjaGlsZHJlbiA9IGNoaWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtUm93cyA9IGNoaWxkcmVu
ID8gKGludCljaGlsZHJlbi0+bGVuZ3RoKCkgOiAwOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAg
ICAgICAgaW5kZXggPSBudW1Sb3dzIC0gMTsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8
IG51bVJvd3MpIHsKLSAgICAgICAgUmVmUHRyPE5vZGU+IHJvdyA9IGNoaWxkcmVuLT5pdGVtKGlu
ZGV4KTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxkKHJvdy5nZXQoKSwgZWMpOwot
ICAgIH0gZWxzZQotICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOwotfQotCi1pbnQgSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQ6Om51bVJvd3MoKSBjb25zdAotewotICAgIGludCByb3dzID0gMDsK
LSAgICBjb25zdCBOb2RlICpuID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChuKSB7Ci0gICAg
ICAgIGlmIChuLT5oYXNUYWdOYW1lKHRyVGFnKSkKLSAgICAgICAgICAgIHJvd3MrKzsKLSAgICAg
ICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJvd3M7Ci19Ci0K
LVN0cmluZyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVTZWN0aW9u
RWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVTZWN0aW9uRWxlbWVu
dDo6Y2goKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhckF0dHIpOwotfQot
Ci12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpzZXRDaChjb25zdCBTdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRN
TFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6
c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhcm9m
ZkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ojp2QWxp
Z24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnNldFZBbGlnbihjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVJlZlB0
cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnJvd3MoKQotewotICAg
IHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb24+KG5ldyBIVE1MQ29sbGVjdGlvbih0aGlzLCBI
VE1MQ29sbGVjdGlvbjo6VEFCTEVfUk9XUykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWJvb2wgSFRNTFRhYmxlUm93RWxlbWVudDo6Y2hlY2tEVEQoY29uc3QgTm9kZSogbmV3Q2hpbGQp
Ci17Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBuZXdDaGlsZC0+
aGFzVGFnTmFtZSh0aFRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZm9y
bVRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotQ29udGFpbmVy
Tm9kZSogSFRNTFRhYmxlUm93RWxlbWVudDo6YWRkQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPiBjaGls
ZCkKLXsKLSAgICBpZiAoY2hpbGQtPmhhc1RhZ05hbWUoZm9ybVRhZykpIHsKLSAgICAgICAgLy8g
Rmlyc3QgYWRkIHRoZSBjaGlsZC4KLSAgICAgICAgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OmFkZENo
aWxkKGNoaWxkKTsKLQotICAgICAgICAvLyBOb3cgc2ltcGx5IHJldHVybiBvdXJzZWx2ZXMgYXMg
dGhlIGNvbnRhaW5lciB0byBpbnNlcnQgaW50by4KLSAgICAgICAgLy8gVGhpcyBoYXMgdGhlIGVm
ZmVjdCBvZiBkZW1vdGluZyB0aGUgZm9ybSB0byBhIGxlYWYgYW5kIG1vdmluZyBpdCBzYWZlbHkg
b3V0IG9mIHRoZSB3YXkuCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHJldHVy
biBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotfQotCi1pbnQgSFRNTFRh
YmxlUm93RWxlbWVudDo6cm93SW5kZXgoKSBjb25zdAotewotICAgIE5vZGUgKnRhYmxlID0gcGFy
ZW50Tm9kZSgpOwotICAgIGlmICghdGFibGUpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB0YWJs
ZSA9IHRhYmxlLT5wYXJlbnROb2RlKCk7Ci0gICAgaWYgKCF0YWJsZSB8fCAhdGFibGUtPmhhc1Rh
Z05hbWUodGFibGVUYWcpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvLyBUbyBtYXRjaCBG
aXJlZm94LCB0aGUgcm93IGluZGljZXMgd29yayBsaWtlIHRoaXM6Ci0gICAgLy8gICBSb3dzIGZy
b20gdGhlIGZpcnN0IDx0aGVhZD4gYXJlIG51bWJlcmVkIGJlZm9yZSBhbGwgPHRib2R5PiByb3dz
LgotICAgIC8vICAgUm93cyBmcm9tIHRoZSBmaXJzdCA8dGZvb3Q+IGFyZSBudW1iZXJlZCBhZnRl
ciBhbGwgPHRib2R5PiByb3dzLgotICAgIC8vICAgUm93cyBmcm9tIG90aGVyIDx0aGVhZD4gYW5k
IDx0Zm9vdD4gZWxlbWVudHMgZG9uJ3QgZ2V0IHJvdyBpbmRpY2VzIGF0IGFsbC4KLQotICAgIGlu
dCBySW5kZXggPSAwOwotCi0gICAgaWYgKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBoZWFkID0g
c3RhdGljX2Nhc3Q8SFRNTFRhYmxlRWxlbWVudCo+KHRhYmxlKS0+dEhlYWQoKSkgewotICAgICAg
ICBmb3IgKE5vZGUgKnJvdyA9IGhlYWQtPmZpcnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ctPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChyb3cgPT0gdGhpcykKLSAgICAgICAgICAg
ICAgICByZXR1cm4gckluZGV4OwotICAgICAgICAgICAgKytySW5kZXg7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgCi0gICAgZm9yIChOb2RlICpub2RlID0gdGFibGUtPmZpcnN0Q2hpbGQoKTsgbm9k
ZTsgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKG5vZGUtPmhhc1Rh
Z05hbWUodGJvZHlUYWcpKSB7Ci0gICAgICAgICAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCog
c2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kj4obm9kZSk7Ci0g
ICAgICAgICAgICBmb3IgKE5vZGUqIHJvdyA9IHNlY3Rpb24tPmZpcnN0Q2hpbGQoKTsgcm93OyBy
b3cgPSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocm93ID09IHRo
aXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBySW5kZXg7Ci0gICAgICAgICAgICAgICAg
KytySW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoSFRN
TFRhYmxlU2VjdGlvbkVsZW1lbnQqIGZvb3QgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50
ICo+KHRhYmxlKS0+dEZvb3QoKSkgewotICAgICAgICBmb3IgKE5vZGUgKnJvdyA9IGZvb3QtPmZp
cnN0Q2hpbGQoKTsgcm93OyByb3cgPSByb3ctPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAg
IGlmIChyb3cgPT0gdGhpcykKLSAgICAgICAgICAgICAgICByZXR1cm4gckluZGV4OwotICAgICAg
ICAgICAgKytySW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBnZXQgaGVyZSBm
b3Igcm93cyB0aGF0IGFyZSBpbiA8dGhlYWQ+IG9yIDx0Zm9vdD4gc2VjdGlvbnMgb3RoZXIgdGhh
biB0aGUgbWFpbiBoZWFkZXIgYW5kIGZvb3Rlci4KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWludCBI
VE1MVGFibGVSb3dFbGVtZW50OjpzZWN0aW9uUm93SW5kZXgoKSBjb25zdAotewotICAgIGludCBy
SW5kZXggPSAwOwotICAgIGNvbnN0IE5vZGUgKm4gPSB0aGlzOwotICAgIGRvIHsKLSAgICAgICAg
biA9IG4tPnByZXZpb3VzU2libGluZygpOwotICAgICAgICBpZiAobiAmJiBuLT5oYXNUYWdOYW1l
KHRyVGFnKSkKLSAgICAgICAgICAgIHJJbmRleCsrOwotICAgIH0KLSAgICB3aGlsZSAobik7Ci0K
LSAgICByZXR1cm4gckluZGV4OwotfQotCi1IVE1MRWxlbWVudCAqSFRNTFRhYmxlUm93RWxlbWVu
dDo6aW5zZXJ0Q2VsbCggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBIVE1M
VGFibGVDZWxsRWxlbWVudCAqYyA9IDBMOwotICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4g
PSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50IG51bUNlbGxzID0gY2hpbGRyZW4gPyBjaGlsZHJlbi0+
bGVuZ3RoKCkgOiAwOwotICAgIGlmICggaW5kZXggPCAtMSB8fCBpbmRleCA+IG51bUNlbGxzICkK
LSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsgLy8gcGVyIHRoZSBET00KLSAgICBlbHNlCi0g
ICAgewotICAgICAgICBjID0gbmV3IEhUTUxUYWJsZUNlbGxFbGVtZW50KHRkVGFnLCBkb2N1bWVu
dCgpKTsKLSAgICAgICAgaWYobnVtQ2VsbHMgPT0gaW5kZXggfHwgaW5kZXggPT0gLTEpCi0gICAg
ICAgICAgICBhcHBlbmRDaGlsZChjLCBlYyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAg
Tm9kZSAqbjsKLSAgICAgICAgICAgIGlmKGluZGV4IDwgMSkKLSAgICAgICAgICAgICAgICBuID0g
Zmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG4gPSBjaGls
ZHJlbi0+aXRlbShpbmRleCk7Ci0gICAgICAgICAgICBpbnNlcnRCZWZvcmUoYywgbiwgZWMpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0Vs
ZW1lbnQ6OmRlbGV0ZUNlbGwoIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAg
UmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJlbiA9IGNoaWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtQ2Vs
bHMgPSBjaGlsZHJlbiA/IGNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKGluZGV4ID09
IC0xICkKLSAgICAgICAgaW5kZXggPSBudW1DZWxscy0xOwotICAgIGlmIChpbmRleCA+PSAwICYm
IGluZGV4IDwgbnVtQ2VsbHMpIHsKLSAgICAgICAgUmVmUHRyPE5vZGU+IHJvdyA9IGNoaWxkcmVu
LT5pdGVtKGluZGV4KTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxkKHJvdy5nZXQo
KSwgZWMpOwotICAgIH0gZWxzZQotICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOwotfQotCi1S
ZWZQdHI8SFRNTENvbGxlY3Rpb24+IEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmNlbGxzKCkKLXsKLSAg
ICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywg
SFRNTENvbGxlY3Rpb246OlRSX0NFTExTKSk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVu
dDo6c2V0Q2VsbHMoSFRNTENvbGxlY3Rpb24gKiwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAg
ZWMgPSBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVS
b3dFbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGln
bkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6YmdDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShiZ2NvbG9yQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxl
bWVudDo6c2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShiZ2NvbG9yQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6
Y2goKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhckF0dHIpOwotfQotCi12
b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldENoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVS
b3dFbGVtZW50OjpjaE9mZigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFy
b2ZmQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0Q2hPZmYoY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIsIHZhbHVlKTsK
LX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnZBbGlnbigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZSh2YWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dF
bGVtZW50OjpzZXRWQWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUodmFsaWduQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxU
YWJsZUNlbGxFbGVtZW50OjpIVE1MVGFibGVDZWxsRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1l
JiB0YWdOYW1lLCBEb2N1bWVudCAqZG9jKQotICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05h
bWUsIGRvYykKLXsKLSAgICBfY29sID0gLTE7Ci0gICAgX3JvdyA9IC0xOwotICAgIGNTcGFuID0g
clNwYW4gPSAxOwotICAgIHJvd0hlaWdodCA9IDA7Ci0gICAgbV9zb2xpZCA9IGZhbHNlOwotfQot
Ci1IVE1MVGFibGVDZWxsRWxlbWVudDo6fkhUTUxUYWJsZUNlbGxFbGVtZW50KCkKLXsKLX0KLQot
aW50IEhUTUxUYWJsZUNlbGxFbGVtZW50OjpjZWxsSW5kZXgoKSBjb25zdAotewotICAgIGludCBp
bmRleCA9IDA7Ci0gICAgZm9yIChjb25zdCBOb2RlICogbm9kZSA9IHByZXZpb3VzU2libGluZygp
OyBub2RlOyBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKG5v
ZGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUodGhUYWcpKQotICAgICAg
ICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluZGV4OwotfQotCi1ib29s
IEhUTUxUYWJsZUNlbGxFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0
dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChh
dHRyTmFtZSA9PSBub3dyYXBBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IHdp
ZHRoQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIHJl
c3VsdCA9IGVDZWxsOyAvLyBCZWNhdXNlIG9mIHRoZSBxdWlya3kgYmVoYXZpb3Igb2YgaWdub3Jp
bmcgMCB2YWx1ZXMsIGNlbGxzIGFyZSBzcGVjaWFsLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJO
YW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSByb3dzcGFuQXR0cikgewotICAgICAgICByU3BhbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0
dHItPnZhbHVlKCkudG9JbnQoKSA6IDE7Ci0gICAgICAgIGlmIChyU3BhbiA8IDEpIHJTcGFuID0g
MTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNlbGwoKSkK
LSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ2VsbCo+KHJlbmRlcmVyKCkpLT51
cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNvbHNw
YW5BdHRyKSB7Ci0gICAgICAgIGNTcGFuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUo
KS50b0ludCgpIDogMTsKLSAgICAgICAgaWYgKGNTcGFuIDwgMSkgY1NwYW4gPSAxOwotICAgICAg
ICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlQ2VsbCgpKQotICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsKj4ocmVuZGVyZXIoKSktPnVwZGF0ZUZyb21F
bGVtZW50KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gbm93cmFwQXR0cikgewot
ICAgICAgICBpZiAoIWF0dHItPmlzTnVsbCgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfV0hJVEVfU1BBQ0UsIENTU19WQUxfX1dFQktJVF9OT1dSQVApOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBpZiAoIWF0
dHItPnZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhJbnQgPSBhdHRy
LT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAgICAgICBpZiAod2lkdGhJbnQgPiAwKSAvLyB3aWR0
aD0iMCIgaXMgaWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFdpbklFLgotICAgICAgICAg
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7
Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoZWlnaHRBdHRyKSB7
Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlu
dCBoZWlnaHRJbnQgPSBhdHRyLT52YWx1ZSgpLnRvSW50KCk7Ci0gICAgICAgICAgICBpZiAoaGVp
Z2h0SW50ID4gMCkgLy8gaGVpZ2h0PSIwIiBpcyBpZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IHdp
dGggV2luSUUuCi0gICAgICAgICAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hF
SUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgSFRN
TFRhYmxlUGFydEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi0vLyB1
c2VkIGJ5IHRhYmxlIGNlbGxzIHRvIHNoYXJlIHN0eWxlIGRlY2xzIGNyZWF0ZWQgYnkgdGhlIGVu
Y2xvc2luZyB0YWJsZS4KLUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBIVE1MVGFibGVDZWxs
RWxlbWVudDo6YWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpCi17Ci0gICAgTm9kZSogcCA9
IHBhcmVudE5vZGUoKTsKLSAgICB3aGlsZSAocCAmJiAhcC0+aGFzVGFnTmFtZSh0YWJsZVRhZykp
Ci0gICAgICAgIHAgPSBwLT5wYXJlbnROb2RlKCk7Ci0KLSAgICBpZiAocCkgewotICAgICAgICBI
VE1MVGFibGVFbGVtZW50KiB0YWJsZSA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUVsZW1lbnQqPihw
KTsKLSAgICAgICAgcmV0dXJuIHRhYmxlLT5nZXRTaGFyZWRDZWxsRGVjbCgpOwotICAgIH0KLQot
ICAgIHJldHVybiAwOwotfQotCi1ib29sIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojppc1VSTEF0dHJp
YnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9
PSBiYWNrZ3JvdW5kQXR0cjsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjphYmJy
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFiYnJBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0QWJicihjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhYmJyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxl
Q2VsbEVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFs
aWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEFsaWduKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwot
fQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmF4aXMoKSBjb25zdAotewotICAgIHJl
dHVybiBnZXRBdHRyaWJ1dGUoYXhpc0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVt
ZW50OjpzZXRBeGlzKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGF4
aXNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6YmdDb2xv
cigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShiZ2NvbG9yQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEJnQ29sb3IoY29uc3QgU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxUYWJsZUNlbGxFbGVtZW50OjpjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldENoKGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7
Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNl
bGxFbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50
OjpzZXRDb2xTcGFuKGludCBuKQotewotICAgIHNldEF0dHJpYnV0ZShjb2xzcGFuQXR0ciwgU3Ry
aW5nOjpudW1iZXIobikpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmhlYWRl
cnMoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoaGVhZGVyc0F0dHIpOwotfQot
Ci12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRIZWFkZXJzKGNvbnN0IFN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGhlYWRlcnNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmlu
ZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6aGVpZ2h0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKGhlaWdodEF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpz
ZXRIZWlnaHQoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoaGVpZ2h0
QXR0ciwgdmFsdWUpOwotfQotCi1ib29sIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpub1dyYXAoKSBj
b25zdAotewotICAgIHJldHVybiAhZ2V0QXR0cmlidXRlKG5vd3JhcEF0dHIpLmlzTnVsbCgpOwot
fQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXROb1dyYXAoYm9vbCBiKQotewotICAg
IHNldEF0dHJpYnV0ZShub3dyYXBBdHRyLCBiID8gIiIgOiAwKTsKLX0KLQotdm9pZCBIVE1MVGFi
bGVDZWxsRWxlbWVudDo6c2V0Um93U3BhbihpbnQgbikKLXsKLSAgICBzZXRBdHRyaWJ1dGUocm93
c3BhbkF0dHIsIFN0cmluZzo6bnVtYmVyKG4pKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxF
bGVtZW50OjpzY29wZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShzY29wZUF0
dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRTY29wZShjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShzY29wZUF0dHIsIHZhbHVlKTsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1l
bnQ6OnNldFZBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2
YWxpZ25BdHRyLCB2YWx1ZSk7CisgICAgX3NwYW4gPSAodGFnTmFtZS5tYXRjaGVzKGNvbGdyb3Vw
VGFnKSA/IDAgOiAxKTsKIH0KIAotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojp3aWR0aCgp
IGNvbnN0CitIVE1MVGFnU3RhdHVzIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmVuZFRhZ1JlcXVpcmVt
ZW50KCkgY29uc3QKIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7CisgICAg
cmV0dXJuIGhhc0xvY2FsTmFtZShjb2xUYWcpID8gVGFnU3RhdHVzRm9yYmlkZGVuIDogVGFnU3Rh
dHVzT3B0aW9uYWw7CiB9CiAKLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFdpZHRoKGNv
bnN0IFN0cmluZyAmdmFsdWUpCitpbnQgSFRNTFRhYmxlQ29sRWxlbWVudDo6dGFnUHJpb3JpdHko
KSBjb25zdAogewotICAgIHNldEF0dHJpYnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKKyAgICByZXR1
cm4gaGFzTG9jYWxOYW1lKGNvbFRhZykgPyAwIDogMTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1IVE1MVGFibGVDb2xFbGVtZW50OjpIVE1MVGFibGVDb2xFbGVtZW50KGNvbnN0IFF1YWxp
ZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MVGFibGVQYXJ0RWxl
bWVudCh0YWdOYW1lLCBkb2MpCitib29sIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmNoZWNrRFREKGNv
bnN0IE5vZGUqIG5ld0NoaWxkKQogewotICAgIF9zcGFuID0gKHRhZ05hbWUubWF0Y2hlcyhjb2xn
cm91cFRhZykgPyAwIDogMSk7CisgICAgcmV0dXJuIGhhc0xvY2FsTmFtZShjb2xncm91cFRhZykg
JiYgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoY29sVGFnKTsKIH0KIAogYm9vbCBIVE1MVGFibGVDb2xF
bGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRB
dHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdApAQCAtMTMwMCwzNSArMTMzLDQgQEAgdm9pZCBI
VE1MVGFibGVDb2xFbGVtZW50OjpzZXRXaWR0aChjb25zdAogICAgIHNldEF0dHJpYnV0ZSh3aWR0
aEF0dHIsIHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIEhUTUxUYWJs
ZUNhcHRpb25FbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1l
LCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFt
ZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNhcHRpb247Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSFRNTEVsZW1lbnQ6Om1hcFRvRW50cnko
YXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6OnBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0
ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNF
bXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQ0FQVElP
Tl9TSURFLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnQ6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2FwdGlv
bkVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWdu
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6OnNldEFsaWduKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwot
fQotCiB9CkluZGV4OiBodG1sL0hUTUxUYWJsZUNlbGxFbGVtZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBodG1sL0hUTUxUYWJsZUNlbGxFbGVtZW50LmNwcAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1s
L0hUTUxUYWJsZUNlbGxFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsOTgzICsyMywy
OCBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBs
YWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KLQog
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImh0bWxfdGFibGVpbXBsLmgiCisjaW5jbHVk
ZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKIAotI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIK
LSNpbmNsdWRlICJOb2RlTGlzdC5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlLmgiCi0jaW5jbHVk
ZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDb2wuaCIKLSNpbmNs
dWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBsLmgiCi0j
aW5jbHVkZSAiY3NzaGVscGVyLmgiCiAjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgotI2lu
Y2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKICNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgi
Ci0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5j
bHVkZSAiSFRNTFRhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLUhU
TUxUYWJsZUVsZW1lbnQ6OkhUTUxUYWJsZUVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgOiBIVE1M
RWxlbWVudCh0YWJsZVRhZywgZG9jKQotewotICAgIHRDYXB0aW9uID0gMDsKLSAgICBoZWFkID0g
MDsKLSAgICBmb290ID0gMDsKLSAgICBmaXJzdEJvZHkgPSAwOwotCi0gCi0gICAgcGFkZGluZyA9
IDE7Ci0gICAgCi0gICAgbV9ub0JvcmRlciA9IHRydWU7Ci0gICAgbV9zb2xpZCA9IGZhbHNlOwot
fQotCi1IVE1MVGFibGVFbGVtZW50Ojp+SFRNTFRhYmxlRWxlbWVudCgpCi17Ci0gICAgaWYgKGZp
cnN0Qm9keSkKLSAgICAgICAgZmlyc3RCb2R5LT5kZXJlZigpOwotfQotCi1ib29sIEhUTUxUYWJs
ZUVsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBu
ZXdDaGlsZC0+aXNUZXh0Tm9kZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcp
IHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNvbFRhZykgfHwgbmV3Q2hpbGQt
Pmhhc1RhZ05hbWUoY29sZ3JvdXBUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdO
YW1lKHRoZWFkVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwKLSAgICAg
ICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGJvZHlUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdO
YW1lKGZvcm1UYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRh
Zyk7Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENhcHRpb24oIEhUTUxUYWJsZUNh
cHRpb25FbGVtZW50ICpjICkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAo
Tm9kZSAqb2MgPSB0Q2FwdGlvbikKLSAgICAgICAgcmVwbGFjZUNoaWxkKGMsIG9jLCBlYyk7Ci0g
ICAgZWxzZQotICAgICAgICBpbnNlcnRCZWZvcmUoYywgZmlyc3RDaGlsZCgpLCBlYyk7Ci0gICAg
dENhcHRpb24gPSBjOwotICAgIHJldHVybiB0Q2FwdGlvbjsKLX0KLQotTm9kZSogSFRNTFRhYmxl
RWxlbWVudDo6c2V0VEhlYWQoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqaCA9IGhlYWQpCi0gICAgICAgIHJl
cGxhY2VDaGlsZChzLCBoLCBlYyk7Ci0gICAgZWxzZSBpZiAoZm9vdCkKLSAgICAgICAgaW5zZXJ0
QmVmb3JlKHMsIGZvb3QsIGVjKTsKLSAgICBlbHNlIGlmIChmaXJzdEJvZHkpCi0gICAgICAgIGlu
c2VydEJlZm9yZShzLCBmaXJzdEJvZHksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGFwcGVuZENo
aWxkKHMsIGVjKTsKLSAgICBoZWFkID0gczsKLSAgICByZXR1cm4gaGVhZDsKLX0KLQotTm9kZSog
SFRNTFRhYmxlRWxlbWVudDo6c2V0VEZvb3QoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkK
LXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqZiA9IGZvb3QpCi0g
ICAgICAgIHJlcGxhY2VDaGlsZChzLCBmLCBlYyk7Ci0gICAgZWxzZSBpZiAoZmlyc3RCb2R5KQot
ICAgICAgICBpbnNlcnRCZWZvcmUocywgZmlyc3RCb2R5LCBlYyk7Ci0gICAgZWxzZQotICAgICAg
ICBhcHBlbmRDaGlsZChzLCBlYyk7Ci0gICAgZm9vdCA9IHM7Ci0gICAgcmV0dXJuIGZvb3Q7Ci19
Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRCb2R5KCBIVE1MVGFibGVTZWN0aW9uRWxl
bWVudCAqcyApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9kZSogcjsKLSAg
ICBzLT5yZWYoKTsKLSAgICBpZiAoTm9kZSAqZmIgPSBmaXJzdEJvZHkpIHsKLSAgICAgICAgcmVw
bGFjZUNoaWxkKHMsIGZiLCBlYyk7Ci0gICAgICAgIGZiLT5kZXJlZigpOwotICAgICAgICByID0g
czsKLSAgICB9IGVsc2UKLSAgICAgICAgYXBwZW5kQ2hpbGQocywgZWMpOwotICAgIGZpcnN0Qm9k
eSA9IHM7Ci0gICAgcmV0dXJuIGZpcnN0Qm9keTsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJs
ZUVsZW1lbnQ6OmNyZWF0ZVRIZWFkKCAgKQotewotICAgIGlmKCFoZWFkKQotICAgIHsKLSAgICAg
ICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIGhlYWQgPSBuZXcgSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQodGhlYWRUYWcsIGRvY3VtZW50KCksIHRydWUgLyogaW1wbGljaXQgKi8pOwot
ICAgICAgICBpZihmb290KQotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKCBoZWFkLCBmb290LCBl
YyApOwotICAgICAgICBlbHNlIGlmKGZpcnN0Qm9keSkKLSAgICAgICAgICAgIGluc2VydEJlZm9y
ZSggaGVhZCwgZmlyc3RCb2R5LCBlYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGVu
ZENoaWxkKGhlYWQsIGVjKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlRWxlbWVudDo6ZGVsZXRlVEhlYWQoICApCi17Ci0gICAgaWYoaGVhZCkgewotICAgICAg
ICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgaGVhZC0+cmVmKCk7Ci0gICAgICAgIEhU
TUxFbGVtZW50OjpyZW1vdmVDaGlsZChoZWFkLCBlYyk7Ci0gICAgICAgIGhlYWQtPmRlcmVmKCk7
Ci0gICAgfQotICAgIGhlYWQgPSAwOwotfQotCi1IVE1MRWxlbWVudCAqSFRNTFRhYmxlRWxlbWVu
dDo6Y3JlYXRlVEZvb3QoICApCi17Ci0gICAgaWYgKCFmb290KQotICAgIHsKLSAgICAgICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIGZvb3QgPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVs
ZW1lbnQodGZvb3RUYWcsIGRvY3VtZW50KCksIHRydWUgLyppbXBsaWNpdCAqLyk7Ci0gICAgICAg
IGlmIChmaXJzdEJvZHkpCi0gICAgICAgICAgICBpbnNlcnRCZWZvcmUoIGZvb3QsIGZpcnN0Qm9k
eSwgZWMgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXBwZW5kQ2hpbGQoZm9vdCwgZWMp
OwotICAgIH0KLSAgICByZXR1cm4gZm9vdDsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50Ojpk
ZWxldGVURm9vdCggICkKLXsKLSAgICBpZihmb290KSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOwotICAgICAgICBmb290LT5yZWYoKTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92
ZUNoaWxkKGZvb3QsIGVjKTsKLSAgICAgICAgZm9vdC0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgZm9v
dCA9IDA7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVDYXB0aW9u
KCAgKQotewotICAgIGlmKCF0Q2FwdGlvbikKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOwotICAgICAgICB0Q2FwdGlvbiA9IG5ldyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChk
b2N1bWVudCgpKTsKLSAgICAgICAgaW5zZXJ0QmVmb3JlKCB0Q2FwdGlvbiwgZmlyc3RDaGlsZCgp
LCBlYyApOwotICAgIH0KLSAgICByZXR1cm4gdENhcHRpb247Ci19Ci0KLXZvaWQgSFRNTFRhYmxl
RWxlbWVudDo6ZGVsZXRlQ2FwdGlvbiggICkKLXsKLSAgICBpZih0Q2FwdGlvbikgewotICAgICAg
ICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgdENhcHRpb24tPnJlZigpOwotICAgICAg
ICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQodENhcHRpb24sIGVjKTsKLSAgICAgICAgdENhcHRp
b24tPmRlcmVmKCk7Ci0gICAgfQotICAgIHRDYXB0aW9uID0gMDsKLX0KLQotSFRNTEVsZW1lbnQg
KkhUTUxUYWJsZUVsZW1lbnQ6Omluc2VydFJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBl
YykKLXsKLSAgICAvLyBUaGUgRE9NIHJlcXVpcmVzIHRoYXQgd2UgY3JlYXRlIGEgdGJvZHkgaWYg
dGhlIHRhYmxlIGlzIGVtcHR5Ci0gICAgLy8gKGNmIERPTTJUUyBIVE1MVGFibGVFbGVtZW50MzEg
dGVzdCkKLSAgICAvLyAobm90ZTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSAiaWYgdGhlIHRhYmxl
IGhhcyBubyBzZWN0aW9ucyIsIHNpbmNlIHdlIGNhbiBoYXZlCi0gICAgLy8gPFRBQkxFPjxUUj4p
Ci0gICAgaWYoIWZpcnN0Qm9keSAmJiAhaGVhZCAmJiAhZm9vdCkKLSAgICAgICAgc2V0VEJvZHko
IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCh0Ym9keVRhZywgZG9jdW1lbnQoKSwgdHJ1ZSAv
KiBpbXBsaWNpdCAqLykgKTsKLQotICAgIC8vIElFIHRyZWF0cyBpbmRleD0tMSBhcyBkZWZhdWx0
IHZhbHVlIG1lYW5pbmcgJ2FwcGVuZCBhZnRlciBsYXN0JwotICAgIC8vIFRoaXMgaXNuJ3QgaW4g
dGhlIERPTS4gU28sIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0gICAgSFRNTFRhYmxlU2VjdGlvbkVs
ZW1lbnQqIHNlY3Rpb24gPSAwTDsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogbGFzdFNl
Y3Rpb24gPSAwTDsKLSAgICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIGJvb2wgYXBw
ZW5kID0gKGluZGV4ID09IC0xKTsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICgg
OyBub2RlICYmIChpbmRleD49MCB8fCBhcHBlbmQpIDsgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5n
KCkgKQotICAgIHsKLSAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgMiB0Zm9vdCBlbGVtZW50cyBp
biB0aGUgdGFibGUuIE9ubHkgdGhlIGZpcnN0IG9uZSBpcyB0aGUgImZvb3QiLCB0aGF0J3Mgd2h5
IHdlIGhhdmUgdGhlIG1vcmUKLSAgICAgICAgLy8gY29tcGxpY2F0ZWQgaWYgc3RhdGVtZW50IGJl
bG93LgotICAgICAgICBpZiAobm9kZSAhPSBmb290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRoZWFk
VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRmb290VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRi
b2R5VGFnKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihub2RlKTsKLSAgICAgICAgICAgIGxhc3RTZWN0aW9u
ID0gc2VjdGlvbjsKLSAgICAgICAgICAgIGlmICghYXBwZW5kKSB7Ci0gICAgICAgICAgICAgICAg
aW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvd3Mg
Pj0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAg
ICAgICAgaW5kZXggLT0gcm93czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAg
ICBpZiAoICFmb3VuZCAmJiBmb290ICkKLSAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGZvb3QpOwotCi0gICAgLy8gSW5kZXggPT0gMCBtZWFu
cyAiaW5zZXJ0IGJlZm9yZSBmaXJzdCByb3cgaW4gY3VycmVudCBzZWN0aW9uIgotICAgIC8vIG9y
ICJhcHBlbmQgYWZ0ZXIgbGFzdCByb3ciIChpZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VjdGlvbiBh
bnltb3JlKQotICAgIGlmICggIXNlY3Rpb24gJiYgKCBpbmRleCA9PSAwIHx8IGFwcGVuZCApICkK
LSAgICB7Ci0gICAgICAgIHNlY3Rpb24gPSBsYXN0U2VjdGlvbjsKLSAgICAgICAgaW5kZXggPSBz
ZWN0aW9uID8gc2VjdGlvbi0+bnVtUm93cygpIDogMDsKLSAgICB9Ci0gICAgaWYgKHNlY3Rpb24g
JiYgKGluZGV4ID49IDAgfHwgYXBwZW5kKSkKLSAgICAgICAgcmV0dXJuIHNlY3Rpb24tPmluc2Vy
dFJvdyhpbmRleCwgZWMpOwotICAgIGVsc2UgewotICAgICAgICAvLyBObyBtb3JlIHNlY3Rpb25z
ID0+IGluZGV4IGlzIHRvbyBiaWcKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsKLSAgICAg
ICAgcmV0dXJuIDBMOwotICAgIH0KLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVS
b3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQqIHNlY3Rpb24gPSAwTDsKLSAgICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgpOwot
ICAgIGJvb2wgbGFzdFJvdyA9IGluZGV4ID09IC0xOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50KiBsYXN0U2VjdGlvbiA9IDBMOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3Ig
KCA7IG5vZGUgOyBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSApCi0gICAgewotICAgICAgICBp
ZiAobm9kZSAhPSBmb290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBub2RlLT5o
YXNUYWdOYW1lKHRmb290VGFnKSB8fCAKLSAgICAgICAgICAgIG5vZGUtPmhhc1RhZ05hbWUodGJv
ZHlUYWcpKSkgewotICAgICAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNl
Y3Rpb25FbGVtZW50ICo+KG5vZGUpOwotICAgICAgICAgICAgbGFzdFNlY3Rpb24gPSBzZWN0aW9u
OwotICAgICAgICAgICAgaW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAgICAg
ICBpZiAoICFsYXN0Um93ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHJv
d3MgPiBpbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgaW5kZXggLT0gcm93czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg
ICBzZWN0aW9uID0gMEw7Ci0gICAgfQotICAgIGlmICggIWZvdW5kICYmIGZvb3QgKQotICAgICAg
ICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oZm9vdCk7
Ci0KLSAgICBpZiAoIGxhc3RSb3cgKQotICAgICAgICBsYXN0U2VjdGlvbi0+ZGVsZXRlUm93KCAt
MSwgZWMgKTsKLSAgICBlbHNlIGlmICggc2VjdGlvbiAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwg
c2VjdGlvbi0+bnVtUm93cygpICkKLSAgICAgICAgc2VjdGlvbi0+ZGVsZXRlUm93KCBpbmRleCwg
ZWMgKTsKLSAgICBlbHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLUNvbnRh
aW5lck5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OmFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4gY2hp
bGQpCi17Ci0gICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAgIC8v
IEZpcnN0IGFkZCB0aGUgY2hpbGQuCi0gICAgICAgIEhUTUxFbGVtZW50OjphZGRDaGlsZChjaGls
ZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBseSByZXR1cm4gb3Vyc2VsdmVzIGFzIHRoZSBjb250
YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Yg
ZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFmIGFuZCBtb3ZpbmcgaXQgc2FmZWx5IG91dCBvZiB0
aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY3JlYXRp
b24gb2YgPHRib2R5PiBlbGVtZW50cyByZWxpZXMgb24gdGhlICJjaGlsZEFsbG93ZWQiIGNoZWNr
LAotICAgIC8vIHNvIHdlIG5lZWQgdG8gZG8gaXQgZXZlbiBmb3IgWE1MIGRvY3VtZW50cy4KLSAg
ICBhc3NlcnQoY2hpbGQtPm5vZGVUeXBlKCkgIT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk7Ci0g
ICAgaWYgKCFkb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpICYmICFjaGlsZEFsbG93ZWQoY2hp
bGQuZ2V0KCkpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIENvbnRhaW5lck5vZGUqIGNvbnRh
aW5lciA9IEhUTUxFbGVtZW50OjphZGRDaGlsZChjaGlsZC5nZXQoKSk7Ci0gICAgaWYgKGNvbnRh
aW5lcikgewotICAgICAgICBpZiAoIXRDYXB0aW9uICYmIGNoaWxkLT5oYXNUYWdOYW1lKGNhcHRp
b25UYWcpKQotICAgICAgICAgICAgdENhcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVDYXB0
aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFoZWFkICYmIGNo
aWxkLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSkKLSAgICAgICAgICAgIGhlYWQgPSBzdGF0aWNfY2Fz
dDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2Ug
aWYgKCFmb290ICYmIGNoaWxkLT5oYXNUYWdOYW1lKHRmb290VGFnKSkKLSAgICAgICAgICAgIGZv
b3QgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7
Ci0gICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkgJiYgY2hpbGQtPmhhc1RhZ05hbWUodGJvZHlU
YWcpKSB7Ci0gICAgICAgICAgICBmaXJzdEJvZHkgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0
aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgICAgICBmaXJzdEJvZHktPnJlZigp
OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb250YWluZXI7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlRWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBIVE1MRWxlbWVudDo6Y2hp
bGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0gICAgaWYgKGZpcnN0Qm9keSAmJiBmaXJzdEJvZHktPnBh
cmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGZpcnN0Qm9keS0+ZGVyZWYoKTsKLSAgICAg
ICAgZmlyc3RCb2R5ID0gMDsKLSAgICB9Ci19IAotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6Om1h
cFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRBdHRy
KSB7Ci0gICAgICAgIHJlc3VsdCA9IChNYXBwZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRyeSAr
IGRvY3VtZW50KCktPmRvY0lEKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAg
IAotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0g
aGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAgICAg
ICBhdHRyTmFtZSA9PSBjZWxsc3BhY2luZ0F0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdnNw
YWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoc3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0
dHJOYW1lID09IHZhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYm9y
ZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYm9yZGVyQXR0cikg
ewotICAgICAgICByZXN1bHQgPSBlVGFibGU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9
IGVUYWJsZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0gICAgcmV0dXJu
IEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhU
TUxUYWJsZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0
cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRD
U1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3Ro
KGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYm9yZGVyQXR0cikgIHsKLSAgICAgICAgbV9ub0JvcmRlciA9IHRydWU7
Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkpIHsKLSAgICAgICAgICAgIFJlZlB0cjxDU1NWYWx1
ZT4gdmFsID0gYXR0ci0+ZGVjbCgpLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU19QUk9QX0JPUkRF
Ul9MRUZUX1dJRFRIKTsKLSAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpIHsKLSAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbVZhbCA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsLmdldCgpKTsKLSAgICAgICAgICAgICAg
ICBtX25vQm9yZGVyID0gIXByaW1WYWwtPmdldEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWU6
OkNTU19OVU1CRVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYg
KCFhdHRyLT5pc051bGwoKSkgewotICAgICAgICAgICAgLy8gIyMjIHRoaXMgbmVlZHMgbW9yZSB3
b3JrLCBhcyB0aGUgYm9yZGVyIHZhbHVlIGlzIG5vdCBvbmx5Ci0gICAgICAgICAgICAvLyAgICAg
dGhlIGJvcmRlciBvZiB0aGUgYm94LCBidXQgYWxzbyBiZXR3ZWVuIHRoZSBjZWxscwotICAgICAg
ICAgICAgaW50IGJvcmRlciA9IDA7Ci0gICAgICAgICAgICBpZiAoYXR0ci0+aXNFbXB0eSgpKQot
ICAgICAgICAgICAgICAgIGJvcmRlciA9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgYm9yZGVyID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotI2lmZGVmIERFQlVHX0RSQVdf
Qk9SREVSCi0gICAgICAgICAgICBib3JkZXI9MTsKLSNlbmRpZgotICAgICAgICAgICAgbV9ub0Jv
cmRlciA9ICFib3JkZXI7Ci0gICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1Bf
Qk9SREVSX1dJRFRILCBTdHJpbmc6Om51bWJlcihib3JkZXIpKTsKLSAgICAgICAgfQotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKSB7Ci0gICAgICAgIGFkZENTU0Nv
bG9yKGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJvcmRlcmNvbG9yQXR0cikgewotICAgICAgICBt
X3NvbGlkID0gYXR0ci0+ZGVjbCgpOwotICAgICAgICBpZiAoIWF0dHItPmRlY2woKSAmJiAhYXR0
ci0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9C
T1JERVJfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfQk9SREVSX1RPUF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAg
ICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBD
U1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9Q
X0JPUkRFUl9MRUZUX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1By
b3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7
Ci0gICAgICAgICAgICBtX3NvbGlkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBX
ZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0
eSgpKQotICAgICAgICAgICAgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNL
R1JPVU5EX0lNQUdFLCBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBmcmFtZUF0dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBydWxlc0F0dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjZWxs
c3BhY2luZ0F0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9CT1JERVJfU1BBQ0lORywgYXR0
ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2VsbHBhZGRpbmdB
dHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICBwYWRkaW5nID0gbWF4KCAwLCBhdHRyLT52YWx1ZSgpLnRvSW50KCkgKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgcGFkZGluZyA9IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJl
bmRlcmVyKCktPmlzVGFibGUoKSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFi
bGUgKj4ocmVuZGVyZXIoKSktPnNldENlbGxQYWRkaW5nKHBhZGRpbmcpOwotICAgICAgICAgICAg
aWYgKCFyZW5kZXJlcigpLT5uZWVkc0xheW91dCgpKQotICAgICAgICAgICAgICAgIHJlbmRlcmVy
KCktPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gY29sc0F0dHIpIHsKLSAgICAgICAgLy8gIyMjCi0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwg
Q1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFk
ZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBpZiAo
IWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0
ciwgQ1NTX1BST1BfRkxPQVQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IHZhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1w
dHkoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJQ0FM
X0FMSUdOLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnQ6
OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJh
dGlvbiogSFRNTFRhYmxlRWxlbWVudDo6YWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpCi17
Ci0gICAgaWYgKG1fbm9Cb3JkZXIpCi0gICAgICAgIHJldHVybiAwOwotICAgIE1hcHBlZEF0dHJp
YnV0ZSBhdHRyKHRhYmxlYm9yZGVyQXR0ciwgbV9zb2xpZCA/ICJzb2xpZCIgOiAib3V0c2V0Iik7
Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRBdHRy
aWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0cik7Ci0gICAgaWYgKCFkZWNsKSB7Ci0gICAgICAg
IGRlY2wgPSBuZXcgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgICAgIGRl
Y2wtPnNldFBhcmVudChkb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgICAgIGRlY2wt
PnNldE5vZGUodGhpcyk7Ci0gICAgICAgIGRlY2wtPnNldFN0cmljdFBhcnNpbmcoZmFsc2UpOyAv
LyBNYXBwZWQgYXR0cmlidXRlcyBhcmUganVzdCBhbHdheXMgcXVpcmt5LgotICAgICAgICAKLSAg
ICAgICAgZGVjbC0+cmVmKCk7IC8vIFRoaXMgc2luZ2xlIHJlZiBwaW5zIHVzIGluIHRoZSB0YWJs
ZSB1bnRpbCB0aGUgZG9jdW1lbnQgZGllcy4KLQotICAgICAgICBpbnQgdiA9IG1fc29saWQgPyBD
U1NfVkFMX1NPTElEIDogQ1NTX1ZBTF9PVVRTRVQ7Ci0gICAgICAgIGRlY2wtPnNldFByb3BlcnR5
KENTU19QUk9QX0JPUkRFUl9UT1BfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+c2V0
UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAg
ICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfTEVGVF9TVFlMRSwgdiwgZmFsc2Up
OwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfUklHSFRfU1RZTEUs
IHYsIGZhbHNlKTsKLQotICAgICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50
LCAmYXR0ciwgZGVjbCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgZGVj
bC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgZGVjbC0+c2V0TWFwcGVkU3RhdGUoZVBlcnNpc3RlbnQs
IGF0dHIubmFtZSgpLCBhdHRyLnZhbHVlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZGVjbDsKLX0K
LQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJsZUVsZW1lbnQ6OmdldFNoYXJl
ZENlbGxEZWNsKCkKLXsKLSAgICBNYXBwZWRBdHRyaWJ1dGUgYXR0cihjZWxsYm9yZGVyQXR0ciwg
bV9ub0JvcmRlciA/ICJub25lIiA6IChtX3NvbGlkID8gInNvbGlkIiA6ICJpbnNldCIpKTsKLSAg
ICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9IGdldE1hcHBlZEF0dHJpYnV0
ZURlY2woZVBlcnNpc3RlbnQsICZhdHRyKTsKLSAgICBpZiAoIWRlY2wpIHsKLSAgICAgICAgZGVj
bCA9IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigwKTsKLSAgICAgICAgZGVjbC0+
c2V0UGFyZW50KGRvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICAgICAgZGVjbC0+c2V0
Tm9kZSh0aGlzKTsKLSAgICAgICAgZGVjbC0+c2V0U3RyaWN0UGFyc2luZyhmYWxzZSk7IC8vIE1h
cHBlZCBhdHRyaWJ1dGVzIGFyZSBqdXN0IGFsd2F5cyBxdWlya3kuCi0gICAgICAgIAotICAgICAg
ICBkZWNsLT5yZWYoKTsgLy8gVGhpcyBzaW5nbGUgcmVmIHBpbnMgdXMgaW4gdGhlIHRhYmxlIHVu
dGlsIHRoZSB0YWJsZSBkaWVzLgotICAgICAgICAKLSAgICAgICAgaWYgKG1fbm9Cb3JkZXIpCi0g
ICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfV0lEVEgsICIwIiwg
ZmFsc2UpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENT
U19QUk9QX0JPUkRFUl9XSURUSCwgIjFweCIsIGZhbHNlKTsKLSAgICAgICAgICAgIGludCB2ID0g
bV9zb2xpZCA/IENTU19WQUxfU09MSUQgOiBDU1NfVkFMX0lOU0VUOwotICAgICAgICAgICAgZGVj
bC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1RPUF9TVFlMRSwgdiwgZmFsc2UpOwotICAg
ICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwg
diwgZmFsc2UpOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVS
X0xFRlRfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENT
U19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVjbC0+
c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0NPTE9SLCAiaW5oZXJpdCIsIGZhbHNlKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHNldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQsICZh
dHRyLCBkZWNsKTsKLSAgICAgICAgZGVjbC0+c2V0UGFyZW50KDApOwotICAgICAgICBkZWNsLT5z
ZXROb2RlKDApOwotICAgICAgICBkZWNsLT5zZXRNYXBwZWRTdGF0ZShlUGVyc2lzdGVudCwgYXR0
ci5uYW1lKCksIGF0dHIudmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWNsOwotfQotCi12
b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgYXNzZXJ0KCFtX2F0dGFjaGVk
KTsKLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVu
ZGVyZXIoKS0+aXNUYWJsZSgpKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihy
ZW5kZXJlcigpKS0+c2V0Q2VsbFBhZGRpbmcoIHBhZGRpbmcgKTsKLX0KLQotYm9vbCBIVE1MVGFi
bGVFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cjsKLX0KLQotUmVmUHRyPEhUTUxD
b2xsZWN0aW9uPiBIVE1MVGFibGVFbGVtZW50Ojpyb3dzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRy
PEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246
OlRBQkxFX1JPV1MpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVFbGVt
ZW50Ojp0Qm9kaWVzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcg
SFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246OlRBQkxFX1RCT0RJRVMpKTsKLX0K
LQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0
QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRy
LCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1M
VGFibGVFbGVtZW50OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVt
ZW50Ojpib3JkZXIoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYm9yZGVyQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0Qm9yZGVyKGNvbnN0IFN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJvcmRlckF0dHIsIHZhbHVlKTsKLX0KLQotU3Ry
aW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmNlbGxQYWRkaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGNlbGxwYWRkaW5nQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVu
dDo6c2V0Q2VsbFBhZGRpbmcoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUoY2VsbHBhZGRpbmdBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50
OjpjZWxsU3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjZWxsc3Bh
Y2luZ0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENlbGxTcGFjaW5nKGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNlbGxzcGFjaW5nQXR0ciwg
dmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6ZnJhbWUoKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoZnJhbWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVF
bGVtZW50OjpzZXRGcmFtZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShmcmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OnJ1bGVz
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHJ1bGVzQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0UnVsZXMoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUocnVsZXNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVF
bGVtZW50OjpzdW1tYXJ5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHN1bW1h
cnlBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRTdW1tYXJ5KGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHN1bW1hcnlBdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50Ojp3aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNl
dFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0
ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIEhUTUxUYWJsZVBh
cnRFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBw
ZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSBi
YWNrZ3JvdW5kQXR0cikgewotICAgICAgICByZXN1bHQgPSAoTWFwcGVkQXR0cmlidXRlRW50cnkp
KGVMYXN0RW50cnkgKyBkb2N1bWVudCgpLT5kb2NJRCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAgICAg
ICAgYXR0ck5hbWUgPT0gYm9yZGVyY29sb3JBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZh
bGlnbkF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBy
ZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAot
ICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNlbGw7
IC8vIEFsbCB0YWJsZSBwYXJ0cyB3aWxsIGp1c3Qgc2hhcmUgaW4gdGhlIFREIHNwYWNlLgotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBU
b0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZVBhcnRFbGVtZW50
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYg
KGF0dHItPm5hbWUoKSA9PSBiZ2NvbG9yQXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihhdHRy
LCBDU1NfUFJPUF9CQUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2Ug
aWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICBTdHJpbmcgdXJs
ID0gV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGlmICghdXJsLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0ltYWdlUHJvcGVydHkoYXR0ciwgQ1NTX1BST1Bf
QkFDS0dST1VORF9JTUFHRSwgZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKSk7Ci0gICAgfSBl
bHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIGlmICgh
YXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFkZENTU0NvbG9yKGF0dHIs
IENTU19QUk9QX0JPUkRFUl9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgICAgICBhZGRD
U1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfVE9QX1NUWUxFLCBDU1NfVkFMX1NPTElE
KTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9CT1RU
T01fU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0
ciwgQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAg
ICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1JJR0hUX1NUWUxFLCBDU1Nf
VkFMX1NPTElEKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZh
bGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJQ0FMX0FMSUdOLCBhdHRy
LT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsK
LSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2ID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAg
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHYsICJtaWRkbGUiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZSh2
LCAiY2VudGVyIikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9U
RVhUX0FMSUdOLCBDU1NfVkFMX19XRUJLSVRfQ0VOVEVSKTsKLSAgICAgICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UodiwgImFic21pZGRsZSIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVy
dHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9DRU5URVIpOwotICAgICAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAibGVmdCIpKQotICAgICAgICAgICAgYWRkQ1NT
UHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lUX0xFRlQp
OwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAicmlnaHQiKSkKLSAgICAg
ICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIENTU19WQUxf
X1dFQktJVF9SSUdIVCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5
KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIHYpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFt
ZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHko
KSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRB
dHRyaWJ1dGUoYXR0cik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQ6OkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUm
IHRhZ05hbWUsIERvY3VtZW50ICpkb2MsIGJvb2wgaW1wbGljaXQpCi0gICAgOiBIVE1MVGFibGVQ
YXJ0RWxlbWVudCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9pbXBsaWNpdCA9IGltcGxpY2l0Owot
fQotCi1ib29sIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBu
ZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodHJUYWcpIHx8IG5l
d0NoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNU
YWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQotewotICAgIGlmIChjaGls
ZC0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJzdCBhZGQgdGhlIGNoaWxk
LgotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotCi0gICAg
ICAgIC8vIE5vdyBzaW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUgY29udGFpbmVyIHRvIGlu
c2VydCBpbnRvLgotICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRlbW90aW5nIHRo
ZSBmb3JtIHRvIGEgbGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQgb2YgdGhlIHdheS4KLSAg
ICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRFbGVt
ZW50OjphZGRDaGlsZChjaGlsZCk7Ci19Ci0KLS8vIHRoZXNlIGZ1bmN0aW9ucyBhcmUgcmF0aGVy
IHNsb3csIHNpbmNlIHdlIG5lZWQgdG8gZ2V0IHRoZSByb3cgYXQKLS8vIHRoZSBpbmRleC4uLiBi
dXQgdGhleSBhcmVuJ3QgdXNlZCBkdXJpbmcgdXN1YWwgSFRNTCBwYXJzaW5nIGFueXdheQotSFRN
TEVsZW1lbnQgKkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjppbnNlcnRSb3coIGludCBpbmRleCwg
RXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlUm93RWxlbWVudCAqciA9IDBMOwot
ICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50IG51
bVJvd3MgPSBjaGlsZHJlbiA/IChpbnQpY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBpZiAo
IGluZGV4IDwgLTEgfHwgaW5kZXggPiBudW1Sb3dzICkgewotICAgICAgICBlYyA9IElOREVYX1NJ
WkVfRVJSOyAvLyBwZXIgdGhlIERPTQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBy
ID0gbmV3IEhUTUxUYWJsZVJvd0VsZW1lbnQoZG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmICggbnVt
Um93cyA9PSBpbmRleCB8fCBpbmRleCA9PSAtMSApCi0gICAgICAgICAgICBhcHBlbmRDaGlsZChy
LCBlYyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgTm9kZSAqbjsKLSAgICAgICAgICAg
IGlmIChpbmRleCA8IDEpCi0gICAgICAgICAgICAgICAgbiA9IGZpcnN0Q2hpbGQoKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgpOwot
ICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKHIsIG4sIGVjICk7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmRlbGV0ZVJv
dyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQdHI8Tm9kZUxpc3Q+
IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1Sb3dzID0gY2hpbGRyZW4gPyAo
aW50KWNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAg
ICBpbmRleCA9IG51bVJvd3MgLSAxOwotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVt
Um93cykgewotICAgICAgICBSZWZQdHI8Tm9kZT4gcm93ID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgp
OwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQocm93LmdldCgpLCBlYyk7Ci0gICAg
fSBlbHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLWludCBIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDo6bnVtUm93cygpIGNvbnN0Ci17Ci0gICAgaW50IHJvd3MgPSAwOwotICAg
IGNvbnN0IE5vZGUgKm4gPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4pIHsKLSAgICAgICAg
aWYgKG4tPmhhc1RhZ05hbWUodHJUYWcpKQotICAgICAgICAgICAgcm93cysrOwotICAgICAgICBu
ID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcm93czsKLX0KLQotU3Ry
aW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShh
bGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ojpj
aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnNldENoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17
Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoY2hhcm9mZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpzZXRD
aE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0
ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnZBbGlnbigp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWxpZ25BdHRyKTsKLX0KLQotdm9p
ZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotUmVmUHRyPEhU
TUxDb2xsZWN0aW9uPiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6cm93cygpCi17Ci0gICAgcmV0
dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xsZWN0aW9uKHRoaXMsIEhUTUxD
b2xsZWN0aW9uOjpUQUJMRV9ST1dTKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9v
bCBIVE1MVGFibGVSb3dFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsK
LSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGRUYWcpIHx8IG5ld0NoaWxkLT5oYXNU
YWdOYW1lKHRoVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFn
KSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi1Db250YWluZXJOb2Rl
KiBIVE1MVGFibGVSb3dFbGVtZW50OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQot
ewotICAgIGlmIChjaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJz
dCBhZGQgdGhlIGNoaWxkLgotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQo
Y2hpbGQpOwotCi0gICAgICAgIC8vIE5vdyBzaW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUg
Y29udGFpbmVyIHRvIGluc2VydCBpbnRvLgotICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0
IG9mIGRlbW90aW5nIHRoZSBmb3JtIHRvIGEgbGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQg
b2YgdGhlIHdheS4KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhU
TUxUYWJsZVBhcnRFbGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci19Ci0KLWludCBIVE1MVGFibGVS
b3dFbGVtZW50Ojpyb3dJbmRleCgpIGNvbnN0Ci17Ci0gICAgTm9kZSAqdGFibGUgPSBwYXJlbnRO
b2RlKCk7Ci0gICAgaWYgKCF0YWJsZSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHRhYmxlID0g
dGFibGUtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoIXRhYmxlIHx8ICF0YWJsZS0+aGFzVGFnTmFt
ZSh0YWJsZVRhZykpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8vIFRvIG1hdGNoIEZpcmVm
b3gsIHRoZSByb3cgaW5kaWNlcyB3b3JrIGxpa2UgdGhpczoKLSAgICAvLyAgIFJvd3MgZnJvbSB0
aGUgZmlyc3QgPHRoZWFkPiBhcmUgbnVtYmVyZWQgYmVmb3JlIGFsbCA8dGJvZHk+IHJvd3MuCi0g
ICAgLy8gICBSb3dzIGZyb20gdGhlIGZpcnN0IDx0Zm9vdD4gYXJlIG51bWJlcmVkIGFmdGVyIGFs
bCA8dGJvZHk+IHJvd3MuCi0gICAgLy8gICBSb3dzIGZyb20gb3RoZXIgPHRoZWFkPiBhbmQgPHRm
b290PiBlbGVtZW50cyBkb24ndCBnZXQgcm93IGluZGljZXMgYXQgYWxsLgotCi0gICAgaW50IHJJ
bmRleCA9IDA7Ci0KLSAgICBpZiAoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGhlYWQgPSBzdGF0
aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50Kj4odGFibGUpLT50SGVhZCgpKSB7Ci0gICAgICAgIGZv
ciAoTm9kZSAqcm93ID0gaGVhZC0+Zmlyc3RDaGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4dFNp
YmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKHJvdyA9PSB0aGlzKQotICAgICAgICAgICAgICAg
IHJldHVybiBySW5kZXg7Ci0gICAgICAgICAgICArK3JJbmRleDsKLSAgICAgICAgfQotICAgIH0K
LSAgICAKLSAgICBmb3IgKE5vZGUgKm5vZGUgPSB0YWJsZS0+Zmlyc3RDaGlsZCgpOyBub2RlOyBu
b2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFt
ZSh0Ym9keVRhZykpIHsKLSAgICAgICAgICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBzZWN0
aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqPihub2RlKTsKLSAgICAg
ICAgICAgIGZvciAoTm9kZSogcm93ID0gc2VjdGlvbi0+Zmlyc3RDaGlsZCgpOyByb3c7IHJvdyA9
IHJvdy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gdGhpcykK
LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJJbmRleDsKLSAgICAgICAgICAgICAgICArK3JJ
bmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudCogZm9vdCA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUVsZW1lbnQgKj4o
dGFibGUpLT50Rm9vdCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZSAqcm93ID0gZm9vdC0+Zmlyc3RD
aGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYg
KHJvdyA9PSB0aGlzKQotICAgICAgICAgICAgICAgIHJldHVybiBySW5kZXg7Ci0gICAgICAgICAg
ICArK3JJbmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFdlIGdldCBoZXJlIGZvciBy
b3dzIHRoYXQgYXJlIGluIDx0aGVhZD4gb3IgPHRmb290PiBzZWN0aW9ucyBvdGhlciB0aGFuIHRo
ZSBtYWluIGhlYWRlciBhbmQgZm9vdGVyLgotICAgIHJldHVybiAtMTsKLX0KLQotaW50IEhUTUxU
YWJsZVJvd0VsZW1lbnQ6OnNlY3Rpb25Sb3dJbmRleCgpIGNvbnN0Ci17Ci0gICAgaW50IHJJbmRl
eCA9IDA7Ci0gICAgY29uc3QgTm9kZSAqbiA9IHRoaXM7Ci0gICAgZG8gewotICAgICAgICBuID0g
bi0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIGlmIChuICYmIG4tPmhhc1RhZ05hbWUodHJU
YWcpKQotICAgICAgICAgICAgckluZGV4Kys7Ci0gICAgfQotICAgIHdoaWxlIChuKTsKLQotICAg
IHJldHVybiBySW5kZXg7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVSb3dFbGVtZW50Ojpp
bnNlcnRDZWxsKCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIEhUTUxUYWJs
ZUNlbGxFbGVtZW50ICpjID0gMEw7Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJlbiA9IGNo
aWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtQ2VsbHMgPSBjaGlsZHJlbiA/IGNoaWxkcmVuLT5sZW5n
dGgoKSA6IDA7Ci0gICAgaWYgKCBpbmRleCA8IC0xIHx8IGluZGV4ID4gbnVtQ2VsbHMgKQotICAg
ICAgICBlYyA9IElOREVYX1NJWkVfRVJSOyAvLyBwZXIgdGhlIERPTQotICAgIGVsc2UKLSAgICB7
Ci0gICAgICAgIGMgPSBuZXcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQodGRUYWcsIGRvY3VtZW50KCkp
OwotICAgICAgICBpZihudW1DZWxscyA9PSBpbmRleCB8fCBpbmRleCA9PSAtMSkKLSAgICAgICAg
ICAgIGFwcGVuZENoaWxkKGMsIGVjKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBOb2Rl
ICpuOwotICAgICAgICAgICAgaWYoaW5kZXggPCAxKQotICAgICAgICAgICAgICAgIG4gPSBmaXJz
dENoaWxkKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbiA9IGNoaWxkcmVu
LT5pdGVtKGluZGV4KTsKLSAgICAgICAgICAgIGluc2VydEJlZm9yZShjLCBuLCBlYyk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVu
dDo6ZGVsZXRlQ2VsbCggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQ
dHI8Tm9kZUxpc3Q+IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1DZWxscyA9
IGNoaWxkcmVuID8gY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBpZiAoaW5kZXggPT0gLTEg
KQotICAgICAgICBpbmRleCA9IG51bUNlbGxzLTE7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5k
ZXggPCBudW1DZWxscykgewotICAgICAgICBSZWZQdHI8Tm9kZT4gcm93ID0gY2hpbGRyZW4tPml0
ZW0oaW5kZXgpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQocm93LmdldCgpLCBl
Yyk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLVJlZlB0
cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlUm93RWxlbWVudDo6Y2VsbHMoKQotewotICAgIHJl
dHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb24+KG5ldyBIVE1MQ29sbGVjdGlvbih0aGlzLCBIVE1M
Q29sbGVjdGlvbjo6VFJfQ0VMTFMpKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50Ojpz
ZXRDZWxscyhIVE1MQ29sbGVjdGlvbiAqLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBlYyA9
IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0Vs
ZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0
cmluZyBIVE1MVGFibGVSb3dFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50
OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJn
Y29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50OjpjaCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTFRhYmxlUm93RWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0Vs
ZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZB
dHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1l
bnQ6OnNldFZBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2
YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogSFRNTFRhYmxl
Q2VsbEVsZW1lbnQ6OkhUTUxUYWJsZUNlbGxFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRh
Z05hbWUsIERvY3VtZW50ICpkb2MpCi0gIDogSFRNTFRhYmxlUGFydEVsZW1lbnQodGFnTmFtZSwg
ZG9jKQorICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQodGFnTmFtZSwgZG9jKQorICAgICwgX3Jv
dygtMSkKKyAgICAsIF9jb2woLTEpCisgICAgLCByU3BhbigxKQorICAgICwgY1NwYW4oMSkKKyAg
ICAsIHJvd0hlaWdodCgwKQorICAgICwgbV9zb2xpZChmYWxzZSkKIHsKLSAgICBfY29sID0gLTE7
Ci0gICAgX3JvdyA9IC0xOwotICAgIGNTcGFuID0gclNwYW4gPSAxOwotICAgIHJvd0hlaWdodCA9
IDA7Ci0gICAgbV9zb2xpZCA9IGZhbHNlOwogfQogCiBIVE1MVGFibGVDZWxsRWxlbWVudDo6fkhU
TUxUYWJsZUNlbGxFbGVtZW50KCkKQEAgLTEyMTQsMTIxICsyNTksNCBAQCB2b2lkIEhUTUxUYWJs
ZUNlbGxFbGVtZW50OjpzZXRXaWR0aChjb25zCiAgICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0ciwg
dmFsdWUpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJsZUNvbEVsZW1lbnQ6
OkhUTUxUYWJsZUNvbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1l
bnQgKmRvYykKLSAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05hbWUsIGRvYykKLXsKLSAg
ICBfc3BhbiA9ICh0YWdOYW1lLm1hdGNoZXMoY29sZ3JvdXBUYWcpID8gMCA6IDEpOwotfQotCi1i
b29sIEhUTUxUYWJsZUNvbEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYg
YXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYg
KGF0dHJOYW1lID09IHdpZHRoQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRF
bGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJs
ZUNvbEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikK
LXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNwYW5BdHRyKSB7Ci0gICAgICAgIF9zcGFuID0g
IWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMTsKLSAgICAgICAgaWYg
KHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNvbCgpKQotICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyVGFibGVDb2wqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJvbUVsZW1lbnQo
KTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAg
aWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0aChh
dHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Z2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6
c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25B
dHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50OjpjaCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlQ29sRWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6
OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsK
LX0KLQotdm9pZCBIVE1MVGFibGVDb2xFbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQotCi12b2lk
IEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldFNwYW4oaW50IG4pCi17Ci0gICAgc2V0QXR0cmlidXRl
KHNwYW5BdHRyLCBTdHJpbmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xF
bGVtZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsaWdu
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0
cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0K
LQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVu
dDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUod2lk
dGhBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBIVE1MVGFi
bGVDYXB0aW9uRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFt
ZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5h
bWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVDYXB0aW9uOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5
KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50Ojpw
YXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0
dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0NBUFRJ
T05fU0lERSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNhcHRp
b25FbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGln
bkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjpzZXRBbGlnbihjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsK
LX0KLQogfQpJbmRleDogaHRtbC9odG1sX3RhYmxlaW1wbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwv
aHRtbF90YWJsZWltcGwuaAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL2h0bWxfdGFibGVpbXBs
LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMzc5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMg
cGFydCBvZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGZvciBLREUuCi0gKgotICogQ29weXJpZ2h0
IChDKSAxOTk3IE1hcnRpbiBKb25lcyAobWpvbmVzQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMp
IDE5OTcgVG9yYmVuIFdlaXMgKHdlaXNAa2RlLm9yZykKLSAqICAgICAgICAgICAoQykgMTk5OCBX
YWxkbyBCYXN0aWFuIChiYXN0aWFuQGtkZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDE5OTkgTGFy
cyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqICAgICAgICAgICAoQykgMTk5OSBBbnR0aSBLb2l2
aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAw
NSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
LSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJvc3RvbiwgTUEg
MDIxMTEtMTMwNywgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIEhUTUxUYWJsZUVsZW1lbnRJbXBs
X0gKLSNkZWZpbmUgSFRNTFRhYmxlRWxlbWVudEltcGxfSAotCi0jaW5jbHVkZSAiSFRNTEVsZW1l
bnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1j
bGFzcyBIVE1MQ29sbGVjdGlvbjsKLWNsYXNzIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OwotY2xh
c3MgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7Ci1jbGFzcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDsK
LQotY2xhc3MgSFRNTFRhYmxlRWxlbWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudCB7Ci1wdWJsaWM6
Ci0gICAgZW51bSBSdWxlcyB7Ci0gICAgICAgIE5vbmUgICAgPSAweDAwLAotICAgICAgICBSR3Jv
dXBzID0gMHgwMSwKLSAgICAgICAgQ0dyb3VwcyA9IDB4MDIsCi0gICAgICAgIEdyb3VwcyAgPSAw
eDAzLAotICAgICAgICBSb3dzICAgID0gMHgwNSwKLSAgICAgICAgQ29scyAgICA9IDB4MGEsCi0g
ICAgICAgIEFsbCAgICAgPSAweDBmCi0gICAgfTsKLSAgICBlbnVtIEZyYW1lIHsKLSAgICAgICAg
Vm9pZCAgID0gMHgwMCwKLSAgICAgICAgQWJvdmUgID0gMHgwMSwKLSAgICAgICAgQmVsb3cgID0g
MHgwMiwKLSAgICAgICAgTGhzICAgID0gMHgwNCwKLSAgICAgICAgUmhzICAgID0gMHgwOCwKLSAg
ICAgICAgSHNpZGVzID0gMHgwMywKLSAgICAgICAgVnNpZGVzID0gMHgwYywKLSAgICAgICAgQm94
ICAgID0gMHgwZgotICAgIH07Ci0KLSAgICBIVE1MVGFibGVFbGVtZW50KERvY3VtZW50Kik7Ci0g
ICAgfkhUTUxUYWJsZUVsZW1lbnQoKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRU
YWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1JlcXVpcmVkOyB9Ci0gICAg
dmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA5OyB9Ci0gICAgdmlydHVh
bCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqKTsKLQotICAgIEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50KiBjYXB0aW9uKCkgY29uc3QgeyByZXR1cm4gdENhcHRpb247IH0KLSAgICBOb2RlKiBzZXRD
YXB0aW9uKEhUTUxUYWJsZUNhcHRpb25FbGVtZW50Kik7Ci0KLSAgICBIVE1MVGFibGVTZWN0aW9u
RWxlbWVudCogdEhlYWQoKSBjb25zdCB7IHJldHVybiBoZWFkOyB9Ci0gICAgTm9kZSogc2V0VEhl
YWQoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqKTsKLQotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50KiB0Rm9vdCgpIGNvbnN0IHsgcmV0dXJuIGZvb3Q7IH0KLSAgICBOb2RlKiBzZXRURm9vdChI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAgTm9kZSogc2V0VEJvZHkoSFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQqKTsKLQotICAgIEhUTUxFbGVtZW50KiBjcmVhdGVUSGVhZCgpOwotICAg
IHZvaWQgZGVsZXRlVEhlYWQoKTsKLSAgICBIVE1MRWxlbWVudCogY3JlYXRlVEZvb3QoKTsKLSAg
ICB2b2lkIGRlbGV0ZVRGb290KCk7Ci0gICAgSFRNTEVsZW1lbnQqIGNyZWF0ZUNhcHRpb24oKTsK
LSAgICB2b2lkIGRlbGV0ZUNhcHRpb24oKTsKLSAgICBIVE1MRWxlbWVudCogaW5zZXJ0Um93KGlu
dCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgZGVsZXRlUm93KGludCBpbmRleCwg
RXhjZXB0aW9uQ29kZSYpOwotCi0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiByb3dzKCk7Ci0g
ICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiB0Qm9kaWVzKCk7Ci0KLSAgICBTdHJpbmcgYWxpZ24o
KSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5n
IGJnQ29sb3IoKSBjb25zdDsKLSAgICB2b2lkIHNldEJnQ29sb3IoY29uc3QgU3RyaW5nJik7Ci0K
LSAgICBTdHJpbmcgYm9yZGVyKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRCb3JkZXIoY29uc3QgU3Ry
aW5nJik7Ci0KLSAgICBTdHJpbmcgY2VsbFBhZGRpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldENl
bGxQYWRkaW5nKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNlbGxTcGFjaW5nKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRDZWxsU3BhY2luZyhjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmlu
ZyBmcmFtZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0RnJhbWUoY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICBTdHJpbmcgcnVsZXMoKSBjb25zdDsKLSAgICB2b2lkIHNldFJ1bGVzKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIHN1bW1hcnkoKSBjb25zdDsKLSAgICB2b2lkIHNldFN1bW1hcnkoY29u
c3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgd2lkdGgoKSBjb25zdDsKLSAgICB2b2lkIHNldFdp
ZHRoKGNvbnN0IFN0cmluZyYpOwotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCBDb250
YWluZXJOb2RlKiBhZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+KTsKLSAgICB2aXJ0dWFsIHZvaWQg
Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29u
c3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRy
aWJ1dGUgKmF0dHIpOwotCi0gICAgLy8gVXNlZCB0byBvYnRhaW4gZWl0aGVyIGEgc29saWQgb3Ig
b3V0c2V0IGJvcmRlciBkZWNsLgotICAgIHZpcnR1YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRp
b24qIGFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKTsKLSAgICBDU1NNdXRhYmxlU3R5bGVE
ZWNsYXJhdGlvbiogZ2V0U2hhcmVkQ2VsbERlY2woKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhdHRh
Y2goKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlKikg
Y29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogaGVhZDsK
LSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogZm9vdDsKLSAgICBIVE1MVGFibGVTZWN0aW9u
RWxlbWVudCogZmlyc3RCb2R5OwotICAgIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KiB0Q2FwdGlv
bjsKLQotICAgIGJvb2wgbV9ub0JvcmRlciAgICAgOiAxOwotICAgIGJvb2wgbV9zb2xpZCAgICAg
ICAgOiAxOwotICAgIC8vIDE0IGJpdHMgdW51c2VkCi0gICAgdW5zaWduZWQgc2hvcnQgcGFkZGlu
ZzsKLSAgICBmcmllbmQgY2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVBhcnRFbGVtZW50IDogcHVibGljIEhUTUxF
bGVtZW50Ci0KLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVQYXJ0RWxlbWVudChjb25zdCBRdWFs
aWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCogZG9jKQotICAgICAgICA6IEhUTUxFbGVtZW50
KHRhZ05hbWUsIGRvYykKLSAgICAgICAgeyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRy
eShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJl
c3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBl
ZEF0dHJpYnV0ZSopOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGlj
OgotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05h
bWUsIERvY3VtZW50KiwgYm9vbCBpbXBsaWNpdCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0
dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gODsgfQotICAg
IHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlKik7Ci0gICAgdmlydHVhbCBDb250YWlu
ZXJOb2RlKiBhZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+KTsKLSAgICAKLSAgICBIVE1MRWxlbWVu
dCogaW5zZXJ0Um93KGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgZGVsZXRl
Um93KGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotCi0gICAgaW50IG51bVJvd3MoKSBjb25z
dDsKLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3Qg
U3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0
IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9m
Zihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyB2QWxpZ24oKSBjb25zdDsKLSAgICB2b2lk
IHNldFZBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4g
cm93cygpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVSb3dF
bGVtZW50IDogcHVibGljIEhUTUxUYWJsZVBhcnRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRN
TFRhYmxlUm93RWxlbWVudChEb2N1bWVudCogZG9jKQotICAgICAgICA6IEhUTUxUYWJsZVBhcnRF
bGVtZW50KEhUTUxOYW1lczo6dHJUYWcsIGRvYykge30KLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0
YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFs
OyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA3OyB9Ci0g
ICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqKTsKLSAgICB2aXJ0dWFsIENvbnRh
aW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4pOwotICAgIAotICAgIGludCByb3dJ
bmRleCgpIGNvbnN0OwotICAgIGludCBzZWN0aW9uUm93SW5kZXgoKSBjb25zdDsKLQotICAgIEhU
TUxFbGVtZW50KiBpbnNlcnRDZWxsKGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHZv
aWQgZGVsZXRlQ2VsbChpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIHZvaWQgc2V0
Um93SW5kZXgoaW50KTsKLQotICAgIHZvaWQgc2V0U2VjdGlvblJvd0luZGV4KGludCk7Ci0KLSAg
ICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IGNlbGxzKCk7Ci0gICAgdm9pZCBzZXRDZWxscyhIVE1M
Q29sbGVjdGlvbiAqLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25z
dDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGJnQ29s
b3IoKSBjb25zdDsKLSAgICB2b2lkIHNldEJnQ29sb3IoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBT
dHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcmKTsK
LQotICAgIFN0cmluZyB2QWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldFZBbGlnbihjb25zdCBT
dHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBuY29sczsKLX07Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxl
UGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVDZWxsRWxlbWVudChjb25zdCBR
dWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCopOwotICAgIH5IVE1MVGFibGVDZWxsRWxl
bWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkg
Y29uc3QgeyByZXR1cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQ
cmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7IH0KLQotICAgIGludCBjZWxsSW5kZXgoKSBjb25z
dDsKLQotICAgIGludCBjb2woKSBjb25zdCB7IHJldHVybiBfY29sOyB9Ci0gICAgdm9pZCBzZXRD
b2woaW50IGNvbCkgeyBfY29sID0gY29sOyB9Ci0gICAgaW50IHJvdygpIGNvbnN0IHsgcmV0dXJu
IF9yb3c7IH0KLSAgICB2b2lkIHNldFJvdyhpbnQgcikgeyBfcm93ID0gcjsgfQotCi0gICAgaW50
IGNvbFNwYW4oKSBjb25zdCB7IHJldHVybiBjU3BhbjsgfQotICAgIGludCByb3dTcGFuKCkgY29u
c3QgeyByZXR1cm4gclNwYW47IH0KLQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0
IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBj
b25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmli
dXRlKik7Ci0KLSAgICAvLyB1c2VkIGJ5IHRhYmxlIGNlbGxzIHRvIHNoYXJlIHN0eWxlIGRlY2xz
IGNyZWF0ZWQgYnkgdGhlIGVuY2xvc2luZyB0YWJsZS4KLSAgICB2aXJ0dWFsIENTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCk7Ci0gICAgCi0g
ICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSopIGNvbnN0OwotCi0gICAg
dm9pZCBzZXRDZWxsSW5kZXgoaW50KTsKLQotICAgIFN0cmluZyBhYmJyKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRBYmJyKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7
Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBheGlzKCkg
Y29uc3Q7Ci0gICAgdm9pZCBzZXRBeGlzKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGJn
Q29sb3IoKSBjb25zdDsKLSAgICB2b2lkIHNldEJnQ29sb3IoY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0g
ICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcm
KTsKLQotICAgIHZvaWQgc2V0Q29sU3BhbihpbnQpOwotCi0gICAgU3RyaW5nIGhlYWRlcnMoKSBj
b25zdDsKLSAgICB2b2lkIHNldEhlYWRlcnMoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcg
aGVpZ2h0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICBib29sIG5vV3JhcCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Tm9XcmFwKGJvb2wpOwotCi0gICAg
dm9pZCBzZXRSb3dTcGFuKGludCk7Ci0KLSAgICBTdHJpbmcgc2NvcGUoKSBjb25zdDsKLSAgICB2
b2lkIHNldFNjb3BlKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNvbnN0
OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHdpZHRo
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmKTsKLQotcHJvdGVjdGVk
OgotICAgIGludCBfcm93OwotICAgIGludCBfY29sOwotICAgIGludCByU3BhbjsKLSAgICBpbnQg
Y1NwYW47Ci0gICAgaW50IHJvd0hlaWdodDsKLSAgICBib29sIG1fc29saWQgICAgICAgIDogMTsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlQ29sRWxlbWVudCA6
IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxUYWJsZUNv
bEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqKTsKLQotICAg
IHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJu
IGhhc0xvY2FsTmFtZShIVE1MTmFtZXM6OmNvbFRhZykgPyBUYWdTdGF0dXNGb3JiaWRkZW4gOiBU
YWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3Qg
eyByZXR1cm4gaGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6Y29sVGFnKSA/IDAgOiAxOyB9Ci0gICAg
dmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKSB7IHJldHVybiBoYXNM
b2NhbE5hbWUoSFRNTE5hbWVzOjpjb2xncm91cFRhZykgJiYgbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
SFRNTE5hbWVzOjpjb2xUYWcpOyB9Ci0gICAgdm9pZCBzZXRUYWJsZShIVE1MVGFibGVFbGVtZW50
KiB0KSB7IHRhYmxlID0gdDsgfQotCi0gICAgLy8gb3ZlcnJpZGVzCi0gICAgdmlydHVhbCBib29s
IG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0
ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJp
YnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAgIGludCBzcGFuKCkgY29uc3QgeyByZXR1cm4g
X3NwYW47IH0KLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24o
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENo
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIHZvaWQgc2V0U3BhbihpbnQpOwotCi0gICAg
U3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBT
dHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBfc3BhbjsKLSAgICBIVE1MVGFibGVFbGVt
ZW50ICp0YWJsZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxl
Q2FwdGlvbkVsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFydEVsZW1lbnQKLXsKLXB1YmxpYzoK
LSAgICBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChEb2N1bWVudCAqZG9jKQotICAgICAgICA6IEhU
TUxUYWJsZVBhcnRFbGVtZW50KEhUTUxOYW1lczo6Y2FwdGlvblRhZywgZG9jKSB7fQotCi0gICAg
dmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4g
VGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0
IHsgcmV0dXJuIDU7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBR
dWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29u
c3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0
ZSopOwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25z
dCBTdHJpbmcmKTsKLX07Ci0KLX0gLy9uYW1lc3BhY2UKLQotI2VuZGlmCkluZGV4OiBodG1sL0hU
TUxUYWJsZUNhcHRpb25FbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBodG1sL0hUTUxUYWJsZUNh
cHRpb25FbGVtZW50LmNwcAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxUYWJsZUNhcHRp
b25FbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsMTI4NSArMjMsMjEgQEAKICAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRl
IDMzMCwKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCi0KICNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJodG1sX3RhYmxlaW1wbC5oIgorI2luY2x1ZGUgIkhUTUxUYWJs
ZUNhcHRpb25FbGVtZW50LmgiCiAKLSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVk
ZSAiTm9kZUxpc3QuaCIKLSNpbmNsdWRlICJSZW5kZXJUYWJsZS5oIgotI2luY2x1ZGUgIlJlbmRl
clRhYmxlQ2VsbC5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlQ29sLmgiCi0jaW5jbHVkZSAiY3Nz
X3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUg
ImNzc2hlbHBlci5oIgogI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJj
c3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgotI2luY2x1
ZGUgIkhUTUxEb2N1bWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKLUhUTUxUYWJsZUVsZW1l
bnQ6OkhUTUxUYWJsZUVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgOiBIVE1MRWxlbWVudCh0YWJs
ZVRhZywgZG9jKQotewotICAgIHRDYXB0aW9uID0gMDsKLSAgICBoZWFkID0gMDsKLSAgICBmb290
ID0gMDsKLSAgICBmaXJzdEJvZHkgPSAwOwotCi0gCi0gICAgcGFkZGluZyA9IDE7Ci0gICAgCi0g
ICAgbV9ub0JvcmRlciA9IHRydWU7Ci0gICAgbV9zb2xpZCA9IGZhbHNlOwotfQotCi1IVE1MVGFi
bGVFbGVtZW50Ojp+SFRNTFRhYmxlRWxlbWVudCgpCi17Ci0gICAgaWYgKGZpcnN0Qm9keSkKLSAg
ICAgICAgZmlyc3RCb2R5LT5kZXJlZigpOwotfQotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6OmNo
ZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aXNU
ZXh0Tm9kZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcpIHx8Ci0gICAgICAg
ICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNvbFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUo
Y29sZ3JvdXBUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRoZWFkVGFn
KSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hp
bGQtPmhhc1RhZ05hbWUodGJvZHlUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcp
IHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLU5v
ZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENhcHRpb24oIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50
ICpjICkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqb2MgPSB0
Q2FwdGlvbikKLSAgICAgICAgcmVwbGFjZUNoaWxkKGMsIG9jLCBlYyk7Ci0gICAgZWxzZQotICAg
ICAgICBpbnNlcnRCZWZvcmUoYywgZmlyc3RDaGlsZCgpLCBlYyk7Ci0gICAgdENhcHRpb24gPSBj
OwotICAgIHJldHVybiB0Q2FwdGlvbjsKLX0KLQotTm9kZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0
VEhlYWQoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAgICBFeGNlcHRpb25Db2Rl
IGVjID0gMDsKLSAgICBpZiAoTm9kZSAqaCA9IGhlYWQpCi0gICAgICAgIHJlcGxhY2VDaGlsZChz
LCBoLCBlYyk7Ci0gICAgZWxzZSBpZiAoZm9vdCkKLSAgICAgICAgaW5zZXJ0QmVmb3JlKHMsIGZv
b3QsIGVjKTsKLSAgICBlbHNlIGlmIChmaXJzdEJvZHkpCi0gICAgICAgIGluc2VydEJlZm9yZShz
LCBmaXJzdEJvZHksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGFwcGVuZENoaWxkKHMsIGVjKTsK
LSAgICBoZWFkID0gczsKLSAgICByZXR1cm4gaGVhZDsKLX0KLQotTm9kZSogSFRNTFRhYmxlRWxl
bWVudDo6c2V0VEZvb3QoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAgICBFeGNl
cHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqZiA9IGZvb3QpCi0gICAgICAgIHJlcGxh
Y2VDaGlsZChzLCBmLCBlYyk7Ci0gICAgZWxzZSBpZiAoZmlyc3RCb2R5KQotICAgICAgICBpbnNl
cnRCZWZvcmUocywgZmlyc3RCb2R5LCBlYyk7Ci0gICAgZWxzZQotICAgICAgICBhcHBlbmRDaGls
ZChzLCBlYyk7Ci0gICAgZm9vdCA9IHM7Ci0gICAgcmV0dXJuIGZvb3Q7Ci19Ci0KLU5vZGUqIEhU
TUxUYWJsZUVsZW1lbnQ6OnNldFRCb2R5KCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqcyApCi17
Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9kZSogcjsKLSAgICBzLT5yZWYoKTsK
LSAgICBpZiAoTm9kZSAqZmIgPSBmaXJzdEJvZHkpIHsKLSAgICAgICAgcmVwbGFjZUNoaWxkKHMs
IGZiLCBlYyk7Ci0gICAgICAgIGZiLT5kZXJlZigpOwotICAgICAgICByID0gczsKLSAgICB9IGVs
c2UKLSAgICAgICAgYXBwZW5kQ2hpbGQocywgZWMpOwotICAgIGZpcnN0Qm9keSA9IHM7Ci0gICAg
cmV0dXJuIGZpcnN0Qm9keTsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6OmNy
ZWF0ZVRIZWFkKCAgKQotewotICAgIGlmKCFoZWFkKQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7Ci0gICAgICAgIGhlYWQgPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQo
dGhlYWRUYWcsIGRvY3VtZW50KCksIHRydWUgLyogaW1wbGljaXQgKi8pOwotICAgICAgICBpZihm
b290KQotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKCBoZWFkLCBmb290LCBlYyApOwotICAgICAg
ICBlbHNlIGlmKGZpcnN0Qm9keSkKLSAgICAgICAgICAgIGluc2VydEJlZm9yZSggaGVhZCwgZmly
c3RCb2R5LCBlYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGVuZENoaWxkKGhlYWQs
IGVjKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVu
dDo6ZGVsZXRlVEhlYWQoICApCi17Ci0gICAgaWYoaGVhZCkgewotICAgICAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKLSAgICAgICAgaGVhZC0+cmVmKCk7Ci0gICAgICAgIEhUTUxFbGVtZW50Ojpy
ZW1vdmVDaGlsZChoZWFkLCBlYyk7Ci0gICAgICAgIGhlYWQtPmRlcmVmKCk7Ci0gICAgfQotICAg
IGhlYWQgPSAwOwotfQotCi1IVE1MRWxlbWVudCAqSFRNTFRhYmxlRWxlbWVudDo6Y3JlYXRlVEZv
b3QoICApCi17Ci0gICAgaWYgKCFmb290KQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBl
YyA9IDA7Ci0gICAgICAgIGZvb3QgPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQodGZvb3RU
YWcsIGRvY3VtZW50KCksIHRydWUgLyppbXBsaWNpdCAqLyk7Ci0gICAgICAgIGlmIChmaXJzdEJv
ZHkpCi0gICAgICAgICAgICBpbnNlcnRCZWZvcmUoIGZvb3QsIGZpcnN0Qm9keSwgZWMgKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgYXBwZW5kQ2hpbGQoZm9vdCwgZWMpOwotICAgIH0KLSAg
ICByZXR1cm4gZm9vdDsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVURm9vdCgg
ICkKLXsKLSAgICBpZihmb290KSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAg
ICAgICBmb290LT5yZWYoKTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxkKGZvb3Qs
IGVjKTsKLSAgICAgICAgZm9vdC0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgZm9vdCA9IDA7Ci19Ci0K
LUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVDYXB0aW9uKCAgKQotewotICAg
IGlmKCF0Q2FwdGlvbikKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAg
ICAgICB0Q2FwdGlvbiA9IG5ldyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChkb2N1bWVudCgpKTsK
LSAgICAgICAgaW5zZXJ0QmVmb3JlKCB0Q2FwdGlvbiwgZmlyc3RDaGlsZCgpLCBlYyApOwotICAg
IH0KLSAgICByZXR1cm4gdENhcHRpb247Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6ZGVs
ZXRlQ2FwdGlvbiggICkKLXsKLSAgICBpZih0Q2FwdGlvbikgewotICAgICAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKLSAgICAgICAgdENhcHRpb24tPnJlZigpOwotICAgICAgICBIVE1MRWxlbWVu
dDo6cmVtb3ZlQ2hpbGQodENhcHRpb24sIGVjKTsKLSAgICAgICAgdENhcHRpb24tPmRlcmVmKCk7
Ci0gICAgfQotICAgIHRDYXB0aW9uID0gMDsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVs
ZW1lbnQ6Omluc2VydFJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICAv
LyBUaGUgRE9NIHJlcXVpcmVzIHRoYXQgd2UgY3JlYXRlIGEgdGJvZHkgaWYgdGhlIHRhYmxlIGlz
IGVtcHR5Ci0gICAgLy8gKGNmIERPTTJUUyBIVE1MVGFibGVFbGVtZW50MzEgdGVzdCkKLSAgICAv
LyAobm90ZTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSAiaWYgdGhlIHRhYmxlIGhhcyBubyBzZWN0
aW9ucyIsIHNpbmNlIHdlIGNhbiBoYXZlCi0gICAgLy8gPFRBQkxFPjxUUj4pCi0gICAgaWYoIWZp
cnN0Qm9keSAmJiAhaGVhZCAmJiAhZm9vdCkKLSAgICAgICAgc2V0VEJvZHkoIG5ldyBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudCh0Ym9keVRhZywgZG9jdW1lbnQoKSwgdHJ1ZSAvKiBpbXBsaWNpdCAq
LykgKTsKLQotICAgIC8vIElFIHRyZWF0cyBpbmRleD0tMSBhcyBkZWZhdWx0IHZhbHVlIG1lYW5p
bmcgJ2FwcGVuZCBhZnRlciBsYXN0JwotICAgIC8vIFRoaXMgaXNuJ3QgaW4gdGhlIERPTS4gU28s
IG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHNlY3Rp
b24gPSAwTDsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogbGFzdFNlY3Rpb24gPSAwTDsK
LSAgICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIGJvb2wgYXBwZW5kID0gKGluZGV4
ID09IC0xKTsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yICggOyBub2RlICYmIChp
bmRleD49MCB8fCBhcHBlbmQpIDsgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCkgKQotICAgIHsK
LSAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgMiB0Zm9vdCBlbGVtZW50cyBpbiB0aGUgdGFibGUu
IE9ubHkgdGhlIGZpcnN0IG9uZSBpcyB0aGUgImZvb3QiLCB0aGF0J3Mgd2h5IHdlIGhhdmUgdGhl
IG1vcmUKLSAgICAgICAgLy8gY29tcGxpY2F0ZWQgaWYgc3RhdGVtZW50IGJlbG93LgotICAgICAg
ICBpZiAobm9kZSAhPSBmb290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBub2Rl
LT5oYXNUYWdOYW1lKHRmb290VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkpCi0g
ICAgICAgIHsKLSAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0
aW9uRWxlbWVudCAqPihub2RlKTsKLSAgICAgICAgICAgIGxhc3RTZWN0aW9uID0gc2VjdGlvbjsK
LSAgICAgICAgICAgIGlmICghYXBwZW5kKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJvd3MgPSBz
ZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvd3MgPj0gaW5kZXgpIHsK
LSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaW5kZXgg
LT0gcm93czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoICFmb3Vu
ZCAmJiBmb290ICkKLSAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rp
b25FbGVtZW50ICo+KGZvb3QpOwotCi0gICAgLy8gSW5kZXggPT0gMCBtZWFucyAiaW5zZXJ0IGJl
Zm9yZSBmaXJzdCByb3cgaW4gY3VycmVudCBzZWN0aW9uIgotICAgIC8vIG9yICJhcHBlbmQgYWZ0
ZXIgbGFzdCByb3ciIChpZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VjdGlvbiBhbnltb3JlKQotICAg
IGlmICggIXNlY3Rpb24gJiYgKCBpbmRleCA9PSAwIHx8IGFwcGVuZCApICkKLSAgICB7Ci0gICAg
ICAgIHNlY3Rpb24gPSBsYXN0U2VjdGlvbjsKLSAgICAgICAgaW5kZXggPSBzZWN0aW9uID8gc2Vj
dGlvbi0+bnVtUm93cygpIDogMDsKLSAgICB9Ci0gICAgaWYgKHNlY3Rpb24gJiYgKGluZGV4ID49
IDAgfHwgYXBwZW5kKSkKLSAgICAgICAgcmV0dXJuIHNlY3Rpb24tPmluc2VydFJvdyhpbmRleCwg
ZWMpOwotICAgIGVsc2UgewotICAgICAgICAvLyBObyBtb3JlIHNlY3Rpb25zID0+IGluZGV4IGlz
IHRvbyBiaWcKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsKLSAgICAgICAgcmV0dXJuIDBM
OwotICAgIH0KLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVSb3coIGludCBpbmRl
eCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHNl
Y3Rpb24gPSAwTDsKLSAgICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIGJvb2wgbGFz
dFJvdyA9IGluZGV4ID09IC0xOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBsYXN0U2Vj
dGlvbiA9IDBMOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKCA7IG5vZGUgOyBu
b2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSApCi0gICAgewotICAgICAgICBpZiAobm9kZSAhPSBm
b290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRm
b290VGFnKSB8fCAKLSAgICAgICAgICAgIG5vZGUtPmhhc1RhZ05hbWUodGJvZHlUYWcpKSkgewot
ICAgICAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
ICo+KG5vZGUpOwotICAgICAgICAgICAgbGFzdFNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgICAg
ICAgaW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAgICAgICBpZiAoICFsYXN0
Um93ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHJvd3MgPiBpbmRleCAp
IHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaW5k
ZXggLT0gcm93czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZWN0aW9uID0g
MEw7Ci0gICAgfQotICAgIGlmICggIWZvdW5kICYmIGZvb3QgKQotICAgICAgICBzZWN0aW9uID0g
c3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oZm9vdCk7Ci0KLSAgICBpZiAo
IGxhc3RSb3cgKQotICAgICAgICBsYXN0U2VjdGlvbi0+ZGVsZXRlUm93KCAtMSwgZWMgKTsKLSAg
ICBlbHNlIGlmICggc2VjdGlvbiAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgc2VjdGlvbi0+bnVt
Um93cygpICkKLSAgICAgICAgc2VjdGlvbi0+ZGVsZXRlUm93KCBpbmRleCwgZWMgKTsKLSAgICBl
bHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhU
TUxUYWJsZUVsZW1lbnQ6OmFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4gY2hpbGQpCi17Ci0gICAg
aWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAgIC8vIEZpcnN0IGFkZCB0
aGUgY2hpbGQuCi0gICAgICAgIEhUTUxFbGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAg
ICAgLy8gTm93IHNpbXBseSByZXR1cm4gb3Vyc2VsdmVzIGFzIHRoZSBjb250YWluZXIgdG8gaW5z
ZXJ0IGludG8uCi0gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgZGVtb3RpbmcgdGhl
IGZvcm0gdG8gYSBsZWFmIGFuZCBtb3ZpbmcgaXQgc2FmZWx5IG91dCBvZiB0aGUgd2F5LgotICAg
ICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY3JlYXRpb24gb2YgPHRib2R5
PiBlbGVtZW50cyByZWxpZXMgb24gdGhlICJjaGlsZEFsbG93ZWQiIGNoZWNrLAotICAgIC8vIHNv
IHdlIG5lZWQgdG8gZG8gaXQgZXZlbiBmb3IgWE1MIGRvY3VtZW50cy4KLSAgICBhc3NlcnQoY2hp
bGQtPm5vZGVUeXBlKCkgIT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk7Ci0gICAgaWYgKCFkb2N1
bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpICYmICFjaGlsZEFsbG93ZWQoY2hpbGQuZ2V0KCkpKQot
ICAgICAgICByZXR1cm4gMDsKLQotICAgIENvbnRhaW5lck5vZGUqIGNvbnRhaW5lciA9IEhUTUxF
bGVtZW50OjphZGRDaGlsZChjaGlsZC5nZXQoKSk7Ci0gICAgaWYgKGNvbnRhaW5lcikgewotICAg
ICAgICBpZiAoIXRDYXB0aW9uICYmIGNoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcpKQotICAg
ICAgICAgICAgdENhcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVDYXB0aW9uRWxlbWVudCAq
PihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFoZWFkICYmIGNoaWxkLT5oYXNUYWdO
YW1lKHRoZWFkVGFnKSkKLSAgICAgICAgICAgIGhlYWQgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFmb290ICYm
IGNoaWxkLT5oYXNUYWdOYW1lKHRmb290VGFnKSkKLSAgICAgICAgICAgIGZvb3QgPSBzdGF0aWNf
Y2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVs
c2UgaWYgKCFmaXJzdEJvZHkgJiYgY2hpbGQtPmhhc1RhZ05hbWUodGJvZHlUYWcpKSB7Ci0gICAg
ICAgICAgICBmaXJzdEJvZHkgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAq
PihjaGlsZC5nZXQoKSk7Ci0gICAgICAgICAgICBmaXJzdEJvZHktPnJlZigpOwotICAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiBjb250YWluZXI7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVu
dDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBIVE1MRWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2Vk
KCk7Ci0gICAgCi0gICAgaWYgKGZpcnN0Qm9keSAmJiBmaXJzdEJvZHktPnBhcmVudE5vZGUoKSAh
PSB0aGlzKSB7Ci0gICAgICAgIGZpcnN0Qm9keS0+ZGVyZWYoKTsKLSAgICAgICAgZmlyc3RCb2R5
ID0gMDsKLSAgICB9Ci19IAotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6Om1hcFRvRW50cnkoY29u
c3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQp
IGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAg
IHJlc3VsdCA9IChNYXBwZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRyeSArIGRvY3VtZW50KCkt
PmRvY0lEKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChh
dHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0ciB8
fAotICAgICAgICBhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9
PSBjZWxsc3BhY2luZ0F0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdnNwYWNlQXR0ciB8fAot
ICAgICAgICBhdHRyTmFtZSA9PSBoc3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZh
bGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYm9yZGVyY29sb3JBdHRy
KSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVybiB0cnVlOwot
ICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYm9yZGVyQXR0cikgewotICAgICAgICBy
ZXN1bHQgPSBlVGFibGU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBp
ZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVUYWJsZTsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50
OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1l
bnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBp
ZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0
ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19Q
Uk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gYm9yZGVyQXR0cikgIHsKLSAgICAgICAgbV9ub0JvcmRlciA9IHRydWU7Ci0gICAgICAgIGlm
IChhdHRyLT5kZWNsKCkpIHsKLSAgICAgICAgICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsID0gYXR0
ci0+ZGVjbCgpLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU19QUk9QX0JPUkRFUl9MRUZUX1dJRFRI
KTsKLSAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAg
ICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbVZhbCA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odmFsLmdldCgpKTsKLSAgICAgICAgICAgICAgICBtX25vQm9yZGVy
ID0gIXByaW1WYWwtPmdldEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFhdHRyLT5pc051
bGwoKSkgewotICAgICAgICAgICAgLy8gIyMjIHRoaXMgbmVlZHMgbW9yZSB3b3JrLCBhcyB0aGUg
Ym9yZGVyIHZhbHVlIGlzIG5vdCBvbmx5Ci0gICAgICAgICAgICAvLyAgICAgdGhlIGJvcmRlciBv
ZiB0aGUgYm94LCBidXQgYWxzbyBiZXR3ZWVuIHRoZSBjZWxscwotICAgICAgICAgICAgaW50IGJv
cmRlciA9IDA7Ci0gICAgICAgICAgICBpZiAoYXR0ci0+aXNFbXB0eSgpKQotICAgICAgICAgICAg
ICAgIGJvcmRlciA9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYm9yZGVy
ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotI2lmZGVmIERFQlVHX0RSQVdfQk9SREVSCi0gICAg
ICAgICAgICBib3JkZXI9MTsKLSNlbmRpZgotICAgICAgICAgICAgbV9ub0JvcmRlciA9ICFib3Jk
ZXI7Ci0gICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1dJRFRI
LCBTdHJpbmc6Om51bWJlcihib3JkZXIpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKSB7Ci0gICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENT
U19QUk9QX0JBQ0tHUk9VTkRfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAo
YXR0ci0+bmFtZSgpID09IGJvcmRlcmNvbG9yQXR0cikgewotICAgICAgICBtX3NvbGlkID0gYXR0
ci0+ZGVjbCgpOwotICAgICAgICBpZiAoIWF0dHItPmRlY2woKSAmJiAhYXR0ci0+aXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9CT1JERVJfQ09MT1Is
IGF0dHItPnZhbHVlKCkpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BS
T1BfQk9SREVSX1RPUF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQ
cm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBDU1NfVkFMX1NPTElE
KTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9MRUZU
X1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIs
IENTU19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAg
ICBtX3NvbGlkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBXZWJDb3JlOjpwYXJz
ZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0lNQUdF
LCBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBmcmFtZUF0dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBydWxl
c0F0dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjZWxsc3BhY2luZ0F0dHIp
IHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFk
ZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9CT1JERVJfU1BBQ0lORywgYXR0ci0+dmFsdWUoKSk7
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2VsbHBhZGRpbmdBdHRyKSB7Ci0gICAg
ICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBwYWRkaW5nID0g
bWF4KCAwLCBhdHRyLT52YWx1ZSgpLnRvSW50KCkgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgcGFkZGluZyA9IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlz
VGFibGUoKSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGUgKj4ocmVuZGVy
ZXIoKSktPnNldENlbGxQYWRkaW5nKHBhZGRpbmcpOwotICAgICAgICAgICAgaWYgKCFyZW5kZXJl
cigpLT5uZWVkc0xheW91dCgpKQotICAgICAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRz
TGF5b3V0KHRydWUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
Y29sc0F0dHIpIHsKLSAgICAgICAgLy8gIyMjCi0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gdnNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfTUFS
R0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1Nf
UFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1Nf
UFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xlbmd0aChh
dHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVl
KCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1Bf
RkxPQVQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZh
bGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJQ0FMX0FMSUdOLCBhdHRy
LT52YWx1ZSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKGF0dHIpOwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogSFRNTFRh
YmxlRWxlbWVudDo6YWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpCi17Ci0gICAgaWYgKG1f
bm9Cb3JkZXIpCi0gICAgICAgIHJldHVybiAwOwotICAgIE1hcHBlZEF0dHJpYnV0ZSBhdHRyKHRh
YmxlYm9yZGVyQXR0ciwgbV9zb2xpZCA/ICJzb2xpZCIgOiAib3V0c2V0Iik7Ci0gICAgQ1NTTWFw
cGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQ
ZXJzaXN0ZW50LCAmYXR0cik7Ci0gICAgaWYgKCFkZWNsKSB7Ci0gICAgICAgIGRlY2wgPSBuZXcg
Q1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVu
dChkb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUodGhp
cyk7Ci0gICAgICAgIGRlY2wtPnNldFN0cmljdFBhcnNpbmcoZmFsc2UpOyAvLyBNYXBwZWQgYXR0
cmlidXRlcyBhcmUganVzdCBhbHdheXMgcXVpcmt5LgotICAgICAgICAKLSAgICAgICAgZGVjbC0+
cmVmKCk7IC8vIFRoaXMgc2luZ2xlIHJlZiBwaW5zIHVzIGluIHRoZSB0YWJsZSB1bnRpbCB0aGUg
ZG9jdW1lbnQgZGllcy4KLQotICAgICAgICBpbnQgdiA9IG1fc29saWQgPyBDU1NfVkFMX1NPTElE
IDogQ1NTX1ZBTF9PVVRTRVQ7Ci0gICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JP
UkRFUl9UT1BfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NT
X1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICBkZWNsLT5zZXRQ
cm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfTEVGVF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICBk
ZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfUklHSFRfU1RZTEUsIHYsIGZhbHNlKTsK
LQotICAgICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0ciwgZGVj
bCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSgw
KTsKLSAgICAgICAgZGVjbC0+c2V0TWFwcGVkU3RhdGUoZVBlcnNpc3RlbnQsIGF0dHIubmFtZSgp
LCBhdHRyLnZhbHVlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZGVjbDsKLX0KLQotQ1NTTXV0YWJs
ZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJsZUVsZW1lbnQ6OmdldFNoYXJlZENlbGxEZWNsKCkK
LXsKLSAgICBNYXBwZWRBdHRyaWJ1dGUgYXR0cihjZWxsYm9yZGVyQXR0ciwgbV9ub0JvcmRlciA/
ICJub25lIiA6IChtX3NvbGlkID8gInNvbGlkIiA6ICJpbnNldCIpKTsKLSAgICBDU1NNYXBwZWRB
dHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9IGdldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNp
c3RlbnQsICZhdHRyKTsKLSAgICBpZiAoIWRlY2wpIHsKLSAgICAgICAgZGVjbCA9IG5ldyBDU1NN
YXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigwKTsKLSAgICAgICAgZGVjbC0+c2V0UGFyZW50KGRv
Y3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSh0aGlzKTsK
LSAgICAgICAgZGVjbC0+c2V0U3RyaWN0UGFyc2luZyhmYWxzZSk7IC8vIE1hcHBlZCBhdHRyaWJ1
dGVzIGFyZSBqdXN0IGFsd2F5cyBxdWlya3kuCi0gICAgICAgIAotICAgICAgICBkZWNsLT5yZWYo
KTsgLy8gVGhpcyBzaW5nbGUgcmVmIHBpbnMgdXMgaW4gdGhlIHRhYmxlIHVudGlsIHRoZSB0YWJs
ZSBkaWVzLgotICAgICAgICAKLSAgICAgICAgaWYgKG1fbm9Cb3JkZXIpCi0gICAgICAgICAgICBk
ZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfV0lEVEgsICIwIiwgZmFsc2UpOwotICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRF
Ul9XSURUSCwgIjFweCIsIGZhbHNlKTsKLSAgICAgICAgICAgIGludCB2ID0gbV9zb2xpZCA/IENT
U19WQUxfU09MSUQgOiBDU1NfVkFMX0lOU0VUOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVy
dHkoQ1NTX1BST1BfQk9SREVSX1RPUF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVj
bC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgdiwgZmFsc2UpOwot
ICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZTEUs
IHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENTU19QUk9QX0JPUkRF
Ul9SSUdIVF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHko
Q1NTX1BST1BfQk9SREVSX0NPTE9SLCAiaW5oZXJpdCIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHNldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQsICZhdHRyLCBkZWNsKTsK
LSAgICAgICAgZGVjbC0+c2V0UGFyZW50KDApOwotICAgICAgICBkZWNsLT5zZXROb2RlKDApOwot
ICAgICAgICBkZWNsLT5zZXRNYXBwZWRTdGF0ZShlUGVyc2lzdGVudCwgYXR0ci5uYW1lKCksIGF0
dHIudmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWNsOwotfQotCi12b2lkIEhUTUxUYWJs
ZUVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgYXNzZXJ0KCFtX2F0dGFjaGVkKTsKLSAgICBIVE1M
RWxlbWVudDo6YXR0YWNoKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNU
YWJsZSgpKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihyZW5kZXJlcigpKS0+
c2V0Q2VsbFBhZGRpbmcoIHBhZGRpbmcgKTsKLX0KLQotYm9vbCBIVE1MVGFibGVFbGVtZW50Ojpp
c1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGF0dHIt
Pm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cjsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBI
VE1MVGFibGVFbGVtZW50Ojpyb3dzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0
aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246OlRBQkxFX1JPV1Mp
KTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVFbGVtZW50Ojp0Qm9kaWVz
KCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rp
b24odGhpcywgSFRNTENvbGxlY3Rpb246OlRBQkxFX1RCT0RJRVMpKTsKLX0KLQotU3RyaW5nIEhU
TUxUYWJsZUVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0QWxpZ24oY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50
OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJn
Y29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50Ojpib3JkZXIo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYm9yZGVyQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0Qm9yZGVyKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGJvcmRlckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJs
ZUVsZW1lbnQ6OmNlbGxQYWRkaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGNlbGxwYWRkaW5nQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0Q2VsbFBh
ZGRpbmcoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2VsbHBhZGRp
bmdBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpjZWxsU3BhY2lu
ZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjZWxsc3BhY2luZ0F0dHIpOwot
fQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENlbGxTcGFjaW5nKGNvbnN0IFN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNlbGxzcGFjaW5nQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6ZnJhbWUoKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUoZnJhbWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRG
cmFtZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShmcmFtZUF0dHIs
IHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OnJ1bGVzKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHJ1bGVzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxl
RWxlbWVudDo6c2V0UnVsZXMoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUocnVsZXNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpzdW1t
YXJ5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHN1bW1hcnlBdHRyKTsKLX0K
LQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRTdW1tYXJ5KGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHN1bW1hcnlBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBI
VE1MVGFibGVFbGVtZW50Ojp3aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZSh3aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFdpZHRoKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgdmFsdWUpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIEhUTUxUYWJsZVBhcnRFbGVtZW50Ojpt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSBiYWNrZ3JvdW5kQXR0
cikgewotICAgICAgICByZXN1bHQgPSAoTWFwcGVkQXR0cmlidXRlRW50cnkpKGVMYXN0RW50cnkg
KyBkb2N1bWVudCgpLT5kb2NJRCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAg
ICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUg
PT0gYm9yZGVyY29sb3JBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IHZhbGlnbkF0dHIgfHwK
LSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5p
dmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRy
TmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNlbGw7IC8vIEFsbCB0YWJs
ZSBwYXJ0cyB3aWxsIGp1c3Qgc2hhcmUgaW4gdGhlIFREIHNwYWNlLgotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJO
YW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBl
ZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUo
KSA9PSBiZ2NvbG9yQXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJPUF9C
QUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5h
bWUoKSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICBTdHJpbmcgdXJsID0gV2ViQ29yZTo6
cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGlmICghdXJsLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGFkZENTU0ltYWdlUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQkFDS0dST1VORF9J
TUFHRSwgZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gYm9yZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUo
KS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JP
UkRFUl9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShh
dHRyLCBDU1NfUFJPUF9CT1JERVJfVE9QX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAg
ICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9CT1RUT01fU1RZTEUsIENT
U19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1Bf
Qk9SREVSX0xFRlRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJv
cGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1JJR0hUX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsK
LSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHZhbGlnbkF0dHIpIHsK
LSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENT
U1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJQ0FMX0FMSUdOLCBhdHRyLT52YWx1ZSgpKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiB2ID0gYXR0ci0+dmFsdWUoKTsKLSAgICAgICAgaWYgKGVxdWFsSWdu
b3JpbmdDYXNlKHYsICJtaWRkbGUiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZSh2LCAiY2VudGVyIikp
Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9URVhUX0FMSUdOLCBD
U1NfVkFMX19XRUJLSVRfQ0VOVEVSKTsKLSAgICAgICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UodiwgImFic21pZGRsZSIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NT
X1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9DRU5URVIpOwotICAgICAgICBlbHNlIGlmIChlcXVh
bElnbm9yaW5nQ2FzZSh2LCAibGVmdCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0
ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lUX0xFRlQpOwotICAgICAgICBl
bHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAicmlnaHQiKSkKLSAgICAgICAgICAgIGFkZENT
U1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIENTU19WQUxfX1dFQktJVF9SSUdI
VCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19Q
Uk9QX1RFWFRfQUxJR04sIHYpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdo
dEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0
cik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6
OkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERv
Y3VtZW50ICpkb2MsIGJvb2wgaW1wbGljaXQpCi0gICAgOiBIVE1MVGFibGVQYXJ0RWxlbWVudCh0
YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9pbXBsaWNpdCA9IGltcGxpY2l0OwotfQotCi1ib29sIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsK
LSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodHJUYWcpIHx8IG5ld0NoaWxkLT5oYXNU
YWdOYW1lKGZvcm1UYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlw
dFRhZyk7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjphZGRD
aGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQotewotICAgIGlmIChjaGlsZC0+aGFzVGFnTmFt
ZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJzdCBhZGQgdGhlIGNoaWxkLgotICAgICAgICBI
VE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgICAgIC8vIE5vdyBz
aW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUgY29udGFpbmVyIHRvIGluc2VydCBpbnRvLgot
ICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRlbW90aW5nIHRoZSBmb3JtIHRvIGEg
bGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQgb2YgdGhlIHdheS4KLSAgICAgICAgcmV0dXJu
IHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRFbGVtZW50OjphZGRDaGls
ZChjaGlsZCk7Ci19Ci0KLS8vIHRoZXNlIGZ1bmN0aW9ucyBhcmUgcmF0aGVyIHNsb3csIHNpbmNl
IHdlIG5lZWQgdG8gZ2V0IHRoZSByb3cgYXQKLS8vIHRoZSBpbmRleC4uLiBidXQgdGhleSBhcmVu
J3QgdXNlZCBkdXJpbmcgdXN1YWwgSFRNTCBwYXJzaW5nIGFueXdheQotSFRNTEVsZW1lbnQgKkhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50OjppbnNlcnRSb3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29k
ZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlUm93RWxlbWVudCAqciA9IDBMOwotICAgIFJlZlB0cjxO
b2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50IG51bVJvd3MgPSBjaGls
ZHJlbiA/IChpbnQpY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBpZiAoIGluZGV4IDwgLTEg
fHwgaW5kZXggPiBudW1Sb3dzICkgewotICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOyAvLyBw
ZXIgdGhlIERPTQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByID0gbmV3IEhUTUxU
YWJsZVJvd0VsZW1lbnQoZG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmICggbnVtUm93cyA9PSBpbmRl
eCB8fCBpbmRleCA9PSAtMSApCi0gICAgICAgICAgICBhcHBlbmRDaGlsZChyLCBlYyk7Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgTm9kZSAqbjsKLSAgICAgICAgICAgIGlmIChpbmRleCA8
IDEpCi0gICAgICAgICAgICAgICAgbiA9IGZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBuID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgpOwotICAgICAgICAgICAg
aW5zZXJ0QmVmb3JlKHIsIG4sIGVjICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7
Ci19Ci0KLXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmRlbGV0ZVJvdyggaW50IGluZGV4
LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQdHI8Tm9kZUxpc3Q+IGNoaWxkcmVuID0g
Y2hpbGROb2RlcygpOwotICAgIGludCBudW1Sb3dzID0gY2hpbGRyZW4gPyAoaW50KWNoaWxkcmVu
LT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgICBpbmRleCA9IG51
bVJvd3MgLSAxOwotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbnVtUm93cykgewotICAg
ICAgICBSZWZQdHI8Tm9kZT4gcm93ID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgpOwotICAgICAgICBI
VE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQocm93LmdldCgpLCBlYyk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLWludCBIVE1MVGFibGVTZWN0aW9uRWxlbWVu
dDo6bnVtUm93cygpIGNvbnN0Ci17Ci0gICAgaW50IHJvd3MgPSAwOwotICAgIGNvbnN0IE5vZGUg
Km4gPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPmhhc1Rh
Z05hbWUodHJUYWcpKQotICAgICAgICAgICAgcm93cysrOwotICAgICAgICBuID0gbi0+bmV4dFNp
YmxpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcm93czsKLX0KLQotU3RyaW5nIEhUTUxUYWJs
ZVNlY3Rpb25FbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpzZXRBbGln
bihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZh
bHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpjaCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQ6OnNldENoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0
cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVTZWN0aW9uRWxl
bWVudDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhcm9mZkF0
dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpzZXRDaE9mZihjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwot
fQotCi1TdHJpbmcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnZBbGlnbigpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0
QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9u
PiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6cm93cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxI
VE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xsZWN0aW9uKHRoaXMsIEhUTUxDb2xsZWN0aW9uOjpU
QUJMRV9ST1dTKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBIVE1MVGFibGVS
b3dFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4g
bmV3Q2hpbGQtPmhhc1RhZ05hbWUodGRUYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRoVGFn
KSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSB8fCBuZXdDaGls
ZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi1Db250YWluZXJOb2RlKiBIVE1MVGFibGVS
b3dFbGVtZW50OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQotewotICAgIGlmIChj
aGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJzdCBhZGQgdGhlIGNo
aWxkLgotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotCi0g
ICAgICAgIC8vIE5vdyBzaW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUgY29udGFpbmVyIHRv
IGluc2VydCBpbnRvLgotICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRlbW90aW5n
IHRoZSBmb3JtIHRvIGEgbGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQgb2YgdGhlIHdheS4K
LSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRF
bGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci19Ci0KLWludCBIVE1MVGFibGVSb3dFbGVtZW50Ojpy
b3dJbmRleCgpIGNvbnN0Ci17Ci0gICAgTm9kZSAqdGFibGUgPSBwYXJlbnROb2RlKCk7Ci0gICAg
aWYgKCF0YWJsZSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHRhYmxlID0gdGFibGUtPnBhcmVu
dE5vZGUoKTsKLSAgICBpZiAoIXRhYmxlIHx8ICF0YWJsZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykp
Ci0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8vIFRvIG1hdGNoIEZpcmVmb3gsIHRoZSByb3cg
aW5kaWNlcyB3b3JrIGxpa2UgdGhpczoKLSAgICAvLyAgIFJvd3MgZnJvbSB0aGUgZmlyc3QgPHRo
ZWFkPiBhcmUgbnVtYmVyZWQgYmVmb3JlIGFsbCA8dGJvZHk+IHJvd3MuCi0gICAgLy8gICBSb3dz
IGZyb20gdGhlIGZpcnN0IDx0Zm9vdD4gYXJlIG51bWJlcmVkIGFmdGVyIGFsbCA8dGJvZHk+IHJv
d3MuCi0gICAgLy8gICBSb3dzIGZyb20gb3RoZXIgPHRoZWFkPiBhbmQgPHRmb290PiBlbGVtZW50
cyBkb24ndCBnZXQgcm93IGluZGljZXMgYXQgYWxsLgotCi0gICAgaW50IHJJbmRleCA9IDA7Ci0K
LSAgICBpZiAoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGhlYWQgPSBzdGF0aWNfY2FzdDxIVE1M
VGFibGVFbGVtZW50Kj4odGFibGUpLT50SGVhZCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZSAqcm93
ID0gaGVhZC0+Zmlyc3RDaGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewot
ICAgICAgICAgICAgaWYgKHJvdyA9PSB0aGlzKQotICAgICAgICAgICAgICAgIHJldHVybiBySW5k
ZXg7Ci0gICAgICAgICAgICArK3JJbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBm
b3IgKE5vZGUgKm5vZGUgPSB0YWJsZS0+Zmlyc3RDaGlsZCgpOyBub2RlOyBub2RlID0gbm9kZS0+
bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZSh0Ym9keVRhZykp
IHsKLSAgICAgICAgICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBzZWN0aW9uID0gc3RhdGlj
X2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqPihub2RlKTsKLSAgICAgICAgICAgIGZvciAo
Tm9kZSogcm93ID0gc2VjdGlvbi0+Zmlyc3RDaGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4dFNp
YmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gdGhpcykKLSAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHJJbmRleDsKLSAgICAgICAgICAgICAgICArK3JJbmRleDsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChIVE1MVGFibGVTZWN0aW9uRWxl
bWVudCogZm9vdCA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUVsZW1lbnQgKj4odGFibGUpLT50Rm9v
dCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZSAqcm93ID0gZm9vdC0+Zmlyc3RDaGlsZCgpOyByb3c7
IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKHJvdyA9PSB0aGlz
KQotICAgICAgICAgICAgICAgIHJldHVybiBySW5kZXg7Ci0gICAgICAgICAgICArK3JJbmRleDsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFdlIGdldCBoZXJlIGZvciByb3dzIHRoYXQgYXJl
IGluIDx0aGVhZD4gb3IgPHRmb290PiBzZWN0aW9ucyBvdGhlciB0aGFuIHRoZSBtYWluIGhlYWRl
ciBhbmQgZm9vdGVyLgotICAgIHJldHVybiAtMTsKLX0KLQotaW50IEhUTUxUYWJsZVJvd0VsZW1l
bnQ6OnNlY3Rpb25Sb3dJbmRleCgpIGNvbnN0Ci17Ci0gICAgaW50IHJJbmRleCA9IDA7Ci0gICAg
Y29uc3QgTm9kZSAqbiA9IHRoaXM7Ci0gICAgZG8gewotICAgICAgICBuID0gbi0+cHJldmlvdXNT
aWJsaW5nKCk7Ci0gICAgICAgIGlmIChuICYmIG4tPmhhc1RhZ05hbWUodHJUYWcpKQotICAgICAg
ICAgICAgckluZGV4Kys7Ci0gICAgfQotICAgIHdoaWxlIChuKTsKLQotICAgIHJldHVybiBySW5k
ZXg7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVSb3dFbGVtZW50OjppbnNlcnRDZWxsKCBp
bnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIEhUTUxUYWJsZUNlbGxFbGVtZW50
ICpjID0gMEw7Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJlbiA9IGNoaWxkTm9kZXMoKTsK
LSAgICBpbnQgbnVtQ2VsbHMgPSBjaGlsZHJlbiA/IGNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0g
ICAgaWYgKCBpbmRleCA8IC0xIHx8IGluZGV4ID4gbnVtQ2VsbHMgKQotICAgICAgICBlYyA9IElO
REVYX1NJWkVfRVJSOyAvLyBwZXIgdGhlIERPTQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGMg
PSBuZXcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQodGRUYWcsIGRvY3VtZW50KCkpOwotICAgICAgICBp
ZihudW1DZWxscyA9PSBpbmRleCB8fCBpbmRleCA9PSAtMSkKLSAgICAgICAgICAgIGFwcGVuZENo
aWxkKGMsIGVjKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBOb2RlICpuOwotICAgICAg
ICAgICAgaWYoaW5kZXggPCAxKQotICAgICAgICAgICAgICAgIG4gPSBmaXJzdENoaWxkKCk7Ci0g
ICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbiA9IGNoaWxkcmVuLT5pdGVtKGluZGV4
KTsKLSAgICAgICAgICAgIGluc2VydEJlZm9yZShjLCBuLCBlYyk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6ZGVsZXRlQ2Vs
bCggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQdHI8Tm9kZUxpc3Q+
IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1DZWxscyA9IGNoaWxkcmVuID8g
Y2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBpZiAoaW5kZXggPT0gLTEgKQotICAgICAgICBp
bmRleCA9IG51bUNlbGxzLTE7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1DZWxs
cykgewotICAgICAgICBSZWZQdHI8Tm9kZT4gcm93ID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgpOwot
ICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQocm93LmdldCgpLCBlYyk7Ci0gICAgfSBl
bHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVj
dGlvbj4gSFRNTFRhYmxlUm93RWxlbWVudDo6Y2VsbHMoKQotewotICAgIHJldHVybiBSZWZQdHI8
SFRNTENvbGxlY3Rpb24+KG5ldyBIVE1MQ29sbGVjdGlvbih0aGlzLCBIVE1MQ29sbGVjdGlvbjo6
VFJfQ0VMTFMpKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRDZWxscyhIVE1M
Q29sbGVjdGlvbiAqLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBlYyA9IE5PX01PRElGSUNB
VElPTl9BTExPV0VEX0VSUjsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmFsaWdu
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFi
bGVSb3dFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRCZ0NvbG9y
KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50OjpjaCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93
RWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
Y2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmNoT2Zm
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQot
dm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRN
TFRhYmxlUm93RWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldFZBbGln
bihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZSh2YWxpZ25BdHRyLCB2
YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6
OkhUTUxUYWJsZUNlbGxFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3Vt
ZW50ICpkb2MpCi0gIDogSFRNTFRhYmxlUGFydEVsZW1lbnQodGFnTmFtZSwgZG9jKQotewotICAg
IF9jb2wgPSAtMTsKLSAgICBfcm93ID0gLTE7Ci0gICAgY1NwYW4gPSByU3BhbiA9IDE7Ci0gICAg
cm93SGVpZ2h0ID0gMDsKLSAgICBtX3NvbGlkID0gZmFsc2U7Ci19Ci0KLUhUTUxUYWJsZUNlbGxF
bGVtZW50Ojp+SFRNTFRhYmxlQ2VsbEVsZW1lbnQoKQotewotfQotCi1pbnQgSFRNTFRhYmxlQ2Vs
bEVsZW1lbnQ6OmNlbGxJbmRleCgpIGNvbnN0Ci17Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBm
b3IgKGNvbnN0IE5vZGUgKiBub2RlID0gcHJldmlvdXNTaWJsaW5nKCk7IG5vZGU7IG5vZGUgPSBu
b2RlLT5wcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZSh0
ZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0aFRhZykpCi0gICAgICAgICAgICBpbmRleCsrOwot
ICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0
dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IG5vd3Jh
cEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gd2lkdGhBdHRyIHx8Ci0gICAg
ICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNlbGw7IC8v
IEJlY2F1c2Ugb2YgdGhlIHF1aXJreSBiZWhhdmlvciBvZiBpZ25vcmluZyAwIHZhbHVlcywgY2Vs
bHMgYXJlIHNwZWNpYWwuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gSFRNTFRhYmxlUGFydEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19
Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBl
ZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHJvd3NwYW5BdHRy
KSB7Ci0gICAgICAgIHJTcGFuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0lu
dCgpIDogMTsKLSAgICAgICAgaWYgKHJTcGFuIDwgMSkgclNwYW4gPSAxOwotICAgICAgICBpZiAo
cmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlQ2VsbCgpKQotICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsKj4ocmVuZGVyZXIoKSktPnVwZGF0ZUZyb21FbGVtZW50
KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY29sc3BhbkF0dHIpIHsKLSAgICAg
ICAgY1NwYW4gPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAxOwot
ICAgICAgICBpZiAoY1NwYW4gPCAxKSBjU3BhbiA9IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigp
ICYmIHJlbmRlcmVyKCktPmlzVGFibGVDZWxsKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxS
ZW5kZXJUYWJsZUNlbGwqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBub3dyYXBBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0
ci0+aXNOdWxsKCkpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9X
SElURV9TUEFDRSwgQ1NTX1ZBTF9fV0VCS0lUX05PV1JBUCk7Ci0gICAgfSBlbHNlIGlmIChhdHRy
LT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgICAgIGludCB3aWR0aEludCA9IGF0dHItPnZhbHVlKCkudG9JbnQo
KTsKLSAgICAgICAgICAgIGlmICh3aWR0aEludCA+IDApIC8vIHdpZHRoPSIwIiBpcyBpZ25vcmVk
IGZvciBjb21wYXRpYmlsaXR5IHdpdGggV2luSUUuCi0gICAgICAgICAgICAgICAgYWRkQ1NTTGVu
Z3RoKGF0dHIsIENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgaWYgKCFh
dHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGhlaWdodEludCA9IGF0
dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgICAgIGlmIChoZWlnaHRJbnQgPiAwKSAvLyBo
ZWlnaHQ9IjAiIGlzIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5JRS4KLSAgICAg
ICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfSEVJR0hULCBhdHRyLT52YWx1
ZSgpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVu
dDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLS8vIHVzZWQgYnkgdGFibGUgY2Vs
bHMgdG8gc2hhcmUgc3R5bGUgZGVjbHMgY3JlYXRlZCBieSB0aGUgZW5jbG9zaW5nIHRhYmxlLgot
Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJsZUNlbGxFbGVtZW50OjphZGRpdGlv
bmFsQXR0cmlidXRlU3R5bGVEZWNsKCkKLXsKLSAgICBOb2RlKiBwID0gcGFyZW50Tm9kZSgpOwot
ICAgIHdoaWxlIChwICYmICFwLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKLSAgICAgICAgcCA9IHAt
PnBhcmVudE5vZGUoKTsKLQotICAgIGlmIChwKSB7Ci0gICAgICAgIEhUTUxUYWJsZUVsZW1lbnQq
IHRhYmxlID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlRWxlbWVudCo+KHApOwotICAgICAgICByZXR1
cm4gdGFibGUtPmdldFNoYXJlZENlbGxEZWNsKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19
Ci0KLWJvb2wgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAq
YXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRy
OwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmFiYnIoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoYWJickF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxF
bGVtZW50OjpzZXRBYmJyKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KGFiYnJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6YWxp
Z24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQot
dm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1M
VGFibGVDZWxsRWxlbWVudDo6YXhpcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShheGlzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEF4aXMoY29u
c3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYXhpc0F0dHIsIHZhbHVlKTsK
LX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVD
ZWxsRWxlbWVudDo6c2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQ6OmNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJBdHRyKTsK
LX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhU
TUxUYWJsZUNlbGxFbGVtZW50OjpjaE9mZigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJp
YnV0ZShjaGFyb2ZmQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldENo
T2ZmKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJvZmZBdHRy
LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldENvbFNwYW4oaW50
IG4pCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNwYW5BdHRyLCBTdHJpbmc6Om51bWJlcihuKSk7
Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6aGVhZGVycygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShoZWFkZXJzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxl
Q2VsbEVsZW1lbnQ6OnNldEhlYWRlcnMoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoaGVhZGVyc0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxF
bGVtZW50OjpoZWlnaHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoaGVpZ2h0
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEhlaWdodChjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShoZWlnaHRBdHRyLCB2YWx1ZSk7Ci19
Ci0KLWJvb2wgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6Om5vV3JhcCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuICFnZXRBdHRyaWJ1dGUobm93cmFwQXR0cikuaXNOdWxsKCk7Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ6OnNldE5vV3JhcChib29sIGIpCi17Ci0gICAgc2V0QXR0cmlidXRlKG5v
d3JhcEF0dHIsIGIgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpz
ZXRSb3dTcGFuKGludCBuKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dzcGFuQXR0ciwgU3RyaW5n
OjpudW1iZXIobikpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNjb3BlKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHNjb3BlQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFNjb3BlKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHNjb3BlQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxl
Q2VsbEVsZW1lbnQ6OnZBbGlnbigpIGNvbnN0CitIVE1MVGFibGVDYXB0aW9uRWxlbWVudDo6SFRN
TFRhYmxlQ2FwdGlvbkVsZW1lbnQoRG9jdW1lbnQgKmRvYykKKyAgICA6IEhUTUxUYWJsZVBhcnRF
bGVtZW50KGNhcHRpb25UYWcsIGRvYykKIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZhbGln
bkF0dHIpOwogfQogCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRWQWxpZ24oY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsaWduQXR0ciwgdmFsdWUpOwot
fQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQ6OnNldFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KHdpZHRoQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJs
ZUNvbEVsZW1lbnQ6OkhUTUxUYWJsZUNvbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFn
TmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05hbWUs
IGRvYykKLXsKLSAgICBfc3BhbiA9ICh0YWdOYW1lLm1hdGNoZXMoY29sZ3JvdXBUYWcpID8gMCA6
IDEpOwotfQotCi1ib29sIEhUTUxUYWJsZUNvbEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVh
bGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0
Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0cikgewotICAgICAgICByZXN1bHQgPSBl
VW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhU
TUxUYWJsZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12
b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHNwYW5BdHRyKSB7Ci0gICAg
ICAgIF9zcGFuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMTsK
LSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNvbCgpKQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDb2wqPihyZW5kZXJlcigpKS0+dXBkYXRl
RnJvbUVsZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIp
IHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFk
ZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBl
bHNlCi0gICAgICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShh
dHRyKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxl
Q29sRWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50
OjpjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJs
ZUNvbEVsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNo
YXJvZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDb2xFbGVtZW50OjpzZXRDaE9mZihjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUp
OwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldFNwYW4oaW50IG4pCi17Ci0gICAg
c2V0QXR0cmlidXRlKHNwYW5BdHRyLCBTdHJpbmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBI
VE1MVGFibGVDb2xFbGVtZW50Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUodmFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0VkFs
aWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIs
IHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OndpZHRoKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlQ29sRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQog
Ym9vbCBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWRO
YW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKIHsKICAg
ICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7CkluZGV4OiBodG1sL0hUTUxUYWJsZVJvd0Vs
ZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTFRhYmxlUm93RWxlbWVudC5jcHAJKHJl
dmlzaW9uIDE0MzI1KQorKysgaHRtbC9IVE1MVGFibGVSb3dFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMsNzk1ICsyMywyNiBAQAogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICogQm9zdG9uLCBNQSAwMjEx
MS0xMzA3LCBVU0EuCiAgKi8KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImh0bWxf
dGFibGVpbXBsLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlUm93RWxlbWVudC5oIgogCiAjaW5jbHVk
ZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkhUTUxDb2xsZWN0aW9uLmgiCisjaW5jbHVk
ZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKKyNpbmNs
dWRlICJIVE1MVGFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlU2VjdGlvbkVsZW1l
bnQuaCIKICNpbmNsdWRlICJOb2RlTGlzdC5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlLmgiCi0j
aW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDb2wuaCIK
LSNpbmNsdWRlICJjc3Nfc3R5bGVzaGVldGltcGwuaCIKLSNpbmNsdWRlICJjc3NfdmFsdWVpbXBs
LmgiCi0jaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5o
IgotI2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdv
cmRzLmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAotSFRNTFRhYmxlRWxlbWVudDo6SFRNTFRh
YmxlRWxlbWVudChEb2N1bWVudCAqZG9jKQotICA6IEhUTUxFbGVtZW50KHRhYmxlVGFnLCBkb2Mp
Ci17Ci0gICAgdENhcHRpb24gPSAwOwotICAgIGhlYWQgPSAwOwotICAgIGZvb3QgPSAwOwotICAg
IGZpcnN0Qm9keSA9IDA7Ci0KLSAKLSAgICBwYWRkaW5nID0gMTsKLSAgICAKLSAgICBtX25vQm9y
ZGVyID0gdHJ1ZTsKLSAgICBtX3NvbGlkID0gZmFsc2U7Ci19Ci0KLUhUTUxUYWJsZUVsZW1lbnQ6
On5IVE1MVGFibGVFbGVtZW50KCkKLXsKLSAgICBpZiAoZmlyc3RCb2R5KQotICAgICAgICBmaXJz
dEJvZHktPmRlcmVmKCk7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlRWxlbWVudDo6Y2hlY2tEVEQoY29u
c3QgTm9kZSogbmV3Q2hpbGQpCi17Ci0gICAgcmV0dXJuIG5ld0NoaWxkLT5pc1RleHROb2RlKCkg
fHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoY2FwdGlvblRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hp
bGQtPmhhc1RhZ05hbWUoY29sVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShjb2xncm91cFRh
ZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGhlYWRUYWcpIHx8IG5ld0No
aWxkLT5oYXNUYWdOYW1lKHRmb290VGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFn
TmFtZSh0Ym9keVRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZm9ybVRhZykgfHwKLSAgICAg
ICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotTm9kZSogSFRNTFRh
YmxlRWxlbWVudDo6c2V0Q2FwdGlvbiggSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgKmMgKQotewot
ICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGlmIChOb2RlICpvYyA9IHRDYXB0aW9uKQot
ICAgICAgICByZXBsYWNlQ2hpbGQoYywgb2MsIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGluc2Vy
dEJlZm9yZShjLCBmaXJzdENoaWxkKCksIGVjKTsKLSAgICB0Q2FwdGlvbiA9IGM7Ci0gICAgcmV0
dXJuIHRDYXB0aW9uOwotfQotCi1Ob2RlKiBIVE1MVGFibGVFbGVtZW50OjpzZXRUSGVhZCggSFRN
TFRhYmxlU2VjdGlvbkVsZW1lbnQgKnMgKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwot
ICAgIGlmIChOb2RlICpoID0gaGVhZCkKLSAgICAgICAgcmVwbGFjZUNoaWxkKHMsIGgsIGVjKTsK
LSAgICBlbHNlIGlmIChmb290KQotICAgICAgICBpbnNlcnRCZWZvcmUocywgZm9vdCwgZWMpOwot
ICAgIGVsc2UgaWYgKGZpcnN0Qm9keSkKLSAgICAgICAgaW5zZXJ0QmVmb3JlKHMsIGZpcnN0Qm9k
eSwgZWMpOwotICAgIGVsc2UKLSAgICAgICAgYXBwZW5kQ2hpbGQocywgZWMpOwotICAgIGhlYWQg
PSBzOwotICAgIHJldHVybiBoZWFkOwotfQotCi1Ob2RlKiBIVE1MVGFibGVFbGVtZW50OjpzZXRU
Rm9vdCggSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKnMgKQotewotICAgIEV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOwotICAgIGlmIChOb2RlICpmID0gZm9vdCkKLSAgICAgICAgcmVwbGFjZUNoaWxkKHMs
IGYsIGVjKTsKLSAgICBlbHNlIGlmIChmaXJzdEJvZHkpCi0gICAgICAgIGluc2VydEJlZm9yZShz
LCBmaXJzdEJvZHksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGFwcGVuZENoaWxkKHMsIGVjKTsK
LSAgICBmb290ID0gczsKLSAgICByZXR1cm4gZm9vdDsKLX0KLQotTm9kZSogSFRNTFRhYmxlRWxl
bWVudDo6c2V0VEJvZHkoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAgICBFeGNl
cHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiByOwotICAgIHMtPnJlZigpOwotICAgIGlmIChO
b2RlICpmYiA9IGZpcnN0Qm9keSkgewotICAgICAgICByZXBsYWNlQ2hpbGQocywgZmIsIGVjKTsK
LSAgICAgICAgZmItPmRlcmVmKCk7Ci0gICAgICAgIHIgPSBzOwotICAgIH0gZWxzZQotICAgICAg
ICBhcHBlbmRDaGlsZChzLCBlYyk7Ci0gICAgZmlyc3RCb2R5ID0gczsKLSAgICByZXR1cm4gZmly
c3RCb2R5OwotfQotCi1IVE1MRWxlbWVudCAqSFRNTFRhYmxlRWxlbWVudDo6Y3JlYXRlVEhlYWQo
ICApCi17Ci0gICAgaWYoIWhlYWQpCi0gICAgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKLSAgICAgICAgaGVhZCA9IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCh0aGVhZFRhZywg
ZG9jdW1lbnQoKSwgdHJ1ZSAvKiBpbXBsaWNpdCAqLyk7Ci0gICAgICAgIGlmKGZvb3QpCi0gICAg
ICAgICAgICBpbnNlcnRCZWZvcmUoIGhlYWQsIGZvb3QsIGVjICk7Ci0gICAgICAgIGVsc2UgaWYo
Zmlyc3RCb2R5KQotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKCBoZWFkLCBmaXJzdEJvZHksIGVj
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXBwZW5kQ2hpbGQoaGVhZCwgZWMpOwotICAg
IH0KLSAgICByZXR1cm4gaGVhZDsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVU
SGVhZCggICkKLXsKLSAgICBpZihoZWFkKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgICAgICBoZWFkLT5yZWYoKTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJlbW92ZUNoaWxk
KGhlYWQsIGVjKTsKLSAgICAgICAgaGVhZC0+ZGVyZWYoKTsKLSAgICB9Ci0gICAgaGVhZCA9IDA7
Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVURm9vdCggICkKLXsK
LSAgICBpZiAoIWZvb3QpCi0gICAgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAg
ICAgICAgZm9vdCA9IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCh0Zm9vdFRhZywgZG9jdW1l
bnQoKSwgdHJ1ZSAvKmltcGxpY2l0ICovKTsKLSAgICAgICAgaWYgKGZpcnN0Qm9keSkKLSAgICAg
ICAgICAgIGluc2VydEJlZm9yZSggZm9vdCwgZmlyc3RCb2R5LCBlYyApOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBhcHBlbmRDaGlsZChmb290LCBlYyk7Ci0gICAgfQotICAgIHJldHVybiBm
b290OwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0ZVRGb290KCAgKQotewotICAg
IGlmKGZvb3QpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIGZvb3Qt
PnJlZigpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQoZm9vdCwgZWMpOwotICAg
ICAgICBmb290LT5kZXJlZigpOwotICAgIH0KLSAgICBmb290ID0gMDsKLX0KLQotSFRNTEVsZW1l
bnQgKkhUTUxUYWJsZUVsZW1lbnQ6OmNyZWF0ZUNhcHRpb24oICApCi17Ci0gICAgaWYoIXRDYXB0
aW9uKQotICAgIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIHRDYXB0
aW9uID0gbmV3IEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KGRvY3VtZW50KCkpOwotICAgICAgICBp
bnNlcnRCZWZvcmUoIHRDYXB0aW9uLCBmaXJzdENoaWxkKCksIGVjICk7Ci0gICAgfQotICAgIHJl
dHVybiB0Q2FwdGlvbjsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVDYXB0aW9u
KCAgKQotewotICAgIGlmKHRDYXB0aW9uKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgICAgICB0Q2FwdGlvbi0+cmVmKCk7Ci0gICAgICAgIEhUTUxFbGVtZW50OjpyZW1vdmVD
aGlsZCh0Q2FwdGlvbiwgZWMpOwotICAgICAgICB0Q2FwdGlvbi0+ZGVyZWYoKTsKLSAgICB9Ci0g
ICAgdENhcHRpb24gPSAwOwotfQotCi1IVE1MRWxlbWVudCAqSFRNTFRhYmxlRWxlbWVudDo6aW5z
ZXJ0Um93KCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIC8vIFRoZSBET00g
cmVxdWlyZXMgdGhhdCB3ZSBjcmVhdGUgYSB0Ym9keSBpZiB0aGUgdGFibGUgaXMgZW1wdHkKLSAg
ICAvLyAoY2YgRE9NMlRTIEhUTUxUYWJsZUVsZW1lbnQzMSB0ZXN0KQotICAgIC8vIChub3RlOiB0
aGlzIGlzIGRpZmZlcmVudCBmcm9tICJpZiB0aGUgdGFibGUgaGFzIG5vIHNlY3Rpb25zIiwgc2lu
Y2Ugd2UgY2FuIGhhdmUKLSAgICAvLyA8VEFCTEU+PFRSPikKLSAgICBpZighZmlyc3RCb2R5ICYm
ICFoZWFkICYmICFmb290KQotICAgICAgICBzZXRUQm9keSggbmV3IEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50KHRib2R5VGFnLCBkb2N1bWVudCgpLCB0cnVlIC8qIGltcGxpY2l0ICovKSApOwotCi0g
ICAgLy8gSUUgdHJlYXRzIGluZGV4PS0xIGFzIGRlZmF1bHQgdmFsdWUgbWVhbmluZyAnYXBwZW5k
IGFmdGVyIGxhc3QnCi0gICAgLy8gVGhpcyBpc24ndCBpbiB0aGUgRE9NLiBTbywgbm90IGltcGxl
bWVudGVkIHlldC4KLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogc2VjdGlvbiA9IDBMOwot
ICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBsYXN0U2VjdGlvbiA9IDBMOwotICAgIE5vZGUg
Km5vZGUgPSBmaXJzdENoaWxkKCk7Ci0gICAgYm9vbCBhcHBlbmQgPSAoaW5kZXggPT0gLTEpOwot
ICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKCA7IG5vZGUgJiYgKGluZGV4Pj0wIHx8
IGFwcGVuZCkgOyBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSApCi0gICAgewotICAgICAgICAv
LyB0aGVyZSBjb3VsZCBiZSAyIHRmb290IGVsZW1lbnRzIGluIHRoZSB0YWJsZS4gT25seSB0aGUg
Zmlyc3Qgb25lIGlzIHRoZSAiZm9vdCIsIHRoYXQncyB3aHkgd2UgaGF2ZSB0aGUgbW9yZQotICAg
ICAgICAvLyBjb21wbGljYXRlZCBpZiBzdGF0ZW1lbnQgYmVsb3cuCi0gICAgICAgIGlmIChub2Rl
ICE9IGZvb3QgJiYgKG5vZGUtPmhhc1RhZ05hbWUodGhlYWRUYWcpIHx8IG5vZGUtPmhhc1RhZ05h
bWUodGZvb3RUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUodGJvZHlUYWcpKSkKLSAgICAgICAgewot
ICAgICAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
ICo+KG5vZGUpOwotICAgICAgICAgICAgbGFzdFNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgICAg
ICAgaWYgKCFhcHBlbmQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcm93cyA9IHNlY3Rpb24tPm51
bVJvd3MoKTsKLSAgICAgICAgICAgICAgICBpZiAocm93cyA+PSBpbmRleCkgewotICAgICAgICAg
ICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSByb3dzOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICggIWZvdW5kICYmIGZvb3Qg
KQotICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQg
Kj4oZm9vdCk7Ci0KLSAgICAvLyBJbmRleCA9PSAwIG1lYW5zICJpbnNlcnQgYmVmb3JlIGZpcnN0
IHJvdyBpbiBjdXJyZW50IHNlY3Rpb24iCi0gICAgLy8gb3IgImFwcGVuZCBhZnRlciBsYXN0IHJv
dyIgKGlmIHRoZXJlJ3Mgbm8gY3VycmVudCBzZWN0aW9uIGFueW1vcmUpCi0gICAgaWYgKCAhc2Vj
dGlvbiAmJiAoIGluZGV4ID09IDAgfHwgYXBwZW5kICkgKQotICAgIHsKLSAgICAgICAgc2VjdGlv
biA9IGxhc3RTZWN0aW9uOwotICAgICAgICBpbmRleCA9IHNlY3Rpb24gPyBzZWN0aW9uLT5udW1S
b3dzKCkgOiAwOwotICAgIH0KLSAgICBpZiAoc2VjdGlvbiAmJiAoaW5kZXggPj0gMCB8fCBhcHBl
bmQpKQotICAgICAgICByZXR1cm4gc2VjdGlvbi0+aW5zZXJ0Um93KGluZGV4LCBlYyk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIE5vIG1vcmUgc2VjdGlvbnMgPT4gaW5kZXggaXMgdG9vIGJpZwot
ICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOwotICAgICAgICByZXR1cm4gMEw7Ci0gICAgfQot
fQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0ZVJvdyggaW50IGluZGV4LCBFeGNlcHRp
b25Db2RlJiBlYykKLXsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogc2VjdGlvbiA9IDBM
OwotICAgIE5vZGUgKm5vZGUgPSBmaXJzdENoaWxkKCk7Ci0gICAgYm9vbCBsYXN0Um93ID0gaW5k
ZXggPT0gLTE7Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGxhc3RTZWN0aW9uID0gMEw7
Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoIDsgbm9kZSA7IG5vZGUgPSBub2Rl
LT5uZXh0U2libGluZygpICkKLSAgICB7Ci0gICAgICAgIGlmIChub2RlICE9IGZvb3QgJiYgKG5v
ZGUtPmhhc1RhZ05hbWUodGhlYWRUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUodGZvb3RUYWcpIHx8
IAotICAgICAgICAgICAgbm9kZS0+aGFzVGFnTmFtZSh0Ym9keVRhZykpKSB7Ci0gICAgICAgICAg
ICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4obm9kZSk7
Ci0gICAgICAgICAgICBsYXN0U2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICAgICAgICBpbnQgcm93
cyA9IHNlY3Rpb24tPm51bVJvd3MoKTsKLSAgICAgICAgICAgIGlmICggIWxhc3RSb3cgKQotICAg
ICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggcm93cyA+IGluZGV4ICkgewotICAgICAg
ICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSByb3dz
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlY3Rpb24gPSAwTDsKLSAgICB9
Ci0gICAgaWYgKCAhZm91bmQgJiYgZm9vdCApCi0gICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2Fz
dDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihmb290KTsKLQotICAgIGlmICggbGFzdFJvdyAp
Ci0gICAgICAgIGxhc3RTZWN0aW9uLT5kZWxldGVSb3coIC0xLCBlYyApOwotICAgIGVsc2UgaWYg
KCBzZWN0aW9uICYmIGluZGV4ID49IDAgJiYgaW5kZXggPCBzZWN0aW9uLT5udW1Sb3dzKCkgKQot
ICAgICAgICBzZWN0aW9uLT5kZWxldGVSb3coIGluZGV4LCBlYyApOwotICAgIGVsc2UKLSAgICAg
ICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsKLX0KLQotQ29udGFpbmVyTm9kZSogSFRNTFRhYmxlRWxl
bWVudDo6YWRkQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPiBjaGlsZCkKLXsKLSAgICBpZiAoY2hpbGQt
Pmhhc1RhZ05hbWUoZm9ybVRhZykpIHsKLSAgICAgICAgLy8gRmlyc3QgYWRkIHRoZSBjaGlsZC4K
LSAgICAgICAgSFRNTEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsKLQotICAgICAgICAvLyBOb3cg
c2ltcGx5IHJldHVybiBvdXJzZWx2ZXMgYXMgdGhlIGNvbnRhaW5lciB0byBpbnNlcnQgaW50by4K
LSAgICAgICAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBkZW1vdGluZyB0aGUgZm9ybSB0byBh
IGxlYWYgYW5kIG1vdmluZyBpdCBzYWZlbHkgb3V0IG9mIHRoZSB3YXkuCi0gICAgICAgIHJldHVy
biB0aGlzOwotICAgIH0KLQotICAgIC8vIFRoZSBjcmVhdGlvbiBvZiA8dGJvZHk+IGVsZW1lbnRz
IHJlbGllcyBvbiB0aGUgImNoaWxkQWxsb3dlZCIgY2hlY2ssCi0gICAgLy8gc28gd2UgbmVlZCB0
byBkbyBpdCBldmVuIGZvciBYTUwgZG9jdW1lbnRzLgotICAgIGFzc2VydChjaGlsZC0+bm9kZVR5
cGUoKSAhPSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTsKLSAgICBpZiAoIWRvY3VtZW50KCktPmlz
SFRNTERvY3VtZW50KCkgJiYgIWNoaWxkQWxsb3dlZChjaGlsZC5nZXQoKSkpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgQ29udGFpbmVyTm9kZSogY29udGFpbmVyID0gSFRNTEVsZW1lbnQ6OmFk
ZENoaWxkKGNoaWxkLmdldCgpKTsKLSAgICBpZiAoY29udGFpbmVyKSB7Ci0gICAgICAgIGlmICgh
dENhcHRpb24gJiYgY2hpbGQtPmhhc1RhZ05hbWUoY2FwdGlvblRhZykpCi0gICAgICAgICAgICB0
Q2FwdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUNhcHRpb25FbGVtZW50ICo+KGNoaWxkLmdl
dCgpKTsKLSAgICAgICAgZWxzZSBpZiAoIWhlYWQgJiYgY2hpbGQtPmhhc1RhZ05hbWUodGhlYWRU
YWcpKQotICAgICAgICAgICAgaGVhZCA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50ICo+KGNoaWxkLmdldCgpKTsKLSAgICAgICAgZWxzZSBpZiAoIWZvb3QgJiYgY2hpbGQtPmhh
c1RhZ05hbWUodGZvb3RUYWcpKQotICAgICAgICAgICAgZm9vdCA9IHN0YXRpY19jYXN0PEhUTUxU
YWJsZVNlY3Rpb25FbGVtZW50ICo+KGNoaWxkLmdldCgpKTsKLSAgICAgICAgZWxzZSBpZiAoIWZp
cnN0Qm9keSAmJiBjaGlsZC0+aGFzVGFnTmFtZSh0Ym9keVRhZykpIHsKLSAgICAgICAgICAgIGZp
cnN0Qm9keSA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGNoaWxkLmdl
dCgpKTsKLSAgICAgICAgICAgIGZpcnN0Qm9keS0+cmVmKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgcmV0dXJuIGNvbnRhaW5lcjsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpjaGlsZHJl
bkNoYW5nZWQoKQotewotICAgIEhUTUxFbGVtZW50OjpjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAK
LSAgICBpZiAoZmlyc3RCb2R5ICYmIGZpcnN0Qm9keS0+cGFyZW50Tm9kZSgpICE9IHRoaXMpIHsK
LSAgICAgICAgZmlyc3RCb2R5LT5kZXJlZigpOwotICAgICAgICBmaXJzdEJvZHkgPSAwOwotICAg
IH0KLX0gCi0KLWJvb2wgSFRNTFRhYmxlRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZp
ZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsK
LSAgICBpZiAoYXR0ck5hbWUgPT0gYmFja2dyb3VuZEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0g
KE1hcHBlZEF0dHJpYnV0ZUVudHJ5KShlTGFzdEVudHJ5ICsgZG9jdW1lbnQoKS0+ZG9jSUQoKSk7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09
IHdpZHRoQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoZWlnaHRBdHRyIHx8Ci0gICAgICAg
IGF0dHJOYW1lID09IGJnY29sb3JBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGNlbGxzcGFj
aW5nQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSB2c3BhY2VBdHRyIHx8Ci0gICAgICAgIGF0
dHJOYW1lID09IGhzcGFjZUF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdmFsaWduQXR0cikg
ewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSBib3JkZXJjb2xvckF0dHIpIHsKLSAgICAg
ICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAg
IAotICAgIGlmIChhdHRyTmFtZSA9PSBib3JkZXJBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVU
YWJsZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFt
ZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVRhYmxlOwotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfSAKLSAgICAKLSAgICByZXR1cm4gSFRNTEVsZW1lbnQ6Om1hcFRvRW50
cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQotewotICAgIGlmIChhdHRyLT5u
YW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJP
UF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0g
aGVpZ2h0QXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfSEVJR0hU
LCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBib3JkZXJB
dHRyKSAgewotICAgICAgICBtX25vQm9yZGVyID0gdHJ1ZTsKLSAgICAgICAgaWYgKGF0dHItPmRl
Y2woKSkgewotICAgICAgICAgICAgUmVmUHRyPENTU1ZhbHVlPiB2YWwgPSBhdHRyLT5kZWNsKCkt
PmdldFByb3BlcnR5Q1NTVmFsdWUoQ1NTX1BST1BfQk9SREVSX0xFRlRfV0lEVEgpOwotICAgICAg
ICAgICAgaWYgKHZhbCAmJiB2YWwtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltVmFsID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih2YWwuZ2V0KCkpOwotICAgICAgICAgICAgICAgIG1fbm9Cb3JkZXIgPSAhcHJpbVZh
bC0+Z2V0RmxvYXRWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUik7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIWF0dHItPmlzTnVsbCgpKSB7Ci0g
ICAgICAgICAgICAvLyAjIyMgdGhpcyBuZWVkcyBtb3JlIHdvcmssIGFzIHRoZSBib3JkZXIgdmFs
dWUgaXMgbm90IG9ubHkKLSAgICAgICAgICAgIC8vICAgICB0aGUgYm9yZGVyIG9mIHRoZSBib3gs
IGJ1dCBhbHNvIGJldHdlZW4gdGhlIGNlbGxzCi0gICAgICAgICAgICBpbnQgYm9yZGVyID0gMDsK
LSAgICAgICAgICAgIGlmIChhdHRyLT5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgYm9yZGVy
ID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBib3JkZXIgPSBhdHRyLT52
YWx1ZSgpLnRvSW50KCk7Ci0jaWZkZWYgREVCVUdfRFJBV19CT1JERVIKLSAgICAgICAgICAgIGJv
cmRlcj0xOwotI2VuZGlmCi0gICAgICAgICAgICBtX25vQm9yZGVyID0gIWJvcmRlcjsKLSAgICAg
ICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9CT1JERVJfV0lEVEgsIFN0cmluZzo6
bnVtYmVyKGJvcmRlcikpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkg
PT0gYmdjb2xvckF0dHIpIHsKLSAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQkFD
S0dST1VORF9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gYm9yZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIG1fc29saWQgPSBhdHRyLT5kZWNsKCk7
Ci0gICAgICAgIGlmICghYXR0ci0+ZGVjbCgpICYmICFhdHRyLT5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JPUkRFUl9DT0xPUiwgYXR0ci0+dmFs
dWUoKSk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJf
VE9QX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0
dHIsIENTU19QUk9QX0JPUkRFUl9CT1RUT01fU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAg
ICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZTEUsIENT
U19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1Bf
Qk9SREVSX1JJR0hUX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIG1fc29saWQg
PSB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYmFja2dy
b3VuZEF0dHIpIHsKLSAgICAgICAgU3RyaW5nIHVybCA9IFdlYkNvcmU6OnBhcnNlVVJMKGF0dHIt
PnZhbHVlKCkpOwotICAgICAgICBpZiAoIXVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRD
U1NJbWFnZVByb3BlcnR5KGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfSU1BR0UsIGRvY3VtZW50
KCktPmNvbXBsZXRlVVJMKHVybCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGZy
YW1lQXR0cikgewotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IHJ1bGVzQXR0cikgewot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGNlbGxzcGFjaW5nQXR0cikgewotICAgICAg
ICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTTGVuZ3Ro
KGF0dHIsIENTU19QUk9QX0JPUkRFUl9TUEFDSU5HLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjZWxscGFkZGluZ0F0dHIpIHsKLSAgICAgICAgaWYgKCFh
dHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHBhZGRpbmcgPSBtYXgoIDAsIGF0
dHItPnZhbHVlKCkudG9JbnQoKSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYWRkaW5n
ID0gMTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZSgpKSB7
Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAqPihyZW5kZXJlcigpKS0+c2V0
Q2VsbFBhZGRpbmcocGFkZGluZyk7Ci0gICAgICAgICAgICBpZiAoIXJlbmRlcmVyKCktPm5lZWRz
TGF5b3V0KCkpCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXQodHJ1
ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBjb2xzQXR0cikg
ewotICAgICAgICAvLyAjIyMKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB2c3BhY2VB
dHRyKSB7Ci0gICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fVE9QLCBh
dHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJ
Tl9CT1RUT00sIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IGhzcGFjZUF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX01BUkdJ
Tl9MRUZULCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19Q
Uk9QX01BUkdJTl9SSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9GTE9BVCwgYXR0
ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsaWduQXR0cikg
ewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRk
Q1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVkVSVElDQUxfQUxJR04sIGF0dHItPnZhbHVlKCkp
OwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUo
YXR0cik7Ci19Ci0KLUNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBIVE1MVGFibGVFbGVtZW50
OjphZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCkKLXsKLSAgICBpZiAobV9ub0JvcmRlcikK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTWFwcGVkQXR0cmlidXRlIGF0dHIodGFibGVib3JkZXJB
dHRyLCBtX3NvbGlkID8gInNvbGlkIiA6ICJvdXRzZXQiKTsKLSAgICBDU1NNYXBwZWRBdHRyaWJ1
dGVEZWNsYXJhdGlvbiogZGVjbCA9IGdldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQs
ICZhdHRyKTsKLSAgICBpZiAoIWRlY2wpIHsKLSAgICAgICAgZGVjbCA9IG5ldyBDU1NNYXBwZWRB
dHRyaWJ1dGVEZWNsYXJhdGlvbigwKTsKLSAgICAgICAgZGVjbC0+c2V0UGFyZW50KGRvY3VtZW50
KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICAgICAgZGVjbC0+c2V0Tm9kZSh0aGlzKTsKLSAgICAg
ICAgZGVjbC0+c2V0U3RyaWN0UGFyc2luZyhmYWxzZSk7IC8vIE1hcHBlZCBhdHRyaWJ1dGVzIGFy
ZSBqdXN0IGFsd2F5cyBxdWlya3kuCi0gICAgICAgIAotICAgICAgICBkZWNsLT5yZWYoKTsgLy8g
VGhpcyBzaW5nbGUgcmVmIHBpbnMgdXMgaW4gdGhlIHRhYmxlIHVudGlsIHRoZSBkb2N1bWVudCBk
aWVzLgotCi0gICAgICAgIGludCB2ID0gbV9zb2xpZCA/IENTU19WQUxfU09MSUQgOiBDU1NfVkFM
X09VVFNFVDsKLSAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1RPUF9T
VFlMRSwgdiwgZmFsc2UpOwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JE
RVJfQk9UVE9NX1NUWUxFLCB2LCBmYWxzZSk7Ci0gICAgICAgIGRlY2wtPnNldFByb3BlcnR5KENT
U19QUk9QX0JPUkRFUl9MRUZUX1NUWUxFLCB2LCBmYWxzZSk7Ci0gICAgICAgIGRlY2wtPnNldFBy
b3BlcnR5KENTU19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgdiwgZmFsc2UpOwotCi0gICAgICAg
IHNldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQsICZhdHRyLCBkZWNsKTsKLSAgICAg
ICAgZGVjbC0+c2V0UGFyZW50KDApOwotICAgICAgICBkZWNsLT5zZXROb2RlKDApOwotICAgICAg
ICBkZWNsLT5zZXRNYXBwZWRTdGF0ZShlUGVyc2lzdGVudCwgYXR0ci5uYW1lKCksIGF0dHIudmFs
dWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWNsOwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbiogSFRNTFRhYmxlRWxlbWVudDo6Z2V0U2hhcmVkQ2VsbERlY2woKQotewotICAgIE1h
cHBlZEF0dHJpYnV0ZSBhdHRyKGNlbGxib3JkZXJBdHRyLCBtX25vQm9yZGVyID8gIm5vbmUiIDog
KG1fc29saWQgPyAic29saWQiIDogImluc2V0IikpOwotICAgIENTU01hcHBlZEF0dHJpYnV0ZURl
Y2xhcmF0aW9uKiBkZWNsID0gZ2V0TWFwcGVkQXR0cmlidXRlRGVjbChlUGVyc2lzdGVudCwgJmF0
dHIpOwotICAgIGlmICghZGVjbCkgewotICAgICAgICBkZWNsID0gbmV3IENTU01hcHBlZEF0dHJp
YnV0ZURlY2xhcmF0aW9uKDApOwotICAgICAgICBkZWNsLT5zZXRQYXJlbnQoZG9jdW1lbnQoKS0+
ZWxlbWVudFNoZWV0KCkpOwotICAgICAgICBkZWNsLT5zZXROb2RlKHRoaXMpOwotICAgICAgICBk
ZWNsLT5zZXRTdHJpY3RQYXJzaW5nKGZhbHNlKTsgLy8gTWFwcGVkIGF0dHJpYnV0ZXMgYXJlIGp1
c3QgYWx3YXlzIHF1aXJreS4KLSAgICAgICAgCi0gICAgICAgIGRlY2wtPnJlZigpOyAvLyBUaGlz
IHNpbmdsZSByZWYgcGlucyB1cyBpbiB0aGUgdGFibGUgdW50aWwgdGhlIHRhYmxlIGRpZXMuCi0g
ICAgICAgIAotICAgICAgICBpZiAobV9ub0JvcmRlcikKLSAgICAgICAgICAgIGRlY2wtPnNldFBy
b3BlcnR5KENTU19QUk9QX0JPUkRFUl9XSURUSCwgIjAiLCBmYWxzZSk7Ci0gICAgICAgIGVsc2Ug
ewotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1dJRFRILCAi
MXB4IiwgZmFsc2UpOwotICAgICAgICAgICAgaW50IHYgPSBtX3NvbGlkID8gQ1NTX1ZBTF9TT0xJ
RCA6IENTU19WQUxfSU5TRVQ7Ci0gICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJP
UF9CT1JERVJfVE9QX1NUWUxFLCB2LCBmYWxzZSk7Ci0gICAgICAgICAgICBkZWNsLT5zZXRQcm9w
ZXJ0eShDU1NfUFJPUF9CT1JERVJfQk9UVE9NX1NUWUxFLCB2LCBmYWxzZSk7Ci0gICAgICAgICAg
ICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfTEVGVF9TVFlMRSwgdiwgZmFsc2Up
OwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1JJR0hUX1NU
WUxFLCB2LCBmYWxzZSk7Ci0gICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9C
T1JERVJfQ09MT1IsICJpbmhlcml0IiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0
TWFwcGVkQXR0cmlidXRlRGVjbChlUGVyc2lzdGVudCwgJmF0dHIsIGRlY2wpOwotICAgICAgICBk
ZWNsLT5zZXRQYXJlbnQoMCk7Ci0gICAgICAgIGRlY2wtPnNldE5vZGUoMCk7Ci0gICAgICAgIGRl
Y2wtPnNldE1hcHBlZFN0YXRlKGVQZXJzaXN0ZW50LCBhdHRyLm5hbWUoKSwgYXR0ci52YWx1ZSgp
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlY2w7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6
YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIW1fYXR0YWNoZWQpOwotICAgIEhUTUxFbGVtZW50Ojph
dHRhY2goKTsKLSAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlKCkpCi0g
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlICo+KHJlbmRlcmVyKCkpLT5zZXRDZWxsUGFk
ZGluZyggcGFkZGluZyApOwotfQotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6OmlzVVJMQXR0cmli
dXRlKEF0dHJpYnV0ZSAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09
IGJhY2tncm91bmRBdHRyOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb24+IEhUTUxUYWJsZUVs
ZW1lbnQ6OnJvd3MoKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb24+KG5ldyBI
VE1MQ29sbGVjdGlvbih0aGlzLCBIVE1MQ29sbGVjdGlvbjo6VEFCTEVfUk9XUykpOwotfQotCi1S
ZWZQdHI8SFRNTENvbGxlY3Rpb24+IEhUTUxUYWJsZUVsZW1lbnQ6OnRCb2RpZXMoKQotewotICAg
IHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb24+KG5ldyBIVE1MQ29sbGVjdGlvbih0aGlzLCBI
VE1MQ29sbGVjdGlvbjo6VEFCTEVfVEJPRElFUykpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxl
bWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRy
KTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZh
bHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxUYWJsZUVsZW1lbnQ6OmJnQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoYmdjb2xvckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldEJnQ29s
b3IoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIs
IHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmJvcmRlcigpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShib3JkZXJBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFi
bGVFbGVtZW50OjpzZXRCb3JkZXIoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUoYm9yZGVyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6
Y2VsbFBhZGRpbmcoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2VsbHBhZGRp
bmdBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRDZWxsUGFkZGluZyhjb25z
dCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjZWxscGFkZGluZ0F0dHIsIHZh
bHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmNlbGxTcGFjaW5nKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNlbGxzcGFjaW5nQXR0cik7Ci19Ci0KLXZvaWQg
SFRNTFRhYmxlRWxlbWVudDo6c2V0Q2VsbFNwYWNpbmcoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUoY2VsbHNwYWNpbmdBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBI
VE1MVGFibGVFbGVtZW50OjpmcmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShmcmFtZUF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldEZyYW1lKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGZyYW1lQXR0ciwgdmFsdWUpOwot
fQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6cnVsZXMoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUocnVsZXNBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50Ojpz
ZXRSdWxlcyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShydWxlc0F0
dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OnN1bW1hcnkoKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoc3VtbWFyeUF0dHIpOwotfQotCi12b2lkIEhU
TUxUYWJsZUVsZW1lbnQ6OnNldFN1bW1hcnkoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoc3VtbWFyeUF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVs
ZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3RyaW5nICZ2
YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWJvb2wgSFRNTFRhYmxlUGFydEVsZW1lbnQ6Om1hcFRvRW50cnko
Y29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1
bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAg
ICAgIHJlc3VsdCA9IChNYXBwZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRyeSArIGRvY3VtZW50
KCktPmRvY0lEKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlm
IChhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBib3JkZXJj
b2xvckF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gdmFsaWduQXR0ciB8fAotICAgICAgICBh
dHRyTmFtZSA9PSBoZWlnaHRBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGFs
aWduQXR0cikgewotICAgICAgICByZXN1bHQgPSBlQ2VsbDsgLy8gQWxsIHRhYmxlIHBhcnRzIHdp
bGwganVzdCBzaGFyZSBpbiB0aGUgVEQgc3BhY2UuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gSFRNTEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3Vs
dCk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGJnY29s
b3JBdHRyKSB7Ci0gICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRf
Q09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJh
Y2tncm91bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBXZWJDb3JlOjpwYXJzZVVSTChh
dHRyLT52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0eSgpKQotICAgICAgICAgICAg
YWRkQ1NTSW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0lNQUdFLCBkb2N1
bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9
PSBib3JkZXJjb2xvckF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0NPTE9S
LCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19Q
Uk9QX0JPUkRFUl9UT1BfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NT
UHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgQ1NTX1ZBTF9TT0xJ
RCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfTEVG
VF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRy
LCBDU1NfUFJPUF9CT1JERVJfUklHSFRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICB9
Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsaWduQXR0cikgewotICAgICAgICBp
ZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfVkVSVElDQUxfQUxJR04sIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBjb25zdCBBdG9taWNT
dHJpbmcmIHYgPSBhdHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2Uo
diwgIm1pZGRsZSIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKHYsICJjZW50ZXIiKSkKLSAgICAgICAg
ICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIENTU19WQUxfX1dF
QktJVF9DRU5URVIpOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAiYWJz
bWlkZGxlIikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9URVhU
X0FMSUdOLCBDU1NfVkFMX0NFTlRFUik7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKHYsICJsZWZ0IikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJP
UF9URVhUX0FMSUdOLCBDU1NfVkFMX19XRUJLSVRfTEVGVCk7Ci0gICAgICAgIGVsc2UgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKHYsICJyaWdodCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lUX1JJR0hUKTsKLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9B
TElHTiwgdik7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikgewot
ICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NT
TGVuZ3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6SFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRv
YywgYm9vbCBpbXBsaWNpdCkKLSAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05hbWUsIGRv
YykKLXsKLSAgICBtX2ltcGxpY2l0ID0gaW1wbGljaXQ7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVy
biBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0clRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZm9y
bVRhZykgfHwKLSAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0K
LQotQ29udGFpbmVyTm9kZSogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmFkZENoaWxkKFBhc3NS
ZWZQdHI8Tm9kZT4gY2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcp
KSB7Ci0gICAgICAgIC8vIEZpcnN0IGFkZCB0aGUgY2hpbGQuCi0gICAgICAgIEhUTUxUYWJsZVBh
cnRFbGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBseSByZXR1
cm4gb3Vyc2VsdmVzIGFzIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAgICAgIC8v
IFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFmIGFuZCBt
b3ZpbmcgaXQgc2FmZWx5IG91dCBvZiB0aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhpczsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gSFRNTFRhYmxlUGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsK
LX0KLQotLy8gdGhlc2UgZnVuY3Rpb25zIGFyZSByYXRoZXIgc2xvdywgc2luY2Ugd2UgbmVlZCB0
byBnZXQgdGhlIHJvdyBhdAotLy8gdGhlIGluZGV4Li4uIGJ1dCB0aGV5IGFyZW4ndCB1c2VkIGR1
cmluZyB1c3VhbCBIVE1MIHBhcnNpbmcgYW55d2F5Ci1IVE1MRWxlbWVudCAqSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQ6Omluc2VydFJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsK
LSAgICBIVE1MVGFibGVSb3dFbGVtZW50ICpyID0gMEw7Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBj
aGlsZHJlbiA9IGNoaWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtUm93cyA9IGNoaWxkcmVuID8gKGlu
dCljaGlsZHJlbi0+bGVuZ3RoKCkgOiAwOwotICAgIGlmICggaW5kZXggPCAtMSB8fCBpbmRleCA+
IG51bVJvd3MgKSB7Ci0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7IC8vIHBlciB0aGUgRE9N
Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHIgPSBuZXcgSFRNTFRhYmxlUm93RWxl
bWVudChkb2N1bWVudCgpKTsKLSAgICAgICAgaWYgKCBudW1Sb3dzID09IGluZGV4IHx8IGluZGV4
ID09IC0xICkKLSAgICAgICAgICAgIGFwcGVuZENoaWxkKHIsIGVjKTsKLSAgICAgICAgZWxzZSB7
Ci0gICAgICAgICAgICBOb2RlICpuOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMSkKLSAgICAg
ICAgICAgICAgICBuID0gZmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgIG4gPSBjaGlsZHJlbi0+aXRlbShpbmRleCk7Ci0gICAgICAgICAgICBpbnNlcnRCZWZv
cmUociwgbiwgZWMgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcjsKLX0KLQotdm9p
ZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6ZGVsZXRlUm93KCBpbnQgaW5kZXgsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVz
KCk7Ci0gICAgaW50IG51bVJvd3MgPSBjaGlsZHJlbiA/IChpbnQpY2hpbGRyZW4tPmxlbmd0aCgp
IDogMDsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgIGluZGV4ID0gbnVtUm93cyAtIDE7
Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1Sb3dzKSB7Ci0gICAgICAgIFJlZlB0
cjxOb2RlPiByb3cgPSBjaGlsZHJlbi0+aXRlbShpbmRleCk7Ci0gICAgICAgIEhUTUxFbGVtZW50
OjpyZW1vdmVDaGlsZChyb3cuZ2V0KCksIGVjKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZWMgPSBJ
TkRFWF9TSVpFX0VSUjsKLX0KLQotaW50IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpudW1Sb3dz
KCkgY29uc3QKK0hUTUxUYWJsZVJvd0VsZW1lbnQ6OkhUTUxUYWJsZVJvd0VsZW1lbnQoRG9jdW1l
bnQqIGRvYykKKyAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRyVGFnLCBkb2MpCiB7Ci0gICAg
aW50IHJvd3MgPSAwOwotICAgIGNvbnN0IE5vZGUgKm4gPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hp
bGUgKG4pIHsKLSAgICAgICAgaWYgKG4tPmhhc1RhZ05hbWUodHJUYWcpKQotICAgICAgICAgICAg
cm93cysrOwotICAgICAgICBuID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gcm93czsKIH0KIAotU3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjphbGlnbigpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJs
ZVNlY3Rpb25FbGVtZW50OjpjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShj
aGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnNldENoKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAg
IHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNl
Y3Rpb25FbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQ6OnZBbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWxp
Z25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6c2V0VkFsaWduKGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVl
KTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6
cm93cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xs
ZWN0aW9uKHRoaXMsIEhUTUxDb2xsZWN0aW9uOjpUQUJMRV9ST1dTKSk7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQogYm9vbCBIVE1MVGFibGVSb3dFbGVtZW50OjpjaGVja0RURChjb25zdCBO
b2RlKiBuZXdDaGlsZCkKIHsKICAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGRUYWcp
IHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKHRoVGFnKSB8fApAQCAtODY3LDcgKzk4LDcgQEAgaW50
IEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnJvd0luZGV4KCkgY29ucwogICAgICAgICB9CiAgICAgfQog
Ci0gICAgaWYgKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmb290ID0gc3RhdGljX2Nhc3Q8SFRN
TFRhYmxlRWxlbWVudCAqPih0YWJsZSktPnRGb290KCkpIHsKKyAgICBpZiAoSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQqIGZvb3QgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50Kj4odGFibGUp
LT50Rm9vdCgpKSB7CiAgICAgICAgIGZvciAoTm9kZSAqcm93ID0gZm9vdC0+Zmlyc3RDaGlsZCgp
OyByb3c7IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICAgICAgaWYgKHJvdyA9
PSB0aGlzKQogICAgICAgICAgICAgICAgIHJldHVybiBySW5kZXg7CkBAIC05OTAsMzQ1ICsyMjEs
NCBAQCB2b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldFZBbGlnbihjb25zCiAgICAgc2V0QXR0
cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1I
VE1MVGFibGVDZWxsRWxlbWVudDo6SFRNTFRhYmxlQ2VsbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVk
TmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgOiBIVE1MVGFibGVQYXJ0RWxlbWVudCh0
YWdOYW1lLCBkb2MpCi17Ci0gICAgX2NvbCA9IC0xOwotICAgIF9yb3cgPSAtMTsKLSAgICBjU3Bh
biA9IHJTcGFuID0gMTsKLSAgICByb3dIZWlnaHQgPSAwOwotICAgIG1fc29saWQgPSBmYWxzZTsK
LX0KLQotSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6On5IVE1MVGFibGVDZWxsRWxlbWVudCgpCi17Ci19
Ci0KLWludCBIVE1MVGFibGVDZWxsRWxlbWVudDo6Y2VsbEluZGV4KCkgY29uc3QKLXsKLSAgICBp
bnQgaW5kZXggPSAwOwotICAgIGZvciAoY29uc3QgTm9kZSAqIG5vZGUgPSBwcmV2aW91c1NpYmxp
bmcoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnByZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgIGlm
IChub2RlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRoVGFnKSkKLSAg
ICAgICAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpbmRleDsKLX0KLQot
Ym9vbCBIVE1MVGFibGVDZWxsRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1l
JiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBp
ZiAoYXR0ck5hbWUgPT0gbm93cmFwQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2Fs
OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9
PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAg
ICByZXN1bHQgPSBlQ2VsbDsgLy8gQmVjYXVzZSBvZiB0aGUgcXVpcmt5IGJlaGF2aW9yIG9mIGln
bm9yaW5nIDAgdmFsdWVzLCBjZWxscyBhcmUgc3BlY2lhbC4KLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIHJldHVybiBIVE1MVGFibGVQYXJ0RWxlbWVudDo6bWFwVG9FbnRyeShh
dHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6cGFyc2VN
YXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQotewotICAgIGlmIChhdHRyLT5u
YW1lKCkgPT0gcm93c3BhbkF0dHIpIHsKLSAgICAgICAgclNwYW4gPSAhYXR0ci0+aXNOdWxsKCkg
PyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAxOwotICAgICAgICBpZiAoclNwYW4gPCAxKSByU3Bh
biA9IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFibGVDZWxs
KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwqPihyZW5kZXJlcigp
KS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBj
b2xzcGFuQXR0cikgewotICAgICAgICBjU3BhbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZh
bHVlKCkudG9JbnQoKSA6IDE7Ci0gICAgICAgIGlmIChjU3BhbiA8IDEpIGNTcGFuID0gMTsKLSAg
ICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNlbGwoKSkKLSAgICAg
ICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ2VsbCo+KHJlbmRlcmVyKCkpLT51cGRhdGVG
cm9tRWxlbWVudCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IG5vd3JhcEF0dHIp
IHsKLSAgICAgICAgaWYgKCFhdHRyLT5pc051bGwoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3Bl
cnR5KGF0dHIsIENTU19QUk9QX1dISVRFX1NQQUNFLCBDU1NfVkFMX19XRUJLSVRfTk9XUkFQKTsK
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgaWYg
KCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IHdpZHRoSW50ID0g
YXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAgICAgaWYgKHdpZHRoSW50ID4gMCkgLy8g
d2lkdGg9IjAiIGlzIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5JRS4KLSAgICAg
ICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVl
KCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0
cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAg
ICBpbnQgaGVpZ2h0SW50ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAgICAgaWYg
KGhlaWdodEludCA+IDApIC8vIGhlaWdodD0iMCIgaXMgaWdub3JlZCBmb3IgY29tcGF0aWJpbGl0
eSB3aXRoIFdpbklFLgotICAgICAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJP
UF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAg
IEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQot
Ly8gdXNlZCBieSB0YWJsZSBjZWxscyB0byBzaGFyZSBzdHlsZSBkZWNscyBjcmVhdGVkIGJ5IHRo
ZSBlbmNsb3NpbmcgdGFibGUuCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogSFRNTFRhYmxl
Q2VsbEVsZW1lbnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2woKQotewotICAgIE5vZGUq
IHAgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHAgJiYgIXAtPmhhc1RhZ05hbWUodGFibGVU
YWcpKQotICAgICAgICBwID0gcC0+cGFyZW50Tm9kZSgpOwotCi0gICAgaWYgKHApIHsKLSAgICAg
ICAgSFRNTFRhYmxlRWxlbWVudCogdGFibGUgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50
Kj4ocCk7Ci0gICAgICAgIHJldHVybiB0YWJsZS0+Z2V0U2hhcmVkQ2VsbERlY2woKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxsRWxlbWVudDo6aXNVUkxB
dHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJldHVybiBhdHRyLT5uYW1l
KCkgPT0gYmFja2dyb3VuZEF0dHI7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6
YWJicigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhYmJyQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEFiYnIoY29uc3QgU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYWJickF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxU
YWJsZUNlbGxFbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0
ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRBbGlnbihj
b25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVl
KTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpheGlzKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGF4aXNBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxs
RWxlbWVudDo6c2V0QXhpcyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShheGlzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmJn
Q29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIpOwot
fQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0
cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6Y2goKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoY2hhckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRD
aChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyQXR0ciwgdmFs
dWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFi
bGVDZWxsRWxlbWVudDo6c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRB
dHRyaWJ1dGUoY2hhcm9mZkF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxl
bWVudDo6c2V0Q29sU3BhbihpbnQgbikKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY29sc3BhbkF0dHIs
IFN0cmluZzo6bnVtYmVyKG4pKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojpo
ZWFkZXJzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGhlYWRlcnNBdHRyKTsK
LX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0SGVhZGVycyhjb25zdCBTdHJpbmcg
JnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShoZWFkZXJzQXR0ciwgdmFsdWUpOwotfQotCi1T
dHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZShoZWlnaHRBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVu
dDo6c2V0SGVpZ2h0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGhl
aWdodEF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxsRWxlbWVudDo6bm9XcmFw
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShub3dyYXBBdHRyKS5pc051bGwo
KTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Tm9XcmFwKGJvb2wgYikKLXsK
LSAgICBzZXRBdHRyaWJ1dGUobm93cmFwQXR0ciwgYiA/ICIiIDogMCk7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFJvd1NwYW4oaW50IG4pCi17Ci0gICAgc2V0QXR0cmlidXRl
KHJvd3NwYW5BdHRyLCBTdHJpbmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVD
ZWxsRWxlbWVudDo6c2NvcGUoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoc2Nv
cGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0U2NvcGUoY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2NvcGVBdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxF
bGVtZW50OjpzZXRWQWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1
dGUodmFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6
OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19
Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFdpZHRoKGNvbnN0IFN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJsZUNvbEVsZW1lbnQ6OkhUTUxUYWJsZUNvbEVsZW1lbnQo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgICA6IEhUTUxU
YWJsZVBhcnRFbGVtZW50KHRhZ05hbWUsIGRvYykKLXsKLSAgICBfc3BhbiA9ICh0YWdOYW1lLm1h
dGNoZXMoY29sZ3JvdXBUYWcpID8gMCA6IDEpOwotfQotCi1ib29sIEhUTUxUYWJsZUNvbEVsZW1l
bnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJp
YnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IHdpZHRoQXR0
cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGF0
dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnBhcnNlTWFw
cGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFt
ZSgpID09IHNwYW5BdHRyKSB7Ci0gICAgICAgIF9zcGFuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0
ci0+dmFsdWUoKS50b0ludCgpIDogMTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVy
ZXIoKS0+aXNUYWJsZUNvbCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVD
b2wqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9XSURUSCwg
YXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50
OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVs
ZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5n
ICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0
cmluZyBIVE1MVGFibGVDb2xFbGVtZW50OjpjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0
dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0Q2go
Y29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVl
KTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVD
b2xFbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6
OnNldFNwYW4oaW50IG4pCi17Ci0gICAgc2V0QXR0cmlidXRlKHNwYW5BdHRyLCBTdHJpbmc6Om51
bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50Ojp2QWxpZ24oKSBjb25z
dAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRN
TFRhYmxlQ29sRWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNv
bEVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHdpZHRo
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7Ci19Ci0K
LS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDo6bWFw
VG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50
cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0g
ICAgICAgIHJlc3VsdCA9IGVDYXB0aW9uOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwot
fQotCi12b2lkIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShN
YXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0
dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAg
IGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0NBUFRJT05fU0lERSwgYXR0ci0+dmFsdWUo
KSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShhdHRyKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjphbGlnbigpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhU
TUxUYWJsZUNhcHRpb25FbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQogfQpJbmRleDogaHRtbC9I
VE1MVGFibGVTZWN0aW9uRWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0bWwvSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQuaAkocmV2aXNpb24gMTQzMjUpCisrKyBodG1sL0hUTUxUYWJsZVNlY3Rpb25F
bGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI1LDE0MiArMjUsMTMgQEAKICAqCiAgKi8KIAot
I2lmbmRlZiBIVE1MVGFibGVFbGVtZW50SW1wbF9ICi0jZGVmaW5lIEhUTUxUYWJsZUVsZW1lbnRJ
bXBsX0gKKyNpZm5kZWYgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnRfSAorI2RlZmluZSBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudF9ICiAKLSNpbmNsdWRlICJIVE1MRWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxUYWJsZVBhcnRFbGVtZW50LmgiCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgSFRNTENvbGxlY3Rpb247Ci1jbGFzcyBIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDsKLWNsYXNzIEhUTUxUYWJsZUNlbGxFbGVtZW50OwotY2xhc3MgSFRNTFRh
YmxlQ2FwdGlvbkVsZW1lbnQ7Ci0KLWNsYXNzIEhUTUxUYWJsZUVsZW1lbnQgOiBwdWJsaWMgSFRN
TEVsZW1lbnQgewotcHVibGljOgotICAgIGVudW0gUnVsZXMgewotICAgICAgICBOb25lICAgID0g
MHgwMCwKLSAgICAgICAgUkdyb3VwcyA9IDB4MDEsCi0gICAgICAgIENHcm91cHMgPSAweDAyLAot
ICAgICAgICBHcm91cHMgID0gMHgwMywKLSAgICAgICAgUm93cyAgICA9IDB4MDUsCi0gICAgICAg
IENvbHMgICAgPSAweDBhLAotICAgICAgICBBbGwgICAgID0gMHgwZgotICAgIH07Ci0gICAgZW51
bSBGcmFtZSB7Ci0gICAgICAgIFZvaWQgICA9IDB4MDAsCi0gICAgICAgIEFib3ZlICA9IDB4MDEs
Ci0gICAgICAgIEJlbG93ICA9IDB4MDIsCi0gICAgICAgIExocyAgICA9IDB4MDQsCi0gICAgICAg
IFJocyAgICA9IDB4MDgsCi0gICAgICAgIEhzaWRlcyA9IDB4MDMsCi0gICAgICAgIFZzaWRlcyA9
IDB4MGMsCi0gICAgICAgIEJveCAgICA9IDB4MGYKLSAgICB9OwotCi0gICAgSFRNTFRhYmxlRWxl
bWVudChEb2N1bWVudCopOwotICAgIH5IVE1MVGFibGVFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFs
IEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0
dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1
cm4gOTsgfQotICAgIHZpcnR1YWwgYm9vbCBjaGVja0RURChjb25zdCBOb2RlKik7Ci0KLSAgICBI
VE1MVGFibGVDYXB0aW9uRWxlbWVudCogY2FwdGlvbigpIGNvbnN0IHsgcmV0dXJuIHRDYXB0aW9u
OyB9Ci0gICAgTm9kZSogc2V0Q2FwdGlvbihIVE1MVGFibGVDYXB0aW9uRWxlbWVudCopOwotCi0g
ICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHRIZWFkKCkgY29uc3QgeyByZXR1cm4gaGVhZDsg
fQotICAgIE5vZGUqIHNldFRIZWFkKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kik7Ci0KLSAgICBI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCogdEZvb3QoKSBjb25zdCB7IHJldHVybiBmb290OyB9Ci0g
ICAgTm9kZSogc2V0VEZvb3QoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqKTsKLQotICAgIE5vZGUq
IHNldFRCb2R5KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kik7Ci0KLSAgICBIVE1MRWxlbWVudCog
Y3JlYXRlVEhlYWQoKTsKLSAgICB2b2lkIGRlbGV0ZVRIZWFkKCk7Ci0gICAgSFRNTEVsZW1lbnQq
IGNyZWF0ZVRGb290KCk7Ci0gICAgdm9pZCBkZWxldGVURm9vdCgpOwotICAgIEhUTUxFbGVtZW50
KiBjcmVhdGVDYXB0aW9uKCk7Ci0gICAgdm9pZCBkZWxldGVDYXB0aW9uKCk7Ci0gICAgSFRNTEVs
ZW1lbnQqIGluc2VydFJvdyhpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmKTsKLSAgICB2b2lkIGRl
bGV0ZVJvdyhpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIFJlZlB0cjxIVE1MQ29s
bGVjdGlvbj4gcm93cygpOwotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gdEJvZGllcygpOwot
Ci0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJp
bmcmKTsKLQotICAgIFN0cmluZyBiZ0NvbG9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRCZ0NvbG9y
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGJvcmRlcigpIGNvbnN0OwotICAgIHZvaWQg
c2V0Qm9yZGVyKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNlbGxQYWRkaW5nKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRDZWxsUGFkZGluZyhjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmlu
ZyBjZWxsU3BhY2luZygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2VsbFNwYWNpbmcoY29uc3QgU3Ry
aW5nJik7Ci0KLSAgICBTdHJpbmcgZnJhbWUoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lKGNv
bnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHJ1bGVzKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRS
dWxlcyhjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBzdW1tYXJ5KCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRTdW1tYXJ5KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmKTsKLQotICAgIC8vIG92ZXJyaWRl
cwotICAgIHZpcnR1YWwgQ29udGFpbmVyTm9kZSogYWRkQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPik7
Ci0gICAgdmlydHVhbCB2b2lkIGNoaWxkcmVuQ2hhbmdlZCgpOwotICAgIAotICAgIHZpcnR1YWwg
Ym9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRy
aWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKTsKLQotICAgIC8vIFVzZWQgdG8gb2J0YWlu
IGVpdGhlciBhIHNvbGlkIG9yIG91dHNldCBib3JkZXIgZGVjbC4KLSAgICB2aXJ0dWFsIENTU011
dGFibGVTdHlsZURlY2xhcmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCk7Ci0g
ICAgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGdldFNoYXJlZENlbGxEZWNsKCk7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0
cmlidXRlKEF0dHJpYnV0ZSopIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQqIGhlYWQ7Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGZvb3Q7Ci0g
ICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGZpcnN0Qm9keTsKLSAgICBIVE1MVGFibGVDYXB0
aW9uRWxlbWVudCogdENhcHRpb247Ci0KLSAgICBib29sIG1fbm9Cb3JkZXIgICAgIDogMTsKLSAg
ICBib29sIG1fc29saWQgICAgICAgIDogMTsKLSAgICAvLyAxNCBiaXRzIHVudXNlZAotICAgIHVu
c2lnbmVkIHNob3J0IHBhZGRpbmc7Ci0gICAgZnJpZW5kIGNsYXNzIEhUTUxUYWJsZUNlbGxFbGVt
ZW50OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVQYXJ0RWxl
bWVudCA6IHB1YmxpYyBIVE1MRWxlbWVudAotCi17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlUGFy
dEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqIGRvYykKLSAg
ICAgICAgOiBIVE1MRWxlbWVudCh0YWdOYW1lLCBkb2MpCi0gICAgICAgIHsgfQotCi0gICAgdmly
dHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBl
ZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQogY2xhc3MgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFy
dEVsZW1lbnQKIHsKIHB1YmxpYzoKQEAgLTE5MSwxODkgKzYyLDYgQEAgcHVibGljOgogICAgIFJl
ZlB0cjxIVE1MQ29sbGVjdGlvbj4gcm93cygpOwogfTsKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1jbGFzcyBIVE1MVGFibGVSb3dFbGVtZW50IDogcHVibGljIEhUTUxUYWJsZVBhcnRFbGVtZW50
Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlUm93RWxlbWVudChEb2N1bWVudCogZG9jKQotICAg
ICAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KEhUTUxOYW1lczo6dHJUYWcsIGRvYykge30KLQot
ICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBj
b25zdCB7IHJldHVybiA3OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUq
KTsKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4p
OwotICAgIAotICAgIGludCByb3dJbmRleCgpIGNvbnN0OwotICAgIGludCBzZWN0aW9uUm93SW5k
ZXgoKSBjb25zdDsKLQotICAgIEhUTUxFbGVtZW50KiBpbnNlcnRDZWxsKGludCBpbmRleCwgRXhj
ZXB0aW9uQ29kZSYpOwotICAgIHZvaWQgZGVsZXRlQ2VsbChpbnQgaW5kZXgsIEV4Y2VwdGlvbkNv
ZGUmKTsKLQotICAgIHZvaWQgc2V0Um93SW5kZXgoaW50KTsKLQotICAgIHZvaWQgc2V0U2VjdGlv
blJvd0luZGV4KGludCk7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IGNlbGxzKCk7Ci0g
ICAgdm9pZCBzZXRDZWxscyhIVE1MQ29sbGVjdGlvbiAqLCBFeGNlcHRpb25Db2RlJik7Ci0KLSAg
ICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25zdDsKLSAgICB2b2lkIHNldEJnQ29sb3IoY29u
c3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENoKGNv
bnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRD
aE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyB2QWxpZ24oKSBjb25zdDsKLSAgICB2
b2lkIHNldFZBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBuY29s
czsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlQ2VsbEVsZW1l
bnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFi
bGVDZWxsRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCopOwot
ICAgIH5IVE1MVGFibGVDZWxsRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVz
IGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0K
LSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDY7IH0KLQotICAg
IGludCBjZWxsSW5kZXgoKSBjb25zdDsKLQotICAgIGludCBjb2woKSBjb25zdCB7IHJldHVybiBf
Y29sOyB9Ci0gICAgdm9pZCBzZXRDb2woaW50IGNvbCkgeyBfY29sID0gY29sOyB9Ci0gICAgaW50
IHJvdygpIGNvbnN0IHsgcmV0dXJuIF9yb3c7IH0KLSAgICB2b2lkIHNldFJvdyhpbnQgcikgeyBf
cm93ID0gcjsgfQotCi0gICAgaW50IGNvbFNwYW4oKSBjb25zdCB7IHJldHVybiBjU3BhbjsgfQot
ICAgIGludCByb3dTcGFuKCkgY29uc3QgeyByZXR1cm4gclNwYW47IH0KLQotICAgIHZpcnR1YWwg
Ym9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRy
aWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci0KLSAgICAvLyB1c2VkIGJ5IHRhYmxlIGNlbGxz
IHRvIHNoYXJlIHN0eWxlIGRlY2xzIGNyZWF0ZWQgYnkgdGhlIGVuY2xvc2luZyB0YWJsZS4KLSAg
ICB2aXJ0dWFsIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBhZGRpdGlvbmFsQXR0cmlidXRl
U3R5bGVEZWNsKCk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzVVJMQXR0cmlidXRlKEF0dHJp
YnV0ZSopIGNvbnN0OwotCi0gICAgdm9pZCBzZXRDZWxsSW5kZXgoaW50KTsKLQotICAgIFN0cmlu
ZyBhYmJyKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBYmJyKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsK
LQotICAgIFN0cmluZyBheGlzKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBeGlzKGNvbnN0IFN0cmlu
ZyYpOwotCi0gICAgU3RyaW5nIGJnQ29sb3IoKSBjb25zdDsKLSAgICB2b2lkIHNldEJnQ29sb3Io
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBjb25zdDsKLSAgICB2b2lkIHNldENo
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2ZmKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIHZvaWQgc2V0Q29sU3BhbihpbnQpOwotCi0g
ICAgU3RyaW5nIGhlYWRlcnMoKSBjb25zdDsKLSAgICB2b2lkIHNldEhlYWRlcnMoY29uc3QgU3Ry
aW5nJik7Ci0KLSAgICBTdHJpbmcgaGVpZ2h0KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRIZWlnaHQo
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBib29sIG5vV3JhcCgpIGNvbnN0OwotICAgIHZvaWQgc2V0
Tm9XcmFwKGJvb2wpOwotCi0gICAgdm9pZCBzZXRSb3dTcGFuKGludCk7Ci0KLSAgICBTdHJpbmcg
c2NvcGUoKSBjb25zdDsKLSAgICB2b2lkIHNldFNjb3BlKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRXaWR0aChjb25zdCBT
dHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBfcm93OwotICAgIGludCBfY29sOwotICAg
IGludCByU3BhbjsKLSAgICBpbnQgY1NwYW47Ci0gICAgaW50IHJvd0hlaWdodDsKLSAgICBib29s
IG1fc29saWQgICAgICAgIDogMTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3Mg
SFRNTFRhYmxlQ29sRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVi
bGljOgotICAgIEhUTUxUYWJsZUNvbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFt
ZSwgRG9jdW1lbnQqKTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJl
bWVudCgpIGNvbnN0IHsgcmV0dXJuIGhhc0xvY2FsTmFtZShIVE1MTmFtZXM6OmNvbFRhZykgPyBU
YWdTdGF0dXNGb3JiaWRkZW4gOiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZpcnR1YWwgaW50
IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gaGFzTG9jYWxOYW1lKEhUTUxOYW1lczo6Y29s
VGFnKSA/IDAgOiAxOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqIG5l
d0NoaWxkKSB7IHJldHVybiBoYXNMb2NhbE5hbWUoSFRNTE5hbWVzOjpjb2xncm91cFRhZykgJiYg
bmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpjb2xUYWcpOyB9Ci0gICAgdm9pZCBzZXRU
YWJsZShIVE1MVGFibGVFbGVtZW50KiB0KSB7IHRhYmxlID0gdDsgfQotCi0gICAgLy8gb3ZlcnJp
ZGVzCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwg
dm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAgIGludCBz
cGFuKCkgY29uc3QgeyByZXR1cm4gX3NwYW47IH0KLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0
OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2goKSBj
b25zdDsKLSAgICB2b2lkIHNldENoKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGNoT2Zm
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaE9mZihjb25zdCBTdHJpbmcmKTsKLQotICAgIHZvaWQg
c2V0U3BhbihpbnQpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0
VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHdpZHRoKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmKTsKLQotcHJvdGVjdGVkOgotICAgIGludCBfc3Bh
bjsKLSAgICBIVE1MVGFibGVFbGVtZW50ICp0YWJsZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KLQotY2xhc3MgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFy
dEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVDYXB0aW9uRWxlbWVudChEb2N1bWVu
dCAqZG9jKQotICAgICAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KEhUTUxOYW1lczo6Y2FwdGlv
blRhZywgZG9jKSB7fQotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVt
ZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGlu
dCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDU7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJv
b2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmli
dXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0
cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSopOwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0g
ICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLX07Ci0KIH0gLy9uYW1lc3BhY2UKIAog
I2VuZGlmCkluZGV4OiBodG1sL0hUTUxUYWJsZUVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGh0
bWwvSFRNTFRhYmxlRWxlbWVudC5jcHAJKHJldmlzaW9uIDE0MzI1KQorKysgaHRtbC9IVE1MVGFi
bGVFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsNDAgKzIzLDM1IEBACiAgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAz
MzAsCiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwotCiAjaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaW5jbHVkZSAiaHRtbF90YWJsZWltcGwuaCIKKyNpbmNsdWRlICJIVE1MVGFibGVF
bGVtZW50LmgiCiAKLSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiTm9kZUxp
c3QuaCIKLSNpbmNsdWRlICJSZW5kZXJUYWJsZS5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2Vs
bC5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlQ29sLmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hl
ZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgogI2luY2x1ZGUgImNzc2hlbHBl
ci5oIgogI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNl
bGVjdG9yLmgiCisjaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCiAjaW5jbHVkZSAiQ1NT
VmFsdWVLZXl3b3Jkcy5oIgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRv
Y3VtZW50LmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkhUTUxDb2xs
ZWN0aW9uLmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2Fw
dGlvbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MVGFibGVTZWN0aW9uRWxlbWVudC5oIgorI2lu
Y2x1ZGUgIlJlbmRlclRhYmxlLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFt
ZXNwYWNlIEhUTUxOYW1lczsKIAogSFRNTFRhYmxlRWxlbWVudDo6SFRNTFRhYmxlRWxlbWVudChE
b2N1bWVudCAqZG9jKQotICA6IEhUTUxFbGVtZW50KHRhYmxlVGFnLCBkb2MpCisgICAgOiBIVE1M
RWxlbWVudCh0YWJsZVRhZywgZG9jKQorICAgICwgaGVhZCgwKQorICAgICwgZm9vdCgwKQorICAg
ICwgZmlyc3RCb2R5KDApCisgICAgLCB0Q2FwdGlvbigwKQorICAgICwgbV9ub0JvcmRlcih0cnVl
KQorICAgICwgbV9zb2xpZChmYWxzZSkKKyAgICAsIHBhZGRpbmcoMSkKIHsKLSAgICB0Q2FwdGlv
biA9IDA7Ci0gICAgaGVhZCA9IDA7Ci0gICAgZm9vdCA9IDA7Ci0gICAgZmlyc3RCb2R5ID0gMDsK
LQotIAotICAgIHBhZGRpbmcgPSAxOwotICAgIAotICAgIG1fbm9Cb3JkZXIgPSB0cnVlOwotICAg
IG1fc29saWQgPSBmYWxzZTsKIH0KIAogSFRNTFRhYmxlRWxlbWVudDo6fkhUTUxUYWJsZUVsZW1l
bnQoKQpAQCAtNzQsMTAgKzY5LDEwIEBAIGJvb2wgSFRNTFRhYmxlRWxlbWVudDo6Y2hlY2tEVEQo
Y29uc3QgTm8KICAgICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKIH0K
IAotTm9kZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0Q2FwdGlvbiggSFRNTFRhYmxlQ2FwdGlvbkVs
ZW1lbnQgKmMgKQorTm9kZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0Q2FwdGlvbihIVE1MVGFibGVD
YXB0aW9uRWxlbWVudCogYykKIHsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAo
Tm9kZSAqb2MgPSB0Q2FwdGlvbikKKyAgICBpZiAoTm9kZSogb2MgPSB0Q2FwdGlvbikKICAgICAg
ICAgcmVwbGFjZUNoaWxkKGMsIG9jLCBlYyk7CiAgICAgZWxzZQogICAgICAgICBpbnNlcnRCZWZv
cmUoYywgZmlyc3RDaGlsZCgpLCBlYyk7CkBAIC04NSwxMCArODAsMTAgQEAgTm9kZSogSFRNTFRh
YmxlRWxlbWVudDo6c2V0Q2FwdGlvbiggSFRNTAogICAgIHJldHVybiB0Q2FwdGlvbjsKIH0KIAot
Tm9kZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0VEhlYWQoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
ICpzICkKK05vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRIZWFkKEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50KiBzKQogewogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGlmIChOb2RlICpo
ID0gaGVhZCkKKyAgICBpZiAoTm9kZSogaCA9IGhlYWQpCiAgICAgICAgIHJlcGxhY2VDaGlsZChz
LCBoLCBlYyk7CiAgICAgZWxzZSBpZiAoZm9vdCkKICAgICAgICAgaW5zZXJ0QmVmb3JlKHMsIGZv
b3QsIGVjKTsKQEAgLTEwMCw3ICs5NSw3IEBAIE5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRI
ZWFkKCBIVE1MVGEKICAgICByZXR1cm4gaGVhZDsKIH0KIAotTm9kZSogSFRNTFRhYmxlRWxlbWVu
dDo6c2V0VEZvb3QoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKK05vZGUqIEhUTUxUYWJs
ZUVsZW1lbnQ6OnNldFRGb290KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzKQogewogICAgIEV4
Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgIGlmIChOb2RlICpmID0gZm9vdCkKQEAgLTExMyw3ICsx
MDgsNyBAQCBOb2RlKiBIVE1MVGFibGVFbGVtZW50OjpzZXRURm9vdCggSFRNTFRhCiAgICAgcmV0
dXJuIGZvb3Q7CiB9CiAKLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRCb2R5KCBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudCAqcyApCitOb2RlKiBIVE1MVGFibGVFbGVtZW50OjpzZXRUQm9keShI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCAqcykKIHsKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsK
ICAgICBOb2RlKiByOwpAQCAtMTI4LDI1ICsxMjMsMjQgQEAgTm9kZSogSFRNTFRhYmxlRWxlbWVu
dDo6c2V0VEJvZHkoIEhUTUxUYQogICAgIHJldHVybiBmaXJzdEJvZHk7CiB9CiAKLUhUTUxFbGVt
ZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVUSGVhZCggICkKK0hUTUxFbGVtZW50ICpIVE1M
VGFibGVFbGVtZW50OjpjcmVhdGVUSGVhZCgpCiB7Ci0gICAgaWYoIWhlYWQpCi0gICAgeworICAg
IGlmICghaGVhZCkgewogICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKICAgICAgICAgaGVh
ZCA9IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCh0aGVhZFRhZywgZG9jdW1lbnQoKSwgdHJ1
ZSAvKiBpbXBsaWNpdCAqLyk7Ci0gICAgICAgIGlmKGZvb3QpCi0gICAgICAgICAgICBpbnNlcnRC
ZWZvcmUoIGhlYWQsIGZvb3QsIGVjICk7Ci0gICAgICAgIGVsc2UgaWYoZmlyc3RCb2R5KQotICAg
ICAgICAgICAgaW5zZXJ0QmVmb3JlKCBoZWFkLCBmaXJzdEJvZHksIGVjKTsKKyAgICAgICAgaWYg
KGZvb3QpCisgICAgICAgICAgICBpbnNlcnRCZWZvcmUoaGVhZCwgZm9vdCwgZWMpOworICAgICAg
ICBlbHNlIGlmIChmaXJzdEJvZHkpCisgICAgICAgICAgICBpbnNlcnRCZWZvcmUoaGVhZCwgZmly
c3RCb2R5LCBlYyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGFwcGVuZENoaWxkKGhlYWQs
IGVjKTsKICAgICB9CiAgICAgcmV0dXJuIGhlYWQ7CiB9CiAKLXZvaWQgSFRNTFRhYmxlRWxlbWVu
dDo6ZGVsZXRlVEhlYWQoICApCit2b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0ZVRIZWFkKCkK
IHsKLSAgICBpZihoZWFkKSB7CisgICAgaWYgKGhlYWQpIHsKICAgICAgICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7CiAgICAgICAgIGhlYWQtPnJlZigpOwogICAgICAgICBIVE1MRWxlbWVudDo6cmVt
b3ZlQ2hpbGQoaGVhZCwgZWMpOwpAQCAtMTU1LDIzICsxNDksMjIgQEAgdm9pZCBIVE1MVGFibGVF
bGVtZW50OjpkZWxldGVUSGVhZCggICkKICAgICBoZWFkID0gMDsKIH0KIAotSFRNTEVsZW1lbnQg
KkhUTUxUYWJsZUVsZW1lbnQ6OmNyZWF0ZVRGb290KCAgKQorSFRNTEVsZW1lbnQgKkhUTUxUYWJs
ZUVsZW1lbnQ6OmNyZWF0ZVRGb290KCkKIHsKLSAgICBpZiAoIWZvb3QpCi0gICAgeworICAgIGlm
ICghZm9vdCkgewogICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKICAgICAgICAgZm9vdCA9
IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCh0Zm9vdFRhZywgZG9jdW1lbnQoKSwgdHJ1ZSAv
KmltcGxpY2l0ICovKTsKICAgICAgICAgaWYgKGZpcnN0Qm9keSkKLSAgICAgICAgICAgIGluc2Vy
dEJlZm9yZSggZm9vdCwgZmlyc3RCb2R5LCBlYyApOworICAgICAgICAgICAgaW5zZXJ0QmVmb3Jl
KGZvb3QsIGZpcnN0Qm9keSwgZWMpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhcHBlbmRD
aGlsZChmb290LCBlYyk7CiAgICAgfQogICAgIHJldHVybiBmb290OwogfQogCi12b2lkIEhUTUxU
YWJsZUVsZW1lbnQ6OmRlbGV0ZVRGb290KCAgKQordm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxl
dGVURm9vdCgpCiB7Ci0gICAgaWYoZm9vdCkgeworICAgIGlmIChmb290KSB7CiAgICAgICAgIEV4
Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICBmb290LT5yZWYoKTsKICAgICAgICAgSFRNTEVs
ZW1lbnQ6OnJlbW92ZUNoaWxkKGZvb3QsIGVjKTsKQEAgLTE4MCwyMCArMTczLDE5IEBAIHZvaWQg
SFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlVEZvb3QoICApCiAgICAgZm9vdCA9IDA7CiB9CiAKLUhU
TUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVDYXB0aW9uKCAgKQorSFRNTEVsZW1l
bnQgKkhUTUxUYWJsZUVsZW1lbnQ6OmNyZWF0ZUNhcHRpb24oKQogewotICAgIGlmKCF0Q2FwdGlv
bikKLSAgICB7CisgICAgaWYgKCF0Q2FwdGlvbikgewogICAgICAgICBFeGNlcHRpb25Db2RlIGVj
ID0gMDsKICAgICAgICAgdENhcHRpb24gPSBuZXcgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQoZG9j
dW1lbnQoKSk7Ci0gICAgICAgIGluc2VydEJlZm9yZSggdENhcHRpb24sIGZpcnN0Q2hpbGQoKSwg
ZWMgKTsKKyAgICAgICAgaW5zZXJ0QmVmb3JlKHRDYXB0aW9uLCBmaXJzdENoaWxkKCksIGVjKTsK
ICAgICB9CiAgICAgcmV0dXJuIHRDYXB0aW9uOwogfQogCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6
OmRlbGV0ZUNhcHRpb24oICApCit2b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRlbGV0ZUNhcHRpb24o
KQogewotICAgIGlmKHRDYXB0aW9uKSB7CisgICAgaWYgKHRDYXB0aW9uKSB7CiAgICAgICAgIEV4
Y2VwdGlvbkNvZGUgZWMgPSAwOwogICAgICAgICB0Q2FwdGlvbi0+cmVmKCk7CiAgICAgICAgIEhU
TUxFbGVtZW50OjpyZW1vdmVDaGlsZCh0Q2FwdGlvbiwgZWMpOwpAQCAtMjAyLDE0ICsxOTQsMTQg
QEAgdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxldGVDYXB0aW9uKCAgKQogICAgIHRDYXB0aW9u
ID0gMDsKIH0KIAotSFRNTEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6Omluc2VydFJvdyggaW50
IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKK0hUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50
OjppbnNlcnRSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKIHsKICAgICAvLyBUaGUg
RE9NIHJlcXVpcmVzIHRoYXQgd2UgY3JlYXRlIGEgdGJvZHkgaWYgdGhlIHRhYmxlIGlzIGVtcHR5
CiAgICAgLy8gKGNmIERPTTJUUyBIVE1MVGFibGVFbGVtZW50MzEgdGVzdCkKICAgICAvLyAobm90
ZTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSAiaWYgdGhlIHRhYmxlIGhhcyBubyBzZWN0aW9ucyIs
IHNpbmNlIHdlIGNhbiBoYXZlCiAgICAgLy8gPFRBQkxFPjxUUj4pCi0gICAgaWYoIWZpcnN0Qm9k
eSAmJiAhaGVhZCAmJiAhZm9vdCkKLSAgICAgICAgc2V0VEJvZHkoIG5ldyBIVE1MVGFibGVTZWN0
aW9uRWxlbWVudCh0Ym9keVRhZywgZG9jdW1lbnQoKSwgdHJ1ZSAvKiBpbXBsaWNpdCAqLykgKTsK
KyAgICBpZiAoIWZpcnN0Qm9keSAmJiAhaGVhZCAmJiAhZm9vdCkKKyAgICAgICAgc2V0VEJvZHko
bmV3IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KHRib2R5VGFnLCBkb2N1bWVudCgpLCB0cnVlIC8q
IGltcGxpY2l0ICovKSk7CiAKICAgICAvLyBJRSB0cmVhdHMgaW5kZXg9LTEgYXMgZGVmYXVsdCB2
YWx1ZSBtZWFuaW5nICdhcHBlbmQgYWZ0ZXIgbGFzdCcKICAgICAvLyBUaGlzIGlzbid0IGluIHRo
ZSBET00uIFNvLCBub3QgaW1wbGVtZW50ZWQgeWV0LgpAQCAtMjE4LDEzICsyMTAsMTMgQEAgSFRN
TEVsZW1lbnQgKkhUTUxUYWJsZUVsZW1lbnQ6Omluc2VydFJvdwogICAgIE5vZGUgKm5vZGUgPSBm
aXJzdENoaWxkKCk7CiAgICAgYm9vbCBhcHBlbmQgPSAoaW5kZXggPT0gLTEpOwogICAgIGJvb2wg
Zm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKCA7IG5vZGUgJiYgKGluZGV4Pj0wIHx8IGFwcGVuZCkg
OyBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSApCisgICAgZm9yICg7IG5vZGUgJiYgKGluZGV4
Pj0wIHx8IGFwcGVuZCkgOyBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSkKICAgICB7CiAgICAg
ICAgIC8vIHRoZXJlIGNvdWxkIGJlIDIgdGZvb3QgZWxlbWVudHMgaW4gdGhlIHRhYmxlLiBPbmx5
IHRoZSBmaXJzdCBvbmUgaXMgdGhlICJmb290IiwgdGhhdCdzIHdoeSB3ZSBoYXZlIHRoZSBtb3Jl
CiAgICAgICAgIC8vIGNvbXBsaWNhdGVkIGlmIHN0YXRlbWVudCBiZWxvdy4KICAgICAgICAgaWYg
KG5vZGUgIT0gZm9vdCAmJiAobm9kZS0+aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbm9kZS0+aGFz
VGFnTmFtZSh0Zm9vdFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0Ym9keVRhZykpKQogICAgICAg
ICB7Ci0gICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVs
ZW1lbnQgKj4obm9kZSk7CisgICAgICAgICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQqPihub2RlKTsKICAgICAgICAgICAgIGxhc3RTZWN0aW9uID0gc2Vj
dGlvbjsKICAgICAgICAgICAgIGlmICghYXBwZW5kKSB7CiAgICAgICAgICAgICAgICAgaW50IHJv
d3MgPSBzZWN0aW9uLT5udW1Sb3dzKCk7CkBAIC0yMzYsMTMgKzIyOCwxMiBAQCBIVE1MRWxlbWVu
dCAqSFRNTFRhYmxlRWxlbWVudDo6aW5zZXJ0Um93CiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
ICAgICB9Ci0gICAgaWYgKCAhZm91bmQgJiYgZm9vdCApCi0gICAgICAgIHNlY3Rpb24gPSBzdGF0
aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihmb290KTsKKyAgICBpZiAoIWZvdW5k
ICYmIGZvb3QpCisgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9u
RWxlbWVudCo+KGZvb3QpOwogCiAgICAgLy8gSW5kZXggPT0gMCBtZWFucyAiaW5zZXJ0IGJlZm9y
ZSBmaXJzdCByb3cgaW4gY3VycmVudCBzZWN0aW9uIgogICAgIC8vIG9yICJhcHBlbmQgYWZ0ZXIg
bGFzdCByb3ciIChpZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VjdGlvbiBhbnltb3JlKQotICAgIGlm
ICggIXNlY3Rpb24gJiYgKCBpbmRleCA9PSAwIHx8IGFwcGVuZCApICkKLSAgICB7CisgICAgaWYg
KCFzZWN0aW9uICYmIChpbmRleCA9PSAwIHx8IGFwcGVuZCkpIHsKICAgICAgICAgc2VjdGlvbiA9
IGxhc3RTZWN0aW9uOwogICAgICAgICBpbmRleCA9IHNlY3Rpb24gPyBzZWN0aW9uLT5udW1Sb3dz
KCkgOiAwOwogICAgIH0KQEAgLTI1NSwyMyArMjQ2LDIzIEBAIEhUTUxFbGVtZW50ICpIVE1MVGFi
bGVFbGVtZW50OjppbnNlcnRSb3cKICAgICB9CiB9CiAKLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6
ZGVsZXRlUm93KCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQordm9pZCBIVE1MVGFibGVF
bGVtZW50OjpkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKIHsKICAgICBI
VE1MVGFibGVTZWN0aW9uRWxlbWVudCogc2VjdGlvbiA9IDBMOwogICAgIE5vZGUgKm5vZGUgPSBm
aXJzdENoaWxkKCk7CiAgICAgYm9vbCBsYXN0Um93ID0gaW5kZXggPT0gLTE7CiAgICAgSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQqIGxhc3RTZWN0aW9uID0gMEw7CiAgICAgYm9vbCBmb3VuZCA9IGZh
bHNlOwotICAgIGZvciAoIDsgbm9kZSA7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpICkKKyAg
ICBmb3IgKDsgbm9kZSA7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpKQogICAgIHsKICAgICAg
ICAgaWYgKG5vZGUgIT0gZm9vdCAmJiAobm9kZS0+aGFzVGFnTmFtZSh0aGVhZFRhZykgfHwgbm9k
ZS0+aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwgCiAgICAgICAgICAgICBub2RlLT5oYXNUYWdOYW1l
KHRib2R5VGFnKSkpIHsKLSAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudCAqPihub2RlKTsKKyAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNf
Y2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCo+KG5vZGUpOwogICAgICAgICAgICAgbGFzdFNl
Y3Rpb24gPSBzZWN0aW9uOwogICAgICAgICAgICAgaW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dz
KCk7Ci0gICAgICAgICAgICBpZiAoICFsYXN0Um93ICkKKyAgICAgICAgICAgIGlmICghbGFzdFJv
dykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHJvd3MgPiBpbmRleCApIHsK
KyAgICAgICAgICAgICAgICBpZiAocm93cyA+IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAg
IGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAg
ICAgfSBlbHNlCkBAIC0yODAsMTMgKzI3MSwxMyBAQCB2b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmRl
bGV0ZVJvdyggaW50IGluCiAgICAgICAgIH0KICAgICAgICAgc2VjdGlvbiA9IDBMOwogICAgIH0K
LSAgICBpZiAoICFmb3VuZCAmJiBmb290ICkKLSAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0
PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGZvb3QpOworICAgIGlmICghZm91bmQgJiYgZm9v
dCkKKyAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
Kj4oZm9vdCk7CiAKLSAgICBpZiAoIGxhc3RSb3cgKQotICAgICAgICBsYXN0U2VjdGlvbi0+ZGVs
ZXRlUm93KCAtMSwgZWMgKTsKLSAgICBlbHNlIGlmICggc2VjdGlvbiAmJiBpbmRleCA+PSAwICYm
IGluZGV4IDwgc2VjdGlvbi0+bnVtUm93cygpICkKLSAgICAgICAgc2VjdGlvbi0+ZGVsZXRlUm93
KCBpbmRleCwgZWMgKTsKKyAgICBpZiAobGFzdFJvdykKKyAgICAgICAgbGFzdFNlY3Rpb24tPmRl
bGV0ZVJvdygtMSwgZWMpOworICAgIGVsc2UgaWYgKHNlY3Rpb24gJiYgaW5kZXggPj0gMCAmJiBp
bmRleCA8IHNlY3Rpb24tPm51bVJvd3MoKSkKKyAgICAgICAgc2VjdGlvbi0+ZGVsZXRlUm93KGlu
ZGV4LCBlYyk7CiAgICAgZWxzZQogICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOwogfQpAQCAt
MzExLDEzICszMDIsMTMgQEAgQ29udGFpbmVyTm9kZSogSFRNTFRhYmxlRWxlbWVudDo6YWRkQ2hp
bAogICAgIENvbnRhaW5lck5vZGUqIGNvbnRhaW5lciA9IEhUTUxFbGVtZW50OjphZGRDaGlsZChj
aGlsZC5nZXQoKSk7CiAgICAgaWYgKGNvbnRhaW5lcikgewogICAgICAgICBpZiAoIXRDYXB0aW9u
ICYmIGNoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25UYWcpKQotICAgICAgICAgICAgdENhcHRpb24g
PSBzdGF0aWNfY2FzdDxIVE1MVGFibGVDYXB0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Cisg
ICAgICAgICAgICB0Q2FwdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUNhcHRpb25FbGVtZW50
Kj4oY2hpbGQuZ2V0KCkpOwogICAgICAgICBlbHNlIGlmICghaGVhZCAmJiBjaGlsZC0+aGFzVGFn
TmFtZSh0aGVhZFRhZykpCi0gICAgICAgICAgICBoZWFkID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkpOworICAgICAgICAgICAgaGVhZCA9IHN0YXRp
Y19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kj4oY2hpbGQuZ2V0KCkpOwogICAgICAgICBl
bHNlIGlmICghZm9vdCAmJiBjaGlsZC0+aGFzVGFnTmFtZSh0Zm9vdFRhZykpCi0gICAgICAgICAg
ICBmb290ID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0
KCkpOworICAgICAgICAgICAgZm9vdCA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50Kj4oY2hpbGQuZ2V0KCkpOwogICAgICAgICBlbHNlIGlmICghZmlyc3RCb2R5ICYmIGNoaWxk
LT5oYXNUYWdOYW1lKHRib2R5VGFnKSkgewotICAgICAgICAgICAgZmlyc3RCb2R5ID0gc3RhdGlj
X2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oY2hpbGQuZ2V0KCkpOworICAgICAgICAg
ICAgZmlyc3RCb2R5ID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqPihjaGls
ZC5nZXQoKSk7CiAgICAgICAgICAgICBmaXJzdEJvZHktPnJlZigpOwogICAgICAgICB9CiAgICAg
fQpAQCAtMzcyLDExICszNjMsMTEgQEAgYm9vbCBIVE1MVGFibGVFbGVtZW50OjptYXBUb0VudHJ5
KGNvbnN0IAogCiB2b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1h
cHBlZEF0dHJpYnV0ZSAqYXR0cikKIHsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0
cikgeworICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKQogICAgICAgICBhZGRDU1NM
ZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKKyAgICBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gaGVpZ2h0QXR0cikKICAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX0hF
SUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9y
ZGVyQXR0cikgIHsKKyAgICBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyQXR0cikgIHsK
ICAgICAgICAgbV9ub0JvcmRlciA9IHRydWU7CiAgICAgICAgIGlmIChhdHRyLT5kZWNsKCkpIHsK
ICAgICAgICAgICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsID0gYXR0ci0+ZGVjbCgpLT5nZXRQcm9w
ZXJ0eUNTU1ZhbHVlKENTU19QUk9QX0JPUkRFUl9MRUZUX1dJRFRIKTsKQEAgLTM4NCw4ICszNzUs
NyBAQCB2b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmliCiAgICAgICAgICAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1WYWwgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHZhbC5nZXQoKSk7CiAgICAgICAgICAgICAgICAgbV9ub0JvcmRlciA9ICFwcmlt
VmFsLT5nZXRGbG9hdFZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKTsKICAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghYXR0ci0+aXNOdWxsKCkpIHsK
KyAgICAgICAgfSBlbHNlIGlmICghYXR0ci0+aXNOdWxsKCkpIHsKICAgICAgICAgICAgIC8vICMj
IyB0aGlzIG5lZWRzIG1vcmUgd29yaywgYXMgdGhlIGJvcmRlciB2YWx1ZSBpcyBub3Qgb25seQog
ICAgICAgICAgICAgLy8gICAgIHRoZSBib3JkZXIgb2YgdGhlIGJveCwgYnV0IGFsc28gYmV0d2Vl
biB0aGUgY2VsbHMKICAgICAgICAgICAgIGludCBib3JkZXIgPSAwOwpAQCAtMzk5LDkgKzM4OSw5
IEBAIHZvaWQgSFRNTFRhYmxlRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWIKICAgICAgICAgICAg
IG1fbm9Cb3JkZXIgPSAhYm9yZGVyOwogICAgICAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENT
U19QUk9QX0JPUkRFUl9XSURUSCwgU3RyaW5nOjpudW1iZXIoYm9yZGVyKSk7CiAgICAgICAgIH0K
LSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBiZ2NvbG9yQXR0cikgeworICAgIH0gZWxz
ZSBpZiAoYXR0ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKQogICAgICAgICBhZGRDU1NDb2xvcihh
dHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBib3JkZXJjb2xvckF0dHIpIHsKKyAgICBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gYm9yZGVyY29sb3JBdHRyKSB7CiAgICAgICAgIG1fc29saWQgPSBhdHRy
LT5kZWNsKCk7CiAgICAgICAgIGlmICghYXR0ci0+ZGVjbCgpICYmICFhdHRyLT5pc0VtcHR5KCkp
IHsKICAgICAgICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JPUkRFUl9DT0xPUiwg
YXR0ci0+dmFsdWUoKSk7CkBAIC00MjIsMTEgKzQxMiwxMSBAQCB2b2lkIEhUTUxUYWJsZUVsZW1l
bnQ6OnBhcnNlTWFwcGVkQXR0cmliCiAgICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NT
X1BST1BfQk9SREVSX1NQQUNJTkcsIGF0dHItPnZhbHVlKCkpOwogICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IGNlbGxwYWRkaW5nQXR0cikgewogICAgICAgICBpZiAoIWF0dHItPnZhbHVl
KCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcGFkZGluZyA9IG1heCggMCwgYXR0ci0+dmFsdWUo
KS50b0ludCgpICk7CisgICAgICAgICAgICBwYWRkaW5nID0gbWF4KDAsIGF0dHItPnZhbHVlKCku
dG9JbnQoKSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHBhZGRpbmcgPSAxOwogICAgICAg
ICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlKCkpIHsKLSAgICAgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlclRhYmxlICo+KHJlbmRlcmVyKCkpLT5zZXRDZWxsUGFkZGluZyhw
YWRkaW5nKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlKj4ocmVuZGVyZXIo
KSktPnNldENlbGxQYWRkaW5nKHBhZGRpbmcpOwogICAgICAgICAgICAgaWYgKCFyZW5kZXJlcigp
LT5uZWVkc0xheW91dCgpKQogICAgICAgICAgICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5
b3V0KHRydWUpOwogICAgICAgICB9CkBAIC01MTMsNyArNTAzLDcgQEAgdm9pZCBIVE1MVGFibGVF
bGVtZW50OjphdHRhY2goKQogICAgIGFzc2VydCghbV9hdHRhY2hlZCk7CiAgICAgSFRNTEVsZW1l
bnQ6OmF0dGFjaCgpOwogICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFibGUo
KSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGUgKj4ocmVuZGVyZXIoKSktPnNldENl
bGxQYWRkaW5nKCBwYWRkaW5nICk7CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlKj4o
cmVuZGVyZXIoKSktPnNldENlbGxQYWRkaW5nKHBhZGRpbmcpOwogfQogCiBib29sIEhUTUxUYWJs
ZUVsZW1lbnQ6OmlzVVJMQXR0cmlidXRlKEF0dHJpYnV0ZSAqYXR0cikgY29uc3QKQEAgLTYyMSw3
MTQgKzYxMSw0IEBAIHZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0V2lkdGgoY29uc3QgU3QKICAg
ICBzZXRBdHRyaWJ1dGUod2lkdGhBdHRyLCB2YWx1ZSk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLWJvb2wgSFRNTFRhYmxlUGFydEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlm
aWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17
Ci0gICAgaWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9
IChNYXBwZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRyeSArIGRvY3VtZW50KCktPmRvY0lEKCkp
OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChhdHRyTmFtZSA9
PSBiZ2NvbG9yQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBib3JkZXJjb2xvckF0dHIgfHwK
LSAgICAgICAgYXR0ck5hbWUgPT0gdmFsaWduQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBo
ZWlnaHRBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewot
ICAgICAgICByZXN1bHQgPSBlQ2VsbDsgLy8gQWxsIHRhYmxlIHBhcnRzIHdpbGwganVzdCBzaGFy
ZSBpbiB0aGUgVEQgc3BhY2UuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gSFRNTEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5hbWUsIHJlc3VsdCk7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlUGFydEVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJp
YnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKSB7Ci0g
ICAgICAgIGFkZENTU0NvbG9yKGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfQ09MT1IsIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRy
KSB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgp
KTsKLSAgICAgICAgaWYgKCF1cmwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTSW1hZ2VQ
cm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0lNQUdFLCBkb2N1bWVudCgpLT5jb21w
bGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBib3JkZXJjb2xv
ckF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAg
ICAgICAgYWRkQ1NTQ29sb3IoYXR0ciwgQ1NTX1BST1BfQk9SREVSX0NPTE9SLCBhdHRyLT52YWx1
ZSgpKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9U
T1BfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0
ciwgQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAgICAg
ICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfTEVGVF9TVFlMRSwgQ1NT
X1ZBTF9TT0xJRCk7Ci0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9C
T1JERVJfUklHSFRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICB9Ci0gICAgfSBlbHNl
IGlmIChhdHRyLT5uYW1lKCkgPT0gdmFsaWduQXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZh
bHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BS
T1BfVkVSVElDQUxfQUxJR04sIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHYgPSBh
dHRyLT52YWx1ZSgpOwotICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodiwgIm1pZGRsZSIp
IHx8IGVxdWFsSWdub3JpbmdDYXNlKHYsICJjZW50ZXIiKSkKLSAgICAgICAgICAgIGFkZENTU1By
b3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIENTU19WQUxfX1dFQktJVF9DRU5URVIp
OwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAiYWJzbWlkZGxlIikpCi0g
ICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9URVhUX0FMSUdOLCBDU1Nf
VkFMX0NFTlRFUik7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHYsICJsZWZ0
IikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9URVhUX0FMSUdO
LCBDU1NfVkFMX19XRUJLSVRfTEVGVCk7Ci0gICAgICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdD
YXNlKHYsICJyaWdodCIpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BS
T1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lUX1JJR0hUKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgdik7Ci0g
ICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBpZiAo
IWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIs
IENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhU
TUxFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1IVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6SFRNTFRhYmxlU2VjdGlvbkVsZW1l
bnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYywgYm9vbCBpbXBs
aWNpdCkKLSAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05hbWUsIGRvYykKLXsKLSAgICBt
X2ltcGxpY2l0ID0gaW1wbGljaXQ7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6
OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+
aGFzVGFnTmFtZSh0clRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoZm9ybVRhZykgfHwKLSAg
ICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoc2NyaXB0VGFnKTsKLX0KLQotQ29udGFpbmVy
Tm9kZSogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4g
Y2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAg
IC8vIEZpcnN0IGFkZCB0aGUgY2hpbGQuCi0gICAgICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50Ojph
ZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBseSByZXR1cm4gb3Vyc2VsdmVz
IGFzIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAgICAgIC8vIFRoaXMgaGFzIHRo
ZSBlZmZlY3Qgb2YgZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFmIGFuZCBtb3ZpbmcgaXQgc2Fm
ZWx5IG91dCBvZiB0aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gSFRNTFRhYmxlUGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxkKTsKLX0KLQotLy8gdGhl
c2UgZnVuY3Rpb25zIGFyZSByYXRoZXIgc2xvdywgc2luY2Ugd2UgbmVlZCB0byBnZXQgdGhlIHJv
dyBhdAotLy8gdGhlIGluZGV4Li4uIGJ1dCB0aGV5IGFyZW4ndCB1c2VkIGR1cmluZyB1c3VhbCBI
VE1MIHBhcnNpbmcgYW55d2F5Ci1IVE1MRWxlbWVudCAqSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6
Omluc2VydFJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBIVE1MVGFi
bGVSb3dFbGVtZW50ICpyID0gMEw7Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJlbiA9IGNo
aWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtUm93cyA9IGNoaWxkcmVuID8gKGludCljaGlsZHJlbi0+
bGVuZ3RoKCkgOiAwOwotICAgIGlmICggaW5kZXggPCAtMSB8fCBpbmRleCA+IG51bVJvd3MgKSB7
Ci0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7IC8vIHBlciB0aGUgRE9NCi0gICAgfQotICAg
IGVsc2UKLSAgICB7Ci0gICAgICAgIHIgPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudChkb2N1bWVu
dCgpKTsKLSAgICAgICAgaWYgKCBudW1Sb3dzID09IGluZGV4IHx8IGluZGV4ID09IC0xICkKLSAg
ICAgICAgICAgIGFwcGVuZENoaWxkKHIsIGVjKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICBOb2RlICpuOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMSkKLSAgICAgICAgICAgICAgICBu
ID0gZmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG4gPSBj
aGlsZHJlbi0+aXRlbShpbmRleCk7Ci0gICAgICAgICAgICBpbnNlcnRCZWZvcmUociwgbiwgZWMg
KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcjsKLX0KLQotdm9pZCBIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDo6ZGVsZXRlUm93KCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQot
ewotICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50
IG51bVJvd3MgPSBjaGlsZHJlbiA/IChpbnQpY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBp
ZiAoaW5kZXggPT0gLTEpCi0gICAgICAgIGluZGV4ID0gbnVtUm93cyAtIDE7Ci0gICAgaWYgKGlu
ZGV4ID49IDAgJiYgaW5kZXggPCBudW1Sb3dzKSB7Ci0gICAgICAgIFJlZlB0cjxOb2RlPiByb3cg
PSBjaGlsZHJlbi0+aXRlbShpbmRleCk7Ci0gICAgICAgIEhUTUxFbGVtZW50OjpyZW1vdmVDaGls
ZChyb3cuZ2V0KCksIGVjKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VS
UjsKLX0KLQotaW50IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpudW1Sb3dzKCkgY29uc3QKLXsK
LSAgICBpbnQgcm93cyA9IDA7Ci0gICAgY29uc3QgTm9kZSAqbiA9IGZpcnN0Q2hpbGQoKTsKLSAg
ICB3aGlsZSAobikgewotICAgICAgICBpZiAobi0+aGFzVGFnTmFtZSh0clRhZykpCi0gICAgICAg
ICAgICByb3dzKys7Ci0gICAgICAgIG4gPSBuLT5uZXh0U2libGluZygpOwotICAgIH0KLQotICAg
IHJldHVybiByb3dzOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmFsaWdu
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRN
TFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGNoYXJBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6c2V0Q2go
Y29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVl
KTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpjaE9mZigpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyb2ZmQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQ6OnNldENoT2ZmKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpzZXRWQWxp
Z24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUodmFsaWduQXR0ciwg
dmFsdWUpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb24+IEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50Ojpyb3dzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRN
TENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246OlRBQkxFX1JPV1MpKTsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmNoZWNrRFREKGNv
bnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVybiBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0
ZFRhZykgfHwgbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGhUYWcpIHx8Ci0gICAgICAgICAgIG5ld0No
aWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlwdFRh
Zyk7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmFkZENoaWxkKFBh
c3NSZWZQdHI8Tm9kZT4gY2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1U
YWcpKSB7Ci0gICAgICAgIC8vIEZpcnN0IGFkZCB0aGUgY2hpbGQuCi0gICAgICAgIEhUTUxUYWJs
ZVBhcnRFbGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBseSBy
ZXR1cm4gb3Vyc2VsdmVzIGFzIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAgICAg
IC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFmIGFu
ZCBtb3ZpbmcgaXQgc2FmZWx5IG91dCBvZiB0aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhpczsK
LSAgICB9Ci0KLSAgICByZXR1cm4gSFRNTFRhYmxlUGFydEVsZW1lbnQ6OmFkZENoaWxkKGNoaWxk
KTsKLX0KLQotaW50IEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnJvd0luZGV4KCkgY29uc3QKLXsKLSAg
ICBOb2RlICp0YWJsZSA9IHBhcmVudE5vZGUoKTsKLSAgICBpZiAoIXRhYmxlKQotICAgICAgICBy
ZXR1cm4gLTE7Ci0gICAgdGFibGUgPSB0YWJsZS0+cGFyZW50Tm9kZSgpOwotICAgIGlmICghdGFi
bGUgfHwgIXRhYmxlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKLSAgICAgICAgcmV0dXJuIC0xOwot
Ci0gICAgLy8gVG8gbWF0Y2ggRmlyZWZveCwgdGhlIHJvdyBpbmRpY2VzIHdvcmsgbGlrZSB0aGlz
OgotICAgIC8vICAgUm93cyBmcm9tIHRoZSBmaXJzdCA8dGhlYWQ+IGFyZSBudW1iZXJlZCBiZWZv
cmUgYWxsIDx0Ym9keT4gcm93cy4KLSAgICAvLyAgIFJvd3MgZnJvbSB0aGUgZmlyc3QgPHRmb290
PiBhcmUgbnVtYmVyZWQgYWZ0ZXIgYWxsIDx0Ym9keT4gcm93cy4KLSAgICAvLyAgIFJvd3MgZnJv
bSBvdGhlciA8dGhlYWQ+IGFuZCA8dGZvb3Q+IGVsZW1lbnRzIGRvbid0IGdldCByb3cgaW5kaWNl
cyBhdCBhbGwuCi0KLSAgICBpbnQgckluZGV4ID0gMDsKLQotICAgIGlmIChIVE1MVGFibGVTZWN0
aW9uRWxlbWVudCogaGVhZCA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUVsZW1lbnQqPih0YWJsZSkt
PnRIZWFkKCkpIHsKLSAgICAgICAgZm9yIChOb2RlICpyb3cgPSBoZWFkLT5maXJzdENoaWxkKCk7
IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAocm93ID09
IHRoaXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJJbmRleDsKLSAgICAgICAgICAgICsrcklu
ZGV4OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGZvciAoTm9kZSAqbm9kZSA9IHRhYmxl
LT5maXJzdENoaWxkKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpKSB7Ci0gICAg
ICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKHRib2R5VGFnKSkgewotICAgICAgICAgICAgSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQqIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9u
RWxlbWVudCo+KG5vZGUpOwotICAgICAgICAgICAgZm9yIChOb2RlKiByb3cgPSBzZWN0aW9uLT5m
aXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKHJvdyA9PSB0aGlzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gckluZGV4
OwotICAgICAgICAgICAgICAgICsrckluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgaWYgKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmb290ID0gc3RhdGljX2Nh
c3Q8SFRNTFRhYmxlRWxlbWVudCAqPih0YWJsZSktPnRGb290KCkpIHsKLSAgICAgICAgZm9yIChO
b2RlICpyb3cgPSBmb290LT5maXJzdENoaWxkKCk7IHJvdzsgcm93ID0gcm93LT5uZXh0U2libGlu
ZygpKSB7Ci0gICAgICAgICAgICBpZiAocm93ID09IHRoaXMpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIHJJbmRleDsKLSAgICAgICAgICAgICsrckluZGV4OwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgLy8gV2UgZ2V0IGhlcmUgZm9yIHJvd3MgdGhhdCBhcmUgaW4gPHRoZWFkPiBvciA8dGZvb3Q+
IHNlY3Rpb25zIG90aGVyIHRoYW4gdGhlIG1haW4gaGVhZGVyIGFuZCBmb290ZXIuCi0gICAgcmV0
dXJuIC0xOwotfQotCi1pbnQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2VjdGlvblJvd0luZGV4KCkg
Y29uc3QKLXsKLSAgICBpbnQgckluZGV4ID0gMDsKLSAgICBjb25zdCBOb2RlICpuID0gdGhpczsK
LSAgICBkbyB7Ci0gICAgICAgIG4gPSBuLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgaWYg
KG4gJiYgbi0+aGFzVGFnTmFtZSh0clRhZykpCi0gICAgICAgICAgICBySW5kZXgrKzsKLSAgICB9
Ci0gICAgd2hpbGUgKG4pOwotCi0gICAgcmV0dXJuIHJJbmRleDsKLX0KLQotSFRNTEVsZW1lbnQg
KkhUTUxUYWJsZVJvd0VsZW1lbnQ6Omluc2VydENlbGwoIGludCBpbmRleCwgRXhjZXB0aW9uQ29k
ZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgKmMgPSAwTDsKLSAgICBSZWZQdHI8
Tm9kZUxpc3Q+IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1DZWxscyA9IGNo
aWxkcmVuID8gY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBpZiAoIGluZGV4IDwgLTEgfHwg
aW5kZXggPiBudW1DZWxscyApCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7IC8vIHBlciB0
aGUgRE9NCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYyA9IG5ldyBIVE1MVGFibGVDZWxsRWxl
bWVudCh0ZFRhZywgZG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmKG51bUNlbGxzID09IGluZGV4IHx8
IGluZGV4ID09IC0xKQotICAgICAgICAgICAgYXBwZW5kQ2hpbGQoYywgZWMpOwotICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIE5vZGUgKm47Ci0gICAgICAgICAgICBpZihpbmRleCA8IDEpCi0g
ICAgICAgICAgICAgICAgbiA9IGZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICBuID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgpOwotICAgICAgICAgICAgaW5zZXJ0
QmVmb3JlKGMsIG4sIGVjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYzsKLX0KLQot
dm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpkZWxldGVDZWxsKCBpbnQgaW5kZXgsIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVz
KCk7Ci0gICAgaW50IG51bUNlbGxzID0gY2hpbGRyZW4gPyBjaGlsZHJlbi0+bGVuZ3RoKCkgOiAw
OwotICAgIGlmIChpbmRleCA9PSAtMSApCi0gICAgICAgIGluZGV4ID0gbnVtQ2VsbHMtMTsKLSAg
ICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUNlbGxzKSB7Ci0gICAgICAgIFJlZlB0cjxO
b2RlPiByb3cgPSBjaGlsZHJlbi0+aXRlbShpbmRleCk7Ci0gICAgICAgIEhUTUxFbGVtZW50Ojpy
ZW1vdmVDaGlsZChyb3cuZ2V0KCksIGVjKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZWMgPSBJTkRF
WF9TSVpFX0VSUjsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVSb3dFbGVt
ZW50OjpjZWxscygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhU
TUxDb2xsZWN0aW9uKHRoaXMsIEhUTUxDb2xsZWN0aW9uOjpUUl9DRUxMUykpOwotfQotCi12b2lk
IEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldENlbGxzKEhUTUxDb2xsZWN0aW9uICosIEV4Y2VwdGlv
bkNvZGUmIGVjKQotewotICAgIGVjID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOwotfQot
Ci1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50
OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGln
bkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OmJnQ29sb3Io
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIpOwotfQotCi12
b2lkIEhUTUxUYWJsZVJvd0VsZW1lbnQ6OnNldEJnQ29sb3IoY29uc3QgU3RyaW5nICZ2YWx1ZSkK
LXsKLSAgICBzZXRBdHRyaWJ1dGUoYmdjb2xvckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhU
TUxUYWJsZVJvd0VsZW1lbnQ6OmNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGNoYXJBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRDaChjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyQXR0ciwgdmFsdWUpOwotfQot
Ci1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVy
biBnZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0VsZW1l
bnQ6OnNldENoT2ZmKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNo
YXJvZmZBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50Ojp2QWxp
Z24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1IVE1MVGFibGVDZWxsRWxlbWVudDo6SFRNTFRhYmxlQ2VsbEVsZW1lbnQo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRvYykKLSAgOiBIVE1MVGFi
bGVQYXJ0RWxlbWVudCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgX2NvbCA9IC0xOwotICAgIF9yb3cg
PSAtMTsKLSAgICBjU3BhbiA9IHJTcGFuID0gMTsKLSAgICByb3dIZWlnaHQgPSAwOwotICAgIG1f
c29saWQgPSBmYWxzZTsKLX0KLQotSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6On5IVE1MVGFibGVDZWxs
RWxlbWVudCgpCi17Ci19Ci0KLWludCBIVE1MVGFibGVDZWxsRWxlbWVudDo6Y2VsbEluZGV4KCkg
Y29uc3QKLXsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGZvciAoY29uc3QgTm9kZSAqIG5vZGUg
PSBwcmV2aW91c1NpYmxpbmcoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnByZXZpb3VzU2libGluZygp
KSB7Ci0gICAgICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBub2RlLT5oYXNUYWdO
YW1lKHRoVGFnKSkKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIAotICAgIHJldHVy
biBpbmRleDsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxsRWxlbWVudDo6bWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkg
Y29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0gbm93cmFwQXR0cikgewotICAgICAgICByZXN1
bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAg
IGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0
QXR0cikgewotICAgICAgICByZXN1bHQgPSBlQ2VsbDsgLy8gQmVjYXVzZSBvZiB0aGUgcXVpcmt5
IGJlaGF2aW9yIG9mIGlnbm9yaW5nIDAgdmFsdWVzLCBjZWxscyBhcmUgc3BlY2lhbC4KLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBIVE1MVGFibGVQYXJ0RWxlbWVu
dDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxs
RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlICphdHRyKQotewot
ICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gcm93c3BhbkF0dHIpIHsKLSAgICAgICAgclNwYW4gPSAh
YXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgpLnRvSW50KCkgOiAxOwotICAgICAgICBpZiAo
clNwYW4gPCAxKSByU3BhbiA9IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVy
KCktPmlzVGFibGVDZWxsKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNl
bGwqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0
dHItPm5hbWUoKSA9PSBjb2xzcGFuQXR0cikgewotICAgICAgICBjU3BhbiA9ICFhdHRyLT5pc051
bGwoKSA/IGF0dHItPnZhbHVlKCkudG9JbnQoKSA6IDE7Ci0gICAgICAgIGlmIChjU3BhbiA8IDEp
IGNTcGFuID0gMTsKLSAgICAgICAgaWYgKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJs
ZUNlbGwoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ2VsbCo+KHJlbmRl
cmVyKCkpLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgp
ID09IG5vd3JhcEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT5pc051bGwoKSkKLSAgICAgICAg
ICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1dISVRFX1NQQUNFLCBDU1NfVkFMX19X
RUJLSVRfTk9XUkFQKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIp
IHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
aW50IHdpZHRoSW50ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotICAgICAgICAgICAgaWYgKHdp
ZHRoSW50ID4gMCkgLy8gd2lkdGg9IjAiIGlzIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0
aCBXaW5JRS4KLSAgICAgICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lE
VEgsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1l
KCkgPT0gaGVpZ2h0QXR0cikgewotICAgICAgICBpZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0SW50ID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwot
ICAgICAgICAgICAgaWYgKGhlaWdodEludCA+IDApIC8vIGhlaWdodD0iMCIgaXMgaWdub3JlZCBm
b3IgY29tcGF0aWJpbGl0eSB3aXRoIFdpbklFLgotICAgICAgICAgICAgICAgIGFkZENTU0xlbmd0
aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAg
fSBlbHNlCi0gICAgICAgIEhUTUxUYWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0
ZShhdHRyKTsKLX0KLQotLy8gdXNlZCBieSB0YWJsZSBjZWxscyB0byBzaGFyZSBzdHlsZSBkZWNs
cyBjcmVhdGVkIGJ5IHRoZSBlbmNsb3NpbmcgdGFibGUuCi1DU1NNdXRhYmxlU3R5bGVEZWNsYXJh
dGlvbiogSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURlY2wo
KQotewotICAgIE5vZGUqIHAgPSBwYXJlbnROb2RlKCk7Ci0gICAgd2hpbGUgKHAgJiYgIXAtPmhh
c1RhZ05hbWUodGFibGVUYWcpKQotICAgICAgICBwID0gcC0+cGFyZW50Tm9kZSgpOwotCi0gICAg
aWYgKHApIHsKLSAgICAgICAgSFRNTFRhYmxlRWxlbWVudCogdGFibGUgPSBzdGF0aWNfY2FzdDxI
VE1MVGFibGVFbGVtZW50Kj4ocCk7Ci0gICAgICAgIHJldHVybiB0YWJsZS0+Z2V0U2hhcmVkQ2Vs
bERlY2woKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxs
RWxlbWVudDo6aXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlICphdHRyKSBjb25zdAotewotICAgIHJl
dHVybiBhdHRyLT5uYW1lKCkgPT0gYmFja2dyb3VuZEF0dHI7Ci19Ci0KLVN0cmluZyBIVE1MVGFi
bGVDZWxsRWxlbWVudDo6YWJicigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShh
YmJyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEFiYnIoY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWJickF0dHIsIHZhbHVlKTsKLX0K
LQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVt
ZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShh
bGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpheGlz
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGF4aXNBdHRyKTsKLX0KLQotdm9p
ZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0QXhpcyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewot
ICAgIHNldEF0dHJpYnV0ZShheGlzQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxl
Q2VsbEVsZW1lbnQ6OmJnQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUo
Ymdjb2xvckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRCZ0NvbG9y
KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6Y2goKSBjb25zdAotewot
ICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoY2hhckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNl
bGxFbGVtZW50OjpzZXRDaChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShjaGFyQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmNo
T2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0K
LQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhcm9mZkF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBI
VE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Q29sU3BhbihpbnQgbikKLXsKLSAgICBzZXRBdHRyaWJ1
dGUoY29sc3BhbkF0dHIsIFN0cmluZzo6bnVtYmVyKG4pKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJs
ZUNlbGxFbGVtZW50OjpoZWFkZXJzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KGhlYWRlcnNBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0SGVhZGVy
cyhjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShoZWFkZXJzQXR0ciwg
dmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmhlaWdodCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShoZWlnaHRBdHRyKTsKLX0KLQotdm9pZCBIVE1M
VGFibGVDZWxsRWxlbWVudDo6c2V0SGVpZ2h0KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGhlaWdodEF0dHIsIHZhbHVlKTsKLX0KLQotYm9vbCBIVE1MVGFibGVDZWxs
RWxlbWVudDo6bm9XcmFwKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIWdldEF0dHJpYnV0ZShub3dy
YXBBdHRyKS5pc051bGwoKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Tm9X
cmFwKGJvb2wgYikKLXsKLSAgICBzZXRBdHRyaWJ1dGUobm93cmFwQXR0ciwgYiA/ICIiIDogMCk7
Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFJvd1NwYW4oaW50IG4pCi17Ci0g
ICAgc2V0QXR0cmlidXRlKHJvd3NwYW5BdHRyLCBTdHJpbmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0
cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2NvcGUoKSBjb25zdAotewotICAgIHJldHVybiBn
ZXRBdHRyaWJ1dGUoc2NvcGVBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6
c2V0U2NvcGUoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoc2NvcGVB
dHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6dkFsaWduKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lk
IEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRWQWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUodmFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRl
KHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFdpZHRoKGNv
bnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgdmFsdWUp
OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUhUTUxUYWJsZUNvbEVsZW1lbnQ6OkhUTUxU
YWJsZUNvbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQgKmRv
YykKLSAgICA6IEhUTUxUYWJsZVBhcnRFbGVtZW50KHRhZ05hbWUsIGRvYykKLXsKLSAgICBfc3Bh
biA9ICh0YWdOYW1lLm1hdGNoZXMoY29sZ3JvdXBUYWcpID8gMCA6IDEpOwotfQotCi1ib29sIEhU
TUxUYWJsZUNvbEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5h
bWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJO
YW1lID09IHdpZHRoQXR0cikgewotICAgICAgICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRFbGVtZW50
OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVs
ZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAg
ICBpZiAoYXR0ci0+bmFtZSgpID09IHNwYW5BdHRyKSB7Ci0gICAgICAgIF9zcGFuID0gIWF0dHIt
PmlzTnVsbCgpID8gYXR0ci0+dmFsdWUoKS50b0ludCgpIDogMTsKLSAgICAgICAgaWYgKHJlbmRl
cmVyKCkgJiYgcmVuZGVyZXIoKS0+aXNUYWJsZUNvbCgpKQotICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8UmVuZGVyVGFibGVDb2wqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLSAg
ICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSB3aWR0aEF0dHIpIHsKLSAgICAgICAgaWYgKCFh
dHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBD
U1NfUFJPUF9XSURUSCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxU
YWJsZVBhcnRFbGVtZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotU3RyaW5n
IEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0
cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0QWxp
Z24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2
YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50OjpjaCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29s
RWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
Y2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OmNoT2Zm
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJvZmZBdHRyKTsKLX0KLQot
dm9pZCBIVE1MVGFibGVDb2xFbGVtZW50OjpzZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwotfQotCi12b2lkIEhUTUxU
YWJsZUNvbEVsZW1lbnQ6OnNldFNwYW4oaW50IG4pCi17Ci0gICAgc2V0QXR0cmlidXRlKHNwYW5B
dHRyLCBTdHJpbmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50
Ojp2QWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUodmFsaWduQXR0cik7
Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3Ry
aW5nIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OndpZHRoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0
QXR0cmlidXRlKHdpZHRoQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxlbWVudDo6c2V0
V2lkdGgoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUod2lkdGhBdHRy
LCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBIVE1MVGFibGVDYXB0
aW9uRWxlbWVudDo6bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFw
cGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBpZiAoYXR0ck5hbWUgPT0g
YWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVDYXB0aW9uOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJO
YW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjpwYXJzZU1h
cHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5h
bWUoKSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHko
KSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0NBUFRJT05fU0lE
RSwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIEhUTUxFbGVtZW50OjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShhdHRyKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIp
OwotfQotCi12b2lkIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJp
bmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQog
fQpJbmRleDogaHRtbC9IVE1MVGFibGVDb2xFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9I
VE1MVGFibGVDb2xFbGVtZW50LmgJKHJldmlzaW9uIDE0MzI1KQorKysgaHRtbC9IVE1MVGFibGVD
b2xFbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI1LDMxMSArMjUsMjcgQEAKICAqCiAgKi8K
IAotI2lmbmRlZiBIVE1MVGFibGVFbGVtZW50SW1wbF9ICi0jZGVmaW5lIEhUTUxUYWJsZUVsZW1l
bnRJbXBsX0gKKyNpZm5kZWYgSFRNTFRhYmxlQ29sRWxlbWVudF9ICisjZGVmaW5lIEhUTUxUYWJs
ZUNvbEVsZW1lbnRfSAogCi0jaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1M
TmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MVGFibGVQYXJ0RWxlbWVudC5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLWNsYXNzIEhUTUxDb2xsZWN0aW9uOwotY2xhc3MgSFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQ7Ci1jbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudDsKLWNsYXNzIEhUTUxUYWJsZUNh
cHRpb25FbGVtZW50OwotCi1jbGFzcyBIVE1MVGFibGVFbGVtZW50IDogcHVibGljIEhUTUxFbGVt
ZW50IHsKLXB1YmxpYzoKLSAgICBlbnVtIFJ1bGVzIHsKLSAgICAgICAgTm9uZSAgICA9IDB4MDAs
Ci0gICAgICAgIFJHcm91cHMgPSAweDAxLAotICAgICAgICBDR3JvdXBzID0gMHgwMiwKLSAgICAg
ICAgR3JvdXBzICA9IDB4MDMsCi0gICAgICAgIFJvd3MgICAgPSAweDA1LAotICAgICAgICBDb2xz
ICAgID0gMHgwYSwKLSAgICAgICAgQWxsICAgICA9IDB4MGYKLSAgICB9OwotICAgIGVudW0gRnJh
bWUgewotICAgICAgICBWb2lkICAgPSAweDAwLAotICAgICAgICBBYm92ZSAgPSAweDAxLAotICAg
ICAgICBCZWxvdyAgPSAweDAyLAotICAgICAgICBMaHMgICAgPSAweDA0LAotICAgICAgICBSaHMg
ICAgPSAweDA4LAotICAgICAgICBIc2lkZXMgPSAweDAzLAotICAgICAgICBWc2lkZXMgPSAweDBj
LAotICAgICAgICBCb3ggICAgPSAweDBmCi0gICAgfTsKLQotICAgIEhUTUxUYWJsZUVsZW1lbnQo
RG9jdW1lbnQqKTsKLSAgICB+SFRNTFRhYmxlRWxlbWVudCgpOwotCi0gICAgdmlydHVhbCBIVE1M
VGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFnU3RhdHVzUmVx
dWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIDk7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSopOwotCi0gICAgSFRNTFRh
YmxlQ2FwdGlvbkVsZW1lbnQqIGNhcHRpb24oKSBjb25zdCB7IHJldHVybiB0Q2FwdGlvbjsgfQot
ICAgIE5vZGUqIHNldENhcHRpb24oSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQqKTsKLQotICAgIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50KiB0SGVhZCgpIGNvbnN0IHsgcmV0dXJuIGhlYWQ7IH0KLSAg
ICBOb2RlKiBzZXRUSGVhZChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAgSFRNTFRh
YmxlU2VjdGlvbkVsZW1lbnQqIHRGb290KCkgY29uc3QgeyByZXR1cm4gZm9vdDsgfQotICAgIE5v
ZGUqIHNldFRGb290KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kik7Ci0KLSAgICBOb2RlKiBzZXRU
Qm9keShIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAgSFRNTEVsZW1lbnQqIGNyZWF0
ZVRIZWFkKCk7Ci0gICAgdm9pZCBkZWxldGVUSGVhZCgpOwotICAgIEhUTUxFbGVtZW50KiBjcmVh
dGVURm9vdCgpOwotICAgIHZvaWQgZGVsZXRlVEZvb3QoKTsKLSAgICBIVE1MRWxlbWVudCogY3Jl
YXRlQ2FwdGlvbigpOwotICAgIHZvaWQgZGVsZXRlQ2FwdGlvbigpOwotICAgIEhUTUxFbGVtZW50
KiBpbnNlcnRSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVS
b3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rp
b24+IHJvd3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IHRCb2RpZXMoKTsKLQotICAg
IFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7
Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0QmdDb2xvcihjb25z
dCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBib3JkZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEJv
cmRlcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjZWxsUGFkZGluZygpIGNvbnN0Owot
ICAgIHZvaWQgc2V0Q2VsbFBhZGRpbmcoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2Vs
bFNwYWNpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldENlbGxTcGFjaW5nKGNvbnN0IFN0cmluZyYp
OwotCi0gICAgU3RyaW5nIGZyYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRGcmFtZShjb25zdCBT
dHJpbmcmKTsKLQotICAgIFN0cmluZyBydWxlcygpIGNvbnN0OwotICAgIHZvaWQgc2V0UnVsZXMo
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgc3VtbWFyeSgpIGNvbnN0OwotICAgIHZvaWQg
c2V0U3VtbWFyeShjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyB3aWR0aCgpIGNvbnN0Owot
ICAgIHZvaWQgc2V0V2lkdGgoY29uc3QgU3RyaW5nJik7Ci0KLSAgICAvLyBvdmVycmlkZXMKLSAg
ICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4pOwotICAg
IHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
bWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRl
RW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmli
dXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cik7Ci0KLSAgICAvLyBVc2VkIHRvIG9idGFpbiBlaXRo
ZXIgYSBzb2xpZCBvciBvdXRzZXQgYm9yZGVyIGRlY2wuCi0gICAgdmlydHVhbCBDU1NNdXRhYmxl
U3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgpOwotICAgIENT
U011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRTaGFyZWRDZWxsRGVjbCgpOwotCi0gICAgdmly
dHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBpc1VSTEF0dHJpYnV0
ZShBdHRyaWJ1dGUqKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50KiBoZWFkOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmb290OwotICAgIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmaXJzdEJvZHk7Ci0gICAgSFRNTFRhYmxlQ2FwdGlvbkVs
ZW1lbnQqIHRDYXB0aW9uOwotCi0gICAgYm9vbCBtX25vQm9yZGVyICAgICA6IDE7Ci0gICAgYm9v
bCBtX3NvbGlkICAgICAgICA6IDE7Ci0gICAgLy8gMTQgYml0cyB1bnVzZWQKLSAgICB1bnNpZ25l
ZCBzaG9ydCBwYWRkaW5nOwotICAgIGZyaWVuZCBjbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudDsK
LX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRhYmxlUGFydEVsZW1lbnQg
OiBwdWJsaWMgSFRNTEVsZW1lbnQKLQotewotcHVibGljOgotICAgIEhUTUxUYWJsZVBhcnRFbGVt
ZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2MpCi0gICAgICAg
IDogSFRNTEVsZW1lbnQodGFnTmFtZSwgZG9jKQotICAgICAgICB7IH0KLQotICAgIHZpcnR1YWwg
Ym9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRy
aWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRB
dHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LWNsYXNzIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50IDogcHVibGljIEhUTUxUYWJsZVBhcnRFbGVt
ZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQoY29uc3QgUXVhbGlm
aWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqLCBib29sIGltcGxpY2l0KTsKLQotICAgIHZpcnR1
YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0
YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJl
dHVybiA4OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0IE5vZGUqKTsKLSAgICB2
aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4pOwotICAgIAot
ICAgIEhUTUxFbGVtZW50KiBpbnNlcnRSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0g
ICAgdm9pZCBkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBpbnQg
bnVtUm93cygpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAgIHZv
aWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsKLSAg
ICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNv
bnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAgUmVmUHRyPEhU
TUxDb2xsZWN0aW9uPiByb3dzKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNz
IEhUTUxUYWJsZVJvd0VsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFydEVsZW1lbnQKLXsKLXB1
YmxpYzoKLSAgICBIVE1MVGFibGVSb3dFbGVtZW50KERvY3VtZW50KiBkb2MpCi0gICAgICAgIDog
SFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5hbWVzOjp0clRhZywgZG9jKSB7fQotCi0gICAgdmly
dHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1cm4gVGFn
U3RhdHVzT3B0aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsg
cmV0dXJuIDc7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSopOwotICAg
IHZpcnR1YWwgQ29udGFpbmVyTm9kZSogYWRkQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPik7Ci0gICAg
Ci0gICAgaW50IHJvd0luZGV4KCkgY29uc3Q7Ci0gICAgaW50IHNlY3Rpb25Sb3dJbmRleCgpIGNv
bnN0OwotCi0gICAgSFRNTEVsZW1lbnQqIGluc2VydENlbGwoaW50IGluZGV4LCBFeGNlcHRpb25D
b2RlJik7Ci0gICAgdm9pZCBkZWxldGVDZWxsKGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYpOwot
Ci0gICAgdm9pZCBzZXRSb3dJbmRleChpbnQpOwotCi0gICAgdm9pZCBzZXRTZWN0aW9uUm93SW5k
ZXgoaW50KTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gY2VsbHMoKTsKLSAgICB2b2lk
IHNldENlbGxzKEhUTUxDb2xsZWN0aW9uICosIEV4Y2VwdGlvbkNvZGUmKTsKLQotICAgIFN0cmlu
ZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0QmdDb2xvcihjb25zdCBTdHJp
bmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3QgU3Ry
aW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2ZmKGNv
bnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0
VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IG5jb2xzOwotfTsK
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudCA6IHB1
YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxUYWJsZUNlbGxF
bGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50Kik7Ci0gICAgfkhU
TUxUYWJsZUNlbGxFbGVtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFn
UmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNPcHRpb25hbDsgfQotICAgIHZp
cnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNjsgfQotCi0gICAgaW50IGNl
bGxJbmRleCgpIGNvbnN0OwotCi0gICAgaW50IGNvbCgpIGNvbnN0IHsgcmV0dXJuIF9jb2w7IH0K
LSAgICB2b2lkIHNldENvbChpbnQgY29sKSB7IF9jb2wgPSBjb2w7IH0KLSAgICBpbnQgcm93KCkg
Y29uc3QgeyByZXR1cm4gX3JvdzsgfQotICAgIHZvaWQgc2V0Um93KGludCByKSB7IF9yb3cgPSBy
OyB9Ci0KLSAgICBpbnQgY29sU3BhbigpIGNvbnN0IHsgcmV0dXJuIGNTcGFuOyB9Ci0gICAgaW50
IHJvd1NwYW4oKSBjb25zdCB7IHJldHVybiByU3BhbjsgfQotCi0gICAgdmlydHVhbCBib29sIG1h
cFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVu
dHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0
ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAgIC8vIHVzZWQgYnkgdGFibGUgY2VsbHMgdG8gc2hh
cmUgc3R5bGUgZGVjbHMgY3JlYXRlZCBieSB0aGUgZW5jbG9zaW5nIHRhYmxlLgotICAgIHZpcnR1
YWwgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIGFkZGl0aW9uYWxBdHRyaWJ1dGVTdHlsZURl
Y2woKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgaXNVUkxBdHRyaWJ1dGUoQXR0cmlidXRlKikg
Y29uc3Q7Ci0KLSAgICB2b2lkIHNldENlbGxJbmRleChpbnQpOwotCi0gICAgU3RyaW5nIGFiYnIo
KSBjb25zdDsKLSAgICB2b2lkIHNldEFiYnIoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcg
YWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwotCi0gICAg
U3RyaW5nIGF4aXMoKSBjb25zdDsKLSAgICB2b2lkIHNldEF4aXMoY29uc3QgU3RyaW5nJik7Ci0K
LSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0QmdDb2xvcihjb25zdCBT
dHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3Qg
U3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2Zm
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgdm9pZCBzZXRDb2xTcGFuKGludCk7Ci0KLSAgICBTdHJp
bmcgaGVhZGVycygpIGNvbnN0OwotICAgIHZvaWQgc2V0SGVhZGVycyhjb25zdCBTdHJpbmcmKTsK
LQotICAgIFN0cmluZyBoZWlnaHQoKSBjb25zdDsKLSAgICB2b2lkIHNldEhlaWdodChjb25zdCBT
dHJpbmcmKTsKLQotICAgIGJvb2wgbm9XcmFwKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXROb1dyYXAo
Ym9vbCk7Ci0KLSAgICB2b2lkIHNldFJvd1NwYW4oaW50KTsKLQotICAgIFN0cmluZyBzY29wZSgp
IGNvbnN0OwotICAgIHZvaWQgc2V0U2NvcGUoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcg
dkFsaWduKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRWQWxpZ24oY29uc3QgU3RyaW5nJik7Ci0KLSAg
ICBTdHJpbmcgd2lkdGgoKSBjb25zdDsKLSAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyYp
OwotCi1wcm90ZWN0ZWQ6Ci0gICAgaW50IF9yb3c7Ci0gICAgaW50IF9jb2w7Ci0gICAgaW50IHJT
cGFuOwotICAgIGludCBjU3BhbjsKLSAgICBpbnQgcm93SGVpZ2h0OwotICAgIGJvb2wgbV9zb2xp
ZCAgICAgICAgOiAxOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgSFRNTFRhYmxl
RWxlbWVudDsKIAogY2xhc3MgSFRNTFRhYmxlQ29sRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQ
YXJ0RWxlbWVudAogewogcHVibGljOgogICAgIEhUTUxUYWJsZUNvbEVsZW1lbnQoY29uc3QgUXVh
bGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqKTsKIAotICAgIHZpcnR1YWwgSFRNTFRhZ1N0
YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGhhc0xvY2FsTmFtZShIVE1M
TmFtZXM6OmNvbFRhZykgPyBUYWdTdGF0dXNGb3JiaWRkZW4gOiBUYWdTdGF0dXNPcHRpb25hbDsg
fQotICAgIHZpcnR1YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gaGFzTG9jYWxO
YW1lKEhUTUxOYW1lczo6Y29sVGFnKSA/IDAgOiAxOyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNr
RFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKSB7IHJldHVybiBoYXNMb2NhbE5hbWUoSFRNTE5hbWVz
Ojpjb2xncm91cFRhZykgJiYgbmV3Q2hpbGQtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpjb2xUYWcp
OyB9CisgICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3Q7
CisgICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wg
Y2hlY2tEVEQoY29uc3QgTm9kZSopOwogICAgIHZvaWQgc2V0VGFibGUoSFRNTFRhYmxlRWxlbWVu
dCogdCkgeyB0YWJsZSA9IHQ7IH0KIAogICAgIC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgYm9v
bCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1
dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25z
dCBRdWFsaWZpZWROYW1lJiwgTWFwcGVkQXR0cmlidXRlRW50cnkmKSBjb25zdDsKICAgICB2aXJ0
dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7CiAKICAgICBp
bnQgc3BhbigpIGNvbnN0IHsgcmV0dXJuIF9zcGFuOyB9CkBAIC0zNTYsMjQgKzcyLDYgQEAgcHJv
dGVjdGVkOgogICAgIEhUTUxUYWJsZUVsZW1lbnQgKnRhYmxlOwogfTsKIAotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1jbGFzcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFi
bGVQYXJ0RWxlbWVudAotewotcHVibGljOgotICAgIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KERv
Y3VtZW50ICpkb2MpCi0gICAgICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5hbWVzOjpj
YXB0aW9uVGFnLCBkb2MpIHt9Ci0KLSAgICB2aXJ0dWFsIEhUTUxUYWdTdGF0dXMgZW5kVGFnUmVx
dWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNSZXF1aXJlZDsgfQotICAgIHZpcnR1
YWwgaW50IHRhZ1ByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gNTsgfQotICAgIAotICAgIHZpcnR1
YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRB
dHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci0KLSAgICBTdHJpbmcgYWxpZ24oKSBjb25z
dDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmluZyYpOwotfTsKLQogfSAvL25hbWVzcGFj
ZQogCiAjZW5kaWYKSW5kZXg6IGh0bWwvSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBodG1sL0hUTUxUYWJsZUNlbGxFbGVtZW50LmgJKHJldmlzaW9uIDE0MzI1KQorKysgaHRt
bC9IVE1MVGFibGVDZWxsRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSwyMjMgKzI1LDE3
IEBACiAgKgogICovCiAKLSNpZm5kZWYgSFRNTFRhYmxlRWxlbWVudEltcGxfSAotI2RlZmluZSBI
VE1MVGFibGVFbGVtZW50SW1wbF9ICisjaWZuZGVmIEhUTUxUYWJsZUNlbGxFbGVtZW50X0gKKyNk
ZWZpbmUgSFRNTFRhYmxlQ2VsbEVsZW1lbnRfSAogCi0jaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIK
LSNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MVGFibGVQYXJ0RWxlbWVudC5o
IgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEhUTUxDb2xsZWN0aW9uOwotY2xhc3Mg
SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7Ci1jbGFzcyBIVE1MVGFibGVDZWxsRWxlbWVudDsKLWNs
YXNzIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OwotCi1jbGFzcyBIVE1MVGFibGVFbGVtZW50IDog
cHVibGljIEhUTUxFbGVtZW50IHsKLXB1YmxpYzoKLSAgICBlbnVtIFJ1bGVzIHsKLSAgICAgICAg
Tm9uZSAgICA9IDB4MDAsCi0gICAgICAgIFJHcm91cHMgPSAweDAxLAotICAgICAgICBDR3JvdXBz
ID0gMHgwMiwKLSAgICAgICAgR3JvdXBzICA9IDB4MDMsCi0gICAgICAgIFJvd3MgICAgPSAweDA1
LAotICAgICAgICBDb2xzICAgID0gMHgwYSwKLSAgICAgICAgQWxsICAgICA9IDB4MGYKLSAgICB9
OwotICAgIGVudW0gRnJhbWUgewotICAgICAgICBWb2lkICAgPSAweDAwLAotICAgICAgICBBYm92
ZSAgPSAweDAxLAotICAgICAgICBCZWxvdyAgPSAweDAyLAotICAgICAgICBMaHMgICAgPSAweDA0
LAotICAgICAgICBSaHMgICAgPSAweDA4LAotICAgICAgICBIc2lkZXMgPSAweDAzLAotICAgICAg
ICBWc2lkZXMgPSAweDBjLAotICAgICAgICBCb3ggICAgPSAweDBmCi0gICAgfTsKLQotICAgIEhU
TUxUYWJsZUVsZW1lbnQoRG9jdW1lbnQqKTsKLSAgICB+SFRNTFRhYmxlRWxlbWVudCgpOwotCi0g
ICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29uc3QgeyByZXR1
cm4gVGFnU3RhdHVzUmVxdWlyZWQ7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNv
bnN0IHsgcmV0dXJuIDk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29uc3QgTm9kZSop
OwotCi0gICAgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQqIGNhcHRpb24oKSBjb25zdCB7IHJldHVy
biB0Q2FwdGlvbjsgfQotICAgIE5vZGUqIHNldENhcHRpb24oSFRNTFRhYmxlQ2FwdGlvbkVsZW1l
bnQqKTsKLQotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiB0SGVhZCgpIGNvbnN0IHsgcmV0
dXJuIGhlYWQ7IH0KLSAgICBOb2RlKiBzZXRUSGVhZChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCop
OwotCi0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIHRGb290KCkgY29uc3QgeyByZXR1cm4g
Zm9vdDsgfQotICAgIE5vZGUqIHNldFRGb290KEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Kik7Ci0K
LSAgICBOb2RlKiBzZXRUQm9keShIVE1MVGFibGVTZWN0aW9uRWxlbWVudCopOwotCi0gICAgSFRN
TEVsZW1lbnQqIGNyZWF0ZVRIZWFkKCk7Ci0gICAgdm9pZCBkZWxldGVUSGVhZCgpOwotICAgIEhU
TUxFbGVtZW50KiBjcmVhdGVURm9vdCgpOwotICAgIHZvaWQgZGVsZXRlVEZvb3QoKTsKLSAgICBI
VE1MRWxlbWVudCogY3JlYXRlQ2FwdGlvbigpOwotICAgIHZvaWQgZGVsZXRlQ2FwdGlvbigpOwot
ICAgIEhUTUxFbGVtZW50KiBpbnNlcnRSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0g
ICAgdm9pZCBkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0KLSAgICBSZWZQ
dHI8SFRNTENvbGxlY3Rpb24+IHJvd3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb24+IHRC
b2RpZXMoKTsKLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24o
Y29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQg
c2V0QmdDb2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBib3JkZXIoKSBjb25zdDsK
LSAgICB2b2lkIHNldEJvcmRlcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjZWxsUGFk
ZGluZygpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2VsbFBhZGRpbmcoY29uc3QgU3RyaW5nJik7Ci0K
LSAgICBTdHJpbmcgY2VsbFNwYWNpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldENlbGxTcGFjaW5n
KGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIGZyYW1lKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRGcmFtZShjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBydWxlcygpIGNvbnN0OwotICAg
IHZvaWQgc2V0UnVsZXMoY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgc3VtbWFyeSgpIGNv
bnN0OwotICAgIHZvaWQgc2V0U3VtbWFyeShjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyB3
aWR0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0V2lkdGgoY29uc3QgU3RyaW5nJik7Ci0KLSAgICAv
LyBvdmVycmlkZXMKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQ
dHI8Tm9kZT4pOwotICAgIHZpcnR1YWwgdm9pZCBjaGlsZHJlbkNoYW5nZWQoKTsKLSAgICAKLSAg
ICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWROYW1lJiBhdHRyTmFtZSwg
TWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBh
cnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cik7Ci0KLSAgICAvLyBVc2Vk
IHRvIG9idGFpbiBlaXRoZXIgYSBzb2xpZCBvciBvdXRzZXQgYm9yZGVyIGRlY2wuCi0gICAgdmly
dHVhbCBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogYWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxl
RGVjbCgpOwotICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBnZXRTaGFyZWRDZWxsRGVj
bCgpOwotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIAotICAgIHZpcnR1YWwgYm9v
bCBpc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUqKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIEhU
TUxUYWJsZVNlY3Rpb25FbGVtZW50KiBoZWFkOwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
KiBmb290OwotICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBmaXJzdEJvZHk7Ci0gICAgSFRN
TFRhYmxlQ2FwdGlvbkVsZW1lbnQqIHRDYXB0aW9uOwotCi0gICAgYm9vbCBtX25vQm9yZGVyICAg
ICA6IDE7Ci0gICAgYm9vbCBtX3NvbGlkICAgICAgICA6IDE7Ci0gICAgLy8gMTQgYml0cyB1bnVz
ZWQKLSAgICB1bnNpZ25lZCBzaG9ydCBwYWRkaW5nOwotICAgIGZyaWVuZCBjbGFzcyBIVE1MVGFi
bGVDZWxsRWxlbWVudDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSFRNTFRh
YmxlUGFydEVsZW1lbnQgOiBwdWJsaWMgSFRNTEVsZW1lbnQKLQotewotcHVibGljOgotICAgIEhU
TUxUYWJsZVBhcnRFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50
KiBkb2MpCi0gICAgICAgIDogSFRNTEVsZW1lbnQodGFnTmFtZSwgZG9jKQotICAgICAgICB7IH0K
LQotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJO
YW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZv
aWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVkQXR0cmlidXRlKik7Ci19OwotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50IDogcHVibGljIEhU
TUxUYWJsZVBhcnRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRhYmxlU2VjdGlvbkVsZW1l
bnQoY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqLCBib29sIGltcGxpY2l0
KTsKLQotICAgIHZpcnR1YWwgSFRNTFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0
IHsgcmV0dXJuIFRhZ1N0YXR1c09wdGlvbmFsOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3Jp
dHkoKSBjb25zdCB7IHJldHVybiA4OyB9Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRFREKGNvbnN0
IE5vZGUqKTsKLSAgICB2aXJ0dWFsIENvbnRhaW5lck5vZGUqIGFkZENoaWxkKFBhc3NSZWZQdHI8
Tm9kZT4pOwotICAgIAotICAgIEhUTUxFbGVtZW50KiBpbnNlcnRSb3coaW50IGluZGV4LCBFeGNl
cHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVSb3coaW50IGluZGV4LCBFeGNlcHRpb25Db2Rl
Jik7Ci0KLSAgICBpbnQgbnVtUm93cygpIGNvbnN0OwotCi0gICAgU3RyaW5nIGFsaWduKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXRBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgp
IGNvbnN0OwotICAgIHZvaWQgc2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hP
ZmYoKSBjb25zdDsKLSAgICB2b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3Ry
aW5nIHZBbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwot
Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiByb3dzKCk7Ci19OwotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZVJvd0VsZW1lbnQgOiBwdWJsaWMgSFRNTFRhYmxlUGFy
dEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVSb3dFbGVtZW50KERvY3VtZW50KiBk
b2MpCi0gICAgICAgIDogSFRNTFRhYmxlUGFydEVsZW1lbnQoSFRNTE5hbWVzOjp0clRhZywgZG9j
KSB7fQotCi0gICAgdmlydHVhbCBIVE1MVGFnU3RhdHVzIGVuZFRhZ1JlcXVpcmVtZW50KCkgY29u
c3QgeyByZXR1cm4gVGFnU3RhdHVzT3B0aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlv
cml0eSgpIGNvbnN0IHsgcmV0dXJuIDc7IH0KLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tEVEQoY29u
c3QgTm9kZSopOwotICAgIHZpcnR1YWwgQ29udGFpbmVyTm9kZSogYWRkQ2hpbGQoUGFzc1JlZlB0
cjxOb2RlPik7Ci0gICAgCi0gICAgaW50IHJvd0luZGV4KCkgY29uc3Q7Ci0gICAgaW50IHNlY3Rp
b25Sb3dJbmRleCgpIGNvbnN0OwotCi0gICAgSFRNTEVsZW1lbnQqIGluc2VydENlbGwoaW50IGlu
ZGV4LCBFeGNlcHRpb25Db2RlJik7Ci0gICAgdm9pZCBkZWxldGVDZWxsKGludCBpbmRleCwgRXhj
ZXB0aW9uQ29kZSYpOwotCi0gICAgdm9pZCBzZXRSb3dJbmRleChpbnQpOwotCi0gICAgdm9pZCBz
ZXRTZWN0aW9uUm93SW5kZXgoaW50KTsKLQotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gY2Vs
bHMoKTsKLSAgICB2b2lkIHNldENlbGxzKEhUTUxDb2xsZWN0aW9uICosIEV4Y2VwdGlvbkNvZGUm
KTsKLQotICAgIFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3Qg
U3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgYmdDb2xvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0QmdD
b2xvcihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0cmluZyBjaCgpIGNvbnN0OwotICAgIHZvaWQg
c2V0Q2goY29uc3QgU3RyaW5nJik7Ci0KLSAgICBTdHJpbmcgY2hPZmYoKSBjb25zdDsKLSAgICB2
b2lkIHNldENoT2ZmKGNvbnN0IFN0cmluZyYpOwotCi0gICAgU3RyaW5nIHZBbGlnbigpIGNvbnN0
OwotICAgIHZvaWQgc2V0VkFsaWduKGNvbnN0IFN0cmluZyYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAg
aW50IG5jb2xzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBjbGFzcyBIVE1MVGFibGVD
ZWxsRWxlbWVudCA6IHB1YmxpYyBIVE1MVGFibGVQYXJ0RWxlbWVudAogewogcHVibGljOgotICAg
IEhUTUxUYWJsZUNlbGxFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3Vt
ZW50Kik7CisgICAgSFRNTFRhYmxlQ2VsbEVsZW1lbnQoY29uc3QgUXVhbGlmaWVkTmFtZSYsIERv
Y3VtZW50Kik7CiAgICAgfkhUTUxUYWJsZUNlbGxFbGVtZW50KCk7CiAKICAgICB2aXJ0dWFsIEhU
TUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBUYWdTdGF0dXNP
cHRpb25hbDsgfQpAQCAtMjU3LDcgKzUxLDcgQEAgcHVibGljOgogICAgIGludCBjb2xTcGFuKCkg
Y29uc3QgeyByZXR1cm4gY1NwYW47IH0KICAgICBpbnQgcm93U3BhbigpIGNvbnN0IHsgcmV0dXJu
IHJTcGFuOyB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgbWFwVG9FbnRyeShjb25zdCBRdWFsaWZpZWRO
YW1lJiBhdHRyTmFtZSwgTWFwcGVkQXR0cmlidXRlRW50cnkmIHJlc3VsdCkgY29uc3Q7CisgICAg
dmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYsIE1hcHBlZEF0dHJp
YnV0ZUVudHJ5JikgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHBhcnNlTWFwcGVkQXR0cmlidXRl
KE1hcHBlZEF0dHJpYnV0ZSopOwogCiAgICAgLy8gdXNlZCBieSB0YWJsZSBjZWxscyB0byBzaGFy
ZSBzdHlsZSBkZWNscyBjcmVhdGVkIGJ5IHRoZSBlbmNsb3NpbmcgdGFibGUuCkBAIC0zMTMsNjUg
KzEwNyw3IEBAIHByb3RlY3RlZDoKICAgICBpbnQgclNwYW47CiAgICAgaW50IGNTcGFuOwogICAg
IGludCByb3dIZWlnaHQ7Ci0gICAgYm9vbCBtX3NvbGlkICAgICAgICA6IDE7Ci19OwotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZUNvbEVsZW1lbnQgOiBwdWJsaWMgSFRN
TFRhYmxlUGFydEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBIVE1MVGFibGVDb2xFbGVtZW50KGNv
bnN0IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50Kik7Ci0KLSAgICB2aXJ0dWFsIEhU
TUxUYWdTdGF0dXMgZW5kVGFnUmVxdWlyZW1lbnQoKSBjb25zdCB7IHJldHVybiBoYXNMb2NhbE5h
bWUoSFRNTE5hbWVzOjpjb2xUYWcpID8gVGFnU3RhdHVzRm9yYmlkZGVuIDogVGFnU3RhdHVzT3B0
aW9uYWw7IH0KLSAgICB2aXJ0dWFsIGludCB0YWdQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGhh
c0xvY2FsTmFtZShIVE1MTmFtZXM6OmNvbFRhZykgPyAwIDogMTsgfQotICAgIHZpcnR1YWwgYm9v
bCBjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkgeyByZXR1cm4gaGFzTG9jYWxOYW1lKEhU
TUxOYW1lczo6Y29sZ3JvdXBUYWcpICYmIG5ld0NoaWxkLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6
Y29sVGFnKTsgfQotICAgIHZvaWQgc2V0VGFibGUoSFRNTFRhYmxlRWxlbWVudCogdCkgeyB0YWJs
ZSA9IHQ7IH0KLQotICAgIC8vIG92ZXJyaWRlcwotICAgIHZpcnR1YWwgYm9vbCBtYXBUb0VudHJ5
KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVz
dWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlKik7Ci0KLSAgICBpbnQgc3BhbigpIGNvbnN0IHsgcmV0dXJuIF9zcGFuOyB9Ci0K
LSAgICBTdHJpbmcgYWxpZ24oKSBjb25zdDsKLSAgICB2b2lkIHNldEFsaWduKGNvbnN0IFN0cmlu
ZyYpOwotCi0gICAgU3RyaW5nIGNoKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRDaChjb25zdCBTdHJp
bmcmKTsKLQotICAgIFN0cmluZyBjaE9mZigpIGNvbnN0OwotICAgIHZvaWQgc2V0Q2hPZmYoY29u
c3QgU3RyaW5nJik7Ci0KLSAgICB2b2lkIHNldFNwYW4oaW50KTsKLQotICAgIFN0cmluZyB2QWxp
Z24oKSBjb25zdDsKLSAgICB2b2lkIHNldFZBbGlnbihjb25zdCBTdHJpbmcmKTsKLQotICAgIFN0
cmluZyB3aWR0aCgpIGNvbnN0OwotICAgIHZvaWQgc2V0V2lkdGgoY29uc3QgU3RyaW5nJik7Ci0K
LXByb3RlY3RlZDoKLSAgICBpbnQgX3NwYW47Ci0gICAgSFRNTFRhYmxlRWxlbWVudCAqdGFibGU7
Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50IDogcHVibGljIEhUTUxUYWJsZVBhcnRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgSFRNTFRh
YmxlQ2FwdGlvbkVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgICAgICAgOiBIVE1MVGFibGVQYXJ0
RWxlbWVudChIVE1MTmFtZXM6OmNhcHRpb25UYWcsIGRvYykge30KLQotICAgIHZpcnR1YWwgSFRN
TFRhZ1N0YXR1cyBlbmRUYWdSZXF1aXJlbWVudCgpIGNvbnN0IHsgcmV0dXJuIFRhZ1N0YXR1c1Jl
cXVpcmVkOyB9Ci0gICAgdmlydHVhbCBpbnQgdGFnUHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiA1
OyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIG1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFt
ZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0OwotICAgIHZp
cnR1YWwgdm9pZCBwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUqKTsKLQotICAg
IFN0cmluZyBhbGlnbigpIGNvbnN0OwotICAgIHZvaWQgc2V0QWxpZ24oY29uc3QgU3RyaW5nJik7
CisgICAgYm9vbCBtX3NvbGlkOwogfTsKIAogfSAvL25hbWVzcGFjZQpJbmRleDogaHRtbC9odG1s
X3RhYmxlaW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9odG1sX3RhYmxlaW1wbC5jcHAJKHJl
dmlzaW9uIDE0MzI1KQorKysgaHRtbC9odG1sX3RhYmxlaW1wbC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsMTMzNCArMCwwIEBACi0vKioKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBET00g
aW1wbGVtZW50YXRpb24gZm9yIEtERS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGlu
IEpvbmVzIChtam9uZXNAa2RlLm9yZykKLSAqICAgICAgICAgICAoQykgMTk5NyBUb3JiZW4gV2Vp
cyAod2Vpc0BrZGUub3JnKQotICogICAgICAgICAgIChDKSAxOTk4IFdhbGRvIEJhc3RpYW4gKGJh
c3RpYW5Aa2RlLm9yZykKLSAqICAgICAgICAgICAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBr
ZGUub3JnKQotICogICAgICAgICAgIChDKSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0Br
ZGUub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEFwcGxlIENv
bXB1dGVyLCBJbmMuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoK
LSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkg
VGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0Eu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImh0bWxfdGFibGVpbXBsLmgi
Ci0KLSNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCi0jaW5jbHVkZSAiTm9kZUxpc3QuaCIKLSNp
bmNsdWRlICJSZW5kZXJUYWJsZS5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgotI2lu
Y2x1ZGUgIlJlbmRlclRhYmxlQ29sLmgiCi0jaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgi
Ci0jaW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgImNzc2hlbHBlci5oIgotI2lu
Y2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJjc3NzdHlsZXNlbGVjdG9yLmgi
Ci0jaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5o
IgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0K
LUhUTUxUYWJsZUVsZW1lbnQ6OkhUTUxUYWJsZUVsZW1lbnQoRG9jdW1lbnQgKmRvYykKLSAgOiBI
VE1MRWxlbWVudCh0YWJsZVRhZywgZG9jKQotewotICAgIHRDYXB0aW9uID0gMDsKLSAgICBoZWFk
ID0gMDsKLSAgICBmb290ID0gMDsKLSAgICBmaXJzdEJvZHkgPSAwOwotCi0gCi0gICAgcGFkZGlu
ZyA9IDE7Ci0gICAgCi0gICAgbV9ub0JvcmRlciA9IHRydWU7Ci0gICAgbV9zb2xpZCA9IGZhbHNl
OwotfQotCi1IVE1MVGFibGVFbGVtZW50Ojp+SFRNTFRhYmxlRWxlbWVudCgpCi17Ci0gICAgaWYg
KGZpcnN0Qm9keSkKLSAgICAgICAgZmlyc3RCb2R5LT5kZXJlZigpOwotfQotCi1ib29sIEhUTUxU
YWJsZUVsZW1lbnQ6OmNoZWNrRFREKGNvbnN0IE5vZGUqIG5ld0NoaWxkKQotewotICAgIHJldHVy
biBuZXdDaGlsZC0+aXNUZXh0Tm9kZSgpIHx8IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNhcHRpb25U
YWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKGNvbFRhZykgfHwgbmV3Q2hp
bGQtPmhhc1RhZ05hbWUoY29sZ3JvdXBUYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNU
YWdOYW1lKHRoZWFkVGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZSh0Zm9vdFRhZykgfHwKLSAg
ICAgICAgICAgbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGJvZHlUYWcpIHx8IG5ld0NoaWxkLT5oYXNU
YWdOYW1lKGZvcm1UYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5oYXNUYWdOYW1lKHNjcmlw
dFRhZyk7Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENhcHRpb24oIEhUTUxUYWJs
ZUNhcHRpb25FbGVtZW50ICpjICkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBp
ZiAoTm9kZSAqb2MgPSB0Q2FwdGlvbikKLSAgICAgICAgcmVwbGFjZUNoaWxkKGMsIG9jLCBlYyk7
Ci0gICAgZWxzZQotICAgICAgICBpbnNlcnRCZWZvcmUoYywgZmlyc3RDaGlsZCgpLCBlYyk7Ci0g
ICAgdENhcHRpb24gPSBjOwotICAgIHJldHVybiB0Q2FwdGlvbjsKLX0KLQotTm9kZSogSFRNTFRh
YmxlRWxlbWVudDo6c2V0VEhlYWQoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpzICkKLXsKLSAg
ICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqaCA9IGhlYWQpCi0gICAgICAg
IHJlcGxhY2VDaGlsZChzLCBoLCBlYyk7Ci0gICAgZWxzZSBpZiAoZm9vdCkKLSAgICAgICAgaW5z
ZXJ0QmVmb3JlKHMsIGZvb3QsIGVjKTsKLSAgICBlbHNlIGlmIChmaXJzdEJvZHkpCi0gICAgICAg
IGluc2VydEJlZm9yZShzLCBmaXJzdEJvZHksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGFwcGVu
ZENoaWxkKHMsIGVjKTsKLSAgICBoZWFkID0gczsKLSAgICByZXR1cm4gaGVhZDsKLX0KLQotTm9k
ZSogSFRNTFRhYmxlRWxlbWVudDo6c2V0VEZvb3QoIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICpz
ICkKLXsKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoTm9kZSAqZiA9IGZvb3Qp
Ci0gICAgICAgIHJlcGxhY2VDaGlsZChzLCBmLCBlYyk7Ci0gICAgZWxzZSBpZiAoZmlyc3RCb2R5
KQotICAgICAgICBpbnNlcnRCZWZvcmUocywgZmlyc3RCb2R5LCBlYyk7Ci0gICAgZWxzZQotICAg
ICAgICBhcHBlbmRDaGlsZChzLCBlYyk7Ci0gICAgZm9vdCA9IHM7Ci0gICAgcmV0dXJuIGZvb3Q7
Ci19Ci0KLU5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OnNldFRCb2R5KCBIVE1MVGFibGVTZWN0aW9u
RWxlbWVudCAqcyApCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9kZSogcjsK
LSAgICBzLT5yZWYoKTsKLSAgICBpZiAoTm9kZSAqZmIgPSBmaXJzdEJvZHkpIHsKLSAgICAgICAg
cmVwbGFjZUNoaWxkKHMsIGZiLCBlYyk7Ci0gICAgICAgIGZiLT5kZXJlZigpOwotICAgICAgICBy
ID0gczsKLSAgICB9IGVsc2UKLSAgICAgICAgYXBwZW5kQ2hpbGQocywgZWMpOwotICAgIGZpcnN0
Qm9keSA9IHM7Ci0gICAgcmV0dXJuIGZpcnN0Qm9keTsKLX0KLQotSFRNTEVsZW1lbnQgKkhUTUxU
YWJsZUVsZW1lbnQ6OmNyZWF0ZVRIZWFkKCAgKQotewotICAgIGlmKCFoZWFkKQotICAgIHsKLSAg
ICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIGhlYWQgPSBuZXcgSFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQodGhlYWRUYWcsIGRvY3VtZW50KCksIHRydWUgLyogaW1wbGljaXQgKi8p
OwotICAgICAgICBpZihmb290KQotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKCBoZWFkLCBmb290
LCBlYyApOwotICAgICAgICBlbHNlIGlmKGZpcnN0Qm9keSkKLSAgICAgICAgICAgIGluc2VydEJl
Zm9yZSggaGVhZCwgZmlyc3RCb2R5LCBlYyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFw
cGVuZENoaWxkKGhlYWQsIGVjKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLXZvaWQg
SFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlVEhlYWQoICApCi17Ci0gICAgaWYoaGVhZCkgewotICAg
ICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgaGVhZC0+cmVmKCk7Ci0gICAgICAg
IEhUTUxFbGVtZW50OjpyZW1vdmVDaGlsZChoZWFkLCBlYyk7Ci0gICAgICAgIGhlYWQtPmRlcmVm
KCk7Ci0gICAgfQotICAgIGhlYWQgPSAwOwotfQotCi1IVE1MRWxlbWVudCAqSFRNTFRhYmxlRWxl
bWVudDo6Y3JlYXRlVEZvb3QoICApCi17Ci0gICAgaWYgKCFmb290KQotICAgIHsKLSAgICAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgIGZvb3QgPSBuZXcgSFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQodGZvb3RUYWcsIGRvY3VtZW50KCksIHRydWUgLyppbXBsaWNpdCAqLyk7Ci0gICAg
ICAgIGlmIChmaXJzdEJvZHkpCi0gICAgICAgICAgICBpbnNlcnRCZWZvcmUoIGZvb3QsIGZpcnN0
Qm9keSwgZWMgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXBwZW5kQ2hpbGQoZm9vdCwg
ZWMpOwotICAgIH0KLSAgICByZXR1cm4gZm9vdDsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50
OjpkZWxldGVURm9vdCggICkKLXsKLSAgICBpZihmb290KSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwotICAgICAgICBmb290LT5yZWYoKTsKLSAgICAgICAgSFRNTEVsZW1lbnQ6OnJl
bW92ZUNoaWxkKGZvb3QsIGVjKTsKLSAgICAgICAgZm9vdC0+ZGVyZWYoKTsKLSAgICB9Ci0gICAg
Zm9vdCA9IDA7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVFbGVtZW50OjpjcmVhdGVDYXB0
aW9uKCAgKQotewotICAgIGlmKCF0Q2FwdGlvbikKLSAgICB7Ci0gICAgICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwotICAgICAgICB0Q2FwdGlvbiA9IG5ldyBIVE1MVGFibGVDYXB0aW9uRWxlbWVu
dChkb2N1bWVudCgpKTsKLSAgICAgICAgaW5zZXJ0QmVmb3JlKCB0Q2FwdGlvbiwgZmlyc3RDaGls
ZCgpLCBlYyApOwotICAgIH0KLSAgICByZXR1cm4gdENhcHRpb247Ci19Ci0KLXZvaWQgSFRNTFRh
YmxlRWxlbWVudDo6ZGVsZXRlQ2FwdGlvbiggICkKLXsKLSAgICBpZih0Q2FwdGlvbikgewotICAg
ICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAgdENhcHRpb24tPnJlZigpOwotICAg
ICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQodENhcHRpb24sIGVjKTsKLSAgICAgICAgdENh
cHRpb24tPmRlcmVmKCk7Ci0gICAgfQotICAgIHRDYXB0aW9uID0gMDsKLX0KLQotSFRNTEVsZW1l
bnQgKkhUTUxUYWJsZUVsZW1lbnQ6Omluc2VydFJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2Rl
JiBlYykKLXsKLSAgICAvLyBUaGUgRE9NIHJlcXVpcmVzIHRoYXQgd2UgY3JlYXRlIGEgdGJvZHkg
aWYgdGhlIHRhYmxlIGlzIGVtcHR5Ci0gICAgLy8gKGNmIERPTTJUUyBIVE1MVGFibGVFbGVtZW50
MzEgdGVzdCkKLSAgICAvLyAobm90ZTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSAiaWYgdGhlIHRh
YmxlIGhhcyBubyBzZWN0aW9ucyIsIHNpbmNlIHdlIGNhbiBoYXZlCi0gICAgLy8gPFRBQkxFPjxU
Uj4pCi0gICAgaWYoIWZpcnN0Qm9keSAmJiAhaGVhZCAmJiAhZm9vdCkKLSAgICAgICAgc2V0VEJv
ZHkoIG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCh0Ym9keVRhZywgZG9jdW1lbnQoKSwgdHJ1
ZSAvKiBpbXBsaWNpdCAqLykgKTsKLQotICAgIC8vIElFIHRyZWF0cyBpbmRleD0tMSBhcyBkZWZh
dWx0IHZhbHVlIG1lYW5pbmcgJ2FwcGVuZCBhZnRlciBsYXN0JwotICAgIC8vIFRoaXMgaXNuJ3Qg
aW4gdGhlIERPTS4gU28sIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0gICAgSFRNTFRhYmxlU2VjdGlv
bkVsZW1lbnQqIHNlY3Rpb24gPSAwTDsKLSAgICBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCogbGFz
dFNlY3Rpb24gPSAwTDsKLSAgICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgpOwotICAgIGJvb2wg
YXBwZW5kID0gKGluZGV4ID09IC0xKTsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9y
ICggOyBub2RlICYmIChpbmRleD49MCB8fCBhcHBlbmQpIDsgbm9kZSA9IG5vZGUtPm5leHRTaWJs
aW5nKCkgKQotICAgIHsKLSAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgMiB0Zm9vdCBlbGVtZW50
cyBpbiB0aGUgdGFibGUuIE9ubHkgdGhlIGZpcnN0IG9uZSBpcyB0aGUgImZvb3QiLCB0aGF0J3Mg
d2h5IHdlIGhhdmUgdGhlIG1vcmUKLSAgICAgICAgLy8gY29tcGxpY2F0ZWQgaWYgc3RhdGVtZW50
IGJlbG93LgotICAgICAgICBpZiAobm9kZSAhPSBmb290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRo
ZWFkVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKHRmb290VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1l
KHRib2R5VGFnKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2Fz
dDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihub2RlKTsKLSAgICAgICAgICAgIGxhc3RTZWN0
aW9uID0gc2VjdGlvbjsKLSAgICAgICAgICAgIGlmICghYXBwZW5kKSB7Ci0gICAgICAgICAgICAg
ICAgaW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJv
d3MgPj0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgaW5kZXggLT0gcm93czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LSAgICBpZiAoICFmb3VuZCAmJiBmb290ICkKLSAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0
PEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50ICo+KGZvb3QpOwotCi0gICAgLy8gSW5kZXggPT0gMCBt
ZWFucyAiaW5zZXJ0IGJlZm9yZSBmaXJzdCByb3cgaW4gY3VycmVudCBzZWN0aW9uIgotICAgIC8v
IG9yICJhcHBlbmQgYWZ0ZXIgbGFzdCByb3ciIChpZiB0aGVyZSdzIG5vIGN1cnJlbnQgc2VjdGlv
biBhbnltb3JlKQotICAgIGlmICggIXNlY3Rpb24gJiYgKCBpbmRleCA9PSAwIHx8IGFwcGVuZCAp
ICkKLSAgICB7Ci0gICAgICAgIHNlY3Rpb24gPSBsYXN0U2VjdGlvbjsKLSAgICAgICAgaW5kZXgg
PSBzZWN0aW9uID8gc2VjdGlvbi0+bnVtUm93cygpIDogMDsKLSAgICB9Ci0gICAgaWYgKHNlY3Rp
b24gJiYgKGluZGV4ID49IDAgfHwgYXBwZW5kKSkKLSAgICAgICAgcmV0dXJuIHNlY3Rpb24tPmlu
c2VydFJvdyhpbmRleCwgZWMpOwotICAgIGVsc2UgewotICAgICAgICAvLyBObyBtb3JlIHNlY3Rp
b25zID0+IGluZGV4IGlzIHRvbyBiaWcKLSAgICAgICAgZWMgPSBJTkRFWF9TSVpFX0VSUjsKLSAg
ICAgICAgcmV0dXJuIDBMOwotICAgIH0KLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpkZWxl
dGVSb3coIGludCBpbmRleCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQqIHNlY3Rpb24gPSAwTDsKLSAgICBOb2RlICpub2RlID0gZmlyc3RDaGlsZCgp
OwotICAgIGJvb2wgbGFzdFJvdyA9IGluZGV4ID09IC0xOwotICAgIEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50KiBsYXN0U2VjdGlvbiA9IDBMOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBm
b3IgKCA7IG5vZGUgOyBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSApCi0gICAgewotICAgICAg
ICBpZiAobm9kZSAhPSBmb290ICYmIChub2RlLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSB8fCBub2Rl
LT5oYXNUYWdOYW1lKHRmb290VGFnKSB8fCAKLSAgICAgICAgICAgIG5vZGUtPmhhc1RhZ05hbWUo
dGJvZHlUYWcpKSkgewotICAgICAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PEhUTUxUYWJs
ZVNlY3Rpb25FbGVtZW50ICo+KG5vZGUpOwotICAgICAgICAgICAgbGFzdFNlY3Rpb24gPSBzZWN0
aW9uOwotICAgICAgICAgICAgaW50IHJvd3MgPSBzZWN0aW9uLT5udW1Sb3dzKCk7Ci0gICAgICAg
ICAgICBpZiAoICFsYXN0Um93ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAo
IHJvd3MgPiBpbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAg
ICAgICAgICAgICAgaW5kZXggLT0gcm93czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgICBzZWN0aW9uID0gMEw7Ci0gICAgfQotICAgIGlmICggIWZvdW5kICYmIGZvb3QgKQotICAg
ICAgICBzZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgKj4oZm9v
dCk7Ci0KLSAgICBpZiAoIGxhc3RSb3cgKQotICAgICAgICBsYXN0U2VjdGlvbi0+ZGVsZXRlUm93
KCAtMSwgZWMgKTsKLSAgICBlbHNlIGlmICggc2VjdGlvbiAmJiBpbmRleCA+PSAwICYmIGluZGV4
IDwgc2VjdGlvbi0+bnVtUm93cygpICkKLSAgICAgICAgc2VjdGlvbi0+ZGVsZXRlUm93KCBpbmRl
eCwgZWMgKTsKLSAgICBlbHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLUNv
bnRhaW5lck5vZGUqIEhUTUxUYWJsZUVsZW1lbnQ6OmFkZENoaWxkKFBhc3NSZWZQdHI8Tm9kZT4g
Y2hpbGQpCi17Ci0gICAgaWYgKGNoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpKSB7Ci0gICAgICAg
IC8vIEZpcnN0IGFkZCB0aGUgY2hpbGQuCi0gICAgICAgIEhUTUxFbGVtZW50OjphZGRDaGlsZChj
aGlsZCk7Ci0KLSAgICAgICAgLy8gTm93IHNpbXBseSByZXR1cm4gb3Vyc2VsdmVzIGFzIHRoZSBj
b250YWluZXIgdG8gaW5zZXJ0IGludG8uCi0gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qg
b2YgZGVtb3RpbmcgdGhlIGZvcm0gdG8gYSBsZWFmIGFuZCBtb3ZpbmcgaXQgc2FmZWx5IG91dCBv
ZiB0aGUgd2F5LgotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY3Jl
YXRpb24gb2YgPHRib2R5PiBlbGVtZW50cyByZWxpZXMgb24gdGhlICJjaGlsZEFsbG93ZWQiIGNo
ZWNrLAotICAgIC8vIHNvIHdlIG5lZWQgdG8gZG8gaXQgZXZlbiBmb3IgWE1MIGRvY3VtZW50cy4K
LSAgICBhc3NlcnQoY2hpbGQtPm5vZGVUeXBlKCkgIT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk7
Ci0gICAgaWYgKCFkb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpICYmICFjaGlsZEFsbG93ZWQo
Y2hpbGQuZ2V0KCkpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIENvbnRhaW5lck5vZGUqIGNv
bnRhaW5lciA9IEhUTUxFbGVtZW50OjphZGRDaGlsZChjaGlsZC5nZXQoKSk7Ci0gICAgaWYgKGNv
bnRhaW5lcikgewotICAgICAgICBpZiAoIXRDYXB0aW9uICYmIGNoaWxkLT5oYXNUYWdOYW1lKGNh
cHRpb25UYWcpKQotICAgICAgICAgICAgdENhcHRpb24gPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVD
YXB0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFoZWFkICYm
IGNoaWxkLT5oYXNUYWdOYW1lKHRoZWFkVGFnKSkKLSAgICAgICAgICAgIGhlYWQgPSBzdGF0aWNf
Y2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgIGVs
c2UgaWYgKCFmb290ICYmIGNoaWxkLT5oYXNUYWdOYW1lKHRmb290VGFnKSkKLSAgICAgICAgICAg
IGZvb3QgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVTZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQo
KSk7Ci0gICAgICAgIGVsc2UgaWYgKCFmaXJzdEJvZHkgJiYgY2hpbGQtPmhhc1RhZ05hbWUodGJv
ZHlUYWcpKSB7Ci0gICAgICAgICAgICBmaXJzdEJvZHkgPSBzdGF0aWNfY2FzdDxIVE1MVGFibGVT
ZWN0aW9uRWxlbWVudCAqPihjaGlsZC5nZXQoKSk7Ci0gICAgICAgICAgICBmaXJzdEJvZHktPnJl
ZigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb250YWluZXI7Ci19Ci0KLXZvaWQg
SFRNTFRhYmxlRWxlbWVudDo6Y2hpbGRyZW5DaGFuZ2VkKCkKLXsKLSAgICBIVE1MRWxlbWVudDo6
Y2hpbGRyZW5DaGFuZ2VkKCk7Ci0gICAgCi0gICAgaWYgKGZpcnN0Qm9keSAmJiBmaXJzdEJvZHkt
PnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0gICAgICAgIGZpcnN0Qm9keS0+ZGVyZWYoKTsKLSAg
ICAgICAgZmlyc3RCb2R5ID0gMDsKLSAgICB9Ci19IAotCi1ib29sIEhUTUxUYWJsZUVsZW1lbnQ6
Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0
ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IGJhY2tncm91bmRB
dHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IChNYXBwZWRBdHRyaWJ1dGVFbnRyeSkoZUxhc3RFbnRy
eSArIGRvY3VtZW50KCktPmRvY0lEKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
ICAgIAotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUg
PT0gaGVpZ2h0QXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBiZ2NvbG9yQXR0ciB8fAotICAg
ICAgICBhdHRyTmFtZSA9PSBjZWxsc3BhY2luZ0F0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0g
dnNwYWNlQXR0ciB8fAotICAgICAgICBhdHRyTmFtZSA9PSBoc3BhY2VBdHRyIHx8Ci0gICAgICAg
IGF0dHJOYW1lID09IHZhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0g
Ym9yZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIHJlc3VsdCA9IGVVbml2ZXJzYWw7Ci0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYm9yZGVyQXR0
cikgewotICAgICAgICByZXN1bHQgPSBlVGFibGU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAg
IH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYWxpZ25BdHRyKSB7Ci0gICAgICAgIHJlc3Vs
dCA9IGVUYWJsZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgCi0gICAgcmV0
dXJuIEhUTUxFbGVtZW50OjptYXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lk
IEhUTUxUYWJsZUVsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAq
YXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgpID09IHdpZHRoQXR0cikgewotICAgICAgICBh
ZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHItPnZhbHVlKCkpOwotICAgIH0g
ZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgYWRkQ1NTTGVu
Z3RoKGF0dHIsIENTU19QUk9QX0hFSUdIVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyQXR0cikgIHsKLSAgICAgICAgbV9ub0JvcmRlciA9IHRy
dWU7Ci0gICAgICAgIGlmIChhdHRyLT5kZWNsKCkpIHsKLSAgICAgICAgICAgIFJlZlB0cjxDU1NW
YWx1ZT4gdmFsID0gYXR0ci0+ZGVjbCgpLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKENTU19QUk9QX0JP
UkRFUl9MRUZUX1dJRFRIKTsKLSAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLT5pc1ByaW1pdGl2
ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbVZhbCA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsLmdldCgpKTsKLSAgICAgICAgICAg
ICAgICBtX25vQm9yZGVyID0gIXByaW1WYWwtPmdldEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFs
dWU6OkNTU19OVU1CRVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2Ug
aWYgKCFhdHRyLT5pc051bGwoKSkgewotICAgICAgICAgICAgLy8gIyMjIHRoaXMgbmVlZHMgbW9y
ZSB3b3JrLCBhcyB0aGUgYm9yZGVyIHZhbHVlIGlzIG5vdCBvbmx5Ci0gICAgICAgICAgICAvLyAg
ICAgdGhlIGJvcmRlciBvZiB0aGUgYm94LCBidXQgYWxzbyBiZXR3ZWVuIHRoZSBjZWxscwotICAg
ICAgICAgICAgaW50IGJvcmRlciA9IDA7Ci0gICAgICAgICAgICBpZiAoYXR0ci0+aXNFbXB0eSgp
KQotICAgICAgICAgICAgICAgIGJvcmRlciA9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgYm9yZGVyID0gYXR0ci0+dmFsdWUoKS50b0ludCgpOwotI2lmZGVmIERFQlVHX0RS
QVdfQk9SREVSCi0gICAgICAgICAgICBib3JkZXI9MTsKLSNlbmRpZgotICAgICAgICAgICAgbV9u
b0JvcmRlciA9ICFib3JkZXI7Ci0gICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BS
T1BfQk9SREVSX1dJRFRILCBTdHJpbmc6Om51bWJlcihib3JkZXIpKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJnY29sb3JBdHRyKSB7Ci0gICAgICAgIGFkZENT
U0NvbG9yKGF0dHIsIENTU19QUk9QX0JBQ0tHUk9VTkRfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGJvcmRlcmNvbG9yQXR0cikgewotICAgICAg
ICBtX3NvbGlkID0gYXR0ci0+ZGVjbCgpOwotICAgICAgICBpZiAoIWF0dHItPmRlY2woKSAmJiAh
YXR0ci0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhZGRDU1NDb2xvcihhdHRyLCBDU1NfUFJP
UF9CT1JERVJfQ09MT1IsIGF0dHItPnZhbHVlKCkpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVy
dHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1RPUF9TVFlMRSwgQ1NTX1ZBTF9TT0xJRCk7Ci0gICAg
ICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfQk9UVE9NX1NUWUxF
LCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19Q
Uk9QX0JPUkRFUl9MRUZUX1NUWUxFLCBDU1NfVkFMX1NPTElEKTsKLSAgICAgICAgICAgIGFkZENT
U1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgQ1NTX1ZBTF9TT0xJ
RCk7Ci0gICAgICAgICAgICBtX3NvbGlkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBp
ZiAoYXR0ci0+bmFtZSgpID09IGJhY2tncm91bmRBdHRyKSB7Ci0gICAgICAgIFN0cmluZyB1cmwg
PSBXZWJDb3JlOjpwYXJzZVVSTChhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF1cmwuaXNF
bXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTSW1hZ2VQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9C
QUNLR1JPVU5EX0lNQUdFLCBkb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBmcmFtZUF0dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHIt
Pm5hbWUoKSA9PSBydWxlc0F0dHIpIHsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBj
ZWxsc3BhY2luZ0F0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9CT1JERVJfU1BBQ0lORywg
YXR0ci0+dmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY2VsbHBhZGRp
bmdBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICBwYWRkaW5nID0gbWF4KCAwLCBhdHRyLT52YWx1ZSgpLnRvSW50KCkgKTsKLSAgICAgICAg
ZWxzZQotICAgICAgICAgICAgcGFkZGluZyA9IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYm
IHJlbmRlcmVyKCktPmlzVGFibGUoKSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGFibGUgKj4ocmVuZGVyZXIoKSktPnNldENlbGxQYWRkaW5nKHBhZGRpbmcpOwotICAgICAgICAg
ICAgaWYgKCFyZW5kZXJlcigpLT5uZWVkc0xheW91dCgpKQotICAgICAgICAgICAgICAgIHJlbmRl
cmVyKCktPnNldE5lZWRzTGF5b3V0KHRydWUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChh
dHRyLT5uYW1lKCkgPT0gY29sc0F0dHIpIHsKLSAgICAgICAgLy8gIyMjCi0gICAgfSBlbHNlIGlm
IChhdHRyLT5uYW1lKCkgPT0gdnNwYWNlQXR0cikgewotICAgICAgICBhZGRDU1NMZW5ndGgoYXR0
ciwgQ1NTX1BST1BfTUFSR0lOX1RPUCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGFkZENTU0xl
bmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fQk9UVE9NLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9
IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBoc3BhY2VBdHRyKSB7Ci0gICAgICAgIGFkZENTU0xl
bmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fTEVGVCwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAg
IGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9NQVJHSU5fUklHSFQsIGF0dHItPnZhbHVlKCkp
OwotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGFsaWduQXR0cikgewotICAgICAgICBp
ZiAoIWF0dHItPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfRkxPQVQsIGF0dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAoYXR0
ci0+bmFtZSgpID09IHZhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlz
RW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJ
Q0FMX0FMSUdOLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgSFRNTEVsZW1l
bnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlKGF0dHIpOwotfQotCi1DU1NNdXRhYmxlU3R5bGVEZWNs
YXJhdGlvbiogSFRNTFRhYmxlRWxlbWVudDo6YWRkaXRpb25hbEF0dHJpYnV0ZVN0eWxlRGVjbCgp
Ci17Ci0gICAgaWYgKG1fbm9Cb3JkZXIpCi0gICAgICAgIHJldHVybiAwOwotICAgIE1hcHBlZEF0
dHJpYnV0ZSBhdHRyKHRhYmxlYm9yZGVyQXR0ciwgbV9zb2xpZCA/ICJzb2xpZCIgOiAib3V0c2V0
Iik7Ci0gICAgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24qIGRlY2wgPSBnZXRNYXBwZWRB
dHRyaWJ1dGVEZWNsKGVQZXJzaXN0ZW50LCAmYXR0cik7Ci0gICAgaWYgKCFkZWNsKSB7Ci0gICAg
ICAgIGRlY2wgPSBuZXcgQ1NTTWFwcGVkQXR0cmlidXRlRGVjbGFyYXRpb24oMCk7Ci0gICAgICAg
IGRlY2wtPnNldFBhcmVudChkb2N1bWVudCgpLT5lbGVtZW50U2hlZXQoKSk7Ci0gICAgICAgIGRl
Y2wtPnNldE5vZGUodGhpcyk7Ci0gICAgICAgIGRlY2wtPnNldFN0cmljdFBhcnNpbmcoZmFsc2Up
OyAvLyBNYXBwZWQgYXR0cmlidXRlcyBhcmUganVzdCBhbHdheXMgcXVpcmt5LgotICAgICAgICAK
LSAgICAgICAgZGVjbC0+cmVmKCk7IC8vIFRoaXMgc2luZ2xlIHJlZiBwaW5zIHVzIGluIHRoZSB0
YWJsZSB1bnRpbCB0aGUgZG9jdW1lbnQgZGllcy4KLQotICAgICAgICBpbnQgdiA9IG1fc29saWQg
PyBDU1NfVkFMX1NPTElEIDogQ1NTX1ZBTF9PVVRTRVQ7Ci0gICAgICAgIGRlY2wtPnNldFByb3Bl
cnR5KENTU19QUk9QX0JPUkRFUl9UT1BfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgZGVjbC0+
c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlMRSwgdiwgZmFsc2UpOwotICAg
ICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfTEVGVF9TVFlMRSwgdiwgZmFs
c2UpOwotICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfUklHSFRfU1RZ
TEUsIHYsIGZhbHNlKTsKLQotICAgICAgICBzZXRNYXBwZWRBdHRyaWJ1dGVEZWNsKGVQZXJzaXN0
ZW50LCAmYXR0ciwgZGVjbCk7Ci0gICAgICAgIGRlY2wtPnNldFBhcmVudCgwKTsKLSAgICAgICAg
ZGVjbC0+c2V0Tm9kZSgwKTsKLSAgICAgICAgZGVjbC0+c2V0TWFwcGVkU3RhdGUoZVBlcnNpc3Rl
bnQsIGF0dHIubmFtZSgpLCBhdHRyLnZhbHVlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZGVjbDsK
LX0KLQotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJsZUVsZW1lbnQ6OmdldFNo
YXJlZENlbGxEZWNsKCkKLXsKLSAgICBNYXBwZWRBdHRyaWJ1dGUgYXR0cihjZWxsYm9yZGVyQXR0
ciwgbV9ub0JvcmRlciA/ICJub25lIiA6IChtX3NvbGlkID8gInNvbGlkIiA6ICJpbnNldCIpKTsK
LSAgICBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiogZGVjbCA9IGdldE1hcHBlZEF0dHJp
YnV0ZURlY2woZVBlcnNpc3RlbnQsICZhdHRyKTsKLSAgICBpZiAoIWRlY2wpIHsKLSAgICAgICAg
ZGVjbCA9IG5ldyBDU1NNYXBwZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigwKTsKLSAgICAgICAgZGVj
bC0+c2V0UGFyZW50KGRvY3VtZW50KCktPmVsZW1lbnRTaGVldCgpKTsKLSAgICAgICAgZGVjbC0+
c2V0Tm9kZSh0aGlzKTsKLSAgICAgICAgZGVjbC0+c2V0U3RyaWN0UGFyc2luZyhmYWxzZSk7IC8v
IE1hcHBlZCBhdHRyaWJ1dGVzIGFyZSBqdXN0IGFsd2F5cyBxdWlya3kuCi0gICAgICAgIAotICAg
ICAgICBkZWNsLT5yZWYoKTsgLy8gVGhpcyBzaW5nbGUgcmVmIHBpbnMgdXMgaW4gdGhlIHRhYmxl
IHVudGlsIHRoZSB0YWJsZSBkaWVzLgotICAgICAgICAKLSAgICAgICAgaWYgKG1fbm9Cb3JkZXIp
Ci0gICAgICAgICAgICBkZWNsLT5zZXRQcm9wZXJ0eShDU1NfUFJPUF9CT1JERVJfV0lEVEgsICIw
IiwgZmFsc2UpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5
KENTU19QUk9QX0JPUkRFUl9XSURUSCwgIjFweCIsIGZhbHNlKTsKLSAgICAgICAgICAgIGludCB2
ID0gbV9zb2xpZCA/IENTU19WQUxfU09MSUQgOiBDU1NfVkFMX0lOU0VUOwotICAgICAgICAgICAg
ZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX1RPUF9TVFlMRSwgdiwgZmFsc2UpOwot
ICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0JPVFRPTV9TVFlM
RSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVjbC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9S
REVSX0xFRlRfU1RZTEUsIHYsIGZhbHNlKTsKLSAgICAgICAgICAgIGRlY2wtPnNldFByb3BlcnR5
KENTU19QUk9QX0JPUkRFUl9SSUdIVF9TVFlMRSwgdiwgZmFsc2UpOwotICAgICAgICAgICAgZGVj
bC0+c2V0UHJvcGVydHkoQ1NTX1BST1BfQk9SREVSX0NPTE9SLCAiaW5oZXJpdCIsIGZhbHNlKTsK
LSAgICAgICAgfQotCi0gICAgICAgIHNldE1hcHBlZEF0dHJpYnV0ZURlY2woZVBlcnNpc3RlbnQs
ICZhdHRyLCBkZWNsKTsKLSAgICAgICAgZGVjbC0+c2V0UGFyZW50KDApOwotICAgICAgICBkZWNs
LT5zZXROb2RlKDApOwotICAgICAgICBkZWNsLT5zZXRNYXBwZWRTdGF0ZShlUGVyc2lzdGVudCwg
YXR0ci5uYW1lKCksIGF0dHIudmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWNsOwotfQot
Ci12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OmF0dGFjaCgpCi17Ci0gICAgYXNzZXJ0KCFtX2F0dGFj
aGVkKTsKLSAgICBIVE1MRWxlbWVudDo6YXR0YWNoKCk7Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYg
cmVuZGVyZXIoKS0+aXNUYWJsZSgpKQotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZSAq
PihyZW5kZXJlcigpKS0+c2V0Q2VsbFBhZGRpbmcoIHBhZGRpbmcgKTsKLX0KLQotYm9vbCBIVE1M
VGFibGVFbGVtZW50Ojppc1VSTEF0dHJpYnV0ZShBdHRyaWJ1dGUgKmF0dHIpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cjsKLX0KLQotUmVmUHRyPEhU
TUxDb2xsZWN0aW9uPiBIVE1MVGFibGVFbGVtZW50Ojpyb3dzKCkKLXsKLSAgICByZXR1cm4gUmVm
UHRyPEhUTUxDb2xsZWN0aW9uPihuZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rp
b246OlRBQkxFX1JPV1MpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVF
bGVtZW50Ojp0Qm9kaWVzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uPihu
ZXcgSFRNTENvbGxlY3Rpb24odGhpcywgSFRNTENvbGxlY3Rpb246OlRBQkxFX1RCT0RJRVMpKTsK
LX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGFsaWduQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6
c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25B
dHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50OjpiZ0NvbG9yKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBI
VE1MVGFibGVFbGVtZW50OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAg
c2V0QXR0cmlidXRlKGJnY29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVF
bGVtZW50Ojpib3JkZXIoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYm9yZGVy
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0Qm9yZGVyKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGJvcmRlckF0dHIsIHZhbHVlKTsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OmNlbGxQYWRkaW5nKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGNlbGxwYWRkaW5nQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlRWxl
bWVudDo6c2V0Q2VsbFBhZGRpbmcoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRy
aWJ1dGUoY2VsbHBhZGRpbmdBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVt
ZW50OjpjZWxsU3BhY2luZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjZWxs
c3BhY2luZ0F0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6OnNldENlbGxTcGFjaW5n
KGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNlbGxzcGFjaW5nQXR0
ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlRWxlbWVudDo6ZnJhbWUoKSBjb25zdAot
ewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoZnJhbWVBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFi
bGVFbGVtZW50OjpzZXRGcmFtZShjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJp
YnV0ZShmcmFtZUF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUVsZW1lbnQ6OnJ1
bGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHJ1bGVzQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlRWxlbWVudDo6c2V0UnVsZXMoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsK
LSAgICBzZXRBdHRyaWJ1dGUocnVsZXNBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFi
bGVFbGVtZW50OjpzdW1tYXJ5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHN1
bW1hcnlBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVFbGVtZW50OjpzZXRTdW1tYXJ5KGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHN1bW1hcnlBdHRyLCB2YWx1ZSk7
Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVFbGVtZW50Ojp3aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUVsZW1lbnQ6
OnNldFdpZHRoKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRo
QXR0ciwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIEhUTUxUYWJs
ZVBhcnRFbGVtZW50OjptYXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBN
YXBwZWRBdHRyaWJ1dGVFbnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9
PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICByZXN1bHQgPSAoTWFwcGVkQXR0cmlidXRlRW50
cnkpKGVMYXN0RW50cnkgKyBkb2N1bWVudCgpLT5kb2NJRCgpKTsKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gYmdjb2xvckF0dHIgfHwKLSAg
ICAgICAgYXR0ck5hbWUgPT0gYm9yZGVyY29sb3JBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09
IHZhbGlnbkF0dHIgfHwKLSAgICAgICAgYXR0ck5hbWUgPT0gaGVpZ2h0QXR0cikgewotICAgICAg
ICByZXN1bHQgPSBlVW5pdmVyc2FsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAg
IAotICAgIGlmIChhdHRyTmFtZSA9PSBhbGlnbkF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZUNl
bGw7IC8vIEFsbCB0YWJsZSBwYXJ0cyB3aWxsIGp1c3Qgc2hhcmUgaW4gdGhlIFREIHNwYWNlLgot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxFbGVtZW50Ojpt
YXBUb0VudHJ5KGF0dHJOYW1lLCByZXN1bHQpOwotfQotCi12b2lkIEhUTUxUYWJsZVBhcnRFbGVt
ZW50OjpwYXJzZU1hcHBlZEF0dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAg
aWYgKGF0dHItPm5hbWUoKSA9PSBiZ2NvbG9yQXR0cikgewotICAgICAgICBhZGRDU1NDb2xvcihh
dHRyLCBDU1NfUFJPUF9CQUNLR1JPVU5EX0NPTE9SLCBhdHRyLT52YWx1ZSgpKTsKLSAgICB9IGVs
c2UgaWYgKGF0dHItPm5hbWUoKSA9PSBiYWNrZ3JvdW5kQXR0cikgewotICAgICAgICBTdHJpbmcg
dXJsID0gV2ViQ29yZTo6cGFyc2VVUkwoYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgIGlmICghdXJs
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGFkZENTU0ltYWdlUHJvcGVydHkoYXR0ciwgQ1NTX1BS
T1BfQkFDS0dST1VORF9JTUFHRSwgZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKSk7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gYm9yZGVyY29sb3JBdHRyKSB7Ci0gICAgICAgIGlm
ICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFkZENTU0NvbG9yKGF0
dHIsIENTU19QUk9QX0JPUkRFUl9DT0xPUiwgYXR0ci0+dmFsdWUoKSk7Ci0gICAgICAgICAgICBh
ZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9CT1JERVJfVE9QX1NUWUxFLCBDU1NfVkFMX1NP
TElEKTsKLSAgICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX0JPUkRFUl9C
T1RUT01fU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAgICAgICAgYWRkQ1NTUHJvcGVydHko
YXR0ciwgQ1NTX1BST1BfQk9SREVSX0xFRlRfU1RZTEUsIENTU19WQUxfU09MSUQpOwotICAgICAg
ICAgICAgYWRkQ1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfQk9SREVSX1JJR0hUX1NUWUxFLCBD
U1NfVkFMX1NPTElEKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09
IHZhbGlnbkF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1ZFUlRJQ0FMX0FMSUdOLCBh
dHRyLT52YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBhbGlnbkF0dHIp
IHsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2ID0gYXR0ci0+dmFsdWUoKTsKLSAgICAg
ICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKHYsICJtaWRkbGUiKSB8fCBlcXVhbElnbm9yaW5nQ2Fz
ZSh2LCAiY2VudGVyIikpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJP
UF9URVhUX0FMSUdOLCBDU1NfVkFMX19XRUJLSVRfQ0VOVEVSKTsKLSAgICAgICAgZWxzZSBpZiAo
ZXF1YWxJZ25vcmluZ0Nhc2UodiwgImFic21pZGRsZSIpKQotICAgICAgICAgICAgYWRkQ1NTUHJv
cGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9DRU5URVIpOwotICAgICAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAibGVmdCIpKQotICAgICAgICAgICAgYWRk
Q1NTUHJvcGVydHkoYXR0ciwgQ1NTX1BST1BfVEVYVF9BTElHTiwgQ1NTX1ZBTF9fV0VCS0lUX0xF
RlQpOwotICAgICAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh2LCAicmlnaHQiKSkKLSAg
ICAgICAgICAgIGFkZENTU1Byb3BlcnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIENTU19W
QUxfX1dFQktJVF9SSUdIVCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFkZENTU1Byb3Bl
cnR5KGF0dHIsIENTU19QUk9QX1RFWFRfQUxJR04sIHYpOwotICAgIH0gZWxzZSBpZiAoYXR0ci0+
bmFtZSgpID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1w
dHkoKSkKLSAgICAgICAgICAgIGFkZENTU0xlbmd0aChhdHRyLCBDU1NfUFJPUF9IRUlHSFQsIGF0
dHItPnZhbHVlKCkpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBw
ZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRhYmxl
U2VjdGlvbkVsZW1lbnQ6OkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KGNvbnN0IFF1YWxpZmllZE5h
bWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MsIGJvb2wgaW1wbGljaXQpCi0gICAgOiBIVE1MVGFi
bGVQYXJ0RWxlbWVudCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgbV9pbXBsaWNpdCA9IGltcGxpY2l0
OwotfQotCi1ib29sIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjpjaGVja0RURChjb25zdCBOb2Rl
KiBuZXdDaGlsZCkKLXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodHJUYWcpIHx8
IG5ld0NoaWxkLT5oYXNUYWdOYW1lKGZvcm1UYWcpIHx8Ci0gICAgICAgICAgIG5ld0NoaWxkLT5o
YXNUYWdOYW1lKHNjcmlwdFRhZyk7Ci19Ci0KLUNvbnRhaW5lck5vZGUqIEhUTUxUYWJsZVNlY3Rp
b25FbGVtZW50OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxkKQotewotICAgIGlmIChj
aGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBGaXJzdCBhZGQgdGhlIGNo
aWxkLgotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hpbGQoY2hpbGQpOwotCi0g
ICAgICAgIC8vIE5vdyBzaW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0aGUgY29udGFpbmVyIHRv
IGluc2VydCBpbnRvLgotICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRlbW90aW5n
IHRoZSBmb3JtIHRvIGEgbGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBvdXQgb2YgdGhlIHdheS4K
LSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhUTUxUYWJsZVBhcnRF
bGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci19Ci0KLS8vIHRoZXNlIGZ1bmN0aW9ucyBhcmUgcmF0
aGVyIHNsb3csIHNpbmNlIHdlIG5lZWQgdG8gZ2V0IHRoZSByb3cgYXQKLS8vIHRoZSBpbmRleC4u
LiBidXQgdGhleSBhcmVuJ3QgdXNlZCBkdXJpbmcgdXN1YWwgSFRNTCBwYXJzaW5nIGFueXdheQot
SFRNTEVsZW1lbnQgKkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjppbnNlcnRSb3coIGludCBpbmRl
eCwgRXhjZXB0aW9uQ29kZSYgZWMpCi17Ci0gICAgSFRNTFRhYmxlUm93RWxlbWVudCAqciA9IDBM
OwotICAgIFJlZlB0cjxOb2RlTGlzdD4gY2hpbGRyZW4gPSBjaGlsZE5vZGVzKCk7Ci0gICAgaW50
IG51bVJvd3MgPSBjaGlsZHJlbiA/IChpbnQpY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBp
ZiAoIGluZGV4IDwgLTEgfHwgaW5kZXggPiBudW1Sb3dzICkgewotICAgICAgICBlYyA9IElOREVY
X1NJWkVfRVJSOyAvLyBwZXIgdGhlIERPTQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAg
ICByID0gbmV3IEhUTUxUYWJsZVJvd0VsZW1lbnQoZG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmICgg
bnVtUm93cyA9PSBpbmRleCB8fCBpbmRleCA9PSAtMSApCi0gICAgICAgICAgICBhcHBlbmRDaGls
ZChyLCBlYyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgTm9kZSAqbjsKLSAgICAgICAg
ICAgIGlmIChpbmRleCA8IDEpCi0gICAgICAgICAgICAgICAgbiA9IGZpcnN0Q2hpbGQoKTsKLSAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuID0gY2hpbGRyZW4tPml0ZW0oaW5kZXgp
OwotICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKHIsIG4sIGVjICk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OmRlbGV0
ZVJvdyggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBSZWZQdHI8Tm9kZUxp
c3Q+IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1Sb3dzID0gY2hpbGRyZW4g
PyAoaW50KWNoaWxkcmVuLT5sZW5ndGgoKSA6IDA7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAg
ICAgICBpbmRleCA9IG51bVJvd3MgLSAxOwotICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwg
bnVtUm93cykgewotICAgICAgICBSZWZQdHI8Tm9kZT4gcm93ID0gY2hpbGRyZW4tPml0ZW0oaW5k
ZXgpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQocm93LmdldCgpLCBlYyk7Ci0g
ICAgfSBlbHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLWludCBIVE1MVGFi
bGVTZWN0aW9uRWxlbWVudDo6bnVtUm93cygpIGNvbnN0Ci17Ci0gICAgaW50IHJvd3MgPSAwOwot
ICAgIGNvbnN0IE5vZGUgKm4gPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4pIHsKLSAgICAg
ICAgaWYgKG4tPmhhc1RhZ05hbWUodHJUYWcpKQotICAgICAgICAgICAgcm93cysrOwotICAgICAg
ICBuID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcm93czsKLX0KLQot
U3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25F
bGVtZW50OjpzZXRBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZShhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
OjpjaCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnNldENoKGNvbnN0IFN0cmluZyAmdmFsdWUp
Ci17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1M
VGFibGVTZWN0aW9uRWxlbWVudDo6Y2hPZmYoKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRy
aWJ1dGUoY2hhcm9mZkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ojpz
ZXRDaE9mZihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2Zm
QXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6OnZBbGln
bigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh2YWxpZ25BdHRyKTsKLX0KLQot
dm9pZCBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZhbGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotUmVmUHRy
PEhUTUxDb2xsZWN0aW9uPiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudDo6cm93cygpCi17Ci0gICAg
cmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4obmV3IEhUTUxDb2xsZWN0aW9uKHRoaXMsIEhU
TUxDb2xsZWN0aW9uOjpUQUJMRV9ST1dTKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
Ym9vbCBIVE1MVGFibGVSb3dFbGVtZW50OjpjaGVja0RURChjb25zdCBOb2RlKiBuZXdDaGlsZCkK
LXsKLSAgICByZXR1cm4gbmV3Q2hpbGQtPmhhc1RhZ05hbWUodGRUYWcpIHx8IG5ld0NoaWxkLT5o
YXNUYWdOYW1lKHRoVGFnKSB8fAotICAgICAgICAgICBuZXdDaGlsZC0+aGFzVGFnTmFtZShmb3Jt
VGFnKSB8fCBuZXdDaGlsZC0+aGFzVGFnTmFtZShzY3JpcHRUYWcpOwotfQotCi1Db250YWluZXJO
b2RlKiBIVE1MVGFibGVSb3dFbGVtZW50OjphZGRDaGlsZChQYXNzUmVmUHRyPE5vZGU+IGNoaWxk
KQotewotICAgIGlmIChjaGlsZC0+aGFzVGFnTmFtZShmb3JtVGFnKSkgewotICAgICAgICAvLyBG
aXJzdCBhZGQgdGhlIGNoaWxkLgotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVudDo6YWRkQ2hp
bGQoY2hpbGQpOwotCi0gICAgICAgIC8vIE5vdyBzaW1wbHkgcmV0dXJuIG91cnNlbHZlcyBhcyB0
aGUgY29udGFpbmVyIHRvIGluc2VydCBpbnRvLgotICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZWZm
ZWN0IG9mIGRlbW90aW5nIHRoZSBmb3JtIHRvIGEgbGVhZiBhbmQgbW92aW5nIGl0IHNhZmVseSBv
dXQgb2YgdGhlIHdheS4KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJu
IEhUTUxUYWJsZVBhcnRFbGVtZW50OjphZGRDaGlsZChjaGlsZCk7Ci19Ci0KLWludCBIVE1MVGFi
bGVSb3dFbGVtZW50Ojpyb3dJbmRleCgpIGNvbnN0Ci17Ci0gICAgTm9kZSAqdGFibGUgPSBwYXJl
bnROb2RlKCk7Ci0gICAgaWYgKCF0YWJsZSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHRhYmxl
ID0gdGFibGUtPnBhcmVudE5vZGUoKTsKLSAgICBpZiAoIXRhYmxlIHx8ICF0YWJsZS0+aGFzVGFn
TmFtZSh0YWJsZVRhZykpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8vIFRvIG1hdGNoIEZp
cmVmb3gsIHRoZSByb3cgaW5kaWNlcyB3b3JrIGxpa2UgdGhpczoKLSAgICAvLyAgIFJvd3MgZnJv
bSB0aGUgZmlyc3QgPHRoZWFkPiBhcmUgbnVtYmVyZWQgYmVmb3JlIGFsbCA8dGJvZHk+IHJvd3Mu
Ci0gICAgLy8gICBSb3dzIGZyb20gdGhlIGZpcnN0IDx0Zm9vdD4gYXJlIG51bWJlcmVkIGFmdGVy
IGFsbCA8dGJvZHk+IHJvd3MuCi0gICAgLy8gICBSb3dzIGZyb20gb3RoZXIgPHRoZWFkPiBhbmQg
PHRmb290PiBlbGVtZW50cyBkb24ndCBnZXQgcm93IGluZGljZXMgYXQgYWxsLgotCi0gICAgaW50
IHJJbmRleCA9IDA7Ci0KLSAgICBpZiAoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqIGhlYWQgPSBz
dGF0aWNfY2FzdDxIVE1MVGFibGVFbGVtZW50Kj4odGFibGUpLT50SGVhZCgpKSB7Ci0gICAgICAg
IGZvciAoTm9kZSAqcm93ID0gaGVhZC0+Zmlyc3RDaGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4
dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKHJvdyA9PSB0aGlzKQotICAgICAgICAgICAg
ICAgIHJldHVybiBySW5kZXg7Ci0gICAgICAgICAgICArK3JJbmRleDsKLSAgICAgICAgfQotICAg
IH0KLSAgICAKLSAgICBmb3IgKE5vZGUgKm5vZGUgPSB0YWJsZS0+Zmlyc3RDaGlsZCgpOyBub2Rl
OyBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAobm9kZS0+aGFzVGFn
TmFtZSh0Ym9keVRhZykpIHsKLSAgICAgICAgICAgIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KiBz
ZWN0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQqPihub2RlKTsKLSAg
ICAgICAgICAgIGZvciAoTm9kZSogcm93ID0gc2VjdGlvbi0+Zmlyc3RDaGlsZCgpOyByb3c7IHJv
dyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gdGhp
cykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJJbmRleDsKLSAgICAgICAgICAgICAgICAr
K3JJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChIVE1M
VGFibGVTZWN0aW9uRWxlbWVudCogZm9vdCA9IHN0YXRpY19jYXN0PEhUTUxUYWJsZUVsZW1lbnQg
Kj4odGFibGUpLT50Rm9vdCgpKSB7Ci0gICAgICAgIGZvciAoTm9kZSAqcm93ID0gZm9vdC0+Zmly
c3RDaGlsZCgpOyByb3c7IHJvdyA9IHJvdy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAg
aWYgKHJvdyA9PSB0aGlzKQotICAgICAgICAgICAgICAgIHJldHVybiBySW5kZXg7Ci0gICAgICAg
ICAgICArK3JJbmRleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFdlIGdldCBoZXJlIGZv
ciByb3dzIHRoYXQgYXJlIGluIDx0aGVhZD4gb3IgPHRmb290PiBzZWN0aW9ucyBvdGhlciB0aGFu
IHRoZSBtYWluIGhlYWRlciBhbmQgZm9vdGVyLgotICAgIHJldHVybiAtMTsKLX0KLQotaW50IEhU
TUxUYWJsZVJvd0VsZW1lbnQ6OnNlY3Rpb25Sb3dJbmRleCgpIGNvbnN0Ci17Ci0gICAgaW50IHJJ
bmRleCA9IDA7Ci0gICAgY29uc3QgTm9kZSAqbiA9IHRoaXM7Ci0gICAgZG8gewotICAgICAgICBu
ID0gbi0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIGlmIChuICYmIG4tPmhhc1RhZ05hbWUo
dHJUYWcpKQotICAgICAgICAgICAgckluZGV4Kys7Ci0gICAgfQotICAgIHdoaWxlIChuKTsKLQot
ICAgIHJldHVybiBySW5kZXg7Ci19Ci0KLUhUTUxFbGVtZW50ICpIVE1MVGFibGVSb3dFbGVtZW50
OjppbnNlcnRDZWxsKCBpbnQgaW5kZXgsIEV4Y2VwdGlvbkNvZGUmIGVjKQotewotICAgIEhUTUxU
YWJsZUNlbGxFbGVtZW50ICpjID0gMEw7Ci0gICAgUmVmUHRyPE5vZGVMaXN0PiBjaGlsZHJlbiA9
IGNoaWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtQ2VsbHMgPSBjaGlsZHJlbiA/IGNoaWxkcmVuLT5s
ZW5ndGgoKSA6IDA7Ci0gICAgaWYgKCBpbmRleCA8IC0xIHx8IGluZGV4ID4gbnVtQ2VsbHMgKQot
ICAgICAgICBlYyA9IElOREVYX1NJWkVfRVJSOyAvLyBwZXIgdGhlIERPTQotICAgIGVsc2UKLSAg
ICB7Ci0gICAgICAgIGMgPSBuZXcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQodGRUYWcsIGRvY3VtZW50
KCkpOwotICAgICAgICBpZihudW1DZWxscyA9PSBpbmRleCB8fCBpbmRleCA9PSAtMSkKLSAgICAg
ICAgICAgIGFwcGVuZENoaWxkKGMsIGVjKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBO
b2RlICpuOwotICAgICAgICAgICAgaWYoaW5kZXggPCAxKQotICAgICAgICAgICAgICAgIG4gPSBm
aXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbiA9IGNoaWxk
cmVuLT5pdGVtKGluZGV4KTsKLSAgICAgICAgICAgIGluc2VydEJlZm9yZShjLCBuLCBlYyk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxl
bWVudDo6ZGVsZXRlQ2VsbCggaW50IGluZGV4LCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBS
ZWZQdHI8Tm9kZUxpc3Q+IGNoaWxkcmVuID0gY2hpbGROb2RlcygpOwotICAgIGludCBudW1DZWxs
cyA9IGNoaWxkcmVuID8gY2hpbGRyZW4tPmxlbmd0aCgpIDogMDsKLSAgICBpZiAoaW5kZXggPT0g
LTEgKQotICAgICAgICBpbmRleCA9IG51bUNlbGxzLTE7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYg
aW5kZXggPCBudW1DZWxscykgewotICAgICAgICBSZWZQdHI8Tm9kZT4gcm93ID0gY2hpbGRyZW4t
Pml0ZW0oaW5kZXgpOwotICAgICAgICBIVE1MRWxlbWVudDo6cmVtb3ZlQ2hpbGQocm93LmdldCgp
LCBlYyk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGVjID0gSU5ERVhfU0laRV9FUlI7Ci19Ci0KLVJl
ZlB0cjxIVE1MQ29sbGVjdGlvbj4gSFRNTFRhYmxlUm93RWxlbWVudDo6Y2VsbHMoKQotewotICAg
IHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb24+KG5ldyBIVE1MQ29sbGVjdGlvbih0aGlzLCBI
VE1MQ29sbGVjdGlvbjo6VFJfQ0VMTFMpKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50
OjpzZXRDZWxscyhIVE1MQ29sbGVjdGlvbiAqLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBl
YyA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJv
d0VsZW1lbnQ6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGFsaWdu
QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0K
LVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50OjpiZ0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZ2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVt
ZW50OjpzZXRCZ0NvbG9yKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRl
KGJnY29sb3JBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVSb3dFbGVtZW50Ojpj
aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyQXR0cik7Ci19Ci0KLXZv
aWQgSFRNTFRhYmxlUm93RWxlbWVudDo6c2V0Q2goY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAg
ICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZVJv
d0VsZW1lbnQ6OmNoT2ZmKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGNoYXJv
ZmZBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVSb3dFbGVtZW50OjpzZXRDaE9mZihjb25zdCBT
dHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShjaGFyb2ZmQXR0ciwgdmFsdWUpOwot
fQotCi1TdHJpbmcgSFRNTFRhYmxlUm93RWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZ2V0QXR0cmlidXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZVJvd0Vs
ZW1lbnQ6OnNldFZBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0
ZSh2YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSFRNTFRh
YmxlQ2VsbEVsZW1lbnQ6OkhUTUxUYWJsZUNlbGxFbGVtZW50KGNvbnN0IFF1YWxpZmllZE5hbWUm
IHRhZ05hbWUsIERvY3VtZW50ICpkb2MpCi0gIDogSFRNTFRhYmxlUGFydEVsZW1lbnQodGFnTmFt
ZSwgZG9jKQotewotICAgIF9jb2wgPSAtMTsKLSAgICBfcm93ID0gLTE7Ci0gICAgY1NwYW4gPSBy
U3BhbiA9IDE7Ci0gICAgcm93SGVpZ2h0ID0gMDsKLSAgICBtX3NvbGlkID0gZmFsc2U7Ci19Ci0K
LUhUTUxUYWJsZUNlbGxFbGVtZW50Ojp+SFRNTFRhYmxlQ2VsbEVsZW1lbnQoKQotewotfQotCi1p
bnQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmNlbGxJbmRleCgpIGNvbnN0Ci17Ci0gICAgaW50IGlu
ZGV4ID0gMDsKLSAgICBmb3IgKGNvbnN0IE5vZGUgKiBub2RlID0gcHJldmlvdXNTaWJsaW5nKCk7
IG5vZGU7IG5vZGUgPSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICBpZiAobm9k
ZS0+aGFzVGFnTmFtZSh0ZFRhZykgfHwgbm9kZS0+aGFzVGFnTmFtZSh0aFRhZykpCi0gICAgICAg
ICAgICBpbmRleCsrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0KLWJvb2wg
SFRNTFRhYmxlQ2VsbEVsZW1lbnQ6Om1hcFRvRW50cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0
ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0
dHJOYW1lID09IG5vd3JhcEF0dHIpIHsKLSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXR0ck5hbWUgPT0gd2lk
dGhBdHRyIHx8Ci0gICAgICAgIGF0dHJOYW1lID09IGhlaWdodEF0dHIpIHsKLSAgICAgICAgcmVz
dWx0ID0gZUNlbGw7IC8vIEJlY2F1c2Ugb2YgdGhlIHF1aXJreSBiZWhhdmlvciBvZiBpZ25vcmlu
ZyAwIHZhbHVlcywgY2VsbHMgYXJlIHNwZWNpYWwuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9Ci0KLSAgICByZXR1cm4gSFRNTFRhYmxlUGFydEVsZW1lbnQ6Om1hcFRvRW50cnkoYXR0ck5h
bWUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnBhcnNlTWFwcGVk
QXR0cmlidXRlKE1hcHBlZEF0dHJpYnV0ZSAqYXR0cikKLXsKLSAgICBpZiAoYXR0ci0+bmFtZSgp
ID09IHJvd3NwYW5BdHRyKSB7Ci0gICAgICAgIHJTcGFuID0gIWF0dHItPmlzTnVsbCgpID8gYXR0
ci0+dmFsdWUoKS50b0ludCgpIDogMTsKLSAgICAgICAgaWYgKHJTcGFuIDwgMSkgclNwYW4gPSAx
OwotICAgICAgICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5pc1RhYmxlQ2VsbCgpKQot
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGFibGVDZWxsKj4ocmVuZGVyZXIoKSktPnVw
ZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gY29sc3Bh
bkF0dHIpIHsKLSAgICAgICAgY1NwYW4gPSAhYXR0ci0+aXNOdWxsKCkgPyBhdHRyLT52YWx1ZSgp
LnRvSW50KCkgOiAxOwotICAgICAgICBpZiAoY1NwYW4gPCAxKSBjU3BhbiA9IDE7Ci0gICAgICAg
IGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPmlzVGFibGVDZWxsKCkpCi0gICAgICAgICAg
ICBzdGF0aWNfY2FzdDxSZW5kZXJUYWJsZUNlbGwqPihyZW5kZXJlcigpKS0+dXBkYXRlRnJvbUVs
ZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKGF0dHItPm5hbWUoKSA9PSBub3dyYXBBdHRyKSB7Ci0g
ICAgICAgIGlmICghYXR0ci0+aXNOdWxsKCkpCi0gICAgICAgICAgICBhZGRDU1NQcm9wZXJ0eShh
dHRyLCBDU1NfUFJPUF9XSElURV9TUEFDRSwgQ1NTX1ZBTF9fV0VCS0lUX05PV1JBUCk7Ci0gICAg
fSBlbHNlIGlmIChhdHRyLT5uYW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0
ci0+dmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCB3aWR0aEludCA9IGF0dHIt
PnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgICAgIGlmICh3aWR0aEludCA+IDApIC8vIHdpZHRo
PSIwIiBpcyBpZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggV2luSUUuCi0gICAgICAgICAg
ICAgICAgYWRkQ1NTTGVuZ3RoKGF0dHIsIENTU19QUk9QX1dJRFRILCBhdHRyLT52YWx1ZSgpKTsK
LSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXR0ci0+bmFtZSgpID09IGhlaWdodEF0dHIpIHsK
LSAgICAgICAgaWYgKCFhdHRyLT52YWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50
IGhlaWdodEludCA9IGF0dHItPnZhbHVlKCkudG9JbnQoKTsKLSAgICAgICAgICAgIGlmIChoZWln
aHRJbnQgPiAwKSAvLyBoZWlnaHQ9IjAiIGlzIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0
aCBXaW5JRS4KLSAgICAgICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfSEVJ
R0hULCBhdHRyLT52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBIVE1M
VGFibGVQYXJ0RWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLS8vIHVz
ZWQgYnkgdGFibGUgY2VsbHMgdG8gc2hhcmUgc3R5bGUgZGVjbHMgY3JlYXRlZCBieSB0aGUgZW5j
bG9zaW5nIHRhYmxlLgotQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb24qIEhUTUxUYWJsZUNlbGxF
bGVtZW50OjphZGRpdGlvbmFsQXR0cmlidXRlU3R5bGVEZWNsKCkKLXsKLSAgICBOb2RlKiBwID0g
cGFyZW50Tm9kZSgpOwotICAgIHdoaWxlIChwICYmICFwLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkK
LSAgICAgICAgcCA9IHAtPnBhcmVudE5vZGUoKTsKLQotICAgIGlmIChwKSB7Ci0gICAgICAgIEhU
TUxUYWJsZUVsZW1lbnQqIHRhYmxlID0gc3RhdGljX2Nhc3Q8SFRNTFRhYmxlRWxlbWVudCo+KHAp
OwotICAgICAgICByZXR1cm4gdGFibGUtPmdldFNoYXJlZENlbGxEZWNsKCk7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmlzVVJMQXR0cmli
dXRlKEF0dHJpYnV0ZSAqYXR0cikgY29uc3QKLXsKLSAgICByZXR1cm4gYXR0ci0+bmFtZSgpID09
IGJhY2tncm91bmRBdHRyOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmFiYnIo
KSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWJickF0dHIpOwotfQotCi12b2lk
IEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRBYmJyKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0g
ICAgc2V0QXR0cmlidXRlKGFiYnJBdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVD
ZWxsRWxlbWVudDo6YWxpZ24oKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxp
Z25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0QWxpZ24oY29uc3Qg
U3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6YXhpcygpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShheGlzQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1l
bnQ6OnNldEF4aXMoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoYXhp
c0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpiZ0NvbG9y
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGJnY29sb3JBdHRyKTsKLX0KLQot
dm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0QmdDb2xvcihjb25zdCBTdHJpbmcgJnZhbHVl
KQotewotICAgIHNldEF0dHJpYnV0ZShiZ2NvbG9yQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcg
SFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OmNoKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmli
dXRlKGNoYXJBdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVudDo6c2V0Q2goY29u
c3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoY2hhckF0dHIsIHZhbHVlKTsK
LX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpjaE9mZigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGdldEF0dHJpYnV0ZShjaGFyb2ZmQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2Vs
bEVsZW1lbnQ6OnNldENoT2ZmKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmli
dXRlKGNoYXJvZmZBdHRyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6
OnNldENvbFNwYW4oaW50IG4pCi17Ci0gICAgc2V0QXR0cmlidXRlKGNvbHNwYW5BdHRyLCBTdHJp
bmc6Om51bWJlcihuKSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDZWxsRWxlbWVudDo6aGVhZGVy
cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShoZWFkZXJzQXR0cik7Ci19Ci0K
LXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldEhlYWRlcnMoY29uc3QgU3RyaW5nICZ2YWx1
ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoaGVhZGVyc0F0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEhUTUxUYWJsZUNlbGxFbGVtZW50OjpoZWlnaHQoKSBjb25zdAotewotICAgIHJldHVybiBnZXRB
dHRyaWJ1dGUoaGVpZ2h0QXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNl
dEhlaWdodChjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0dHJpYnV0ZShoZWlnaHRB
dHRyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6Om5vV3JhcCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuICFnZXRBdHRyaWJ1dGUobm93cmFwQXR0cikuaXNOdWxsKCk7Ci19
Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldE5vV3JhcChib29sIGIpCi17Ci0gICAg
c2V0QXR0cmlidXRlKG5vd3JhcEF0dHIsIGIgPyAiIiA6IDApOwotfQotCi12b2lkIEhUTUxUYWJs
ZUNlbGxFbGVtZW50OjpzZXRSb3dTcGFuKGludCBuKQotewotICAgIHNldEF0dHJpYnV0ZShyb3dz
cGFuQXR0ciwgU3RyaW5nOjpudW1iZXIobikpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQ6OnNjb3BlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHNjb3BlQXR0
cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnNldFNjb3BlKGNvbnN0IFN0cmlu
ZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHNjb3BlQXR0ciwgdmFsdWUpOwotfQotCi1T
dHJpbmcgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6OnZBbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGdldEF0dHJpYnV0ZSh2YWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDZWxsRWxlbWVu
dDo6c2V0VkFsaWduKGNvbnN0IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHZh
bGlnbkF0dHIsIHZhbHVlKTsKLX0KLQotU3RyaW5nIEhUTUxUYWJsZUNlbGxFbGVtZW50Ojp3aWR0
aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIpOwotfQotCi12
b2lkIEhUTUxUYWJsZUNlbGxFbGVtZW50OjpzZXRXaWR0aChjb25zdCBTdHJpbmcgJnZhbHVlKQot
ewotICAgIHNldEF0dHJpYnV0ZSh3aWR0aEF0dHIsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1IVE1MVGFibGVDb2xFbGVtZW50OjpIVE1MVGFibGVDb2xFbGVtZW50KGNvbnN0
IFF1YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50ICpkb2MpCi0gICAgOiBIVE1MVGFibGVQ
YXJ0RWxlbWVudCh0YWdOYW1lLCBkb2MpCi17Ci0gICAgX3NwYW4gPSAodGFnTmFtZS5tYXRjaGVz
KGNvbGdyb3VwVGFnKSA/IDAgOiAxKTsKLX0KLQotYm9vbCBIVE1MVGFibGVDb2xFbGVtZW50Ojpt
YXBUb0VudHJ5KGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lLCBNYXBwZWRBdHRyaWJ1dGVF
bnRyeSYgcmVzdWx0KSBjb25zdAotewotICAgIGlmIChhdHRyTmFtZSA9PSB3aWR0aEF0dHIpIHsK
LSAgICAgICAgcmVzdWx0ID0gZVVuaXZlcnNhbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIHJldHVybiBIVE1MVGFibGVQYXJ0RWxlbWVudDo6bWFwVG9FbnRyeShhdHRyTmFt
ZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBIVE1MVGFibGVDb2xFbGVtZW50OjpwYXJzZU1hcHBlZEF0
dHJpYnV0ZShNYXBwZWRBdHRyaWJ1dGUgKmF0dHIpCi17Ci0gICAgaWYgKGF0dHItPm5hbWUoKSA9
PSBzcGFuQXR0cikgewotICAgICAgICBfc3BhbiA9ICFhdHRyLT5pc051bGwoKSA/IGF0dHItPnZh
bHVlKCkudG9JbnQoKSA6IDE7Ci0gICAgICAgIGlmIChyZW5kZXJlcigpICYmIHJlbmRlcmVyKCkt
PmlzVGFibGVDb2woKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRhYmxlQ29sKj4o
cmVuZGVyZXIoKSktPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgfSBlbHNlIGlmIChhdHRyLT5u
YW1lKCkgPT0gd2lkdGhBdHRyKSB7Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICBhZGRDU1NMZW5ndGgoYXR0ciwgQ1NTX1BST1BfV0lEVEgsIGF0dHIt
PnZhbHVlKCkpOwotICAgIH0gZWxzZQotICAgICAgICBIVE1MVGFibGVQYXJ0RWxlbWVudDo6cGFy
c2VNYXBwZWRBdHRyaWJ1dGUoYXR0cik7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50
OjphbGlnbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZShhbGlnbkF0dHIpOwot
fQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldEFsaWduKGNvbnN0IFN0cmluZyAmdmFs
dWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGFsaWduQXR0ciwgdmFsdWUpOwotfQotCi1TdHJpbmcg
SFRNTFRhYmxlQ29sRWxlbWVudDo6Y2goKSBjb25zdAotewotICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoY2hhckF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldENoKGNvbnN0
IFN0cmluZyAmdmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKGNoYXJBdHRyLCB2YWx1ZSk7Ci19
Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVtZW50OjpjaE9mZigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEF0dHJpYnV0ZShjaGFyb2ZmQXR0cik7Ci19Ci0KLXZvaWQgSFRNTFRhYmxlQ29sRWxl
bWVudDo6c2V0Q2hPZmYoY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUo
Y2hhcm9mZkF0dHIsIHZhbHVlKTsKLX0KLQotdm9pZCBIVE1MVGFibGVDb2xFbGVtZW50OjpzZXRT
cGFuKGludCBuKQotewotICAgIHNldEF0dHJpYnV0ZShzcGFuQXR0ciwgU3RyaW5nOjpudW1iZXIo
bikpOwotfQotCi1TdHJpbmcgSFRNTFRhYmxlQ29sRWxlbWVudDo6dkFsaWduKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHZhbGlnbkF0dHIpOwotfQotCi12b2lkIEhUTUxUYWJs
ZUNvbEVsZW1lbnQ6OnNldFZBbGlnbihjb25zdCBTdHJpbmcgJnZhbHVlKQotewotICAgIHNldEF0
dHJpYnV0ZSh2YWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDb2xFbGVt
ZW50Ojp3aWR0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZSh3aWR0aEF0dHIp
OwotfQotCi12b2lkIEhUTUxUYWJsZUNvbEVsZW1lbnQ6OnNldFdpZHRoKGNvbnN0IFN0cmluZyAm
dmFsdWUpCi17Ci0gICAgc2V0QXR0cmlidXRlKHdpZHRoQXR0ciwgdmFsdWUpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLWJvb2wgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ6Om1hcFRvRW50
cnkoY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUsIE1hcHBlZEF0dHJpYnV0ZUVudHJ5JiBy
ZXN1bHQpIGNvbnN0Ci17Ci0gICAgaWYgKGF0dHJOYW1lID09IGFsaWduQXR0cikgewotICAgICAg
ICByZXN1bHQgPSBlQ2FwdGlvbjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAg
IHJldHVybiBIVE1MRWxlbWVudDo6bWFwVG9FbnRyeShhdHRyTmFtZSwgcmVzdWx0KTsKLX0KLQot
dm9pZCBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoTWFwcGVk
QXR0cmlidXRlICphdHRyKQotewotICAgIGlmIChhdHRyLT5uYW1lKCkgPT0gYWxpZ25BdHRyKSB7
Ci0gICAgICAgIGlmICghYXR0ci0+dmFsdWUoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhZGRD
U1NQcm9wZXJ0eShhdHRyLCBDU1NfUFJPUF9DQVBUSU9OX1NJREUsIGF0dHItPnZhbHVlKCkpOwot
ICAgIH0gZWxzZQotICAgICAgICBIVE1MRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0
cik7Ci19Ci0KLVN0cmluZyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDo6YWxpZ24oKSBjb25zdAot
ewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoYWxpZ25BdHRyKTsKLX0KLQotdm9pZCBIVE1MVGFi
bGVDYXB0aW9uRWxlbWVudDo6c2V0QWxpZ24oY29uc3QgU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBz
ZXRBdHRyaWJ1dGUoYWxpZ25BdHRyLCB2YWx1ZSk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDE0MzI3KQorKysgV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00MjgsNyArNDI4LDYgQEAKIAkJOTNGMTk4
RTkwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfaW1hZ2VpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDI0NTAyREU0Mzk2MDE4NjM1Q0EgLyog
aHRtbF9pbWFnZWltcGwuaCAqLzsgfTsKIAkJOTNGMTk4RUEwODI0NUU1OTAwMUU5QUJDIC8qIGh0
bWxfaW5saW5laW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRjUyM0QyNDcwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfaW5saW5laW1wbC5oICovOyB9
OwogCQk5M0YxOThFQjA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9saXN0aW1wbC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDkwMkRFNDM5NjAx
ODYzNUNBIC8qIGh0bWxfbGlzdGltcGwuaCAqLzsgfTsKLQkJOTNGMTk4RUUwODI0NUU1OTAwMUU5
QUJDIC8qIGh0bWxfdGFibGVpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGNTIzRDI0RjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF90YWJsZWltcGwu
aCAqLzsgfTsKIAkJOTNGMTk4RUYwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxQYXJzZXIuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMjUxMDJERTQz
OTYwMTg2MzVDQSAvKiBIVE1MUGFyc2VyLmggKi87IH07CiAJCTkzRjE5OEYwMDgyNDVFNTkwMDFF
OUFCQyAvKiBIVE1MVG9rZW5pemVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGNTIzRDI1MzAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTFRva2VuaXplci5o
ICovOyB9OwogCQk5M0YxOThGNjA4MjQ1RTU5MDAxRTlBQkMgLyogRGVjb2Rlci5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNzkwMkRFNDNENzAx
ODYzNUNBIC8qIERlY29kZXIuaCAqLzsgfTsKQEAgLTUyNSw3ICs1MjQsNiBAQAogCQk5M0YxOUE5
NTA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9pbWFnZWltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDQwMkRFNDM5NjAxODYzNUNBIC8q
IGh0bWxfaW1hZ2VpbXBsLmNwcCAqLzsgfTsKIAkJOTNGMTlBOTYwODI0NUU1OTAwMUU5QUJDIC8q
IGh0bWxfaW5saW5laW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGNTIzRDI0NjAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9pbmxpbmVpbXBsLmNw
cCAqLzsgfTsKIAkJOTNGMTlBOTcwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfbGlzdGltcGwuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNDgw
MkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfbGlzdGltcGwuY3BwICovOyB9OwotCQk5M0YxOUE5QTA4
MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF90YWJsZWltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyNEUwMkRFNDM5NjAxODYzNUNBIC8qIGh0
bWxfdGFibGVpbXBsLmNwcCAqLzsgfTsKIAkJOTNGMTlBOUIwODI0NUU1OTAwMUU5QUJDIC8qIEhU
TUxQYXJzZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRjUyM0QyNTAwMkRFNDM5NjAxODYzNUNBIC8qIEhUTUxQYXJzZXIuY3BwICovOyB9OwogCQk5
M0YxOUE5QzA4MjQ1RTU5MDAxRTlBQkMgLyogSFRNTFRva2VuaXplci5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDI1MjAyREU0Mzk2MDE4NjM1
Q0EgLyogSFRNTFRva2VuaXplci5jcHAgKi87IH07CiAJCTkzRjE5QTlEMDgyNDVFNTkwMDFFOUFC
QyAvKiBEZWNvZGVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEY1MjNEMjc4MDJERTQzRDcwMTg2MzVDQSAvKiBEZWNvZGVyLmNwcCAqLzsgfTsKQEAg
LTY1OSw2ICs2NTcsMjAgQEAKIAkJQTg3MUQ0NUQwQTEyN0NCQzAwQjEyQTY4IC8qIEhUTUxBcHBs
ZXRFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBBODcxRDQ1MzBBMTI3Q0JDMDBCMTJBNjggLyogSFRNTEFwcGxldEVsZW1lbnQuaCAqLzsgfTsK
IAkJQTg3MUQ0NUUwQTEyN0NCQzAwQjEyQTY4IC8qIEhUTUxBcHBsZXRFbGVtZW50LmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFENDU0MEExMjdD
QkMwMEIxMkE2OCAvKiBIVE1MQXBwbGV0RWxlbWVudC5jcHAgKi87IH07CiAJCUE4NzFENDVGMEEx
MjdDQkMwMEIxMkE2OCAvKiBIVE1MRW1iZWRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFENDU1MEExMjdDQkMwMEIxMkE2OCAvKiBI
VE1MRW1iZWRFbGVtZW50LmNwcCAqLzsgfTsKKwkJQTg3MURCMjUwQTE1MEJENjAwQjEyQTY4IC8q
IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBODcxREIxNzBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQuaCAqLzsgfTsKKwkJQTg3MURCMjYwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxU
YWJsZVNlY3Rpb25FbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEE4NzFEQjE4MEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVTZWN0aW9u
RWxlbWVudC5jcHAgKi87IH07CisJCUE4NzFEQjI3MEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFi
bGVFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBBODcxREIxOTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlRWxlbWVudC5oICovOyB9Owor
CQlBODcxREIyODBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlRWxlbWVudC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREIxQTBBMTUwQkQ2
MDBCMTJBNjggLyogSFRNTFRhYmxlRWxlbWVudC5jcHAgKi87IH07CisJCUE4NzFEQjI5MEExNTBC
RDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDb2xFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFEQjFCMEExNTBCRDYwMEIxMkE2OCAvKiBI
VE1MVGFibGVDb2xFbGVtZW50LmNwcCAqLzsgfTsKKwkJQTg3MURCMkEwQTE1MEJENjAwQjEyQTY4
IC8qIEhUTUxUYWJsZUNlbGxFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBBODcxREIxQzBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ2Vs
bEVsZW1lbnQuaCAqLzsgfTsKKwkJQTg3MURCMkIwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJs
ZUNhcHRpb25FbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBODcxREIxRDBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ2FwdGlvbkVsZW1l
bnQuaCAqLzsgfTsKKwkJQTg3MURCMkMwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVBhcnRF
bGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBB
ODcxREIxRTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlUGFydEVsZW1lbnQuaCAqLzsgfTsK
KwkJQTg3MURCMkQwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVBhcnRFbGVtZW50LmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFEQjFGMEEx
NTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVQYXJ0RWxlbWVudC5jcHAgKi87IH07CisJCUE4NzFE
QjJFMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDZWxsRWxlbWVudC5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODcxREIyMDBBMTUwQkQ2MDBC
MTJBNjggLyogSFRNTFRhYmxlQ2VsbEVsZW1lbnQuY3BwICovOyB9OworCQlBODcxREIyRjBBMTUw
QkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ29sRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTg3MURCMjEwQTE1MEJENjAwQjEyQTY4IC8qIEhU
TUxUYWJsZUNvbEVsZW1lbnQuaCAqLzsgfTsKKwkJQTg3MURCMzAwQTE1MEJENjAwQjEyQTY4IC8q
IEhUTUxUYWJsZVJvd0VsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQTg3MURCMjIwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVJvd0Vs
ZW1lbnQuY3BwICovOyB9OworCQlBODcxREIzMTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxl
Um93RWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQTg3MURCMjMwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVJvd0VsZW1lbnQuaCAqLzsg
fTsKKwkJQTg3MURCMzIwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4NzFE
QjI0MEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDYXB0aW9uRWxlbWVudC5jcHAgKi87IH07
CiAJCUE4OEFEMzg2MDk1MjQ4NkQwMDFERDE5NiAvKiBLUmVuZGVyaW5nRGV2aWNlLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4QzBGQjU0MDg5NzAx
RjcwMEJBNTExNCAvKiBLUmVuZGVyaW5nRGV2aWNlLmNwcCAqLzsgfTsKIAkJQTg4QUQzODcwOTUy
NDg2RDAwMUREMTk2IC8qIEtSZW5kZXJpbmdEZXZpY2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4QzBGQjU1MDg5NzAxRjcwMEJBNTExNCAvKiBLUmVu
ZGVyaW5nRGV2aWNlLmggKi87IH07CiAJCUE4OEFEMzg4MDk1MjQ4NkQwMDFERDE5NiAvKiBLUmVu
ZGVyaW5nRmlsbFBhaW50ZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQThDMEZCNTkwODk3MDFGNzAwQkE1MTE0IC8qIEtSZW5kZXJpbmdGaWxsUGFp
bnRlci5jcHAgKi87IH07CkBAIC0xOTk5LDYgKzIwMTEsMjAgQEAKIAkJQTg3MUQ0NTMwQTEyN0NC
QzAwQjEyQTY4IC8qIEhUTUxBcHBsZXRFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBIVE1MQXBwbGV0RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlBODcxRDQ1NDBBMTI3Q0JDMDBCMTJBNjggLyogSFRNTEFwcGxldEVsZW1lbnQuY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEhUTUxBcHBsZXRFbGVtZW50LmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTg3MUQ0NTUwQTEyN0NCQzAwQjEyQTY4
IC8qIEhUTUxFbWJlZEVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IEhUTUxFbWJlZEVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQlBODcxREIxNzBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFEQjE4MEExNTBCRDYwMEIxMkE2
OCAvKiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlBODcxREIxOTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlRWxl
bWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRNTFRhYmxlRWxlbWVu
dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODcxREIxQTBBMTUwQkQ2MDBCMTJB
NjggLyogSFRNTFRhYmxlRWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gSFRNTFRhYmxlRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUE4NzFEQjFCMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDb2xFbGVtZW50LmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1MVGFibGVDb2xFbGVtZW50
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTg3MURCMUMwQTE1MEJENjAwQjEy
QTY4IC8qIEhUTUxUYWJsZUNlbGxFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBIVE1MVGFibGVDZWxsRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQlBODcxREIxRDBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxUYWJsZUNhcHRpb25FbGVt
ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFEQjFFMEExNTBCRDYwMEIx
MkE2OCAvKiBIVE1MVGFibGVQYXJ0RWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gSFRNTFRhYmxlUGFydEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQTg3MURCMUYwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVBhcnRFbGVtZW50LmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1MVGFibGVQYXJ0RWxl
bWVudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFEQjIwMEExNTBCRDYw
MEIxMkE2OCAvKiBIVE1MVGFibGVDZWxsRWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gSFRNTFRhYmxlQ2VsbEVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlBODcxREIyMTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ29s
RWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSFRNTFRhYmxlQ29s
RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBODcxREIyMjBBMTUwQkQ2
MDBCMTJBNjggLyogSFRNTFRhYmxlUm93RWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gSFRNTFRhYmxlUm93RWxlbWVudC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUE4NzFEQjIzMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVSb3dF
bGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MVGFibGVSb3dF
bGVtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4NzFEQjI0MEExNTBCRDYw
MEIxMkE2OCAvKiBIVE1MVGFibGVDYXB0aW9uRWxlbWVudC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQlBODg0MjgzODA5MzA4QzFDMDBCNkQ0NjEgLyogU1ZHTmFt
ZXNXcmFwcGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gU1ZHTmFtZXNXcmFwcGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
dGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUE4ODQyODM5MDkzMDhDMUMwMEI2RDQ2
MSAvKiBTVkdFbGVtZW50RmFjdG9yeVdyYXBwZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTVkdFbGVtZW50RmFjdG9yeVdyYXBwZXIu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsg
fTsKIAkJQTg4NDI4M0QwOTMwOEMxQzAwQjZENDYxIC8qIERPTUxpc3QuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01MaXN0Lmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpAQCAtMjYwOCw4
ICsyNjM0LDYgQEAKIAkJRjUyM0QyNDcwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfaW5saW5laW1w
bC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRl
bnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBo
dG1sX2lubGluZWltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1
c2VzVGFicyA9IDA7IH07CiAJCUY1MjNEMjQ4MDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2xpc3Rp
bXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsg
aW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IGh0bWxfbGlzdGltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRjUyM0QyNDkwMkRFNDM5NjAxODYzNUNBIC8qIGh0
bWxfbGlzdGltcGwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gaHRtbF9saXN0aW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKLQkJRjUyM0QyNEUwMkRFNDM5NjAxODYzNUNBIC8qIGh0
bWxfdGFibGVpbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IGh0bWxfdGFibGVpbXBsLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07Ci0JCUY1MjNEMjRGMDJERTQzOTYwMTg2
MzVDQSAvKiBodG1sX3RhYmxlaW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBodG1sX3RhYmxlaW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRjUyM0QyNTAwMkRFNDM5NjAx
ODYzNUNBIC8qIEhUTUxQYXJzZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTFBhcnNlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDI1MTAyREU0Mzk2
MDE4NjM1Q0EgLyogSFRNTFBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBIVE1MUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDI1MjAyREU0Mzk2MDE4NjM1
Q0EgLyogSFRNTFRva2VuaXplci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBIVE1MVG9rZW5pemVyLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CkBAIC0zMjM3LDggKzMyNjEs
NiBAQAogCQkJCUY1MjNEMjQ3MDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX2lubGluZWltcGwuaCAq
LywKIAkJCQlGNTIzRDI0ODAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF9saXN0aW1wbC5jcHAgKi8s
CiAJCQkJRjUyM0QyNDkwMkRFNDM5NjAxODYzNUNBIC8qIGh0bWxfbGlzdGltcGwuaCAqLywKLQkJ
CQlGNTIzRDI0RTAyREU0Mzk2MDE4NjM1Q0EgLyogaHRtbF90YWJsZWltcGwuY3BwICovLAotCQkJ
CUY1MjNEMjRGMDJERTQzOTYwMTg2MzVDQSAvKiBodG1sX3RhYmxlaW1wbC5oICovLAogCQkJCUE4
NzFENDU0MEExMjdDQkMwMEIxMkE2OCAvKiBIVE1MQXBwbGV0RWxlbWVudC5jcHAgKi8sCiAJCQkJ
QTg3MUQ0NTMwQTEyN0NCQzAwQjEyQTY4IC8qIEhUTUxBcHBsZXRFbGVtZW50LmggKi8sCiAJCQkJ
QThERjNGQ0IwOTdGQTBGQjAwNTI5ODFCIC8qIEhUTUxCYXNlRm9udEVsZW1lbnQuY3BwICovLApA
QCAtMzI1Miw2ICszMjc0LDcgQEAKIAkJCQlBOERGM0ZDODA5N0ZBMEZCMDA1Mjk4MUIgLyogSFRN
TENvbGxlY3Rpb24uaCAqLywKIAkJCQlGNTIzRDIzQjAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTERv
Y3VtZW50LmNwcCAqLywKIAkJCQlGNTIzRDIzQzAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTERvY3Vt
ZW50LmggKi8sCisJCQkJMUE0OTRFMjkwQTEyMzU0MzAwRkRBRkMxIC8qIEhUTUxEb2N1bWVudC5p
ZGwgKi8sCiAJCQkJRjUyM0QyM0UwMkRFNDM5NjAxODYzNUNBIC8qIEhUTUxFbGVtZW50LmNwcCAq
LywKIAkJCQlGNTIzRDIzRjAyREU0Mzk2MDE4NjM1Q0EgLyogSFRNTEVsZW1lbnQuaCAqLywKIAkJ
CQkxQTQ5NEJCQjBBMTIyRENEMDBGREFGQzEgLyogSFRNTEVsZW1lbnQuaWRsICovLApAQCAtMzI5
NywxMyArMzMyMCwyNiBAQAogCQkJCUE4NzFENDRDMEExMjdDQkMwMEIxMkE2OCAvKiBIVE1MUGx1
Z0luRWxlbWVudC5oICovLAogCQkJCUE4MTM2OUJEMDk3Mzc0RjUwMEQ3NDQ2MyAvKiBIVE1MU2Vs
ZWN0RWxlbWVudC5jcHAgKi8sCiAJCQkJQTgxMzY5QkMwOTczNzRGNTAwRDc0NDYzIC8qIEhUTUxT
ZWxlY3RFbGVtZW50LmggKi8sCisJCQkJQTg3MURCMjQwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxU
YWJsZUNhcHRpb25FbGVtZW50LmNwcCAqLywKKwkJCQlBODcxREIxRDBBMTUwQkQ2MDBCMTJBNjgg
LyogSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuaCAqLywKKwkJCQlBODcxREIyMDBBMTUwQkQ2MDBC
MTJBNjggLyogSFRNTFRhYmxlQ2VsbEVsZW1lbnQuY3BwICovLAorCQkJCUE4NzFEQjFDMEExNTBC
RDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDZWxsRWxlbWVudC5oICovLAorCQkJCUE4NzFEQjFCMEEx
NTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDb2xFbGVtZW50LmNwcCAqLywKKwkJCQlBODcxREIy
MTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ29sRWxlbWVudC5oICovLAorCQkJCUE4NzFE
QjFBMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVFbGVtZW50LmNwcCAqLywKKwkJCQlBODcx
REIxOTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlRWxlbWVudC5oICovLAorCQkJCUE4NzFE
QjFGMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVQYXJ0RWxlbWVudC5jcHAgKi8sCisJCQkJ
QTg3MURCMUUwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVBhcnRFbGVtZW50LmggKi8sCisJ
CQkJQTg3MURCMjIwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVJvd0VsZW1lbnQuY3BwICov
LAorCQkJCUE4NzFEQjIzMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVSb3dFbGVtZW50Lmgg
Ki8sCisJCQkJQTg3MURCMTgwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVNlY3Rpb25FbGVt
ZW50LmNwcCAqLywKKwkJCQlBODcxREIxNzBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlU2Vj
dGlvbkVsZW1lbnQuaCAqLywKIAkJCQlBODEzNjlCQjA5NzM3NEY1MDBENzQ0NjMgLyogSFRNTFRl
eHRBcmVhRWxlbWVudC5jcHAgKi8sCiAJCQkJQTgxMzY5QkEwOTczNzRGNTAwRDc0NDYzIC8qIEhU
TUxUZXh0QXJlYUVsZW1lbnQuaCAqLywKIAkJCQlBQjIzQTMxMDA5QkJBNzc2MDA2N0NDNTMgLyog
SFRNTFRleHRGaWVsZElubmVyRWxlbWVudC5jcHAgKi8sCiAJCQkJQUIyM0EzMTEwOUJCQTc3NjAw
NjdDQzUzIC8qIEhUTUxUZXh0RmllbGRJbm5lckVsZW1lbnQuaCAqLywKIAkJCQlGNTIzRDI1MjAy
REU0Mzk2MDE4NjM1Q0EgLyogSFRNTFRva2VuaXplci5jcHAgKi8sCiAJCQkJRjUyM0QyNTMwMkRF
NDM5NjAxODYzNUNBIC8qIEhUTUxUb2tlbml6ZXIuaCAqLywKLQkJCQkxQTQ5NEUyOTBBMTIzNTQz
MDBGREFGQzEgLyogSFRNTERvY3VtZW50LmlkbCAqLywKIAkJCSk7CiAJCQlwYXRoID0gaHRtbDsK
IAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC00NDcyLDcgKzQ1MDgsNiBAQAogCQkJCTkz
RjE5OEU5MDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX2ltYWdlaW1wbC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJOTNGMTk4RUEwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfaW5saW5laW1wbC5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJOTNGMTk4RUIwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfbGlzdGltcGwu
aCBpbiBIZWFkZXJzICovLAotCQkJCTkzRjE5OEVFMDgyNDVFNTkwMDFFOUFCQyAvKiBodG1sX3Rh
YmxlaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk4RUYwODI0NUU1OTAwMUU5QUJDIC8q
IEhUTUxQYXJzZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OEYwMDgyNDVFNTkwMDFFOUFC
QyAvKiBIVE1MVG9rZW5pemVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk5M0YxOThGNjA4MjQ1RTU5
MDAxRTlBQkMgLyogRGVjb2Rlci5oIGluIEhlYWRlcnMgKi8sCkBAIC01MDcyLDYgKzUxMDcsMTMg
QEAKIAkJCQkxQTQ5NEJGQjBBMTIyRjQ0MDBGREFGQzEgLyogSlNIVE1MRWxlbWVudC5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJMUE0OTRFMzUwQTEyMzU4QjAwRkRBRkMxIC8qIEpTSFRNTERvY3VtZW50
LmggaW4gSGVhZGVycyAqLywKIAkJCQkxQTQ5NEVERjBBMTIzRjRDMDBGREFGQzEgLyogSlNEb2N1
bWVudEZyYWdtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlBODcxREIyNTBBMTUwQkQ2MDBCMTJB
NjggLyogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4NzFE
QjI3MEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVFbGVtZW50LmggaW4gSGVhZGVycyAqLywK
KwkJCQlBODcxREIyQTBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCBp
biBIZWFkZXJzICovLAorCQkJCUE4NzFEQjJCMEExNTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVD
YXB0aW9uRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTg3MURCMkMwQTE1MEJENjAwQjEy
QTY4IC8qIEhUTUxUYWJsZVBhcnRFbGVtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQlBODcxREIy
RjBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlQ29sRWxlbWVudC5oIGluIEhlYWRlcnMgKi8s
CisJCQkJQTg3MURCMzEwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZVJvd0VsZW1lbnQuaCBp
biBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Np
bmcgPSAwOwogCQl9OwpAQCAtNTI5MCw3ICs1MzMyLDYgQEAKIAkJCQk5M0YxOUE5NTA4MjQ1RTU5
MDAxRTlBQkMgLyogaHRtbF9pbWFnZWltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlB
OTYwODI0NUU1OTAwMUU5QUJDIC8qIGh0bWxfaW5saW5laW1wbC5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk5M0YxOUE5NzA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF9saXN0aW1wbC5jcHAgaW4gU291
cmNlcyAqLywKLQkJCQk5M0YxOUE5QTA4MjQ1RTU5MDAxRTlBQkMgLyogaHRtbF90YWJsZWltcGwu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBOUIwODI0NUU1OTAwMUU5QUJDIC8qIEhUTUxQ
YXJzZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBOUMwODI0NUU1OTAwMUU5QUJDIC8q
IEhUTUxUb2tlbml6ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBOUQwODI0NUU1OTAw
MUU5QUJDIC8qIERlY29kZXIuY3BwIGluIFNvdXJjZXMgKi8sCkBAIC01ODIwLDYgKzU4NjEsMTMg
QEAKIAkJCQkxQTQ5NEJGQTBBMTIyRjQ0MDBGREFGQzEgLyogSlNIVE1MRWxlbWVudC5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQkxQTQ5NEUzNDBBMTIzNThCMDBGREFGQzEgLyogSlNIVE1MRG9jdW1l
bnQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMUE0OTRFREUwQTEyM0Y0QzAwRkRBRkMxIC8qIEpT
RG9jdW1lbnRGcmFnbWVudC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODcxREIyNjBBMTUwQkQ2
MDBCMTJBNjggLyogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJ
CQkJQTg3MURCMjgwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZUVsZW1lbnQuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJQTg3MURCMjkwQTE1MEJENjAwQjEyQTY4IC8qIEhUTUxUYWJsZUNvbEVs
ZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTg3MURCMkQwQTE1MEJENjAwQjEyQTY4IC8q
IEhUTUxUYWJsZVBhcnRFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4NzFEQjJFMEEx
NTBCRDYwMEIxMkE2OCAvKiBIVE1MVGFibGVDZWxsRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQlBODcxREIzMDBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxlUm93RWxlbWVudC5jcHAg
aW4gU291cmNlcyAqLywKKwkJCQlBODcxREIzMjBBMTUwQkQ2MDBCMTJBNjggLyogSFRNTFRhYmxl
Q2FwdGlvbkVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRl
cGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBDaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gQ2hhbmdlTG9nCShyZXZpc2lvbiAxNDMzMCkKKysrIENoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDU0IEBACisyMDA2LTA1LTEyICBFcmljIFNlaWRlbCAgPGVzZWlk
ZWxAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFNwbGl0IG91dCBodG1sX3RhYmxlaW1wbC4qIGludG8gbXVsdGlwbGUgZmlsZXMgKG9u
ZSBwZXIgY2xhc3MpCisgICAgICAgIGh0dHA6Ly9idWd6aWxsYS5vcGVuZGFyd2luLm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9ODg3MworCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qOgorICAgICAgICAqIGh0bWwvSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUYWJsZUNhcHRpb25FbGVtZW50OjpIVE1MVGFibGVD
YXB0aW9uRWxlbWVudCk6CisgICAgICAgICogaHRtbC9IVE1MVGFibGVDYXB0aW9uRWxlbWVudC5o
OiBBZGRlZC4KKyAgICAgICAgKiBodG1sL0hUTUxUYWJsZUNlbGxFbGVtZW50LmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpIVE1MVGFibGVDZWxsRWxlbWVudDo6SFRNTFRhYmxlQ2VsbEVs
ZW1lbnQpOgorICAgICAgICAqIGh0bWwvSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaDogQWRkZWQuCisg
ICAgICAgICogaHRtbC9IVE1MVGFibGVDb2xFbGVtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpIVE1MVGFibGVDb2xFbGVtZW50OjpIVE1MVGFibGVDb2xFbGVtZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxUYWJsZUNvbEVsZW1lbnQ6OmVuZFRhZ1JlcXVpcmVtZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxUYWJsZUNvbEVsZW1lbnQ6OnRhZ1ByaW9yaXR5KToKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxUYWJsZUNvbEVsZW1lbnQ6OmNoZWNrRFREKToKKyAgICAgICAgKiBo
dG1sL0hUTUxUYWJsZUNvbEVsZW1lbnQuaDogQWRkZWQuCisgICAgICAgICogaHRtbC9IVE1MVGFi
bGVFbGVtZW50LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MVGFibGVFbGVtZW50
OjpIVE1MVGFibGVFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUYWJsZUVsZW1lbnQ6
OnNldENhcHRpb24pOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlRWxlbWVudDo6c2V0VEhl
YWQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlRWxlbWVudDo6c2V0VEZvb3QpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlRWxlbWVudDo6c2V0VEJvZHkpOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTFRhYmxlRWxlbWVudDo6Y3JlYXRlVEhlYWQpOgorICAgICAgICAoV2ViQ29yZTo6
SFRNTFRhYmxlRWxlbWVudDo6ZGVsZXRlVEhlYWQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRh
YmxlRWxlbWVudDo6Y3JlYXRlVEZvb3QpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlRWxl
bWVudDo6ZGVsZXRlVEZvb3QpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlRWxlbWVudDo6
Y3JlYXRlQ2FwdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpIVE1MVGFibGVFbGVtZW50OjpkZWxl
dGVDYXB0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUYWJsZUVsZW1lbnQ6Omluc2VydFJv
dyk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MVGFibGVFbGVtZW50OjpkZWxldGVSb3cpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlRWxlbWVudDo6YWRkQ2hpbGQpOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTFRhYmxlRWxlbWVudDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUpOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTFRhYmxlRWxlbWVudDo6YXR0YWNoKToKKyAgICAgICAgKiBodG1sL0hUTUxU
YWJsZUVsZW1lbnQuaDogQWRkZWQuCisgICAgICAgICogaHRtbC9IVE1MVGFibGVQYXJ0RWxlbWVu
dC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlUGFydEVsZW1lbnQ6OnBh
cnNlTWFwcGVkQXR0cmlidXRlKToKKyAgICAgICAgKiBodG1sL0hUTUxUYWJsZVBhcnRFbGVtZW50
Lmg6IEFkZGVkLgorICAgICAgICAqIGh0bWwvSFRNTFRhYmxlUm93RWxlbWVudC5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTFRhYmxlUm93RWxlbWVudDo6SFRNTFRhYmxlUm93RWxl
bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MVGFibGVSb3dFbGVtZW50Ojpyb3dJbmRleCk6
CisgICAgICAgICogaHRtbC9IVE1MVGFibGVSb3dFbGVtZW50Lmg6IEFkZGVkLgorICAgICAgICAq
IGh0bWwvSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OjppbnNlcnRSb3cpOgorICAgICAgICAqIGh0bWwv
SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQuaDogQWRkZWQuCisgICAgICAgICogaHRtbC9odG1sX3Rh
YmxlaW1wbC5jcHA6IFJlbW92ZWQuCisgICAgICAgICogaHRtbC9odG1sX3RhYmxlaW1wbC5oOiBS
ZW1vdmVkLgorCiAyMDA2LTA1LTEwICBFcmljIFNlaWRlbCAgPGVzZWlkZWxAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IG1qcyAmIGFkZWxlLgo=
</data>
<flag name="review"
          id="2320"
          type_id="1"
          status="+"
          setter="bdakin"
    />
          </attachment>
      

    </bug>

</bugzilla>