<?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>27196</bug_id>
          
          <creation_ts>2009-07-12 17:36:47 -0700</creation_ts>
          <short_desc>Rename bidi.cpp to RenderBlockLineLayout.cpp and remove bidi.h</short_desc>
          <delta_ts>2009-07-12 18:45:21 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>mitz</reporter>
          <assigned_to>mitz</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>131214</commentid>
    <comment_count>0</comment_count>
    <who name="">mitz</who>
    <bug_when>2009-07-12 17:36:47 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131216</commentid>
    <comment_count>1</comment_count>
      <attachid>32637</attachid>
    <who name="">mitz</who>
    <bug_when>2009-07-12 17:40:46 -0700</bug_when>
    <thetext>Created attachment 32637
Rename bidi.cpp to RenderBlockLineLayout.cpp, remove bidi.h, update project files and script</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131218</commentid>
    <comment_count>2</comment_count>
      <attachid>32637</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-07-12 17:52:41 -0700</bug_when>
    <thetext>Comment on attachment 32637
Rename bidi.cpp to RenderBlockLineLayout.cpp, remove bidi.h, update project files and script

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>131228</commentid>
    <comment_count>3</comment_count>
    <who name="">mitz</who>
    <bug_when>2009-07-12 18:45:21 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/45782</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>32637</attachid>
            <date>2009-07-12 17:40:46 -0700</date>
            <delta_ts>2009-07-12 17:52:41 -0700</delta_ts>
            <desc>Rename bidi.cpp to RenderBlockLineLayout.cpp, remove bidi.h, update project files and script</desc>
            <filename>27196_r1.diff</filename>
            <type>text/plain</type>
            <size>218376</size>
            <attacher>mitz</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NTc4MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMDktMDctMTIgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjcxOTYKKyAgICAgICAgUmVuYW1l
IGJpZGkuY3BwIHRvIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAgYW5kIHJlbW92ZSBiaWRpLmgK
KworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOiBVcGRhdGVkLgorICAgICAgICAqIFdlYkNvcmUu
Z3lwaTogVXBkYXRlZC4KKyAgICAgICAgKiBXZWJDb3JlLnBybzogVXBkYXRlZC4KKyAgICAgICAg
KiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajogVXBkYXRlZC4KKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6IFVwZGF0ZWQuCisgICAgICAgICogV2ViQ29y
ZVNvdXJjZXMuYmtsOiBVcGRhdGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5o
OiBSZW1vdmVkIHVubmVjZXNzYXJ5IGZvcndhcmQgZGVjbGFyYXRpb24gYW5kCisgICAgICAgICAg
ICB1cGRhdGVkIGNvbW1lbnRzLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVM
YXlvdXQuY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3JlbmRlcmluZy9iaWRpLmNwcC4KKyAgICAg
ICAgICAgIFJlbW92ZWQgdW5uZWNlc3NhcnkgI2luY2x1ZGUgc3RhdGVtZW50cy4KKyAgICAgICAg
KFdlYkNvcmU6OkJpZGlSdW46OkJpZGlSdW4pOiBNb3ZlZCBoZXJlIGZyb20gYmlkaS5oLgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKTogUmVtb3Zl
ZCBvdXRkYXRlZCBjb21tZW50LgorICAgICAgICAqIHJlbmRlcmluZy9iaWRpLmNwcDogUmVtb3Zl
ZC4KKyAgICAgICAgKiByZW5kZXJpbmcvYmlkaS5oOiBSZW1vdmVkLgorCiAyMDA5LTA3LTEyICBE
YW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgLSBXaW5kb3dzIGJ1aWxk
IGZpeApJbmRleDogV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L0dOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiA0NTc4MSkKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUu
YW0JKHdvcmtpbmcgY29weSkKQEAgLTE2MjYsNiArMTYyNiw3IEBAIHdlYmNvcmVfc291cmNlcyAr
PSBcCiAJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuaCBcCiAJV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2suY3BwIFwKIAlXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oIFwKKwlX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwIFwKIAlXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCb3guY3BwIFwKIAlXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guaCBc
CiAJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwIFwKQEAgLTE3MzEs
OCArMTczMiw2IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29yZS9yZW5kZXJpbmcvVGV4
dENvbnRyb2xJbm5lckVsZW1lbnRzLmggXAogCVdlYkNvcmUvcmVuZGVyaW5nL1RyYW5zZm9ybVN0
YXRlLmNwcCBcCiAJV2ViQ29yZS9yZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuaCBcCi0JV2ViQ29y
ZS9yZW5kZXJpbmcvYmlkaS5jcHAgXAotCVdlYkNvcmUvcmVuZGVyaW5nL2JpZGkuaCBcCiAJV2Vi
Q29yZS9yZW5kZXJpbmcvYnJlYWtfbGluZXMuY3BwIFwKIAlXZWJDb3JlL3JlbmRlcmluZy9icmVh
a19saW5lcy5oIFwKIAlXZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9CaW5kaW5nVVJJLmNwcCBcCklu
ZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUu
Z3lwaQkocmV2aXNpb24gNDU3ODEpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBj
b3B5KQpAQCAtMjY4Miw2ICsyNjgyLDcgQEAKICAgICAgICAgICAgICdyZW5kZXJpbmcvUmVuZGVy
QlIuaCcsCiAgICAgICAgICAgICAncmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcCcsCiAgICAgICAg
ICAgICAncmVuZGVyaW5nL1JlbmRlckJsb2NrLmgnLAorICAgICAgICAgICAgJ3JlbmRlcmluZy9S
ZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvUmVuZGVy
Qm94LmNwcCcsCiAgICAgICAgICAgICAncmVuZGVyaW5nL1JlbmRlckJveC5oJywKICAgICAgICAg
ICAgICdyZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwJywKQEAgLTI4NTAsOCArMjg1
MSw2IEBACiAgICAgICAgICAgICAncmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5o
JywKICAgICAgICAgICAgICdyZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuY3BwJywKICAgICAgICAg
ICAgICdyZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuaCcsCi0gICAgICAgICAgICAncmVuZGVyaW5n
L2JpZGkuY3BwJywKLSAgICAgICAgICAgICdyZW5kZXJpbmcvYmlkaS5oJywKICAgICAgICAgICAg
ICdyZW5kZXJpbmcvYnJlYWtfbGluZXMuY3BwJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvYnJl
YWtfbGluZXMuaCcsCiAgICAgICAgICAgICAnc3RvcmFnZS9DaGFuZ2VWZXJzaW9uV3JhcHBlci5j
cHAnLApJbmRleDogV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dl
YkNvcmUucHJvCShyZXZpc2lvbiA0NTc4MSkKKysrIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHdvcmtp
bmcgY29weSkKQEAgLTEwMjIsNyArMTAyMiw2IEBAIFNPVVJDRVMgKz0gXAogICAgIHBsdWdpbnMv
UGx1Z2luU3RyZWFtLmNwcCBcCiAgICAgcGx1Z2lucy9QbHVnaW5WaWV3LmNwcCBcCiAgICAgcmVu
ZGVyaW5nL0F1dG9UYWJsZUxheW91dC5jcHAgXAotICAgIHJlbmRlcmluZy9iaWRpLmNwcCBcCiAg
ICAgcmVuZGVyaW5nL2JyZWFrX2xpbmVzLmNwcCBcCiAgICAgcmVuZGVyaW5nL0NvdW50ZXJOb2Rl
LmNwcCBcCiAgICAgcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcCBcCkBAIC0xMDM1LDYgKzEwMzQs
NyBAQCBTT1VSQ0VTICs9IFwKICAgICByZW5kZXJpbmcvUmVuZGVyQXBwbGV0LmNwcCBcCiAgICAg
cmVuZGVyaW5nL1JlbmRlckFyZW5hLmNwcCBcCiAgICAgcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNw
cCBcCisgICAgcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAgXAogICAgIHJlbmRl
cmluZy9SZW5kZXJCb3guY3BwIFwKICAgICByZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3Qu
Y3BwIFwKICAgICByZW5kZXJpbmcvUmVuZGVyQlIuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29y
ZVNvdXJjZXMuYmtsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCShy
ZXZpc2lvbiA0NTc4MSkKKysrIFdlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCSh3b3JraW5nIGNv
cHkpCkBAIC05MTgsNyArOTE4LDYgQEAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGZp
bGVzIG5lZQogCiAgICAgPHNldCBhcHBlbmQ9IjEiIHZhcj0iV0VCQ09SRV9TT1VSQ0VTX1JFTkRF
UklORyI+CiAgICAgICAgIHJlbmRlcmluZy9BdXRvVGFibGVMYXlvdXQuY3BwCi0gICAgICAgIHJl
bmRlcmluZy9iaWRpLmNwcAogICAgICAgICByZW5kZXJpbmcvYnJlYWtfbGluZXMuY3BwCiAgICAg
ICAgIHJlbmRlcmluZy9Db3VudGVyTm9kZS5jcHAKICAgICAgICAgcmVuZGVyaW5nL0VsbGlwc2lz
Qm94LmNwcApAQCAtOTMzLDYgKzkzMiw3IEBAIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBv
ZiBmaWxlcyBuZWUKICAgICAgICAgcmVuZGVyaW5nL1JlbmRlckFyZW5hLmNwcAogICAgICAgICBy
ZW5kZXJpbmcvUmVuZGVyQlIuY3BwCiAgICAgICAgIHJlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAK
KyAgICAgICAgcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKICAgICAgICAgcmVu
ZGVyaW5nL1JlbmRlckJveC5jcHAKICAgICAgICAgcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2Jq
ZWN0LmNwcAogICAgICAgICByZW5kZXJpbmcvUmVuZGVyQnV0dG9uLmNwcApJbmRleDogV2ViQ29y
ZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dl
YkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiA0NTc4MSkKKysrIFdlYkNvcmUv
V2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTIxNzQ3LDE0
ICsyMTc0Nyw2IEBACiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KLQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXHJlbmRlcmluZ1xiaWRpLmNwcCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8
RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHJlbmRlcmluZ1xiaWRpLmgiDQotCQkJCT4NCi0J
CQk8L0ZpbGU+DQotCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcYnJl
YWtfbGluZXMuY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KQEAgLTIxODc5LDYgKzIxODcxLDEw
IEBACiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHJlbmRlcmluZ1xSZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxl
Pg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccmVuZGVyaW5nXFJlbmRlckJveC5j
cHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDQ1NzgxKQorKysgV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTQyMzAsOCArNDIzMCw3
IEBACiAJCUJDRTk5RUM0MERDQTYyNDEwMDE4MjY4MyAvKiBKU1hTTFRQcm9jZXNzb3JDb25zdHJ1
Y3Rvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNF
OTlFQzIwRENBNjI0MTAwMTgyNjgzIC8qIEpTWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9yLmggKi87
IH07CiAJCUJDRUE0NzhGMDk3Q0FBQzgwMDk0QzlFNCAvKiBDU1NDb21wdXRlZFN0eWxlRGVjbGFy
YXRpb24uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFQTQ3N0MwOTdDQUFDODAwOTRDOUU0IC8qIENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5j
cHAgKi87IH07CiAJCUJDRUE0NzkwMDk3Q0FBQzgwMDk0QzlFNCAvKiBDU1NDb21wdXRlZFN0eWxl
RGVjbGFyYXRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEJDRUE0NzdEMDk3Q0FBQzgwMDk0QzlFNCAvKiBDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRp
b24uaCAqLzsgfTsKLQkJQkNFQTQ4NTIwOTdEOTMwMjAwOTRDOUU0IC8qIGJpZGkuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MTMwOTdEOTMw
MjAwOTRDOUU0IC8qIGJpZGkuY3BwICovOyB9OwotCQlCQ0VBNDg1MzA5N0Q5MzAyMDA5NEM5RTQg
LyogYmlkaS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkNFQTQ4MTQwOTdEOTMwMjAwOTRDOUU0IC8qIGJpZGkuaCAqLzsgfTsKKwkJQkNFQTQ4NTIwOTdE
OTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrTGluZUxheW91dC5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQ0VBNDgxMzA5N0Q5MzAyMDA5NEM5RTQg
LyogUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCAqLzsgfTsKIAkJQkNFQTQ4NTQwOTdEOTMwMjAw
OTRDOUU0IC8qIGJyZWFrX2xpbmVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJDRUE0ODE1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5j
cHAgKi87IH07CiAJCUJDRUE0ODU1MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkNFQTQ4MTYwOTdE
OTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmggKi87IH07CiAJCUJDRUE0ODU5MDk3RDkzMDIw
MDk0QzlFNCAvKiBJbmxpbmVUZXh0Qm94LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEJDRUE0ODFBMDk3RDkzMDIwMDk0QzlFNCAvKiBJbmxpbmVUZXh0
Qm94LmNwcCAqLzsgfTsKQEAgLTkwNzMsOCArOTA3Miw3IEBACiAJCUJDRUE0NzdFMDk3Q0FBQzgw
MDk0QzlFNCAvKiBDU1NHcmFtbWFyLnkgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS55YWNjOyBwYXRo
ID0gQ1NTR3JhbW1hci55OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQ0VBNDc4OTA5
N0NBQUM4MDA5NEM5RTQgLyogQ1NTUHJvcGVydHlOYW1lcy5pbiAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBw
YXRoID0gQ1NTUHJvcGVydHlOYW1lcy5pbjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
QkNFQTQ3OEMwOTdDQUFDODAwOTRDOUU0IC8qIENTU1ZhbHVlS2V5d29yZHMuaW4gKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gdGV4dDsgcGF0aCA9IENTU1ZhbHVlS2V5d29yZHMuaW47IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07Ci0JCUJDRUE0ODEzMDk3RDkzMDIwMDk0QzlFNCAvKiBiaWRpLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBiaWRpLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKLQkJQkNFQTQ4MTQwOTdEOTMwMjAwOTRDOUU0IC8qIGJpZGkuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGJpZGkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrTGluZUxheW91dC5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyQmxvY2tMaW5l
TGF5b3V0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkNFQTQ4MTUwOTdEOTMw
MjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBicmVha19saW5lcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUJDRUE0ODE2MDk3RDkzMDIwMDk0QzlFNCAvKiBicmVha19saW5lcy5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gYnJlYWtfbGluZXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJQkNFQTQ4MUEwOTdEOTMwMjAwOTRDOUU0IC8qIElubGluZVRleHRCb3guY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElubGluZVRleHRCb3guY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQyNzEsOCArMTQyNjksNiBAQAogCQkJCUJD
OEM4RkFBMEREQ0QyRjIwMEI1OTJGNCAvKiBzdHlsZSAqLywKIAkJCQlBOENGRjA0QjBBMTU0RjA5
MDAwQTQyMzQgLyogQXV0b1RhYmxlTGF5b3V0LmNwcCAqLywKIAkJCQlBOENGRjA0OTBBMTU0RjA5
MDAwQTQyMzQgLyogQXV0b1RhYmxlTGF5b3V0LmggKi8sCi0JCQkJQkNFQTQ4MTMwOTdEOTMwMjAw
OTRDOUU0IC8qIGJpZGkuY3BwICovLAotCQkJCUJDRUE0ODE0MDk3RDkzMDIwMDk0QzlFNCAvKiBi
aWRpLmggKi8sCiAJCQkJQkNFQTQ4MTUwOTdEOTMwMjAwOTRDOUU0IC8qIGJyZWFrX2xpbmVzLmNw
cCAqLywKIAkJCQlCQ0VBNDgxNjA5N0Q5MzAyMDA5NEM5RTQgLyogYnJlYWtfbGluZXMuaCAqLywK
IAkJCQk5MzkyRjE0RjBBRDE4NjIzMDA2OTFCRDQgLyogQ291bnRlck5vZGUuY3BwICovLApAQCAt
MTQzMDUsNiArMTQzMDEsNyBAQAogCQkJCUJDRUE0ODFGMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5k
ZXJBcmVuYS5oICovLAogCQkJCUJDRUE0ODIwMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJCbG9j
ay5jcHAgKi8sCiAJCQkJQkNFQTQ4MjEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrLmgg
Ki8sCisJCQkJQkNFQTQ4MTMwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJsb2NrTGluZUxheW91
dC5jcHAgKi8sCiAJCQkJQkNFQTQ4MjIwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJveC5jcHAg
Ki8sCiAJCQkJQkNFQTQ4MjMwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlckJveC5oICovLAogCQkJ
CUJDOTZEQjQ1MEYzQTg4MjIwMDU3M0NCMyAvKiBSZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAgKi8s
CkBAIC0xNDc1Myw3ICsxNDc1MCw2IEBACiAJCQkJQjJDM0RBMjIwRDAwNkMxRDAwRUY2RjI2IC8q
IEJhc2U2NC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQUIyM0EzMjgwOUJCQTdEMDAwNjdDQzUzIC8q
IEJlZm9yZVRleHRJbnNlcnRlZEV2ZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQk4NTAzMUIzRDBB
NDRFRkM3MDBGOTkyRTAgLyogQmVmb3JlVW5sb2FkRXZlbnQuaCBpbiBIZWFkZXJzICovLAotCQkJ
CUJDRUE0ODUzMDk3RDkzMDIwMDk0QzlFNCAvKiBiaWRpLmggaW4gSGVhZGVycyAqLywKIAkJCQlC
MkMzREEyNDBEMDA2QzFEMDBFRjZGMjYgLyogQmlkaUNvbnRleHQuaCBpbiBIZWFkZXJzICovLAog
CQkJCUIyQzNEQTI1MEQwMDZDMUQwMEVGNkYyNiAvKiBCaWRpUmVzb2x2ZXIuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTkzODE5MjA1MEY4N0UxRUMwMEQ1MzUyQSAvKiBCaW5hcnlQcm9wZXJ0eUxpc3Qu
aCBpbiBIZWFkZXJzICovLApAQCAtMTcyNzMsNyArMTcyNjksNyBAQAogCQkJCUIyQzNEQTIxMEQw
MDZDMUQwMEVGNkYyNiAvKiBCYXNlNjQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQUIyM0EzMjcw
OUJCQTdEMDAwNjdDQzUzIC8qIEJlZm9yZVRleHRJbnNlcnRlZEV2ZW50LmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTg1MDMxQjNDMEE0NEVGQzcwMEY5OTJFMCAvKiBCZWZvcmVVbmxvYWRFdmVudC5j
cHAgaW4gU291cmNlcyAqLywKLQkJCQlCQ0VBNDg1MjA5N0Q5MzAyMDA5NEM5RTQgLyogYmlkaS5j
cHAgaW4gU291cmNlcyAqLywKKwkJCQlCQ0VBNDg1MjA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
QmxvY2tMaW5lTGF5b3V0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyQzNEQTIzMEQwMDZDMUQw
MEVGNkYyNiAvKiBCaWRpQ29udGV4dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5MzgxOTIwMzBG
ODdFMUU2MDBENTM1MkEgLyogQmluYXJ5UHJvcGVydHlMaXN0LmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUJDNUVCOTFGMEU4MjA0MDgwMEIyNTk2NSAvKiBCaW5kaW5nVVJJLmNwcCBpbiBTb3VyY2Vz
ICovLApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5oCShyZXZpc2lvbiA0NTc4MSkKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcgKzM1
LDYgQEAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgSW5saW5lSXRlcmF0b3I7Ci1jbGFz
cyBQb3NpdGlvbjsKIGNsYXNzIFJlbmRlcklubGluZTsKIGNsYXNzIFJvb3RJbmxpbmVCb3g7CiAK
QEAgLTE0OCw3ICsxNDcsNiBAQCBwdWJsaWM6CiAgICAgLy8gQ2FsbGVkIHRvIGxheSBvdXQgdGhl
IGxlZ2VuZCBmb3IgYSBmaWVsZHNldC4KICAgICB2aXJ0dWFsIFJlbmRlck9iamVjdCogbGF5b3V0
TGVnZW5kKGJvb2wgLypyZWxheW91dENoaWxkcmVuKi8pIHsgcmV0dXJuIDA7IH0KIAotICAgIC8v
IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpcyBpbiBiaWRp
LmNwcAogICAgIHN0cnVjdCBGbG9hdFdpdGhSZWN0IHsKICAgICAgICAgRmxvYXRXaXRoUmVjdChS
ZW5kZXJCb3gqIGYpCiAgICAgICAgICAgICA6IG9iamVjdChmKQpAQCAtMTYyLDYgKzE2MCw3IEBA
IHB1YmxpYzoKICAgICAgICAgYm9vbCBldmVySGFkTGF5b3V0OwogICAgIH07CiAKKyAgICAvLyBU
aGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgaW1wbGVtZW50YXRpb25zIGFyZSBpbiBSZW5kZXJCbG9j
a0xpbmVMYXlvdXQuY3BwLgogICAgIHZvaWQgYmlkaVJlb3JkZXJMaW5lKElubGluZUJpZGlSZXNv
bHZlciYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KTsKICAgICBSb290SW5saW5lQm94KiBkZXRlcm1pbmVTdGFydFBvc2l0aW9uKGJvb2wm
IGZpcnN0TGluZSwgYm9vbCYgZnVsbExheW91dCwgYm9vbCYgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5saW5lQmlk
aVJlc29sdmVyJiwgVmVjdG9yPEZsb2F0V2l0aFJlY3Q+JiBmbG9hdHMsIHVuc2lnbmVkJiBudW1D
bGVhbkZsb2F0cyk7CkBAIC0xODIsNyArMTgxLDcgQEAgcHVibGljOgogICAgIHZvaWQgY2hlY2tM
aW5lc0Zvck92ZXJmbG93KCk7CiAgICAgdm9pZCBkZWxldGVFbGxpcHNpc0xpbmVCb3hlcygpOwog
ICAgIHZvaWQgY2hlY2tMaW5lc0ZvclRleHRPdmVyZmxvdygpOwotICAgIC8vIGVuZCBiaWRpLmNw
cCBmdW5jdGlvbnMKKyAgICAvLyBFbmQgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gUmVuZGVyQmxv
Y2tMaW5lTGF5b3V0LmNwcC4KIAogICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBp
bnQgdHgsIGludCB0eSk7CiAgICAgdmlydHVhbCB2b2lkIHBhaW50T2JqZWN0KFBhaW50SW5mbyYs
IGludCB0eCwgaW50IHR5KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGlu
ZUxheW91dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tM
aW5lTGF5b3V0LmNwcAkocmV2aXNpb24gNDU3ODEpCShmcm9tIFdlYkNvcmUvcmVuZGVyaW5nL2Jp
ZGkuY3BwOjQ1NzgxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAw
NCwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJiaWRpLmgiCisKKyNpbmNsdWRlICJDaGFyYWN0
ZXJOYW1lcy5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgor
I2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIklubGluZVRleHRCb3guaCIKKyNpbmNs
dWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKKyNpbmNsdWRlICJSZW5k
ZXJJbmxpbmUuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorI2luY2x1ZGUgIlJlbmRlckxp
c3RNYXJrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAiYnJlYWtfbGlu
ZXMuaCIKKyNpbmNsdWRlIDx3dGYvQWx3YXlzSW5saW5lLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNv
dW50ZWRMZWFrQ291bnRlci5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3Bh
Y2UgV1RGOwordXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworLy8gV2UgZG9uJ3QgbGV0IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdl
dCBhbnkgZGVlcGVyIHRoYW4gdGhpcy4KK2NvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAy
MDA7CisKK2NsYXNzIElubGluZUl0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBJbmxpbmVJdGVyYXRv
cigpCisgICAgICAgIDogYmxvY2soMCkKKyAgICAgICAgLCBvYmooMCkKKyAgICAgICAgLCBwb3Mo
MCkKKyAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9zaXRpb24oLTEpCisgICAgeworICAgIH0KKwor
ICAgIElubGluZUl0ZXJhdG9yKFJlbmRlckJsb2NrKiBiLCBSZW5kZXJPYmplY3QqIG8sIHVuc2ln
bmVkIHApCisgICAgICAgIDogYmxvY2soYikKKyAgICAgICAgLCBvYmoobykKKyAgICAgICAgLCBw
b3MocCkKKyAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9zaXRpb24oLTEpCisgICAgeworICAgIH0K
KworICAgIHZvaWQgaW5jcmVtZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsK
KyAgICBib29sIGF0RW5kKCkgY29uc3Q7CisKKyAgICBVQ2hhciBjdXJyZW50KCkgY29uc3Q7Cisg
ICAgV1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gZGlyZWN0aW9uKCkgY29uc3Q7CisKKyAgICBSZW5k
ZXJCbG9jayogYmxvY2s7CisgICAgUmVuZGVyT2JqZWN0KiBvYmo7CisgICAgdW5zaWduZWQgcG9z
OworICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb247Cit9OworCitzdGF0aWMgaW50IGdldEJv
cmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyQm94TW9kZWxPYmplY3QqIGNoaWxkLCBib29sIGVuZE9m
SW5saW5lKQoreworICAgIGJvb2wgbGVmdFNpZGUgPSAoY2hpbGQtPnN0eWxlKCktPmRpcmVjdGlv
bigpID09IExUUikgPyAhZW5kT2ZJbmxpbmUgOiBlbmRPZklubGluZTsKKyAgICBpZiAobGVmdFNp
ZGUpCisgICAgICAgIHJldHVybiBjaGlsZC0+bWFyZ2luTGVmdCgpICsgY2hpbGQtPnBhZGRpbmdM
ZWZ0KCkgKyBjaGlsZC0+Ym9yZGVyTGVmdCgpOworICAgIHJldHVybiBjaGlsZC0+bWFyZ2luUmln
aHQoKSArIGNoaWxkLT5wYWRkaW5nUmlnaHQoKSArIGNoaWxkLT5ib3JkZXJSaWdodCgpOworfQor
CitzdGF0aWMgaW50IGlubGluZVdpZHRoKFJlbmRlck9iamVjdCogY2hpbGQsIGJvb2wgc3RhcnQg
PSB0cnVlLCBib29sIGVuZCA9IHRydWUpCit7CisgICAgdW5zaWduZWQgbGluZURlcHRoID0gMTsK
KyAgICBpbnQgZXh0cmFXaWR0aCA9IDA7CisgICAgUmVuZGVyT2JqZWN0KiBwYXJlbnQgPSBjaGls
ZC0+cGFyZW50KCk7CisgICAgd2hpbGUgKHBhcmVudC0+aXNJbmxpbmUoKSAmJiAhcGFyZW50LT5p
c0lubGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmIGxpbmVEZXB0aCsrIDwgY01heExpbmVEZXB0
aCkgeworICAgICAgICBpZiAoc3RhcnQgJiYgIWNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSkKKyAg
ICAgICAgICAgIGV4dHJhV2lkdGggKz0gZ2V0Qm9yZGVyUGFkZGluZ01hcmdpbih0b1JlbmRlckJv
eE1vZGVsT2JqZWN0KHBhcmVudCksIGZhbHNlKTsKKyAgICAgICAgaWYgKGVuZCAmJiAhY2hpbGQt
Pm5leHRTaWJsaW5nKCkpCisgICAgICAgICAgICBleHRyYVdpZHRoICs9IGdldEJvcmRlclBhZGRp
bmdNYXJnaW4odG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQpLCB0cnVlKTsKKyAgICAgICAg
Y2hpbGQgPSBwYXJlbnQ7CisgICAgICAgIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKKyAgICB9
CisgICAgcmV0dXJuIGV4dHJhV2lkdGg7Cit9CisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgV1RG
OjpSZWZDb3VudGVkTGVha0NvdW50ZXIgYmlkaVJ1bkNvdW50ZXIoIkJpZGlSdW4iKTsKKworc3Rh
dGljIGJvb2wgaW5CaWRpUnVuRGVzdHJveTsKKyNlbmRpZgorCit2b2lkIEJpZGlSdW46OmRlc3Ry
b3koKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBpbkJpZGlSdW5EZXN0cm95ID0gdHJ1ZTsKKyNl
bmRpZgorICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSA9IG1fb2JqZWN0LT5yZW5kZXJBcmVu
YSgpOworICAgIGRlbGV0ZSB0aGlzOworI2lmbmRlZiBOREVCVUcKKyAgICBpbkJpZGlSdW5EZXN0
cm95ID0gZmFsc2U7CisjZW5kaWYKKworICAgIC8vIFJlY292ZXIgdGhlIHNpemUgbGVmdCB0aGVy
ZSBmb3IgdXMgYnkgb3BlcmF0b3IgZGVsZXRlIGFuZCBmcmVlIHRoZSBtZW1vcnkuCisgICAgcmVu
ZGVyQXJlbmEtPmZyZWUoKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4odGhpcyksIHRoaXMpOwor
fQorCit2b2lkKiBCaWRpUnVuOjpvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBSZW5kZXJBcmVuYSog
cmVuZGVyQXJlbmEpIHRocm93KCkKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgYmlkaVJ1bkNvdW50
ZXIuaW5jcmVtZW50KCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmVuZGVyQXJlbmEtPmFsbG9jYXRl
KHN6KTsKK30KKwordm9pZCBCaWRpUnVuOjpvcGVyYXRvciBkZWxldGUodm9pZCogcHRyLCBzaXpl
X3Qgc3opCit7CisjaWZuZGVmIE5ERUJVRworICAgIGJpZGlSdW5Db3VudGVyLmRlY3JlbWVudCgp
OworI2VuZGlmCisgICAgQVNTRVJUKGluQmlkaVJ1bkRlc3Ryb3kpOworCisgICAgLy8gU3Rhc2gg
c2l6ZSB3aGVyZSBkZXN0cm95KCkgY2FuIGZpbmQgaXQuCisgICAgKihzaXplX3QqKXB0ciA9IHN6
OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJ
bmxpbmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQyKQoreworICAgIHJl
dHVybiBpdDEucG9zID09IGl0Mi5wb3MgJiYgaXQxLm9iaiA9PSBpdDIub2JqOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDEsIGNvbnN0IElubGlu
ZUl0ZXJhdG9yJiBpdDIpCit7CisgICAgcmV0dXJuIGl0MS5wb3MgIT0gaXQyLnBvcyB8fCBpdDEu
b2JqICE9IGl0Mi5vYmo7Cit9CisKK3N0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4
dChSZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVjdCogY3VycmVudCwgSW5saW5lQmlkaVJl
c29sdmVyKiByZXNvbHZlciA9IDAsIGJvb2wgc2tpcElubGluZXMgPSB0cnVlLCBib29sKiBlbmRP
ZklubGluZVB0ciA9IDApCit7CisgICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gMDsKKyAgICBib29s
IG9sZEVuZE9mSW5saW5lID0gZW5kT2ZJbmxpbmVQdHIgPyAqZW5kT2ZJbmxpbmVQdHIgOiBmYWxz
ZTsKKyAgICBib29sIGVuZE9mSW5saW5lID0gZmFsc2U7CisKKyAgICB3aGlsZSAoY3VycmVudCkg
eworICAgICAgICBuZXh0ID0gMDsKKyAgICAgICAgaWYgKCFvbGRFbmRPZklubGluZSAmJiAhY3Vy
cmVudC0+aXNGbG9hdGluZygpICYmICFjdXJyZW50LT5pc1JlcGxhY2VkKCkgJiYgIWN1cnJlbnQt
PmlzUG9zaXRpb25lZCgpICYmICFjdXJyZW50LT5pc1RleHQoKSkgeworICAgICAgICAgICAgbmV4
dCA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICYmIHJlc29s
dmVyICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAgICAgICAgICBFVW5pY29k
ZUJpZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOworICAgICAgICAgICAgICAg
IGlmICh1YiAhPSBVQk5vcm1hbCkgeworICAgICAgICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9u
IGRpciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBE
aXJlY3Rpb24gZCA9ICh1YiA9PSBFbWJlZAorICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGly
ID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRvUmlnaHRFbWJlZGRpbmcpCisg
ICAgICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRPdmVycmlk
ZSA6IExlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIt
PmVtYmVkKGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIGlmICghbmV4dCkgeworICAgICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiAh
b2xkRW5kT2ZJbmxpbmUgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICAg
ICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIGVuZE9mSW5saW5lID0gdHJ1
ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
d2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9jaykgeworICAgICAgICAgICAgICAgIGlm
IChyZXNvbHZlciAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpICYmIGN1cnJlbnQtPnN0eWxl
KCktPnVuaWNvZGVCaWRpKCkgIT0gVUJOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgIHJlc29s
dmVyLT5lbWJlZChQb3BEaXJlY3Rpb25hbEZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICBuZXh0
ID0gY3VycmVudC0+bmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUo
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gbmV4dC0+c3R5
bGUoKS0+dW5pY29kZUJpZGkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YiAhPSBV
Qk5vcm1hbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGly
ID0gbmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgRGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nOiBMZWZ0VG9SaWdodEVt
YmVkZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGlyID09IFJUTCA/
IFJpZ2h0VG9MZWZ0T3ZlcnJpZGUgOiBMZWZ0VG9SaWdodE92ZXJyaWRlKSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBj
dXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCFza2lwSW5s
aW5lcyAmJiBjdXJyZW50ICYmIGN1cnJlbnQgIT0gYmxvY2sgJiYgY3VycmVudC0+aXNSZW5kZXJJ
bmxpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudDsKKyAgICAgICAg
ICAgICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoIW5leHQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobmV4dC0+aXNU
ZXh0KCkgfHwgbmV4dC0+aXNGbG9hdGluZygpIHx8IG5leHQtPmlzUmVwbGFjZWQoKSB8fCBuZXh0
LT5pc1Bvc2l0aW9uZWQoKQorICAgICAgICAgICAgfHwgKCghc2tpcElubGluZXMgfHwgIW5leHQt
PmZpcnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJldHVybiBFTVBUWSBpbmxpbmVzLgorICAgICAgICAg
ICAgICAgICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpKQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgIH0KKworICAgIGlmIChlbmRPZklubGluZVB0cikK
KyAgICAgICAgKmVuZE9mSW5saW5lUHRyID0gZW5kT2ZJbmxpbmU7CisKKyAgICByZXR1cm4gbmV4
dDsKK30KKworc3RhdGljIFJlbmRlck9iamVjdCogYmlkaUZpcnN0KFJlbmRlckJsb2NrKiBibG9j
aywgSW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUp
Cit7CisgICAgaWYgKCFibG9jay0+Zmlyc3RDaGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICAKKyAgICBSZW5kZXJPYmplY3QqIG8gPSBibG9jay0+Zmlyc3RDaGlsZCgpOworICAgIGlmIChv
LT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgIGlmIChyZXNvbHZlcikgeworICAgICAgICAg
ICAgRVVuaWNvZGVCaWRpIHViID0gby0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKKyAgICAgICAg
ICAgIGlmICh1YiAhPSBVQk5vcm1hbCkgeworICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24g
ZGlyID0gby0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgRGlyZWN0aW9u
IGQgPSAodWIgPT0gRW1iZWQKKyAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJp
Z2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRvUmlnaHRFbWJlZGRpbmcpCisgICAgICAgICAgICAg
ICAgICAgIDogKGRpciA9PSBSVEwgPyBSaWdodFRvTGVmdE92ZXJyaWRlIDogTGVmdFRvUmlnaHRP
dmVycmlkZSkpOworICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChkKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcElubGluZXMgJiYgby0+Zmlyc3RDaGls
ZCgpKQorICAgICAgICAgICAgbyA9IGJpZGlOZXh0KGJsb2NrLCBvLCByZXNvbHZlciwgc2tpcElu
bGluZXMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5ldmVyIHNraXAgZW1wdHkg
aW5saW5lcy4KKyAgICAgICAgICAgIGlmIChyZXNvbHZlcikKKyAgICAgICAgICAgICAgICByZXNv
bHZlci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBvOyAK
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvICYmICFvLT5pc1RleHQoKSAmJiAhby0+aXNS
ZXBsYWNlZCgpICYmICFvLT5pc0Zsb2F0aW5nKCkgJiYgIW8tPmlzUG9zaXRpb25lZCgpKQorICAg
ICAgICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29sdmVyLCBza2lwSW5saW5lcyk7CisKKyAg
ICBpZiAocmVzb2x2ZXIpCisgICAgICAgIHJlc29sdmVyLT5jb21taXRFeHBsaWNpdEVtYmVkZGlu
ZygpOworICAgIHJldHVybiBvOworfQorCitpbmxpbmUgdm9pZCBJbmxpbmVJdGVyYXRvcjo6aW5j
cmVtZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIpCit7CisgICAgaWYgKCFvYmopCisg
ICAgICAgIHJldHVybjsKKyAgICBpZiAob2JqLT5pc1RleHQoKSkgeworICAgICAgICBwb3MrKzsK
KyAgICAgICAgaWYgKHBvcyA+PSB0b1JlbmRlclRleHQob2JqKS0+dGV4dExlbmd0aCgpKSB7Cisg
ICAgICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2JqLCByZXNvbHZlcik7CisgICAgICAg
ICAgICBwb3MgPSAwOworICAgICAgICAgICAgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2Jq
LCByZXNvbHZlcik7CisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIG5leHRCcmVha2FibGVQb3Np
dGlvbiA9IC0xOworICAgIH0KK30KKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgSW5saW5lQmlk
aVJlc29sdmVyOjppbmNyZW1lbnQoKQoreworICAgIGN1cnJlbnQuaW5jcmVtZW50KHRoaXMpOwor
fQorCitpbmxpbmUgYm9vbCBJbmxpbmVJdGVyYXRvcjo6YXRFbmQoKSBjb25zdAoreworICAgIHJl
dHVybiAhb2JqOworfQorCitpbmxpbmUgVUNoYXIgSW5saW5lSXRlcmF0b3I6OmN1cnJlbnQoKSBj
b25zdAoreworICAgIGlmICghb2JqIHx8ICFvYmotPmlzVGV4dCgpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQob2JqKTsKKyAgICBpZiAo
cG9zID49IHRleHQtPnRleHRMZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1
cm4gdGV4dC0+Y2hhcmFjdGVycygpW3Bvc107Cit9CisKK0FMV0FZU19JTkxJTkUgRGlyZWN0aW9u
IElubGluZUl0ZXJhdG9yOjpkaXJlY3Rpb24oKSBjb25zdAoreworICAgIGlmIChVQ2hhciBjID0g
Y3VycmVudCgpKQorICAgICAgICByZXR1cm4gVW5pY29kZTo6ZGlyZWN0aW9uKGMpOworCisgICAg
aWYgKG9iaiAmJiBvYmotPmlzTGlzdE1hcmtlcigpKQorICAgICAgICByZXR1cm4gb2JqLT5zdHls
ZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBMZWZ0VG9SaWdodCA6IFJpZ2h0VG9MZWZ0OworCisg
ICAgcmV0dXJuIE90aGVyTmV1dHJhbDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBjaG9wTWlkcG9pbnRzQXQoTGluZU1pZHBv
aW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5kZXJPYmplY3QqIG9iaiwgdW5zaWduZWQg
cG9zKQoreworICAgIGlmICghbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKQorICAgICAg
ICByZXR1cm47CisgICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0
YXRlLm1pZHBvaW50cy5kYXRhKCk7CisgICAgZm9yIChpbnQgaSA9IGxpbmVNaWRwb2ludFN0YXRl
Lm51bU1pZHBvaW50cyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBwb2ludCA9IG1pZHBvaW50c1tpXTsKKyAgICAgICAgaWYgKHBvaW50Lm9iaiA9PSBv
YmogJiYgcG9pbnQucG9zID09IHBvcykgeworICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUu
bnVtTWlkcG9pbnRzID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQor
fQorCitzdGF0aWMgdm9pZCBjaGVja01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1p
ZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yJiBsQnJlYWspCit7CisgICAgLy8gQ2hlY2sgdG8g
c2VlIGlmIG91ciBsYXN0IG1pZHBvaW50IGlzIGEgc3RhcnQgcG9pbnQgYmV5b25kIHRoZSBsaW5l
IGJyZWFrLiAgSWYgc28sCisgICAgLy8gc2hhdmUgaXQgb2ZmIHRoZSBsaXN0LCBhbmQgc2hhdmUg
b2ZmIGEgdHJhaWxpbmcgc3BhY2UgaWYgdGhlIHByZXZpb3VzIGVuZCBwb2ludCBkb2Vzbid0Cisg
ICAgLy8gcHJlc2VydmUgd2hpdGVzcGFjZS4KKyAgICBpZiAobEJyZWFrLm9iaiAmJiBsaW5lTWlk
cG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgIShsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2lu
dHMgJSAyKSkgeworICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBv
aW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3ImIGVuZHBv
aW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDJdOworICAg
ICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlk
cG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3IgY3Vy
cnBvaW50ID0gZW5kcG9pbnQ7CisgICAgICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5kKCkgJiYg
Y3VycnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9IGxCcmVhaykKKyAgICAgICAg
ICAgIGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKKyAgICAgICAgaWYgKGN1cnJwb2ludCA9PSBsQnJl
YWspIHsKKyAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUgdGhlIHN0
YXJ0IHBvaW50LiAgU2hhdmUgb2ZmIHRoZSBzdGFydCBwb2ludC4KKyAgICAgICAgICAgIGxpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOworICAgICAgICAgICAgaWYgKGVuZHBvaW50Lm9i
ai0+c3R5bGUoKS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAo
ZW5kcG9pbnQub2JqLT5pc1RleHQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBz
aGF2ZSBhIGNoYXJhY3RlciBvZmYgdGhlIGVuZHBvaW50IGlmIGl0IHdhcyBmcm9tIGEgc29mdCBo
eXBoZW4uCisgICAgICAgICAgICAgICAgICAgIFJlbmRlclRleHQqIHRleHRPYmogPSB0b1JlbmRl
clRleHQoZW5kcG9pbnQub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50LnBv
cyArIDEgPCB0ZXh0T2JqLT50ZXh0TGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmICh0ZXh0T2JqLT5jaGFyYWN0ZXJzKClbZW5kcG9pbnQucG9zKzFdID09IHNvZnRIeXBoZW4p
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAg
ICB9IGVsc2UgaWYgKHN0YXJ0cG9pbnQub2JqLT5pc1RleHQoKSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgUmVuZGVyVGV4dCAqc3RhcnRUZXh0ID0gdG9SZW5kZXJUZXh0KHN0YXJ0cG9pbnQu
b2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFRleHQtPnRleHRMZW5ndGgo
KSAmJiBzdGFydFRleHQtPmNoYXJhY3RlcnMoKVswXSA9PSBzb2Z0SHlwaGVuKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmRwb2ludC5wb3MtLTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0gICAgCit9CisKK3N0YXRpYyB2b2lkIGFkZE1pZHBvaW50KExp
bmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3Im
IG1pZHBvaW50KQoreworICAgIGlmIChsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMuc2l6ZSgp
IDw9IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cykKKyAgICAgICAgbGluZU1pZHBvaW50
U3RhdGUubWlkcG9pbnRzLmdyb3cobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICsgMTAp
OworCisgICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0YXRlLm1p
ZHBvaW50cy5kYXRhKCk7CisgICAgbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBv
aW50cysrXSA9IG1pZHBvaW50OworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2JqZWN0
KGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiBvYmosIElubGluZUJpZGlSZXNvbHZl
ciYgcmVzb2x2ZXIpCit7CisgICAgaWYgKHN0YXJ0ID4gZW5kIHx8IG9iai0+aXNGbG9hdGluZygp
IHx8CisgICAgICAgIChvYmotPmlzUG9zaXRpb25lZCgpICYmICFvYmotPnN0eWxlKCktPmhhc1N0
YXRpY1goKSAmJiAhb2JqLT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkgJiYgIW9iai0+Y29udGFpbmVy
KCktPmlzUmVuZGVySW5saW5lKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBMaW5lTWlkcG9p
bnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUgPSByZXNvbHZlci5taWRwb2ludFN0YXRlKCk7Cisg
ICAgYm9vbCBoYXZlTmV4dE1pZHBvaW50ID0gKGxpbmVNaWRwb2ludFN0YXRlLmN1cnJlbnRNaWRw
b2ludCA8IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyk7CisgICAgSW5saW5lSXRlcmF0
b3IgbmV4dE1pZHBvaW50OworICAgIGlmIChoYXZlTmV4dE1pZHBvaW50KQorICAgICAgICBuZXh0
TWlkcG9pbnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUu
Y3VycmVudE1pZHBvaW50XTsKKyAgICBpZiAobGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBv
aW50cykgeworICAgICAgICBpZiAoIShoYXZlTmV4dE1pZHBvaW50ICYmIG5leHRNaWRwb2ludC5v
YmogPT0gb2JqKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhpcyBpcyBhIG5l
dyBzdGFydCBwb2ludC4gU3RvcCBpZ25vcmluZyBvYmplY3RzIGFuZCAKKyAgICAgICAgLy8gYWRq
dXN0IG91ciBzdGFydC4KKyAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50
cyA9IGZhbHNlOworICAgICAgICBzdGFydCA9IG5leHRNaWRwb2ludC5wb3M7CisgICAgICAgIGxp
bmVNaWRwb2ludFN0YXRlLmN1cnJlbnRNaWRwb2ludCsrOworICAgICAgICBpZiAoc3RhcnQgPCBl
bmQpCisgICAgICAgICAgICByZXR1cm4gYXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgZW5kLCBv
YmosIHJlc29sdmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWhhdmVOZXh0TWlkcG9p
bnQgfHwgKG9iaiAhPSBuZXh0TWlkcG9pbnQub2JqKSkgeworICAgICAgICAgICAgcmVzb2x2ZXIu
YWRkUnVuKG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKSBCaWRpUnVuKHN0YXJ0LCBlbmQsIG9iaiwg
cmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisKKyAgICAgICAgLy8gQW4gZW5kIG1pZHBvaW50IGhhcyBiZWVuIGVuY291
bnRlcmVkIHdpdGhpbiBvdXIgb2JqZWN0LiAgV2UKKyAgICAgICAgLy8gbmVlZCB0byBnbyBhaGVh
ZCBhbmQgYXBwZW5kIGEgcnVuIHdpdGggb3VyIGVuZHBvaW50LgorICAgICAgICBpZiAoc3RhdGlj
X2Nhc3Q8aW50PihuZXh0TWlkcG9pbnQucG9zICsgMSkgPD0gZW5kKSB7CisgICAgICAgICAgICBs
aW5lTWlkcG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRzID0gdHJ1ZTsKKyAgICAgICAgICAgIGxp
bmVNaWRwb2ludFN0YXRlLmN1cnJlbnRNaWRwb2ludCsrOworICAgICAgICAgICAgaWYgKG5leHRN
aWRwb2ludC5wb3MgIT0gVUlOVF9NQVgpIHsgLy8gVUlOVF9NQVggbWVhbnMgc3RvcCBhdCB0aGUg
b2JqZWN0IGFuZCBkb24ndCBpbmNsdWRlIGFueSBvZiBpdC4KKyAgICAgICAgICAgICAgICBpZiAo
c3RhdGljX2Nhc3Q8aW50PihuZXh0TWlkcG9pbnQucG9zICsgMSkgPiBzdGFydCkKKyAgICAgICAg
ICAgICAgICAgICAgcmVzb2x2ZXIuYWRkUnVuKG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgQmlkaVJ1bihzdGFydCwgbmV4dE1pZHBvaW50LnBvcyArIDEs
IG9iaiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOworICAgICAgICAgICAg
ICAgIHJldHVybiBhcHBlbmRSdW5zRm9yT2JqZWN0KG5leHRNaWRwb2ludC5wb3MgKyAxLCBlbmQs
IG9iaiwgcmVzb2x2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgcmVzb2x2ZXIuYWRkUnVuKG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKSBCaWRpUnVuKHN0YXJ0
LCBlbmQsIG9iaiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOworICAgIH0K
K30KKwordGVtcGxhdGUgPD4KK3ZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBlbmRSdW4oKQor
eworICAgIGlmICghZW1wdHlSdW4gJiYgIWVvci5hdEVuZCgpKSB7CisgICAgICAgIGludCBzdGFy
dCA9IHNvci5wb3M7CisgICAgICAgIFJlbmRlck9iamVjdCAqb2JqID0gc29yLm9iajsKKyAgICAg
ICAgd2hpbGUgKG9iaiAmJiBvYmogIT0gZW9yLm9iaiAmJiBvYmogIT0gZW5kT2ZMaW5lLm9iaikg
eworICAgICAgICAgICAgYXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgb2JqLT5sZW5ndGgoKSwg
b2JqLCAqdGhpcyk7ICAgICAgICAKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAg
IG9iaiA9IGJpZGlOZXh0KHNvci5ibG9jaywgb2JqKTsKKyAgICAgICAgfQorICAgICAgICBpZiAo
b2JqKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBwb3MgPSBvYmogPT0gZW9yLm9iaiA/IGVvci5w
b3MgOiBVSU5UX01BWDsKKyAgICAgICAgICAgIGlmIChvYmogPT0gZW5kT2ZMaW5lLm9iaiAmJiBl
bmRPZkxpbmUucG9zIDw9IHBvcykgeworICAgICAgICAgICAgICAgIHJlYWNoZWRFbmRPZkxpbmUg
PSB0cnVlOworICAgICAgICAgICAgICAgIHBvcyA9IGVuZE9mTGluZS5wb3M7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGFkZCBydW5zIGZvciB6ZXJvLWxlbmd0aCBS
ZW5kZXJPYmplY3RzLCBqdXN0IGRvbid0IG1ha2UgdGhlIHJ1biBsYXJnZXIgdGhhbiBpdCBzaG91
bGQgYmUKKyAgICAgICAgICAgIGludCBlbmQgPSBvYmotPmxlbmd0aCgpID8gcG9zKzEgOiAwOwor
ICAgICAgICAgICAgYXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgZW5kLCBvYmosICp0aGlzKTsK
KyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZW9yLmluY3JlbWVudCgpOworICAgICAgICBz
b3IgPSBlb3I7CisgICAgfQorCisgICAgbV9kaXJlY3Rpb24gPSBPdGhlck5ldXRyYWw7CisgICAg
bV9zdGF0dXMuZW9yID0gT3RoZXJOZXV0cmFsOworfQorCitzdGF0aWMgaW5saW5lIElubGluZUJv
eCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNS
b290TGluZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxzZSkKK3sKKyAgICBpZiAoaXNSb290TGlu
ZUJveCkKKyAgICAgICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sob2JqKS0+Y3JlYXRlQW5kQXBwZW5k
Um9vdElubGluZUJveCgpOworICAgIAorICAgIGlmIChvYmotPmlzVGV4dCgpKSB7CisgICAgICAg
IElubGluZVRleHRCb3gqIHRleHRCb3ggPSB0b1JlbmRlclRleHQob2JqKS0+Y3JlYXRlSW5saW5l
VGV4dEJveCgpOworICAgICAgICAvLyBXZSBvbmx5IHRyZWF0IGEgYm94IGFzIHRleHQgZm9yIGEg
PGJyPiBpZiB3ZSBhcmUgb24gYSBsaW5lIGJ5IG91cnNlbGYgb3IgaW4gc3RyaWN0IG1vZGUKKyAg
ICAgICAgLy8gKE5vdGUgdGhlIHVzZSBvZiBzdHJpY3QgbW9kZS4gIEluICJhbG1vc3Qgc3RyaWN0
IiBtb2RlLCB3ZSBkb24ndCB0cmVhdCB0aGUgYm94IGZvciA8YnI+IGFzIHRleHQuKQorICAgICAg
ICBpZiAob2JqLT5pc0JSKCkpCisgICAgICAgICAgICB0ZXh0Qm94LT5zZXRJc1RleHQoaXNPbmx5
UnVuIHx8IG9iai0+ZG9jdW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOworICAgICAgICByZXR1cm4g
dGV4dEJveDsKKyAgICB9CisgICAgCisgICAgaWYgKG9iai0+aXNCb3goKSkKKyAgICAgICAgcmV0
dXJuIHRvUmVuZGVyQm94KG9iaiktPmNyZWF0ZUlubGluZUJveCgpOworICAgIAorICAgIHJldHVy
biB0b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCk7Cit9
CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRlcmVyKFJlbmRlck9i
amVjdCogbywgYm9vbCBmdWxsTGF5b3V0KQoreworICAgIGlmIChvLT5pc1RleHQoKSkgeworICAg
ICAgICBpZiAoby0+cHJlZldpZHRoc0RpcnR5KCkgJiYgby0+aXNDb3VudGVyKCkpCisgICAgICAg
ICAgICB0b1JlbmRlclRleHQobyktPmNhbGNQcmVmV2lkdGhzKDApOyAvLyBGSVhNRTogQ291bnRl
cnMgZGVwZW5kIG9uIHRoaXMgaGFjay4gTm8gY2x1ZSB3aHkuIFNob3VsZCBiZSBpbnZlc3RpZ2F0
ZWQgYW5kIHJlbW92ZWQuCisgICAgICAgIHRvUmVuZGVyVGV4dChvKS0+ZGlydHlMaW5lQm94ZXMo
ZnVsbExheW91dCk7CisgICAgfSBlbHNlCisgICAgICAgIHRvUmVuZGVySW5saW5lKG8pLT5kaXJ0
eUxpbmVCb3hlcyhmdWxsTGF5b3V0KTsKK30KKworSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2s6
OmNyZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBmaXJzdExpbmUpCit7Cisg
ICAgLy8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBsaW5lIGJveCBmb3IgdGhpcyBv
YmplY3QgdGhhdCBpcyBhbHNvCisgICAgLy8gdGhlIGxhc3QgaXRlbSBvbiB0aGUgbGluZS4KKyAg
ICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOworICAgIElubGluZUZsb3dCb3gqIGNoaWxkQm94ID0g
MDsKKyAgICBJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3ggPSAwOworICAgIElubGluZUZsb3dCb3gq
IHJlc3VsdCA9IDA7CisgICAgZG8geworICAgICAgICBBU1NFUlQob2JqLT5pc1JlbmRlcklubGlu
ZSgpIHx8IG9iaiA9PSB0aGlzKTsKKyAgICAgICAgCisgICAgICAgIC8vIEdldCB0aGUgbGFzdCBi
b3ggd2UgbWFkZSBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LgorICAgICAgICBwYXJlbnRCb3ggPSBv
YmotPmlzUmVuZGVySW5saW5lKCkgPyB0b1JlbmRlcklubGluZShvYmopLT5sYXN0TGluZUJveCgp
IDogdG9SZW5kZXJCbG9jayhvYmopLT5sYXN0TGluZUJveCgpOworCisgICAgICAgIC8vIElmIHRo
aXMgYm94IGlzIGNvbnN0cnVjdGVkIHRoZW4gaXQgaXMgZnJvbSBhIHByZXZpb3VzIGxpbmUsIGFu
ZCB3ZSBuZWVkCisgICAgICAgIC8vIHRvIG1ha2UgYSBuZXcgYm94IGZvciBvdXIgbGluZS4gIElm
IHRoaXMgYm94IGlzIHVuY29uc3RydWN0ZWQgYnV0IGl0IGhhcworICAgICAgICAvLyBzb21ldGhp
bmcgZm9sbG93aW5nIGl0IG9uIHRoZSBsaW5lLCB0aGVuIHdlIGtub3cgd2UgaGF2ZSB0byBtYWtl
IGEgbmV3IGJveAorICAgICAgICAvLyBhcyB3ZWxsLiAgSW4gdGhpcyBzaXR1YXRpb24gb3VyIGlu
bGluZSBoYXMgYWN0dWFsbHkgYmVlbiBzcGxpdCBpbiB0d28gb24KKyAgICAgICAgLy8gdGhlIHNh
bWUgbGluZSAodGhpcyBjYW4gaGFwcGVuIHdpdGggdmVyeSBmYW5jeSBsYW5ndWFnZSBtaXh0dXJl
cykuCisgICAgICAgIGJvb2wgY29uc3RydWN0ZWROZXdCb3ggPSBmYWxzZTsKKyAgICAgICAgaWYg
KCFwYXJlbnRCb3ggfHwgcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgfHwgcGFyZW50Qm94LT5u
ZXh0T25MaW5lKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBhIG5ldyBib3gg
Zm9yIHRoaXMgcmVuZGVyIG9iamVjdC4gIE9uY2UKKyAgICAgICAgICAgIC8vIG1hZGUsIHdlIG5l
ZWQgdG8gcGxhY2UgaXQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgorICAgICAgICAg
ICAgSW5saW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9i
aiA9PSB0aGlzKTsKKyAgICAgICAgICAgIEFTU0VSVChuZXdCb3gtPmlzSW5saW5lRmxvd0JveCgp
KTsKKyAgICAgICAgICAgIHBhcmVudEJveCA9IHN0YXRpY19jYXN0PElubGluZUZsb3dCb3gqPihu
ZXdCb3gpOworICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRGaXJzdExpbmVTdHlsZUJpdChmaXJz
dExpbmUpOworICAgICAgICAgICAgY29uc3RydWN0ZWROZXdCb3ggPSB0cnVlOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRCb3g7
CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGJsb2NrIGl0c2VsZiwgdGhlbiB8Ym94
fCByZXByZXNlbnRzIHRoZSByb290CisgICAgICAgIC8vIGlubGluZSBib3ggZm9yIHRoZSBsaW5l
LCBhbmQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGFwcGVuZGVkIHRvIGFueSBwYXJlbnQKKyAgICAg
ICAgLy8gaW5saW5lLgorICAgICAgICBpZiAoY2hpbGRCb3gpCisgICAgICAgICAgICBwYXJlbnRC
b3gtPmFkZFRvTGluZShjaGlsZEJveCk7CisKKyAgICAgICAgaWYgKCFjb25zdHJ1Y3RlZE5ld0Jv
eCB8fCBvYmogPT0gdGhpcykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNoaWxkQm94
ID0gcGFyZW50Qm94OyAgICAgICAgCisKKyAgICAgICAgLy8gSWYgd2UndmUgZXhjZWVkZWQgb3Vy
IGxpbmUgZGVwdGgsIHRoZW4ganVtcCBzdHJhaWdodCB0byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwg
dGhlIHJlbWFpbmluZworICAgICAgICAvLyBpbnRlcm1lZGlhdGUgaW5saW5lIGZsb3dzLgorICAg
ICAgICBvYmogPSAoKytsaW5lRGVwdGggPj0gY01heExpbmVEZXB0aCkgPyB0aGlzIDogb2JqLT5w
YXJlbnQoKTsKKworICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30K
KworUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNvbnN0cnVjdExpbmUodW5zaWduZWQgcnVu
Q291bnQsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiBsYXN0UnVuLCBib29sIGZpcnN0TGlu
ZSwgYm9vbCBsYXN0TGluZSwgUmVuZGVyT2JqZWN0KiBlbmRPYmplY3QpCit7CisgICAgQVNTRVJU
KGZpcnN0UnVuKTsKKworICAgIElubGluZUZsb3dCb3gqIHBhcmVudEJveCA9IDA7CisgICAgZm9y
IChCaWRpUnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5uZXh0KCkpIHsKKyAgICAgICAgLy8g
Q3JlYXRlIGEgYm94IGZvciBvdXIgb2JqZWN0LgorICAgICAgICBib29sIGlzT25seVJ1biA9IChy
dW5Db3VudCA9PSAxKTsKKyAgICAgICAgaWYgKHJ1bkNvdW50ID09IDIgJiYgIXItPm1fb2JqZWN0
LT5pc0xpc3RNYXJrZXIoKSkKKyAgICAgICAgICAgIGlzT25seVJ1biA9ICgoc3R5bGUoKS0+ZGly
ZWN0aW9uKCkgPT0gUlRMKSA/IGxhc3RSdW4gOiBmaXJzdFJ1biktPm1fb2JqZWN0LT5pc0xpc3RN
YXJrZXIoKTsKKworICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlubGluZUJveEZvclJl
bmRlcmVyKHItPm1fb2JqZWN0LCBmYWxzZSwgaXNPbmx5UnVuKTsKKyAgICAgICAgci0+bV9ib3gg
PSBib3g7CisKKyAgICAgICAgQVNTRVJUKGJveCk7CisgICAgICAgIGlmICghYm94KQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94IHll
dCwgb3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKKyAgICAgICAgLy8gdGhl
biB3ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHByb3Bl
cmx5IGVuY2xvc2UgdGhlCisgICAgICAgIC8vIHJ1bidzIGlubGluZSBib3guCisgICAgICAgIGlm
ICghcGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5tX29iamVjdC0+cGFy
ZW50KCkpCisgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGlubGluZSBib3hlcyBhbGwgdGhlIHdh
eSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCisgICAgICAgICAgICBw
YXJlbnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoci0+bV9vYmplY3QtPnBhcmVudCgpLCBmaXJzdExp
bmUpOworCisgICAgICAgIC8vIEFwcGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUuCisg
ICAgICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGJveCk7CisKKyAgICAgICAgYm9vbCB2aXN1YWxs
eU9yZGVyZWQgPSByLT5tX29iamVjdC0+c3R5bGUoKS0+dmlzdWFsbHlPcmRlcmVkKCk7CisgICAg
ICAgIGJveC0+c2V0QmlkaUxldmVsKHZpc3VhbGx5T3JkZXJlZCA/IDAgOiByLT5sZXZlbCgpKTsK
KworICAgICAgICBpZiAoYm94LT5pc0lubGluZVRleHRCb3goKSkgeworICAgICAgICAgICAgSW5s
aW5lVGV4dEJveCogdGV4dCA9IHN0YXRpY19jYXN0PElubGluZVRleHRCb3gqPihib3gpOworICAg
ICAgICAgICAgdGV4dC0+c2V0U3RhcnQoci0+bV9zdGFydCk7CisgICAgICAgICAgICB0ZXh0LT5z
ZXRMZW4oci0+bV9zdG9wIC0gci0+bV9zdGFydCk7CisgICAgICAgICAgICB0ZXh0LT5tX2Rpck92
ZXJyaWRlID0gci0+ZGlyT3ZlcnJpZGUodmlzdWFsbHlPcmRlcmVkKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcm9vdCBpbmxpbmUgYm94LiAgSXQgc2hvdWxk
IGJlIHVuY29uc3RydWN0ZWQgYW5kCisgICAgLy8gYmUgdGhlIGxhc3QgY29udGludWF0aW9uIG9m
IG91ciBsaW5lIGxpc3QuCisgICAgQVNTRVJUKGxhc3RMaW5lQm94KCkgJiYgIWxhc3RMaW5lQm94
KCktPmlzQ29uc3RydWN0ZWQoKSk7CisKKyAgICAvLyBTZXQgYml0cyBvbiBvdXIgaW5saW5lIGZs
b3cgYm94ZXMgdGhhdCBpbmRpY2F0ZSB3aGljaCBzaWRlcyBzaG91bGQKKyAgICAvLyBwYWludCBi
b3JkZXJzL21hcmdpbnMvcGFkZGluZy4gIFRoaXMga25vd2xlZGdlIHdpbGwgdWx0aW1hdGVseSBi
ZSB1c2VkIHdoZW4KKyAgICAvLyB3ZSBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgcG9zaXRpb25z
IGFuZCB3aWR0aHMgb2YgYWxsIHRoZSBpbmxpbmUgYm94ZXMgb24KKyAgICAvLyB0aGUgbGluZS4K
KyAgICBsYXN0TGluZUJveCgpLT5kZXRlcm1pbmVTcGFjaW5nRm9yRmxvd0JveGVzKGxhc3RMaW5l
LCBlbmRPYmplY3QpOworCisgICAgLy8gTm93IG1hcmsgdGhlIGxpbmUgYm94ZXMgYXMgYmVpbmcg
Y29uc3RydWN0ZWQuCisgICAgbGFzdExpbmVCb3goKS0+c2V0Q29uc3RydWN0ZWQoKTsKKworICAg
IC8vIFJldHVybiB0aGUgbGFzdCBsaW5lLgorICAgIHJldHVybiBsYXN0Um9vdEJveCgpOworfQor
Cit2b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUoUm9v
dElubGluZUJveCogbGluZUJveCwgYm9vbCBmaXJzdExpbmUsIEJpZGlSdW4qIGZpcnN0UnVuLCBC
aWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQpCit7CisgICAgLy8gRmly
c3QgZGV0ZXJtaW5lIG91ciB0b3RhbCB3aWR0aC4KKyAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBs
aW5lV2lkdGgoaGVpZ2h0KCksIGZpcnN0TGluZSk7CisgICAgaW50IHRvdFdpZHRoID0gbGluZUJv
eC0+Z2V0Rmxvd1NwYWNpbmdXaWR0aCgpOworICAgIGJvb2wgbmVlZHNXb3JkU3BhY2luZyA9IGZh
bHNlOworICAgIHVuc2lnbmVkIG51bVNwYWNlcyA9IDA7CisgICAgRVRleHRBbGlnbiB0ZXh0QWxp
Z24gPSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKKworICAgIGZvciAoQmlkaVJ1biogciA9IGZpcnN0
UnVuOyByOyByID0gci0+bmV4dCgpKSB7CisgICAgICAgIGlmICghci0+bV9ib3ggfHwgci0+bV9v
YmplY3QtPmlzUG9zaXRpb25lZCgpIHx8IHItPm1fYm94LT5pc0xpbmVCcmVhaygpKQorICAgICAg
ICAgICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0aWNpcGF0
aW5nIHRvIGZpZ3VyZSBvdXQgdGhlaXIKKyAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0
IHN0YXRpYyB4IHBvc2l0aW9uLiAgVGhleSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lkdGguCisg
ICAgICAgICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCBsaW5lIGJyZWFrIGJveGVzIGhhdmUg
bm8gZWZmZWN0IG9uIHRoZSB3aWR0aC4KKyAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc1RleHQo
KSkgeworICAgICAgICAgICAgUmVuZGVyVGV4dCogcnQgPSB0b1JlbmRlclRleHQoci0+bV9vYmpl
Y3QpOworCisgICAgICAgICAgICBpZiAodGV4dEFsaWduID09IEpVU1RJRlkgJiYgciAhPSB0cmFp
bGluZ1NwYWNlUnVuKSB7CisgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMg
PSBydC0+Y2hhcmFjdGVycygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSByLT5tX3N0
YXJ0OyBpIDwgci0+bV9zdG9wOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgVUNoYXIgYyA9
IGNoYXJhY3RlcnNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcgJyB8fCBjID09
ICdcbicgfHwgYyA9PSAnXHQnKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3BhY2VzKys7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW50
IGxlbmd0aCA9IHJ0LT50ZXh0TGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXItPm1f
c3RhcnQgJiYgbmVlZHNXb3JkU3BhY2luZyAmJiBpc1NwYWNlT3JOZXdsaW5lKHJ0LT5jaGFyYWN0
ZXJzKClbci0+bV9zdGFydF0pKQorICAgICAgICAgICAgICAgICAgICB0b3RXaWR0aCArPSBydC0+
c3R5bGUoZmlyc3RMaW5lKS0+Zm9udCgpLndvcmRTcGFjaW5nKCk7CisgICAgICAgICAgICAgICAg
bmVlZHNXb3JkU3BhY2luZyA9ICFpc1NwYWNlT3JOZXdsaW5lKHJ0LT5jaGFyYWN0ZXJzKClbci0+
bV9zdG9wIC0gMV0pICYmIHItPm1fc3RvcCA9PSBsZW5ndGg7ICAgICAgICAgIAorICAgICAgICAg
ICAgfQorICAgICAgICAgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNr
Rm9udHM7CisgICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgocnQtPndpZHRoKHItPm1fc3Rh
cnQsIHItPm1fc3RvcCAtIHItPm1fc3RhcnQsIHRvdFdpZHRoLCBmaXJzdExpbmUsICZmYWxsYmFj
a0ZvbnRzKSk7CisgICAgICAgICAgICBpZiAoIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpCisjaWYg
RU5BQkxFKFNWRykKKyAgICAgICAgICAgICAgICAgICAgJiYgIWlzU1ZHVGV4dCgpCisjZW5kaWYK
KyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIEFTU0VSVChyLT5tX2JveC0+aXNUZXh0
KCkpOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElubGluZVRleHRCb3gqPihyLT5tX2Jv
eCktPnNldEZhbGxiYWNrRm9udHMoZmFsbGJhY2tGb250cyk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZSBpZiAoIXItPm1fb2JqZWN0LT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAg
ICAgICBSZW5kZXJCb3gqIHJlbmRlckJveCA9IHRvUmVuZGVyQm94KHItPm1fb2JqZWN0KTsKKyAg
ICAgICAgICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7CisgICAgICAgICAgICByLT5tX2JveC0+
c2V0V2lkdGgocmVuZGVyQm94LT53aWR0aCgpKTsKKyAgICAgICAgICAgIHRvdFdpZHRoICs9IHJl
bmRlckJveC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOworICAgICAg
ICB9CisKKyAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7CisgICAgfQorCisg
ICAgLy8gQXJtZWQgd2l0aCB0aGUgdG90YWwgd2lkdGggb2YgdGhlIGxpbmUgKHdpdGhvdXQganVz
dGlmaWNhdGlvbiksCisgICAgLy8gd2Ugbm93IGV4YW1pbmUgb3VyIHRleHQtYWxpZ24gcHJvcGVy
dHkgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHBvc2l0aW9uIHRoZQorICAgIC8vIG9i
amVjdHMgaG9yaXpvbnRhbGx5LiAgVGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBsaW5lIGNhbiBiZSBp
bmNyZWFzZWQgaWYgd2UgZW5kIHVwCisgICAgLy8ganVzdGlmeWluZyB0ZXh0LgorICAgIGludCB4
ID0gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsKKyAgICBzd2l0Y2ggKHRleHRBbGln
bikgeworICAgICAgICBjYXNlIExFRlQ6CisgICAgICAgIGNhc2UgV0VCS0lUX0xFRlQ6CisgICAg
ICAgICAgICAvLyBUaGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jayBzaG91bGQgZGV0ZXJtaW5lIHdo
YXQgaGFwcGVucyB3aXRoIHdpZGUgbGluZXMuICBJbgorICAgICAgICAgICAgLy8gcGFydGljdWxh
ciB3aXRoIFJUTCBibG9ja3MsIHdpZGUgbGluZXMgc2hvdWxkIHN0aWxsIHNwaWxsIG91dCB0byB0
aGUgbGVmdC4KKyAgICAgICAgICAgIGlmIChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpIHsK
KyAgICAgICAgICAgICAgICBpZiAodG90V2lkdGggPiBhdmFpbGFibGVXaWR0aCAmJiB0cmFpbGlu
Z1NwYWNlUnVuKQorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+
c2V0V2lkdGgobWF4KDAsIHRyYWlsaW5nU3BhY2VSdW4tPm1fYm94LT53aWR0aCgpIC0gdG90V2lk
dGggKyBhdmFpbGFibGVXaWR0aCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBpZiAodHJhaWxpbmdTcGFjZVJ1bikKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdT
cGFjZVJ1bi0+bV9ib3gtPnNldFdpZHRoKDApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRv
dFdpZHRoID4gYXZhaWxhYmxlV2lkdGgpCisgICAgICAgICAgICAgICAgICAgIHggLT0gKHRvdFdp
ZHRoIC0gYXZhaWxhYmxlV2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgSlVTVElGWToKKyAgICAgICAgICAgIGlmIChudW1TcGFjZXMgJiYgIXJl
YWNoZWRFbmQgJiYgIWxpbmVCb3gtPmVuZHNXaXRoQnJlYWsoKSkgeworICAgICAgICAgICAgICAg
IGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdFdpZHRoIC09
IHRyYWlsaW5nU3BhY2VSdW4tPm1fYm94LT53aWR0aCgpOworICAgICAgICAgICAgICAgICAgICB0
cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+c2V0V2lkdGgoMCk7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFs
bCB0aHJvdWdoCisgICAgICAgIGNhc2UgVEFBVVRPOgorICAgICAgICAgICAgbnVtU3BhY2VzID0g
MDsKKyAgICAgICAgICAgIC8vIGZvciByaWdodCB0byBsZWZ0IGZhbGwgdGhyb3VnaCB0byByaWdo
dCBhbGlnbmVkCisgICAgICAgICAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKSB7
CisgICAgICAgICAgICAgICAgaWYgKHRvdFdpZHRoID4gYXZhaWxhYmxlV2lkdGggJiYgdHJhaWxp
bmdTcGFjZVJ1bikKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9ib3gt
PnNldFdpZHRoKG1heCgwLCB0cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+d2lkdGgoKSAtIHRvdFdp
ZHRoICsgYXZhaWxhYmxlV2lkdGgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBSSUdIVDoKKyAgICAgICAgY2FzZSBXRUJLSVRfUklHSFQ6Cisg
ICAgICAgICAgICAvLyBXaWRlIGxpbmVzIHNwaWxsIG91dCBvZiB0aGUgYmxvY2sgYmFzZWQgb2Zm
IGRpcmVjdGlvbi4KKyAgICAgICAgICAgIC8vIFNvIGV2ZW4gaWYgdGV4dC1hbGlnbiBpcyByaWdo
dCwgaWYgZGlyZWN0aW9uIGlzIExUUiwgd2lkZSBsaW5lcyBzaG91bGQgb3ZlcmZsb3cgb3V0IG9m
IHRoZSByaWdodAorICAgICAgICAgICAgLy8gc2lkZSBvZiB0aGUgYmxvY2suCisgICAgICAgICAg
ICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKSB7CisgICAgICAgICAgICAgICAgaWYg
KHRyYWlsaW5nU3BhY2VSdW4pIHsKKyAgICAgICAgICAgICAgICAgICAgdG90V2lkdGggLT0gdHJh
aWxpbmdTcGFjZVJ1bi0+bV9ib3gtPndpZHRoKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYWls
aW5nU3BhY2VSdW4tPm1fYm94LT5zZXRXaWR0aCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgaWYgKHRvdFdpZHRoIDwgYXZhaWxhYmxlV2lkdGgpCisgICAgICAgICAgICAg
ICAgICAgIHggKz0gYXZhaWxhYmxlV2lkdGggLSB0b3RXaWR0aDsKKyAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgaWYgKHRvdFdpZHRoID4gYXZhaWxhYmxlV2lkdGggJiYgdHJh
aWxpbmdTcGFjZVJ1bikgeworICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5t
X2JveC0+c2V0V2lkdGgobWF4KDAsIHRyYWlsaW5nU3BhY2VSdW4tPm1fYm94LT53aWR0aCgpIC0g
dG90V2lkdGggKyBhdmFpbGFibGVXaWR0aCkpOworICAgICAgICAgICAgICAgICAgICB0b3RXaWR0
aCAtPSB0cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+d2lkdGgoKTsKKyAgICAgICAgICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeCArPSBhdmFpbGFibGVXaWR0aCAtIHRvdFdpZHRo
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0VOVEVS
OgorICAgICAgICBjYXNlIFdFQktJVF9DRU5URVI6CisgICAgICAgICAgICBpbnQgdHJhaWxpbmdT
cGFjZVdpZHRoID0gMDsKKyAgICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7CisgICAg
ICAgICAgICAgICAgdG90V2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+bV9ib3gtPndpZHRoKCk7
CisgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVdpZHRoID0gbWluKHRyYWlsaW5nU3BhY2VS
dW4tPm1fYm94LT53aWR0aCgpLCAoYXZhaWxhYmxlV2lkdGggLSB0b3RXaWR0aCArIDEpIC8gMik7
CisgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9ib3gtPnNldFdpZHRoKG1heCgw
LCB0cmFpbGluZ1NwYWNlV2lkdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChz
dHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpCisgICAgICAgICAgICAgICAgeCArPSBtYXgoKGF2
YWlsYWJsZVdpZHRoIC0gdG90V2lkdGgpIC8gMiwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgeCArPSB0b3RXaWR0aCA+IGF2YWlsYWJsZVdpZHRoID8gKGF2YWlsYWJsZVdp
ZHRoIC0gdG90V2lkdGgpIDogKGF2YWlsYWJsZVdpZHRoIC0gdG90V2lkdGgpIC8gMiAtIHRyYWls
aW5nU3BhY2VXaWR0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChudW1T
cGFjZXMpIHsKKyAgICAgICAgZm9yIChCaWRpUnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5u
ZXh0KCkpIHsKKyAgICAgICAgICAgIGlmICghci0+bV9ib3ggfHwgciA9PSB0cmFpbGluZ1NwYWNl
UnVuKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpbnQgc3BhY2VB
ZGQgPSAwOworICAgICAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc1RleHQoKSkgeworICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIHNwYWNlcyA9IDA7CisgICAgICAgICAgICAgICAgY29uc3QgVUNo
YXIqIGNoYXJhY3RlcnMgPSB0b1JlbmRlclRleHQoci0+bV9vYmplY3QpLT5jaGFyYWN0ZXJzKCk7
CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHItPm1fc3RhcnQ7IGkgPCByLT5tX3N0b3A7
IGkrKykgeworICAgICAgICAgICAgICAgICAgICBVQ2hhciBjID0gY2hhcmFjdGVyc1tpXTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdCcp
CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMrKzsKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICBBU1NFUlQoc3BhY2VzIDw9IG51bVNwYWNlcyk7CisKKyAgICAgICAg
ICAgICAgICAvLyBPbmx5IGp1c3RpZnkgdGV4dCBpZiB3aGl0ZXNwYWNlIGlzIGNvbGxhcHNlZC4K
KyAgICAgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPnN0eWxlKCktPmNvbGxhcHNlV2hpdGVT
cGFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlQWRkID0gKGF2YWlsYWJsZVdpZHRo
IC0gdG90V2lkdGgpICogc3BhY2VzIC8gbnVtU3BhY2VzOworICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94Kj4oci0+bV9ib3gpLT5zZXRTcGFjZUFkZChzcGFjZUFk
ZCk7CisgICAgICAgICAgICAgICAgICAgIHRvdFdpZHRoICs9IHNwYWNlQWRkOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1TcGFjZXMgLT0gc3BhY2VzOworICAgICAgICAg
ICAgICAgIGlmICghbnVtU3BhY2VzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSB3aWR0aHMgb2YgYWxsIHJ1
bnMgYXJlIG5vdyBrbm93bi4gIFdlIGNhbiBub3cgcGxhY2UgZXZlcnkgaW5saW5lIGJveCAoYW5k
CisgICAgLy8gY29tcHV0ZSBhY2N1cmF0ZSB3aWR0aHMgZm9yIHRoZSBpbmxpbmUgZmxvdyBib3hl
cykuCisgICAgaW50IGxlZnRQb3NpdGlvbiA9IHg7CisgICAgaW50IHJpZ2h0UG9zaXRpb24gPSB4
OworICAgIG5lZWRzV29yZFNwYWNpbmcgPSBmYWxzZTsKKyAgICBsaW5lQm94LT5wbGFjZUJveGVz
SG9yaXpvbnRhbGx5KHgsIGxlZnRQb3NpdGlvbiwgcmlnaHRQb3NpdGlvbiwgbmVlZHNXb3JkU3Bh
Y2luZyk7CisgICAgbGluZUJveC0+c2V0SG9yaXpvbnRhbE92ZXJmbG93UG9zaXRpb25zKGxlZnRQ
b3NpdGlvbiwgcmlnaHRQb3NpdGlvbik7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVW
ZXJ0aWNhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biog
Zmlyc3RSdW4pCit7CisgICAgc2V0SGVpZ2h0KGxpbmVCb3gtPnZlcnRpY2FsbHlBbGlnbkJveGVz
KGhlaWdodCgpKSk7CisgICAgbGluZUJveC0+c2V0QmxvY2tIZWlnaHQoaGVpZ2h0KCkpOworCisg
ICAgLy8gU2VlIGlmIHRoZSBsaW5lIHNwaWxsZWQgb3V0LiAgSWYgc28gc2V0IG92ZXJmbG93IGhl
aWdodCBhY2NvcmRpbmdseS4KKyAgICBpbnQgYm90dG9tT2ZMaW5lID0gbGluZUJveC0+Ym90dG9t
T3ZlcmZsb3coKTsKKyAgICBpZiAoYm90dG9tT2ZMaW5lID4gaGVpZ2h0KCkgJiYgYm90dG9tT2ZM
aW5lID4gbV9vdmVyZmxvd0hlaWdodCkKKyAgICAgICAgbV9vdmVyZmxvd0hlaWdodCA9IGJvdHRv
bU9mTGluZTsKKworICAgIC8vIE5vdyBtYWtlIHN1cmUgd2UgcGxhY2UgcmVwbGFjZWQgcmVuZGVy
IG9iamVjdHMgY29ycmVjdGx5LgorICAgIGZvciAoQmlkaVJ1biogciA9IGZpcnN0UnVuOyByOyBy
ID0gci0+bmV4dCgpKSB7CisgICAgICAgIEFTU0VSVChyLT5tX2JveCk7CisgICAgICAgIGlmICgh
ci0+bV9ib3gpCisgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBydW5zIHdpdGggbm8gbGlu
ZSBib3hlcy4KKworICAgICAgICAvLyBBbGlnbiBwb3NpdGlvbmVkIGJveGVzIHdpdGggdGhlIHRv
cCBvZiB0aGUgbGluZSBib3guICBUaGlzIGlzCisgICAgICAgIC8vIGEgcmVhc29uYWJsZSBhcHBy
b3hpbWF0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIHkgcG9zaXRpb24uCisgICAgICAgIGlmIChyLT5t
X29iamVjdC0+aXNQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICByLT5tX2JveC0+c2V0WShoZWln
aHQoKSk7CisKKyAgICAgICAgLy8gUG9zaXRpb24gaXMgdXNlZCB0byBwcm9wZXJseSBwb3NpdGlv
biBib3RoIHJlcGxhY2VkIGVsZW1lbnRzIGFuZAorICAgICAgICAvLyB0byB1cGRhdGUgdGhlIHN0
YXRpYyBub3JtYWwgZmxvdyB4L3kgb2YgcG9zaXRpb25lZCBlbGVtZW50cy4KKyAgICAgICAgaWYg
KHItPm1fb2JqZWN0LT5pc1RleHQoKSkKKyAgICAgICAgICAgIHRvUmVuZGVyVGV4dChyLT5tX29i
amVjdCktPnBvc2l0aW9uTGluZUJveChyLT5tX2JveCk7CisgICAgICAgIGVsc2UgaWYgKHItPm1f
b2JqZWN0LT5pc0JveCgpKQorICAgICAgICAgICAgdG9SZW5kZXJCb3goci0+bV9vYmplY3QpLT5w
b3NpdGlvbkxpbmVCb3goci0+bV9ib3gpOworICAgIH0KKyAgICAvLyBQb3NpdGlvbmVkIG9iamVj
dHMgYW5kIHplcm8tbGVuZ3RoIHRleHQgbm9kZXMgZGVzdHJveSB0aGVpciBib3hlcyBpbgorICAg
IC8vIHBvc2l0aW9uKCksIHdoaWNoIHVubmVjZXNzYXJpbHkgZGlydGllcyB0aGUgbGluZS4KKyAg
ICBsaW5lQm94LT5tYXJrRGlydHkoZmFsc2UpOworfQorCisvLyBjb2xsZWN0cyBvbmUgbGluZSBv
ZiB0aGUgcGFyYWdyYXBoIGFuZCB0cmFuc2Zvcm1zIGl0IHRvIHZpc3VhbCBvcmRlcgordm9pZCBS
ZW5kZXJCbG9jazo6YmlkaVJlb3JkZXJMaW5lKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
KQoreworICAgIHJlc29sdmVyLmNyZWF0ZUJpZGlSdW5zRm9yTGluZShlbmQsIHN0eWxlKCktPnZp
c3VhbGx5T3JkZXJlZCgpLCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOworfQorCitzdGF0aWMg
aW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgUmVuZGVyVGV4
dCogcmVuZGVyZXIpCit7CisgICAgaWYgKGNoYXJhY3RlciA9PSAnICcgfHwgY2hhcmFjdGVyID09
ICdcdCcgfHwgY2hhcmFjdGVyID09IHNvZnRIeXBoZW4pCisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1xuJykKKyAgICAgICAgcmV0dXJuICFyZW5kZXJlci0+c3R5
bGUoKS0+cHJlc2VydmVOZXdsaW5lKCk7CisgICAgaWYgKGNoYXJhY3RlciA9PSBub0JyZWFrU3Bh
Y2UpCisgICAgICAgIHJldHVybiByZW5kZXJlci0+c3R5bGUoKS0+bmJzcE1vZGUoKSA9PSBTUEFD
RTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGlu
ZUNoaWxkcmVuKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgaW50JiByZXBhaW50VG9wLCBpbnQmIHJl
cGFpbnRCb3R0b20pCit7CisgICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7CisgICAg
CisgICAgbV9vdmVyZmxvd0hlaWdodCA9IDA7CisgICAgICAgIAorICAgIHNldEhlaWdodChib3Jk
ZXJUb3AoKSArIHBhZGRpbmdUb3AoKSk7CisgICAgaW50IHRvQWRkID0gYm9yZGVyQm90dG9tKCkg
KyBwYWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7CisKKyAgICAv
LyBGaWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCisgICAg
Ly8gRklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKKyAgICAvLyBGSVhNRTogRG8gc29t
ZXRoaW5nIGJldHRlciB3aGVuIGZsb2F0cyBhcmUgcHJlc2VudC4KKyAgICBib29sIGZ1bGxMYXlv
dXQgPSAhZmlyc3RMaW5lQm94KCkgfHwgIWZpcnN0Q2hpbGQoKSB8fCBzZWxmTmVlZHNMYXlvdXQo
KSB8fCByZWxheW91dENoaWxkcmVuOworICAgIGlmIChmdWxsTGF5b3V0KQorICAgICAgICBsaW5l
Qm94ZXMoKS0+ZGVsZXRlTGluZUJveGVzKHJlbmRlckFyZW5hKCkpOworCisgICAgLy8gVGV4dCB0
cnVuY2F0aW9uIG9ubHkga2lja3MgaW4gaWYgeW91ciBvdmVyZmxvdyBpc24ndCB2aXNpYmxlIGFu
ZCB5b3VyIHRleHQtb3ZlcmZsb3ctbW9kZSBpc24ndAorICAgIC8vIGNsaXAuCisgICAgLy8gRklY
TUU6IENTUzMgc2F5cyB0aGF0IGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNsaXBwZWQgbXVzdCBhbHNv
IGtub3cgaG93IHRvIHRydW5jYXRlLiAgVGhpcyBpcyBpbnNhbmVseQorICAgIC8vIGRpZmZpY3Vs
dCB0byBmaWd1cmUgb3V0IChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2YgZG9pbmcgbGF5b3V0
KSwgYW5kIGlzIHJlYWxseSBhbiBlc290ZXJpYyBwaWxlIG9mIG5vbnNlbnNlCisgICAgLy8gYW55
d2F5LCBzbyB3ZSB3b24ndCB3b3JyeSBhYm91dCBmb2xsb3dpbmcgdGhlIGRyYWZ0IGhlcmUuCisg
ICAgYm9vbCBoYXNUZXh0T3ZlcmZsb3cgPSBzdHlsZSgpLT50ZXh0T3ZlcmZsb3coKSAmJiBoYXNP
dmVyZmxvd0NsaXAoKTsKKworICAgIC8vIFdhbGsgYWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91
ciBlbGxpcHNpcyBsaW5lIGJveGVzIGlmIHRoZXkgZXhpc3QuCisgICAgaWYgKGhhc1RleHRPdmVy
ZmxvdykKKyAgICAgICAgIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7CisKKyAgICBpZiAoZmly
c3RDaGlsZCgpKSB7CisgICAgICAgIC8vIGxheW91dCByZXBsYWNlZCBlbGVtZW50cworICAgICAg
ICBib29sIGVuZE9mSW5saW5lID0gZmFsc2U7CisgICAgICAgIFJlbmRlck9iamVjdCogbyA9IGJp
ZGlGaXJzdCh0aGlzLCAwLCBmYWxzZSk7CisgICAgICAgIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiBm
bG9hdHM7CisgICAgICAgIHdoaWxlIChvKSB7CisgICAgICAgICAgICBpZiAoby0+aXNSZXBsYWNl
ZCgpIHx8IG8tPmlzRmxvYXRpbmcoKSB8fCBvLT5pc1Bvc2l0aW9uZWQoKSkgeworICAgICAgICAg
ICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gobyk7CisgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgby0+c3R5bGUoKS0+d2lk
dGgoKS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkKKyAg
ICAgICAgICAgICAgICAgICAgby0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Cisg
ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIElmIHJlbGF5b3V0Q2hpbGRy
ZW4gaXMgc2V0IGFuZCB3ZSBoYXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2UgYWxzbyBuZWVkIHRv
IGludmFsaWRhdGUgdGhlIGNoaWxkJ3MgcHJlZiB3aWR0aHMuCisgICAgICAgICAgICAgICAgaWYg
KHJlbGF5b3V0Q2hpbGRyZW4gJiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50
KCkgfHwgby0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQorICAgICAgICAg
ICAgICAgICAgICBvLT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQorICAgICAgICAgICAg
ICAgICAgICBvLT5jb250YWluaW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChib3gp
OworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoby0+aXNG
bG9hdGluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRzLmFwcGVuZChGbG9hdFdp
dGhSZWN0KGJveCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8
IG8tPm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCisgICAgICAgICAgICAgICAg
ICAgICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7CisKKyAg
ICAgICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1JlbmRlcklubGlu
ZSgpICYmICFlbmRPZklubGluZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZnVsbExheW91dCB8
fCBvLT5zZWxmTmVlZHNMYXlvdXQoKSkKKyAgICAgICAgICAgICAgICAgICAgZGlydHlMaW5lQm94
ZXNGb3JSZW5kZXJlcihvLCBmdWxsTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBvLT5zZXROZWVk
c0xheW91dChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFvLT5pc1RleHQoKSkKKyAgICAg
ICAgICAgICAgICAgICAgdG9SZW5kZXJJbmxpbmUobyktPmludmFsaWRhdGVWZXJ0aWNhbFBvc2l0
aW9uKCk7IC8vIEZJWE1FOiBTaG91bGQgZG8gYmV0dGVyIGhlcmUgYW5kIG5vdCBhbHdheXMgaW52
YWxpZGF0ZSBldmVyeXRoaW5nLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbyA9IGJpZGlO
ZXh0KHRoaXMsIG8sIDAsIGZhbHNlLCAmZW5kT2ZJbmxpbmUpOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gV2Ugd2FudCB0byBza2lwIGFoZWFkIHRvIHRoZSBmaXJzdCBkaXJ0eSBsaW5lCisgICAg
ICAgIElubGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKKyAgICAgICAgdW5zaWduZWQgZmxvYXRJ
bmRleDsKKyAgICAgICAgYm9vbCBmaXJzdExpbmUgPSB0cnVlOworICAgICAgICBib29sIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSA9IHRydWU7CisgICAgICAgIFJvb3RJbmxpbmVCb3gqIHN0YXJ0
TGluZSA9IGRldGVybWluZVN0YXJ0UG9zaXRpb24oZmlyc3RMaW5lLCBmdWxsTGF5b3V0LCBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHksIHJlc29sdmVyLCBmbG9hdHMsIGZsb2F0SW5kZXgpOworCisg
ICAgICAgIGlmIChmdWxsTGF5b3V0ICYmICFzZWxmTmVlZHNMYXlvdXQoKSkgeworICAgICAgICAg
ICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOyAgLy8gTWFyayBvdXJzZWx2ZXMgYXMgbmVl
ZGluZyBhIGZ1bGwgbGF5b3V0LiBUaGlzIHdheSB3ZSdsbCByZXBhaW50IGxpa2UKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHN1cHBvc2VkIHRvLgor
ICAgICAgICAgICAgUmVuZGVyVmlldyogdiA9IHZpZXcoKTsKKyAgICAgICAgICAgIGlmICh2ICYm
ICF2LT5kb2luZ0Z1bGxSZXBhaW50KCkgJiYgaGFzTGF5ZXIoKSkgeworICAgICAgICAgICAgICAg
IC8vIEJlY2F1c2Ugd2Ugd2FpdGVkIHVudGlsIHdlIHdlcmUgYWxyZWFkeSBpbnNpZGUgbGF5b3V0
IHRvIGRpc2NvdmVyCisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgYmxvY2sgcmVhbGx5IG5l
ZWRlZCBhIGZ1bGwgbGF5b3V0LCB3ZSBtaXNzZWQgb3VyIGNoYW5jZSB0byByZXBhaW50IHRoZSBs
YXllcgorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBsYXlvdXQgc3RhcnRlZC4gIEx1Y2tpbHkg
dGhlIGxheWVyIGhhcyBjYWNoZWQgdGhlIHJlcGFpbnQgcmVjdCBmb3IgaXRzIG9yaWdpbmFsCisg
ICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYW5kIHNpemUsIGFuZCBzbyB3ZSBjYW4gdXNlIHRo
YXQgdG8gbWFrZSBhIHJlcGFpbnQgaGFwcGVuIG5vdy4KKyAgICAgICAgICAgICAgICByZXBhaW50
VXNpbmdDb250YWluZXIoY29udGFpbmVyRm9yUmVwYWludCgpLCBsYXllcigpLT5yZXBhaW50UmVj
dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZsb2F0aW5nT2JqZWN0
KiBsYXN0RmxvYXQgPSBtX2Zsb2F0aW5nT2JqZWN0cyA/IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0
KCkgOiAwOworCisgICAgICAgIExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSA9
IHJlc29sdmVyLm1pZHBvaW50U3RhdGUoKTsKKworICAgICAgICAvLyBXZSBhbHNvIGZpbmQgdGhl
IGZpcnN0IGNsZWFuIGxpbmUgYW5kIGV4dHJhY3QgdGhlc2UgbGluZXMuICBXZSB3aWxsIGFkZCB0
aGVtIGJhY2sKKyAgICAgICAgLy8gaWYgd2UgZGV0ZXJtaW5lIHRoYXQgd2UncmUgYWJsZSB0byBz
eW5jaHJvbml6ZSBhZnRlciBoYW5kbGluZyBhbGwgb3VyIGRpcnR5IGxpbmVzLgorICAgICAgICBJ
bmxpbmVJdGVyYXRvciBjbGVhbkxpbmVTdGFydDsKKyAgICAgICAgQmlkaVN0YXR1cyBjbGVhbkxp
bmVCaWRpU3RhdHVzOworICAgICAgICBpbnQgZW5kTGluZVlQb3MgPSAwOworICAgICAgICBSb290
SW5saW5lQm94KiBlbmRMaW5lID0gKGZ1bGxMYXlvdXQgfHwgIXN0YXJ0TGluZSkgPyAKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBkZXRlcm1pbmVFbmRQb3NpdGlvbihzdGFy
dExpbmUsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzLCBlbmRMaW5lWVBvcyk7
CisKKyAgICAgICAgaWYgKHN0YXJ0TGluZSkgeworICAgICAgICAgICAgdXNlUmVwYWludEJvdW5k
cyA9IHRydWU7CisgICAgICAgICAgICByZXBhaW50VG9wID0gaGVpZ2h0KCk7CisgICAgICAgICAg
ICByZXBhaW50Qm90dG9tID0gaGVpZ2h0KCk7CisgICAgICAgICAgICBSZW5kZXJBcmVuYSogYXJl
bmEgPSByZW5kZXJBcmVuYSgpOworICAgICAgICAgICAgUm9vdElubGluZUJveCogYm94ID0gc3Rh
cnRMaW5lOworICAgICAgICAgICAgd2hpbGUgKGJveCkgeworICAgICAgICAgICAgICAgIHJlcGFp
bnRUb3AgPSBtaW4ocmVwYWludFRvcCwgYm94LT50b3BPdmVyZmxvdygpKTsKKyAgICAgICAgICAg
ICAgICByZXBhaW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGJveC0+Ym90dG9tT3ZlcmZs
b3coKSk7CisgICAgICAgICAgICAgICAgUm9vdElubGluZUJveCogbmV4dCA9IGJveC0+bmV4dFJv
b3RCb3goKTsKKyAgICAgICAgICAgICAgICBib3gtPmRlbGV0ZUxpbmUoYXJlbmEpOworICAgICAg
ICAgICAgICAgIGJveCA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICBJbmxpbmVJdGVyYXRvciBlbmQgPSByZXNvbHZlci5wb3NpdGlvbigpOworCisgICAgICAgIGlm
ICghZnVsbExheW91dCAmJiBsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmVuZHNXaXRo
QnJlYWsoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgbGluZSBiZWZvcmUgdGhlIHN0
YXJ0IGxpbmUgZW5kcyB3aXRoIGEgbGluZSBicmVhayB0aGF0IGNsZWFyIGZsb2F0cywKKyAgICAg
ICAgICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5LgorICAgICAgICAgICAgLy8g
QSBsaW5lIGJyZWFrIGNhbiBiZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHRoZSBsYXN0IG9iamVjdCBv
biBhIGxpbmUsIGRlcGVuZGluZyBvbiBpdHMgZGlyZWN0aW9uLgorICAgICAgICAgICAgaWYgKElu
bGluZUJveCogbGFzdExlYWZDaGlsZCA9IGxhc3RSb290Qm94KCktPmxhc3RMZWFmQ2hpbGQoKSkg
eworICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9IGxhc3RMZWFmQ2hp
bGQtPnJlbmRlcmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0LT5pc0JSKCkp
CisgICAgICAgICAgICAgICAgICAgIGxhc3RPYmplY3QgPSBsYXN0Um9vdEJveCgpLT5maXJzdExl
YWZDaGlsZCgpLT5yZW5kZXJlcigpOworICAgICAgICAgICAgICAgIGlmIChsYXN0T2JqZWN0LT5p
c0JSKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRUNsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+
c3R5bGUoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IENOT05F
KQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGluZShjbGVhcik7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBlbmRMaW5lTWF0
Y2hlZCA9IGZhbHNlOworICAgICAgICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gZW5kTGlu
ZTsKKyAgICAgICAgYm9vbCBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IGZhbHNlOworICAg
ICAgICBpbnQgbGFzdEhlaWdodCA9IGhlaWdodCgpOworCisgICAgICAgIGJvb2wgaXNMaW5lRW1w
dHkgPSB0cnVlOworCisgICAgICAgIHdoaWxlICghZW5kLmF0RW5kKCkpIHsKKyAgICAgICAgICAg
IC8vIEZJWE1FOiBJcyB0aGlzIGNoZWNrIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJh
dGlvbiBvciBjYW4gaXQgYmUgbW92ZWQgdG8gdGhlIGVuZD8KKyAgICAgICAgICAgIGlmIChjaGVj
a0ZvckVuZExpbmVNYXRjaCAmJiAoZW5kTGluZU1hdGNoZWQgPSBtYXRjaGVkRW5kTGluZShyZXNv
bHZlciwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlTdGF0dXMsIGVuZExpbmUsIGVuZExp
bmVZUG9zLCByZXBhaW50Qm90dG9tLCByZXBhaW50VG9wKSkpCisgICAgICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLnJlc2V0KCk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlzTGluZUVtcHR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgRUNsZWFyIGNsZWFyID0gQ05PTkU7CisgICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExp
bmVCcmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5LCAmY2xlYXIpOworICAgICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCku
YXRFbmQoKSkgeworICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKKyAgICAg
ICAgICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlQoZW5kICE9IHJl
c29sdmVyLnBvc2l0aW9uKCkpOworCisgICAgICAgICAgICBpZiAoIWlzTGluZUVtcHR5KSB7Cisg
ICAgICAgICAgICAgICAgYmlkaVJlb3JkZXJMaW5lKHJlc29sdmVyLCBlbmQsIHByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHJlc29sdmVyLnBvc2l0aW9u
KCkgPT0gZW5kKTsKKworICAgICAgICAgICAgICAgIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4g
PSAwOworICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ICYmIHJl
c29sdmVyLnJ1bkNvdW50KCkgJiYgcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1bigpLT5tX29iamVj
dC0+c3R5bGUoKS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICYmIHJlc29sdmVyLmxvZ2ljYWxseUxhc3RSdW4oKS0+bV9vYmplY3QtPnN0eWxlKCkt
PmF1dG9XcmFwKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IHJl
c29sdmVyLmxvZ2ljYWxseUxhc3RSdW4oKTsKKyAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2Jq
ZWN0KiBsYXN0T2JqZWN0ID0gdHJhaWxpbmdTcGFjZVJ1bi0+bV9vYmplY3Q7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChsYXN0T2JqZWN0LT5pc1RleHQoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgUmVuZGVyVGV4dCogbGFzdFRleHQgPSB0b1JlbmRlclRleHQobGFzdE9iamVjdCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IGxhc3RUZXh0
LT5jaGFyYWN0ZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RTcGFjZSA9
IHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxl
IChmaXJzdFNwYWNlID4gdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0U3BhY2UgLSAx
XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2libGVTcGFjZShj
dXJyZW50LCBsYXN0VGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3BhY2UtLTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFNwYWNlID09
IHRyYWlsaW5nU3BhY2VSdW4tPnN0b3AoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
cmFpbGluZ1NwYWNlUnVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGUo
KS0+ZGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRS
ZW9yZGVyID0gdHJhaWxpbmdTcGFjZVJ1biAhPSAoZGlyZWN0aW9uID09IExUUiA/IHJlc29sdmVy
Lmxhc3RSdW4oKSA6IHJlc29sdmVyLmZpcnN0UnVuKCkpOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChmaXJzdFNwYWNlICE9IHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlkaUNvbnRleHQqIGJhc2VDb250ZXh0ID0g
cmVzb2x2ZXIuY29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGls
ZSAoQmlkaUNvbnRleHQqIHBhcmVudCA9IGJhc2VDb250ZXh0LT5wYXJlbnQoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VDb250ZXh0ID0gcGFyZW50OworCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZGlSdW4qIG5ld1RyYWlsaW5nUnVuID0gbmV3
IChyZW5kZXJBcmVuYSgpKSBCaWRpUnVuKGZpcnN0U3BhY2UsIHRyYWlsaW5nU3BhY2VSdW4tPm1f
c3RvcCwgdHJhaWxpbmdTcGFjZVJ1bi0+bV9vYmplY3QsIGJhc2VDb250ZXh0LCBPdGhlck5ldXRy
YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5t
X3N0b3AgPSBmaXJzdFNwYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
ZGlyZWN0aW9uID09IExUUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
c29sdmVyLmFkZFJ1bihuZXdUcmFpbGluZ1J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVy
LnByZXBlbmRSdW4obmV3VHJhaWxpbmdSdW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0cmFpbGluZ1NwYWNlUnVuID0gbmV3VHJhaWxpbmdSdW47CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNob3VsZFJlb3JkZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlb3Jk
ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBM
VFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLm1vdmVS
dW5Ub0VuZCh0cmFpbGluZ1NwYWNlUnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRyYWlsaW5nU3BhY2VSdW4tPm1fbGV2ZWwgPSAwOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmVzb2x2ZXIubW92ZVJ1blRvQmVnaW5uaW5nKHRyYWlsaW5nU3BhY2VSdW4pOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9sZXZlbCA9
IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IDA7
CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgdGhlIHJ1
bnMgaGF2ZSBiZWVuIG9yZGVyZWQsIHdlIGNyZWF0ZSB0aGUgbGluZSBib3hlcy4KKyAgICAgICAg
ICAgICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdlIGZpZ3VyZSBvdXQgd2hlcmUgYm9yZGVyL3Bh
ZGRpbmcvbWFyZ2luIHNob3VsZCBiZSBhcHBsaWVkIGZvcgorICAgICAgICAgICAgICAgIC8vIGlu
bGluZSBmbG93IGJveGVzLgorCisgICAgICAgICAgICAgICAgUm9vdElubGluZUJveCogbGluZUJv
eCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyLnJ1bkNvdW50KCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgbGluZUJveCA9IGNvbnN0cnVjdExpbmUocmVzb2x2ZXIucnVuQ291bnQo
KSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgcmVzb2x2ZXIubGFzdFJ1bigpLCBmaXJzdExpbmUsICFl
bmQub2JqLCBlbmQub2JqICYmICFlbmQucG9zID8gZW5kLm9iaiA6IDApOworICAgICAgICAgICAg
ICAgICAgICBpZiAobGluZUJveCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+
c2V0RW5kc1dpdGhCcmVhayhwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOworCisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9mIG91ciB0ZXh0IHJ1bnMgaG9y
aXpvbnRhbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxQb3Np
dGlvbnNGb3JMaW5lKGxpbmVCb3gsIGZpcnN0TGluZSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgdHJh
aWxpbmdTcGFjZVJ1biwgZW5kLmF0RW5kKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAv
LyBOb3cgcG9zaXRpb24gb3VyIHRleHQgcnVucyB2ZXJ0aWNhbGx5LgorICAgICAgICAgICAgICAg
ICAgICAgICAgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCByZXNvbHZl
ci5maXJzdFJ1bigpKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICAgICAgICAgICAg
ICAvLyBTcGVjaWFsIFNWRyB0ZXh0IGxheW91dCBjb2RlCisgICAgICAgICAgICAgICAgICAgICAg
ICBsaW5lQm94LT5jb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKTsKKyNlbmRp
ZgorCisjaWYgUExBVEZPUk0oTUFDKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGlnaGxp
Z2h0IGFjdHMgYXMgYW4gb3ZlcmZsb3cgaW5mbGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKHN0eWxlKCktPmhpZ2hsaWdodCgpICE9IG51bGxBdG9tKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGxpbmVCb3gtPmFkZEhpZ2hsaWdodE92ZXJmbG93KCk7CisjZW5kaWYKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKKworICAgICAgICAgICAgICAgIGlmIChsaW5lQm94KSB7
CisgICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldExpbmVCcmVha0luZm8oZW5kLm9iaiwg
ZW5kLnBvcywgcmVzb2x2ZXIuc3RhdHVzKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodXNl
UmVwYWludEJvdW5kcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWludFRvcCA9IG1p
bihyZXBhaW50VG9wLCBsaW5lQm94LT50b3BPdmVyZmxvdygpKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZUJveC0+Ym90dG9t
T3ZlcmZsb3coKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICBmaXJzdExpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBuZXdM
aW5lKGNsZWFyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1fZmxvYXRpbmdP
YmplY3RzICYmIGxhc3RSb290Qm94KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdEZsb2F0
KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0
aW5nT2JqZWN0cy0+bGFzdCgpOyBmICE9IGxhc3RGbG9hdDsgZiA9IG1fZmxvYXRpbmdPYmplY3Rz
LT5wcmV2KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBt
X2Zsb2F0aW5nT2JqZWN0cy0+bmV4dCgpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+Zmlyc3QoKTsKKyAgICAgICAgICAgICAg
ICBmb3IgKEZsb2F0aW5nT2JqZWN0KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmN1cnJlbnQoKTsg
ZjsgZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKGYtPm1fYm90dG9tID4gbGFzdEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxh
c3RSb290Qm94KCktPmZsb2F0cygpLmFwcGVuZChmLT5tX3JlbmRlcmVyKTsKKyAgICAgICAgICAg
ICAgICAgICAgQVNTRVJUKGYtPm1fcmVuZGVyZXIgPT0gZmxvYXRzW2Zsb2F0SW5kZXhdLm9iamVj
dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZmxvYXQncyBnZW9tZXRyeSBoYXMgY2hh
bmdlZCwgZ2l2ZSB1cCBvbiBzeW5jaW5nIHdpdGggY2xlYW4gbGluZXMuCisgICAgICAgICAgICAg
ICAgICAgIGlmIChmbG9hdHNbZmxvYXRJbmRleF0ucmVjdCAhPSBJbnRSZWN0KGYtPm1fbGVmdCwg
Zi0+bV90b3AsIGYtPm1fd2lkdGgsIGYtPm1fYm90dG9tIC0gZi0+bV90b3ApKQorICAgICAgICAg
ICAgICAgICAgICAgICAgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICAgICAgZmxvYXRJbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBsYXN0RmxvYXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bGFzdCgpOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBsYXN0SGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgICAgICAgICBsaW5lTWlk
cG9pbnRTdGF0ZS5yZXNldCgpOworICAgICAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oZW5k
KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmRMaW5lKSB7CisgICAgICAgICAgICBpZiAo
ZW5kTGluZU1hdGNoZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBBdHRhY2ggYWxsIHRoZSByZW1h
aW5pbmcgbGluZXMsIGFuZCB0aGVuIGFkanVzdCB0aGVpciB5LXBvc2l0aW9ucyBhcyBuZWVkZWQu
CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gaGVpZ2h0KCkgLSBlbmRMaW5lWVBvczsKKyAg
ICAgICAgICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBlbmRMaW5lOyBsaW5lOyBs
aW5lID0gbGluZS0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lLT5h
dHRhY2hMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgcmVwYWludFRvcCA9IG1pbihyZXBhaW50VG9wLCBsaW5lLT50b3BPdmVy
ZmxvdygpICsgbWluKGRlbHRhLCAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBhaW50
Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmUtPmJvdHRvbU92ZXJmbG93KCkgKyBtYXgo
ZGVsdGEsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtPmFkanVzdFBvc2l0aW9u
KDAsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBp
ZiAoVmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVGbG9hdHMgPSBsaW5lLT5mbG9hdHNQdHIo
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRv
ciBlbmQgPSBjbGVhbkxpbmVGbG9hdHMtPmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGYgPSBjbGVhbkxpbmVGbG9hdHMtPmJl
Z2luKCk7IGYgIT0gZW5kOyArK2YpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg
ZmxvYXRUb3AgPSAoKmYpLT55KCkgLSAoKmYpLT5tYXJnaW5Ub3AoKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbnNlcnRGbG9hdGluZ09iamVjdCgqZik7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0SGVpZ2h0KGZsb2F0VG9wICsgZGVsdGEpOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgc2V0SGVpZ2h0KGxhc3RSb290Qm94KCktPmJsb2NrSGVpZ2h0KCkpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSByZW1haW5pbmcg
bGluZXMuCisgICAgICAgICAgICAgICAgSW5saW5lUnVuQm94KiBsaW5lID0gZW5kTGluZTsKKyAg
ICAgICAgICAgICAgICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZW5kZXJBcmVuYSgpOworICAgICAg
ICAgICAgICAgIHdoaWxlIChsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGFpbnRUb3Ag
PSBtaW4ocmVwYWludFRvcCwgbGluZS0+dG9wT3ZlcmZsb3coKSk7CisgICAgICAgICAgICAgICAg
ICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZS0+Ym90dG9tT3ZlcmZs
b3coKSk7CisgICAgICAgICAgICAgICAgICAgIElubGluZVJ1bkJveCogbmV4dCA9IGxpbmUtPm5l
eHRMaW5lQm94KCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmUtPmRlbGV0ZUxpbmUoYXJlbmEp
OworICAgICAgICAgICAgICAgICAgICBsaW5lID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYm
IChjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSB8fCBwb3NpdGlvbk5ld0Zsb2F0cygpKSAmJiBs
YXN0Um9vdEJveCgpKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBv
biB0aGUgbGFzdCBsaW5lLCBpdCBtaWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cuCisg
ICAgICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBhZGRpbmcgaW4gdGhlIGJv
dHRvbSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0IHdpbGwKKyAgICAgICAgICAgIC8vIGlu
Y2x1ZGUgdGhlIHBhZGRpbmcgaW5jb3JyZWN0bHkuIC1kd2gKKyAgICAgICAgICAgIGlmIChsYXN0
RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEZsb2F0aW5nT2JqZWN0KiBmID0gbV9mbG9h
dGluZ09iamVjdHMtPmxhc3QoKTsgZiAhPSBsYXN0RmxvYXQ7IGYgPSBtX2Zsb2F0aW5nT2JqZWN0
cy0+cHJldigpKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fZmxvYXRp
bmdPYmplY3RzLT5uZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBt
X2Zsb2F0aW5nT2JqZWN0cy0+Zmlyc3QoKTsKKyAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmpl
Y3QqIGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+Y3VycmVudCgpOyBmOyBmID0gbV9mbG9hdGluZ09i
amVjdHMtPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmLT5tX2JvdHRvbSA+IGxhc3RI
ZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIGxhc3RSb290Qm94KCktPmZsb2F0cygpLmFwcGVu
ZChmLT5tX3JlbmRlcmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RGbG9hdCA9
IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGZs
b2F0Q291bnQgPSBmbG9hdHMuc2l6ZSgpOworICAgICAgICAvLyBGbG9hdHMgdGhhdCBkaWQgbm90
IGhhdmUgbGF5b3V0IGRpZCBub3QgcmVwYWludCB3aGVuIHdlIGxhaWQgdGhlbSBvdXQuIFRoZXkg
d291bGQgaGF2ZQorICAgICAgICAvLyBwYWludGVkIGJ5IG5vdyBpZiB0aGV5IGhhZCBtb3ZlZCwg
YnV0IGlmIHRoZXkgc3RheWVkIGF0ICgwLCAwKSwgdGhleSBzdGlsbCBuZWVkIHRvIGJlCisgICAg
ICAgIC8vIHBhaW50ZWQuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxvYXRDb3Vu
dDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWZsb2F0c1tpXS5ldmVySGFkTGF5b3V0KSB7Cisg
ICAgICAgICAgICAgICAgUmVuZGVyQm94KiBmID0gZmxvYXRzW2ldLm9iamVjdDsKKyAgICAgICAg
ICAgICAgICBpZiAoIWYtPngoKSAmJiAhZi0+eSgpICYmIGYtPmNoZWNrRm9yUmVwYWludER1cmlu
Z0xheW91dCgpKQorICAgICAgICAgICAgICAgICAgICBmLT5yZXBhaW50KCk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgYWRkIGluIHRoZSBib3R0b20gYm9y
ZGVyL3BhZGRpbmcuCisgICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgdG9BZGQpOworCisgICAgLy8g
QWx3YXlzIG1ha2Ugc3VyZSB0aGlzIGlzIGF0IGxlYXN0IG91ciBoZWlnaHQuCisgICAgbV9vdmVy
Zmxvd0hlaWdodCA9IG1heChoZWlnaHQoKSwgbV9vdmVyZmxvd0hlaWdodCk7CisKKyAgICAvLyBT
ZWUgaWYgYW55IGxpbmVzIHNwaWxsIG91dCBvZiB0aGUgYmxvY2suICBJZiBzbywgd2UgbmVlZCB0
byB1cGRhdGUgb3VyIG92ZXJmbG93IHdpZHRoLgorICAgIGNoZWNrTGluZXNGb3JPdmVyZmxvdygp
OworCisgICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQorICAgICAg
ICBzZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsKKworICAgIC8v
IFNlZSBpZiB3ZSBoYXZlIGFueSBsaW5lcyB0aGF0IHNwaWxsIG91dCBvZiBvdXIgYmxvY2suICBJ
ZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5lZWQgdG8KKyAgICAvLyB0cnVuY2F0ZSB0
ZXh0LgorICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCisgICAgICAgIGNoZWNrTGluZXNGb3JUZXh0
T3ZlcmZsb3coKTsKK30KKworUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmRldGVybWluZVN0
YXJ0UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxsTGF5b3V0LCBib29sJiBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgVmVjdG9yPEZs
b2F0V2l0aFJlY3Q+JiBmbG9hdHMsIHVuc2lnbmVkJiBudW1DbGVhbkZsb2F0cykKK3sKKyAgICBS
b290SW5saW5lQm94KiBjdXJyID0gMDsKKyAgICBSb290SW5saW5lQm94KiBsYXN0ID0gMDsKKwor
ICAgIGJvb2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKKyAgICBpZiAoIWZ1bGxMYXlvdXQpIHsK
KyAgICAgICAgc2l6ZV90IGZsb2F0SW5kZXggPSAwOworICAgICAgICBmb3IgKGN1cnIgPSBmaXJz
dFJvb3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aXNEaXJ0eSgpOyBjdXJyID0gY3Vyci0+bmV4dFJv
b3RCb3goKSkgeworICAgICAgICAgICAgaWYgKFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5l
RmxvYXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVu
ZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZsb2F0cy0+ZW5kKCk7CisgICAgICAg
ICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIG8gPSBjbGVhbkxpbmVG
bG9hdHMtPmJlZ2luKCk7IG8gIT0gZW5kOyArK28pIHsKKyAgICAgICAgICAgICAgICAgICAgUmVu
ZGVyQm94KiBmID0gKm87CisgICAgICAgICAgICAgICAgICAgIEludFNpemUgbmV3U2l6ZShmLT53
aWR0aCgpICsgZi0+bWFyZ2luTGVmdCgpICtmLT5tYXJnaW5SaWdodCgpLCBmLT5oZWlnaHQoKSAr
IGYtPm1hcmdpblRvcCgpICsgZi0+bWFyZ2luQm90dG9tKCkpOworICAgICAgICAgICAgICAgICAg
ICBBU1NFUlQoZmxvYXRJbmRleCA8IGZsb2F0cy5zaXplKCkpOworICAgICAgICAgICAgICAgICAg
ICBpZiAoZmxvYXRzW2Zsb2F0SW5kZXhdLm9iamVjdCAhPSBmKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBBIG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBiZWZvcmUgdGhpcyBsaW5l
IG9yIGJlZm9yZSBpdHMgbGFzdCBrbm93biBmbG9hdC4KKyAgICAgICAgICAgICAgICAgICAgICAg
IC8vIEp1c3QgZG8gYSBmdWxsIGxheW91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxM
YXlvdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0c1tmbG9hdEluZGV4XS5y
ZWN0LnNpemUoKSAhPSBuZXdTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxv
YXRUb3AgPSBmbG9hdHNbZmxvYXRJbmRleF0ucmVjdC55KCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBjdXJyLT5tYXJrRGlydHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtMaW5l
c0RpcnR5SW5WZXJ0aWNhbFJhbmdlKGN1cnItPmJsb2NrSGVpZ2h0KCksIGZsb2F0VG9wICsgbWF4
KGZsb2F0c1tmbG9hdEluZGV4XS5yZWN0LmhlaWdodCgpLCBuZXdTaXplLmhlaWdodCgpKSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBmbG9hdHNbZmxvYXRJbmRleF0ucmVjdC5zZXRTaXplKG5l
d1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlydGllZEJ5RmxvYXQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZsb2F0SW5kZXgrKzsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGlydGll
ZEJ5RmxvYXQgfHwgZnVsbExheW91dCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICAvLyBDaGVjayBpZiBhIG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBhZnRl
ciB0aGUgbGFzdCBrbm93biBmbG9hdC4KKyAgICAgICAgaWYgKCFjdXJyICYmIGZsb2F0SW5kZXgg
PCBmbG9hdHMuc2l6ZSgpKQorICAgICAgICAgICAgZnVsbExheW91dCA9IHRydWU7CisgICAgfQor
CisgICAgaWYgKGZ1bGxMYXlvdXQpIHsKKyAgICAgICAgLy8gTnVrZSBhbGwgb3VyIGxpbmVzLgor
ICAgICAgICBpZiAoZmlyc3RSb290Qm94KCkpIHsKKyAgICAgICAgICAgIFJlbmRlckFyZW5hKiBh
cmVuYSA9IHJlbmRlckFyZW5hKCk7CisgICAgICAgICAgICBjdXJyID0gZmlyc3RSb290Qm94KCk7
IAorICAgICAgICAgICAgd2hpbGUgKGN1cnIpIHsKKyAgICAgICAgICAgICAgICBSb290SW5saW5l
Qm94KiBuZXh0ID0gY3Vyci0+bmV4dFJvb3RCb3goKTsKKyAgICAgICAgICAgICAgICBjdXJyLT5k
ZWxldGVMaW5lKGFyZW5hKTsKKyAgICAgICAgICAgICAgICBjdXJyID0gbmV4dDsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIEFTU0VSVCghZmlyc3RMaW5lQm94KCkgJiYgIWxhc3RMaW5lQm94
KCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN1cnIpIHsKKyAgICAg
ICAgICAgIC8vIFdlIGhhdmUgYSBkaXJ0eSBsaW5lLgorICAgICAgICAgICAgaWYgKFJvb3RJbmxp
bmVCb3gqIHByZXZSb290Qm94ID0gY3Vyci0+cHJldlJvb3RCb3goKSkgeworICAgICAgICAgICAg
ICAgIC8vIFdlIGhhdmUgYSBwcmV2aW91cyBsaW5lLgorICAgICAgICAgICAgICAgIGlmICghZGly
dGllZEJ5RmxvYXQgJiYgKCFwcmV2Um9vdEJveC0+ZW5kc1dpdGhCcmVhaygpIHx8IChwcmV2Um9v
dEJveC0+bGluZUJyZWFrT2JqKCktPmlzVGV4dCgpICYmIHByZXZSb290Qm94LT5saW5lQnJlYWtQ
b3MoKSA+PSB0b1JlbmRlclRleHQocHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpKS0+dGV4dExl
bmd0aCgpKSkpCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBsaW5lIGRpZG4n
dCBicmVhayBjbGVhbmx5IG9yIGJyb2tlIGF0IGEgbmV3bGluZQorICAgICAgICAgICAgICAgICAg
ICAvLyB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQsIHNvIHRyZWF0IGl0IGFzIGRpcnR5IHRvby4KKyAg
ICAgICAgICAgICAgICAgICAgY3VyciA9IHByZXZSb290Qm94OworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gZGlydHkgbGluZXMgd2VyZSBmb3VuZC4K
KyAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGxpbmUgZGlkbid0IGJyZWFrIGNsZWFubHksIHRy
ZWF0IGl0IGFzIGRpcnR5LgorICAgICAgICAgICAgaWYgKGxhc3RSb290Qm94KCkgJiYgIWxhc3RS
b290Qm94KCktPmVuZHNXaXRoQnJlYWsoKSkKKyAgICAgICAgICAgICAgICBjdXJyID0gbGFzdFJv
b3RCb3goKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGhhdmUgbm8gZGlydHkgbGlu
ZXMsIHRoZW4gbGFzdCBpcyBqdXN0IHRoZSBsYXN0IHJvb3QgYm94LgorICAgICAgICBsYXN0ID0g
Y3VyciA/IGN1cnItPnByZXZSb290Qm94KCkgOiBsYXN0Um9vdEJveCgpOworICAgIH0KKworICAg
IG51bUNsZWFuRmxvYXRzID0gMDsKKyAgICBpZiAoIWZsb2F0cy5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgaW50IHNhdmVkSGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgICAgIC8vIFJlc3RvcmUgZmxvYXRz
IGZyb20gY2xlYW4gbGluZXMuCisgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBmaXJzdFJv
b3RCb3goKTsKKyAgICAgICAgd2hpbGUgKGxpbmUgIT0gY3VycikgeworICAgICAgICAgICAgaWYg
KFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRzUHRyKCkp
IHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNs
ZWFuTGluZUZsb2F0cy0+ZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVy
Qm94Kj46Oml0ZXJhdG9yIGYgPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IGYgIT0gZW5kOyAr
K2YpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmYpOworICAg
ICAgICAgICAgICAgICAgICBzZXRIZWlnaHQoKCpmKS0+eSgpIC0gKCpmKS0+bWFyZ2luVG9wKCkp
OworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOworICAgICAgICAgICAg
ICAgICAgICBBU1NFUlQoZmxvYXRzW251bUNsZWFuRmxvYXRzXS5vYmplY3QgPT0gKmYpOworICAg
ICAgICAgICAgICAgICAgICBudW1DbGVhbkZsb2F0cysrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpOworICAg
ICAgICB9CisgICAgICAgIHNldEhlaWdodChzYXZlZEhlaWdodCk7CisgICAgfQorCisgICAgZmly
c3RMaW5lID0gIWxhc3Q7CisgICAgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gIWxhc3QgfHwg
bGFzdC0+ZW5kc1dpdGhCcmVhaygpOworCisgICAgUmVuZGVyT2JqZWN0KiBzdGFydE9iajsKKyAg
ICBpbnQgcG9zID0gMDsKKyAgICBpZiAobGFzdCkgeworICAgICAgICBzZXRIZWlnaHQobGFzdC0+
YmxvY2tIZWlnaHQoKSk7CisgICAgICAgIHN0YXJ0T2JqID0gbGFzdC0+bGluZUJyZWFrT2JqKCk7
CisgICAgICAgIHBvcyA9IGxhc3QtPmxpbmVCcmVha1BvcygpOworICAgICAgICByZXNvbHZlci5z
ZXRTdGF0dXMobGFzdC0+bGluZUJyZWFrQmlkaVN0YXR1cygpKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICBib29sIGx0ciA9IHN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUgorICAgICNpZiBFTkFC
TEUoU1ZHKSAgIAorICAgICAgICAgICAgfHwgKHN0eWxlKCktPnVuaWNvZGVCaWRpKCkgPT0gVUJO
b3JtYWwgJiYgaXNTVkdUZXh0KCkpCisgICAgI2VuZGlmCisgICAgICAgICAgICA7CisKKyAgICAg
ICAgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IGx0ciA/IExlZnRUb1JpZ2h0IDogUmlnaHRUb0xlZnQ7
CisgICAgICAgIHJlc29sdmVyLnNldExhc3RTdHJvbmdEaXIoZGlyZWN0aW9uKTsKKyAgICAgICAg
cmVzb2x2ZXIuc2V0TGFzdERpcihkaXJlY3Rpb24pOworICAgICAgICByZXNvbHZlci5zZXRFb3JE
aXIoZGlyZWN0aW9uKTsKKyAgICAgICAgcmVzb2x2ZXIuc2V0Q29udGV4dChCaWRpQ29udGV4dDo6
Y3JlYXRlKGx0ciA/IDAgOiAxLCBkaXJlY3Rpb24sIHN0eWxlKCktPnVuaWNvZGVCaWRpKCkgPT0g
T3ZlcnJpZGUpKTsKKworICAgICAgICBzdGFydE9iaiA9IGJpZGlGaXJzdCh0aGlzLCAmcmVzb2x2
ZXIpOworICAgIH0KKworICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHRo
aXMsIHN0YXJ0T2JqLCBwb3MpKTsKKworICAgIHJldHVybiBjdXJyOworfQorCitSb290SW5saW5l
Qm94KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oUm9vdElubGluZUJveCogc3Rh
cnRMaW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFu
TGluZUJpZGlTdGF0dXMsIGludCYgeVBvcykKK3sKKyAgICBSb290SW5saW5lQm94KiBsYXN0ID0g
MDsKKyAgICBpZiAoIXN0YXJ0TGluZSkKKyAgICAgICAgbGFzdCA9IDA7CisgICAgZWxzZSB7Cisg
ICAgICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IHN0YXJ0TGluZS0+bmV4dFJvb3RCb3go
KTsgY3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKKyAgICAgICAgICAgIGlmIChj
dXJyLT5pc0RpcnR5KCkpCisgICAgICAgICAgICAgICAgbGFzdCA9IDA7CisgICAgICAgICAgICBl
bHNlIGlmICghbGFzdCkKKyAgICAgICAgICAgICAgICBsYXN0ID0gY3VycjsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGlmICghbGFzdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSb290SW5s
aW5lQm94KiBwcmV2ID0gbGFzdC0+cHJldlJvb3RCb3goKTsKKyAgICBjbGVhbkxpbmVTdGFydCA9
IElubGluZUl0ZXJhdG9yKHRoaXMsIHByZXYtPmxpbmVCcmVha09iaigpLCBwcmV2LT5saW5lQnJl
YWtQb3MoKSk7CisgICAgY2xlYW5MaW5lQmlkaVN0YXR1cyA9IHByZXYtPmxpbmVCcmVha0JpZGlT
dGF0dXMoKTsKKyAgICB5UG9zID0gcHJldi0+YmxvY2tIZWlnaHQoKTsKKworICAgIGZvciAoUm9v
dElubGluZUJveCogbGluZSA9IGxhc3Q7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgp
KQorICAgICAgICBsaW5lLT5leHRyYWN0TGluZSgpOyAvLyBEaXNjb25uZWN0IGFsbCBsaW5lIGJv
eGVzIGZyb20gdGhlaXIgcmVuZGVyIG9iamVjdHMgd2hpbGUgcHJlc2VydmluZworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLyB0aGVpciBjb25uZWN0aW9ucyB0byBvbmUgYW5vdGhlci4K
KworICAgIHJldHVybiBsYXN0OworfQorCitib29sIFJlbmRlckJsb2NrOjptYXRjaGVkRW5kTGlu
ZShjb25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBlbmRMaW5lU3RhdHVzLCBSb290SW5s
aW5lQm94KiYgZW5kTGluZSwgaW50JiBlbmRZUG9zLCBpbnQmIHJlcGFpbnRCb3R0b20sIGludCYg
cmVwYWludFRvcCkKK3sKKyAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5lU3Rh
cnQpIHsKKyAgICAgICAgaWYgKHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaW50IGRlbHRhID0gaGVpZ2h0KCkg
LSBlbmRZUG9zOworICAgICAgICBpZiAoIWRlbHRhIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cykKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIFNlZSBpZiBhbnkgZmxvYXRzIGVu
ZCBpbiB0aGUgcmFuZ2UgYWxvbmcgd2hpY2ggd2Ugd2FudCB0byBzaGlmdCB0aGUgbGluZXMgdmVy
dGljYWxseS4KKyAgICAgICAgaW50IHRvcCA9IG1pbihoZWlnaHQoKSwgZW5kWVBvcyk7CisKKyAg
ICAgICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBlbmRMaW5lOworICAgICAgICB3aGlsZSAo
Um9vdElubGluZUJveCogbmV4dExpbmUgPSBsYXN0TGluZS0+bmV4dFJvb3RCb3goKSkKKyAgICAg
ICAgICAgIGxhc3RMaW5lID0gbmV4dExpbmU7CisKKyAgICAgICAgaW50IGJvdHRvbSA9IGxhc3RM
aW5lLT5ibG9ja0hlaWdodCgpICsgYWJzKGRlbHRhKTsKKworICAgICAgICBmb3IgKEZsb2F0aW5n
T2JqZWN0KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmZpcnN0KCk7IGY7IGYgPSBtX2Zsb2F0aW5n
T2JqZWN0cy0+bmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoZi0+bV9ib3R0b20gPj0gdG9wICYm
IGYtPm1fYm90dG9tIDwgYm90dG9tKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRoZSBmaXJz
dCBjbGVhbiBsaW5lIGRvZXNuJ3QgbWF0Y2gsIGJ1dCB3ZSBjYW4gY2hlY2sgYSBoYW5kZnVsIG9m
IGZvbGxvd2luZyBsaW5lcyB0byB0cnkKKyAgICAvLyB0byBtYXRjaCBiYWNrIHVwLgorICAgIHN0
YXRpYyBpbnQgbnVtTGluZXMgPSA4OyAvLyBUaGUgIyBvZiBsaW5lcyB3ZSdyZSB3aWxsaW5nIHRv
IG1hdGNoIGFnYWluc3QuCisgICAgUm9vdElubGluZUJveCogbGluZSA9IGVuZExpbmU7CisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaW5lcyAmJiBsaW5lOyBpKyssIGxpbmUgPSBsaW5lLT5u
ZXh0Um9vdEJveCgpKSB7CisgICAgICAgIGlmIChsaW5lLT5saW5lQnJlYWtPYmooKSA9PSByZXNv
bHZlci5wb3NpdGlvbigpLm9iaiAmJiBsaW5lLT5saW5lQnJlYWtQb3MoKSA9PSByZXNvbHZlci5w
b3NpdGlvbigpLnBvcykgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLgorICAgICAg
ICAgICAgaWYgKGxpbmUtPmxpbmVCcmVha0JpZGlTdGF0dXMoKSAhPSByZXNvbHZlci5zdGF0dXMo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIC4uLmJ1dCB0aGUgYmlkaSBzdGF0
ZSBkb2Vzbid0IG1hdGNoLgorICAgICAgICAgICAgUm9vdElubGluZUJveCogcmVzdWx0ID0gbGlu
ZS0+bmV4dFJvb3RCb3goKTsKKworICAgICAgICAgICAgLy8gU2V0IG91ciB5UG9zIHRvIGJlIHRo
ZSBibG9jayBoZWlnaHQgb2YgZW5kTGluZS4KKyAgICAgICAgICAgIGlmIChyZXN1bHQpCisgICAg
ICAgICAgICAgICAgZW5kWVBvcyA9IGxpbmUtPmJsb2NrSGVpZ2h0KCk7CisKKyAgICAgICAgICAg
IGludCBkZWx0YSA9IGhlaWdodCgpIC0gZW5kWVBvczsKKyAgICAgICAgICAgIGlmIChkZWx0YSAm
JiBtX2Zsb2F0aW5nT2JqZWN0cykgeworICAgICAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgZmxv
YXRzIGVuZCBpbiB0aGUgcmFuZ2UgYWxvbmcgd2hpY2ggd2Ugd2FudCB0byBzaGlmdCB0aGUgbGlu
ZXMgdmVydGljYWxseS4KKyAgICAgICAgICAgICAgICBpbnQgdG9wID0gbWluKGhlaWdodCgpLCBl
bmRZUG9zKTsKKworICAgICAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gZW5k
TGluZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoUm9vdElubGluZUJveCogbmV4dExpbmUgPSBs
YXN0TGluZS0+bmV4dFJvb3RCb3goKSkKKyAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUgPSBu
ZXh0TGluZTsKKworICAgICAgICAgICAgICAgIGludCBib3R0b20gPSBsYXN0TGluZS0+YmxvY2tI
ZWlnaHQoKSArIGFicyhkZWx0YSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEZsb2F0aW5nT2Jq
ZWN0KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmZpcnN0KCk7IGY7IGYgPSBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLT5tX2JvdHRvbSA+PSB0
b3AgJiYgZi0+bV9ib3R0b20gPCBib3R0b20pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAvLyBOb3cgZGVsZXRlIHRoZSBsaW5lcyB0aGF0IHdlIGZhaWxlZCB0byBzeW5jLgorICAgICAg
ICAgICAgUm9vdElubGluZUJveCogYm94VG9EZWxldGUgPSBlbmRMaW5lOworICAgICAgICAgICAg
UmVuZGVyQXJlbmEqIGFyZW5hID0gcmVuZGVyQXJlbmEoKTsKKyAgICAgICAgICAgIHdoaWxlIChi
b3hUb0RlbGV0ZSAmJiBib3hUb0RlbGV0ZSAhPSByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBy
ZXBhaW50VG9wID0gbWluKHJlcGFpbnRUb3AsIGJveFRvRGVsZXRlLT50b3BPdmVyZmxvdygpKTsK
KyAgICAgICAgICAgICAgICByZXBhaW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGJveFRv
RGVsZXRlLT5ib3R0b21PdmVyZmxvdygpKTsKKyAgICAgICAgICAgICAgICBSb290SW5saW5lQm94
KiBuZXh0ID0gYm94VG9EZWxldGUtPm5leHRSb290Qm94KCk7CisgICAgICAgICAgICAgICAgYm94
VG9EZWxldGUtPmRlbGV0ZUxpbmUoYXJlbmEpOworICAgICAgICAgICAgICAgIGJveFRvRGVsZXRl
ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5kTGluZSA9IHJlc3VsdDsK
KyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza2lwTm9uQnJlYWtpbmdTcGFjZShj
b25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KQoreworICAgIGlmIChpdC5vYmotPnN0eWxlKCktPm5ic3BNb2RlKCkg
IT0gU1BBQ0UgfHwgaXQuY3VycmVudCgpICE9IG5vQnJlYWtTcGFjZSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgYmFkLiAgSXQgbWFrZXMgbmJzcCBpbmNv
bnNpc3RlbnQgd2l0aCBzcGFjZSBhbmQgd29uJ3Qgd29yayBjb3JyZWN0bHkKKyAgICAvLyB3aXRo
IG1fbWluV2lkdGgvbV9tYXhXaWR0aC4KKyAgICAvLyBEbyBub3Qgc2tpcCBhIG5vbi1icmVha2lu
ZyBzcGFjZSBpZiBpdCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgLy8gb24gYSBsaW5lIGFm
dGVyIGEgY2xlYW4gbGluZSBicmVhayAob3Igb24gdGhlIGZpcnN0IGxpbmUsIHNpbmNlIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSBzdGFydHMgb2ZmCisgICAgLy8gfHRydWV8KS4KKyAgICBpZiAo
aXNMaW5lRW1wdHkgJiYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHNob3Vs
ZENvbGxhcHNlV2hpdGVTcGFjZShjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGJvb2wgaXNMaW5l
RW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQoreworICAgIHJldHVybiBzdHls
ZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkgfHwgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gUFJFX1dS
QVAgJiYgKCFpc0xpbmVFbXB0eSB8fCAhcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSk7Cit9CisK
K3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoUmVuZGVyT2JqZWN0KiBv
YmplY3QpCit7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAob2JqZWN0LT5pc1NWR1RleHQoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyAgICByZXR1cm4gb2JqZWN0LT5zdHls
ZSgpLT5wcmVzZXJ2ZU5ld2xpbmUoKTsKK30KKworc3RhdGljIGJvb2wgaW5saW5lRmxvd1JlcXVp
cmVzTGluZUJveChSZW5kZXJJbmxpbmUqIGZsb3cpCit7CisgICAgLy8gRklYTUU6IFJpZ2h0IG5v
dywgd2Ugb25seSBhbGxvdyBsaW5lIGJveGVzIGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVt
cHR5LgorICAgIC8vIFdlIG5lZWQgdG8gZml4IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUg
dmVyeSBsZWFzdCwgaW5saW5lcyBjb250YWluaW5nIG9ubHkKKyAgICAvLyBpZ25vcmFibGUgd2hp
dGVzcGFjZSBzaG91bGQgc2hvdWxkIGFsc28gaGF2ZSBsaW5lIGJveGVzLiAKKyAgICByZXR1cm4g
IWZsb3ctPmZpcnN0Q2hpbGQoKSAmJiBmbG93LT5oYXNIb3Jpem9udGFsQm9yZGVyc1BhZGRpbmdP
ck1hcmdpbigpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0
IElubGluZUl0ZXJhdG9yJiBpdCwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVC
cm9rZUNsZWFubHkpCit7CisgICAgaWYgKGl0Lm9iai0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXQub2JqLT5pc1JlbmRlcklubGlu
ZSgpICYmICFpbmxpbmVGbG93UmVxdWlyZXNMaW5lQm94KHRvUmVuZGVySW5saW5lKGl0Lm9iaikp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVT
cGFjZShpdC5vYmotPnN0eWxlKCksIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkpIHx8IGl0Lm9iai0+aXNCUigpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFVDaGFy
IGN1cnJlbnQgPSBpdC5jdXJyZW50KCk7CisgICAgcmV0dXJuIGN1cnJlbnQgIT0gJyAnICYmIGN1
cnJlbnQgIT0gJ1x0JyAmJiBjdXJyZW50ICE9IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xu
JyB8fCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoaXQub2JqKSkgCisgICAgICAgICAgICAmJiAhc2tp
cE5vbkJyZWFraW5nU3BhY2UoaXQsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkpOworfQorCitib29sIFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVD
aGlsZChSZW5kZXJPYmplY3QqIGlubGluZU9iaiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkpCit7CisgICAgQVNTRVJUKGlubGluZU9iai0+cGFyZW50KCkg
PT0gdGhpcyk7CisKKyAgICBJbmxpbmVJdGVyYXRvciBpdCh0aGlzLCBpbmxpbmVPYmosIDApOwor
ICAgIHdoaWxlICghaXQuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0LCBpc0xpbmVFbXB0
eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSkKKyAgICAgICAgaXQuaW5jcmVtZW50KCk7CisK
KyAgICByZXR1cm4gIWl0LmF0RW5kKCk7Cit9CisKKy8vIEZJWE1FOiBUaGUgZW50aXJlIGNvbmNl
cHQgb2YgdGhlIHNraXBUcmFpbGluZ1doaXRlc3BhY2UgZnVuY3Rpb24gaXMgZmxhd2VkLCBzaW5j
ZSB3ZSByZWFsbHkgbmVlZCB0byBiZSBidWlsZGluZworLy8gbGluZSBib3hlcyBldmVuIGZvciBj
b250YWluZXJzIHRoYXQgbWF5IHVsdGltYXRlbHkgY29sbGFwc2UgYXdheS4gIE90aGVyd2lzZSB3
ZSdsbCBuZXZlciBnZXQgcG9zaXRpb25lZAorLy8gZWxlbWVudHMgcXVpdGUgcmlnaHQuICBJbiBv
dGhlciB3b3Jkcywgd2UgbmVlZCB0byBidWlsZCB0aGlzIGZ1bmN0aW9uJ3Mgd29yayBpbnRvIHRo
ZSBub3JtYWwgbGluZQorLy8gb2JqZWN0IGl0ZXJhdGlvbiBwcm9jZXNzLgorLy8gTkIuIHRoaXMg
ZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW55IGZsb2F0aW5nIGVsZW1lbnRzIHRoYXQgd291bGQgb3Ro
ZXJ3aXNlCisvLyBiZSBza2lwcGVkIGJ1dCBpdCB3aWxsIG5vdCBwb3NpdGlvbiB0aGVtLgordm9p
ZCBSZW5kZXJCbG9jazo6c2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRvciYgaXRl
cmF0b3IsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQor
eworICAgIHdoaWxlICghaXRlcmF0b3IuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0ZXJh
dG9yLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSkgeworICAgICAgICBS
ZW5kZXJPYmplY3QqIG9iamVjdCA9IGl0ZXJhdG9yLm9iajsKKyAgICAgICAgaWYgKG9iamVjdC0+
aXNGbG9hdGluZygpKSB7CisgICAgICAgICAgICBpbnNlcnRGbG9hdGluZ09iamVjdCh0b1JlbmRl
ckJveChvYmplY3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QtPmlzUG9zaXRpb25lZCgp
KSB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBub3Qg
cmVhbGx5IHJpZ2h0LiAgSXQncyBhIGJlc3QtZ3Vlc3MgYXBwcm94aW1hdGlvbiB0aGF0CisgICAg
ICAgICAgICAvLyB3aWxsIHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKKyAgICAgICAgICAgIFJl
bmRlck9iamVjdCogYyA9IG9iamVjdC0+Y29udGFpbmVyKCk7CisgICAgICAgICAgICBpZiAoYy0+
aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICAgICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRp
b25lZCBpbmxpbmUgZW5jbG9zZXMgdXMuICBJbiB0aGlzIGNhc2UsIHdlIGFsc28gaGF2ZSB0byBk
ZXRlcm1pbmUgb3VyCisgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdl
cmUgYW4gaW5saW5lLiAgU2V0IHxzdGF0aWNYfCBhbmQgfHN0YXRpY1l8IG9uIHRoZSByZWxhdGl2
ZSBwb3NpdGlvbmVkCisgICAgICAgICAgICAgICAgLy8gaW5saW5lIHNvIHRoYXQgd2UgY2FuIG9i
dGFpbiB0aGUgdmFsdWUgbGF0ZXIuCisgICAgICAgICAgICAgICAgdG9SZW5kZXJJbmxpbmUoYykt
PmxheWVyKCktPnNldFN0YXRpY1goc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gbGVmdE9m
ZnNldChoZWlnaHQoKSwgZmFsc2UpIDogcmlnaHRPZmZzZXQoaGVpZ2h0KCksIGZhbHNlKSk7Cisg
ICAgICAgICAgICAgICAgdG9SZW5kZXJJbmxpbmUoYyktPmxheWVyKCktPnNldFN0YXRpY1koaGVp
Z2h0KCkpOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgUmVuZGVyQm94KiBib3gg
PSB0b1JlbmRlckJveChvYmplY3QpOworICAgICAgICAgICAgaWYgKGJveC0+c3R5bGUoKS0+aGFz
U3RhdGljWCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJveC0+c3R5bGUoKS0+aXNPcmlnaW5h
bERpc3BsYXlJbmxpbmVUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIGJveC0+bGF5ZXIoKS0+
c2V0U3RhdGljWChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBsZWZ0T2Zmc2V0KGhlaWdo
dCgpLCBmYWxzZSkgOiB3aWR0aCgpIC0gcmlnaHRPZmZzZXQoaGVpZ2h0KCksIGZhbHNlKSk7Cisg
ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBib3gtPmxheWVyKCktPnNl
dFN0YXRpY1goc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gYm9yZGVyTGVmdCgpICsgcGFk
ZGluZ0xlZnQoKSA6IGJvcmRlclJpZ2h0KCkgKyBwYWRkaW5nUmlnaHQoKSk7CisgICAgICAgICAg
ICB9CisgICAgCisgICAgICAgICAgICBpZiAoYm94LT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkpCisg
ICAgICAgICAgICAgICAgYm94LT5sYXllcigpLT5zZXRTdGF0aWNZKGhlaWdodCgpKTsKKyAgICAg
ICAgfQorICAgICAgICBpdGVyYXRvci5pbmNyZW1lbnQoKTsKKyAgICB9Cit9CisKK2ludCBSZW5k
ZXJCbG9jazo6c2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIsIGJvb2wgZmlyc3RMaW5lLCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSkKK3sKKyAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBsaW5lV2lkdGgoaGVpZ2h0
KCksIGZpcnN0TGluZSk7CisgICAgd2hpbGUgKCFyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkg
JiYgIXJlcXVpcmVzTGluZUJveChyZXNvbHZlci5wb3NpdGlvbigpLCBpc0xpbmVFbXB0eSwgcHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KSkgeworICAgICAgICBSZW5kZXJPYmplY3QqIG9iamVjdCA9
IHJlc29sdmVyLnBvc2l0aW9uKCkub2JqOworICAgICAgICBpZiAob2JqZWN0LT5pc0Zsb2F0aW5n
KCkpIHsKKyAgICAgICAgICAgIGluc2VydEZsb2F0aW5nT2JqZWN0KHRvUmVuZGVyQm94KG9iamVj
dCkpOworICAgICAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKKyAgICAgICAgICAgIGF2YWls
YWJsZVdpZHRoID0gbGluZVdpZHRoKGhlaWdodCgpLCBmaXJzdExpbmUpOworICAgICAgICB9IGVs
c2UgaWYgKG9iamVjdC0+aXNQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBU
aGUgbWF0aCBoZXJlIGlzIGFjdHVhbGx5IG5vdCByZWFsbHkgcmlnaHQuICBJdCdzIGEgYmVzdC1n
dWVzcyBhcHByb3hpbWF0aW9uIHRoYXQKKyAgICAgICAgICAgIC8vIHdpbGwgd29yayBmb3IgdGhl
IGNvbW1vbiBjYXNlcworICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBjID0gb2JqZWN0LT5jb250
YWluZXIoKTsKKyAgICAgICAgICAgIGlmIChjLT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAg
ICAgICAgICAgLy8gQSByZWxhdGl2ZSBwb3NpdGlvbmVkIGlubGluZSBlbmNsb3NlcyB1cy4gIElu
IHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBvdXIKKyAgICAgICAgICAgICAg
ICAvLyBwb3NpdGlvbiBhcyB0aG91Z2ggd2Ugd2VyZSBhbiBpbmxpbmUuICBTZXQgfHN0YXRpY1h8
IGFuZCB8c3RhdGljWXwgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uZWQKKyAgICAgICAgICAgICAg
ICAvLyBpbmxpbmUgc28gdGhhdCB3ZSBjYW4gb2J0YWluIHRoZSB2YWx1ZSBsYXRlci4KKyAgICAg
ICAgICAgICAgICB0b1JlbmRlcklubGluZShjKS0+bGF5ZXIoKS0+c2V0U3RhdGljWChzdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExpbmUpIDog
cmlnaHRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSkpOworICAgICAgICAgICAgICAgIHRvUmVu
ZGVySW5saW5lKGMpLT5sYXllcigpLT5zZXRTdGF0aWNZKGhlaWdodCgpKTsKKyAgICAgICAgICAg
IH0KKyAgICAKKyAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gob2JqZWN0
KTsKKyAgICAgICAgICAgIGlmIChib3gtPnN0eWxlKCktPmhhc1N0YXRpY1goKSkgeworICAgICAg
ICAgICAgICAgIGlmIChib3gtPnN0eWxlKCktPmlzT3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgp
KQorICAgICAgICAgICAgICAgICAgICBib3gtPmxheWVyKCktPnNldFN0YXRpY1goc3R5bGUoKS0+
ZGlyZWN0aW9uKCkgPT0gTFRSID8gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKSA6IHdp
ZHRoKCkgLSByaWdodE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKSk7CisgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBib3gtPmxheWVyKCktPnNldFN0YXRpY1goc3R5
bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKSA6
IGJvcmRlclJpZ2h0KCkgKyBwYWRkaW5nUmlnaHQoKSk7CisgICAgICAgICAgICB9CisgICAgCisg
ICAgICAgICAgICBpZiAoYm94LT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkpCisgICAgICAgICAgICAg
ICAgYm94LT5sYXllcigpLT5zZXRTdGF0aWNZKGhlaWdodCgpKTsKKyAgICAgICAgfQorICAgICAg
ICByZXNvbHZlci5pbmNyZW1lbnQoKTsKKyAgICB9CisgICAgcmVzb2x2ZXIuY29tbWl0RXhwbGlj
aXRFbWJlZGRpbmcoKTsKKyAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7Cit9CisKKy8vIFRoaXMg
aXMgY3VycmVudGx5IGp1c3QgdXNlZCBmb3IgbGlzdCBtYXJrZXJzIGFuZCBpbmxpbmUgZmxvd3Mg
dGhhdCBoYXZlIGxpbmUgYm94ZXMuIE5laXRoZXIgc2hvdWxkIAorLy8gaGF2ZSBhbiBlZmZlY3Qg
b24gd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuIAorc3RhdGljIGJvb2wgc2hv
dWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrKiBibG9jaywgUmVu
ZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUpCit7Cisg
ICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHQoYmxvY2ssIG8pOworICAgIGlmIChuZXh0
ICYmICFuZXh0LT5pc0JSKCkgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5leHQp
LT50ZXh0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9S
ZW5kZXJUZXh0KG5leHQpOworICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5jaGFy
YWN0ZXJzKClbMF07CisgICAgICAgIGlmIChuZXh0VGV4dC0+c3R5bGUoKS0+aXNDb2xsYXBzaWJs
ZVdoaXRlU3BhY2UobmV4dENoYXIpKSB7CisgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlk
cG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
UmVuZGVyQmxvY2s6OmZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGlu
ZSwgaW50JiBhdmFpbGFibGVXaWR0aCkKK3sKKyAgICBBU1NFUlQod2lkdGhUb0ZpdCA+IGF2YWls
YWJsZVdpZHRoKTsKKworICAgIGludCBmbG9hdEJvdHRvbTsKKyAgICBpbnQgbGFzdEZsb2F0Qm90
dG9tID0gaGVpZ2h0KCk7CisgICAgaW50IG5ld0xpbmVXaWR0aCA9IGF2YWlsYWJsZVdpZHRoOwor
ICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGZsb2F0Qm90dG9tID0gbmV4dEZsb2F0Qm90dG9t
QmVsb3cobGFzdEZsb2F0Qm90dG9tKTsKKyAgICAgICAgaWYgKCFmbG9hdEJvdHRvbSkKKyAgICAg
ICAgICAgIGJyZWFrOworCisgICAgICAgIG5ld0xpbmVXaWR0aCA9IGxpbmVXaWR0aChmbG9hdEJv
dHRvbSwgZmlyc3RMaW5lKTsKKyAgICAgICAgbGFzdEZsb2F0Qm90dG9tID0gZmxvYXRCb3R0b207
CisgICAgICAgIGlmIChuZXdMaW5lV2lkdGggPj0gd2lkdGhUb0ZpdCkKKyAgICAgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIGlmIChuZXdMaW5lV2lkdGggPiBhdmFpbGFibGVXaWR0aCkgewor
ICAgICAgICBzZXRIZWlnaHQobGFzdEZsb2F0Qm90dG9tKTsKKyAgICAgICAgYXZhaWxhYmxlV2lk
dGggPSBuZXdMaW5lV2lkdGg7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHRl
eHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNv
bnN0IEZvbnQmIGZvbnQsIGludCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBz
ZVdoaXRlU3BhY2UpCit7CisgICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVuID09
IHRleHQtPnRleHRMZW5ndGgoKSkpCisgICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBs
ZW4sIGZvbnQsIHhQb3MpOworICAgIHJldHVybiBmb250LndpZHRoKFRleHRSdW4odGV4dC0+Y2hh
cmFjdGVycygpICsgZnJvbSwgbGVuLCAhY29sbGFwc2VXaGl0ZVNwYWNlLCB4UG9zKSk7Cit9CisK
K0lubGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyLCBib29sIGZpcnN0TGluZSwgIGJvb2wmIGlzTGluZUVtcHR5LCBi
b29sJiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEVDbGVhciogY2xlYXIpCit7CisgICAgQVNTRVJUKHJlc29s
dmVyLnBvc2l0aW9uKCkuYmxvY2sgPT0gdGhpcyk7CisKKyAgICBib29sIGFwcGxpZWRTdGFydFdp
ZHRoID0gcmVzb2x2ZXIucG9zaXRpb24oKS5wb3MgPiAwOworICAgIExpbmVNaWRwb2ludFN0YXRl
JiBsaW5lTWlkcG9pbnRTdGF0ZSA9IHJlc29sdmVyLm1pZHBvaW50U3RhdGUoKTsKKyAgICAKKyAg
ICBpbnQgd2lkdGggPSBza2lwTGVhZGluZ1doaXRlc3BhY2UocmVzb2x2ZXIsIGZpcnN0TGluZSwg
aXNMaW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7CisKKyAgICBpbnQgdyA9IDA7
CisgICAgaW50IHRtcFcgPSAwOworCisgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQo
KSkKKyAgICAgICAgcmV0dXJuIHJlc29sdmVyLnBvc2l0aW9uKCk7CisKKyAgICAvLyBUaGlzIHZh
cmlhYmxlIGlzIHVzZWQgb25seSBpZiB3aGl0ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBp
dCB0ZWxscyB1cyB3aGV0aGVyCisgICAgLy8gb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jp
bmcgd2hpdGVzcGFjZS4KKyAgICBib29sIGlnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgSW5s
aW5lSXRlcmF0b3IgaWdub3JlU3RhcnQ7CisgICAgCisgICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFj
a3Mgd2hldGhlciB0aGUgdmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuICBX
ZSB1c2UKKyAgICAvLyB0aGlzIHRvIGRldGVjdCB3aGVuIHdlIGVuY291bnRlciBhIHNlY29uZCBz
cGFjZSBzbyB3ZSBrbm93IHdlIGhhdmUgdG8gdGVybWluYXRlCisgICAgLy8gYSBydW4uCisgICAg
Ym9vbCBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOworICAgIGJvb2wgY3VycmVudENo
YXJhY3RlcklzV1MgPSBmYWxzZTsKKyAgICBSZW5kZXJPYmplY3QqIHRyYWlsaW5nU3BhY2VPYmpl
Y3QgPSAwOworCisgICAgSW5saW5lSXRlcmF0b3IgbEJyZWFrID0gcmVzb2x2ZXIucG9zaXRpb24o
KTsKKworICAgIFJlbmRlck9iamVjdCAqbyA9IHJlc29sdmVyLnBvc2l0aW9uKCkub2JqOworICAg
IFJlbmRlck9iamVjdCAqbGFzdCA9IG87CisgICAgdW5zaWduZWQgcG9zID0gcmVzb2x2ZXIucG9z
aXRpb24oKS5wb3M7CisgICAgaW50IG5leHRCcmVha2FibGUgPSByZXNvbHZlci5wb3NpdGlvbigp
Lm5leHRCcmVha2FibGVQb3NpdGlvbjsKKyAgICBib29sIGF0U3RhcnQgPSB0cnVlOworCisgICAg
Ym9vbCBwcmV2TGluZUJyb2tlQ2xlYW5seSA9IHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seTsKKyAg
ICBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSBmYWxzZTsKKworICAgIGJvb2wgYXV0b1dyYXBX
YXNFdmVyVHJ1ZU9uTGluZSA9IGZhbHNlOworICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1
ZTsKKyAgICAKKyAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2Vs
bCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKKyAgICAvLyB2ZXJ5IHNw
ZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5k
ZXJpbmdzKS4gCisgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMg
dG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKKyAg
ICBib29sIGFsbG93SW1hZ2VzVG9CcmVhayA9ICFzdHlsZSgpLT5odG1sSGFja3MoKSB8fCAhaXNU
YWJsZUNlbGwoKSB8fCAhc3R5bGUoKS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpOworCisg
ICAgRVdoaXRlU3BhY2UgY3VycldTID0gc3R5bGUoKS0+d2hpdGVTcGFjZSgpOworICAgIEVXaGl0
ZVNwYWNlIGxhc3RXUyA9IGN1cnJXUzsKKyAgICB3aGlsZSAobykgeworICAgICAgICBjdXJyV1Mg
PSBvLT5pc1JlcGxhY2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDog
by0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpOworICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxh
Y2VkKCkgPyBsYXN0LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5
bGUoKS0+d2hpdGVTcGFjZSgpOworICAgICAgICAKKyAgICAgICAgYm9vbCBhdXRvV3JhcCA9IFJl
bmRlclN0eWxlOjphdXRvV3JhcChjdXJyV1MpOworICAgICAgICBhdXRvV3JhcFdhc0V2ZXJUcnVl
T25MaW5lID0gYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBhdXRvV3JhcDsKKworI2lmIEVO
QUJMRShTVkcpCisgICAgICAgIGJvb2wgcHJlc2VydmVOZXdsaW5lID0gby0+aXNTVkdUZXh0KCkg
PyBmYWxzZSA6IFJlbmRlclN0eWxlOjpwcmVzZXJ2ZU5ld2xpbmUoY3VycldTKTsKKyNlbHNlCisg
ICAgICAgIGJvb2wgcHJlc2VydmVOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3bGlu
ZShjdXJyV1MpOworI2VuZGlmCisKKyAgICAgICAgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UgPSBS
ZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7CisgICAgICAgICAgICAKKyAg
ICAgICAgaWYgKG8tPmlzQlIoKSkgeworICAgICAgICAgICAgaWYgKHcgKyB0bXBXIDw9IHdpZHRo
KSB7CisgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJy
ZWFrLnBvcyA9IDA7CisgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlv
biA9IC0xOworICAgICAgICAgICAgICAgIGxCcmVhay5pbmNyZW1lbnQoKTsKKworICAgICAgICAg
ICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBs
aW5lIGJlIGNvbGxhcHNlZAorICAgICAgICAgICAgICAgIC8vIGF3YXkuIEFsc28sIHRoZSBzcGFj
ZSBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoIGEgPGJyPiBkb2VzIG5vdAorICAgICAgICAgICAg
ICAgIC8vIGdldCBjb2xsYXBzZWQgYXdheS4gIEl0IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBwcmV2
aW91cyBsaW5lIGJyb2tlCisgICAgICAgICAgICAgICAgLy8gY2xlYW5seS4gIE90aGVyd2lzZSB0
aGUgPGJyPiBoYXMgbm8gZWZmZWN0IG9uIHdoZXRoZXIgdGhlIGxpbmUgaXMKKyAgICAgICAgICAg
ICAgICAvLyBlbXB0eSBvciBub3QuCisgICAgICAgICAgICAgICAgaWYgKHByZXZMaW5lQnJva2VD
bGVhbmx5KQorICAgICAgICAgICAgICAgICAgICBpc0xpbmVFbXB0eSA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIHRyYWlsaW5nU3BhY2VPYmplY3QgPSAwOworICAgICAgICAgICAgICAgIHByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIWlzTGlu
ZUVtcHR5ICYmIGNsZWFyKQorICAgICAgICAgICAgICAgICAgICAqY2xlYXIgPSBvLT5zdHlsZSgp
LT5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoby0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7CisgICAgICAg
ICAgICAvLyBhZGQgdG8gc3BlY2lhbCBvYmplY3RzLi4uCisgICAgICAgICAgICBpZiAoby0+aXNG
bG9hdGluZygpKSB7CisgICAgICAgICAgICAgICAgUmVuZGVyQm94KiBmbG9hdEJveCA9IHRvUmVu
ZGVyQm94KG8pOworICAgICAgICAgICAgICAgIGluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0Qm94
KTsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxp
bmUuCisgICAgICAgICAgICAgICAgLy8gSWYgaXQgZG9lcywgcG9zaXRpb24gaXQgbm93LCBvdGhl
cndpc2UsIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgLy8gaXQgYWZ0ZXIgbW92aW5nIHRvIG5l
eHQgbGluZSAoaW4gbmV3TGluZSgpIGZ1bmMpCisgICAgICAgICAgICAgICAgaWYgKGZsb2F0c0Zp
dE9uTGluZSAmJiBmbG9hdEJveC0+d2lkdGgoKSArIGZsb2F0Qm94LT5tYXJnaW5MZWZ0KCkgKyBm
bG9hdEJveC0+bWFyZ2luUmlnaHQoKSArIHcgKyB0bXBXIDw9IHdpZHRoKSB7CisgICAgICAgICAg
ICAgICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgICAgICAgICAgICAgICAgIHdpZHRo
ID0gbGluZVdpZHRoKGhlaWdodCgpLCBmaXJzdExpbmUpOworICAgICAgICAgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgICAgICAgICBmbG9hdHNGaXRPbkxpbmUgPSBmYWxzZTsKKyAgICAgICAg
ICAgIH0gZWxzZSBpZiAoby0+aXNQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJ
ZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXNuJ3QgYW4gaW5saW5lIHR5cGUsIHRoZW4gd2UgY2Fu
CisgICAgICAgICAgICAgICAgLy8gZ28gYWhlYWQgYW5kIGRldGVybWluZSBvdXIgc3RhdGljIHgg
cG9zaXRpb24gbm93LgorICAgICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJC
b3gobyk7CisgICAgICAgICAgICAgICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3gtPnN0eWxlKCkt
PmlzT3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpOworICAgICAgICAgICAgICAgIGJvb2wgbmVl
ZFRvU2V0U3RhdGljWCA9IGJveC0+c3R5bGUoKS0+aGFzU3RhdGljWCgpOworICAgICAgICAgICAg
ICAgIGlmIChib3gtPnN0eWxlKCktPmhhc1N0YXRpY1goKSAmJiAhaXNJbmxpbmVUeXBlKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljWChvLT5wYXJlbnQoKS0+
c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBib3JkZXJMZWZ0KCkgKyBwYWRkaW5nTGVmdCgpIDoKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBib3JkZXJSaWdodCgpICsgcGFkZGluZ1JpZ2h0KCkpOworICAgICAg
ICAgICAgICAgICAgICBuZWVkVG9TZXRTdGF0aWNYID0gZmFsc2U7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2FzIGFuIElO
TElORSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVhZAorICAgICAgICAgICAgICAgIC8vIGFuZCBk
ZXRlcm1pbmUgb3VyIHN0YXRpYyB5IHBvc2l0aW9uIG5vdy4KKyAgICAgICAgICAgICAgICBib29s
IG5lZWRUb1NldFN0YXRpY1kgPSBib3gtPnN0eWxlKCktPmhhc1N0YXRpY1koKTsKKyAgICAgICAg
ICAgICAgICBpZiAoYm94LT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkgJiYgaXNJbmxpbmVUeXBlKSB7
CisgICAgICAgICAgICAgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljWShoZWlnaHQoKSk7
CisgICAgICAgICAgICAgICAgICAgIG5lZWRUb1NldFN0YXRpY1kgPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYm9vbCBuZWVkVG9D
cmVhdGVMaW5lQm94ID0gbmVlZFRvU2V0U3RhdGljWCB8fCBuZWVkVG9TZXRTdGF0aWNZOworICAg
ICAgICAgICAgICAgIFJlbmRlck9iamVjdCogYyA9IG8tPmNvbnRhaW5lcigpOworICAgICAgICAg
ICAgICAgIGlmIChjLT5pc1JlbmRlcklubGluZSgpICYmICghbmVlZFRvU2V0U3RhdGljWCB8fCAh
bmVlZFRvU2V0U3RhdGljWSkpCisgICAgICAgICAgICAgICAgICAgIG5lZWRUb0NyZWF0ZUxpbmVC
b3ggPSB0cnVlOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2Vz
LCB3ZSBoYXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCisgICAgICAgICAg
ICAgICAgLy8gdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAgICAgICAgICAg
ICAgaWYgKG5lZWRUb0NyZWF0ZUxpbmVCb3gpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxp
bmdTcGFjZU9iamVjdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlnbm9yZVN0YXJ0Lm9iaiA9
IG87CisgICAgICAgICAgICAgICAgICAgIGlnbm9yZVN0YXJ0LnBvcyA9IDA7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAg
YWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIGlnbm9yZVN0YXJ0KTsgLy8gU3RvcCBpZ25v
cmluZyBzcGFjZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlk
cG9pbnRTdGF0ZSwgaWdub3JlU3RhcnQpOyAvLyBTdGFydCBpZ25vcmluZyBhZ2Fpbi4KKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoby0+aXNSZW5kZXJJbmxpbmUoKSkg
eworICAgICAgICAgICAgLy8gUmlnaHQgbm93LCB3ZSBzaG91bGQgb25seSBlbmNvdW50ZXIgZW1w
dHkgaW5saW5lcyBoZXJlLgorICAgICAgICAgICAgQVNTRVJUKCFvLT5maXJzdENoaWxkKCkpOwor
ICAgIAorICAgICAgICAgICAgUmVuZGVySW5saW5lKiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUo
byk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZs
b3dzIGhhdmUgbGluZSBib3hlcywgaWYgd2UgYXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3
ZSBuZWVkIAorICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3RvcCB0byBpbmNs
dWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4gCisg
ICAgICAgICAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUs
IHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFuZCAKKyAgICAgICAgICAgIC8v
IHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4KKyAgICAgICAgICAgIGlmIChpbmxpbmVGbG93UmVxdWly
ZXNMaW5lQm94KGZsb3dCb3gpKSB7CisgICAgICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpIHsKKyAgICAgICAgICAgICAg
ICAgICAgdHJhaWxpbmdTcGFjZU9iamVjdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGFkZE1p
ZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAwKSk7IC8vIFN0
b3AgaWdub3Jpbmcgc3BhY2VzLgorICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5l
TWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOyAvLyBTdGFydCBpZ25vcmlu
ZyBhZ2Fpbi4KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlKCktPmNvbGxhcHNlV2hp
dGVTcGFjZSgpICYmIHJlc29sdmVyLnBvc2l0aW9uKCkub2JqID09IG8KKyAgICAgICAgICAgICAg
ICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KHRoaXMsIG8sIGxp
bmVNaWRwb2ludFN0YXRlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIHdpdGggbGlz
dCBtYXJrZXJzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFrZSBzdXJlIHRoYXQgYW55
IAorICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUgd2lsbCBi
ZSBkaXNjYXJkZWQuCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENoYXJhY3RlcklzV1MgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICBpZ25vcmluZ1NwYWNlcyA9IHRydWU7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXBXICs9IGZsb3dCb3gtPm1h
cmdpbkxlZnQoKSArIGZsb3dCb3gtPmJvcmRlckxlZnQoKSArIGZsb3dCb3gtPnBhZGRpbmdMZWZ0
KCkgKworICAgICAgICAgICAgICAgICAgICBmbG93Qm94LT5tYXJnaW5SaWdodCgpICsgZmxvd0Jv
eC0+Ym9yZGVyUmlnaHQoKSArIGZsb3dCb3gtPnBhZGRpbmdSaWdodCgpOworICAgICAgICB9IGVs
c2UgaWYgKG8tPmlzUmVwbGFjZWQoKSkgeworICAgICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNl
ZEJveCA9IHRvUmVuZGVyQm94KG8pOworCisgICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNl
ZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4KKyAgICAgICAgICAg
IGlmICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+
aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKKyAgICAgICAgICAgICAgICB3ICs9
IHRtcFc7CisgICAgICAgICAgICAgICAgdG1wVyA9IDA7CisgICAgICAgICAgICAgICAgbEJyZWFr
Lm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7CisgICAgICAgICAgICAg
ICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCisgICAgICAgICAgICAgICAgYWRkTWlkcG9p
bnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIDApKTsKKworICAgICAg
ICAgICAgaXNMaW5lRW1wdHkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlnbm9yaW5nU3BhY2VzID0g
ZmFsc2U7CisgICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOworICAg
ICAgICAgICAgY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyYWls
aW5nU3BhY2VPYmplY3QgPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBPcHRpbWl6
ZSBmb3IgYSBjb21tb24gY2FzZS4gSWYgd2UgY2FuJ3QgZmluZCB3aGl0ZXNwYWNlIGFmdGVyIHRo
ZSBsaXN0CisgICAgICAgICAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuIC1kd2gK
KyAgICAgICAgICAgIGlmIChvLT5pc0xpc3RNYXJrZXIoKSAmJiAhc3RhdGljX2Nhc3Q8UmVuZGVy
TGlzdE1hcmtlcio+KG8pLT5pc0luc2lkZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0eWxl
KCktPmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFy
dE9iamVjdCh0aGlzLCBvLCBsaW5lTWlkcG9pbnRTdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gTGlrZSB3aXRoIGlubGluZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRv
IG1ha2Ugc3VyZSB0aGF0IGFueSAKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBz
cGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgICAgICAgICAgICAgICAgICBjdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRD
aGFyYWN0ZXJJc1dTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWdub3JpbmdTcGFjZXMg
PSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2lu
TGVmdCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKKyAg
ICAgICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSkgeworICAgICAgICAgICAgaWYgKCFwb3MpCisg
ICAgICAgICAgICAgICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKKworICAgICAgICAgICAg
UmVuZGVyVGV4dCogdCA9IHRvUmVuZGVyVGV4dChvKTsKKworICAgICAgICAgICAgaW50IHN0cmxl
biA9IHQtPnRleHRMZW5ndGgoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4gLSBwb3M7
CisgICAgICAgICAgICBjb25zdCBVQ2hhciogc3RyID0gdC0+Y2hhcmFjdGVycygpOworCisgICAg
ICAgICAgICBjb25zdCBGb250JiBmID0gdC0+c3R5bGUoZmlyc3RMaW5lKS0+Zm9udCgpOworICAg
ICAgICAgICAgYm9vbCBpc0ZpeGVkUGl0Y2ggPSBmLmlzRml4ZWRQaXRjaCgpOworCisgICAgICAg
ICAgICBpbnQgbGFzdFNwYWNlID0gcG9zOworICAgICAgICAgICAgaW50IHdvcmRTcGFjaW5nID0g
by0+c3R5bGUoKS0+d29yZFNwYWNpbmcoKTsKKyAgICAgICAgICAgIGludCBsYXN0U3BhY2VXb3Jk
U3BhY2luZyA9IDA7CisKKyAgICAgICAgICAgIGludCB3cmFwVyA9IHRtcFcgKyBpbmxpbmVXaWR0
aChvLCAhYXBwbGllZFN0YXJ0V2lkdGgsIHRydWUpOworICAgICAgICAgICAgaW50IGNoYXJXaWR0
aCA9IDA7CisgICAgICAgICAgICBib29sIGJyZWFrTkJTUCA9IGF1dG9XcmFwICYmIG8tPnN0eWxl
KCktPm5ic3BNb2RlKCkgPT0gU1BBQ0U7CisgICAgICAgICAgICAvLyBBdXRvLXdyYXBwaW5nIHRl
eHQgc2hvdWxkIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBu
b3Qgd3JhcCBiZWZvcmUgdGhlIHdvcmQsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBvbmx5IHBv
c3NpYmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZSwgdGhhdCBp
cywgaWYgfHd8IGlzIHplcm8uCisgICAgICAgICAgICBib29sIGJyZWFrV29yZHMgPSBvLT5zdHls
ZSgpLT5icmVha1dvcmRzKCkgJiYgKChhdXRvV3JhcCAmJiAhdykgfHwgY3VycldTID09IFBSRSk7
CisgICAgICAgICAgICBib29sIG1pZFdvcmRCcmVhayA9IGZhbHNlOworICAgICAgICAgICAgYm9v
bCBicmVha0FsbCA9IG8tPnN0eWxlKCktPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFr
ICYmIGF1dG9XcmFwOworCisgICAgICAgICAgICBpZiAodC0+aXNXb3JkQnJlYWsoKSkgeworICAg
ICAgICAgICAgICAgIHcgKz0gdG1wVzsKKyAgICAgICAgICAgICAgICB0bXBXID0gMDsKKyAgICAg
ICAgICAgICAgICBsQnJlYWsub2JqID0gbzsKKyAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0g
MDsKKyAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Cisg
ICAgICAgICAgICAgICAgQVNTRVJUKCFsZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB3aGlsZSAobGVuKSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3Rlcklz
U3BhY2UgPSBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKyAgICAgICAgICAgICAgICBib29sIHBy
ZXZpb3VzQ2hhcmFjdGVySXNXUyA9IGN1cnJlbnRDaGFyYWN0ZXJJc1dTOworICAgICAgICAgICAg
ICAgIFVDaGFyIGMgPSBzdHJbcG9zXTsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIXByZXNlcnZlTmV3bGluZSAmJiAo
YyA9PSAnXG4nKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWNvbGxhcHNlV2hpdGVTcGFjZSB8
fCAhY3VycmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAgICAgICAgICAgICAgIGlzTGluZUVt
cHR5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sg
Zm9yIHNvZnQgaHlwaGVucy4gIEdvIGFoZWFkIGFuZCBpZ25vcmUgdGhlbS4KKyAgICAgICAgICAg
ICAgICBpZiAoYyA9PSBzb2Z0SHlwaGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaWdu
b3JpbmdTcGFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzb2Z0IGh5
cGhlbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUl0ZXJhdG9yIGJlZm9yZVNvZnRI
eXBoZW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJlZm9yZVNvZnRIeXBoZW4gPSBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3Mg
LSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBiZWZvcmVTb2Z0SHlwaGVuID0gSW5saW5lSXRlcmF0b3IoMCwgbGFzdCwgbGFzdC0+
aXNUZXh0KCkgPyB0b1JlbmRlclRleHQobGFzdCktPnRleHRMZW5ndGgoKSAtIDEgOiAwKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFR3byBjb25zZWN1dGl2ZSBzb2Z0IGh5cGhlbnMuIEF2
b2lkIG92ZXJsYXBwaW5nIG1pZHBvaW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChs
aW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9p
bnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDFdLm9iaiA9PSBvICYmIAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1tsaW5l
TWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXS5wb3MgPT0gcG9zKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOworICAgICAg
ICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1p
ZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBiZWZvcmVTb2Z0SHlwaGVuKTsKKworICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gQWRkIHRoZSB3aWR0aCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0
aGUgaHlwaGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wVyArPSB0ZXh0V2lkdGgodCwg
bGFzdFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIGYsIHcgKyB0bXBXLCBpc0ZpeGVkUGl0Y2gsIGNv
bGxhcHNlV2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKworICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gRm9yIHdyYXBwaW5nIHRleHQgb25seSwgaW5jbHVkZSB0aGUgaHlwaGVu
LiAgV2UgbmVlZCB0byBlbnN1cmUgaXQgd2lsbCBmaXQKKyAgICAgICAgICAgICAgICAgICAgICAg
IC8vIG9uIHRoZSBsaW5lIGlmIGl0IHNob3dzIHdoZW4gd2UgYnJlYWsuCisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoYXV0b1dyYXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1w
VyArPSB0ZXh0V2lkdGgodCwgcG9zLCAxLCBmLCB3ICsgdG1wVywgaXNGaXhlZFBpdGNoLCBjb2xs
YXBzZVdoaXRlU3BhY2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVJdGVyYXRv
ciBhZnRlclNvZnRIeXBoZW4oMCwgbywgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFm
dGVyU29mdEh5cGhlbi5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1p
ZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBhZnRlclNvZnRIeXBoZW4pOworICAgICAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAg
ICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7
CisgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IHBvczsgLy8gQ2hlZXN5IGhhY2sgdG8g
cHJldmVudCBhZGRpbmcgaW4gd2lkdGhzIG9mIHRoZSBydW4gdHdpY2UuCisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICAKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVySXNXUyA9IGN1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlIHx8IChicmVha05CU1AgJiYgYyA9PSBub0JyZWFrU3BhY2UpOworCisgICAg
ICAgICAgICAgICAgaWYgKChicmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAhbWlkV29yZEJyZWFr
KSB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0aDsKKyAgICAgICAgICAg
ICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIHBvcywgMSwgZiwgdyArIHdyYXBXLCBp
c0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIG1p
ZFdvcmRCcmVhayA9IHcgKyB3cmFwVyArIGNoYXJXaWR0aCA+IHdpZHRoOworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2wgYmV0d2VlbldvcmRzID0gYyA9PSAnXG4nIHx8
IChjdXJyV1MgIT0gUFJFICYmICFhdFN0YXJ0ICYmIGlzQnJlYWthYmxlKHN0ciwgcG9zLCBzdHJs
ZW4sIG5leHRCcmVha2FibGUsIGJyZWFrTkJTUCkpOworICAgIAorICAgICAgICAgICAgICAgIGlm
IChiZXR3ZWVuV29yZHMgfHwgbWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICAgICAgICAgIGJv
b2wgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlm
IChpZ25vcmluZ1NwYWNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50
Q2hhcmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3Ag
aWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gbmV3IHBvaW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yaW5n
U3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlV29y
ZFNwYWNpbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IHBv
czsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRoZSBpZ25vcmVk
IHNwYWNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlk
cG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgcG9zKSk7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBr
ZWVwIGlnbm9yaW5nIHRoZXNlIHNwYWNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
b3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBhZGRpdGlvbmFsVG1w
VyA9IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwgZiwgdyArIHRtcFcs
IGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5n
OworICAgICAgICAgICAgICAgICAgICB0bXBXICs9IGFkZGl0aW9uYWxUbXBXOworICAgICAgICAg
ICAgICAgICAgICBpZiAoIWFwcGxpZWRTdGFydFdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICB0bXBXICs9IGlubGluZVdpZHRoKG8sIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGFwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlXb3JkU3Bh
Y2luZyA9ICB3b3JkU3BhY2luZyAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhcHJldmlv
dXNDaGFyYWN0ZXJJc1NwYWNlOworCisgICAgICAgICAgICAgICAgICAgIGlmICghdyAmJiBhdXRv
V3JhcCAmJiB0bXBXID4gd2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBmaXRCZWxvd0Zs
b2F0cyh0bXBXLCBmaXJzdExpbmUsIHdpZHRoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAo
YXV0b1dyYXAgfHwgYnJlYWtXb3JkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYg
d2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhlIGN1cnJlbnQgY2hh
cmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9y
IHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCAm
JiBjdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBvLT5zdHlsZSgpLT5icmVha09ubHlBZnRlcldoaXRl
U3BhY2UoKSAmJiAhbWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBwb3MsIDEsIGYsIHcgKyB0bXBXLCBpc0ZpeGVk
UGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyAoYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFj
aW5nIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGluZSBp
cyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBJZiBpdCBpcyBub3QsIGRvIG5v
dGhpbmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIG5lZWRz
IHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLCAKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJlYWsgdG8gdGhlIHNwYWNlIGFuZCBz
a2lwIGFsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRl
c3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgKyB0bXBXICsgY2hhcldp
ZHRoID4gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rv
b1dpZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsQnJlYWsub2Jq
ID0gbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3Np
dGlvbiA9IG5leHRCcmVha2FibGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNr
aXBUcmFpbGluZ1doaXRlc3BhY2UobEJyZWFrLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUg
fHwgdyArIHRtcFcgPiB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChs
QnJlYWsub2JqICYmIHNob3VsZFByZXNlcnZlTmV3bGluZShsQnJlYWsub2JqKSAmJiBsQnJlYWsu
b2JqLT5pc1RleHQoKSAmJiAhdG9SZW5kZXJUZXh0KGxCcmVhay5vYmopLT5pc1dvcmRCcmVhaygp
ICYmIHRvUmVuZGVyVGV4dChsQnJlYWsub2JqKS0+Y2hhcmFjdGVycygpW2xCcmVhay5wb3NdID09
ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkSWdu
b3JpbmdTcGFjZXMgJiYgcG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gV2UgbmVlZCB0byBzdG9wIHJpZ2h0IGJlZm9yZSB0aGUgbmV3bGluZSBhbmQgdGhl
biBzdGFydCB1cCBhZ2Fpbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFk
ZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MgLSAx
KSk7IC8vIFN0b3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBv
aW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MpKTsgLy8gU3Rh
cnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBsQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSA9IHRydWU7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOyAv
LyBEaWRuJ3QgZml0LiBKdW1wIHRvIHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmV0d2VlbldvcmRzIHx8
IChtaWRXb3JkQnJlYWsgJiYgIWF1dG9XcmFwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdG1wVyAtPSBhZGRpdGlvbmFsVG1wVzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAocG9zID4gMCAmJiBzdHJbcG9zLTFdID09IHNvZnRIeXBoZW4pCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSB3aWR0aCBvZiB0aGUgc29mdCBoeXBo
ZW4gb3V0IHNpbmNlIHdlIGZpdCBvbiBhIGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRtcFcgLT0gdGV4dFdpZHRoKHQsIHBvcyAtIDEsIDEsIGYsIHcgKyB0bXBXLCBpc0Zp
eGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAn
XG4nICYmIHByZXNlcnZlTmV3bGluZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFz
dG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgcG9zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCByaWdodCBiZWZvcmUgdGhlIG5ld2xpbmUgYW5kIHRo
ZW4gc3RhcnQgdXAgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWlkcG9p
bnQobGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIHBvcyAtIDEpKTsgLy8g
U3RvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2lu
dFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MpKTsgLy8gU3RhcnQKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwor
ICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSBuZXh0QnJlYWthYmxlOwor
ICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLmluY3JlbWVudCgpOworICAgICAgICAgICAg
ICAgICAgICAgICAgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBsQnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgICAgICBpZiAoYXV0b1dyYXAgJiYgYmV0d2VlbldvcmRzKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICB3ICs9IHRtcFc7CisgICAgICAgICAgICAgICAgICAgICAgICB3cmFw
VyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBXID0gMDsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGxCcmVhay5vYmogPSBvOworICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFr
LnBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxl
UG9zaXRpb24gPSBuZXh0QnJlYWthYmxlOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXV0
by13cmFwcGluZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBv
bmNlIGl0IGhhcyBoYWQgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wcG9ydHVuaXR5
IHRvIGJyZWFrIGFmdGVyIGEgd29yZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrV29y
ZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAgICAgaWYgKG1pZFdvcmRCcmVhaykgeworICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNl
CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIGVuZCB3aWR0aCBmb3JjZXMg
YSBicmVhay4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOworICAgICAg
ICAgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSBuZXh0QnJlYWthYmxlOworICAgICAg
ICAgICAgICAgICAgICAgICAgbWlkV29yZEJyZWFrICY9IChicmVha1dvcmRzIHx8IGJyZWFrQWxs
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChiZXR3
ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5n
ID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGxhc3RTcGFjZSA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmluZ1NwYWNlcyAmJiBv
LT5zdHlsZSgpLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgbmV3bGluZSwgb3IgaWYgd2UgZW5jb3VudGVyIGEKKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIHNlY29uZCBzcGFjZSwgd2UgbmVlZCB0byBnbyBhaGVh
ZCBhbmQgYnJlYWsgdXAgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIGFuZCBl
bnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBzcGFjZXMuCisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlvdXNDaGFy
YWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JpbmdTcGFj
ZXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJlZCBhIG1vZGUgd2hlcmUgd2UgYXJlIGlnbm9y
aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2VzLiBDcmVhdGUgYSBtaWRw
b2ludCB0byB0ZXJtaW5hdGUgdGhlIHJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IGJlZm9yZSB0aGUgc2Vjb25kIHNwYWNlLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
ZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgaWdub3JlU3RhcnQpOworICAgICAgICAgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChpZ25vcmluZ1NwYWNlcykgeworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGln
bm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBu
ZXcgcG9pbnQuCisgICAgICAgICAgICAgICAgICAgIGlnbm9yaW5nU3BhY2VzID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2lu
ZyA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gcG9z
OyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQg
c3BhY2VzLgorICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0
ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgcG9zKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFwcmV2aW91c0NoYXJh
Y3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWdub3JlU3RhcnQub2JqID0gbzsK
KyAgICAgICAgICAgICAgICAgICAgaWdub3JlU3RhcnQucG9zID0gcG9zOworICAgICAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghY3VycmVudENoYXJhY3RlcklzV1MgJiYgcHJl
dmlvdXNDaGFyYWN0ZXJJc1dTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvV3JhcCAm
JiBvLT5zdHlsZSgpLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgICAgICAgICBsQnJl
YWsucG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2Fi
bGVQb3NpdGlvbiA9IG5leHRCcmVha2FibGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGNvbGxh
cHNlV2hpdGVTcGFjZSAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhaWdub3JpbmdTcGFj
ZXMpCisgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VPYmplY3QgPSBvOworICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKCFvLT5zdHlsZSgpLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSB8fCAh
Y3VycmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3Bh
Y2VPYmplY3QgPSAwOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwb3Mr
KzsKKyAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICBhdFN0YXJ0ID0gZmFs
c2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElNUE9SVEFOVDogcG9zIGlzID4g
bGVuZ3RoIGhlcmUhCisgICAgICAgICAgICBpZiAoIWlnbm9yaW5nU3BhY2VzKQorICAgICAgICAg
ICAgICAgIHRtcFcgKz0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBm
LCB3ICsgdG1wVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpICsgbGFzdFNwYWNl
V29yZFNwYWNpbmc7CisgICAgICAgICAgICB0bXBXICs9IGlubGluZVdpZHRoKG8sICFhcHBsaWVk
U3RhcnRXaWR0aCwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHQodGhp
cywgbyk7CisgICAgICAgIGJvb2wgY2hlY2tGb3JCcmVhayA9IGF1dG9XcmFwOworICAgICAgICBp
ZiAodyAmJiB3ICsgdG1wVyA+IHdpZHRoICYmIGxCcmVhay5vYmogJiYgY3VycldTID09IE5PV1JB
UCkKKyAgICAgICAgICAgIGNoZWNrRm9yQnJlYWsgPSB0cnVlOworICAgICAgICBlbHNlIGlmIChu
ZXh0ICYmIG8tPmlzVGV4dCgpICYmIG5leHQtPmlzVGV4dCgpICYmICFuZXh0LT5pc0JSKCkpIHsK
KyAgICAgICAgICAgIGlmIChhdXRvV3JhcCB8fCAobmV4dC0+c3R5bGUoKS0+YXV0b1dyYXAoKSkp
IHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAg
ICAgICAgICAgICAgIGNoZWNrRm9yQnJlYWsgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckJyZWFrID0gZmFsc2U7CisgICAgICAgICAg
ICAgICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5kZXJUZXh0KG5leHQpOworICAg
ICAgICAgICAgICAgICAgICBpZiAobmV4dFRleHQtPnRleHRMZW5ndGgoKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFyYWN0ZXJzKClbMF07CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdc
bicgJiYgIXNob3VsZFByZXNlcnZlTmV3bGluZShuZXh0KSkpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gSWYgdGhlIG5leHQgaXRlbSBvbiB0aGUgbGluZSBpcyB0ZXh0LCBhbmQgaWYg
d2UgZGlkIG5vdCBlbmQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3Bh
Y2UsIHRoZW4gdGhlIG5leHQgdGV4dCBydW4gY29udGludWVzIG91ciB3b3JkIChhbmQgc28gaXQg
bmVlZHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGFkZGluZyB0byB8
dG1wV3wuICBKdXN0IHVwZGF0ZSBhbmQgY29udGludWUuCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2hlY2tGb3JCcmVhayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBp
ZiAobmV4dFRleHQtPmlzV29yZEJyZWFrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVj
a0ZvckJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCB3aWxsRml0T25MaW5l
ID0gdyArIHRtcFcgPD0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGlmICghd2lsbEZpdE9u
TGluZSAmJiAhdykgeworICAgICAgICAgICAgICAgICAgICAgICAgZml0QmVsb3dGbG9hdHModG1w
VywgZmlyc3RMaW5lLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aWxsRml0T25M
aW5lID0gdG1wVyA8PSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICBib29sIGNhblBsYWNlT25MaW5lID0gd2lsbEZpdE9uTGluZSB8fCAhYXV0b1dyYXBX
YXNFdmVyVHJ1ZU9uTGluZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhblBsYWNlT25MaW5l
ICYmIGNoZWNrRm9yQnJlYWspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gdG1wVzsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFcgPSAwOworICAgICAgICAgICAgICAgICAgICAg
ICAgbEJyZWFrLm9iaiA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsQnJlYWsucG9z
ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRp
b24gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGVja0ZvckJyZWFrICYmICh3ICsg
dG1wVyA+IHdpZHRoKSkgeworICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBmbG9hdHMsIHRyeSB0
byBnZXQgYmVsb3cgdGhlbS4KKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVySXNTcGFj
ZSAmJiAhaWdub3JpbmdTcGFjZXMgJiYgby0+c3R5bGUoKS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkp
CisgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZU9iamVjdCA9IDA7CisKKyAgICAgICAgICAg
IGlmICh3KQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgICAgICBmaXRCZWxv
d0Zsb2F0cyh0bXBXLCBmaXJzdExpbmUsIHdpZHRoKTsKKworICAgICAgICAgICAgLy8gfHdpZHRo
fCBtYXkgaGF2ZSBiZWVuIGFkanVzdGVkIGJlY2F1c2Ugd2UgZ290IHNob3ZlZCBkb3duIHBhc3Qg
YSBmbG9hdCAodGh1cworICAgICAgICAgICAgLy8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdl
IG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBqdW1wIHRvCisgICAgICAgICAgICAvLyB0aGUgZW5k
IGxhYmVsIGlmIHdlIHN0aWxsIGRvbid0IGZpdCBvbiB0aGUgbGluZS4gLWR3aAorICAgICAgICAg
ICAgaWYgKHcgKyB0bXBXID4gd2lkdGgpCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIW8tPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgeworICAg
ICAgICAgICAgbGFzdCA9IG87CisgICAgICAgICAgICBpZiAobGFzdC0+aXNSZXBsYWNlZCgpICYm
IGF1dG9XcmFwICYmICghbGFzdC0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykgJiYg
KCFsYXN0LT5pc0xpc3RNYXJrZXIoKSB8fCBzdGF0aWNfY2FzdDxSZW5kZXJMaXN0TWFya2VyKj4o
bGFzdCktPmlzSW5zaWRlKCkpKSB7CisgICAgICAgICAgICAgICAgdyArPSB0bXBXOworICAgICAg
ICAgICAgICAgIHRtcFcgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBuZXh0Owor
ICAgICAgICAgICAgICAgIGxCcmVhay5wb3MgPSAwOworICAgICAgICAgICAgICAgIGxCcmVhay5u
ZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgIG8gPSBuZXh0OworICAgICAgICBuZXh0QnJlYWthYmxlID0gLTE7CisKKyAgICAgICAg
Ly8gQ2xlYXIgb3V0IG91ciBjaGFyYWN0ZXIgc3BhY2UgYm9vbCwgc2luY2UgaW5saW5lIDxwcmU+
cyBkb24ndCBjb2xsYXBzZSB3aGl0ZXNwYWNlCisgICAgICAgIC8vIHdpdGggYWRqYWNlbnQgaW5s
aW5lIG5vcm1hbC9ub3dyYXAgc3BhbnMuCisgICAgICAgIGlmICghY29sbGFwc2VXaGl0ZVNwYWNl
KQorICAgICAgICAgICAgY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKKyAgICAgICAg
CisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIGF0U3RhcnQgPSBmYWxzZTsKKyAgICB9CisKKyAg
ICAKKyAgICBpZiAodyArIHRtcFcgPD0gd2lkdGggfHwgbGFzdFdTID09IE5PV1JBUCkgeworICAg
ICAgICBsQnJlYWsub2JqID0gMDsKKyAgICAgICAgbEJyZWFrLnBvcyA9IDA7CisgICAgICAgIGxC
cmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKKyAgICB9CisKKyBlbmQ6CisgICAgaWYg
KGxCcmVhayA9PSByZXNvbHZlci5wb3NpdGlvbigpICYmICghbEJyZWFrLm9iaiB8fCAhbEJyZWFr
Lm9iai0+aXNCUigpKSkgeworICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3Np
YmxlCisgICAgICAgIGlmIChzdHlsZSgpLT53aGl0ZVNwYWNlKCkgPT0gUFJFKSB7CisgICAgICAg
ICAgICAvLyBGSVhNRTogRG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQgdGhpcyBjYXNlLgorICAgICAg
ICAgICAgaWYgKHBvcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87Cisg
ICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvcyAtIDE7CisgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBsYXN0OworICAgICAgICAgICAgICAgIGxC
cmVhay5wb3MgPSBsYXN0LT5pc1RleHQoKSA/IGxhc3QtPmxlbmd0aCgpIDogMDsKKyAgICAgICAg
ICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSBpZiAobEJyZWFrLm9iaikgeworICAgICAgICAgICAgaWYgKGxhc3Qg
IT0gbyAmJiAhbGFzdC0+aXNMaXN0TWFya2VyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBiZXR0
ZXIgdG8gYnJlYWsgYmV0d2VlbiBvYmplY3QgYm91bmRhcmllcyB0aGFuIGluIHRoZSBtaWRkbGUg
b2YgYSB3b3JkIChleGNlcHQgZm9yIGxpc3QgbWFya2VycykKKyAgICAgICAgICAgICAgICBsQnJl
YWsub2JqID0gbzsKKyAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0gMDsKKyAgICAgICAgICAg
ICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhlIG1pZGRsZSBv
ZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCisgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBu
byByb29tIGF0IGFsbC4gV2UganVzdCBoYXZlIHRvIGJlIG9uIHRoaXMgbGluZSwKKyAgICAgICAg
ICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBzcGlsbCBvdXQuCisgICAgICAgICAgICAgICAg
bEJyZWFrLm9iaiA9IG87CisgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKKyAgICAg
ICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBs
ZWFzdCBvbmUgY2hhci9vYmplY3QuCisgICAgaWYgKGxCcmVhayA9PSByZXNvbHZlci5wb3NpdGlv
bigpKQorICAgICAgICBsQnJlYWsuaW5jcmVtZW50KCk7CisKKyAgICAvLyBTYW5pdHkgY2hlY2sg
b3VyIG1pZHBvaW50cy4KKyAgICBjaGVja01pZHBvaW50cyhsaW5lTWlkcG9pbnRTdGF0ZSwgbEJy
ZWFrKTsKKyAgICAgICAgCisgICAgaWYgKHRyYWlsaW5nU3BhY2VPYmplY3QpIHsKKyAgICAgICAg
Ly8gVGhpcyBvYmplY3QgaXMgZWl0aGVyIGdvaW5nIHRvIGJlIHBhcnQgb2YgdGhlIGxhc3QgbWlk
cG9pbnQsIG9yIGl0IGlzIGdvaW5nCisgICAgICAgIC8vIHRvIGJlIHRoZSBhY3R1YWwgZW5kcG9p
bnQuICBJbiBib3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3VyIHBvcyBieSAxIGxldmVsIHRv
CisgICAgICAgIC8vIGV4Y2x1ZGUgdGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGluIGVmZmVj
dCAtIGNvbGxhcHNlIGludG8gdGhlIG5ld2xpbmUuCisgICAgICAgIGlmIChsaW5lTWlkcG9pbnRT
dGF0ZS5udW1NaWRwb2ludHMgJSAyKSB7CisgICAgICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlk
cG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKKyAgICAgICAgICAg
IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXS5wb3MtLTsKKyAg
ICAgICAgfQorICAgICAgICAvL2Vsc2UgaWYgKGxCcmVhay5wb3MgPiAwKQorICAgICAgICAvLyAg
ICBsQnJlYWsucG9zLS07CisgICAgICAgIGVsc2UgaWYgKGxCcmVhay5vYmogPT0gMCAmJiB0cmFp
bGluZ1NwYWNlT2JqZWN0LT5pc1RleHQoKSkgeworICAgICAgICAgICAgLy8gQWRkIGEgbmV3IGVu
ZCBtaWRwb2ludCB0aGF0IHN0b3BzIHJpZ2h0IGF0IHRoZSB2ZXJ5IGVuZC4KKyAgICAgICAgICAg
IFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQodHJhaWxpbmdTcGFjZU9iamVjdCk7Cisg
ICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0LT50ZXh0TGVuZ3RoKCk7CisgICAgICAg
ICAgICB1bnNpZ25lZCBwb3MgPSBsZW5ndGggPj0gMiA/IGxlbmd0aCAtIDIgOiBVSU5UX01BWDsK
KyAgICAgICAgICAgIElubGluZUl0ZXJhdG9yIGVuZE1pZCgwLCB0cmFpbGluZ1NwYWNlT2JqZWN0
LCBwb3MpOworICAgICAgICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIGVuZE1p
ZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBtaWdodCBoYXZlIG1hZGUgbEJyZWFr
IGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHBhc3QgdGhlIGVuZAorICAgIC8vIG9mIHRoZSBvYmpl
Y3QuIERvIHRoaXMgYWRqdXN0bWVudCB0byBtYWtlIGl0IHBvaW50IHRvIHRoZSBzdGFydAorICAg
IC8vIG9mIHRoZSBuZXh0IG9iamVjdCBpbnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgcmVz
dCBvZiB0aGUKKyAgICAvLyBjb2RlLgorICAgIGlmIChsQnJlYWsucG9zID4gMCkgeworICAgICAg
ICBsQnJlYWsucG9zLS07CisgICAgICAgIGxCcmVhay5pbmNyZW1lbnQoKTsKKyAgICB9CisKKyAg
ICBpZiAobEJyZWFrLm9iaiAmJiBsQnJlYWsucG9zID49IDIgJiYgbEJyZWFrLm9iai0+aXNUZXh0
KCkpIHsKKyAgICAgICAgLy8gRm9yIHNvZnQgaHlwaGVucyBvbiBsaW5lIGJyZWFrcywgd2UgaGF2
ZSB0byBjaG9wIG91dCB0aGUgbWlkcG9pbnRzIHRoYXQgbWFkZSB1cworICAgICAgICAvLyBpZ25v
cmUgdGhlIGh5cGhlbiBzbyB0aGF0IGl0IHdpbGwgcmVuZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGxp
bmUuCisgICAgICAgIFVDaGFyIGMgPSB0b1JlbmRlclRleHQobEJyZWFrLm9iaiktPmNoYXJhY3Rl
cnMoKVtsQnJlYWsucG9zIC0gMV07CisgICAgICAgIGlmIChjID09IHNvZnRIeXBoZW4pCisgICAg
ICAgICAgICBjaG9wTWlkcG9pbnRzQXQobGluZU1pZHBvaW50U3RhdGUsIGxCcmVhay5vYmosIGxC
cmVhay5wb3MgLSAyKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGxCcmVhazsKK30KKwordm9p
ZCBSZW5kZXJCbG9jazo6Y2hlY2tMaW5lc0Zvck92ZXJmbG93KCkKK3sKKyAgICBtX292ZXJmbG93
V2lkdGggPSB3aWR0aCgpOworICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9v
dEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgeworICAgICAgICBtX292
ZXJmbG93TGVmdCA9IG1pbihjdXJyLT5sZWZ0T3ZlcmZsb3coKSwgbV9vdmVyZmxvd0xlZnQpOwor
ICAgICAgICBtX292ZXJmbG93VG9wID0gbWluKGN1cnItPnRvcE92ZXJmbG93KCksIG1fb3ZlcmZs
b3dUb3ApOworICAgICAgICBtX292ZXJmbG93V2lkdGggPSBtYXgoY3Vyci0+cmlnaHRPdmVyZmxv
dygpLCBtX292ZXJmbG93V2lkdGgpOworICAgICAgICBtX292ZXJmbG93SGVpZ2h0ID0gbWF4KGN1
cnItPmJvdHRvbU92ZXJmbG93KCksIG1fb3ZlcmZsb3dIZWlnaHQpOworICAgIH0KK30KKwordm9p
ZCBSZW5kZXJCbG9jazo6ZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKQoreworICAgIGZvciAoUm9v
dElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4
dFJvb3RCb3goKSkKKyAgICAgICAgY3Vyci0+Y2xlYXJUcnVuY2F0aW9uKCk7Cit9CisKK3ZvaWQg
UmVuZGVyQmxvY2s6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQoreworICAgIC8vIERldGVy
bWluZSB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCisg
ICAgLy8gRklYTUU6IENTUzMgc2F5cyB0aGlzIGlzIGNvbmZpZ3VyYWJsZSwgYWxzbyBuZWVkIHRv
IHVzZSAweDAwMkUgKEZVTEwgU1RPUCkgaWYgaG9yaXpvbnRhbCBlbGxpcHNpcyBpcyAibm90IHJl
bmRlcmFibGUiCisgICAgVGV4dFJ1biBlbGxpcHNpc1J1bigmaG9yaXpvbnRhbEVsbGlwc2lzLCAx
KTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgZWxsaXBzaXNTdHIsICgm
aG9yaXpvbnRhbEVsbGlwc2lzLCAxKSk7CisgICAgY29uc3QgRm9udCYgZmlyc3RMaW5lRm9udCA9
IGZpcnN0TGluZVN0eWxlKCktPmZvbnQoKTsKKyAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUo
KS0+Zm9udCgpOworICAgIGludCBmaXJzdExpbmVFbGxpcHNpc1dpZHRoID0gZmlyc3RMaW5lRm9u
dC53aWR0aChlbGxpcHNpc1J1bik7CisgICAgaW50IGVsbGlwc2lzV2lkdGggPSAoZm9udCA9PSBm
aXJzdExpbmVGb250KSA/IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBmb250LndpZHRoKGVsbGlw
c2lzUnVuKTsKKworICAgIC8vIEZvciBMVFIgdGV4dCB0cnVuY2F0aW9uLCB3ZSB3YW50IHRvIGdl
dCB0aGUgcmlnaHQgZWRnZSBvZiBvdXIgcGFkZGluZyBib3gsIGFuZCB0aGVuIHdlIHdhbnQgdG8g
c2VlCisgICAgLy8gaWYgdGhlIHJpZ2h0IGVkZ2Ugb2YgYSBsaW5lIGJveCBleGNlZWRzIHRoYXQu
ICBGb3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcGFkZGluZyBib3ggYW5kCisg
ICAgLy8gY2hlY2sgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbGluZSBib3ggdG8gc2VlIGlmIGl0IGlz
IGxlc3MKKyAgICAvLyBJbmNsdWRlIHRoZSBzY3JvbGxiYXIgZm9yIG92ZXJmbG93IGJsb2Nrcywg
d2hpY2ggbWVhbnMgd2Ugd2FudCB0byB1c2UgImNvbnRlbnRXaWR0aCgpIgorICAgIGJvb2wgbHRy
ID0gc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSOworICAgIGZvciAoUm9vdElubGluZUJveCog
Y3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkg
eworICAgICAgICBpbnQgYmxvY2tSaWdodEVkZ2UgPSByaWdodE9mZnNldChjdXJyLT55KCksIGN1
cnIgPT0gZmlyc3RSb290Qm94KCkpOworICAgICAgICBpbnQgYmxvY2tMZWZ0RWRnZSA9IGxlZnRP
ZmZzZXQoY3Vyci0+eSgpLCBjdXJyID09IGZpcnN0Um9vdEJveCgpKTsKKyAgICAgICAgaW50IGxp
bmVCb3hFZGdlID0gbHRyID8gY3Vyci0+eCgpICsgY3Vyci0+d2lkdGgoKSA6IGN1cnItPngoKTsK
KyAgICAgICAgaWYgKChsdHIgJiYgbGluZUJveEVkZ2UgPiBibG9ja1JpZ2h0RWRnZSkgfHwgKCFs
dHIgJiYgbGluZUJveEVkZ2UgPCBibG9ja0xlZnRFZGdlKSkgeworICAgICAgICAgICAgLy8gVGhp
cyBsaW5lIHNwaWxscyBvdXQgb2Ygb3VyIGJveCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9u
LiAgTm93IHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBsaW5lCisgICAgICAgICAgICAvLyBjYW4gYmUg
dHJ1bmNhdGVkLiAgSW4gb3JkZXIgZm9yIHRydW5jYXRpb24gdG8gYmUgcG9zc2libGUsIHRoZSBs
aW5lIG11c3QgaGF2ZSBzdWZmaWNpZW50IHNwYWNlIHRvCisgICAgICAgICAgICAvLyBhY2NvbW1v
ZGF0ZSBvdXIgdHJ1bmNhdGlvbiBzdHJpbmcsIGFuZCBubyByZXBsYWNlZCBlbGVtZW50cyAoaW1h
Z2VzLCB0YWJsZXMpIGNhbiBvdmVybGFwIHRoZSBlbGxpcHNpcworICAgICAgICAgICAgLy8gc3Bh
Y2UuCisgICAgICAgICAgICBpbnQgd2lkdGggPSBjdXJyID09IGZpcnN0Um9vdEJveCgpID8gZmly
c3RMaW5lRWxsaXBzaXNXaWR0aCA6IGVsbGlwc2lzV2lkdGg7CisgICAgICAgICAgICBpbnQgYmxv
Y2tFZGdlID0gbHRyID8gYmxvY2tSaWdodEVkZ2UgOiBibG9ja0xlZnRFZGdlOworICAgICAgICAg
ICAgaWYgKGN1cnItPmNhbkFjY29tbW9kYXRlRWxsaXBzaXMobHRyLCBibG9ja0VkZ2UsIGxpbmVC
b3hFZGdlLCB3aWR0aCkpCisgICAgICAgICAgICAgICAgY3Vyci0+cGxhY2VFbGxpcHNpcyhlbGxp
cHNpc1N0ciwgbHRyLCBibG9ja0xlZnRFZGdlLCBibG9ja1JpZ2h0RWRnZSwgd2lkdGgpOworICAg
ICAgICB9CisgICAgfQorfQorCit9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9j
a0xpbmVMYXlvdXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJs
b2NrTGluZUxheW91dC5jcHAJKHJldmlzaW9uIDQ1NzgxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDYgQEAK
IC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAq
IENvcHlyaWdodCAoQykgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdo
dCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAw
OCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KICAqCiAgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwpAQCAtMjAsMTcgKzIwLDEzIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgImJpZGkuaCIKIAorI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgogI2luY2x1ZGUgIkNoYXJh
Y3Rlck5hbWVzLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgogI2lu
Y2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJSZW5kZXJBcmVuYS5oIgogI2luY2x1ZGUgIlJl
bmRlcklubGluZS5oIgotI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCiAjaW5jbHVkZSAiUmVuZGVy
TGlzdE1hcmtlci5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJicmVha19s
aW5lcy5oIgpAQCAtNzAsNyArNjYsNyBAQCBwdWJsaWM6CiAgICAgYm9vbCBhdEVuZCgpIGNvbnN0
OwogCiAgICAgVUNoYXIgY3VycmVudCgpIGNvbnN0OwotICAgIFdURjo6VW5pY29kZTo6RGlyZWN0
aW9uIGRpcmVjdGlvbigpIGNvbnN0OworICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBjb25zdDsK
IAogICAgIFJlbmRlckJsb2NrKiBibG9jazsKICAgICBSZW5kZXJPYmplY3QqIG9iajsKQEAgLTEw
Miw4ICs5OCwzNSBAQCBzdGF0aWMgaW50IGlubGluZVdpZHRoKFJlbmRlck9iamVjdCogY2hpCiAg
ICAgcmV0dXJuIGV4dHJhV2lkdGg7CiB9CiAKK3N0cnVjdCBCaWRpUnVuIDogQmlkaUNoYXJhY3Rl
clJ1biB7CisgICAgQmlkaVJ1bihpbnQgc3RhcnQsIGludCBzdG9wLCBSZW5kZXJPYmplY3QqIG9i
amVjdCwgQmlkaUNvbnRleHQqIGNvbnRleHQsIERpcmVjdGlvbiBkaXIpCisgICAgICAgIDogQmlk
aUNoYXJhY3RlclJ1bihzdGFydCwgc3RvcCwgY29udGV4dCwgZGlyKQorICAgICAgICAsIG1fb2Jq
ZWN0KG9iamVjdCkKKyAgICAgICAgLCBtX2JveCgwKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lk
IGRlc3Ryb3koKTsKKworICAgIC8vIE92ZXJsb2FkZWQgbmV3IG9wZXJhdG9yLgorICAgIHZvaWQq
IG9wZXJhdG9yIG5ldyhzaXplX3QsIFJlbmRlckFyZW5hKikgdGhyb3coKTsKKworICAgIC8vIE92
ZXJyaWRkZW4gdG8gcHJldmVudCB0aGUgbm9ybWFsIGRlbGV0ZSBmcm9tIGJlaW5nIGNhbGxlZC4K
KyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsKKworICAgIEJpZGlSdW4q
IG5leHQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxCaWRpUnVuKj4obV9uZXh0KTsgfQorCitwcml2
YXRlOgorICAgIC8vIFRoZSBub3JtYWwgb3BlcmF0b3IgbmV3IGlzIGRpc2FsbG93ZWQuCisgICAg
dm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgdGhyb3coKTsKKworcHVibGljOgorICAgIFJlbmRl
ck9iamVjdCogbV9vYmplY3Q7CisgICAgSW5saW5lQm94KiBtX2JveDsKK307CisKICNpZm5kZWYg
TkRFQlVHCi1zdGF0aWMgV1RGOjpSZWZDb3VudGVkTGVha0NvdW50ZXIgYmlkaVJ1bkNvdW50ZXIo
IkJpZGlSdW4iKTsKK3N0YXRpYyBSZWZDb3VudGVkTGVha0NvdW50ZXIgYmlkaVJ1bkNvdW50ZXIo
IkJpZGlSdW4iKTsKIAogc3RhdGljIGJvb2wgaW5CaWRpUnVuRGVzdHJveTsKICNlbmRpZgpAQCAt
ODA4LDcgKzgzMSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNoaWxkcmVuKGIK
IAogICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNsZWFyIG91dCBvdXIgbGluZSBib3hl
cy4KICAgICAvLyBGSVhNRTogSGFuZGxlIHJlc2l6ZSBldmVudHVhbGx5IQotICAgIC8vIEZJWE1F
OiBEbyBzb21ldGhpbmcgYmV0dGVyIHdoZW4gZmxvYXRzIGFyZSBwcmVzZW50LgogICAgIGJvb2wg
ZnVsbExheW91dCA9ICFmaXJzdExpbmVCb3goKSB8fCAhZmlyc3RDaGlsZCgpIHx8IHNlbGZOZWVk
c0xheW91dCgpIHx8IHJlbGF5b3V0Q2hpbGRyZW47CiAgICAgaWYgKGZ1bGxMYXlvdXQpCiAgICAg
ICAgIGxpbmVCb3hlcygpLT5kZWxldGVMaW5lQm94ZXMocmVuZGVyQXJlbmEoKSk7CkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9iaWRpLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9iaWRpLmNwcAkocmV2aXNpb24gNDU3ODEpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9iaWRpLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMSwyMjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwNCwg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KLSAqCi0gKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgot
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJiaWRpLmgiCi0KLSNpbmNsdWRlICJDaGFyYWN0ZXJO
YW1lcy5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRWxlbWVudC5oIgotI2lu
Y2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIklubGluZVRleHRCb3guaCIKLSNpbmNsdWRl
ICJMb2dnaW5nLmgiCi0jaW5jbHVkZSAiUmVuZGVyQXJlbmEuaCIKLSNpbmNsdWRlICJSZW5kZXJJ
bmxpbmUuaCIKLSNpbmNsdWRlICJSZW5kZXJMYXllci5oIgotI2luY2x1ZGUgIlJlbmRlckxpc3RN
YXJrZXIuaCIKLSNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiYnJlYWtfbGluZXMu
aCIKLSNpbmNsdWRlIDx3dGYvQWx3YXlzSW5saW5lLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZkNvdW50
ZWRMZWFrQ291bnRlci5oPgotI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2Ug
V1RGOwotdXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQot
Ly8gV2UgZG9uJ3QgbGV0IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBh
bnkgZGVlcGVyIHRoYW4gdGhpcy4KLWNvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7
Ci0KLWNsYXNzIElubGluZUl0ZXJhdG9yIHsKLXB1YmxpYzoKLSAgICBJbmxpbmVJdGVyYXRvcigp
Ci0gICAgICAgIDogYmxvY2soMCkKLSAgICAgICAgLCBvYmooMCkKLSAgICAgICAgLCBwb3MoMCkK
LSAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQotICAg
IElubGluZUl0ZXJhdG9yKFJlbmRlckJsb2NrKiBiLCBSZW5kZXJPYmplY3QqIG8sIHVuc2lnbmVk
IHApCi0gICAgICAgIDogYmxvY2soYikKLSAgICAgICAgLCBvYmoobykKLSAgICAgICAgLCBwb3Mo
cCkKLSAgICAgICAgLCBuZXh0QnJlYWthYmxlUG9zaXRpb24oLTEpCi0gICAgewotICAgIH0KLQot
ICAgIHZvaWQgaW5jcmVtZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIgPSAwKTsKLSAg
ICBib29sIGF0RW5kKCkgY29uc3Q7Ci0KLSAgICBVQ2hhciBjdXJyZW50KCkgY29uc3Q7Ci0gICAg
V1RGOjpVbmljb2RlOjpEaXJlY3Rpb24gZGlyZWN0aW9uKCkgY29uc3Q7Ci0KLSAgICBSZW5kZXJC
bG9jayogYmxvY2s7Ci0gICAgUmVuZGVyT2JqZWN0KiBvYmo7Ci0gICAgdW5zaWduZWQgcG9zOwot
ICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb247Ci19OwotCi1zdGF0aWMgaW50IGdldEJvcmRl
clBhZGRpbmdNYXJnaW4oUmVuZGVyQm94TW9kZWxPYmplY3QqIGNoaWxkLCBib29sIGVuZE9mSW5s
aW5lKQotewotICAgIGJvb2wgbGVmdFNpZGUgPSAoY2hpbGQtPnN0eWxlKCktPmRpcmVjdGlvbigp
ID09IExUUikgPyAhZW5kT2ZJbmxpbmUgOiBlbmRPZklubGluZTsKLSAgICBpZiAobGVmdFNpZGUp
Ci0gICAgICAgIHJldHVybiBjaGlsZC0+bWFyZ2luTGVmdCgpICsgY2hpbGQtPnBhZGRpbmdMZWZ0
KCkgKyBjaGlsZC0+Ym9yZGVyTGVmdCgpOwotICAgIHJldHVybiBjaGlsZC0+bWFyZ2luUmlnaHQo
KSArIGNoaWxkLT5wYWRkaW5nUmlnaHQoKSArIGNoaWxkLT5ib3JkZXJSaWdodCgpOwotfQotCi1z
dGF0aWMgaW50IGlubGluZVdpZHRoKFJlbmRlck9iamVjdCogY2hpbGQsIGJvb2wgc3RhcnQgPSB0
cnVlLCBib29sIGVuZCA9IHRydWUpCi17Ci0gICAgdW5zaWduZWQgbGluZURlcHRoID0gMTsKLSAg
ICBpbnQgZXh0cmFXaWR0aCA9IDA7Ci0gICAgUmVuZGVyT2JqZWN0KiBwYXJlbnQgPSBjaGlsZC0+
cGFyZW50KCk7Ci0gICAgd2hpbGUgKHBhcmVudC0+aXNJbmxpbmUoKSAmJiAhcGFyZW50LT5pc0lu
bGluZUJsb2NrT3JJbmxpbmVUYWJsZSgpICYmIGxpbmVEZXB0aCsrIDwgY01heExpbmVEZXB0aCkg
ewotICAgICAgICBpZiAoc3RhcnQgJiYgIWNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKSkKLSAgICAg
ICAgICAgIGV4dHJhV2lkdGggKz0gZ2V0Qm9yZGVyUGFkZGluZ01hcmdpbih0b1JlbmRlckJveE1v
ZGVsT2JqZWN0KHBhcmVudCksIGZhbHNlKTsKLSAgICAgICAgaWYgKGVuZCAmJiAhY2hpbGQtPm5l
eHRTaWJsaW5nKCkpCi0gICAgICAgICAgICBleHRyYVdpZHRoICs9IGdldEJvcmRlclBhZGRpbmdN
YXJnaW4odG9SZW5kZXJCb3hNb2RlbE9iamVjdChwYXJlbnQpLCB0cnVlKTsKLSAgICAgICAgY2hp
bGQgPSBwYXJlbnQ7Ci0gICAgICAgIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIGV4dHJhV2lkdGg7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi1zdGF0aWMgV1RGOjpS
ZWZDb3VudGVkTGVha0NvdW50ZXIgYmlkaVJ1bkNvdW50ZXIoIkJpZGlSdW4iKTsKLQotc3RhdGlj
IGJvb2wgaW5CaWRpUnVuRGVzdHJveTsKLSNlbmRpZgotCi12b2lkIEJpZGlSdW46OmRlc3Ryb3ko
KQotewotI2lmbmRlZiBOREVCVUcKLSAgICBpbkJpZGlSdW5EZXN0cm95ID0gdHJ1ZTsKLSNlbmRp
ZgotICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSA9IG1fb2JqZWN0LT5yZW5kZXJBcmVuYSgp
OwotICAgIGRlbGV0ZSB0aGlzOwotI2lmbmRlZiBOREVCVUcKLSAgICBpbkJpZGlSdW5EZXN0cm95
ID0gZmFsc2U7Ci0jZW5kaWYKLQotICAgIC8vIFJlY292ZXIgdGhlIHNpemUgbGVmdCB0aGVyZSBm
b3IgdXMgYnkgb3BlcmF0b3IgZGVsZXRlIGFuZCBmcmVlIHRoZSBtZW1vcnkuCi0gICAgcmVuZGVy
QXJlbmEtPmZyZWUoKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4odGhpcyksIHRoaXMpOwotfQot
Ci12b2lkKiBCaWRpUnVuOjpvcGVyYXRvciBuZXcoc2l6ZV90IHN6LCBSZW5kZXJBcmVuYSogcmVu
ZGVyQXJlbmEpIHRocm93KCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgYmlkaVJ1bkNvdW50ZXIu
aW5jcmVtZW50KCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gcmVuZGVyQXJlbmEtPmFsbG9jYXRlKHN6
KTsKLX0KLQotdm9pZCBCaWRpUnVuOjpvcGVyYXRvciBkZWxldGUodm9pZCogcHRyLCBzaXplX3Qg
c3opCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIGJpZGlSdW5Db3VudGVyLmRlY3JlbWVudCgpOwot
I2VuZGlmCi0gICAgQVNTRVJUKGluQmlkaVJ1bkRlc3Ryb3kpOwotCi0gICAgLy8gU3Rhc2ggc2l6
ZSB3aGVyZSBkZXN0cm95KCkgY2FuIGZpbmQgaXQuCi0gICAgKihzaXplX3QqKXB0ciA9IHN6Owot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbmxp
bmVJdGVyYXRvciYgaXQxLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQyKQotewotICAgIHJldHVy
biBpdDEucG9zID09IGl0Mi5wb3MgJiYgaXQxLm9iaiA9PSBpdDIub2JqOwotfQotCi1pbmxpbmUg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdDEsIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpdDIpCi17Ci0gICAgcmV0dXJuIGl0MS5wb3MgIT0gaXQyLnBvcyB8fCBpdDEub2Jq
ICE9IGl0Mi5vYmo7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBiaWRpTmV4dChS
ZW5kZXJCbG9jayogYmxvY2ssIFJlbmRlck9iamVjdCogY3VycmVudCwgSW5saW5lQmlkaVJlc29s
dmVyKiByZXNvbHZlciA9IDAsIGJvb2wgc2tpcElubGluZXMgPSB0cnVlLCBib29sKiBlbmRPZklu
bGluZVB0ciA9IDApCi17Ci0gICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gMDsKLSAgICBib29sIG9s
ZEVuZE9mSW5saW5lID0gZW5kT2ZJbmxpbmVQdHIgPyAqZW5kT2ZJbmxpbmVQdHIgOiBmYWxzZTsK
LSAgICBib29sIGVuZE9mSW5saW5lID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAoY3VycmVudCkgewot
ICAgICAgICBuZXh0ID0gMDsKLSAgICAgICAgaWYgKCFvbGRFbmRPZklubGluZSAmJiAhY3VycmVu
dC0+aXNGbG9hdGluZygpICYmICFjdXJyZW50LT5pc1JlcGxhY2VkKCkgJiYgIWN1cnJlbnQtPmlz
UG9zaXRpb25lZCgpICYmICFjdXJyZW50LT5pc1RleHQoKSkgewotICAgICAgICAgICAgbmV4dCA9
IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGlmIChuZXh0ICYmIHJlc29sdmVy
ICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAgICAgICAgICBFVW5pY29kZUJp
ZGkgdWIgPSBuZXh0LT5zdHlsZSgpLT51bmljb2RlQmlkaSgpOwotICAgICAgICAgICAgICAgIGlm
ICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIGRp
ciA9IG5leHQtPnN0eWxlKCktPmRpcmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBEaXJl
Y3Rpb24gZCA9ICh1YiA9PSBFbWJlZAotICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09
IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRvUmlnaHRFbWJlZGRpbmcpCi0gICAg
ICAgICAgICAgICAgICAgICAgICA6IChkaXIgPT0gUlRMID8gUmlnaHRUb0xlZnRPdmVycmlkZSA6
IExlZnRUb1JpZ2h0T3ZlcnJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVt
YmVkKGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIGlmICghbmV4dCkgewotICAgICAgICAgICAgaWYgKCFza2lwSW5saW5lcyAmJiAhb2xk
RW5kT2ZJbmxpbmUgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAg
ICAgIG5leHQgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgIGVuZE9mSW5saW5lID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hp
bGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPSBibG9jaykgewotICAgICAgICAgICAgICAgIGlmIChy
ZXNvbHZlciAmJiBjdXJyZW50LT5pc1JlbmRlcklubGluZSgpICYmIGN1cnJlbnQtPnN0eWxlKCkt
PnVuaWNvZGVCaWRpKCkgIT0gVUJOb3JtYWwpCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVy
LT5lbWJlZChQb3BEaXJlY3Rpb25hbEZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBuZXh0ID0g
Y3VycmVudC0+bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dCkgewotICAg
ICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXIgJiYgbmV4dC0+aXNSZW5kZXJJbmxpbmUoKSkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgRVVuaWNvZGVCaWRpIHViID0gbmV4dC0+c3R5bGUo
KS0+dW5pY29kZUJpZGkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YiAhPSBVQk5v
cm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyID0g
bmV4dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
RGlyZWN0aW9uIGQgPSAodWIgPT0gRW1iZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0VG9MZWZ0RW1iZWRkaW5nOiBMZWZ0VG9SaWdodEVtYmVk
ZGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGlyID09IFJUTCA/IFJp
Z2h0VG9MZWZ0T3ZlcnJpZGUgOiBMZWZ0VG9SaWdodE92ZXJyaWRlKSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVzb2x2ZXItPmVtYmVkKGQpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjdXJy
ZW50ID0gY3VycmVudC0+cGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFza2lwSW5saW5l
cyAmJiBjdXJyZW50ICYmIGN1cnJlbnQgIT0gYmxvY2sgJiYgY3VycmVudC0+aXNSZW5kZXJJbmxp
bmUoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gY3VycmVudDsKLSAgICAgICAgICAg
ICAgICAgICAgZW5kT2ZJbmxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoIW5leHQpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAobmV4dC0+aXNUZXh0
KCkgfHwgbmV4dC0+aXNGbG9hdGluZygpIHx8IG5leHQtPmlzUmVwbGFjZWQoKSB8fCBuZXh0LT5p
c1Bvc2l0aW9uZWQoKQotICAgICAgICAgICAgfHwgKCghc2tpcElubGluZXMgfHwgIW5leHQtPmZp
cnN0Q2hpbGQoKSkgLy8gQWx3YXlzIHJldHVybiBFTVBUWSBpbmxpbmVzLgotICAgICAgICAgICAg
ICAgICYmIG5leHQtPmlzUmVuZGVySW5saW5lKCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGN1cnJlbnQgPSBuZXh0OwotICAgIH0KLQotICAgIGlmIChlbmRPZklubGluZVB0cikKLSAg
ICAgICAgKmVuZE9mSW5saW5lUHRyID0gZW5kT2ZJbmxpbmU7Ci0KLSAgICByZXR1cm4gbmV4dDsK
LX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogYmlkaUZpcnN0KFJlbmRlckJsb2NrKiBibG9jaywg
SW5saW5lQmlkaVJlc29sdmVyKiByZXNvbHZlciwgYm9vbCBza2lwSW5saW5lcyA9IHRydWUpCi17
Ci0gICAgaWYgKCFibG9jay0+Zmlyc3RDaGlsZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAK
LSAgICBSZW5kZXJPYmplY3QqIG8gPSBibG9jay0+Zmlyc3RDaGlsZCgpOwotICAgIGlmIChvLT5p
c1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlmIChyZXNvbHZlcikgewotICAgICAgICAgICAg
RVVuaWNvZGVCaWRpIHViID0gby0+c3R5bGUoKS0+dW5pY29kZUJpZGkoKTsKLSAgICAgICAgICAg
IGlmICh1YiAhPSBVQk5vcm1hbCkgewotICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGly
ID0gby0+c3R5bGUoKS0+ZGlyZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgRGlyZWN0aW9uIGQg
PSAodWIgPT0gRW1iZWQKLSAgICAgICAgICAgICAgICAgICAgPyAoZGlyID09IFJUTCA/IFJpZ2h0
VG9MZWZ0RW1iZWRkaW5nIDogTGVmdFRvUmlnaHRFbWJlZGRpbmcpCi0gICAgICAgICAgICAgICAg
ICAgIDogKGRpciA9PSBSVEwgPyBSaWdodFRvTGVmdE92ZXJyaWRlIDogTGVmdFRvUmlnaHRPdmVy
cmlkZSkpOwotICAgICAgICAgICAgICAgIHJlc29sdmVyLT5lbWJlZChkKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2tpcElubGluZXMgJiYgby0+Zmlyc3RDaGlsZCgp
KQotICAgICAgICAgICAgbyA9IGJpZGlOZXh0KGJsb2NrLCBvLCByZXNvbHZlciwgc2tpcElubGlu
ZXMpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIE5ldmVyIHNraXAgZW1wdHkgaW5s
aW5lcy4KLSAgICAgICAgICAgIGlmIChyZXNvbHZlcikKLSAgICAgICAgICAgICAgICByZXNvbHZl
ci0+Y29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBvOyAKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGlmIChvICYmICFvLT5pc1RleHQoKSAmJiAhby0+aXNSZXBs
YWNlZCgpICYmICFvLT5pc0Zsb2F0aW5nKCkgJiYgIW8tPmlzUG9zaXRpb25lZCgpKQotICAgICAg
ICBvID0gYmlkaU5leHQoYmxvY2ssIG8sIHJlc29sdmVyLCBza2lwSW5saW5lcyk7Ci0KLSAgICBp
ZiAocmVzb2x2ZXIpCi0gICAgICAgIHJlc29sdmVyLT5jb21taXRFeHBsaWNpdEVtYmVkZGluZygp
OwotICAgIHJldHVybiBvOwotfQotCi1pbmxpbmUgdm9pZCBJbmxpbmVJdGVyYXRvcjo6aW5jcmVt
ZW50KElubGluZUJpZGlSZXNvbHZlciogcmVzb2x2ZXIpCi17Ci0gICAgaWYgKCFvYmopCi0gICAg
ICAgIHJldHVybjsKLSAgICBpZiAob2JqLT5pc1RleHQoKSkgewotICAgICAgICBwb3MrKzsKLSAg
ICAgICAgaWYgKHBvcyA+PSB0b1JlbmRlclRleHQob2JqKS0+dGV4dExlbmd0aCgpKSB7Ci0gICAg
ICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2JqLCByZXNvbHZlcik7Ci0gICAgICAgICAg
ICBwb3MgPSAwOwotICAgICAgICAgICAgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAg
ICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBvYmogPSBiaWRpTmV4dChibG9jaywgb2JqLCBy
ZXNvbHZlcik7Ci0gICAgICAgIHBvcyA9IDA7Ci0gICAgICAgIG5leHRCcmVha2FibGVQb3NpdGlv
biA9IC0xOwotICAgIH0KLX0KLQotdGVtcGxhdGU8PgotaW5saW5lIHZvaWQgSW5saW5lQmlkaVJl
c29sdmVyOjppbmNyZW1lbnQoKQotewotICAgIGN1cnJlbnQuaW5jcmVtZW50KHRoaXMpOwotfQot
Ci1pbmxpbmUgYm9vbCBJbmxpbmVJdGVyYXRvcjo6YXRFbmQoKSBjb25zdAotewotICAgIHJldHVy
biAhb2JqOwotfQotCi1pbmxpbmUgVUNoYXIgSW5saW5lSXRlcmF0b3I6OmN1cnJlbnQoKSBjb25z
dAotewotICAgIGlmICghb2JqIHx8ICFvYmotPmlzVGV4dCgpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQob2JqKTsKLSAgICBpZiAocG9z
ID49IHRleHQtPnRleHRMZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4g
dGV4dC0+Y2hhcmFjdGVycygpW3Bvc107Ci19Ci0KLUFMV0FZU19JTkxJTkUgRGlyZWN0aW9uIElu
bGluZUl0ZXJhdG9yOjpkaXJlY3Rpb24oKSBjb25zdAotewotICAgIGlmIChVQ2hhciBjID0gY3Vy
cmVudCgpKQotICAgICAgICByZXR1cm4gVW5pY29kZTo6ZGlyZWN0aW9uKGMpOwotCi0gICAgaWYg
KG9iaiAmJiBvYmotPmlzTGlzdE1hcmtlcigpKQotICAgICAgICByZXR1cm4gb2JqLT5zdHlsZSgp
LT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBMZWZ0VG9SaWdodCA6IFJpZ2h0VG9MZWZ0OwotCi0gICAg
cmV0dXJuIE90aGVyTmV1dHJhbDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBjaG9wTWlkcG9pbnRzQXQoTGluZU1pZHBvaW50
U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5kZXJPYmplY3QqIG9iaiwgdW5zaWduZWQgcG9z
KQotewotICAgIGlmICghbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKQotICAgICAgICBy
ZXR1cm47Ci0gICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0YXRl
Lm1pZHBvaW50cy5kYXRhKCk7Ci0gICAgZm9yIChpbnQgaSA9IGxpbmVNaWRwb2ludFN0YXRlLm51
bU1pZHBvaW50cyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZXJh
dG9yJiBwb2ludCA9IG1pZHBvaW50c1tpXTsKLSAgICAgICAgaWYgKHBvaW50Lm9iaiA9PSBvYmog
JiYgcG9pbnQucG9zID09IHBvcykgewotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubnVt
TWlkcG9pbnRzID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQot
Ci1zdGF0aWMgdm9pZCBjaGVja01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBv
aW50U3RhdGUsIElubGluZUl0ZXJhdG9yJiBsQnJlYWspCi17Ci0gICAgLy8gQ2hlY2sgdG8gc2Vl
IGlmIG91ciBsYXN0IG1pZHBvaW50IGlzIGEgc3RhcnQgcG9pbnQgYmV5b25kIHRoZSBsaW5lIGJy
ZWFrLiAgSWYgc28sCi0gICAgLy8gc2hhdmUgaXQgb2ZmIHRoZSBsaXN0LCBhbmQgc2hhdmUgb2Zm
IGEgdHJhaWxpbmcgc3BhY2UgaWYgdGhlIHByZXZpb3VzIGVuZCBwb2ludCBkb2Vzbid0Ci0gICAg
Ly8gcHJlc2VydmUgd2hpdGVzcGFjZS4KLSAgICBpZiAobEJyZWFrLm9iaiAmJiBsaW5lTWlkcG9p
bnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgIShsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMg
JSAyKSkgewotICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50
U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICAgICAgSW5saW5lSXRlcmF0b3ImIGVuZHBvaW50
ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDJdOwotICAgICAg
ICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9p
bnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXTsKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgY3VycnBv
aW50ID0gZW5kcG9pbnQ7Ci0gICAgICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5kKCkgJiYgY3Vy
cnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9IGxCcmVhaykKLSAgICAgICAgICAg
IGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKLSAgICAgICAgaWYgKGN1cnJwb2ludCA9PSBsQnJlYWsp
IHsKLSAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUgdGhlIHN0YXJ0
IHBvaW50LiAgU2hhdmUgb2ZmIHRoZSBzdGFydCBwb2ludC4KLSAgICAgICAgICAgIGxpbmVNaWRw
b2ludFN0YXRlLm51bU1pZHBvaW50cy0tOwotICAgICAgICAgICAgaWYgKGVuZHBvaW50Lm9iai0+
c3R5bGUoKS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5k
cG9pbnQub2JqLT5pc1RleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBzaGF2
ZSBhIGNoYXJhY3RlciBvZmYgdGhlIGVuZHBvaW50IGlmIGl0IHdhcyBmcm9tIGEgc29mdCBoeXBo
ZW4uCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlclRleHQqIHRleHRPYmogPSB0b1JlbmRlclRl
eHQoZW5kcG9pbnQub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50LnBvcyAr
IDEgPCB0ZXh0T2JqLT50ZXh0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICh0ZXh0T2JqLT5jaGFyYWN0ZXJzKClbZW5kcG9pbnQucG9zKzFdID09IHNvZnRIeXBoZW4pCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKHN0YXJ0cG9pbnQub2JqLT5pc1RleHQoKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgUmVuZGVyVGV4dCAqc3RhcnRUZXh0ID0gdG9SZW5kZXJUZXh0KHN0YXJ0cG9pbnQub2Jq
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFRleHQtPnRleHRMZW5ndGgoKSAm
JiBzdGFydFRleHQtPmNoYXJhY3RlcnMoKVswXSA9PSBzb2Z0SHlwaGVuKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbmRwb2ludC5wb3MtLTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIGFkZE1pZHBvaW50KExpbmVN
aWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1p
ZHBvaW50KQotewotICAgIGlmIChsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMuc2l6ZSgpIDw9
IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cykKLSAgICAgICAgbGluZU1pZHBvaW50U3Rh
dGUubWlkcG9pbnRzLmdyb3cobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICsgMTApOwot
Ci0gICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBv
aW50cy5kYXRhKCk7Ci0gICAgbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50
cysrXSA9IG1pZHBvaW50OwotfQotCi1zdGF0aWMgdm9pZCBhcHBlbmRSdW5zRm9yT2JqZWN0KGlu
dCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiBvYmosIElubGluZUJpZGlSZXNvbHZlciYg
cmVzb2x2ZXIpCi17Ci0gICAgaWYgKHN0YXJ0ID4gZW5kIHx8IG9iai0+aXNGbG9hdGluZygpIHx8
Ci0gICAgICAgIChvYmotPmlzUG9zaXRpb25lZCgpICYmICFvYmotPnN0eWxlKCktPmhhc1N0YXRp
Y1goKSAmJiAhb2JqLT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkgJiYgIW9iai0+Y29udGFpbmVyKCkt
PmlzUmVuZGVySW5saW5lKCkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBMaW5lTWlkcG9pbnRT
dGF0ZSYgbGluZU1pZHBvaW50U3RhdGUgPSByZXNvbHZlci5taWRwb2ludFN0YXRlKCk7Ci0gICAg
Ym9vbCBoYXZlTmV4dE1pZHBvaW50ID0gKGxpbmVNaWRwb2ludFN0YXRlLmN1cnJlbnRNaWRwb2lu
dCA8IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyk7Ci0gICAgSW5saW5lSXRlcmF0b3Ig
bmV4dE1pZHBvaW50OwotICAgIGlmIChoYXZlTmV4dE1pZHBvaW50KQotICAgICAgICBuZXh0TWlk
cG9pbnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUuY3Vy
cmVudE1pZHBvaW50XTsKLSAgICBpZiAobGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50
cykgewotICAgICAgICBpZiAoIShoYXZlTmV4dE1pZHBvaW50ICYmIG5leHRNaWRwb2ludC5vYmog
PT0gb2JqKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBz
dGFydCBwb2ludC4gU3RvcCBpZ25vcmluZyBvYmplY3RzIGFuZCAKLSAgICAgICAgLy8gYWRqdXN0
IG91ciBzdGFydC4KLSAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuYmV0d2Vlbk1pZHBvaW50cyA9
IGZhbHNlOwotICAgICAgICBzdGFydCA9IG5leHRNaWRwb2ludC5wb3M7Ci0gICAgICAgIGxpbmVN
aWRwb2ludFN0YXRlLmN1cnJlbnRNaWRwb2ludCsrOwotICAgICAgICBpZiAoc3RhcnQgPCBlbmQp
Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgZW5kLCBvYmos
IHJlc29sdmVyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWhhdmVOZXh0TWlkcG9pbnQg
fHwgKG9iaiAhPSBuZXh0TWlkcG9pbnQub2JqKSkgewotICAgICAgICAgICAgcmVzb2x2ZXIuYWRk
UnVuKG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKSBCaWRpUnVuKHN0YXJ0LCBlbmQsIG9iaiwgcmVz
b2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gQW4gZW5kIG1pZHBvaW50IGhhcyBiZWVuIGVuY291bnRl
cmVkIHdpdGhpbiBvdXIgb2JqZWN0LiAgV2UKLSAgICAgICAgLy8gbmVlZCB0byBnbyBhaGVhZCBh
bmQgYXBwZW5kIGEgcnVuIHdpdGggb3VyIGVuZHBvaW50LgotICAgICAgICBpZiAoc3RhdGljX2Nh
c3Q8aW50PihuZXh0TWlkcG9pbnQucG9zICsgMSkgPD0gZW5kKSB7Ci0gICAgICAgICAgICBsaW5l
TWlkcG9pbnRTdGF0ZS5iZXR3ZWVuTWlkcG9pbnRzID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpbmVN
aWRwb2ludFN0YXRlLmN1cnJlbnRNaWRwb2ludCsrOwotICAgICAgICAgICAgaWYgKG5leHRNaWRw
b2ludC5wb3MgIT0gVUlOVF9NQVgpIHsgLy8gVUlOVF9NQVggbWVhbnMgc3RvcCBhdCB0aGUgb2Jq
ZWN0IGFuZCBkb24ndCBpbmNsdWRlIGFueSBvZiBpdC4KLSAgICAgICAgICAgICAgICBpZiAoc3Rh
dGljX2Nhc3Q8aW50PihuZXh0TWlkcG9pbnQucG9zICsgMSkgPiBzdGFydCkKLSAgICAgICAgICAg
ICAgICAgICAgcmVzb2x2ZXIuYWRkUnVuKG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgQmlkaVJ1bihzdGFydCwgbmV4dE1pZHBvaW50LnBvcyArIDEsIG9i
aiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOwotICAgICAgICAgICAgICAg
IHJldHVybiBhcHBlbmRSdW5zRm9yT2JqZWN0KG5leHRNaWRwb2ludC5wb3MgKyAxLCBlbmQsIG9i
aiwgcmVzb2x2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
cmVzb2x2ZXIuYWRkUnVuKG5ldyAob2JqLT5yZW5kZXJBcmVuYSgpKSBCaWRpUnVuKHN0YXJ0LCBl
bmQsIG9iaiwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOwotICAgIH0KLX0K
LQotdGVtcGxhdGUgPD4KLXZvaWQgSW5saW5lQmlkaVJlc29sdmVyOjphcHBlbmRSdW4oKQotewot
ICAgIGlmICghZW1wdHlSdW4gJiYgIWVvci5hdEVuZCgpKSB7Ci0gICAgICAgIGludCBzdGFydCA9
IHNvci5wb3M7Ci0gICAgICAgIFJlbmRlck9iamVjdCAqb2JqID0gc29yLm9iajsKLSAgICAgICAg
d2hpbGUgKG9iaiAmJiBvYmogIT0gZW9yLm9iaiAmJiBvYmogIT0gZW5kT2ZMaW5lLm9iaikgewot
ICAgICAgICAgICAgYXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgb2JqLT5sZW5ndGgoKSwgb2Jq
LCAqdGhpcyk7ICAgICAgICAKLSAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIG9i
aiA9IGJpZGlOZXh0KHNvci5ibG9jaywgb2JqKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2Jq
KSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwb3MgPSBvYmogPT0gZW9yLm9iaiA/IGVvci5wb3Mg
OiBVSU5UX01BWDsKLSAgICAgICAgICAgIGlmIChvYmogPT0gZW5kT2ZMaW5lLm9iaiAmJiBlbmRP
ZkxpbmUucG9zIDw9IHBvcykgewotICAgICAgICAgICAgICAgIHJlYWNoZWRFbmRPZkxpbmUgPSB0
cnVlOwotICAgICAgICAgICAgICAgIHBvcyA9IGVuZE9mTGluZS5wb3M7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGFkZCBydW5zIGZvciB6ZXJvLWxlbmd0aCBSZW5k
ZXJPYmplY3RzLCBqdXN0IGRvbid0IG1ha2UgdGhlIHJ1biBsYXJnZXIgdGhhbiBpdCBzaG91bGQg
YmUKLSAgICAgICAgICAgIGludCBlbmQgPSBvYmotPmxlbmd0aCgpID8gcG9zKzEgOiAwOwotICAg
ICAgICAgICAgYXBwZW5kUnVuc0Zvck9iamVjdChzdGFydCwgZW5kLCBvYmosICp0aGlzKTsKLSAg
ICAgICAgfQotICAgICAgICAKLSAgICAgICAgZW9yLmluY3JlbWVudCgpOwotICAgICAgICBzb3Ig
PSBlb3I7Ci0gICAgfQotCi0gICAgbV9kaXJlY3Rpb24gPSBPdGhlck5ldXRyYWw7Ci0gICAgbV9z
dGF0dXMuZW9yID0gT3RoZXJOZXV0cmFsOwotfQotCi1zdGF0aWMgaW5saW5lIElubGluZUJveCog
Y3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNSb290
TGluZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxzZSkKLXsKLSAgICBpZiAoaXNSb290TGluZUJv
eCkKLSAgICAgICAgcmV0dXJuIHRvUmVuZGVyQmxvY2sob2JqKS0+Y3JlYXRlQW5kQXBwZW5kUm9v
dElubGluZUJveCgpOwotICAgIAotICAgIGlmIChvYmotPmlzVGV4dCgpKSB7Ci0gICAgICAgIElu
bGluZVRleHRCb3gqIHRleHRCb3ggPSB0b1JlbmRlclRleHQob2JqKS0+Y3JlYXRlSW5saW5lVGV4
dEJveCgpOwotICAgICAgICAvLyBXZSBvbmx5IHRyZWF0IGEgYm94IGFzIHRleHQgZm9yIGEgPGJy
PiBpZiB3ZSBhcmUgb24gYSBsaW5lIGJ5IG91cnNlbGYgb3IgaW4gc3RyaWN0IG1vZGUKLSAgICAg
ICAgLy8gKE5vdGUgdGhlIHVzZSBvZiBzdHJpY3QgbW9kZS4gIEluICJhbG1vc3Qgc3RyaWN0IiBt
b2RlLCB3ZSBkb24ndCB0cmVhdCB0aGUgYm94IGZvciA8YnI+IGFzIHRleHQuKQotICAgICAgICBp
ZiAob2JqLT5pc0JSKCkpCi0gICAgICAgICAgICB0ZXh0Qm94LT5zZXRJc1RleHQoaXNPbmx5UnVu
IHx8IG9iai0+ZG9jdW1lbnQoKS0+aW5TdHJpY3RNb2RlKCkpOwotICAgICAgICByZXR1cm4gdGV4
dEJveDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG9iai0+aXNCb3goKSkKLSAgICAgICAgcmV0dXJu
IHRvUmVuZGVyQm94KG9iaiktPmNyZWF0ZUlubGluZUJveCgpOwotICAgIAotICAgIHJldHVybiB0
b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJbmxpbmVGbG93Qm94KCk7Ci19Ci0K
LXN0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRlcmVyKFJlbmRlck9iamVj
dCogbywgYm9vbCBmdWxsTGF5b3V0KQotewotICAgIGlmIChvLT5pc1RleHQoKSkgewotICAgICAg
ICBpZiAoby0+cHJlZldpZHRoc0RpcnR5KCkgJiYgby0+aXNDb3VudGVyKCkpCi0gICAgICAgICAg
ICB0b1JlbmRlclRleHQobyktPmNhbGNQcmVmV2lkdGhzKDApOyAvLyBGSVhNRTogQ291bnRlcnMg
ZGVwZW5kIG9uIHRoaXMgaGFjay4gTm8gY2x1ZSB3aHkuIFNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQg
YW5kIHJlbW92ZWQuCi0gICAgICAgIHRvUmVuZGVyVGV4dChvKS0+ZGlydHlMaW5lQm94ZXMoZnVs
bExheW91dCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHRvUmVuZGVySW5saW5lKG8pLT5kaXJ0eUxp
bmVCb3hlcyhmdWxsTGF5b3V0KTsKLX0KLQotSW5saW5lRmxvd0JveCogUmVuZGVyQmxvY2s6OmNy
ZWF0ZUxpbmVCb3hlcyhSZW5kZXJPYmplY3QqIG9iaiwgYm9vbCBmaXJzdExpbmUpCi17Ci0gICAg
Ly8gU2VlIGlmIHdlIGhhdmUgYW4gdW5jb25zdHJ1Y3RlZCBsaW5lIGJveCBmb3IgdGhpcyBvYmpl
Y3QgdGhhdCBpcyBhbHNvCi0gICAgLy8gdGhlIGxhc3QgaXRlbSBvbiB0aGUgbGluZS4KLSAgICB1
bnNpZ25lZCBsaW5lRGVwdGggPSAxOwotICAgIElubGluZUZsb3dCb3gqIGNoaWxkQm94ID0gMDsK
LSAgICBJbmxpbmVGbG93Qm94KiBwYXJlbnRCb3ggPSAwOwotICAgIElubGluZUZsb3dCb3gqIHJl
c3VsdCA9IDA7Ci0gICAgZG8gewotICAgICAgICBBU1NFUlQob2JqLT5pc1JlbmRlcklubGluZSgp
IHx8IG9iaiA9PSB0aGlzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgbGFzdCBib3gg
d2UgbWFkZSBmb3IgdGhpcyByZW5kZXIgb2JqZWN0LgotICAgICAgICBwYXJlbnRCb3ggPSBvYmot
PmlzUmVuZGVySW5saW5lKCkgPyB0b1JlbmRlcklubGluZShvYmopLT5sYXN0TGluZUJveCgpIDog
dG9SZW5kZXJCbG9jayhvYmopLT5sYXN0TGluZUJveCgpOwotCi0gICAgICAgIC8vIElmIHRoaXMg
Ym94IGlzIGNvbnN0cnVjdGVkIHRoZW4gaXQgaXMgZnJvbSBhIHByZXZpb3VzIGxpbmUsIGFuZCB3
ZSBuZWVkCi0gICAgICAgIC8vIHRvIG1ha2UgYSBuZXcgYm94IGZvciBvdXIgbGluZS4gIElmIHRo
aXMgYm94IGlzIHVuY29uc3RydWN0ZWQgYnV0IGl0IGhhcwotICAgICAgICAvLyBzb21ldGhpbmcg
Zm9sbG93aW5nIGl0IG9uIHRoZSBsaW5lLCB0aGVuIHdlIGtub3cgd2UgaGF2ZSB0byBtYWtlIGEg
bmV3IGJveAotICAgICAgICAvLyBhcyB3ZWxsLiAgSW4gdGhpcyBzaXR1YXRpb24gb3VyIGlubGlu
ZSBoYXMgYWN0dWFsbHkgYmVlbiBzcGxpdCBpbiB0d28gb24KLSAgICAgICAgLy8gdGhlIHNhbWUg
bGluZSAodGhpcyBjYW4gaGFwcGVuIHdpdGggdmVyeSBmYW5jeSBsYW5ndWFnZSBtaXh0dXJlcyku
Ci0gICAgICAgIGJvb2wgY29uc3RydWN0ZWROZXdCb3ggPSBmYWxzZTsKLSAgICAgICAgaWYgKCFw
YXJlbnRCb3ggfHwgcGFyZW50Qm94LT5pc0NvbnN0cnVjdGVkKCkgfHwgcGFyZW50Qm94LT5uZXh0
T25MaW5lKCkpIHsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBhIG5ldyBib3ggZm9y
IHRoaXMgcmVuZGVyIG9iamVjdC4gIE9uY2UKLSAgICAgICAgICAgIC8vIG1hZGUsIHdlIG5lZWQg
dG8gcGxhY2UgaXQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgotICAgICAgICAgICAg
SW5saW5lQm94KiBuZXdCb3ggPSBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihvYmosIG9iaiA9
PSB0aGlzKTsKLSAgICAgICAgICAgIEFTU0VSVChuZXdCb3gtPmlzSW5saW5lRmxvd0JveCgpKTsK
LSAgICAgICAgICAgIHBhcmVudEJveCA9IHN0YXRpY19jYXN0PElubGluZUZsb3dCb3gqPihuZXdC
b3gpOwotICAgICAgICAgICAgcGFyZW50Qm94LT5zZXRGaXJzdExpbmVTdHlsZUJpdChmaXJzdExp
bmUpOwotICAgICAgICAgICAgY29uc3RydWN0ZWROZXdCb3ggPSB0cnVlOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRCb3g7Ci0K
LSAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGJsb2NrIGl0c2VsZiwgdGhlbiB8Ym94fCBy
ZXByZXNlbnRzIHRoZSByb290Ci0gICAgICAgIC8vIGlubGluZSBib3ggZm9yIHRoZSBsaW5lLCBh
bmQgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGFwcGVuZGVkIHRvIGFueSBwYXJlbnQKLSAgICAgICAg
Ly8gaW5saW5lLgotICAgICAgICBpZiAoY2hpbGRCb3gpCi0gICAgICAgICAgICBwYXJlbnRCb3gt
PmFkZFRvTGluZShjaGlsZEJveCk7Ci0KLSAgICAgICAgaWYgKCFjb25zdHJ1Y3RlZE5ld0JveCB8
fCBvYmogPT0gdGhpcykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNoaWxkQm94ID0g
cGFyZW50Qm94OyAgICAgICAgCi0KLSAgICAgICAgLy8gSWYgd2UndmUgZXhjZWVkZWQgb3VyIGxp
bmUgZGVwdGgsIHRoZW4ganVtcCBzdHJhaWdodCB0byB0aGUgcm9vdCBhbmQgc2tpcCBhbGwgdGhl
IHJlbWFpbmluZwotICAgICAgICAvLyBpbnRlcm1lZGlhdGUgaW5saW5lIGZsb3dzLgotICAgICAg
ICBvYmogPSAoKytsaW5lRGVwdGggPj0gY01heExpbmVEZXB0aCkgPyB0aGlzIDogb2JqLT5wYXJl
bnQoKTsKLQotICAgIH0gd2hpbGUgKHRydWUpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
Um9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmNvbnN0cnVjdExpbmUodW5zaWduZWQgcnVuQ291
bnQsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRpUnVuKiBsYXN0UnVuLCBib29sIGZpcnN0TGluZSwg
Ym9vbCBsYXN0TGluZSwgUmVuZGVyT2JqZWN0KiBlbmRPYmplY3QpCi17Ci0gICAgQVNTRVJUKGZp
cnN0UnVuKTsKLQotICAgIElubGluZUZsb3dCb3gqIHBhcmVudEJveCA9IDA7Ci0gICAgZm9yIChC
aWRpUnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5uZXh0KCkpIHsKLSAgICAgICAgLy8gQ3Jl
YXRlIGEgYm94IGZvciBvdXIgb2JqZWN0LgotICAgICAgICBib29sIGlzT25seVJ1biA9IChydW5D
b3VudCA9PSAxKTsKLSAgICAgICAgaWYgKHJ1bkNvdW50ID09IDIgJiYgIXItPm1fb2JqZWN0LT5p
c0xpc3RNYXJrZXIoKSkKLSAgICAgICAgICAgIGlzT25seVJ1biA9ICgoc3R5bGUoKS0+ZGlyZWN0
aW9uKCkgPT0gUlRMKSA/IGxhc3RSdW4gOiBmaXJzdFJ1biktPm1fb2JqZWN0LT5pc0xpc3RNYXJr
ZXIoKTsKLQotICAgICAgICBJbmxpbmVCb3gqIGJveCA9IGNyZWF0ZUlubGluZUJveEZvclJlbmRl
cmVyKHItPm1fb2JqZWN0LCBmYWxzZSwgaXNPbmx5UnVuKTsKLSAgICAgICAgci0+bV9ib3ggPSBi
b3g7Ci0KLSAgICAgICAgQVNTRVJUKGJveCk7Ci0gICAgICAgIGlmICghYm94KQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBwYXJlbnQgYm94IHlldCwg
b3IgaWYgdGhlIHJ1biBpcyBub3Qgc2ltcGx5IGEgc2libGluZywKLSAgICAgICAgLy8gdGhlbiB3
ZSBuZWVkIHRvIGNvbnN0cnVjdCBpbmxpbmUgYm94ZXMgYXMgbmVjZXNzYXJ5IHRvIHByb3Blcmx5
IGVuY2xvc2UgdGhlCi0gICAgICAgIC8vIHJ1bidzIGlubGluZSBib3guCi0gICAgICAgIGlmICgh
cGFyZW50Qm94IHx8IHBhcmVudEJveC0+cmVuZGVyZXIoKSAhPSByLT5tX29iamVjdC0+cGFyZW50
KCkpCi0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGlubGluZSBib3hlcyBhbGwgdGhlIHdheSBi
YWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCi0gICAgICAgICAgICBwYXJl
bnRCb3ggPSBjcmVhdGVMaW5lQm94ZXMoci0+bV9vYmplY3QtPnBhcmVudCgpLCBmaXJzdExpbmUp
OwotCi0gICAgICAgIC8vIEFwcGVuZCB0aGUgaW5saW5lIGJveCB0byB0aGlzIGxpbmUuCi0gICAg
ICAgIHBhcmVudEJveC0+YWRkVG9MaW5lKGJveCk7Ci0KLSAgICAgICAgYm9vbCB2aXN1YWxseU9y
ZGVyZWQgPSByLT5tX29iamVjdC0+c3R5bGUoKS0+dmlzdWFsbHlPcmRlcmVkKCk7Ci0gICAgICAg
IGJveC0+c2V0QmlkaUxldmVsKHZpc3VhbGx5T3JkZXJlZCA/IDAgOiByLT5sZXZlbCgpKTsKLQot
ICAgICAgICBpZiAoYm94LT5pc0lubGluZVRleHRCb3goKSkgewotICAgICAgICAgICAgSW5saW5l
VGV4dEJveCogdGV4dCA9IHN0YXRpY19jYXN0PElubGluZVRleHRCb3gqPihib3gpOwotICAgICAg
ICAgICAgdGV4dC0+c2V0U3RhcnQoci0+bV9zdGFydCk7Ci0gICAgICAgICAgICB0ZXh0LT5zZXRM
ZW4oci0+bV9zdG9wIC0gci0+bV9zdGFydCk7Ci0gICAgICAgICAgICB0ZXh0LT5tX2Rpck92ZXJy
aWRlID0gci0+ZGlyT3ZlcnJpZGUodmlzdWFsbHlPcmRlcmVkKTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIC8vIFdlIHNob3VsZCBoYXZlIGEgcm9vdCBpbmxpbmUgYm94LiAgSXQgc2hvdWxkIGJl
IHVuY29uc3RydWN0ZWQgYW5kCi0gICAgLy8gYmUgdGhlIGxhc3QgY29udGludWF0aW9uIG9mIG91
ciBsaW5lIGxpc3QuCi0gICAgQVNTRVJUKGxhc3RMaW5lQm94KCkgJiYgIWxhc3RMaW5lQm94KCkt
PmlzQ29uc3RydWN0ZWQoKSk7Ci0KLSAgICAvLyBTZXQgYml0cyBvbiBvdXIgaW5saW5lIGZsb3cg
Ym94ZXMgdGhhdCBpbmRpY2F0ZSB3aGljaCBzaWRlcyBzaG91bGQKLSAgICAvLyBwYWludCBib3Jk
ZXJzL21hcmdpbnMvcGFkZGluZy4gIFRoaXMga25vd2xlZGdlIHdpbGwgdWx0aW1hdGVseSBiZSB1
c2VkIHdoZW4KLSAgICAvLyB3ZSBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgcG9zaXRpb25zIGFu
ZCB3aWR0aHMgb2YgYWxsIHRoZSBpbmxpbmUgYm94ZXMgb24KLSAgICAvLyB0aGUgbGluZS4KLSAg
ICBsYXN0TGluZUJveCgpLT5kZXRlcm1pbmVTcGFjaW5nRm9yRmxvd0JveGVzKGxhc3RMaW5lLCBl
bmRPYmplY3QpOwotCi0gICAgLy8gTm93IG1hcmsgdGhlIGxpbmUgYm94ZXMgYXMgYmVpbmcgY29u
c3RydWN0ZWQuCi0gICAgbGFzdExpbmVCb3goKS0+c2V0Q29uc3RydWN0ZWQoKTsKLQotICAgIC8v
IFJldHVybiB0aGUgbGFzdCBsaW5lLgotICAgIHJldHVybiBsYXN0Um9vdEJveCgpOwotfQotCi12
b2lkIFJlbmRlckJsb2NrOjpjb21wdXRlSG9yaXpvbnRhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElu
bGluZUJveCogbGluZUJveCwgYm9vbCBmaXJzdExpbmUsIEJpZGlSdW4qIGZpcnN0UnVuLCBCaWRp
UnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBib29sIHJlYWNoZWRFbmQpCi17Ci0gICAgLy8gRmlyc3Qg
ZGV0ZXJtaW5lIG91ciB0b3RhbCB3aWR0aC4KLSAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBsaW5l
V2lkdGgoaGVpZ2h0KCksIGZpcnN0TGluZSk7Ci0gICAgaW50IHRvdFdpZHRoID0gbGluZUJveC0+
Z2V0Rmxvd1NwYWNpbmdXaWR0aCgpOwotICAgIGJvb2wgbmVlZHNXb3JkU3BhY2luZyA9IGZhbHNl
OwotICAgIHVuc2lnbmVkIG51bVNwYWNlcyA9IDA7Ci0gICAgRVRleHRBbGlnbiB0ZXh0QWxpZ24g
PSBzdHlsZSgpLT50ZXh0QWxpZ24oKTsKLQotICAgIGZvciAoQmlkaVJ1biogciA9IGZpcnN0UnVu
OyByOyByID0gci0+bmV4dCgpKSB7Ci0gICAgICAgIGlmICghci0+bV9ib3ggfHwgci0+bV9vYmpl
Y3QtPmlzUG9zaXRpb25lZCgpIHx8IHItPm1fYm94LT5pc0xpbmVCcmVhaygpKQotICAgICAgICAg
ICAgY29udGludWU7IC8vIFBvc2l0aW9uZWQgb2JqZWN0cyBhcmUgb25seSBwYXJ0aWNpcGF0aW5n
IHRvIGZpZ3VyZSBvdXQgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IHN0
YXRpYyB4IHBvc2l0aW9uLiAgVGhleSBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgd2lkdGguCi0gICAg
ICAgICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCBsaW5lIGJyZWFrIGJveGVzIGhhdmUgbm8g
ZWZmZWN0IG9uIHRoZSB3aWR0aC4KLSAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc1RleHQoKSkg
ewotICAgICAgICAgICAgUmVuZGVyVGV4dCogcnQgPSB0b1JlbmRlclRleHQoci0+bV9vYmplY3Qp
OwotCi0gICAgICAgICAgICBpZiAodGV4dEFsaWduID09IEpVU1RJRlkgJiYgciAhPSB0cmFpbGlu
Z1NwYWNlUnVuKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSBy
dC0+Y2hhcmFjdGVycygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSByLT5tX3N0YXJ0
OyBpIDwgci0+bV9zdG9wOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVUNoYXIgYyA9IGNo
YXJhY3RlcnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcgJyB8fCBjID09ICdc
bicgfHwgYyA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3BhY2VzKys7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW50IGxl
bmd0aCA9IHJ0LT50ZXh0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXItPm1fc3Rh
cnQgJiYgbmVlZHNXb3JkU3BhY2luZyAmJiBpc1NwYWNlT3JOZXdsaW5lKHJ0LT5jaGFyYWN0ZXJz
KClbci0+bV9zdGFydF0pKQotICAgICAgICAgICAgICAgICAgICB0b3RXaWR0aCArPSBydC0+c3R5
bGUoZmlyc3RMaW5lKS0+Zm9udCgpLndvcmRTcGFjaW5nKCk7Ci0gICAgICAgICAgICAgICAgbmVl
ZHNXb3JkU3BhY2luZyA9ICFpc1NwYWNlT3JOZXdsaW5lKHJ0LT5jaGFyYWN0ZXJzKClbci0+bV9z
dG9wIC0gMV0pICYmIHItPm1fc3RvcCA9PSBsZW5ndGg7ICAgICAgICAgIAotICAgICAgICAgICAg
fQotICAgICAgICAgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNrRm9u
dHM7Ci0gICAgICAgICAgICByLT5tX2JveC0+c2V0V2lkdGgocnQtPndpZHRoKHItPm1fc3RhcnQs
IHItPm1fc3RvcCAtIHItPm1fc3RhcnQsIHRvdFdpZHRoLCBmaXJzdExpbmUsICZmYWxsYmFja0Zv
bnRzKSk7Ci0gICAgICAgICAgICBpZiAoIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpCi0jaWYgRU5B
QkxFKFNWRykKLSAgICAgICAgICAgICAgICAgICAgJiYgIWlzU1ZHVGV4dCgpCi0jZW5kaWYKLSAg
ICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIEFTU0VSVChyLT5tX2JveC0+aXNUZXh0KCkp
OwotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElubGluZVRleHRCb3gqPihyLT5tX2JveCkt
PnNldEZhbGxiYWNrRm9udHMoZmFsbGJhY2tGb250cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0gZWxzZSBpZiAoIXItPm1fb2JqZWN0LT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgICAg
ICBSZW5kZXJCb3gqIHJlbmRlckJveCA9IHRvUmVuZGVyQm94KHItPm1fb2JqZWN0KTsKLSAgICAg
ICAgICAgIHJlbmRlckJveC0+Y2FsY1dpZHRoKCk7Ci0gICAgICAgICAgICByLT5tX2JveC0+c2V0
V2lkdGgocmVuZGVyQm94LT53aWR0aCgpKTsKLSAgICAgICAgICAgIHRvdFdpZHRoICs9IHJlbmRl
ckJveC0+bWFyZ2luTGVmdCgpICsgcmVuZGVyQm94LT5tYXJnaW5SaWdodCgpOwotICAgICAgICB9
Ci0KLSAgICAgICAgdG90V2lkdGggKz0gci0+bV9ib3gtPndpZHRoKCk7Ci0gICAgfQotCi0gICAg
Ly8gQXJtZWQgd2l0aCB0aGUgdG90YWwgd2lkdGggb2YgdGhlIGxpbmUgKHdpdGhvdXQganVzdGlm
aWNhdGlvbiksCi0gICAgLy8gd2Ugbm93IGV4YW1pbmUgb3VyIHRleHQtYWxpZ24gcHJvcGVydHkg
aW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHBvc2l0aW9uIHRoZQotICAgIC8vIG9iamVj
dHMgaG9yaXpvbnRhbGx5LiAgVGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBsaW5lIGNhbiBiZSBpbmNy
ZWFzZWQgaWYgd2UgZW5kIHVwCi0gICAgLy8ganVzdGlmeWluZyB0ZXh0LgotICAgIGludCB4ID0g
bGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKTsKLSAgICBzd2l0Y2ggKHRleHRBbGlnbikg
ewotICAgICAgICBjYXNlIExFRlQ6Ci0gICAgICAgIGNhc2UgV0VCS0lUX0xFRlQ6Ci0gICAgICAg
ICAgICAvLyBUaGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jayBzaG91bGQgZGV0ZXJtaW5lIHdoYXQg
aGFwcGVucyB3aXRoIHdpZGUgbGluZXMuICBJbgotICAgICAgICAgICAgLy8gcGFydGljdWxhciB3
aXRoIFJUTCBibG9ja3MsIHdpZGUgbGluZXMgc2hvdWxkIHN0aWxsIHNwaWxsIG91dCB0byB0aGUg
bGVmdC4KLSAgICAgICAgICAgIGlmIChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpIHsKLSAg
ICAgICAgICAgICAgICBpZiAodG90V2lkdGggPiBhdmFpbGFibGVXaWR0aCAmJiB0cmFpbGluZ1Nw
YWNlUnVuKQotICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+c2V0
V2lkdGgobWF4KDAsIHRyYWlsaW5nU3BhY2VSdW4tPm1fYm94LT53aWR0aCgpIC0gdG90V2lkdGgg
KyBhdmFpbGFibGVXaWR0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBpZiAodHJhaWxpbmdTcGFjZVJ1bikKLSAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFj
ZVJ1bi0+bV9ib3gtPnNldFdpZHRoKDApOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvdFdp
ZHRoID4gYXZhaWxhYmxlV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHggLT0gKHRvdFdpZHRo
IC0gYXZhaWxhYmxlV2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgSlVTVElGWToKLSAgICAgICAgICAgIGlmIChudW1TcGFjZXMgJiYgIXJlYWNo
ZWRFbmQgJiYgIWxpbmVCb3gtPmVuZHNXaXRoQnJlYWsoKSkgewotICAgICAgICAgICAgICAgIGlm
ICh0cmFpbGluZ1NwYWNlUnVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdFdpZHRoIC09IHRy
YWlsaW5nU3BhY2VSdW4tPm1fYm94LT53aWR0aCgpOwotICAgICAgICAgICAgICAgICAgICB0cmFp
bGluZ1NwYWNlUnVuLT5tX2JveC0+c2V0V2lkdGgoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0
aHJvdWdoCi0gICAgICAgIGNhc2UgVEFBVVRPOgotICAgICAgICAgICAgbnVtU3BhY2VzID0gMDsK
LSAgICAgICAgICAgIC8vIGZvciByaWdodCB0byBsZWZ0IGZhbGwgdGhyb3VnaCB0byByaWdodCBh
bGlnbmVkCi0gICAgICAgICAgICBpZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHRvdFdpZHRoID4gYXZhaWxhYmxlV2lkdGggJiYgdHJhaWxpbmdT
cGFjZVJ1bikKLSAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9ib3gtPnNl
dFdpZHRoKG1heCgwLCB0cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+d2lkdGgoKSAtIHRvdFdpZHRo
ICsgYXZhaWxhYmxlV2lkdGgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgY2FzZSBSSUdIVDoKLSAgICAgICAgY2FzZSBXRUJLSVRfUklHSFQ6Ci0gICAg
ICAgICAgICAvLyBXaWRlIGxpbmVzIHNwaWxsIG91dCBvZiB0aGUgYmxvY2sgYmFzZWQgb2ZmIGRp
cmVjdGlvbi4KLSAgICAgICAgICAgIC8vIFNvIGV2ZW4gaWYgdGV4dC1hbGlnbiBpcyByaWdodCwg
aWYgZGlyZWN0aW9uIGlzIExUUiwgd2lkZSBsaW5lcyBzaG91bGQgb3ZlcmZsb3cgb3V0IG9mIHRo
ZSByaWdodAotICAgICAgICAgICAgLy8gc2lkZSBvZiB0aGUgYmxvY2suCi0gICAgICAgICAgICBp
ZiAoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRy
YWlsaW5nU3BhY2VSdW4pIHsKLSAgICAgICAgICAgICAgICAgICAgdG90V2lkdGggLT0gdHJhaWxp
bmdTcGFjZVJ1bi0+bV9ib3gtPndpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5n
U3BhY2VSdW4tPm1fYm94LT5zZXRXaWR0aCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgaWYgKHRvdFdpZHRoIDwgYXZhaWxhYmxlV2lkdGgpCi0gICAgICAgICAgICAgICAg
ICAgIHggKz0gYXZhaWxhYmxlV2lkdGggLSB0b3RXaWR0aDsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgaWYgKHRvdFdpZHRoID4gYXZhaWxhYmxlV2lkdGggJiYgdHJhaWxp
bmdTcGFjZVJ1bikgewotICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX2Jv
eC0+c2V0V2lkdGgobWF4KDAsIHRyYWlsaW5nU3BhY2VSdW4tPm1fYm94LT53aWR0aCgpIC0gdG90
V2lkdGggKyBhdmFpbGFibGVXaWR0aCkpOwotICAgICAgICAgICAgICAgICAgICB0b3RXaWR0aCAt
PSB0cmFpbGluZ1NwYWNlUnVuLT5tX2JveC0+d2lkdGgoKTsKLSAgICAgICAgICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgICAgICAgICAgeCArPSBhdmFpbGFibGVXaWR0aCAtIHRvdFdpZHRoOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0VOVEVSOgot
ICAgICAgICBjYXNlIFdFQktJVF9DRU5URVI6Ci0gICAgICAgICAgICBpbnQgdHJhaWxpbmdTcGFj
ZVdpZHRoID0gMDsKLSAgICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlUnVuKSB7Ci0gICAgICAg
ICAgICAgICAgdG90V2lkdGggLT0gdHJhaWxpbmdTcGFjZVJ1bi0+bV9ib3gtPndpZHRoKCk7Ci0g
ICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVdpZHRoID0gbWluKHRyYWlsaW5nU3BhY2VSdW4t
Pm1fYm94LT53aWR0aCgpLCAoYXZhaWxhYmxlV2lkdGggLSB0b3RXaWR0aCArIDEpIC8gMik7Ci0g
ICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9ib3gtPnNldFdpZHRoKG1heCgwLCB0
cmFpbGluZ1NwYWNlV2lkdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdHls
ZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIpCi0gICAgICAgICAgICAgICAgeCArPSBtYXgoKGF2YWls
YWJsZVdpZHRoIC0gdG90V2lkdGgpIC8gMiwgMCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgeCArPSB0b3RXaWR0aCA+IGF2YWlsYWJsZVdpZHRoID8gKGF2YWlsYWJsZVdpZHRo
IC0gdG90V2lkdGgpIDogKGF2YWlsYWJsZVdpZHRoIC0gdG90V2lkdGgpIC8gMiAtIHRyYWlsaW5n
U3BhY2VXaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChudW1TcGFj
ZXMpIHsKLSAgICAgICAgZm9yIChCaWRpUnVuKiByID0gZmlyc3RSdW47IHI7IHIgPSByLT5uZXh0
KCkpIHsKLSAgICAgICAgICAgIGlmICghci0+bV9ib3ggfHwgciA9PSB0cmFpbGluZ1NwYWNlUnVu
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpbnQgc3BhY2VBZGQg
PSAwOwotICAgICAgICAgICAgaWYgKHItPm1fb2JqZWN0LT5pc1RleHQoKSkgewotICAgICAgICAg
ICAgICAgIHVuc2lnbmVkIHNwYWNlcyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgVUNoYXIq
IGNoYXJhY3RlcnMgPSB0b1JlbmRlclRleHQoci0+bV9vYmplY3QpLT5jaGFyYWN0ZXJzKCk7Ci0g
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHItPm1fc3RhcnQ7IGkgPCByLT5tX3N0b3A7IGkr
KykgewotICAgICAgICAgICAgICAgICAgICBVQ2hhciBjID0gY2hhcmFjdGVyc1tpXTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdCcpCi0g
ICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgICAgICBBU1NFUlQoc3BhY2VzIDw9IG51bVNwYWNlcyk7Ci0KLSAgICAgICAgICAg
ICAgICAvLyBPbmx5IGp1c3RpZnkgdGV4dCBpZiB3aGl0ZXNwYWNlIGlzIGNvbGxhcHNlZC4KLSAg
ICAgICAgICAgICAgICBpZiAoci0+bV9vYmplY3QtPnN0eWxlKCktPmNvbGxhcHNlV2hpdGVTcGFj
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwYWNlQWRkID0gKGF2YWlsYWJsZVdpZHRoIC0g
dG90V2lkdGgpICogc3BhY2VzIC8gbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxJbmxpbmVUZXh0Qm94Kj4oci0+bV9ib3gpLT5zZXRTcGFjZUFkZChzcGFjZUFkZCk7
Ci0gICAgICAgICAgICAgICAgICAgIHRvdFdpZHRoICs9IHNwYWNlQWRkOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBudW1TcGFjZXMgLT0gc3BhY2VzOwotICAgICAgICAgICAg
ICAgIGlmICghbnVtU3BhY2VzKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSB3aWR0aHMgb2YgYWxsIHJ1bnMg
YXJlIG5vdyBrbm93bi4gIFdlIGNhbiBub3cgcGxhY2UgZXZlcnkgaW5saW5lIGJveCAoYW5kCi0g
ICAgLy8gY29tcHV0ZSBhY2N1cmF0ZSB3aWR0aHMgZm9yIHRoZSBpbmxpbmUgZmxvdyBib3hlcyku
Ci0gICAgaW50IGxlZnRQb3NpdGlvbiA9IHg7Ci0gICAgaW50IHJpZ2h0UG9zaXRpb24gPSB4Owot
ICAgIG5lZWRzV29yZFNwYWNpbmcgPSBmYWxzZTsKLSAgICBsaW5lQm94LT5wbGFjZUJveGVzSG9y
aXpvbnRhbGx5KHgsIGxlZnRQb3NpdGlvbiwgcmlnaHRQb3NpdGlvbiwgbmVlZHNXb3JkU3BhY2lu
Zyk7Ci0gICAgbGluZUJveC0+c2V0SG9yaXpvbnRhbE92ZXJmbG93UG9zaXRpb25zKGxlZnRQb3Np
dGlvbiwgcmlnaHRQb3NpdGlvbik7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmNvbXB1dGVWZXJ0
aWNhbFBvc2l0aW9uc0ZvckxpbmUoUm9vdElubGluZUJveCogbGluZUJveCwgQmlkaVJ1biogZmly
c3RSdW4pCi17Ci0gICAgc2V0SGVpZ2h0KGxpbmVCb3gtPnZlcnRpY2FsbHlBbGlnbkJveGVzKGhl
aWdodCgpKSk7Ci0gICAgbGluZUJveC0+c2V0QmxvY2tIZWlnaHQoaGVpZ2h0KCkpOwotCi0gICAg
Ly8gU2VlIGlmIHRoZSBsaW5lIHNwaWxsZWQgb3V0LiAgSWYgc28gc2V0IG92ZXJmbG93IGhlaWdo
dCBhY2NvcmRpbmdseS4KLSAgICBpbnQgYm90dG9tT2ZMaW5lID0gbGluZUJveC0+Ym90dG9tT3Zl
cmZsb3coKTsKLSAgICBpZiAoYm90dG9tT2ZMaW5lID4gaGVpZ2h0KCkgJiYgYm90dG9tT2ZMaW5l
ID4gbV9vdmVyZmxvd0hlaWdodCkKLSAgICAgICAgbV9vdmVyZmxvd0hlaWdodCA9IGJvdHRvbU9m
TGluZTsKLQotICAgIC8vIE5vdyBtYWtlIHN1cmUgd2UgcGxhY2UgcmVwbGFjZWQgcmVuZGVyIG9i
amVjdHMgY29ycmVjdGx5LgotICAgIGZvciAoQmlkaVJ1biogciA9IGZpcnN0UnVuOyByOyByID0g
ci0+bmV4dCgpKSB7Ci0gICAgICAgIEFTU0VSVChyLT5tX2JveCk7Ci0gICAgICAgIGlmICghci0+
bV9ib3gpCi0gICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBydW5zIHdpdGggbm8gbGluZSBi
b3hlcy4KLQotICAgICAgICAvLyBBbGlnbiBwb3NpdGlvbmVkIGJveGVzIHdpdGggdGhlIHRvcCBv
ZiB0aGUgbGluZSBib3guICBUaGlzIGlzCi0gICAgICAgIC8vIGEgcmVhc29uYWJsZSBhcHByb3hp
bWF0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIHkgcG9zaXRpb24uCi0gICAgICAgIGlmIChyLT5tX29i
amVjdC0+aXNQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICByLT5tX2JveC0+c2V0WShoZWlnaHQo
KSk7Ci0KLSAgICAgICAgLy8gUG9zaXRpb24gaXMgdXNlZCB0byBwcm9wZXJseSBwb3NpdGlvbiBi
b3RoIHJlcGxhY2VkIGVsZW1lbnRzIGFuZAotICAgICAgICAvLyB0byB1cGRhdGUgdGhlIHN0YXRp
YyBub3JtYWwgZmxvdyB4L3kgb2YgcG9zaXRpb25lZCBlbGVtZW50cy4KLSAgICAgICAgaWYgKHIt
Pm1fb2JqZWN0LT5pc1RleHQoKSkKLSAgICAgICAgICAgIHRvUmVuZGVyVGV4dChyLT5tX29iamVj
dCktPnBvc2l0aW9uTGluZUJveChyLT5tX2JveCk7Ci0gICAgICAgIGVsc2UgaWYgKHItPm1fb2Jq
ZWN0LT5pc0JveCgpKQotICAgICAgICAgICAgdG9SZW5kZXJCb3goci0+bV9vYmplY3QpLT5wb3Np
dGlvbkxpbmVCb3goci0+bV9ib3gpOwotICAgIH0KLSAgICAvLyBQb3NpdGlvbmVkIG9iamVjdHMg
YW5kIHplcm8tbGVuZ3RoIHRleHQgbm9kZXMgZGVzdHJveSB0aGVpciBib3hlcyBpbgotICAgIC8v
IHBvc2l0aW9uKCksIHdoaWNoIHVubmVjZXNzYXJpbHkgZGlydGllcyB0aGUgbGluZS4KLSAgICBs
aW5lQm94LT5tYXJrRGlydHkoZmFsc2UpOwotfQotCi0vLyBjb2xsZWN0cyBvbmUgbGluZSBvZiB0
aGUgcGFyYWdyYXBoIGFuZCB0cmFuc2Zvcm1zIGl0IHRvIHZpc3VhbCBvcmRlcgotdm9pZCBSZW5k
ZXJCbG9jazo6YmlkaVJlb3JkZXJMaW5lKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIGNv
bnN0IElubGluZUl0ZXJhdG9yJiBlbmQsIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQot
ewotICAgIHJlc29sdmVyLmNyZWF0ZUJpZGlSdW5zRm9yTGluZShlbmQsIHN0eWxlKCktPnZpc3Vh
bGx5T3JkZXJlZCgpLCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwotfQotCi1zdGF0aWMgaW5s
aW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgUmVuZGVyVGV4dCog
cmVuZGVyZXIpCi17Ci0gICAgaWYgKGNoYXJhY3RlciA9PSAnICcgfHwgY2hhcmFjdGVyID09ICdc
dCcgfHwgY2hhcmFjdGVyID09IHNvZnRIeXBoZW4pCi0gICAgICAgIHJldHVybiB0cnVlOwotICAg
IGlmIChjaGFyYWN0ZXIgPT0gJ1xuJykKLSAgICAgICAgcmV0dXJuICFyZW5kZXJlci0+c3R5bGUo
KS0+cHJlc2VydmVOZXdsaW5lKCk7Ci0gICAgaWYgKGNoYXJhY3RlciA9PSBub0JyZWFrU3BhY2Up
Ci0gICAgICAgIHJldHVybiByZW5kZXJlci0+c3R5bGUoKS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dElubGluZUNo
aWxkcmVuKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgaW50JiByZXBhaW50VG9wLCBpbnQmIHJlcGFp
bnRCb3R0b20pCi17Ci0gICAgYm9vbCB1c2VSZXBhaW50Qm91bmRzID0gZmFsc2U7Ci0gICAgCi0g
ICAgbV9vdmVyZmxvd0hlaWdodCA9IDA7Ci0gICAgICAgIAotICAgIHNldEhlaWdodChib3JkZXJU
b3AoKSArIHBhZGRpbmdUb3AoKSk7Ci0gICAgaW50IHRvQWRkID0gYm9yZGVyQm90dG9tKCkgKyBw
YWRkaW5nQm90dG9tKCkgKyBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KCk7Ci0KLSAgICAvLyBG
aWd1cmUgb3V0IGlmIHdlIHNob3VsZCBjbGVhciBvdXQgb3VyIGxpbmUgYm94ZXMuCi0gICAgLy8g
RklYTUU6IEhhbmRsZSByZXNpemUgZXZlbnR1YWxseSEKLSAgICAvLyBGSVhNRTogRG8gc29tZXRo
aW5nIGJldHRlciB3aGVuIGZsb2F0cyBhcmUgcHJlc2VudC4KLSAgICBib29sIGZ1bGxMYXlvdXQg
PSAhZmlyc3RMaW5lQm94KCkgfHwgIWZpcnN0Q2hpbGQoKSB8fCBzZWxmTmVlZHNMYXlvdXQoKSB8
fCByZWxheW91dENoaWxkcmVuOwotICAgIGlmIChmdWxsTGF5b3V0KQotICAgICAgICBsaW5lQm94
ZXMoKS0+ZGVsZXRlTGluZUJveGVzKHJlbmRlckFyZW5hKCkpOwotCi0gICAgLy8gVGV4dCB0cnVu
Y2F0aW9uIG9ubHkga2lja3MgaW4gaWYgeW91ciBvdmVyZmxvdyBpc24ndCB2aXNpYmxlIGFuZCB5
b3VyIHRleHQtb3ZlcmZsb3ctbW9kZSBpc24ndAotICAgIC8vIGNsaXAuCi0gICAgLy8gRklYTUU6
IENTUzMgc2F5cyB0aGF0IGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNsaXBwZWQgbXVzdCBhbHNvIGtu
b3cgaG93IHRvIHRydW5jYXRlLiAgVGhpcyBpcyBpbnNhbmVseQotICAgIC8vIGRpZmZpY3VsdCB0
byBmaWd1cmUgb3V0IChlc3BlY2lhbGx5IGluIHRoZSBtaWRkbGUgb2YgZG9pbmcgbGF5b3V0KSwg
YW5kIGlzIHJlYWxseSBhbiBlc290ZXJpYyBwaWxlIG9mIG5vbnNlbnNlCi0gICAgLy8gYW55d2F5
LCBzbyB3ZSB3b24ndCB3b3JyeSBhYm91dCBmb2xsb3dpbmcgdGhlIGRyYWZ0IGhlcmUuCi0gICAg
Ym9vbCBoYXNUZXh0T3ZlcmZsb3cgPSBzdHlsZSgpLT50ZXh0T3ZlcmZsb3coKSAmJiBoYXNPdmVy
Zmxvd0NsaXAoKTsKLQotICAgIC8vIFdhbGsgYWxsIHRoZSBsaW5lcyBhbmQgZGVsZXRlIG91ciBl
bGxpcHNpcyBsaW5lIGJveGVzIGlmIHRoZXkgZXhpc3QuCi0gICAgaWYgKGhhc1RleHRPdmVyZmxv
dykKLSAgICAgICAgIGRlbGV0ZUVsbGlwc2lzTGluZUJveGVzKCk7Ci0KLSAgICBpZiAoZmlyc3RD
aGlsZCgpKSB7Ci0gICAgICAgIC8vIGxheW91dCByZXBsYWNlZCBlbGVtZW50cwotICAgICAgICBi
b29sIGVuZE9mSW5saW5lID0gZmFsc2U7Ci0gICAgICAgIFJlbmRlck9iamVjdCogbyA9IGJpZGlG
aXJzdCh0aGlzLCAwLCBmYWxzZSk7Ci0gICAgICAgIFZlY3RvcjxGbG9hdFdpdGhSZWN0PiBmbG9h
dHM7Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBpZiAoby0+aXNSZXBsYWNlZCgp
IHx8IG8tPmlzRmxvYXRpbmcoKSB8fCBvLT5pc1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAg
ICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gobyk7Ci0gICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgaWYgKHJlbGF5b3V0Q2hpbGRyZW4gfHwgby0+c3R5bGUoKS0+d2lkdGgo
KS5pc1BlcmNlbnQoKSB8fCBvLT5zdHlsZSgpLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkKLSAgICAg
ICAgICAgICAgICAgICAgby0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBmYWxzZSk7Ci0gICAg
ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHJlbGF5b3V0Q2hpbGRyZW4g
aXMgc2V0IGFuZCB3ZSBoYXZlIHBlcmNlbnRhZ2UgcGFkZGluZywgd2UgYWxzbyBuZWVkIHRvIGlu
dmFsaWRhdGUgdGhlIGNoaWxkJ3MgcHJlZiB3aWR0aHMuCi0gICAgICAgICAgICAgICAgaWYgKHJl
bGF5b3V0Q2hpbGRyZW4gJiYgKG8tPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkuaXNQZXJjZW50KCkg
fHwgby0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkuaXNQZXJjZW50KCkpKQotICAgICAgICAgICAg
ICAgICAgICBvLT5zZXRQcmVmV2lkdGhzRGlydHkodHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgaWYgKG8tPmlzUG9zaXRpb25lZCgpKQotICAgICAgICAgICAgICAg
ICAgICBvLT5jb250YWluaW5nQmxvY2soKS0+aW5zZXJ0UG9zaXRpb25lZE9iamVjdChib3gpOwot
ICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoby0+aXNGbG9h
dGluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRzLmFwcGVuZChGbG9hdFdpdGhS
ZWN0KGJveCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsTGF5b3V0IHx8IG8t
Pm5lZWRzTGF5b3V0KCkpIC8vIFJlcGxhY2VkIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAg
ICAgICB0b1JlbmRlckJveChvKS0+ZGlydHlMaW5lQm94ZXMoZnVsbExheW91dCk7Ci0KLSAgICAg
ICAgICAgICAgICAgICAgby0+bGF5b3V0SWZOZWVkZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9IGVsc2UgaWYgKG8tPmlzVGV4dCgpIHx8IChvLT5pc1JlbmRlcklubGluZSgp
ICYmICFlbmRPZklubGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnVsbExheW91dCB8fCBv
LT5zZWxmTmVlZHNMYXlvdXQoKSkKLSAgICAgICAgICAgICAgICAgICAgZGlydHlMaW5lQm94ZXNG
b3JSZW5kZXJlcihvLCBmdWxsTGF5b3V0KTsKLSAgICAgICAgICAgICAgICBvLT5zZXROZWVkc0xh
eW91dChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvLT5pc1RleHQoKSkKLSAgICAgICAg
ICAgICAgICAgICAgdG9SZW5kZXJJbmxpbmUobyktPmludmFsaWRhdGVWZXJ0aWNhbFBvc2l0aW9u
KCk7IC8vIEZJWE1FOiBTaG91bGQgZG8gYmV0dGVyIGhlcmUgYW5kIG5vdCBhbHdheXMgaW52YWxp
ZGF0ZSBldmVyeXRoaW5nLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgbyA9IGJpZGlOZXh0
KHRoaXMsIG8sIDAsIGZhbHNlLCAmZW5kT2ZJbmxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gV2Ugd2FudCB0byBza2lwIGFoZWFkIHRvIHRoZSBmaXJzdCBkaXJ0eSBsaW5lCi0gICAgICAg
IElubGluZUJpZGlSZXNvbHZlciByZXNvbHZlcjsKLSAgICAgICAgdW5zaWduZWQgZmxvYXRJbmRl
eDsKLSAgICAgICAgYm9vbCBmaXJzdExpbmUgPSB0cnVlOwotICAgICAgICBib29sIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSA9IHRydWU7Ci0gICAgICAgIFJvb3RJbmxpbmVCb3gqIHN0YXJ0TGlu
ZSA9IGRldGVybWluZVN0YXJ0UG9zaXRpb24oZmlyc3RMaW5lLCBmdWxsTGF5b3V0LCBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHksIHJlc29sdmVyLCBmbG9hdHMsIGZsb2F0SW5kZXgpOwotCi0gICAg
ICAgIGlmIChmdWxsTGF5b3V0ICYmICFzZWxmTmVlZHNMYXlvdXQoKSkgewotICAgICAgICAgICAg
c2V0TmVlZHNMYXlvdXQodHJ1ZSwgZmFsc2UpOyAgLy8gTWFyayBvdXJzZWx2ZXMgYXMgbmVlZGlu
ZyBhIGZ1bGwgbGF5b3V0LiBUaGlzIHdheSB3ZSdsbCByZXBhaW50IGxpa2UKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHN1cHBvc2VkIHRvLgotICAg
ICAgICAgICAgUmVuZGVyVmlldyogdiA9IHZpZXcoKTsKLSAgICAgICAgICAgIGlmICh2ICYmICF2
LT5kb2luZ0Z1bGxSZXBhaW50KCkgJiYgaGFzTGF5ZXIoKSkgewotICAgICAgICAgICAgICAgIC8v
IEJlY2F1c2Ugd2Ugd2FpdGVkIHVudGlsIHdlIHdlcmUgYWxyZWFkeSBpbnNpZGUgbGF5b3V0IHRv
IGRpc2NvdmVyCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgYmxvY2sgcmVhbGx5IG5lZWRl
ZCBhIGZ1bGwgbGF5b3V0LCB3ZSBtaXNzZWQgb3VyIGNoYW5jZSB0byByZXBhaW50IHRoZSBsYXll
cgotICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBsYXlvdXQgc3RhcnRlZC4gIEx1Y2tpbHkgdGhl
IGxheWVyIGhhcyBjYWNoZWQgdGhlIHJlcGFpbnQgcmVjdCBmb3IgaXRzIG9yaWdpbmFsCi0gICAg
ICAgICAgICAgICAgLy8gcG9zaXRpb24gYW5kIHNpemUsIGFuZCBzbyB3ZSBjYW4gdXNlIHRoYXQg
dG8gbWFrZSBhIHJlcGFpbnQgaGFwcGVuIG5vdy4KLSAgICAgICAgICAgICAgICByZXBhaW50VXNp
bmdDb250YWluZXIoY29udGFpbmVyRm9yUmVwYWludCgpLCBsYXllcigpLT5yZXBhaW50UmVjdCgp
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXQgPSBtX2Zsb2F0aW5nT2JqZWN0cyA/IG1fZmxvYXRpbmdPYmplY3RzLT5sYXN0KCkg
OiAwOwotCi0gICAgICAgIExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSA9IHJl
c29sdmVyLm1pZHBvaW50U3RhdGUoKTsKLQotICAgICAgICAvLyBXZSBhbHNvIGZpbmQgdGhlIGZp
cnN0IGNsZWFuIGxpbmUgYW5kIGV4dHJhY3QgdGhlc2UgbGluZXMuICBXZSB3aWxsIGFkZCB0aGVt
IGJhY2sKLSAgICAgICAgLy8gaWYgd2UgZGV0ZXJtaW5lIHRoYXQgd2UncmUgYWJsZSB0byBzeW5j
aHJvbml6ZSBhZnRlciBoYW5kbGluZyBhbGwgb3VyIGRpcnR5IGxpbmVzLgotICAgICAgICBJbmxp
bmVJdGVyYXRvciBjbGVhbkxpbmVTdGFydDsKLSAgICAgICAgQmlkaVN0YXR1cyBjbGVhbkxpbmVC
aWRpU3RhdHVzOwotICAgICAgICBpbnQgZW5kTGluZVlQb3MgPSAwOwotICAgICAgICBSb290SW5s
aW5lQm94KiBlbmRMaW5lID0gKGZ1bGxMYXlvdXQgfHwgIXN0YXJ0TGluZSkgPyAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBkZXRlcm1pbmVFbmRQb3NpdGlvbihzdGFydExp
bmUsIGNsZWFuTGluZVN0YXJ0LCBjbGVhbkxpbmVCaWRpU3RhdHVzLCBlbmRMaW5lWVBvcyk7Ci0K
LSAgICAgICAgaWYgKHN0YXJ0TGluZSkgewotICAgICAgICAgICAgdXNlUmVwYWludEJvdW5kcyA9
IHRydWU7Ci0gICAgICAgICAgICByZXBhaW50VG9wID0gaGVpZ2h0KCk7Ci0gICAgICAgICAgICBy
ZXBhaW50Qm90dG9tID0gaGVpZ2h0KCk7Ci0gICAgICAgICAgICBSZW5kZXJBcmVuYSogYXJlbmEg
PSByZW5kZXJBcmVuYSgpOwotICAgICAgICAgICAgUm9vdElubGluZUJveCogYm94ID0gc3RhcnRM
aW5lOwotICAgICAgICAgICAgd2hpbGUgKGJveCkgewotICAgICAgICAgICAgICAgIHJlcGFpbnRU
b3AgPSBtaW4ocmVwYWludFRvcCwgYm94LT50b3BPdmVyZmxvdygpKTsKLSAgICAgICAgICAgICAg
ICByZXBhaW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGJveC0+Ym90dG9tT3ZlcmZsb3co
KSk7Ci0gICAgICAgICAgICAgICAgUm9vdElubGluZUJveCogbmV4dCA9IGJveC0+bmV4dFJvb3RC
b3goKTsKLSAgICAgICAgICAgICAgICBib3gtPmRlbGV0ZUxpbmUoYXJlbmEpOwotICAgICAgICAg
ICAgICAgIGJveCA9IG5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJ
bmxpbmVJdGVyYXRvciBlbmQgPSByZXNvbHZlci5wb3NpdGlvbigpOwotCi0gICAgICAgIGlmICgh
ZnVsbExheW91dCAmJiBsYXN0Um9vdEJveCgpICYmIGxhc3RSb290Qm94KCktPmVuZHNXaXRoQnJl
YWsoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgbGluZSBiZWZvcmUgdGhlIHN0YXJ0
IGxpbmUgZW5kcyB3aXRoIGEgbGluZSBicmVhayB0aGF0IGNsZWFyIGZsb2F0cywKLSAgICAgICAg
ICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5LgotICAgICAgICAgICAgLy8gQSBs
aW5lIGJyZWFrIGNhbiBiZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHRoZSBsYXN0IG9iamVjdCBvbiBh
IGxpbmUsIGRlcGVuZGluZyBvbiBpdHMgZGlyZWN0aW9uLgotICAgICAgICAgICAgaWYgKElubGlu
ZUJveCogbGFzdExlYWZDaGlsZCA9IGxhc3RSb290Qm94KCktPmxhc3RMZWFmQ2hpbGQoKSkgewot
ICAgICAgICAgICAgICAgIFJlbmRlck9iamVjdCogbGFzdE9iamVjdCA9IGxhc3RMZWFmQ2hpbGQt
PnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFsYXN0T2JqZWN0LT5pc0JSKCkpCi0g
ICAgICAgICAgICAgICAgICAgIGxhc3RPYmplY3QgPSBsYXN0Um9vdEJveCgpLT5maXJzdExlYWZD
aGlsZCgpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0T2JqZWN0LT5pc0JS
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRUNsZWFyIGNsZWFyID0gbGFzdE9iamVjdC0+c3R5
bGUoKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyICE9IENOT05FKQot
ICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGluZShjbGVhcik7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBlbmRMaW5lTWF0Y2hl
ZCA9IGZhbHNlOwotICAgICAgICBib29sIGNoZWNrRm9yRW5kTGluZU1hdGNoID0gZW5kTGluZTsK
LSAgICAgICAgYm9vbCBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IGZhbHNlOwotICAgICAg
ICBpbnQgbGFzdEhlaWdodCA9IGhlaWdodCgpOwotCi0gICAgICAgIGJvb2wgaXNMaW5lRW1wdHkg
PSB0cnVlOwotCi0gICAgICAgIHdoaWxlICghZW5kLmF0RW5kKCkpIHsKLSAgICAgICAgICAgIC8v
IEZJWE1FOiBJcyB0aGlzIGNoZWNrIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlv
biBvciBjYW4gaXQgYmUgbW92ZWQgdG8gdGhlIGVuZD8KLSAgICAgICAgICAgIGlmIChjaGVja0Zv
ckVuZExpbmVNYXRjaCAmJiAoZW5kTGluZU1hdGNoZWQgPSBtYXRjaGVkRW5kTGluZShyZXNvbHZl
ciwgY2xlYW5MaW5lU3RhcnQsIGNsZWFuTGluZUJpZGlTdGF0dXMsIGVuZExpbmUsIGVuZExpbmVZ
UG9zLCByZXBhaW50Qm90dG9tLCByZXBhaW50VG9wKSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLnJlc2V0KCk7Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIGlzTGluZUVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgRUNsZWFyIGNsZWFyID0gQ05PTkU7Ci0gICAgICAgICAgICBlbmQgPSBmaW5kTmV4dExpbmVC
cmVhayhyZXNvbHZlciwgZmlyc3RMaW5lLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5LCAmY2xlYXIpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRF
bmQoKSkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLmRlbGV0ZVJ1bnMoKTsKLSAgICAgICAg
ICAgICAgICBjaGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU1NFUlQoZW5kICE9IHJlc29s
dmVyLnBvc2l0aW9uKCkpOwotCi0gICAgICAgICAgICBpZiAoIWlzTGluZUVtcHR5KSB7Ci0gICAg
ICAgICAgICAgICAgYmlkaVJlb3JkZXJMaW5lKHJlc29sdmVyLCBlbmQsIHByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJlc29sdmVyLnBvc2l0aW9uKCkg
PT0gZW5kKTsKLQotICAgICAgICAgICAgICAgIEJpZGlSdW4qIHRyYWlsaW5nU3BhY2VSdW4gPSAw
OwotICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ICYmIHJlc29s
dmVyLnJ1bkNvdW50KCkgJiYgcmVzb2x2ZXIubG9naWNhbGx5TGFzdFJ1bigpLT5tX29iamVjdC0+
c3R5bGUoKS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICYmIHJlc29sdmVyLmxvZ2ljYWxseUxhc3RSdW4oKS0+bV9vYmplY3QtPnN0eWxlKCktPmF1
dG9XcmFwKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IHJlc29s
dmVyLmxvZ2ljYWxseUxhc3RSdW4oKTsKLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0
KiBsYXN0T2JqZWN0ID0gdHJhaWxpbmdTcGFjZVJ1bi0+bV9vYmplY3Q7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChsYXN0T2JqZWN0LT5pc1RleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgUmVuZGVyVGV4dCogbGFzdFRleHQgPSB0b1JlbmRlclRleHQobGFzdE9iamVjdCk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IGxhc3RUZXh0LT5j
aGFyYWN0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RTcGFjZSA9IHRy
YWlsaW5nU3BhY2VSdW4tPnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChm
aXJzdFNwYWNlID4gdHJhaWxpbmdTcGFjZVJ1bi0+c3RhcnQoKSkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFVDaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzW2ZpcnN0U3BhY2UgLSAxXTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29sbGFwc2libGVTcGFjZShjdXJy
ZW50LCBsYXN0VGV4dCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3BhY2UtLTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFNwYWNlID09IHRy
YWlsaW5nU3BhY2VSdW4tPnN0b3AoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFp
bGluZ1NwYWNlUnVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3R5bGUoKS0+
ZGlyZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRSZW9y
ZGVyID0gdHJhaWxpbmdTcGFjZVJ1biAhPSAoZGlyZWN0aW9uID09IExUUiA/IHJlc29sdmVyLmxh
c3RSdW4oKSA6IHJlc29sdmVyLmZpcnN0UnVuKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChmaXJzdFNwYWNlICE9IHRyYWlsaW5nU3BhY2VSdW4tPnN0YXJ0KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlkaUNvbnRleHQqIGJhc2VDb250ZXh0ID0gcmVz
b2x2ZXIuY29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAo
QmlkaUNvbnRleHQqIHBhcmVudCA9IGJhc2VDb250ZXh0LT5wYXJlbnQoKSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VDb250ZXh0ID0gcGFyZW50OwotCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEJpZGlSdW4qIG5ld1RyYWlsaW5nUnVuID0gbmV3IChy
ZW5kZXJBcmVuYSgpKSBCaWRpUnVuKGZpcnN0U3BhY2UsIHRyYWlsaW5nU3BhY2VSdW4tPm1fc3Rv
cCwgdHJhaWxpbmdTcGFjZVJ1bi0+bV9vYmplY3QsIGJhc2VDb250ZXh0LCBPdGhlck5ldXRyYWwp
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ1NwYWNlUnVuLT5tX3N0
b3AgPSBmaXJzdFNwYWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGly
ZWN0aW9uID09IExUUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29s
dmVyLmFkZFJ1bihuZXdUcmFpbGluZ1J1bik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnBy
ZXBlbmRSdW4obmV3VHJhaWxpbmdSdW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0cmFpbGluZ1NwYWNlUnVuID0gbmV3VHJhaWxpbmdSdW47Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNob3VsZFJlb3JkZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlb3JkZXIp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBMVFIp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLm1vdmVSdW5U
b0VuZCh0cmFpbGluZ1NwYWNlUnVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRyYWlsaW5nU3BhY2VSdW4tPm1fbGV2ZWwgPSAwOwotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmVzb2x2ZXIubW92ZVJ1blRvQmVnaW5uaW5nKHRyYWlsaW5nU3BhY2VSdW4pOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1bi0+bV9sZXZlbCA9IDE7
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZVJ1biA9IDA7Ci0g
ICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgdGhlIHJ1bnMg
aGF2ZSBiZWVuIG9yZGVyZWQsIHdlIGNyZWF0ZSB0aGUgbGluZSBib3hlcy4KLSAgICAgICAgICAg
ICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdlIGZpZ3VyZSBvdXQgd2hlcmUgYm9yZGVyL3BhZGRp
bmcvbWFyZ2luIHNob3VsZCBiZSBhcHBsaWVkIGZvcgotICAgICAgICAgICAgICAgIC8vIGlubGlu
ZSBmbG93IGJveGVzLgotCi0gICAgICAgICAgICAgICAgUm9vdElubGluZUJveCogbGluZUJveCA9
IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyLnJ1bkNvdW50KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgbGluZUJveCA9IGNvbnN0cnVjdExpbmUocmVzb2x2ZXIucnVuQ291bnQoKSwg
cmVzb2x2ZXIuZmlyc3RSdW4oKSwgcmVzb2x2ZXIubGFzdFJ1bigpLCBmaXJzdExpbmUsICFlbmQu
b2JqLCBlbmQub2JqICYmICFlbmQucG9zID8gZW5kLm9iaiA6IDApOwotICAgICAgICAgICAgICAg
ICAgICBpZiAobGluZUJveCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJveC0+c2V0
RW5kc1dpdGhCcmVhayhwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpOwotCi0gICAgICAgICAgICAg
ICAgICAgICAgICAvLyBOb3cgd2UgcG9zaXRpb24gYWxsIG9mIG91ciB0ZXh0IHJ1bnMgaG9yaXpv
bnRhbGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxQb3NpdGlv
bnNGb3JMaW5lKGxpbmVCb3gsIGZpcnN0TGluZSwgcmVzb2x2ZXIuZmlyc3RSdW4oKSwgdHJhaWxp
bmdTcGFjZVJ1biwgZW5kLmF0RW5kKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBO
b3cgcG9zaXRpb24gb3VyIHRleHQgcnVucyB2ZXJ0aWNhbGx5LgotICAgICAgICAgICAgICAgICAg
ICAgICAgY29tcHV0ZVZlcnRpY2FsUG9zaXRpb25zRm9yTGluZShsaW5lQm94LCByZXNvbHZlci5m
aXJzdFJ1bigpKTsKLQotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBTcGVjaWFsIFNWRyB0ZXh0IGxheW91dCBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBs
aW5lQm94LT5jb21wdXRlUGVyQ2hhcmFjdGVyTGF5b3V0SW5mb3JtYXRpb24oKTsKLSNlbmRpZgot
Ci0jaWYgUExBVEZPUk0oTUFDKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGlnaGxpZ2h0
IGFjdHMgYXMgYW4gb3ZlcmZsb3cgaW5mbGF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHN0eWxlKCktPmhpZ2hsaWdodCgpICE9IG51bGxBdG9tKQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGxpbmVCb3gtPmFkZEhpZ2hsaWdodE92ZXJmbG93KCk7Ci0jZW5kaWYKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJl
c29sdmVyLmRlbGV0ZVJ1bnMoKTsKLQotICAgICAgICAgICAgICAgIGlmIChsaW5lQm94KSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGxpbmVCb3gtPnNldExpbmVCcmVha0luZm8oZW5kLm9iaiwgZW5k
LnBvcywgcmVzb2x2ZXIuc3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodXNlUmVw
YWludEJvdW5kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWludFRvcCA9IG1pbihy
ZXBhaW50VG9wLCBsaW5lQm94LT50b3BPdmVyZmxvdygpKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZUJveC0+Ym90dG9tT3Zl
cmZsb3coKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgICAgICBmaXJzdExpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBuZXdMaW5l
KGNsZWFyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmpl
Y3RzICYmIGxhc3RSb290Qm94KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobGFzdEZsb2F0KSB7
Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3QqIGYgPSBtX2Zsb2F0aW5n
T2JqZWN0cy0+bGFzdCgpOyBmICE9IGxhc3RGbG9hdDsgZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5w
cmV2KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX2Zs
b2F0aW5nT2JqZWN0cy0+bmV4dCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgICAgICAgICBtX2Zsb2F0aW5nT2JqZWN0cy0+Zmlyc3QoKTsKLSAgICAgICAgICAgICAgICBm
b3IgKEZsb2F0aW5nT2JqZWN0KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmN1cnJlbnQoKTsgZjsg
ZiA9IG1fZmxvYXRpbmdPYmplY3RzLT5uZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGYtPm1fYm90dG9tID4gbGFzdEhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RS
b290Qm94KCktPmZsb2F0cygpLmFwcGVuZChmLT5tX3JlbmRlcmVyKTsKLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKGYtPm1fcmVuZGVyZXIgPT0gZmxvYXRzW2Zsb2F0SW5kZXhdLm9iamVjdCk7
Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZmxvYXQncyBnZW9tZXRyeSBoYXMgY2hhbmdl
ZCwgZ2l2ZSB1cCBvbiBzeW5jaW5nIHdpdGggY2xlYW4gbGluZXMuCi0gICAgICAgICAgICAgICAg
ICAgIGlmIChmbG9hdHNbZmxvYXRJbmRleF0ucmVjdCAhPSBJbnRSZWN0KGYtPm1fbGVmdCwgZi0+
bV90b3AsIGYtPm1fd2lkdGgsIGYtPm1fYm90dG9tIC0gZi0+bV90b3ApKQotICAgICAgICAgICAg
ICAgICAgICAgICAgY2hlY2tGb3JFbmRMaW5lTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICAgICAgZmxvYXRJbmRleCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBs
YXN0RmxvYXQgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+bGFzdCgpOwotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBsYXN0SGVpZ2h0ID0gaGVpZ2h0KCk7Ci0gICAgICAgICAgICBsaW5lTWlkcG9p
bnRTdGF0ZS5yZXNldCgpOwotICAgICAgICAgICAgcmVzb2x2ZXIuc2V0UG9zaXRpb24oZW5kKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmRMaW5lKSB7Ci0gICAgICAgICAgICBpZiAoZW5k
TGluZU1hdGNoZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBBdHRhY2ggYWxsIHRoZSByZW1haW5p
bmcgbGluZXMsIGFuZCB0aGVuIGFkanVzdCB0aGVpciB5LXBvc2l0aW9ucyBhcyBuZWVkZWQuCi0g
ICAgICAgICAgICAgICAgaW50IGRlbHRhID0gaGVpZ2h0KCkgLSBlbmRMaW5lWVBvczsKLSAgICAg
ICAgICAgICAgICBmb3IgKFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBlbmRMaW5lOyBsaW5lOyBsaW5l
ID0gbGluZS0+bmV4dFJvb3RCb3goKSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lLT5hdHRh
Y2hMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgcmVwYWludFRvcCA9IG1pbihyZXBhaW50VG9wLCBsaW5lLT50b3BPdmVyZmxv
dygpICsgbWluKGRlbHRhLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBhaW50Qm90
dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGxpbmUtPmJvdHRvbU92ZXJmbG93KCkgKyBtYXgoZGVs
dGEsIDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtPmFkanVzdFBvc2l0aW9uKDAs
IGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAo
VmVjdG9yPFJlbmRlckJveCo+KiBjbGVhbkxpbmVGbG9hdHMgPSBsaW5lLT5mbG9hdHNQdHIoKSkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFJlbmRlckJveCo+OjppdGVyYXRvciBl
bmQgPSBjbGVhbkxpbmVGbG9hdHMtPmVuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9y
IChWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGYgPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2lu
KCk7IGYgIT0gZW5kOyArK2YpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxv
YXRUb3AgPSAoKmYpLT55KCkgLSAoKmYpLT5tYXJnaW5Ub3AoKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnNlcnRGbG9hdGluZ09iamVjdCgqZik7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2V0SGVpZ2h0KGZsb2F0VG9wICsgZGVsdGEpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgc2V0SGVpZ2h0KGxhc3RSb290Qm94KCktPmJsb2NrSGVpZ2h0KCkpOwotICAgICAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWxldGUgYWxsIHRoZSByZW1haW5pbmcgbGlu
ZXMuCi0gICAgICAgICAgICAgICAgSW5saW5lUnVuQm94KiBsaW5lID0gZW5kTGluZTsKLSAgICAg
ICAgICAgICAgICBSZW5kZXJBcmVuYSogYXJlbmEgPSByZW5kZXJBcmVuYSgpOwotICAgICAgICAg
ICAgICAgIHdoaWxlIChsaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFpbnRUb3AgPSBt
aW4ocmVwYWludFRvcCwgbGluZS0+dG9wT3ZlcmZsb3coKSk7Ci0gICAgICAgICAgICAgICAgICAg
IHJlcGFpbnRCb3R0b20gPSBtYXgocmVwYWludEJvdHRvbSwgbGluZS0+Ym90dG9tT3ZlcmZsb3co
KSk7Ci0gICAgICAgICAgICAgICAgICAgIElubGluZVJ1bkJveCogbmV4dCA9IGxpbmUtPm5leHRM
aW5lQm94KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUtPmRlbGV0ZUxpbmUoYXJlbmEpOwot
ICAgICAgICAgICAgICAgICAgICBsaW5lID0gbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fZmxvYXRpbmdPYmplY3RzICYmIChj
aGVja0ZvckZsb2F0c0Zyb21MYXN0TGluZSB8fCBwb3NpdGlvbk5ld0Zsb2F0cygpKSAmJiBsYXN0
Um9vdEJveCgpKSB7Ci0gICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBmbG9hdCBvbiB0
aGUgbGFzdCBsaW5lLCBpdCBtaWdodCBub3QgYmUgcG9zaXRpb25lZCB1cCB0byBub3cuCi0gICAg
ICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBhZGRpbmcgaW4gdGhlIGJvdHRv
bSBib3JkZXIvcGFkZGluZywgb3IgdGhlIGZsb2F0IHdpbGwKLSAgICAgICAgICAgIC8vIGluY2x1
ZGUgdGhlIHBhZGRpbmcgaW5jb3JyZWN0bHkuIC1kd2gKLSAgICAgICAgICAgIGlmIChsYXN0Rmxv
YXQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEZsb2F0aW5nT2JqZWN0KiBmID0gbV9mbG9hdGlu
Z09iamVjdHMtPmxhc3QoKTsgZiAhPSBsYXN0RmxvYXQ7IGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+
cHJldigpKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdP
YmplY3RzLT5uZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBtX2Zs
b2F0aW5nT2JqZWN0cy0+Zmlyc3QoKTsKLSAgICAgICAgICAgIGZvciAoRmxvYXRpbmdPYmplY3Qq
IGYgPSBtX2Zsb2F0aW5nT2JqZWN0cy0+Y3VycmVudCgpOyBmOyBmID0gbV9mbG9hdGluZ09iamVj
dHMtPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChmLT5tX2JvdHRvbSA+IGxhc3RIZWln
aHQpCi0gICAgICAgICAgICAgICAgICAgIGxhc3RSb290Qm94KCktPmZsb2F0cygpLmFwcGVuZChm
LT5tX3JlbmRlcmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3RGbG9hdCA9IG1f
ZmxvYXRpbmdPYmplY3RzLT5sYXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IGZsb2F0
Q291bnQgPSBmbG9hdHMuc2l6ZSgpOwotICAgICAgICAvLyBGbG9hdHMgdGhhdCBkaWQgbm90IGhh
dmUgbGF5b3V0IGRpZCBub3QgcmVwYWludCB3aGVuIHdlIGxhaWQgdGhlbSBvdXQuIFRoZXkgd291
bGQgaGF2ZQotICAgICAgICAvLyBwYWludGVkIGJ5IG5vdyBpZiB0aGV5IGhhZCBtb3ZlZCwgYnV0
IGlmIHRoZXkgc3RheWVkIGF0ICgwLCAwKSwgdGhleSBzdGlsbCBuZWVkIHRvIGJlCi0gICAgICAg
IC8vIHBhaW50ZWQuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxvYXRDb3VudDsg
KytpKSB7Ci0gICAgICAgICAgICBpZiAoIWZsb2F0c1tpXS5ldmVySGFkTGF5b3V0KSB7Ci0gICAg
ICAgICAgICAgICAgUmVuZGVyQm94KiBmID0gZmxvYXRzW2ldLm9iamVjdDsKLSAgICAgICAgICAg
ICAgICBpZiAoIWYtPngoKSAmJiAhZi0+eSgpICYmIGYtPmNoZWNrRm9yUmVwYWludER1cmluZ0xh
eW91dCgpKQotICAgICAgICAgICAgICAgICAgICBmLT5yZXBhaW50KCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgYWRkIGluIHRoZSBib3R0b20gYm9yZGVy
L3BhZGRpbmcuCi0gICAgc2V0SGVpZ2h0KGhlaWdodCgpICsgdG9BZGQpOwotCi0gICAgLy8gQWx3
YXlzIG1ha2Ugc3VyZSB0aGlzIGlzIGF0IGxlYXN0IG91ciBoZWlnaHQuCi0gICAgbV9vdmVyZmxv
d0hlaWdodCA9IG1heChoZWlnaHQoKSwgbV9vdmVyZmxvd0hlaWdodCk7Ci0KLSAgICAvLyBTZWUg
aWYgYW55IGxpbmVzIHNwaWxsIG91dCBvZiB0aGUgYmxvY2suICBJZiBzbywgd2UgbmVlZCB0byB1
cGRhdGUgb3VyIG92ZXJmbG93IHdpZHRoLgotICAgIGNoZWNrTGluZXNGb3JPdmVyZmxvdygpOwot
Ci0gICAgaWYgKCFmaXJzdExpbmVCb3goKSAmJiBoYXNMaW5lSWZFbXB0eSgpKQotICAgICAgICBz
ZXRIZWlnaHQoaGVpZ2h0KCkgKyBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKTsKLQotICAgIC8vIFNl
ZSBpZiB3ZSBoYXZlIGFueSBsaW5lcyB0aGF0IHNwaWxsIG91dCBvZiBvdXIgYmxvY2suICBJZiB3
ZSBkbywgdGhlbiB3ZSB3aWxsIHBvc3NpYmx5IG5lZWQgdG8KLSAgICAvLyB0cnVuY2F0ZSB0ZXh0
LgotICAgIGlmIChoYXNUZXh0T3ZlcmZsb3cpCi0gICAgICAgIGNoZWNrTGluZXNGb3JUZXh0T3Zl
cmZsb3coKTsKLX0KLQotUm9vdElubGluZUJveCogUmVuZGVyQmxvY2s6OmRldGVybWluZVN0YXJ0
UG9zaXRpb24oYm9vbCYgZmlyc3RMaW5lLCBib29sJiBmdWxsTGF5b3V0LCBib29sJiBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgVmVjdG9yPEZsb2F0
V2l0aFJlY3Q+JiBmbG9hdHMsIHVuc2lnbmVkJiBudW1DbGVhbkZsb2F0cykKLXsKLSAgICBSb290
SW5saW5lQm94KiBjdXJyID0gMDsKLSAgICBSb290SW5saW5lQm94KiBsYXN0ID0gMDsKLQotICAg
IGJvb2wgZGlydGllZEJ5RmxvYXQgPSBmYWxzZTsKLSAgICBpZiAoIWZ1bGxMYXlvdXQpIHsKLSAg
ICAgICAgc2l6ZV90IGZsb2F0SW5kZXggPSAwOwotICAgICAgICBmb3IgKGN1cnIgPSBmaXJzdFJv
b3RCb3goKTsgY3VyciAmJiAhY3Vyci0+aXNEaXJ0eSgpOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RC
b3goKSkgewotICAgICAgICAgICAgaWYgKFZlY3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxv
YXRzID0gY3Vyci0+ZmxvYXRzUHRyKCkpIHsKLSAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVy
Qm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFuTGluZUZsb2F0cy0+ZW5kKCk7Ci0gICAgICAgICAg
ICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIG8gPSBjbGVhbkxpbmVGbG9h
dHMtPmJlZ2luKCk7IG8gIT0gZW5kOyArK28pIHsKLSAgICAgICAgICAgICAgICAgICAgUmVuZGVy
Qm94KiBmID0gKm87Ci0gICAgICAgICAgICAgICAgICAgIEludFNpemUgbmV3U2l6ZShmLT53aWR0
aCgpICsgZi0+bWFyZ2luTGVmdCgpICtmLT5tYXJnaW5SaWdodCgpLCBmLT5oZWlnaHQoKSArIGYt
Pm1hcmdpblRvcCgpICsgZi0+bWFyZ2luQm90dG9tKCkpOwotICAgICAgICAgICAgICAgICAgICBB
U1NFUlQoZmxvYXRJbmRleCA8IGZsb2F0cy5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoZmxvYXRzW2Zsb2F0SW5kZXhdLm9iamVjdCAhPSBmKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBBIG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBiZWZvcmUgdGhpcyBsaW5lIG9y
IGJlZm9yZSBpdHMgbGFzdCBrbm93biBmbG9hdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8v
IEp1c3QgZG8gYSBmdWxsIGxheW91dC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxMYXlv
dXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsb2F0c1tmbG9hdEluZGV4XS5yZWN0
LnNpemUoKSAhPSBuZXdTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxvYXRU
b3AgPSBmbG9hdHNbZmxvYXRJbmRleF0ucmVjdC55KCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBjdXJyLT5tYXJrRGlydHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtMaW5lc0Rp
cnR5SW5WZXJ0aWNhbFJhbmdlKGN1cnItPmJsb2NrSGVpZ2h0KCksIGZsb2F0VG9wICsgbWF4KGZs
b2F0c1tmbG9hdEluZGV4XS5yZWN0LmhlaWdodCgpLCBuZXdTaXplLmhlaWdodCgpKSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBmbG9hdHNbZmxvYXRJbmRleF0ucmVjdC5zZXRTaXplKG5ld1Np
emUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlydGllZEJ5RmxvYXQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0SW5kZXgrKzsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlydGllZEJ5
RmxvYXQgfHwgZnVsbExheW91dCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICAvLyBDaGVjayBpZiBhIG5ldyBmbG9hdCBoYXMgYmVlbiBpbnNlcnRlZCBhZnRlciB0
aGUgbGFzdCBrbm93biBmbG9hdC4KLSAgICAgICAgaWYgKCFjdXJyICYmIGZsb2F0SW5kZXggPCBm
bG9hdHMuc2l6ZSgpKQotICAgICAgICAgICAgZnVsbExheW91dCA9IHRydWU7Ci0gICAgfQotCi0g
ICAgaWYgKGZ1bGxMYXlvdXQpIHsKLSAgICAgICAgLy8gTnVrZSBhbGwgb3VyIGxpbmVzLgotICAg
ICAgICBpZiAoZmlyc3RSb290Qm94KCkpIHsKLSAgICAgICAgICAgIFJlbmRlckFyZW5hKiBhcmVu
YSA9IHJlbmRlckFyZW5hKCk7Ci0gICAgICAgICAgICBjdXJyID0gZmlyc3RSb290Qm94KCk7IAot
ICAgICAgICAgICAgd2hpbGUgKGN1cnIpIHsKLSAgICAgICAgICAgICAgICBSb290SW5saW5lQm94
KiBuZXh0ID0gY3Vyci0+bmV4dFJvb3RCb3goKTsKLSAgICAgICAgICAgICAgICBjdXJyLT5kZWxl
dGVMaW5lKGFyZW5hKTsKLSAgICAgICAgICAgICAgICBjdXJyID0gbmV4dDsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIEFTU0VSVCghZmlyc3RMaW5lQm94KCkgJiYgIWxhc3RMaW5lQm94KCkp
OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGN1cnIpIHsKLSAgICAgICAg
ICAgIC8vIFdlIGhhdmUgYSBkaXJ0eSBsaW5lLgotICAgICAgICAgICAgaWYgKFJvb3RJbmxpbmVC
b3gqIHByZXZSb290Qm94ID0gY3Vyci0+cHJldlJvb3RCb3goKSkgewotICAgICAgICAgICAgICAg
IC8vIFdlIGhhdmUgYSBwcmV2aW91cyBsaW5lLgotICAgICAgICAgICAgICAgIGlmICghZGlydGll
ZEJ5RmxvYXQgJiYgKCFwcmV2Um9vdEJveC0+ZW5kc1dpdGhCcmVhaygpIHx8IChwcmV2Um9vdEJv
eC0+bGluZUJyZWFrT2JqKCktPmlzVGV4dCgpICYmIHByZXZSb290Qm94LT5saW5lQnJlYWtQb3Mo
KSA+PSB0b1JlbmRlclRleHQocHJldlJvb3RCb3gtPmxpbmVCcmVha09iaigpKS0+dGV4dExlbmd0
aCgpKSkpCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBsaW5lIGRpZG4ndCBi
cmVhayBjbGVhbmx5IG9yIGJyb2tlIGF0IGEgbmV3bGluZQotICAgICAgICAgICAgICAgICAgICAv
LyB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQsIHNvIHRyZWF0IGl0IGFzIGRpcnR5IHRvby4KLSAgICAg
ICAgICAgICAgICAgICAgY3VyciA9IHByZXZSb290Qm94OwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTm8gZGlydHkgbGluZXMgd2VyZSBmb3VuZC4KLSAg
ICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGxpbmUgZGlkbid0IGJyZWFrIGNsZWFubHksIHRyZWF0
IGl0IGFzIGRpcnR5LgotICAgICAgICAgICAgaWYgKGxhc3RSb290Qm94KCkgJiYgIWxhc3RSb290
Qm94KCktPmVuZHNXaXRoQnJlYWsoKSkKLSAgICAgICAgICAgICAgICBjdXJyID0gbGFzdFJvb3RC
b3goKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGhhdmUgbm8gZGlydHkgbGluZXMs
IHRoZW4gbGFzdCBpcyBqdXN0IHRoZSBsYXN0IHJvb3QgYm94LgotICAgICAgICBsYXN0ID0gY3Vy
ciA/IGN1cnItPnByZXZSb290Qm94KCkgOiBsYXN0Um9vdEJveCgpOwotICAgIH0KLQotICAgIG51
bUNsZWFuRmxvYXRzID0gMDsKLSAgICBpZiAoIWZsb2F0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAg
aW50IHNhdmVkSGVpZ2h0ID0gaGVpZ2h0KCk7Ci0gICAgICAgIC8vIFJlc3RvcmUgZmxvYXRzIGZy
b20gY2xlYW4gbGluZXMuCi0gICAgICAgIFJvb3RJbmxpbmVCb3gqIGxpbmUgPSBmaXJzdFJvb3RC
b3goKTsKLSAgICAgICAgd2hpbGUgKGxpbmUgIT0gY3VycikgewotICAgICAgICAgICAgaWYgKFZl
Y3RvcjxSZW5kZXJCb3gqPiogY2xlYW5MaW5lRmxvYXRzID0gbGluZS0+ZmxvYXRzUHRyKCkpIHsK
LSAgICAgICAgICAgICAgICBWZWN0b3I8UmVuZGVyQm94Kj46Oml0ZXJhdG9yIGVuZCA9IGNsZWFu
TGluZUZsb2F0cy0+ZW5kKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8UmVuZGVyQm94
Kj46Oml0ZXJhdG9yIGYgPSBjbGVhbkxpbmVGbG9hdHMtPmJlZ2luKCk7IGYgIT0gZW5kOyArK2Yp
IHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmxvYXRpbmdPYmplY3QoKmYpOwotICAgICAg
ICAgICAgICAgICAgICBzZXRIZWlnaHQoKCpmKS0+eSgpIC0gKCpmKS0+bWFyZ2luVG9wKCkpOwot
ICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk5ld0Zsb2F0cygpOwotICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQoZmxvYXRzW251bUNsZWFuRmxvYXRzXS5vYmplY3QgPT0gKmYpOwotICAgICAg
ICAgICAgICAgICAgICBudW1DbGVhbkZsb2F0cysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpOwotICAgICAg
ICB9Ci0gICAgICAgIHNldEhlaWdodChzYXZlZEhlaWdodCk7Ci0gICAgfQotCi0gICAgZmlyc3RM
aW5lID0gIWxhc3Q7Ci0gICAgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gIWxhc3QgfHwgbGFz
dC0+ZW5kc1dpdGhCcmVhaygpOwotCi0gICAgUmVuZGVyT2JqZWN0KiBzdGFydE9iajsKLSAgICBp
bnQgcG9zID0gMDsKLSAgICBpZiAobGFzdCkgewotICAgICAgICBzZXRIZWlnaHQobGFzdC0+Ymxv
Y2tIZWlnaHQoKSk7Ci0gICAgICAgIHN0YXJ0T2JqID0gbGFzdC0+bGluZUJyZWFrT2JqKCk7Ci0g
ICAgICAgIHBvcyA9IGxhc3QtPmxpbmVCcmVha1BvcygpOwotICAgICAgICByZXNvbHZlci5zZXRT
dGF0dXMobGFzdC0+bGluZUJyZWFrQmlkaVN0YXR1cygpKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICBib29sIGx0ciA9IHN0eWxlKCktPmRpcmVjdGlvbigpID09IExUUgotICAgICNpZiBFTkFCTEUo
U1ZHKSAgIAotICAgICAgICAgICAgfHwgKHN0eWxlKCktPnVuaWNvZGVCaWRpKCkgPT0gVUJOb3Jt
YWwgJiYgaXNTVkdUZXh0KCkpCi0gICAgI2VuZGlmCi0gICAgICAgICAgICA7Ci0KLSAgICAgICAg
RGlyZWN0aW9uIGRpcmVjdGlvbiA9IGx0ciA/IExlZnRUb1JpZ2h0IDogUmlnaHRUb0xlZnQ7Ci0g
ICAgICAgIHJlc29sdmVyLnNldExhc3RTdHJvbmdEaXIoZGlyZWN0aW9uKTsKLSAgICAgICAgcmVz
b2x2ZXIuc2V0TGFzdERpcihkaXJlY3Rpb24pOwotICAgICAgICByZXNvbHZlci5zZXRFb3JEaXIo
ZGlyZWN0aW9uKTsKLSAgICAgICAgcmVzb2x2ZXIuc2V0Q29udGV4dChCaWRpQ29udGV4dDo6Y3Jl
YXRlKGx0ciA/IDAgOiAxLCBkaXJlY3Rpb24sIHN0eWxlKCktPnVuaWNvZGVCaWRpKCkgPT0gT3Zl
cnJpZGUpKTsKLQotICAgICAgICBzdGFydE9iaiA9IGJpZGlGaXJzdCh0aGlzLCAmcmVzb2x2ZXIp
OwotICAgIH0KLQotICAgIHJlc29sdmVyLnNldFBvc2l0aW9uKElubGluZUl0ZXJhdG9yKHRoaXMs
IHN0YXJ0T2JqLCBwb3MpKTsKLQotICAgIHJldHVybiBjdXJyOwotfQotCi1Sb290SW5saW5lQm94
KiBSZW5kZXJCbG9jazo6ZGV0ZXJtaW5lRW5kUG9zaXRpb24oUm9vdElubGluZUJveCogc3RhcnRM
aW5lLCBJbmxpbmVJdGVyYXRvciYgY2xlYW5MaW5lU3RhcnQsIEJpZGlTdGF0dXMmIGNsZWFuTGlu
ZUJpZGlTdGF0dXMsIGludCYgeVBvcykKLXsKLSAgICBSb290SW5saW5lQm94KiBsYXN0ID0gMDsK
LSAgICBpZiAoIXN0YXJ0TGluZSkKLSAgICAgICAgbGFzdCA9IDA7Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IHN0YXJ0TGluZS0+bmV4dFJvb3RCb3goKTsg
Y3VycjsgY3VyciA9IGN1cnItPm5leHRSb290Qm94KCkpIHsKLSAgICAgICAgICAgIGlmIChjdXJy
LT5pc0RpcnR5KCkpCi0gICAgICAgICAgICAgICAgbGFzdCA9IDA7Ci0gICAgICAgICAgICBlbHNl
IGlmICghbGFzdCkKLSAgICAgICAgICAgICAgICBsYXN0ID0gY3VycjsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIGlmICghbGFzdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSb290SW5saW5l
Qm94KiBwcmV2ID0gbGFzdC0+cHJldlJvb3RCb3goKTsKLSAgICBjbGVhbkxpbmVTdGFydCA9IElu
bGluZUl0ZXJhdG9yKHRoaXMsIHByZXYtPmxpbmVCcmVha09iaigpLCBwcmV2LT5saW5lQnJlYWtQ
b3MoKSk7Ci0gICAgY2xlYW5MaW5lQmlkaVN0YXR1cyA9IHByZXYtPmxpbmVCcmVha0JpZGlTdGF0
dXMoKTsKLSAgICB5UG9zID0gcHJldi0+YmxvY2tIZWlnaHQoKTsKLQotICAgIGZvciAoUm9vdElu
bGluZUJveCogbGluZSA9IGxhc3Q7IGxpbmU7IGxpbmUgPSBsaW5lLT5uZXh0Um9vdEJveCgpKQot
ICAgICAgICBsaW5lLT5leHRyYWN0TGluZSgpOyAvLyBEaXNjb25uZWN0IGFsbCBsaW5lIGJveGVz
IGZyb20gdGhlaXIgcmVuZGVyIG9iamVjdHMgd2hpbGUgcHJlc2VydmluZwotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyB0aGVpciBjb25uZWN0aW9ucyB0byBvbmUgYW5vdGhlci4KLQot
ICAgIHJldHVybiBsYXN0OwotfQotCi1ib29sIFJlbmRlckJsb2NrOjptYXRjaGVkRW5kTGluZShj
b25zdCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBjb25zdCBJbmxpbmVJdGVyYXRvciYg
ZW5kTGluZVN0YXJ0LCBjb25zdCBCaWRpU3RhdHVzJiBlbmRMaW5lU3RhdHVzLCBSb290SW5saW5l
Qm94KiYgZW5kTGluZSwgaW50JiBlbmRZUG9zLCBpbnQmIHJlcGFpbnRCb3R0b20sIGludCYgcmVw
YWludFRvcCkKLXsKLSAgICBpZiAocmVzb2x2ZXIucG9zaXRpb24oKSA9PSBlbmRMaW5lU3RhcnQp
IHsKLSAgICAgICAgaWYgKHJlc29sdmVyLnN0YXR1cygpICE9IGVuZExpbmVTdGF0dXMpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaW50IGRlbHRhID0gaGVpZ2h0KCkgLSBl
bmRZUG9zOwotICAgICAgICBpZiAoIWRlbHRhIHx8ICFtX2Zsb2F0aW5nT2JqZWN0cykKLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIC8vIFNlZSBpZiBhbnkgZmxvYXRzIGVuZCBp
biB0aGUgcmFuZ2UgYWxvbmcgd2hpY2ggd2Ugd2FudCB0byBzaGlmdCB0aGUgbGluZXMgdmVydGlj
YWxseS4KLSAgICAgICAgaW50IHRvcCA9IG1pbihoZWlnaHQoKSwgZW5kWVBvcyk7Ci0KLSAgICAg
ICAgUm9vdElubGluZUJveCogbGFzdExpbmUgPSBlbmRMaW5lOwotICAgICAgICB3aGlsZSAoUm9v
dElubGluZUJveCogbmV4dExpbmUgPSBsYXN0TGluZS0+bmV4dFJvb3RCb3goKSkKLSAgICAgICAg
ICAgIGxhc3RMaW5lID0gbmV4dExpbmU7Ci0KLSAgICAgICAgaW50IGJvdHRvbSA9IGxhc3RMaW5l
LT5ibG9ja0hlaWdodCgpICsgYWJzKGRlbHRhKTsKLQotICAgICAgICBmb3IgKEZsb2F0aW5nT2Jq
ZWN0KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmZpcnN0KCk7IGY7IGYgPSBtX2Zsb2F0aW5nT2Jq
ZWN0cy0+bmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoZi0+bV9ib3R0b20gPj0gdG9wICYmIGYt
Pm1fYm90dG9tIDwgYm90dG9tKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFRoZSBmaXJzdCBj
bGVhbiBsaW5lIGRvZXNuJ3QgbWF0Y2gsIGJ1dCB3ZSBjYW4gY2hlY2sgYSBoYW5kZnVsIG9mIGZv
bGxvd2luZyBsaW5lcyB0byB0cnkKLSAgICAvLyB0byBtYXRjaCBiYWNrIHVwLgotICAgIHN0YXRp
YyBpbnQgbnVtTGluZXMgPSA4OyAvLyBUaGUgIyBvZiBsaW5lcyB3ZSdyZSB3aWxsaW5nIHRvIG1h
dGNoIGFnYWluc3QuCi0gICAgUm9vdElubGluZUJveCogbGluZSA9IGVuZExpbmU7Ci0gICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBudW1MaW5lcyAmJiBsaW5lOyBpKyssIGxpbmUgPSBsaW5lLT5uZXh0
Um9vdEJveCgpKSB7Ci0gICAgICAgIGlmIChsaW5lLT5saW5lQnJlYWtPYmooKSA9PSByZXNvbHZl
ci5wb3NpdGlvbigpLm9iaiAmJiBsaW5lLT5saW5lQnJlYWtQb3MoKSA9PSByZXNvbHZlci5wb3Np
dGlvbigpLnBvcykgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLgotICAgICAgICAg
ICAgaWYgKGxpbmUtPmxpbmVCcmVha0JpZGlTdGF0dXMoKSAhPSByZXNvbHZlci5zdGF0dXMoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIC4uLmJ1dCB0aGUgYmlkaSBzdGF0ZSBk
b2Vzbid0IG1hdGNoLgotICAgICAgICAgICAgUm9vdElubGluZUJveCogcmVzdWx0ID0gbGluZS0+
bmV4dFJvb3RCb3goKTsKLQotICAgICAgICAgICAgLy8gU2V0IG91ciB5UG9zIHRvIGJlIHRoZSBi
bG9jayBoZWlnaHQgb2YgZW5kTGluZS4KLSAgICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAg
ICAgICAgICAgZW5kWVBvcyA9IGxpbmUtPmJsb2NrSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIGlu
dCBkZWx0YSA9IGhlaWdodCgpIC0gZW5kWVBvczsKLSAgICAgICAgICAgIGlmIChkZWx0YSAmJiBt
X2Zsb2F0aW5nT2JqZWN0cykgewotICAgICAgICAgICAgICAgIC8vIFNlZSBpZiBhbnkgZmxvYXRz
IGVuZCBpbiB0aGUgcmFuZ2UgYWxvbmcgd2hpY2ggd2Ugd2FudCB0byBzaGlmdCB0aGUgbGluZXMg
dmVydGljYWxseS4KLSAgICAgICAgICAgICAgICBpbnQgdG9wID0gbWluKGhlaWdodCgpLCBlbmRZ
UG9zKTsKLQotICAgICAgICAgICAgICAgIFJvb3RJbmxpbmVCb3gqIGxhc3RMaW5lID0gZW5kTGlu
ZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoUm9vdElubGluZUJveCogbmV4dExpbmUgPSBsYXN0
TGluZS0+bmV4dFJvb3RCb3goKSkKLSAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUgPSBuZXh0
TGluZTsKLQotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSBsYXN0TGluZS0+YmxvY2tIZWln
aHQoKSArIGFicyhkZWx0YSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEZsb2F0aW5nT2JqZWN0
KiBmID0gbV9mbG9hdGluZ09iamVjdHMtPmZpcnN0KCk7IGY7IGYgPSBtX2Zsb2F0aW5nT2JqZWN0
cy0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmLT5tX2JvdHRvbSA+PSB0b3Ag
JiYgZi0+bV9ib3R0b20gPCBib3R0b20pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAv
LyBOb3cgZGVsZXRlIHRoZSBsaW5lcyB0aGF0IHdlIGZhaWxlZCB0byBzeW5jLgotICAgICAgICAg
ICAgUm9vdElubGluZUJveCogYm94VG9EZWxldGUgPSBlbmRMaW5lOwotICAgICAgICAgICAgUmVu
ZGVyQXJlbmEqIGFyZW5hID0gcmVuZGVyQXJlbmEoKTsKLSAgICAgICAgICAgIHdoaWxlIChib3hU
b0RlbGV0ZSAmJiBib3hUb0RlbGV0ZSAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXBh
aW50VG9wID0gbWluKHJlcGFpbnRUb3AsIGJveFRvRGVsZXRlLT50b3BPdmVyZmxvdygpKTsKLSAg
ICAgICAgICAgICAgICByZXBhaW50Qm90dG9tID0gbWF4KHJlcGFpbnRCb3R0b20sIGJveFRvRGVs
ZXRlLT5ib3R0b21PdmVyZmxvdygpKTsKLSAgICAgICAgICAgICAgICBSb290SW5saW5lQm94KiBu
ZXh0ID0gYm94VG9EZWxldGUtPm5leHRSb290Qm94KCk7Ci0gICAgICAgICAgICAgICAgYm94VG9E
ZWxldGUtPmRlbGV0ZUxpbmUoYXJlbmEpOwotICAgICAgICAgICAgICAgIGJveFRvRGVsZXRlID0g
bmV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5kTGluZSA9IHJlc3VsdDsKLSAg
ICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBza2lwTm9uQnJlYWtpbmdTcGFjZShjb25z
dCBJbmxpbmVJdGVyYXRvciYgaXQsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5KQotewotICAgIGlmIChpdC5vYmotPnN0eWxlKCktPm5ic3BNb2RlKCkgIT0g
U1BBQ0UgfHwgaXQuY3VycmVudCgpICE9IG5vQnJlYWtTcGFjZSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgYmFkLiAgSXQgbWFrZXMgbmJzcCBpbmNvbnNp
c3RlbnQgd2l0aCBzcGFjZSBhbmQgd29uJ3Qgd29yayBjb3JyZWN0bHkKLSAgICAvLyB3aXRoIG1f
bWluV2lkdGgvbV9tYXhXaWR0aC4KLSAgICAvLyBEbyBub3Qgc2tpcCBhIG5vbi1icmVha2luZyBz
cGFjZSBpZiBpdCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgLy8gb24gYSBsaW5lIGFmdGVy
IGEgY2xlYW4gbGluZSBicmVhayAob3Igb24gdGhlIGZpcnN0IGxpbmUsIHNpbmNlIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSBzdGFydHMgb2ZmCi0gICAgLy8gfHRydWV8KS4KLSAgICBpZiAoaXNM
aW5lRW1wdHkgJiYgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIHNob3VsZENv
bGxhcHNlV2hpdGVTcGFjZShjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGJvb2wgaXNMaW5lRW1w
dHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQotewotICAgIHJldHVybiBzdHlsZS0+
Y29sbGFwc2VXaGl0ZVNwYWNlKCkgfHwgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gUFJFX1dSQVAg
JiYgKCFpc0xpbmVFbXB0eSB8fCAhcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSk7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoUmVuZGVyT2JqZWN0KiBvYmpl
Y3QpCi17Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAob2JqZWN0LT5pc1NWR1RleHQoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgICByZXR1cm4gb2JqZWN0LT5zdHlsZSgp
LT5wcmVzZXJ2ZU5ld2xpbmUoKTsKLX0KLQotc3RhdGljIGJvb2wgaW5saW5lRmxvd1JlcXVpcmVz
TGluZUJveChSZW5kZXJJbmxpbmUqIGZsb3cpCi17Ci0gICAgLy8gRklYTUU6IFJpZ2h0IG5vdywg
d2Ugb25seSBhbGxvdyBsaW5lIGJveGVzIGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5
LgotICAgIC8vIFdlIG5lZWQgdG8gZml4IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVy
eSBsZWFzdCwgaW5saW5lcyBjb250YWluaW5nIG9ubHkKLSAgICAvLyBpZ25vcmFibGUgd2hpdGVz
cGFjZSBzaG91bGQgc2hvdWxkIGFsc28gaGF2ZSBsaW5lIGJveGVzLiAKLSAgICByZXR1cm4gIWZs
b3ctPmZpcnN0Q2hpbGQoKSAmJiBmbG93LT5oYXNIb3Jpem9udGFsQm9yZGVyc1BhZGRpbmdPck1h
cmdpbigpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBpdCwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHkpCi17Ci0gICAgaWYgKGl0Lm9iai0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaXQub2JqLT5pc1JlbmRlcklubGluZSgp
ICYmICFpbmxpbmVGbG93UmVxdWlyZXNMaW5lQm94KHRvUmVuZGVySW5saW5lKGl0Lm9iaikpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVTcGFj
ZShpdC5vYmotPnN0eWxlKCksIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkp
IHx8IGl0Lm9iai0+aXNCUigpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFVDaGFyIGN1
cnJlbnQgPSBpdC5jdXJyZW50KCk7Ci0gICAgcmV0dXJuIGN1cnJlbnQgIT0gJyAnICYmIGN1cnJl
bnQgIT0gJ1x0JyAmJiBjdXJyZW50ICE9IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xuJyB8
fCBzaG91bGRQcmVzZXJ2ZU5ld2xpbmUoaXQub2JqKSkgCi0gICAgICAgICAgICAmJiAhc2tpcE5v
bkJyZWFraW5nU3BhY2UoaXQsIGlzTGluZUVtcHR5LCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkp
OwotfQotCi1ib29sIFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGls
ZChSZW5kZXJPYmplY3QqIGlubGluZU9iaiwgYm9vbCBpc0xpbmVFbXB0eSwgYm9vbCBwcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkpCi17Ci0gICAgQVNTRVJUKGlubGluZU9iai0+cGFyZW50KCkgPT0g
dGhpcyk7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciBpdCh0aGlzLCBpbmxpbmVPYmosIDApOwotICAg
IHdoaWxlICghaXQuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0LCBpc0xpbmVFbXB0eSwg
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSkKLSAgICAgICAgaXQuaW5jcmVtZW50KCk7Ci0KLSAg
ICByZXR1cm4gIWl0LmF0RW5kKCk7Ci19Ci0KLS8vIEZJWE1FOiBUaGUgZW50aXJlIGNvbmNlcHQg
b2YgdGhlIHNraXBUcmFpbGluZ1doaXRlc3BhY2UgZnVuY3Rpb24gaXMgZmxhd2VkLCBzaW5jZSB3
ZSByZWFsbHkgbmVlZCB0byBiZSBidWlsZGluZwotLy8gbGluZSBib3hlcyBldmVuIGZvciBjb250
YWluZXJzIHRoYXQgbWF5IHVsdGltYXRlbHkgY29sbGFwc2UgYXdheS4gIE90aGVyd2lzZSB3ZSds
bCBuZXZlciBnZXQgcG9zaXRpb25lZAotLy8gZWxlbWVudHMgcXVpdGUgcmlnaHQuICBJbiBvdGhl
ciB3b3Jkcywgd2UgbmVlZCB0byBidWlsZCB0aGlzIGZ1bmN0aW9uJ3Mgd29yayBpbnRvIHRoZSBu
b3JtYWwgbGluZQotLy8gb2JqZWN0IGl0ZXJhdGlvbiBwcm9jZXNzLgotLy8gTkIuIHRoaXMgZnVu
Y3Rpb24gd2lsbCBpbnNlcnQgYW55IGZsb2F0aW5nIGVsZW1lbnRzIHRoYXQgd291bGQgb3RoZXJ3
aXNlCi0vLyBiZSBza2lwcGVkIGJ1dCBpdCB3aWxsIG5vdCBwb3NpdGlvbiB0aGVtLgotdm9pZCBS
ZW5kZXJCbG9jazo6c2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRvciYgaXRlcmF0
b3IsIGJvb2wgaXNMaW5lRW1wdHksIGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KQotewot
ICAgIHdoaWxlICghaXRlcmF0b3IuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0ZXJhdG9y
LCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSkgewotICAgICAgICBSZW5k
ZXJPYmplY3QqIG9iamVjdCA9IGl0ZXJhdG9yLm9iajsKLSAgICAgICAgaWYgKG9iamVjdC0+aXNG
bG9hdGluZygpKSB7Ci0gICAgICAgICAgICBpbnNlcnRGbG9hdGluZ09iamVjdCh0b1JlbmRlckJv
eChvYmplY3QpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QtPmlzUG9zaXRpb25lZCgpKSB7
Ci0gICAgICAgICAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBub3QgcmVh
bGx5IHJpZ2h0LiAgSXQncyBhIGJlc3QtZ3Vlc3MgYXBwcm94aW1hdGlvbiB0aGF0Ci0gICAgICAg
ICAgICAvLyB3aWxsIHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKLSAgICAgICAgICAgIFJlbmRl
ck9iamVjdCogYyA9IG9iamVjdC0+Y29udGFpbmVyKCk7Ci0gICAgICAgICAgICBpZiAoYy0+aXNS
ZW5kZXJJbmxpbmUoKSkgewotICAgICAgICAgICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25l
ZCBpbmxpbmUgZW5jbG9zZXMgdXMuICBJbiB0aGlzIGNhc2UsIHdlIGFsc28gaGF2ZSB0byBkZXRl
cm1pbmUgb3VyCi0gICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUg
YW4gaW5saW5lLiAgU2V0IHxzdGF0aWNYfCBhbmQgfHN0YXRpY1l8IG9uIHRoZSByZWxhdGl2ZSBw
b3NpdGlvbmVkCi0gICAgICAgICAgICAgICAgLy8gaW5saW5lIHNvIHRoYXQgd2UgY2FuIG9idGFp
biB0aGUgdmFsdWUgbGF0ZXIuCi0gICAgICAgICAgICAgICAgdG9SZW5kZXJJbmxpbmUoYyktPmxh
eWVyKCktPnNldFN0YXRpY1goc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gbGVmdE9mZnNl
dChoZWlnaHQoKSwgZmFsc2UpIDogcmlnaHRPZmZzZXQoaGVpZ2h0KCksIGZhbHNlKSk7Ci0gICAg
ICAgICAgICAgICAgdG9SZW5kZXJJbmxpbmUoYyktPmxheWVyKCktPnNldFN0YXRpY1koaGVpZ2h0
KCkpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgUmVuZGVyQm94KiBib3ggPSB0
b1JlbmRlckJveChvYmplY3QpOwotICAgICAgICAgICAgaWYgKGJveC0+c3R5bGUoKS0+aGFzU3Rh
dGljWCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJveC0+c3R5bGUoKS0+aXNPcmlnaW5hbERp
c3BsYXlJbmxpbmVUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0
U3RhdGljWChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBsZWZ0T2Zmc2V0KGhlaWdodCgp
LCBmYWxzZSkgOiB3aWR0aCgpIC0gcmlnaHRPZmZzZXQoaGVpZ2h0KCksIGZhbHNlKSk7Ci0gICAg
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBib3gtPmxheWVyKCktPnNldFN0
YXRpY1goc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gYm9yZGVyTGVmdCgpICsgcGFkZGlu
Z0xlZnQoKSA6IGJvcmRlclJpZ2h0KCkgKyBwYWRkaW5nUmlnaHQoKSk7Ci0gICAgICAgICAgICB9
Ci0gICAgCi0gICAgICAgICAgICBpZiAoYm94LT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkpCi0gICAg
ICAgICAgICAgICAgYm94LT5sYXllcigpLT5zZXRTdGF0aWNZKGhlaWdodCgpKTsKLSAgICAgICAg
fQotICAgICAgICBpdGVyYXRvci5pbmNyZW1lbnQoKTsKLSAgICB9Ci19Ci0KLWludCBSZW5kZXJC
bG9jazo6c2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIs
IGJvb2wgZmlyc3RMaW5lLCBib29sIGlzTGluZUVtcHR5LCBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSkKLXsKLSAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBsaW5lV2lkdGgoaGVpZ2h0KCks
IGZpcnN0TGluZSk7Ci0gICAgd2hpbGUgKCFyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkgJiYg
IXJlcXVpcmVzTGluZUJveChyZXNvbHZlci5wb3NpdGlvbigpLCBpc0xpbmVFbXB0eSwgcHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5KSkgewotICAgICAgICBSZW5kZXJPYmplY3QqIG9iamVjdCA9IHJl
c29sdmVyLnBvc2l0aW9uKCkub2JqOwotICAgICAgICBpZiAob2JqZWN0LT5pc0Zsb2F0aW5nKCkp
IHsKLSAgICAgICAgICAgIGluc2VydEZsb2F0aW5nT2JqZWN0KHRvUmVuZGVyQm94KG9iamVjdCkp
OwotICAgICAgICAgICAgcG9zaXRpb25OZXdGbG9hdHMoKTsKLSAgICAgICAgICAgIGF2YWlsYWJs
ZVdpZHRoID0gbGluZVdpZHRoKGhlaWdodCgpLCBmaXJzdExpbmUpOwotICAgICAgICB9IGVsc2Ug
aWYgKG9iamVjdC0+aXNQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGUg
bWF0aCBoZXJlIGlzIGFjdHVhbGx5IG5vdCByZWFsbHkgcmlnaHQuICBJdCdzIGEgYmVzdC1ndWVz
cyBhcHByb3hpbWF0aW9uIHRoYXQKLSAgICAgICAgICAgIC8vIHdpbGwgd29yayBmb3IgdGhlIGNv
bW1vbiBjYXNlcwotICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBjID0gb2JqZWN0LT5jb250YWlu
ZXIoKTsKLSAgICAgICAgICAgIGlmIChjLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gQSByZWxhdGl2ZSBwb3NpdGlvbmVkIGlubGluZSBlbmNsb3NlcyB1cy4gIEluIHRo
aXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBvdXIKLSAgICAgICAgICAgICAgICAv
LyBwb3NpdGlvbiBhcyB0aG91Z2ggd2Ugd2VyZSBhbiBpbmxpbmUuICBTZXQgfHN0YXRpY1h8IGFu
ZCB8c3RhdGljWXwgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uZWQKLSAgICAgICAgICAgICAgICAv
LyBpbmxpbmUgc28gdGhhdCB3ZSBjYW4gb2J0YWluIHRoZSB2YWx1ZSBsYXRlci4KLSAgICAgICAg
ICAgICAgICB0b1JlbmRlcklubGluZShjKS0+bGF5ZXIoKS0+c2V0U3RhdGljWChzdHlsZSgpLT5k
aXJlY3Rpb24oKSA9PSBMVFIgPyBsZWZ0T2Zmc2V0KGhlaWdodCgpLCBmaXJzdExpbmUpIDogcmln
aHRPZmZzZXQoaGVpZ2h0KCksIGZpcnN0TGluZSkpOwotICAgICAgICAgICAgICAgIHRvUmVuZGVy
SW5saW5lKGMpLT5sYXllcigpLT5zZXRTdGF0aWNZKGhlaWdodCgpKTsKLSAgICAgICAgICAgIH0K
LSAgICAKLSAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gob2JqZWN0KTsK
LSAgICAgICAgICAgIGlmIChib3gtPnN0eWxlKCktPmhhc1N0YXRpY1goKSkgewotICAgICAgICAg
ICAgICAgIGlmIChib3gtPnN0eWxlKCktPmlzT3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpKQot
ICAgICAgICAgICAgICAgICAgICBib3gtPmxheWVyKCktPnNldFN0YXRpY1goc3R5bGUoKS0+ZGly
ZWN0aW9uKCkgPT0gTFRSID8gbGVmdE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKSA6IHdpZHRo
KCkgLSByaWdodE9mZnNldChoZWlnaHQoKSwgZmlyc3RMaW5lKSk7Ci0gICAgICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgICAgICBib3gtPmxheWVyKCktPnNldFN0YXRpY1goc3R5bGUo
KS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gYm9yZGVyTGVmdCgpICsgcGFkZGluZ0xlZnQoKSA6IGJv
cmRlclJpZ2h0KCkgKyBwYWRkaW5nUmlnaHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAg
ICAgICAgICBpZiAoYm94LT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkpCi0gICAgICAgICAgICAgICAg
Ym94LT5sYXllcigpLT5zZXRTdGF0aWNZKGhlaWdodCgpKTsKLSAgICAgICAgfQotICAgICAgICBy
ZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICB9Ci0gICAgcmVzb2x2ZXIuY29tbWl0RXhwbGljaXRF
bWJlZGRpbmcoKTsKLSAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7Ci19Ci0KLS8vIFRoaXMgaXMg
Y3VycmVudGx5IGp1c3QgdXNlZCBmb3IgbGlzdCBtYXJrZXJzIGFuZCBpbmxpbmUgZmxvd3MgdGhh
dCBoYXZlIGxpbmUgYm94ZXMuIE5laXRoZXIgc2hvdWxkIAotLy8gaGF2ZSBhbiBlZmZlY3Qgb24g
d2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuIAotc3RhdGljIGJvb2wgc2hvdWxk
U2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrKiBibG9jaywgUmVuZGVy
T2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUpCi17Ci0gICAg
UmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHQoYmxvY2ssIG8pOwotICAgIGlmIChuZXh0ICYm
ICFuZXh0LT5pc0JSKCkgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5leHQpLT50
ZXh0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5k
ZXJUZXh0KG5leHQpOwotICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5jaGFyYWN0
ZXJzKClbMF07Ci0gICAgICAgIGlmIChuZXh0VGV4dC0+c3R5bGUoKS0+aXNDb2xsYXBzaWJsZVdo
aXRlU3BhY2UobmV4dENoYXIpKSB7Ci0gICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9p
bnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOwotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVu
ZGVyQmxvY2s6OmZpdEJlbG93RmxvYXRzKGludCB3aWR0aFRvRml0LCBib29sIGZpcnN0TGluZSwg
aW50JiBhdmFpbGFibGVXaWR0aCkKLXsKLSAgICBBU1NFUlQod2lkdGhUb0ZpdCA+IGF2YWlsYWJs
ZVdpZHRoKTsKLQotICAgIGludCBmbG9hdEJvdHRvbTsKLSAgICBpbnQgbGFzdEZsb2F0Qm90dG9t
ID0gaGVpZ2h0KCk7Ci0gICAgaW50IG5ld0xpbmVXaWR0aCA9IGF2YWlsYWJsZVdpZHRoOwotICAg
IHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGZsb2F0Qm90dG9tID0gbmV4dEZsb2F0Qm90dG9tQmVs
b3cobGFzdEZsb2F0Qm90dG9tKTsKLSAgICAgICAgaWYgKCFmbG9hdEJvdHRvbSkKLSAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIG5ld0xpbmVXaWR0aCA9IGxpbmVXaWR0aChmbG9hdEJvdHRv
bSwgZmlyc3RMaW5lKTsKLSAgICAgICAgbGFzdEZsb2F0Qm90dG9tID0gZmxvYXRCb3R0b207Ci0g
ICAgICAgIGlmIChuZXdMaW5lV2lkdGggPj0gd2lkdGhUb0ZpdCkKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLQotICAgIGlmIChuZXdMaW5lV2lkdGggPiBhdmFpbGFibGVXaWR0aCkgewotICAg
ICAgICBzZXRIZWlnaHQobGFzdEZsb2F0Qm90dG9tKTsKLSAgICAgICAgYXZhaWxhYmxlV2lkdGgg
PSBuZXdMaW5lV2lkdGg7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHRleHRX
aWR0aChSZW5kZXJUZXh0KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0
IEZvbnQmIGZvbnQsIGludCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdo
aXRlU3BhY2UpCi17Ci0gICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVuID09IHRl
eHQtPnRleHRMZW5ndGgoKSkpCi0gICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBsZW4s
IGZvbnQsIHhQb3MpOwotICAgIHJldHVybiBmb250LndpZHRoKFRleHRSdW4odGV4dC0+Y2hhcmFj
dGVycygpICsgZnJvbSwgbGVuLCAhY29sbGFwc2VXaGl0ZVNwYWNlLCB4UG9zKSk7Ci19Ci0KLUlu
bGluZUl0ZXJhdG9yIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVz
b2x2ZXImIHJlc29sdmVyLCBib29sIGZpcnN0TGluZSwgIGJvb2wmIGlzTGluZUVtcHR5LCBib29s
JiBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEVDbGVhciogY2xlYXIpCi17Ci0gICAgQVNTRVJUKHJlc29sdmVy
LnBvc2l0aW9uKCkuYmxvY2sgPT0gdGhpcyk7Ci0KLSAgICBib29sIGFwcGxpZWRTdGFydFdpZHRo
ID0gcmVzb2x2ZXIucG9zaXRpb24oKS5wb3MgPiAwOwotICAgIExpbmVNaWRwb2ludFN0YXRlJiBs
aW5lTWlkcG9pbnRTdGF0ZSA9IHJlc29sdmVyLm1pZHBvaW50U3RhdGUoKTsKLSAgICAKLSAgICBp
bnQgd2lkdGggPSBza2lwTGVhZGluZ1doaXRlc3BhY2UocmVzb2x2ZXIsIGZpcnN0TGluZSwgaXNM
aW5lRW1wdHksIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk7Ci0KLSAgICBpbnQgdyA9IDA7Ci0g
ICAgaW50IHRtcFcgPSAwOwotCi0gICAgaWYgKHJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSkK
LSAgICAgICAgcmV0dXJuIHJlc29sdmVyLnBvc2l0aW9uKCk7Ci0KLSAgICAvLyBUaGlzIHZhcmlh
YmxlIGlzIHVzZWQgb25seSBpZiB3aGl0ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0
ZWxscyB1cyB3aGV0aGVyCi0gICAgLy8gb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcg
d2hpdGVzcGFjZS4KLSAgICBib29sIGlnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgSW5saW5l
SXRlcmF0b3IgaWdub3JlU3RhcnQ7Ci0gICAgCi0gICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mg
d2hldGhlciB0aGUgdmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuICBXZSB1
c2UKLSAgICAvLyB0aGlzIHRvIGRldGVjdCB3aGVuIHdlIGVuY291bnRlciBhIHNlY29uZCBzcGFj
ZSBzbyB3ZSBrbm93IHdlIGhhdmUgdG8gdGVybWluYXRlCi0gICAgLy8gYSBydW4uCi0gICAgYm9v
bCBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwotICAgIGJvb2wgY3VycmVudENoYXJh
Y3RlcklzV1MgPSBmYWxzZTsKLSAgICBSZW5kZXJPYmplY3QqIHRyYWlsaW5nU3BhY2VPYmplY3Qg
PSAwOwotCi0gICAgSW5saW5lSXRlcmF0b3IgbEJyZWFrID0gcmVzb2x2ZXIucG9zaXRpb24oKTsK
LQotICAgIFJlbmRlck9iamVjdCAqbyA9IHJlc29sdmVyLnBvc2l0aW9uKCkub2JqOwotICAgIFJl
bmRlck9iamVjdCAqbGFzdCA9IG87Ci0gICAgdW5zaWduZWQgcG9zID0gcmVzb2x2ZXIucG9zaXRp
b24oKS5wb3M7Ci0gICAgaW50IG5leHRCcmVha2FibGUgPSByZXNvbHZlci5wb3NpdGlvbigpLm5l
eHRCcmVha2FibGVQb3NpdGlvbjsKLSAgICBib29sIGF0U3RhcnQgPSB0cnVlOwotCi0gICAgYm9v
bCBwcmV2TGluZUJyb2tlQ2xlYW5seSA9IHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seTsKLSAgICBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSBmYWxzZTsKLQotICAgIGJvb2wgYXV0b1dyYXBXYXNF
dmVyVHJ1ZU9uTGluZSA9IGZhbHNlOwotICAgIGJvb2wgZmxvYXRzRml0T25MaW5lID0gdHJ1ZTsK
LSAgICAKLSAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0
byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKLSAgICAvLyB2ZXJ5IHNwZWNp
ZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJp
bmdzKS4gCi0gICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8g
bWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKSAKLSAgICBi
b29sIGFsbG93SW1hZ2VzVG9CcmVhayA9ICFzdHlsZSgpLT5odG1sSGFja3MoKSB8fCAhaXNUYWJs
ZUNlbGwoKSB8fCAhc3R5bGUoKS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpOwotCi0gICAg
RVdoaXRlU3BhY2UgY3VycldTID0gc3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAgIEVXaGl0ZVNw
YWNlIGxhc3RXUyA9IGN1cnJXUzsKLSAgICB3aGlsZSAobykgewotICAgICAgICBjdXJyV1MgPSBv
LT5pc1JlcGxhY2VkKCkgPyBvLT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogby0+
c3R5bGUoKS0+d2hpdGVTcGFjZSgpOwotICAgICAgICBsYXN0V1MgPSBsYXN0LT5pc1JlcGxhY2Vk
KCkgPyBsYXN0LT5wYXJlbnQoKS0+c3R5bGUoKS0+d2hpdGVTcGFjZSgpIDogbGFzdC0+c3R5bGUo
KS0+d2hpdGVTcGFjZSgpOwotICAgICAgICAKLSAgICAgICAgYm9vbCBhdXRvV3JhcCA9IFJlbmRl
clN0eWxlOjphdXRvV3JhcChjdXJyV1MpOwotICAgICAgICBhdXRvV3JhcFdhc0V2ZXJUcnVlT25M
aW5lID0gYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBhdXRvV3JhcDsKLQotI2lmIEVOQUJM
RShTVkcpCi0gICAgICAgIGJvb2wgcHJlc2VydmVOZXdsaW5lID0gby0+aXNTVkdUZXh0KCkgPyBm
YWxzZSA6IFJlbmRlclN0eWxlOjpwcmVzZXJ2ZU5ld2xpbmUoY3VycldTKTsKLSNlbHNlCi0gICAg
ICAgIGJvb2wgcHJlc2VydmVOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3bGluZShj
dXJyV1MpOwotI2VuZGlmCi0KLSAgICAgICAgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UgPSBSZW5k
ZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKGN1cnJXUyk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgaWYgKG8tPmlzQlIoKSkgewotICAgICAgICAgICAgaWYgKHcgKyB0bXBXIDw9IHdpZHRoKSB7
Ci0gICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87Ci0gICAgICAgICAgICAgICAgbEJyZWFr
LnBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9
IC0xOwotICAgICAgICAgICAgICAgIGxCcmVhay5pbmNyZW1lbnQoKTsKLQotICAgICAgICAgICAg
ICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5l
IGJlIGNvbGxhcHNlZAotICAgICAgICAgICAgICAgIC8vIGF3YXkuIEFsc28sIHRoZSBzcGFjZSBh
dCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoIGEgPGJyPiBkb2VzIG5vdAotICAgICAgICAgICAgICAg
IC8vIGdldCBjb2xsYXBzZWQgYXdheS4gIEl0IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBwcmV2aW91
cyBsaW5lIGJyb2tlCi0gICAgICAgICAgICAgICAgLy8gY2xlYW5seS4gIE90aGVyd2lzZSB0aGUg
PGJyPiBoYXMgbm8gZWZmZWN0IG9uIHdoZXRoZXIgdGhlIGxpbmUgaXMKLSAgICAgICAgICAgICAg
ICAvLyBlbXB0eSBvciBub3QuCi0gICAgICAgICAgICAgICAgaWYgKHByZXZMaW5lQnJva2VDbGVh
bmx5KQotICAgICAgICAgICAgICAgICAgICBpc0xpbmVFbXB0eSA9IGZhbHNlOwotICAgICAgICAg
ICAgICAgIHRyYWlsaW5nU3BhY2VPYmplY3QgPSAwOwotICAgICAgICAgICAgICAgIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzTGluZUVt
cHR5ICYmIGNsZWFyKQotICAgICAgICAgICAgICAgICAgICAqY2xlYXIgPSBvLT5zdHlsZSgpLT5j
bGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoby0+aXNGbG9hdGluZ09yUG9zaXRpb25lZCgpKSB7Ci0gICAgICAgICAg
ICAvLyBhZGQgdG8gc3BlY2lhbCBvYmplY3RzLi4uCi0gICAgICAgICAgICBpZiAoby0+aXNGbG9h
dGluZygpKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyQm94KiBmbG9hdEJveCA9IHRvUmVuZGVy
Qm94KG8pOwotICAgICAgICAgICAgICAgIGluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0Qm94KTsK
LSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxpbmUu
Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgZG9lcywgcG9zaXRpb24gaXQgbm93LCBvdGhlcndp
c2UsIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgLy8gaXQgYWZ0ZXIgbW92aW5nIHRvIG5leHQg
bGluZSAoaW4gbmV3TGluZSgpIGZ1bmMpCi0gICAgICAgICAgICAgICAgaWYgKGZsb2F0c0ZpdE9u
TGluZSAmJiBmbG9hdEJveC0+d2lkdGgoKSArIGZsb2F0Qm94LT5tYXJnaW5MZWZ0KCkgKyBmbG9h
dEJveC0+bWFyZ2luUmlnaHQoKSArIHcgKyB0bXBXIDw9IHdpZHRoKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoID0g
bGluZVdpZHRoKGhlaWdodCgpLCBmaXJzdExpbmUpOwotICAgICAgICAgICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgICAgICAgICBmbG9hdHNGaXRPbkxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAg
IH0gZWxzZSBpZiAoby0+aXNQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBv
dXIgb3JpZ2luYWwgZGlzcGxheSB3YXNuJ3QgYW4gaW5saW5lIHR5cGUsIHRoZW4gd2UgY2FuCi0g
ICAgICAgICAgICAgICAgLy8gZ28gYWhlYWQgYW5kIGRldGVybWluZSBvdXIgc3RhdGljIHggcG9z
aXRpb24gbm93LgotICAgICAgICAgICAgICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3go
byk7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3gtPnN0eWxlKCktPmlz
T3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpOwotICAgICAgICAgICAgICAgIGJvb2wgbmVlZFRv
U2V0U3RhdGljWCA9IGJveC0+c3R5bGUoKS0+aGFzU3RhdGljWCgpOwotICAgICAgICAgICAgICAg
IGlmIChib3gtPnN0eWxlKCktPmhhc1N0YXRpY1goKSAmJiAhaXNJbmxpbmVUeXBlKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljWChvLT5wYXJlbnQoKS0+c3R5
bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBib3JkZXJMZWZ0KCkgKyBwYWRkaW5nTGVmdCgpIDoKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBib3JkZXJSaWdodCgpICsgcGFkZGluZ1JpZ2h0KCkpOwotICAgICAgICAg
ICAgICAgICAgICBuZWVkVG9TZXRTdGF0aWNYID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2FzIGFuIElOTElO
RSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVhZAotICAgICAgICAgICAgICAgIC8vIGFuZCBkZXRl
cm1pbmUgb3VyIHN0YXRpYyB5IHBvc2l0aW9uIG5vdy4KLSAgICAgICAgICAgICAgICBib29sIG5l
ZWRUb1NldFN0YXRpY1kgPSBib3gtPnN0eWxlKCktPmhhc1N0YXRpY1koKTsKLSAgICAgICAgICAg
ICAgICBpZiAoYm94LT5zdHlsZSgpLT5oYXNTdGF0aWNZKCkgJiYgaXNJbmxpbmVUeXBlKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljWShoZWlnaHQoKSk7Ci0g
ICAgICAgICAgICAgICAgICAgIG5lZWRUb1NldFN0YXRpY1kgPSBmYWxzZTsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYm9vbCBuZWVkVG9DcmVh
dGVMaW5lQm94ID0gbmVlZFRvU2V0U3RhdGljWCB8fCBuZWVkVG9TZXRTdGF0aWNZOwotICAgICAg
ICAgICAgICAgIFJlbmRlck9iamVjdCogYyA9IG8tPmNvbnRhaW5lcigpOwotICAgICAgICAgICAg
ICAgIGlmIChjLT5pc1JlbmRlcklubGluZSgpICYmICghbmVlZFRvU2V0U3RhdGljWCB8fCAhbmVl
ZFRvU2V0U3RhdGljWSkpCi0gICAgICAgICAgICAgICAgICAgIG5lZWRUb0NyZWF0ZUxpbmVCb3gg
PSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCB3
ZSBoYXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCi0gICAgICAgICAgICAg
ICAgLy8gdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCi0gICAgICAgICAgICAgICAg
aWYgKG5lZWRUb0NyZWF0ZUxpbmVCb3gpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdT
cGFjZU9iamVjdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlnbm9yZVN0YXJ0Lm9iaiA9IG87
Ci0gICAgICAgICAgICAgICAgICAgIGlnbm9yZVN0YXJ0LnBvcyA9IDA7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChpZ25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRk
TWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIGlnbm9yZVN0YXJ0KTsgLy8gU3RvcCBpZ25vcmlu
ZyBzcGFjZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9p
bnRTdGF0ZSwgaWdub3JlU3RhcnQpOyAvLyBTdGFydCBpZ25vcmluZyBhZ2Fpbi4KLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoby0+aXNSZW5kZXJJbmxpbmUoKSkgewot
ICAgICAgICAgICAgLy8gUmlnaHQgbm93LCB3ZSBzaG91bGQgb25seSBlbmNvdW50ZXIgZW1wdHkg
aW5saW5lcyBoZXJlLgotICAgICAgICAgICAgQVNTRVJUKCFvLT5maXJzdENoaWxkKCkpOwotICAg
IAotICAgICAgICAgICAgUmVuZGVySW5saW5lKiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUobyk7
Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZsb3dz
IGhhdmUgbGluZSBib3hlcywgaWYgd2UgYXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3ZSBu
ZWVkIAotICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRl
IHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4gCi0gICAg
ICAgICAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHdl
IG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFuZCAKLSAgICAgICAgICAgIC8vIHN0
YXJ0IGlnbm9yaW5nIHNwYWNlcy4KLSAgICAgICAgICAgIGlmIChpbmxpbmVGbG93UmVxdWlyZXNM
aW5lQm94KGZsb3dCb3gpKSB7Ci0gICAgICAgICAgICAgICAgaXNMaW5lRW1wdHkgPSBmYWxzZTsK
LSAgICAgICAgICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgICAgICAg
ICAgdHJhaWxpbmdTcGFjZU9iamVjdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1pZHBv
aW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAwKSk7IC8vIFN0b3Ag
aWdub3Jpbmcgc3BhY2VzLgotICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlk
cG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOyAvLyBTdGFydCBpZ25vcmluZyBh
Z2Fpbi4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlKCktPmNvbGxhcHNlV2hpdGVT
cGFjZSgpICYmIHJlc29sdmVyLnBvc2l0aW9uKCkub2JqID09IG8KLSAgICAgICAgICAgICAgICAg
ICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KHRoaXMsIG8sIGxpbmVN
aWRwb2ludFN0YXRlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIHdpdGggbGlzdCBt
YXJrZXJzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFrZSBzdXJlIHRoYXQgYW55IAot
ICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUgd2lsbCBiZSBk
aXNjYXJkZWQuCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENoYXJhY3RlcklzV1MgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBpZ25vcmluZ1NwYWNlcyA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0bXBXICs9IGZsb3dCb3gtPm1hcmdp
bkxlZnQoKSArIGZsb3dCb3gtPmJvcmRlckxlZnQoKSArIGZsb3dCb3gtPnBhZGRpbmdMZWZ0KCkg
KwotICAgICAgICAgICAgICAgICAgICBmbG93Qm94LT5tYXJnaW5SaWdodCgpICsgZmxvd0JveC0+
Ym9yZGVyUmlnaHQoKSArIGZsb3dCb3gtPnBhZGRpbmdSaWdodCgpOwotICAgICAgICB9IGVsc2Ug
aWYgKG8tPmlzUmVwbGFjZWQoKSkgewotICAgICAgICAgICAgUmVuZGVyQm94KiByZXBsYWNlZEJv
eCA9IHRvUmVuZGVyQm94KG8pOwotCi0gICAgICAgICAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBl
bGVtZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4KLSAgICAgICAgICAgIGlm
ICgoYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKGxhc3RXUykpICYmICghby0+aXNJ
bWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykpIHsKLSAgICAgICAgICAgICAgICB3ICs9IHRt
cFc7Ci0gICAgICAgICAgICAgICAgdG1wVyA9IDA7Ci0gICAgICAgICAgICAgICAgbEJyZWFrLm9i
aiA9IG87Ci0gICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IDA7Ci0gICAgICAgICAgICAgICAg
bEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlvbiA9IC0xOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBpZiAoaWdub3JpbmdTcGFjZXMpCi0gICAgICAgICAgICAgICAgYWRkTWlkcG9pbnQo
bGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIDApKTsKLQotICAgICAgICAg
ICAgaXNMaW5lRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlnbm9yaW5nU3BhY2VzID0gZmFs
c2U7Ci0gICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwotICAgICAg
ICAgICAgY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyYWlsaW5n
U3BhY2VPYmplY3QgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBPcHRpbWl6ZSBm
b3IgYSBjb21tb24gY2FzZS4gSWYgd2UgY2FuJ3QgZmluZCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBs
aXN0Ci0gICAgICAgICAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuIC1kd2gKLSAg
ICAgICAgICAgIGlmIChvLT5pc0xpc3RNYXJrZXIoKSAmJiAhc3RhdGljX2Nhc3Q8UmVuZGVyTGlz
dE1hcmtlcio+KG8pLT5pc0luc2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlKCkt
PmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9i
amVjdCh0aGlzLCBvLCBsaW5lTWlkcG9pbnRTdGF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gTGlrZSB3aXRoIGlubGluZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1h
a2Ugc3VyZSB0aGF0IGFueSAKLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFj
ZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50
Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFy
YWN0ZXJJc1dTID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWdub3JpbmdTcGFjZXMgPSB0
cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
ICAgIHRtcFcgKz0gcmVwbGFjZWRCb3gtPndpZHRoKCkgKyByZXBsYWNlZEJveC0+bWFyZ2luTGVm
dCgpICsgcmVwbGFjZWRCb3gtPm1hcmdpblJpZ2h0KCkgKyBpbmxpbmVXaWR0aChvKTsKLSAgICAg
ICAgfSBlbHNlIGlmIChvLT5pc1RleHQoKSkgewotICAgICAgICAgICAgaWYgKCFwb3MpCi0gICAg
ICAgICAgICAgICAgYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKLQotICAgICAgICAgICAgUmVu
ZGVyVGV4dCogdCA9IHRvUmVuZGVyVGV4dChvKTsKLQotICAgICAgICAgICAgaW50IHN0cmxlbiA9
IHQtPnRleHRMZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4gLSBwb3M7Ci0g
ICAgICAgICAgICBjb25zdCBVQ2hhciogc3RyID0gdC0+Y2hhcmFjdGVycygpOwotCi0gICAgICAg
ICAgICBjb25zdCBGb250JiBmID0gdC0+c3R5bGUoZmlyc3RMaW5lKS0+Zm9udCgpOwotICAgICAg
ICAgICAgYm9vbCBpc0ZpeGVkUGl0Y2ggPSBmLmlzRml4ZWRQaXRjaCgpOwotCi0gICAgICAgICAg
ICBpbnQgbGFzdFNwYWNlID0gcG9zOwotICAgICAgICAgICAgaW50IHdvcmRTcGFjaW5nID0gby0+
c3R5bGUoKS0+d29yZFNwYWNpbmcoKTsKLSAgICAgICAgICAgIGludCBsYXN0U3BhY2VXb3JkU3Bh
Y2luZyA9IDA7Ci0KLSAgICAgICAgICAgIGludCB3cmFwVyA9IHRtcFcgKyBpbmxpbmVXaWR0aChv
LCAhYXBwbGllZFN0YXJ0V2lkdGgsIHRydWUpOwotICAgICAgICAgICAgaW50IGNoYXJXaWR0aCA9
IDA7Ci0gICAgICAgICAgICBib29sIGJyZWFrTkJTUCA9IGF1dG9XcmFwICYmIG8tPnN0eWxlKCkt
Pm5ic3BNb2RlKCkgPT0gU1BBQ0U7Ci0gICAgICAgICAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQg
c2hvdWxkIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBub3Qg
d3JhcCBiZWZvcmUgdGhlIHdvcmQsCi0gICAgICAgICAgICAvLyB3aGljaCBpcyBvbmx5IHBvc3Np
YmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZSwgdGhhdCBpcywg
aWYgfHd8IGlzIHplcm8uCi0gICAgICAgICAgICBib29sIGJyZWFrV29yZHMgPSBvLT5zdHlsZSgp
LT5icmVha1dvcmRzKCkgJiYgKChhdXRvV3JhcCAmJiAhdykgfHwgY3VycldTID09IFBSRSk7Ci0g
ICAgICAgICAgICBib29sIG1pZFdvcmRCcmVhayA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBi
cmVha0FsbCA9IG8tPnN0eWxlKCktPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFrICYm
IGF1dG9XcmFwOwotCi0gICAgICAgICAgICBpZiAodC0+aXNXb3JkQnJlYWsoKSkgewotICAgICAg
ICAgICAgICAgIHcgKz0gdG1wVzsKLSAgICAgICAgICAgICAgICB0bXBXID0gMDsKLSAgICAgICAg
ICAgICAgICBsQnJlYWsub2JqID0gbzsKLSAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0gMDsK
LSAgICAgICAgICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAg
ICAgICAgICAgICAgQVNTRVJUKCFsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3
aGlsZSAobGVuKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3Bh
Y2UgPSBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLSAgICAgICAgICAgICAgICBib29sIHByZXZp
b3VzQ2hhcmFjdGVySXNXUyA9IGN1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAgICAgICAgICAgICAg
IFVDaGFyIGMgPSBzdHJbcG9zXTsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIXByZXNlcnZlTmV3bGluZSAmJiAoYyA9
PSAnXG4nKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNvbGxhcHNlV2hpdGVTcGFjZSB8fCAh
Y3VycmVudENoYXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAgICAgICAgICAgIGlzTGluZUVtcHR5
ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9y
IHNvZnQgaHlwaGVucy4gIEdvIGFoZWFkIGFuZCBpZ25vcmUgdGhlbS4KLSAgICAgICAgICAgICAg
ICBpZiAoYyA9PSBzb2Z0SHlwaGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaWdub3Jp
bmdTcGFjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzb2Z0IGh5cGhl
bnMKLSAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUl0ZXJhdG9yIGJlZm9yZVNvZnRIeXBo
ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zKQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJlZm9yZVNvZnRIeXBoZW4gPSBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MgLSAx
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBiZWZvcmVTb2Z0SHlwaGVuID0gSW5saW5lSXRlcmF0b3IoMCwgbGFzdCwgbGFzdC0+aXNU
ZXh0KCkgPyB0b1JlbmRlclRleHQobGFzdCktPnRleHRMZW5ndGgoKSAtIDEgOiAwKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIFR3byBjb25zZWN1dGl2ZSBzb2Z0IGh5cGhlbnMuIEF2b2lk
IG92ZXJsYXBwaW5nIG1pZHBvaW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5l
TWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRz
W2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDFdLm9iaiA9PSBvICYmIAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1tsaW5lTWlk
cG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXS5wb3MgPT0gcG9zKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOwotICAgICAgICAg
ICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBv
aW50KGxpbmVNaWRwb2ludFN0YXRlLCBiZWZvcmVTb2Z0SHlwaGVuKTsKLQotICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gQWRkIHRoZSB3aWR0aCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUg
aHlwaGVuLgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wVyArPSB0ZXh0V2lkdGgodCwgbGFz
dFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIGYsIHcgKyB0bXBXLCBpc0ZpeGVkUGl0Y2gsIGNvbGxh
cHNlV2hpdGVTcGFjZSkgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLQotICAgICAgICAgICAgICAg
ICAgICAgICAgLy8gRm9yIHdyYXBwaW5nIHRleHQgb25seSwgaW5jbHVkZSB0aGUgaHlwaGVuLiAg
V2UgbmVlZCB0byBlbnN1cmUgaXQgd2lsbCBmaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8v
IG9uIHRoZSBsaW5lIGlmIGl0IHNob3dzIHdoZW4gd2UgYnJlYWsuCi0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoYXV0b1dyYXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wVyAr
PSB0ZXh0V2lkdGgodCwgcG9zLCAxLCBmLCB3ICsgdG1wVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBz
ZVdoaXRlU3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVJdGVyYXRvciBh
ZnRlclNvZnRIeXBoZW4oMCwgbywgcG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVy
U29mdEh5cGhlbi5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBv
aW50KGxpbmVNaWRwb2ludFN0YXRlLCBhZnRlclNvZnRIeXBoZW4pOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAg
IGxlbi0tOwotICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7Ci0g
ICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IHBvczsgLy8gQ2hlZXN5IGhhY2sgdG8gcHJl
dmVudCBhZGRpbmcgaW4gd2lkdGhzIG9mIHRoZSBydW4gdHdpY2UuCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICAKLSAgICAgICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVySXNXUyA9IGN1cnJlbnRDaGFyYWN0
ZXJJc1NwYWNlIHx8IChicmVha05CU1AgJiYgYyA9PSBub0JyZWFrU3BhY2UpOwotCi0gICAgICAg
ICAgICAgICAgaWYgKChicmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAhbWlkV29yZEJyZWFrKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0aDsKLSAgICAgICAgICAgICAg
ICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHQsIHBvcywgMSwgZiwgdyArIHdyYXBXLCBpc0Zp
eGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1pZFdv
cmRCcmVhayA9IHcgKyB3cmFwVyArIGNoYXJXaWR0aCA+IHdpZHRoOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIGJvb2wgYmV0d2VlbldvcmRzID0gYyA9PSAnXG4nIHx8IChj
dXJyV1MgIT0gUFJFICYmICFhdFN0YXJ0ICYmIGlzQnJlYWthYmxlKHN0ciwgcG9zLCBzdHJsZW4s
IG5leHRCcmVha2FibGUsIGJyZWFrTkJTUCkpOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChi
ZXR3ZWVuV29yZHMgfHwgbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wg
c3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChp
Z25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgaWdu
b3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gbmV3IHBvaW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yaW5nU3Bh
Y2VzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNw
YWNpbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IHBvczsg
Ly8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRoZSBpZ25vcmVkIHNw
YWNlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9p
bnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgcG9zKSk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBrZWVw
IGlnbm9yaW5nIHRoZXNlIHNwYWNlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Mr
KzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGludCBhZGRpdGlvbmFsVG1wVyA9
IHRleHRXaWR0aCh0LCBsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwgZiwgdyArIHRtcFcsIGlz
Rml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwot
ICAgICAgICAgICAgICAgICAgICB0bXBXICs9IGFkZGl0aW9uYWxUbXBXOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoIWFwcGxpZWRTdGFydFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICB0bXBXICs9IGlubGluZVdpZHRoKG8sIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGFwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlXb3JkU3BhY2lu
ZyA9ICB3b3JkU3BhY2luZyAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhcHJldmlvdXND
aGFyYWN0ZXJJc1NwYWNlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghdyAmJiBhdXRvV3Jh
cCAmJiB0bXBXID4gd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICBmaXRCZWxvd0Zsb2F0
cyh0bXBXLCBmaXJzdExpbmUsIHdpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXV0
b1dyYXAgfHwgYnJlYWtXb3JkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ug
YnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhlIGN1cnJlbnQgY2hhcmFj
dGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRo
aXMgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBm
YWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgdG1wVyA8PSB3aWR0aCAmJiBj
dXJyZW50Q2hhcmFjdGVySXNXUyAmJiBvLT5zdHlsZSgpLT5icmVha09ubHlBZnRlcldoaXRlU3Bh
Y2UoKSAmJiAhbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50
IGNoYXJXaWR0aCA9IHRleHRXaWR0aCh0LCBwb3MsIDEsIGYsIHcgKyB0bXBXLCBpc0ZpeGVkUGl0
Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSkgKyAoYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5n
IDogMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGluZSBpcyB0
b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBJZiBpdCBpcyBub3QsIGRvIG5vdGhp
bmcuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIG5lZWRzIHRo
ZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJlYWsgdG8gdGhlIHNwYWNlIGFuZCBza2lw
IGFsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRlc3Bh
Y2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgKyB0bXBXICsgY2hhcldpZHRo
ID4gd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dp
ZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsQnJlYWsub2JqID0g
bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQb3NpdGlv
biA9IG5leHRCcmVha2FibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBU
cmFpbGluZ1doaXRlc3BhY2UobEJyZWFrLCBpc0xpbmVFbXB0eSwgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwg
dyArIHRtcFcgPiB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsQnJl
YWsub2JqICYmIHNob3VsZFByZXNlcnZlTmV3bGluZShsQnJlYWsub2JqKSAmJiBsQnJlYWsub2Jq
LT5pc1RleHQoKSAmJiAhdG9SZW5kZXJUZXh0KGxCcmVhay5vYmopLT5pc1dvcmRCcmVhaygpICYm
IHRvUmVuZGVyVGV4dChsQnJlYWsub2JqKS0+Y2hhcmFjdGVycygpW2xCcmVhay5wb3NdID09ICdc
bicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkSWdub3Jp
bmdTcGFjZXMgJiYgcG9zID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gV2UgbmVlZCB0byBzdG9wIHJpZ2h0IGJlZm9yZSB0aGUgbmV3bGluZSBhbmQgdGhlbiBz
dGFydCB1cCBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1p
ZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MgLSAxKSk7
IC8vIFN0b3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBvaW50
KGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MpKTsgLy8gU3RhcnQK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBsQnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOyAvLyBE
aWRuJ3QgZml0LiBKdW1wIHRvIHRoZSBlbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmV0d2VlbldvcmRzIHx8ICht
aWRXb3JkQnJlYWsgJiYgIWF1dG9XcmFwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdG1wVyAtPSBhZGRpdGlvbmFsVG1wVzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAocG9zID4gMCAmJiBzdHJbcG9zLTFdID09IHNvZnRIeXBoZW4pCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSB3aWR0aCBvZiB0aGUgc29mdCBoeXBoZW4g
b3V0IHNpbmNlIHdlIGZpdCBvbiBhIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRtcFcgLT0gdGV4dFdpZHRoKHQsIHBvcyAtIDEsIDEsIGYsIHcgKyB0bXBXLCBpc0ZpeGVk
UGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4n
ICYmIHByZXNlcnZlTmV3bGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9w
cGVkSWdub3JpbmdTcGFjZXMgJiYgcG9zID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIFdlIG5lZWQgdG8gc3RvcCByaWdodCBiZWZvcmUgdGhlIG5ld2xpbmUgYW5kIHRoZW4g
c3RhcnQgdXAgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWlkcG9pbnQo
bGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIHBvcyAtIDEpKTsgLy8gU3Rv
cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0
YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCBwb3MpKTsgLy8gU3RhcnQKLSAgICAgICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwotICAg
ICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSBuZXh0QnJlYWthYmxlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBsQnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgICAgICAgICBpZiAoYXV0b1dyYXAgJiYgYmV0d2VlbldvcmRzKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICB3ICs9IHRtcFc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwVyA9
IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBXID0gMDsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGxCcmVhay5vYmogPSBvOwotICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLnBv
cyA9IHBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9z
aXRpb24gPSBuZXh0QnJlYWthYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXV0by13
cmFwcGluZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNl
IGl0IGhhcyBoYWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wcG9ydHVuaXR5IHRv
IGJyZWFrIGFmdGVyIGEgd29yZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrV29yZHMg
PSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKG1pZFdvcmRCcmVhaykgewotICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gUmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCi0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIGVuZCB3aWR0aCBmb3JjZXMgYSBi
cmVhay4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBvOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSBuZXh0QnJlYWthYmxlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbWlkV29yZEJyZWFrICY9IChicmVha1dvcmRzIHx8IGJyZWFrQWxsKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChiZXR3ZWVu
V29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0g
YXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGxhc3RTcGFjZSA9IHBvczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmluZ1NwYWNlcyAmJiBvLT5z
dHlsZSgpLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gSWYgd2UgZW5jb3VudGVyIGEgbmV3bGluZSwgb3IgaWYgd2UgZW5jb3VudGVyIGEKLSAgICAg
ICAgICAgICAgICAgICAgICAgIC8vIHNlY29uZCBzcGFjZSwgd2UgbmVlZCB0byBnbyBhaGVhZCBh
bmQgYnJlYWsgdXAgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIGFuZCBlbnRl
ciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBzcGFjZXMuCi0gICAgICAgICAgICAg
ICAgICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlvdXNDaGFyYWN0
ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JpbmdTcGFjZXMg
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJlZCBhIG1vZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5n
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2VzLiBDcmVhdGUgYSBtaWRwb2lu
dCB0byB0ZXJtaW5hdGUgdGhlIHJ1bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJl
Zm9yZSB0aGUgc2Vjb25kIHNwYWNlLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRN
aWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgaWdub3JlU3RhcnQpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNl
IGlmIChpZ25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGlnbm9y
aW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAvLyBuZXcg
cG9pbnQuCi0gICAgICAgICAgICAgICAgICAgIGlnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAg
ICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/
IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gcG9zOyAv
LyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3Bh
Y2VzLgotICAgICAgICAgICAgICAgICAgICBhZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwg
SW5saW5lSXRlcmF0b3IoMCwgbywgcG9zKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICAgICAgaWYgKGN1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFwcmV2aW91c0NoYXJhY3Rl
cklzU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWdub3JlU3RhcnQub2JqID0gbzsKLSAg
ICAgICAgICAgICAgICAgICAgaWdub3JlU3RhcnQucG9zID0gcG9zOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIGlmICghY3VycmVudENoYXJhY3RlcklzV1MgJiYgcHJldmlv
dXNDaGFyYWN0ZXJJc1dTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdXRvV3JhcCAmJiBv
LT5zdHlsZSgpLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgbEJyZWFrLm9iaiA9IG87Ci0gICAgICAgICAgICAgICAgICAgICAgICBsQnJlYWsu
cG9zID0gcG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgbEJyZWFrLm5leHRCcmVha2FibGVQ
b3NpdGlvbiA9IG5leHRCcmVha2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNl
V2hpdGVTcGFjZSAmJiBjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhaWdub3JpbmdTcGFjZXMp
Ci0gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VPYmplY3QgPSBvOwotICAgICAgICAg
ICAgICAgIGVsc2UgaWYgKCFvLT5zdHlsZSgpLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSB8fCAhY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2VP
YmplY3QgPSAwOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwb3MrKzsK
LSAgICAgICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgICAgICBhdFN0YXJ0ID0gZmFsc2U7
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElNUE9SVEFOVDogcG9zIGlzID4gbGVu
Z3RoIGhlcmUhCi0gICAgICAgICAgICBpZiAoIWlnbm9yaW5nU3BhY2VzKQotICAgICAgICAgICAg
ICAgIHRtcFcgKz0gdGV4dFdpZHRoKHQsIGxhc3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBmLCB3
ICsgdG1wVywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UpICsgbGFzdFNwYWNlV29y
ZFNwYWNpbmc7Ci0gICAgICAgICAgICB0bXBXICs9IGlubGluZVdpZHRoKG8sICFhcHBsaWVkU3Rh
cnRXaWR0aCwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHQodGhpcywg
byk7Ci0gICAgICAgIGJvb2wgY2hlY2tGb3JCcmVhayA9IGF1dG9XcmFwOwotICAgICAgICBpZiAo
dyAmJiB3ICsgdG1wVyA+IHdpZHRoICYmIGxCcmVhay5vYmogJiYgY3VycldTID09IE5PV1JBUCkK
LSAgICAgICAgICAgIGNoZWNrRm9yQnJlYWsgPSB0cnVlOwotICAgICAgICBlbHNlIGlmIChuZXh0
ICYmIG8tPmlzVGV4dCgpICYmIG5leHQtPmlzVGV4dCgpICYmICFuZXh0LT5pc0JSKCkpIHsKLSAg
ICAgICAgICAgIGlmIChhdXRvV3JhcCB8fCAobmV4dC0+c3R5bGUoKS0+YXV0b1dyYXAoKSkpIHsK
LSAgICAgICAgICAgICAgICBpZiAoY3VycmVudENoYXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAg
ICAgICAgICAgIGNoZWNrRm9yQnJlYWsgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2Ugewot
ICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckJyZWFrID0gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5kZXJUZXh0KG5leHQpOwotICAgICAg
ICAgICAgICAgICAgICBpZiAobmV4dFRleHQtPnRleHRMZW5ndGgoKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFyYWN0ZXJzKClbMF07Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdcbicg
JiYgIXNob3VsZFByZXNlcnZlTmV3bGluZShuZXh0KSkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gSWYgdGhlIG5leHQgaXRlbSBvbiB0aGUgbGluZSBpcyB0ZXh0LCBhbmQgaWYgd2Ug
ZGlkIG5vdCBlbmQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3BhY2Us
IHRoZW4gdGhlIG5leHQgdGV4dCBydW4gY29udGludWVzIG91ciB3b3JkIChhbmQgc28gaXQgbmVl
ZHMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGFkZGluZyB0byB8dG1w
V3wuICBKdXN0IHVwZGF0ZSBhbmQgY29udGludWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY2hlY2tGb3JCcmVhayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAo
bmV4dFRleHQtPmlzV29yZEJyZWFrKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0Zv
ckJyZWFrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCB3aWxsRml0T25MaW5lID0g
dyArIHRtcFcgPD0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghd2lsbEZpdE9uTGlu
ZSAmJiAhdykgewotICAgICAgICAgICAgICAgICAgICAgICAgZml0QmVsb3dGbG9hdHModG1wVywg
Zmlyc3RMaW5lLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsRml0T25MaW5l
ID0gdG1wVyA8PSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICBib29sIGNhblBsYWNlT25MaW5lID0gd2lsbEZpdE9uTGluZSB8fCAhYXV0b1dyYXBXYXNF
dmVyVHJ1ZU9uTGluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhblBsYWNlT25MaW5lICYm
IGNoZWNrRm9yQnJlYWspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gdG1wVzsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHRtcFcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAg
bEJyZWFrLm9iaiA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0g
MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24g
PSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjaGVja0ZvckJyZWFrICYmICh3ICsgdG1w
VyA+IHdpZHRoKSkgewotICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBmbG9hdHMsIHRyeSB0byBn
ZXQgYmVsb3cgdGhlbS4KLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAm
JiAhaWdub3JpbmdTcGFjZXMgJiYgby0+c3R5bGUoKS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpCi0g
ICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZU9iamVjdCA9IDA7Ci0KLSAgICAgICAgICAgIGlm
ICh3KQotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotCi0gICAgICAgICAgICBmaXRCZWxvd0Zs
b2F0cyh0bXBXLCBmaXJzdExpbmUsIHdpZHRoKTsKLQotICAgICAgICAgICAgLy8gfHdpZHRofCBt
YXkgaGF2ZSBiZWVuIGFkanVzdGVkIGJlY2F1c2Ugd2UgZ290IHNob3ZlZCBkb3duIHBhc3QgYSBm
bG9hdCAodGh1cwotICAgICAgICAgICAgLy8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5l
ZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBqdW1wIHRvCi0gICAgICAgICAgICAvLyB0aGUgZW5kIGxh
YmVsIGlmIHdlIHN0aWxsIGRvbid0IGZpdCBvbiB0aGUgbGluZS4gLWR3aAotICAgICAgICAgICAg
aWYgKHcgKyB0bXBXID4gd2lkdGgpCi0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAoIW8tPmlzRmxvYXRpbmdPclBvc2l0aW9uZWQoKSkgewotICAgICAg
ICAgICAgbGFzdCA9IG87Ci0gICAgICAgICAgICBpZiAobGFzdC0+aXNSZXBsYWNlZCgpICYmIGF1
dG9XcmFwICYmICghbGFzdC0+aXNJbWFnZSgpIHx8IGFsbG93SW1hZ2VzVG9CcmVhaykgJiYgKCFs
YXN0LT5pc0xpc3RNYXJrZXIoKSB8fCBzdGF0aWNfY2FzdDxSZW5kZXJMaXN0TWFya2VyKj4obGFz
dCktPmlzSW5zaWRlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdyArPSB0bXBXOwotICAgICAgICAg
ICAgICAgIHRtcFcgPSAwOwotICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBuZXh0OwotICAg
ICAgICAgICAgICAgIGxCcmVhay5wb3MgPSAwOwotICAgICAgICAgICAgICAgIGxCcmVhay5uZXh0
QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIG8gPSBuZXh0OwotICAgICAgICBuZXh0QnJlYWthYmxlID0gLTE7Ci0KLSAgICAgICAgLy8g
Q2xlYXIgb3V0IG91ciBjaGFyYWN0ZXIgc3BhY2UgYm9vbCwgc2luY2UgaW5saW5lIDxwcmU+cyBk
b24ndCBjb2xsYXBzZSB3aGl0ZXNwYWNlCi0gICAgICAgIC8vIHdpdGggYWRqYWNlbnQgaW5saW5l
IG5vcm1hbC9ub3dyYXAgc3BhbnMuCi0gICAgICAgIGlmICghY29sbGFwc2VXaGl0ZVNwYWNlKQot
ICAgICAgICAgICAgY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLSAgICAgICAgCi0g
ICAgICAgIHBvcyA9IDA7Ci0gICAgICAgIGF0U3RhcnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAK
LSAgICBpZiAodyArIHRtcFcgPD0gd2lkdGggfHwgbGFzdFdTID09IE5PV1JBUCkgewotICAgICAg
ICBsQnJlYWsub2JqID0gMDsKLSAgICAgICAgbEJyZWFrLnBvcyA9IDA7Ci0gICAgICAgIGxCcmVh
ay5uZXh0QnJlYWthYmxlUG9zaXRpb24gPSAtMTsKLSAgICB9Ci0KLSBlbmQ6Ci0gICAgaWYgKGxC
cmVhayA9PSByZXNvbHZlci5wb3NpdGlvbigpICYmICghbEJyZWFrLm9iaiB8fCAhbEJyZWFrLm9i
ai0+aXNCUigpKSkgewotICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3NpYmxl
Ci0gICAgICAgIGlmIChzdHlsZSgpLT53aGl0ZVNwYWNlKCkgPT0gUFJFKSB7Ci0gICAgICAgICAg
ICAvLyBGSVhNRTogRG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQgdGhpcyBjYXNlLgotICAgICAgICAg
ICAgaWYgKHBvcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbEJyZWFrLm9iaiA9IG87Ci0gICAg
ICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvcyAtIDE7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIGxCcmVhay5vYmogPSBsYXN0OwotICAgICAgICAgICAgICAgIGxCcmVh
ay5wb3MgPSBsYXN0LT5pc1RleHQoKSA/IGxhc3QtPmxlbmd0aCgpIDogMDsKLSAgICAgICAgICAg
ICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0gZWxzZSBpZiAobEJyZWFrLm9iaikgewotICAgICAgICAgICAgaWYgKGxhc3QgIT0g
byAmJiAhbGFzdC0+aXNMaXN0TWFya2VyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBiZXR0ZXIg
dG8gYnJlYWsgYmV0d2VlbiBvYmplY3QgYm91bmRhcmllcyB0aGFuIGluIHRoZSBtaWRkbGUgb2Yg
YSB3b3JkIChleGNlcHQgZm9yIGxpc3QgbWFya2VycykKLSAgICAgICAgICAgICAgICBsQnJlYWsu
b2JqID0gbzsKLSAgICAgICAgICAgICAgICBsQnJlYWsucG9zID0gMDsKLSAgICAgICAgICAgICAg
ICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhlIG1pZGRsZSBvZiBh
IHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCi0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBy
b29tIGF0IGFsbC4gV2UganVzdCBoYXZlIHRvIGJlIG9uIHRoaXMgbGluZSwKLSAgICAgICAgICAg
ICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBzcGlsbCBvdXQuCi0gICAgICAgICAgICAgICAgbEJy
ZWFrLm9iaiA9IG87Ci0gICAgICAgICAgICAgICAgbEJyZWFrLnBvcyA9IHBvczsKLSAgICAgICAg
ICAgICAgICBsQnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gLTE7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFz
dCBvbmUgY2hhci9vYmplY3QuCi0gICAgaWYgKGxCcmVhayA9PSByZXNvbHZlci5wb3NpdGlvbigp
KQotICAgICAgICBsQnJlYWsuaW5jcmVtZW50KCk7Ci0KLSAgICAvLyBTYW5pdHkgY2hlY2sgb3Vy
IG1pZHBvaW50cy4KLSAgICBjaGVja01pZHBvaW50cyhsaW5lTWlkcG9pbnRTdGF0ZSwgbEJyZWFr
KTsKLSAgICAgICAgCi0gICAgaWYgKHRyYWlsaW5nU3BhY2VPYmplY3QpIHsKLSAgICAgICAgLy8g
VGhpcyBvYmplY3QgaXMgZWl0aGVyIGdvaW5nIHRvIGJlIHBhcnQgb2YgdGhlIGxhc3QgbWlkcG9p
bnQsIG9yIGl0IGlzIGdvaW5nCi0gICAgICAgIC8vIHRvIGJlIHRoZSBhY3R1YWwgZW5kcG9pbnQu
ICBJbiBib3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3VyIHBvcyBieSAxIGxldmVsIHRvCi0g
ICAgICAgIC8vIGV4Y2x1ZGUgdGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGluIGVmZmVjdCAt
IGNvbGxhcHNlIGludG8gdGhlIG5ld2xpbmUuCi0gICAgICAgIGlmIChsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMgJSAyKSB7Ci0gICAgICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9p
bnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICAgICAgICAgIG1p
ZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXS5wb3MtLTsKLSAgICAg
ICAgfQotICAgICAgICAvL2Vsc2UgaWYgKGxCcmVhay5wb3MgPiAwKQotICAgICAgICAvLyAgICBs
QnJlYWsucG9zLS07Ci0gICAgICAgIGVsc2UgaWYgKGxCcmVhay5vYmogPT0gMCAmJiB0cmFpbGlu
Z1NwYWNlT2JqZWN0LT5pc1RleHQoKSkgewotICAgICAgICAgICAgLy8gQWRkIGEgbmV3IGVuZCBt
aWRwb2ludCB0aGF0IHN0b3BzIHJpZ2h0IGF0IHRoZSB2ZXJ5IGVuZC4KLSAgICAgICAgICAgIFJl
bmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQodHJhaWxpbmdTcGFjZU9iamVjdCk7Ci0gICAg
ICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0LT50ZXh0TGVuZ3RoKCk7Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBwb3MgPSBsZW5ndGggPj0gMiA/IGxlbmd0aCAtIDIgOiBVSU5UX01BWDsKLSAg
ICAgICAgICAgIElubGluZUl0ZXJhdG9yIGVuZE1pZCgwLCB0cmFpbGluZ1NwYWNlT2JqZWN0LCBw
b3MpOwotICAgICAgICAgICAgYWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIGVuZE1pZCk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBtaWdodCBoYXZlIG1hZGUgbEJyZWFrIGFu
IGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHBhc3QgdGhlIGVuZAotICAgIC8vIG9mIHRoZSBvYmplY3Qu
IERvIHRoaXMgYWRqdXN0bWVudCB0byBtYWtlIGl0IHBvaW50IHRvIHRoZSBzdGFydAotICAgIC8v
IG9mIHRoZSBuZXh0IG9iamVjdCBpbnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgcmVzdCBv
ZiB0aGUKLSAgICAvLyBjb2RlLgotICAgIGlmIChsQnJlYWsucG9zID4gMCkgewotICAgICAgICBs
QnJlYWsucG9zLS07Ci0gICAgICAgIGxCcmVhay5pbmNyZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBp
ZiAobEJyZWFrLm9iaiAmJiBsQnJlYWsucG9zID49IDIgJiYgbEJyZWFrLm9iai0+aXNUZXh0KCkp
IHsKLSAgICAgICAgLy8gRm9yIHNvZnQgaHlwaGVucyBvbiBsaW5lIGJyZWFrcywgd2UgaGF2ZSB0
byBjaG9wIG91dCB0aGUgbWlkcG9pbnRzIHRoYXQgbWFkZSB1cwotICAgICAgICAvLyBpZ25vcmUg
dGhlIGh5cGhlbiBzbyB0aGF0IGl0IHdpbGwgcmVuZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUu
Ci0gICAgICAgIFVDaGFyIGMgPSB0b1JlbmRlclRleHQobEJyZWFrLm9iaiktPmNoYXJhY3RlcnMo
KVtsQnJlYWsucG9zIC0gMV07Ci0gICAgICAgIGlmIChjID09IHNvZnRIeXBoZW4pCi0gICAgICAg
ICAgICBjaG9wTWlkcG9pbnRzQXQobGluZU1pZHBvaW50U3RhdGUsIGxCcmVhay5vYmosIGxCcmVh
ay5wb3MgLSAyKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGxCcmVhazsKLX0KLQotdm9pZCBS
ZW5kZXJCbG9jazo6Y2hlY2tMaW5lc0Zvck92ZXJmbG93KCkKLXsKLSAgICBtX292ZXJmbG93V2lk
dGggPSB3aWR0aCgpOwotICAgIGZvciAoUm9vdElubGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJv
eCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewotICAgICAgICBtX292ZXJm
bG93TGVmdCA9IG1pbihjdXJyLT5sZWZ0T3ZlcmZsb3coKSwgbV9vdmVyZmxvd0xlZnQpOwotICAg
ICAgICBtX292ZXJmbG93VG9wID0gbWluKGN1cnItPnRvcE92ZXJmbG93KCksIG1fb3ZlcmZsb3dU
b3ApOwotICAgICAgICBtX292ZXJmbG93V2lkdGggPSBtYXgoY3Vyci0+cmlnaHRPdmVyZmxvdygp
LCBtX292ZXJmbG93V2lkdGgpOwotICAgICAgICBtX292ZXJmbG93SGVpZ2h0ID0gbWF4KGN1cnIt
PmJvdHRvbU92ZXJmbG93KCksIG1fb3ZlcmZsb3dIZWlnaHQpOwotICAgIH0KLX0KLQotdm9pZCBS
ZW5kZXJCbG9jazo6ZGVsZXRlRWxsaXBzaXNMaW5lQm94ZXMoKQotewotICAgIGZvciAoUm9vdElu
bGluZUJveCogY3VyciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJv
b3RCb3goKSkKLSAgICAgICAgY3Vyci0+Y2xlYXJUcnVuY2F0aW9uKCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyQmxvY2s6OmNoZWNrTGluZXNGb3JUZXh0T3ZlcmZsb3coKQotewotICAgIC8vIERldGVybWlu
ZSB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCi0gICAg
Ly8gRklYTUU6IENTUzMgc2F5cyB0aGlzIGlzIGNvbmZpZ3VyYWJsZSwgYWxzbyBuZWVkIHRvIHVz
ZSAweDAwMkUgKEZVTEwgU1RPUCkgaWYgaG9yaXpvbnRhbCBlbGxpcHNpcyBpcyAibm90IHJlbmRl
cmFibGUiCi0gICAgVGV4dFJ1biBlbGxpcHNpc1J1bigmaG9yaXpvbnRhbEVsbGlwc2lzLCAxKTsK
LSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgZWxsaXBzaXNTdHIsICgmaG9y
aXpvbnRhbEVsbGlwc2lzLCAxKSk7Ci0gICAgY29uc3QgRm9udCYgZmlyc3RMaW5lRm9udCA9IGZp
cnN0TGluZVN0eWxlKCktPmZvbnQoKTsKLSAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUoKS0+
Zm9udCgpOwotICAgIGludCBmaXJzdExpbmVFbGxpcHNpc1dpZHRoID0gZmlyc3RMaW5lRm9udC53
aWR0aChlbGxpcHNpc1J1bik7Ci0gICAgaW50IGVsbGlwc2lzV2lkdGggPSAoZm9udCA9PSBmaXJz
dExpbmVGb250KSA/IGZpcnN0TGluZUVsbGlwc2lzV2lkdGggOiBmb250LndpZHRoKGVsbGlwc2lz
UnVuKTsKLQotICAgIC8vIEZvciBMVFIgdGV4dCB0cnVuY2F0aW9uLCB3ZSB3YW50IHRvIGdldCB0
aGUgcmlnaHQgZWRnZSBvZiBvdXIgcGFkZGluZyBib3gsIGFuZCB0aGVuIHdlIHdhbnQgdG8gc2Vl
Ci0gICAgLy8gaWYgdGhlIHJpZ2h0IGVkZ2Ugb2YgYSBsaW5lIGJveCBleGNlZWRzIHRoYXQuICBG
b3IgUlRMLCB3ZSB1c2UgdGhlIGxlZnQgZWRnZSBvZiB0aGUgcGFkZGluZyBib3ggYW5kCi0gICAg
Ly8gY2hlY2sgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbGluZSBib3ggdG8gc2VlIGlmIGl0IGlzIGxl
c3MKLSAgICAvLyBJbmNsdWRlIHRoZSBzY3JvbGxiYXIgZm9yIG92ZXJmbG93IGJsb2Nrcywgd2hp
Y2ggbWVhbnMgd2Ugd2FudCB0byB1c2UgImNvbnRlbnRXaWR0aCgpIgotICAgIGJvb2wgbHRyID0g
c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSOwotICAgIGZvciAoUm9vdElubGluZUJveCogY3Vy
ciA9IGZpcnN0Um9vdEJveCgpOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dFJvb3RCb3goKSkgewot
ICAgICAgICBpbnQgYmxvY2tSaWdodEVkZ2UgPSByaWdodE9mZnNldChjdXJyLT55KCksIGN1cnIg
PT0gZmlyc3RSb290Qm94KCkpOwotICAgICAgICBpbnQgYmxvY2tMZWZ0RWRnZSA9IGxlZnRPZmZz
ZXQoY3Vyci0+eSgpLCBjdXJyID09IGZpcnN0Um9vdEJveCgpKTsKLSAgICAgICAgaW50IGxpbmVC
b3hFZGdlID0gbHRyID8gY3Vyci0+eCgpICsgY3Vyci0+d2lkdGgoKSA6IGN1cnItPngoKTsKLSAg
ICAgICAgaWYgKChsdHIgJiYgbGluZUJveEVkZ2UgPiBibG9ja1JpZ2h0RWRnZSkgfHwgKCFsdHIg
JiYgbGluZUJveEVkZ2UgPCBibG9ja0xlZnRFZGdlKSkgewotICAgICAgICAgICAgLy8gVGhpcyBs
aW5lIHNwaWxscyBvdXQgb2Ygb3VyIGJveCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0aW9uLiAg
Tm93IHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBsaW5lCi0gICAgICAgICAgICAvLyBjYW4gYmUgdHJ1
bmNhdGVkLiAgSW4gb3JkZXIgZm9yIHRydW5jYXRpb24gdG8gYmUgcG9zc2libGUsIHRoZSBsaW5l
IG11c3QgaGF2ZSBzdWZmaWNpZW50IHNwYWNlIHRvCi0gICAgICAgICAgICAvLyBhY2NvbW1vZGF0
ZSBvdXIgdHJ1bmNhdGlvbiBzdHJpbmcsIGFuZCBubyByZXBsYWNlZCBlbGVtZW50cyAoaW1hZ2Vz
LCB0YWJsZXMpIGNhbiBvdmVybGFwIHRoZSBlbGxpcHNpcwotICAgICAgICAgICAgLy8gc3BhY2Uu
Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSBjdXJyID09IGZpcnN0Um9vdEJveCgpID8gZmlyc3RM
aW5lRWxsaXBzaXNXaWR0aCA6IGVsbGlwc2lzV2lkdGg7Ci0gICAgICAgICAgICBpbnQgYmxvY2tF
ZGdlID0gbHRyID8gYmxvY2tSaWdodEVkZ2UgOiBibG9ja0xlZnRFZGdlOwotICAgICAgICAgICAg
aWYgKGN1cnItPmNhbkFjY29tbW9kYXRlRWxsaXBzaXMobHRyLCBibG9ja0VkZ2UsIGxpbmVCb3hF
ZGdlLCB3aWR0aCkpCi0gICAgICAgICAgICAgICAgY3Vyci0+cGxhY2VFbGxpcHNpcyhlbGxpcHNp
c1N0ciwgbHRyLCBibG9ja0xlZnRFZGdlLCBibG9ja1JpZ2h0RWRnZSwgd2lkdGgpOwotICAgICAg
ICB9Ci0gICAgfQotfQotCi19CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9iaWRpLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvYmlkaS5oCShyZXZpc2lvbiA0NTc4MSkKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL2JpZGkuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2NSArMCwwIEBACi0v
KgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGh0bWwgcmVuZGVyZXIgZm9yIEtERS4KLSAq
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqIENv
cHlyaWdodCAoQykgMjAwMyBBcHBsZSBDb21wdXRlciwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
Ci0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0g
KgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0g
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2lmbmRlZiBiaWRpX2gK
LSNkZWZpbmUgYmlkaV9oCi0KLSNpbmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIKLQotbmFtZXNwYWNl
IFdlYkNvcmUgewotCi1jbGFzcyBSZW5kZXJBcmVuYTsKLWNsYXNzIFJlbmRlckJsb2NrOwotY2xh
c3MgUmVuZGVyT2JqZWN0OwotY2xhc3MgSW5saW5lQm94OwotCi1zdHJ1Y3QgQmlkaVJ1biA6IEJp
ZGlDaGFyYWN0ZXJSdW4gewotICAgIEJpZGlSdW4oaW50IHN0YXJ0LCBpbnQgc3RvcCwgUmVuZGVy
T2JqZWN0KiBvYmplY3QsIEJpZGlDb250ZXh0KiBjb250ZXh0LCBXVEY6OlVuaWNvZGU6OkRpcmVj
dGlvbiBkaXIpCi0gICAgICAgIDogQmlkaUNoYXJhY3RlclJ1bihzdGFydCwgc3RvcCwgY29udGV4
dCwgZGlyKQotICAgICAgICAsIG1fb2JqZWN0KG9iamVjdCkKLSAgICAgICAgLCBtX2JveCgwKQot
ICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIGRlc3Ryb3koKTsKLQotICAgIC8vIE92ZXJsb2FkZWQg
bmV3IG9wZXJhdG9yLgotICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QsIFJlbmRlckFyZW5h
KikgdGhyb3coKTsKLQotICAgIC8vIE92ZXJyaWRkZW4gdG8gcHJldmVudCB0aGUgbm9ybWFsIGRl
bGV0ZSBmcm9tIGJlaW5nIGNhbGxlZC4KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwg
c2l6ZV90KTsKLQotICAgIEJpZGlSdW4qIG5leHQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxCaWRp
UnVuKj4obV9uZXh0KTsgfQotCi1wcml2YXRlOgotICAgIC8vIFRoZSBub3JtYWwgb3BlcmF0b3Ig
bmV3IGlzIGRpc2FsbG93ZWQuCi0gICAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgdGhyb3co
KTsKLQotcHVibGljOgotICAgIFJlbmRlck9iamVjdCogbV9vYmplY3Q7Ci0gICAgSW5saW5lQm94
KiBtX2JveDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmIC8vIGJpZGlf
aApJbmRleDogV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xz
L0NoYW5nZUxvZwkocmV2aXNpb24gNDU3ODEpCisrKyBXZWJLaXRUb29scy9DaGFuZ2VMb2cJKHdv
cmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wNy0xMiAgRGFuIEJlcm5zdGVpbiAg
PG1pdHpAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzE5Ngor
ICAgICAgICBVcGRhdGUgY2hlY2stZm9yLWdsb2JhbC1pbml0aWFsaXplcnMgZm9yIHRoZSByZW5h
bWluZyBmb3IgYmlkaS5jcHAgdG8KKyAgICAgICAgUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAor
CisgICAgICAgICogU2NyaXB0cy9jaGVjay1mb3ItZ2xvYmFsLWluaXRpYWxpemVyczoKKwogMjAw
OS0wNy0xMSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAg
ICBFbmFibGUgc3VwcG9ydCBmb3IgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgYW5kIDNkIHRyYW5z
Zm9ybXMgb24gTGVvcGFyZC4KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvY2hlY2stZm9yLWds
b2JhbC1pbml0aWFsaXplcnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy9jaGVj
ay1mb3ItZ2xvYmFsLWluaXRpYWxpemVycwkocmV2aXNpb24gNDU3ODApCisrKyBXZWJLaXRUb29s
cy9TY3JpcHRzL2NoZWNrLWZvci1nbG9iYWwtaW5pdGlhbGl6ZXJzCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDcsMTAgKzEwNywxMCBAQCBmb3IgbXkgJGZpbGUgKHNvcnQgQGZpbGVzKSB7CiAgICAgICAg
ICAgICAgICAgbmV4dCBpZiAkc2hvcnROYW1lIGVxICJOb2RlLm8iOwogICAgICAgICAgICAgICAg
IG5leHQgaWYgJHNob3J0TmFtZSBlcSAiUGFnZS5vIjsKICAgICAgICAgICAgICAgICBuZXh0IGlm
ICRzaG9ydE5hbWUgZXEgIlJhbmdlLm8iOworICAgICAgICAgICAgICAgIG5leHQgaWYgJHNob3J0
TmFtZSBlcSAiUmVuZGVyQmxvY2tMaW5lTGF5b3V0Lm8iOwogICAgICAgICAgICAgICAgIG5leHQg
aWYgJHNob3J0TmFtZSBlcSAiUmVuZGVyT2JqZWN0Lm8iOwogICAgICAgICAgICAgICAgIG5leHQg
aWYgJHNob3J0TmFtZSBlcSAiU3VicmVzb3VyY2VMb2FkZXIubyI7CiAgICAgICAgICAgICAgICAg
bmV4dCBpZiAkc2hvcnROYW1lIGVxICJTVkdFbGVtZW50SW5zdGFuY2UubyI7Ci0gICAgICAgICAg
ICAgICAgbmV4dCBpZiAkc2hvcnROYW1lIGVxICJiaWRpLm8iOwogICAgICAgICAgICAgfQogICAg
ICAgICB9CiAK
</data>
<flag name="review"
          id="17036"
          type_id="1"
          status="+"
          setter="mjs"
    />
          </attachment>
      

    </bug>

</bugzilla>