<?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>141356</bug_id>
          
          <creation_ts>2015-02-07 04:00:58 -0800</creation_ts>
          <short_desc>Use longer hashes for cache keys</short_desc>
          <delta_ts>2015-02-07 11:45:59 -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>Page Loading</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cdumez</cc>
    
    <cc>kling</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1067516</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-02-07 04:00:58 -0800</bug_when>
    <thetext>Current key hashes are 32bit. We should use longer hashes to reduce collisions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067522</commentid>
    <comment_count>1</comment_count>
      <attachid>246208</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-02-07 04:55:59 -0800</bug_when>
    <thetext>Created attachment 246208
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067524</commentid>
    <comment_count>2</comment_count>
      <attachid>246209</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-02-07 06:16:26 -0800</bug_when>
    <thetext>Created attachment 246209
patch2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067529</commentid>
    <comment_count>3</comment_count>
      <attachid>246209</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-02-07 08:33:05 -0800</bug_when>
    <thetext>Comment on attachment 246209
patch2

View in context: https://bugs.webkit.org/attachment.cgi?id=246209&amp;action=review

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.cpp:179
&gt; +    auto data64 = reinterpret_cast&lt;const uint64_t*&gt;(digest.data());

Do we really need to do this? It makes things endian-dependent for no good reason. Can’t we write these out as a stream of bytes instead of two 64-bit integers?

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheKey.cpp:77
&gt; +    hashString(md5, m_method);
&gt; +    hashString(md5, m_partition);
&gt; +    hashString(md5, m_identifier);

It’s a little strange to hash the characters in these strings, but no string boundaries or lengths. I suppose it’s OK, though.

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheKey.cpp:86
&gt; +    auto* data64 = reinterpret_cast&lt;const uint64_t*&gt;(m_hash.data());
&gt; +    return String::format(&quot;%016llx%016llx&quot;, data64[0], data64[1]);

I suggest treating this as a sequence of 16 bytes, not do this endian-specific thing:

    return String::format(&quot;%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x&quot;, data[0], ...)

Could use StringBuilder instead of String::format to avoid having to write it all out like this. It would be really easy to write a tiny function that adds a byte to a StringBuilder as hex.

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheKey.cpp:93
&gt; +    auto* data64 = reinterpret_cast&lt;uint64_t*&gt;(hash.data());

Again, I don’t like this endian-dependent strategy here any more than elsewhere. We should do it a byte at a time.

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm:45
&gt; +static const char* versionDirectoryPrefix = &quot;Version &quot;;

I think it’s slightly more efficient to use const char[] for these things instead of const char*. Also, if not switching to const char[] it should be const char* const since we want the pointers to be constants, not variables.

&gt; Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm:122
&gt; +    String versionSubdirectory = String(versionDirectoryPrefix) + String::number(NetworkCacheStorage::version);

No need to cast versionDirectoryPrefix to a String explicitly. Should just work without that.

I sure wish makeString or some other function could do this without allocating an intermediate string with String::number.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067545</commentid>
    <comment_count>4</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-02-07 11:22:29 -0800</bug_when>
    <thetext>https://trac.webkit.org/r179779</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1067551</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-02-07 11:45:59 -0800</bug_when>
    <thetext>and a followup https://trac.webkit.org/r179781</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>246208</attachid>
            <date>2015-02-07 04:55:59 -0800</date>
            <delta_ts>2015-02-07 06:16:26 -0800</delta_ts>
            <desc>patch</desc>
            <filename>disk-cache-md5.patch</filename>
            <type>text/plain</type>
            <size>15651</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE3OTc3NykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU2IEBACisyMDE1LTAyLTA3ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBVc2UgbG9uZ2VyIGhhc2hlcyBm
b3IgY2FjaGUga2V5cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTQxMzU2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgVGhlIGN1cnJlbnQga2V5IGhhc2hlcyBhcmUgMzJiaXQuIFdlIHNob3VsZCB1c2UgbG9u
Z2VyIGhhc2hlcyB0byByZWR1Y2UgY29sbGlzaW9ucy4KKworICAgICAgICBUaGlzIHBhdGNoIHN3
aXRjaGVzIHVzIHRvIHVzaW5nIE1ENSBkaWdlc3RzIGZvciB0aGUgY2FjaGUga2V5IGhhc2hlcy4g
QXMgYSByZXN1bHQgdGhlIGZpbGUgbmFtZXMgZm9yIHRoZSBjYWNoZQorICAgICAgICBlbnRyaWVz
IGdyb3cgZnJvbSA4IHRvIDMyIGNoYXJhY3Rlci4KKworICAgICAgICBOb3RlIHRoYXQgd2UgZG9u
J3QgbmVlZCBhIGNyeXB0b2dyYXBoaWMgaGFzaCAoZnVsbCBjYWNoZSBrZXlzIGFyZSB2ZXJpZmll
ZCBhZ2FpbnN0IHRoZSBlbnRyaWVzKS4KKyAgICAgICAgTUQ1IGp1c3QgaGFwcGVucyB0byBiZSBm
YXN0LCBjb252ZW5pZW50IGFuZCBhdmFpbGFibGUuCisKKyAgICAgICAgVGhlIHBhdGNoIGFsc28g
bW92ZXMgdGhlIHdob2xlIGNhY2hlIGhpZXJhcmNoeSBkb3duIHRvIGEgdmVyc2lvbmVkIHN1YmRp
cmVjdG9yeSAoIldlYktpdENhY2hlL1ZlcnNpb24gMiIpCisgICAgICAgIGFuZCBkZWxldGVzIGFu
eSBvbGQgc3R5bGUgY2FjaGUgZmlsZXMgaWYgdGhleSBleGlzdC4KKworICAgICAgICAqIE5ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHA6CisgICAgICAgIChXZWJLaXQ6
Ok5ldHdvcmtDYWNoZUNvZGVyPE1ENTo6RGlnZXN0Pjo6ZW5jb2RlKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlQ29kZXI8TUQ1OjpEaWdlc3Q+OjpkZWNvZGUpOgorICAgICAgICAqIE5l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5oOgorICAgICAgICAqIE5ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUtleS5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZUtleTo6TmV0d29ya0NhY2hlS2V5KToKKyAgICAgICAgKFdlYktpdDo6aGFzaFN0
cmluZyk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZUtleTo6Y29tcHV0ZUhhc2gpOgor
ICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVLZXk6Omhhc2hBc1N0cmluZyk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZUtleTo6c3RyaW5nVG9IYXNoKToKKyAgICAgICAgKiBOZXR3
b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVLZXkuaDoKKyAgICAgICAgKFdlYktpdDo6TmV0
d29ya0NhY2hlS2V5OjpzaG9ydEhhc2gpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVL
ZXk6OnRvU2hvcnRIYXNoKToKKworICAgICAgICAgICAgMzJiaXQgaGFzaCB0byB1c2UgaW4gdGhl
IGJsb29tIGZpbHRlci4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVLZXk6Omhhc2hT
dHJpbmdMZW5ndGgpOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNo
ZVN0b3JhZ2UuaDoKKworICAgICAgICAgICAgQnVtcCB0aGUgdmVyc2lvbi4KKworICAgICAgICAq
IE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2VDb2NvYS5tbToKKyAgICAg
ICAgKFdlYktpdDo6dHJhdmVyc2VDYWNoZUZpbGVzKToKKyAgICAgICAgKFdlYktpdDo6bWFrZVZl
cnNpb25lZERpcmVjdG9yeVBhdGgpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVTdG9y
YWdlOjpOZXR3b3JrQ2FjaGVTdG9yYWdlKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hl
U3RvcmFnZTo6aW5pdGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZVN0b3Jh
Z2U6OnJlbW92ZUVudHJ5KToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlU3RvcmFnZTo6
cmV0cmlldmUpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVTdG9yYWdlOjpzdG9yZSk6
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZVN0b3JhZ2U6OnVwZGF0ZSk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZVN0b3JhZ2U6OnNocmlua0lmTmVlZGVkKToKKyAgICAgICAg
KFdlYktpdDo6TmV0d29ya0NhY2hlU3RvcmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMpOgorCisgICAg
ICAgICAgICBXaXBlIG91dCB0aGUgdmVyc2lvbiAxIGNhY2hlLgorCiAyMDE1LTAyLTA2ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgSGF2ZSBTUUxpdGVTdGF0ZW1l
bnQ6OmRhdGFiYXNlKCkgcmV0dXJuIGEgcmVmZXJlbmNlCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9O
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5j
cHAJKHJldmlzaW9uIDE3OTc2NCkKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3Myw2ICsxNzMs
MjEgQEAgYm9vbCBOZXR3b3JrQ2FjaGVDb2RlcjxXZWJDb3JlOjpDZXJ0aWZpYwogICAgIHJldHVy
biB0cnVlOwogfQogCit2b2lkIE5ldHdvcmtDYWNoZUNvZGVyPE1ENTo6RGlnZXN0Pjo6ZW5jb2Rl
KE5ldHdvcmtDYWNoZUVuY29kZXImIGVuY29kZXIsIGNvbnN0IE1ENTo6RGlnZXN0JiBkaWdlc3Qp
Cit7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoZGlnZXN0KSA9PSAyICogc2l6ZW9mKHVpbnQ2
NF90KSwgIiIpOworICAgIGF1dG8gZGF0YTY0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50
NjRfdCo+KGRpZ2VzdC5kYXRhKCkpOworICAgIGVuY29kZXIgPDwgZGF0YTY0WzBdOworICAgIGVu
Y29kZXIgPDwgZGF0YTY0WzFdOworfQorCitib29sIE5ldHdvcmtDYWNoZUNvZGVyPE1ENTo6RGln
ZXN0Pjo6ZGVjb2RlKE5ldHdvcmtDYWNoZURlY29kZXImIGRlY29kZXIsIE1ENTo6RGlnZXN0JiBk
aWdlc3QpCit7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoZGlnZXN0KSA9PSAyICogc2l6ZW9m
KHVpbnQ2NF90KSwgIiIpOworICAgIGF1dG8gZGF0YTY0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50
NjRfdCo+KGRpZ2VzdC5kYXRhKCkpOworICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShkYXRhNjRb
MF0pICYmIGRlY29kZXIuZGVjb2RlKGRhdGE2NFsxXSk7Cit9CisKIH0KIAogI2VuZGlmCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3
b3JrQ2FjaGVDb2RlcnMuaAkocmV2aXNpb24gMTc5NzY0KQorKysgU291cmNlL1dlYktpdDIvTmV0
d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlQ29kZXJzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9I
YXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi9tZDUuaD4K
IAogbmFtZXNwYWNlIFdlYktpdCB7CiAKQEAgLTI1NSw2ICsyNTYsMTEgQEAgdGVtcGxhdGU8PiBz
dHJ1Y3QgTmV0d29ya0NhY2hlQ29kZXI8V2ViQwogICAgIHN0YXRpYyBib29sIGRlY29kZShOZXR3
b3JrQ2FjaGVEZWNvZGVyJiwgV2ViQ29yZTo6Q2VydGlmaWNhdGVJbmZvJik7CiB9OwogCit0ZW1w
bGF0ZTw+IHN0cnVjdCBOZXR3b3JrQ2FjaGVDb2RlcjxNRDU6OkRpZ2VzdD4geworICAgIHN0YXRp
YyB2b2lkIGVuY29kZShOZXR3b3JrQ2FjaGVFbmNvZGVyJiwgY29uc3QgTUQ1OjpEaWdlc3QmKTsK
KyAgICBzdGF0aWMgYm9vbCBkZWNvZGUoTmV0d29ya0NhY2hlRGVjb2RlciYsIE1ENTo6RGlnZXN0
Jik7Cit9OworCiB9CiAKICNlbmRpZgpJbmRleDogU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nl
c3MvY2FjaGUvTmV0d29ya0NhY2hlS2V5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVLZXkuY3BwCShyZXZpc2lvbiAxNzk3
NjQpCisrKyBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVL
ZXkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaWYgRU5BQkxFKE5FVFdP
UktfQ0FDSEUpCiAKICNpbmNsdWRlICJOZXR3b3JrQ2FjaGVDb2RlcnMuaCIKKyNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCkBAIC01NiwzMCArNTcs
NDUgQEAgTmV0d29ya0NhY2hlS2V5OjpOZXR3b3JrQ2FjaGVLZXkoY29uc3QgUwogewogfQogCi1z
dGF0aWMgTmV0d29ya0NhY2hlS2V5OjpIYXNoVHlwZSBoYXNoU3RyaW5nKGNvbnN0IFN0cmluZyYg
c3RyaW5nKQorc3RhdGljIHZvaWQgaGFzaFN0cmluZyhNRDUmIG1kNSwgY29uc3QgU3RyaW5nJiBz
dHJpbmcpCiB7Ci0gICAgLy8gU3RyaW5nOjpoYXNoKCkgbWFza3MgYXdheSB0aGUgdG9wIGJpdHMu
Ci0gICAgaWYgKHN0cmluZy5pczhCaXQoKSkKLSAgICAgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6
Y29tcHV0ZUhhc2goc3RyaW5nLmNoYXJhY3RlcnM4KCksIHN0cmluZy5sZW5ndGgoKSk7Ci0gICAg
cmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2goc3RyaW5nLmNoYXJhY3RlcnMxNigpLCBz
dHJpbmcubGVuZ3RoKCkpOworICAgIGlmIChzdHJpbmcuaXM4Qml0KCkpIHsKKyAgICAgICAgbWQ1
LmFkZEJ5dGVzKHN0cmluZy5jaGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVuZ3RoKCkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIGF1dG8gY1N0cmluZyA9IHN0cmluZy51dGY4KCk7CisgICAg
bWQ1LmFkZEJ5dGVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGNTdHJpbmcuZGF0
YSgpKSwgY1N0cmluZy5sZW5ndGgoKSk7CiB9CiAKIE5ldHdvcmtDYWNoZUtleTo6SGFzaFR5cGUg
TmV0d29ya0NhY2hlS2V5Ojpjb21wdXRlSGFzaCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIFdURjo6
cGFpckludEhhc2goaGFzaFN0cmluZyhtX21ldGhvZCksIFdURjo6cGFpckludEhhc2goaGFzaFN0
cmluZyhtX2lkZW50aWZpZXIpLCBoYXNoU3RyaW5nKG1fcGFydGl0aW9uKSkpOworICAgIC8vIFdl
IGRvbid0IHJlYWxseSBuZWVkIGEgY3J5cHRvZ3JhcGhpYyBoYXNoLiBUaGUga2V5IGlzIGFsd2F5
cyB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBlbnRyeSBoZWFkZXIuCisgICAgLy8gTUQ1IGp1c3QgaGFw
cGVucyB0byBiZSBzdWl0YWJseSBzaXplZCwgZmFzdCBhbmQgYXZhaWxhYmxlLgorICAgIE1ENSBt
ZDU7CisgICAgaGFzaFN0cmluZyhtZDUsIG1fbWV0aG9kKTsKKyAgICBoYXNoU3RyaW5nKG1kNSwg
bV9wYXJ0aXRpb24pOworICAgIGhhc2hTdHJpbmcobWQ1LCBtX2lkZW50aWZpZXIpOworICAgIE1E
NTo6RGlnZXN0IGhhc2g7CisgICAgbWQ1LmNoZWNrc3VtKGhhc2gpOworICAgIHJldHVybiBoYXNo
OwogfQogCiBTdHJpbmcgTmV0d29ya0NhY2hlS2V5OjpoYXNoQXNTdHJpbmcoKSBjb25zdAogewot
ICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTA4eCIsIG1faGFzaCk7CisgICAgYXV0byogZGF0
YTY0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KG1faGFzaC5kYXRhKCkpOwor
ICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTAxNmxseCUwMTZsbHgiLCBkYXRhNjRbMF0sIGRh
dGE2NFsxXSk7CiB9CiAKIGJvb2wgTmV0d29ya0NhY2hlS2V5OjpzdHJpbmdUb0hhc2goY29uc3Qg
U3RyaW5nJiBzdHJpbmcsIEhhc2hUeXBlJiBoYXNoKQogewotICAgIGlmIChzdHJpbmcubGVuZ3Ro
KCkgIT0gOCkKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpICE9IGhhc2hTdHJpbmdMZW5ndGgoKSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGF1dG8qIGRhdGE2NCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8dWludDY0X3QqPihoYXNoLmRhdGEoKSk7CisgICAgYXV0byBoaWdoU3RyaW5nID0gc3RyaW5n
LmxlZnQoMTYpOworICAgIGF1dG8gbG93U3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygxNiwgMTYp
OwogICAgIGJvb2wgc3VjY2VzczsKLSAgICBoYXNoID0gc3RyaW5nLnRvVUludFN0cmljdCgmc3Vj
Y2VzcywgMTYpOworICAgIGRhdGE2NFswXSA9IGhpZ2hTdHJpbmcudG9VSW50NjRTdHJpY3QoJnN1
Y2Nlc3MsIDE2KTsKKyAgICBkYXRhNjRbMV0gPSBzdWNjZXNzID8gbG93U3RyaW5nLnRvVUludDY0
U3RyaWN0KCZzdWNjZXNzLCAxNikgOiAwOwogICAgIHJldHVybiBzdWNjZXNzOwogfQogCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVLZXkuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3Jr
Q2FjaGVLZXkuaAkocmV2aXNpb24gMTc5NzY0KQorKysgU291cmNlL1dlYktpdDIvTmV0d29ya1By
b2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlS2V5LmgJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4
LDcgQEAKIAogI2lmIEVOQUJMRShORVRXT1JLX0NBQ0hFKQogCisjaW5jbHVkZSA8d3RmL21kNS5o
PgogI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsK
QEAgLTM3LDcgKzM4LDcgQEAgY2xhc3MgTmV0d29ya0NhY2hlRGVjb2RlcjsKIAogY2xhc3MgTmV0
d29ya0NhY2hlS2V5IHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIHVuc2lnbmVkIEhhc2hUeXBlOwor
ICAgIHR5cGVkZWYgTUQ1OjpEaWdlc3QgSGFzaFR5cGU7CiAKICAgICBOZXR3b3JrQ2FjaGVLZXko
KSB7IH0KICAgICBOZXR3b3JrQ2FjaGVLZXkoY29uc3QgTmV0d29ya0NhY2hlS2V5Jik7CkBAIC00
NywxMSArNDgsMTYgQEAgcHVibGljOgogICAgIGNvbnN0IFN0cmluZyYgbWV0aG9kKCkgY29uc3Qg
eyByZXR1cm4gbV9tZXRob2Q7IH0KICAgICBjb25zdCBTdHJpbmcmIHBhcnRpdGlvbigpIGNvbnN0
IHsgcmV0dXJuIG1fcGFydGl0aW9uOyB9CiAgICAgY29uc3QgU3RyaW5nJiBpZGVudGlmaWVyKCkg
Y29uc3QgeyByZXR1cm4gbV9pZGVudGlmaWVyOyB9CisKICAgICBIYXNoVHlwZSBoYXNoKCkgY29u
c3QgeyByZXR1cm4gbV9oYXNoOyB9CisgICAgdW5zaWduZWQgc2hvcnRIYXNoKCkgY29uc3QgIHsg
cmV0dXJuIHRvU2hvcnRIYXNoKG1faGFzaCk7IH0KIAotICAgIFN0cmluZyBoYXNoQXNTdHJpbmco
KSBjb25zdDsKKyAgICBzdGF0aWMgdW5zaWduZWQgdG9TaG9ydEhhc2goY29uc3QgSGFzaFR5cGUm
IGhhc2gpIHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkKj4oaGFzaC5k
YXRhKCkpOyB9CiAgICAgc3RhdGljIGJvb2wgc3RyaW5nVG9IYXNoKGNvbnN0IFN0cmluZyYsIEhh
c2hUeXBlJik7CiAKKyAgICBzdGF0aWMgc2l6ZV90IGhhc2hTdHJpbmdMZW5ndGgoKSB7IHJldHVy
biAyICogc2l6ZW9mKG1faGFzaCk7IH0KKyAgICBTdHJpbmcgaGFzaEFzU3RyaW5nKCkgY29uc3Q7
CisKICAgICB2b2lkIGVuY29kZShOZXR3b3JrQ2FjaGVFbmNvZGVyJikgY29uc3Q7CiAgICAgc3Rh
dGljIGJvb2wgZGVjb2RlKE5ldHdvcmtDYWNoZURlY29kZXImLCBOZXR3b3JrQ2FjaGVLZXkmKTsK
IApJbmRleDogU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hl
U3RvcmFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuaAkocmV2aXNpb24gMTc5NzY0KQorKysgU291cmNlL1dl
YktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xNTMsMTIgKzE1MywxMyBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRNYXhpbXVt
U2l6ZShzaXplX3QpOwogICAgIHZvaWQgY2xlYXIoKTsKIAotICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCB2ZXJzaW9uID0gMTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgdmVyc2lvbiA9IDI7
CiAKIHByaXZhdGU6CiAgICAgTmV0d29ya0NhY2hlU3RvcmFnZShjb25zdCBTdHJpbmcmIGRpcmVj
dG9yeVBhdGgpOwogCiAgICAgdm9pZCBpbml0aWFsaXplKCk7CisgICAgdm9pZCBkZWxldGVPbGRW
ZXJzaW9ucygpOwogICAgIHZvaWQgc2hyaW5rSWZOZWVkZWQoKTsKIAogICAgIHZvaWQgcmVtb3Zl
RW50cnkoY29uc3QgTmV0d29ya0NhY2hlS2V5Jik7CkBAIC0xODMsNiArMTg0LDcgQEAgcHJpdmF0
ZToKICAgICAgICAgU3RvcmVDb21wbGV0aW9uSGFuZGxlciBjb21wbGV0aW9uSGFuZGxlcjsKICAg
ICB9OwogCisgICAgY29uc3QgU3RyaW5nIG1fYmFzZURpcmVjdG9yeVBhdGg7CiAgICAgY29uc3Qg
U3RyaW5nIG1fZGlyZWN0b3J5UGF0aDsKIAogICAgIHNpemVfdCBtX21heGltdW1TaXplIHsgc3Rk
OjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSB9OwpJbmRleDogU291cmNlL1dlYktpdDIv
TmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZUNvY29hLm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0
b3JhZ2VDb2NvYS5tbQkocmV2aXNpb24gMTc5NzY0KQorKysgU291cmNlL1dlYktpdDIvTmV0d29y
a1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZUNvY29hLm1tCSh3b3JraW5nIGNvcHkp
CkBAIC00Miw2ICs0Miw3IEBACiBuYW1lc3BhY2UgV2ViS2l0IHsKIAogc3RhdGljIGNvbnN0IGNo
YXIqIG5ldHdvcmtDYWNoZVN1YmRpcmVjdG9yeSA9ICJXZWJLaXRDYWNoZSI7CitzdGF0aWMgY29u
c3QgY2hhciogdmVyc2lvbkRpcmVjdG9yeVN1ZmZpeCA9ICJWZXJzaW9uICI7CiAKIHRlbXBsYXRl
IDx0eXBlbmFtZSBGdW5jdGlvbj4KIHN0YXRpYyB2b2lkIHRyYXZlcnNlRGlyZWN0b3J5KGNvbnN0
IFN0cmluZyYgcGF0aCwgdWludDhfdCB0eXBlLCBjb25zdCBGdW5jdGlvbiYgZnVuY3Rpb24pCkBA
IC02Niw3ICs2Nyw3IEBAIHN0YXRpYyB2b2lkIHRyYXZlcnNlQ2FjaGVGaWxlcyhjb25zdCBTdHIK
ICAgICB0cmF2ZXJzZURpcmVjdG9yeShjYWNoZVBhdGgsIERUX0RJUiwgWyZjYWNoZVBhdGgsICZm
dW5jdGlvbl0oY29uc3QgU3RyaW5nJiBzdWJkaXJOYW1lKSB7CiAgICAgICAgIFN0cmluZyBwYXJ0
aXRpb25QYXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNhY2hlUGF0aCwg
c3ViZGlyTmFtZSk7CiAgICAgICAgIHRyYXZlcnNlRGlyZWN0b3J5KHBhcnRpdGlvblBhdGgsIERU
X1JFRywgWyZmdW5jdGlvbiwgJnBhcnRpdGlvblBhdGhdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUp
IHsKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5sZW5ndGgoKSAhPSA4KQorICAgICAgICAgICAg
aWYgKGZpbGVOYW1lLmxlbmd0aCgpICE9IE5ldHdvcmtDYWNoZUtleTo6aGFzaFN0cmluZ0xlbmd0
aCgpKQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIGZ1bmN0aW9uKGZpbGVO
YW1lLCBwYXJ0aXRpb25QYXRoKTsKICAgICAgICAgfSk7CkBAIC0xMTYsMTMgKzExNywyMSBAQCBz
dGQ6OnVuaXF1ZV9wdHI8TmV0d29ya0NhY2hlU3RvcmFnZT4gTmV0CiAgICAgcmV0dXJuIHN0ZDo6
dW5pcXVlX3B0cjxOZXR3b3JrQ2FjaGVTdG9yYWdlPihuZXcgTmV0d29ya0NhY2hlU3RvcmFnZShu
ZXR3b3JrQ2FjaGVQYXRoKSk7CiB9CiAKLU5ldHdvcmtDYWNoZVN0b3JhZ2U6Ok5ldHdvcmtDYWNo
ZVN0b3JhZ2UoY29uc3QgU3RyaW5nJiBkaXJlY3RvcnlQYXRoKQotICAgIDogbV9kaXJlY3RvcnlQ
YXRoKGRpcmVjdG9yeVBhdGgpCitzdGF0aWMgU3RyaW5nIG1ha2VWZXJzaW9uZWREaXJlY3RvcnlQ
YXRoKGNvbnN0IFN0cmluZyYgYmFzZURpcmVjdG9yeVBhdGgpCit7CisgICAgU3RyaW5nIHZlcnNp
b25TdWJkaXJlY3RvcnkgPSBTdHJpbmcodmVyc2lvbkRpcmVjdG9yeVN1ZmZpeCkgKyBTdHJpbmc6
Om51bWJlcihOZXR3b3JrQ2FjaGVTdG9yYWdlOjp2ZXJzaW9uKTsKKyAgICByZXR1cm4gV2ViQ29y
ZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGJhc2VEaXJlY3RvcnlQYXRoLCB2ZXJzaW9uU3Vi
ZGlyZWN0b3J5KTsKK30KKworTmV0d29ya0NhY2hlU3RvcmFnZTo6TmV0d29ya0NhY2hlU3RvcmFn
ZShjb25zdCBTdHJpbmcmIGJhc2VEaXJlY3RvcnlQYXRoKQorICAgIDogbV9iYXNlRGlyZWN0b3J5
UGF0aChiYXNlRGlyZWN0b3J5UGF0aCkKKyAgICAsIG1fZGlyZWN0b3J5UGF0aChtYWtlVmVyc2lv
bmVkRGlyZWN0b3J5UGF0aChtX2Jhc2VEaXJlY3RvcnlQYXRoKSkKICAgICAsIG1faW9RdWV1ZShh
ZG9wdERpc3BhdGNoKGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiY29tLmFwcGxlLldlYktpdC5DYWNo
ZS5TdG9yYWdlIiwgRElTUEFUQ0hfUVVFVUVfQ09OQ1VSUkVOVCkpKQogICAgICwgbV9iYWNrZ3Jv
dW5kSU9RdWV1ZShhZG9wdERpc3BhdGNoKGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiY29tLmFwcGxl
LldlYktpdC5DYWNoZS5TdG9yYWdlLkJhY2tncm91bmQiLCBESVNQQVRDSF9RVUVVRV9DT05DVVJS
RU5UKSkpCiB7CiAgICAgZGlzcGF0Y2hfc2V0X3RhcmdldF9xdWV1ZShtX2JhY2tncm91bmRJT1F1
ZXVlLmdldCgpLCBkaXNwYXRjaF9nZXRfZ2xvYmFsX3F1ZXVlKERJU1BBVENIX1FVRVVFX1BSSU9S
SVRZX0JBQ0tHUk9VTkQsIDApKTsKIAorICAgIGRlbGV0ZU9sZFZlcnNpb25zKCk7CiAgICAgaW5p
dGlhbGl6ZSgpOwogfQogCkBAIC0xMzksOCArMTQ4LDkgQEAgdm9pZCBOZXR3b3JrQ2FjaGVTdG9y
YWdlOjppbml0aWFsaXplKCkKICAgICAgICAgICAgIE5ldHdvcmtDYWNoZUtleTo6SGFzaFR5cGUg
aGFzaDsKICAgICAgICAgICAgIGlmICghTmV0d29ya0NhY2hlS2V5OjpzdHJpbmdUb0hhc2goZmls
ZU5hbWUsIGhhc2gpKQogICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGRpc3Bh
dGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIFt0aGlzLCBoYXNoXSB7Ci0gICAg
ICAgICAgICAgICAgbV9jb250ZW50c0ZpbHRlci5hZGQoaGFzaCk7CisgICAgICAgICAgICB1bnNp
Z25lZCBzaG9ydEhhc2ggPSBOZXR3b3JrQ2FjaGVLZXk6OnRvU2hvcnRIYXNoKGhhc2gpOworICAg
ICAgICAgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgW3RoaXMs
IHNob3J0SGFzaF0geworICAgICAgICAgICAgICAgIG1fY29udGVudHNGaWx0ZXIuYWRkKHNob3J0
SGFzaCk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICsrZW50cnlDb3VudDsKICAgICAg
ICAgfSk7CkBAIC0zNDQsOCArMzU0LDggQEAgdm9pZCBOZXR3b3JrQ2FjaGVTdG9yYWdlOjpyZW1v
dmVFbnRyeShjbwogewogICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7CiAKLSAgICBpZiAo
bV9jb250ZW50c0ZpbHRlci5tYXlDb250YWluKGtleS5oYXNoKCkpKQotICAgICAgICBtX2NvbnRl
bnRzRmlsdGVyLnJlbW92ZShrZXkuaGFzaCgpKTsKKyAgICBpZiAobV9jb250ZW50c0ZpbHRlci5t
YXlDb250YWluKGtleS5zaG9ydEhhc2goKSkpCisgICAgICAgIG1fY29udGVudHNGaWx0ZXIucmVt
b3ZlKGtleS5zaG9ydEhhc2goKSk7CiAKICAgICBTdHJpbmdDYXB0dXJlIGZpbGVQYXRoQ2FwdHVy
ZShmaWxlUGF0aEZvcktleShrZXksIG1fZGlyZWN0b3J5UGF0aCkpOwogICAgIGRpc3BhdGNoX2Fz
eW5jKG1faW9RdWV1ZS5nZXQoKSwgW3RoaXMsIGZpbGVQYXRoQ2FwdHVyZV0gewpAQCAtNDMwLDcg
KzQ0MCw3IEBAIHZvaWQgTmV0d29ya0NhY2hlU3RvcmFnZTo6cmV0cmlldmUoY29uc3QKICAgICBB
U1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogICAgIEFTU0VSVChwcmlvcml0eSA8PSBtYXhpbXVt
UmV0cmlldmVQcmlvcml0eSk7CiAKLSAgICBpZiAoIW1fY29udGVudHNGaWx0ZXIubWF5Q29udGFp
bihrZXkuaGFzaCgpKSkgeworICAgIGlmICghbV9jb250ZW50c0ZpbHRlci5tYXlDb250YWluKGtl
eS5zaG9ydEhhc2goKSkpIHsKICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobnVsbHB0cik7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CkBAIC00NDksNyArNDU5LDcgQEAgdm9pZCBOZXR3b3JrQ2Fj
aGVTdG9yYWdlOjpzdG9yZShjb25zdCBOZQogewogICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4o
KSk7CiAKLSAgICBtX2NvbnRlbnRzRmlsdGVyLmFkZChrZXkuaGFzaCgpKTsKKyAgICBtX2NvbnRl
bnRzRmlsdGVyLmFkZChrZXkuc2hvcnRIYXNoKCkpOwogICAgICsrbV9hcHByb3hpbWF0ZUVudHJ5
Q291bnQ7CiAKICAgICBhdXRvIHN0b3JlT3BlcmF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxTdG9y
ZU9wZXJhdGlvbj4oU3RvcmVPcGVyYXRpb24geyBrZXksIGVudHJ5LCBXVEY6Om1vdmUoY29tcGxl
dGlvbkhhbmRsZXIpIH0pOwpAQCAtNDcwLDggKzQ4MCw4IEBAIHZvaWQgTmV0d29ya0NhY2hlU3Rv
cmFnZTo6c3RvcmUoY29uc3QgTmUKICAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQoZG9uZSwgZG9u
ZSk7CiAgICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2Vz
cykgd3JpdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7CiAgICAgICAgICAgICBpZiAoZXJy
b3IpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9jb250ZW50c0ZpbHRlci5tYXlDb250YWluKHN0
b3JlLmtleS5oYXNoKCkpKQotICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRzRmlsdGVyLnJl
bW92ZShzdG9yZS5rZXkuaGFzaCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobV9jb250ZW50c0Zp
bHRlci5tYXlDb250YWluKHN0b3JlLmtleS5zaG9ydEhhc2goKSkpCisgICAgICAgICAgICAgICAg
ICAgIG1fY29udGVudHNGaWx0ZXIucmVtb3ZlKHN0b3JlLmtleS5zaG9ydEhhc2goKSk7CiAgICAg
ICAgICAgICAgICAgaWYgKG1fYXBwcm94aW1hdGVFbnRyeUNvdW50KQogICAgICAgICAgICAgICAg
ICAgICAtLW1fYXBwcm94aW1hdGVFbnRyeUNvdW50OwogICAgICAgICAgICAgfQpAQCAtNDkzLDcg
KzUwMyw3IEBAIHZvaWQgTmV0d29ya0NhY2hlU3RvcmFnZTo6dXBkYXRlKGNvbnN0IE4KIHsKICAg
ICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogCi0gICAgaWYgKCFtX2NvbnRlbnRzRmlsdGVy
Lm1heUNvbnRhaW4oa2V5Lmhhc2goKSkpIHsKKyAgICBpZiAoIW1fY29udGVudHNGaWx0ZXIubWF5
Q29udGFpbihrZXkuc2hvcnRIYXNoKCkpKSB7CiAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9y
YWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBleGlzdGluZyBlbnRyeSBub3QgZm91bmQsIHN0b3Jpbmcg
ZnVsbCBlbnRyeSIpOwogICAgICAgICBzdG9yZShrZXksIHVwZGF0ZUVudHJ5LCBXVEY6Om1vdmUo
Y29tcGxldGlvbkhhbmRsZXIpKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNTk5LDkgKzYwOSwxMCBA
QCB2b2lkIE5ldHdvcmtDYWNoZVN0b3JhZ2U6OnNocmlua0lmTmVlZGVkCiAgICAgICAgICAgICBO
ZXR3b3JrQ2FjaGVLZXk6Okhhc2hUeXBlIGhhc2g7CiAgICAgICAgICAgICBpZiAoIU5ldHdvcmtD
YWNoZUtleTo6c3RyaW5nVG9IYXNoKGZpbGVOYW1lLCBoYXNoKSkKICAgICAgICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfbWFpbl9xdWV1
ZSgpLCBbdGhpcywgaGFzaF0gewotICAgICAgICAgICAgICAgIGlmIChtX2NvbnRlbnRzRmlsdGVy
Lm1heUNvbnRhaW4oaGFzaCkpCi0gICAgICAgICAgICAgICAgICAgIG1fY29udGVudHNGaWx0ZXIu
cmVtb3ZlKGhhc2gpOworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnRIYXNoID0gTmV0d29ya0Nh
Y2hlS2V5Ojp0b1Nob3J0SGFzaChoYXNoKTsKKyAgICAgICAgICAgIGRpc3BhdGNoX2FzeW5jKGRp
c3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIFt0aGlzLCBzaG9ydEhhc2hdIHsKKyAgICAgICAgICAg
ICAgICBpZiAobV9jb250ZW50c0ZpbHRlci5tYXlDb250YWluKHNob3J0SGFzaCkpCisgICAgICAg
ICAgICAgICAgICAgIG1fY29udGVudHNGaWx0ZXIucmVtb3ZlKHNob3J0SGFzaCk7CiAgICAgICAg
ICAgICB9KTsKICAgICAgICAgfSk7CiAgICAgICAgIG1fYXBwcm94aW1hdGVFbnRyeUNvdW50ID0g
Zm91bmRFbnRyeUNvdW50IC0gZGVsZXRlZENvdW50OwpAQCAtNjExLDYgKzYyMiwyNCBAQCB2b2lk
IE5ldHdvcmtDYWNoZVN0b3JhZ2U6OnNocmlua0lmTmVlZGVkCiAgICAgfSk7CiB9CiAKK3ZvaWQg
TmV0d29ya0NhY2hlU3RvcmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMoKQoreworICAgIC8vIERlbGV0
ZSBWMSBjYWNoZS4KKyAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9iYXNlRGly
ZWN0b3J5UGF0aCk7CisgICAgZGlzcGF0Y2hfYXN5bmMobV9iYWNrZ3JvdW5kSU9RdWV1ZS5nZXQo
KSwgW2NhY2hlUGF0aENhcHR1cmVdIHsKKyAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNhY2hl
UGF0aENhcHR1cmUuc3RyaW5nKCk7CisgICAgICAgIHRyYXZlcnNlRGlyZWN0b3J5KGNhY2hlUGF0
aCwgRFRfRElSLCBbJmNhY2hlUGF0aF0oY29uc3QgU3RyaW5nJiBzdWJkaXJOYW1lKSB7CisgICAg
ICAgICAgICBpZiAoc3ViZGlyTmFtZS5zdGFydHNXaXRoKHZlcnNpb25EaXJlY3RvcnlTdWZmaXgp
KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0aXRpb25Q
YXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNhY2hlUGF0aCwgc3ViZGly
TmFtZSk7CisgICAgICAgICAgICB0cmF2ZXJzZURpcmVjdG9yeShwYXJ0aXRpb25QYXRoLCBEVF9S
RUcsIFsmcGFydGl0aW9uUGF0aF0oY29uc3QgU3RyaW5nJiBmaWxlTmFtZSkgeworICAgICAgICAg
ICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9u
ZW50KHBhcnRpdGlvblBhdGgsIGZpbGVOYW1lKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAg
ICAgIFdlYkNvcmU6OmRlbGV0ZUVtcHR5RGlyZWN0b3J5KHBhcnRpdGlvblBhdGgpOworICAgICAg
ICB9KTsKKyAgICB9KTsKK30KKwogfQogCiAjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>246209</attachid>
            <date>2015-02-07 06:16:26 -0800</date>
            <delta_ts>2015-02-07 08:33:05 -0800</delta_ts>
            <desc>patch2</desc>
            <filename>disk-cache-md5-2.patch</filename>
            <type>text/plain</type>
            <size>17359</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE3OTc3NykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU2IEBACisyMDE1LTAyLTA3ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBVc2UgbG9uZ2VyIGhhc2hlcyBm
b3IgY2FjaGUga2V5cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTQxMzU2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgVGhlIGN1cnJlbnQga2V5IGhhc2hlcyBhcmUgMzJiaXQuIFdlIHNob3VsZCB1c2UgbG9u
Z2VyIGhhc2hlcyB0byByZWR1Y2UgY29sbGlzaW9ucy4KKworICAgICAgICBUaGlzIHBhdGNoIHN3
aXRjaGVzIHVzIHRvIHVzaW5nIE1ENSBkaWdlc3RzIGZvciB0aGUgY2FjaGUga2V5IGhhc2hlcy4g
QXMgYSByZXN1bHQgdGhlIGZpbGUgbmFtZXMgZm9yIHRoZSBjYWNoZQorICAgICAgICBlbnRyaWVz
IGdyb3cgZnJvbSA4IHRvIDMyIGNoYXJhY3Rlci4KKworICAgICAgICBOb3RlIHRoYXQgd2UgZG9u
J3QgbmVlZCBhIGNyeXB0b2dyYXBoaWMgaGFzaCAoZnVsbCBjYWNoZSBrZXlzIGFyZSB2ZXJpZmll
ZCBhZ2FpbnN0IHRoZSBlbnRyaWVzKS4KKyAgICAgICAgTUQ1IGp1c3QgaGFwcGVucyB0byBiZSBm
YXN0LCBjb252ZW5pZW50IGFuZCBhdmFpbGFibGUuCisKKyAgICAgICAgVGhlIHBhdGNoIGFsc28g
bW92ZXMgdGhlIHdob2xlIGNhY2hlIGhpZXJhcmNoeSBkb3duIHRvIGEgdmVyc2lvbmVkIHN1YmRp
cmVjdG9yeSAoIldlYktpdENhY2hlL1ZlcnNpb24gMiIpCisgICAgICAgIGFuZCBkZWxldGVzIGFu
eSBvbGQgc3R5bGUgY2FjaGUgZmlsZXMgaWYgdGhleSBleGlzdC4KKworICAgICAgICAqIE5ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHA6CisgICAgICAgIChXZWJLaXQ6
Ok5ldHdvcmtDYWNoZUNvZGVyPE1ENTo6RGlnZXN0Pjo6ZW5jb2RlKToKKyAgICAgICAgKFdlYktp
dDo6TmV0d29ya0NhY2hlQ29kZXI8TUQ1OjpEaWdlc3Q+OjpkZWNvZGUpOgorICAgICAgICAqIE5l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5oOgorICAgICAgICAqIE5ldHdv
cmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUtleS5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok5l
dHdvcmtDYWNoZUtleTo6TmV0d29ya0NhY2hlS2V5KToKKyAgICAgICAgKFdlYktpdDo6aGFzaFN0
cmluZyk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZUtleTo6Y29tcHV0ZUhhc2gpOgor
ICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVLZXk6Omhhc2hBc1N0cmluZyk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZUtleTo6c3RyaW5nVG9IYXNoKToKKyAgICAgICAgKiBOZXR3
b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVLZXkuaDoKKyAgICAgICAgKFdlYktpdDo6TmV0
d29ya0NhY2hlS2V5OjpzaG9ydEhhc2gpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVL
ZXk6OnRvU2hvcnRIYXNoKToKKworICAgICAgICAgICAgMzJiaXQgaGFzaCB0byB1c2UgaW4gdGhl
IGJsb29tIGZpbHRlci4KKworICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVLZXk6Omhhc2hT
dHJpbmdMZW5ndGgpOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNo
ZVN0b3JhZ2UuaDoKKworICAgICAgICAgICAgQnVtcCB0aGUgdmVyc2lvbi4KKworICAgICAgICAq
IE5ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2VDb2NvYS5tbToKKyAgICAg
ICAgKFdlYktpdDo6dHJhdmVyc2VDYWNoZUZpbGVzKToKKyAgICAgICAgKFdlYktpdDo6bWFrZVZl
cnNpb25lZERpcmVjdG9yeVBhdGgpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVTdG9y
YWdlOjpOZXR3b3JrQ2FjaGVTdG9yYWdlKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hl
U3RvcmFnZTo6aW5pdGlhbGl6ZSk6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZVN0b3Jh
Z2U6OnJlbW92ZUVudHJ5KToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya0NhY2hlU3RvcmFnZTo6
cmV0cmlldmUpOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrQ2FjaGVTdG9yYWdlOjpzdG9yZSk6
CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtDYWNoZVN0b3JhZ2U6OnVwZGF0ZSk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtDYWNoZVN0b3JhZ2U6OnNocmlua0lmTmVlZGVkKToKKyAgICAgICAg
KFdlYktpdDo6TmV0d29ya0NhY2hlU3RvcmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMpOgorCisgICAg
ICAgICAgICBXaXBlIG91dCB0aGUgdmVyc2lvbiAxIGNhY2hlLgorCiAyMDE1LTAyLTA2ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAgSGF2ZSBTUUxpdGVTdGF0ZW1l
bnQ6OmRhdGFiYXNlKCkgcmV0dXJuIGEgcmVmZXJlbmNlCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9O
ZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUNvZGVycy5j
cHAJKHJldmlzaW9uIDE3OTc2NCkKKysrIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZUNvZGVycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxNC0yMDE1IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTcz
LDYgKzE3MywyMSBAQCBib29sIE5ldHdvcmtDYWNoZUNvZGVyPFdlYkNvcmU6OkNlcnRpZmljCiAg
ICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgTmV0d29ya0NhY2hlQ29kZXI8TUQ1OjpEaWdlc3Q+
OjplbmNvZGUoTmV0d29ya0NhY2hlRW5jb2RlciYgZW5jb2RlciwgY29uc3QgTUQ1OjpEaWdlc3Qm
IGRpZ2VzdCkKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkaWdlc3QpID09IDIgKiBzaXpl
b2YodWludDY0X3QpLCAiIik7CisgICAgYXV0byBkYXRhNjQgPSByZWludGVycHJldF9jYXN0PGNv
bnN0IHVpbnQ2NF90Kj4oZGlnZXN0LmRhdGEoKSk7CisgICAgZW5jb2RlciA8PCBkYXRhNjRbMF07
CisgICAgZW5jb2RlciA8PCBkYXRhNjRbMV07Cit9CisKK2Jvb2wgTmV0d29ya0NhY2hlQ29kZXI8
TUQ1OjpEaWdlc3Q+OjpkZWNvZGUoTmV0d29ya0NhY2hlRGVjb2RlciYgZGVjb2RlciwgTUQ1OjpE
aWdlc3QmIGRpZ2VzdCkKK3sKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkaWdlc3QpID09IDIg
KiBzaXplb2YodWludDY0X3QpLCAiIik7CisgICAgYXV0byBkYXRhNjQgPSByZWludGVycHJldF9j
YXN0PHVpbnQ2NF90Kj4oZGlnZXN0LmRhdGEoKSk7CisgICAgcmV0dXJuIGRlY29kZXIuZGVjb2Rl
KGRhdGE2NFswXSkgJiYgZGVjb2Rlci5kZWNvZGUoZGF0YTY0WzFdKTsKK30KKwogfQogCiAjZW5k
aWYKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNo
ZUNvZGVycy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZUNvZGVycy5oCShyZXZpc2lvbiAxNzk3NjQpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVDb2RlcnMuaAkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTQgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDE0
LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4K
ICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvbWQ1Lmg+CiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCkBAIC0yNTUsNiArMjU2LDEx
IEBAIHRlbXBsYXRlPD4gc3RydWN0IE5ldHdvcmtDYWNoZUNvZGVyPFdlYkMKICAgICBzdGF0aWMg
Ym9vbCBkZWNvZGUoTmV0d29ya0NhY2hlRGVjb2RlciYsIFdlYkNvcmU6OkNlcnRpZmljYXRlSW5m
byYpOwogfTsKIAordGVtcGxhdGU8PiBzdHJ1Y3QgTmV0d29ya0NhY2hlQ29kZXI8TUQ1OjpEaWdl
c3Q+IHsKKyAgICBzdGF0aWMgdm9pZCBlbmNvZGUoTmV0d29ya0NhY2hlRW5jb2RlciYsIGNvbnN0
IE1ENTo6RGlnZXN0Jik7CisgICAgc3RhdGljIGJvb2wgZGVjb2RlKE5ldHdvcmtDYWNoZURlY29k
ZXImLCBNRDU6OkRpZ2VzdCYpOworfTsKKwogfQogCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZUtleS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlS2V5LmNw
cAkocmV2aXNpb24gMTc5NzY0KQorKysgU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2Fj
aGUvTmV0d29ya0NhY2hlS2V5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw2ICsyOSw3IEBACiAjaWYg
RU5BQkxFKE5FVFdPUktfQ0FDSEUpCiAKICNpbmNsdWRlICJOZXR3b3JrQ2FjaGVDb2RlcnMuaCIK
KyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCkBA
IC01NiwzMCArNTcsNDUgQEAgTmV0d29ya0NhY2hlS2V5OjpOZXR3b3JrQ2FjaGVLZXkoY29uc3Qg
UwogewogfQogCi1zdGF0aWMgTmV0d29ya0NhY2hlS2V5OjpIYXNoVHlwZSBoYXNoU3RyaW5nKGNv
bnN0IFN0cmluZyYgc3RyaW5nKQorc3RhdGljIHZvaWQgaGFzaFN0cmluZyhNRDUmIG1kNSwgY29u
c3QgU3RyaW5nJiBzdHJpbmcpCiB7Ci0gICAgLy8gU3RyaW5nOjpoYXNoKCkgbWFza3MgYXdheSB0
aGUgdG9wIGJpdHMuCi0gICAgaWYgKHN0cmluZy5pczhCaXQoKSkKLSAgICAgICAgcmV0dXJuIFN0
cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2goc3RyaW5nLmNoYXJhY3RlcnM4KCksIHN0cmluZy5sZW5n
dGgoKSk7Ci0gICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6Y29tcHV0ZUhhc2goc3RyaW5nLmNoYXJh
Y3RlcnMxNigpLCBzdHJpbmcubGVuZ3RoKCkpOworICAgIGlmIChzdHJpbmcuaXM4Qml0KCkpIHsK
KyAgICAgICAgbWQ1LmFkZEJ5dGVzKHN0cmluZy5jaGFyYWN0ZXJzOCgpLCBzdHJpbmcubGVuZ3Ro
KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gY1N0cmluZyA9IHN0cmluZy51
dGY4KCk7CisgICAgbWQ1LmFkZEJ5dGVzKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+
KGNTdHJpbmcuZGF0YSgpKSwgY1N0cmluZy5sZW5ndGgoKSk7CiB9CiAKIE5ldHdvcmtDYWNoZUtl
eTo6SGFzaFR5cGUgTmV0d29ya0NhY2hlS2V5Ojpjb21wdXRlSGFzaCgpIGNvbnN0CiB7Ci0gICAg
cmV0dXJuIFdURjo6cGFpckludEhhc2goaGFzaFN0cmluZyhtX21ldGhvZCksIFdURjo6cGFpcklu
dEhhc2goaGFzaFN0cmluZyhtX2lkZW50aWZpZXIpLCBoYXNoU3RyaW5nKG1fcGFydGl0aW9uKSkp
OworICAgIC8vIFdlIGRvbid0IHJlYWxseSBuZWVkIGEgY3J5cHRvZ3JhcGhpYyBoYXNoLiBUaGUg
a2V5IGlzIGFsd2F5cyB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBlbnRyeSBoZWFkZXIuCisgICAgLy8g
TUQ1IGp1c3QgaGFwcGVucyB0byBiZSBzdWl0YWJseSBzaXplZCwgZmFzdCBhbmQgYXZhaWxhYmxl
LgorICAgIE1ENSBtZDU7CisgICAgaGFzaFN0cmluZyhtZDUsIG1fbWV0aG9kKTsKKyAgICBoYXNo
U3RyaW5nKG1kNSwgbV9wYXJ0aXRpb24pOworICAgIGhhc2hTdHJpbmcobWQ1LCBtX2lkZW50aWZp
ZXIpOworICAgIE1ENTo6RGlnZXN0IGhhc2g7CisgICAgbWQ1LmNoZWNrc3VtKGhhc2gpOworICAg
IHJldHVybiBoYXNoOwogfQogCiBTdHJpbmcgTmV0d29ya0NhY2hlS2V5OjpoYXNoQXNTdHJpbmco
KSBjb25zdAogewotICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTA4eCIsIG1faGFzaCk7Cisg
ICAgYXV0byogZGF0YTY0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KG1faGFz
aC5kYXRhKCkpOworICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTAxNmxseCUwMTZsbHgiLCBk
YXRhNjRbMF0sIGRhdGE2NFsxXSk7CiB9CiAKIGJvb2wgTmV0d29ya0NhY2hlS2V5OjpzdHJpbmdU
b0hhc2goY29uc3QgU3RyaW5nJiBzdHJpbmcsIEhhc2hUeXBlJiBoYXNoKQogewotICAgIGlmIChz
dHJpbmcubGVuZ3RoKCkgIT0gOCkKKyAgICBpZiAoc3RyaW5nLmxlbmd0aCgpICE9IGhhc2hTdHJp
bmdMZW5ndGgoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGF1dG8qIGRhdGE2NCA9IHJl
aW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihoYXNoLmRhdGEoKSk7CisgICAgYXV0byBoaWdoU3Ry
aW5nID0gc3RyaW5nLmxlZnQoMTYpOworICAgIGF1dG8gbG93U3RyaW5nID0gc3RyaW5nLnN1YnN0
cmluZygxNiwgMTYpOwogICAgIGJvb2wgc3VjY2VzczsKLSAgICBoYXNoID0gc3RyaW5nLnRvVUlu
dFN0cmljdCgmc3VjY2VzcywgMTYpOworICAgIGRhdGE2NFswXSA9IGhpZ2hTdHJpbmcudG9VSW50
NjRTdHJpY3QoJnN1Y2Nlc3MsIDE2KTsKKyAgICBkYXRhNjRbMV0gPSBzdWNjZXNzID8gbG93U3Ry
aW5nLnRvVUludDY0U3RyaWN0KCZzdWNjZXNzLCAxNikgOiAwOwogICAgIHJldHVybiBzdWNjZXNz
OwogfQogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3Jr
Q2FjaGVLZXkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9j
YWNoZS9OZXR3b3JrQ2FjaGVLZXkuaAkocmV2aXNpb24gMTc5NzY0KQorKysgU291cmNlL1dlYktp
dDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlS2V5LmgJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAt
MjgsNiArMjgsNyBAQAogCiAjaWYgRU5BQkxFKE5FVFdPUktfQ0FDSEUpCiAKKyNpbmNsdWRlIDx3
dGYvbWQ1Lmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBX
ZWJLaXQgewpAQCAtMzcsNyArMzgsNyBAQCBjbGFzcyBOZXR3b3JrQ2FjaGVEZWNvZGVyOwogCiBj
bGFzcyBOZXR3b3JrQ2FjaGVLZXkgewogcHVibGljOgotICAgIHR5cGVkZWYgdW5zaWduZWQgSGFz
aFR5cGU7CisgICAgdHlwZWRlZiBNRDU6OkRpZ2VzdCBIYXNoVHlwZTsKIAogICAgIE5ldHdvcmtD
YWNoZUtleSgpIHsgfQogICAgIE5ldHdvcmtDYWNoZUtleShjb25zdCBOZXR3b3JrQ2FjaGVLZXkm
KTsKQEAgLTQ3LDExICs0OCwxNiBAQCBwdWJsaWM6CiAgICAgY29uc3QgU3RyaW5nJiBtZXRob2Qo
KSBjb25zdCB7IHJldHVybiBtX21ldGhvZDsgfQogICAgIGNvbnN0IFN0cmluZyYgcGFydGl0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV9wYXJ0aXRpb247IH0KICAgICBjb25zdCBTdHJpbmcmIGlkZW50
aWZpZXIoKSBjb25zdCB7IHJldHVybiBtX2lkZW50aWZpZXI7IH0KKwogICAgIEhhc2hUeXBlIGhh
c2goKSBjb25zdCB7IHJldHVybiBtX2hhc2g7IH0KKyAgICB1bnNpZ25lZCBzaG9ydEhhc2goKSBj
b25zdCAgeyByZXR1cm4gdG9TaG9ydEhhc2gobV9oYXNoKTsgfQogCi0gICAgU3RyaW5nIGhhc2hB
c1N0cmluZygpIGNvbnN0OworICAgIHN0YXRpYyB1bnNpZ25lZCB0b1Nob3J0SGFzaChjb25zdCBI
YXNoVHlwZSYgaGFzaCkgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQq
PihoYXNoLmRhdGEoKSk7IH0KICAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0hhc2goY29uc3QgU3Ry
aW5nJiwgSGFzaFR5cGUmKTsKIAorICAgIHN0YXRpYyBzaXplX3QgaGFzaFN0cmluZ0xlbmd0aCgp
IHsgcmV0dXJuIDIgKiBzaXplb2YobV9oYXNoKTsgfQorICAgIFN0cmluZyBoYXNoQXNTdHJpbmco
KSBjb25zdDsKKwogICAgIHZvaWQgZW5jb2RlKE5ldHdvcmtDYWNoZUVuY29kZXImKSBjb25zdDsK
ICAgICBzdGF0aWMgYm9vbCBkZWNvZGUoTmV0d29ya0NhY2hlRGVjb2RlciYsIE5ldHdvcmtDYWNo
ZUtleSYpOwogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3
b3JrQ2FjaGVTdG9yYWdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvTmV0d29ya1By
b2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZS5oCShyZXZpc2lvbiAxNzk3NjQpCisrKyBT
b3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNC0y
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtMTUzLDEyICsxNTMsMTMgQEAgcHVibGljOgogICAgIHZvaWQgc2V0TWF4
aW11bVNpemUoc2l6ZV90KTsKICAgICB2b2lkIGNsZWFyKCk7CiAKLSAgICBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgdmVyc2lvbiA9IDE7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHZlcnNpb24g
PSAyOwogCiBwcml2YXRlOgogICAgIE5ldHdvcmtDYWNoZVN0b3JhZ2UoY29uc3QgU3RyaW5nJiBk
aXJlY3RvcnlQYXRoKTsKIAogICAgIHZvaWQgaW5pdGlhbGl6ZSgpOworICAgIHZvaWQgZGVsZXRl
T2xkVmVyc2lvbnMoKTsKICAgICB2b2lkIHNocmlua0lmTmVlZGVkKCk7CiAKICAgICB2b2lkIHJl
bW92ZUVudHJ5KGNvbnN0IE5ldHdvcmtDYWNoZUtleSYpOwpAQCAtMTgzLDYgKzE4NCw3IEBAIHBy
aXZhdGU6CiAgICAgICAgIFN0b3JlQ29tcGxldGlvbkhhbmRsZXIgY29tcGxldGlvbkhhbmRsZXI7
CiAgICAgfTsKIAorICAgIGNvbnN0IFN0cmluZyBtX2Jhc2VEaXJlY3RvcnlQYXRoOwogICAgIGNv
bnN0IFN0cmluZyBtX2RpcmVjdG9yeVBhdGg7CiAKICAgICBzaXplX3QgbV9tYXhpbXVtU2l6ZSB7
IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgfTsKSW5kZXg6IFNvdXJjZS9XZWJL
aXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2VDb2NvYS5tbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2Fj
aGVTdG9yYWdlQ29jb2EubW0JKHJldmlzaW9uIDE3OTc2NCkKKysrIFNvdXJjZS9XZWJLaXQyL05l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2VDb2NvYS5tbQkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC00Miw2ICs0Miw3IEBACiBuYW1lc3BhY2UgV2ViS2l0IHsKIAogc3RhdGljIGNvbnN0IGNo
YXIqIG5ldHdvcmtDYWNoZVN1YmRpcmVjdG9yeSA9ICJXZWJLaXRDYWNoZSI7CitzdGF0aWMgY29u
c3QgY2hhciogdmVyc2lvbkRpcmVjdG9yeVByZWZpeCA9ICJWZXJzaW9uICI7CiAKIHRlbXBsYXRl
IDx0eXBlbmFtZSBGdW5jdGlvbj4KIHN0YXRpYyB2b2lkIHRyYXZlcnNlRGlyZWN0b3J5KGNvbnN0
IFN0cmluZyYgcGF0aCwgdWludDhfdCB0eXBlLCBjb25zdCBGdW5jdGlvbiYgZnVuY3Rpb24pCkBA
IC02Niw3ICs2Nyw3IEBAIHN0YXRpYyB2b2lkIHRyYXZlcnNlQ2FjaGVGaWxlcyhjb25zdCBTdHIK
ICAgICB0cmF2ZXJzZURpcmVjdG9yeShjYWNoZVBhdGgsIERUX0RJUiwgWyZjYWNoZVBhdGgsICZm
dW5jdGlvbl0oY29uc3QgU3RyaW5nJiBzdWJkaXJOYW1lKSB7CiAgICAgICAgIFN0cmluZyBwYXJ0
aXRpb25QYXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNhY2hlUGF0aCwg
c3ViZGlyTmFtZSk7CiAgICAgICAgIHRyYXZlcnNlRGlyZWN0b3J5KHBhcnRpdGlvblBhdGgsIERU
X1JFRywgWyZmdW5jdGlvbiwgJnBhcnRpdGlvblBhdGhdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUp
IHsKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5sZW5ndGgoKSAhPSA4KQorICAgICAgICAgICAg
aWYgKGZpbGVOYW1lLmxlbmd0aCgpICE9IE5ldHdvcmtDYWNoZUtleTo6aGFzaFN0cmluZ0xlbmd0
aCgpKQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIGZ1bmN0aW9uKGZpbGVO
YW1lLCBwYXJ0aXRpb25QYXRoKTsKICAgICAgICAgfSk7CkBAIC0xMTYsMTMgKzExNywyMSBAQCBz
dGQ6OnVuaXF1ZV9wdHI8TmV0d29ya0NhY2hlU3RvcmFnZT4gTmV0CiAgICAgcmV0dXJuIHN0ZDo6
dW5pcXVlX3B0cjxOZXR3b3JrQ2FjaGVTdG9yYWdlPihuZXcgTmV0d29ya0NhY2hlU3RvcmFnZShu
ZXR3b3JrQ2FjaGVQYXRoKSk7CiB9CiAKLU5ldHdvcmtDYWNoZVN0b3JhZ2U6Ok5ldHdvcmtDYWNo
ZVN0b3JhZ2UoY29uc3QgU3RyaW5nJiBkaXJlY3RvcnlQYXRoKQotICAgIDogbV9kaXJlY3RvcnlQ
YXRoKGRpcmVjdG9yeVBhdGgpCitzdGF0aWMgU3RyaW5nIG1ha2VWZXJzaW9uZWREaXJlY3RvcnlQ
YXRoKGNvbnN0IFN0cmluZyYgYmFzZURpcmVjdG9yeVBhdGgpCit7CisgICAgU3RyaW5nIHZlcnNp
b25TdWJkaXJlY3RvcnkgPSBTdHJpbmcodmVyc2lvbkRpcmVjdG9yeVByZWZpeCkgKyBTdHJpbmc6
Om51bWJlcihOZXR3b3JrQ2FjaGVTdG9yYWdlOjp2ZXJzaW9uKTsKKyAgICByZXR1cm4gV2ViQ29y
ZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGJhc2VEaXJlY3RvcnlQYXRoLCB2ZXJzaW9uU3Vi
ZGlyZWN0b3J5KTsKK30KKworTmV0d29ya0NhY2hlU3RvcmFnZTo6TmV0d29ya0NhY2hlU3RvcmFn
ZShjb25zdCBTdHJpbmcmIGJhc2VEaXJlY3RvcnlQYXRoKQorICAgIDogbV9iYXNlRGlyZWN0b3J5
UGF0aChiYXNlRGlyZWN0b3J5UGF0aCkKKyAgICAsIG1fZGlyZWN0b3J5UGF0aChtYWtlVmVyc2lv
bmVkRGlyZWN0b3J5UGF0aChiYXNlRGlyZWN0b3J5UGF0aCkpCiAgICAgLCBtX2lvUXVldWUoYWRv
cHREaXNwYXRjaChkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuQ2FjaGUu
U3RvcmFnZSIsIERJU1BBVENIX1FVRVVFX0NPTkNVUlJFTlQpKSkKICAgICAsIG1fYmFja2dyb3Vu
ZElPUXVldWUoYWRvcHREaXNwYXRjaChkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoImNvbS5hcHBsZS5X
ZWJLaXQuQ2FjaGUuU3RvcmFnZS5CYWNrZ3JvdW5kIiwgRElTUEFUQ0hfUVVFVUVfQ09OQ1VSUkVO
VCkpKQogewogICAgIGRpc3BhdGNoX3NldF90YXJnZXRfcXVldWUobV9iYWNrZ3JvdW5kSU9RdWV1
ZS5nZXQoKSwgZGlzcGF0Y2hfZ2V0X2dsb2JhbF9xdWV1ZShESVNQQVRDSF9RVUVVRV9QUklPUklU
WV9CQUNLR1JPVU5ELCAwKSk7CiAKKyAgICBkZWxldGVPbGRWZXJzaW9ucygpOwogICAgIGluaXRp
YWxpemUoKTsKIH0KIApAQCAtMTM5LDggKzE0OCw5IEBAIHZvaWQgTmV0d29ya0NhY2hlU3RvcmFn
ZTo6aW5pdGlhbGl6ZSgpCiAgICAgICAgICAgICBOZXR3b3JrQ2FjaGVLZXk6Okhhc2hUeXBlIGhh
c2g7CiAgICAgICAgICAgICBpZiAoIU5ldHdvcmtDYWNoZUtleTo6c3RyaW5nVG9IYXNoKGZpbGVO
YW1lLCBoYXNoKSkKICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBkaXNwYXRj
aF9hc3luYyhkaXNwYXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBbdGhpcywgaGFzaF0gewotICAgICAg
ICAgICAgICAgIG1fY29udGVudHNGaWx0ZXIuYWRkKGhhc2gpOworICAgICAgICAgICAgdW5zaWdu
ZWQgc2hvcnRIYXNoID0gTmV0d29ya0NhY2hlS2V5Ojp0b1Nob3J0SGFzaChoYXNoKTsKKyAgICAg
ICAgICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIFt0aGlzLCBz
aG9ydEhhc2hdIHsKKyAgICAgICAgICAgICAgICBtX2NvbnRlbnRzRmlsdGVyLmFkZChzaG9ydEhh
c2gpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICArK2VudHJ5Q291bnQ7CiAgICAgICAg
IH0pOwpAQCAtMzQ0LDggKzM1NCw4IEBAIHZvaWQgTmV0d29ya0NhY2hlU3RvcmFnZTo6cmVtb3Zl
RW50cnkoY28KIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogCi0gICAgaWYgKG1f
Y29udGVudHNGaWx0ZXIubWF5Q29udGFpbihrZXkuaGFzaCgpKSkKLSAgICAgICAgbV9jb250ZW50
c0ZpbHRlci5yZW1vdmUoa2V5Lmhhc2goKSk7CisgICAgaWYgKG1fY29udGVudHNGaWx0ZXIubWF5
Q29udGFpbihrZXkuc2hvcnRIYXNoKCkpKQorICAgICAgICBtX2NvbnRlbnRzRmlsdGVyLnJlbW92
ZShrZXkuc2hvcnRIYXNoKCkpOwogCiAgICAgU3RyaW5nQ2FwdHVyZSBmaWxlUGF0aENhcHR1cmUo
ZmlsZVBhdGhGb3JLZXkoa2V5LCBtX2RpcmVjdG9yeVBhdGgpKTsKICAgICBkaXNwYXRjaF9hc3lu
YyhtX2lvUXVldWUuZ2V0KCksIFt0aGlzLCBmaWxlUGF0aENhcHR1cmVdIHsKQEAgLTQzMCw3ICs0
NDAsNyBAQCB2b2lkIE5ldHdvcmtDYWNoZVN0b3JhZ2U6OnJldHJpZXZlKGNvbnN0CiAgICAgQVNT
RVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKICAgICBBU1NFUlQocHJpb3JpdHkgPD0gbWF4aW11bVJl
dHJpZXZlUHJpb3JpdHkpOwogCi0gICAgaWYgKCFtX2NvbnRlbnRzRmlsdGVyLm1heUNvbnRhaW4o
a2V5Lmhhc2goKSkpIHsKKyAgICBpZiAoIW1fY29udGVudHNGaWx0ZXIubWF5Q29udGFpbihrZXku
c2hvcnRIYXNoKCkpKSB7CiAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKG51bGxwdHIpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQpAQCAtNDQ5LDcgKzQ1OSw3IEBAIHZvaWQgTmV0d29ya0NhY2hl
U3RvcmFnZTo6c3RvcmUoY29uc3QgTmUKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkp
OwogCi0gICAgbV9jb250ZW50c0ZpbHRlci5hZGQoa2V5Lmhhc2goKSk7CisgICAgbV9jb250ZW50
c0ZpbHRlci5hZGQoa2V5LnNob3J0SGFzaCgpKTsKICAgICArK21fYXBwcm94aW1hdGVFbnRyeUNv
dW50OwogCiAgICAgYXV0byBzdG9yZU9wZXJhdGlvbiA9IHN0ZDo6bWFrZV91bmlxdWU8U3RvcmVP
cGVyYXRpb24+KFN0b3JlT3BlcmF0aW9uIHsga2V5LCBlbnRyeSwgV1RGOjptb3ZlKGNvbXBsZXRp
b25IYW5kbGVyKSB9KTsKQEAgLTQ3MCw4ICs0ODAsOCBAQCB2b2lkIE5ldHdvcmtDYWNoZVN0b3Jh
Z2U6OnN0b3JlKGNvbnN0IE5lCiAgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGRvbmUsIGRvbmUp
OwogICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3Mp
IHdyaXRlIGNvbXBsZXRlIGVycm9yPSVkIiwgZXJyb3IpOwogICAgICAgICAgICAgaWYgKGVycm9y
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fY29udGVudHNGaWx0ZXIubWF5Q29udGFpbihzdG9y
ZS5rZXkuaGFzaCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbV9jb250ZW50c0ZpbHRlci5yZW1v
dmUoc3RvcmUua2V5Lmhhc2goKSk7CisgICAgICAgICAgICAgICAgaWYgKG1fY29udGVudHNGaWx0
ZXIubWF5Q29udGFpbihzdG9yZS5rZXkuc2hvcnRIYXNoKCkpKQorICAgICAgICAgICAgICAgICAg
ICBtX2NvbnRlbnRzRmlsdGVyLnJlbW92ZShzdG9yZS5rZXkuc2hvcnRIYXNoKCkpOwogICAgICAg
ICAgICAgICAgIGlmIChtX2FwcHJveGltYXRlRW50cnlDb3VudCkKICAgICAgICAgICAgICAgICAg
ICAgLS1tX2FwcHJveGltYXRlRW50cnlDb3VudDsKICAgICAgICAgICAgIH0KQEAgLTQ5Myw3ICs1
MDMsNyBAQCB2b2lkIE5ldHdvcmtDYWNoZVN0b3JhZ2U6OnVwZGF0ZShjb25zdCBOCiB7CiAgICAg
QVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKIAotICAgIGlmICghbV9jb250ZW50c0ZpbHRlci5t
YXlDb250YWluKGtleS5oYXNoKCkpKSB7CisgICAgaWYgKCFtX2NvbnRlbnRzRmlsdGVyLm1heUNv
bnRhaW4oa2V5LnNob3J0SGFzaCgpKSkgewogICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFn
ZSwgIihOZXR3b3JrUHJvY2VzcykgZXhpc3RpbmcgZW50cnkgbm90IGZvdW5kLCBzdG9yaW5nIGZ1
bGwgZW50cnkiKTsKICAgICAgICAgc3RvcmUoa2V5LCB1cGRhdGVFbnRyeSwgV1RGOjptb3ZlKGNv
bXBsZXRpb25IYW5kbGVyKSk7CiAgICAgICAgIHJldHVybjsKQEAgLTU5OSw5ICs2MDksMTAgQEAg
dm9pZCBOZXR3b3JrQ2FjaGVTdG9yYWdlOjpzaHJpbmtJZk5lZWRlZAogICAgICAgICAgICAgTmV0
d29ya0NhY2hlS2V5OjpIYXNoVHlwZSBoYXNoOwogICAgICAgICAgICAgaWYgKCFOZXR3b3JrQ2Fj
aGVLZXk6OnN0cmluZ1RvSGFzaChmaWxlTmFtZSwgaGFzaCkpCiAgICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUo
KSwgW3RoaXMsIGhhc2hdIHsKLSAgICAgICAgICAgICAgICBpZiAobV9jb250ZW50c0ZpbHRlci5t
YXlDb250YWluKGhhc2gpKQotICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRzRmlsdGVyLnJl
bW92ZShoYXNoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0SGFzaCA9IE5ldHdvcmtDYWNo
ZUtleTo6dG9TaG9ydEhhc2goaGFzaCk7CisgICAgICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNw
YXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBbdGhpcywgc2hvcnRIYXNoXSB7CisgICAgICAgICAgICAg
ICAgaWYgKG1fY29udGVudHNGaWx0ZXIubWF5Q29udGFpbihzaG9ydEhhc2gpKQorICAgICAgICAg
ICAgICAgICAgICBtX2NvbnRlbnRzRmlsdGVyLnJlbW92ZShzaG9ydEhhc2gpOwogICAgICAgICAg
ICAgfSk7CiAgICAgICAgIH0pOwogICAgICAgICBtX2FwcHJveGltYXRlRW50cnlDb3VudCA9IGZv
dW5kRW50cnlDb3VudCAtIGRlbGV0ZWRDb3VudDsKQEAgLTYxMSw2ICs2MjIsMjQgQEAgdm9pZCBO
ZXR3b3JrQ2FjaGVTdG9yYWdlOjpzaHJpbmtJZk5lZWRlZAogICAgIH0pOwogfQogCit2b2lkIE5l
dHdvcmtDYWNoZVN0b3JhZ2U6OmRlbGV0ZU9sZFZlcnNpb25zKCkKK3sKKyAgICAvLyBEZWxldGUg
VjEgY2FjaGUuCisgICAgU3RyaW5nQ2FwdHVyZSBjYWNoZVBhdGhDYXB0dXJlKG1fYmFzZURpcmVj
dG9yeVBhdGgpOworICAgIGRpc3BhdGNoX2FzeW5jKG1fYmFja2dyb3VuZElPUXVldWUuZ2V0KCks
IFtjYWNoZVBhdGhDYXB0dXJlXSB7CisgICAgICAgIFN0cmluZyBjYWNoZVBhdGggPSBjYWNoZVBh
dGhDYXB0dXJlLnN0cmluZygpOworICAgICAgICB0cmF2ZXJzZURpcmVjdG9yeShjYWNoZVBhdGgs
IERUX0RJUiwgWyZjYWNoZVBhdGhdKGNvbnN0IFN0cmluZyYgc3ViZGlyTmFtZSkgeworICAgICAg
ICAgICAgaWYgKHN1YmRpck5hbWUuc3RhcnRzV2l0aCh2ZXJzaW9uRGlyZWN0b3J5UHJlZml4KSkK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uUGF0
aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChjYWNoZVBhdGgsIHN1YmRpck5h
bWUpOworICAgICAgICAgICAgdHJhdmVyc2VEaXJlY3RvcnkocGFydGl0aW9uUGF0aCwgRFRfUkVH
LCBbJnBhcnRpdGlvblBhdGhdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICAgICAgICAg
ICAgICBXZWJDb3JlOjpkZWxldGVGaWxlKFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVu
dChwYXJ0aXRpb25QYXRoLCBmaWxlTmFtZSkpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAg
ICBXZWJDb3JlOjpkZWxldGVFbXB0eURpcmVjdG9yeShwYXJ0aXRpb25QYXRoKTsKKyAgICAgICAg
fSk7CisgICAgfSk7Cit9CisKIH0KIAogI2VuZGlmCg==
</data>
<flag name="review"
          id="271139"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>