<?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>23767</bug_id>
          
          <creation_ts>2009-02-05 12:51:00 -0800</creation_ts>
          <short_desc>Add custom V8 bindings for HTML5 database</short_desc>
          <delta_ts>2009-02-05 15:12:48 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</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 name="Dimitri Glazkov (Google)">dglazkov</reporter>
          <assigned_to name="Dimitri Glazkov (Google)">dglazkov</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>108483</commentid>
    <comment_count>0</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-02-05 12:51:00 -0800</bug_when>
    <thetext>These are the first V8 bindings going into the trunk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>108485</commentid>
    <comment_count>1</comment_count>
      <attachid>27358</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-02-05 12:55:37 -0800</bug_when>
    <thetext>Created attachment 27358
Add custom V8 bindings for HTML5 database, v1

 WebCore/ChangeLog                                  |   45 ++++++++
 .../v8/custom/V8CustomSQLStatementCallback.cpp     |   72 ++++++++++++
 .../v8/custom/V8CustomSQLStatementCallback.h       |   62 +++++++++++
 .../custom/V8CustomSQLStatementErrorCallback.cpp   |   76 +++++++++++++
 .../v8/custom/V8CustomSQLStatementErrorCallback.h  |   64 +++++++++++
 .../v8/custom/V8CustomSQLTransactionCallback.cpp   |   75 +++++++++++++
 .../v8/custom/V8CustomSQLTransactionCallback.h     |   62 +++++++++++
 .../custom/V8CustomSQLTransactionErrorCallback.cpp |   75 +++++++++++++
 .../custom/V8CustomSQLTransactionErrorCallback.h   |   63 +++++++++++
 .../bindings/v8/custom/V8CustomVoidCallback.cpp    |   97 +++++++++++++++++
 WebCore/bindings/v8/custom/V8CustomVoidCallback.h  |   66 +++++++++++
 WebCore/bindings/v8/custom/V8DatabaseCustom.cpp    |   93 ++++++++++++++++
 .../v8/custom/V8SQLResultSetRowListCustom.cpp      |   90 +++++++++++++++
 .../bindings/v8/custom/V8SQLTransactionCustom.cpp  |  114 ++++++++++++++++++++
 14 files changed, 1054 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>108511</commentid>
    <comment_count>2</comment_count>
      <attachid>27358</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-05 14:24:07 -0800</bug_when>
    <thetext>Comment on attachment 27358
Add custom V8 bindings for HTML5 database, v1

Looks sane to me.  I can&apos;t claim to be an expert in V8 or the Database spec, but this code looks clean, and un-harmful.  I was surprised to separate objects for each callback type.  I wonder if there is yet more code sharing which could be done there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>108531</commentid>
    <comment_count>3</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-02-05 15:12:48 -0800</bug_when>
    <thetext>Landed as http://trac.webkit.org/changeset/40687.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27358</attachid>
            <date>2009-02-05 12:55:37 -0800</date>
            <delta_ts>2009-02-05 14:24:07 -0800</delta_ts>
            <desc>Add custom V8 bindings for HTML5 database, v1</desc>
            <filename>Add-custom-V8-bindings-for-HTML5-database-v1.patch</filename>
            <type>text/plain</type>
            <size>45826</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">OWQyMDY2MjVlMjMxYzk3ZWUxMTc4ZWQ3YWVlZTk3ODQwOTE2MWQ4OApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBmN2IxNDcyLi5lNjRhOTU4
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDQ4IEBACisyMDA5LTAyLTA1ICBEaW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNzY3CisgICAg
ICAgIEFkZCBjdXN0b20gVjggYmluZGluZ3MgZm9yIEhUTUw1IGRhdGFiYXNlLgorCisgICAgICAg
ICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2suY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2s6OlY4
Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhDdXN0b21T
UUxTdGF0ZW1lbnRDYWxsYmFjazo6flY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6VjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjazo6aGFuZGxlRXZlbnQp
OgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxi
YWNrLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6VjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxs
YmFjazo6Y3JlYXRlKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxT
dGF0ZW1lbnRFcnJvckNhbGxiYWNrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpWOEN1
c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2s6OlY4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JD
YWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2Fs
bGJhY2s6On5WOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6VjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrOjpoYW5kbGVFdmVudCk6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JDYWxs
YmFjay5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9tU1FMU3RhdGVtZW50RXJy
b3JDYWxsYmFjazo6Y3JlYXRlKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpW
OEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2s6OlY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxs
YmFjayk6CisgICAgICAgIChXZWJDb3JlOjpWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2s6
On5WOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VjhD
dXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrOjpoYW5kbGVFdmVudCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjay5oOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjazo6Y3JlYXRl
KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVy
cm9yQ2FsbGJhY2suY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9tU1FMVHJh
bnNhY3Rpb25FcnJvckNhbGxiYWNrOjpWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFj
ayk6CisgICAgICAgIChXZWJDb3JlOjpWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFj
azo6flY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNv
cmU6OlY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrOjpoYW5kbGVFdmVudCk6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNh
bGxiYWNrLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6VjhDdXN0b21TUUxUcmFuc2FjdGlv
bkVycm9yQ2FsbGJhY2s6OmNyZWF0ZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4
Q3VzdG9tVm9pZENhbGxiYWNrLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpWOEN1c3Rv
bVZvaWRDYWxsYmFjazo6VjhDdXN0b21Wb2lkQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6
VjhDdXN0b21Wb2lkQ2FsbGJhY2s6On5WOEN1c3RvbVZvaWRDYWxsYmFjayk6CisgICAgICAgIChX
ZWJDb3JlOjpWOEN1c3RvbVZvaWRDYWxsYmFjazo6aGFuZGxlRXZlbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6aW52b2tlQ2FsbGJhY2spOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1
c3RvbVZvaWRDYWxsYmFjay5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlY4Q3VzdG9tVm9p
ZENhbGxiYWNrOjpjcmVhdGUpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOERhdGFi
YXNlQ3VzdG9tLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDQUxMQkFDS19GVU5DX0RF
Q0wpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFJlc3VsdFNldFJvd0xpc3RD
dXN0b20uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6
CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMVHJhbnNhY3Rpb25DdXN0b20uY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNBTExCQUNLX0ZVTkNfREVDTCk6CisKIDIwMDkt
MDItMDUgIEFkYW0gVHJlYXQgIDxhZGFtLnRyZWF0QHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAg
ICBGaXggdGhlIFF0IGJ1aWxkIG5vdyB0aGF0IEV2ZW50VGFyZ2V0Tm9kZS5pZGwgd2FzIHJlbW92
ZWQgaW4gcjQwNjcyLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhD
dXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjay5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi5iZjA3NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjay5jcHAKQEAgLTAsMCArMSw3
MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
IAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJWOEN1c3RvbVNRTFN0YXRlbWVu
dENhbGxiYWNrLmgiCisKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIlY4Q3VzdG9tVm9p
ZENhbGxiYWNrLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworVjhDdXN0b21TUUxTdGF0ZW1l
bnRDYWxsYmFjazo6VjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjayh2ODo6TG9jYWw8djg6Ok9i
amVjdD4gY2FsbGJhY2ssIEZyYW1lKiBmcmFtZSkKKyAgICA6IG1fY2FsbGJhY2sodjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhjYWxsYmFjaykpCisgICAgLCBtX2ZyYW1lKGZyYW1lKQor
eworfQorCitWOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrOjp+VjhDdXN0b21TUUxTdGF0ZW1l
bnRDYWxsYmFjaygpCit7CisgICAgbV9jYWxsYmFjay5EaXNwb3NlKCk7Cit9CisKK3ZvaWQgVjhD
dXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjazo6aGFuZGxlRXZlbnQoU1FMVHJhbnNhY3Rpb24qIHRy
YW5zYWN0aW9uLCBTUUxSZXN1bHRTZXQqIHJlc3VsdFNldCwgYm9vbCYgcmFpc2VkRXhjZXB0aW9u
KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgIHY4OjpIYW5kbGU8
djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUuZ2V0KCkp
OworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IGFyZ3ZbXSA9IHsKKyAgICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6
OlNRTFRSQU5TQUNUSU9OLCB0cmFuc2FjdGlvbiksCisgICAgICAgIFY4UHJveHk6OlRvVjhPYmpl
Y3QoVjhDbGFzc0luZGV4OjpTUUxSRVNVTFRTRVQsIHJlc3VsdFNldCkKKyAgICB9OworCisgICAg
Ly8gUHJvdGVjdCB0aGUgZnJhbWUgdW50aWwgdGhlIGNhbGxiYWNrIHJldHVybnMuCisgICAgUmVm
UHRyPEZyYW1lPiBwcm90ZWN0b3IobV9mcmFtZSk7CisKKyAgICBib29sIGNhbGxiYWNrUmV0dXJu
VmFsdWUgPSBmYWxzZTsKKyAgICByYWlzZWRFeGNlcHRpb24gPSBpbnZva2VDYWxsYmFjayhtX2Nh
bGxiYWNrLCAyLCBhcmd2LCBjYWxsYmFja1JldHVyblZhbHVlKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21TUUxTdGF0ZW1lbnRDYWxsYmFjay5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhD
dXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjVjNGIzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmgKQEAgLTAsMCArMSw2MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFja19oCisjZGVmaW5lIFY4Q3VzdG9tU1FM
U3RhdGVtZW50Q2FsbGJhY2tfaAorCisjaW5jbHVkZSAiU1FMU3RhdGVtZW50Q2FsbGJhY2suaCIK
KyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEZyYW1lOworCitj
bGFzcyBWOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrIDogcHVibGljIFNRTFN0YXRlbWVudENh
bGxiYWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxWOEN1c3RvbVNRTFN0YXRl
bWVudENhbGxiYWNrPiBjcmVhdGUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIEZyYW1lKiBm
cmFtZSkKKyAgICB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+SXNPYmplY3QoKSk7CisgICAgICAg
IHJldHVybiBhZG9wdFJlZihuZXcgVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjayh2YWx1ZS0+
VG9PYmplY3QoKSwgZnJhbWUpKTsKKyAgICB9CisgICAgdmlydHVhbCB+VjhDdXN0b21TUUxTdGF0
ZW1lbnRDYWxsYmFjaygpOworCisgICAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KFNRTFRyYW5z
YWN0aW9uKiwgU1FMUmVzdWx0U2V0KiwgYm9vbCYgcmFpc2VkRXhjZXB0aW9uKTsKK3ByaXZhdGU6
CisgICAgVjhDdXN0b21TUUxTdGF0ZW1lbnRDYWxsYmFjayh2ODo6TG9jYWw8djg6Ok9iamVjdD4s
IEZyYW1lKik7CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBtX2NhbGxiYWNrOwor
ICAgIFJlZlB0cjxGcmFtZT4gbV9mcmFtZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIFY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2tfaApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxi
YWNrLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tU1FMU3RhdGVtZW50
RXJyb3JDYWxsYmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4
ZDIxYwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3Vz
dG9tU1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjay5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoYykgMjAwOSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAq
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxi
YWNrLmgiCisKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIlY4Q3VzdG9tVm9pZENhbGxi
YWNrLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJv
ckNhbGxiYWNrOjpWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2sodjg6OkxvY2FsPHY4
OjpPYmplY3Q+IGNhbGxiYWNrLCBGcmFtZSogZnJhbWUpCisgICAgOiBtX2NhbGxiYWNrKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoY2FsbGJhY2spKQorICAgICwgbV9mcmFtZShmcmFt
ZSkKK3sKK30KKworVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrOjp+VjhDdXN0b21T
UUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrKCkKK3sKKyAgICBtX2NhbGxiYWNrLkRpc3Bvc2UoKTsK
K30KKworYm9vbCBWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2s6OmhhbmRsZUV2ZW50
KFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgU1FMRXJyb3IqIGVycm9yKQoreworICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUuZ2V0KCkpOworICAgIGlmIChj
b250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB2ODo6Q29udGV4
dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJn
dltdID0geworICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMVFJB
TlNBQ1RJT04sIHRyYW5zYWN0aW9uKSwKKyAgICAgICAgVjhQcm94eTo6VG9WOE9iamVjdChWOENs
YXNzSW5kZXg6OlNRTEVSUk9SLCBlcnJvcikKKyAgICB9OworCisgICAgLy8gUHJvdGVjdCB0aGUg
ZnJhbWUgdW50aWwgdGhlIGNhbGxiYWNrIHJldHVybnMuCisgICAgUmVmUHRyPEZyYW1lPiBwcm90
ZWN0b3IobV9mcmFtZSk7CisKKyAgICBib29sIGNhbGxiYWNrUmV0dXJuVmFsdWUgPSBmYWxzZTsK
KyAgICAvLyBTdGVwIDY6IElmIHRoZSBlcnJvciBjYWxsYmFjayByZXR1cm5zIGZhbHNlLCB0aGVu
IG1vdmUgb24gdG8gdGhlIG5leHQKKyAgICAvLyBzdGF0ZW1lbnQsIGlmIGFueSwgb3Igb250byB0
aGUgbmV4dCBvdmVyYWxsIHN0ZXAgb3RoZXJ3aXNlLiBPdGhlcndpc2UsCisgICAgLy8gdGhlIGVy
cm9yIGNhbGxiYWNrIGRpZCBub3QgcmV0dXJuIGZhbHNlLCBvciB0aGVyZSB3YXMgbm8gZXJyb3Ig
Y2FsbGJhY2suCisgICAgLy8gSnVtcCB0byB0aGUgbGFzdCBzdGVwIGluIHRoZSBvdmVyYWxsIHN0
ZXBzLgorICAgIHJldHVybiBpbnZva2VDYWxsYmFjayhtX2NhbGxiYWNrLCAyLCBhcmd2LCBjYWxs
YmFja1JldHVyblZhbHVlKSAmJiAhY2FsbGJhY2tSZXR1cm5WYWx1ZTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhD
dXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmggYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1
c3RvbS9WOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi43ZGM4MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmgKQEAg
LTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAq
IG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNr
X2gKKyNkZWZpbmUgVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrX2gKKworI2luY2x1
ZGUgIlNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2suaCIKKworI2luY2x1ZGUgIlNRTFN0YXRlbWVu
dEVycm9yQ2FsbGJhY2suaCIKKyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVm
UHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIEZyYW1lOworCitjbGFzcyBWOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2sg
OiBwdWJsaWMgU1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjayB7CitwdWJsaWM6CisgICAgc3RhdGlj
IFBhc3NSZWZQdHI8VjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrPiBjcmVhdGUodjg6
OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIEZyYW1lKiBmcmFtZSkKKyAgICB7CisgICAgICAgIEFT
U0VSVCh2YWx1ZS0+SXNPYmplY3QoKSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVjhD
dXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrKHZhbHVlLT5Ub09iamVjdCgpLCBmcmFtZSkp
OworICAgIH0KKyAgICB2aXJ0dWFsIH5WOEN1c3RvbVNRTFN0YXRlbWVudEVycm9yQ2FsbGJhY2so
KTsKKworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVFdmVudChTUUxUcmFuc2FjdGlvbiosIFNRTEVy
cm9yKik7Citwcml2YXRlOgorICAgIFY4Q3VzdG9tU1FMU3RhdGVtZW50RXJyb3JDYWxsYmFjayh2
ODo6TG9jYWw8djg6Ok9iamVjdD4sIEZyYW1lKik7CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0PiBtX2NhbGxiYWNrOworICAgIFJlZlB0cjxGcmFtZT4gbV9mcmFtZTsKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFY4Q3VzdG9tU1FMU3RhdGVtZW50RXJy
b3JDYWxsYmFja19oCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1
c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2suY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi5hNDVmM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmNwcApAQCAtMCww
ICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJWOEN1c3RvbVNRTFRy
YW5zYWN0aW9uQ2FsbGJhY2suaCIKKworI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiVjhD
dXN0b21Wb2lkQ2FsbGJhY2suaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitWOEN1c3RvbVNR
TFRyYW5zYWN0aW9uQ2FsbGJhY2s6OlY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjayh2ODo6
TG9jYWw8djg6Ok9iamVjdD4gY2FsbGJhY2ssIEZyYW1lKiBmcmFtZSkKKyAgICA6IG1fY2FsbGJh
Y2sodjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhjYWxsYmFjaykpCisgICAgLCBtX2Zy
YW1lKGZyYW1lKQoreworfQorCitWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2s6On5WOEN1
c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2soKQoreworICAgIG1fY2FsbGJhY2suRGlzcG9zZSgp
OworfQorCisKK3ZvaWQgVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrOjpoYW5kbGVFdmVu
dChTUUxUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGJvb2wmIHJhaXNlZEV4Y2VwdGlvbikKK3sK
KyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpD
b250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAg
ICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHY4OjpDb250
ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBh
cmd2W10gPSB7CisgICAgICAgIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpTUUxU
UkFOU0FDVElPTiwgdHJhbnNhY3Rpb24pCisgICAgfTsKKworICAgIC8vIFByb3RlY3QgdGhlIGZy
YW1lIHVudGlsIHRoZSBjYWxsYmFjayByZXR1cm5zLgorICAgIFJlZlB0cjxGcmFtZT4gcHJvdGVj
dG9yKG1fZnJhbWUpOworCisgICAgLy8gU3RlcCA1OiBJZiB0aGUgY2FsbGJhY2sgY291bGRuJ3Qg
YmUgY2FsbGVkIChlLmcuIGl0IHdhcyBudWxsKSBvciBpZgorICAgIC8vIHRoZSBjYWxsYmFjayB3
YXMgaW52b2tlZCBhbmQgcmFpc2VkIGFuIGV4Y2VwdGlvbiwganVtcCB0byB0aGUgbGFzdAorICAg
IC8vIHN0ZXAgKHJvbGxiYWNrIHRyYW5zYWN0aW9uKS4KKyAgICBib29sIGNhbGxiYWNrUmV0dXJu
VmFsdWUgPSBmYWxzZTsKKyAgICByYWlzZWRFeGNlcHRpb24gPSBpbnZva2VDYWxsYmFjayhtX2Nh
bGxiYWNrLCAxLCBhcmd2LCBjYWxsYmFja1JldHVyblZhbHVlKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0
b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmggYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi4zNTQ5N2UwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrLmgKQEAgLTAsMCArMSw2MiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgVjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrX2gKKyNkZWZpbmUgVjhD
dXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrX2gKKworI2luY2x1ZGUgIlNRTFRyYW5zYWN0aW9u
Q2FsbGJhY2suaCIKKyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEZyYW1lOworCitjbGFzcyBWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2sgOiBwdWJsaWMg
U1FMVHJhbnNhY3Rpb25DYWxsYmFjayB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8
VjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrPiBjcmVhdGUodjg6OkxvY2FsPHY4OjpWYWx1
ZT4gdmFsdWUsIEZyYW1lKiBmcmFtZSkKKyAgICB7CisgICAgICAgIEFTU0VSVCh2YWx1ZS0+SXNP
YmplY3QoKSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVjhDdXN0b21TUUxUcmFuc2Fj
dGlvbkNhbGxiYWNrKHZhbHVlLT5Ub09iamVjdCgpLCBmcmFtZSkpOworICAgIH0KKyAgICB2aXJ0
dWFsIH5WOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2soKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBoYW5kbGVFdmVudChTUUxUcmFuc2FjdGlvbiosIGJvb2wmIHJhaXNlZEV4Y2VwdGlvbik7Citw
cml2YXRlOgorICAgIFY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjayh2ODo6TG9jYWw8djg6
Ok9iamVjdD4sIEZyYW1lKik7CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBtX2Nh
bGxiYWNrOworICAgIFJlZlB0cjxGcmFtZT4gbV9mcmFtZTsKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIFY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFja19oCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0
aW9uRXJyb3JDYWxsYmFjay5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3Rv
bVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uZjFhZDc0MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrLmNwcApAQCAtMCww
ICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJWOEN1c3RvbVNRTFRy
YW5zYWN0aW9uRXJyb3JDYWxsYmFjay5oIgorCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRl
ICJWOEN1c3RvbVZvaWRDYWxsYmFjay5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Y4Q3Vz
dG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrOjpWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJy
b3JDYWxsYmFjayh2ODo6TG9jYWw8djg6Ok9iamVjdD4gY2FsbGJhY2ssIEZyYW1lKiBmcmFtZSkK
KyAgICA6IG1fY2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhjYWxsYmFj
aykpCisgICAgLCBtX2ZyYW1lKGZyYW1lKQoreworfQorCitWOEN1c3RvbVNRTFRyYW5zYWN0aW9u
RXJyb3JDYWxsYmFjazo6flY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKCkKK3sK
KyAgICBtX2NhbGxiYWNrLkRpc3Bvc2UoKTsKK30KKworYm9vbCBWOEN1c3RvbVNRTFRyYW5zYWN0
aW9uRXJyb3JDYWxsYmFjazo6aGFuZGxlRXZlbnQoU1FMRXJyb3IqIGVycm9yKQoreworICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG1fZnJhbWUuZ2V0KCkpOworICAgIGlmIChj
b250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB2ODo6Q29udGV4
dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJn
dltdID0geworICAgICAgICBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6U1FMRVJS
T1IsIGVycm9yKQorICAgIH07CisKKyAgICAvLyBQcm90ZWN0IHRoZSBmcmFtZSB1bnRpbCB0aGUg
Y2FsbGJhY2sgcmV0dXJucy4KKyAgICBSZWZQdHI8RnJhbWU+IHByb3RlY3RvcihtX2ZyYW1lKTsK
KworICAgIGJvb2wgY2FsbGJhY2tSZXR1cm5WYWx1ZSA9IGZhbHNlOworICAgIGludm9rZUNhbGxi
YWNrKG1fY2FsbGJhY2ssIDEsIGFyZ3YsIGNhbGxiYWNrUmV0dXJuVmFsdWUpOworCisgICAgLy8g
RklYTUU6IEVsaW1pbmF0ZSByZXR1cm4gdmFsdWUgb25jZSBTUUxUcmFuc2FjdGlvbkVycm9yQ2Fs
bGJhY2sgaXMgY2hhbmdlZAorICAgIC8vIHRvIG1hdGNoIHRoZSBzcGVjLgorICAgIHJldHVybiB0
cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5oIGIv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2Fs
bGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmY1YTc0Ci0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21TUUxUcmFu
c2FjdGlvbkVycm9yQ2FsbGJhY2suaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWOEN1c3Rv
bVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFja19oCisjZGVmaW5lIFY4Q3VzdG9tU1FMVHJhbnNh
Y3Rpb25FcnJvckNhbGxiYWNrX2gKKworI2luY2x1ZGUgIlNRTFRyYW5zYWN0aW9uRXJyb3JDYWxs
YmFjay5oIgorI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRnJh
bWU7CisKK2NsYXNzIFY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrIDogcHVibGlj
IFNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjayB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8VjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2s+IGNyZWF0ZSh2ODo6TG9j
YWw8djg6OlZhbHVlPiB2YWx1ZSwgRnJhbWUqIGZyYW1lKQorICAgIHsKKyAgICAgICAgQVNTRVJU
KHZhbHVlLT5Jc09iamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBWOEN1c3Rv
bVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjayh2YWx1ZS0+VG9PYmplY3QoKSwgZnJhbWUpKTsK
KyAgICB9CisgICAgdmlydHVhbCB+VjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2so
KTsKKworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVFdmVudChTUUxFcnJvciopOworCitwcml2YXRl
OgorICAgIFY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25FcnJvckNhbGxiYWNrKHY4OjpMb2NhbDx2ODo6
T2JqZWN0PiwgRnJhbWUqKTsKKworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IG1fY2Fs
bGJhY2s7CisgICAgUmVmUHRyPEZyYW1lPiBtX2ZyYW1lOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gVjhDdXN0b21TUUxUcmFuc2FjdGlvbkVycm9yQ2FsbGJhY2tf
aApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21Wb2lkQ2Fs
bGJhY2suY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21Wb2lkQ2FsbGJh
Y2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGFlYmQKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbVZvaWRDYWxs
YmFjay5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJWOEN1c3RvbVZvaWRDYWxsYmFjay5oIgorCisjaW5jbHVkZSAiRnJhbWUuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitWOEN1c3RvbVZvaWRDYWxsYmFjazo6VjhDdXN0b21Wb2lkQ2FsbGJh
Y2sodjg6OkxvY2FsPHY4OjpPYmplY3Q+IGNhbGxiYWNrLCBGcmFtZSogZnJhbWUpCisgICAgOiBt
X2NhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcoY2FsbGJhY2spKQorICAg
ICwgbV9mcmFtZShmcmFtZSkKK3sKK30KKworVjhDdXN0b21Wb2lkQ2FsbGJhY2s6On5WOEN1c3Rv
bVZvaWRDYWxsYmFjaygpCit7CisgICAgbV9jYWxsYmFjay5EaXNwb3NlKCk7Cit9CisKK3ZvaWQg
VjhDdXN0b21Wb2lkQ2FsbGJhY2s6OmhhbmRsZUV2ZW50KCkKK3sKKyAgICB2ODo6SGFuZGxlU2Nv
cGUgaGFuZGxlU2NvcGU7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0g
VjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lLmdldCgpKTsKKyAgICBpZiAoY29udGV4dC5Jc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShj
b250ZXh0KTsKKworICAgIC8vIFByb3RlY3QgdGhlIGZyYW1lIHVudGlsIHRoZSBjYWxsYmFjayBy
ZXR1cm5zLgorICAgIFJlZlB0cjxGcmFtZT4gcHJvdGVjdG9yKG1fZnJhbWUpOworCisgICAgYm9v
bCBjYWxsYmFja1JldHVyblZhbHVlID0gZmFsc2U7CisgICAgaW52b2tlQ2FsbGJhY2sobV9jYWxs
YmFjaywgMCwgMCwgY2FsbGJhY2tSZXR1cm5WYWx1ZSk7Cit9CisKK2Jvb2wgaW52b2tlQ2FsbGJh
Y2sodjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gY2FsbGJhY2ssIGludCBhcmdjLCB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gYXJndltdLCBib29sJiBjYWxsYmFja1JldHVyblZhbHVlKQoreworICAg
IC8vIEZJWE1FOiBJZiBhbiBleGNlcHRpb24gd2FzIHRocm93biBieSB0aGUgY2FsbGJhY2ssIHdl
IHNob3VsZCByZXBvcnQgaXQKKyAgICB2ODo6VHJ5Q2F0Y2ggZXhjZXB0aW9uQ2F0Y2hlcjsKKwor
ICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGNhbGxiYWNrRnVuY3Rpb247CisgICAgaWYgKGNh
bGxiYWNrLT5Jc0Z1bmN0aW9uKCkpIHsKKyAgICAgICAgY2FsbGJhY2tGdW5jdGlvbiA9IHY4OjpM
b2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcodjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6Q2Fz
dChjYWxsYmFjaykpOworICAgIH0gZWxzZSBpZiAoY2FsbGJhY2stPklzT2JqZWN0KCkpIHsKKyAg
ICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaGFuZGxlRXZlbnRGdW5jdGlvbiA9IGNhbGxiYWNr
LT5HZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJoYW5kbGVFdmVudCIpKTsKKyAgICAgICAgaWYg
KGhhbmRsZUV2ZW50RnVuY3Rpb24tPklzRnVuY3Rpb24oKSkgeworICAgICAgICAgICAgY2FsbGJh
Y2tGdW5jdGlvbiA9IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KGhhbmRsZUV2ZW50RnVu
Y3Rpb24pOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmIChjYWxsYmFja0Z1bmN0aW9uLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gdjg6OkNvbnRleHQ6
OkdldEN1cnJlbnQoKS0+R2xvYmFsKCk7CisKKyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6
OnJldHJpZXZlKCk7CisgICAgQVNTRVJUKHByb3h5KTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiByZXN1bHQgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGNhbGxiYWNrRnVuY3Rpb24sIHRoaXNP
YmplY3QsIGFyZ2MsIGFyZ3YpOworCisgICAgY2FsbGJhY2tSZXR1cm5WYWx1ZSA9IHJlc3VsdC5J
c0VtcHR5KCkgJiYgcmVzdWx0LT5Jc0Jvb2xlYW4oKSAmJiByZXN1bHQtPkJvb2xlYW5WYWx1ZSgp
OworCisgICAgcmV0dXJuIGV4Y2VwdGlvbkNhdGNoZXIuSGFzQ2F1Z2h0KCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4Q3VzdG9tVm9pZENhbGxiYWNrLmggYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1
c3RvbVZvaWRDYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4
NjI5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1
c3RvbVZvaWRDYWxsYmFjay5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFY4Q3VzdG9tVm9p
ZENhbGxiYWNrX2gKKyNkZWZpbmUgVjhDdXN0b21Wb2lkQ2FsbGJhY2tfaAorCisjaW5jbHVkZSAi
Vm9pZENhbGxiYWNrLmgiCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0
ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBGcmFtZTsKKworY2xhc3MgVjhDdXN0b21Wb2lkQ2FsbGJhY2sgOiBwdWJsaWMgVm9pZENh
bGxiYWNrIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxWOEN1c3RvbVZvaWRDYWxs
YmFjaz4gY3JlYXRlKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBGcmFtZSogZnJhbWUpCisg
ICAgeworICAgICAgICBBU1NFUlQodmFsdWUtPklzT2JqZWN0KCkpOworICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IFY4Q3VzdG9tVm9pZENhbGxiYWNrKHZhbHVlLT5Ub09iamVjdCgpLCBmcmFt
ZSkpOworICAgIH0KKyAgICB2aXJ0dWFsIH5WOEN1c3RvbVZvaWRDYWxsYmFjaygpOworCisgICAg
dmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KCk7CisKK3ByaXZhdGU6CisgICAgVjhDdXN0b21Wb2lk
Q2FsbGJhY2sodjg6OkxvY2FsPHY4OjpPYmplY3Q+LCBGcmFtZSopOworCisgICAgdjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD4gbV9jYWxsYmFjazsKKyAgICBSZWZQdHI8RnJhbWU+IG1fZnJhbWU7
Cit9OworCisvLyBSZXR1cm5zIGZhbHNlIGlmIGNhbGxiYWNrIGZhaWxlZCAobnVsbCwgd3Jvbmcg
dHlwZSwgb3IgdGhyZXcgZXhjZXB0aW9uKS4KK2Jvb2wgaW52b2tlQ2FsbGJhY2sodjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD4gY2FsbGJhY2ssIGludCBhcmdjLCB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gYXJndltdLCBib29sJiBjYWxsYmFja1JldHVyblZhbHVlKTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gVjhDdXN0b21Wb2lkQ2FsbGJhY2tfaApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3RvbS5jcHAgYi9XZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOERhdGFiYXNlQ3VzdG9tLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi41OTYyZWEzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhEYXRhYmFzZUN1c3RvbS5jcHAKQEAgLTAsMCArMSw5MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgInY4X2JpbmRpbmcuaCIKKyNpbmNsdWRl
ICJ2OF9jdXN0b20uaCIKKyNpbmNsdWRlICJ2OF9wcm94eS5oIgorCisjaW5jbHVkZSAiRGF0YWJh
c2UuaCIKKyNpbmNsdWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uQ2FsbGJhY2suaCIKKyNpbmNs
dWRlICJWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFjay5oIgorI2luY2x1ZGUgIlY4
Q3VzdG9tVm9pZENhbGxiYWNrLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ0FMTEJBQ0tf
RlVOQ19ERUNMKERhdGFiYXNlQ2hhbmdlVmVyc2lvbikKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5E
YXRhYmFzZS5jaGFuZ2VWZXJzaW9uKCkiKTsKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwor
fQorCitDQUxMQkFDS19GVU5DX0RFQ0woRGF0YWJhc2VUcmFuc2FjdGlvbikKK3sKKyAgICBJTkNf
U1RBVFMoIkRPTS5EYXRhYmFzZS50cmFuc2FjdGlvbigpIik7CisKKyAgICBpZiAoYXJncy5MZW5n
dGgoKSA9PSAwKSB7CisgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFY
X0VSUk9SLCAiVHJhbnNhY3Rpb24gY2FsbGJhY2sgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWzBdLT5Jc09iamVj
dCgpKSB7CisgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6VFlQRV9FUlJPUiwg
IlRyYW5zYWN0aW9uIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKKyAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBEYXRhYmFzZSogZGF0YWJhc2Ug
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxEYXRhYmFzZT4oVjhDbGFzc0luZGV4OjpEQVRBQkFT
RSwgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBGcmFtZSogZnJhbWUgPSBWOFByb3h5OjpyZXRyaWV2
ZUZyYW1lKCk7CisKKyAgICBSZWZQdHI8VjhDdXN0b21TUUxUcmFuc2FjdGlvbkNhbGxiYWNrPiBj
YWxsYmFjayA9IFY4Q3VzdG9tU1FMVHJhbnNhY3Rpb25DYWxsYmFjazo6Y3JlYXRlKGFyZ3NbMF0s
IGZyYW1lKTsKKworICAgIFJlZlB0cjxWOEN1c3RvbVNRTFRyYW5zYWN0aW9uRXJyb3JDYWxsYmFj
az4gZXJyb3JDYWxsYmFjazsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKKyAgICAgICAg
aWYgKCFhcmdzWzFdLT5Jc09iamVjdCgpKSB7CisgICAgICAgICAgICBWOFByb3h5OjpUaHJvd0Vy
cm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJUcmFuc2FjdGlvbiBlcnJvciBjYWxsYmFjayBtdXN0
IGJlIG9mIHZhbGlkIHR5cGUuIik7CisgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OworICAgICAgICB9CisgICAgICAgIGVycm9yQ2FsbGJhY2sgPSBWOEN1c3RvbVNRTFRyYW5zYWN0
aW9uRXJyb3JDYWxsYmFjazo6Y3JlYXRlKGFyZ3NbMV0sIGZyYW1lKTsKKyAgICB9CisKKyAgICBS
ZWZQdHI8VjhDdXN0b21Wb2lkQ2FsbGJhY2s+IHN1Y2Nlc3NDYWxsYmFjazsKKyAgICBpZiAoYXJn
cy5MZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgaWYgKCFhcmdzWzFdLT5Jc09iamVjdCgpKSB7Cisg
ICAgICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlRZUEVfRVJST1IsICJUcmFu
c2FjdGlvbiBzdWNjZXNzIGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKKyAgICAg
ICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VjY2Vz
c0NhbGxiYWNrID0gVjhDdXN0b21Wb2lkQ2FsbGJhY2s6OmNyZWF0ZShhcmdzWzJdLCBmcmFtZSk7
CisgICAgfQorCisgICAgZGF0YWJhc2UtPnRyYW5zYWN0aW9uKGNhbGxiYWNrLnJlbGVhc2UoKSwg
ZXJyb3JDYWxsYmFjay5yZWxlYXNlKCksIHN1Y2Nlc3NDYWxsYmFjay5yZWxlYXNlKCkpOworCisg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTUUxSZXN1bHRTZXRSb3dM
aXN0Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FMUmVzdWx0U2V0
Um93TGlzdEN1c3RvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1
ODViZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4U1FM
UmVzdWx0U2V0Um93TGlzdEN1c3RvbS5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKworI2luY2x1ZGUgInY4X2JpbmRpbmcuaCIKKyNpbmNsdWRlICJ2OF9jdXN0b20u
aCIKKyNpbmNsdWRlICJ2OF9wcm94eS5oIgorCisjaW5jbHVkZSAiU1FMUmVzdWx0U2V0Um93TGlz
dC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NBTExCQUNLX0ZVTkNfREVDTChTUUxSZXN1
bHRTZXRSb3dMaXN0SXRlbSkKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5TUUxSZXN1bHRTZXRSb3dM
aXN0Lml0ZW0oKSIpOworCisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBW
OFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgIkl0ZW0gaW5kZXggaXMg
cmVxdWlyZWQuIik7CisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgfQorCisg
ICAgaWYgKCFhcmdzWzBdLT5Jc051bWJlcigpKSB7CisgICAgICAgIFY4UHJveHk6OlRocm93RXJy
b3IoVjhQcm94eTo6VFlQRV9FUlJPUiwgIkl0ZW0gaW5kZXggbXVzdCBiZSBhIG51bWJlci4iKTsK
KyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBTUUxSZXN1bHRT
ZXRSb3dMaXN0KiByb3dMaXN0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8U1FMUmVzdWx0U2V0
Um93TGlzdD4oVjhDbGFzc0luZGV4OjpTUUxSRVNVTFRTRVRST1dMSVNULCBhcmdzLkhvbGRlcigp
KTsKKworICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBhcmdzWzBdLT5JbnRlZ2VyVmFsdWUoKTsK
KyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHJvd0xpc3QtPmxlbmd0aCgpKSB7CisgICAg
ICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6UkFOR0VfRVJST1IsICJJdGVtIGluZGV4
IGlzIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAg
ICB9CisKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaXRlbSA9IHY4OjpPYmplY3Q6Ok5ldygp
OworICAgIHVuc2lnbmVkIG51bUNvbHVtbnMgPSByb3dMaXN0LT5jb2x1bW5OYW1lcygpLnNpemUo
KTsKKyAgICB1bnNpZ25lZCB2YWx1ZXNJbmRleCA9IGluZGV4ICogbnVtQ29sdW1uczsKKworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyArK2kpIHsKKyAgICAgICAgY29u
c3QgU1FMVmFsdWUmIHNxbFZhbHVlID0gcm93TGlzdC0+dmFsdWVzKClbdmFsdWVzSW5kZXggKyBp
XTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlOworICAgICAgICBzd2l0Y2go
c3FsVmFsdWUudHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFNRTFZhbHVlOjpTdHJpbmdWYWx1
ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHY4U3RyaW5nKHNxbFZhbHVlLnN0cmluZygpKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMVmFsdWU6Ok51bGxW
YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHY4OjpOdWxsKCk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNRTFZhbHVlOjpOdW1iZXJWYWx1ZToKKyAgICAg
ICAgICAgICAgICB2YWx1ZSA9IHY4OjpOdW1iZXI6Ok5ldyhzcWxWYWx1ZS5udW1iZXIoKSk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisKKyAgICAgICAgaXRlbS0+U2V0
KHY4U3RyaW5nKHJvd0xpc3QtPmNvbHVtbk5hbWVzKClbaV0pLCB2YWx1ZSwgc3RhdGljX2Nhc3Q8
djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9udERlbGV0ZXx2ODo6UmVhZE9ubHkpKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTUUxUcmFuc2FjdGlvbkN1c3Rv
bS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNRTFRyYW5zYWN0aW9uQ3VzdG9t
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E3OTdjCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhTUUxUcmFuc2FjdGlvbkN1
c3RvbS5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNs
dWRlICJ2OF9iaW5kaW5nLmgiCisjaW5jbHVkZSAidjhfY3VzdG9tLmgiCisjaW5jbHVkZSAidjhf
cHJveHkuaCIKKworI2luY2x1ZGUgIkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiU1FMVmFsdWUuaCIK
KyNpbmNsdWRlICJWOEN1c3RvbVNRTFN0YXRlbWVudENhbGxiYWNrLmgiCisjaW5jbHVkZSAiVjhD
dXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrLmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgorCit1c2luZyBuYW1lc3BhY2UgV1RGOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NBTExC
QUNLX0ZVTkNfREVDTChTUUxUcmFuc2FjdGlvbkV4ZWN1dGVTcWwpCit7CisgICAgSU5DX1NUQVRT
KCJET00uU1FMVHJhbnNhY3Rpb24uZXhlY3V0ZVNxbCgpIik7CisKKyAgICBpZiAoYXJncy5MZW5n
dGgoKSA9PSAwKSB7CisgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFY
X0VSUk9SLCAiU1FMIHN0YXRlbWVudCBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBTdHJpbmcgc3RhdGVtZW50ID0gVG9XZWJDb3Jl
U3RyaW5nKGFyZ3NbMF0pOworCisgICAgVmVjdG9yPFNRTFZhbHVlPiBzcWxWYWx1ZXM7CisKKyAg
ICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB3
b3JrIGZvciB2ODo6QXJyYXlpc2ggb2JqZWN0cywgYXMgd2VsbAorICAgICAgICBpZiAoIWFyZ3Nb
MV0tPklzQXJyYXkoKSkgeworICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5
OjpUWVBFX0VSUk9SLCAiU3RhdGVtZW50IGFyZ3VtZW50cyBtdXN0IGJlIGFuIHY4OjpBcnJheS4i
KTsKKyAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgICAgIH0KKworICAg
ICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcmd1bWVudHMgPSB2ODo6TG9jYWw8djg6OkFycmF5
Pjo6Q2FzdChhcmdzWzFdKTsKKyAgICAgICAgdWludDMyX3QgbGVuZ3RoID0gYXJndW1lbnRzLT5M
ZW5ndGgoKTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGxlbmd0aDsg
KytpKSB7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9IGFyZ3VtZW50
cy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcoaSkpOworICAgICAgICAgICAgaWYgKHZhbHVlLklzRW1w
dHkoKSB8fCB2YWx1ZS0+SXNOdWxsKCkpCisgICAgICAgICAgICAgICAgc3FsVmFsdWVzLmFwcGVu
ZChTUUxWYWx1ZSgpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLT5Jc051bWJlcigpKQor
ICAgICAgICAgICAgICAgIHNxbFZhbHVlcy5hcHBlbmQoU1FMVmFsdWUodmFsdWUtPk51bWJlclZh
bHVlKCkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcWxWYWx1ZXMuYXBw
ZW5kKFNRTFZhbHVlKFRvV2ViQ29yZVN0cmluZyh2YWx1ZSkpKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PFNRTFRyYW5zYWN0aW9uPihWOENsYXNzSW5kZXg6OlNRTFRSQU5TQUNUSU9OLCBhcmdzLkhv
bGRlcigpKTsKKworICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlRnJhbWUoKTsK
KworICAgIFJlZlB0cjxTUUxTdGF0ZW1lbnRDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgaWYgKGFy
Z3MuTGVuZ3RoKCkgPiAyKSB7CisgICAgICAgIGlmICghYXJnc1syXS0+SXNPYmplY3QoKSkgewor
ICAgICAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiU3Rh
dGVtZW50IGNhbGxiYWNrIG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKKyAgICAgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWUpCisg
ICAgICAgICAgICBjYWxsYmFjayA9IFY4Q3VzdG9tU1FMU3RhdGVtZW50Q2FsbGJhY2s6OmNyZWF0
ZShhcmdzWzJdLCBmcmFtZSk7CisgICAgfQorCisgICAgUmVmUHRyPFNRTFN0YXRlbWVudEVycm9y
Q2FsbGJhY2s+IGVycm9yQ2FsbGJhY2s7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAzKSB7Cisg
ICAgICAgIGlmICghYXJnc1syXS0+SXNPYmplY3QoKSkgeworICAgICAgICAgICAgVjhQcm94eTo6
VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9SLCAiU3RhdGVtZW50IGVycm9yIGNhbGxiYWNr
IG11c3QgYmUgb2YgdmFsaWQgdHlwZS4iKTsKKyAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZp
bmVkKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWUpCisgICAgICAgICAgICBlcnJv
ckNhbGxiYWNrID0gVjhDdXN0b21TUUxTdGF0ZW1lbnRFcnJvckNhbGxiYWNrOjpjcmVhdGUoYXJn
c1szXSwgZnJhbWUpOworICAgIH0KKworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIHRy
YW5zYWN0aW9uLT5leGVjdXRlU1FMKHN0YXRlbWVudCwgc3FsVmFsdWVzLCBjYWxsYmFjaywgZXJy
b3JDYWxsYmFjaywgZWMpOworICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisKKyAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="13208"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>