<?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>165978</bug_id>
          
          <creation_ts>2016-12-16 16:52:26 -0800</creation_ts>
          <short_desc>IndexedDB: Refactor SQLiteIDBCursor to prepare for cursor prefetching</short_desc>
          <delta_ts>2016-12-16 23:29:58 -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>WebCore Misc.</component>
          <version>WebKit 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>
          
          <blocked>160306</blocked>
    
    <blocked>165928</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brady Eidson">beidson</reporter>
          <assigned_to name="Brady Eidson">beidson</assigned_to>
          <cc>achristensen</cc>
    
    <cc>alecflett</cc>
    
    <cc>commit-queue</cc>
    
    <cc>jsbell</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1260825</commentid>
    <comment_count>0</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2016-12-16 16:52:26 -0800</bug_when>
    <thetext>IndexedDB: Refactor SQLiteIDBCursor to prepare for cursor prefetching

This patch won&apos;t actually add prefetching, but it puts all of the necessary pieces in place for it (including managing a &quot;fetched record&quot; queue of size 1)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260831</commentid>
    <comment_count>1</comment_count>
      <attachid>297376</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2016-12-16 17:00:05 -0800</bug_when>
    <thetext>Created attachment 297376
Patch v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260844</commentid>
    <comment_count>2</comment_count>
      <attachid>297376</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2016-12-16 18:22:29 -0800</bug_when>
    <thetext>Comment on attachment 297376
Patch v1

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

&gt; Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp:222
&gt; +        m_currentLowerKey = m_fetchedRecords.first().record.key;

All the calls to Deque::first except these two have assertions that the deque is not empty.  Deque::first has an internal assumption that it&apos;s not empty.  Should you add more assertions here or remove the others?

&gt; Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp:317
&gt; +    for (size_t i = 0; i &lt; count &amp;&amp; !m_fetchedRecords.isEmpty(); ++i) {
&gt; +        if (m_fetchedRecords.first().isTerminalRecord())

I don&apos;t see any bounds checking on the value of count other than making sure it&apos;s nonzero.  Are there tests that try to advance the cursor more than it can or put a negative/non-integer value into IDBCursor.advance?  I don&apos;t see any guarantee that this will continue to have a first value for the entire duration of this for loop.

&gt; Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp:350
&gt; +    ASSERT(m_fetchedRecords.isEmpty() || !m_fetchedRecords.last().isTerminalRecord());

If m_fetchedRecords is empty, m_fetchedRecords.last() will assert and read memory it shouldn&apos;t</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260846</commentid>
    <comment_count>3</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2016-12-16 18:39:44 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Comment on attachment 297376 [details]
&gt; Patch v1
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=297376&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp:222
&gt; &gt; +        m_currentLowerKey = m_fetchedRecords.first().record.key;
&gt; 
&gt; All the calls to Deque::first except these two have assertions that the
&gt; deque is not empty.  Deque::first has an internal assumption that it&apos;s not
&gt; empty.  Should you add more assertions here or remove the others?

Some places that don&apos;t have ASSERTs *do* have &quot;if (!deque.isEmpty())&quot; checks beforehand.

Each site that calls to first() should have *either* an ASSERT or an appropriate isEmpty() check.

I will go through and make sure they all have at least one of those.

&gt; &gt; Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp:317
&gt; &gt; +    for (size_t i = 0; i &lt; count &amp;&amp; !m_fetchedRecords.isEmpty(); ++i) {
&gt; &gt; +        if (m_fetchedRecords.first().isTerminalRecord())
&gt; 
&gt; I don&apos;t see any bounds checking on the value of count other than making sure
&gt; it&apos;s nonzero.  Are there tests that try to advance the cursor more than it
&gt; can or put a negative/non-integer value into IDBCursor.advance? 

Yes. Negative counts fail at the bindings level and &quot;advance more than it can&quot; is spec&apos;ed behavior.

e.g., if you advance 50 and there&apos;s only 4 left, you simply reach the end.

&gt; I don&apos;t see any guarantee that this will continue to have a first value for the entire
&gt; duration of this for loop.

The guarantee is in the for clause: ` i &lt; count &amp;&amp; !m_fetchedRecords.isEmpty();`

By making non-emptiness of the deque an invariant of the loop.

&gt; 
&gt; &gt; Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp:350
&gt; &gt; +    ASSERT(m_fetchedRecords.isEmpty() || !m_fetchedRecords.last().isTerminalRecord());
&gt; 
&gt; If m_fetchedRecords is empty, m_fetchedRecords.last() will assert and read
&gt; memory it shouldn&apos;t

Agreed, but this assertion never does that; If the m_fetchedRecords.last() code runs, the deque is definitely not empty.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260887</commentid>
    <comment_count>4</comment_count>
      <attachid>297391</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2016-12-16 22:45:24 -0800</bug_when>
    <thetext>Created attachment 297391
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260895</commentid>
    <comment_count>5</comment_count>
      <attachid>297391</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-16 23:29:55 -0800</bug_when>
    <thetext>Comment on attachment 297391
Patch

Clearing flags on attachment: 297391

Committed r209960: &lt;http://trac.webkit.org/changeset/209960&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260896</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-16 23:29:58 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297376</attachid>
            <date>2016-12-16 17:00:05 -0800</date>
            <delta_ts>2016-12-16 22:45:21 -0800</delta_ts>
            <desc>Patch v1</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>22188</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA1ZGI2OTk0Li40YTgwOTAwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDcg
QEAKKzIwMTYtMTItMTYgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgorCisgICAg
ICAgIEluZGV4ZWREQjogUmVmYWN0b3IgU1FMaXRlSURCQ3Vyc29yIHRvIHByZXBhcmUgZm9yIGN1
cnNvciBwcmVmZXRjaGluZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE2NTk3OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIE5vIG5ldyB0ZXN0cyAoUmVmYWN0b3IsIG5vIGJlaGF2aW9yIGNoYW5nZSkuCisg
ICAgICAgIAorICAgICAgICBJbiBwcmVwYXJhdGlvbiBmb3IgY3Vyc29yIHByZWZldGNoaW5nLCB3
ZSBuZWVkIHRvIHNoaWZ0IHRoZSBjdXJzb3Igb2ZmIG9mIGtlZXBpbmcgInRoZSBjdXJyZW50IHJl
Y29yZCIKKyAgICAgICAgYW5kIG9udG8ga2VlcGluZyAiYSBkZXF1ZSBvZiBmZXRjaGVkIHJlY29y
ZHMiLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggaXMgInRoZSBjdXJyZW50IHJlY29yZCIuCisgICAgICAg
IAorICAgICAgICBUaGlzIHBhdGNoIGRvZXMganVzdCB0aGF0LCBidXQgd2l0aCBubyBiZWhhdmlv
ciBjaGFuZ2U7IFRoZSBkZXF1ZSBvbmx5IGV2ZXIgaG9sZHMgMCBvciAxIHJlY29yZHMuCisKKyAg
ICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvU1FMaXRlSURCQ3Vyc29yLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50RGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6b2JqZWN0U3Rv
cmVSZWNvcmRzQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlE
QkN1cnNvcjo6cmVzZXRBbmRSZWJpbmRTdGF0ZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6SURC
U2VydmVyOjpTUUxpdGVJREJDdXJzb3I6OnByZWZldGNoKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjphZHZhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjpmZXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpJREJT
ZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6ZmV0Y2hOZXh0UmVjb3JkKToKKyAgICAgICAgKFdlYkNv
cmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjptYXJrQXNFcnJvcmVkKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjppbnRlcm5hbEZldGNoTmV4dFJl
Y29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6aXRl
cmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6Y3Vy
cmVudEtleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6
Y3VycmVudFByaW1hcnlLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxpdGVJ
REJDdXJzb3I6OmN1cnJlbnRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNR
TGl0ZUlEQkN1cnNvcjo6ZGlkQ29tcGxldGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVy
OjpTUUxpdGVJREJDdXJzb3I6OmRpZEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZl
cjo6U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50UmVjb3JkUm93SUQpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCU2VydmVyOjpTUUxpdGVJREJDdXJzb3I6OmFkdmFuY2VVbmlxdWUpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxpdGVJREJDdXJzb3I6OmFkdmFuY2VPbmNl
KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29y
OjppbnRlcm5hbEFkdmFuY2VPbmNlKTogRGVsZXRlZC4KKyAgICAgICAgCisgICAgICAgICogTW9k
dWxlcy9pbmRleGVkZGIvc2VydmVyL1NRTGl0ZUlEQkN1cnNvci5oOgorICAgICAgICAoV2ViQ29y
ZTo6SURCU2VydmVyOjpTUUxpdGVJREJDdXJzb3I6OlNRTGl0ZUN1cnNvclJlY29yZDo6aXNUZXJt
aW5hbFJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNv
cjo6Y3VycmVudFJlY29yZFJvd0lEKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlNl
cnZlcjo6U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50S2V5KTogRGVsZXRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50UHJpbWFyeUtleSk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6Y3Vy
cmVudFZhbHVlKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRl
SURCQ3Vyc29yOjpkaWRDb21wbGV0ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpJREJT
ZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6ZGlkRXJyb3IpOiBEZWxldGVkLgorCiAyMDE2LTEyLTE1
ICBBbGV4IENocmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
UmVtb3ZlIGZsZXggYW5kIGJpc29uIGJ1aWxkIGRlcGVuZGVuY2llczsgY29tbWl0IGdlbmVyYXRl
ZCBYUGF0aCBwYXJzZXIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhl
ZGRiL3NlcnZlci9TUUxpdGVJREJDdXJzb3IuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9p
bmRleGVkZGIvc2VydmVyL1NRTGl0ZUlEQkN1cnNvci5jcHAKaW5kZXggNzdlNjU5OS4uOTY2ZGQ5
OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1NR
TGl0ZUlEQkN1cnNvci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIv
c2VydmVyL1NRTGl0ZUlEQkN1cnNvci5jcHAKQEAgLTEwMSwxMyArMTAxLDE2IEBAIFNRTGl0ZUlE
QkN1cnNvcjo6flNRTGl0ZUlEQkN1cnNvcigpCiAKIHZvaWQgU1FMaXRlSURCQ3Vyc29yOjpjdXJy
ZW50RGF0YShJREJHZXRSZXN1bHQmIHJlc3VsdCkKIHsKLSAgICBpZiAobV9jdXJyZW50UmVjb3Jk
LmNvbXBsZXRlZCkgewotICAgICAgICBBU1NFUlQoIW1fY3VycmVudFJlY29yZC5lcnJvcmVkKTsK
KyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKworICAgIGF1dG8mIGN1
cnJlbnRSZWNvcmQgPSBtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCk7CisgICAgaWYgKGN1cnJlbnRS
ZWNvcmQuY29tcGxldGVkKSB7CisgICAgICAgIEFTU0VSVCghY3VycmVudFJlY29yZC5lcnJvcmVk
KTsKICAgICAgICAgcmVzdWx0ID0geyB9OwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAg
cmVzdWx0ID0geyBtX2N1cnJlbnRSZWNvcmQucmVjb3JkLmtleSwgbV9jdXJyZW50UmVjb3JkLnJl
Y29yZC5wcmltYXJ5S2V5LCBtX2N1cnJlbnRSZWNvcmQucmVjb3JkLnZhbHVlID8gKm1fY3VycmVu
dFJlY29yZC5yZWNvcmQudmFsdWUgOiBJREJWYWx1ZSgpIH07CisgICAgcmVzdWx0ID0geyBjdXJy
ZW50UmVjb3JkLnJlY29yZC5rZXksIGN1cnJlbnRSZWNvcmQucmVjb3JkLnByaW1hcnlLZXksIGN1
cnJlbnRSZWNvcmQucmVjb3JkLnZhbHVlID8gKmN1cnJlbnRSZWNvcmQucmVjb3JkLnZhbHVlIDog
SURCVmFsdWUoKSB9OwogfQogCiBzdGF0aWMgU3RyaW5nIGJ1aWxkSW5kZXhTdGF0ZW1lbnQoY29u
c3QgSURCS2V5UmFuZ2VEYXRhJiBrZXlSYW5nZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24g
Y3Vyc29yRGlyZWN0aW9uKQpAQCAtMjA2LDM4ICsyMDksMjQgQEAgYm9vbCBTUUxpdGVJREJDdXJz
b3I6OmNyZWF0ZVNRTGl0ZVN0YXRlbWVudChjb25zdCBTdHJpbmcmIHNxbCkKIAogdm9pZCBTUUxp
dGVJREJDdXJzb3I6Om9iamVjdFN0b3JlUmVjb3Jkc0NoYW5nZWQoKQogeworICAgIGlmIChtX3N0
YXRlbWVudE5lZWRzUmVzZXQpCisgICAgICAgIHJldHVybjsKKwogICAgIC8vIElmIE9iamVjdFN0
b3JlIG9yIEluZGV4IGNvbnRlbnRzIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHN0YXRl
bWVudCBhbmQgYmluZCBuZXcgcGFyYW1ldGVycyB0byBpdC4KICAgICAvLyBUaGlzIGlzIHRvIHBp
Y2sgdXAgYW55IGNoYW5nZXMgdGhhdCBtaWdodCBleGlzdC4KKyAgICAvLyBXZSBhbHNvIG5lZWQg
dG8gdGhyb3cgYXdheSBhbnkgZmV0Y2hlZCByZWNvcmRzIGFzIHRoZXkgbWF5IG5vIGxvbmdlciBi
ZSB2YWxpZC4KIAogICAgIG1fc3RhdGVtZW50TmVlZHNSZXNldCA9IHRydWU7Ci19Ci0KLXZvaWQg
U1FMaXRlSURCQ3Vyc29yOjpyZXNldEFuZFJlYmluZFN0YXRlbWVudCgpCi17Ci0gICAgQVNTRVJU
KCFtX2N1cnJlbnRMb3dlcktleS5pc051bGwoKSk7Ci0gICAgQVNTRVJUKCFtX2N1cnJlbnRVcHBl
cktleS5pc051bGwoKSk7Ci0gICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24tPnNxbGl0ZVRyYW5zYWN0
aW9uKCkpOwotICAgIEFTU0VSVChtX3N0YXRlbWVudCk7Ci0gICAgQVNTRVJUKG1fc3RhdGVtZW50
TmVlZHNSZXNldCk7Ci0KLSAgICBtX3N0YXRlbWVudE5lZWRzUmVzZXQgPSBmYWxzZTsKLQotICAg
IC8vIElmIHRoaXMgY3Vyc29yIG5ldmVyIGZldGNoZWQgYW55IHJlY29yZHMsIHdlIGRvbid0IG5l
ZWQgdG8gcmVzZXQgdGhlIHN0YXRlbWVudC4KLSAgICBpZiAobV9jdXJyZW50UmVjb3JkLnJlY29y
ZC5rZXkuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybjsKIAotICAgIC8vIE90aGVyd2lzZSB1cGRh
dGUgdGhlIGxvd2VyIGtleSBvciB1cHBlciBrZXkgdXNlZCBmb3IgdGhlIGN1cnNvciByYW5nZS4K
LSAgICAvLyBUaGlzIGlzIHNvIHRoZSBjdXJzb3IgY2FuIHBpY2sgdXAgd2hlcmUgd2UgbGVmdCBv
ZmYuCi0gICAgLy8gV2UgbWlnaHQgYWxzbyBoYXZlIHRvIGNoYW5nZSB0aGUgc3RhdGVtZW50IGZy
b20gY2xvc2VkIHRvIG9wZW4gc28gd2UgZG9uJ3QgcmVmZXRjaCB0aGUgY3VycmVudCBrZXkgYSBz
ZWNvbmQgdGltZS4KICAgICBpZiAobV9jdXJzb3JEaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJz
b3JEaXJlY3Rpb246Ok5leHQgfHwgbV9jdXJzb3JEaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJz
b3JEaXJlY3Rpb246Ok5leHROb0R1cGxpY2F0ZSkgewotICAgICAgICBtX2N1cnJlbnRMb3dlcktl
eSA9IG1fY3VycmVudFJlY29yZC5yZWNvcmQua2V5OworICAgICAgICBtX2N1cnJlbnRMb3dlcktl
eSA9IG1fZmV0Y2hlZFJlY29yZHMuZmlyc3QoKS5yZWNvcmQua2V5OwogICAgICAgICBpZiAoIW1f
a2V5UmFuZ2UubG93ZXJPcGVuKSB7CiAgICAgICAgICAgICBtX2tleVJhbmdlLmxvd2VyT3BlbiA9
IHRydWU7CiAgICAgICAgICAgICBtX2tleVJhbmdlLmxvd2VyS2V5ID0gbV9jdXJyZW50TG93ZXJL
ZXk7CiAgICAgICAgICAgICBtX3N0YXRlbWVudCA9IG51bGxwdHI7CiAgICAgICAgIH0KICAgICB9
IGVsc2UgewotICAgICAgICBtX2N1cnJlbnRVcHBlcktleSA9IG1fY3VycmVudFJlY29yZC5yZWNv
cmQua2V5OworICAgICAgICBtX2N1cnJlbnRVcHBlcktleSA9IG1fZmV0Y2hlZFJlY29yZHMuZmly
c3QoKS5yZWNvcmQua2V5OwogICAgICAgICBpZiAoIW1fa2V5UmFuZ2UudXBwZXJPcGVuKSB7CiAg
ICAgICAgICAgICBtX2tleVJhbmdlLnVwcGVyT3BlbiA9IHRydWU7CiAgICAgICAgICAgICBtX2tl
eVJhbmdlLnVwcGVyS2V5ID0gbV9jdXJyZW50VXBwZXJLZXk7CkBAIC0yNDUsNiArMjM0LDE4IEBA
IHZvaWQgU1FMaXRlSURCQ3Vyc29yOjpyZXNldEFuZFJlYmluZFN0YXRlbWVudCgpCiAgICAgICAg
IH0KICAgICB9CiAKKyAgICBtX2ZldGNoZWRSZWNvcmRzLmNsZWFyKCk7Cit9CisKK3ZvaWQgU1FM
aXRlSURCQ3Vyc29yOjpyZXNldEFuZFJlYmluZFN0YXRlbWVudCgpCit7CisgICAgQVNTRVJUKCFt
X2N1cnJlbnRMb3dlcktleS5pc051bGwoKSk7CisgICAgQVNTRVJUKCFtX2N1cnJlbnRVcHBlcktl
eS5pc051bGwoKSk7CisgICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24tPnNxbGl0ZVRyYW5zYWN0aW9u
KCkpOworICAgIEFTU0VSVChtX3N0YXRlbWVudE5lZWRzUmVzZXQpOworCisgICAgbV9zdGF0ZW1l
bnROZWVkc1Jlc2V0ID0gZmFsc2U7CisKICAgICBpZiAoIW1fc3RhdGVtZW50ICYmICFlc3RhYmxp
c2hTdGF0ZW1lbnQoKSkgewogICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBlc3RhYmxpc2gg
bmV3IHN0YXRlbWVudCBmb3IgY3Vyc29yIGl0ZXJhdGlvbiIpOwogICAgICAgICByZXR1cm47CkBA
IC0yODksMTI0ICsyOTAsMTYxIEBAIGJvb2wgU1FMaXRlSURCQ3Vyc29yOjpiaW5kQXJndW1lbnRz
KCkKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBTUUxpdGVJREJDdXJzb3I6OnByZWZldGNo
KCkKK3sKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKyAgICBpZiAo
bV9mZXRjaGVkUmVjb3Jkcy5sYXN0KCkuZXJyb3JlZCB8fCBtX2ZldGNoZWRSZWNvcmRzLmxhc3Qo
KS5jb21wbGV0ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY3VycmVudEtleUZvclVuaXF1
ZW5lc3MgPSBtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKS5yZWNvcmQua2V5OworICAgIGZldGNoKCk7
Cit9CisKIGJvb2wgU1FMaXRlSURCQ3Vyc29yOjphZHZhbmNlKHVpbnQ2NF90IGNvdW50KQogewot
ICAgIGJvb2wgaXNVbmlxdWUgPSBtX2N1cnNvckRpcmVjdGlvbiA9PSBJbmRleGVkREI6OkN1cnNv
ckRpcmVjdGlvbjo6TmV4dE5vRHVwbGljYXRlIHx8IG1fY3Vyc29yRGlyZWN0aW9uID09IEluZGV4
ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpQcmV2Tm9EdXBsaWNhdGU7CisgICAgQVNTRVJUKGNvdW50
KTsKIAotICAgIGlmIChtX2N1cnJlbnRSZWNvcmQuY29tcGxldGVkKSB7CisgICAgaWYgKCFtX2Zl
dGNoZWRSZWNvcmRzLmlzRW1wdHkoKSAmJiBtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkuaXNUZXJt
aW5hbFJlY29yZCgpKSB7CiAgICAgICAgIExPR19FUlJPUigiQXR0ZW1wdCB0byBhZHZhbmNlIGEg
Y29tcGxldGVkIGN1cnNvciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAg
aWYgKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSkKKyAgICAgICAgbV9jdXJyZW50S2V5Rm9y
VW5pcXVlbmVzcyA9IG1fZmV0Y2hlZFJlY29yZHMubGFzdCgpLnJlY29yZC5rZXk7CisKKyAgICAv
LyBEcm9wIGFscmVhZHktZmV0Y2hlZCByZWNvcmRzIHVwIHRvIGBjb3VudGAgdG8gc2VlIGlmIHdl
J3ZlIGFscmVhZHkgZmV0Y2hlZCB0aGUgcmVjb3JkIHdlJ3JlIGxvb2tpbmcgZm9yLgorICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQgJiYgIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgp
OyArK2kpIHsKKyAgICAgICAgaWYgKG1fZmV0Y2hlZFJlY29yZHMuZmlyc3QoKS5pc1Rlcm1pbmFs
UmVjb3JkKCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtX2ZldGNoZWRSZWNvcmRz
LnJlbW92ZUZpcnN0KCk7CisgICAgfQorCisgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBhbnkgcmVj
b3JkcyBsZWZ0LCB0aGUgZmlyc3QgcmVjb3JkIGlzIG91ciBuZXcgY3VycmVudCByZWNvcmQuCisg
ICAgaWYgKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuICFtX2Zl
dGNoZWRSZWNvcmRzLmZpcnN0KCkuaXNUZXJtaW5hbFJlY29yZCgpOworCisgICAgQVNTRVJUKG1f
ZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKwogICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkg
PCBjb3VudDsgKytpKSB7Ci0gICAgICAgIGlmICghaXNVbmlxdWUpIHsKLSAgICAgICAgICAgIGlm
ICghYWR2YW5jZU9uY2UoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWFkdmFuY2VVbmlxdWUoKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mZXRjaGVkUmVjb3Jkcy5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2ZldGNoZWRSZWNvcmRzLnNpemUoKSA9PSAxKTsK
KyAgICAgICAgICAgIG1fY3VycmVudEtleUZvclVuaXF1ZW5lc3MgPSBtX2ZldGNoZWRSZWNvcmRz
LmZpcnN0KCkucmVjb3JkLmtleTsKKyAgICAgICAgICAgIG1fZmV0Y2hlZFJlY29yZHMucmVtb3Zl
Rmlyc3QoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtX2N1cnJlbnRSZWNvcmQuY29tcGxl
dGVkKQorICAgICAgICBpZiAoIWZldGNoKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgQVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSk7CisgICAgICAgIEFT
U0VSVCghbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmVycm9yZWQpOworICAgICAgICBpZiAobV9m
ZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmNvbXBsZXRlZCkKICAgICAgICAgICAgIGJyZWFrOwogICAg
IH0KIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNRTGl0ZUlEQkN1cnNvcjo6YWR2YW5j
ZVVuaXF1ZSgpCitib29sIFNRTGl0ZUlEQkN1cnNvcjo6ZmV0Y2goKQogewotICAgIElEQktleURh
dGEgY3VycmVudEtleSA9IG1fY3VycmVudFJlY29yZC5yZWNvcmQua2V5OworICAgIEFTU0VSVCht
X2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSB8fCAhbV9mZXRjaGVkUmVjb3Jkcy5sYXN0KCkuaXNU
ZXJtaW5hbFJlY29yZCgpKTsKKworICAgIG1fZmV0Y2hlZFJlY29yZHMuYXBwZW5kKHsgfSk7CiAK
LSAgICB3aGlsZSAoIW1fY3VycmVudFJlY29yZC5jb21wbGV0ZWQpIHsKLSAgICAgICAgaWYgKCFh
ZHZhbmNlT25jZSgpKQorICAgIGJvb2wgaXNVbmlxdWUgPSBtX2N1cnNvckRpcmVjdGlvbiA9PSBJ
bmRleGVkREI6OkN1cnNvckRpcmVjdGlvbjo6TmV4dE5vRHVwbGljYXRlIHx8IG1fY3Vyc29yRGly
ZWN0aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpQcmV2Tm9EdXBsaWNhdGU7Cisg
ICAgaWYgKCFpc1VuaXF1ZSkKKyAgICAgICAgcmV0dXJuIGZldGNoTmV4dFJlY29yZChtX2ZldGNo
ZWRSZWNvcmRzLmxhc3QoKSk7CisKKyAgICB3aGlsZSAoIW1fZmV0Y2hlZFJlY29yZHMubGFzdCgp
LmNvbXBsZXRlZCkgeworICAgICAgICBpZiAoIWZldGNoTmV4dFJlY29yZChtX2ZldGNoZWRSZWNv
cmRzLmxhc3QoKSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgLy8gSWYg
dGhlIG5ldyBjdXJyZW50IGtleSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGN1cnJlbnQga2V5
LCB3ZSdyZSBkb25lLgotICAgICAgICBpZiAoY3VycmVudEtleS5jb21wYXJlKG1fY3VycmVudFJl
Y29yZC5yZWNvcmQua2V5KSkKKyAgICAgICAgaWYgKG1fY3VycmVudEtleUZvclVuaXF1ZW5lc3Mu
Y29tcGFyZShtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKS5yZWNvcmQua2V5KSkKICAgICAgICAgICAg
IHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBTUUxp
dGVJREJDdXJzb3I6OmFkdmFuY2VPbmNlKCkKK2Jvb2wgU1FMaXRlSURCQ3Vyc29yOjpmZXRjaE5l
eHRSZWNvcmQoU1FMaXRlQ3Vyc29yUmVjb3JkJiByZWNvcmQpCiB7CiAgICAgaWYgKG1fc3RhdGVt
ZW50TmVlZHNSZXNldCkKICAgICAgICAgcmVzZXRBbmRSZWJpbmRTdGF0ZW1lbnQoKTsKIAotICAg
IEFkdmFuY2VSZXN1bHQgcmVzdWx0OworICAgIEZldGNoUmVzdWx0IHJlc3VsdDsKICAgICBkbyB7
Ci0gICAgICAgIHJlc3VsdCA9IGludGVybmFsQWR2YW5jZU9uY2UoKTsKLSAgICB9IHdoaWxlIChy
ZXN1bHQgPT0gQWR2YW5jZVJlc3VsdDo6U2hvdWxkQWR2YW5jZUFnYWluKTsKKyAgICAgICAgcmVz
dWx0ID0gaW50ZXJuYWxGZXRjaE5leHRSZWNvcmQocmVjb3JkKTsKKyAgICB9IHdoaWxlIChyZXN1
bHQgPT0gRmV0Y2hSZXN1bHQ6OlNob3VsZEZldGNoQWdhaW4pOwogCi0gICAgcmV0dXJuIHJlc3Vs
dCA9PSBBZHZhbmNlUmVzdWx0OjpTdWNjZXNzOworICAgIHJldHVybiByZXN1bHQgPT0gRmV0Y2hS
ZXN1bHQ6OlN1Y2Nlc3M7CiB9CiAKLXZvaWQgU1FMaXRlSURCQ3Vyc29yOjptYXJrQXNFcnJvcmVk
KCkKK3ZvaWQgU1FMaXRlSURCQ3Vyc29yOjptYXJrQXNFcnJvcmVkKFNRTGl0ZUN1cnNvclJlY29y
ZCYgcmVjb3JkKQogewotICAgIG1fY3VycmVudFJlY29yZC5jb21wbGV0ZWQgPSB0cnVlOwotICAg
IG1fY3VycmVudFJlY29yZC5lcnJvcmVkID0gdHJ1ZTsKLSAgICBtX2N1cnJlbnRSZWNvcmQucm93
SUQgPSAwOworICAgIHJlY29yZC5yZWNvcmQgPSB7IH07CisgICAgcmVjb3JkLmNvbXBsZXRlZCA9
IHRydWU7CisgICAgcmVjb3JkLmVycm9yZWQgPSB0cnVlOworICAgIHJlY29yZC5yb3dJRCA9IDA7
CiB9CiAKLVNRTGl0ZUlEQkN1cnNvcjo6QWR2YW5jZVJlc3VsdCBTUUxpdGVJREJDdXJzb3I6Omlu
dGVybmFsQWR2YW5jZU9uY2UoKQorU1FMaXRlSURCQ3Vyc29yOjpGZXRjaFJlc3VsdCBTUUxpdGVJ
REJDdXJzb3I6OmludGVybmFsRmV0Y2hOZXh0UmVjb3JkKFNRTGl0ZUN1cnNvclJlY29yZCYgcmVj
b3JkKQogewogICAgIEFTU0VSVChtX3RyYW5zYWN0aW9uLT5zcWxpdGVUcmFuc2FjdGlvbigpKTsK
ICAgICBBU1NFUlQobV9zdGF0ZW1lbnQpOwotICAgIEFTU0VSVCghbV9jdXJyZW50UmVjb3JkLmNv
bXBsZXRlZCk7CisgICAgQVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSk7CisgICAg
QVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKS5pc1Rlcm1pbmFsUmVjb3JkKCkpOwogCi0g
ICAgbV9jdXJyZW50UmVjb3JkLnJlY29yZC52YWx1ZSA9IG51bGxwdHI7CisgICAgcmVjb3JkLnJl
Y29yZC52YWx1ZSA9IG51bGxwdHI7CiAKICAgICBpbnQgcmVzdWx0ID0gbV9zdGF0ZW1lbnQtPnN0
ZXAoKTsKICAgICBpZiAocmVzdWx0ID09IFNRTElURV9ET05FKSB7CiAgICAgICAgIC8vIFdoZW4g
YSBjdXJzb3IgcmVhY2hlcyBpdHMgZW5kLCB0aGF0IGlzIGluZGljYXRlZCBieSBoYXZpbmcgdW5k
ZWZpbmVkIGtleXMvdmFsdWVzCi0gICAgICAgIG1fY3VycmVudFJlY29yZCA9IHsgfTsKLSAgICAg
ICAgbV9jdXJyZW50UmVjb3JkLmNvbXBsZXRlZCA9IHRydWU7Ci0gICAgICAgIG1fY3VycmVudFJl
Y29yZC5yb3dJRCA9IDA7CisgICAgICAgIHJlY29yZCA9IHsgfTsKKyAgICAgICAgcmVjb3JkLmNv
bXBsZXRlZCA9IHRydWU7CiAKLSAgICAgICAgcmV0dXJuIEFkdmFuY2VSZXN1bHQ6OlN1Y2Nlc3M7
CisgICAgICAgIHJldHVybiBGZXRjaFJlc3VsdDo6U3VjY2VzczsKICAgICB9CiAKICAgICBpZiAo
cmVzdWx0ICE9IFNRTElURV9ST1cpIHsKICAgICAgICAgTE9HX0VSUk9SKCJFcnJvciBhZHZhbmNp
bmcgY3Vyc29yIC0gKCVpKSAlcyIsIHJlc3VsdCwgbV90cmFuc2FjdGlvbi0+c3FsaXRlVHJhbnNh
Y3Rpb24oKS0+ZGF0YWJhc2UoKS5sYXN0RXJyb3JNc2coKSk7Ci0gICAgICAgIG1hcmtBc0Vycm9y
ZWQoKTsKLSAgICAgICAgcmV0dXJuIEFkdmFuY2VSZXN1bHQ6OkZhaWx1cmU7CisgICAgICAgIG1h
cmtBc0Vycm9yZWQocmVjb3JkKTsKKyAgICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpGYWlsdXJl
OwogICAgIH0KIAotICAgIG1fY3VycmVudFJlY29yZC5yb3dJRCA9IG1fc3RhdGVtZW50LT5nZXRD
b2x1bW5JbnQ2NCgwKTsKLSAgICBBU1NFUlQobV9jdXJyZW50UmVjb3JkLnJvd0lEKTsKKyAgICBy
ZWNvcmQucm93SUQgPSBtX3N0YXRlbWVudC0+Z2V0Q29sdW1uSW50NjQoMCk7CisgICAgQVNTRVJU
KHJlY29yZC5yb3dJRCk7CiAKICAgICBWZWN0b3I8dWludDhfdD4ga2V5RGF0YTsKICAgICBtX3N0
YXRlbWVudC0+Z2V0Q29sdW1uQmxvYkFzVmVjdG9yKDEsIGtleURhdGEpOwogCi0gICAgaWYgKCFk
ZXNlcmlhbGl6ZUlEQktleURhdGEoa2V5RGF0YS5kYXRhKCksIGtleURhdGEuc2l6ZSgpLCBtX2N1
cnJlbnRSZWNvcmQucmVjb3JkLmtleSkpIHsKKyAgICBpZiAoIWRlc2VyaWFsaXplSURCS2V5RGF0
YShrZXlEYXRhLmRhdGEoKSwga2V5RGF0YS5zaXplKCksIHJlY29yZC5yZWNvcmQua2V5KSkgewog
ICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBkZXNlcmlhbGl6ZSBrZXkgZGF0YSBmcm9tIGRh
dGFiYXNlIHdoaWxlIGFkdmFuY2luZyBjdXJzb3IiKTsKLSAgICAgICAgbWFya0FzRXJyb3JlZCgp
OwotICAgICAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6RmFpbHVyZTsKKyAgICAgICAgbWFya0Fz
RXJyb3JlZChyZWNvcmQpOworICAgICAgICByZXR1cm4gRmV0Y2hSZXN1bHQ6OkZhaWx1cmU7CiAg
ICAgfQogCiAgICAgbV9zdGF0ZW1lbnQtPmdldENvbHVtbkJsb2JBc1ZlY3RvcigyLCBrZXlEYXRh
KTsKIAogICAgIC8vIFRoZSBwcmltYXJ5S2V5IG9mIGFuIE9iamVjdFN0b3JlIGN1cnNvciBpcyB0
aGUgc2FtZSBhcyBpdHMga2V5LgogICAgIGlmIChtX2luZGV4SUQgPT0gSURCSW5kZXhJbmZvOjpJ
bnZhbGlkSWQpIHsKLSAgICAgICAgbV9jdXJyZW50UmVjb3JkLnJlY29yZC5wcmltYXJ5S2V5ID0g
bV9jdXJyZW50UmVjb3JkLnJlY29yZC5rZXk7CisgICAgICAgIHJlY29yZC5yZWNvcmQucHJpbWFy
eUtleSA9IHJlY29yZC5yZWNvcmQua2V5OwogCiAgICAgICAgIFZlY3RvcjxTdHJpbmc+IGJsb2JV
UkxzLCBibG9iRmlsZVBhdGhzOwotICAgICAgICBhdXRvIGVycm9yID0gbV90cmFuc2FjdGlvbi0+
YmFja2luZ1N0b3JlKCkuZ2V0QmxvYlJlY29yZHNGb3JPYmplY3RTdG9yZVJlY29yZChtX2N1cnJl
bnRSZWNvcmQucm93SUQsIGJsb2JVUkxzLCBibG9iRmlsZVBhdGhzKTsKKyAgICAgICAgYXV0byBl
cnJvciA9IG1fdHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZSgpLmdldEJsb2JSZWNvcmRzRm9yT2Jq
ZWN0U3RvcmVSZWNvcmQocmVjb3JkLnJvd0lELCBibG9iVVJMcywgYmxvYkZpbGVQYXRocyk7CiAg
ICAgICAgIGlmICghZXJyb3IuaXNOdWxsKCkpIHsKICAgICAgICAgICAgIExPR19FUlJPUigiVW5h
YmxlIHRvIGZldGNoIGJsb2IgcmVjb3JkcyBmcm9tIGRhdGFiYXNlIHdoaWxlIGFkdmFuY2luZyBj
dXJzb3IiKTsKLSAgICAgICAgICAgIG1hcmtBc0Vycm9yZWQoKTsKLSAgICAgICAgICAgIHJldHVy
biBBZHZhbmNlUmVzdWx0OjpGYWlsdXJlOworICAgICAgICAgICAgbWFya0FzRXJyb3JlZChyZWNv
cmQpOworICAgICAgICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpGYWlsdXJlOwogICAgICAgICB9
CiAKICAgICAgICAgaWYgKG1fY3Vyc29yVHlwZSA9PSBJbmRleGVkREI6OkN1cnNvclR5cGU6Oktl
eUFuZFZhbHVlKQotICAgICAgICAgICAgbV9jdXJyZW50UmVjb3JkLnJlY29yZC52YWx1ZSA9IHN0
ZDo6bWFrZV91bmlxdWU8SURCVmFsdWU+KFRocmVhZFNhZmVEYXRhQnVmZmVyOjphZG9wdFZlY3Rv
cihrZXlEYXRhKSwgYmxvYlVSTHMsIGJsb2JGaWxlUGF0aHMpOworICAgICAgICAgICAgcmVjb3Jk
LnJlY29yZC52YWx1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8SURCVmFsdWU+KFRocmVhZFNhZmVEYXRh
QnVmZmVyOjphZG9wdFZlY3RvcihrZXlEYXRhKSwgYmxvYlVSTHMsIGJsb2JGaWxlUGF0aHMpOwog
ICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghZGVzZXJpYWxpemVJREJLZXlEYXRhKGtleURhdGEu
ZGF0YSgpLCBrZXlEYXRhLnNpemUoKSwgbV9jdXJyZW50UmVjb3JkLnJlY29yZC5wcmltYXJ5S2V5
KSkgeworICAgICAgICBpZiAoIWRlc2VyaWFsaXplSURCS2V5RGF0YShrZXlEYXRhLmRhdGEoKSwg
a2V5RGF0YS5zaXplKCksIHJlY29yZC5yZWNvcmQucHJpbWFyeUtleSkpIHsKICAgICAgICAgICAg
IExPR19FUlJPUigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIHZhbHVlIGRhdGEgZnJvbSBkYXRhYmFz
ZSB3aGlsZSBhZHZhbmNpbmcgaW5kZXggY3Vyc29yIik7Ci0gICAgICAgICAgICBtYXJrQXNFcnJv
cmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6RmFpbHVyZTsKKyAgICAg
ICAgICAgIG1hcmtBc0Vycm9yZWQocmVjb3JkKTsKKyAgICAgICAgICAgIHJldHVybiBGZXRjaFJl
c3VsdDo6RmFpbHVyZTsKICAgICAgICAgfQogCiAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBvYmpl
Y3RTdG9yZVN0YXRlbWVudChtX3N0YXRlbWVudC0+ZGF0YWJhc2UoKSwgIlNFTEVDVCB2YWx1ZSBG
Uk9NIFJlY29yZHMgV0hFUkUga2V5ID0gQ0FTVCg/IEFTIFRFWFQpIGFuZCBvYmplY3RTdG9yZUlE
ID0gPzsiKTsKQEAgLTQxNSwyOCArNDUzLDI4IEBAIFNRTGl0ZUlEQkN1cnNvcjo6QWR2YW5jZVJl
c3VsdCBTUUxpdGVJREJDdXJzb3I6OmludGVybmFsQWR2YW5jZU9uY2UoKQogICAgICAgICAgICAg
fHwgb2JqZWN0U3RvcmVTdGF0ZW1lbnQuYmluZEJsb2IoMSwga2V5RGF0YS5kYXRhKCksIGtleURh
dGEuc2l6ZSgpKSAhPSBTUUxJVEVfT0sKICAgICAgICAgICAgIHx8IG9iamVjdFN0b3JlU3RhdGVt
ZW50LmJpbmRJbnQ2NCgyLCBtX29iamVjdFN0b3JlSUQpICE9IFNRTElURV9PSykgewogICAgICAg
ICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIGluZGV4IGN1cnNvciBzdGF0ZW1lbnQg
aW50byBvYmplY3Qgc3RvcmUgcmVjb3JkcyAoJWkpICclcyciLCBtX3N0YXRlbWVudC0+ZGF0YWJh
c2UoKS5sYXN0RXJyb3IoKSwgbV9zdGF0ZW1lbnQtPmRhdGFiYXNlKCkubGFzdEVycm9yTXNnKCkp
OwotICAgICAgICAgICAgbWFya0FzRXJyb3JlZCgpOwotICAgICAgICAgICAgcmV0dXJuIEFkdmFu
Y2VSZXN1bHQ6OkZhaWx1cmU7CisgICAgICAgICAgICBtYXJrQXNFcnJvcmVkKHJlY29yZCk7Cisg
ICAgICAgICAgICByZXR1cm4gRmV0Y2hSZXN1bHQ6OkZhaWx1cmU7CiAgICAgICAgIH0KIAogICAg
ICAgICBpbnQgcmVzdWx0ID0gb2JqZWN0U3RvcmVTdGF0ZW1lbnQuc3RlcCgpOwogCiAgICAgICAg
IGlmIChyZXN1bHQgPT0gU1FMSVRFX1JPVykgewogICAgICAgICAgICAgb2JqZWN0U3RvcmVTdGF0
ZW1lbnQuZ2V0Q29sdW1uQmxvYkFzVmVjdG9yKDAsIGtleURhdGEpOwotICAgICAgICAgICAgbV9j
dXJyZW50UmVjb3JkLnJlY29yZC52YWx1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8SURCVmFsdWU+KFRo
cmVhZFNhZmVEYXRhQnVmZmVyOjphZG9wdFZlY3RvcihrZXlEYXRhKSk7CisgICAgICAgICAgICBy
ZWNvcmQucmVjb3JkLnZhbHVlID0gc3RkOjptYWtlX3VuaXF1ZTxJREJWYWx1ZT4oVGhyZWFkU2Fm
ZURhdGFCdWZmZXI6OmFkb3B0VmVjdG9yKGtleURhdGEpKTsKICAgICAgICAgfSBlbHNlIGlmIChy
ZXN1bHQgPT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRo
YXQgdGhlIHJlY29yZCB3ZSdyZSB0cnlpbmcgdG8gcmV0cmlldmUgaGFzIGJlZW4gcmVtb3ZlZCBm
cm9tIHRoZSBvYmplY3Qgc3RvcmUuCiAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgaXQuCi0gICAg
ICAgICAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6U2hvdWxkQWR2YW5jZUFnYWluOworICAgICAg
ICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpTaG91bGRGZXRjaEFnYWluOwogICAgICAgICB9IGVs
c2UgewogICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3Qgc3RlcCBpbmRleCBjdXJzb3Ig
c3RhdGVtZW50IGludG8gb2JqZWN0IHN0b3JlIHJlY29yZHMgKCVpKSAnJXMnIiwgbV9zdGF0ZW1l
bnQtPmRhdGFiYXNlKCkubGFzdEVycm9yKCksIG1fc3RhdGVtZW50LT5kYXRhYmFzZSgpLmxhc3RF
cnJvck1zZygpKTsKLSAgICAgICAgICAgIG1hcmtBc0Vycm9yZWQoKTsKLSAgICAgICAgICAgIHJl
dHVybiBBZHZhbmNlUmVzdWx0OjpGYWlsdXJlOworICAgICAgICAgICAgbWFya0FzRXJyb3JlZChy
ZWNvcmQpOworICAgICAgICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpGYWlsdXJlOwogCiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6U3VjY2VzczsKKyAgICBy
ZXR1cm4gRmV0Y2hSZXN1bHQ6OlN1Y2Nlc3M7CiB9CiAKIGJvb2wgU1FMaXRlSURCQ3Vyc29yOjpp
dGVyYXRlKGNvbnN0IElEQktleURhdGEmIHRhcmdldEtleSwgY29uc3QgSURCS2V5RGF0YSYgdGFy
Z2V0UHJpbWFyeUtleSkKQEAgLTQ1MCwzMCArNDg4LDMwIEBAIGJvb2wgU1FMaXRlSURCQ3Vyc29y
OjppdGVyYXRlKGNvbnN0IElEQktleURhdGEmIHRhcmdldEtleSwgY29uc3QgSURCS2V5RGF0YSYg
dGFyCiAgICAgaWYgKHRhcmdldEtleS5pc051bGwoKSB8fCAhcmVzdWx0KQogICAgICAgICByZXR1
cm4gcmVzdWx0OwogCi0gICAgd2hpbGUgKCFtX2N1cnJlbnRSZWNvcmQuY29tcGxldGVkKSB7Cisg
ICAgd2hpbGUgKCFtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkuaXNUZXJtaW5hbFJlY29yZCgpKSB7
CiAgICAgICAgIGlmICghcmVzdWx0KQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAg
ICAgIC8vIFNlYXJjaCBmb3IgdGhlIG5leHQga2V5ID49IHRoZSB0YXJnZXQgaWYgdGhlIGN1cnNv
ciBpcyBhIE5leHQgY3Vyc29yLCBvciB0aGUgbmV4dCBrZXkgPD0gaWYgdGhlIGN1cnNvciBpcyBh
IFByZXZpb3VzIGN1cnNvci4KICAgICAgICAgaWYgKG1fY3Vyc29yRGlyZWN0aW9uID09IEluZGV4
ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpOZXh0IHx8IG1fY3Vyc29yRGlyZWN0aW9uID09IEluZGV4
ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpOZXh0Tm9EdXBsaWNhdGUpIHsKLSAgICAgICAgICAgIGlm
IChtX2N1cnJlbnRSZWNvcmQucmVjb3JkLmtleS5jb21wYXJlKHRhcmdldEtleSkgPj0gMCkKKyAg
ICAgICAgICAgIGlmIChtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucmVjb3JkLmtleS5jb21wYXJl
KHRhcmdldEtleSkgPj0gMCkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNl
IGlmIChtX2N1cnJlbnRSZWNvcmQucmVjb3JkLmtleS5jb21wYXJlKHRhcmdldEtleSkgPD0gMCkK
KyAgICAgICAgfSBlbHNlIGlmIChtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucmVjb3JkLmtleS5j
b21wYXJlKHRhcmdldEtleSkgPD0gMCkKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIHJl
c3VsdCA9IGFkdmFuY2UoMSk7CiAgICAgfQogCiAgICAgaWYgKHRhcmdldFByaW1hcnlLZXkuaXNW
YWxpZCgpKSB7Ci0gICAgICAgIHdoaWxlICghbV9jdXJyZW50UmVjb3JkLmNvbXBsZXRlZCAmJiAh
bV9jdXJyZW50UmVjb3JkLnJlY29yZC5rZXkuY29tcGFyZSh0YXJnZXRLZXkpKSB7CisgICAgICAg
IHdoaWxlICghbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmlzVGVybWluYWxSZWNvcmQoKSAmJiAh
bV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLnJlY29yZC5rZXkuY29tcGFyZSh0YXJnZXRLZXkpKSB7
CiAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CiAKICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG5leHQgcHJpbWFyeSBrZXkgPj0gdGhl
IHByaW1hcnkgdGFyZ2V0IGlmIHRoZSBjdXJzb3IgaXMgYSBOZXh0IGN1cnNvciwgb3IgdGhlIG5l
eHQga2V5IDw9IGlmIHRoZSBjdXJzb3IgaXMgYSBQcmV2aW91cyBjdXJzb3IuCiAgICAgICAgICAg
ICBpZiAobV9jdXJzb3JEaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb246Ok5l
eHQgfHwgbV9jdXJzb3JEaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb246Ok5l
eHROb0R1cGxpY2F0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRSZWNvcmQucmVj
b3JkLnByaW1hcnlLZXkuY29tcGFyZSh0YXJnZXRQcmltYXJ5S2V5KSA+PSAwKQorICAgICAgICAg
ICAgICAgIGlmIChtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucmVjb3JkLnByaW1hcnlLZXkuY29t
cGFyZSh0YXJnZXRQcmltYXJ5S2V5KSA+PSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9jdXJyZW50UmVjb3JkLnJlY29yZC5wcmltYXJ5S2V5
LmNvbXBhcmUodGFyZ2V0UHJpbWFyeUtleSkgPD0gMCkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAo
bV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLnJlY29yZC5wcmltYXJ5S2V5LmNvbXBhcmUodGFyZ2V0
UHJpbWFyeUtleSkgPD0gMCkKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAg
cmVzdWx0ID0gYWR2YW5jZSgxKTsKQEAgLTQ4Myw2ICs1MjEsNDMgQEAgYm9vbCBTUUxpdGVJREJD
dXJzb3I6Oml0ZXJhdGUoY29uc3QgSURCS2V5RGF0YSYgdGFyZ2V0S2V5LCBjb25zdCBJREJLZXlE
YXRhJiB0YXIKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitjb25zdCBJREJLZXlEYXRhJiBTUUxp
dGVJREJDdXJzb3I6OmN1cnJlbnRLZXkoKSBjb25zdAoreworICAgIEFTU0VSVCghbV9mZXRjaGVk
UmVjb3Jkcy5pc0VtcHR5KCkpOworICAgIHJldHVybiBtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCku
cmVjb3JkLmtleTsKK30KKworY29uc3QgSURCS2V5RGF0YSYgU1FMaXRlSURCQ3Vyc29yOjpjdXJy
ZW50UHJpbWFyeUtleSgpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmlz
RW1wdHkoKSk7CisgICAgcmV0dXJuIG1fZmV0Y2hlZFJlY29yZHMuZmlyc3QoKS5yZWNvcmQucHJp
bWFyeUtleTsKK30KKworSURCVmFsdWUqIFNRTGl0ZUlEQkN1cnNvcjo6Y3VycmVudFZhbHVlKCkg
Y29uc3QKK3sKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKyAgICBy
ZXR1cm4gbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLnJlY29yZC52YWx1ZS5nZXQoKTsKK30KKwor
Ym9vbCBTUUxpdGVJREJDdXJzb3I6OmRpZENvbXBsZXRlKCkgY29uc3QKK3sKKyAgICBBU1NFUlQo
IW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9mZXRjaGVkUmVjb3Jk
cy5maXJzdCgpLmNvbXBsZXRlZDsKK30KKworYm9vbCBTUUxpdGVJREJDdXJzb3I6OmRpZEVycm9y
KCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKyAg
ICByZXR1cm4gbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmVycm9yZWQ7Cit9CisKK2ludDY0X3Qg
U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50UmVjb3JkUm93SUQoKSBjb25zdAoreworICAgIEFTU0VS
VCghbV9mZXRjaGVkUmVjb3Jkcy5pc0VtcHR5KCkpOworICAgIHJldHVybiBtX2ZldGNoZWRSZWNv
cmRzLmZpcnN0KCkucm93SUQ7Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgSURCU2VydmVyCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
aW5kZXhlZGRiL3NlcnZlci9TUUxpdGVJREJDdXJzb3IuaCBiL1NvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvaW5kZXhlZGRiL3NlcnZlci9TUUxpdGVJREJDdXJzb3IuaAppbmRleCA5ZDA1Mjc4Li45YzRj
ZDkwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
U1FMaXRlSURCQ3Vyc29yLmgKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIv
c2VydmVyL1NRTGl0ZUlEQkN1cnNvci5oCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiSURC
UmVzb3VyY2VJZGVudGlmaWVyLmgiCiAjaW5jbHVkZSAiSURCVmFsdWUuaCIKICNpbmNsdWRlICJT
UUxpdGVTdGF0ZW1lbnQuaCIKKyNpbmNsdWRlIDx3dGYvRGVxdWUuaD4KICNpbmNsdWRlIDx3dGYv
Tm9uY29weWFibGUuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNjAsMTcgKzYxLDE4IEBA
IHB1YmxpYzoKICAgICBTUUxpdGVJREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24oKSBjb25zdCB7
IHJldHVybiBtX3RyYW5zYWN0aW9uOyB9CiAKICAgICBpbnQ2NF90IG9iamVjdFN0b3JlSUQoKSBj
b25zdCB7IHJldHVybiBtX29iamVjdFN0b3JlSUQ7IH0KLSAgICBpbnQ2NF90IGN1cnJlbnRSZWNv
cmRSb3dJRCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFJlY29yZC5yb3dJRDsgfQorICAgIGlu
dDY0X3QgY3VycmVudFJlY29yZFJvd0lEKCkgY29uc3Q7CiAKLSAgICBjb25zdCBJREJLZXlEYXRh
JiBjdXJyZW50S2V5KCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50UmVjb3JkLnJlY29yZC5rZXk7
IH0KLSAgICBjb25zdCBJREJLZXlEYXRhJiBjdXJyZW50UHJpbWFyeUtleSgpIGNvbnN0IHsgcmV0
dXJuIG1fY3VycmVudFJlY29yZC5yZWNvcmQucHJpbWFyeUtleTsgfQotICAgIElEQlZhbHVlKiBj
dXJyZW50VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnRSZWNvcmQucmVjb3JkLnZhbHVl
LmdldCgpOyB9CisgICAgY29uc3QgSURCS2V5RGF0YSYgY3VycmVudEtleSgpIGNvbnN0OworICAg
IGNvbnN0IElEQktleURhdGEmIGN1cnJlbnRQcmltYXJ5S2V5KCkgY29uc3Q7CisgICAgSURCVmFs
dWUqIGN1cnJlbnRWYWx1ZSgpIGNvbnN0OwogCiAgICAgYm9vbCBhZHZhbmNlKHVpbnQ2NF90IGNv
dW50KTsKICAgICBib29sIGl0ZXJhdGUoY29uc3QgSURCS2V5RGF0YSYgdGFyZ2V0S2V5LCBjb25z
dCBJREJLZXlEYXRhJiB0YXJnZXRQcmltYXJ5S2V5KTsKKyAgICB2b2lkIHByZWZldGNoKCk7CiAK
LSAgICBib29sIGRpZENvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50UmVjb3JkLmNv
bXBsZXRlZDsgfQotICAgIGJvb2wgZGlkRXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnRS
ZWNvcmQuZXJyb3JlZDsgfQorICAgIGJvb2wgZGlkQ29tcGxldGUoKSBjb25zdDsKKyAgICBib29s
IGRpZEVycm9yKCkgY29uc3Q7CiAKICAgICB2b2lkIG9iamVjdFN0b3JlUmVjb3Jkc0NoYW5nZWQo
KTsKIApAQCAtODMsMTcgKzg1LDI1IEBAIHByaXZhdGU6CiAKICAgICB2b2lkIHJlc2V0QW5kUmVi
aW5kU3RhdGVtZW50KCk7CiAKLSAgICB2b2lkIG1hcmtBc0Vycm9yZWQoKTsKLQotICAgIGVudW0g
Y2xhc3MgQWR2YW5jZVJlc3VsdCB7CisgICAgZW51bSBjbGFzcyBGZXRjaFJlc3VsdCB7CiAgICAg
ICAgIFN1Y2Nlc3MsCiAgICAgICAgIEZhaWx1cmUsCi0gICAgICAgIFNob3VsZEFkdmFuY2VBZ2Fp
bgorICAgICAgICBTaG91bGRGZXRjaEFnYWluCisgICAgfTsKKworICAgIGJvb2wgZmV0Y2goKTsK
KworICAgIHN0cnVjdCBTUUxpdGVDdXJzb3JSZWNvcmQgeworICAgICAgICBJREJDdXJzb3JSZWNv
cmQgcmVjb3JkOworICAgICAgICBib29sIGNvbXBsZXRlZCB7IGZhbHNlIH07CisgICAgICAgIGJv
b2wgZXJyb3JlZCB7IGZhbHNlIH07CisgICAgICAgIGludDY0X3Qgcm93SUQgeyAwIH07CisgICAg
ICAgIGJvb2wgaXNUZXJtaW5hbFJlY29yZCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBsZXRlZCB8fCBl
cnJvcmVkOyB9CiAgICAgfTsKKyAgICBib29sIGZldGNoTmV4dFJlY29yZChTUUxpdGVDdXJzb3JS
ZWNvcmQmKTsKKyAgICBGZXRjaFJlc3VsdCBpbnRlcm5hbEZldGNoTmV4dFJlY29yZChTUUxpdGVD
dXJzb3JSZWNvcmQmKTsKIAotICAgIEFkdmFuY2VSZXN1bHQgaW50ZXJuYWxBZHZhbmNlT25jZSgp
OwotICAgIGJvb2wgYWR2YW5jZU9uY2UoKTsKLSAgICBib29sIGFkdmFuY2VVbmlxdWUoKTsKKyAg
ICB2b2lkIG1hcmtBc0Vycm9yZWQoU1FMaXRlQ3Vyc29yUmVjb3JkJik7CiAKICAgICBTUUxpdGVJ
REJUcmFuc2FjdGlvbiogbV90cmFuc2FjdGlvbjsKICAgICBJREJSZXNvdXJjZUlkZW50aWZpZXIg
bV9jdXJzb3JJZGVudGlmaWVyOwpAQCAtMTA2LDE3ICsxMTYsMTEgQEAgcHJpdmF0ZToKICAgICBJ
REJLZXlEYXRhIG1fY3VycmVudExvd2VyS2V5OwogICAgIElEQktleURhdGEgbV9jdXJyZW50VXBw
ZXJLZXk7CiAKLSAgICBzdHJ1Y3QgU1FMaXRlQ3Vyc29yUmVjb3JkIHsKLSAgICAgICAgSURCQ3Vy
c29yUmVjb3JkIHJlY29yZDsKLSAgICAgICAgYm9vbCBjb21wbGV0ZWQgeyBmYWxzZSB9OwotICAg
ICAgICBib29sIGVycm9yZWQgeyBmYWxzZSB9OwotICAgICAgICBpbnQ2NF90IHJvd0lEIHsgMCB9
OwotICAgIH07Ci0KLSAgICBTUUxpdGVDdXJzb3JSZWNvcmQgbV9jdXJyZW50UmVjb3JkOworICAg
IERlcXVlPFNRTGl0ZUN1cnNvclJlY29yZD4gbV9mZXRjaGVkUmVjb3JkczsKKyAgICBJREJLZXlE
YXRhIG1fY3VycmVudEtleUZvclVuaXF1ZW5lc3M7CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U1FM
aXRlU3RhdGVtZW50PiBtX3N0YXRlbWVudDsKLSAgICBib29sIG1fc3RhdGVtZW50TmVlZHNSZXNl
dCB7IGZhbHNlIH07CisgICAgYm9vbCBtX3N0YXRlbWVudE5lZWRzUmVzZXQgeyB0cnVlIH07CiAg
ICAgaW50NjRfdCBtX2JvdW5kSUQgeyAwIH07CiAKICAgICBib29sIG1fYmFja2luZ1N0b3JlQ3Vy
c29yIHsgZmFsc2UgfTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297391</attachid>
            <date>2016-12-16 22:45:24 -0800</date>
            <delta_ts>2016-12-16 23:29:55 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-165978-20161216224429.patch</filename>
            <type>text/plain</type>
            <size>22608</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjA5OTUzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMWQwYWY4ZmU0ZWM1ODQy
ZjMwODgxMjY2NGEwMDE0NjdiN2M0MzVmMC4uNzZiMmQ4NDFlYmIxYWViMWQyMTIzZGQ3ZmFiNzFh
ODUxYjNlNTlhOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ3IEBACisyMDE2LTEyLTE2ICBCcmFk
eSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4KKworICAgICAgICBJbmRleGVkREI6IFJlZmFj
dG9yIFNRTGl0ZUlEQkN1cnNvciB0byBwcmVwYXJlIGZvciBjdXJzb3IgcHJlZmV0Y2hpbmcuCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU5NzgKKwor
ICAgICAgICBSZXZpZXdlZCBieSBBbGV4IENocmlzdGVuc2VuLgorCisgICAgICAgIE5vIG5ldyB0
ZXN0cyAoUmVmYWN0b3IsIG5vIGJlaGF2aW9yIGNoYW5nZSkuCisgICAgICAgIAorICAgICAgICBJ
biBwcmVwYXJhdGlvbiBmb3IgY3Vyc29yIHByZWZldGNoaW5nLCB3ZSBuZWVkIHRvIHNoaWZ0IHRo
ZSBjdXJzb3Igb2ZmIG9mIGtlZXBpbmcgInRoZSBjdXJyZW50IHJlY29yZCIKKyAgICAgICAgYW5k
IG9udG8ga2VlcGluZyAiYSBkZXF1ZSBvZiBmZXRjaGVkIHJlY29yZHMiLCB0aGUgZmlyc3Qgb2Yg
d2hpY2ggaXMgInRoZSBjdXJyZW50IHJlY29yZCIuCisgICAgICAgIAorICAgICAgICBUaGlzIHBh
dGNoIGRvZXMganVzdCB0aGF0LCBidXQgd2l0aCBubyBiZWhhdmlvciBjaGFuZ2U7IFRoZSBkZXF1
ZSBvbmx5IGV2ZXIgaG9sZHMgMCBvciAxIHJlY29yZHMuCisKKyAgICAgICAgKiBNb2R1bGVzL2lu
ZGV4ZWRkYi9zZXJ2ZXIvU1FMaXRlSURCQ3Vyc29yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklE
QlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50RGF0YSk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6b2JqZWN0U3RvcmVSZWNvcmRzQ2hhbmdlZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6cmVzZXRBbmRS
ZWJpbmRTdGF0ZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxpdGVJREJD
dXJzb3I6OnByZWZldGNoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURC
Q3Vyc29yOjphZHZhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURC
Q3Vyc29yOjpmZXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1
cnNvcjo6ZmV0Y2hOZXh0UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FM
aXRlSURCQ3Vyc29yOjptYXJrQXNFcnJvcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZl
cjo6U1FMaXRlSURCQ3Vyc29yOjppbnRlcm5hbEZldGNoTmV4dFJlY29yZCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6aXRlcmF0ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6Y3VycmVudEtleSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6Y3VycmVudFByaW1hcnlLZXkp
OgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxpdGVJREJDdXJzb3I6OmN1cnJlbnRW
YWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6ZGlk
Q29tcGxldGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxpdGVJREJDdXJzb3I6
OmRpZEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29y
OjpjdXJyZW50UmVjb3JkUm93SUQpOgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxp
dGVJREJDdXJzb3I6OmFkdmFuY2VVbmlxdWUpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
SURCU2VydmVyOjpTUUxpdGVJREJDdXJzb3I6OmFkdmFuY2VPbmNlKTogRGVsZXRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjppbnRlcm5hbEFkdmFuY2VP
bmNlKTogRGVsZXRlZC4KKyAgICAgICAgCisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL1NRTGl0ZUlEQkN1cnNvci5oOgorICAgICAgICAoV2ViQ29yZTo6SURCU2VydmVyOjpTUUxp
dGVJREJDdXJzb3I6OlNRTGl0ZUN1cnNvclJlY29yZDo6aXNUZXJtaW5hbFJlY29yZCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6Y3VycmVudFJlY29yZFJv
d0lEKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vy
c29yOjpjdXJyZW50S2V5KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6
U1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50UHJpbWFyeUtleSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1cnNvcjo6Y3VycmVudFZhbHVlKTogRGVsZXRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6U1FMaXRlSURCQ3Vyc29yOjpkaWRDb21w
bGV0ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OlNRTGl0ZUlEQkN1
cnNvcjo6ZGlkRXJyb3IpOiBEZWxldGVkLgorCiAyMDE2LTEyLTE2ICBaYWxhbiBCdWp0YXMgIDx6
YWxhbkBhcHBsZS5jb20+CiAKICAgICAgICAgUG9zc2libGUgbnVsbHB0ciBkZXJlZmVyZW5jZSB3
aGVuIGFwcGx5aW5nIHBhZ2luYXRpb24gdG8gdmlld3BvcnQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9TUUxpdGVJREJDdXJzb3IuY3BwIGIvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1NRTGl0ZUlEQkN1cnNvci5jcHAK
aW5kZXggNzdlNjU5OWFiNTZlMDM5MWUyNjcyMjY1MTNjZmNkZDkwMmVjNjJkNS4uMzc2NGU2M2Zh
MjBhZTZjODBjNDgzM2ZiZTdmODU3ZGU2ZDIxNDJhYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1NRTGl0ZUlEQkN1cnNvci5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1NRTGl0ZUlEQkN1cnNvci5jcHAK
QEAgLTEwMSwxMyArMTAxLDE2IEBAIFNRTGl0ZUlEQkN1cnNvcjo6flNRTGl0ZUlEQkN1cnNvcigp
CiAKIHZvaWQgU1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50RGF0YShJREJHZXRSZXN1bHQmIHJlc3Vs
dCkKIHsKLSAgICBpZiAobV9jdXJyZW50UmVjb3JkLmNvbXBsZXRlZCkgewotICAgICAgICBBU1NF
UlQoIW1fY3VycmVudFJlY29yZC5lcnJvcmVkKTsKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29y
ZHMuaXNFbXB0eSgpKTsKKworICAgIGF1dG8mIGN1cnJlbnRSZWNvcmQgPSBtX2ZldGNoZWRSZWNv
cmRzLmZpcnN0KCk7CisgICAgaWYgKGN1cnJlbnRSZWNvcmQuY29tcGxldGVkKSB7CisgICAgICAg
IEFTU0VSVCghY3VycmVudFJlY29yZC5lcnJvcmVkKTsKICAgICAgICAgcmVzdWx0ID0geyB9Owog
ICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmVzdWx0ID0geyBtX2N1cnJlbnRSZWNvcmQu
cmVjb3JkLmtleSwgbV9jdXJyZW50UmVjb3JkLnJlY29yZC5wcmltYXJ5S2V5LCBtX2N1cnJlbnRS
ZWNvcmQucmVjb3JkLnZhbHVlID8gKm1fY3VycmVudFJlY29yZC5yZWNvcmQudmFsdWUgOiBJREJW
YWx1ZSgpIH07CisgICAgcmVzdWx0ID0geyBjdXJyZW50UmVjb3JkLnJlY29yZC5rZXksIGN1cnJl
bnRSZWNvcmQucmVjb3JkLnByaW1hcnlLZXksIGN1cnJlbnRSZWNvcmQucmVjb3JkLnZhbHVlID8g
KmN1cnJlbnRSZWNvcmQucmVjb3JkLnZhbHVlIDogSURCVmFsdWUoKSB9OwogfQogCiBzdGF0aWMg
U3RyaW5nIGJ1aWxkSW5kZXhTdGF0ZW1lbnQoY29uc3QgSURCS2V5UmFuZ2VEYXRhJiBrZXlSYW5n
ZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24gY3Vyc29yRGlyZWN0aW9uKQpAQCAtMjA2LDM4
ICsyMDksMjUgQEAgYm9vbCBTUUxpdGVJREJDdXJzb3I6OmNyZWF0ZVNRTGl0ZVN0YXRlbWVudChj
b25zdCBTdHJpbmcmIHNxbCkKIAogdm9pZCBTUUxpdGVJREJDdXJzb3I6Om9iamVjdFN0b3JlUmVj
b3Jkc0NoYW5nZWQoKQogeworICAgIGlmIChtX3N0YXRlbWVudE5lZWRzUmVzZXQpCisgICAgICAg
IHJldHVybjsKKwogICAgIC8vIElmIE9iamVjdFN0b3JlIG9yIEluZGV4IGNvbnRlbnRzIGNoYW5n
ZWQsIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHN0YXRlbWVudCBhbmQgYmluZCBuZXcgcGFyYW1ldGVy
cyB0byBpdC4KICAgICAvLyBUaGlzIGlzIHRvIHBpY2sgdXAgYW55IGNoYW5nZXMgdGhhdCBtaWdo
dCBleGlzdC4KKyAgICAvLyBXZSBhbHNvIG5lZWQgdG8gdGhyb3cgYXdheSBhbnkgZmV0Y2hlZCBy
ZWNvcmRzIGFzIHRoZXkgbWF5IG5vIGxvbmdlciBiZSB2YWxpZC4KIAogICAgIG1fc3RhdGVtZW50
TmVlZHNSZXNldCA9IHRydWU7Ci19Ci0KLXZvaWQgU1FMaXRlSURCQ3Vyc29yOjpyZXNldEFuZFJl
YmluZFN0YXRlbWVudCgpCi17Ci0gICAgQVNTRVJUKCFtX2N1cnJlbnRMb3dlcktleS5pc051bGwo
KSk7Ci0gICAgQVNTRVJUKCFtX2N1cnJlbnRVcHBlcktleS5pc051bGwoKSk7Ci0gICAgQVNTRVJU
KG1fdHJhbnNhY3Rpb24tPnNxbGl0ZVRyYW5zYWN0aW9uKCkpOwotICAgIEFTU0VSVChtX3N0YXRl
bWVudCk7Ci0gICAgQVNTRVJUKG1fc3RhdGVtZW50TmVlZHNSZXNldCk7Ci0KLSAgICBtX3N0YXRl
bWVudE5lZWRzUmVzZXQgPSBmYWxzZTsKLQotICAgIC8vIElmIHRoaXMgY3Vyc29yIG5ldmVyIGZl
dGNoZWQgYW55IHJlY29yZHMsIHdlIGRvbid0IG5lZWQgdG8gcmVzZXQgdGhlIHN0YXRlbWVudC4K
LSAgICBpZiAobV9jdXJyZW50UmVjb3JkLnJlY29yZC5rZXkuaXNOdWxsKCkpCi0gICAgICAgIHJl
dHVybjsKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKIAotICAgIC8v
IE90aGVyd2lzZSB1cGRhdGUgdGhlIGxvd2VyIGtleSBvciB1cHBlciBrZXkgdXNlZCBmb3IgdGhl
IGN1cnNvciByYW5nZS4KLSAgICAvLyBUaGlzIGlzIHNvIHRoZSBjdXJzb3IgY2FuIHBpY2sgdXAg
d2hlcmUgd2UgbGVmdCBvZmYuCi0gICAgLy8gV2UgbWlnaHQgYWxzbyBoYXZlIHRvIGNoYW5nZSB0
aGUgc3RhdGVtZW50IGZyb20gY2xvc2VkIHRvIG9wZW4gc28gd2UgZG9uJ3QgcmVmZXRjaCB0aGUg
Y3VycmVudCBrZXkgYSBzZWNvbmQgdGltZS4KICAgICBpZiAobV9jdXJzb3JEaXJlY3Rpb24gPT0g
SW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb246Ok5leHQgfHwgbV9jdXJzb3JEaXJlY3Rpb24gPT0g
SW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb246Ok5leHROb0R1cGxpY2F0ZSkgewotICAgICAgICBt
X2N1cnJlbnRMb3dlcktleSA9IG1fY3VycmVudFJlY29yZC5yZWNvcmQua2V5OworICAgICAgICBt
X2N1cnJlbnRMb3dlcktleSA9IG1fZmV0Y2hlZFJlY29yZHMuZmlyc3QoKS5yZWNvcmQua2V5Owog
ICAgICAgICBpZiAoIW1fa2V5UmFuZ2UubG93ZXJPcGVuKSB7CiAgICAgICAgICAgICBtX2tleVJh
bmdlLmxvd2VyT3BlbiA9IHRydWU7CiAgICAgICAgICAgICBtX2tleVJhbmdlLmxvd2VyS2V5ID0g
bV9jdXJyZW50TG93ZXJLZXk7CiAgICAgICAgICAgICBtX3N0YXRlbWVudCA9IG51bGxwdHI7CiAg
ICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBtX2N1cnJlbnRVcHBlcktleSA9IG1fY3Vy
cmVudFJlY29yZC5yZWNvcmQua2V5OworICAgICAgICBtX2N1cnJlbnRVcHBlcktleSA9IG1fZmV0
Y2hlZFJlY29yZHMuZmlyc3QoKS5yZWNvcmQua2V5OwogICAgICAgICBpZiAoIW1fa2V5UmFuZ2Uu
dXBwZXJPcGVuKSB7CiAgICAgICAgICAgICBtX2tleVJhbmdlLnVwcGVyT3BlbiA9IHRydWU7CiAg
ICAgICAgICAgICBtX2tleVJhbmdlLnVwcGVyS2V5ID0gbV9jdXJyZW50VXBwZXJLZXk7CkBAIC0y
NDUsNiArMjM1LDE4IEBAIHZvaWQgU1FMaXRlSURCQ3Vyc29yOjpyZXNldEFuZFJlYmluZFN0YXRl
bWVudCgpCiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtX2ZldGNoZWRSZWNvcmRzLmNsZWFyKCk7
Cit9CisKK3ZvaWQgU1FMaXRlSURCQ3Vyc29yOjpyZXNldEFuZFJlYmluZFN0YXRlbWVudCgpCit7
CisgICAgQVNTRVJUKCFtX2N1cnJlbnRMb3dlcktleS5pc051bGwoKSk7CisgICAgQVNTRVJUKCFt
X2N1cnJlbnRVcHBlcktleS5pc051bGwoKSk7CisgICAgQVNTRVJUKG1fdHJhbnNhY3Rpb24tPnNx
bGl0ZVRyYW5zYWN0aW9uKCkpOworICAgIEFTU0VSVChtX3N0YXRlbWVudE5lZWRzUmVzZXQpOwor
CisgICAgbV9zdGF0ZW1lbnROZWVkc1Jlc2V0ID0gZmFsc2U7CisKICAgICBpZiAoIW1fc3RhdGVt
ZW50ICYmICFlc3RhYmxpc2hTdGF0ZW1lbnQoKSkgewogICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBlc3RhYmxpc2ggbmV3IHN0YXRlbWVudCBmb3IgY3Vyc29yIGl0ZXJhdGlvbiIpOwogICAg
ICAgICByZXR1cm47CkBAIC0yODksMTI0ICsyOTEsMTYxIEBAIGJvb2wgU1FMaXRlSURCQ3Vyc29y
OjpiaW5kQXJndW1lbnRzKCkKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBTUUxpdGVJREJD
dXJzb3I6OnByZWZldGNoKCkKK3sKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0
eSgpKTsKKyAgICBpZiAobV9mZXRjaGVkUmVjb3Jkcy5sYXN0KCkuZXJyb3JlZCB8fCBtX2ZldGNo
ZWRSZWNvcmRzLmxhc3QoKS5jb21wbGV0ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY3Vy
cmVudEtleUZvclVuaXF1ZW5lc3MgPSBtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKS5yZWNvcmQua2V5
OworICAgIGZldGNoKCk7Cit9CisKIGJvb2wgU1FMaXRlSURCQ3Vyc29yOjphZHZhbmNlKHVpbnQ2
NF90IGNvdW50KQogewotICAgIGJvb2wgaXNVbmlxdWUgPSBtX2N1cnNvckRpcmVjdGlvbiA9PSBJ
bmRleGVkREI6OkN1cnNvckRpcmVjdGlvbjo6TmV4dE5vRHVwbGljYXRlIHx8IG1fY3Vyc29yRGly
ZWN0aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpQcmV2Tm9EdXBsaWNhdGU7Cisg
ICAgQVNTRVJUKGNvdW50KTsKIAotICAgIGlmIChtX2N1cnJlbnRSZWNvcmQuY29tcGxldGVkKSB7
CisgICAgaWYgKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSAmJiBtX2ZldGNoZWRSZWNvcmRz
LmZpcnN0KCkuaXNUZXJtaW5hbFJlY29yZCgpKSB7CiAgICAgICAgIExPR19FUlJPUigiQXR0ZW1w
dCB0byBhZHZhbmNlIGEgY29tcGxldGVkIGN1cnNvciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7
CiAgICAgfQogCisgICAgaWYgKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSkKKyAgICAgICAg
bV9jdXJyZW50S2V5Rm9yVW5pcXVlbmVzcyA9IG1fZmV0Y2hlZFJlY29yZHMubGFzdCgpLnJlY29y
ZC5rZXk7CisKKyAgICAvLyBEcm9wIGFscmVhZHktZmV0Y2hlZCByZWNvcmRzIHVwIHRvIGBjb3Vu
dGAgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgZmV0Y2hlZCB0aGUgcmVjb3JkIHdlJ3JlIGxvb2tp
bmcgZm9yLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQgJiYgIW1fZmV0Y2hlZFJl
Y29yZHMuaXNFbXB0eSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1fZmV0Y2hlZFJlY29yZHMuZmly
c3QoKS5pc1Rlcm1pbmFsUmVjb3JkKCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBt
X2ZldGNoZWRSZWNvcmRzLnJlbW92ZUZpcnN0KCk7CisgICAgfQorCisgICAgLy8gSWYgd2Ugc3Rp
bGwgaGF2ZSBhbnkgcmVjb3JkcyBsZWZ0LCB0aGUgZmlyc3QgcmVjb3JkIGlzIG91ciBuZXcgY3Vy
cmVudCByZWNvcmQuCisgICAgaWYgKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuICFtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkuaXNUZXJtaW5hbFJlY29yZCgpOwor
CisgICAgQVNTRVJUKG1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKwogICAgIGZvciAodWlu
dDY0X3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIGlmICghaXNVbmlxdWUpIHsK
LSAgICAgICAgICAgIGlmICghYWR2YW5jZU9uY2UoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWFkdmFuY2VVbmlxdWUo
KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghbV9mZXRjaGVk
UmVjb3Jkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2ZldGNoZWRSZWNvcmRz
LnNpemUoKSA9PSAxKTsKKyAgICAgICAgICAgIG1fY3VycmVudEtleUZvclVuaXF1ZW5lc3MgPSBt
X2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucmVjb3JkLmtleTsKKyAgICAgICAgICAgIG1fZmV0Y2hl
ZFJlY29yZHMucmVtb3ZlRmlyc3QoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtX2N1cnJl
bnRSZWNvcmQuY29tcGxldGVkKQorICAgICAgICBpZiAoIWZldGNoKCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHko
KSk7CisgICAgICAgIEFTU0VSVCghbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmVycm9yZWQpOwor
ICAgICAgICBpZiAobV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmNvbXBsZXRlZCkKICAgICAgICAg
ICAgIGJyZWFrOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNRTGl0ZUlE
QkN1cnNvcjo6YWR2YW5jZVVuaXF1ZSgpCitib29sIFNRTGl0ZUlEQkN1cnNvcjo6ZmV0Y2goKQog
ewotICAgIElEQktleURhdGEgY3VycmVudEtleSA9IG1fY3VycmVudFJlY29yZC5yZWNvcmQua2V5
OworICAgIEFTU0VSVChtX2ZldGNoZWRSZWNvcmRzLmlzRW1wdHkoKSB8fCAhbV9mZXRjaGVkUmVj
b3Jkcy5sYXN0KCkuaXNUZXJtaW5hbFJlY29yZCgpKTsKKworICAgIG1fZmV0Y2hlZFJlY29yZHMu
YXBwZW5kKHsgfSk7CiAKLSAgICB3aGlsZSAoIW1fY3VycmVudFJlY29yZC5jb21wbGV0ZWQpIHsK
LSAgICAgICAgaWYgKCFhZHZhbmNlT25jZSgpKQorICAgIGJvb2wgaXNVbmlxdWUgPSBtX2N1cnNv
ckRpcmVjdGlvbiA9PSBJbmRleGVkREI6OkN1cnNvckRpcmVjdGlvbjo6TmV4dE5vRHVwbGljYXRl
IHx8IG1fY3Vyc29yRGlyZWN0aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpQcmV2
Tm9EdXBsaWNhdGU7CisgICAgaWYgKCFpc1VuaXF1ZSkKKyAgICAgICAgcmV0dXJuIGZldGNoTmV4
dFJlY29yZChtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKSk7CisKKyAgICB3aGlsZSAoIW1fZmV0Y2hl
ZFJlY29yZHMubGFzdCgpLmNvbXBsZXRlZCkgeworICAgICAgICBpZiAoIWZldGNoTmV4dFJlY29y
ZChtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAK
ICAgICAgICAgLy8gSWYgdGhlIG5ldyBjdXJyZW50IGtleSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUg
b2xkIGN1cnJlbnQga2V5LCB3ZSdyZSBkb25lLgotICAgICAgICBpZiAoY3VycmVudEtleS5jb21w
YXJlKG1fY3VycmVudFJlY29yZC5yZWNvcmQua2V5KSkKKyAgICAgICAgaWYgKG1fY3VycmVudEtl
eUZvclVuaXF1ZW5lc3MuY29tcGFyZShtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKS5yZWNvcmQua2V5
KSkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsK
IH0KIAotYm9vbCBTUUxpdGVJREJDdXJzb3I6OmFkdmFuY2VPbmNlKCkKK2Jvb2wgU1FMaXRlSURC
Q3Vyc29yOjpmZXRjaE5leHRSZWNvcmQoU1FMaXRlQ3Vyc29yUmVjb3JkJiByZWNvcmQpCiB7CiAg
ICAgaWYgKG1fc3RhdGVtZW50TmVlZHNSZXNldCkKICAgICAgICAgcmVzZXRBbmRSZWJpbmRTdGF0
ZW1lbnQoKTsKIAotICAgIEFkdmFuY2VSZXN1bHQgcmVzdWx0OworICAgIEZldGNoUmVzdWx0IHJl
c3VsdDsKICAgICBkbyB7Ci0gICAgICAgIHJlc3VsdCA9IGludGVybmFsQWR2YW5jZU9uY2UoKTsK
LSAgICB9IHdoaWxlIChyZXN1bHQgPT0gQWR2YW5jZVJlc3VsdDo6U2hvdWxkQWR2YW5jZUFnYWlu
KTsKKyAgICAgICAgcmVzdWx0ID0gaW50ZXJuYWxGZXRjaE5leHRSZWNvcmQocmVjb3JkKTsKKyAg
ICB9IHdoaWxlIChyZXN1bHQgPT0gRmV0Y2hSZXN1bHQ6OlNob3VsZEZldGNoQWdhaW4pOwogCi0g
ICAgcmV0dXJuIHJlc3VsdCA9PSBBZHZhbmNlUmVzdWx0OjpTdWNjZXNzOworICAgIHJldHVybiBy
ZXN1bHQgPT0gRmV0Y2hSZXN1bHQ6OlN1Y2Nlc3M7CiB9CiAKLXZvaWQgU1FMaXRlSURCQ3Vyc29y
OjptYXJrQXNFcnJvcmVkKCkKK3ZvaWQgU1FMaXRlSURCQ3Vyc29yOjptYXJrQXNFcnJvcmVkKFNR
TGl0ZUN1cnNvclJlY29yZCYgcmVjb3JkKQogewotICAgIG1fY3VycmVudFJlY29yZC5jb21wbGV0
ZWQgPSB0cnVlOwotICAgIG1fY3VycmVudFJlY29yZC5lcnJvcmVkID0gdHJ1ZTsKLSAgICBtX2N1
cnJlbnRSZWNvcmQucm93SUQgPSAwOworICAgIHJlY29yZC5yZWNvcmQgPSB7IH07CisgICAgcmVj
b3JkLmNvbXBsZXRlZCA9IHRydWU7CisgICAgcmVjb3JkLmVycm9yZWQgPSB0cnVlOworICAgIHJl
Y29yZC5yb3dJRCA9IDA7CiB9CiAKLVNRTGl0ZUlEQkN1cnNvcjo6QWR2YW5jZVJlc3VsdCBTUUxp
dGVJREJDdXJzb3I6OmludGVybmFsQWR2YW5jZU9uY2UoKQorU1FMaXRlSURCQ3Vyc29yOjpGZXRj
aFJlc3VsdCBTUUxpdGVJREJDdXJzb3I6OmludGVybmFsRmV0Y2hOZXh0UmVjb3JkKFNRTGl0ZUN1
cnNvclJlY29yZCYgcmVjb3JkKQogewogICAgIEFTU0VSVChtX3RyYW5zYWN0aW9uLT5zcWxpdGVU
cmFuc2FjdGlvbigpKTsKICAgICBBU1NFUlQobV9zdGF0ZW1lbnQpOwotICAgIEFTU0VSVCghbV9j
dXJyZW50UmVjb3JkLmNvbXBsZXRlZCk7CisgICAgQVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmlz
RW1wdHkoKSk7CisgICAgQVNTRVJUKCFtX2ZldGNoZWRSZWNvcmRzLmxhc3QoKS5pc1Rlcm1pbmFs
UmVjb3JkKCkpOwogCi0gICAgbV9jdXJyZW50UmVjb3JkLnJlY29yZC52YWx1ZSA9IG51bGxwdHI7
CisgICAgcmVjb3JkLnJlY29yZC52YWx1ZSA9IG51bGxwdHI7CiAKICAgICBpbnQgcmVzdWx0ID0g
bV9zdGF0ZW1lbnQtPnN0ZXAoKTsKICAgICBpZiAocmVzdWx0ID09IFNRTElURV9ET05FKSB7CiAg
ICAgICAgIC8vIFdoZW4gYSBjdXJzb3IgcmVhY2hlcyBpdHMgZW5kLCB0aGF0IGlzIGluZGljYXRl
ZCBieSBoYXZpbmcgdW5kZWZpbmVkIGtleXMvdmFsdWVzCi0gICAgICAgIG1fY3VycmVudFJlY29y
ZCA9IHsgfTsKLSAgICAgICAgbV9jdXJyZW50UmVjb3JkLmNvbXBsZXRlZCA9IHRydWU7Ci0gICAg
ICAgIG1fY3VycmVudFJlY29yZC5yb3dJRCA9IDA7CisgICAgICAgIHJlY29yZCA9IHsgfTsKKyAg
ICAgICAgcmVjb3JkLmNvbXBsZXRlZCA9IHRydWU7CiAKLSAgICAgICAgcmV0dXJuIEFkdmFuY2VS
ZXN1bHQ6OlN1Y2Nlc3M7CisgICAgICAgIHJldHVybiBGZXRjaFJlc3VsdDo6U3VjY2VzczsKICAg
ICB9CiAKICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ST1cpIHsKICAgICAgICAgTE9HX0VSUk9S
KCJFcnJvciBhZHZhbmNpbmcgY3Vyc29yIC0gKCVpKSAlcyIsIHJlc3VsdCwgbV90cmFuc2FjdGlv
bi0+c3FsaXRlVHJhbnNhY3Rpb24oKS0+ZGF0YWJhc2UoKS5sYXN0RXJyb3JNc2coKSk7Ci0gICAg
ICAgIG1hcmtBc0Vycm9yZWQoKTsKLSAgICAgICAgcmV0dXJuIEFkdmFuY2VSZXN1bHQ6OkZhaWx1
cmU7CisgICAgICAgIG1hcmtBc0Vycm9yZWQocmVjb3JkKTsKKyAgICAgICAgcmV0dXJuIEZldGNo
UmVzdWx0OjpGYWlsdXJlOwogICAgIH0KIAotICAgIG1fY3VycmVudFJlY29yZC5yb3dJRCA9IG1f
c3RhdGVtZW50LT5nZXRDb2x1bW5JbnQ2NCgwKTsKLSAgICBBU1NFUlQobV9jdXJyZW50UmVjb3Jk
LnJvd0lEKTsKKyAgICByZWNvcmQucm93SUQgPSBtX3N0YXRlbWVudC0+Z2V0Q29sdW1uSW50NjQo
MCk7CisgICAgQVNTRVJUKHJlY29yZC5yb3dJRCk7CiAKICAgICBWZWN0b3I8dWludDhfdD4ga2V5
RGF0YTsKICAgICBtX3N0YXRlbWVudC0+Z2V0Q29sdW1uQmxvYkFzVmVjdG9yKDEsIGtleURhdGEp
OwogCi0gICAgaWYgKCFkZXNlcmlhbGl6ZUlEQktleURhdGEoa2V5RGF0YS5kYXRhKCksIGtleURh
dGEuc2l6ZSgpLCBtX2N1cnJlbnRSZWNvcmQucmVjb3JkLmtleSkpIHsKKyAgICBpZiAoIWRlc2Vy
aWFsaXplSURCS2V5RGF0YShrZXlEYXRhLmRhdGEoKSwga2V5RGF0YS5zaXplKCksIHJlY29yZC5y
ZWNvcmQua2V5KSkgewogICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBkZXNlcmlhbGl6ZSBr
ZXkgZGF0YSBmcm9tIGRhdGFiYXNlIHdoaWxlIGFkdmFuY2luZyBjdXJzb3IiKTsKLSAgICAgICAg
bWFya0FzRXJyb3JlZCgpOwotICAgICAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6RmFpbHVyZTsK
KyAgICAgICAgbWFya0FzRXJyb3JlZChyZWNvcmQpOworICAgICAgICByZXR1cm4gRmV0Y2hSZXN1
bHQ6OkZhaWx1cmU7CiAgICAgfQogCiAgICAgbV9zdGF0ZW1lbnQtPmdldENvbHVtbkJsb2JBc1Zl
Y3RvcigyLCBrZXlEYXRhKTsKIAogICAgIC8vIFRoZSBwcmltYXJ5S2V5IG9mIGFuIE9iamVjdFN0
b3JlIGN1cnNvciBpcyB0aGUgc2FtZSBhcyBpdHMga2V5LgogICAgIGlmIChtX2luZGV4SUQgPT0g
SURCSW5kZXhJbmZvOjpJbnZhbGlkSWQpIHsKLSAgICAgICAgbV9jdXJyZW50UmVjb3JkLnJlY29y
ZC5wcmltYXJ5S2V5ID0gbV9jdXJyZW50UmVjb3JkLnJlY29yZC5rZXk7CisgICAgICAgIHJlY29y
ZC5yZWNvcmQucHJpbWFyeUtleSA9IHJlY29yZC5yZWNvcmQua2V5OwogCiAgICAgICAgIFZlY3Rv
cjxTdHJpbmc+IGJsb2JVUkxzLCBibG9iRmlsZVBhdGhzOwotICAgICAgICBhdXRvIGVycm9yID0g
bV90cmFuc2FjdGlvbi0+YmFja2luZ1N0b3JlKCkuZ2V0QmxvYlJlY29yZHNGb3JPYmplY3RTdG9y
ZVJlY29yZChtX2N1cnJlbnRSZWNvcmQucm93SUQsIGJsb2JVUkxzLCBibG9iRmlsZVBhdGhzKTsK
KyAgICAgICAgYXV0byBlcnJvciA9IG1fdHJhbnNhY3Rpb24tPmJhY2tpbmdTdG9yZSgpLmdldEJs
b2JSZWNvcmRzRm9yT2JqZWN0U3RvcmVSZWNvcmQocmVjb3JkLnJvd0lELCBibG9iVVJMcywgYmxv
YkZpbGVQYXRocyk7CiAgICAgICAgIGlmICghZXJyb3IuaXNOdWxsKCkpIHsKICAgICAgICAgICAg
IExPR19FUlJPUigiVW5hYmxlIHRvIGZldGNoIGJsb2IgcmVjb3JkcyBmcm9tIGRhdGFiYXNlIHdo
aWxlIGFkdmFuY2luZyBjdXJzb3IiKTsKLSAgICAgICAgICAgIG1hcmtBc0Vycm9yZWQoKTsKLSAg
ICAgICAgICAgIHJldHVybiBBZHZhbmNlUmVzdWx0OjpGYWlsdXJlOworICAgICAgICAgICAgbWFy
a0FzRXJyb3JlZChyZWNvcmQpOworICAgICAgICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpGYWls
dXJlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1fY3Vyc29yVHlwZSA9PSBJbmRleGVkREI6
OkN1cnNvclR5cGU6OktleUFuZFZhbHVlKQotICAgICAgICAgICAgbV9jdXJyZW50UmVjb3JkLnJl
Y29yZC52YWx1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8SURCVmFsdWU+KFRocmVhZFNhZmVEYXRhQnVm
ZmVyOjphZG9wdFZlY3RvcihrZXlEYXRhKSwgYmxvYlVSTHMsIGJsb2JGaWxlUGF0aHMpOworICAg
ICAgICAgICAgcmVjb3JkLnJlY29yZC52YWx1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8SURCVmFsdWU+
KFRocmVhZFNhZmVEYXRhQnVmZmVyOjphZG9wdFZlY3RvcihrZXlEYXRhKSwgYmxvYlVSTHMsIGJs
b2JGaWxlUGF0aHMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghZGVzZXJpYWxpemVJREJL
ZXlEYXRhKGtleURhdGEuZGF0YSgpLCBrZXlEYXRhLnNpemUoKSwgbV9jdXJyZW50UmVjb3JkLnJl
Y29yZC5wcmltYXJ5S2V5KSkgeworICAgICAgICBpZiAoIWRlc2VyaWFsaXplSURCS2V5RGF0YShr
ZXlEYXRhLmRhdGEoKSwga2V5RGF0YS5zaXplKCksIHJlY29yZC5yZWNvcmQucHJpbWFyeUtleSkp
IHsKICAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIHZhbHVlIGRh
dGEgZnJvbSBkYXRhYmFzZSB3aGlsZSBhZHZhbmNpbmcgaW5kZXggY3Vyc29yIik7Ci0gICAgICAg
ICAgICBtYXJrQXNFcnJvcmVkKCk7Ci0gICAgICAgICAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6
RmFpbHVyZTsKKyAgICAgICAgICAgIG1hcmtBc0Vycm9yZWQocmVjb3JkKTsKKyAgICAgICAgICAg
IHJldHVybiBGZXRjaFJlc3VsdDo6RmFpbHVyZTsKICAgICAgICAgfQogCiAgICAgICAgIFNRTGl0
ZVN0YXRlbWVudCBvYmplY3RTdG9yZVN0YXRlbWVudChtX3N0YXRlbWVudC0+ZGF0YWJhc2UoKSwg
IlNFTEVDVCB2YWx1ZSBGUk9NIFJlY29yZHMgV0hFUkUga2V5ID0gQ0FTVCg/IEFTIFRFWFQpIGFu
ZCBvYmplY3RTdG9yZUlEID0gPzsiKTsKQEAgLTQxNSwyOCArNDU0LDI4IEBAIFNRTGl0ZUlEQkN1
cnNvcjo6QWR2YW5jZVJlc3VsdCBTUUxpdGVJREJDdXJzb3I6OmludGVybmFsQWR2YW5jZU9uY2Uo
KQogICAgICAgICAgICAgfHwgb2JqZWN0U3RvcmVTdGF0ZW1lbnQuYmluZEJsb2IoMSwga2V5RGF0
YS5kYXRhKCksIGtleURhdGEuc2l6ZSgpKSAhPSBTUUxJVEVfT0sKICAgICAgICAgICAgIHx8IG9i
amVjdFN0b3JlU3RhdGVtZW50LmJpbmRJbnQ2NCgyLCBtX29iamVjdFN0b3JlSUQpICE9IFNRTElU
RV9PSykgewogICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIGluZGV4IGN1
cnNvciBzdGF0ZW1lbnQgaW50byBvYmplY3Qgc3RvcmUgcmVjb3JkcyAoJWkpICclcyciLCBtX3N0
YXRlbWVudC0+ZGF0YWJhc2UoKS5sYXN0RXJyb3IoKSwgbV9zdGF0ZW1lbnQtPmRhdGFiYXNlKCku
bGFzdEVycm9yTXNnKCkpOwotICAgICAgICAgICAgbWFya0FzRXJyb3JlZCgpOwotICAgICAgICAg
ICAgcmV0dXJuIEFkdmFuY2VSZXN1bHQ6OkZhaWx1cmU7CisgICAgICAgICAgICBtYXJrQXNFcnJv
cmVkKHJlY29yZCk7CisgICAgICAgICAgICByZXR1cm4gRmV0Y2hSZXN1bHQ6OkZhaWx1cmU7CiAg
ICAgICAgIH0KIAogICAgICAgICBpbnQgcmVzdWx0ID0gb2JqZWN0U3RvcmVTdGF0ZW1lbnQuc3Rl
cCgpOwogCiAgICAgICAgIGlmIChyZXN1bHQgPT0gU1FMSVRFX1JPVykgewogICAgICAgICAgICAg
b2JqZWN0U3RvcmVTdGF0ZW1lbnQuZ2V0Q29sdW1uQmxvYkFzVmVjdG9yKDAsIGtleURhdGEpOwot
ICAgICAgICAgICAgbV9jdXJyZW50UmVjb3JkLnJlY29yZC52YWx1ZSA9IHN0ZDo6bWFrZV91bmlx
dWU8SURCVmFsdWU+KFRocmVhZFNhZmVEYXRhQnVmZmVyOjphZG9wdFZlY3RvcihrZXlEYXRhKSk7
CisgICAgICAgICAgICByZWNvcmQucmVjb3JkLnZhbHVlID0gc3RkOjptYWtlX3VuaXF1ZTxJREJW
YWx1ZT4oVGhyZWFkU2FmZURhdGFCdWZmZXI6OmFkb3B0VmVjdG9yKGtleURhdGEpKTsKICAgICAg
ICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgICAgIC8vIFRo
aXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlY29yZCB3ZSdyZSB0cnlpbmcgdG8gcmV0cmlldmUgaGFz
IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBvYmplY3Qgc3RvcmUuCiAgICAgICAgICAgICAvLyBTa2lw
IG92ZXIgaXQuCi0gICAgICAgICAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6U2hvdWxkQWR2YW5j
ZUFnYWluOworICAgICAgICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpTaG91bGRGZXRjaEFnYWlu
OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3Qgc3Rl
cCBpbmRleCBjdXJzb3Igc3RhdGVtZW50IGludG8gb2JqZWN0IHN0b3JlIHJlY29yZHMgKCVpKSAn
JXMnIiwgbV9zdGF0ZW1lbnQtPmRhdGFiYXNlKCkubGFzdEVycm9yKCksIG1fc3RhdGVtZW50LT5k
YXRhYmFzZSgpLmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgICAgIG1hcmtBc0Vycm9yZWQoKTsK
LSAgICAgICAgICAgIHJldHVybiBBZHZhbmNlUmVzdWx0OjpGYWlsdXJlOworICAgICAgICAgICAg
bWFya0FzRXJyb3JlZChyZWNvcmQpOworICAgICAgICAgICAgcmV0dXJuIEZldGNoUmVzdWx0OjpG
YWlsdXJlOwogCiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gQWR2YW5jZVJlc3VsdDo6
U3VjY2VzczsKKyAgICByZXR1cm4gRmV0Y2hSZXN1bHQ6OlN1Y2Nlc3M7CiB9CiAKIGJvb2wgU1FM
aXRlSURCQ3Vyc29yOjppdGVyYXRlKGNvbnN0IElEQktleURhdGEmIHRhcmdldEtleSwgY29uc3Qg
SURCS2V5RGF0YSYgdGFyZ2V0UHJpbWFyeUtleSkKQEAgLTQ0NSwzNSArNDg0LDM2IEBAIGJvb2wg
U1FMaXRlSURCQ3Vyc29yOjppdGVyYXRlKGNvbnN0IElEQktleURhdGEmIHRhcmdldEtleSwgY29u
c3QgSURCS2V5RGF0YSYgdGFyCiAgICAgQVNTRVJUKG1fc3RhdGVtZW50KTsKIAogICAgIGJvb2wg
cmVzdWx0ID0gYWR2YW5jZSgxKTsKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0
eSgpKTsKIAogICAgIC8vIEl0ZXJhdGluZyB3aXRoIG5vIGtleSBpcyBlcXVpdmFsZW50IHRvIGFk
dmFuY2luZyAxIHN0ZXAuCiAgICAgaWYgKHRhcmdldEtleS5pc051bGwoKSB8fCAhcmVzdWx0KQog
ICAgICAgICByZXR1cm4gcmVzdWx0OwogCi0gICAgd2hpbGUgKCFtX2N1cnJlbnRSZWNvcmQuY29t
cGxldGVkKSB7CisgICAgd2hpbGUgKCFtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkuaXNUZXJtaW5h
bFJlY29yZCgpKSB7CiAgICAgICAgIGlmICghcmVzdWx0KQogICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogCiAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG5leHQga2V5ID49IHRoZSB0YXJnZXQg
aWYgdGhlIGN1cnNvciBpcyBhIE5leHQgY3Vyc29yLCBvciB0aGUgbmV4dCBrZXkgPD0gaWYgdGhl
IGN1cnNvciBpcyBhIFByZXZpb3VzIGN1cnNvci4KICAgICAgICAgaWYgKG1fY3Vyc29yRGlyZWN0
aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpOZXh0IHx8IG1fY3Vyc29yRGlyZWN0
aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uOjpOZXh0Tm9EdXBsaWNhdGUpIHsKLSAg
ICAgICAgICAgIGlmIChtX2N1cnJlbnRSZWNvcmQucmVjb3JkLmtleS5jb21wYXJlKHRhcmdldEtl
eSkgPj0gMCkKKyAgICAgICAgICAgIGlmIChtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucmVjb3Jk
LmtleS5jb21wYXJlKHRhcmdldEtleSkgPj0gMCkKICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfSBlbHNlIGlmIChtX2N1cnJlbnRSZWNvcmQucmVjb3JkLmtleS5jb21wYXJlKHRhcmdl
dEtleSkgPD0gMCkKKyAgICAgICAgfSBlbHNlIGlmIChtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCku
cmVjb3JkLmtleS5jb21wYXJlKHRhcmdldEtleSkgPD0gMCkKICAgICAgICAgICAgIGJyZWFrOwog
CiAgICAgICAgIHJlc3VsdCA9IGFkdmFuY2UoMSk7CiAgICAgfQogCiAgICAgaWYgKHRhcmdldFBy
aW1hcnlLZXkuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHdoaWxlICghbV9jdXJyZW50UmVjb3JkLmNv
bXBsZXRlZCAmJiAhbV9jdXJyZW50UmVjb3JkLnJlY29yZC5rZXkuY29tcGFyZSh0YXJnZXRLZXkp
KSB7CisgICAgICAgIHdoaWxlICghbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmlzVGVybWluYWxS
ZWNvcmQoKSAmJiAhbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLnJlY29yZC5rZXkuY29tcGFyZSh0
YXJnZXRLZXkpKSB7CiAgICAgICAgICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG5leHQgcHJpbWFy
eSBrZXkgPj0gdGhlIHByaW1hcnkgdGFyZ2V0IGlmIHRoZSBjdXJzb3IgaXMgYSBOZXh0IGN1cnNv
ciwgb3IgdGhlIG5leHQga2V5IDw9IGlmIHRoZSBjdXJzb3IgaXMgYSBQcmV2aW91cyBjdXJzb3Iu
CiAgICAgICAgICAgICBpZiAobV9jdXJzb3JEaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJzb3JE
aXJlY3Rpb246Ok5leHQgfHwgbV9jdXJzb3JEaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJzb3JE
aXJlY3Rpb246Ok5leHROb0R1cGxpY2F0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJl
bnRSZWNvcmQucmVjb3JkLnByaW1hcnlLZXkuY29tcGFyZSh0YXJnZXRQcmltYXJ5S2V5KSA+PSAw
KQorICAgICAgICAgICAgICAgIGlmIChtX2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucmVjb3JkLnBy
aW1hcnlLZXkuY29tcGFyZSh0YXJnZXRQcmltYXJ5S2V5KSA+PSAwKQogICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9jdXJyZW50UmVjb3JkLnJlY29y
ZC5wcmltYXJ5S2V5LmNvbXBhcmUodGFyZ2V0UHJpbWFyeUtleSkgPD0gMCkKKyAgICAgICAgICAg
IH0gZWxzZSBpZiAobV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLnJlY29yZC5wcmltYXJ5S2V5LmNv
bXBhcmUodGFyZ2V0UHJpbWFyeUtleSkgPD0gMCkKICAgICAgICAgICAgICAgICBicmVhazsKIAog
ICAgICAgICAgICAgcmVzdWx0ID0gYWR2YW5jZSgxKTsKQEAgLTQ4Myw2ICs1MjMsNDMgQEAgYm9v
bCBTUUxpdGVJREJDdXJzb3I6Oml0ZXJhdGUoY29uc3QgSURCS2V5RGF0YSYgdGFyZ2V0S2V5LCBj
b25zdCBJREJLZXlEYXRhJiB0YXIKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitjb25zdCBJREJL
ZXlEYXRhJiBTUUxpdGVJREJDdXJzb3I6OmN1cnJlbnRLZXkoKSBjb25zdAoreworICAgIEFTU0VS
VCghbV9mZXRjaGVkUmVjb3Jkcy5pc0VtcHR5KCkpOworICAgIHJldHVybiBtX2ZldGNoZWRSZWNv
cmRzLmZpcnN0KCkucmVjb3JkLmtleTsKK30KKworY29uc3QgSURCS2V5RGF0YSYgU1FMaXRlSURC
Q3Vyc29yOjpjdXJyZW50UHJpbWFyeUtleSgpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFtX2ZldGNo
ZWRSZWNvcmRzLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fZmV0Y2hlZFJlY29yZHMuZmlyc3Qo
KS5yZWNvcmQucHJpbWFyeUtleTsKK30KKworSURCVmFsdWUqIFNRTGl0ZUlEQkN1cnNvcjo6Y3Vy
cmVudFZhbHVlKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0
eSgpKTsKKyAgICByZXR1cm4gbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLnJlY29yZC52YWx1ZS5n
ZXQoKTsKK30KKworYm9vbCBTUUxpdGVJREJDdXJzb3I6OmRpZENvbXBsZXRlKCkgY29uc3QKK3sK
KyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9m
ZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmNvbXBsZXRlZDsKK30KKworYm9vbCBTUUxpdGVJREJDdXJz
b3I6OmRpZEVycm9yKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIW1fZmV0Y2hlZFJlY29yZHMuaXNF
bXB0eSgpKTsKKyAgICByZXR1cm4gbV9mZXRjaGVkUmVjb3Jkcy5maXJzdCgpLmVycm9yZWQ7Cit9
CisKK2ludDY0X3QgU1FMaXRlSURCQ3Vyc29yOjpjdXJyZW50UmVjb3JkUm93SUQoKSBjb25zdAor
eworICAgIEFTU0VSVCghbV9mZXRjaGVkUmVjb3Jkcy5pc0VtcHR5KCkpOworICAgIHJldHVybiBt
X2ZldGNoZWRSZWNvcmRzLmZpcnN0KCkucm93SUQ7Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgSURC
U2VydmVyCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9TUUxpdGVJREJDdXJzb3IuaCBiL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9TUUxpdGVJREJDdXJzb3IuaAppbmRleCA5
ZDA1Mjc4ZTcyZTY3ODY1MmM5YzM1YWY0NTgzNGEzYjFkYWQ4OWM0Li45YzRjZDkwYmNmMTAzNWI1
YTE5ZjA3ODEzMTdlZjY5MjFkMjI2MzBhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvU1FMaXRlSURCQ3Vyc29yLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1NRTGl0ZUlEQkN1cnNvci5oCkBAIC0zNCw2ICsz
NCw3IEBACiAjaW5jbHVkZSAiSURCUmVzb3VyY2VJZGVudGlmaWVyLmgiCiAjaW5jbHVkZSAiSURC
VmFsdWUuaCIKICNpbmNsdWRlICJTUUxpdGVTdGF0ZW1lbnQuaCIKKyNpbmNsdWRlIDx3dGYvRGVx
dWUuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewpAQCAtNjAsMTcgKzYxLDE4IEBAIHB1YmxpYzoKICAgICBTUUxpdGVJREJUcmFuc2FjdGlvbiog
dHJhbnNhY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3RyYW5zYWN0aW9uOyB9CiAKICAgICBpbnQ2
NF90IG9iamVjdFN0b3JlSUQoKSBjb25zdCB7IHJldHVybiBtX29iamVjdFN0b3JlSUQ7IH0KLSAg
ICBpbnQ2NF90IGN1cnJlbnRSZWNvcmRSb3dJRCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFJl
Y29yZC5yb3dJRDsgfQorICAgIGludDY0X3QgY3VycmVudFJlY29yZFJvd0lEKCkgY29uc3Q7CiAK
LSAgICBjb25zdCBJREJLZXlEYXRhJiBjdXJyZW50S2V5KCkgY29uc3QgeyByZXR1cm4gbV9jdXJy
ZW50UmVjb3JkLnJlY29yZC5rZXk7IH0KLSAgICBjb25zdCBJREJLZXlEYXRhJiBjdXJyZW50UHJp
bWFyeUtleSgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFJlY29yZC5yZWNvcmQucHJpbWFyeUtl
eTsgfQotICAgIElEQlZhbHVlKiBjdXJyZW50VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2N1cnJl
bnRSZWNvcmQucmVjb3JkLnZhbHVlLmdldCgpOyB9CisgICAgY29uc3QgSURCS2V5RGF0YSYgY3Vy
cmVudEtleSgpIGNvbnN0OworICAgIGNvbnN0IElEQktleURhdGEmIGN1cnJlbnRQcmltYXJ5S2V5
KCkgY29uc3Q7CisgICAgSURCVmFsdWUqIGN1cnJlbnRWYWx1ZSgpIGNvbnN0OwogCiAgICAgYm9v
bCBhZHZhbmNlKHVpbnQ2NF90IGNvdW50KTsKICAgICBib29sIGl0ZXJhdGUoY29uc3QgSURCS2V5
RGF0YSYgdGFyZ2V0S2V5LCBjb25zdCBJREJLZXlEYXRhJiB0YXJnZXRQcmltYXJ5S2V5KTsKKyAg
ICB2b2lkIHByZWZldGNoKCk7CiAKLSAgICBib29sIGRpZENvbXBsZXRlKCkgY29uc3QgeyByZXR1
cm4gbV9jdXJyZW50UmVjb3JkLmNvbXBsZXRlZDsgfQotICAgIGJvb2wgZGlkRXJyb3IoKSBjb25z
dCB7IHJldHVybiBtX2N1cnJlbnRSZWNvcmQuZXJyb3JlZDsgfQorICAgIGJvb2wgZGlkQ29tcGxl
dGUoKSBjb25zdDsKKyAgICBib29sIGRpZEVycm9yKCkgY29uc3Q7CiAKICAgICB2b2lkIG9iamVj
dFN0b3JlUmVjb3Jkc0NoYW5nZWQoKTsKIApAQCAtODMsMTcgKzg1LDI1IEBAIHByaXZhdGU6CiAK
ICAgICB2b2lkIHJlc2V0QW5kUmViaW5kU3RhdGVtZW50KCk7CiAKLSAgICB2b2lkIG1hcmtBc0Vy
cm9yZWQoKTsKLQotICAgIGVudW0gY2xhc3MgQWR2YW5jZVJlc3VsdCB7CisgICAgZW51bSBjbGFz
cyBGZXRjaFJlc3VsdCB7CiAgICAgICAgIFN1Y2Nlc3MsCiAgICAgICAgIEZhaWx1cmUsCi0gICAg
ICAgIFNob3VsZEFkdmFuY2VBZ2FpbgorICAgICAgICBTaG91bGRGZXRjaEFnYWluCisgICAgfTsK
KworICAgIGJvb2wgZmV0Y2goKTsKKworICAgIHN0cnVjdCBTUUxpdGVDdXJzb3JSZWNvcmQgewor
ICAgICAgICBJREJDdXJzb3JSZWNvcmQgcmVjb3JkOworICAgICAgICBib29sIGNvbXBsZXRlZCB7
IGZhbHNlIH07CisgICAgICAgIGJvb2wgZXJyb3JlZCB7IGZhbHNlIH07CisgICAgICAgIGludDY0
X3Qgcm93SUQgeyAwIH07CisgICAgICAgIGJvb2wgaXNUZXJtaW5hbFJlY29yZCgpIGNvbnN0IHsg
cmV0dXJuIGNvbXBsZXRlZCB8fCBlcnJvcmVkOyB9CiAgICAgfTsKKyAgICBib29sIGZldGNoTmV4
dFJlY29yZChTUUxpdGVDdXJzb3JSZWNvcmQmKTsKKyAgICBGZXRjaFJlc3VsdCBpbnRlcm5hbEZl
dGNoTmV4dFJlY29yZChTUUxpdGVDdXJzb3JSZWNvcmQmKTsKIAotICAgIEFkdmFuY2VSZXN1bHQg
aW50ZXJuYWxBZHZhbmNlT25jZSgpOwotICAgIGJvb2wgYWR2YW5jZU9uY2UoKTsKLSAgICBib29s
IGFkdmFuY2VVbmlxdWUoKTsKKyAgICB2b2lkIG1hcmtBc0Vycm9yZWQoU1FMaXRlQ3Vyc29yUmVj
b3JkJik7CiAKICAgICBTUUxpdGVJREJUcmFuc2FjdGlvbiogbV90cmFuc2FjdGlvbjsKICAgICBJ
REJSZXNvdXJjZUlkZW50aWZpZXIgbV9jdXJzb3JJZGVudGlmaWVyOwpAQCAtMTA2LDE3ICsxMTYs
MTEgQEAgcHJpdmF0ZToKICAgICBJREJLZXlEYXRhIG1fY3VycmVudExvd2VyS2V5OwogICAgIElE
QktleURhdGEgbV9jdXJyZW50VXBwZXJLZXk7CiAKLSAgICBzdHJ1Y3QgU1FMaXRlQ3Vyc29yUmVj
b3JkIHsKLSAgICAgICAgSURCQ3Vyc29yUmVjb3JkIHJlY29yZDsKLSAgICAgICAgYm9vbCBjb21w
bGV0ZWQgeyBmYWxzZSB9OwotICAgICAgICBib29sIGVycm9yZWQgeyBmYWxzZSB9OwotICAgICAg
ICBpbnQ2NF90IHJvd0lEIHsgMCB9OwotICAgIH07Ci0KLSAgICBTUUxpdGVDdXJzb3JSZWNvcmQg
bV9jdXJyZW50UmVjb3JkOworICAgIERlcXVlPFNRTGl0ZUN1cnNvclJlY29yZD4gbV9mZXRjaGVk
UmVjb3JkczsKKyAgICBJREJLZXlEYXRhIG1fY3VycmVudEtleUZvclVuaXF1ZW5lc3M7CiAKICAg
ICBzdGQ6OnVuaXF1ZV9wdHI8U1FMaXRlU3RhdGVtZW50PiBtX3N0YXRlbWVudDsKLSAgICBib29s
IG1fc3RhdGVtZW50TmVlZHNSZXNldCB7IGZhbHNlIH07CisgICAgYm9vbCBtX3N0YXRlbWVudE5l
ZWRzUmVzZXQgeyB0cnVlIH07CiAgICAgaW50NjRfdCBtX2JvdW5kSUQgeyAwIH07CiAKICAgICBi
b29sIG1fYmFja2luZ1N0b3JlQ3Vyc29yIHsgZmFsc2UgfTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>