<?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>38157</bug_id>
          
          <creation_ts>2010-04-26 17:46:14 -0700</creation_ts>
          <short_desc>Implement FileReader class</short_desc>
          <delta_ts>2011-07-16 20:43:44 -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>40829</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jian Li">jianli</reporter>
          <assigned_to name="Jian Li">jianli</assigned_to>
          <cc>abarth</cc>
    
    <cc>dimich</cc>
    
    <cc>eric</cc>
    
    <cc>kinuko</cc>
    
    <cc>steffen.weber</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>217390</commentid>
    <comment_count>0</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-26 17:46:14 -0700</bug_when>
    <thetext>This bug only covers the implementation of FileReader class as defined in the File API (http://www.w3.org/TR/file-upload/#dfn-filereader). The exposing of IDL interface and adding JSC bindings plus layout test will be in a separate bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>217397</commentid>
    <comment_count>1</comment_count>
      <attachid>54356</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-26 17:56:23 -0700</bug_when>
    <thetext>Created attachment 54356
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>217401</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-26 18:02:13 -0700</bug_when>
    <thetext>Attachment 54356 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/html/FileStream.cpp:152:  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]
WebCore/html/FileStream.cpp:155:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebCore/WebCore.vcproj/WebCore.vcproj:30378:  One or more unexpected \r (^M) found; better to use only a \n  [whitespace/carriage_return] [1]
Suppressing further [whitespace/carriage_return] reports for this file.
Total errors found: 10 in 14 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>217421</commentid>
    <comment_count>3</comment_count>
      <attachid>54368</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-26 18:28:58 -0700</bug_when>
    <thetext>Created attachment 54368
Proposed Patch

Fixed the style errors. The complain for WebCore.vcproj seems to be a false alarm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>217428</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-26 18:34:53 -0700</bug_when>
    <thetext>Attachment 54368 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/WebCore.vcproj/WebCore.vcproj:30378:  One or more unexpected \r (^M) found; better to use only a \n  [whitespace/carriage_return] [1]
Suppressing further [whitespace/carriage_return] reports for this file.
Total errors found: 8 in 14 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>219297</commentid>
    <comment_count>5</comment_count>
      <attachid>54368</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2010-04-29 17:32:00 -0700</bug_when>
    <thetext>Comment on attachment 54368
Proposed Patch

WebCore/html/FileReader.h:54
 +  class FileReader : public RefCounted&lt;FileReader&gt;, public EventTarget, public FileStreamClient {
It seems the Filereader should be derived from ActiveDOMObject as well, just like XMLHttpRequest. The ActiveDOMObject allows JS wrapper with attached event handlers to avoid GC and fire even though the FileReader object is out of JS scope and so its wrapper could be GC&apos;ed (and the object itself destructed). ActiveDOMObjects prevent themselves from being collected by having &apos;pending activity&apos;. Also, they can be suspended (if page goes into cache for example), and their stop() method could in help with termination. Currently, you stop the loading when the object is destructed, which can happen very long after the page using it is closed - because the lifetime of it depends when JS will do garbage collection.

WebCore/html/FileReader.h:107
 +      static const unsigned bufferSize;
This constant doesn&apos;t benefit .h file, it should be simply a static in the cpp file.

WebCore/html/FileReader.h:108
 +      static const double progressNotificationIntervalMS;
Same here.


WebCore/html/FileReader.h:152
 +      long long m_total;
m_total - probably could be a better name. Total what?

WebCore/html/FileReader.cpp:101
 +      if (m_alreadyStarted)
I am not sure this is what spec means by &quot;already started&quot;. I think spec refers to the script block being &quot;already started&quot; which is not the same thing as checking if the FileStreamProxy fired didStart().


WebCore/html/FileReader.cpp:110
 +          m_streamProxy = FileStreamProxy::create(m_context.get(), this);
If a script  calls readAs* multiple times, we will can create multiple proxies that will all call didStart() on this object once JS exits. This doesn&apos;t look right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219643</commentid>
    <comment_count>6</comment_count>
      <attachid>54831</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-30 16:09:15 -0700</bug_when>
    <thetext>Created attachment 54831
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219645</commentid>
    <comment_count>7</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-04-30 16:15:12 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 54368 [details])
&gt; WebCore/html/FileReader.h:54
&gt;  +  class FileReader : public RefCounted&lt;FileReader&gt;, public EventTarget,
&gt; public FileStreamClient {
&gt; It seems the Filereader should be derived from ActiveDOMObject as well, just
&gt; like XMLHttpRequest. The ActiveDOMObject allows JS wrapper with attached event
&gt; handlers to avoid GC and fire even though the FileReader object is out of JS
&gt; scope and so its wrapper could be GC&apos;ed (and the object itself destructed).
&gt; ActiveDOMObjects prevent themselves from being collected by having &apos;pending
&gt; activity&apos;. Also, they can be suspended (if page goes into cache for example),
&gt; and their stop() method could in help with termination. Currently, you stop the
&gt; loading when the object is destructed, which can happen very long after the
&gt; page using it is closed - because the lifetime of it depends when JS will do
&gt; garbage collection.
Fixed.
&gt; 
&gt; WebCore/html/FileReader.h:107
&gt;  +      static const unsigned bufferSize;
&gt; This constant doesn&apos;t benefit .h file, it should be simply a static in the cpp
&gt; file.
Fixed.
&gt; 
&gt; WebCore/html/FileReader.h:108
&gt;  +      static const double progressNotificationIntervalMS;
&gt; Same here.
Fixed.
&gt; 
&gt; 
&gt; WebCore/html/FileReader.h:152
&gt;  +      long long m_total;
&gt; m_total - probably could be a better name. Total what?
Fixed.
&gt; 
&gt; WebCore/html/FileReader.cpp:101
&gt;  +      if (m_alreadyStarted)
&gt; I am not sure this is what spec means by &quot;already started&quot;. I think spec refers
&gt; to the script block being &quot;already started&quot; which is not the same thing as
&gt; checking if the FileStreamProxy fired didStart().
This is similar to what spec means by &quot;already started&quot;. When multiple read methods are called in a script block, m_alreadyStarted is still false and thus readInternal is called multiple times where blob and type are set to the latest value while proxy is only created once. When the script block execution is done, the file thread will get a chance to call didStart where m_alreadyStarted is set to false to make future calling of read methods invalid.
&gt; 
&gt; 
&gt; WebCore/html/FileReader.cpp:110
&gt;  +          m_streamProxy = FileStreamProxy::create(m_context.get(), this);
&gt; If a script  calls readAs* multiple times, we will can create multiple proxies
&gt; that will all call didStart() on this object once JS exits. This doesn&apos;t look
&gt; right.
We will not create multiple proxies because we check if the proxy has already been created or not by the line just before that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221174</commentid>
    <comment_count>8</comment_count>
      <attachid>54831</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 10:25:11 -0700</bug_when>
    <thetext>Comment on attachment 54831
Proposed Patch

This looks great.  Please address the comments below before landing.

WebCore/html/FileReader.cpp:173
 +          m_result += String(data, static_cast&lt;unsigned&gt;(bytesRead));
Is this slow?  Should use use a StringBuilder or a SegmentedString instead?

WebCore/html/FileReader.cpp:256
 +          if (m_rawData.size() &gt;= 2 &amp;&amp; m_rawData[0] == &apos;\xFE&apos; &amp;&amp; m_rawData[1] == &apos;\xFF&apos;) {
Yuck.  Is this in the spec?  We should move this to a more generic location.

WebCore/html/FileReader.cpp:270
 +      // FIXME: consider upporting incremental decoding to improve the perf.
supporting

WebCore/html/FileReader.cpp:284
 +      m_result += &quot;base64,&quot;;
Is &quot;data:base64,...&quot; a valid data URL?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221175</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 10:25:56 -0700</bug_when>
    <thetext>BTW, what&apos;s the testing plan here?  I presume you haven&apos;t done the bindings yet and will test this code once you do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221177</commentid>
    <comment_count>10</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-05-05 10:29:26 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; BTW, what&apos;s the testing plan here?  I presume you haven&apos;t done the bindings yet
&gt; and will test this code once you do.

I already get the layout test written and will include it in the patch that turns on FileReader support.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221213</commentid>
    <comment_count>11</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-05-05 11:56:25 -0700</bug_when>
    <thetext>Changed and landed as http://trac.webkit.org/changeset/58832.

(In reply to comment #8)
&gt; (From update of attachment 54831 [details])
&gt; This looks great.  Please address the comments below before landing.
&gt; 
&gt; WebCore/html/FileReader.cpp:173
&gt;  +          m_result += String(data, static_cast&lt;unsigned&gt;(bytesRead));
&gt; Is this slow?  Should use use a StringBuilder or a SegmentedString instead?
No, this is what we intend to do. We mimic the usage of ScriptString in XMLHTTPRequest. Please see my comment in FileReader.h.
&gt; 
&gt; WebCore/html/FileReader.cpp:256
&gt;  +          if (m_rawData.size() &gt;= 2 &amp;&amp; m_rawData[0] == &apos;\xFE&apos; &amp;&amp; m_rawData[1]
&gt; == &apos;\xFF&apos;) {
&gt; Yuck.  Is this in the spec?  We should move this to a more generic location.
I added a FIXME for this. Will definitely fix this in my next patch.
&gt; 
&gt; WebCore/html/FileReader.cpp:270
&gt;  +      // FIXME: consider upporting incremental decoding to improve the perf.
&gt; supporting
Fixed.
&gt; 
&gt; WebCore/html/FileReader.cpp:284
&gt;  +      m_result += &quot;base64,&quot;;
&gt; Is &quot;data:base64,...&quot; a valid data URL?
Yes, this is valid and tested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221230</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-05 12:32:52 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58832 might have broken Qt Linux ARMv5 Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>221233</commentid>
    <comment_count>13</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-05 12:34:54 -0700</bug_when>
    <thetext>Looks like the bot might be sick.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54356</attachid>
            <date>2010-04-26 17:56:23 -0700</date>
            <delta_ts>2010-04-26 18:28:58 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>38157</filename>
            <type>text/plain</type>
            <size>27711</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YzBkYTk4ZS4uNmQwMjhhNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAxMC0wNC0yNiAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgSW1wbGVtZW50IEZpbGVSZWFkZXIgY2xhc3MuCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODE1NworCisgICAgICAgIFRoaXMgcGF0
Y2ggb25seSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRmlsZVJlYWRlciBjbGFzcyBh
cyBkZWZpbmVkCisgICAgICAgIGluIHRoZSBGaWxlIEFQSSBzcGVjOiBodHRwOi8vd3d3LnczLm9y
Zy9UUi9maWxlLXVwbG9hZC8jZGZuLWZpbGVyZWFkZXIuCisKKyAgICAgICAgTmV3IHRlc3Qgd2ls
bCBiZSBhZGRlZCB3aGVuIGEgSURMIGlzIGV4cG9zZWQgYW5kIHRoZSBGSUxFX1JFQURFUiBpcyB0
dXJuZWQKKyAgICAgICAgb24uCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAg
KiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogV2ViQ29y
ZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qOgorICAgICAgICAqIGRvbS9FdmVudE5hbWVzLmg6CisgICAgICAgICogZG9t
L0V2ZW50VGFyZ2V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50VGFyZ2V0Ojp0b0ZpbGVS
ZWFkZXIpOgorICAgICAgICAqIGRvbS9FdmVudFRhcmdldC5oOgorICAgICAgICAqIGh0bWwvRmls
ZUVycm9yLmg6CisgICAgICAgIChXZWJDb3JlOjpGaWxlRXJyb3I6OkZpbGVFcnJvcik6CisgICAg
ICAgICogaHRtbC9GaWxlUmVhZGVyLmNwcDogQWRkZWQuCisgICAgICAgICogaHRtbC9GaWxlUmVh
ZGVyLmg6IEFkZGVkLgorICAgICAgICAqIGh0bWwvRmlsZVN0cmVhbS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVT
dHJlYW06Om9wZW5Gb3JSZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OmNsb3Nl
KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OnJlYWQpOgorICAgICAgICAqIGh0bWwv
RmlsZVN0cmVhbS5oOgorCiAyMDEwLTA0LTI2ICBNYWNpZWogU3RhY2hvd2lhayAgPG1qc0BhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQppbmRleCBkYWUx
NTc2Li5hNjlmNTM2IDEwMDY0NAotLS0gYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1dl
YkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTEwNTUsNiArMTA1NSw4IEBAIHdlYmNvcmVfc291cmNl
cyArPSBcCiAJV2ViQ29yZS9odG1sL0ZpbGVFcnJvci5oIFwKIAlXZWJDb3JlL2h0bWwvRmlsZUxp
c3QuY3BwIFwKIAlXZWJDb3JlL2h0bWwvRmlsZUxpc3QuaCBcCisJV2ViQ29yZS9odG1sL0ZpbGVS
ZWFkZXIuY3BwIFwKKwlXZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5oIFwKIAlXZWJDb3JlL2h0bWwv
RmlsZVN0cmVhbS5jcHAgXAogCVdlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmggXAogCVdlYkNvcmUv
aHRtbC9GaWxlU3RyZWFtQ2xpZW50LmggXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5
cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA2Y2Y4NjYxLi4wNzVmYzlkIDEwMDY0NAot
LS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAt
MTQ0Nyw2ICsxNDQ3LDggQEAKICAgICAgICAgICAgICdodG1sL0ZpbGVFcnJvci5oJywKICAgICAg
ICAgICAgICdodG1sL0ZpbGVMaXN0LmNwcCcsCiAgICAgICAgICAgICAnaHRtbC9GaWxlTGlzdC5o
JywKKyAgICAgICAgICAgICdodG1sL0ZpbGVSZWFkZXIuY3BwJywKKyAgICAgICAgICAgICdodG1s
L0ZpbGVSZWFkZXIuaCcsCiAgICAgICAgICAgICAnaHRtbC9GaWxlU3RyZWFtLmNwcCcsCiAgICAg
ICAgICAgICAnaHRtbC9GaWxlU3RyZWFtLmgnLAogICAgICAgICAgICAgJ2h0bWwvRmlsZVN0cmVh
bUNsaWVudC5oJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dl
YkNvcmUucHJvCmluZGV4IDczZmU4NmIuLjI5ZmZkZmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2Vi
Q29yZS5wcm8KKysrIGIvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtNjAwLDYgKzYwMCw3IEBAIFNP
VVJDRVMgKz0gXAogICAgIGh0bWwvRE9NRm9ybURhdGEuY3BwIFwKICAgICBodG1sL0ZpbGUuY3Bw
IFwKICAgICBodG1sL0ZpbGVMaXN0LmNwcCBcCisgICAgaHRtbC9GaWxlUmVhZGVyLmNwcCBcCiAg
ICAgaHRtbC9GaWxlU3RyZWFtLmNwcCBcCiAgICAgaHRtbC9GaWxlU3RyZWFtUHJveHkuY3BwIFwK
ICAgICBodG1sL0ZpbGVUaHJlYWQuY3BwIFwKQEAgLTEzMjEsNiArMTMyMiw3IEBAIEhFQURFUlMg
Kz0gXAogICAgIGh0bWwvRmlsZS5oIFwKICAgICBodG1sL0ZpbGVFcnJvci5oIFwKICAgICBodG1s
L0ZpbGVMaXN0LmggXAorICAgIGh0bWwvRmlsZVJlYWRlci5oIFwKICAgICBodG1sL0ZpbGVTdHJl
YW0uaCBcCiAgICAgaHRtbC9GaWxlU3RyZWFtQ2xpZW50LmggXAogICAgIGh0bWwvRmlsZVN0cmVh
bVByb3h5LmggXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvaiBiL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKaW5kZXggMzkzN2Fj
NC4uZDQ1MDMzMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCkBAIC0zMDM3
NSw2ICszMDM3NSwxNCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVs
YXRpdmVQYXRoPSIuLlxodG1sXEZpbGVSZWFkZXIuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0K
KwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxGaWxlUmVhZGVyLmgiDQorCQkJ
CT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxodG1sXEZp
bGVTdHJlYW0uY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggYmFiNGJjNy4uZDBlNTc5NiAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2ViQ29yZS9X
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTYxNSw2ICs2MTUsOCBAQAogCQky
RTA4ODhENDExNDg4NDhBMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRTA4ODhEMjExNDg4NDhBMDBBRjQy
NjUgLyogSlNET01Gb3JtRGF0YS5jcHAgKi87IH07CiAJCTJFMDg4OEQ1MTE0ODg0OEEwMEFGNDI2
NSAvKiBKU0RPTUZvcm1EYXRhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAyRTA4ODhEMzExNDg4NDhBMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YS5oICov
OyB9OwogCQkyRTA4ODhFNjExNDg4NEUyMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YUN1c3RvbS5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRTA4ODhF
NTExNDg4NEUyMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YUN1c3RvbS5jcHAgKi87IH07CisJCTJF
MTVCNDU2MTE4NjY4OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFMTVCNDU0MTE4NjY4OTgwMDRBNjUyQiAv
KiBGaWxlUmVhZGVyLmNwcCAqLzsgfTsKKwkJMkUxNUI0NTcxMTg2Njg5ODAwNEE2NTJCIC8qIEZp
bGVSZWFkZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDJFMTVCNDU1MTE4NjY4OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmggKi87IH07CiAJCTJFMkQ5
OUNEMTBFMkJCREEwMDQ5NjMzNyAvKiBKU0Jsb2IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkUyRDk5Q0IxMEUyQkJEQTAwNDk2MzM3IC8qIEpTQmxv
Yi5jcHAgKi87IH07CiAJCTJFMkQ5OUNFMTBFMkJCREEwMDQ5NjMzNyAvKiBKU0Jsb2IuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFMkQ5OUNDMTBFMkJC
REEwMDQ5NjMzNyAvKiBKU0Jsb2IuaCAqLzsgfTsKIAkJMkUyRDk5RTcxMEUyQkMxQzAwNDk2MzM3
IC8qIERPTUJsb2IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDJFMkQ5OUU1MTBFMkJDMUMwMDQ5NjMzNyAvKiBET01CbG9iLmggKi87IH07CkBAIC02MDM2
LDYgKzYwMzgsOCBAQAogCQkyRTA4ODhEMjExNDg4NDhBMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0
YS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0RPTUZvcm1EYXRh
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkUwODg4RDMxMTQ4ODQ4QTAwQUY0
MjY1IC8qIEpTRE9NRm9ybURhdGEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
SlNET01Gb3JtRGF0YS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRTA4ODhFNTEx
NDg4NEUyMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YUN1c3RvbS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0RPTUZvcm1EYXRhQ3VzdG9tLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMkUxNUI0NTQxMTg2Njg5ODAwNEE2NTJCIC8qIEZpbGVSZWFk
ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRmlsZVJlYWRlci5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTJFMTVCNDU1MTE4NjY4OTgwMDRBNjUy
QiAvKiBGaWxlUmVhZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEZpbGVS
ZWFkZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkUyRDk5Q0IxMEUyQkJEQTAw
NDk2MzM3IC8qIEpTQmxvYi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBKU0Jsb2IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRTJEOTlDQzEwRTJC
QkRBMDA0OTYzMzcgLyogSlNCbG9iLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEpTQmxvYi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRTJEOTlFNTEwRTJCQzFD
MDA0OTYzMzcgLyogRE9NQmxvYi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBE
T01CbG9iLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMzAyNyw2ICsxMzAzMSw4
IEBACiAJCQkJQkNEQkI4QUIwRTA4OENBNTAwQzYwRkY2IC8qIEZpbGVMaXN0LmNwcCAqLywKIAkJ
CQlCQ0RCQjhBQTBFMDg4Q0E1MDBDNjBGRjYgLyogRmlsZUxpc3QuaCAqLywKIAkJCQlCQzE4ODFE
QzBFMDhDNTQzMDAwNDhDMTMgLyogRmlsZUxpc3QuaWRsICovLAorCQkJCTJFMTVCNDU0MTE4NjY4
OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmNwcCAqLywKKwkJCQkyRTE1QjQ1NTExODY2ODk4MDA0
QTY1MkIgLyogRmlsZVJlYWRlci5oICovLAogCQkJCTg5NTI1M0Q0MTE2QzRDNjgwMENBQkYwMCAv
KiBGaWxlU3RyZWFtLmNwcCAqLywKIAkJCQk4OTUyNTNENTExNkM0QzY4MDBDQUJGMDAgLyogRmls
ZVN0cmVhbS5oICovLAogCQkJCTg5NTI1M0Q2MTE2QzRDNjgwMENBQkYwMCAvKiBGaWxlU3RyZWFt
Q2xpZW50LmggKi8sCkBAIC0xODg4Myw2ICsxODg4OSw3IEBACiAJCQkJMkUzQkMxMDgxMTdENDc5
ODAwQjk0MDlBIC8qIERPTUZpbGVFcnJvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMkUzQkMxMEIx
MTdENDdDODAwQjk0MDlBIC8qIERPTUZpbGVFcnJvckludGVybmFsLmggaW4gSGVhZGVycyAqLywK
IAkJCQkzN0ZENDI5ODExODM2ODQ2MDA5M0MwMjkgLyogVHJlZURlcHRoTGltaXQuaCBpbiBIZWFk
ZXJzICovLAorCQkJCTJFMTVCNDU3MTE4NjY4OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmggaW4g
SGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5n
ID0gMDsKIAkJfTsKQEAgLTIxMTE5LDYgKzIxMTI2LDcgQEAKIAkJCQk5NzM4ODlBMDExNkVBOURD
MDBBREYzMTMgLyogRG9jdW1lbnRXcml0ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkUzQkMw
Q0ExMTdEM0UwODAwQjk0MDlBIC8qIEpTRmlsZUVycm9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTJFM0JDMTA5MTE3RDQ3OTgwMEI5NDA5QSAvKiBET01GaWxlRXJyb3IubW0gaW4gU291cmNlcyAq
LywKKwkJCQkyRTE1QjQ1NjExODY2ODk4MDA0QTY1MkIgLyogRmlsZVJlYWRlci5jcHAgaW4gU291
cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0g
MDsKIAkJfTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0V2ZW50TmFtZXMuaCBiL1dlYkNvcmUv
ZG9tL0V2ZW50TmFtZXMuaAppbmRleCA5NDZlNTEzLi4wMTVmM2E0IDEwMDY0NAotLS0gYS9XZWJD
b3JlL2RvbS9FdmVudE5hbWVzLmgKKysrIGIvV2ViQ29yZS9kb20vRXZlbnROYW1lcy5oCkBAIC0x
NTUsNiArMTU1LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIFwKICAgICBtYWNybyhzdWNj
ZXNzKSBcCiAgICAgXAorICAgIG1hY3JvKGxvYWRlbmQpIFwKKyAgICBcCiAvLyBlbmQgb2YgRE9N
X0VWRU5UX05BTUVTX0ZPUl9FQUNICiAKICAgICBjbGFzcyBFdmVudE5hbWVzIDogcHVibGljIE5v
bmNvcHlhYmxlIHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmNwcCBiL1dl
YkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmNwcAppbmRleCAxNTk4NzkwLi45MWE1ZDBjIDEwMDY0NAot
LS0gYS9XZWJDb3JlL2RvbS9FdmVudFRhcmdldC5jcHAKKysrIGIvV2ViQ29yZS9kb20vRXZlbnRU
YXJnZXQuY3BwCkBAIC0xNTYsNiArMTU2LDEzIEBAIE5vdGlmaWNhdGlvbiogRXZlbnRUYXJnZXQ6
OnRvTm90aWZpY2F0aW9uKCkKIH0KICNlbmRpZgogCisjaWYgRU5BQkxFKEZJTEVfUkVBREVSKQor
RmlsZVJlYWRlciogRXZlbnRUYXJnZXQ6OnRvRmlsZVJlYWRlcigpCit7CisgICAgcmV0dXJuIDA7
Cit9CisjZW5kaWYKKwogYm9vbCBFdmVudFRhcmdldDo6YWRkRXZlbnRMaXN0ZW5lcihjb25zdCBB
dG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5l
ciwgYm9vbCB1c2VDYXB0dXJlKQogewogICAgIEV2ZW50VGFyZ2V0RGF0YSogZCA9IGVuc3VyZUV2
ZW50VGFyZ2V0RGF0YSgpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRXZlbnRUYXJnZXQuaCBi
L1dlYkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmgKaW5kZXggZGE5OGQ5OC4uOTZkMmQyOSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9kb20vRXZlbnRUYXJnZXQuaAorKysgYi9XZWJDb3JlL2RvbS9FdmVudFRh
cmdldC5oCkBAIC00OCw2ICs0OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBF
dmVudDsKICAgICBjbGFzcyBFdmVudExpc3RlbmVyOwogICAgIGNsYXNzIEV2ZW50U291cmNlOwor
ICAgIGNsYXNzIEZpbGVSZWFkZXI7CiAgICAgY2xhc3MgTWVzc2FnZVBvcnQ7CiAgICAgY2xhc3Mg
Tm9kZTsKICAgICBjbGFzcyBOb3RpZmljYXRpb247CkBAIC0xMTgsNiArMTE5LDkgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogI2lmIEVOQUJMRShOT1RJRklDQVRJT05TKQogICAgICAgICB2aXJ0dWFs
IE5vdGlmaWNhdGlvbiogdG9Ob3RpZmljYXRpb24oKTsKICNlbmRpZgorI2lmIEVOQUJMRShGSUxF
X1JFQURFUikKKyAgICAgICAgdmlydHVhbCBGaWxlUmVhZGVyKiB0b0ZpbGVSZWFkZXIoKTsKKyNl
bmRpZgogCiAgICAgICAgIHZpcnR1YWwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCgpIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0Zp
bGVFcnJvci5oIGIvV2ViQ29yZS9odG1sL0ZpbGVFcnJvci5oCmluZGV4IDQ3NzAyZjQuLjgxOTA4
ODMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxlRXJyb3IuaAorKysgYi9XZWJDb3JlL2h0
bWwvRmlsZUVycm9yLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNpZiBFTkFCTEUoRklMRV9SRUFERVIp
IHx8IEVOQUJMRShGSUxFX1dSSVRFUikKIAogI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNp
bmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ1LDggKzQ2LDggQEAgcHVibGljOgogICAgIEV4Y2Vw
dGlvbkNvZGUgY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29kZTsgfQogCiBwcml2YXRlOgotICAg
IEZpbGVFcnJvcigpCi0gICAgICAgIDogbV9jb2RlKDApCisgICAgRmlsZUVycm9yKEV4Y2VwdGlv
bkNvZGUgY29kZSkKKyAgICAgICAgOiBtX2NvZGUoY29kZSkKICAgICB7IH0KIAogICAgIEV4Y2Vw
dGlvbkNvZGUgbV9jb2RlOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3Bw
IGIvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjRkZGIwODgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVJl
YWRlci5jcHAKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5B
QkxFKEZJTEVfUkVBREVSKQorCisjaW5jbHVkZSAiRmlsZVJlYWRlci5oIgorCisjaW5jbHVkZSAi
QmFzZTY0LmgiCisjaW5jbHVkZSAiQmxvYi5oIgorI2luY2x1ZGUgIkZpbGUuaCIKKyNpbmNsdWRl
ICJGaWxlU3RyZWFtUHJveHkuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUHJv
Z3Jlc3NFdmVudC5oIgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCIKKyNpbmNs
dWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCB1
bnNpZ25lZCBGaWxlUmVhZGVyOjpidWZmZXJTaXplID0gMTAyNDsKK2NvbnN0IGRvdWJsZSBGaWxl
UmVhZGVyOjpwcm9ncmVzc05vdGlmaWNhdGlvbkludGVydmFsTVMgPSA1MDsKKworRmlsZVJlYWRl
cjo6RmlsZVJlYWRlcihTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0KQorICAgIDogbV9z
dGF0ZShFbXB0eSkKKyAgICAsIG1fY29udGV4dChjb250ZXh0KQorICAgICwgbV9yZWFkVHlwZShS
ZWFkRmlsZUFzQmluYXJ5U3RyaW5nKQorICAgICwgbV9yZXN1bHQoIiIpCisgICAgLCBtX2lzUmF3
RGF0YUNvbnZlcnRlZChmYWxzZSkKKyAgICAsIG1fbG9hZGVkKDApCisgICAgLCBtX3RvdGFsKDAp
CisgICAgLCBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUygwKQorICAgICwgbV9hbHJl
YWR5U3RhcnRlZChmYWxzZSkKK3sKKyAgICBtX2J1ZmZlci5yZXNpemUoYnVmZmVyU2l6ZSk7Cit9
CisKK0ZpbGVSZWFkZXI6On5GaWxlUmVhZGVyKCkKK3sKKyAgICBMT0coRmlsZUFQSSwgIkZpbGVS
ZWFkZXI6IGNsb3NpbmcgKHN0YXRlOiVkKVxuIiwgbV9zdGF0ZSk7CisgICAgaWYgKG1fc3RyZWFt
UHJveHkpIHsKKyAgICAgICAgbV9zdHJlYW1Qcm94eS0+c3RvcCgpOworICAgICAgICBtX3N0cmVh
bVByb3h5ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6cmVhZEFzQmluYXJ5U3Ry
aW5nKEJsb2IqIGZpbGVCbG9iKQoreworICAgIExPRyhGaWxlQVBJLCAiRmlsZVJlYWRlcjogcmVh
ZGluZyBhcyBiaW5hcnk6ICVzXG4iLCBmaWxlQmxvYi0+cGF0aCgpLnV0ZjgoKS5kYXRhKCkpOwor
CisgICAgcmVhZEludGVybmFsKGZpbGVCbG9iLCBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nKTsKK30K
Kwordm9pZCBGaWxlUmVhZGVyOjpyZWFkQXNUZXh0KEJsb2IqIGZpbGVCbG9iLCBjb25zdCBTdHJp
bmcmIGVuY29kaW5nKQoreworICAgIExPRyhGaWxlQVBJLCAiRmlsZVJlYWRlcjogcmVhZGluZyBh
cyB0ZXh0OiAlc1xuIiwgZmlsZUJsb2ItPnBhdGgoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGlm
ICghZW5jb2RpbmcuaXNFbXB0eSgpKQorICAgICAgICBtX2VuY29kaW5nID0gVGV4dEVuY29kaW5n
KGVuY29kaW5nKTsKKyAgICByZWFkSW50ZXJuYWwoZmlsZUJsb2IsIFJlYWRGaWxlQXNUZXh0KTsK
K30KKwordm9pZCBGaWxlUmVhZGVyOjpyZWFkQXNEYXRhVVJMKEZpbGUqIGZpbGUpCit7CisgICAg
TE9HKEZpbGVBUEksICJGaWxlUmVhZGVyOiByZWFkaW5nIGFzIGRhdGEgVVJMOiAlc1xuIiwgZmls
ZS0+cGF0aCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgbV9maWxlVHlwZSA9IGZpbGUtPnR5cGUo
KTsKKyAgICByZWFkSW50ZXJuYWwoZmlsZSwgUmVhZEZpbGVBc0RhdGFVUkwpOworfQorCit2b2lk
IEZpbGVSZWFkZXI6OnJlYWRJbnRlcm5hbChCbG9iKiBmaWxlQmxvYiwgUmVhZFR5cGUgdHlwZSkK
K3sKKyAgICAvLyByZWFkQXMqKiogbWV0aG9kcygpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGlt
ZXMuIE9ubHkgdGhlIGxhc3QgY2FsbCBiZWZvcmUgdGhlIGFjdHVhbCByZWFkaW5nIGhhcHBlbnMg
aXMgcHJvY2Vzc2VkLgorICAgIGlmIChtX2FscmVhZHlTdGFydGVkKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2ZpbGVCbG9iID0gZmlsZUJsb2I7CisgICAgbV9yZWFkVHlwZSA9IHR5cGU7CisK
KyAgICAvLyBXaGVuIEZpbGVTdHJlYW1Qcm94eSBpcyBjcmVhdGVkLCBGaWxlUmVhZGVyOjpkaWRT
dGFydCgpIHdpbGwgZ2V0IG5vdGlmaWVkIG9uIHRoZSBGaWxlIHRocmVhZCBhbmQgd2Ugd2lsbCBz
dGFydAorICAgIC8vIG9wZW5pbmcgYW5kIHJlYWRpbmcgdGhlIGZpbGUgc2luY2UgdGhlbi4KKyAg
ICBpZiAoIW1fc3RyZWFtUHJveHkuZ2V0KCkpCisgICAgICAgIG1fc3RyZWFtUHJveHkgPSBGaWxl
U3RyZWFtUHJveHk6OmNyZWF0ZShtX2NvbnRleHQuZ2V0KCksIHRoaXMpOworfQorCit2b2lkIEZp
bGVSZWFkZXI6OmFib3J0KCkKK3sKKyAgICBMT0coRmlsZUFQSSwgIkZpbGVSZWFkZXI6IGFib3J0
aW5nXG4iKTsKKworICAgIGlmIChtX3N0cmVhbVByb3h5KSB7CisgICAgICAgIG1fc3RyZWFtUHJv
eHktPnN0b3AoKTsKKyAgICAgICAgbV9zdHJlYW1Qcm94eSA9IDA7CisgICAgfQorCisgICAgbV9z
dGF0ZSA9IERvbmU7CisgICAgbV9yZXN1bHQgPSAiIjsKKyAgICBtX2Vycm9yID0gRmlsZUVycm9y
OjpjcmVhdGUoQUJPUlRfRVJSKTsKKworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkuZXJyb3JF
dmVudCk7CisgICAgZmlyZUV2ZW50KGV2ZW50TmFtZXMoKS5hYm9ydEV2ZW50KTsKKyAgICBmaXJl
RXZlbnQoZXZlbnROYW1lcygpLmxvYWRlbmRFdmVudCk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6
ZGlkU3RhcnQoKQoreworICAgIG1fYWxyZWFkeVN0YXJ0ZWQgPSB0cnVlOworICAgIG1fc3RyZWFt
UHJveHktPm9wZW5Gb3JSZWFkKG1fZmlsZUJsb2IuZ2V0KCkpOworfQorCit2b2lkIEZpbGVSZWFk
ZXI6OmRpZEdldFNpemUobG9uZyBsb25nIHNpemUpCit7CisgICAgbV9zdGF0ZSA9IExvYWRpbmc7
CisgICAgZmlyZUV2ZW50KGV2ZW50TmFtZXMoKS5sb2Fkc3RhcnRFdmVudCk7CisKKyAgICBtX3Rv
dGFsID0gc2l6ZTsKKyAgICBtX3N0cmVhbVByb3h5LT5yZWFkKCZtX2J1ZmZlci5hdCgwKSwgbV9i
dWZmZXIuc2l6ZSgpKTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpkaWRSZWFkKGNvbnN0IGNoYXIq
IGRhdGEsIGludCBieXRlc1JlYWQpCit7CisgICAgQVNTRVJUKGRhdGEgJiYgYnl0ZXNSZWFkKTsK
KworICAgIC8vIEJhaWwgb3V0IGlmIHdlIGhhdmUgYWJvcnRlZCB0aGUgcmVhZGluZy4KKyAgICBp
ZiAobV9zdGF0ZSA9PSBEb25lKQorICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChtX3JlYWRU
eXBlKSB7CisgICAgY2FzZSBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nOgorICAgICAgICBtX3Jlc3Vs
dCArPSBTdHJpbmcoZGF0YSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJ5dGVzUmVhZCkpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFJlYWRGaWxlQXNUZXh0OgorICAgIGNhc2UgUmVhZEZpbGVB
c0RhdGFVUkw6CisgICAgICAgIG1fcmF3RGF0YS5hcHBlbmQoZGF0YSwgc3RhdGljX2Nhc3Q8dW5z
aWduZWQ+KGJ5dGVzUmVhZCkpOworICAgICAgICBtX2lzUmF3RGF0YUNvbnZlcnRlZCA9IGZhbHNl
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICB9CisKKyAgICBtX2xvYWRlZCArPSBieXRlc1JlYWQ7CisKKyAgICAvLyBGaXJl
IHRoZSBwcm9ncmVzcyBldmVudCBhdCBsZWFzdCBldmVyeSA1MG1zLgorICAgIGRvdWJsZSBub3cg
PSBXVEY6OmN1cnJlbnRUaW1lTVMoKTsKKyAgICBpZiAoIW1fbGFzdFByb2dyZXNzTm90aWZpY2F0
aW9uVGltZU1TKQorICAgICAgICBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUyA9IG5v
dzsKKyAgICBlbHNlIGlmIChub3cgLSBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUyA+
IHByb2dyZXNzTm90aWZpY2F0aW9uSW50ZXJ2YWxNUykgeworICAgICAgICBmaXJlRXZlbnQoZXZl
bnROYW1lcygpLnByb2dyZXNzRXZlbnQpOworICAgICAgICBtX2xhc3RQcm9ncmVzc05vdGlmaWNh
dGlvblRpbWVNUyA9IG5vdzsKKyAgICB9CisKKyAgICAvLyBDb250aW51ZSByZWFkaW5nLgorICAg
IG1fc3RyZWFtUHJveHktPnJlYWQoJm1fYnVmZmVyLmF0KDApLCBtX2J1ZmZlci5zaXplKCkpOwor
fQorCit2b2lkIEZpbGVSZWFkZXI6OmRpZEZpbmlzaCgpCit7CisgICAgbV9zdGF0ZSA9IERvbmU7
CisKKyAgICBtX3N0cmVhbVByb3h5LT5jbG9zZSgpOworCisgICAgZmlyZUV2ZW50KGV2ZW50TmFt
ZXMoKS5sb2FkRXZlbnQpOworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkubG9hZGVuZEV2ZW50
KTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpkaWRGYWlsKEV4Y2VwdGlvbkNvZGUgZWMpCit7Cisg
ICAgbV9zdGF0ZSA9IERvbmU7CisgICAgbV9lcnJvciA9IEZpbGVFcnJvcjo6Y3JlYXRlKGVjKTsK
KworICAgIG1fc3RyZWFtUHJveHktPmNsb3NlKCk7CisKKyAgICBmaXJlRXZlbnQoZXZlbnROYW1l
cygpLmVycm9yRXZlbnQpOworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkubG9hZGVuZEV2ZW50
KTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpmaXJlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiB0
eXBlKQoreworICAgIC8vIEZJWE1FOiB0aGUgY3VycmVudCBQcm9ncmVzc0V2ZW50IHVzZXMgInVu
c2lnbmVkIGxvbmciIGZvciB0b3RhbCBhbmQgbG9hZGVkIGF0dHJpYnV0ZXMuIE5lZWQgdG8gdGFs
ayB3aXRoIHRoZSBzcGVjIHdyaXRlciB0byByZXNvbHZlIHRoZSBpc3N1ZS4KKyAgICBkaXNwYXRj
aEV2ZW50KFByb2dyZXNzRXZlbnQ6OmNyZWF0ZSh0eXBlLCB0cnVlLCBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4obV9sb2FkZWQpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obV90b3RhbCkpKTsKK30KKwor
Y29uc3QgU2NyaXB0U3RyaW5nJiBGaWxlUmVhZGVyOjpyZXN1bHQoKQoreworICAgIC8vIElmIHJl
YWRpbmcgYXMgYmluYXJ5IHN0cmluZywgd2UgY2FuIHJldHVybiB0aGUgcmVzdWx0IGltbWVkaWF0
ZWx5LgorICAgIGlmIChtX3JlYWRUeXBlID09IFJlYWRGaWxlQXNCaW5hcnlTdHJpbmcpCisgICAg
ICAgIHJldHVybiBtX3Jlc3VsdDsKKworICAgIC8vIElmIHdlIGFscmVhZHkgY29udmVydCB0aGUg
cmF3IGRhdGEgcmVjZWl2ZWQgc28gZmFyLCB3ZSBjYW4gcmV0dXJuIHRoZSByZXN1bHQgbm93Lgor
ICAgIGlmIChtX2lzUmF3RGF0YUNvbnZlcnRlZCkKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0Owor
ICAgIG1faXNSYXdEYXRhQ29udmVydGVkID0gdHJ1ZTsKKworICAgIGlmIChtX3JlYWRUeXBlID09
IFJlYWRGaWxlQXNUZXh0KQorICAgICAgICBjb252ZXJ0VG9UZXh0KCk7CisgICAgLy8gRm9yIGRh
dGEgVVJMLCB3ZSBvbmx5IGRvIHRoZSBjb3ZlcnNpb24gdW50aWwgd2UgcmVjZWl2ZSBhbGwgdGhl
IHJhdyBkYXRhLgorICAgIGVsc2UgaWYgKG1fcmVhZFR5cGUgPT0gUmVhZEZpbGVBc0RhdGFVUkwg
JiYgbV9zdGF0ZSA9PSBEb25lKQorICAgICAgICBjb252ZXJ0VG9EYXRhVVJMKCk7CisKKyAgICBy
ZXR1cm4gbV9yZXN1bHQ7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6Y29udmVydFRvVGV4dCgpCit7
CisgICAgaWYgKCFtX3Jhd0RhdGEuc2l6ZSgpKSB7CisgICAgICAgIG1fcmVzdWx0ID0gIiI7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBlbmNv
ZGluZyBpZiBpdCBpcyBub3QgcHJvdmlkZWQuCisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaWYg
KCFtX2VuY29kaW5nLmlzVmFsaWQoKSkgeworICAgICAgICBpZiAobV9yYXdEYXRhLnNpemUoKSA+
PSAyICYmIG1fcmF3RGF0YVswXSA9PSAnXHhGRScgJiYgbV9yYXdEYXRhWzFdID09ICdceEZGJykg
eworICAgICAgICAgICAgb2Zmc2V0ID0gMjsKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBVVEYx
NkJpZ0VuZGlhbkVuY29kaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9yYXdEYXRhLnNpemUo
KSA+PSAyICYmIG1fcmF3RGF0YVswXSA9PSAnXHhGRicgJiYgbV9yYXdEYXRhWzFdID09ICdceEZF
JykgeworICAgICAgICAgICAgb2Zmc2V0ID0gMjsKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBV
VEYxNkxpdHRsZUVuZGlhbkVuY29kaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9yYXdEYXRh
LnNpemUoKSA+PSAyICYmIG1fcmF3RGF0YVswXSA9PSAnXHhFRicgJiYgbV9yYXdEYXRhWzFdID09
ICdceEJCJyAmJiBtX3Jhd0RhdGFbMl0gPT0gJ1x4QkYnKSB7CisgICAgICAgICAgICBvZmZzZXQg
PSAzOworICAgICAgICAgICAgbV9lbmNvZGluZyA9IFVURjhFbmNvZGluZygpOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBVVEY4RW5jb2RpbmcoKTsKKyAgICB9CisK
KyAgICAvLyBEZWNvZGUgdGhlIGRhdGEuCisgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVwcG9ydGlu
ZyBpbmNyZW1lbnRhbCBkZWNvZGluZyB0byBpbXByb3ZlIHRoZSBwZXJmLgorICAgIG1fcmVzdWx0
ID0gbV9lbmNvZGluZy5kZWNvZGUoJm1fcmF3RGF0YS5hdCgwKSArIG9mZnNldCwgbV9yYXdEYXRh
LnNpemUoKSAtIG9mZnNldCk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6Y29udmVydFRvRGF0YVVS
TCgpCit7CisgICAgbV9yZXN1bHQgPSAiZGF0YToiOworCisgICAgaWYgKCFtX3Jhd0RhdGEuc2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Jlc3VsdCArPSBtX2ZpbGVUeXBlOworICAg
IGlmICghbV9maWxlVHlwZS5pc0VtcHR5KCkpCisgICAgICAgIG1fcmVzdWx0ICs9ICI7IjsKKyAg
ICBtX3Jlc3VsdCArPSAiYmFzZTY0LCI7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0OworICAgIGJh
c2U2NEVuY29kZShtX3Jhd0RhdGEsIG91dCk7CisgICAgb3V0LmFwcGVuZCgnXDAnKTsKKyAgICBt
X3Jlc3VsdCArPSBvdXQuZGF0YSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisgCisj
ZW5kaWYgLy8gRU5BQkxFKEZJTEVfUkVBREVSKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0Zp
bGVSZWFkZXIuaCBiL1dlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMDQ4YzNmZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvaHRt
bC9GaWxlUmVhZGVyLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBGaWxlUmVhZGVyX2gKKyNk
ZWZpbmUgRmlsZVJlYWRlcl9oCisKKyNpZiBFTkFCTEUoRklMRV9SRUFERVIpCisKKyNpbmNsdWRl
ICJFdmVudFRhcmdldC5oIgorI2luY2x1ZGUgIkZpbGVFcnJvci5oIgorI2luY2x1ZGUgIkZpbGVT
dHJlYW1DbGllbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNj
cmlwdFN0cmluZy5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgPHd0Zi9Q
YXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYv
UmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEJsb2I7CitjbGFzcyBGaWxlOworY2xhc3MgRmlsZVN0cmVhbVByb3h5OworY2xh
c3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKKworY2xhc3MgRmlsZVJlYWRlciA6IHB1YmxpYyBS
ZWZDb3VudGVkPEZpbGVSZWFkZXI+LCBwdWJsaWMgRXZlbnRUYXJnZXQsIHB1YmxpYyBGaWxlU3Ry
ZWFtQ2xpZW50IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxGaWxlUmVhZGVyPiBj
cmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgRmlsZVJlYWRlcihjb250ZXh0KSk7CisgICAgfQorCisgICAgdmly
dHVhbCB+RmlsZVJlYWRlcigpOworCisgICAgZW51bSBSZWFkeVN0YXRlIHsKKyAgICAgICAgRW1w
dHkgPSAwLAorICAgICAgICBMb2FkaW5nID0gMSwKKyAgICAgICAgRG9uZSA9IDIKKyAgICB9Owor
CisgICAgdm9pZCByZWFkQXNCaW5hcnlTdHJpbmcoQmxvYiopOworICAgIHZvaWQgcmVhZEFzVGV4
dChCbG9iKiwgY29uc3QgU3RyaW5nJiBlbmNvZGluZyA9ICIiKTsKKyAgICB2b2lkIHJlYWRBc0Rh
dGFVUkwoRmlsZSopOworICAgIHZvaWQgYWJvcnQoKTsKKworICAgIFJlYWR5U3RhdGUgcmVhZHlT
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGU7IH0KKyAgICBQYXNzUmVmUHRyPEZpbGVFcnJv
cj4gZXJyb3IoKSB7IHJldHVybiBtX2Vycm9yOyB9CisgICAgY29uc3QgU2NyaXB0U3RyaW5nJiBy
ZXN1bHQoKTsKKworICAgIC8vIEZpbGVTdHJlYW1DbGllbnQKKyAgICB2aXJ0dWFsIHZvaWQgZGlk
U3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkR2V0U2l6ZShsb25nIGxvbmcpOworICAgIHZp
cnR1YWwgdm9pZCBkaWRSZWFkKGNvbnN0IGNoYXIqLCBpbnQpOworICAgIHZpcnR1YWwgdm9pZCBk
aWRGaW5pc2goKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbChFeGNlcHRpb25Db2RlKTsKKwor
ICAgIC8vIEV2ZW50VGFyZ2V0CisgICAgdmlydHVhbCBGaWxlUmVhZGVyKiB0b0ZpbGVSZWFkZXIo
KSB7IHJldHVybiB0aGlzOyB9CisKKyAgICB2aXJ0dWFsIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
IHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQuZ2V0KCk7
IH0KKyAgICAKKyAgICB1c2luZyBSZWZDb3VudGVkPEZpbGVSZWFkZXI+OjpyZWY7CisgICAgdXNp
bmcgUmVmQ291bnRlZDxGaWxlUmVhZGVyPjo6ZGVyZWY7CisKKyAgICBERUZJTkVfQVRUUklCVVRF
X0VWRU5UX0xJU1RFTkVSKGxvYWRzdGFydCk7CisgICAgREVGSU5FX0FUVFJJQlVURV9FVkVOVF9M
SVNURU5FUihwcm9ncmVzcyk7CisgICAgREVGSU5FX0FUVFJJQlVURV9FVkVOVF9MSVNURU5FUihs
b2FkKTsKKyAgICBERUZJTkVfQVRUUklCVVRFX0VWRU5UX0xJU1RFTkVSKGFib3J0KTsKKyAgICBE
RUZJTkVfQVRUUklCVVRFX0VWRU5UX0xJU1RFTkVSKGVycm9yKTsKKyAgICBERUZJTkVfQVRUUklC
VVRFX0VWRU5UX0xJU1RFTkVSKGxvYWRlbmQpOworCitwcml2YXRlOgorICAgIGVudW0gUmVhZFR5
cGUgeworICAgICAgICBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nLAorICAgICAgICBSZWFkRmlsZUFz
VGV4dCwKKyAgICAgICAgUmVhZEZpbGVBc0RhdGFVUkwKKyAgICB9OworCisgICAgc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGJ1ZmZlclNpemU7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBwcm9ncmVz
c05vdGlmaWNhdGlvbkludGVydmFsTVM7CisgICAgCisgICAgRmlsZVJlYWRlcihTY3JpcHRFeGVj
dXRpb25Db250ZXh0Kik7CisKKyAgICAvLyBFdmVudFRhcmdldAorICAgIHZpcnR1YWwgdm9pZCBy
ZWZFdmVudFRhcmdldCgpIHsgcmVmKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGVyZWZFdmVudFRh
cmdldCgpIHsgZGVyZWYoKTsgfQorICAgIHZpcnR1YWwgRXZlbnRUYXJnZXREYXRhKiBldmVudFRh
cmdldERhdGEoKSB7IHJldHVybiAmbV9ldmVudFRhcmdldERhdGE7IH0KKyAgICB2aXJ0dWFsIEV2
ZW50VGFyZ2V0RGF0YSogZW5zdXJlRXZlbnRUYXJnZXREYXRhKCkgeyByZXR1cm4gJm1fZXZlbnRU
YXJnZXREYXRhOyB9CisKKyAgICB2b2lkIHJlYWRJbnRlcm5hbChCbG9iKiwgUmVhZFR5cGUpOwor
ICAgIHZvaWQgZmlyZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgdHlwZSk7CisgICAgdm9pZCBj
b252ZXJ0VG9UZXh0KCk7CisgICAgdm9pZCBjb252ZXJ0VG9EYXRhVVJMKCk7CisKKyAgICBSZWFk
eVN0YXRlIG1fc3RhdGU7CisgICAgUmVmUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ+IG1fY29u
dGV4dDsKKyAgICBFdmVudFRhcmdldERhdGEgbV9ldmVudFRhcmdldERhdGE7CisKKyAgICBSZWZQ
dHI8QmxvYj4gbV9maWxlQmxvYjsKKyAgICBSZWFkVHlwZSBtX3JlYWRUeXBlOworCisgICAgLy8g
TGlrZSBYTUxIdHRwUmVxdWVzdC5tX3Jlc3BvbnNlVGV4dCwgd2Uga2VlcCB0aGlzIGFzIGEgU2Ny
aXB0U3RyaW5nLCBub3QgYSBXZWJDb3JlOjpTdHJpbmcuCisgICAgLy8gVGhhdCdzIGJlY2F1c2Ug
dGhlc2Ugc3RyaW5ncyBjYW4gZWFzaWx5IGdldCBodWdlICh0aGV5IGFyZSBmaWxsZWQgZnJvbSB0
aGUgZmlsZSkgYW5kCisgICAgLy8gYmVjYXVzZSBKUyBjYW4gZWFzaWx5IG9ic2VydmUgbWFueSBp
bnRlcm1lZGlhdGUgc3RhdGVzLCBzbyBpdCdzIHZlcnkgdXNlZnVsIHRvIGJlCisgICAgLy8gYWJs
ZSB0byBzaGFyZSB0aGUgYnVmZmVyIHdpdGggSmF2YVNjcmlwdCB2ZXJzaW9ucyBvZiB0aGUgd2hv
bGUgb3IgcGFydGlhbCBzdHJpbmcuCisgICAgLy8gSW4gY29udHJhc3QsIHRoaXMgc3RyaW5nIGRv
ZXNuJ3QgaW50ZXJhY3QgbXVjaCB3aXRoIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgc28gaXQncyBu
b3QgdGhhdAorICAgIC8vIGJpZyBhIGNvc3QgdGhhdCBpdCBpc24ndCBhIFN0cmluZy4KKyAgICBT
Y3JpcHRTdHJpbmcgbV9yZXN1bHQ7CisKKyAgICAvLyBUaGUgcmF3IGRhdGEuIFdlIGhhdmUgdG8g
a2VlcCB0cmFjayBvZiBhbGwgdGhlIHJhdyBkYXRhIGZvciBpdCB0byBiZSBjb252ZXJ0ZWQgdG8g
dGV4dCBvciBkYXRhIFVSTCBkYXRhLgorICAgIFZlY3RvcjxjaGFyPiBtX3Jhd0RhdGE7CisgICAg
Ym9vbCBtX2lzUmF3RGF0YUNvbnZlcnRlZDsKKworICAgIC8vIEVuY29kaW5nIHNjaGVtZSB1c2Vk
IHRvIGRlY29kZSB0aGUgZGF0YS4KKyAgICBUZXh0RW5jb2RpbmcgbV9lbmNvZGluZzsKKworICAg
IC8vIE5lZWRlZCB0byBjcmVhdGUgZGF0YSBVUkwuCisgICAgU3RyaW5nIG1fZmlsZVR5cGU7CisK
KyAgICBSZWZQdHI8RmlsZVN0cmVhbVByb3h5PiBtX3N0cmVhbVByb3h5OworICAgIFZlY3Rvcjxj
aGFyPiBtX2J1ZmZlcjsKKyAgICBSZWZQdHI8RmlsZUVycm9yPiBtX2Vycm9yOworICAgIGxvbmcg
bG9uZyBtX2xvYWRlZDsKKyAgICBsb25nIGxvbmcgbV90b3RhbDsKKyAgICBkb3VibGUgbV9sYXN0
UHJvZ3Jlc3NOb3RpZmljYXRpb25UaW1lTVM7CisgICAgYm9vbCBtX2FscmVhZHlTdGFydGVkOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8vIEZpbGVS
ZWFkZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uY3BwIGIvV2ViQ29y
ZS9odG1sL0ZpbGVTdHJlYW0uY3BwCmluZGV4IDg0YTI4ZDYuLjQxM2I4NDIgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNwcAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVh
bS5jcHAKQEAgLTQyLDYgKzQyLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogRmlsZVN0cmVhbTo6
RmlsZVN0cmVhbShGaWxlU3RyZWFtQ2xpZW50KiBjbGllbnQpCiAgICAgOiBtX2NsaWVudChjbGll
bnQpCiAgICAgLCBtX2hhbmRsZShpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQorICAgICwgbV9i
eXRlc1Byb2Nlc3NlZCgwKQorICAgICwgbV90b3RhbEJ5dGVzVG9SZWFkKDApCiB7CiB9CiAKQEAg
LTYzLDEwICs2NSw1NiBAQCB2b2lkIEZpbGVTdHJlYW06OnN0b3AoKQogICAgIG1fY2xpZW50LT5k
aWRTdG9wKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6b3BlbkZvclJlYWQoQmxvYiopCit2b2lk
IEZpbGVTdHJlYW06Om9wZW5Gb3JSZWFkKEJsb2IqIGJsb2IpCiB7CiAgICAgQVNTRVJUKCFpc01h
aW5UaHJlYWQoKSk7Ci0gICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorCisgICAgaWYg
KGlzSGFuZGxlVmFsaWQobV9oYW5kbGUpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDaGVj
ayBpZiB0aGUgZmlsZSBleGlzdHMgYnkgcXVlcnlpbmcgaXRzIG1vZGlmaWNhdGlvbiB0aW1lLiBX
ZSBjaG9vc2Ugbm90IHRvIGNhbGwgZmlsZUV4aXN0cygpIGluIG9yZGVyIHRvIHNhdmUgYW4KKyAg
ICAvLyBleHRyYSBmaWxlIHN5c3RlbSBjYWxsIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGlz
IG5lZWRlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNsaWNlZCBmaWxlIGJsb2IuCisg
ICAgLy8gUGVyIHRoZSBzcGVjLCB3ZSBuZWVkIHRvIHJldHVybiBkaWZmZXJlbnQgZXJyb3IgY29k
ZXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5vbi1leGlzdGVudCBmaWxlIGFuZCBwZXJtaXNz
aW9uIGVycm9yLgorICAgIC8vIG9wZW5GaWxlKCkgY291bGQgbm90IHRlbGwgdXNlIHRoZSBmYWls
dXJlIHJlYXNvbi4KKyAgICB0aW1lX3QgY3VycmVudE1vZGlmaWNhdGlvblRpbWU7CisgICAgaWYg
KCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShibG9iLT5wYXRoKCksIGN1cnJlbnRNb2RpZmljYXRp
b25UaW1lKSkgeworICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfRk9VTkRfRVJSKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9wZW4gdGhlIGZpbGUgYmxvYi4KKyAgICBt
X2hhbmRsZSA9IG9wZW5GaWxlKGJsb2ItPnBhdGgoKSwgT3BlbkZvclJlYWQpOworICAgIGlmICgh
aXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9U
X1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBFTkFCTEUoQkxP
Ql9TTElDRSkKKyAgICAvLyBDaGVjayB0aGUgbW9kaWZpY2F0aW9udCB0aW1lIGZvciB0aGUgcG9z
c2libGUgZmlsZSBjaGFuZ2UuCisgICAgaWYgKGJsb2ItPm1vZGlmaWNhdGlvblRpbWUoKSAhPSBC
bG9iOjpkb05vdENoZWNrRmlsZUNoYW5nZSAmJiBzdGF0aWNfY2FzdDx0aW1lX3Q+KGJsb2ItPm1v
ZGlmaWNhdGlvblRpbWUoKSkgIT0gY3VycmVudE1vZGlmaWNhdGlvblRpbWUpIHsKKyAgICAgICAg
bV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBKdW1wIHRvIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gaWYgdGhlIGZpbGUg
aGFzIGJlZW4gc2xpY2VkLgorICAgIGlmIChibG9iLT5zdGFydCgpID4gMCkgeworICAgICAgICBp
ZiAoIXNlZWtGaWxlKG1faGFuZGxlLCBibG9iLT5zdGFydCgpLCBTZWVrRnJvbUJlZ2lubmluZykp
IHsKKyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRGYWlsKE5PVF9SRUFEQUJMRV9FUlIpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBHZXQg
dGhlIHNpemUuCisjaWYgRU5BQkxFKEJMT0JfU0xJQ0UpCisgICAgbV90b3RhbEJ5dGVzVG9SZWFk
ID0gYmxvYi0+bGVuZ3RoKCk7CisgICAgaWYgKG1fdG90YWxCeXRlc1RvUmVhZCA9PSBCbG9iOjp0
b0VuZE9mRmlsZSkKKyAgICAgICAgbV90b3RhbEJ5dGVzVG9SZWFkID0gYmxvYi0+c2l6ZSgpIC0g
YmxvYi0+c3RhcnQoKTsKKyNlbHNlCisgICAgbV90b3RhbCA9IGJsb2ItPnNpemUoKTsKKyNlbmRp
ZgorCisgICAgbV9jbGllbnQtPmRpZEdldFNpemUobV90b3RhbEJ5dGVzVG9SZWFkKTsKIH0KIAog
dm9pZCBGaWxlU3RyZWFtOjpvcGVuRm9yV3JpdGUoY29uc3QgU3RyaW5nJikKQEAgLTc4LDE0ICsx
MjYsMzkgQEAgdm9pZCBGaWxlU3RyZWFtOjpvcGVuRm9yV3JpdGUoY29uc3QgU3RyaW5nJikKIHZv
aWQgRmlsZVN0cmVhbTo6Y2xvc2UoKQogewogICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwot
ICAgIGlmIChpc0hhbmRsZVZhbGlkKG1faGFuZGxlKSkKKyAgICBpZiAoaXNIYW5kbGVWYWxpZCht
X2hhbmRsZSkpIHsKICAgICAgICAgY2xvc2VGaWxlKG1faGFuZGxlKTsKKyAgICAgICAgbV9oYW5k
bGUgPSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlOworICAgIH0KIH0KIAotdm9pZCBGaWxlU3Ry
ZWFtOjpyZWFkKGNoYXIqLCBpbnQpCit2b2lkIEZpbGVTdHJlYW06OnJlYWQoY2hhciogYnVmZmVy
LCBpbnQgbGVuZ3RoKQogewogICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotICAgIC8vIEZJ
WE1FOiB0byBiZSBpbXBsZW1lbnRlZC4KKworICAgIGlmICghaXNIYW5kbGVWYWxpZChtX2hhbmRs
ZSkpIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9ieXRlc1Byb2Nlc3NlZCA+PSBtX3RvdGFs
Qnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZpbmlzaCgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgbG9uZyBsb25nIHJlbWFpbmluZyA9IG1fdG90YWxCeXRlc1Rv
UmVhZCAtIG1fYnl0ZXNQcm9jZXNzZWQ7CisgICAgaW50IGJ5dGVzVG9SZWFkID0gKHJlbWFpbmlu
ZyA8IGxlbmd0aCkgPyBzdGF0aWNfY2FzdDxpbnQ+KHJlbWFpbmluZykgOiBsZW5ndGg7CisgICAg
aW50IGJ5dGVzUmVhZCA9IHJlYWRGcm9tRmlsZShtX2hhbmRsZSwgYnVmZmVyLCBieXRlc1RvUmVh
ZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwo
Tk9UX1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGJ5dGVz
UmVhZCA9PSAwKSB7CisgICAgICAgIG1fY2xpZW50LT5kaWRGaW5pc2goKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIG1fYnl0ZXNQcm9jZXNzZWQgKz0gYnl0ZXNSZWFkOworICAgIG1f
Y2xpZW50LT5kaWRSZWFkKGJ1ZmZlciwgYnl0ZXNSZWFkKTsKIH0KIAogdm9pZCBGaWxlU3RyZWFt
Ojp3cml0ZShCbG9iKiwgbG9uZyBsb25nLCBpbnQpCkBAIC0xMDIsNCArMTc1LDQgQEAgdm9pZCBG
aWxlU3RyZWFtOjp0cnVuY2F0ZShsb25nIGxvbmcpCiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
IAotI2VuZGlmIC8vIEVOQUJMRShGSUxFX1dSSVRFUikgfHwgRU5BQkxFX0ZJTEVfUkVBREVSKQor
I2VuZGlmIC8vIEVOQUJMRShGSUxFX1JFQURFUikgfHwgRU5BQkxFKEZJTEVfV1JJVEVSKQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uaCBiL1dlYkNvcmUvaHRtbC9GaWxlU3Ry
ZWFtLmgKaW5kZXggYmRhOGZjNy4uOWQzZjdiOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9odG1sL0Zp
bGVTdHJlYW0uaAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5oCkBAIC02Nyw2ICs2Nyw4
IEBAIHByaXZhdGU6CiAKICAgICBGaWxlU3RyZWFtQ2xpZW50KiBtX2NsaWVudDsKICAgICBQbGF0
Zm9ybUZpbGVIYW5kbGUgbV9oYW5kbGU7CisgICAgbG9uZyBsb25nIG1fYnl0ZXNQcm9jZXNzZWQ7
CisgICAgbG9uZyBsb25nIG1fdG90YWxCeXRlc1RvUmVhZDsKIH07CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUK
</data>
<flag name="commit-queue"
          id="38300"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54368</attachid>
            <date>2010-04-26 18:28:58 -0700</date>
            <delta_ts>2010-04-30 16:09:15 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>38157_2</filename>
            <type>text/plain</type>
            <size>27709</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YzBkYTk4ZS4uNmQwMjhhNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAxMC0wNC0yNiAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgSW1wbGVtZW50IEZpbGVSZWFkZXIgY2xhc3MuCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODE1NworCisgICAgICAgIFRoaXMgcGF0
Y2ggb25seSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRmlsZVJlYWRlciBjbGFzcyBh
cyBkZWZpbmVkCisgICAgICAgIGluIHRoZSBGaWxlIEFQSSBzcGVjOiBodHRwOi8vd3d3LnczLm9y
Zy9UUi9maWxlLXVwbG9hZC8jZGZuLWZpbGVyZWFkZXIuCisKKyAgICAgICAgTmV3IHRlc3Qgd2ls
bCBiZSBhZGRlZCB3aGVuIGEgSURMIGlzIGV4cG9zZWQgYW5kIHRoZSBGSUxFX1JFQURFUiBpcyB0
dXJuZWQKKyAgICAgICAgb24uCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAg
KiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogV2ViQ29y
ZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qOgorICAgICAgICAqIGRvbS9FdmVudE5hbWVzLmg6CisgICAgICAgICogZG9t
L0V2ZW50VGFyZ2V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50VGFyZ2V0Ojp0b0ZpbGVS
ZWFkZXIpOgorICAgICAgICAqIGRvbS9FdmVudFRhcmdldC5oOgorICAgICAgICAqIGh0bWwvRmls
ZUVycm9yLmg6CisgICAgICAgIChXZWJDb3JlOjpGaWxlRXJyb3I6OkZpbGVFcnJvcik6CisgICAg
ICAgICogaHRtbC9GaWxlUmVhZGVyLmNwcDogQWRkZWQuCisgICAgICAgICogaHRtbC9GaWxlUmVh
ZGVyLmg6IEFkZGVkLgorICAgICAgICAqIGh0bWwvRmlsZVN0cmVhbS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVT
dHJlYW06Om9wZW5Gb3JSZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OmNsb3Nl
KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OnJlYWQpOgorICAgICAgICAqIGh0bWwv
RmlsZVN0cmVhbS5oOgorCiAyMDEwLTA0LTI2ICBNYWNpZWogU3RhY2hvd2lhayAgPG1qc0BhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQppbmRleCBkYWUx
NTc2Li5hNjlmNTM2IDEwMDY0NAotLS0gYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1dl
YkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTEwNTUsNiArMTA1NSw4IEBAIHdlYmNvcmVfc291cmNl
cyArPSBcCiAJV2ViQ29yZS9odG1sL0ZpbGVFcnJvci5oIFwKIAlXZWJDb3JlL2h0bWwvRmlsZUxp
c3QuY3BwIFwKIAlXZWJDb3JlL2h0bWwvRmlsZUxpc3QuaCBcCisJV2ViQ29yZS9odG1sL0ZpbGVS
ZWFkZXIuY3BwIFwKKwlXZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5oIFwKIAlXZWJDb3JlL2h0bWwv
RmlsZVN0cmVhbS5jcHAgXAogCVdlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmggXAogCVdlYkNvcmUv
aHRtbC9GaWxlU3RyZWFtQ2xpZW50LmggXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5
cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA2Y2Y4NjYxLi4wNzVmYzlkIDEwMDY0NAot
LS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAt
MTQ0Nyw2ICsxNDQ3LDggQEAKICAgICAgICAgICAgICdodG1sL0ZpbGVFcnJvci5oJywKICAgICAg
ICAgICAgICdodG1sL0ZpbGVMaXN0LmNwcCcsCiAgICAgICAgICAgICAnaHRtbC9GaWxlTGlzdC5o
JywKKyAgICAgICAgICAgICdodG1sL0ZpbGVSZWFkZXIuY3BwJywKKyAgICAgICAgICAgICdodG1s
L0ZpbGVSZWFkZXIuaCcsCiAgICAgICAgICAgICAnaHRtbC9GaWxlU3RyZWFtLmNwcCcsCiAgICAg
ICAgICAgICAnaHRtbC9GaWxlU3RyZWFtLmgnLAogICAgICAgICAgICAgJ2h0bWwvRmlsZVN0cmVh
bUNsaWVudC5oJywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dl
YkNvcmUucHJvCmluZGV4IDczZmU4NmIuLjI5ZmZkZmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2Vi
Q29yZS5wcm8KKysrIGIvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtNjAwLDYgKzYwMCw3IEBAIFNP
VVJDRVMgKz0gXAogICAgIGh0bWwvRE9NRm9ybURhdGEuY3BwIFwKICAgICBodG1sL0ZpbGUuY3Bw
IFwKICAgICBodG1sL0ZpbGVMaXN0LmNwcCBcCisgICAgaHRtbC9GaWxlUmVhZGVyLmNwcCBcCiAg
ICAgaHRtbC9GaWxlU3RyZWFtLmNwcCBcCiAgICAgaHRtbC9GaWxlU3RyZWFtUHJveHkuY3BwIFwK
ICAgICBodG1sL0ZpbGVUaHJlYWQuY3BwIFwKQEAgLTEzMjEsNiArMTMyMiw3IEBAIEhFQURFUlMg
Kz0gXAogICAgIGh0bWwvRmlsZS5oIFwKICAgICBodG1sL0ZpbGVFcnJvci5oIFwKICAgICBodG1s
L0ZpbGVMaXN0LmggXAorICAgIGh0bWwvRmlsZVJlYWRlci5oIFwKICAgICBodG1sL0ZpbGVTdHJl
YW0uaCBcCiAgICAgaHRtbC9GaWxlU3RyZWFtQ2xpZW50LmggXAogICAgIGh0bWwvRmlsZVN0cmVh
bVByb3h5LmggXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvaiBiL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKaW5kZXggMzkzN2Fj
NC4uZDQ1MDMzMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCkBAIC0zMDM3
NSw2ICszMDM3NSwxNCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVs
YXRpdmVQYXRoPSIuLlxodG1sXEZpbGVSZWFkZXIuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0K
KwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxGaWxlUmVhZGVyLmgiDQorCQkJ
CT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxodG1sXEZp
bGVTdHJlYW0uY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggYmFiNGJjNy4uZDBlNTc5NiAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2ViQ29yZS9X
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTYxNSw2ICs2MTUsOCBAQAogCQky
RTA4ODhENDExNDg4NDhBMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRTA4ODhEMjExNDg4NDhBMDBBRjQy
NjUgLyogSlNET01Gb3JtRGF0YS5jcHAgKi87IH07CiAJCTJFMDg4OEQ1MTE0ODg0OEEwMEFGNDI2
NSAvKiBKU0RPTUZvcm1EYXRhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAyRTA4ODhEMzExNDg4NDhBMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YS5oICov
OyB9OwogCQkyRTA4ODhFNjExNDg4NEUyMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YUN1c3RvbS5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRTA4ODhF
NTExNDg4NEUyMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YUN1c3RvbS5jcHAgKi87IH07CisJCTJF
MTVCNDU2MTE4NjY4OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFMTVCNDU0MTE4NjY4OTgwMDRBNjUyQiAv
KiBGaWxlUmVhZGVyLmNwcCAqLzsgfTsKKwkJMkUxNUI0NTcxMTg2Njg5ODAwNEE2NTJCIC8qIEZp
bGVSZWFkZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDJFMTVCNDU1MTE4NjY4OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmggKi87IH07CiAJCTJFMkQ5
OUNEMTBFMkJCREEwMDQ5NjMzNyAvKiBKU0Jsb2IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkUyRDk5Q0IxMEUyQkJEQTAwNDk2MzM3IC8qIEpTQmxv
Yi5jcHAgKi87IH07CiAJCTJFMkQ5OUNFMTBFMkJCREEwMDQ5NjMzNyAvKiBKU0Jsb2IuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFMkQ5OUNDMTBFMkJC
REEwMDQ5NjMzNyAvKiBKU0Jsb2IuaCAqLzsgfTsKIAkJMkUyRDk5RTcxMEUyQkMxQzAwNDk2MzM3
IC8qIERPTUJsb2IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDJFMkQ5OUU1MTBFMkJDMUMwMDQ5NjMzNyAvKiBET01CbG9iLmggKi87IH07CkBAIC02MDM2
LDYgKzYwMzgsOCBAQAogCQkyRTA4ODhEMjExNDg4NDhBMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0
YS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0RPTUZvcm1EYXRh
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkUwODg4RDMxMTQ4ODQ4QTAwQUY0
MjY1IC8qIEpTRE9NRm9ybURhdGEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
SlNET01Gb3JtRGF0YS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRTA4ODhFNTEx
NDg4NEUyMDBBRjQyNjUgLyogSlNET01Gb3JtRGF0YUN1c3RvbS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0RPTUZvcm1EYXRhQ3VzdG9tLmNwcDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMkUxNUI0NTQxMTg2Njg5ODAwNEE2NTJCIC8qIEZpbGVSZWFk
ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRmlsZVJlYWRlci5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTJFMTVCNDU1MTE4NjY4OTgwMDRBNjUy
QiAvKiBGaWxlUmVhZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEZpbGVS
ZWFkZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkUyRDk5Q0IxMEUyQkJEQTAw
NDk2MzM3IC8qIEpTQmxvYi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBKU0Jsb2IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRTJEOTlDQzEwRTJC
QkRBMDA0OTYzMzcgLyogSlNCbG9iLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEpTQmxvYi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkyRTJEOTlFNTEwRTJCQzFD
MDA0OTYzMzcgLyogRE9NQmxvYi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBE
T01CbG9iLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMzAyNyw2ICsxMzAzMSw4
IEBACiAJCQkJQkNEQkI4QUIwRTA4OENBNTAwQzYwRkY2IC8qIEZpbGVMaXN0LmNwcCAqLywKIAkJ
CQlCQ0RCQjhBQTBFMDg4Q0E1MDBDNjBGRjYgLyogRmlsZUxpc3QuaCAqLywKIAkJCQlCQzE4ODFE
QzBFMDhDNTQzMDAwNDhDMTMgLyogRmlsZUxpc3QuaWRsICovLAorCQkJCTJFMTVCNDU0MTE4NjY4
OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmNwcCAqLywKKwkJCQkyRTE1QjQ1NTExODY2ODk4MDA0
QTY1MkIgLyogRmlsZVJlYWRlci5oICovLAogCQkJCTg5NTI1M0Q0MTE2QzRDNjgwMENBQkYwMCAv
KiBGaWxlU3RyZWFtLmNwcCAqLywKIAkJCQk4OTUyNTNENTExNkM0QzY4MDBDQUJGMDAgLyogRmls
ZVN0cmVhbS5oICovLAogCQkJCTg5NTI1M0Q2MTE2QzRDNjgwMENBQkYwMCAvKiBGaWxlU3RyZWFt
Q2xpZW50LmggKi8sCkBAIC0xODg4Myw2ICsxODg4OSw3IEBACiAJCQkJMkUzQkMxMDgxMTdENDc5
ODAwQjk0MDlBIC8qIERPTUZpbGVFcnJvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMkUzQkMxMEIx
MTdENDdDODAwQjk0MDlBIC8qIERPTUZpbGVFcnJvckludGVybmFsLmggaW4gSGVhZGVycyAqLywK
IAkJCQkzN0ZENDI5ODExODM2ODQ2MDA5M0MwMjkgLyogVHJlZURlcHRoTGltaXQuaCBpbiBIZWFk
ZXJzICovLAorCQkJCTJFMTVCNDU3MTE4NjY4OTgwMDRBNjUyQiAvKiBGaWxlUmVhZGVyLmggaW4g
SGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5n
ID0gMDsKIAkJfTsKQEAgLTIxMTE5LDYgKzIxMTI2LDcgQEAKIAkJCQk5NzM4ODlBMDExNkVBOURD
MDBBREYzMTMgLyogRG9jdW1lbnRXcml0ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkUzQkMw
Q0ExMTdEM0UwODAwQjk0MDlBIC8qIEpTRmlsZUVycm9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTJFM0JDMTA5MTE3RDQ3OTgwMEI5NDA5QSAvKiBET01GaWxlRXJyb3IubW0gaW4gU291cmNlcyAq
LywKKwkJCQkyRTE1QjQ1NjExODY2ODk4MDA0QTY1MkIgLyogRmlsZVJlYWRlci5jcHAgaW4gU291
cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0g
MDsKIAkJfTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0V2ZW50TmFtZXMuaCBiL1dlYkNvcmUv
ZG9tL0V2ZW50TmFtZXMuaAppbmRleCA5NDZlNTEzLi4wMTVmM2E0IDEwMDY0NAotLS0gYS9XZWJD
b3JlL2RvbS9FdmVudE5hbWVzLmgKKysrIGIvV2ViQ29yZS9kb20vRXZlbnROYW1lcy5oCkBAIC0x
NTUsNiArMTU1LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIFwKICAgICBtYWNybyhzdWNj
ZXNzKSBcCiAgICAgXAorICAgIG1hY3JvKGxvYWRlbmQpIFwKKyAgICBcCiAvLyBlbmQgb2YgRE9N
X0VWRU5UX05BTUVTX0ZPUl9FQUNICiAKICAgICBjbGFzcyBFdmVudE5hbWVzIDogcHVibGljIE5v
bmNvcHlhYmxlIHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmNwcCBiL1dl
YkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmNwcAppbmRleCAxNTk4NzkwLi45MWE1ZDBjIDEwMDY0NAot
LS0gYS9XZWJDb3JlL2RvbS9FdmVudFRhcmdldC5jcHAKKysrIGIvV2ViQ29yZS9kb20vRXZlbnRU
YXJnZXQuY3BwCkBAIC0xNTYsNiArMTU2LDEzIEBAIE5vdGlmaWNhdGlvbiogRXZlbnRUYXJnZXQ6
OnRvTm90aWZpY2F0aW9uKCkKIH0KICNlbmRpZgogCisjaWYgRU5BQkxFKEZJTEVfUkVBREVSKQor
RmlsZVJlYWRlciogRXZlbnRUYXJnZXQ6OnRvRmlsZVJlYWRlcigpCit7CisgICAgcmV0dXJuIDA7
Cit9CisjZW5kaWYKKwogYm9vbCBFdmVudFRhcmdldDo6YWRkRXZlbnRMaXN0ZW5lcihjb25zdCBB
dG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5l
ciwgYm9vbCB1c2VDYXB0dXJlKQogewogICAgIEV2ZW50VGFyZ2V0RGF0YSogZCA9IGVuc3VyZUV2
ZW50VGFyZ2V0RGF0YSgpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRXZlbnRUYXJnZXQuaCBi
L1dlYkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmgKaW5kZXggZGE5OGQ5OC4uOTZkMmQyOSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9kb20vRXZlbnRUYXJnZXQuaAorKysgYi9XZWJDb3JlL2RvbS9FdmVudFRh
cmdldC5oCkBAIC00OCw2ICs0OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBF
dmVudDsKICAgICBjbGFzcyBFdmVudExpc3RlbmVyOwogICAgIGNsYXNzIEV2ZW50U291cmNlOwor
ICAgIGNsYXNzIEZpbGVSZWFkZXI7CiAgICAgY2xhc3MgTWVzc2FnZVBvcnQ7CiAgICAgY2xhc3Mg
Tm9kZTsKICAgICBjbGFzcyBOb3RpZmljYXRpb247CkBAIC0xMTgsNiArMTE5LDkgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogI2lmIEVOQUJMRShOT1RJRklDQVRJT05TKQogICAgICAgICB2aXJ0dWFs
IE5vdGlmaWNhdGlvbiogdG9Ob3RpZmljYXRpb24oKTsKICNlbmRpZgorI2lmIEVOQUJMRShGSUxF
X1JFQURFUikKKyAgICAgICAgdmlydHVhbCBGaWxlUmVhZGVyKiB0b0ZpbGVSZWFkZXIoKTsKKyNl
bmRpZgogCiAgICAgICAgIHZpcnR1YWwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCgpIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0Zp
bGVFcnJvci5oIGIvV2ViQ29yZS9odG1sL0ZpbGVFcnJvci5oCmluZGV4IDQ3NzAyZjQuLjgxOTA4
ODMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxlRXJyb3IuaAorKysgYi9XZWJDb3JlL2h0
bWwvRmlsZUVycm9yLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNpZiBFTkFCTEUoRklMRV9SRUFERVIp
IHx8IEVOQUJMRShGSUxFX1dSSVRFUikKIAogI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNp
bmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ1LDggKzQ2LDggQEAgcHVibGljOgogICAgIEV4Y2Vw
dGlvbkNvZGUgY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29kZTsgfQogCiBwcml2YXRlOgotICAg
IEZpbGVFcnJvcigpCi0gICAgICAgIDogbV9jb2RlKDApCisgICAgRmlsZUVycm9yKEV4Y2VwdGlv
bkNvZGUgY29kZSkKKyAgICAgICAgOiBtX2NvZGUoY29kZSkKICAgICB7IH0KIAogICAgIEV4Y2Vw
dGlvbkNvZGUgbV9jb2RlOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3Bw
IGIvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjRkZGIwODgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVJl
YWRlci5jcHAKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5B
QkxFKEZJTEVfUkVBREVSKQorCisjaW5jbHVkZSAiRmlsZVJlYWRlci5oIgorCisjaW5jbHVkZSAi
QmFzZTY0LmgiCisjaW5jbHVkZSAiQmxvYi5oIgorI2luY2x1ZGUgIkZpbGUuaCIKKyNpbmNsdWRl
ICJGaWxlU3RyZWFtUHJveHkuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUHJv
Z3Jlc3NFdmVudC5oIgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCIKKyNpbmNs
dWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCB1
bnNpZ25lZCBGaWxlUmVhZGVyOjpidWZmZXJTaXplID0gMTAyNDsKK2NvbnN0IGRvdWJsZSBGaWxl
UmVhZGVyOjpwcm9ncmVzc05vdGlmaWNhdGlvbkludGVydmFsTVMgPSA1MDsKKworRmlsZVJlYWRl
cjo6RmlsZVJlYWRlcihTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0KQorICAgIDogbV9z
dGF0ZShFbXB0eSkKKyAgICAsIG1fY29udGV4dChjb250ZXh0KQorICAgICwgbV9yZWFkVHlwZShS
ZWFkRmlsZUFzQmluYXJ5U3RyaW5nKQorICAgICwgbV9yZXN1bHQoIiIpCisgICAgLCBtX2lzUmF3
RGF0YUNvbnZlcnRlZChmYWxzZSkKKyAgICAsIG1fbG9hZGVkKDApCisgICAgLCBtX3RvdGFsKDAp
CisgICAgLCBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUygwKQorICAgICwgbV9hbHJl
YWR5U3RhcnRlZChmYWxzZSkKK3sKKyAgICBtX2J1ZmZlci5yZXNpemUoYnVmZmVyU2l6ZSk7Cit9
CisKK0ZpbGVSZWFkZXI6On5GaWxlUmVhZGVyKCkKK3sKKyAgICBMT0coRmlsZUFQSSwgIkZpbGVS
ZWFkZXI6IGNsb3NpbmcgKHN0YXRlOiVkKVxuIiwgbV9zdGF0ZSk7CisgICAgaWYgKG1fc3RyZWFt
UHJveHkpIHsKKyAgICAgICAgbV9zdHJlYW1Qcm94eS0+c3RvcCgpOworICAgICAgICBtX3N0cmVh
bVByb3h5ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6cmVhZEFzQmluYXJ5U3Ry
aW5nKEJsb2IqIGZpbGVCbG9iKQoreworICAgIExPRyhGaWxlQVBJLCAiRmlsZVJlYWRlcjogcmVh
ZGluZyBhcyBiaW5hcnk6ICVzXG4iLCBmaWxlQmxvYi0+cGF0aCgpLnV0ZjgoKS5kYXRhKCkpOwor
CisgICAgcmVhZEludGVybmFsKGZpbGVCbG9iLCBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nKTsKK30K
Kwordm9pZCBGaWxlUmVhZGVyOjpyZWFkQXNUZXh0KEJsb2IqIGZpbGVCbG9iLCBjb25zdCBTdHJp
bmcmIGVuY29kaW5nKQoreworICAgIExPRyhGaWxlQVBJLCAiRmlsZVJlYWRlcjogcmVhZGluZyBh
cyB0ZXh0OiAlc1xuIiwgZmlsZUJsb2ItPnBhdGgoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGlm
ICghZW5jb2RpbmcuaXNFbXB0eSgpKQorICAgICAgICBtX2VuY29kaW5nID0gVGV4dEVuY29kaW5n
KGVuY29kaW5nKTsKKyAgICByZWFkSW50ZXJuYWwoZmlsZUJsb2IsIFJlYWRGaWxlQXNUZXh0KTsK
K30KKwordm9pZCBGaWxlUmVhZGVyOjpyZWFkQXNEYXRhVVJMKEZpbGUqIGZpbGUpCit7CisgICAg
TE9HKEZpbGVBUEksICJGaWxlUmVhZGVyOiByZWFkaW5nIGFzIGRhdGEgVVJMOiAlc1xuIiwgZmls
ZS0+cGF0aCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgbV9maWxlVHlwZSA9IGZpbGUtPnR5cGUo
KTsKKyAgICByZWFkSW50ZXJuYWwoZmlsZSwgUmVhZEZpbGVBc0RhdGFVUkwpOworfQorCit2b2lk
IEZpbGVSZWFkZXI6OnJlYWRJbnRlcm5hbChCbG9iKiBmaWxlQmxvYiwgUmVhZFR5cGUgdHlwZSkK
K3sKKyAgICAvLyByZWFkQXMqKiogbWV0aG9kcygpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGlt
ZXMuIE9ubHkgdGhlIGxhc3QgY2FsbCBiZWZvcmUgdGhlIGFjdHVhbCByZWFkaW5nIGhhcHBlbnMg
aXMgcHJvY2Vzc2VkLgorICAgIGlmIChtX2FscmVhZHlTdGFydGVkKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2ZpbGVCbG9iID0gZmlsZUJsb2I7CisgICAgbV9yZWFkVHlwZSA9IHR5cGU7CisK
KyAgICAvLyBXaGVuIEZpbGVTdHJlYW1Qcm94eSBpcyBjcmVhdGVkLCBGaWxlUmVhZGVyOjpkaWRT
dGFydCgpIHdpbGwgZ2V0IG5vdGlmaWVkIG9uIHRoZSBGaWxlIHRocmVhZCBhbmQgd2Ugd2lsbCBz
dGFydAorICAgIC8vIG9wZW5pbmcgYW5kIHJlYWRpbmcgdGhlIGZpbGUgc2luY2UgdGhlbi4KKyAg
ICBpZiAoIW1fc3RyZWFtUHJveHkuZ2V0KCkpCisgICAgICAgIG1fc3RyZWFtUHJveHkgPSBGaWxl
U3RyZWFtUHJveHk6OmNyZWF0ZShtX2NvbnRleHQuZ2V0KCksIHRoaXMpOworfQorCit2b2lkIEZp
bGVSZWFkZXI6OmFib3J0KCkKK3sKKyAgICBMT0coRmlsZUFQSSwgIkZpbGVSZWFkZXI6IGFib3J0
aW5nXG4iKTsKKworICAgIGlmIChtX3N0cmVhbVByb3h5KSB7CisgICAgICAgIG1fc3RyZWFtUHJv
eHktPnN0b3AoKTsKKyAgICAgICAgbV9zdHJlYW1Qcm94eSA9IDA7CisgICAgfQorCisgICAgbV9z
dGF0ZSA9IERvbmU7CisgICAgbV9yZXN1bHQgPSAiIjsKKyAgICBtX2Vycm9yID0gRmlsZUVycm9y
OjpjcmVhdGUoQUJPUlRfRVJSKTsKKworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkuZXJyb3JF
dmVudCk7CisgICAgZmlyZUV2ZW50KGV2ZW50TmFtZXMoKS5hYm9ydEV2ZW50KTsKKyAgICBmaXJl
RXZlbnQoZXZlbnROYW1lcygpLmxvYWRlbmRFdmVudCk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6
ZGlkU3RhcnQoKQoreworICAgIG1fYWxyZWFkeVN0YXJ0ZWQgPSB0cnVlOworICAgIG1fc3RyZWFt
UHJveHktPm9wZW5Gb3JSZWFkKG1fZmlsZUJsb2IuZ2V0KCkpOworfQorCit2b2lkIEZpbGVSZWFk
ZXI6OmRpZEdldFNpemUobG9uZyBsb25nIHNpemUpCit7CisgICAgbV9zdGF0ZSA9IExvYWRpbmc7
CisgICAgZmlyZUV2ZW50KGV2ZW50TmFtZXMoKS5sb2Fkc3RhcnRFdmVudCk7CisKKyAgICBtX3Rv
dGFsID0gc2l6ZTsKKyAgICBtX3N0cmVhbVByb3h5LT5yZWFkKCZtX2J1ZmZlci5hdCgwKSwgbV9i
dWZmZXIuc2l6ZSgpKTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpkaWRSZWFkKGNvbnN0IGNoYXIq
IGRhdGEsIGludCBieXRlc1JlYWQpCit7CisgICAgQVNTRVJUKGRhdGEgJiYgYnl0ZXNSZWFkKTsK
KworICAgIC8vIEJhaWwgb3V0IGlmIHdlIGhhdmUgYWJvcnRlZCB0aGUgcmVhZGluZy4KKyAgICBp
ZiAobV9zdGF0ZSA9PSBEb25lKQorICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChtX3JlYWRU
eXBlKSB7CisgICAgY2FzZSBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nOgorICAgICAgICBtX3Jlc3Vs
dCArPSBTdHJpbmcoZGF0YSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJ5dGVzUmVhZCkpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFJlYWRGaWxlQXNUZXh0OgorICAgIGNhc2UgUmVhZEZpbGVB
c0RhdGFVUkw6CisgICAgICAgIG1fcmF3RGF0YS5hcHBlbmQoZGF0YSwgc3RhdGljX2Nhc3Q8dW5z
aWduZWQ+KGJ5dGVzUmVhZCkpOworICAgICAgICBtX2lzUmF3RGF0YUNvbnZlcnRlZCA9IGZhbHNl
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICB9CisKKyAgICBtX2xvYWRlZCArPSBieXRlc1JlYWQ7CisKKyAgICAvLyBGaXJl
IHRoZSBwcm9ncmVzcyBldmVudCBhdCBsZWFzdCBldmVyeSA1MG1zLgorICAgIGRvdWJsZSBub3cg
PSBXVEY6OmN1cnJlbnRUaW1lTVMoKTsKKyAgICBpZiAoIW1fbGFzdFByb2dyZXNzTm90aWZpY2F0
aW9uVGltZU1TKQorICAgICAgICBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUyA9IG5v
dzsKKyAgICBlbHNlIGlmIChub3cgLSBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUyA+
IHByb2dyZXNzTm90aWZpY2F0aW9uSW50ZXJ2YWxNUykgeworICAgICAgICBmaXJlRXZlbnQoZXZl
bnROYW1lcygpLnByb2dyZXNzRXZlbnQpOworICAgICAgICBtX2xhc3RQcm9ncmVzc05vdGlmaWNh
dGlvblRpbWVNUyA9IG5vdzsKKyAgICB9CisKKyAgICAvLyBDb250aW51ZSByZWFkaW5nLgorICAg
IG1fc3RyZWFtUHJveHktPnJlYWQoJm1fYnVmZmVyLmF0KDApLCBtX2J1ZmZlci5zaXplKCkpOwor
fQorCit2b2lkIEZpbGVSZWFkZXI6OmRpZEZpbmlzaCgpCit7CisgICAgbV9zdGF0ZSA9IERvbmU7
CisKKyAgICBtX3N0cmVhbVByb3h5LT5jbG9zZSgpOworCisgICAgZmlyZUV2ZW50KGV2ZW50TmFt
ZXMoKS5sb2FkRXZlbnQpOworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkubG9hZGVuZEV2ZW50
KTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpkaWRGYWlsKEV4Y2VwdGlvbkNvZGUgZWMpCit7Cisg
ICAgbV9zdGF0ZSA9IERvbmU7CisgICAgbV9lcnJvciA9IEZpbGVFcnJvcjo6Y3JlYXRlKGVjKTsK
KworICAgIG1fc3RyZWFtUHJveHktPmNsb3NlKCk7CisKKyAgICBmaXJlRXZlbnQoZXZlbnROYW1l
cygpLmVycm9yRXZlbnQpOworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkubG9hZGVuZEV2ZW50
KTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpmaXJlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiB0
eXBlKQoreworICAgIC8vIEZJWE1FOiB0aGUgY3VycmVudCBQcm9ncmVzc0V2ZW50IHVzZXMgInVu
c2lnbmVkIGxvbmciIGZvciB0b3RhbCBhbmQgbG9hZGVkIGF0dHJpYnV0ZXMuIE5lZWQgdG8gdGFs
ayB3aXRoIHRoZSBzcGVjIHdyaXRlciB0byByZXNvbHZlIHRoZSBpc3N1ZS4KKyAgICBkaXNwYXRj
aEV2ZW50KFByb2dyZXNzRXZlbnQ6OmNyZWF0ZSh0eXBlLCB0cnVlLCBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4obV9sb2FkZWQpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obV90b3RhbCkpKTsKK30KKwor
Y29uc3QgU2NyaXB0U3RyaW5nJiBGaWxlUmVhZGVyOjpyZXN1bHQoKQoreworICAgIC8vIElmIHJl
YWRpbmcgYXMgYmluYXJ5IHN0cmluZywgd2UgY2FuIHJldHVybiB0aGUgcmVzdWx0IGltbWVkaWF0
ZWx5LgorICAgIGlmIChtX3JlYWRUeXBlID09IFJlYWRGaWxlQXNCaW5hcnlTdHJpbmcpCisgICAg
ICAgIHJldHVybiBtX3Jlc3VsdDsKKworICAgIC8vIElmIHdlIGFscmVhZHkgY29udmVydCB0aGUg
cmF3IGRhdGEgcmVjZWl2ZWQgc28gZmFyLCB3ZSBjYW4gcmV0dXJuIHRoZSByZXN1bHQgbm93Lgor
ICAgIGlmIChtX2lzUmF3RGF0YUNvbnZlcnRlZCkKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0Owor
ICAgIG1faXNSYXdEYXRhQ29udmVydGVkID0gdHJ1ZTsKKworICAgIGlmIChtX3JlYWRUeXBlID09
IFJlYWRGaWxlQXNUZXh0KQorICAgICAgICBjb252ZXJ0VG9UZXh0KCk7CisgICAgLy8gRm9yIGRh
dGEgVVJMLCB3ZSBvbmx5IGRvIHRoZSBjb3ZlcnNpb24gdW50aWwgd2UgcmVjZWl2ZSBhbGwgdGhl
IHJhdyBkYXRhLgorICAgIGVsc2UgaWYgKG1fcmVhZFR5cGUgPT0gUmVhZEZpbGVBc0RhdGFVUkwg
JiYgbV9zdGF0ZSA9PSBEb25lKQorICAgICAgICBjb252ZXJ0VG9EYXRhVVJMKCk7CisKKyAgICBy
ZXR1cm4gbV9yZXN1bHQ7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6Y29udmVydFRvVGV4dCgpCit7
CisgICAgaWYgKCFtX3Jhd0RhdGEuc2l6ZSgpKSB7CisgICAgICAgIG1fcmVzdWx0ID0gIiI7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBlbmNv
ZGluZyBpZiBpdCBpcyBub3QgcHJvdmlkZWQuCisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaWYg
KCFtX2VuY29kaW5nLmlzVmFsaWQoKSkgeworICAgICAgICBpZiAobV9yYXdEYXRhLnNpemUoKSA+
PSAyICYmIG1fcmF3RGF0YVswXSA9PSAnXHhGRScgJiYgbV9yYXdEYXRhWzFdID09ICdceEZGJykg
eworICAgICAgICAgICAgb2Zmc2V0ID0gMjsKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBVVEYx
NkJpZ0VuZGlhbkVuY29kaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9yYXdEYXRhLnNpemUo
KSA+PSAyICYmIG1fcmF3RGF0YVswXSA9PSAnXHhGRicgJiYgbV9yYXdEYXRhWzFdID09ICdceEZF
JykgeworICAgICAgICAgICAgb2Zmc2V0ID0gMjsKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBV
VEYxNkxpdHRsZUVuZGlhbkVuY29kaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9yYXdEYXRh
LnNpemUoKSA+PSAyICYmIG1fcmF3RGF0YVswXSA9PSAnXHhFRicgJiYgbV9yYXdEYXRhWzFdID09
ICdceEJCJyAmJiBtX3Jhd0RhdGFbMl0gPT0gJ1x4QkYnKSB7CisgICAgICAgICAgICBvZmZzZXQg
PSAzOworICAgICAgICAgICAgbV9lbmNvZGluZyA9IFVURjhFbmNvZGluZygpOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBVVEY4RW5jb2RpbmcoKTsKKyAgICB9CisK
KyAgICAvLyBEZWNvZGUgdGhlIGRhdGEuCisgICAgLy8gRklYTUU6IGNvbnNpZGVyIHVwcG9ydGlu
ZyBpbmNyZW1lbnRhbCBkZWNvZGluZyB0byBpbXByb3ZlIHRoZSBwZXJmLgorICAgIG1fcmVzdWx0
ID0gbV9lbmNvZGluZy5kZWNvZGUoJm1fcmF3RGF0YS5hdCgwKSArIG9mZnNldCwgbV9yYXdEYXRh
LnNpemUoKSAtIG9mZnNldCk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6Y29udmVydFRvRGF0YVVS
TCgpCit7CisgICAgbV9yZXN1bHQgPSAiZGF0YToiOworCisgICAgaWYgKCFtX3Jhd0RhdGEuc2l6
ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Jlc3VsdCArPSBtX2ZpbGVUeXBlOworICAg
IGlmICghbV9maWxlVHlwZS5pc0VtcHR5KCkpCisgICAgICAgIG1fcmVzdWx0ICs9ICI7IjsKKyAg
ICBtX3Jlc3VsdCArPSAiYmFzZTY0LCI7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0OworICAgIGJh
c2U2NEVuY29kZShtX3Jhd0RhdGEsIG91dCk7CisgICAgb3V0LmFwcGVuZCgnXDAnKTsKKyAgICBt
X3Jlc3VsdCArPSBvdXQuZGF0YSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisgCisj
ZW5kaWYgLy8gRU5BQkxFKEZJTEVfUkVBREVSKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0Zp
bGVSZWFkZXIuaCBiL1dlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMDQ4YzNmZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvaHRt
bC9GaWxlUmVhZGVyLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBGaWxlUmVhZGVyX2gKKyNk
ZWZpbmUgRmlsZVJlYWRlcl9oCisKKyNpZiBFTkFCTEUoRklMRV9SRUFERVIpCisKKyNpbmNsdWRl
ICJFdmVudFRhcmdldC5oIgorI2luY2x1ZGUgIkZpbGVFcnJvci5oIgorI2luY2x1ZGUgIkZpbGVT
dHJlYW1DbGllbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNj
cmlwdFN0cmluZy5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgPHd0Zi9Q
YXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYv
UmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEJsb2I7CitjbGFzcyBGaWxlOworY2xhc3MgRmlsZVN0cmVhbVByb3h5OworY2xh
c3MgU2NyaXB0RXhlY3V0aW9uQ29udGV4dDsKKworY2xhc3MgRmlsZVJlYWRlciA6IHB1YmxpYyBS
ZWZDb3VudGVkPEZpbGVSZWFkZXI+LCBwdWJsaWMgRXZlbnRUYXJnZXQsIHB1YmxpYyBGaWxlU3Ry
ZWFtQ2xpZW50IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxGaWxlUmVhZGVyPiBj
cmVhdGUoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgRmlsZVJlYWRlcihjb250ZXh0KSk7CisgICAgfQorCisgICAgdmly
dHVhbCB+RmlsZVJlYWRlcigpOworCisgICAgZW51bSBSZWFkeVN0YXRlIHsKKyAgICAgICAgRW1w
dHkgPSAwLAorICAgICAgICBMb2FkaW5nID0gMSwKKyAgICAgICAgRG9uZSA9IDIKKyAgICB9Owor
CisgICAgdm9pZCByZWFkQXNCaW5hcnlTdHJpbmcoQmxvYiopOworICAgIHZvaWQgcmVhZEFzVGV4
dChCbG9iKiwgY29uc3QgU3RyaW5nJiBlbmNvZGluZyA9ICIiKTsKKyAgICB2b2lkIHJlYWRBc0Rh
dGFVUkwoRmlsZSopOworICAgIHZvaWQgYWJvcnQoKTsKKworICAgIFJlYWR5U3RhdGUgcmVhZHlT
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGU7IH0KKyAgICBQYXNzUmVmUHRyPEZpbGVFcnJv
cj4gZXJyb3IoKSB7IHJldHVybiBtX2Vycm9yOyB9CisgICAgY29uc3QgU2NyaXB0U3RyaW5nJiBy
ZXN1bHQoKTsKKworICAgIC8vIEZpbGVTdHJlYW1DbGllbnQKKyAgICB2aXJ0dWFsIHZvaWQgZGlk
U3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkR2V0U2l6ZShsb25nIGxvbmcpOworICAgIHZp
cnR1YWwgdm9pZCBkaWRSZWFkKGNvbnN0IGNoYXIqLCBpbnQpOworICAgIHZpcnR1YWwgdm9pZCBk
aWRGaW5pc2goKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbChFeGNlcHRpb25Db2RlKTsKKwor
ICAgIC8vIEV2ZW50VGFyZ2V0CisgICAgdmlydHVhbCBGaWxlUmVhZGVyKiB0b0ZpbGVSZWFkZXIo
KSB7IHJldHVybiB0aGlzOyB9CisKKyAgICB2aXJ0dWFsIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
IHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQuZ2V0KCk7
IH0KKyAgICAKKyAgICB1c2luZyBSZWZDb3VudGVkPEZpbGVSZWFkZXI+OjpyZWY7CisgICAgdXNp
bmcgUmVmQ291bnRlZDxGaWxlUmVhZGVyPjo6ZGVyZWY7CisKKyAgICBERUZJTkVfQVRUUklCVVRF
X0VWRU5UX0xJU1RFTkVSKGxvYWRzdGFydCk7CisgICAgREVGSU5FX0FUVFJJQlVURV9FVkVOVF9M
SVNURU5FUihwcm9ncmVzcyk7CisgICAgREVGSU5FX0FUVFJJQlVURV9FVkVOVF9MSVNURU5FUihs
b2FkKTsKKyAgICBERUZJTkVfQVRUUklCVVRFX0VWRU5UX0xJU1RFTkVSKGFib3J0KTsKKyAgICBE
RUZJTkVfQVRUUklCVVRFX0VWRU5UX0xJU1RFTkVSKGVycm9yKTsKKyAgICBERUZJTkVfQVRUUklC
VVRFX0VWRU5UX0xJU1RFTkVSKGxvYWRlbmQpOworCitwcml2YXRlOgorICAgIGVudW0gUmVhZFR5
cGUgeworICAgICAgICBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nLAorICAgICAgICBSZWFkRmlsZUFz
VGV4dCwKKyAgICAgICAgUmVhZEZpbGVBc0RhdGFVUkwKKyAgICB9OworCisgICAgc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGJ1ZmZlclNpemU7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBwcm9ncmVz
c05vdGlmaWNhdGlvbkludGVydmFsTVM7CisgICAgCisgICAgRmlsZVJlYWRlcihTY3JpcHRFeGVj
dXRpb25Db250ZXh0Kik7CisKKyAgICAvLyBFdmVudFRhcmdldAorICAgIHZpcnR1YWwgdm9pZCBy
ZWZFdmVudFRhcmdldCgpIHsgcmVmKCk7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGVyZWZFdmVudFRh
cmdldCgpIHsgZGVyZWYoKTsgfQorICAgIHZpcnR1YWwgRXZlbnRUYXJnZXREYXRhKiBldmVudFRh
cmdldERhdGEoKSB7IHJldHVybiAmbV9ldmVudFRhcmdldERhdGE7IH0KKyAgICB2aXJ0dWFsIEV2
ZW50VGFyZ2V0RGF0YSogZW5zdXJlRXZlbnRUYXJnZXREYXRhKCkgeyByZXR1cm4gJm1fZXZlbnRU
YXJnZXREYXRhOyB9CisKKyAgICB2b2lkIHJlYWRJbnRlcm5hbChCbG9iKiwgUmVhZFR5cGUpOwor
ICAgIHZvaWQgZmlyZUV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgdHlwZSk7CisgICAgdm9pZCBj
b252ZXJ0VG9UZXh0KCk7CisgICAgdm9pZCBjb252ZXJ0VG9EYXRhVVJMKCk7CisKKyAgICBSZWFk
eVN0YXRlIG1fc3RhdGU7CisgICAgUmVmUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ+IG1fY29u
dGV4dDsKKyAgICBFdmVudFRhcmdldERhdGEgbV9ldmVudFRhcmdldERhdGE7CisKKyAgICBSZWZQ
dHI8QmxvYj4gbV9maWxlQmxvYjsKKyAgICBSZWFkVHlwZSBtX3JlYWRUeXBlOworCisgICAgLy8g
TGlrZSBYTUxIdHRwUmVxdWVzdC5tX3Jlc3BvbnNlVGV4dCwgd2Uga2VlcCB0aGlzIGFzIGEgU2Ny
aXB0U3RyaW5nLCBub3QgYSBXZWJDb3JlOjpTdHJpbmcuCisgICAgLy8gVGhhdCdzIGJlY2F1c2Ug
dGhlc2Ugc3RyaW5ncyBjYW4gZWFzaWx5IGdldCBodWdlICh0aGV5IGFyZSBmaWxsZWQgZnJvbSB0
aGUgZmlsZSkgYW5kCisgICAgLy8gYmVjYXVzZSBKUyBjYW4gZWFzaWx5IG9ic2VydmUgbWFueSBp
bnRlcm1lZGlhdGUgc3RhdGVzLCBzbyBpdCdzIHZlcnkgdXNlZnVsIHRvIGJlCisgICAgLy8gYWJs
ZSB0byBzaGFyZSB0aGUgYnVmZmVyIHdpdGggSmF2YVNjcmlwdCB2ZXJzaW9ucyBvZiB0aGUgd2hv
bGUgb3IgcGFydGlhbCBzdHJpbmcuCisgICAgLy8gSW4gY29udHJhc3QsIHRoaXMgc3RyaW5nIGRv
ZXNuJ3QgaW50ZXJhY3QgbXVjaCB3aXRoIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgc28gaXQncyBu
b3QgdGhhdAorICAgIC8vIGJpZyBhIGNvc3QgdGhhdCBpdCBpc24ndCBhIFN0cmluZy4KKyAgICBT
Y3JpcHRTdHJpbmcgbV9yZXN1bHQ7CisKKyAgICAvLyBUaGUgcmF3IGRhdGEuIFdlIGhhdmUgdG8g
a2VlcCB0cmFjayBvZiBhbGwgdGhlIHJhdyBkYXRhIGZvciBpdCB0byBiZSBjb252ZXJ0ZWQgdG8g
dGV4dCBvciBkYXRhIFVSTCBkYXRhLgorICAgIFZlY3RvcjxjaGFyPiBtX3Jhd0RhdGE7CisgICAg
Ym9vbCBtX2lzUmF3RGF0YUNvbnZlcnRlZDsKKworICAgIC8vIEVuY29kaW5nIHNjaGVtZSB1c2Vk
IHRvIGRlY29kZSB0aGUgZGF0YS4KKyAgICBUZXh0RW5jb2RpbmcgbV9lbmNvZGluZzsKKworICAg
IC8vIE5lZWRlZCB0byBjcmVhdGUgZGF0YSBVUkwuCisgICAgU3RyaW5nIG1fZmlsZVR5cGU7CisK
KyAgICBSZWZQdHI8RmlsZVN0cmVhbVByb3h5PiBtX3N0cmVhbVByb3h5OworICAgIFZlY3Rvcjxj
aGFyPiBtX2J1ZmZlcjsKKyAgICBSZWZQdHI8RmlsZUVycm9yPiBtX2Vycm9yOworICAgIGxvbmcg
bG9uZyBtX2xvYWRlZDsKKyAgICBsb25nIGxvbmcgbV90b3RhbDsKKyAgICBkb3VibGUgbV9sYXN0
UHJvZ3Jlc3NOb3RpZmljYXRpb25UaW1lTVM7CisgICAgYm9vbCBtX2FscmVhZHlTdGFydGVkOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8vIEZpbGVS
ZWFkZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uY3BwIGIvV2ViQ29y
ZS9odG1sL0ZpbGVTdHJlYW0uY3BwCmluZGV4IDg0YTI4ZDYuLjcwODlmNjEgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNwcAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVh
bS5jcHAKQEAgLTQyLDYgKzQyLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogRmlsZVN0cmVhbTo6
RmlsZVN0cmVhbShGaWxlU3RyZWFtQ2xpZW50KiBjbGllbnQpCiAgICAgOiBtX2NsaWVudChjbGll
bnQpCiAgICAgLCBtX2hhbmRsZShpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlKQorICAgICwgbV9i
eXRlc1Byb2Nlc3NlZCgwKQorICAgICwgbV90b3RhbEJ5dGVzVG9SZWFkKDApCiB7CiB9CiAKQEAg
LTYzLDEwICs2NSw1NiBAQCB2b2lkIEZpbGVTdHJlYW06OnN0b3AoKQogICAgIG1fY2xpZW50LT5k
aWRTdG9wKCk7CiB9CiAKLXZvaWQgRmlsZVN0cmVhbTo6b3BlbkZvclJlYWQoQmxvYiopCit2b2lk
IEZpbGVTdHJlYW06Om9wZW5Gb3JSZWFkKEJsb2IqIGJsb2IpCiB7CiAgICAgQVNTRVJUKCFpc01h
aW5UaHJlYWQoKSk7Ci0gICAgLy8gRklYTUU6IHRvIGJlIGltcGxlbWVudGVkLgorCisgICAgaWYg
KGlzSGFuZGxlVmFsaWQobV9oYW5kbGUpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDaGVj
ayBpZiB0aGUgZmlsZSBleGlzdHMgYnkgcXVlcnlpbmcgaXRzIG1vZGlmaWNhdGlvbiB0aW1lLiBX
ZSBjaG9vc2Ugbm90IHRvIGNhbGwgZmlsZUV4aXN0cygpIGluIG9yZGVyIHRvIHNhdmUgYW4KKyAg
ICAvLyBleHRyYSBmaWxlIHN5c3RlbSBjYWxsIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGlz
IG5lZWRlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNsaWNlZCBmaWxlIGJsb2IuCisg
ICAgLy8gUGVyIHRoZSBzcGVjLCB3ZSBuZWVkIHRvIHJldHVybiBkaWZmZXJlbnQgZXJyb3IgY29k
ZXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5vbi1leGlzdGVudCBmaWxlIGFuZCBwZXJtaXNz
aW9uIGVycm9yLgorICAgIC8vIG9wZW5GaWxlKCkgY291bGQgbm90IHRlbGwgdXNlIHRoZSBmYWls
dXJlIHJlYXNvbi4KKyAgICB0aW1lX3QgY3VycmVudE1vZGlmaWNhdGlvblRpbWU7CisgICAgaWYg
KCFnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShibG9iLT5wYXRoKCksIGN1cnJlbnRNb2RpZmljYXRp
b25UaW1lKSkgeworICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfRk9VTkRfRVJSKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9wZW4gdGhlIGZpbGUgYmxvYi4KKyAgICBt
X2hhbmRsZSA9IG9wZW5GaWxlKGJsb2ItPnBhdGgoKSwgT3BlbkZvclJlYWQpOworICAgIGlmICgh
aXNIYW5kbGVWYWxpZChtX2hhbmRsZSkpIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9U
X1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBFTkFCTEUoQkxP
Ql9TTElDRSkKKyAgICAvLyBDaGVjayB0aGUgbW9kaWZpY2F0aW9udCB0aW1lIGZvciB0aGUgcG9z
c2libGUgZmlsZSBjaGFuZ2UuCisgICAgaWYgKGJsb2ItPm1vZGlmaWNhdGlvblRpbWUoKSAhPSBC
bG9iOjpkb05vdENoZWNrRmlsZUNoYW5nZSAmJiBzdGF0aWNfY2FzdDx0aW1lX3Q+KGJsb2ItPm1v
ZGlmaWNhdGlvblRpbWUoKSkgIT0gY3VycmVudE1vZGlmaWNhdGlvblRpbWUpIHsKKyAgICAgICAg
bV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBKdW1wIHRvIHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gaWYgdGhlIGZpbGUg
aGFzIGJlZW4gc2xpY2VkLgorICAgIGlmIChibG9iLT5zdGFydCgpID4gMCkgeworICAgICAgICBp
ZiAoIXNlZWtGaWxlKG1faGFuZGxlLCBibG9iLT5zdGFydCgpLCBTZWVrRnJvbUJlZ2lubmluZykp
IHsKKyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRGYWlsKE5PVF9SRUFEQUJMRV9FUlIpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBHZXQg
dGhlIHNpemUuCisjaWYgRU5BQkxFKEJMT0JfU0xJQ0UpCisgICAgbV90b3RhbEJ5dGVzVG9SZWFk
ID0gYmxvYi0+bGVuZ3RoKCk7CisgICAgaWYgKG1fdG90YWxCeXRlc1RvUmVhZCA9PSBCbG9iOjp0
b0VuZE9mRmlsZSkKKyAgICAgICAgbV90b3RhbEJ5dGVzVG9SZWFkID0gYmxvYi0+c2l6ZSgpIC0g
YmxvYi0+c3RhcnQoKTsKKyNlbHNlCisgICAgbV90b3RhbCA9IGJsb2ItPnNpemUoKTsKKyNlbmRp
ZgorCisgICAgbV9jbGllbnQtPmRpZEdldFNpemUobV90b3RhbEJ5dGVzVG9SZWFkKTsKIH0KIAog
dm9pZCBGaWxlU3RyZWFtOjpvcGVuRm9yV3JpdGUoY29uc3QgU3RyaW5nJikKQEAgLTc4LDE0ICsx
MjYsNDEgQEAgdm9pZCBGaWxlU3RyZWFtOjpvcGVuRm9yV3JpdGUoY29uc3QgU3RyaW5nJikKIHZv
aWQgRmlsZVN0cmVhbTo6Y2xvc2UoKQogewogICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwot
ICAgIGlmIChpc0hhbmRsZVZhbGlkKG1faGFuZGxlKSkKKyAgICBpZiAoaXNIYW5kbGVWYWxpZCht
X2hhbmRsZSkpIHsKICAgICAgICAgY2xvc2VGaWxlKG1faGFuZGxlKTsKKyAgICAgICAgbV9oYW5k
bGUgPSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlOworICAgIH0KIH0KIAotdm9pZCBGaWxlU3Ry
ZWFtOjpyZWFkKGNoYXIqLCBpbnQpCit2b2lkIEZpbGVTdHJlYW06OnJlYWQoY2hhciogYnVmZmVy
LCBpbnQgbGVuZ3RoKQogewogICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotICAgIC8vIEZJ
WE1FOiB0byBiZSBpbXBsZW1lbnRlZC4KKworICAgIGlmICghaXNIYW5kbGVWYWxpZChtX2hhbmRs
ZSkpIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9ieXRlc1Byb2Nlc3NlZCA+PSBtX3RvdGFs
Qnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZpbmlzaCgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgbG9uZyBsb25nIHJlbWFpbmluZyA9IG1fdG90YWxCeXRlc1Rv
UmVhZCAtIG1fYnl0ZXNQcm9jZXNzZWQ7CisgICAgaW50IGJ5dGVzVG9SZWFkID0gKHJlbWFpbmlu
ZyA8IGxlbmd0aCkgPyBzdGF0aWNfY2FzdDxpbnQ+KHJlbWFpbmluZykgOiBsZW5ndGg7CisgICAg
aW50IGJ5dGVzUmVhZCA9IHJlYWRGcm9tRmlsZShtX2hhbmRsZSwgYnVmZmVyLCBieXRlc1RvUmVh
ZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwo
Tk9UX1JFQURBQkxFX0VSUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWJ5
dGVzUmVhZCkgeworICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNoKCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBtX2J5dGVzUHJvY2Vzc2VkICs9IGJ5dGVzUmVhZDsKKyAgICBtX2Ns
aWVudC0+ZGlkUmVhZChidWZmZXIsIGJ5dGVzUmVhZCk7CiB9CiAKIHZvaWQgRmlsZVN0cmVhbTo6
d3JpdGUoQmxvYiosIGxvbmcgbG9uZywgaW50KQpAQCAtMTAyLDQgKzE3Nyw0IEBAIHZvaWQgRmls
ZVN0cmVhbTo6dHJ1bmNhdGUobG9uZyBsb25nKQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAK
LSNlbmRpZiAvLyBFTkFCTEUoRklMRV9XUklURVIpIHx8IEVOQUJMRV9GSUxFX1JFQURFUikKKyNl
bmRpZiAvLyBFTkFCTEUoRklMRV9SRUFERVIpIHx8IEVOQUJMRShGSUxFX1dSSVRFUikKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmggYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVh
bS5oCmluZGV4IGJkYThmYzcuLjlkM2Y3YjggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxl
U3RyZWFtLmgKKysrIGIvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uaApAQCAtNjcsNiArNjcsOCBA
QCBwcml2YXRlOgogCiAgICAgRmlsZVN0cmVhbUNsaWVudCogbV9jbGllbnQ7CiAgICAgUGxhdGZv
cm1GaWxlSGFuZGxlIG1faGFuZGxlOworICAgIGxvbmcgbG9uZyBtX2J5dGVzUHJvY2Vzc2VkOwor
ICAgIGxvbmcgbG9uZyBtX3RvdGFsQnl0ZXNUb1JlYWQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCg==
</data>
<flag name="review"
          id="38318"
          type_id="1"
          status="-"
          setter="dimich"
    />
    <flag name="commit-queue"
          id="38319"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54831</attachid>
            <date>2010-04-30 16:09:15 -0700</date>
            <delta_ts>2010-05-05 10:25:11 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>38157_3</filename>
            <type>text/plain</type>
            <size>28272</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OWVjMTljYy4uYmQ0OWEwYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNiBAQAorMjAxMC0wNC0zMCAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgSW1wbGVtZW50IEZpbGVSZWFkZXIgY2xhc3MuCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODE1NworCisgICAgICAgIFRoaXMgcGF0
Y2ggb25seSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRmlsZVJlYWRlciBjbGFzcyBh
cyBkZWZpbmVkCisgICAgICAgIGluIHRoZSBGaWxlIEFQSSBzcGVjOiBodHRwOi8vd3d3LnczLm9y
Zy9UUi9maWxlLXVwbG9hZC8jZGZuLWZpbGVyZWFkZXIuCisKKyAgICAgICAgTmV3IHRlc3Qgd2ls
bCBiZSBhZGRlZCB3aGVuIGEgSURMIGlzIGV4cG9zZWQgYW5kIHRoZSBGSUxFX1JFQURFUiBpcyB0
dXJuZWQKKyAgICAgICAgb24uCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAg
KiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogV2ViQ29y
ZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2o6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qOgorICAgICAgICAqIGRvbS9FdmVudE5hbWVzLmg6CisgICAgICAgICogZG9t
L0V2ZW50VGFyZ2V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50VGFyZ2V0Ojp0b0ZpbGVS
ZWFkZXIpOgorICAgICAgICAqIGRvbS9FdmVudFRhcmdldC5oOgorICAgICAgICAqIGh0bWwvRmls
ZUVycm9yLmg6CisgICAgICAgIChXZWJDb3JlOjpGaWxlRXJyb3I6OkZpbGVFcnJvcik6CisgICAg
ICAgICogaHRtbC9GaWxlUmVhZGVyLmNwcDogQWRkZWQuCisgICAgICAgICogaHRtbC9GaWxlUmVh
ZGVyLmg6IEFkZGVkLgorICAgICAgICAqIGh0bWwvRmlsZVN0cmVhbS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpGaWxlU3RyZWFtOjpGaWxlU3RyZWFtKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVT
dHJlYW06Om9wZW5Gb3JSZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OmNsb3Nl
KToKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTdHJlYW06OnJlYWQpOgorICAgICAgICAqIGh0bWwv
RmlsZVN0cmVhbS5oOgorCiAyMDEwLTA0LTMwICBEYXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVudC4KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGE5NzUyMzMu
LjkxNjcxMTEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIvV2ViQ29y
ZS9HTlVtYWtlZmlsZS5hbQpAQCAtMTA1Myw2ICsxMDUzLDggQEAgd2ViY29yZV9zb3VyY2VzICs9
IFwKIAlXZWJDb3JlL2h0bWwvRmlsZUVycm9yLmggXAogCVdlYkNvcmUvaHRtbC9GaWxlTGlzdC5j
cHAgXAogCVdlYkNvcmUvaHRtbC9GaWxlTGlzdC5oIFwKKwlXZWJDb3JlL2h0bWwvRmlsZVJlYWRl
ci5jcHAgXAorCVdlYkNvcmUvaHRtbC9GaWxlUmVhZGVyLmggXAogCVdlYkNvcmUvaHRtbC9GaWxl
U3RyZWFtLmNwcCBcCiAJV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uaCBcCiAJV2ViQ29yZS9odG1s
L0ZpbGVTdHJlYW1DbGllbnQuaCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBi
L1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IDBiNjlmYmYuLmJkOTc2MGMgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0xNDQz
LDYgKzE0NDMsOCBAQAogICAgICAgICAgICAgJ2h0bWwvRmlsZUVycm9yLmgnLAogICAgICAgICAg
ICAgJ2h0bWwvRmlsZUxpc3QuY3BwJywKICAgICAgICAgICAgICdodG1sL0ZpbGVMaXN0LmgnLAor
ICAgICAgICAgICAgJ2h0bWwvRmlsZVJlYWRlci5jcHAnLAorICAgICAgICAgICAgJ2h0bWwvRmls
ZVJlYWRlci5oJywKICAgICAgICAgICAgICdodG1sL0ZpbGVTdHJlYW0uY3BwJywKICAgICAgICAg
ICAgICdodG1sL0ZpbGVTdHJlYW0uaCcsCiAgICAgICAgICAgICAnaHRtbC9GaWxlU3RyZWFtQ2xp
ZW50LmgnLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnBybyBiL1dlYkNvcmUvV2ViQ29y
ZS5wcm8KaW5kZXggZWY2MDIxZC4uNzM0NWFiZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3Jl
LnBybworKysgYi9XZWJDb3JlL1dlYkNvcmUucHJvCkBAIC02MDIsNiArNjAyLDcgQEAgU09VUkNF
UyArPSBcCiAgICAgaHRtbC9ET01Gb3JtRGF0YS5jcHAgXAogICAgIGh0bWwvRmlsZS5jcHAgXAog
ICAgIGh0bWwvRmlsZUxpc3QuY3BwIFwKKyAgICBodG1sL0ZpbGVSZWFkZXIuY3BwIFwKICAgICBo
dG1sL0ZpbGVTdHJlYW0uY3BwIFwKICAgICBodG1sL0ZpbGVTdHJlYW1Qcm94eS5jcHAgXAogICAg
IGh0bWwvRmlsZVRocmVhZC5jcHAgXApAQCAtMTMyMyw2ICsxMzI0LDcgQEAgSEVBREVSUyArPSBc
CiAgICAgaHRtbC9GaWxlLmggXAogICAgIGh0bWwvRmlsZUVycm9yLmggXAogICAgIGh0bWwvRmls
ZUxpc3QuaCBcCisgICAgaHRtbC9GaWxlUmVhZGVyLmggXAogICAgIGh0bWwvRmlsZVN0cmVhbS5o
IFwKICAgICBodG1sL0ZpbGVTdHJlYW1DbGllbnQuaCBcCiAgICAgaHRtbC9GaWxlU3RyZWFtUHJv
eHkuaCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9q
IGIvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagppbmRleCA1MzIyZDhhLi4z
ODI5MWJhIDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9q
CisrKyBiL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKQEAgLTMwMzc1LDYg
KzMwMzc1LDE0IEBACiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXGh0bWxcRmlsZVJlYWRlci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJ
PEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxodG1sXEZpbGVSZWFkZXIuaCINCisJCQkJPg0K
KwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGh0bWxcRmlsZVN0
cmVhbS5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagppbmRleCA4ODgzZjEwLi5iODA2OTgyIDEwMDY0NAotLS0gYS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9XZWJDb3JlL1dlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtNjU0LDYgKzY1NCw4IEBACiAJCTJFNDM0
NjU1MEY1NDZBODIwMEIwRjFCQSAvKiBXb3JrZXJUaHJlYWQuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDJFNDM0NjQzMEY1NDZBODIwMEIwRjFCQSAvKiBX
b3JrZXJUaHJlYWQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQkyRTQzNDY1ODBGNTQ2QTk5MDBCMEYxQkEgLyogQ3Jvc3NUaHJlYWRDb3BpZXIuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkU0MzQ2NTYw
RjU0NkE5OTAwQjBGMUJBIC8qIENyb3NzVGhyZWFkQ29waWVyLmNwcCAqLzsgfTsKIAkJMkU0MzQ2
NTkwRjU0NkE5OTAwQjBGMUJBIC8qIENyb3NzVGhyZWFkQ29waWVyLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRTQzNDY1NzBGNTQ2QTk5MDBCMEYxQkEg
LyogQ3Jvc3NUaHJlYWRDb3BpZXIuaCAqLzsgfTsKKwkJMkU5NEYzQ0QxMThCOTA4RTAwQjdGNzVE
IC8qIEZpbGVSZWFkZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMkU5NEYzQ0IxMThCOTA4RTAwQjdGNzVEIC8qIEZpbGVSZWFkZXIuY3BwICovOyB9
OworCQkyRTk0RjNDRTExOEI5MDhFMDBCN0Y3NUQgLyogRmlsZVJlYWRlci5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMkU5NEYzQ0MxMThCOTA4RTAwQjdG
NzVEIC8qIEZpbGVSZWFkZXIuaCAqLzsgfTsKIAkJMkVBNzY4MDQwRkU3MTI2NDAwQUI5QzhBIC8q
IFdvcmtlclNjcmlwdExvYWRlckNsaWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMkVBNzY4MDMwRkU3MTI2NDAwQUI5QzhBIC8qIFdvcmtlclNjcmlw
dExvYWRlckNsaWVudC5oICovOyB9OwogCQkyRUFGQUYwRTEwRTJBRjJEMDA3RUQzRDYgLyogQmxv
Yi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAyRUFG
QUYwQjEwRTJBRjJEMDA3RUQzRDYgLyogQmxvYi5jcHAgKi87IH07CiAJCTJFQUZBRjBGMTBFMkFG
MkQwMDdFRDNENiAvKiBCbG9iLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAyRUFGQUYwQzEwRTJBRjJEMDA3RUQzRDYgLyogQmxvYi5oICovOyB9OwpAQCAt
NjA4Nyw2ICs2MDg5LDggQEAKIAkJMkU0MzQ2NDMwRjU0NkE4MjAwQjBGMUJBIC8qIFdvcmtlclRo
cmVhZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBXb3JrZXJUaHJlYWQuaDsg
cGF0aCA9IHdvcmtlcnMvV29ya2VyVGhyZWFkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTJFNDM0NjU2MEY1NDZBOTkwMEIwRjFCQSAvKiBDcm9zc1RocmVhZENvcGllci5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDcm9zc1RocmVhZENvcGllci5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTJFNDM0NjU3MEY1NDZBOTkwMEIwRjFCQSAv
KiBDcm9zc1RocmVhZENvcGllci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBD
cm9zc1RocmVhZENvcGllci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkyRTk0RjND
QjExOEI5MDhFMDBCN0Y3NUQgLyogRmlsZVJlYWRlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBGaWxlUmVhZGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJMkU5NEYzQ0MxMThCOTA4RTAwQjdGNzVEIC8qIEZpbGVSZWFkZXIuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRmlsZVJlYWRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkyRUE3NjgwMzBGRTcxMjY0MDBBQjlDOEEgLyogV29ya2VyU2NyaXB0TG9hZGVy
Q2xpZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFdvcmtlclNjcmlwdExv
YWRlckNsaWVudC5oOyBwYXRoID0gd29ya2Vycy9Xb3JrZXJTY3JpcHRMb2FkZXJDbGllbnQuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMkVBRkFGMEIxMEUyQUYyRDAwN0VEM0Q2IC8q
IEJsb2IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQmxvYi5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTJFQUZBRjBDMTBFMkFGMkQwMDdFRDNENiAv
KiBCbG9iLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJsb2IuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEzMDUzLDYgKzEzMDU3LDggQEAKIAkJCQlCQ0RCQjhB
QjBFMDg4Q0E1MDBDNjBGRjYgLyogRmlsZUxpc3QuY3BwICovLAogCQkJCUJDREJCOEFBMEUwODhD
QTUwMEM2MEZGNiAvKiBGaWxlTGlzdC5oICovLAogCQkJCUJDMTg4MURDMEUwOEM1NDMwMDA0OEMx
MyAvKiBGaWxlTGlzdC5pZGwgKi8sCisJCQkJMkU5NEYzQ0IxMThCOTA4RTAwQjdGNzVEIC8qIEZp
bGVSZWFkZXIuY3BwICovLAorCQkJCTJFOTRGM0NDMTE4QjkwOEUwMEI3Rjc1RCAvKiBGaWxlUmVh
ZGVyLmggKi8sCiAJCQkJODk1MjUzRDQxMTZDNEM2ODAwQ0FCRjAwIC8qIEZpbGVTdHJlYW0uY3Bw
ICovLAogCQkJCTg5NTI1M0Q1MTE2QzRDNjgwMENBQkYwMCAvKiBGaWxlU3RyZWFtLmggKi8sCiAJ
CQkJODk1MjUzRDYxMTZDNEM2ODAwQ0FCRjAwIC8qIEZpbGVTdHJlYW1DbGllbnQuaCAqLywKQEAg
LTE4OTE4LDYgKzE4OTI0LDcgQEAKIAkJCQlCNTIzQ0YwODExODI2NzU0MDBFQkIyOUMgLyogU1FM
VHJhbnNhY3Rpb25TeW5jLmggaW4gSGVhZGVycyAqLywKIAkJCQlCNTIzQ0YwQjExODI2NzU0MDBF
QkIyOUMgLyogRGF0YWJhc2VTeW5jLmggaW4gSGVhZGVycyAqLywKIAkJCQkxQTI3Q0Y5NzExOEEz
NTRDMDA0MUQ2MzIgLyogbnB0eXBlcy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMkU5NEYzQ0UxMThC
OTA4RTAwQjdGNzVEIC8qIEZpbGVSZWFkZXIuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjExNTcsNiAr
MjExNjQsNyBAQAogCQkJCUI1MjNDRjBBMTE4MjY3NTQwMEVCQjI5QyAvKiBEYXRhYmFzZVN5bmMu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTYzRTg4RjcxMThBMzlEMjAwRUQ5MjMxIC8qIFNpbXBs
ZUZvbnREYXRhQ29yZVRleHQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTYzRThCMTMxMThCM0FE
RDAwRUQ5MjMxIC8qIFNpbXBsZUZvbnREYXRhQVRTVUkubW0gaW4gU291cmNlcyAqLywKKwkJCQky
RTk0RjNDRDExOEI5MDhFMDBCN0Y3NUQgLyogRmlsZVJlYWRlci5jcHAgaW4gU291cmNlcyAqLywK
IAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0V2ZW50TmFtZXMuaCBiL1dlYkNvcmUvZG9tL0V2ZW50
TmFtZXMuaAppbmRleCA5NDZlNTEzLi4wMTVmM2E0IDEwMDY0NAotLS0gYS9XZWJDb3JlL2RvbS9F
dmVudE5hbWVzLmgKKysrIGIvV2ViQ29yZS9kb20vRXZlbnROYW1lcy5oCkBAIC0xNTUsNiArMTU1
LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIFwKICAgICBtYWNybyhzdWNjZXNzKSBcCiAg
ICAgXAorICAgIG1hY3JvKGxvYWRlbmQpIFwKKyAgICBcCiAvLyBlbmQgb2YgRE9NX0VWRU5UX05B
TUVTX0ZPUl9FQUNICiAKICAgICBjbGFzcyBFdmVudE5hbWVzIDogcHVibGljIE5vbmNvcHlhYmxl
IHsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZG9tL0V2ZW50VGFyZ2V0LmNwcCBiL1dlYkNvcmUvZG9t
L0V2ZW50VGFyZ2V0LmNwcAppbmRleCAxNTk4NzkwLi45MWE1ZDBjIDEwMDY0NAotLS0gYS9XZWJD
b3JlL2RvbS9FdmVudFRhcmdldC5jcHAKKysrIGIvV2ViQ29yZS9kb20vRXZlbnRUYXJnZXQuY3Bw
CkBAIC0xNTYsNiArMTU2LDEzIEBAIE5vdGlmaWNhdGlvbiogRXZlbnRUYXJnZXQ6OnRvTm90aWZp
Y2F0aW9uKCkKIH0KICNlbmRpZgogCisjaWYgRU5BQkxFKEZJTEVfUkVBREVSKQorRmlsZVJlYWRl
ciogRXZlbnRUYXJnZXQ6OnRvRmlsZVJlYWRlcigpCit7CisgICAgcmV0dXJuIDA7Cit9CisjZW5k
aWYKKwogYm9vbCBFdmVudFRhcmdldDo6YWRkRXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJp
bmcmIGV2ZW50VHlwZSwgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciwgYm9vbCB1
c2VDYXB0dXJlKQogewogICAgIEV2ZW50VGFyZ2V0RGF0YSogZCA9IGVuc3VyZUV2ZW50VGFyZ2V0
RGF0YSgpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRXZlbnRUYXJnZXQuaCBiL1dlYkNvcmUv
ZG9tL0V2ZW50VGFyZ2V0LmgKaW5kZXggZGE5OGQ5OC4uOTZkMmQyOSAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9kb20vRXZlbnRUYXJnZXQuaAorKysgYi9XZWJDb3JlL2RvbS9FdmVudFRhcmdldC5oCkBA
IC00OCw2ICs0OCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBFdmVudDsKICAg
ICBjbGFzcyBFdmVudExpc3RlbmVyOwogICAgIGNsYXNzIEV2ZW50U291cmNlOworICAgIGNsYXNz
IEZpbGVSZWFkZXI7CiAgICAgY2xhc3MgTWVzc2FnZVBvcnQ7CiAgICAgY2xhc3MgTm9kZTsKICAg
ICBjbGFzcyBOb3RpZmljYXRpb247CkBAIC0xMTgsNiArMTE5LDkgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogI2lmIEVOQUJMRShOT1RJRklDQVRJT05TKQogICAgICAgICB2aXJ0dWFsIE5vdGlmaWNh
dGlvbiogdG9Ob3RpZmljYXRpb24oKTsKICNlbmRpZgorI2lmIEVOQUJMRShGSUxFX1JFQURFUikK
KyAgICAgICAgdmlydHVhbCBGaWxlUmVhZGVyKiB0b0ZpbGVSZWFkZXIoKTsKKyNlbmRpZgogCiAg
ICAgICAgIHZpcnR1YWwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCgpIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVFcnJvci5o
IGIvV2ViQ29yZS9odG1sL0ZpbGVFcnJvci5oCmluZGV4IDQ3NzAyZjQuLjgxOTA4ODMgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvaHRtbC9GaWxlRXJyb3IuaAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZUVy
cm9yLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNpZiBFTkFCTEUoRklMRV9SRUFERVIpIHx8IEVOQUJM
RShGSUxFX1dSSVRFUikKIAogI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlIDx3
dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKQEAgLTQ1LDggKzQ2LDggQEAgcHVibGljOgogICAgIEV4Y2VwdGlvbkNvZGUg
Y29kZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29kZTsgfQogCiBwcml2YXRlOgotICAgIEZpbGVFcnJv
cigpCi0gICAgICAgIDogbV9jb2RlKDApCisgICAgRmlsZUVycm9yKEV4Y2VwdGlvbkNvZGUgY29k
ZSkKKyAgICAgICAgOiBtX2NvZGUoY29kZSkKICAgICB7IH0KIAogICAgIEV4Y2VwdGlvbkNvZGUg
bV9jb2RlOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0ZpbGVSZWFkZXIuY3BwIGIvV2ViQ29y
ZS9odG1sL0ZpbGVSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LmY3NGIwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5jcHAK
QEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKEZJTEVf
UkVBREVSKQorCisjaW5jbHVkZSAiRmlsZVJlYWRlci5oIgorCisjaW5jbHVkZSAiQmFzZTY0Lmgi
CisjaW5jbHVkZSAiQmxvYi5oIgorI2luY2x1ZGUgIkZpbGUuaCIKKyNpbmNsdWRlICJGaWxlU3Ry
ZWFtUHJveHkuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiUHJvZ3Jlc3NFdmVu
dC5oIgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYv
Q3VycmVudFRpbWUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCB1bnNpZ25lZCBi
dWZmZXJTaXplID0gMTAyNDsKK2NvbnN0IGRvdWJsZSBwcm9ncmVzc05vdGlmaWNhdGlvbkludGVy
dmFsTVMgPSA1MDsKKworRmlsZVJlYWRlcjo6RmlsZVJlYWRlcihTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiBjb250ZXh0KQorICAgIDogQWN0aXZlRE9NT2JqZWN0KGNvbnRleHQsIHRoaXMpCisgICAg
LCBtX3N0YXRlKEVtcHR5KQorICAgICwgbV9yZWFkVHlwZShSZWFkRmlsZUFzQmluYXJ5U3RyaW5n
KQorICAgICwgbV9yZXN1bHQoIiIpCisgICAgLCBtX2lzUmF3RGF0YUNvbnZlcnRlZChmYWxzZSkK
KyAgICAsIG1fYnl0ZXNMb2FkZWQoMCkKKyAgICAsIG1fdG90YWxCeXRlcygwKQorICAgICwgbV9s
YXN0UHJvZ3Jlc3NOb3RpZmljYXRpb25UaW1lTVMoMCkKKyAgICAsIG1fYWxyZWFkeVN0YXJ0ZWQo
ZmFsc2UpCit7CisgICAgbV9idWZmZXIucmVzaXplKGJ1ZmZlclNpemUpOworfQorCitGaWxlUmVh
ZGVyOjp+RmlsZVJlYWRlcigpCit7CisgICAgdGVybWluYXRlKCk7Cit9CisKK2Jvb2wgRmlsZVJl
YWRlcjo6aGFzUGVuZGluZ0FjdGl2aXR5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdGF0ZSA9
PSBMb2FkaW5nIHx8IEFjdGl2ZURPTU9iamVjdDo6aGFzUGVuZGluZ0FjdGl2aXR5KCk7Cit9CisK
K2Jvb2wgRmlsZVJlYWRlcjo6Y2FuU3VzcGVuZCgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEl0
IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUgdG8gc3VzcGVuZCBhIEZpbGVSZWFkZXIsIHNvIHBh
Z2VzIHdpdGggRmlsZVJlYWRlciBjYW4gbm90IGdvIGludG8gcGFnZSBjYWNoZS4KKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6c3RvcCgpCit7CisgICAgdGVybWluYXRl
KCk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6cmVhZEFzQmluYXJ5U3RyaW5nKEJsb2IqIGZpbGVC
bG9iKQoreworICAgIExPRyhGaWxlQVBJLCAiRmlsZVJlYWRlcjogcmVhZGluZyBhcyBiaW5hcnk6
ICVzXG4iLCBmaWxlQmxvYi0+cGF0aCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcmVhZEludGVy
bmFsKGZpbGVCbG9iLCBSZWFkRmlsZUFzQmluYXJ5U3RyaW5nKTsKK30KKwordm9pZCBGaWxlUmVh
ZGVyOjpyZWFkQXNUZXh0KEJsb2IqIGZpbGVCbG9iLCBjb25zdCBTdHJpbmcmIGVuY29kaW5nKQor
eworICAgIExPRyhGaWxlQVBJLCAiRmlsZVJlYWRlcjogcmVhZGluZyBhcyB0ZXh0OiAlc1xuIiwg
ZmlsZUJsb2ItPnBhdGgoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGlmICghZW5jb2RpbmcuaXNF
bXB0eSgpKQorICAgICAgICBtX2VuY29kaW5nID0gVGV4dEVuY29kaW5nKGVuY29kaW5nKTsKKyAg
ICByZWFkSW50ZXJuYWwoZmlsZUJsb2IsIFJlYWRGaWxlQXNUZXh0KTsKK30KKwordm9pZCBGaWxl
UmVhZGVyOjpyZWFkQXNEYXRhVVJMKEZpbGUqIGZpbGUpCit7CisgICAgTE9HKEZpbGVBUEksICJG
aWxlUmVhZGVyOiByZWFkaW5nIGFzIGRhdGEgVVJMOiAlc1xuIiwgZmlsZS0+cGF0aCgpLnV0Zjgo
KS5kYXRhKCkpOworCisgICAgbV9maWxlVHlwZSA9IGZpbGUtPnR5cGUoKTsKKyAgICByZWFkSW50
ZXJuYWwoZmlsZSwgUmVhZEZpbGVBc0RhdGFVUkwpOworfQorCit2b2lkIEZpbGVSZWFkZXI6OnJl
YWRJbnRlcm5hbChCbG9iKiBmaWxlQmxvYiwgUmVhZFR5cGUgdHlwZSkKK3sKKyAgICAvLyByZWFk
QXMqKiogbWV0aG9kcygpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIE9ubHkgdGhlIGxh
c3QgY2FsbCBiZWZvcmUgdGhlIGFjdHVhbCByZWFkaW5nIGhhcHBlbnMgaXMgcHJvY2Vzc2VkLgor
ICAgIGlmIChtX2FscmVhZHlTdGFydGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2ZpbGVC
bG9iID0gZmlsZUJsb2I7CisgICAgbV9yZWFkVHlwZSA9IHR5cGU7CisKKyAgICAvLyBXaGVuIEZp
bGVTdHJlYW1Qcm94eSBpcyBjcmVhdGVkLCBGaWxlUmVhZGVyOjpkaWRTdGFydCgpIHdpbGwgZ2V0
IG5vdGlmaWVkIG9uIHRoZSBGaWxlIHRocmVhZCBhbmQgd2Ugd2lsbCBzdGFydAorICAgIC8vIG9w
ZW5pbmcgYW5kIHJlYWRpbmcgdGhlIGZpbGUgc2luY2UgdGhlbi4KKyAgICBpZiAoIW1fc3RyZWFt
UHJveHkuZ2V0KCkpCisgICAgICAgIG1fc3RyZWFtUHJveHkgPSBGaWxlU3RyZWFtUHJveHk6OmNy
ZWF0ZShzY3JpcHRFeGVjdXRpb25Db250ZXh0KCksIHRoaXMpOworfQorCit2b2lkIEZpbGVSZWFk
ZXI6OmFib3J0KCkKK3sKKyAgICBMT0coRmlsZUFQSSwgIkZpbGVSZWFkZXI6IGFib3J0aW5nXG4i
KTsKKworICAgIHRlcm1pbmF0ZSgpOworCisgICAgbV9yZXN1bHQgPSAiIjsKKyAgICBtX2Vycm9y
ID0gRmlsZUVycm9yOjpjcmVhdGUoQUJPUlRfRVJSKTsKKworICAgIGZpcmVFdmVudChldmVudE5h
bWVzKCkuZXJyb3JFdmVudCk7CisgICAgZmlyZUV2ZW50KGV2ZW50TmFtZXMoKS5hYm9ydEV2ZW50
KTsKKyAgICBmaXJlRXZlbnQoZXZlbnROYW1lcygpLmxvYWRlbmRFdmVudCk7Cit9CisKK3ZvaWQg
RmlsZVJlYWRlcjo6dGVybWluYXRlKCkKK3sKKyAgICBpZiAobV9zdHJlYW1Qcm94eSkgeworICAg
ICAgICBtX3N0cmVhbVByb3h5LT5zdG9wKCk7CisgICAgICAgIG1fc3RyZWFtUHJveHkgPSAwOwor
ICAgIH0KKyAgICBtX3N0YXRlID0gRG9uZTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpkaWRTdGFy
dCgpCit7CisgICAgbV9hbHJlYWR5U3RhcnRlZCA9IHRydWU7CisgICAgbV9zdHJlYW1Qcm94eS0+
b3BlbkZvclJlYWQobV9maWxlQmxvYi5nZXQoKSk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6ZGlk
R2V0U2l6ZShsb25nIGxvbmcgc2l6ZSkKK3sKKyAgICBtX3N0YXRlID0gTG9hZGluZzsKKyAgICBm
aXJlRXZlbnQoZXZlbnROYW1lcygpLmxvYWRzdGFydEV2ZW50KTsKKworICAgIG1fdG90YWxCeXRl
cyA9IHNpemU7CisgICAgbV9zdHJlYW1Qcm94eS0+cmVhZCgmbV9idWZmZXIuYXQoMCksIG1fYnVm
ZmVyLnNpemUoKSk7Cit9CisKK3ZvaWQgRmlsZVJlYWRlcjo6ZGlkUmVhZChjb25zdCBjaGFyKiBk
YXRhLCBpbnQgYnl0ZXNSZWFkKQoreworICAgIEFTU0VSVChkYXRhICYmIGJ5dGVzUmVhZCk7CisK
KyAgICAvLyBCYWlsIG91dCBpZiB3ZSBoYXZlIGFib3J0ZWQgdGhlIHJlYWRpbmcuCisgICAgaWYg
KG1fc3RhdGUgPT0gRG9uZSkKKyAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAobV9yZWFkVHlw
ZSkgeworICAgIGNhc2UgUmVhZEZpbGVBc0JpbmFyeVN0cmluZzoKKyAgICAgICAgbV9yZXN1bHQg
Kz0gU3RyaW5nKGRhdGEsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihieXRlc1JlYWQpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBSZWFkRmlsZUFzVGV4dDoKKyAgICBjYXNlIFJlYWRGaWxlQXNE
YXRhVVJMOgorICAgICAgICBtX3Jhd0RhdGEuYXBwZW5kKGRhdGEsIHN0YXRpY19jYXN0PHVuc2ln
bmVkPihieXRlc1JlYWQpKTsKKyAgICAgICAgbV9pc1Jhd0RhdGFDb252ZXJ0ZWQgPSBmYWxzZTsK
KyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgfQorCisgICAgbV9ieXRlc0xvYWRlZCArPSBieXRlc1JlYWQ7CisKKyAgICAvLyBG
aXJlIHRoZSBwcm9ncmVzcyBldmVudCBhdCBsZWFzdCBldmVyeSA1MG1zLgorICAgIGRvdWJsZSBu
b3cgPSBXVEY6OmN1cnJlbnRUaW1lTVMoKTsKKyAgICBpZiAoIW1fbGFzdFByb2dyZXNzTm90aWZp
Y2F0aW9uVGltZU1TKQorICAgICAgICBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVNUyA9
IG5vdzsKKyAgICBlbHNlIGlmIChub3cgLSBtX2xhc3RQcm9ncmVzc05vdGlmaWNhdGlvblRpbWVN
UyA+IHByb2dyZXNzTm90aWZpY2F0aW9uSW50ZXJ2YWxNUykgeworICAgICAgICBmaXJlRXZlbnQo
ZXZlbnROYW1lcygpLnByb2dyZXNzRXZlbnQpOworICAgICAgICBtX2xhc3RQcm9ncmVzc05vdGlm
aWNhdGlvblRpbWVNUyA9IG5vdzsKKyAgICB9CisKKyAgICAvLyBDb250aW51ZSByZWFkaW5nLgor
ICAgIG1fc3RyZWFtUHJveHktPnJlYWQoJm1fYnVmZmVyLmF0KDApLCBtX2J1ZmZlci5zaXplKCkp
OworfQorCit2b2lkIEZpbGVSZWFkZXI6OmRpZEZpbmlzaCgpCit7CisgICAgbV9zdGF0ZSA9IERv
bmU7CisKKyAgICBtX3N0cmVhbVByb3h5LT5jbG9zZSgpOworCisgICAgZmlyZUV2ZW50KGV2ZW50
TmFtZXMoKS5sb2FkRXZlbnQpOworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkubG9hZGVuZEV2
ZW50KTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpkaWRGYWlsKEV4Y2VwdGlvbkNvZGUgZWMpCit7
CisgICAgbV9zdGF0ZSA9IERvbmU7CisgICAgbV9lcnJvciA9IEZpbGVFcnJvcjo6Y3JlYXRlKGVj
KTsKKworICAgIG1fc3RyZWFtUHJveHktPmNsb3NlKCk7CisKKyAgICBmaXJlRXZlbnQoZXZlbnRO
YW1lcygpLmVycm9yRXZlbnQpOworICAgIGZpcmVFdmVudChldmVudE5hbWVzKCkubG9hZGVuZEV2
ZW50KTsKK30KKwordm9pZCBGaWxlUmVhZGVyOjpmaXJlRXZlbnQoY29uc3QgQXRvbWljU3RyaW5n
JiB0eXBlKQoreworICAgIC8vIEZJWE1FOiB0aGUgY3VycmVudCBQcm9ncmVzc0V2ZW50IHVzZXMg
InVuc2lnbmVkIGxvbmciIGZvciB0b3RhbCBhbmQgbG9hZGVkIGF0dHJpYnV0ZXMuIE5lZWQgdG8g
dGFsayB3aXRoIHRoZSBzcGVjIHdyaXRlciB0byByZXNvbHZlIHRoZSBpc3N1ZS4KKyAgICBkaXNw
YXRjaEV2ZW50KFByb2dyZXNzRXZlbnQ6OmNyZWF0ZSh0eXBlLCB0cnVlLCBzdGF0aWNfY2FzdDx1
bnNpZ25lZD4obV9ieXRlc0xvYWRlZCksIHN0YXRpY19jYXN0PHVuc2lnbmVkPihtX3RvdGFsQnl0
ZXMpKSk7Cit9CisKK2NvbnN0IFNjcmlwdFN0cmluZyYgRmlsZVJlYWRlcjo6cmVzdWx0KCkKK3sK
KyAgICAvLyBJZiByZWFkaW5nIGFzIGJpbmFyeSBzdHJpbmcsIHdlIGNhbiByZXR1cm4gdGhlIHJl
c3VsdCBpbW1lZGlhdGVseS4KKyAgICBpZiAobV9yZWFkVHlwZSA9PSBSZWFkRmlsZUFzQmluYXJ5
U3RyaW5nKQorICAgICAgICByZXR1cm4gbV9yZXN1bHQ7CisKKyAgICAvLyBJZiB3ZSBhbHJlYWR5
IGNvbnZlcnQgdGhlIHJhdyBkYXRhIHJlY2VpdmVkIHNvIGZhciwgd2UgY2FuIHJldHVybiB0aGUg
cmVzdWx0IG5vdy4KKyAgICBpZiAobV9pc1Jhd0RhdGFDb252ZXJ0ZWQpCisgICAgICAgIHJldHVy
biBtX3Jlc3VsdDsKKyAgICBtX2lzUmF3RGF0YUNvbnZlcnRlZCA9IHRydWU7CisKKyAgICBpZiAo
bV9yZWFkVHlwZSA9PSBSZWFkRmlsZUFzVGV4dCkKKyAgICAgICAgY29udmVydFRvVGV4dCgpOwor
ICAgIC8vIEZvciBkYXRhIFVSTCwgd2Ugb25seSBkbyB0aGUgY292ZXJzaW9uIHVudGlsIHdlIHJl
Y2VpdmUgYWxsIHRoZSByYXcgZGF0YS4KKyAgICBlbHNlIGlmIChtX3JlYWRUeXBlID09IFJlYWRG
aWxlQXNEYXRhVVJMICYmIG1fc3RhdGUgPT0gRG9uZSkKKyAgICAgICAgY29udmVydFRvRGF0YVVS
TCgpOworCisgICAgcmV0dXJuIG1fcmVzdWx0OworfQorCit2b2lkIEZpbGVSZWFkZXI6OmNvbnZl
cnRUb1RleHQoKQoreworICAgIGlmICghbV9yYXdEYXRhLnNpemUoKSkgeworICAgICAgICBtX3Jl
c3VsdCA9ICIiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVHJ5IHRvIGRldGVy
bWluZSB0aGUgZW5jb2RpbmcgaWYgaXQgaXMgbm90IHByb3ZpZGVkLgorICAgIGludCBvZmZzZXQg
PSAwOworICAgIGlmICghbV9lbmNvZGluZy5pc1ZhbGlkKCkpIHsKKyAgICAgICAgaWYgKG1fcmF3
RGF0YS5zaXplKCkgPj0gMiAmJiBtX3Jhd0RhdGFbMF0gPT0gJ1x4RkUnICYmIG1fcmF3RGF0YVsx
XSA9PSAnXHhGRicpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IDI7CisgICAgICAgICAgICBtX2Vu
Y29kaW5nID0gVVRGMTZCaWdFbmRpYW5FbmNvZGluZygpOworICAgICAgICB9IGVsc2UgaWYgKG1f
cmF3RGF0YS5zaXplKCkgPj0gMiAmJiBtX3Jhd0RhdGFbMF0gPT0gJ1x4RkYnICYmIG1fcmF3RGF0
YVsxXSA9PSAnXHhGRScpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IDI7CisgICAgICAgICAgICBt
X2VuY29kaW5nID0gVVRGMTZMaXR0bGVFbmRpYW5FbmNvZGluZygpOworICAgICAgICB9IGVsc2Ug
aWYgKG1fcmF3RGF0YS5zaXplKCkgPj0gMiAmJiBtX3Jhd0RhdGFbMF0gPT0gJ1x4RUYnICYmIG1f
cmF3RGF0YVsxXSA9PSAnXHhCQicgJiYgbV9yYXdEYXRhWzJdID09ICdceEJGJykgeworICAgICAg
ICAgICAgb2Zmc2V0ID0gMzsKKyAgICAgICAgICAgIG1fZW5jb2RpbmcgPSBVVEY4RW5jb2Rpbmco
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX2VuY29kaW5nID0gVVRGOEVuY29kaW5n
KCk7CisgICAgfQorCisgICAgLy8gRGVjb2RlIHRoZSBkYXRhLgorICAgIC8vIEZJWE1FOiBjb25z
aWRlciB1cHBvcnRpbmcgaW5jcmVtZW50YWwgZGVjb2RpbmcgdG8gaW1wcm92ZSB0aGUgcGVyZi4K
KyAgICBtX3Jlc3VsdCA9IG1fZW5jb2RpbmcuZGVjb2RlKCZtX3Jhd0RhdGEuYXQoMCkgKyBvZmZz
ZXQsIG1fcmF3RGF0YS5zaXplKCkgLSBvZmZzZXQpOworfQorCit2b2lkIEZpbGVSZWFkZXI6OmNv
bnZlcnRUb0RhdGFVUkwoKQoreworICAgIG1fcmVzdWx0ID0gImRhdGE6IjsKKworICAgIGlmICgh
bV9yYXdEYXRhLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9yZXN1bHQgKz0gbV9m
aWxlVHlwZTsKKyAgICBpZiAoIW1fZmlsZVR5cGUuaXNFbXB0eSgpKQorICAgICAgICBtX3Jlc3Vs
dCArPSAiOyI7CisgICAgbV9yZXN1bHQgKz0gImJhc2U2NCwiOworCisgICAgVmVjdG9yPGNoYXI+
IG91dDsKKyAgICBiYXNlNjRFbmNvZGUobV9yYXdEYXRhLCBvdXQpOworICAgIG91dC5hcHBlbmQo
J1wwJyk7CisgICAgbV9yZXN1bHQgKz0gb3V0LmRhdGEoKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorIAorI2VuZGlmIC8vIEVOQUJMRShGSUxFX1JFQURFUikKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvaHRtbC9GaWxlUmVhZGVyLmggYi9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMGZhZDcKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL2h0bWwvRmlsZVJlYWRlci5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRmls
ZVJlYWRlcl9oCisjZGVmaW5lIEZpbGVSZWFkZXJfaAorCisjaWYgRU5BQkxFKEZJTEVfUkVBREVS
KQorCisjaW5jbHVkZSAiQWN0aXZlRE9NT2JqZWN0LmgiCisjaW5jbHVkZSAiRXZlbnRUYXJnZXQu
aCIKKyNpbmNsdWRlICJGaWxlRXJyb3IuaCIKKyNpbmNsdWRlICJGaWxlU3RyZWFtQ2xpZW50Lmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTY3JpcHRTdHJpbmcuaCIK
KyNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBCbG9i
OworY2xhc3MgRmlsZTsKK2NsYXNzIEZpbGVTdHJlYW1Qcm94eTsKK2NsYXNzIFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQ7CisKK2NsYXNzIEZpbGVSZWFkZXIgOiBwdWJsaWMgUmVmQ291bnRlZDxGaWxl
UmVhZGVyPiwgcHVibGljIEFjdGl2ZURPTU9iamVjdCwgcHVibGljIEV2ZW50VGFyZ2V0LCBwdWJs
aWMgRmlsZVN0cmVhbUNsaWVudCB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8Rmls
ZVJlYWRlcj4gY3JlYXRlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQpCisgICAgewor
ICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEZpbGVSZWFkZXIoY29udGV4dCkpOworICAgIH0K
KworICAgIHZpcnR1YWwgfkZpbGVSZWFkZXIoKTsKKworICAgIGVudW0gUmVhZHlTdGF0ZSB7Cisg
ICAgICAgIEVtcHR5ID0gMCwKKyAgICAgICAgTG9hZGluZyA9IDEsCisgICAgICAgIERvbmUgPSAy
CisgICAgfTsKKworICAgIHZvaWQgcmVhZEFzQmluYXJ5U3RyaW5nKEJsb2IqKTsKKyAgICB2b2lk
IHJlYWRBc1RleHQoQmxvYiosIGNvbnN0IFN0cmluZyYgZW5jb2RpbmcgPSAiIik7CisgICAgdm9p
ZCByZWFkQXNEYXRhVVJMKEZpbGUqKTsKKyAgICB2b2lkIGFib3J0KCk7CisKKyAgICBSZWFkeVN0
YXRlIHJlYWR5U3RhdGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlOyB9CisgICAgUGFzc1JlZlB0
cjxGaWxlRXJyb3I+IGVycm9yKCkgeyByZXR1cm4gbV9lcnJvcjsgfQorICAgIGNvbnN0IFNjcmlw
dFN0cmluZyYgcmVzdWx0KCk7CisKKyAgICAvLyBBY3RpdmVET01PYmplY3QKKyAgICB2aXJ0dWFs
IGJvb2wgY2FuU3VzcGVuZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAg
dmlydHVhbCBib29sIGhhc1BlbmRpbmdBY3Rpdml0eSgpIGNvbnN0OworCisgICAgLy8gRXZlbnRU
YXJnZXQKKyAgICB2aXJ0dWFsIEZpbGVSZWFkZXIqIHRvRmlsZVJlYWRlcigpIHsgcmV0dXJuIHRo
aXM7IH0KKyAgICB2aXJ0dWFsIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBBY3RpdmVET01PYmplY3Q6OnNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQoKTsgfQorCisgICAgLy8gRmlsZVN0cmVhbUNsaWVudAorICAgIHZpcnR1YWwgdm9p
ZCBkaWRTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBkaWRHZXRTaXplKGxvbmcgbG9uZyk7Cisg
ICAgdmlydHVhbCB2b2lkIGRpZFJlYWQoY29uc3QgY2hhciosIGludCk7CisgICAgdmlydHVhbCB2
b2lkIGRpZEZpbmlzaCgpOworICAgIHZpcnR1YWwgdm9pZCBkaWRGYWlsKEV4Y2VwdGlvbkNvZGUp
OworCisgICAgdXNpbmcgUmVmQ291bnRlZDxGaWxlUmVhZGVyPjo6cmVmOworICAgIHVzaW5nIFJl
ZkNvdW50ZWQ8RmlsZVJlYWRlcj46OmRlcmVmOworCisgICAgREVGSU5FX0FUVFJJQlVURV9FVkVO
VF9MSVNURU5FUihsb2Fkc3RhcnQpOworICAgIERFRklORV9BVFRSSUJVVEVfRVZFTlRfTElTVEVO
RVIocHJvZ3Jlc3MpOworICAgIERFRklORV9BVFRSSUJVVEVfRVZFTlRfTElTVEVORVIobG9hZCk7
CisgICAgREVGSU5FX0FUVFJJQlVURV9FVkVOVF9MSVNURU5FUihhYm9ydCk7CisgICAgREVGSU5F
X0FUVFJJQlVURV9FVkVOVF9MSVNURU5FUihlcnJvcik7CisgICAgREVGSU5FX0FUVFJJQlVURV9F
VkVOVF9MSVNURU5FUihsb2FkZW5kKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFJlYWRUeXBlIHsK
KyAgICAgICAgUmVhZEZpbGVBc0JpbmFyeVN0cmluZywKKyAgICAgICAgUmVhZEZpbGVBc1RleHQs
CisgICAgICAgIFJlYWRGaWxlQXNEYXRhVVJMCisgICAgfTsKKworICAgIEZpbGVSZWFkZXIoU2Ny
aXB0RXhlY3V0aW9uQ29udGV4dCopOworCisgICAgLy8gRXZlbnRUYXJnZXQKKyAgICB2aXJ0dWFs
IHZvaWQgcmVmRXZlbnRUYXJnZXQoKSB7IHJlZigpOyB9CisgICAgdmlydHVhbCB2b2lkIGRlcmVm
RXZlbnRUYXJnZXQoKSB7IGRlcmVmKCk7IH0KKyAgICB2aXJ0dWFsIEV2ZW50VGFyZ2V0RGF0YSog
ZXZlbnRUYXJnZXREYXRhKCkgeyByZXR1cm4gJm1fZXZlbnRUYXJnZXREYXRhOyB9CisgICAgdmly
dHVhbCBFdmVudFRhcmdldERhdGEqIGVuc3VyZUV2ZW50VGFyZ2V0RGF0YSgpIHsgcmV0dXJuICZt
X2V2ZW50VGFyZ2V0RGF0YTsgfQorCisgICAgdm9pZCB0ZXJtaW5hdGUoKTsKKyAgICB2b2lkIHJl
YWRJbnRlcm5hbChCbG9iKiwgUmVhZFR5cGUpOworICAgIHZvaWQgZmlyZUV2ZW50KGNvbnN0IEF0
b21pY1N0cmluZyYgdHlwZSk7CisgICAgdm9pZCBjb252ZXJ0VG9UZXh0KCk7CisgICAgdm9pZCBj
b252ZXJ0VG9EYXRhVVJMKCk7CisKKyAgICBSZWFkeVN0YXRlIG1fc3RhdGU7CisgICAgRXZlbnRU
YXJnZXREYXRhIG1fZXZlbnRUYXJnZXREYXRhOworCisgICAgUmVmUHRyPEJsb2I+IG1fZmlsZUJs
b2I7CisgICAgUmVhZFR5cGUgbV9yZWFkVHlwZTsKKworICAgIC8vIExpa2UgWE1MSHR0cFJlcXVl
c3QubV9yZXNwb25zZVRleHQsIHdlIGtlZXAgdGhpcyBhcyBhIFNjcmlwdFN0cmluZywgbm90IGEg
V2ViQ29yZTo6U3RyaW5nLgorICAgIC8vIFRoYXQncyBiZWNhdXNlIHRoZXNlIHN0cmluZ3MgY2Fu
IGVhc2lseSBnZXQgaHVnZSAodGhleSBhcmUgZmlsbGVkIGZyb20gdGhlIGZpbGUpIGFuZAorICAg
IC8vIGJlY2F1c2UgSlMgY2FuIGVhc2lseSBvYnNlcnZlIG1hbnkgaW50ZXJtZWRpYXRlIHN0YXRl
cywgc28gaXQncyB2ZXJ5IHVzZWZ1bCB0byBiZQorICAgIC8vIGFibGUgdG8gc2hhcmUgdGhlIGJ1
ZmZlciB3aXRoIEphdmFTY3JpcHQgdmVyc2lvbnMgb2YgdGhlIHdob2xlIG9yIHBhcnRpYWwgc3Ry
aW5nLgorICAgIC8vIEluIGNvbnRyYXN0LCB0aGlzIHN0cmluZyBkb2Vzbid0IGludGVyYWN0IG11
Y2ggd2l0aCB0aGUgcmVzdCBvZiB0aGUgZW5naW5lIHNvIGl0J3Mgbm90IHRoYXQKKyAgICAvLyBi
aWcgYSBjb3N0IHRoYXQgaXQgaXNuJ3QgYSBTdHJpbmcuCisgICAgU2NyaXB0U3RyaW5nIG1fcmVz
dWx0OworCisgICAgLy8gVGhlIHJhdyBkYXRhLiBXZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgYWxs
IHRoZSByYXcgZGF0YSBmb3IgaXQgdG8gYmUgY29udmVydGVkIHRvIHRleHQgb3IgZGF0YSBVUkwg
ZGF0YS4KKyAgICBWZWN0b3I8Y2hhcj4gbV9yYXdEYXRhOworICAgIGJvb2wgbV9pc1Jhd0RhdGFD
b252ZXJ0ZWQ7CisKKyAgICAvLyBFbmNvZGluZyBzY2hlbWUgdXNlZCB0byBkZWNvZGUgdGhlIGRh
dGEuCisgICAgVGV4dEVuY29kaW5nIG1fZW5jb2Rpbmc7CisKKyAgICAvLyBOZWVkZWQgdG8gY3Jl
YXRlIGRhdGEgVVJMLgorICAgIFN0cmluZyBtX2ZpbGVUeXBlOworCisgICAgUmVmUHRyPEZpbGVT
dHJlYW1Qcm94eT4gbV9zdHJlYW1Qcm94eTsKKyAgICBWZWN0b3I8Y2hhcj4gbV9idWZmZXI7Cisg
ICAgUmVmUHRyPEZpbGVFcnJvcj4gbV9lcnJvcjsKKyAgICBsb25nIGxvbmcgbV9ieXRlc0xvYWRl
ZDsKKyAgICBsb25nIGxvbmcgbV90b3RhbEJ5dGVzOworICAgIGRvdWJsZSBtX2xhc3RQcm9ncmVz
c05vdGlmaWNhdGlvblRpbWVNUzsKKyAgICBib29sIG1fYWxyZWFkeVN0YXJ0ZWQ7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRmlsZVJlYWRlcl9o
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5jcHAgYi9XZWJDb3JlL2h0bWwv
RmlsZVN0cmVhbS5jcHAKaW5kZXggODRhMjhkNi4uNzA4OWY2MSAxMDA2NDQKLS0tIGEvV2ViQ29y
ZS9odG1sL0ZpbGVTdHJlYW0uY3BwCisrKyBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmNwcApA
QCAtNDIsNiArNDIsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBGaWxlU3RyZWFtOjpGaWxlU3Ry
ZWFtKEZpbGVTdHJlYW1DbGllbnQqIGNsaWVudCkKICAgICA6IG1fY2xpZW50KGNsaWVudCkKICAg
ICAsIG1faGFuZGxlKGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGUpCisgICAgLCBtX2J5dGVzUHJv
Y2Vzc2VkKDApCisgICAgLCBtX3RvdGFsQnl0ZXNUb1JlYWQoMCkKIHsKIH0KIApAQCAtNjMsMTAg
KzY1LDU2IEBAIHZvaWQgRmlsZVN0cmVhbTo6c3RvcCgpCiAgICAgbV9jbGllbnQtPmRpZFN0b3Ao
KTsKIH0KIAotdm9pZCBGaWxlU3RyZWFtOjpvcGVuRm9yUmVhZChCbG9iKikKK3ZvaWQgRmlsZVN0
cmVhbTo6b3BlbkZvclJlYWQoQmxvYiogYmxvYikKIHsKICAgICBBU1NFUlQoIWlzTWFpblRocmVh
ZCgpKTsKLSAgICAvLyBGSVhNRTogdG8gYmUgaW1wbGVtZW50ZWQuCisKKyAgICBpZiAoaXNIYW5k
bGVWYWxpZChtX2hhbmRsZSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENoZWNrIGlmIHRo
ZSBmaWxlIGV4aXN0cyBieSBxdWVyeWluZyBpdHMgbW9kaWZpY2F0aW9uIHRpbWUuIFdlIGNob29z
ZSBub3QgdG8gY2FsbCBmaWxlRXhpc3RzKCkgaW4gb3JkZXIgdG8gc2F2ZSBhbgorICAgIC8vIGV4
dHJhIGZpbGUgc3lzdGVtIGNhbGwgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgaXMgbmVlZGVk
IHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2xpY2VkIGZpbGUgYmxvYi4KKyAgICAvLyBQ
ZXIgdGhlIHNwZWMsIHdlIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBlcnJvciBjb2RlcyB0byBk
aWZmZXJlbnRpYXRlIGJldHdlZW4gbm9uLWV4aXN0ZW50IGZpbGUgYW5kIHBlcm1pc3Npb24gZXJy
b3IuCisgICAgLy8gb3BlbkZpbGUoKSBjb3VsZCBub3QgdGVsbCB1c2UgdGhlIGZhaWx1cmUgcmVh
c29uLgorICAgIHRpbWVfdCBjdXJyZW50TW9kaWZpY2F0aW9uVGltZTsKKyAgICBpZiAoIWdldEZp
bGVNb2RpZmljYXRpb25UaW1lKGJsb2ItPnBhdGgoKSwgY3VycmVudE1vZGlmaWNhdGlvblRpbWUp
KSB7CisgICAgICAgIG1fY2xpZW50LT5kaWRGYWlsKE5PVF9GT1VORF9FUlIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gT3BlbiB0aGUgZmlsZSBibG9iLgorICAgIG1faGFuZGxl
ID0gb3BlbkZpbGUoYmxvYi0+cGF0aCgpLCBPcGVuRm9yUmVhZCk7CisgICAgaWYgKCFpc0hhbmRs
ZVZhbGlkKG1faGFuZGxlKSkgeworICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfUkVBREFC
TEVfRVJSKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIEVOQUJMRShCTE9CX1NMSUNF
KQorICAgIC8vIENoZWNrIHRoZSBtb2RpZmljYXRpb250IHRpbWUgZm9yIHRoZSBwb3NzaWJsZSBm
aWxlIGNoYW5nZS4KKyAgICBpZiAoYmxvYi0+bW9kaWZpY2F0aW9uVGltZSgpICE9IEJsb2I6OmRv
Tm90Q2hlY2tGaWxlQ2hhbmdlICYmIHN0YXRpY19jYXN0PHRpbWVfdD4oYmxvYi0+bW9kaWZpY2F0
aW9uVGltZSgpKSAhPSBjdXJyZW50TW9kaWZpY2F0aW9uVGltZSkgeworICAgICAgICBtX2NsaWVu
dC0+ZGlkRmFpbChOT1RfUkVBREFCTEVfRVJSKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIC8vIEp1bXAgdG8gdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBpZiB0aGUgZmlsZSBoYXMgYmVl
biBzbGljZWQuCisgICAgaWYgKGJsb2ItPnN0YXJ0KCkgPiAwKSB7CisgICAgICAgIGlmICghc2Vl
a0ZpbGUobV9oYW5kbGUsIGJsb2ItPnN0YXJ0KCksIFNlZWtGcm9tQmVnaW5uaW5nKSkgeworICAg
ICAgICAgICAgbV9jbGllbnQtPmRpZEZhaWwoTk9UX1JFQURBQkxFX0VSUik7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8vIEdldCB0aGUgc2l6
ZS4KKyNpZiBFTkFCTEUoQkxPQl9TTElDRSkKKyAgICBtX3RvdGFsQnl0ZXNUb1JlYWQgPSBibG9i
LT5sZW5ndGgoKTsKKyAgICBpZiAobV90b3RhbEJ5dGVzVG9SZWFkID09IEJsb2I6OnRvRW5kT2ZG
aWxlKQorICAgICAgICBtX3RvdGFsQnl0ZXNUb1JlYWQgPSBibG9iLT5zaXplKCkgLSBibG9iLT5z
dGFydCgpOworI2Vsc2UKKyAgICBtX3RvdGFsID0gYmxvYi0+c2l6ZSgpOworI2VuZGlmCisKKyAg
ICBtX2NsaWVudC0+ZGlkR2V0U2l6ZShtX3RvdGFsQnl0ZXNUb1JlYWQpOwogfQogCiB2b2lkIEZp
bGVTdHJlYW06Om9wZW5Gb3JXcml0ZShjb25zdCBTdHJpbmcmKQpAQCAtNzgsMTQgKzEyNiw0MSBA
QCB2b2lkIEZpbGVTdHJlYW06Om9wZW5Gb3JXcml0ZShjb25zdCBTdHJpbmcmKQogdm9pZCBGaWxl
U3RyZWFtOjpjbG9zZSgpCiB7CiAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0gICAgaWYg
KGlzSGFuZGxlVmFsaWQobV9oYW5kbGUpKQorICAgIGlmIChpc0hhbmRsZVZhbGlkKG1faGFuZGxl
KSkgewogICAgICAgICBjbG9zZUZpbGUobV9oYW5kbGUpOworICAgICAgICBtX2hhbmRsZSA9IGlu
dmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGU7CisgICAgfQogfQogCi12b2lkIEZpbGVTdHJlYW06OnJl
YWQoY2hhciosIGludCkKK3ZvaWQgRmlsZVN0cmVhbTo6cmVhZChjaGFyKiBidWZmZXIsIGludCBs
ZW5ndGgpCiB7CiAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0gICAgLy8gRklYTUU6IHRv
IGJlIGltcGxlbWVudGVkLgorCisgICAgaWYgKCFpc0hhbmRsZVZhbGlkKG1faGFuZGxlKSkgewor
ICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfUkVBREFCTEVfRVJSKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChtX2J5dGVzUHJvY2Vzc2VkID49IG1fdG90YWxCeXRlc1Rv
UmVhZCkgeworICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNoKCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBsb25nIGxvbmcgcmVtYWluaW5nID0gbV90b3RhbEJ5dGVzVG9SZWFkIC0g
bV9ieXRlc1Byb2Nlc3NlZDsKKyAgICBpbnQgYnl0ZXNUb1JlYWQgPSAocmVtYWluaW5nIDwgbGVu
Z3RoKSA/IHN0YXRpY19jYXN0PGludD4ocmVtYWluaW5nKSA6IGxlbmd0aDsKKyAgICBpbnQgYnl0
ZXNSZWFkID0gcmVhZEZyb21GaWxlKG1faGFuZGxlLCBidWZmZXIsIGJ5dGVzVG9SZWFkKTsKKyAg
ICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICBtX2NsaWVudC0+ZGlkRmFpbChOT1RfUkVB
REFCTEVfRVJSKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghYnl0ZXNSZWFk
KSB7CisgICAgICAgIG1fY2xpZW50LT5kaWRGaW5pc2goKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIG1fYnl0ZXNQcm9jZXNzZWQgKz0gYnl0ZXNSZWFkOworICAgIG1fY2xpZW50LT5k
aWRSZWFkKGJ1ZmZlciwgYnl0ZXNSZWFkKTsKIH0KIAogdm9pZCBGaWxlU3RyZWFtOjp3cml0ZShC
bG9iKiwgbG9uZyBsb25nLCBpbnQpCkBAIC0xMDIsNCArMTc3LDQgQEAgdm9pZCBGaWxlU3RyZWFt
Ojp0cnVuY2F0ZShsb25nIGxvbmcpCiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlm
IC8vIEVOQUJMRShGSUxFX1dSSVRFUikgfHwgRU5BQkxFX0ZJTEVfUkVBREVSKQorI2VuZGlmIC8v
IEVOQUJMRShGSUxFX1JFQURFUikgfHwgRU5BQkxFKEZJTEVfV1JJVEVSKQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0uaCBiL1dlYkNvcmUvaHRtbC9GaWxlU3RyZWFtLmgKaW5k
ZXggYmRhOGZjNy4uOWQzZjdiOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9odG1sL0ZpbGVTdHJlYW0u
aAorKysgYi9XZWJDb3JlL2h0bWwvRmlsZVN0cmVhbS5oCkBAIC02Nyw2ICs2Nyw4IEBAIHByaXZh
dGU6CiAKICAgICBGaWxlU3RyZWFtQ2xpZW50KiBtX2NsaWVudDsKICAgICBQbGF0Zm9ybUZpbGVI
YW5kbGUgbV9oYW5kbGU7CisgICAgbG9uZyBsb25nIG1fYnl0ZXNQcm9jZXNzZWQ7CisgICAgbG9u
ZyBsb25nIG1fdG90YWxCeXRlc1RvUmVhZDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="38886"
          type_id="1"
          status="+"
          setter="abarth"
    />
    <flag name="commit-queue"
          id="38887"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
      

    </bug>

</bugzilla>