<?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>43985</bug_id>
          
          <creation_ts>2010-08-13 11:50:19 -0700</creation_ts>
          <short_desc>Change FileStream implementation to prepare for blob resource handling</short_desc>
          <delta_ts>2010-08-17 11:32:50 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>43941</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jian Li">jianli</reporter>
          <assigned_to name="Jian Li">jianli</assigned_to>
          <cc>dimich</cc>
    
    <cc>kinuko</cc>
    
    <cc>levin</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>264453</commentid>
    <comment_count>0</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-08-13 11:50:19 -0700</bug_when>
    <thetext>Change FileStream implementation to prepare for blob resource handling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264481</commentid>
    <comment_count>1</comment_count>
      <attachid>64369</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-08-13 13:19:30 -0700</bug_when>
    <thetext>Created attachment 64369
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265225</commentid>
    <comment_count>2</comment_count>
      <attachid>64369</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-08-16 13:56:11 -0700</bug_when>
    <thetext>Comment on attachment 64369
Proposed Patch

Just a few issues to address.


Not the focus of this patch but how does lifetime of FileStream work? I see tasks posted from FileStreamProxy to be handled by FileStream on a different thread in WebCore/html/FileStreamProxy.cpp

It looks like the lifetime of FileStream held by FileStreamProxy which is held by FileReader (which is basically held by js), so the lifetime seems to be managed on the ScriptExecutionContext thread (but the class is used on another thread).


&gt; diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
&gt; index 4f69af6..4d0ec7e 100644
&gt; --- a/WebCore/ChangeLog
&gt; +++ b/WebCore/ChangeLog
&gt; @@ -1,3 +1,42 @@
&gt; +2010-08-13  Jian Li  &lt;jianli@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Change FileStream implementation to prepare for blob resource handling.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=43985
&gt; +
&gt; +        Enhance FileStream implementation to support both synchronous and
&gt; +        asynchronous usages. This is needed in preparation to use FileStream
&gt; +        in upcoming blob resource handling change. Update the existing FileReader
&gt; +        code to adapt to this change. 
&gt; +
&gt; +        * html/FileReader.cpp:
&gt; +        (WebCore::FileReader::didStart): 

Account for refactoring of the openForRead method, by now getting the size which the openForRead method used to do. ?


&gt; +        (WebCore::FileReader::didGetSize):
&gt; +        (WebCore::FileReader::didOpen):
&gt; +        (WebCore::FileReader::didRead):
&gt; +        * html/FileReader.h:
&gt; +        * html/FileStream.cpp:

Allow m_client to be 0 when not on the main thread to enable ???

&gt; +        (WebCore::FileStream::start):
&gt; +        (WebCore::FileStream::stop):
&gt; +        (WebCore::FileStream::getSize):
&gt; +        (WebCore::FileStream::openForRead):
&gt; +        (WebCore::FileStream::openForWrite):
&gt; +        (WebCore::FileStream::close):
&gt; +        (WebCore::FileStream::read):
&gt; +        (WebCore::FileStream::write):
&gt; +        (WebCore::FileStream::truncate):
&gt; +        * html/FileStream.h:
&gt; +        * html/FileStreamClient.h:
&gt; +        (WebCore::FileStreamClient::didOpen):
Added to allow ???

&gt; +        * html/FileStreamProxy.cpp:
Connect the new methods across threads.

&gt; +        (WebCore::FileStreamProxy::getSize):
&gt; +        (WebCore::FileStreamProxy::openForRead):
&gt; +        (WebCore::notifyOpenOnContext):
&gt; +        (WebCore::FileStreamProxy::didOpen):

&gt; +        * html/FileStreamProxy.h:
Account for FileStreamClient changes and added getSize/openForRead methods.

&gt; +        * html/FileThreadTask.h:

Added return value for to allow calling FileStream::openForRead.

Some per item comments would be useful in understanding the patch.....I&apos;ll be adding my own as I go through it.


&gt; diff --git a/WebCore/html/FileReader.cpp b/WebCore/html/FileReader.cpp

&gt; +    ASSERT(m_fileBlob-&gt;items().size() == 1 &amp;&amp; m_fileBlob-&gt;items().at(0)-&gt;toFileBlobItem());
&gt; +    const FileRangeBlobItem* fileRangeItem = m_fileBlob-&gt;items().at(0)-&gt;toFileRangeBlobItem();
&gt; +    long long start = fileRangeItem ? fileRangeItem-&gt;start() : 0;
&gt; +
&gt; +    m_totalBytes = fileRangeItem ? fileRangeItem-&gt;size() : size;

When does fileRangeItem-&gt;size() != size ?




&gt; diff --git a/WebCore/html/FileStream.cpp b/WebCore/html/FileStream.cpp

Why not have a AsyncFileStream that has a client and a FileStream that doesn&apos;t? It looks like AsyncFileStream could enforce that m_client is not 0 and just a a thin layer on top of FileStream.


&gt; +long long FileStream::getSize(const String&amp; path, double expectedModificationTime)
&gt; +
&gt; +    // Check the modificationt time for the possible file change.

typo: modificationt


&gt; +ExceptionCode FileStream::openForWrite(const String&amp;)
&gt;  {
&gt; -    ASSERT(!isMainThread());
&gt; +    ASSERT(!m_client || !isMainThread());
&gt;      // FIXME: to be implemented.
&gt; +    return 0;

Seems like it should return a failure code.


&gt; +int FileStream::write(Blob*, long long, int)
&gt;  {
&gt; +    ASSERT(!m_client || !isMainThread());
&gt;      // FIXME: to be implemented.
&gt; +    return 0;

Seems like it should return a failure code.

&gt; +ExceptionCode FileStream::truncate(long long)
&gt;  {
&gt; +    ASSERT(!m_client || !isMainThread());
&gt;      // FIXME: to be implemented.
&gt; +    return 0;

Seems like it should return a failure code.



WebCore/html/FileStream.h:62
 +      // Gets the size of a file. Also validates if the file has been changed or not if the expected modification time is provided.
&quot;if the expected modification time is not 0.&quot;

(It looks like it always must be provided since it is just a double being passed in.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265252</commentid>
    <comment_count>3</comment_count>
    <who name="Kinuko Yasuda">kinuko</who>
    <bug_when>2010-08-16 15:07:58 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Not the focus of this patch but how does lifetime of FileStream work? I see tasks posted from FileStreamProxy to be handled by FileStream on a different thread in WebCore/html/FileStreamProxy.cpp
&gt; 
&gt; It looks like the lifetime of FileStream held by FileStreamProxy which is held by FileReader (which is basically held by js), so the lifetime seems to be managed on the ScriptExecutionContext thread (but the class is used on another thread).

FileStream is a per-file-stream object and is supposed to be managed by the stream owner (e.g. FileReader).  In async context the stream owner owns the proxy&apos;s reference instead of the stream itself, and the proxy manages the lifetime of its peer stream object on FileThread.   There&apos;s some dirty code in FileStreamProxy that handles cases where the context is getting destroyed while there&apos;re queued/ongoing tasks on FileThread.  (I have a local patch that tries to clean up some of this but haven&apos;t uploaded it yet.)

FileThread is a per-ScriptExecutionContext thread (there&apos;s an objection that this might be excessive) and its lifetime is roughly bound to the ScriptExecutionContext.

&gt; &gt; diff --git a/WebCore/html/FileStream.cpp b/WebCore/html/FileStream.cpp
&gt; 
&gt; Why not have a AsyncFileStream that has a client and a FileStream that doesn&apos;t? It looks like AsyncFileStream could enforce that m_client is not 0 and just a a thin layer on top of FileStream

+1 having AsyncFileStream or some separate wrapper class for async cases.
Now that we both have sync and async cases separating classes would simplify several issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265256</commentid>
    <comment_count>4</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-08-16 15:18:52 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; Not the focus of this patch but how does lifetime of FileStream work? I see tasks posted from FileStreamProxy to be handled by FileStream on a different thread in WebCore/html/FileStreamProxy.cpp

&gt; FileStream is a per-file-stream object and is supposed to be managed by the stream owner (e.g. FileReader).  In async context the stream owner owns the proxy&apos;s reference instead of the stream itself, and the proxy manages the lifetime of its peer stream object on FileThread.   There&apos;s some dirty code in FileStreamProxy that handles cases where the context is getting destroyed while there&apos;re queued/ongoing tasks on FileThread. 

Ok, I see now. This is a pretty typical pattern.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265259</commentid>
    <comment_count>5</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-08-16 15:22:28 -0700</bug_when>
    <thetext>Should we also rename FileStreamProxy to AsynFileStreamProxy?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265268</commentid>
    <comment_count>6</comment_count>
    <who name="Kinuko Yasuda">kinuko</who>
    <bug_when>2010-08-16 15:42:48 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Should we also rename FileStreamProxy to AsynFileStreamProxy?

Hmm, I have no strong opinion but sounds like it makes more sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265310</commentid>
    <comment_count>7</comment_count>
      <attachid>64538</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-08-16 17:30:14 -0700</bug_when>
    <thetext>Created attachment 64538
Proposed Patch

All fixed.

As discussed, I removed FileStreamClient callbacks from FileStream and make all methods synchronously only. Also I moved all the asynchronous and callback logics in FileStreamProxy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265312</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-16 17:32:42 -0700</bug_when>
    <thetext>Attachment 64538 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/html/FileStream.cpp:129:  An else if statement should be written as an if statement when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
Total errors found: 1 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265315</commentid>
    <comment_count>9</comment_count>
      <attachid>64540</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-08-16 17:39:34 -0700</bug_when>
    <thetext>Created attachment 64540
Proposed Patch

Fixed style error.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265322</commentid>
    <comment_count>10</comment_count>
    <who name="Kinuko Yasuda">kinuko</who>
    <bug_when>2010-08-16 17:55:49 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Created an attachment (id=64538) [details]
&gt; Proposed Patch
&gt; 
&gt; All fixed.
&gt; 
&gt; As discussed, I removed FileStreamClient callbacks from FileStream and make all methods synchronously only. Also I moved all the asynchronous and callback logics in FileStreamProxy.

This change looks good to me.

Don&apos;t we also want to change Method definitions in WebCore/html/FileThreadTask.h back to return void?
I would wonder how we use the return value of a task body.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265433</commentid>
    <comment_count>11</comment_count>
      <attachid>64540</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-08-17 01:47:28 -0700</bug_when>
    <thetext>Comment on attachment 64540
Proposed Patch

Just a few nits.

&gt; diff --git a/WebCore/html/FileStream.h b/WebCore/html/FileStream.h
&gt; +    int write(Blob* blob, long long position, int length);

param name |blob| not needed.


&gt; diff --git a/WebCore/html/FileStreamProxy.h b/WebCore/html/FileStreamProxy.h
&gt; +    void writeOnFileThread(Blob* blob, long long position, int length);

param name |blob| not needed.

&gt; diff --git a/WebCore/html/FileThreadTask.h b/WebCore/html/FileThreadTask.h
&gt; +    typedef R (T::*Method)(MP1, MP2, MP3);

I agree with Kinuko. (I understand you are doing this for consistency with the other methods in this file but I wonder if all the methods should just handle void returns. I&apos;m fine with this change or changing all of them to be void.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>265670</commentid>
    <comment_count>12</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-08-17 11:32:50 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/65523.

All problems are fixed at landing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64369</attachid>
            <date>2010-08-13 13:19:30 -0700</date>
            <delta_ts>2010-08-16 17:30:14 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>43985</filename>
            <type>text/plain</type>
            <size>17545</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NGY2OWFmNi4uNGQwZWM3ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MiBAQAorMjAxMC0wOC0xMyAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ2hhbmdlIEZpbGVTdHJlYW0gaW1wbGVtZW50YXRpb24gdG8gcHJlcGFyZSBm
b3IgYmxvYiByZXNvdXJjZSBoYW5kbGluZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTQzOTg1CisKKyAgICAgICAgRW5oYW5jZSBGaWxlU3RyZWFtIGlt
cGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgYm90aCBzeW5jaHJvbm91cyBhbmQKKyAgICAgICAgYXN5
bmNocm9ub3VzIHVzYWdlcy4gVGhpcyBpcyBuZWVkZWQgaW4gcHJlcGFyYXRpb24gdG8gdXNlIEZp
bGVTdHJlYW0KKyAgICAgICAgaW4gdXBjb21pbmcgYmxvYiByZXNvdXJjZSBoYW5kbGluZyBjaGFu
Z2UuIFVwZGF0ZSB0aGUgZXhpc3RpbmcgRmlsZVJlYWRlcgorICAgICAgICBjb2RlIHRvIGFkYXB0
IHRvIHRoaXMgY2hhbmdlLiAKKworICAgICAgICAqIGh0bWwvRmlsZVJlYWRlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpGaWxlUmVhZGVyOjpkaWRTdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpG
aWxlUmVhZGVyOjpkaWRHZXRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVSZWFkZXI6OmRp
ZE9wZW4pOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVJlYWRlcjo6ZGlkUmVhZCk6CisgICAgICAg
ICogaHRtbC9GaWxlUmVhZGVyLmg6CisgICAgICAgICogaHRtbC9GaWxlU3RyZWFtLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OnN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OkZp
bGVTdHJlYW06OnN0b3ApOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbTo6Z2V0U2l6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpvcGVuRm9yUmVhZCk6CisgICAgICAgIChX
ZWJDb3JlOjpGaWxlU3RyZWFtOjpvcGVuRm9yV3JpdGUpOgorICAgICAgICAoV2ViQ29yZTo6Rmls
ZVN0cmVhbTo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbTo6cmVhZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpG
aWxlU3RyZWFtOjp0cnVuY2F0ZSk6CisgICAgICAgICogaHRtbC9GaWxlU3RyZWFtLmg6CisgICAg
ICAgICogaHRtbC9GaWxlU3RyZWFtQ2xpZW50Lmg6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3Ry
ZWFtQ2xpZW50OjpkaWRPcGVuKToKKyAgICAgICAgKiBodG1sL0ZpbGVTdHJlYW1Qcm94eS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OmdldFNpemUpOgorICAgICAgICAo
V2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5OjpvcGVuRm9yUmVhZCk6CisgICAgICAgIChXZWJDb3Jl
Ojpub3RpZnlPcGVuT25Db250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW1Qcm94
eTo6ZGlkT3Blbik6CisgICAgICAgICogaHRtbC9GaWxlU3RyZWFtUHJveHkuaDoKKyAgICAgICAg
KiBodG1sL0ZpbGVUaHJlYWRUYXNrLmg6CisKIDIwMTAtMDgtMTMgIFNoZXJpZmYgQm90ICA8d2Vi
a2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcg
b3V0IHI2NTMzMS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmNwcCBiL1dl
YkNvcmUvaHRtbC9GaWxlUmVhZGVyLmNwcAppbmRleCA2ZTU2OGVjLi4xNjE3MDY5IDEwMDY0NAot
LS0gYS9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5jcHAKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVS
ZWFkZXIuY3BwCkBAIC0xNjAsMjUgKzE2MCw1MiBAQCB2b2lkIEZpbGVSZWFkZXI6OnRlcm1pbmF0
ZSgpCiB2b2lkIEZpbGVSZWFkZXI6OmRpZFN0YXJ0KCkKIHsKICAgICBtX3N0YXRlID0gT3Blbmlu
ZzsKLSAgICBtX3N0cmVhbVByb3h5LT5vcGVuRm9yUmVhZChtX2ZpbGVCbG9iLmdldCgpKTsKKwor
ICAgIEFTU0VSVChtX2ZpbGVCbG9iLT5pdGVtcygpLnNpemUoKSA9PSAxICYmIG1fZmlsZUJsb2It
Pml0ZW1zKCkuYXQoMCktPnRvRmlsZUJsb2JJdGVtKCkpOworICAgIGNvbnN0IEZpbGVSYW5nZUJs
b2JJdGVtKiBmaWxlUmFuZ2VJdGVtID0gbV9maWxlQmxvYi0+aXRlbXMoKS5hdCgwKS0+dG9GaWxl
UmFuZ2VCbG9iSXRlbSgpOworICAgIGRvdWJsZSBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWUgPSBm
aWxlUmFuZ2VJdGVtID8gZmlsZVJhbmdlSXRlbS0+c25hcHNob3RNb2RpZmljYXRpb25UaW1lKCkg
OiAwOworCisgICAgbV9zdHJlYW1Qcm94eS0+Z2V0U2l6ZShtX2ZpbGVCbG9iLT5wYXRoKCksIGV4
cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CiB9CiAKIHZvaWQgRmlsZVJlYWRlcjo6ZGlkR2V0U2l6
ZShsb25nIGxvbmcgc2l6ZSkKIHsKKyAgICAvLyBJZiB0aGUgc2l6ZSBpcyAtMSwgaXQgbWVhbnMg
dGhlIGZpbGUgaGFzIGJlZW4gbW92ZWQgb3IgY2hhbmdlZC4gRmFpbCBub3cuCisgICAgaWYgKHNp
emUgPT0gLTEpIHsKKyAgICAgICAgZGlkRmFpbChOT1RfRk9VTkRfRVJSKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKwogICAgIG1fc3RhdGUgPSBSZWFkaW5nOwogICAgIGZpcmVFdmVudChldmVu
dE5hbWVzKCkubG9hZHN0YXJ0RXZlbnQpOwogCi0gICAgbV90b3RhbEJ5dGVzID0gc2l6ZTsKKyAg
ICBBU1NFUlQobV9maWxlQmxvYi0+aXRlbXMoKS5zaXplKCkgPT0gMSAmJiBtX2ZpbGVCbG9iLT5p
dGVtcygpLmF0KDApLT50b0ZpbGVCbG9iSXRlbSgpKTsKKyAgICBjb25zdCBGaWxlUmFuZ2VCbG9i
SXRlbSogZmlsZVJhbmdlSXRlbSA9IG1fZmlsZUJsb2ItPml0ZW1zKCkuYXQoMCktPnRvRmlsZVJh
bmdlQmxvYkl0ZW0oKTsKKyAgICBsb25nIGxvbmcgc3RhcnQgPSBmaWxlUmFuZ2VJdGVtID8gZmls
ZVJhbmdlSXRlbS0+c3RhcnQoKSA6IDA7CisKKyAgICBtX3RvdGFsQnl0ZXMgPSBmaWxlUmFuZ2VJ
dGVtID8gZmlsZVJhbmdlSXRlbS0+c2l6ZSgpIDogc2l6ZTsKKworICAgIG1fc3RyZWFtUHJveHkt
Pm9wZW5Gb3JSZWFkKG1fZmlsZUJsb2ItPnBhdGgoKSwgc3RhcnQsIG1fdG90YWxCeXRlcyk7Cit9
CisKK3ZvaWQgRmlsZVJlYWRlcjo6ZGlkT3BlbigpCit7CiAgICAgbV9zdHJlYW1Qcm94eS0+cmVh
ZCgmbV9idWZmZXIuYXQoMCksIG1fYnVmZmVyLnNpemUoKSk7CiB9CiAKIHZvaWQgRmlsZVJlYWRl
cjo6ZGlkUmVhZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQogewotICAgIEFTU0VS
VChkYXRhICYmIGJ5dGVzUmVhZCk7CisgICAgQVNTRVJUKGRhdGEpOwogCiAgICAgLy8gQmFpbCBv
dXQgaWYgd2UgaGF2ZSBhYm9ydGVkIHRoZSByZWFkaW5nLgogICAgIGlmIChtX3N0YXRlID09IENv
bXBsZXRlZCkKLSAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgYnl0
ZXNSZWFkIGlzIDAsIGl0IG1lYW5zIHRoZSByZWFkaW5nIGlzIGRvbmUuCisgICAgaWYgKCFieXRl
c1JlYWQpIHsKKyAgICAgICAgZGlkRmluaXNoKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAK
ICAgICBzd2l0Y2ggKG1fcmVhZFR5cGUpIHsKICAgICBjYXNlIFJlYWRGaWxlQXNCaW5hcnlTdHJp
bmc6CmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5oIGIvV2ViQ29yZS9odG1s
L0ZpbGVSZWFkZXIuaAppbmRleCA3OTUyNDY4Li43ZjI3MjQxIDEwMDY0NAotLS0gYS9XZWJDb3Jl
L2h0bWwvRmlsZVJlYWRlci5oCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmgKQEAgLTg5
LDggKzg5LDggQEAgcHVibGljOgogICAgIC8vIEZpbGVTdHJlYW1DbGllbnQKICAgICB2aXJ0dWFs
IHZvaWQgZGlkU3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkR2V0U2l6ZShsb25nIGxvbmcp
OworICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuKCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZFJlYWQo
Y29uc3QgY2hhciosIGludCk7Ci0gICAgdmlydHVhbCB2b2lkIGRpZEZpbmlzaCgpOwogICAgIHZp
cnR1YWwgdm9pZCBkaWRGYWlsKEV4Y2VwdGlvbkNvZGUpOwogCiAgICAgdXNpbmcgUmVmQ291bnRl
ZDxGaWxlUmVhZGVyPjo6cmVmOwpAQCAtMTMwLDYgKzEzMCw3IEBAIHByaXZhdGU6CiAgICAgdm9p
ZCBmaXJlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiB0eXBlKTsKICAgICB2b2lkIGNvbnZlcnRU
b1RleHQoKTsKICAgICB2b2lkIGNvbnZlcnRUb0RhdGFVUkwoKTsKKyAgICB2b2lkIGRpZEZpbmlz
aCgpOwogCiAgICAgSW50ZXJuYWxTdGF0ZSBtX3N0YXRlOwogICAgIEV2ZW50VGFyZ2V0RGF0YSBt
X2V2ZW50VGFyZ2V0RGF0YTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNw
cCBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNwcAppbmRleCBhYmU3YmFkLi5lMTE3YzdiIDEw
MDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5jcHAKKysrIGIvV2ViQ29yZS9odG1s
L0ZpbGVTdHJlYW0uY3BwCkBAIC01MiwxMzAgKzUyLDE0MSBAQCBGaWxlU3RyZWFtOjp+RmlsZVN0
cmVhbSgpCiAgICAgQVNTRVJUKCFpc0hhbmRsZVZhbGlkKG1faGFuZGxlKSk7CiB9CiAKKy8vIEZJ
WE1FOiBUbyBiZSByZW1vdmVkIHdoZW4gd2Ugc3dpdGNoIHRvIHVzaW5nIEJsb2JEYXRhLgogdm9p
ZCBGaWxlU3RyZWFtOjpzdGFydCgpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0g
ICAgbV9jbGllbnQtPmRpZFN0YXJ0KCk7CisgICAgQVNTRVJUKCFtX2NsaWVudCB8fCAhaXNNYWlu
VGhyZWFkKCkpOworICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgbV9jbGllbnQtPmRpZFN0YXJ0
KCk7CiB9CiAKIHZvaWQgRmlsZVN0cmVhbTo6c3RvcCgpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5U
aHJlYWQoKSk7CisgICAgQVNTRVJUKCFtX2NsaWVudCB8fCAhaXNNYWluVGhyZWFkKCkpOwogICAg
IGNsb3NlKCk7Ci0gICAgbV9jbGllbnQtPmRpZFN0b3AoKTsKKyAgICBpZiAobV9jbGllbnQpCisg
ICAgICAgIG1fY2xpZW50LT5kaWRTdG9wKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6b3BlbkZv
clJlYWQoQmxvYiogYmxvYikKK2xvbmcgbG9uZyBGaWxlU3RyZWFtOjpnZXRTaXplKGNvbnN0IFN0
cmluZyYgcGF0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkKIHsKLSAgICBBU1NF
UlQoIWlzTWFpblRocmVhZCgpKTsKLQotICAgIGlmIChpc0hhbmRsZVZhbGlkKG1faGFuZGxlKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gRklYTUU6IE5lZWQgdG8gaGFuZGxlIG11bHRpcGxl
IGl0ZW1zIHRoYXQgbWF5IGluY2x1ZGUgbm9uLWZpbGUgb25lcyB3aGVuIEJsb2JCdWlsZGVyIGlz
IGludHJvZHVjZWQuCi0gICAgQVNTRVJUKGJsb2ItPml0ZW1zKCkuc2l6ZSgpID49IDEpOwotICAg
IGNvbnN0IEZpbGVCbG9iSXRlbSogZmlsZUl0ZW0gPSBibG9iLT5pdGVtcygpLmF0KDApLT50b0Zp
bGVCbG9iSXRlbSgpOwotICAgIGlmICghZmlsZUl0ZW0pIHsKLSAgICAgICAgQVNTRVJUKGZhbHNl
KTsKLSAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7Ci0gICAgICAg
IHJldHVybjsKKyAgICBBU1NFUlQoIW1fY2xpZW50IHx8ICFpc01haW5UaHJlYWQoKSk7CisKKyAg
ICAvLyBDaGVjayB0aGUgbW9kaWZpY2F0aW9udCB0aW1lIGZvciB0aGUgcG9zc2libGUgZmlsZSBj
aGFuZ2UuCisgICAgdGltZV90IG1vZGlmaWNhdGlvblRpbWU7CisgICAgaWYgKCFnZXRGaWxlTW9k
aWZpY2F0aW9uVGltZShwYXRoLCBtb2RpZmljYXRpb25UaW1lKSkgeworICAgICAgICBpZiAobV9j
bGllbnQpCisgICAgICAgICAgICBtX2NsaWVudC0+ZGlkR2V0U2l6ZSgtMSk7CisgICAgICAgIHJl
dHVybiAtMTsKICAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgYnkgcXVl
cnlpbmcgaXRzIG1vZGlmaWNhdGlvbiB0aW1lLiBXZSBjaG9vc2Ugbm90IHRvIGNhbGwgZmlsZUV4
aXN0cygpIGluIG9yZGVyIHRvIHNhdmUgYW4KLSAgICAvLyBleHRyYSBmaWxlIHN5c3RlbSBjYWxs
IHdoZW4gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIG5lZWRlZCB0byBjaGVjayB0aGUgdmFsaWRp
dHkgb2YgdGhlIHNsaWNlZCBmaWxlIGJsb2IuCi0gICAgLy8gUGVyIHRoZSBzcGVjLCB3ZSBuZWVk
IHRvIHJldHVybiBkaWZmZXJlbnQgZXJyb3IgY29kZXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVu
IG5vbi1leGlzdGVudCBmaWxlIGFuZCBwZXJtaXNzaW9uIGVycm9yLgotICAgIC8vIG9wZW5GaWxl
KCkgY291bGQgbm90IHRlbGwgdXNlIHRoZSBmYWlsdXJlIHJlYXNvbi4KLSAgICB0aW1lX3QgY3Vy
cmVudE1vZGlmaWNhdGlvblRpbWU7Ci0gICAgaWYgKCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShm
aWxlSXRlbS0+cGF0aCgpLCBjdXJyZW50TW9kaWZpY2F0aW9uVGltZSkpIHsKLSAgICAgICAgbV9j
bGllbnQtPmRpZEZhaWwoTk9UX0ZPVU5EX0VSUik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAo
ZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKSB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDx0aW1l
X3Q+KGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkgIT0gbW9kaWZpY2F0aW9uVGltZSkgeworICAg
ICAgICAgICAgaWYgKG1fY2xpZW50KQorICAgICAgICAgICAgICAgIG1fY2xpZW50LT5kaWRHZXRT
aXplKC0xKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KIAotICAg
IC8vIE9wZW4gdGhlIGZpbGUgYmxvYi4KLSAgICBtX2hhbmRsZSA9IG9wZW5GaWxlKGZpbGVJdGVt
LT5wYXRoKCksIE9wZW5Gb3JSZWFkKTsKLSAgICBpZiAoIWlzSGFuZGxlVmFsaWQobV9oYW5kbGUp
KSB7Ci0gICAgICAgIG1fY2xpZW50LT5kaWRGYWlsKE5PVF9SRUFEQUJMRV9FUlIpOwotICAgICAg
ICByZXR1cm47CisgICAgLy8gTm93IGdldCB0aGUgZmlsZSBzaXplLgorICAgIGxvbmcgbG9uZyBs
ZW5ndGg7CisgICAgaWYgKCFnZXRGaWxlU2l6ZShwYXRoLCBsZW5ndGgpKSB7CisgICAgICAgIGlm
IChtX2NsaWVudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRHZXRTaXplKC0xKTsKKyAgICAg
ICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGNvbnN0IEZpbGVSYW5nZUJsb2JJdGVtKiBmaWxl
UmFuZ2VJdGVtID0gZmlsZUl0ZW0tPnRvRmlsZVJhbmdlQmxvYkl0ZW0oKTsKLSAgICBpZiAoZmls
ZVJhbmdlSXRlbSkgewotICAgICAgICAvLyBDaGVjayB0aGUgbW9kaWZpY2F0aW9udCB0aW1lIGZv
ciB0aGUgcG9zc2libGUgZmlsZSBjaGFuZ2UuCi0gICAgICAgIGlmIChzdGF0aWNfY2FzdDx0aW1l
X3Q+KGZpbGVSYW5nZUl0ZW0tPnNuYXBzaG90TW9kaWZpY2F0aW9uVGltZSgpKSAhPSBjdXJyZW50
TW9kaWZpY2F0aW9uVGltZSkgeworICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgbV9jbGllbnQt
PmRpZEdldFNpemUobGVuZ3RoKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitFeGNlcHRpb25D
b2RlIEZpbGVTdHJlYW06Om9wZW5Gb3JSZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25n
IG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoIW1fY2xpZW50IHx8ICFp
c01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgLy8gT3BlbiB0aGUgZmlsZS4KKyAgICBtX2hhbmRsZSA9IG9w
ZW5GaWxlKHBhdGgsIE9wZW5Gb3JSZWFkKTsKKyAgICBpZiAoIWlzSGFuZGxlVmFsaWQobV9oYW5k
bGUpKSB7CisgICAgICAgIGlmIChtX2NsaWVudCkKICAgICAgICAgICAgIG1fY2xpZW50LT5kaWRG
YWlsKE5PVF9SRUFEQUJMRV9FUlIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Cisg
ICAgICAgIHJldHVybiBOT1RfUkVBREFCTEVfRVJSOworICAgIH0KIAotICAgICAgICAvLyBKdW1w
IHRvIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gaWYgdGhlIGZpbGUgaGFzIGJlZW4gc2xpY2VkLgot
ICAgICAgICBpZiAoZmlsZVJhbmdlSXRlbS0+c3RhcnQoKSA+IDApIHsKLSAgICAgICAgICAgIGlm
IChzZWVrRmlsZShtX2hhbmRsZSwgZmlsZVJhbmdlSXRlbS0+c3RhcnQoKSwgU2Vla0Zyb21CZWdp
bm5pbmcpIDwgMCkgeworICAgIC8vIEp1bXAgdG8gdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBpZiB0
aGUgZmlsZSBoYXMgYmVlbiBzbGljZWQuCisgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAg
aWYgKHNlZWtGaWxlKG1faGFuZGxlLCBvZmZzZXQsIFNlZWtGcm9tQmVnaW5uaW5nKSA8IDApIHsK
KyAgICAgICAgICAgIGlmIChtX2NsaWVudCkKICAgICAgICAgICAgICAgICBtX2NsaWVudC0+ZGlk
RmFpbChOT1RfUkVBREFCTEVfRVJSKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9UX1JFQURBQkxFX0VSUjsKICAgICAgICAgfQog
ICAgIH0KIAotICAgIC8vIEdldCB0aGUgc2l6ZS4KLSAgICBtX3RvdGFsQnl0ZXNUb1JlYWQgPSBi
bG9iLT5zaXplKCk7Ci0gICAgbV9jbGllbnQtPmRpZEdldFNpemUobV90b3RhbEJ5dGVzVG9SZWFk
KTsKKyAgICBtX3RvdGFsQnl0ZXNUb1JlYWQgPSBsZW5ndGg7CisgICAgbV9ieXRlc1Byb2Nlc3Nl
ZCA9IDA7CisKKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIG1fY2xpZW50LT5kaWRPcGVuKCk7
CisgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6b3BlbkZvcldyaXRlKGNvbnN0
IFN0cmluZyYpCitFeGNlcHRpb25Db2RlIEZpbGVTdHJlYW06Om9wZW5Gb3JXcml0ZShjb25zdCBT
dHJpbmcmKQogewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworICAgIEFTU0VSVCghbV9j
bGllbnQgfHwgIWlzTWFpblRocmVhZCgpKTsKICAgICAvLyBGSVhNRTogdG8gYmUgaW1wbGVtZW50
ZWQuCisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQgRmlsZVN0cmVhbTo6Y2xvc2UoKQogewotICAg
IEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworICAgIEFTU0VSVCghbV9jbGllbnQgfHwgIWlzTWFp
blRocmVhZCgpKTsKICAgICBpZiAoaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpIHsKICAgICAgICAg
Y2xvc2VGaWxlKG1faGFuZGxlKTsKICAgICAgICAgbV9oYW5kbGUgPSBpbnZhbGlkUGxhdGZvcm1G
aWxlSGFuZGxlOwogICAgIH0KIH0KIAotdm9pZCBGaWxlU3RyZWFtOjpyZWFkKGNoYXIqIGJ1ZmZl
ciwgaW50IGxlbmd0aCkKK2ludCBGaWxlU3RyZWFtOjpyZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGJ1
ZmZlclNpemUpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKCFt
X2NsaWVudCB8fCAhaXNNYWluVGhyZWFkKCkpOwogCiAgICAgaWYgKCFpc0hhbmRsZVZhbGlkKG1f
aGFuZGxlKSkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfUkVBREFCTEVfRVJSKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX2J5dGVzUHJvY2Vzc2VkID49IG1f
dG90YWxCeXRlc1RvUmVhZCkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNoKCk7Ci0gICAg
ICAgIHJldHVybjsKKyAgICAgICAgaWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQt
PmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAK
ICAgICBsb25nIGxvbmcgcmVtYWluaW5nID0gbV90b3RhbEJ5dGVzVG9SZWFkIC0gbV9ieXRlc1By
b2Nlc3NlZDsKLSAgICBpbnQgYnl0ZXNUb1JlYWQgPSAocmVtYWluaW5nIDwgbGVuZ3RoKSA/IHN0
YXRpY19jYXN0PGludD4ocmVtYWluaW5nKSA6IGxlbmd0aDsKLSAgICBpbnQgYnl0ZXNSZWFkID0g
cmVhZEZyb21GaWxlKG1faGFuZGxlLCBidWZmZXIsIGJ5dGVzVG9SZWFkKTsKKyAgICBpbnQgYnl0
ZXNUb1JlYWQgPSAocmVtYWluaW5nIDwgYnVmZmVyU2l6ZSkgPyBzdGF0aWNfY2FzdDxpbnQ+KHJl
bWFpbmluZykgOiBidWZmZXJTaXplOworICAgIGludCBieXRlc1JlYWQgPSAwOworICAgIGlmIChi
eXRlc1RvUmVhZCA+IDApCisgICAgICAgIGJ5dGVzUmVhZCA9IHJlYWRGcm9tRmlsZShtX2hhbmRs
ZSwgYnVmZmVyLCBieXRlc1RvUmVhZCk7CiAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKLSAgICAg
ICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBpZiAoIWJ5dGVzUmVhZCkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmlu
aXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgICAgIGlmIChtX2NsaWVudCkKKyAg
ICAgICAgICAgIG1fY2xpZW50LT5kaWRGYWlsKE5PVF9SRUFEQUJMRV9FUlIpOworICAgICAgICBy
ZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChieXRlc1JlYWQgPiAwKQorICAgICAgICBtX2J5dGVz
UHJvY2Vzc2VkICs9IGJ5dGVzUmVhZDsKIAotICAgIG1fYnl0ZXNQcm9jZXNzZWQgKz0gYnl0ZXNS
ZWFkOwotICAgIG1fY2xpZW50LT5kaWRSZWFkKGJ1ZmZlciwgYnl0ZXNSZWFkKTsKKyAgICBpZiAo
bV9jbGllbnQpCisgICAgICAgIG1fY2xpZW50LT5kaWRSZWFkKGJ1ZmZlciwgYnl0ZXNSZWFkKTsK
KyAgICByZXR1cm4gYnl0ZXNSZWFkOwogfQogCi12b2lkIEZpbGVTdHJlYW06OndyaXRlKEJsb2Iq
LCBsb25nIGxvbmcsIGludCkKK2ludCBGaWxlU3RyZWFtOjp3cml0ZShCbG9iKiwgbG9uZyBsb25n
LCBpbnQpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKCFtX2Ns
aWVudCB8fCAhaXNNYWluVGhyZWFkKCkpOwogICAgIC8vIEZJWE1FOiB0byBiZSBpbXBsZW1lbnRl
ZC4KKyAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBGaWxlU3RyZWFtOjp0cnVuY2F0ZShsb25nIGxv
bmcpCitFeGNlcHRpb25Db2RlIEZpbGVTdHJlYW06OnRydW5jYXRlKGxvbmcgbG9uZykKIHsKLSAg
ICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQoIW1fY2xpZW50IHx8ICFpc01h
aW5UaHJlYWQoKSk7CiAgICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorICAgIHJldHVy
biAwOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0
bWwvRmlsZVN0cmVhbS5oIGIvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uaAppbmRleCBiNWVjY2Q0
Li5mMGUxNjcwIDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5oCisrKyBiL1dl
YkNvcmUvaHRtbC9GaWxlU3RyZWFtLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2lmIEVOQUJMRShC
TE9CKSB8fCBFTkFCTEUoRklMRV9XUklURVIpCiAKKyNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgi
CiAjaW5jbHVkZSAiRmlsZVN0cmVhbUNsaWVudC5oIgogI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIK
ICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgpAQCAtNTIsMTUgKzUzLDM5IEBAIHB1YmxpYzoKICAg
ICB9CiAgICAgdmlydHVhbCB+RmlsZVN0cmVhbSgpOwogCisgICAgLy8gRklYTUU6IFRvIGJlIHJl
bW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gdXNpbmcgQmxvYkRhdGEuCiAgICAgdm9pZCBzdGFydCgp
OworCisgICAgLy8gQWJvcnRzIHRoZSBvcGVyYXRpb24uCiAgICAgdm9pZCBzdG9wKCk7CiAKLSAg
ICB2b2lkIG9wZW5Gb3JSZWFkKEJsb2IqKTsKLSAgICB2b2lkIG9wZW5Gb3JXcml0ZShjb25zdCBT
dHJpbmcmIHBhdGgpOworICAgIC8vIEdldHMgdGhlIHNpemUgb2YgYSBmaWxlLiBBbHNvIHZhbGlk
YXRlcyBpZiB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9yIG5vdCBpZiB0aGUgZXhwZWN0ZWQg
bW9kaWZpY2F0aW9uIHRpbWUgaXMgcHJvdmlkZWQuCisgICAgLy8gUmV0dXJucyB0b3RhbCBudW1i
ZXIgb2YgYnl0ZXMgaWYgc3VjY2Vzc2Z1bC4gLTEgb3RoZXJ3aXNlLgorICAgIGxvbmcgbG9uZyBn
ZXRTaXplKGNvbnN0IFN0cmluZyYgcGF0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGlt
ZSk7CisKKyAgICAvLyBPcGVucyBhIGZpbGUgZm9yIHJlYWRpbmcuIFRoZSByZWFkaW5nIHN0YXJ0
cyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgbGFzdHMgdGlsbCB0aGUgc3BlY2lmaWVkIGxl
bmd0aC4KKyAgICAvLyBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gRXhjZXB0aW9uIGNvZGUgb3RoZXJ3
aXNlLgorICAgIEV4Y2VwdGlvbkNvZGUgb3BlbkZvclJlYWQoY29uc3QgU3RyaW5nJiBwYXRoLCBs
b25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKTsKKworICAgIC8vIE9wZW5zIGEgZmls
ZSBmb3Igd3JpdGluZy4KKyAgICAvLyBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gRXhjZXB0aW9uIGNv
ZGUgb3RoZXJ3aXNlLgorICAgIEV4Y2VwdGlvbkNvZGUgb3BlbkZvcldyaXRlKGNvbnN0IFN0cmlu
ZyYgcGF0aCk7CisKKyAgICAvLyBDbG9zZXMgdGhlIGZpbGUuCiAgICAgdm9pZCBjbG9zZSgpOwot
ICAgIHZvaWQgcmVhZChjaGFyKiBidWZmZXIsIGludCBsZW5ndGgpOwotICAgIHZvaWQgd3JpdGUo
QmxvYiogYmxvYiwgbG9uZyBsb25nIHBvc2l0aW9uLCBpbnQgbGVuZ3RoKTsKLSAgICB2b2lkIHRy
dW5jYXRlKGxvbmcgbG9uZyBwb3NpdGlvbik7CisKKyAgICAvLyBSZWFkcyBhIGZpbGUgaW50byB0
aGUgcHJvdmlkZWQgZGF0YSBidWZmZXIuCisgICAgLy8gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMg
YmVpbmcgcmVhZCBvbiBzdWNjZXNzLiAtMSBvdGhlcndpc2UuCisgICAgLy8gSWYgMCBpcyByZXR1
cm5lZCwgaXQgbWVhbnMgdGhhdCB0aGUgcmVhZGluZyBpcyBjb21wbGV0ZWQuCisgICAgaW50IHJl
YWQoY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKworICAgIC8vIFdyaXRlcyBhIGJsb2IgdG8g
dGhlIGZpbGUuCisgICAgLy8gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgd3JpdHRlbiBv
biBzdWNjZXNzLiAtMSBvdGhlcndpc2UuCisgICAgaW50IHdyaXRlKEJsb2IqIGJsb2IsIGxvbmcg
bG9uZyBwb3NpdGlvbiwgaW50IGxlbmd0aCk7CisKKyAgICAvLyBUcnVuY2F0ZXMgdGhlIGZpbGUg
dG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KKyAgICAvLyBSZXR1cm5zIDAgb24gc3VjY2Vzcy4g
RXhjZXB0aW9uIGNvZGUgb3RoZXJ3aXNlLgorICAgIEV4Y2VwdGlvbkNvZGUgdHJ1bmNhdGUobG9u
ZyBsb25nIHBvc2l0aW9uKTsKIAogcHJpdmF0ZToKICAgICBGaWxlU3RyZWFtKEZpbGVTdHJlYW1D
bGllbnQqKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtQ2xpZW50LmggYi9X
ZWJDb3JlL2h0bWwvRmlsZVN0cmVhbUNsaWVudC5oCmluZGV4IDJlNzA5MWYuLjRhOTNkNTggMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtQ2xpZW50LmgKKysrIGIvV2ViQ29yZS9o
dG1sL0ZpbGVTdHJlYW1DbGllbnQuaApAQCAtNDUsMTAgKzQ1LDEyIEBAIHB1YmxpYzoKICAgICAv
LyBGb3Igd3JpdGluZy4KICAgICB2aXJ0dWFsIHZvaWQgZGlkV3JpdGUoaW50KSB7IH0KIAotICAg
IC8vIEZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcuCisgICAgLy8gRklYTUU6IFRvIGJlIHJl
bW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gdXNpbmcgQmxvYkRhdGEuCiAgICAgdmlydHVhbCB2b2lk
IGRpZFN0YXJ0KCkgeyB9CisKKyAgICAvLyBGb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLgor
ICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGRpZFN0b3Ao
KSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNoKCkgeyB9CiAgICAgdmlydHVhbCB2b2lk
IGRpZEZhaWwoRXhjZXB0aW9uQ29kZSkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGRpZEdldFNpemUo
bG9uZyBsb25nKSB7IH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW1Qcm94
eS5jcHAgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmNwcAppbmRleCBlM2I5ZTc5Li42
MzIyMjlkIDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmNwcAorKysg
Yi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmNwcApAQCAtNjgsOSArNjgsMTQgQEAgRmls
ZVN0cmVhbVByb3h5Ojp+RmlsZVN0cmVhbVByb3h5KCkKIHsKIH0KIAotdm9pZCBGaWxlU3RyZWFt
UHJveHk6Om9wZW5Gb3JSZWFkKEJsb2IqIGJsb2IpCit2b2lkIEZpbGVTdHJlYW1Qcm94eTo6Z2V0
U2l6ZShjb25zdCBTdHJpbmcmIHBhdGgsIGRvdWJsZSBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWUp
CiB7Ci0gICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayhtX3N0
cmVhbS5nZXQoKSwgJkZpbGVTdHJlYW06Om9wZW5Gb3JSZWFkLCBibG9iKSk7CisgICAgZmlsZVRo
cmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayhtX3N0cmVhbS5nZXQoKSwgJkZp
bGVTdHJlYW06OmdldFNpemUsIHBhdGgsIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkpOworfQor
Cit2b2lkIEZpbGVTdHJlYW1Qcm94eTo6b3BlbkZvclJlYWQoY29uc3QgU3RyaW5nJiBwYXRoLCBs
b25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIGZpbGVUaHJlYWQoKS0+
cG9zdFRhc2soY3JlYXRlRmlsZVRocmVhZFRhc2sobV9zdHJlYW0uZ2V0KCksICZGaWxlU3RyZWFt
OjpvcGVuRm9yUmVhZCwgcGF0aCwgb2Zmc2V0LCBsZW5ndGgpKTsKIH0KIAogdm9pZCBGaWxlU3Ry
ZWFtUHJveHk6Om9wZW5Gb3JXcml0ZShjb25zdCBTdHJpbmcmIHBhdGgpCkBAIC0xMjYsNiArMTMx
LDE4IEBAIHZvaWQgRmlsZVN0cmVhbVByb3h5OjpkaWRHZXRTaXplKGxvbmcgbG9uZyBzaXplKQog
ICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZub3RpZnlHZXRTaXpl
T25Db250ZXh0LCB0aGlzLCBzaXplKSk7CiB9CiAKK3N0YXRpYyB2b2lkIG5vdGlmeU9wZW5PbkNv
bnRleHQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHkpCit7
CisgICAgaWYgKHByb3h5LT5jbGllbnQoKSkKKyAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRP
cGVuKCk7Cit9CisKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpkaWRPcGVuKCkKK3sKKyAgICBBU1NF
UlQoIW1fY29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOworICAgIG1fY29udGV4dC0+cG9zdFRh
c2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZub3RpZnlPcGVuT25Db250ZXh0LCB0aGlzKSk7Cit9CisK
IHN0YXRpYyB2b2lkIG5vdGlmeVJlYWRPbkNvbnRleHQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCos
IEZpbGVTdHJlYW1Qcm94eSogcHJveHksIGNvbnN0IGNoYXIqIGRhdGEsIGludCBieXRlc1JlYWQp
CiB7CiAgICAgaWYgKHByb3h5LT5jbGllbnQoKSkKQEAgLTE2MiwxOCArMTc5LDYgQEAgdm9pZCBG
aWxlU3RyZWFtUHJveHk6OmRpZFN0YXJ0KCkKICAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0
ZUNhbGxiYWNrVGFzaygmbm90aWZ5U3RhcnRPbkNvbnRleHQsIHRoaXMpKTsKIH0KIAotc3RhdGlj
IHZvaWQgbm90aWZ5RmluaXNoT25Db250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxl
U3RyZWFtUHJveHkqIHByb3h5KQotewotICAgIGlmIChwcm94eS0+Y2xpZW50KCkpCi0gICAgICAg
IHByb3h5LT5jbGllbnQoKS0+ZGlkRmluaXNoKCk7Ci19Ci0KLXZvaWQgRmlsZVN0cmVhbVByb3h5
OjpkaWRGaW5pc2goKQotewotICAgIEFTU0VSVCghbV9jb250ZXh0LT5pc0NvbnRleHRUaHJlYWQo
KSk7Ci0gICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rhc2soJm5vdGlmeUZp
bmlzaE9uQ29udGV4dCwgdGhpcykpOwotfQotCiBzdGF0aWMgdm9pZCBub3RpZnlGYWlsT25Db250
ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5LCBFeGNl
cHRpb25Db2RlIGVjKQogewogICAgIGlmIChwcm94eS0+Y2xpZW50KCkpCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmggYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVBy
b3h5LmgKaW5kZXggODUyM2Q0YS4uMTM2OTgwMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9odG1sL0Zp
bGVTdHJlYW1Qcm94eS5oCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtUHJveHkuaApAQCAt
NTMsNyArNTMsOCBAQCBwdWJsaWM6CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8RmlsZVN0cmVhbVBy
b3h5PiBjcmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1DbGllbnQqKTsK
ICAgICB2aXJ0dWFsIH5GaWxlU3RyZWFtUHJveHkoKTsKIAotICAgIHZvaWQgb3BlbkZvclJlYWQo
QmxvYiogYmxvYik7CisgICAgdm9pZCBnZXRTaXplKGNvbnN0IFN0cmluZyYgcGF0aCwgZG91Ymxl
IGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAgdm9pZCBvcGVuRm9yUmVhZChjb25zdCBT
dHJpbmcmIHBhdGgsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9uZyBsZW5ndGgpOwogICAgIHZv
aWQgb3BlbkZvcldyaXRlKGNvbnN0IFN0cmluZyYgcGF0aCk7CiAgICAgdm9pZCBjbG9zZSgpOwog
ICAgIHZvaWQgcmVhZChjaGFyKiBidWZmZXIsIGludCBsZW5ndGgpOwpAQCAtNzEsOSArNzIsOSBA
QCBwcml2YXRlOgogCiAgICAgLy8gRmlsZVN0cmVhbUNsaWVudCBtZXRob2RzLgogICAgIHZpcnR1
YWwgdm9pZCBkaWRHZXRTaXplKGxvbmcgbG9uZyk7CisgICAgdmlydHVhbCB2b2lkIGRpZE9wZW4o
KTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZChjb25zdCBjaGFyKiwgaW50KTsKICAgICB2aXJ0
dWFsIHZvaWQgZGlkV3JpdGUoaW50KTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNoKCk7CiAg
ICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoRXhjZXB0aW9uQ29kZSk7CiAgICAgdmlydHVhbCB2b2lk
IGRpZFN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIGRpZFN0b3AoKTsKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvaHRtbC9GaWxlVGhyZWFkVGFzay5oIGIvV2ViQ29yZS9odG1sL0ZpbGVUaHJlYWRUYXNr
LmgKaW5kZXggMDliNjQ3Zi4uMTRjOTY3NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9odG1sL0ZpbGVU
aHJlYWRUYXNrLmgKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVUaHJlYWRUYXNrLmgKQEAgLTEzMiw3
ICsxMzIsNyBAQCBwcml2YXRlOgogdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlw
ZW5hbWUgUDEsIHR5cGVuYW1lIE1QMSwgdHlwZW5hbWUgUDIsIHR5cGVuYW1lIE1QMiwgdHlwZW5h
bWUgUDMsIHR5cGVuYW1lIE1QMz4KIGNsYXNzIEZpbGVUaHJlYWRUYXNrMyA6IHB1YmxpYyBGaWxl
VGhyZWFkOjpUYXNrIHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIHZvaWQgKFQ6OipNZXRob2QpKE1Q
MSwgTVAyLCBNUDMpOworICAgIHR5cGVkZWYgUiAoVDo6Kk1ldGhvZCkoTVAxLCBNUDIsIE1QMyk7
CiAgICAgdHlwZWRlZiBGaWxlVGhyZWFkVGFzazM8UiwgVCwgUDEsIE1QMSwgUDIsIE1QMiwgUDMs
IE1QMz4gRmlsZVRocmVhZFRhc2tJbXBsOwogICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3Jvc3NUaHJl
YWRUYXNrVHJhaXRzPFAxPjo6UGFyYW1UeXBlIFBhcmFtMTsKICAgICB0eXBlZGVmIHR5cGVuYW1l
IENyb3NzVGhyZWFkVGFza1RyYWl0czxQMj46OlBhcmFtVHlwZSBQYXJhbTI7Cg==
</data>
<flag name="review"
          id="52917"
          type_id="1"
          status="-"
          setter="levin"
    />
    <flag name="commit-queue"
          id="52918"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64538</attachid>
            <date>2010-08-16 17:30:14 -0700</date>
            <delta_ts>2010-08-16 17:39:34 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>43985_2</filename>
            <type>text/plain</type>
            <size>29184</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ODdjZGFkZC4uMTFlZGNmZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2OCBAQAorMjAxMC0wOC0xNiAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ2hhbmdlIEZpbGVTdHJlYW0gaW1wbGVtZW50YXRpb24gdG8gcHJlcGFyZSBm
b3IgYmxvYiByZXNvdXJjZSBoYW5kbGluZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTQzOTg1CisKKyAgICAgICAgQ2hhbmdlIEZpbGVTdHJlYW0gdG8g
c3VwcG9ydCBzeW5jaHJvbm91cyB1c2FnZSBvbmx5LiBBbGwgdGhlIGFzeWNocm9ub3VzCisgICAg
ICAgIGxvZ2ljcyBhcmUgbW92ZWQgdG8gRmlsZVN0cmVhbVByb3h5LiBVcGRhdGUgdGhlIGV4aXN0
aW5nIEZpbGVSZWFkZXIgY29kZQorICAgICAgICB0byBhZGFwdCB0byB0aGlzIGNoYW5nZS4KKwor
ICAgICAgICAqIGh0bWwvRmlsZVJlYWRlci5jcHA6IEFjY291bnQgZm9yIEZpbGVTdHJlYW1Qcm94
eSBjaGFuZ2VzLgorICAgICAgICAoV2ViQ29yZTo6RmlsZVJlYWRlcjo6ZGlkU3RhcnQpOgorICAg
ICAgICAoV2ViQ29yZTo6RmlsZVJlYWRlcjo6ZGlkR2V0U2l6ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpGaWxlUmVhZGVyOjpkaWRPcGVuKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVSZWFkZXI6OmRp
ZFJlYWQpOgorICAgICAgICAqIGh0bWwvRmlsZVJlYWRlci5oOgorICAgICAgICAqIGh0bWwvRmls
ZVN0cmVhbS5jcHA6IFJlbW92ZSBtX2NsaWVudCBhbmQgbWFrZSBhbGwgY2FsbHMgc3luY2hyb25v
dXMgb25seS4KKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OkZpbGVTdHJlYW0pOgorICAg
ICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbTo6c3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6Rmls
ZVN0cmVhbTo6c3RvcCk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpnZXRTaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06Om9wZW5Gb3JSZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkZpbGVTdHJlYW06Om9wZW5Gb3JXcml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxl
U3RyZWFtOjpjbG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpyZWFkKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OndyaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkZp
bGVTdHJlYW06OnRydW5jYXRlKToKKyAgICAgICAgKiBodG1sL0ZpbGVTdHJlYW0uaDogQWRkIGdl
dFNpemUoKSBhbmQgbWFrZSBhbGwgY2FsbHMgc3luY2hyb25vdXMgYnkgYWRkaW5nIHJldHVybiB2
YWx1ZXMuCisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpjcmVhdGUpOgorICAgICAgICAq
IGh0bWwvRmlsZVN0cmVhbUNsaWVudC5oOiBBY2NvdW50IGZvciBGaWxlU3RyZWFtUHJveHkgY2hh
bmdlcy4KKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW1DbGllbnQ6OmRpZFJlYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbUNsaWVudDo6ZGlkVHJ1bmNhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6RmlsZVN0cmVhbUNsaWVudDo6ZGlkT3Blbik6CisgICAgICAgICogaHRtbC9GaWxl
U3RyZWFtUHJveHkuY3BwOiBBbGwgdGhlIGxvZ2ljcyB0byBoYW5kbGUgYXN5bmNocm9ub3VzIGNh
bGxzIGFyZSB3cmFwcGVkIGhlcmUuCisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6
OkZpbGVTdHJlYW1Qcm94eSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OmNy
ZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OmZpbGVUaHJlYWQpOgor
ICAgICAgICAoV2ViQ29yZTo6ZGlkU3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVh
bVByb3h5OjpzdGFydE9uRmlsZVRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFt
UHJveHk6OnN0b3ApOgorICAgICAgICAoV2ViQ29yZTo6ZGVyZWZQcm94eU9uQ29udGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OnN0b3BPbkZpbGVUaHJlYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6ZGlkR2V0U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFt
UHJveHk6OmdldFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5OjpnZXRT
aXplT25GaWxlVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OmRpZE9wZW4pOgorICAgICAgICAo
V2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5OjpvcGVuRm9yUmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JSZWFkT25GaWxlVGhyZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkZpbGVTdHJlYW1Qcm94eTo6b3BlbkZvcldyaXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkZpbGVTdHJlYW1Qcm94eTo6b3BlbkZvcldyaXRlT25GaWxlVGhyZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkZpbGVTdHJlYW1Qcm94eTo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0
cmVhbVByb3h5OjpjbG9zZU9uRmlsZVRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpkaWRSZWFk
KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW1Qcm94eTo6cmVhZCk6CisgICAgICAgIChX
ZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OnJlYWRPbkZpbGVUaHJlYWQpOgorICAgICAgICAoV2Vi
Q29yZTo6ZGlkV3JpdGUpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5Ojp3cml0
ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OndyaXRlT25GaWxlVGhyZWFk
KToKKyAgICAgICAgKFdlYkNvcmU6OmRpZFRydW5jYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkZp
bGVTdHJlYW1Qcm94eTo6dHJ1bmNhdGUpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbVBy
b3h5Ojp0cnVuY2F0ZU9uRmlsZVRocmVhZCk6CisgICAgICAgICogaHRtbC9GaWxlU3RyZWFtUHJv
eHkuaDoKKyAgICAgICAgKiBodG1sL0ZpbGVUaHJlYWRUYXNrLmg6IEFkZGVkIG1pc3NpbmcgcmV0
dXJuIHZhbHVlIGluIG9uZSBjYWxsYmFjayBtZXRob2QuCisKIDIwMTAtMDgtMTYgIFZpbmNlbnQg
U2NoZWliICA8c2NoZWliQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEaW1p
dHJpIEdsYXprb3YuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5jcHAgYi9X
ZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5jcHAKaW5kZXggNmU1NjhlYy4uZTk5ZmRjNCAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3BwCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxl
UmVhZGVyLmNwcApAQCAtMTYwLDMzICsxNjAsNzAgQEAgdm9pZCBGaWxlUmVhZGVyOjp0ZXJtaW5h
dGUoKQogdm9pZCBGaWxlUmVhZGVyOjpkaWRTdGFydCgpCiB7CiAgICAgbV9zdGF0ZSA9IE9wZW5p
bmc7Ci0gICAgbV9zdHJlYW1Qcm94eS0+b3BlbkZvclJlYWQobV9maWxlQmxvYi5nZXQoKSk7CisK
KyAgICBBU1NFUlQobV9maWxlQmxvYi0+aXRlbXMoKS5zaXplKCkgPT0gMSAmJiBtX2ZpbGVCbG9i
LT5pdGVtcygpLmF0KDApLT50b0ZpbGVCbG9iSXRlbSgpKTsKKyAgICBjb25zdCBGaWxlUmFuZ2VC
bG9iSXRlbSogZmlsZVJhbmdlSXRlbSA9IG1fZmlsZUJsb2ItPml0ZW1zKCkuYXQoMCktPnRvRmls
ZVJhbmdlQmxvYkl0ZW0oKTsKKyAgICBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lID0g
ZmlsZVJhbmdlSXRlbSA/IGZpbGVSYW5nZUl0ZW0tPnNuYXBzaG90TW9kaWZpY2F0aW9uVGltZSgp
IDogMDsKKworICAgIG1fc3RyZWFtUHJveHktPmdldFNpemUobV9maWxlQmxvYi0+cGF0aCgpLCBl
eHBlY3RlZE1vZGlmaWNhdGlvblRpbWUpOwogfQogCiB2b2lkIEZpbGVSZWFkZXI6OmRpZEdldFNp
emUobG9uZyBsb25nIHNpemUpCiB7CisgICAgLy8gSWYgdGhlIHNpemUgaXMgLTEsIGl0IG1lYW5z
IHRoZSBmaWxlIGhhcyBiZWVuIG1vdmVkIG9yIGNoYW5nZWQuIEZhaWwgbm93LgorICAgIGlmIChz
aXplID09IC0xKSB7CisgICAgICAgIGRpZEZhaWwoTk9UX0ZPVU5EX0VSUik7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKICAgICBtX3N0YXRlID0gUmVhZGluZzsKICAgICBmaXJlRXZlbnQoZXZl
bnROYW1lcygpLmxvYWRzdGFydEV2ZW50KTsKIAotICAgIG1fdG90YWxCeXRlcyA9IHNpemU7Ci0g
ICAgbV9zdHJlYW1Qcm94eS0+cmVhZCgmbV9idWZmZXIuYXQoMCksIG1fYnVmZmVyLnNpemUoKSk7
CisgICAgQVNTRVJUKG1fZmlsZUJsb2ItPml0ZW1zKCkuc2l6ZSgpID09IDEgJiYgbV9maWxlQmxv
Yi0+aXRlbXMoKS5hdCgwKS0+dG9GaWxlQmxvYkl0ZW0oKSk7CisgICAgY29uc3QgRmlsZVJhbmdl
QmxvYkl0ZW0qIGZpbGVSYW5nZUl0ZW0gPSBtX2ZpbGVCbG9iLT5pdGVtcygpLmF0KDApLT50b0Zp
bGVSYW5nZUJsb2JJdGVtKCk7CisgICAgbG9uZyBsb25nIHN0YXJ0ID0gZmlsZVJhbmdlSXRlbSA/
IGZpbGVSYW5nZUl0ZW0tPnN0YXJ0KCkgOiAwOworCisgICAgLy8gVGhlIHNpemUgcGFzc2VkIGJh
Y2sgaXMgdGhlIHNpemUgb2YgdGhlIHdob2xlIGZpbGUuIElmIHRoZSB1bmRlcmx5aW5nIGl0ZW0g
aXMgYSBzbGljZWQgZmlsZSwgd2UgbmVlZCB0byB1c2UgdGhlIHNsaWNlIGxlbmd0aC4KKyAgICBt
X3RvdGFsQnl0ZXMgPSBmaWxlUmFuZ2VJdGVtID8gZmlsZVJhbmdlSXRlbS0+c2l6ZSgpIDogc2l6
ZTsKKworICAgIG1fc3RyZWFtUHJveHktPm9wZW5Gb3JSZWFkKG1fZmlsZUJsb2ItPnBhdGgoKSwg
c3RhcnQsIG1fdG90YWxCeXRlcyk7CiB9CiAKLXZvaWQgRmlsZVJlYWRlcjo6ZGlkUmVhZChjb25z
dCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQordm9pZCBGaWxlUmVhZGVyOjpkaWRPcGVuKEV4
Y2VwdGlvbkNvZGUgZWMpCiB7Ci0gICAgQVNTRVJUKGRhdGEgJiYgYnl0ZXNSZWFkKTsKKyAgICBp
ZiAoZWMpIHsKKyAgICAgICAgZGlkRmFpbChlYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgCisgICAgbV9zdHJlYW1Qcm94eS0+cmVhZChtX2J1ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNp
emUoKSk7Cit9CiAKK3ZvaWQgRmlsZVJlYWRlcjo6ZGlkUmVhZChpbnQgYnl0ZXNSZWFkKQorewog
ICAgIC8vIEJhaWwgb3V0IGlmIHdlIGhhdmUgYWJvcnRlZCB0aGUgcmVhZGluZy4KICAgICBpZiAo
bV9zdGF0ZSA9PSBDb21wbGV0ZWQpCi0gICAgICByZXR1cm47CisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIElmIGJ5dGVzUmVhZCBpcyAtMSwgaXQgbWVhbnMgYW4gZXJyb3IgaGFwcGVucy4KKyAg
ICBpZiAoYnl0ZXNSZWFkID09IC0xKSB7CisgICAgICAgIGRpZEZhaWwoTk9UX1JFQURBQkxFX0VS
Uik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiBieXRlc1JlYWQgaXMgMCwg
aXQgbWVhbnMgdGhlIHJlYWRpbmcgaXMgZG9uZS4KKyAgICBpZiAoIWJ5dGVzUmVhZCkgeworICAg
ICAgICBkaWRGaW5pc2goKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHN3aXRjaCAo
bV9yZWFkVHlwZSkgewogICAgIGNhc2UgUmVhZEZpbGVBc0JpbmFyeVN0cmluZzoKLSAgICAgICAg
bV9yZXN1bHQgKz0gU3RyaW5nKGRhdGEsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihieXRlc1JlYWQp
KTsKKyAgICAgICAgbV9yZXN1bHQgKz0gU3RyaW5nKG1fYnVmZmVyLmRhdGEoKSwgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KGJ5dGVzUmVhZCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFJlYWRG
aWxlQXNUZXh0OgogICAgIGNhc2UgUmVhZEZpbGVBc0RhdGFVUkw6Ci0gICAgICAgIG1fcmF3RGF0
YS5hcHBlbmQoZGF0YSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJ5dGVzUmVhZCkpOworICAgICAg
ICBtX3Jhd0RhdGEuYXBwZW5kKG1fYnVmZmVyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KGJ5dGVzUmVhZCkpOwogICAgICAgICBtX2lzUmF3RGF0YUNvbnZlcnRlZCA9IGZhbHNlOwogICAg
ICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMjA1LDcgKzI0Miw3IEBAIHZvaWQgRmlsZVJl
YWRlcjo6ZGlkUmVhZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQogICAgIH0KIAog
ICAgIC8vIENvbnRpbnVlIHJlYWRpbmcuCi0gICAgbV9zdHJlYW1Qcm94eS0+cmVhZCgmbV9idWZm
ZXIuYXQoMCksIG1fYnVmZmVyLnNpemUoKSk7CisgICAgbV9zdHJlYW1Qcm94eS0+cmVhZChtX2J1
ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNpemUoKSk7CiB9CiAKIHZvaWQgRmlsZVJlYWRlcjo6ZGlk
RmluaXNoKCkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmggYi9XZWJDb3Jl
L2h0bWwvRmlsZVJlYWRlci5oCmluZGV4IDc5NTI0NjguLjIyMzdhZjUgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvaHRtbC9GaWxlUmVhZGVyLmgKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuaApA
QCAtODksOSArODksOCBAQCBwdWJsaWM6CiAgICAgLy8gRmlsZVN0cmVhbUNsaWVudAogICAgIHZp
cnR1YWwgdm9pZCBkaWRTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBkaWRHZXRTaXplKGxvbmcg
bG9uZyk7Ci0gICAgdmlydHVhbCB2b2lkIGRpZFJlYWQoY29uc3QgY2hhciosIGludCk7Ci0gICAg
dmlydHVhbCB2b2lkIGRpZEZpbmlzaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkaWRGYWlsKEV4Y2Vw
dGlvbkNvZGUpOworICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuKEV4Y2VwdGlvbkNvZGUpOworICAg
IHZpcnR1YWwgdm9pZCBkaWRSZWFkKGludCk7CiAKICAgICB1c2luZyBSZWZDb3VudGVkPEZpbGVS
ZWFkZXI+OjpyZWY7CiAgICAgdXNpbmcgUmVmQ291bnRlZDxGaWxlUmVhZGVyPjo6ZGVyZWY7CkBA
IC0xMzAsNiArMTI5LDggQEAgcHJpdmF0ZToKICAgICB2b2lkIGZpcmVFdmVudChjb25zdCBBdG9t
aWNTdHJpbmcmIHR5cGUpOwogICAgIHZvaWQgY29udmVydFRvVGV4dCgpOwogICAgIHZvaWQgY29u
dmVydFRvRGF0YVVSTCgpOworICAgIHZvaWQgZGlkRmluaXNoKCk7CisgICAgdm9pZCBkaWRGYWls
KEV4Y2VwdGlvbkNvZGUpOwogCiAgICAgSW50ZXJuYWxTdGF0ZSBtX3N0YXRlOwogICAgIEV2ZW50
VGFyZ2V0RGF0YSBtX2V2ZW50VGFyZ2V0RGF0YTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9G
aWxlU3RyZWFtLmNwcCBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNwcAppbmRleCBhYmU3YmFk
Li5mZWY4NTJlIDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5jcHAKKysrIGIv
V2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uY3BwCkBAIC0zOSw5ICszOSw4IEBACiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAotRmlsZVN0cmVhbTo6RmlsZVN0cmVhbShGaWxlU3RyZWFtQ2xpZW50KiBj
bGllbnQpCi0gICAgOiBtX2NsaWVudChjbGllbnQpCi0gICAgLCBtX2hhbmRsZShpbnZhbGlkUGxh
dGZvcm1GaWxlSGFuZGxlKQorRmlsZVN0cmVhbTo6RmlsZVN0cmVhbSgpCisgICAgOiBtX2hhbmRs
ZShpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQogICAgICwgbV9ieXRlc1Byb2Nlc3NlZCgwKQog
ICAgICwgbV90b3RhbEJ5dGVzVG9SZWFkKDApCiB7CkBAIC01MiwxMzAgKzUxLDk5IEBAIEZpbGVT
dHJlYW06On5GaWxlU3RyZWFtKCkKICAgICBBU1NFUlQoIWlzSGFuZGxlVmFsaWQobV9oYW5kbGUp
KTsKIH0KIAorLy8gRklYTUU6IFRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gdXNpbmcg
QmxvYkRhdGEuCiB2b2lkIEZpbGVTdHJlYW06OnN0YXJ0KCkKIHsKLSAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKLSAgICBtX2NsaWVudC0+ZGlkU3RhcnQoKTsKIH0KIAogdm9pZCBGaWxlU3Ry
ZWFtOjpzdG9wKCkKIHsKLSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKICAgICBjbG9zZSgp
OwotICAgIG1fY2xpZW50LT5kaWRTdG9wKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6b3BlbkZv
clJlYWQoQmxvYiogYmxvYikKK2xvbmcgbG9uZyBGaWxlU3RyZWFtOjpnZXRTaXplKGNvbnN0IFN0
cmluZyYgcGF0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkKIHsKLSAgICBBU1NF
UlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICAvLyBDaGVjayB0aGUgbW9kaWZpY2F0aW9uIHRpbWUg
Zm9yIHRoZSBwb3NzaWJsZSBmaWxlIGNoYW5nZS4KKyAgICB0aW1lX3QgbW9kaWZpY2F0aW9uVGlt
ZTsKKyAgICBpZiAoIWdldEZpbGVNb2RpZmljYXRpb25UaW1lKHBhdGgsIG1vZGlmaWNhdGlvblRp
bWUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGV4cGVjdGVkTW9kaWZpY2F0aW9uVGlt
ZSkgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dGltZV90PihleHBlY3RlZE1vZGlmaWNhdGlv
blRpbWUpICE9IG1vZGlmaWNhdGlvblRpbWUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAg
fQorCisgICAgLy8gTm93IGdldCB0aGUgZmlsZSBzaXplLgorICAgIGxvbmcgbG9uZyBsZW5ndGg7
CisgICAgaWYgKCFnZXRGaWxlU2l6ZShwYXRoLCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gLTE7
CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQogCitFeGNlcHRpb25Db2RlIEZpbGVTdHJlYW06Om9w
ZW5Gb3JSZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25n
IGxlbmd0aCkKK3sKICAgICBpZiAoaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGhhbmRsZSBtdWx0aXBsZSBpdGVtcyB0aGF0
IG1heSBpbmNsdWRlIG5vbi1maWxlIG9uZXMgd2hlbiBCbG9iQnVpbGRlciBpcyBpbnRyb2R1Y2Vk
LgotICAgIEFTU0VSVChibG9iLT5pdGVtcygpLnNpemUoKSA+PSAxKTsKLSAgICBjb25zdCBGaWxl
QmxvYkl0ZW0qIGZpbGVJdGVtID0gYmxvYi0+aXRlbXMoKS5hdCgwKS0+dG9GaWxlQmxvYkl0ZW0o
KTsKLSAgICBpZiAoIWZpbGVJdGVtKSB7Ci0gICAgICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgICAg
IG1fY2xpZW50LT5kaWRGYWlsKE5PVF9SRUFEQUJMRV9FUlIpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQorICAgICAgICByZXR1cm4gMDsKIAotICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0
cyBieSBxdWVyeWluZyBpdHMgbW9kaWZpY2F0aW9uIHRpbWUuIFdlIGNob29zZSBub3QgdG8gY2Fs
bCBmaWxlRXhpc3RzKCkgaW4gb3JkZXIgdG8gc2F2ZSBhbgotICAgIC8vIGV4dHJhIGZpbGUgc3lz
dGVtIGNhbGwgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgaXMgbmVlZGVkIHRvIGNoZWNrIHRo
ZSB2YWxpZGl0eSBvZiB0aGUgc2xpY2VkIGZpbGUgYmxvYi4KLSAgICAvLyBQZXIgdGhlIHNwZWMs
IHdlIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBlcnJvciBjb2RlcyB0byBkaWZmZXJlbnRpYXRl
IGJldHdlZW4gbm9uLWV4aXN0ZW50IGZpbGUgYW5kIHBlcm1pc3Npb24gZXJyb3IuCi0gICAgLy8g
b3BlbkZpbGUoKSBjb3VsZCBub3QgdGVsbCB1c2UgdGhlIGZhaWx1cmUgcmVhc29uLgotICAgIHRp
bWVfdCBjdXJyZW50TW9kaWZpY2F0aW9uVGltZTsKLSAgICBpZiAoIWdldEZpbGVNb2RpZmljYXRp
b25UaW1lKGZpbGVJdGVtLT5wYXRoKCksIGN1cnJlbnRNb2RpZmljYXRpb25UaW1lKSkgewotICAg
ICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfRk9VTkRfRVJSKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KKyAgICAvLyBPcGVuIHRoZSBmaWxlLgorICAgIG1faGFuZGxlID0gb3BlbkZpbGUocGF0
aCwgT3BlbkZvclJlYWQpOworICAgIGlmICghaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpCisgICAg
ICAgIHJldHVybiBOT1RfUkVBREFCTEVfRVJSOwogCi0gICAgLy8gT3BlbiB0aGUgZmlsZSBibG9i
LgotICAgIG1faGFuZGxlID0gb3BlbkZpbGUoZmlsZUl0ZW0tPnBhdGgoKSwgT3BlbkZvclJlYWQp
OwotICAgIGlmICghaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpIHsKLSAgICAgICAgbV9jbGllbnQt
PmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7Ci0gICAgICAgIHJldHVybjsKKyAgICAvLyBKdW1w
IHRvIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gaWYgdGhlIGZpbGUgaGFzIGJlZW4gc2xpY2VkLgor
ICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgIGlmIChzZWVrRmlsZShtX2hhbmRsZSwgb2Zm
c2V0LCBTZWVrRnJvbUJlZ2lubmluZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5PVF9SRUFE
QUJMRV9FUlI7CiAgICAgfQogCi0gICAgY29uc3QgRmlsZVJhbmdlQmxvYkl0ZW0qIGZpbGVSYW5n
ZUl0ZW0gPSBmaWxlSXRlbS0+dG9GaWxlUmFuZ2VCbG9iSXRlbSgpOwotICAgIGlmIChmaWxlUmFu
Z2VJdGVtKSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBtb2RpZmljYXRpb250IHRpbWUgZm9yIHRo
ZSBwb3NzaWJsZSBmaWxlIGNoYW5nZS4KLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHRpbWVfdD4o
ZmlsZVJhbmdlSXRlbS0+c25hcHNob3RNb2RpZmljYXRpb25UaW1lKCkpICE9IGN1cnJlbnRNb2Rp
ZmljYXRpb25UaW1lKSB7Ci0gICAgICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfUkVBREFC
TEVfRVJSKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEp1
bXAgdG8gdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBpZiB0aGUgZmlsZSBoYXMgYmVlbiBzbGljZWQu
Ci0gICAgICAgIGlmIChmaWxlUmFuZ2VJdGVtLT5zdGFydCgpID4gMCkgewotICAgICAgICAgICAg
aWYgKHNlZWtGaWxlKG1faGFuZGxlLCBmaWxlUmFuZ2VJdGVtLT5zdGFydCgpLCBTZWVrRnJvbUJl
Z2lubmluZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JF
QURBQkxFX0VSUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQorICAgIG1fdG90YWxCeXRlc1RvUmVhZCA9IGxlbmd0aDsKKyAgICBtX2J5
dGVzUHJvY2Vzc2VkID0gMDsKIAotICAgIC8vIEdldCB0aGUgc2l6ZS4KLSAgICBtX3RvdGFsQnl0
ZXNUb1JlYWQgPSBibG9iLT5zaXplKCk7Ci0gICAgbV9jbGllbnQtPmRpZEdldFNpemUobV90b3Rh
bEJ5dGVzVG9SZWFkKTsKKyAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBGaWxlU3RyZWFtOjpvcGVu
Rm9yV3JpdGUoY29uc3QgU3RyaW5nJikKK0V4Y2VwdGlvbkNvZGUgRmlsZVN0cmVhbTo6b3BlbkZv
cldyaXRlKGNvbnN0IFN0cmluZyYpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CiAg
ICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorICAgIHJldHVybiBOT1RfU1VQUE9SVEVE
X0VSUjsKIH0KIAogdm9pZCBGaWxlU3RyZWFtOjpjbG9zZSgpCiB7Ci0gICAgQVNTRVJUKCFpc01h
aW5UaHJlYWQoKSk7CiAgICAgaWYgKGlzSGFuZGxlVmFsaWQobV9oYW5kbGUpKSB7CiAgICAgICAg
IGNsb3NlRmlsZShtX2hhbmRsZSk7CiAgICAgICAgIG1faGFuZGxlID0gaW52YWxpZFBsYXRmb3Jt
RmlsZUhhbmRsZTsKICAgICB9CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6cmVhZChjaGFyKiBidWZm
ZXIsIGludCBsZW5ndGgpCitpbnQgRmlsZVN0cmVhbTo6cmVhZChjaGFyKiBidWZmZXIsIGludCBi
dWZmZXJTaXplKQogewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotCi0gICAgaWYgKCFp
c0hhbmRsZVZhbGlkKG1faGFuZGxlKSkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1Rf
UkVBREFCTEVfRVJSKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX2J5dGVz
UHJvY2Vzc2VkID49IG1fdG90YWxCeXRlc1RvUmVhZCkgewotICAgICAgICBtX2NsaWVudC0+ZGlk
RmluaXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgaWYgKCFpc0hhbmRsZVZhbGlk
KG1faGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgbG9uZyBsb25nIHJlbWFpbmlu
ZyA9IG1fdG90YWxCeXRlc1RvUmVhZCAtIG1fYnl0ZXNQcm9jZXNzZWQ7Ci0gICAgaW50IGJ5dGVz
VG9SZWFkID0gKHJlbWFpbmluZyA8IGxlbmd0aCkgPyBzdGF0aWNfY2FzdDxpbnQ+KHJlbWFpbmlu
ZykgOiBsZW5ndGg7Ci0gICAgaW50IGJ5dGVzUmVhZCA9IHJlYWRGcm9tRmlsZShtX2hhbmRsZSwg
YnVmZmVyLCBieXRlc1RvUmVhZCk7Ci0gICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKLSAgICAgICAg
bV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICBpZiAoIWJ5dGVzUmVhZCkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNo
KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2J5dGVzUHJvY2Vzc2VkICs9IGJ5
dGVzUmVhZDsKLSAgICBtX2NsaWVudC0+ZGlkUmVhZChidWZmZXIsIGJ5dGVzUmVhZCk7CisgICAg
aW50IGJ5dGVzVG9SZWFkID0gKHJlbWFpbmluZyA8IGJ1ZmZlclNpemUpID8gc3RhdGljX2Nhc3Q8
aW50PihyZW1haW5pbmcpIDogYnVmZmVyU2l6ZTsKKyAgICBpbnQgYnl0ZXNSZWFkID0gMDsKKyAg
ICBpZiAoYnl0ZXNUb1JlYWQgPiAwKQorICAgICAgICBieXRlc1JlYWQgPSByZWFkRnJvbUZpbGUo
bV9oYW5kbGUsIGJ1ZmZlciwgYnl0ZXNUb1JlYWQpOworICAgIGlmIChieXRlc1JlYWQgPCAwKQor
ICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZSBpZiAoYnl0ZXNSZWFkID4gMCkKKyAgICAgICAg
bV9ieXRlc1Byb2Nlc3NlZCArPSBieXRlc1JlYWQ7CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOwog
fQogCi12b2lkIEZpbGVTdHJlYW06OndyaXRlKEJsb2IqLCBsb25nIGxvbmcsIGludCkKK2ludCBG
aWxlU3RyZWFtOjp3cml0ZShCbG9iKiwgbG9uZyBsb25nLCBpbnQpCiB7Ci0gICAgQVNTRVJUKCFp
c01haW5UaHJlYWQoKSk7CiAgICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorICAgIHJl
dHVybiAtMTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtOjp0cnVuY2F0ZShsb25nIGxvbmcpCitFeGNl
cHRpb25Db2RlIEZpbGVTdHJlYW06OnRydW5jYXRlKGxvbmcgbG9uZykKIHsKLSAgICBBU1NFUlQo
IWlzTWFpblRocmVhZCgpKTsKICAgICAvLyBGSVhNRTogdG8gYmUgaW1wbGVtZW50ZWQuCisgICAg
cmV0dXJuIE5PVF9TVVBQT1JURURfRVJSOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5oIGIvV2ViQ29yZS9odG1sL0ZpbGVT
dHJlYW0uaAppbmRleCBiNWVjY2Q0Li44NWM3YjE1IDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwv
RmlsZVN0cmVhbS5oCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmgKQEAgLTMzLDcgKzMz
LDcgQEAKIAogI2lmIEVOQUJMRShCTE9CKSB8fCBFTkFCTEUoRklMRV9XUklURVIpCiAKLSNpbmNs
dWRlICJGaWxlU3RyZWFtQ2xpZW50LmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgogI2lu
Y2x1ZGUgIkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgogI2luY2x1ZGUg
PHd0Zi9QYXNzUmVmUHRyLmg+CkBAIC00MywyOSArNDMsNTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiBjbGFzcyBCbG9iOwogCi0vLyBBbGwgbWV0aG9kcyBhcmUgc3luY2hyb25vdXMgYW5kIHNo
b3VsZCBiZSBjYWxsZWQgb24gRmlsZSBvciBXb3JrZXIgdGhyZWFkLgorLy8gQWxsIG1ldGhvZHMg
YXJlIHN5bmNocm9ub3VzLgogY2xhc3MgRmlsZVN0cmVhbSA6IHB1YmxpYyBSZWZDb3VudGVkPEZp
bGVTdHJlYW0+IHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxGaWxlU3RyZWFtPiBj
cmVhdGUoRmlsZVN0cmVhbUNsaWVudCogY2xpZW50KQorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEZp
bGVTdHJlYW0+IGNyZWF0ZSgpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEZp
bGVTdHJlYW0oY2xpZW50KSk7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgRmlsZVN0cmVh
bSgpKTsKICAgICB9CiAgICAgdmlydHVhbCB+RmlsZVN0cmVhbSgpOwogCisgICAgLy8gRklYTUU6
IFRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gdXNpbmcgQmxvYkRhdGEuCiAgICAgdm9p
ZCBzdGFydCgpOworCisgICAgLy8gQWJvcnRzIHRoZSBvcGVyYXRpb24uCiAgICAgdm9pZCBzdG9w
KCk7CiAKLSAgICB2b2lkIG9wZW5Gb3JSZWFkKEJsb2IqKTsKLSAgICB2b2lkIG9wZW5Gb3JXcml0
ZShjb25zdCBTdHJpbmcmIHBhdGgpOworICAgIC8vIEdldHMgdGhlIHNpemUgb2YgYSBmaWxlLiBB
bHNvIHZhbGlkYXRlcyBpZiB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9yIG5vdCBpZiB0aGUg
ZXhwZWN0ZWQgbW9kaWZpY2F0aW9uIHRpbWUgaXMgcHJvdmlkZWQsIGkuZS4gbm9uLXplcm8uCisg
ICAgLy8gUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaWYgc3VjY2Vzc2Z1bC4gLTEgb3Ro
ZXJ3aXNlLgorICAgIGxvbmcgbG9uZyBnZXRTaXplKGNvbnN0IFN0cmluZyYgcGF0aCwgZG91Ymxl
IGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisKKyAgICAvLyBPcGVucyBhIGZpbGUgZm9yIHJl
YWRpbmcuIFRoZSByZWFkaW5nIHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBhbmQgbGFz
dHMgdGlsbCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KKyAgICAvLyBSZXR1cm5zIDAgb24gc3VjY2Vz
cy4gRXhjZXB0aW9uIGNvZGUgb3RoZXJ3aXNlLgorICAgIEV4Y2VwdGlvbkNvZGUgb3BlbkZvclJl
YWQoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3Ro
KTsKKworICAgIC8vIE9wZW5zIGEgZmlsZSBmb3Igd3JpdGluZy4KKyAgICAvLyBSZXR1cm5zIDAg
b24gc3VjY2Vzcy4gRXhjZXB0aW9uIGNvZGUgb3RoZXJ3aXNlLgorICAgIEV4Y2VwdGlvbkNvZGUg
b3BlbkZvcldyaXRlKGNvbnN0IFN0cmluZyYgcGF0aCk7CisKKyAgICAvLyBDbG9zZXMgdGhlIGZp
bGUuCiAgICAgdm9pZCBjbG9zZSgpOwotICAgIHZvaWQgcmVhZChjaGFyKiBidWZmZXIsIGludCBs
ZW5ndGgpOwotICAgIHZvaWQgd3JpdGUoQmxvYiogYmxvYiwgbG9uZyBsb25nIHBvc2l0aW9uLCBp
bnQgbGVuZ3RoKTsKLSAgICB2b2lkIHRydW5jYXRlKGxvbmcgbG9uZyBwb3NpdGlvbik7CisKKyAg
ICAvLyBSZWFkcyBhIGZpbGUgaW50byB0aGUgcHJvdmlkZWQgZGF0YSBidWZmZXIuCisgICAgLy8g
UmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgcmVhZCBvbiBzdWNjZXNzLiAtMSBvdGhlcndp
c2UuCisgICAgLy8gSWYgMCBpcyByZXR1cm5lZCwgaXQgbWVhbnMgdGhhdCB0aGUgcmVhZGluZyBp
cyBjb21wbGV0ZWQuCisgICAgaW50IHJlYWQoY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKwor
ICAgIC8vIFdyaXRlcyBhIGJsb2IgdG8gdGhlIGZpbGUuCisgICAgLy8gUmV0dXJucyBudW1iZXIg
b2YgYnl0ZXMgYmVpbmcgd3JpdHRlbiBvbiBzdWNjZXNzLiAtMSBvdGhlcndpc2UuCisgICAgaW50
IHdyaXRlKEJsb2IqIGJsb2IsIGxvbmcgbG9uZyBwb3NpdGlvbiwgaW50IGxlbmd0aCk7CisKKyAg
ICAvLyBUcnVuY2F0ZXMgdGhlIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KKyAgICAv
LyBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gRXhjZXB0aW9uIGNvZGUgb3RoZXJ3aXNlLgorICAgIEV4
Y2VwdGlvbkNvZGUgdHJ1bmNhdGUobG9uZyBsb25nIHBvc2l0aW9uKTsKIAogcHJpdmF0ZToKLSAg
ICBGaWxlU3RyZWFtKEZpbGVTdHJlYW1DbGllbnQqKTsKKyAgICBGaWxlU3RyZWFtKCk7CiAKLSAg
ICBGaWxlU3RyZWFtQ2xpZW50KiBtX2NsaWVudDsKICAgICBQbGF0Zm9ybUZpbGVIYW5kbGUgbV9o
YW5kbGU7CiAgICAgbG9uZyBsb25nIG1fYnl0ZXNQcm9jZXNzZWQ7CiAgICAgbG9uZyBsb25nIG1f
dG90YWxCeXRlc1RvUmVhZDsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtQ2xp
ZW50LmggYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbUNsaWVudC5oCmluZGV4IDJlNzA5MWYuLjQ0
MGQyZmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtQ2xpZW50LmgKKysrIGIv
V2ViQ29yZS9odG1sL0ZpbGVTdHJlYW1DbGllbnQuaApAQCAtNDAsMTYgKzQwLDE4IEBAIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIGNsYXNzIEZpbGVTdHJlYW1DbGllbnQgewogcHVibGljOgogICAgIC8v
IEZvciByZWFkaW5nLgotICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkKGNvbnN0IGNoYXIqLCBpbnQp
IHsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkKGludCkgeyB9CiAKICAgICAvLyBGb3Igd3Jp
dGluZy4KICAgICB2aXJ0dWFsIHZvaWQgZGlkV3JpdGUoaW50KSB7IH0KKyAgICB2aXJ0dWFsIHZv
aWQgZGlkVHJ1bmNhdGUoRXhjZXB0aW9uQ29kZSkgeyB9CiAKLSAgICAvLyBGb3IgYm90aCByZWFk
aW5nIGFuZCB3cml0aW5nLgorICAgIC8vIEZJWE1FOiBUbyBiZSByZW1vdmVkIHdoZW4gd2Ugc3dp
dGNoIHRvIHVzaW5nIEJsb2JEYXRhLgogICAgIHZpcnR1YWwgdm9pZCBkaWRTdGFydCgpIHsgfQor
CisgICAgLy8gRm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZy4KKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkT3BlbihFeGNlcHRpb25Db2RlKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgZGlkU3RvcCgpIHsg
fQotICAgIHZpcnR1YWwgdm9pZCBkaWRGaW5pc2goKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgZGlk
RmFpbChFeGNlcHRpb25Db2RlKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgZGlkR2V0U2l6ZShsb25n
IGxvbmcpIHsgfQogCiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVN0
cmVhbVByb3h5LmNwcCBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtUHJveHkuY3BwCmluZGV4IGUz
YjllNzkuLmY1MGI3ZTggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtUHJveHku
Y3BwCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtUHJveHkuY3BwCkBAIC0zNyw2ICszNyw3
IEBACiAjaW5jbHVkZSAiQmxvYi5oIgogI2luY2x1ZGUgIkNyb3NzVGhyZWFkVGFzay5oIgogI2lu
Y2x1ZGUgIkZpbGVTdHJlYW0uaCIKKyNpbmNsdWRlICJGaWxlU3RyZWFtQ2xpZW50LmgiCiAjaW5j
bHVkZSAiRmlsZVRocmVhZC5oIgogI2luY2x1ZGUgIkZpbGVUaHJlYWRUYXNrLmgiCiAjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKQEAgLTQ3LDcgKzQ4LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogaW5saW5lIEZpbGVTdHJlYW1Qcm94eTo6RmlsZVN0cmVhbVByb3h5KFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQqIGNvbnRleHQsIEZpbGVTdHJlYW1DbGllbnQqIGNsaWVudCkKICAgICA6IG1fY29u
dGV4dChjb250ZXh0KQogICAgICwgbV9jbGllbnQoY2xpZW50KQotICAgICwgbV9zdHJlYW0oRmls
ZVN0cmVhbTo6Y3JlYXRlKHRoaXMpKQorICAgICwgbV9zdHJlYW0oRmlsZVN0cmVhbTo6Y3JlYXRl
KCkpCiB7CiB9CiAKQEAgLTU5LDcgKzYwLDcgQEAgUGFzc1JlZlB0cjxGaWxlU3RyZWFtUHJveHk+
IEZpbGVTdHJlYW1Qcm94eTo6Y3JlYXRlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnQKICAg
ICAvLyBUaGlzIGlzIGJhbGFuY2VkIGJ5IHRoZSBkZXJlZiBpbiBkZXJlZlByb3h5T25Db250ZXh0
IGJlbG93LgogICAgIHByb3h5LT5yZWYoKTsKIAotICAgIHByb3h5LT5maWxlVGhyZWFkKCktPnBv
c3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKHByb3h5LT5tX3N0cmVhbS5nZXQoKSwgJkZpbGVT
dHJlYW06OnN0YXJ0KSk7CisgICAgcHJveHktPmZpbGVUaHJlYWQoKS0+cG9zdFRhc2soY3JlYXRl
RmlsZVRocmVhZFRhc2socHJveHkuZ2V0KCksICZGaWxlU3RyZWFtUHJveHk6OnN0YXJ0T25GaWxl
VGhyZWFkKSk7CiAKICAgICByZXR1cm4gcHJveHkucmVsZWFzZSgpOwogfQpAQCAtNjgsMTMzICs2
OSwxNTAgQEAgRmlsZVN0cmVhbVByb3h5Ojp+RmlsZVN0cmVhbVByb3h5KCkKIHsKIH0KIAotdm9p
ZCBGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JSZWFkKEJsb2IqIGJsb2IpCitGaWxlVGhyZWFkKiBG
aWxlU3RyZWFtUHJveHk6OmZpbGVUaHJlYWQoKQogewotICAgIGZpbGVUaHJlYWQoKS0+cG9zdFRh
c2soY3JlYXRlRmlsZVRocmVhZFRhc2sobV9zdHJlYW0uZ2V0KCksICZGaWxlU3RyZWFtOjpvcGVu
Rm9yUmVhZCwgYmxvYikpOworICAgIEFTU0VSVChtX2NvbnRleHQtPmlzQ29udGV4dFRocmVhZCgp
KTsKKyAgICBBU1NFUlQobV9jb250ZXh0LT5maWxlVGhyZWFkKCkpOworICAgIHJldHVybiBtX2Nv
bnRleHQtPmZpbGVUaHJlYWQoKTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JX
cml0ZShjb25zdCBTdHJpbmcmIHBhdGgpCitzdGF0aWMgdm9pZCBkaWRTdGFydChTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiwgRmlsZVN0cmVhbVByb3h5KiBwcm94eSkKIHsKLSAgICBmaWxlVGhyZWFk
KCktPnBvc3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKG1fc3RyZWFtLmdldCgpLCAmRmlsZVN0
cmVhbTo6b3BlbkZvcldyaXRlLCBwYXRoKSk7CisgICAgaWYgKHByb3h5LT5jbGllbnQoKSkKKyAg
ICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRTdGFydCgpOwogfQogCi12b2lkIEZpbGVTdHJlYW1Q
cm94eTo6Y2xvc2UoKQordm9pZCBGaWxlU3RyZWFtUHJveHk6OnN0YXJ0T25GaWxlVGhyZWFkKCkK
IHsKLSAgICBmaWxlVGhyZWFkKCktPnBvc3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKG1fc3Ry
ZWFtLmdldCgpLCAmRmlsZVN0cmVhbTo6Y2xvc2UpKTsKKyAgICBtX3N0cmVhbS0+c3RhcnQoKTsK
KyAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkU3RhcnQsIHRo
aXMpKTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtUHJveHk6OnJlYWQoY2hhciogYnVmZmVyLCBpbnQg
bGVuZ3RoKQordm9pZCBGaWxlU3RyZWFtUHJveHk6OnN0b3AoKQogewotICAgIGZpbGVUaHJlYWQo
KS0+cG9zdFRhc2soY3JlYXRlRmlsZVRocmVhZFRhc2sobV9zdHJlYW0uZ2V0KCksICZGaWxlU3Ry
ZWFtOjpyZWFkLCBidWZmZXIsIGxlbmd0aCkpOworICAgIC8vIENsZWFyIHRoZSBjbGllbnQgc28g
dGhhdCB3ZSB3b24ndCBiZSBjYWxsaW5nIGNhbGxiYWNrcyBvbiB0aGUgY2xpZW50LgorICAgIG1f
Y2xpZW50ID0gMDsKKworICAgIGZpbGVUaHJlYWQoKS0+dW5zY2hlZHVsZVRhc2tzKG1fc3RyZWFt
LmdldCgpKTsKKyAgICBmaWxlVGhyZWFkKCktPnBvc3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNr
KHRoaXMsICZGaWxlU3RyZWFtUHJveHk6OnN0b3BPbkZpbGVUaHJlYWQpKTsKIH0KIAotdm9pZCBG
aWxlU3RyZWFtUHJveHk6OndyaXRlKEJsb2IqIGJsb2IsIGxvbmcgbG9uZyBwb3NpdGlvbiwgaW50
IGxlbmd0aCkKK3N0YXRpYyB2b2lkIGRlcmVmUHJveHlPbkNvbnRleHQoU2NyaXB0RXhlY3V0aW9u
Q29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHkpCiB7Ci0gICAgZmlsZVRocmVhZCgpLT5w
b3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayhtX3N0cmVhbS5nZXQoKSwgJkZpbGVTdHJlYW06
OndyaXRlLCBibG9iLCBwb3NpdGlvbiwgbGVuZ3RoKSk7CisgICAgQVNTRVJUKHByb3h5LT5oYXNP
bmVSZWYoKSk7CisgICAgcHJveHktPmRlcmVmKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbVByb3h5
Ojp0cnVuY2F0ZShsb25nIGxvbmcgcG9zaXRpb24pCit2b2lkIEZpbGVTdHJlYW1Qcm94eTo6c3Rv
cE9uRmlsZVRocmVhZCgpCiB7Ci0gICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxl
VGhyZWFkVGFzayhtX3N0cmVhbS5nZXQoKSwgJkZpbGVTdHJlYW06OnRydW5jYXRlLCBwb3NpdGlv
bikpOworICAgIG1fc3RyZWFtLT5zdG9wKCk7CisgICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVh
dGVDYWxsYmFja1Rhc2soJmRlcmVmUHJveHlPbkNvbnRleHQsIHRoaXMpKTsKIH0KIAotRmlsZVRo
cmVhZCogRmlsZVN0cmVhbVByb3h5OjpmaWxlVGhyZWFkKCkKK3N0YXRpYyB2b2lkIGRpZEdldFNp
emUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHksIGxvbmcg
bG9uZyBzaXplKQogewotICAgIEFTU0VSVChtX2NvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsK
LSAgICBBU1NFUlQobV9jb250ZXh0LT5maWxlVGhyZWFkKCkpOwotICAgIHJldHVybiBtX2NvbnRl
eHQtPmZpbGVUaHJlYWQoKTsKKyAgICBpZiAocHJveHktPmNsaWVudCgpKQorICAgICAgICBwcm94
eS0+Y2xpZW50KCktPmRpZEdldFNpemUoc2l6ZSk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbVByb3h5
OjpzdG9wKCkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpnZXRTaXplKGNvbnN0IFN0cmluZyYgcGF0
aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkKIHsKLSAgICAvLyBDbGVhciB0aGUg
Y2xpZW50IHNvIHRoYXQgd2Ugd29uJ3QgYmUgY2FsbGluZyBjYWxsYmFja3Mgb24gdGhlIGNsaWVu
dC4KLSAgICBtX2NsaWVudCA9IDA7CisgICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVG
aWxlVGhyZWFkVGFzayh0aGlzLCAmRmlsZVN0cmVhbVByb3h5OjpnZXRTaXplT25GaWxlVGhyZWFk
LCBwYXRoLCBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWUpKTsKK30KIAotICAgIGZpbGVUaHJlYWQo
KS0+dW5zY2hlZHVsZVRhc2tzKG1fc3RyZWFtLmdldCgpKTsKLSAgICBmaWxlVGhyZWFkKCktPnBv
c3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKG1fc3RyZWFtLmdldCgpLCAmRmlsZVN0cmVhbTo6
c3RvcCkpOwordm9pZCBGaWxlU3RyZWFtUHJveHk6OmdldFNpemVPbkZpbGVUaHJlYWQoY29uc3Qg
U3RyaW5nJiBwYXRoLCBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKQoreworICAgIGxv
bmcgbG9uZyBzaXplID0gbV9zdHJlYW0tPmdldFNpemUocGF0aCwgZXhwZWN0ZWRNb2RpZmljYXRp
b25UaW1lKTsKKyAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlk
R2V0U2l6ZSwgdGhpcywgc2l6ZSkpOwogfQogCi1zdGF0aWMgdm9pZCBub3RpZnlHZXRTaXplT25D
b250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5LCBs
b25nIGxvbmcgc2l6ZSkKK3N0YXRpYyB2b2lkIGRpZE9wZW4oU2NyaXB0RXhlY3V0aW9uQ29udGV4
dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHksIEV4Y2VwdGlvbkNvZGUgZWMpCiB7CiAgICAgaWYg
KHByb3h5LT5jbGllbnQoKSkKLSAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRHZXRTaXplKHNp
emUpOworICAgICAgICBwcm94eS0+Y2xpZW50KCktPmRpZE9wZW4oZWMpOwogfQogCi12b2lkIEZp
bGVTdHJlYW1Qcm94eTo6ZGlkR2V0U2l6ZShsb25nIGxvbmcgc2l6ZSkKK3ZvaWQgRmlsZVN0cmVh
bVByb3h5OjpvcGVuRm9yUmVhZChjb25zdCBTdHJpbmcmIHBhdGgsIGxvbmcgbG9uZyBvZmZzZXQs
IGxvbmcgbG9uZyBsZW5ndGgpCiB7Ci0gICAgQVNTRVJUKCFtX2NvbnRleHQtPmlzQ29udGV4dFRo
cmVhZCgpKTsKLSAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmbm90
aWZ5R2V0U2l6ZU9uQ29udGV4dCwgdGhpcywgc2l6ZSkpOworICAgIGZpbGVUaHJlYWQoKS0+cG9z
dFRhc2soY3JlYXRlRmlsZVRocmVhZFRhc2sodGhpcywgJkZpbGVTdHJlYW1Qcm94eTo6b3BlbkZv
clJlYWRPbkZpbGVUaHJlYWQsIHBhdGgsIG9mZnNldCwgbGVuZ3RoKSk7CiB9CiAKLXN0YXRpYyB2
b2lkIG5vdGlmeVJlYWRPbkNvbnRleHQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJl
YW1Qcm94eSogcHJveHksIGNvbnN0IGNoYXIqIGRhdGEsIGludCBieXRlc1JlYWQpCit2b2lkIEZp
bGVTdHJlYW1Qcm94eTo6b3BlbkZvclJlYWRPbkZpbGVUaHJlYWQoY29uc3QgU3RyaW5nJiBwYXRo
LCBsb25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKQogewotICAgIGlmIChwcm94eS0+
Y2xpZW50KCkpCi0gICAgICAgIHByb3h5LT5jbGllbnQoKS0+ZGlkUmVhZChkYXRhLCBieXRlc1Jl
YWQpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSBtX3N0cmVhbS0+b3BlbkZvclJlYWQocGF0aCwg
b2Zmc2V0LCBsZW5ndGgpOworICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2FsbGJhY2tU
YXNrKCZkaWRPcGVuLCB0aGlzLCBlYykpOworfQorCit2b2lkIEZpbGVTdHJlYW1Qcm94eTo6b3Bl
bkZvcldyaXRlKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBmaWxlVGhyZWFkKCktPnBvc3RU
YXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKHRoaXMsICZGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JX
cml0ZU9uRmlsZVRocmVhZCwgcGF0aCkpOwogfQogCi12b2lkIEZpbGVTdHJlYW1Qcm94eTo6ZGlk
UmVhZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQordm9pZCBGaWxlU3RyZWFtUHJv
eHk6Om9wZW5Gb3JXcml0ZU9uRmlsZVRocmVhZChjb25zdCBTdHJpbmcmIHBhdGgpCiB7Ci0gICAg
QVNTRVJUKCFtX2NvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKLSAgICBtX2NvbnRleHQtPnBv
c3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmbm90aWZ5UmVhZE9uQ29udGV4dCwgdGhpcywgZGF0
YSwgYnl0ZXNSZWFkKSk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IG1fc3RyZWFtLT5vcGVuRm9y
V3JpdGUocGF0aCk7CisgICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rhc2so
JmRpZE9wZW4sIHRoaXMsIGVjKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG5vdGlmeVdyaXRlT25Db250
ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5LCBpbnQg
Ynl0ZXNXcml0dGVuKQordm9pZCBGaWxlU3RyZWFtUHJveHk6OmNsb3NlKCkKIHsKLSAgICBpZiAo
cHJveHktPmNsaWVudCgpKQotICAgICAgICBwcm94eS0+Y2xpZW50KCktPmRpZFdyaXRlKGJ5dGVz
V3JpdHRlbik7CisgICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFz
ayh0aGlzLCAmRmlsZVN0cmVhbVByb3h5OjpjbG9zZU9uRmlsZVRocmVhZCkpOwogfQogCi12b2lk
IEZpbGVTdHJlYW1Qcm94eTo6ZGlkV3JpdGUoaW50IGJ5dGVzV3JpdHRlbikKK3ZvaWQgRmlsZVN0
cmVhbVByb3h5OjpjbG9zZU9uRmlsZVRocmVhZCgpCiB7Ci0gICAgQVNTRVJUKCFtX2NvbnRleHQt
PmlzQ29udGV4dFRocmVhZCgpKTsKLSAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxi
YWNrVGFzaygmbm90aWZ5V3JpdGVPbkNvbnRleHQsIHRoaXMsIGJ5dGVzV3JpdHRlbikpOworICAg
IG1fc3RyZWFtLT5jbG9zZSgpOwogfQogCi1zdGF0aWMgdm9pZCBub3RpZnlTdGFydE9uQ29udGV4
dChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgRmlsZVN0cmVhbVByb3h5KiBwcm94eSkKK3N0YXRp
YyB2b2lkIGRpZFJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSog
cHJveHksIGludCBieXRlc1JlYWQpCiB7CiAgICAgaWYgKHByb3h5LT5jbGllbnQoKSkKLSAgICAg
ICAgcHJveHktPmNsaWVudCgpLT5kaWRTdGFydCgpOworICAgICAgICBwcm94eS0+Y2xpZW50KCkt
PmRpZFJlYWQoYnl0ZXNSZWFkKTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtUHJveHk6OmRpZFN0YXJ0
KCkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpyZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCkK
K3sKKyAgICBmaWxlVGhyZWFkKCktPnBvc3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKHRoaXMs
ICZGaWxlU3RyZWFtUHJveHk6OnJlYWRPbkZpbGVUaHJlYWQsIGJ1ZmZlciwgbGVuZ3RoKSk7Cit9
CisKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpyZWFkT25GaWxlVGhyZWFkKGNoYXIqIGJ1ZmZlciwg
aW50IGxlbmd0aCkKIHsKLSAgICBBU1NFUlQoIW1fY29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkp
OwotICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZub3RpZnlTdGFy
dE9uQ29udGV4dCwgdGhpcykpOworICAgIGludCBieXRlc1JlYWQgPSBtX3N0cmVhbS0+cmVhZChi
dWZmZXIsIGxlbmd0aCk7CisgICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rh
c2soJmRpZFJlYWQsIHRoaXMsIGJ5dGVzUmVhZCkpOwogfQogCi1zdGF0aWMgdm9pZCBub3RpZnlG
aW5pc2hPbkNvbnRleHQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSog
cHJveHkpCitzdGF0aWMgdm9pZCBkaWRXcml0ZShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgRmls
ZVN0cmVhbVByb3h5KiBwcm94eSwgaW50IGJ5dGVzV3JpdHRlbikKIHsKICAgICBpZiAocHJveHkt
PmNsaWVudCgpKQotICAgICAgICBwcm94eS0+Y2xpZW50KCktPmRpZEZpbmlzaCgpOworICAgICAg
ICBwcm94eS0+Y2xpZW50KCktPmRpZFdyaXRlKGJ5dGVzV3JpdHRlbik7CiB9CiAKLXZvaWQgRmls
ZVN0cmVhbVByb3h5OjpkaWRGaW5pc2goKQordm9pZCBGaWxlU3RyZWFtUHJveHk6OndyaXRlKEJs
b2IqIGJsb2IsIGxvbmcgbG9uZyBwb3NpdGlvbiwgaW50IGxlbmd0aCkKIHsKLSAgICBBU1NFUlQo
IW1fY29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOwotICAgIG1fY29udGV4dC0+cG9zdFRhc2so
Y3JlYXRlQ2FsbGJhY2tUYXNrKCZub3RpZnlGaW5pc2hPbkNvbnRleHQsIHRoaXMpKTsKKyAgICBm
aWxlVGhyZWFkKCktPnBvc3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKHRoaXMsICZGaWxlU3Ry
ZWFtUHJveHk6OndyaXRlT25GaWxlVGhyZWFkLCBibG9iLCBwb3NpdGlvbiwgbGVuZ3RoKSk7CiB9
CiAKLXN0YXRpYyB2b2lkIG5vdGlmeUZhaWxPbkNvbnRleHQoU2NyaXB0RXhlY3V0aW9uQ29udGV4
dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHksIEV4Y2VwdGlvbkNvZGUgZWMpCit2b2lkIEZpbGVT
dHJlYW1Qcm94eTo6d3JpdGVPbkZpbGVUaHJlYWQoQmxvYiogYmxvYiwgbG9uZyBsb25nIHBvc2l0
aW9uLCBpbnQgbGVuZ3RoKQogewotICAgIGlmIChwcm94eS0+Y2xpZW50KCkpCi0gICAgICAgIHBy
b3h5LT5jbGllbnQoKS0+ZGlkRmFpbChlYyk7CisgICAgaW50IGJ5dGVzV3JpdHRlbiA9IG1fc3Ry
ZWFtLT53cml0ZShibG9iLCBwb3NpdGlvbiwgbGVuZ3RoKTsKKyAgICBtX2NvbnRleHQtPnBvc3RU
YXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkV3JpdGUsIHRoaXMsIGJ5dGVzV3JpdHRlbikpOwog
fQogCi12b2lkIEZpbGVTdHJlYW1Qcm94eTo6ZGlkRmFpbChFeGNlcHRpb25Db2RlIGVjKQorc3Rh
dGljIHZvaWQgZGlkVHJ1bmNhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1Q
cm94eSogcHJveHksIEV4Y2VwdGlvbkNvZGUgZWMpCiB7Ci0gICAgQVNTRVJUKCFtX2NvbnRleHQt
PmlzQ29udGV4dFRocmVhZCgpKTsKLSAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxi
YWNrVGFzaygmbm90aWZ5RmFpbE9uQ29udGV4dCwgdGhpcywgZWMpKTsKKyAgICBpZiAocHJveHkt
PmNsaWVudCgpKQorICAgICAgICBwcm94eS0+Y2xpZW50KCktPmRpZFRydW5jYXRlKGVjKTsKIH0K
IAotc3RhdGljIHZvaWQgZGVyZWZQcm94eU9uQ29udGV4dChTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiwgRmlsZVN0cmVhbVByb3h5KiBwcm94eSkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5Ojp0cnVuY2F0
ZShsb25nIGxvbmcgcG9zaXRpb24pCiB7Ci0gICAgQVNTRVJUKHByb3h5LT5oYXNPbmVSZWYoKSk7
Ci0gICAgcHJveHktPmRlcmVmKCk7CisgICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVG
aWxlVGhyZWFkVGFzayh0aGlzLCAmRmlsZVN0cmVhbVByb3h5Ojp0cnVuY2F0ZU9uRmlsZVRocmVh
ZCwgcG9zaXRpb24pKTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtUHJveHk6OmRpZFN0b3AoKQordm9p
ZCBGaWxlU3RyZWFtUHJveHk6OnRydW5jYXRlT25GaWxlVGhyZWFkKGxvbmcgbG9uZyBwb3NpdGlv
bikKIHsKLSAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGVyZWZQ
cm94eU9uQ29udGV4dCwgdGhpcykpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSBtX3N0cmVhbS0+
dHJ1bmNhdGUocG9zaXRpb24pOworICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2FsbGJh
Y2tUYXNrKCZkaWRUcnVuY2F0ZSwgdGhpcywgZWMpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW1Qcm94eS5oIGIvV2ViQ29y
ZS9odG1sL0ZpbGVTdHJlYW1Qcm94eS5oCmluZGV4IDg1MjNkNGEuLjNjOTNiMzMgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtUHJveHkuaAorKysgYi9XZWJDb3JlL2h0bWwvRmls
ZVN0cmVhbVByb3h5LmgKQEAgLTM0LDcgKzM0LDYgQEAKIAogI2lmIEVOQUJMRShCTE9CKSB8fCBF
TkFCTEUoRklMRV9XUklURVIpCiAKLSNpbmNsdWRlICJGaWxlU3RyZWFtQ2xpZW50LmgiCiAjaW5j
bHVkZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1
ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CkBAIC00NCwxNiArNDMsMTggQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogCiBjbGFzcyBCbG9iOwogY2xhc3MgRmlsZVN0cmVhbTsKK2NsYXNzIEZpbGVTdHJlYW1D
bGllbnQ7CiBjbGFzcyBGaWxlVGhyZWFkOwogY2xhc3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsK
IAotLy8gQSBwcm94eSBtb2R1bGUgdGhhdCBjYWxscyBjb3JyZXNwb25kaW5nIEZpbGVTdHJlYW0g
bWV0aG9kcyBvbiB0aGUgZmlsZSB0aHJlYWQuICBOb3RlOiB5b3UgbXVzdCBjYWxsIHN0b3AoKSBm
aXJzdCBhbmQgdGhlbiByZWxlYXNlIHRoZSByZWZlcmVuY2UgdG8gZGVzdHJ1Y3QgdGhlIEZpbGVT
dHJlYW1Qcm94eSBpbnN0YW5jZS4KLWNsYXNzIEZpbGVTdHJlYW1Qcm94eSA6IHB1YmxpYyBSZWZD
b3VudGVkPEZpbGVTdHJlYW1Qcm94eT4sIHB1YmxpYyBGaWxlU3RyZWFtQ2xpZW50IHsKKy8vIEEg
cHJveHkgbW9kdWxlIHRoYXQgYXN5bmNocm9ub3VzbHkgY2FsbHMgY29ycmVzcG9uZGluZyBGaWxl
U3RyZWFtIG1ldGhvZHMgb24gdGhlIGZpbGUgdGhyZWFkLiAgTm90ZTogeW91IG11c3QgY2FsbCBz
dG9wKCkgZmlyc3QgYW5kIHRoZW4gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGRlc3RydWN0IHRo
ZSBGaWxlU3RyZWFtUHJveHkgaW5zdGFuY2UuCitjbGFzcyBGaWxlU3RyZWFtUHJveHkgOiBwdWJs
aWMgUmVmQ291bnRlZDxGaWxlU3RyZWFtUHJveHk+IHsKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFz
c1JlZlB0cjxGaWxlU3RyZWFtUHJveHk+IGNyZWF0ZShTY3JpcHRFeGVjdXRpb25Db250ZXh0Kiwg
RmlsZVN0cmVhbUNsaWVudCopOwogICAgIHZpcnR1YWwgfkZpbGVTdHJlYW1Qcm94eSgpOwogCi0g
ICAgdm9pZCBvcGVuRm9yUmVhZChCbG9iKiBibG9iKTsKKyAgICB2b2lkIGdldFNpemUoY29uc3Qg
U3RyaW5nJiBwYXRoLCBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKTsKKyAgICB2b2lk
IG9wZW5Gb3JSZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBs
b25nIGxlbmd0aCk7CiAgICAgdm9pZCBvcGVuRm9yV3JpdGUoY29uc3QgU3RyaW5nJiBwYXRoKTsK
ICAgICB2b2lkIGNsb3NlKCk7CiAgICAgdm9pZCByZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0
aCk7CkBAIC02OSwxNyArNzAsMTkgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBGaWxlU3RyZWFt
UHJveHkoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1DbGllbnQqKTsKIAotICAg
IC8vIEZpbGVTdHJlYW1DbGllbnQgbWV0aG9kcy4KLSAgICB2aXJ0dWFsIHZvaWQgZGlkR2V0U2l6
ZShsb25nIGxvbmcpOwotICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkKGNvbnN0IGNoYXIqLCBpbnQp
OwotICAgIHZpcnR1YWwgdm9pZCBkaWRXcml0ZShpbnQpOwotICAgIHZpcnR1YWwgdm9pZCBkaWRG
aW5pc2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbChFeGNlcHRpb25Db2RlKTsKLSAgICB2
aXJ0dWFsIHZvaWQgZGlkU3RhcnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkU3RvcCgpOwotCiAg
ICAgRmlsZVRocmVhZCogZmlsZVRocmVhZCgpOwogCisgICAgLy8gQ2FsbGVkIG9uIEZpbGUgdGhy
ZWFkLgorICAgIHZvaWQgc3RhcnRPbkZpbGVUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BPbkZpbGVU
aHJlYWQoKTsKKyAgICB2b2lkIGdldFNpemVPbkZpbGVUaHJlYWQoY29uc3QgU3RyaW5nJiBwYXRo
LCBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKTsKKyAgICB2b2lkIG9wZW5Gb3JSZWFk
T25GaWxlVGhyZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBs
b25nIGxlbmd0aCk7CisgICAgdm9pZCBvcGVuRm9yV3JpdGVPbkZpbGVUaHJlYWQoY29uc3QgU3Ry
aW5nJiBwYXRoKTsKKyAgICB2b2lkIGNsb3NlT25GaWxlVGhyZWFkKCk7CisgICAgdm9pZCByZWFk
T25GaWxlVGhyZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisgICAgdm9pZCB3cml0ZU9u
RmlsZVRocmVhZChCbG9iKiBibG9iLCBsb25nIGxvbmcgcG9zaXRpb24sIGludCBsZW5ndGgpOwor
ICAgIHZvaWQgdHJ1bmNhdGVPbkZpbGVUaHJlYWQobG9uZyBsb25nIHBvc2l0aW9uKTsKKwogICAg
IFJlZlB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0PiBtX2NvbnRleHQ7CiAgICAgRmlsZVN0cmVh
bUNsaWVudCogbV9jbGllbnQ7CiAgICAgUmVmUHRyPEZpbGVTdHJlYW0+IG1fc3RyZWFtOwpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVUaHJlYWRUYXNrLmggYi9XZWJDb3JlL2h0bWwvRmls
ZVRocmVhZFRhc2suaAppbmRleCAwOWI2NDdmLi4xNGM5Njc0IDEwMDY0NAotLS0gYS9XZWJDb3Jl
L2h0bWwvRmlsZVRocmVhZFRhc2suaAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVRocmVhZFRhc2su
aApAQCAtMTMyLDcgKzEzMiw3IEBAIHByaXZhdGU6CiB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBl
bmFtZSBULCB0eXBlbmFtZSBQMSwgdHlwZW5hbWUgTVAxLCB0eXBlbmFtZSBQMiwgdHlwZW5hbWUg
TVAyLCB0eXBlbmFtZSBQMywgdHlwZW5hbWUgTVAzPgogY2xhc3MgRmlsZVRocmVhZFRhc2szIDog
cHVibGljIEZpbGVUaHJlYWQ6OlRhc2sgewogcHVibGljOgotICAgIHR5cGVkZWYgdm9pZCAoVDo6
Kk1ldGhvZCkoTVAxLCBNUDIsIE1QMyk7CisgICAgdHlwZWRlZiBSIChUOjoqTWV0aG9kKShNUDEs
IE1QMiwgTVAzKTsKICAgICB0eXBlZGVmIEZpbGVUaHJlYWRUYXNrMzxSLCBULCBQMSwgTVAxLCBQ
MiwgTVAyLCBQMywgTVAzPiBGaWxlVGhyZWFkVGFza0ltcGw7CiAgICAgdHlwZWRlZiB0eXBlbmFt
ZSBDcm9zc1RocmVhZFRhc2tUcmFpdHM8UDE+OjpQYXJhbVR5cGUgUGFyYW0xOwogICAgIHR5cGVk
ZWYgdHlwZW5hbWUgQ3Jvc3NUaHJlYWRUYXNrVHJhaXRzPFAyPjo6UGFyYW1UeXBlIFBhcmFtMjsK
</data>
<flag name="commit-queue"
          id="53125"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64540</attachid>
            <date>2010-08-16 17:39:34 -0700</date>
            <delta_ts>2010-08-17 01:47:28 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>43985_3</filename>
            <type>text/plain</type>
            <size>29179</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ODdjZGFkZC4uMTFlZGNmZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2OCBAQAorMjAxMC0wOC0xNiAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ2hhbmdlIEZpbGVTdHJlYW0gaW1wbGVtZW50YXRpb24gdG8gcHJlcGFyZSBm
b3IgYmxvYiByZXNvdXJjZSBoYW5kbGluZy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTQzOTg1CisKKyAgICAgICAgQ2hhbmdlIEZpbGVTdHJlYW0gdG8g
c3VwcG9ydCBzeW5jaHJvbm91cyB1c2FnZSBvbmx5LiBBbGwgdGhlIGFzeWNocm9ub3VzCisgICAg
ICAgIGxvZ2ljcyBhcmUgbW92ZWQgdG8gRmlsZVN0cmVhbVByb3h5LiBVcGRhdGUgdGhlIGV4aXN0
aW5nIEZpbGVSZWFkZXIgY29kZQorICAgICAgICB0byBhZGFwdCB0byB0aGlzIGNoYW5nZS4KKwor
ICAgICAgICAqIGh0bWwvRmlsZVJlYWRlci5jcHA6IEFjY291bnQgZm9yIEZpbGVTdHJlYW1Qcm94
eSBjaGFuZ2VzLgorICAgICAgICAoV2ViQ29yZTo6RmlsZVJlYWRlcjo6ZGlkU3RhcnQpOgorICAg
ICAgICAoV2ViQ29yZTo6RmlsZVJlYWRlcjo6ZGlkR2V0U2l6ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpGaWxlUmVhZGVyOjpkaWRPcGVuKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVSZWFkZXI6OmRp
ZFJlYWQpOgorICAgICAgICAqIGh0bWwvRmlsZVJlYWRlci5oOgorICAgICAgICAqIGh0bWwvRmls
ZVN0cmVhbS5jcHA6IFJlbW92ZSBtX2NsaWVudCBhbmQgbWFrZSBhbGwgY2FsbHMgc3luY2hyb25v
dXMgb25seS4KKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OkZpbGVTdHJlYW0pOgorICAg
ICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbTo6c3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6Rmls
ZVN0cmVhbTo6c3RvcCk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpnZXRTaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06Om9wZW5Gb3JSZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkZpbGVTdHJlYW06Om9wZW5Gb3JXcml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxl
U3RyZWFtOjpjbG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpyZWFkKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OndyaXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkZp
bGVTdHJlYW06OnRydW5jYXRlKToKKyAgICAgICAgKiBodG1sL0ZpbGVTdHJlYW0uaDogQWRkIGdl
dFNpemUoKSBhbmQgbWFrZSBhbGwgY2FsbHMgc3luY2hyb25vdXMgYnkgYWRkaW5nIHJldHVybiB2
YWx1ZXMuCisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtOjpjcmVhdGUpOgorICAgICAgICAq
IGh0bWwvRmlsZVN0cmVhbUNsaWVudC5oOiBBY2NvdW50IGZvciBGaWxlU3RyZWFtUHJveHkgY2hh
bmdlcy4KKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW1DbGllbnQ6OmRpZFJlYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbUNsaWVudDo6ZGlkVHJ1bmNhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6RmlsZVN0cmVhbUNsaWVudDo6ZGlkT3Blbik6CisgICAgICAgICogaHRtbC9GaWxl
U3RyZWFtUHJveHkuY3BwOiBBbGwgdGhlIGxvZ2ljcyB0byBoYW5kbGUgYXN5bmNocm9ub3VzIGNh
bGxzIGFyZSB3cmFwcGVkIGhlcmUuCisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6
OkZpbGVTdHJlYW1Qcm94eSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OmNy
ZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OmZpbGVUaHJlYWQpOgor
ICAgICAgICAoV2ViQ29yZTo6ZGlkU3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVh
bVByb3h5OjpzdGFydE9uRmlsZVRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFt
UHJveHk6OnN0b3ApOgorICAgICAgICAoV2ViQ29yZTo6ZGVyZWZQcm94eU9uQ29udGV4dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OnN0b3BPbkZpbGVUaHJlYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6ZGlkR2V0U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFt
UHJveHk6OmdldFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5OjpnZXRT
aXplT25GaWxlVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OmRpZE9wZW4pOgorICAgICAgICAo
V2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5OjpvcGVuRm9yUmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JSZWFkT25GaWxlVGhyZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkZpbGVTdHJlYW1Qcm94eTo6b3BlbkZvcldyaXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkZpbGVTdHJlYW1Qcm94eTo6b3BlbkZvcldyaXRlT25GaWxlVGhyZWFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkZpbGVTdHJlYW1Qcm94eTo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0
cmVhbVByb3h5OjpjbG9zZU9uRmlsZVRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpkaWRSZWFk
KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW1Qcm94eTo6cmVhZCk6CisgICAgICAgIChX
ZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OnJlYWRPbkZpbGVUaHJlYWQpOgorICAgICAgICAoV2Vi
Q29yZTo6ZGlkV3JpdGUpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbVByb3h5Ojp3cml0
ZSk6CisgICAgICAgIChXZWJDb3JlOjpGaWxlU3RyZWFtUHJveHk6OndyaXRlT25GaWxlVGhyZWFk
KToKKyAgICAgICAgKFdlYkNvcmU6OmRpZFRydW5jYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkZp
bGVTdHJlYW1Qcm94eTo6dHJ1bmNhdGUpOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN0cmVhbVBy
b3h5Ojp0cnVuY2F0ZU9uRmlsZVRocmVhZCk6CisgICAgICAgICogaHRtbC9GaWxlU3RyZWFtUHJv
eHkuaDoKKyAgICAgICAgKiBodG1sL0ZpbGVUaHJlYWRUYXNrLmg6IEFkZGVkIG1pc3NpbmcgcmV0
dXJuIHZhbHVlIGluIG9uZSBjYWxsYmFjayBtZXRob2QuCisKIDIwMTAtMDgtMTYgIFZpbmNlbnQg
U2NoZWliICA8c2NoZWliQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEaW1p
dHJpIEdsYXprb3YuCmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5jcHAgYi9X
ZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5jcHAKaW5kZXggNmU1NjhlYy4uZTk5ZmRjNCAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3BwCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxl
UmVhZGVyLmNwcApAQCAtMTYwLDMzICsxNjAsNzAgQEAgdm9pZCBGaWxlUmVhZGVyOjp0ZXJtaW5h
dGUoKQogdm9pZCBGaWxlUmVhZGVyOjpkaWRTdGFydCgpCiB7CiAgICAgbV9zdGF0ZSA9IE9wZW5p
bmc7Ci0gICAgbV9zdHJlYW1Qcm94eS0+b3BlbkZvclJlYWQobV9maWxlQmxvYi5nZXQoKSk7CisK
KyAgICBBU1NFUlQobV9maWxlQmxvYi0+aXRlbXMoKS5zaXplKCkgPT0gMSAmJiBtX2ZpbGVCbG9i
LT5pdGVtcygpLmF0KDApLT50b0ZpbGVCbG9iSXRlbSgpKTsKKyAgICBjb25zdCBGaWxlUmFuZ2VC
bG9iSXRlbSogZmlsZVJhbmdlSXRlbSA9IG1fZmlsZUJsb2ItPml0ZW1zKCkuYXQoMCktPnRvRmls
ZVJhbmdlQmxvYkl0ZW0oKTsKKyAgICBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lID0g
ZmlsZVJhbmdlSXRlbSA/IGZpbGVSYW5nZUl0ZW0tPnNuYXBzaG90TW9kaWZpY2F0aW9uVGltZSgp
IDogMDsKKworICAgIG1fc3RyZWFtUHJveHktPmdldFNpemUobV9maWxlQmxvYi0+cGF0aCgpLCBl
eHBlY3RlZE1vZGlmaWNhdGlvblRpbWUpOwogfQogCiB2b2lkIEZpbGVSZWFkZXI6OmRpZEdldFNp
emUobG9uZyBsb25nIHNpemUpCiB7CisgICAgLy8gSWYgdGhlIHNpemUgaXMgLTEsIGl0IG1lYW5z
IHRoZSBmaWxlIGhhcyBiZWVuIG1vdmVkIG9yIGNoYW5nZWQuIEZhaWwgbm93LgorICAgIGlmIChz
aXplID09IC0xKSB7CisgICAgICAgIGRpZEZhaWwoTk9UX0ZPVU5EX0VSUik7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKICAgICBtX3N0YXRlID0gUmVhZGluZzsKICAgICBmaXJlRXZlbnQoZXZl
bnROYW1lcygpLmxvYWRzdGFydEV2ZW50KTsKIAotICAgIG1fdG90YWxCeXRlcyA9IHNpemU7Ci0g
ICAgbV9zdHJlYW1Qcm94eS0+cmVhZCgmbV9idWZmZXIuYXQoMCksIG1fYnVmZmVyLnNpemUoKSk7
CisgICAgQVNTRVJUKG1fZmlsZUJsb2ItPml0ZW1zKCkuc2l6ZSgpID09IDEgJiYgbV9maWxlQmxv
Yi0+aXRlbXMoKS5hdCgwKS0+dG9GaWxlQmxvYkl0ZW0oKSk7CisgICAgY29uc3QgRmlsZVJhbmdl
QmxvYkl0ZW0qIGZpbGVSYW5nZUl0ZW0gPSBtX2ZpbGVCbG9iLT5pdGVtcygpLmF0KDApLT50b0Zp
bGVSYW5nZUJsb2JJdGVtKCk7CisgICAgbG9uZyBsb25nIHN0YXJ0ID0gZmlsZVJhbmdlSXRlbSA/
IGZpbGVSYW5nZUl0ZW0tPnN0YXJ0KCkgOiAwOworCisgICAgLy8gVGhlIHNpemUgcGFzc2VkIGJh
Y2sgaXMgdGhlIHNpemUgb2YgdGhlIHdob2xlIGZpbGUuIElmIHRoZSB1bmRlcmx5aW5nIGl0ZW0g
aXMgYSBzbGljZWQgZmlsZSwgd2UgbmVlZCB0byB1c2UgdGhlIHNsaWNlIGxlbmd0aC4KKyAgICBt
X3RvdGFsQnl0ZXMgPSBmaWxlUmFuZ2VJdGVtID8gZmlsZVJhbmdlSXRlbS0+c2l6ZSgpIDogc2l6
ZTsKKworICAgIG1fc3RyZWFtUHJveHktPm9wZW5Gb3JSZWFkKG1fZmlsZUJsb2ItPnBhdGgoKSwg
c3RhcnQsIG1fdG90YWxCeXRlcyk7CiB9CiAKLXZvaWQgRmlsZVJlYWRlcjo6ZGlkUmVhZChjb25z
dCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQordm9pZCBGaWxlUmVhZGVyOjpkaWRPcGVuKEV4
Y2VwdGlvbkNvZGUgZWMpCiB7Ci0gICAgQVNTRVJUKGRhdGEgJiYgYnl0ZXNSZWFkKTsKKyAgICBp
ZiAoZWMpIHsKKyAgICAgICAgZGlkRmFpbChlYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgCisgICAgbV9zdHJlYW1Qcm94eS0+cmVhZChtX2J1ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNp
emUoKSk7Cit9CiAKK3ZvaWQgRmlsZVJlYWRlcjo6ZGlkUmVhZChpbnQgYnl0ZXNSZWFkKQorewog
ICAgIC8vIEJhaWwgb3V0IGlmIHdlIGhhdmUgYWJvcnRlZCB0aGUgcmVhZGluZy4KICAgICBpZiAo
bV9zdGF0ZSA9PSBDb21wbGV0ZWQpCi0gICAgICByZXR1cm47CisgICAgICAgIHJldHVybjsKKwor
ICAgIC8vIElmIGJ5dGVzUmVhZCBpcyAtMSwgaXQgbWVhbnMgYW4gZXJyb3IgaGFwcGVucy4KKyAg
ICBpZiAoYnl0ZXNSZWFkID09IC0xKSB7CisgICAgICAgIGRpZEZhaWwoTk9UX1JFQURBQkxFX0VS
Uik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiBieXRlc1JlYWQgaXMgMCwg
aXQgbWVhbnMgdGhlIHJlYWRpbmcgaXMgZG9uZS4KKyAgICBpZiAoIWJ5dGVzUmVhZCkgeworICAg
ICAgICBkaWRGaW5pc2goKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHN3aXRjaCAo
bV9yZWFkVHlwZSkgewogICAgIGNhc2UgUmVhZEZpbGVBc0JpbmFyeVN0cmluZzoKLSAgICAgICAg
bV9yZXN1bHQgKz0gU3RyaW5nKGRhdGEsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihieXRlc1JlYWQp
KTsKKyAgICAgICAgbV9yZXN1bHQgKz0gU3RyaW5nKG1fYnVmZmVyLmRhdGEoKSwgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KGJ5dGVzUmVhZCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFJlYWRG
aWxlQXNUZXh0OgogICAgIGNhc2UgUmVhZEZpbGVBc0RhdGFVUkw6Ci0gICAgICAgIG1fcmF3RGF0
YS5hcHBlbmQoZGF0YSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJ5dGVzUmVhZCkpOworICAgICAg
ICBtX3Jhd0RhdGEuYXBwZW5kKG1fYnVmZmVyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KGJ5dGVzUmVhZCkpOwogICAgICAgICBtX2lzUmF3RGF0YUNvbnZlcnRlZCA9IGZhbHNlOwogICAg
ICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMjA1LDcgKzI0Miw3IEBAIHZvaWQgRmlsZVJl
YWRlcjo6ZGlkUmVhZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQogICAgIH0KIAog
ICAgIC8vIENvbnRpbnVlIHJlYWRpbmcuCi0gICAgbV9zdHJlYW1Qcm94eS0+cmVhZCgmbV9idWZm
ZXIuYXQoMCksIG1fYnVmZmVyLnNpemUoKSk7CisgICAgbV9zdHJlYW1Qcm94eS0+cmVhZChtX2J1
ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNpemUoKSk7CiB9CiAKIHZvaWQgRmlsZVJlYWRlcjo6ZGlk
RmluaXNoKCkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmggYi9XZWJDb3Jl
L2h0bWwvRmlsZVJlYWRlci5oCmluZGV4IDc5NTI0NjguLjIyMzdhZjUgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvaHRtbC9GaWxlUmVhZGVyLmgKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuaApA
QCAtODksOSArODksOCBAQCBwdWJsaWM6CiAgICAgLy8gRmlsZVN0cmVhbUNsaWVudAogICAgIHZp
cnR1YWwgdm9pZCBkaWRTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBkaWRHZXRTaXplKGxvbmcg
bG9uZyk7Ci0gICAgdmlydHVhbCB2b2lkIGRpZFJlYWQoY29uc3QgY2hhciosIGludCk7Ci0gICAg
dmlydHVhbCB2b2lkIGRpZEZpbmlzaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkaWRGYWlsKEV4Y2Vw
dGlvbkNvZGUpOworICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuKEV4Y2VwdGlvbkNvZGUpOworICAg
IHZpcnR1YWwgdm9pZCBkaWRSZWFkKGludCk7CiAKICAgICB1c2luZyBSZWZDb3VudGVkPEZpbGVS
ZWFkZXI+OjpyZWY7CiAgICAgdXNpbmcgUmVmQ291bnRlZDxGaWxlUmVhZGVyPjo6ZGVyZWY7CkBA
IC0xMzAsNiArMTI5LDggQEAgcHJpdmF0ZToKICAgICB2b2lkIGZpcmVFdmVudChjb25zdCBBdG9t
aWNTdHJpbmcmIHR5cGUpOwogICAgIHZvaWQgY29udmVydFRvVGV4dCgpOwogICAgIHZvaWQgY29u
dmVydFRvRGF0YVVSTCgpOworICAgIHZvaWQgZGlkRmluaXNoKCk7CisgICAgdm9pZCBkaWRGYWls
KEV4Y2VwdGlvbkNvZGUpOwogCiAgICAgSW50ZXJuYWxTdGF0ZSBtX3N0YXRlOwogICAgIEV2ZW50
VGFyZ2V0RGF0YSBtX2V2ZW50VGFyZ2V0RGF0YTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9G
aWxlU3RyZWFtLmNwcCBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNwcAppbmRleCBhYmU3YmFk
Li5hODljNjdhIDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5jcHAKKysrIGIv
V2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uY3BwCkBAIC0zOSw5ICszOSw4IEBACiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAotRmlsZVN0cmVhbTo6RmlsZVN0cmVhbShGaWxlU3RyZWFtQ2xpZW50KiBj
bGllbnQpCi0gICAgOiBtX2NsaWVudChjbGllbnQpCi0gICAgLCBtX2hhbmRsZShpbnZhbGlkUGxh
dGZvcm1GaWxlSGFuZGxlKQorRmlsZVN0cmVhbTo6RmlsZVN0cmVhbSgpCisgICAgOiBtX2hhbmRs
ZShpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQogICAgICwgbV9ieXRlc1Byb2Nlc3NlZCgwKQog
ICAgICwgbV90b3RhbEJ5dGVzVG9SZWFkKDApCiB7CkBAIC01MiwxMzAgKzUxLDk5IEBAIEZpbGVT
dHJlYW06On5GaWxlU3RyZWFtKCkKICAgICBBU1NFUlQoIWlzSGFuZGxlVmFsaWQobV9oYW5kbGUp
KTsKIH0KIAorLy8gRklYTUU6IFRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gdXNpbmcg
QmxvYkRhdGEuCiB2b2lkIEZpbGVTdHJlYW06OnN0YXJ0KCkKIHsKLSAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKLSAgICBtX2NsaWVudC0+ZGlkU3RhcnQoKTsKIH0KIAogdm9pZCBGaWxlU3Ry
ZWFtOjpzdG9wKCkKIHsKLSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKICAgICBjbG9zZSgp
OwotICAgIG1fY2xpZW50LT5kaWRTdG9wKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6b3BlbkZv
clJlYWQoQmxvYiogYmxvYikKK2xvbmcgbG9uZyBGaWxlU3RyZWFtOjpnZXRTaXplKGNvbnN0IFN0
cmluZyYgcGF0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkKIHsKLSAgICBBU1NF
UlQoIWlzTWFpblRocmVhZCgpKTsKKyAgICAvLyBDaGVjayB0aGUgbW9kaWZpY2F0aW9uIHRpbWUg
Zm9yIHRoZSBwb3NzaWJsZSBmaWxlIGNoYW5nZS4KKyAgICB0aW1lX3QgbW9kaWZpY2F0aW9uVGlt
ZTsKKyAgICBpZiAoIWdldEZpbGVNb2RpZmljYXRpb25UaW1lKHBhdGgsIG1vZGlmaWNhdGlvblRp
bWUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGV4cGVjdGVkTW9kaWZpY2F0aW9uVGlt
ZSkgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dGltZV90PihleHBlY3RlZE1vZGlmaWNhdGlv
blRpbWUpICE9IG1vZGlmaWNhdGlvblRpbWUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAg
fQorCisgICAgLy8gTm93IGdldCB0aGUgZmlsZSBzaXplLgorICAgIGxvbmcgbG9uZyBsZW5ndGg7
CisgICAgaWYgKCFnZXRGaWxlU2l6ZShwYXRoLCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gLTE7
CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQogCitFeGNlcHRpb25Db2RlIEZpbGVTdHJlYW06Om9w
ZW5Gb3JSZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25n
IGxlbmd0aCkKK3sKICAgICBpZiAoaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGhhbmRsZSBtdWx0aXBsZSBpdGVtcyB0aGF0
IG1heSBpbmNsdWRlIG5vbi1maWxlIG9uZXMgd2hlbiBCbG9iQnVpbGRlciBpcyBpbnRyb2R1Y2Vk
LgotICAgIEFTU0VSVChibG9iLT5pdGVtcygpLnNpemUoKSA+PSAxKTsKLSAgICBjb25zdCBGaWxl
QmxvYkl0ZW0qIGZpbGVJdGVtID0gYmxvYi0+aXRlbXMoKS5hdCgwKS0+dG9GaWxlQmxvYkl0ZW0o
KTsKLSAgICBpZiAoIWZpbGVJdGVtKSB7Ci0gICAgICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgICAg
IG1fY2xpZW50LT5kaWRGYWlsKE5PVF9SRUFEQUJMRV9FUlIpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQorICAgICAgICByZXR1cm4gMDsKIAotICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0
cyBieSBxdWVyeWluZyBpdHMgbW9kaWZpY2F0aW9uIHRpbWUuIFdlIGNob29zZSBub3QgdG8gY2Fs
bCBmaWxlRXhpc3RzKCkgaW4gb3JkZXIgdG8gc2F2ZSBhbgotICAgIC8vIGV4dHJhIGZpbGUgc3lz
dGVtIGNhbGwgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgaXMgbmVlZGVkIHRvIGNoZWNrIHRo
ZSB2YWxpZGl0eSBvZiB0aGUgc2xpY2VkIGZpbGUgYmxvYi4KLSAgICAvLyBQZXIgdGhlIHNwZWMs
IHdlIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBlcnJvciBjb2RlcyB0byBkaWZmZXJlbnRpYXRl
IGJldHdlZW4gbm9uLWV4aXN0ZW50IGZpbGUgYW5kIHBlcm1pc3Npb24gZXJyb3IuCi0gICAgLy8g
b3BlbkZpbGUoKSBjb3VsZCBub3QgdGVsbCB1c2UgdGhlIGZhaWx1cmUgcmVhc29uLgotICAgIHRp
bWVfdCBjdXJyZW50TW9kaWZpY2F0aW9uVGltZTsKLSAgICBpZiAoIWdldEZpbGVNb2RpZmljYXRp
b25UaW1lKGZpbGVJdGVtLT5wYXRoKCksIGN1cnJlbnRNb2RpZmljYXRpb25UaW1lKSkgewotICAg
ICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfRk9VTkRfRVJSKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KKyAgICAvLyBPcGVuIHRoZSBmaWxlLgorICAgIG1faGFuZGxlID0gb3BlbkZpbGUocGF0
aCwgT3BlbkZvclJlYWQpOworICAgIGlmICghaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpCisgICAg
ICAgIHJldHVybiBOT1RfUkVBREFCTEVfRVJSOwogCi0gICAgLy8gT3BlbiB0aGUgZmlsZSBibG9i
LgotICAgIG1faGFuZGxlID0gb3BlbkZpbGUoZmlsZUl0ZW0tPnBhdGgoKSwgT3BlbkZvclJlYWQp
OwotICAgIGlmICghaXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpIHsKLSAgICAgICAgbV9jbGllbnQt
PmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7Ci0gICAgICAgIHJldHVybjsKKyAgICAvLyBKdW1w
IHRvIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gaWYgdGhlIGZpbGUgaGFzIGJlZW4gc2xpY2VkLgor
ICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgIGlmIChzZWVrRmlsZShtX2hhbmRsZSwgb2Zm
c2V0LCBTZWVrRnJvbUJlZ2lubmluZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5PVF9SRUFE
QUJMRV9FUlI7CiAgICAgfQogCi0gICAgY29uc3QgRmlsZVJhbmdlQmxvYkl0ZW0qIGZpbGVSYW5n
ZUl0ZW0gPSBmaWxlSXRlbS0+dG9GaWxlUmFuZ2VCbG9iSXRlbSgpOwotICAgIGlmIChmaWxlUmFu
Z2VJdGVtKSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBtb2RpZmljYXRpb250IHRpbWUgZm9yIHRo
ZSBwb3NzaWJsZSBmaWxlIGNoYW5nZS4KLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHRpbWVfdD4o
ZmlsZVJhbmdlSXRlbS0+c25hcHNob3RNb2RpZmljYXRpb25UaW1lKCkpICE9IGN1cnJlbnRNb2Rp
ZmljYXRpb25UaW1lKSB7Ci0gICAgICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfUkVBREFC
TEVfRVJSKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEp1
bXAgdG8gdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBpZiB0aGUgZmlsZSBoYXMgYmVlbiBzbGljZWQu
Ci0gICAgICAgIGlmIChmaWxlUmFuZ2VJdGVtLT5zdGFydCgpID4gMCkgewotICAgICAgICAgICAg
aWYgKHNlZWtGaWxlKG1faGFuZGxlLCBmaWxlUmFuZ2VJdGVtLT5zdGFydCgpLCBTZWVrRnJvbUJl
Z2lubmluZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JF
QURBQkxFX0VSUik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQorICAgIG1fdG90YWxCeXRlc1RvUmVhZCA9IGxlbmd0aDsKKyAgICBtX2J5
dGVzUHJvY2Vzc2VkID0gMDsKIAotICAgIC8vIEdldCB0aGUgc2l6ZS4KLSAgICBtX3RvdGFsQnl0
ZXNUb1JlYWQgPSBibG9iLT5zaXplKCk7Ci0gICAgbV9jbGllbnQtPmRpZEdldFNpemUobV90b3Rh
bEJ5dGVzVG9SZWFkKTsKKyAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBGaWxlU3RyZWFtOjpvcGVu
Rm9yV3JpdGUoY29uc3QgU3RyaW5nJikKK0V4Y2VwdGlvbkNvZGUgRmlsZVN0cmVhbTo6b3BlbkZv
cldyaXRlKGNvbnN0IFN0cmluZyYpCiB7Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CiAg
ICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorICAgIHJldHVybiBOT1RfU1VQUE9SVEVE
X0VSUjsKIH0KIAogdm9pZCBGaWxlU3RyZWFtOjpjbG9zZSgpCiB7Ci0gICAgQVNTRVJUKCFpc01h
aW5UaHJlYWQoKSk7CiAgICAgaWYgKGlzSGFuZGxlVmFsaWQobV9oYW5kbGUpKSB7CiAgICAgICAg
IGNsb3NlRmlsZShtX2hhbmRsZSk7CiAgICAgICAgIG1faGFuZGxlID0gaW52YWxpZFBsYXRmb3Jt
RmlsZUhhbmRsZTsKICAgICB9CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6cmVhZChjaGFyKiBidWZm
ZXIsIGludCBsZW5ndGgpCitpbnQgRmlsZVN0cmVhbTo6cmVhZChjaGFyKiBidWZmZXIsIGludCBi
dWZmZXJTaXplKQogewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotCi0gICAgaWYgKCFp
c0hhbmRsZVZhbGlkKG1faGFuZGxlKSkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1Rf
UkVBREFCTEVfRVJSKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX2J5dGVz
UHJvY2Vzc2VkID49IG1fdG90YWxCeXRlc1RvUmVhZCkgewotICAgICAgICBtX2NsaWVudC0+ZGlk
RmluaXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgaWYgKCFpc0hhbmRsZVZhbGlk
KG1faGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgbG9uZyBsb25nIHJlbWFpbmlu
ZyA9IG1fdG90YWxCeXRlc1RvUmVhZCAtIG1fYnl0ZXNQcm9jZXNzZWQ7Ci0gICAgaW50IGJ5dGVz
VG9SZWFkID0gKHJlbWFpbmluZyA8IGxlbmd0aCkgPyBzdGF0aWNfY2FzdDxpbnQ+KHJlbWFpbmlu
ZykgOiBsZW5ndGg7Ci0gICAgaW50IGJ5dGVzUmVhZCA9IHJlYWRGcm9tRmlsZShtX2hhbmRsZSwg
YnVmZmVyLCBieXRlc1RvUmVhZCk7Ci0gICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKLSAgICAgICAg
bV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICBpZiAoIWJ5dGVzUmVhZCkgewotICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNo
KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2J5dGVzUHJvY2Vzc2VkICs9IGJ5
dGVzUmVhZDsKLSAgICBtX2NsaWVudC0+ZGlkUmVhZChidWZmZXIsIGJ5dGVzUmVhZCk7CisgICAg
aW50IGJ5dGVzVG9SZWFkID0gKHJlbWFpbmluZyA8IGJ1ZmZlclNpemUpID8gc3RhdGljX2Nhc3Q8
aW50PihyZW1haW5pbmcpIDogYnVmZmVyU2l6ZTsKKyAgICBpbnQgYnl0ZXNSZWFkID0gMDsKKyAg
ICBpZiAoYnl0ZXNUb1JlYWQgPiAwKQorICAgICAgICBieXRlc1JlYWQgPSByZWFkRnJvbUZpbGUo
bV9oYW5kbGUsIGJ1ZmZlciwgYnl0ZXNUb1JlYWQpOworICAgIGlmIChieXRlc1JlYWQgPCAwKQor
ICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGJ5dGVzUmVhZCA+IDApCisgICAgICAgIG1fYnl0
ZXNQcm9jZXNzZWQgKz0gYnl0ZXNSZWFkOworCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKIH0KIAot
dm9pZCBGaWxlU3RyZWFtOjp3cml0ZShCbG9iKiwgbG9uZyBsb25nLCBpbnQpCitpbnQgRmlsZVN0
cmVhbTo6d3JpdGUoQmxvYiosIGxvbmcgbG9uZywgaW50KQogewotICAgIEFTU0VSVCghaXNNYWlu
VGhyZWFkKCkpOwogICAgIC8vIEZJWE1FOiB0byBiZSBpbXBsZW1lbnRlZC4KKyAgICByZXR1cm4g
LTE7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6dHJ1bmNhdGUobG9uZyBsb25nKQorRXhjZXB0aW9u
Q29kZSBGaWxlU3RyZWFtOjp0cnVuY2F0ZShsb25nIGxvbmcpCiB7Ci0gICAgQVNTRVJUKCFpc01h
aW5UaHJlYWQoKSk7CiAgICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorICAgIHJldHVy
biBOT1RfU1VQUE9SVEVEX0VSUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uaCBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFt
LmgKaW5kZXggYjVlY2NkNC4uODVjN2IxNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9odG1sL0ZpbGVT
dHJlYW0uaAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5oCkBAIC0zMyw3ICszMyw3IEBA
CiAKICNpZiBFTkFCTEUoQkxPQikgfHwgRU5BQkxFKEZJTEVfV1JJVEVSKQogCi0jaW5jbHVkZSAi
RmlsZVN0cmVhbUNsaWVudC5oIgorI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKICNpbmNsdWRl
ICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNsdWRlIDx3dGYv
UGFzc1JlZlB0ci5oPgpAQCAtNDMsMjkgKzQzLDUyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAog
Y2xhc3MgQmxvYjsKIAotLy8gQWxsIG1ldGhvZHMgYXJlIHN5bmNocm9ub3VzIGFuZCBzaG91bGQg
YmUgY2FsbGVkIG9uIEZpbGUgb3IgV29ya2VyIHRocmVhZC4KKy8vIEFsbCBtZXRob2RzIGFyZSBz
eW5jaHJvbm91cy4KIGNsYXNzIEZpbGVTdHJlYW0gOiBwdWJsaWMgUmVmQ291bnRlZDxGaWxlU3Ry
ZWFtPiB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8RmlsZVN0cmVhbT4gY3JlYXRl
KEZpbGVTdHJlYW1DbGllbnQqIGNsaWVudCkKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxGaWxlU3Ry
ZWFtPiBjcmVhdGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBGaWxlU3Ry
ZWFtKGNsaWVudCkpOworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEZpbGVTdHJlYW0oKSk7
CiAgICAgfQogICAgIHZpcnR1YWwgfkZpbGVTdHJlYW0oKTsKIAorICAgIC8vIEZJWE1FOiBUbyBi
ZSByZW1vdmVkIHdoZW4gd2Ugc3dpdGNoIHRvIHVzaW5nIEJsb2JEYXRhLgogICAgIHZvaWQgc3Rh
cnQoKTsKKworICAgIC8vIEFib3J0cyB0aGUgb3BlcmF0aW9uLgogICAgIHZvaWQgc3RvcCgpOwog
Ci0gICAgdm9pZCBvcGVuRm9yUmVhZChCbG9iKik7Ci0gICAgdm9pZCBvcGVuRm9yV3JpdGUoY29u
c3QgU3RyaW5nJiBwYXRoKTsKKyAgICAvLyBHZXRzIHRoZSBzaXplIG9mIGEgZmlsZS4gQWxzbyB2
YWxpZGF0ZXMgaWYgdGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvciBub3QgaWYgdGhlIGV4cGVj
dGVkIG1vZGlmaWNhdGlvbiB0aW1lIGlzIHByb3ZpZGVkLCBpLmUuIG5vbi16ZXJvLgorICAgIC8v
IFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGlmIHN1Y2Nlc3NmdWwuIC0xIG90aGVyd2lz
ZS4KKyAgICBsb25nIGxvbmcgZ2V0U2l6ZShjb25zdCBTdHJpbmcmIHBhdGgsIGRvdWJsZSBleHBl
Y3RlZE1vZGlmaWNhdGlvblRpbWUpOworCisgICAgLy8gT3BlbnMgYSBmaWxlIGZvciByZWFkaW5n
LiBUaGUgcmVhZGluZyBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIGxhc3RzIHRp
bGwgdGhlIHNwZWNpZmllZCBsZW5ndGguCisgICAgLy8gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIEV4
Y2VwdGlvbiBjb2RlIG90aGVyd2lzZS4KKyAgICBFeGNlcHRpb25Db2RlIG9wZW5Gb3JSZWFkKGNv
bnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCk7CisK
KyAgICAvLyBPcGVucyBhIGZpbGUgZm9yIHdyaXRpbmcuCisgICAgLy8gUmV0dXJucyAwIG9uIHN1
Y2Nlc3MuIEV4Y2VwdGlvbiBjb2RlIG90aGVyd2lzZS4KKyAgICBFeGNlcHRpb25Db2RlIG9wZW5G
b3JXcml0ZShjb25zdCBTdHJpbmcmIHBhdGgpOworCisgICAgLy8gQ2xvc2VzIHRoZSBmaWxlLgog
ICAgIHZvaWQgY2xvc2UoKTsKLSAgICB2b2lkIHJlYWQoY2hhciogYnVmZmVyLCBpbnQgbGVuZ3Ro
KTsKLSAgICB2b2lkIHdyaXRlKEJsb2IqIGJsb2IsIGxvbmcgbG9uZyBwb3NpdGlvbiwgaW50IGxl
bmd0aCk7Ci0gICAgdm9pZCB0cnVuY2F0ZShsb25nIGxvbmcgcG9zaXRpb24pOworCisgICAgLy8g
UmVhZHMgYSBmaWxlIGludG8gdGhlIHByb3ZpZGVkIGRhdGEgYnVmZmVyLgorICAgIC8vIFJldHVy
bnMgbnVtYmVyIG9mIGJ5dGVzIGJlaW5nIHJlYWQgb24gc3VjY2Vzcy4gLTEgb3RoZXJ3aXNlLgor
ICAgIC8vIElmIDAgaXMgcmV0dXJuZWQsIGl0IG1lYW5zIHRoYXQgdGhlIHJlYWRpbmcgaXMgY29t
cGxldGVkLgorICAgIGludCByZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisKKyAgICAv
LyBXcml0ZXMgYSBibG9iIHRvIHRoZSBmaWxlLgorICAgIC8vIFJldHVybnMgbnVtYmVyIG9mIGJ5
dGVzIGJlaW5nIHdyaXR0ZW4gb24gc3VjY2Vzcy4gLTEgb3RoZXJ3aXNlLgorICAgIGludCB3cml0
ZShCbG9iKiBibG9iLCBsb25nIGxvbmcgcG9zaXRpb24sIGludCBsZW5ndGgpOworCisgICAgLy8g
VHJ1bmNhdGVzIHRoZSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgLy8gUmV0
dXJucyAwIG9uIHN1Y2Nlc3MuIEV4Y2VwdGlvbiBjb2RlIG90aGVyd2lzZS4KKyAgICBFeGNlcHRp
b25Db2RlIHRydW5jYXRlKGxvbmcgbG9uZyBwb3NpdGlvbik7CiAKIHByaXZhdGU6Ci0gICAgRmls
ZVN0cmVhbShGaWxlU3RyZWFtQ2xpZW50Kik7CisgICAgRmlsZVN0cmVhbSgpOwogCi0gICAgRmls
ZVN0cmVhbUNsaWVudCogbV9jbGllbnQ7CiAgICAgUGxhdGZvcm1GaWxlSGFuZGxlIG1faGFuZGxl
OwogICAgIGxvbmcgbG9uZyBtX2J5dGVzUHJvY2Vzc2VkOwogICAgIGxvbmcgbG9uZyBtX3RvdGFs
Qnl0ZXNUb1JlYWQ7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbUNsaWVudC5o
IGIvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW1DbGllbnQuaAppbmRleCAyZTcwOTFmLi40NDBkMmZi
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbUNsaWVudC5oCisrKyBiL1dlYkNv
cmUvaHRtbC9GaWxlU3RyZWFtQ2xpZW50LmgKQEAgLTQwLDE2ICs0MCwxOCBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiBjbGFzcyBGaWxlU3RyZWFtQ2xpZW50IHsKIHB1YmxpYzoKICAgICAvLyBGb3Ig
cmVhZGluZy4KLSAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZChjb25zdCBjaGFyKiwgaW50KSB7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZChpbnQpIHsgfQogCiAgICAgLy8gRm9yIHdyaXRpbmcu
CiAgICAgdmlydHVhbCB2b2lkIGRpZFdyaXRlKGludCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGRp
ZFRydW5jYXRlKEV4Y2VwdGlvbkNvZGUpIHsgfQogCi0gICAgLy8gRm9yIGJvdGggcmVhZGluZyBh
bmQgd3JpdGluZy4KKyAgICAvLyBGSVhNRTogVG8gYmUgcmVtb3ZlZCB3aGVuIHdlIHN3aXRjaCB0
byB1c2luZyBCbG9iRGF0YS4KICAgICB2aXJ0dWFsIHZvaWQgZGlkU3RhcnQoKSB7IH0KKworICAg
IC8vIEZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcuCisgICAgdmlydHVhbCB2b2lkIGRpZE9w
ZW4oRXhjZXB0aW9uQ29kZSkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGRpZFN0b3AoKSB7IH0KLSAg
ICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNoKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIGRpZEZhaWwo
RXhjZXB0aW9uQ29kZSkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGRpZEdldFNpemUobG9uZyBsb25n
KSB7IH0KIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW1Q
cm94eS5jcHAgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmNwcAppbmRleCBlM2I5ZTc5
Li5mNTBiN2U4IDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmNwcAor
KysgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmNwcApAQCAtMzcsNiArMzcsNyBAQAog
I2luY2x1ZGUgIkJsb2IuaCIKICNpbmNsdWRlICJDcm9zc1RocmVhZFRhc2suaCIKICNpbmNsdWRl
ICJGaWxlU3RyZWFtLmgiCisjaW5jbHVkZSAiRmlsZVN0cmVhbUNsaWVudC5oIgogI2luY2x1ZGUg
IkZpbGVUaHJlYWQuaCIKICNpbmNsdWRlICJGaWxlVGhyZWFkVGFzay5oIgogI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCkBAIC00Nyw3ICs0OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGlu
bGluZSBGaWxlU3RyZWFtUHJveHk6OkZpbGVTdHJlYW1Qcm94eShTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiBjb250ZXh0LCBGaWxlU3RyZWFtQ2xpZW50KiBjbGllbnQpCiAgICAgOiBtX2NvbnRleHQo
Y29udGV4dCkKICAgICAsIG1fY2xpZW50KGNsaWVudCkKLSAgICAsIG1fc3RyZWFtKEZpbGVTdHJl
YW06OmNyZWF0ZSh0aGlzKSkKKyAgICAsIG1fc3RyZWFtKEZpbGVTdHJlYW06OmNyZWF0ZSgpKQog
ewogfQogCkBAIC01OSw3ICs2MCw3IEBAIFBhc3NSZWZQdHI8RmlsZVN0cmVhbVByb3h5PiBGaWxl
U3RyZWFtUHJveHk6OmNyZWF0ZShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250CiAgICAgLy8g
VGhpcyBpcyBiYWxhbmNlZCBieSB0aGUgZGVyZWYgaW4gZGVyZWZQcm94eU9uQ29udGV4dCBiZWxv
dy4KICAgICBwcm94eS0+cmVmKCk7CiAKLSAgICBwcm94eS0+ZmlsZVRocmVhZCgpLT5wb3N0VGFz
ayhjcmVhdGVGaWxlVGhyZWFkVGFzayhwcm94eS0+bV9zdHJlYW0uZ2V0KCksICZGaWxlU3RyZWFt
OjpzdGFydCkpOworICAgIHByb3h5LT5maWxlVGhyZWFkKCktPnBvc3RUYXNrKGNyZWF0ZUZpbGVU
aHJlYWRUYXNrKHByb3h5LmdldCgpLCAmRmlsZVN0cmVhbVByb3h5OjpzdGFydE9uRmlsZVRocmVh
ZCkpOwogCiAgICAgcmV0dXJuIHByb3h5LnJlbGVhc2UoKTsKIH0KQEAgLTY4LDEzMyArNjksMTUw
IEBAIEZpbGVTdHJlYW1Qcm94eTo6fkZpbGVTdHJlYW1Qcm94eSgpCiB7CiB9CiAKLXZvaWQgRmls
ZVN0cmVhbVByb3h5OjpvcGVuRm9yUmVhZChCbG9iKiBibG9iKQorRmlsZVRocmVhZCogRmlsZVN0
cmVhbVByb3h5OjpmaWxlVGhyZWFkKCkKIHsKLSAgICBmaWxlVGhyZWFkKCktPnBvc3RUYXNrKGNy
ZWF0ZUZpbGVUaHJlYWRUYXNrKG1fc3RyZWFtLmdldCgpLCAmRmlsZVN0cmVhbTo6b3BlbkZvclJl
YWQsIGJsb2IpKTsKKyAgICBBU1NFUlQobV9jb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7Cisg
ICAgQVNTRVJUKG1fY29udGV4dC0+ZmlsZVRocmVhZCgpKTsKKyAgICByZXR1cm4gbV9jb250ZXh0
LT5maWxlVGhyZWFkKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbVByb3h5OjpvcGVuRm9yV3JpdGUo
Y29uc3QgU3RyaW5nJiBwYXRoKQorc3RhdGljIHZvaWQgZGlkU3RhcnQoU2NyaXB0RXhlY3V0aW9u
Q29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHkpCiB7Ci0gICAgZmlsZVRocmVhZCgpLT5w
b3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayhtX3N0cmVhbS5nZXQoKSwgJkZpbGVTdHJlYW06
Om9wZW5Gb3JXcml0ZSwgcGF0aCkpOworICAgIGlmIChwcm94eS0+Y2xpZW50KCkpCisgICAgICAg
IHByb3h5LT5jbGllbnQoKS0+ZGlkU3RhcnQoKTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtUHJveHk6
OmNsb3NlKCkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpzdGFydE9uRmlsZVRocmVhZCgpCiB7Ci0g
ICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayhtX3N0cmVhbS5n
ZXQoKSwgJkZpbGVTdHJlYW06OmNsb3NlKSk7CisgICAgbV9zdHJlYW0tPnN0YXJ0KCk7CisgICAg
bV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFN0YXJ0LCB0aGlzKSk7
CiB9CiAKLXZvaWQgRmlsZVN0cmVhbVByb3h5OjpyZWFkKGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0
aCkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpzdG9wKCkKIHsKLSAgICBmaWxlVGhyZWFkKCktPnBv
c3RUYXNrKGNyZWF0ZUZpbGVUaHJlYWRUYXNrKG1fc3RyZWFtLmdldCgpLCAmRmlsZVN0cmVhbTo6
cmVhZCwgYnVmZmVyLCBsZW5ndGgpKTsKKyAgICAvLyBDbGVhciB0aGUgY2xpZW50IHNvIHRoYXQg
d2Ugd29uJ3QgYmUgY2FsbGluZyBjYWxsYmFja3Mgb24gdGhlIGNsaWVudC4KKyAgICBtX2NsaWVu
dCA9IDA7CisKKyAgICBmaWxlVGhyZWFkKCktPnVuc2NoZWR1bGVUYXNrcyhtX3N0cmVhbS5nZXQo
KSk7CisgICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayh0aGlz
LCAmRmlsZVN0cmVhbVByb3h5OjpzdG9wT25GaWxlVGhyZWFkKSk7CiB9CiAKLXZvaWQgRmlsZVN0
cmVhbVByb3h5Ojp3cml0ZShCbG9iKiBibG9iLCBsb25nIGxvbmcgcG9zaXRpb24sIGludCBsZW5n
dGgpCitzdGF0aWMgdm9pZCBkZXJlZlByb3h5T25Db250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5KQogewotICAgIGZpbGVUaHJlYWQoKS0+cG9zdFRh
c2soY3JlYXRlRmlsZVRocmVhZFRhc2sobV9zdHJlYW0uZ2V0KCksICZGaWxlU3RyZWFtOjp3cml0
ZSwgYmxvYiwgcG9zaXRpb24sIGxlbmd0aCkpOworICAgIEFTU0VSVChwcm94eS0+aGFzT25lUmVm
KCkpOworICAgIHByb3h5LT5kZXJlZigpOwogfQogCi12b2lkIEZpbGVTdHJlYW1Qcm94eTo6dHJ1
bmNhdGUobG9uZyBsb25nIHBvc2l0aW9uKQordm9pZCBGaWxlU3RyZWFtUHJveHk6OnN0b3BPbkZp
bGVUaHJlYWQoKQogewotICAgIGZpbGVUaHJlYWQoKS0+cG9zdFRhc2soY3JlYXRlRmlsZVRocmVh
ZFRhc2sobV9zdHJlYW0uZ2V0KCksICZGaWxlU3RyZWFtOjp0cnVuY2F0ZSwgcG9zaXRpb24pKTsK
KyAgICBtX3N0cmVhbS0+c3RvcCgpOworICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2Fs
bGJhY2tUYXNrKCZkZXJlZlByb3h5T25Db250ZXh0LCB0aGlzKSk7CiB9CiAKLUZpbGVUaHJlYWQq
IEZpbGVTdHJlYW1Qcm94eTo6ZmlsZVRocmVhZCgpCitzdGF0aWMgdm9pZCBkaWRHZXRTaXplKFNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5LCBsb25nIGxvbmcg
c2l6ZSkKIHsKLSAgICBBU1NFUlQobV9jb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7Ci0gICAg
QVNTRVJUKG1fY29udGV4dC0+ZmlsZVRocmVhZCgpKTsKLSAgICByZXR1cm4gbV9jb250ZXh0LT5m
aWxlVGhyZWFkKCk7CisgICAgaWYgKHByb3h5LT5jbGllbnQoKSkKKyAgICAgICAgcHJveHktPmNs
aWVudCgpLT5kaWRHZXRTaXplKHNpemUpOwogfQogCi12b2lkIEZpbGVTdHJlYW1Qcm94eTo6c3Rv
cCgpCit2b2lkIEZpbGVTdHJlYW1Qcm94eTo6Z2V0U2l6ZShjb25zdCBTdHJpbmcmIHBhdGgsIGRv
dWJsZSBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWUpCiB7Ci0gICAgLy8gQ2xlYXIgdGhlIGNsaWVu
dCBzbyB0aGF0IHdlIHdvbid0IGJlIGNhbGxpbmcgY2FsbGJhY2tzIG9uIHRoZSBjbGllbnQuCi0g
ICAgbV9jbGllbnQgPSAwOworICAgIGZpbGVUaHJlYWQoKS0+cG9zdFRhc2soY3JlYXRlRmlsZVRo
cmVhZFRhc2sodGhpcywgJkZpbGVTdHJlYW1Qcm94eTo6Z2V0U2l6ZU9uRmlsZVRocmVhZCwgcGF0
aCwgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKSk7Cit9CiAKLSAgICBmaWxlVGhyZWFkKCktPnVu
c2NoZWR1bGVUYXNrcyhtX3N0cmVhbS5nZXQoKSk7Ci0gICAgZmlsZVRocmVhZCgpLT5wb3N0VGFz
ayhjcmVhdGVGaWxlVGhyZWFkVGFzayhtX3N0cmVhbS5nZXQoKSwgJkZpbGVTdHJlYW06OnN0b3Ap
KTsKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpnZXRTaXplT25GaWxlVGhyZWFkKGNvbnN0IFN0cmlu
ZyYgcGF0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSkKK3sKKyAgICBsb25nIGxv
bmcgc2l6ZSA9IG1fc3RyZWFtLT5nZXRTaXplKHBhdGgsIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGlt
ZSk7CisgICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rhc2soJmRpZEdldFNp
emUsIHRoaXMsIHNpemUpKTsKIH0KIAotc3RhdGljIHZvaWQgbm90aWZ5R2V0U2l6ZU9uQ29udGV4
dChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgRmlsZVN0cmVhbVByb3h5KiBwcm94eSwgbG9uZyBs
b25nIHNpemUpCitzdGF0aWMgdm9pZCBkaWRPcGVuKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBG
aWxlU3RyZWFtUHJveHkqIHByb3h5LCBFeGNlcHRpb25Db2RlIGVjKQogewogICAgIGlmIChwcm94
eS0+Y2xpZW50KCkpCi0gICAgICAgIHByb3h5LT5jbGllbnQoKS0+ZGlkR2V0U2l6ZShzaXplKTsK
KyAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRPcGVuKGVjKTsKIH0KIAotdm9pZCBGaWxlU3Ry
ZWFtUHJveHk6OmRpZEdldFNpemUobG9uZyBsb25nIHNpemUpCit2b2lkIEZpbGVTdHJlYW1Qcm94
eTo6b3BlbkZvclJlYWQoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxvbmcgb2Zmc2V0LCBsb25n
IGxvbmcgbGVuZ3RoKQogewotICAgIEFTU0VSVCghbV9jb250ZXh0LT5pc0NvbnRleHRUaHJlYWQo
KSk7Ci0gICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rhc2soJm5vdGlmeUdl
dFNpemVPbkNvbnRleHQsIHRoaXMsIHNpemUpKTsKKyAgICBmaWxlVGhyZWFkKCktPnBvc3RUYXNr
KGNyZWF0ZUZpbGVUaHJlYWRUYXNrKHRoaXMsICZGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JSZWFk
T25GaWxlVGhyZWFkLCBwYXRoLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCi1zdGF0aWMgdm9pZCBu
b3RpZnlSZWFkT25Db250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJv
eHkqIHByb3h5LCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgYnl0ZXNSZWFkKQordm9pZCBGaWxlU3Ry
ZWFtUHJveHk6Om9wZW5Gb3JSZWFkT25GaWxlVGhyZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9u
ZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCkKIHsKLSAgICBpZiAocHJveHktPmNsaWVu
dCgpKQotICAgICAgICBwcm94eS0+Y2xpZW50KCktPmRpZFJlYWQoZGF0YSwgYnl0ZXNSZWFkKTsK
KyAgICBFeGNlcHRpb25Db2RlIGVjID0gbV9zdHJlYW0tPm9wZW5Gb3JSZWFkKHBhdGgsIG9mZnNl
dCwgbGVuZ3RoKTsKKyAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygm
ZGlkT3BlbiwgdGhpcywgZWMpKTsKK30KKwordm9pZCBGaWxlU3RyZWFtUHJveHk6Om9wZW5Gb3JX
cml0ZShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhj
cmVhdGVGaWxlVGhyZWFkVGFzayh0aGlzLCAmRmlsZVN0cmVhbVByb3h5OjpvcGVuRm9yV3JpdGVP
bkZpbGVUaHJlYWQsIHBhdGgpKTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtUHJveHk6OmRpZFJlYWQo
Y29uc3QgY2hhciogZGF0YSwgaW50IGJ5dGVzUmVhZCkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5Ojpv
cGVuRm9yV3JpdGVPbkZpbGVUaHJlYWQoY29uc3QgU3RyaW5nJiBwYXRoKQogewotICAgIEFTU0VS
VCghbV9jb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7Ci0gICAgbV9jb250ZXh0LT5wb3N0VGFz
ayhjcmVhdGVDYWxsYmFja1Rhc2soJm5vdGlmeVJlYWRPbkNvbnRleHQsIHRoaXMsIGRhdGEsIGJ5
dGVzUmVhZCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSBtX3N0cmVhbS0+b3BlbkZvcldyaXRl
KHBhdGgpOworICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZkaWRP
cGVuLCB0aGlzLCBlYykpOwogfQogCi1zdGF0aWMgdm9pZCBub3RpZnlXcml0ZU9uQ29udGV4dChT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgRmlsZVN0cmVhbVByb3h5KiBwcm94eSwgaW50IGJ5dGVz
V3JpdHRlbikKK3ZvaWQgRmlsZVN0cmVhbVByb3h5OjpjbG9zZSgpCiB7Ci0gICAgaWYgKHByb3h5
LT5jbGllbnQoKSkKLSAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRXcml0ZShieXRlc1dyaXR0
ZW4pOworICAgIGZpbGVUaHJlYWQoKS0+cG9zdFRhc2soY3JlYXRlRmlsZVRocmVhZFRhc2sodGhp
cywgJkZpbGVTdHJlYW1Qcm94eTo6Y2xvc2VPbkZpbGVUaHJlYWQpKTsKIH0KIAotdm9pZCBGaWxl
U3RyZWFtUHJveHk6OmRpZFdyaXRlKGludCBieXRlc1dyaXR0ZW4pCit2b2lkIEZpbGVTdHJlYW1Q
cm94eTo6Y2xvc2VPbkZpbGVUaHJlYWQoKQogewotICAgIEFTU0VSVCghbV9jb250ZXh0LT5pc0Nv
bnRleHRUaHJlYWQoKSk7Ci0gICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rh
c2soJm5vdGlmeVdyaXRlT25Db250ZXh0LCB0aGlzLCBieXRlc1dyaXR0ZW4pKTsKKyAgICBtX3N0
cmVhbS0+Y2xvc2UoKTsKIH0KIAotc3RhdGljIHZvaWQgbm90aWZ5U3RhcnRPbkNvbnRleHQoU2Ny
aXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJlYW1Qcm94eSogcHJveHkpCitzdGF0aWMgdm9p
ZCBkaWRSZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5
LCBpbnQgYnl0ZXNSZWFkKQogewogICAgIGlmIChwcm94eS0+Y2xpZW50KCkpCi0gICAgICAgIHBy
b3h5LT5jbGllbnQoKS0+ZGlkU3RhcnQoKTsKKyAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRS
ZWFkKGJ5dGVzUmVhZCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbVByb3h5OjpkaWRTdGFydCgpCit2
b2lkIEZpbGVTdHJlYW1Qcm94eTo6cmVhZChjaGFyKiBidWZmZXIsIGludCBsZW5ndGgpCit7Cisg
ICAgZmlsZVRocmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayh0aGlzLCAmRmls
ZVN0cmVhbVByb3h5OjpyZWFkT25GaWxlVGhyZWFkLCBidWZmZXIsIGxlbmd0aCkpOworfQorCit2
b2lkIEZpbGVTdHJlYW1Qcm94eTo6cmVhZE9uRmlsZVRocmVhZChjaGFyKiBidWZmZXIsIGludCBs
ZW5ndGgpCiB7Ci0gICAgQVNTRVJUKCFtX2NvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKLSAg
ICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFzaygmbm90aWZ5U3RhcnRPbkNv
bnRleHQsIHRoaXMpKTsKKyAgICBpbnQgYnl0ZXNSZWFkID0gbV9zdHJlYW0tPnJlYWQoYnVmZmVy
LCBsZW5ndGgpOworICAgIG1fY29udGV4dC0+cG9zdFRhc2soY3JlYXRlQ2FsbGJhY2tUYXNrKCZk
aWRSZWFkLCB0aGlzLCBieXRlc1JlYWQpKTsKIH0KIAotc3RhdGljIHZvaWQgbm90aWZ5RmluaXNo
T25Db250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkqIHByb3h5
KQorc3RhdGljIHZvaWQgZGlkV3JpdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVTdHJl
YW1Qcm94eSogcHJveHksIGludCBieXRlc1dyaXR0ZW4pCiB7CiAgICAgaWYgKHByb3h5LT5jbGll
bnQoKSkKLSAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRGaW5pc2goKTsKKyAgICAgICAgcHJv
eHktPmNsaWVudCgpLT5kaWRXcml0ZShieXRlc1dyaXR0ZW4pOwogfQogCi12b2lkIEZpbGVTdHJl
YW1Qcm94eTo6ZGlkRmluaXNoKCkKK3ZvaWQgRmlsZVN0cmVhbVByb3h5Ojp3cml0ZShCbG9iKiBi
bG9iLCBsb25nIGxvbmcgcG9zaXRpb24sIGludCBsZW5ndGgpCiB7Ci0gICAgQVNTRVJUKCFtX2Nv
bnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKLSAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0
ZUNhbGxiYWNrVGFzaygmbm90aWZ5RmluaXNoT25Db250ZXh0LCB0aGlzKSk7CisgICAgZmlsZVRo
cmVhZCgpLT5wb3N0VGFzayhjcmVhdGVGaWxlVGhyZWFkVGFzayh0aGlzLCAmRmlsZVN0cmVhbVBy
b3h5Ojp3cml0ZU9uRmlsZVRocmVhZCwgYmxvYiwgcG9zaXRpb24sIGxlbmd0aCkpOwogfQogCi1z
dGF0aWMgdm9pZCBub3RpZnlGYWlsT25Db250ZXh0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBG
aWxlU3RyZWFtUHJveHkqIHByb3h5LCBFeGNlcHRpb25Db2RlIGVjKQordm9pZCBGaWxlU3RyZWFt
UHJveHk6OndyaXRlT25GaWxlVGhyZWFkKEJsb2IqIGJsb2IsIGxvbmcgbG9uZyBwb3NpdGlvbiwg
aW50IGxlbmd0aCkKIHsKLSAgICBpZiAocHJveHktPmNsaWVudCgpKQotICAgICAgICBwcm94eS0+
Y2xpZW50KCktPmRpZEZhaWwoZWMpOworICAgIGludCBieXRlc1dyaXR0ZW4gPSBtX3N0cmVhbS0+
d3JpdGUoYmxvYiwgcG9zaXRpb24sIGxlbmd0aCk7CisgICAgbV9jb250ZXh0LT5wb3N0VGFzayhj
cmVhdGVDYWxsYmFja1Rhc2soJmRpZFdyaXRlLCB0aGlzLCBieXRlc1dyaXR0ZW4pKTsKIH0KIAot
dm9pZCBGaWxlU3RyZWFtUHJveHk6OmRpZEZhaWwoRXhjZXB0aW9uQ29kZSBlYykKK3N0YXRpYyB2
b2lkIGRpZFRydW5jYXRlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtUHJveHkq
IHByb3h5LCBFeGNlcHRpb25Db2RlIGVjKQogewotICAgIEFTU0VSVCghbV9jb250ZXh0LT5pc0Nv
bnRleHRUaHJlYWQoKSk7Ci0gICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rh
c2soJm5vdGlmeUZhaWxPbkNvbnRleHQsIHRoaXMsIGVjKSk7CisgICAgaWYgKHByb3h5LT5jbGll
bnQoKSkKKyAgICAgICAgcHJveHktPmNsaWVudCgpLT5kaWRUcnVuY2F0ZShlYyk7CiB9CiAKLXN0
YXRpYyB2b2lkIGRlcmVmUHJveHlPbkNvbnRleHQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZp
bGVTdHJlYW1Qcm94eSogcHJveHkpCit2b2lkIEZpbGVTdHJlYW1Qcm94eTo6dHJ1bmNhdGUobG9u
ZyBsb25nIHBvc2l0aW9uKQogewotICAgIEFTU0VSVChwcm94eS0+aGFzT25lUmVmKCkpOwotICAg
IHByb3h5LT5kZXJlZigpOworICAgIGZpbGVUaHJlYWQoKS0+cG9zdFRhc2soY3JlYXRlRmlsZVRo
cmVhZFRhc2sodGhpcywgJkZpbGVTdHJlYW1Qcm94eTo6dHJ1bmNhdGVPbkZpbGVUaHJlYWQsIHBv
c2l0aW9uKSk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbVByb3h5OjpkaWRTdG9wKCkKK3ZvaWQgRmls
ZVN0cmVhbVByb3h5Ojp0cnVuY2F0ZU9uRmlsZVRocmVhZChsb25nIGxvbmcgcG9zaXRpb24pCiB7
Ci0gICAgbV9jb250ZXh0LT5wb3N0VGFzayhjcmVhdGVDYWxsYmFja1Rhc2soJmRlcmVmUHJveHlP
bkNvbnRleHQsIHRoaXMpKTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gbV9zdHJlYW0tPnRydW5j
YXRlKHBvc2l0aW9uKTsKKyAgICBtX2NvbnRleHQtPnBvc3RUYXNrKGNyZWF0ZUNhbGxiYWNrVGFz
aygmZGlkVHJ1bmNhdGUsIHRoaXMsIGVjKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtUHJveHkuaCBiL1dlYkNvcmUvaHRt
bC9GaWxlU3RyZWFtUHJveHkuaAppbmRleCA4NTIzZDRhLi4zYzkzYjMzIDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2h0bWwvRmlsZVN0cmVhbVByb3h5LmgKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVTdHJl
YW1Qcm94eS5oCkBAIC0zNCw3ICszNCw2IEBACiAKICNpZiBFTkFCTEUoQkxPQikgfHwgRU5BQkxF
KEZJTEVfV1JJVEVSKQogCi0jaW5jbHVkZSAiRmlsZVN0cmVhbUNsaWVudC5oIgogI2luY2x1ZGUg
PHd0Zi9Gb3J3YXJkLmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgpAQCAtNDQsMTYgKzQzLDE4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAogY2xhc3MgQmxvYjsKIGNsYXNzIEZpbGVTdHJlYW07CitjbGFzcyBGaWxlU3RyZWFtQ2xpZW50
OwogY2xhc3MgRmlsZVRocmVhZDsKIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ7CiAKLS8v
IEEgcHJveHkgbW9kdWxlIHRoYXQgY2FsbHMgY29ycmVzcG9uZGluZyBGaWxlU3RyZWFtIG1ldGhv
ZHMgb24gdGhlIGZpbGUgdGhyZWFkLiAgTm90ZTogeW91IG11c3QgY2FsbCBzdG9wKCkgZmlyc3Qg
YW5kIHRoZW4gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRvIGRlc3RydWN0IHRoZSBGaWxlU3RyZWFt
UHJveHkgaW5zdGFuY2UuCi1jbGFzcyBGaWxlU3RyZWFtUHJveHkgOiBwdWJsaWMgUmVmQ291bnRl
ZDxGaWxlU3RyZWFtUHJveHk+LCBwdWJsaWMgRmlsZVN0cmVhbUNsaWVudCB7CisvLyBBIHByb3h5
IG1vZHVsZSB0aGF0IGFzeW5jaHJvbm91c2x5IGNhbGxzIGNvcnJlc3BvbmRpbmcgRmlsZVN0cmVh
bSBtZXRob2RzIG9uIHRoZSBmaWxlIHRocmVhZC4gIE5vdGU6IHlvdSBtdXN0IGNhbGwgc3RvcCgp
IGZpcnN0IGFuZCB0aGVuIHJlbGVhc2UgdGhlIHJlZmVyZW5jZSB0byBkZXN0cnVjdCB0aGUgRmls
ZVN0cmVhbVByb3h5IGluc3RhbmNlLgorY2xhc3MgRmlsZVN0cmVhbVByb3h5IDogcHVibGljIFJl
ZkNvdW50ZWQ8RmlsZVN0cmVhbVByb3h5PiB7CiBwdWJsaWM6CiAgICAgc3RhdGljIFBhc3NSZWZQ
dHI8RmlsZVN0cmVhbVByb3h5PiBjcmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIEZpbGVT
dHJlYW1DbGllbnQqKTsKICAgICB2aXJ0dWFsIH5GaWxlU3RyZWFtUHJveHkoKTsKIAotICAgIHZv
aWQgb3BlbkZvclJlYWQoQmxvYiogYmxvYik7CisgICAgdm9pZCBnZXRTaXplKGNvbnN0IFN0cmlu
ZyYgcGF0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAgdm9pZCBvcGVu
Rm9yUmVhZChjb25zdCBTdHJpbmcmIHBhdGgsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9uZyBs
ZW5ndGgpOwogICAgIHZvaWQgb3BlbkZvcldyaXRlKGNvbnN0IFN0cmluZyYgcGF0aCk7CiAgICAg
dm9pZCBjbG9zZSgpOwogICAgIHZvaWQgcmVhZChjaGFyKiBidWZmZXIsIGludCBsZW5ndGgpOwpA
QCAtNjksMTcgKzcwLDE5IEBAIHB1YmxpYzoKIHByaXZhdGU6CiAgICAgRmlsZVN0cmVhbVByb3h5
KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBGaWxlU3RyZWFtQ2xpZW50Kik7CiAKLSAgICAvLyBG
aWxlU3RyZWFtQ2xpZW50IG1ldGhvZHMuCi0gICAgdmlydHVhbCB2b2lkIGRpZEdldFNpemUobG9u
ZyBsb25nKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZChjb25zdCBjaGFyKiwgaW50KTsKLSAg
ICB2aXJ0dWFsIHZvaWQgZGlkV3JpdGUoaW50KTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNo
KCk7Ci0gICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoRXhjZXB0aW9uQ29kZSk7Ci0gICAgdmlydHVh
bCB2b2lkIGRpZFN0YXJ0KCk7Ci0gICAgdmlydHVhbCB2b2lkIGRpZFN0b3AoKTsKLQogICAgIEZp
bGVUaHJlYWQqIGZpbGVUaHJlYWQoKTsKIAorICAgIC8vIENhbGxlZCBvbiBGaWxlIHRocmVhZC4K
KyAgICB2b2lkIHN0YXJ0T25GaWxlVGhyZWFkKCk7CisgICAgdm9pZCBzdG9wT25GaWxlVGhyZWFk
KCk7CisgICAgdm9pZCBnZXRTaXplT25GaWxlVGhyZWFkKGNvbnN0IFN0cmluZyYgcGF0aCwgZG91
YmxlIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSk7CisgICAgdm9pZCBvcGVuRm9yUmVhZE9uRmls
ZVRocmVhZChjb25zdCBTdHJpbmcmIHBhdGgsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9uZyBs
ZW5ndGgpOworICAgIHZvaWQgb3BlbkZvcldyaXRlT25GaWxlVGhyZWFkKGNvbnN0IFN0cmluZyYg
cGF0aCk7CisgICAgdm9pZCBjbG9zZU9uRmlsZVRocmVhZCgpOworICAgIHZvaWQgcmVhZE9uRmls
ZVRocmVhZChjaGFyKiBidWZmZXIsIGludCBsZW5ndGgpOworICAgIHZvaWQgd3JpdGVPbkZpbGVU
aHJlYWQoQmxvYiogYmxvYiwgbG9uZyBsb25nIHBvc2l0aW9uLCBpbnQgbGVuZ3RoKTsKKyAgICB2
b2lkIHRydW5jYXRlT25GaWxlVGhyZWFkKGxvbmcgbG9uZyBwb3NpdGlvbik7CisKICAgICBSZWZQ
dHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dD4gbV9jb250ZXh0OwogICAgIEZpbGVTdHJlYW1DbGll
bnQqIG1fY2xpZW50OwogICAgIFJlZlB0cjxGaWxlU3RyZWFtPiBtX3N0cmVhbTsKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvaHRtbC9GaWxlVGhyZWFkVGFzay5oIGIvV2ViQ29yZS9odG1sL0ZpbGVUaHJl
YWRUYXNrLmgKaW5kZXggMDliNjQ3Zi4uMTRjOTY3NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9odG1s
L0ZpbGVUaHJlYWRUYXNrLmgKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVUaHJlYWRUYXNrLmgKQEAg
LTEzMiw3ICsxMzIsNyBAQCBwcml2YXRlOgogdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUg
VCwgdHlwZW5hbWUgUDEsIHR5cGVuYW1lIE1QMSwgdHlwZW5hbWUgUDIsIHR5cGVuYW1lIE1QMiwg
dHlwZW5hbWUgUDMsIHR5cGVuYW1lIE1QMz4KIGNsYXNzIEZpbGVUaHJlYWRUYXNrMyA6IHB1Ymxp
YyBGaWxlVGhyZWFkOjpUYXNrIHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIHZvaWQgKFQ6OipNZXRo
b2QpKE1QMSwgTVAyLCBNUDMpOworICAgIHR5cGVkZWYgUiAoVDo6Kk1ldGhvZCkoTVAxLCBNUDIs
IE1QMyk7CiAgICAgdHlwZWRlZiBGaWxlVGhyZWFkVGFzazM8UiwgVCwgUDEsIE1QMSwgUDIsIE1Q
MiwgUDMsIE1QMz4gRmlsZVRocmVhZFRhc2tJbXBsOwogICAgIHR5cGVkZWYgdHlwZW5hbWUgQ3Jv
c3NUaHJlYWRUYXNrVHJhaXRzPFAxPjo6UGFyYW1UeXBlIFBhcmFtMTsKICAgICB0eXBlZGVmIHR5
cGVuYW1lIENyb3NzVGhyZWFkVGFza1RyYWl0czxQMj46OlBhcmFtVHlwZSBQYXJhbTI7Cg==
</data>
<flag name="review"
          id="53126"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="53127"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
      

    </bug>

</bugzilla>