<?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>226358</bug_id>
          
          <creation_ts>2021-05-27 15:17:51 -0700</creation_ts>
          <short_desc>DelayDSPKernel::process() is slow</short_desc>
          <delta_ts>2021-05-28 17:53:18 -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>Web Audio</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=222098</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>glenn</cc>
    
    <cc>jer.noble</cc>
    
    <cc>peng.liu6</cc>
    
    <cc>philipj</cc>
    
    <cc>sam</cc>
    
    <cc>sergio</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1764533</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-27 15:17:51 -0700</bug_when>
    <thetext>When I profiled the demo at https://jsfiddle.net/KrisJohnson/s5vL24o1/123/, I noticed that 20% of the CPU time was spent under DelayDSPKernel::process().
We should vectorize DelayDSPKernel::process() whenever possible to speed things up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764541</commentid>
    <comment_count>1</comment_count>
      <attachid>429939</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-27 15:29:32 -0700</bug_when>
    <thetext>Created attachment 429939
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764553</commentid>
    <comment_count>2</comment_count>
      <attachid>429943</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-27 15:47:14 -0700</bug_when>
    <thetext>Created attachment 429943
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764605</commentid>
    <comment_count>3</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-27 17:35:49 -0700</bug_when>
    <thetext>This is not really related to the specifics of this change, but for something like this, why are we writing our own kernels rather than trying to utilize something like an existing audio unit effect unit (e.g. kAudioUnitSubType_Delay, kAudioUnitSubType_LowPassFilter, etc.) at least on supported platforms? Do the existing audio units not work here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764622</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-27 18:27:40 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #3)
&gt; This is not really related to the specifics of this change, but for
&gt; something like this, why are we writing our own kernels rather than trying
&gt; to utilize something like an existing audio unit effect unit (e.g.
&gt; kAudioUnitSubType_Delay, kAudioUnitSubType_LowPassFilter, etc.) at least on
&gt; supported platforms? Do the existing audio units not work here?

That&apos;s a good question and I am actually not sure :) I am hacking the WebAudio code but I know very little about our platform&apos;s media libraries.
Jer or Eric may know the answer to that. I don&apos;t think any of the audio code is using such platform functionality in either WebKit or Blink (AFAICT).

There MIGHT also be some restrictions due to this code running in the WebProcess but us talking to CoreAudio in the GPUProcess but I am really not sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764901</commentid>
    <comment_count>5</comment_count>
      <attachid>429943</attachid>
    <who name="Peng Liu">peng.liu6</who>
    <bug_when>2021-05-28 13:14:52 -0700</bug_when>
    <thetext>Comment on attachment 429943
Patch

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

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:39
&gt; +    // The algorithm below depends on this being true because we don&apos;t expect to have to fill the entire buffer more than once.

Do we have any protection for the bad case? Or do we need the protection? :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764902</commentid>
    <comment_count>6</comment_count>
      <attachid>429943</attachid>
    <who name="Peng Liu">peng.liu6</who>
    <bug_when>2021-05-28 13:14:53 -0700</bug_when>
    <thetext>Comment on attachment 429943
Patch

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

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:39
&gt; +    // The algorithm below depends on this being true because we don&apos;t expect to have to fill the entire buffer more than once.

Do we have any protection for the bad case? Or do we need the protection? :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764906</commentid>
    <comment_count>7</comment_count>
      <attachid>429943</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-28 13:26:21 -0700</bug_when>
    <thetext>Comment on attachment 429943
Patch

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

&gt;&gt;&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:39
&gt;&gt;&gt; +    // The algorithm below depends on this being true because we don&apos;t expect to have to fill the entire buffer more than once.
&gt;&gt; 
&gt;&gt; Do we have any protection for the bad case? Or do we need the protection? :-)
&gt; 
&gt; Do we have any protection for the bad case? Or do we need the protection? :-)

The bufferLength is computed using `bufferLengthForDelay(maxDelayTime, sampleRate)`:
```
size_t DelayDSPKernel::bufferLengthForDelay(double maxDelayTime, double sampleRate) const
{
    // Compute the length of the buffer needed to handle a max delay of |maxDelayTime|. Add an additional render quantum frame size so we can
    // vectorize the delay processing. The extra space is needed so that writes to the buffer won&apos;t overlap reads from the buffer.
    return AudioUtilities::renderQuantumSize + AudioUtilities::timeToSampleFrame(maxDelayTime, sampleRate, AudioUtilities::SampleFrameRounding::Up);
}
```

In WebAudio, framesToProcess is never greater than AudioUtilities::renderQuantumSize. Therefore, I believe this is safe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764918</commentid>
    <comment_count>8</comment_count>
      <attachid>429943</attachid>
    <who name="Peng Liu">peng.liu6</who>
    <bug_when>2021-05-28 14:11:15 -0700</bug_when>
    <thetext>Comment on attachment 429943
Patch

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

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:128
&gt; +        float interpolationFactor = readPosition - readIndex1;

Just curious, is there accuracy concern here? The same to other changes from &quot;double&quot; to &quot;float&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764921</commentid>
    <comment_count>9</comment_count>
      <attachid>429943</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-28 14:12:39 -0700</bug_when>
    <thetext>Comment on attachment 429943
Patch

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

&gt;&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:128
&gt;&gt; +        float interpolationFactor = readPosition - readIndex1;
&gt; 
&gt; Just curious, is there accuracy concern here? The same to other changes from &quot;double&quot; to &quot;float&quot;.

I am not too worried since Blink is also using float here. Using float results in faster arithmetic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764955</commentid>
    <comment_count>10</comment_count>
      <attachid>429943</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-28 15:07:47 -0700</bug_when>
    <thetext>Comment on attachment 429943
Patch

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

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:40
&gt; +    ASSERT(bufferLength &gt;= framesToProcess);

I’m sure this is indeed safe. But Wwe could also just use std::clamp, std::min, or std::max to be robust against this mistake instead o asserting.

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:44
&gt; +    float* writePointer = &amp;buffer[writeIndex];

auto?

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:45
&gt; +    int remainder = bufferLength - writeIndex;

If we want a signed type so make the negative number part work, maybe ptrdiff_t would be a better choice.

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:48
&gt; +    memcpy(writePointer, source, sizeof(float) * std::min(static_cast&lt;int&gt;(framesToProcess), remainder));

Might be better to use ptrdiff_t than int here.

I think that sizeof(*writePointer) would be even better than sizeof(float). Could even create template function that guarantees this is done right, like a memcpy that takes a number of items to copy instead of a number of bytes, and does the multiplication with overflow checking done carefully.

This relies on framesToProcess/reminder not being huge numbers that would overflow an int when multiplied by 4. That’s probably not a risk, but did you think about where that overflow guarantee comes from?

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:49
&gt; +    memcpy(buffer, source + remainder, sizeof(float) * std::max(0, static_cast&lt;int&gt;(framesToProcess) - remainder));

Same issues.

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:97
&gt; +    if (UNLIKELY(!m_buffer.size() || !source || !destination))

isEmpty better than calling size?

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:110
&gt; +    int bufferLength = m_buffer.size();

Seems like a bad patten to use int for sizes. I’d like to see auto here to guarantee I am not chopping a bigger size down to a smaller one, or size_t because that’s a natural for a size.

&gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:141
&gt; +    int bufferLength = m_buffer.size();

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764965</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-28 15:29:55 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #10)
&gt; Comment on attachment 429943 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=429943&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:40
&gt; &gt; +    ASSERT(bufferLength &gt;= framesToProcess);
&gt; 
&gt; I’m sure this is indeed safe. But Wwe could also just use std::clamp,
&gt; std::min, or std::max to be robust against this mistake instead o asserting.
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:44
&gt; &gt; +    float* writePointer = &amp;buffer[writeIndex];
&gt; 
&gt; auto?
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:45
&gt; &gt; +    int remainder = bufferLength - writeIndex;
&gt; 
&gt; If we want a signed type so make the negative number part work, maybe
&gt; ptrdiff_t would be a better choice.
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:48
&gt; &gt; +    memcpy(writePointer, source, sizeof(float) * std::min(static_cast&lt;int&gt;(framesToProcess), remainder));
&gt; 
&gt; Might be better to use ptrdiff_t than int here.
&gt; 
&gt; I think that sizeof(*writePointer) would be even better than sizeof(float).
&gt; Could even create template function that guarantees this is done right, like
&gt; a memcpy that takes a number of items to copy instead of a number of bytes,
&gt; and does the multiplication with overflow checking done carefully.
&gt; 
&gt; This relies on framesToProcess/reminder not being huge numbers that would
&gt; overflow an int when multiplied by 4. That’s probably not a risk, but did
&gt; you think about where that overflow guarantee comes from?
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:49
&gt; &gt; +    memcpy(buffer, source + remainder, sizeof(float) * std::max(0, static_cast&lt;int&gt;(framesToProcess) - remainder));
&gt; 
&gt; Same issues.
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:97
&gt; &gt; +    if (UNLIKELY(!m_buffer.size() || !source || !destination))
&gt; 
&gt; isEmpty better than calling size?

OK, but then I am going to have to add a isEmpty() function to AudioArray :)

&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:110
&gt; &gt; +    int bufferLength = m_buffer.size();
&gt; 
&gt; Seems like a bad patten to use int for sizes. I’d like to see auto here to
&gt; guarantee I am not chopping a bigger size down to a smaller one, or size_t
&gt; because that’s a natural for a size.
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp:141
&gt; &gt; +    int bufferLength = m_buffer.size();
&gt; 
&gt; Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764976</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-28 15:49:26 -0700</bug_when>
    <thetext>FYI, we are not dealing with large numbers here because frameToProcess is always 128 (per WebAudio spec) and we have a cap on the delay at 180, as well as the sample rate (384000).

BufferLength is computed like so:
size_t DelayDSPKernel::bufferLengthForDelay(double maxDelayTime, double sampleRate) const
{
    // Compute the length of the buffer needed to handle a max delay of |maxDelayTime|. Add an additional render quantum frame size so we can
    // vectorize the delay processing. The extra space is needed so that writes to the buffer won&apos;t overlap reads from the buffer.
    return AudioUtilities::renderQuantumSize + AudioUtilities::timeToSampleFrame(maxDelayTime, sampleRate, AudioUtilities::SampleFrameRounding::Up);
}

maxDelayTime cannot be larger than 180. sampleRate cannot be larger than 384000 and AudioUtilities::renderQuantumSize is 128.

So the BufferLength cannot be larger than:
`128 + timeToSampleFrame(128, 384000, AudioUtilities::SampleFrameRounding::Up)`

timeToSampleFrame() would end up being:
```
constexpr double oversampleFactor = 1024;
double frame = std::ceil(std::round(time * sampleRate * oversampleFactor) / oversampleFactor);
```

So value returned by timeToSampleFrame() would be 49152000.

So max buffer length would be 49152000 + 128 = 49152128. INT_MAX on 32 bit would be 2147483647.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764989</commentid>
    <comment_count>13</comment_count>
      <attachid>430070</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-28 16:26:46 -0700</bug_when>
    <thetext>Created attachment 430070
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1764990</commentid>
    <comment_count>14</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-28 16:27:25 -0700</bug_when>
    <thetext>All sounds great. All those maximums and guarantees are so far away from this code. Reading this one function it’s really hard to know this is all safe. But I accept your explanation that this is not risky and overflow is far from possibility and don’t mind if we leave it like this.

Unless there is some way to make it easier to see it’s all safe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1765001</commentid>
    <comment_count>15</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-28 16:34:27 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #14)
&gt; All sounds great. All those maximums and guarantees are so far away from
&gt; this code. Reading this one function it’s really hard to know this is all
&gt; safe. But I accept your explanation that this is not risky and overflow is
&gt; far from possibility and don’t mind if we leave it like this.
&gt; 
&gt; Unless there is some way to make it easier to see it’s all safe.

I use size_t consistently in my latest iteration and introduce a very simple function that returns `a &lt;= b ? 0 : (a - b)` to make sure I end up with positive values (instead of ptrdiff_t / int + std::max(0, result).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1765007</commentid>
    <comment_count>16</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2021-05-28 16:43:52 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #15)
&gt; introduce a very simple
&gt; function that returns `a &lt;= b ? 0 : (a - b)` to make sure I end up with
&gt; positive values (instead of ptrdiff_t / int + std::max(0, result).

Sounds like a function that we would put into SaturatedArithmetic.h.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1765041</commentid>
    <comment_count>17</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-05-28 17:52:32 -0700</bug_when>
    <thetext>Committed r278231 (238268@main): &lt;https://commits.webkit.org/238268@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 430070.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1765042</commentid>
    <comment_count>18</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-05-28 17:53:18 -0700</bug_when>
    <thetext>&lt;rdar://problem/78638796&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>429939</attachid>
            <date>2021-05-27 15:29:32 -0700</date>
            <delta_ts>2021-05-27 15:47:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-226358-20210527152932.patch</filename>
            <type>text/plain</type>
            <size>20699</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc4MTcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDY5MzI0MWM3MTViNTI5
ZjhkY2Q5NTVlNTc1YmEyMzZiODU5MjQwYi4uMzY2YjExNGNkODVjNDEyOGQ1Y2Y3NGM1MWJkYWFj
YTRlNDc1ODUxMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQyIEBACisyMDIxLTA1LTI3ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgRGVsYXlEU1BLZXJuZWw6OnBy
b2Nlc3MoKSBpcyBzbG93CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0yMjYzNTgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBXaGVuIEkgcHJvZmlsZWQgdGhlIGRlbW8gYXQgaHR0cHM6Ly9qc2ZpZGRsZS5uZXQv
S3Jpc0pvaG5zb24vczV2TDI0bzEvMTIzLyAoaW4gdGhlIGNvbnRleHQgb2YgQnVnIDIyMjA5OCks
CisgICAgICAgIEkgbm90aWNlZCB0aGF0IDIwJSBvZiB0aGUgQ1BVIHRpbWUgd2FzIHNwZW50IHVu
ZGVyIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzKCkuCisKKyAgICAgICAgVG8gaW1wcm92ZSB0aGlz
LCB3ZSBub3cgdmVjdG9yaXplIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzKCkgaW4gdGhlIGNvbW1v
biBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIGF1dG9tYXRpb24KKyAgICAgICAgYW5kIHRoZSBkZWxh
eSB0aW1lIGlzIGNvbnN0YW50LgorCisgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5
IHNpbWlsYXIgdG8gdGhlIG9uZSBpbiBCbGluazoKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5j
b20vY2hyb21pdW0vY2hyb21pdW0vYmxvYi9tYXN0ZXIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVy
ZXIvcGxhdGZvcm0vYXVkaW8vYXVkaW9fZGVsYXlfZHNwX2tlcm5lbC5jYworCisgICAgICAgIFNv
bWUgZGlmZmVyZW5jZXMgY29tcGFyZWQgdG8gdGhlIEJsaW5rIGltcGxlbWVudGF0aW9uOgorICAg
ICAgICAtIEkgZGlkIG5vdCB2ZWN0b3JpemUgdGhlIEEtcmF0ZSBjYXNlIGZvciBzaW1wbGljaXR5
LiBJdCBpcyBub3QgYXMgY29tbW9uIGFuZCBpdCBpcyBtb3JlIGNvbXBsaWNhdGVkLgorICAgICAg
ICAgIFdlIG1heSBjb25zaWRlciBkb2luZyB0aGlzIGluIHRoZSBmdXR1cmUgaWYgcmVhbGx5IG5l
ZWRlZC4KKyAgICAgICAgLSBPbiBDb2NvYSwgd2UgbGV2ZWFnZSBBY2NlbGVyYXRlJ3MgdkRTUF92
aW50YigpIHRvIGRvIHRoZSBpbnRlcnBvbGF0aW9uIGluc3RlYWQgb2YgZG9pbmcgMiBzZXBhcmF0
ZQorICAgICAgICAgIG9wZXJhdGlvbnMuCisKKyAgICAgICAgVGhpcyBkb2Vzbid0IGZpeCBCdWcg
MjIyMDk4IGJ1dCBpdCBkb2VzIGltcHJvdmUgdGhlIHNpdHVhdGlvbiBxdWl0ZSBhIGJpdC4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMsIG5vIFdlYi1mYWNpbmcgYmVoYXZpb3IgY2hhbmdlLCBqdXN0
IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLgorCisgICAgICAgICogTW9kdWxlcy93ZWJhdWRp
by9EZWxheURTUEtlcm5lbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpjb3B5VG9DaXJjdWxhckJ1
ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpEZWxheURTUEtlcm5lbDo6RGVsYXlEU1BLZXJuZWwp
OgorICAgICAgICAoV2ViQ29yZTo6RGVsYXlEU1BLZXJuZWw6OmJ1ZmZlckxlbmd0aEZvckRlbGF5
IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkRlbGF5RFNQS2VybmVsOjpwcm9jZXNzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRlbGF5RFNQS2VybmVsOjpwcm9jZXNzQVJhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6RGVsYXlEU1BLZXJuZWw6OnByb2Nlc3NLUmF0ZSk6CisgICAgICAgICogTW9kdWxl
cy93ZWJhdWRpby9EZWxheURTUEtlcm5lbC5oOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1Zl
Y3Rvck1hdGguY3BwOgorICAgICAgICAoV2ViQ29yZTo6VmVjdG9yTWF0aDo6c3Vic3RyYWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OlZlY3Rvck1hdGg6OmludGVycG9sYXRlKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmg6CisKIDIwMjEtMDUtMjcgIFNpbW9uIEZyYXNlciAg
PHNpbW9uLmZyYXNlckBhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIGFuaW1hdGlvbnMgdG8gR3Jh
cGhpY3NMYXllciBsb2dnaW5nIG91dHB1dApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9k
dWxlcy93ZWJhdWRpby9EZWxheURTUEtlcm5lbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmNwcAppbmRleCA4OTRkZTBhZmYwOGY2YWViOGIwYWRl
NTlhNWM2NWM2ZTQ3ZGU2OTlhLi41ZTg0OWZiNDY1MDkyYTVlOTA4N2Q5MTA5YjkzYWZhMTY1NTM0
M2I3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0RlbGF5RFNQ
S2VybmVsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0RlbGF5RFNQ
S2VybmVsLmNwcApAQCAtMjksMTMgKzI5LDMwIEBACiAjaW5jbHVkZSAiRGVsYXlEU1BLZXJuZWwu
aCIKIAogI2luY2x1ZGUgIkF1ZGlvVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiVmVjdG9yTWF0aC5o
IgogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitzdGF0aWMg
dm9pZCBjb3B5VG9DaXJjdWxhckJ1ZmZlcihmbG9hdCogYnVmZmVyLCBpbnQgd3JpdGVJbmRleCwg
c2l6ZV90IGJ1ZmZlckxlbmd0aCwgY29uc3QgZmxvYXQqIHNvdXJjZSwgc2l6ZV90IGZyYW1lc1Rv
UHJvY2VzcykKK3sKKyAgICAvLyBUaGUgYWxnb3JpdGhtIGJlbG93IGRlcGVuZHMgb24gdGhpcyBi
ZWluZyB0cnVlIGJlY2F1c2Ugd2UgZG9uJ3QgZXhwZWN0IHRvIGhhdmUgdG8gZmlsbCB0aGUgZW50
aXJlIGJ1ZmZlciBtb3JlIHRoYW4gb25jZS4KKyAgICBBU1NFUlQoYnVmZmVyTGVuZ3RoID49IGZy
YW1lc1RvUHJvY2Vzcyk7CisKKyAgICAvLyBDb3B5IHxmcmFtZXNUb1Byb2Nlc3N8IHZhbHVlcyBm
cm9tIHxzb3VyY2V8IHRvIHRoZSBjaXJjdWxhciBidWZmZXIgdGhhdCBzdGFydHMgYXQgfGJ1ZmZl
cnwgb2YgbGVuZ3RoIHxidWZmZXJMZW5ndGh8LiBUaGUKKyAgICAvLyBjb3B5IHN0YXJ0cyBhdCBp
bmRleCB8d3JpdGVJbmRleHwgaW50byB0aGUgYnVmZmVyLgorICAgIGZsb2F0KiB3cml0ZVBvaW50
ZXIgPSAmYnVmZmVyW3dyaXRlSW5kZXhdOworICAgIGludCByZW1haW5kZXIgPSBidWZmZXJMZW5n
dGggLSB3cml0ZUluZGV4OworCisgICAgLy8gQ29weSB0aGUgZnJhbWVzIG92ZXIsIGNhcmVmdWxs
eSBoYW5kbGluZyB0aGUgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvIHdyYXAgYXJvdW5kIHRvIHRoZSBi
ZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KKyAgICBtZW1jcHkod3JpdGVQb2ludGVyLCBzb3VyY2Us
IHNpemVvZihmbG9hdCkgKiBzdGQ6Om1pbihzdGF0aWNfY2FzdDxpbnQ+KGZyYW1lc1RvUHJvY2Vz
cyksIHJlbWFpbmRlcikpOworICAgIG1lbWNweShidWZmZXIsIHNvdXJjZSArIHJlbWFpbmRlciwg
c2l6ZW9mKGZsb2F0KSAqIHN0ZDo6bWF4KDAsIHN0YXRpY19jYXN0PGludD4oZnJhbWVzVG9Qcm9j
ZXNzKSAtIHJlbWFpbmRlcikpOworfQorCiBEZWxheURTUEtlcm5lbDo6RGVsYXlEU1BLZXJuZWwo
RGVsYXlQcm9jZXNzb3IqIHByb2Nlc3NvcikKICAgICA6IEF1ZGlvRFNQS2VybmVsKHByb2Nlc3Nv
cikKICAgICAsIG1fZGVsYXlUaW1lcyhBdWRpb1V0aWxpdGllczo6cmVuZGVyUXVhbnR1bVNpemUp
CisgICAgLCBtX3RlbXBCdWZmZXIoQXVkaW9VdGlsaXRpZXM6OnJlbmRlclF1YW50dW1TaXplKQog
ewogICAgIEFTU0VSVChwcm9jZXNzb3IgJiYgcHJvY2Vzc29yLT5zYW1wbGVSYXRlKCkgPiAwKTsK
ICAgICBpZiAoIShwcm9jZXNzb3IgJiYgcHJvY2Vzc29yLT5zYW1wbGVSYXRlKCkgPiAwKSkKQEAg
LTUyLDYgKzY5LDcgQEAgRGVsYXlEU1BLZXJuZWw6OkRlbGF5RFNQS2VybmVsKERlbGF5UHJvY2Vz
c29yKiBwcm9jZXNzb3IpCiBEZWxheURTUEtlcm5lbDo6RGVsYXlEU1BLZXJuZWwoZG91YmxlIG1h
eERlbGF5VGltZSwgZmxvYXQgc2FtcGxlUmF0ZSkKICAgICA6IEF1ZGlvRFNQS2VybmVsKHNhbXBs
ZVJhdGUpCiAgICAgLCBtX21heERlbGF5VGltZShtYXhEZWxheVRpbWUpCisgICAgLCBtX3RlbXBC
dWZmZXIoQXVkaW9VdGlsaXRpZXM6OnJlbmRlclF1YW50dW1TaXplKQogewogICAgIEFTU0VSVCht
YXhEZWxheVRpbWUgPiAwLjApOwogICAgIGlmIChtYXhEZWxheVRpbWUgPD0gMC4wKQpAQCAtNjcs
NDcgKzg1LDM4IEBAIERlbGF5RFNQS2VybmVsOjpEZWxheURTUEtlcm5lbChkb3VibGUgbWF4RGVs
YXlUaW1lLCBmbG9hdCBzYW1wbGVSYXRlKQogCiBzaXplX3QgRGVsYXlEU1BLZXJuZWw6OmJ1ZmZl
ckxlbmd0aEZvckRlbGF5KGRvdWJsZSBtYXhEZWxheVRpbWUsIGRvdWJsZSBzYW1wbGVSYXRlKSBj
b25zdAogewotICAgIC8vIENvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIG5lZWRlZCB0
byBoYW5kbGUgYSBtYXggZGVsYXkgb2YgfG1heERlbGF5VGltZXwuIE9uZSBpcwotICAgIC8vIGFk
ZGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYWN0dWFsIGRlbGF5IGVxdWFscyB0aGUg
bWF4aW11bSBkZWxheS4KLSAgICByZXR1cm4gMSArIEF1ZGlvVXRpbGl0aWVzOjp0aW1lVG9TYW1w
bGVGcmFtZShtYXhEZWxheVRpbWUsIHNhbXBsZVJhdGUsIEF1ZGlvVXRpbGl0aWVzOjpTYW1wbGVG
cmFtZVJvdW5kaW5nOjpVcCk7CisgICAgLy8gQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZm
ZXIgbmVlZGVkIHRvIGhhbmRsZSBhIG1heCBkZWxheSBvZiB8bWF4RGVsYXlUaW1lfC4gQWRkIGFu
IGFkZGl0aW9uYWwgcmVuZGVyIHF1YW50dW0gZnJhbWUgc2l6ZSBzbyB3ZSBjYW4KKyAgICAvLyB2
ZWN0b3JpemUgdGhlIGRlbGF5IHByb2Nlc3NpbmcuIFRoZSBleHRyYSBzcGFjZSBpcyBuZWVkZWQg
c28gdGhhdCB3cml0ZXMgdG8gdGhlIGJ1ZmZlciB3b24ndCBvdmVybGFwIHJlYWRzIGZyb20gdGhl
IGJ1ZmZlci4KKyAgICByZXR1cm4gQXVkaW9VdGlsaXRpZXM6OnJlbmRlclF1YW50dW1TaXplICsg
QXVkaW9VdGlsaXRpZXM6OnRpbWVUb1NhbXBsZUZyYW1lKG1heERlbGF5VGltZSwgc2FtcGxlUmF0
ZSwgQXVkaW9VdGlsaXRpZXM6OlNhbXBsZUZyYW1lUm91bmRpbmc6OlVwKTsKIH0KIAogdm9pZCBE
ZWxheURTUEtlcm5lbDo6cHJvY2Vzcyhjb25zdCBmbG9hdCogc291cmNlLCBmbG9hdCogZGVzdGlu
YXRpb24sIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCiB7Ci0gICAgc2l6ZV90IGJ1ZmZlckxlbmd0
aCA9IG1fYnVmZmVyLnNpemUoKTsKLSAgICBmbG9hdCogYnVmZmVyID0gbV9idWZmZXIuZGF0YSgp
OwotCi0gICAgQVNTRVJUKGJ1ZmZlckxlbmd0aCk7Ci0gICAgaWYgKCFidWZmZXJMZW5ndGgpCi0g
ICAgICAgIHJldHVybjsKLQorICAgIEFTU0VSVChtX2J1ZmZlci5zaXplKCkpOwogICAgIEFTU0VS
VChzb3VyY2UgJiYgZGVzdGluYXRpb24pOwotICAgIGlmICghc291cmNlIHx8ICFkZXN0aW5hdGlv
bikKKyAgICBpZiAoVU5MSUtFTFkoIW1fYnVmZmVyLnNpemUoKSB8fCAhc291cmNlIHx8ICFkZXN0
aW5hdGlvbikpCiAgICAgICAgIHJldHVybjsKIAotICAgIGZsb2F0IHNhbXBsZVJhdGUgPSB0aGlz
LT5zYW1wbGVSYXRlKCk7Ci0gICAgZG91YmxlIGRlbGF5VGltZSA9IDA7Ci0gICAgZmxvYXQqIGRl
bGF5VGltZXMgPSBtX2RlbGF5VGltZXMuZGF0YSgpOwotICAgIGRvdWJsZSBtYXhUaW1lID0gbWF4
RGVsYXlUaW1lKCk7Ci0KICAgICBib29sIHNhbXBsZUFjY3VyYXRlID0gZGVsYXlQcm9jZXNzb3Io
KSAmJiBkZWxheVByb2Nlc3NvcigpLT5kZWxheVRpbWUoKS5oYXNTYW1wbGVBY2N1cmF0ZVZhbHVl
cygpOwogICAgIGJvb2wgc2hvdWxkVXNlQVJhdGUgPSBkZWxheVByb2Nlc3NvcigpICYmIGRlbGF5
UHJvY2Vzc29yKCktPmRlbGF5VGltZSgpLmF1dG9tYXRpb25SYXRlKCkgPT0gQXV0b21hdGlvblJh
dGU6OkFSYXRlOwotCiAgICAgaWYgKHNhbXBsZUFjY3VyYXRlICYmIHNob3VsZFVzZUFSYXRlKQot
ICAgICAgICBkZWxheVByb2Nlc3NvcigpLT5kZWxheVRpbWUoKS5jYWxjdWxhdGVTYW1wbGVBY2N1
cmF0ZVZhbHVlcyhkZWxheVRpbWVzLCBmcmFtZXNUb1Byb2Nlc3MpOwotICAgIGVsc2UgewotICAg
ICAgICBkZWxheVRpbWUgPSBkZWxheVByb2Nlc3NvcigpID8gZGVsYXlQcm9jZXNzb3IoKS0+ZGVs
YXlUaW1lKCkuZmluYWxWYWx1ZSgpIDogbV9kZXNpcmVkRGVsYXlGcmFtZXMgLyBzYW1wbGVSYXRl
OwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRlbGF5IHRpbWUgaXMgaW4gYSB2YWxpZCByYW5n
ZS4KLSAgICAgICAgZGVsYXlUaW1lID0gc3RkOjpjbGFtcChkZWxheVRpbWUsIDAuMCwgbWF4VGlt
ZSk7Ci0gICAgfQorICAgICAgICBwcm9jZXNzQVJhdGUoc291cmNlLCBkZXN0aW5hdGlvbiwgZnJh
bWVzVG9Qcm9jZXNzKTsKKyAgICBlbHNlCisgICAgICAgIHByb2Nlc3NLUmF0ZShzb3VyY2UsIGRl
c3RpbmF0aW9uLCBmcmFtZXNUb1Byb2Nlc3MpOworfQogCi0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGZyYW1lc1RvUHJvY2VzczsgKytpKSB7Ci0gICAgICAgIGlmIChzYW1wbGVBY2N1cmF0
ZSAmJiBzaG91bGRVc2VBUmF0ZSkgewotICAgICAgICAgICAgZGVsYXlUaW1lID0gZGVsYXlUaW1l
c1tpXTsKLSAgICAgICAgICAgIGRlbGF5VGltZSA9IHN0ZDo6Y2xhbXAoZGVsYXlUaW1lLCAwLjAs
IG1heFRpbWUpOwotICAgICAgICB9Cit2b2lkIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzQVJhdGUo
Y29uc3QgZmxvYXQqIHNvdXJjZSwgZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgZnJhbWVzVG9Q
cm9jZXNzKQoreworICAgIGludCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAg
ZmxvYXQqIGJ1ZmZlciA9IG1fYnVmZmVyLmRhdGEoKTsKKworICAgIGRlbGF5UHJvY2Vzc29yKCkt
PmRlbGF5VGltZSgpLmNhbGN1bGF0ZVNhbXBsZUFjY3VyYXRlVmFsdWVzKG1fZGVsYXlUaW1lcy5k
YXRhKCksIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICBjb3B5VG9DaXJjdWxhckJ1ZmZlcihidWZm
ZXIsIG1fd3JpdGVJbmRleCwgYnVmZmVyTGVuZ3RoLCBzb3VyY2UsIGZyYW1lc1RvUHJvY2Vzcyk7
CiAKLSAgICAgICAgZG91YmxlIGRlc2lyZWREZWxheUZyYW1lcyA9IGRlbGF5VGltZSAqIHNhbXBs
ZVJhdGU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZyYW1lc1RvUHJvY2VzczsgKytp
KSB7CisgICAgICAgIGRvdWJsZSBkZWxheVRpbWUgPSBzdGQ6OmNsYW1wPGRvdWJsZT4obV9kZWxh
eVRpbWVzW2ldLCAwLjAsIG1heERlbGF5VGltZSgpKTsKKyAgICAgICAgZG91YmxlIGRlc2lyZWRE
ZWxheUZyYW1lcyA9IGRlbGF5VGltZSAqIHNhbXBsZVJhdGUoKTsKIAogICAgICAgICBkb3VibGUg
cmVhZFBvc2l0aW9uID0gbV93cml0ZUluZGV4ICsgYnVmZmVyTGVuZ3RoIC0gZGVzaXJlZERlbGF5
RnJhbWVzOwogICAgICAgICBpZiAocmVhZFBvc2l0aW9uID49IGJ1ZmZlckxlbmd0aCkKQEAgLTEx
NiwxOSArMTI1LDc0IEBAIHZvaWQgRGVsYXlEU1BLZXJuZWw6OnByb2Nlc3MoY29uc3QgZmxvYXQq
IHNvdXJjZSwgZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgZnJhCiAgICAgICAgIC8vIExpbmVh
cmx5IGludGVycG9sYXRlIGluLWJldHdlZW4gZGVsYXkgdGltZXMuCiAgICAgICAgIGludCByZWFk
SW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihyZWFkUG9zaXRpb24pOwogICAgICAgICBpbnQgcmVh
ZEluZGV4MiA9IChyZWFkSW5kZXgxICsgMSkgJSBidWZmZXJMZW5ndGg7Ci0gICAgICAgIGRvdWJs
ZSBpbnRlcnBvbGF0aW9uRmFjdG9yID0gcmVhZFBvc2l0aW9uIC0gcmVhZEluZGV4MTsKKyAgICAg
ICAgZmxvYXQgaW50ZXJwb2xhdGlvbkZhY3RvciA9IHJlYWRQb3NpdGlvbiAtIHJlYWRJbmRleDE7
CiAKLSAgICAgICAgZG91YmxlIGlucHV0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KCpzb3VyY2UrKyk7
Ci0gICAgICAgIGJ1ZmZlclttX3dyaXRlSW5kZXhdID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlucHV0
KTsKICAgICAgICAgbV93cml0ZUluZGV4ID0gKG1fd3JpdGVJbmRleCArIDEpICUgYnVmZmVyTGVu
Z3RoOwogCi0gICAgICAgIGRvdWJsZSBzYW1wbGUxID0gYnVmZmVyW3JlYWRJbmRleDFdOwotICAg
ICAgICBkb3VibGUgc2FtcGxlMiA9IGJ1ZmZlcltyZWFkSW5kZXgyXTsKKyAgICAgICAgZmxvYXQg
c2FtcGxlMSA9IGJ1ZmZlcltyZWFkSW5kZXgxXTsKKyAgICAgICAgZmxvYXQgc2FtcGxlMiA9IGJ1
ZmZlcltyZWFkSW5kZXgyXTsKKyAgICAgICAgZGVzdGluYXRpb25baV0gPSBzYW1wbGUxICsgaW50
ZXJwb2xhdGlvbkZhY3RvciAqIChzYW1wbGUyIC0gc2FtcGxlMSk7CisgICAgfQorfQogCi0gICAg
ICAgIGRvdWJsZSBvdXRwdXQgPSAoMS4wIC0gaW50ZXJwb2xhdGlvbkZhY3RvcikgKiBzYW1wbGUx
ICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIHNhbXBsZTI7CisvLyBPcHRpbWl6ZWQgdmVyc2lvbiBv
ZiBwcm9jZXNzQVJhdGUoKSB3aGVuIHRoZSBkZWxheVRpbWUgaXMgY29uc3RhbnQuCit2b2lkIERl
bGF5RFNQS2VybmVsOjpwcm9jZXNzS1JhdGUoY29uc3QgZmxvYXQqIHNvdXJjZSwgZmxvYXQqIGRl
c3RpbmF0aW9uLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIGludCBidWZmZXJMZW5n
dGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAgZmxvYXQqIGJ1ZmZlciA9IG1fYnVmZmVyLmRhdGEo
KTsKIAotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHN0YXRpY19jYXN0PGZsb2F0PihvdXRwdXQp
OwotICAgIH0KKyAgICBkb3VibGUgZGVsYXlUaW1lID0gZGVsYXlQcm9jZXNzb3IoKSA/IGRlbGF5
UHJvY2Vzc29yKCktPmRlbGF5VGltZSgpLmZpbmFsVmFsdWUoKSA6IG1fZGVzaXJlZERlbGF5RnJh
bWVzIC8gc2FtcGxlUmF0ZSgpOworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVsYXkgdGltZSBpcyBp
biBhIHZhbGlkIHJhbmdlLgorICAgIGRlbGF5VGltZSA9IHN0ZDo6Y2xhbXAoZGVsYXlUaW1lLCAw
LjAsIG1heERlbGF5VGltZSgpKTsKKyAgICBkb3VibGUgZGVzaXJlZERlbGF5RnJhbWVzID0gZGVs
YXlUaW1lICogc2FtcGxlUmF0ZSgpOworCisgICAgZG91YmxlIHJlYWRQb3NpdGlvbiA9IG1fd3Jp
dGVJbmRleCArIGJ1ZmZlckxlbmd0aCAtIGRlc2lyZWREZWxheUZyYW1lczsKKyAgICBpZiAocmVh
ZFBvc2l0aW9uID49IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgcmVhZFBvc2l0aW9uIC09IGJ1ZmZl
ckxlbmd0aDsKKworICAgIC8vIExpbmVhcmx5IGludGVycG9sYXRlIGluLWJldHdlZW4gZGVsYXkg
dGltZXMuIHxyZWFkSW5kZXgxfCBhbmQgfHJlYWRJbmRleDJ8IGFyZSB0aGUgaW5kaWNlcyBvZiB0
aGUgZnJhbWVzIHRvIGJlIHVzZWQKKyAgICAvLyBmb3IgaW50ZXJwb2xhdGlvbi4KKyAgICBpbnQg
cmVhZEluZGV4MSA9IHN0YXRpY19jYXN0PGludD4ocmVhZFBvc2l0aW9uKTsKKyAgICBmbG9hdCBp
bnRlcnBvbGF0aW9uRmFjdG9yID0gcmVhZFBvc2l0aW9uIC0gcmVhZEluZGV4MTsKKyAgICBmbG9h
dCogYnVmZmVyRW5kID0gJmJ1ZmZlcltidWZmZXJMZW5ndGhdOworICAgIEFTU0VSVChzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4oYnVmZmVyTGVuZ3RoKSA+PSBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAg
Ly8gc2FtcGxlMSBhbmQgc2FtcGxlMiBob2xkIHRoZSBjdXJyZW50IGFuZCBuZXh0IHNhbXBsZXMg
aW4gdGhlIGJ1ZmZlci4gVGhlc2UgYXJlIHVzZWQgZm9yIGludGVyb3BsYXRpbmcgdGhlIGRlbGF5
IHZhbHVlLgorICAgIC8vIFRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UgYW5kIGFuIGV4dHJhIG1lbWNw
eSwgc2FtcGxlMSBjYW4gYmUgdGhlIHNhbWUgYXMgZGVzdGluYXRpb24uCisgICAgLy8gVmVjdG9y
TWF0aDo6aW50ZXJwb2xhdGUoKSBiZWxvdyBoYXMgYW4gb3B0aW1pemF0aW9uIGluIHRoZSBjYXNl
IHdoZXJlIHRoZSBpbnB1dCBidWZmZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBvbmUuCisg
ICAgZmxvYXQqIHNhbXBsZTEgPSBkZXN0aW5hdGlvbjsKKworICAgIC8vIENvcHkgZGF0YSBmcm9t
IHRoZSBzb3VyY2UgaW50byB0aGUgYnVmZmVyLCBzdGFydGluZyBhdCB0aGUgd3JpdGUgaW5kZXgu
IFRoZSBidWZmZXIgaXMgY2lyY3VsYXIsIHNvIGNhcmVmdWxseSBoYW5kbGUKKyAgICAvLyB0aGUg
d3JhcHBpbmcgb2YgdGhlIHdyaXRlIHBvaW50ZXIuCisgICAgY29weVRvQ2lyY3VsYXJCdWZmZXIo
YnVmZmVyLCBtX3dyaXRlSW5kZXgsIGJ1ZmZlckxlbmd0aCwgc291cmNlLCBmcmFtZXNUb1Byb2Nl
c3MpOworICAgIG1fd3JpdGVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgaWYgKG1fd3Jp
dGVJbmRleCA+PSBidWZmZXJMZW5ndGgpCisgICAgICAgIG1fd3JpdGVJbmRleCAtPSBidWZmZXJM
ZW5ndGg7CisKKyAgICAvLyBOb3cgY29weSBvdXQgdGhlIHNhbXBsZXMgZnJvbSB0aGUgYnVmZmVy
LCBzdGFydGluZyBhdCB0aGUgcmVhZCBwb2ludGVyLCBjYXJlZnVsbHkgaGFuZGxpbmcgd3JhcHBp
bmcgb2YgdGhlIHJlYWQgcG9pbnRlci4KKyAgICBmbG9hdCogcmVhZFBvaW50ZXIgPSAmYnVmZmVy
W3JlYWRJbmRleDFdOworCisgICAgaW50IHJlbWFpbmRlciA9IGJ1ZmZlckVuZCAtIHJlYWRQb2lu
dGVyOworICAgIG1lbWNweShzYW1wbGUxLCByZWFkUG9pbnRlciwgc2l6ZW9mKCpzYW1wbGUxKSAq
IHN0ZDo6bWluKHN0YXRpY19jYXN0PGludD4oZnJhbWVzVG9Qcm9jZXNzKSwgcmVtYWluZGVyKSk7
CisgICAgbWVtY3B5KHNhbXBsZTEgKyByZW1haW5kZXIsIGJ1ZmZlciwgc2l6ZW9mKCpzYW1wbGUx
KSAqIHN0ZDo6bWF4KDAsIHN0YXRpY19jYXN0PGludD4oZnJhbWVzVG9Qcm9jZXNzKSAtIHJlbWFp
bmRlcikpOworCisgICAgLy8gSWYgaW50ZXJwb2xhdGlvbkZhY3RvciBpcyAwLCB3ZSBkb24ndCBu
ZWVkIHRvIGRvIGFueSBpbnRlcnBvbGF0aW9uIGFuZCBzYW1wbGUxIGNvbnRhaW5zIHRoZSBkZXNp
cmVkIHZhbHVlcy4KKyAgICBpZiAoIWludGVycG9sYXRpb25GYWN0b3IpCisgICAgICAgIHJldHVy
bjsKKworICAgIEFTU0VSVChmcmFtZXNUb1Byb2Nlc3MgPD0gbV90ZW1wQnVmZmVyLnNpemUoKSk7
CisKKyAgICBpbnQgcmVhZEluZGV4MiA9IChyZWFkSW5kZXgxICsgMSkgJSBidWZmZXJMZW5ndGg7
CisgICAgZmxvYXQqIHNhbXBsZTIgPSBtX3RlbXBCdWZmZXIuZGF0YSgpOworCisgICAgcmVhZFBv
aW50ZXIgPSAmYnVmZmVyW3JlYWRJbmRleDJdOworICAgIHJlbWFpbmRlciA9IGJ1ZmZlckVuZCAt
IHJlYWRQb2ludGVyOworICAgIG1lbWNweShzYW1wbGUyLCByZWFkUG9pbnRlciwgc2l6ZW9mKCpz
YW1wbGUxKSAqIHN0ZDo6bWluKHN0YXRpY19jYXN0PGludD4oZnJhbWVzVG9Qcm9jZXNzKSwgcmVt
YWluZGVyKSk7CisgICAgbWVtY3B5KHNhbXBsZTIgKyByZW1haW5kZXIsIGJ1ZmZlciwgc2l6ZW9m
KCpzYW1wbGUxKSAqIHN0ZDo6bWF4KDAsIHN0YXRpY19jYXN0PGludD4oZnJhbWVzVG9Qcm9jZXNz
KSAtIHJlbWFpbmRlcikpOworCisgICAgLy8gSW50ZXJwb2xhdGUgc2FtcGxlcy4KKyAgICAvLyBk
ZXN0aW5hdGlvbltrXSA9IHNhbXBsZTFba10gKyBpbnRlcnBvbGF0aW9uRmFjdG9yICogKHNhbXBs
ZTJba10gLSBzYW1wbGUxW2tdKTsKKyAgICBWZWN0b3JNYXRoOjppbnRlcnBvbGF0ZShzYW1wbGUx
LCBzYW1wbGUyLCBpbnRlcnBvbGF0aW9uRmFjdG9yLCBkZXN0aW5hdGlvbiwgZnJhbWVzVG9Qcm9j
ZXNzKTsKIH0KIAogdm9pZCBEZWxheURTUEtlcm5lbDo6cHJvY2Vzc09ubHlBdWRpb1BhcmFtcyhz
aXplX3QgZnJhbWVzVG9Qcm9jZXNzKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJhdWRpby9EZWxheURTUEtlcm5lbC5oIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJh
dWRpby9EZWxheURTUEtlcm5lbC5oCmluZGV4IDU4ZTc4MWZlMzU0MDNmMmY4Zjc0NDJiY2E4ZDY2
MDNhOTNkNDI4YjcuLmJhYjg4Zjc3NTRiYzVkNWU4ZDgzYmFhNzUzNTRiZDNlYmQ2MTVlNDMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vRGVsYXlEU1BLZXJuZWwu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmgK
QEAgLTUwLDEyICs1MCwxNyBAQCBwdWJsaWM6CiAgICAgYm9vbCByZXF1aXJlc1RhaWxQcm9jZXNz
aW5nKCkgY29uc3QgZmluYWw7CiAKIHByaXZhdGU6CisgICAgdm9pZCBwcm9jZXNzQVJhdGUoY29u
c3QgZmxvYXQqIHNvdXJjZSwgZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgZnJhbWVzVG9Qcm9j
ZXNzKTsKKyAgICB2b2lkIHByb2Nlc3NLUmF0ZShjb25zdCBmbG9hdCogc291cmNlLCBmbG9hdCog
ZGVzdGluYXRpb24sIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCiAgICAgQXVkaW9GbG9hdEFy
cmF5IG1fYnVmZmVyOwogICAgIGRvdWJsZSBtX21heERlbGF5VGltZTsKICAgICBpbnQgbV93cml0
ZUluZGV4IHsgMCB9OwogICAgIGRvdWJsZSBtX2Rlc2lyZWREZWxheUZyYW1lczsKIAogICAgIEF1
ZGlvRmxvYXRBcnJheSBtX2RlbGF5VGltZXM7CisgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2Vk
IHRvIGhvbGQgdGhlIHNlY29uZCBzYW1wbGUgZm9yIGludGVycG9sYXRpb24gaWYgbmVlZGVkLgor
ICAgIEF1ZGlvRmxvYXRBcnJheSBtX3RlbXBCdWZmZXI7CiAKICAgICBEZWxheVByb2Nlc3Nvciog
ZGVsYXlQcm9jZXNzb3IoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxEZWxheVByb2Nlc3Nvcio+KHBy
b2Nlc3NvcigpKTsgfQogICAgIHNpemVfdCBidWZmZXJMZW5ndGhGb3JEZWxheShkb3VibGUgZGVs
YXlUaW1lLCBkb3VibGUgc2FtcGxlUmF0ZSkgY29uc3Q7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwCmluZGV4IGQxMDMyNzdiZWE0NGNiZGYxYTlmZDAyNmVj
NDQyZTM0MzUwY2ZjODIuLjk1MWZkZjU2ZDcxNjAzODBlZGQ4YjIxYTY2ZTY0ODIyZGNiNDA3MjEg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwCkBAIC02
Miw2ICs2MiwxMSBAQCB2b2lkIGFkZChjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25zdCBm
bG9hdCogaW5wdXRWZWN0b3IyLCBmbG9hdCogb3V0cHV0VmVjdAogICAgIHZEU1BfdmFkZChpbnB1
dFZlY3RvcjEsIDEsIGlucHV0VmVjdG9yMiwgMSwgb3V0cHV0VmVjdG9yLCAxLCBudW1iZXJPZkVs
ZW1lbnRzVG9Qcm9jZXNzKTsKIH0KIAordm9pZCBzdWJzdHJhY3QoY29uc3QgZmxvYXQqIGlucHV0
VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMiwgZmxvYXQqIG91dHB1dFZlY3Rvciwg
c2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpCit7CisgICAgdkRTUF92c3ViKGlucHV0
VmVjdG9yMSwgMSwgaW5wdXRWZWN0b3IyLCAxLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxl
bWVudHNUb1Byb2Nlc3MpOworfQorCiB2b2lkIGFkZFNjYWxhcihjb25zdCBmbG9hdCogaW5wdXRW
ZWN0b3IsIGZsb2F0IHNjYWxhciwgZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9m
RWxlbWVudHNUb1Byb2Nlc3MpCiB7CiAgICAgdkRTUF92c2FkZChpbnB1dFZlY3RvciwgMSwgJnNj
YWxhciwgb3V0cHV0VmVjdG9yLCAxLCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKQEAgLTcy
LDYgKzc3LDExIEBAIHZvaWQgbXVsdGlwbHkoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29u
c3QgZmxvYXQqIGlucHV0VmVjdG9yMiwgZmxvYXQqIG91dHB1CiAgICAgdkRTUF92bXVsKGlucHV0
VmVjdG9yMSwgMSwgaW5wdXRWZWN0b3IyLCAxLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxl
bWVudHNUb1Byb2Nlc3MpOwogfQogCit2b2lkIGludGVycG9sYXRlKGNvbnN0IGZsb2F0KiBpbnB1
dFZlY3RvcjEsIGZsb2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0IGludGVycG9sYXRpb25GYWN0b3Is
IGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKQor
eworICAgIHZEU1BfdmludGIoaW5wdXRWZWN0b3IxLCAxLCBpbnB1dFZlY3RvcjIsIDEsICZpbnRl
cnBvbGF0aW9uRmFjdG9yLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nl
c3MpOworfQorCiB2b2lkIG11bHRpcGx5Q29tcGxleChjb25zdCBmbG9hdCogcmVhbFZlY3RvcjEs
IGNvbnN0IGZsb2F0KiBpbWFnVmVjdG9yMSwgY29uc3QgZmxvYXQqIHJlYWxWZWN0b3IyLCBjb25z
dCBmbG9hdCogaW1hZzJQLCBmbG9hdCogcmVhbE91dHB1dFZlY3RvciwgZmxvYXQqIGltYWdEZXN0
UCwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpCiB7CiAgICAgRFNQU3BsaXRDb21w
bGV4IHNjMTsKQEAgLTQzMCw2ICs0NDAsMTE1IEBAIHZvaWQgYWRkKGNvbnN0IGZsb2F0KiBpbnB1
dFZlY3RvcjEsIGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0KiBvdXRwdXRWZWN0CiAg
ICAgfQogfQogCit2b2lkIHN1YnN0cmFjdChjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25z
dCBmbG9hdCogaW5wdXRWZWN0b3IyLCBmbG9hdCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVy
T2ZFbGVtZW50c1RvUHJvY2VzcykKK3sKKyAgICBzaXplX3QgbiA9IG51bWJlck9mRWxlbWVudHNU
b1Byb2Nlc3M7CisKKyNpZiBDUFUoWDg2X1NTRTIpCisgICAgLy8gSWYgdGhlIGlucHV0VmVjdG9y
IGFkZHJlc3MgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgdGhlIGZpcnN0IHNldmVyYWwgZnJhbWVz
IChhdCBtb3N0IHRocmVlKSBzaG91bGQgYmUgcHJvY2Vzc2VkIHNlcGFyYXRlbHkuCisgICAgd2hp
bGUgKCFpczE2Qnl0ZUFsaWduZWQoaW5wdXRWZWN0b3IxKSAmJiBuKSB7CisgICAgICAgICpvdXRw
dXRWZWN0b3IgPSAqaW5wdXRWZWN0b3IxIC0gKmlucHV0VmVjdG9yMjsKKyAgICAgICAgaW5wdXRW
ZWN0b3IxKys7CisgICAgICAgIGlucHV0VmVjdG9yMisrOworICAgICAgICBvdXRwdXRWZWN0b3Ir
KzsKKyAgICAgICAgbi0tOworICAgIH0KKworICAgIC8vIE5vdyB0aGUgaW5wdXRWZWN0b3IxIGFk
ZHJlc3MgaXMgYWxpZ25lZCBhbmQgc3RhcnQgdG8gYXBwbHkgU1NFLgorICAgIHNpemVfdCBncm91
cCA9IG4gLyA0OworICAgIF9fbTEyOCogcFNvdXJjZTE7CisgICAgX19tMTI4KiBwU291cmNlMjsK
KyAgICBfX20xMjgqIHBEZXN0OworICAgIF9fbTEyOCBzb3VyY2UyOworICAgIF9fbTEyOCBkZXN0
OworCisgICAgYm9vbCBzb3VyY2UyQWxpZ25lZCA9IGlzMTZCeXRlQWxpZ25lZChpbnB1dFZlY3Rv
cjIpOworICAgIGJvb2wgZGVzdEFsaWduZWQgPSBpczE2Qnl0ZUFsaWduZWQob3V0cHV0VmVjdG9y
KTsKKworICAgIGlmIChzb3VyY2UyQWxpZ25lZCAmJiBkZXN0QWxpZ25lZCkgeyAvLyBhbGwgYWxp
Z25lZAorICAgICAgICB3aGlsZSAoZ3JvdXAtLSkgeworICAgICAgICAgICAgcFNvdXJjZTEgPSBy
ZWludGVycHJldF9jYXN0PF9fbTEyOCo+KGNvbnN0X2Nhc3Q8ZmxvYXQqPihpbnB1dFZlY3RvcjEp
KTsKKyAgICAgICAgICAgIHBTb3VyY2UyID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjgqPihjb25z
dF9jYXN0PGZsb2F0Kj4oaW5wdXRWZWN0b3IyKSk7CisgICAgICAgICAgICBwRGVzdCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8X19tMTI4Kj4ob3V0cHV0VmVjdG9yKTsKKyAgICAgICAgICAgICpwRGVzdCA9
IF9tbV9zdWJfcHMoKnBTb3VyY2UxLCAqcFNvdXJjZTIpOworCisgICAgICAgICAgICBpbnB1dFZl
Y3RvcjEgKz0gNDsKKyAgICAgICAgICAgIGlucHV0VmVjdG9yMiArPSA0OworICAgICAgICAgICAg
b3V0cHV0VmVjdG9yICs9IDQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNvdXJjZTJBbGln
bmVkICYmICFkZXN0QWxpZ25lZCkgeyAvLyBzb3VyY2UyIGFsaWduZWQgYnV0IGRlc3Qgbm90IGFs
aWduZWQKKyAgICAgICAgd2hpbGUgKGdyb3VwLS0pIHsKKyAgICAgICAgICAgIHBTb3VyY2UxID0g
cmVpbnRlcnByZXRfY2FzdDxfX20xMjgqPihjb25zdF9jYXN0PGZsb2F0Kj4oaW5wdXRWZWN0b3Ix
KSk7CisgICAgICAgICAgICBwU291cmNlMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4Kj4oY29u
c3RfY2FzdDxmbG9hdCo+KGlucHV0VmVjdG9yMikpOworICAgICAgICAgICAgZGVzdCA9IF9tbV9z
dWJfcHMoKnBTb3VyY2UxLCAqcFNvdXJjZTIpOworICAgICAgICAgICAgX21tX3N0b3JldV9wcyhv
dXRwdXRWZWN0b3IsIGRlc3QpOworCisgICAgICAgICAgICBpbnB1dFZlY3RvcjEgKz0gNDsKKyAg
ICAgICAgICAgIGlucHV0VmVjdG9yMiArPSA0OworICAgICAgICAgICAgb3V0cHV0VmVjdG9yICs9
IDQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzb3VyY2UyQWxpZ25lZCAmJiBkZXN0QWxp
Z25lZCkgeyAvLyBzb3VyY2UyIG5vdCBhbGlnbmVkIGJ1dCBkZXN0IGFsaWduZWQKKyAgICAgICAg
d2hpbGUgKGdyb3VwLS0pIHsKKyAgICAgICAgICAgIHBTb3VyY2UxID0gcmVpbnRlcnByZXRfY2Fz
dDxfX20xMjgqPihjb25zdF9jYXN0PGZsb2F0Kj4oaW5wdXRWZWN0b3IxKSk7CisgICAgICAgICAg
ICBzb3VyY2UyID0gX21tX2xvYWR1X3BzKGlucHV0VmVjdG9yMik7CisgICAgICAgICAgICBwRGVz
dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4Kj4ob3V0cHV0VmVjdG9yKTsKKyAgICAgICAgICAg
ICpwRGVzdCA9IF9tbV9zdWJfcHMoKnBTb3VyY2UxLCBzb3VyY2UyKTsKKworICAgICAgICAgICAg
aW5wdXRWZWN0b3IxICs9IDQ7CisgICAgICAgICAgICBpbnB1dFZlY3RvcjIgKz0gNDsKKyAgICAg
ICAgICAgIG91dHB1dFZlY3RvciArPSA0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc291
cmNlMkFsaWduZWQgJiYgIWRlc3RBbGlnbmVkKSB7IC8vIGJvdGggc291cmNlMiBhbmQgZGVzdCBu
b3QgYWxpZ25lZAorICAgICAgICB3aGlsZSAoZ3JvdXAtLSkgeworICAgICAgICAgICAgcFNvdXJj
ZTEgPSByZWludGVycHJldF9jYXN0PF9fbTEyOCo+KGNvbnN0X2Nhc3Q8ZmxvYXQqPihpbnB1dFZl
Y3RvcjEpKTsKKyAgICAgICAgICAgIHNvdXJjZTIgPSBfbW1fbG9hZHVfcHMoaW5wdXRWZWN0b3Iy
KTsKKyAgICAgICAgICAgIGRlc3QgPSBfbW1fc3ViX3BzKCpwU291cmNlMSwgc291cmNlMik7Cisg
ICAgICAgICAgICBfbW1fc3RvcmV1X3BzKG91dHB1dFZlY3RvciwgZGVzdCk7CisKKyAgICAgICAg
ICAgIGlucHV0VmVjdG9yMSArPSA0OworICAgICAgICAgICAgaW5wdXRWZWN0b3IyICs9IDQ7Cisg
ICAgICAgICAgICBvdXRwdXRWZWN0b3IgKz0gNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IE5vbi1TU0UgaGFuZGxpbmcgZm9yIHJlbWFpbmluZyBmcmFtZXMgd2hpY2ggaXMgbGVzcyB0aGFu
IDQuCisgICAgbiAlPSA0OworI2VsaWYgSEFWRShBUk1fTkVPTl9JTlRSSU5TSUNTKQorICAgIHNp
emVfdCB0YWlsRnJhbWVzID0gbiAlIDQ7CisgICAgY29uc3QgZmxvYXQqIGVuZFAgPSBvdXRwdXRW
ZWN0b3IgKyBuIC0gdGFpbEZyYW1lczsKKworICAgIHdoaWxlIChvdXRwdXRWZWN0b3IgPCBlbmRQ
KSB7CisgICAgICAgIGZsb2F0MzJ4NF90IHNvdXJjZTEgPSB2bGQxcV9mMzIoaW5wdXRWZWN0b3Ix
KTsKKyAgICAgICAgZmxvYXQzMng0X3Qgc291cmNlMiA9IHZsZDFxX2YzMihpbnB1dFZlY3RvcjIp
OworICAgICAgICB2c3QxcV9mMzIob3V0cHV0VmVjdG9yLCB2c3VicV9mMzIoc291cmNlMSwgc291
cmNlMikpOworCisgICAgICAgIGlucHV0VmVjdG9yMSArPSA0OworICAgICAgICBpbnB1dFZlY3Rv
cjIgKz0gNDsKKyAgICAgICAgb3V0cHV0VmVjdG9yICs9IDQ7CisgICAgfQorICAgIG4gPSB0YWls
RnJhbWVzOworI2VuZGlmCisgICAgd2hpbGUgKG4tLSkgeworICAgICAgICAqb3V0cHV0VmVjdG9y
ID0gKmlucHV0VmVjdG9yMSAtICppbnB1dFZlY3RvcjI7CisgICAgICAgICsraW5wdXRWZWN0b3Ix
OworICAgICAgICArK2lucHV0VmVjdG9yMjsKKyAgICAgICAgKytvdXRwdXRWZWN0b3I7CisgICAg
fQorfQorCit2b2lkIGludGVycG9sYXRlKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGZsb2F0
KiBpbnB1dFZlY3RvcjIsIGZsb2F0IGludGVycG9sYXRpb25GYWN0b3IsIGZsb2F0KiBvdXRwdXRW
ZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKQoreworICAgIGlmIChpbnB1
dFZlY3RvcjEgIT0gb3V0cHV0VmVjdG9yKQorICAgICAgICBtZW1jcHkob3V0cHV0VmVjdG9yLCBp
bnB1dFZlY3RvcjEsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MgKiBzaXplb2YoZmxvYXQpKTsK
KworICAgIC8vIGlucHV0VmVjdG9yMltrXSA9IGlucHV0VmVjdG9yMltrXSAtIGlucHV0VmVjdG9y
MVtrXQorICAgIHN1YnN0cmFjdChpbnB1dFZlY3RvcjIsIGlucHV0VmVjdG9yMSwgaW5wdXRWZWN0
b3IyLCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKKworICAgIC8vIG91dHB1dFZlY3Rvcltr
XSA9IG91dHB1dFZlY3RvcltrXSArIGludGVycG9sYXRpb25GYWN0b3IgKiBpbnB1dFZlY3RvcjJb
a10KKyAgICAvLyAgICAgICAgICAgICAgICAgPSBpbnB1dFZlY3RvcjFba10gKyBpbnRlcnBvbGF0
aW9uRmFjdG9yICogKGlucHV0VmVjdG9yMltrXSAtIGlucHV0VmVjdG9yMVtrXSk7CisgICAgbXVs
dGlwbHlCeVNjYWxhclRoZW5BZGRUb091dHB1dChpbnB1dFZlY3RvcjIsIGludGVycG9sYXRpb25G
YWN0b3IsIG91dHB1dFZlY3RvciwgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2Vzcyk7Cit9CisKIHZv
aWQgbXVsdGlwbHkoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHV0
VmVjdG9yMiwgZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1By
b2Nlc3MpCiB7CiAgICAgc2l6ZV90IG4gPSBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzOwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oCmluZGV4IDg4MzY2YzhmNjU5
NjM5MjFiYjAyMTkxOTk2MzJhNDEwY2ExNjZkOGEuLmZmNmFiOWFlZWFiNzg4Zjc2MmMwNTkzNDIx
Mjc3Njg5NzhiNjZlNzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlv
L1ZlY3Rvck1hdGguaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JN
YXRoLmgKQEAgLTQ3LDYgKzQ3LDcgQEAgdm9pZCBhZGRWZWN0b3JzVGhlbk11bHRpcGx5QnlTY2Fs
YXIoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHUKIHZvaWQgbXVs
dGlwbHlCeVNjYWxhcihjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IsIGZsb2F0IHNjYWxhciwgZmxv
YXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOwogdm9p
ZCBhZGRTY2FsYXIoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yLCBmbG9hdCBzY2FsYXIsIGZsb2F0
KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKIHZvaWQg
YWRkKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjIs
IGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsK
K3ZvaWQgc3Vic3RyYWN0KGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGNvbnN0IGZsb2F0KiBp
bnB1dFZlY3RvcjIsIGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRz
VG9Qcm9jZXNzKTsKIAogLy8gRmluZHMgdGhlIG1heGltdW0gbWFnbml0dWRlIG9mIGEgZmxvYXQg
dmVjdG9yLgogZmxvYXQgbWF4aW11bU1hZ25pdHVkZShjb25zdCBmbG9hdCogaW5wdXRWZWN0b3Is
IHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKQEAgLTY1LDYgKzY2LDEyIEBAIHZv
aWQgY2xhbXAoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yLCBmbG9hdCBtaW5pbnVtLCBmbG9hdCBt
YXhpbXVtLCBmbG9hdCogb3V0cHV0CiAKIHZvaWQgbGluZWFyVG9EZWNpYmVscyhjb25zdCBmbG9h
dCogaW5wdXRWZWN0b3IsIGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1l
bnRzVG9Qcm9jZXNzKTsKIAorLy8gQ2FsY3VsYXRlcyB0aGUgbGluZWFyIGludGVycG9sYXRpb24g
YmV0d2VlbiB0aGUgc3VwcGxpZWQgc2luZ2xlLXByZWNpc2lvbiB2ZWN0b3JzCisvLyBmb3IgKG4g
PSAwOyBuIDwgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2VzczsgKytuKQorLy8gICAgIG91dHB1dFZl
Y3RvcltuXSA9IGlucHV0VmVjdG9yMVtuXSArIGludGVycG9sYXRpb25GYWN0b3IgKiAoaW5wdXRW
ZWN0b3IyW25dIC0gaW5wdXRWZWN0b3IxW25dKTsKKy8vIE5PVEU6IEludGVybmFsIGltcGxlbWVu
dGF0aW9uIG1heSBtb2RpZnkgaW5wdXRWZWN0b3IyLgordm9pZCBpbnRlcnBvbGF0ZShjb25zdCBm
bG9hdCogaW5wdXRWZWN0b3IxLCBmbG9hdCogaW5wdXRWZWN0b3IyLCBmbG9hdCBpbnRlcnBvbGF0
aW9uRmFjdG9yLCBmbG9hdCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVyT2ZFbGVtZW50c1Rv
UHJvY2Vzcyk7CisKIH0gLy8gbmFtZXNwYWNlIFZlY3Rvck1hdGgKIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>429943</attachid>
            <date>2021-05-27 15:47:14 -0700</date>
            <delta_ts>2021-05-28 16:26:44 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-226358-20210527154713.patch</filename>
            <type>text/plain</type>
            <size>20812</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc4MTcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDY5MzI0MWM3MTViNTI5
ZjhkY2Q5NTVlNTc1YmEyMzZiODU5MjQwYi4uODE5NzAxNjgyNzBjMzlhMTQxZjNjNjY2NmY4YjI3
YTNiY2E0MmY3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQzIEBACisyMDIxLTA1LTI3ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgRGVsYXlEU1BLZXJuZWw6OnBy
b2Nlc3MoKSBpcyBzbG93CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0yMjYzNTgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBXaGVuIEkgcHJvZmlsZWQgdGhlIGRlbW8gYXQgaHR0cHM6Ly9qc2ZpZGRsZS5uZXQv
S3Jpc0pvaG5zb24vczV2TDI0bzEvMTIzLyAoaW4gdGhlIGNvbnRleHQgb2YgQnVnIDIyMjA5OCks
CisgICAgICAgIEkgbm90aWNlZCB0aGF0IDIwJSBvZiB0aGUgQ1BVIHRpbWUgd2FzIHNwZW50IHVu
ZGVyIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzKCkuCisKKyAgICAgICAgVG8gaW1wcm92ZSB0aGlz
LCB3ZSBub3cgdmVjdG9yaXplIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzKCkgaW4gdGhlIGNvbW1v
biBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIGF1dG9tYXRpb24KKyAgICAgICAgYW5kIHRoZSBkZWxh
eSB0aW1lIGlzIGNvbnN0YW50LgorCisgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5
IHNpbWlsYXIgdG8gdGhlIG9uZSBpbiBCbGluazoKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5j
b20vY2hyb21pdW0vY2hyb21pdW0vYmxvYi9tYXN0ZXIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVy
ZXIvcGxhdGZvcm0vYXVkaW8vYXVkaW9fZGVsYXlfZHNwX2tlcm5lbC5jYworCisgICAgICAgIFNv
bWUgZGlmZmVyZW5jZXMgY29tcGFyZWQgdG8gdGhlIEJsaW5rIGltcGxlbWVudGF0aW9uOgorICAg
ICAgICAtIEkgZGlkIG5vdCB2ZWN0b3JpemUgdGhlIEEtcmF0ZSBjYXNlIGZvciBzaW1wbGljaXR5
LiBJdCBpcyBub3QgYXMgY29tbW9uIGFuZCBpdCBpcyBtb3JlIGNvbXBsaWNhdGVkLgorICAgICAg
ICAgIFdlIG1heSBjb25zaWRlciBkb2luZyB0aGlzIGluIHRoZSBmdXR1cmUgaWYgcmVhbGx5IG5l
ZWRlZC4KKyAgICAgICAgLSBPbiBDb2NvYSwgd2UgbGV2ZWFnZSBBY2NlbGVyYXRlJ3MgdkRTUF92
aW50YigpIHRvIGRvIHRoZSBpbnRlcnBvbGF0aW9uIGluc3RlYWQgb2YgZG9pbmcgMiBzZXBhcmF0
ZQorICAgICAgICAgIG9wZXJhdGlvbnMuCisKKyAgICAgICAgVGhpcyBkb2Vzbid0IGZpeCBCdWcg
MjIyMDk4IGJ1dCBpdCBkb2VzIGltcHJvdmUgdGhlIHNpdHVhdGlvbiBxdWl0ZSBhIGJpdC4gSSBh
bHNvIHNlZSB0aGF0IHRoZSBDUFUgdGltZQorICAgICAgICBzcGVudCB1bmRlciBEZWxheURTUEtl
cm5lbDo6cHJvY2VzcygpIHdlbnQgZnJvbSB+MjAlIHRvIDEuMiUgb24gdGhpcyBkZW1vLgorCisg
ICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gV2ViLWZhY2luZyBiZWhhdmlvciBjaGFuZ2UsIGp1c3Qg
YSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uCisKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlv
L0RlbGF5RFNQS2VybmVsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlUb0NpcmN1bGFyQnVm
ZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRlbGF5RFNQS2VybmVsOjpEZWxheURTUEtlcm5lbCk6
CisgICAgICAgIChXZWJDb3JlOjpEZWxheURTUEtlcm5lbDo6YnVmZmVyTGVuZ3RoRm9yRGVsYXkg
Y29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6RGVsYXlEU1BLZXJuZWw6OnByb2Nlc3MpOgorICAg
ICAgICAoV2ViQ29yZTo6RGVsYXlEU1BLZXJuZWw6OnByb2Nlc3NBUmF0ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpEZWxheURTUEtlcm5lbDo6cHJvY2Vzc0tSYXRlKToKKyAgICAgICAgKiBNb2R1bGVz
L3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmg6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vVmVj
dG9yTWF0aC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWZWN0b3JNYXRoOjpzdWJzdHJhY3QpOgor
ICAgICAgICAoV2ViQ29yZTo6VmVjdG9yTWF0aDo6aW50ZXJwb2xhdGUpOgorICAgICAgICAqIHBs
YXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguaDoKKwogMjAyMS0wNS0yNyAgU2ltb24gRnJhc2VyICA8
c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAgICBBZGQgYW5pbWF0aW9ucyB0byBHcmFw
aGljc0xheWVyIGxvZ2dpbmcgb3V0cHV0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViYXVkaW8vRGVsYXlEU1BLZXJuZWwuY3BwCmluZGV4IDg5NGRlMGFmZjA4ZjZhZWI4YjBhZGU1
OWE1YzY1YzZlNDdkZTY5OWEuLjVlODQ5ZmI0NjUwOTJhNWU5MDg3ZDkxMDliOTNhZmExNjU1MzQz
YjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vRGVsYXlEU1BL
ZXJuZWwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vRGVsYXlEU1BL
ZXJuZWwuY3BwCkBAIC0yOSwxMyArMjksMzAgQEAKICNpbmNsdWRlICJEZWxheURTUEtlcm5lbC5o
IgogCiAjaW5jbHVkZSAiQXVkaW9VdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJWZWN0b3JNYXRoLmgi
CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK3N0YXRpYyB2
b2lkIGNvcHlUb0NpcmN1bGFyQnVmZmVyKGZsb2F0KiBidWZmZXIsIGludCB3cml0ZUluZGV4LCBz
aXplX3QgYnVmZmVyTGVuZ3RoLCBjb25zdCBmbG9hdCogc291cmNlLCBzaXplX3QgZnJhbWVzVG9Q
cm9jZXNzKQoreworICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgZGVwZW5kcyBvbiB0aGlzIGJl
aW5nIHRydWUgYmVjYXVzZSB3ZSBkb24ndCBleHBlY3QgdG8gaGF2ZSB0byBmaWxsIHRoZSBlbnRp
cmUgYnVmZmVyIG1vcmUgdGhhbiBvbmNlLgorICAgIEFTU0VSVChidWZmZXJMZW5ndGggPj0gZnJh
bWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIENvcHkgfGZyYW1lc1RvUHJvY2Vzc3wgdmFsdWVzIGZy
b20gfHNvdXJjZXwgdG8gdGhlIGNpcmN1bGFyIGJ1ZmZlciB0aGF0IHN0YXJ0cyBhdCB8YnVmZmVy
fCBvZiBsZW5ndGggfGJ1ZmZlckxlbmd0aHwuIFRoZQorICAgIC8vIGNvcHkgc3RhcnRzIGF0IGlu
ZGV4IHx3cml0ZUluZGV4fCBpbnRvIHRoZSBidWZmZXIuCisgICAgZmxvYXQqIHdyaXRlUG9pbnRl
ciA9ICZidWZmZXJbd3JpdGVJbmRleF07CisgICAgaW50IHJlbWFpbmRlciA9IGJ1ZmZlckxlbmd0
aCAtIHdyaXRlSW5kZXg7CisKKyAgICAvLyBDb3B5IHRoZSBmcmFtZXMgb3ZlciwgY2FyZWZ1bGx5
IGhhbmRsaW5nIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gd3JhcCBhcm91bmQgdG8gdGhlIGJl
Z2lubmluZyBvZiB0aGUgYnVmZmVyLgorICAgIG1lbWNweSh3cml0ZVBvaW50ZXIsIHNvdXJjZSwg
c2l6ZW9mKGZsb2F0KSAqIHN0ZDo6bWluKHN0YXRpY19jYXN0PGludD4oZnJhbWVzVG9Qcm9jZXNz
KSwgcmVtYWluZGVyKSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgc291cmNlICsgcmVtYWluZGVyLCBz
aXplb2YoZmxvYXQpICogc3RkOjptYXgoMCwgc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNUb1Byb2Nl
c3MpIC0gcmVtYWluZGVyKSk7Cit9CisKIERlbGF5RFNQS2VybmVsOjpEZWxheURTUEtlcm5lbChE
ZWxheVByb2Nlc3NvciogcHJvY2Vzc29yKQogICAgIDogQXVkaW9EU1BLZXJuZWwocHJvY2Vzc29y
KQogICAgICwgbV9kZWxheVRpbWVzKEF1ZGlvVXRpbGl0aWVzOjpyZW5kZXJRdWFudHVtU2l6ZSkK
KyAgICAsIG1fdGVtcEJ1ZmZlcihBdWRpb1V0aWxpdGllczo6cmVuZGVyUXVhbnR1bVNpemUpCiB7
CiAgICAgQVNTRVJUKHByb2Nlc3NvciAmJiBwcm9jZXNzb3ItPnNhbXBsZVJhdGUoKSA+IDApOwog
ICAgIGlmICghKHByb2Nlc3NvciAmJiBwcm9jZXNzb3ItPnNhbXBsZVJhdGUoKSA+IDApKQpAQCAt
NTIsNiArNjksNyBAQCBEZWxheURTUEtlcm5lbDo6RGVsYXlEU1BLZXJuZWwoRGVsYXlQcm9jZXNz
b3IqIHByb2Nlc3NvcikKIERlbGF5RFNQS2VybmVsOjpEZWxheURTUEtlcm5lbChkb3VibGUgbWF4
RGVsYXlUaW1lLCBmbG9hdCBzYW1wbGVSYXRlKQogICAgIDogQXVkaW9EU1BLZXJuZWwoc2FtcGxl
UmF0ZSkKICAgICAsIG1fbWF4RGVsYXlUaW1lKG1heERlbGF5VGltZSkKKyAgICAsIG1fdGVtcEJ1
ZmZlcihBdWRpb1V0aWxpdGllczo6cmVuZGVyUXVhbnR1bVNpemUpCiB7CiAgICAgQVNTRVJUKG1h
eERlbGF5VGltZSA+IDAuMCk7CiAgICAgaWYgKG1heERlbGF5VGltZSA8PSAwLjApCkBAIC02Nyw0
NyArODUsMzggQEAgRGVsYXlEU1BLZXJuZWw6OkRlbGF5RFNQS2VybmVsKGRvdWJsZSBtYXhEZWxh
eVRpbWUsIGZsb2F0IHNhbXBsZVJhdGUpCiAKIHNpemVfdCBEZWxheURTUEtlcm5lbDo6YnVmZmVy
TGVuZ3RoRm9yRGVsYXkoZG91YmxlIG1heERlbGF5VGltZSwgZG91YmxlIHNhbXBsZVJhdGUpIGNv
bnN0CiB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRv
IGhhbmRsZSBhIG1heCBkZWxheSBvZiB8bWF4RGVsYXlUaW1lfC4gT25lIGlzCi0gICAgLy8gYWRk
ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBhY3R1YWwgZGVsYXkgZXF1YWxzIHRoZSBt
YXhpbXVtIGRlbGF5LgotICAgIHJldHVybiAxICsgQXVkaW9VdGlsaXRpZXM6OnRpbWVUb1NhbXBs
ZUZyYW1lKG1heERlbGF5VGltZSwgc2FtcGxlUmF0ZSwgQXVkaW9VdGlsaXRpZXM6OlNhbXBsZUZy
YW1lUm91bmRpbmc6OlVwKTsKKyAgICAvLyBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZl
ciBuZWVkZWQgdG8gaGFuZGxlIGEgbWF4IGRlbGF5IG9mIHxtYXhEZWxheVRpbWV8LiBBZGQgYW4g
YWRkaXRpb25hbCByZW5kZXIgcXVhbnR1bSBmcmFtZSBzaXplIHNvIHdlIGNhbgorICAgIC8vIHZl
Y3Rvcml6ZSB0aGUgZGVsYXkgcHJvY2Vzc2luZy4gVGhlIGV4dHJhIHNwYWNlIGlzIG5lZWRlZCBz
byB0aGF0IHdyaXRlcyB0byB0aGUgYnVmZmVyIHdvbid0IG92ZXJsYXAgcmVhZHMgZnJvbSB0aGUg
YnVmZmVyLgorICAgIHJldHVybiBBdWRpb1V0aWxpdGllczo6cmVuZGVyUXVhbnR1bVNpemUgKyBB
dWRpb1V0aWxpdGllczo6dGltZVRvU2FtcGxlRnJhbWUobWF4RGVsYXlUaW1lLCBzYW1wbGVSYXRl
LCBBdWRpb1V0aWxpdGllczo6U2FtcGxlRnJhbWVSb3VuZGluZzo6VXApOwogfQogCiB2b2lkIERl
bGF5RFNQS2VybmVsOjpwcm9jZXNzKGNvbnN0IGZsb2F0KiBzb3VyY2UsIGZsb2F0KiBkZXN0aW5h
dGlvbiwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKIHsKLSAgICBzaXplX3QgYnVmZmVyTGVuZ3Ro
ID0gbV9idWZmZXIuc2l6ZSgpOwotICAgIGZsb2F0KiBidWZmZXIgPSBtX2J1ZmZlci5kYXRhKCk7
Ci0KLSAgICBBU1NFUlQoYnVmZmVyTGVuZ3RoKTsKLSAgICBpZiAoIWJ1ZmZlckxlbmd0aCkKLSAg
ICAgICAgcmV0dXJuOwotCisgICAgQVNTRVJUKG1fYnVmZmVyLnNpemUoKSk7CiAgICAgQVNTRVJU
KHNvdXJjZSAmJiBkZXN0aW5hdGlvbik7Ci0gICAgaWYgKCFzb3VyY2UgfHwgIWRlc3RpbmF0aW9u
KQorICAgIGlmIChVTkxJS0VMWSghbV9idWZmZXIuc2l6ZSgpIHx8ICFzb3VyY2UgfHwgIWRlc3Rp
bmF0aW9uKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZmxvYXQgc2FtcGxlUmF0ZSA9IHRoaXMt
PnNhbXBsZVJhdGUoKTsKLSAgICBkb3VibGUgZGVsYXlUaW1lID0gMDsKLSAgICBmbG9hdCogZGVs
YXlUaW1lcyA9IG1fZGVsYXlUaW1lcy5kYXRhKCk7Ci0gICAgZG91YmxlIG1heFRpbWUgPSBtYXhE
ZWxheVRpbWUoKTsKLQogICAgIGJvb2wgc2FtcGxlQWNjdXJhdGUgPSBkZWxheVByb2Nlc3Nvcigp
ICYmIGRlbGF5UHJvY2Vzc29yKCktPmRlbGF5VGltZSgpLmhhc1NhbXBsZUFjY3VyYXRlVmFsdWVz
KCk7CiAgICAgYm9vbCBzaG91bGRVc2VBUmF0ZSA9IGRlbGF5UHJvY2Vzc29yKCkgJiYgZGVsYXlQ
cm9jZXNzb3IoKS0+ZGVsYXlUaW1lKCkuYXV0b21hdGlvblJhdGUoKSA9PSBBdXRvbWF0aW9uUmF0
ZTo6QVJhdGU7Ci0KICAgICBpZiAoc2FtcGxlQWNjdXJhdGUgJiYgc2hvdWxkVXNlQVJhdGUpCi0g
ICAgICAgIGRlbGF5UHJvY2Vzc29yKCktPmRlbGF5VGltZSgpLmNhbGN1bGF0ZVNhbXBsZUFjY3Vy
YXRlVmFsdWVzKGRlbGF5VGltZXMsIGZyYW1lc1RvUHJvY2Vzcyk7Ci0gICAgZWxzZSB7Ci0gICAg
ICAgIGRlbGF5VGltZSA9IGRlbGF5UHJvY2Vzc29yKCkgPyBkZWxheVByb2Nlc3NvcigpLT5kZWxh
eVRpbWUoKS5maW5hbFZhbHVlKCkgOiBtX2Rlc2lyZWREZWxheUZyYW1lcyAvIHNhbXBsZVJhdGU7
Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVsYXkgdGltZSBpcyBpbiBhIHZhbGlkIHJhbmdl
LgotICAgICAgICBkZWxheVRpbWUgPSBzdGQ6OmNsYW1wKGRlbGF5VGltZSwgMC4wLCBtYXhUaW1l
KTsKLSAgICB9CisgICAgICAgIHByb2Nlc3NBUmF0ZShzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFt
ZXNUb1Byb2Nlc3MpOworICAgIGVsc2UKKyAgICAgICAgcHJvY2Vzc0tSYXRlKHNvdXJjZSwgZGVz
dGluYXRpb24sIGZyYW1lc1RvUHJvY2Vzcyk7Cit9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZnJhbWVzVG9Qcm9jZXNzOyArK2kpIHsKLSAgICAgICAgaWYgKHNhbXBsZUFjY3VyYXRl
ICYmIHNob3VsZFVzZUFSYXRlKSB7Ci0gICAgICAgICAgICBkZWxheVRpbWUgPSBkZWxheVRpbWVz
W2ldOwotICAgICAgICAgICAgZGVsYXlUaW1lID0gc3RkOjpjbGFtcChkZWxheVRpbWUsIDAuMCwg
bWF4VGltZSk7Ci0gICAgICAgIH0KK3ZvaWQgRGVsYXlEU1BLZXJuZWw6OnByb2Nlc3NBUmF0ZShj
b25zdCBmbG9hdCogc291cmNlLCBmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBmcmFtZXNUb1By
b2Nlc3MpCit7CisgICAgaW50IGJ1ZmZlckxlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICBm
bG9hdCogYnVmZmVyID0gbV9idWZmZXIuZGF0YSgpOworCisgICAgZGVsYXlQcm9jZXNzb3IoKS0+
ZGVsYXlUaW1lKCkuY2FsY3VsYXRlU2FtcGxlQWNjdXJhdGVWYWx1ZXMobV9kZWxheVRpbWVzLmRh
dGEoKSwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIGNvcHlUb0NpcmN1bGFyQnVmZmVyKGJ1ZmZl
ciwgbV93cml0ZUluZGV4LCBidWZmZXJMZW5ndGgsIHNvdXJjZSwgZnJhbWVzVG9Qcm9jZXNzKTsK
IAotICAgICAgICBkb3VibGUgZGVzaXJlZERlbGF5RnJhbWVzID0gZGVsYXlUaW1lICogc2FtcGxl
UmF0ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnJhbWVzVG9Qcm9jZXNzOyArK2kp
IHsKKyAgICAgICAgZG91YmxlIGRlbGF5VGltZSA9IHN0ZDo6Y2xhbXA8ZG91YmxlPihtX2RlbGF5
VGltZXNbaV0sIDAuMCwgbWF4RGVsYXlUaW1lKCkpOworICAgICAgICBkb3VibGUgZGVzaXJlZERl
bGF5RnJhbWVzID0gZGVsYXlUaW1lICogc2FtcGxlUmF0ZSgpOwogCiAgICAgICAgIGRvdWJsZSBy
ZWFkUG9zaXRpb24gPSBtX3dyaXRlSW5kZXggKyBidWZmZXJMZW5ndGggLSBkZXNpcmVkRGVsYXlG
cmFtZXM7CiAgICAgICAgIGlmIChyZWFkUG9zaXRpb24gPj0gYnVmZmVyTGVuZ3RoKQpAQCAtMTE2
LDE5ICsxMjUsNzQgQEAgdm9pZCBEZWxheURTUEtlcm5lbDo6cHJvY2Vzcyhjb25zdCBmbG9hdCog
c291cmNlLCBmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBmcmEKICAgICAgICAgLy8gTGluZWFy
bHkgaW50ZXJwb2xhdGUgaW4tYmV0d2VlbiBkZWxheSB0aW1lcy4KICAgICAgICAgaW50IHJlYWRJ
bmRleDEgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlYWRQb3NpdGlvbik7CiAgICAgICAgIGludCByZWFk
SW5kZXgyID0gKHJlYWRJbmRleDEgKyAxKSAlIGJ1ZmZlckxlbmd0aDsKLSAgICAgICAgZG91Ymxl
IGludGVycG9sYXRpb25GYWN0b3IgPSByZWFkUG9zaXRpb24gLSByZWFkSW5kZXgxOworICAgICAg
ICBmbG9hdCBpbnRlcnBvbGF0aW9uRmFjdG9yID0gcmVhZFBvc2l0aW9uIC0gcmVhZEluZGV4MTsK
IAotICAgICAgICBkb3VibGUgaW5wdXQgPSBzdGF0aWNfY2FzdDxmbG9hdD4oKnNvdXJjZSsrKTsK
LSAgICAgICAgYnVmZmVyW21fd3JpdGVJbmRleF0gPSBzdGF0aWNfY2FzdDxmbG9hdD4oaW5wdXQp
OwogICAgICAgICBtX3dyaXRlSW5kZXggPSAobV93cml0ZUluZGV4ICsgMSkgJSBidWZmZXJMZW5n
dGg7CiAKLSAgICAgICAgZG91YmxlIHNhbXBsZTEgPSBidWZmZXJbcmVhZEluZGV4MV07Ci0gICAg
ICAgIGRvdWJsZSBzYW1wbGUyID0gYnVmZmVyW3JlYWRJbmRleDJdOworICAgICAgICBmbG9hdCBz
YW1wbGUxID0gYnVmZmVyW3JlYWRJbmRleDFdOworICAgICAgICBmbG9hdCBzYW1wbGUyID0gYnVm
ZmVyW3JlYWRJbmRleDJdOworICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNhbXBsZTEgKyBpbnRl
cnBvbGF0aW9uRmFjdG9yICogKHNhbXBsZTIgLSBzYW1wbGUxKTsKKyAgICB9Cit9CiAKLSAgICAg
ICAgZG91YmxlIG91dHB1dCA9ICgxLjAgLSBpbnRlcnBvbGF0aW9uRmFjdG9yKSAqIHNhbXBsZTEg
KyBpbnRlcnBvbGF0aW9uRmFjdG9yICogc2FtcGxlMjsKKy8vIE9wdGltaXplZCB2ZXJzaW9uIG9m
IHByb2Nlc3NBUmF0ZSgpIHdoZW4gdGhlIGRlbGF5VGltZSBpcyBjb25zdGFudC4KK3ZvaWQgRGVs
YXlEU1BLZXJuZWw6OnByb2Nlc3NLUmF0ZShjb25zdCBmbG9hdCogc291cmNlLCBmbG9hdCogZGVz
dGluYXRpb24sIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgaW50IGJ1ZmZlckxlbmd0
aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICBmbG9hdCogYnVmZmVyID0gbV9idWZmZXIuZGF0YSgp
OwogCi0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG91dHB1dCk7
Ci0gICAgfQorICAgIGRvdWJsZSBkZWxheVRpbWUgPSBkZWxheVByb2Nlc3NvcigpID8gZGVsYXlQ
cm9jZXNzb3IoKS0+ZGVsYXlUaW1lKCkuZmluYWxWYWx1ZSgpIDogbV9kZXNpcmVkRGVsYXlGcmFt
ZXMgLyBzYW1wbGVSYXRlKCk7CisgICAgLy8gTWFrZSBzdXJlIHRoZSBkZWxheSB0aW1lIGlzIGlu
IGEgdmFsaWQgcmFuZ2UuCisgICAgZGVsYXlUaW1lID0gc3RkOjpjbGFtcChkZWxheVRpbWUsIDAu
MCwgbWF4RGVsYXlUaW1lKCkpOworICAgIGRvdWJsZSBkZXNpcmVkRGVsYXlGcmFtZXMgPSBkZWxh
eVRpbWUgKiBzYW1wbGVSYXRlKCk7CisKKyAgICBkb3VibGUgcmVhZFBvc2l0aW9uID0gbV93cml0
ZUluZGV4ICsgYnVmZmVyTGVuZ3RoIC0gZGVzaXJlZERlbGF5RnJhbWVzOworICAgIGlmIChyZWFk
UG9zaXRpb24gPj0gYnVmZmVyTGVuZ3RoKQorICAgICAgICByZWFkUG9zaXRpb24gLT0gYnVmZmVy
TGVuZ3RoOworCisgICAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgaW4tYmV0d2VlbiBkZWxheSB0
aW1lcy4gfHJlYWRJbmRleDF8IGFuZCB8cmVhZEluZGV4MnwgYXJlIHRoZSBpbmRpY2VzIG9mIHRo
ZSBmcmFtZXMgdG8gYmUgdXNlZAorICAgIC8vIGZvciBpbnRlcnBvbGF0aW9uLgorICAgIGludCBy
ZWFkSW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihyZWFkUG9zaXRpb24pOworICAgIGZsb2F0IGlu
dGVycG9sYXRpb25GYWN0b3IgPSByZWFkUG9zaXRpb24gLSByZWFkSW5kZXgxOworICAgIGZsb2F0
KiBidWZmZXJFbmQgPSAmYnVmZmVyW2J1ZmZlckxlbmd0aF07CisgICAgQVNTRVJUKHN0YXRpY19j
YXN0PHVuc2lnbmVkPihidWZmZXJMZW5ndGgpID49IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAv
LyBzYW1wbGUxIGFuZCBzYW1wbGUyIGhvbGQgdGhlIGN1cnJlbnQgYW5kIG5leHQgc2FtcGxlcyBp
biB0aGUgYnVmZmVyLiBUaGVzZSBhcmUgdXNlZCBmb3IgaW50ZXJvcGxhdGluZyB0aGUgZGVsYXkg
dmFsdWUuCisgICAgLy8gVG8gcmVkdWNlIG1lbW9yeSB1c2FnZSBhbmQgYW4gZXh0cmEgbWVtY3B5
LCBzYW1wbGUxIGNhbiBiZSB0aGUgc2FtZSBhcyBkZXN0aW5hdGlvbi4KKyAgICAvLyBWZWN0b3JN
YXRoOjppbnRlcnBvbGF0ZSgpIGJlbG93IGhhcyBhbiBvcHRpbWl6YXRpb24gaW4gdGhlIGNhc2Ug
d2hlcmUgdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IG9uZS4KKyAg
ICBmbG9hdCogc2FtcGxlMSA9IGRlc3RpbmF0aW9uOworCisgICAgLy8gQ29weSBkYXRhIGZyb20g
dGhlIHNvdXJjZSBpbnRvIHRoZSBidWZmZXIsIHN0YXJ0aW5nIGF0IHRoZSB3cml0ZSBpbmRleC4g
VGhlIGJ1ZmZlciBpcyBjaXJjdWxhciwgc28gY2FyZWZ1bGx5IGhhbmRsZQorICAgIC8vIHRoZSB3
cmFwcGluZyBvZiB0aGUgd3JpdGUgcG9pbnRlci4KKyAgICBjb3B5VG9DaXJjdWxhckJ1ZmZlcihi
dWZmZXIsIG1fd3JpdGVJbmRleCwgYnVmZmVyTGVuZ3RoLCBzb3VyY2UsIGZyYW1lc1RvUHJvY2Vz
cyk7CisgICAgbV93cml0ZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICBpZiAobV93cml0
ZUluZGV4ID49IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgbV93cml0ZUluZGV4IC09IGJ1ZmZlckxl
bmd0aDsKKworICAgIC8vIE5vdyBjb3B5IG91dCB0aGUgc2FtcGxlcyBmcm9tIHRoZSBidWZmZXIs
IHN0YXJ0aW5nIGF0IHRoZSByZWFkIHBvaW50ZXIsIGNhcmVmdWxseSBoYW5kbGluZyB3cmFwcGlu
ZyBvZiB0aGUgcmVhZCBwb2ludGVyLgorICAgIGZsb2F0KiByZWFkUG9pbnRlciA9ICZidWZmZXJb
cmVhZEluZGV4MV07CisKKyAgICBpbnQgcmVtYWluZGVyID0gYnVmZmVyRW5kIC0gcmVhZFBvaW50
ZXI7CisgICAgbWVtY3B5KHNhbXBsZTEsIHJlYWRQb2ludGVyLCBzaXplb2YoKnNhbXBsZTEpICog
c3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNUb1Byb2Nlc3MpLCByZW1haW5kZXIpKTsK
KyAgICBtZW1jcHkoc2FtcGxlMSArIHJlbWFpbmRlciwgYnVmZmVyLCBzaXplb2YoKnNhbXBsZTEp
ICogc3RkOjptYXgoMCwgc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNUb1Byb2Nlc3MpIC0gcmVtYWlu
ZGVyKSk7CisKKyAgICAvLyBJZiBpbnRlcnBvbGF0aW9uRmFjdG9yIGlzIDAsIHdlIGRvbid0IG5l
ZWQgdG8gZG8gYW55IGludGVycG9sYXRpb24gYW5kIHNhbXBsZTEgY29udGFpbnMgdGhlIGRlc2ly
ZWQgdmFsdWVzLgorICAgIGlmICghaW50ZXJwb2xhdGlvbkZhY3RvcikKKyAgICAgICAgcmV0dXJu
OworCisgICAgQVNTRVJUKGZyYW1lc1RvUHJvY2VzcyA8PSBtX3RlbXBCdWZmZXIuc2l6ZSgpKTsK
KworICAgIGludCByZWFkSW5kZXgyID0gKHJlYWRJbmRleDEgKyAxKSAlIGJ1ZmZlckxlbmd0aDsK
KyAgICBmbG9hdCogc2FtcGxlMiA9IG1fdGVtcEJ1ZmZlci5kYXRhKCk7CisKKyAgICByZWFkUG9p
bnRlciA9ICZidWZmZXJbcmVhZEluZGV4Ml07CisgICAgcmVtYWluZGVyID0gYnVmZmVyRW5kIC0g
cmVhZFBvaW50ZXI7CisgICAgbWVtY3B5KHNhbXBsZTIsIHJlYWRQb2ludGVyLCBzaXplb2YoKnNh
bXBsZTEpICogc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNUb1Byb2Nlc3MpLCByZW1h
aW5kZXIpKTsKKyAgICBtZW1jcHkoc2FtcGxlMiArIHJlbWFpbmRlciwgYnVmZmVyLCBzaXplb2Yo
KnNhbXBsZTEpICogc3RkOjptYXgoMCwgc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNUb1Byb2Nlc3Mp
IC0gcmVtYWluZGVyKSk7CisKKyAgICAvLyBJbnRlcnBvbGF0ZSBzYW1wbGVzLgorICAgIC8vIGRl
c3RpbmF0aW9uW2tdID0gc2FtcGxlMVtrXSArIGludGVycG9sYXRpb25GYWN0b3IgKiAoc2FtcGxl
MltrXSAtIHNhbXBsZTFba10pOworICAgIFZlY3Rvck1hdGg6OmludGVycG9sYXRlKHNhbXBsZTEs
IHNhbXBsZTIsIGludGVycG9sYXRpb25GYWN0b3IsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1Byb2Nl
c3MpOwogfQogCiB2b2lkIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzT25seUF1ZGlvUGFyYW1zKHNp
emVfdCBmcmFtZXNUb1Byb2Nlc3MpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1
ZGlvL0RlbGF5RFNQS2VybmVsLmgKaW5kZXggNThlNzgxZmUzNTQwM2YyZjhmNzQ0MmJjYThkNjYw
M2E5M2Q0MjhiNy4uYmFiODhmNzc1NGJjNWQ1ZThkODNiYWE3NTM1NGJkM2ViZDYxNWU0MyAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9EZWxheURTUEtlcm5lbC5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vRGVsYXlEU1BLZXJuZWwuaApA
QCAtNTAsMTIgKzUwLDE3IEBAIHB1YmxpYzoKICAgICBib29sIHJlcXVpcmVzVGFpbFByb2Nlc3Np
bmcoKSBjb25zdCBmaW5hbDsKIAogcHJpdmF0ZToKKyAgICB2b2lkIHByb2Nlc3NBUmF0ZShjb25z
dCBmbG9hdCogc291cmNlLCBmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBmcmFtZXNUb1Byb2Nl
c3MpOworICAgIHZvaWQgcHJvY2Vzc0tSYXRlKGNvbnN0IGZsb2F0KiBzb3VyY2UsIGZsb2F0KiBk
ZXN0aW5hdGlvbiwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKICAgICBBdWRpb0Zsb2F0QXJy
YXkgbV9idWZmZXI7CiAgICAgZG91YmxlIG1fbWF4RGVsYXlUaW1lOwogICAgIGludCBtX3dyaXRl
SW5kZXggeyAwIH07CiAgICAgZG91YmxlIG1fZGVzaXJlZERlbGF5RnJhbWVzOwogCiAgICAgQXVk
aW9GbG9hdEFycmF5IG1fZGVsYXlUaW1lczsKKyAgICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQg
dG8gaG9sZCB0aGUgc2Vjb25kIHNhbXBsZSBmb3IgaW50ZXJwb2xhdGlvbiBpZiBuZWVkZWQuCisg
ICAgQXVkaW9GbG9hdEFycmF5IG1fdGVtcEJ1ZmZlcjsKIAogICAgIERlbGF5UHJvY2Vzc29yKiBk
ZWxheVByb2Nlc3NvcigpIHsgcmV0dXJuIHN0YXRpY19jYXN0PERlbGF5UHJvY2Vzc29yKj4ocHJv
Y2Vzc29yKCkpOyB9CiAgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aEZvckRlbGF5KGRvdWJsZSBkZWxh
eVRpbWUsIGRvdWJsZSBzYW1wbGVSYXRlKSBjb25zdDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKaW5kZXggZDEwMzI3N2JlYTQ0Y2JkZjFhOWZkMDI2ZWM0
NDJlMzQzNTBjZmM4Mi4uOTUxZmRmNTZkNzE2MDM4MGVkZDhiMjFhNjZlNjQ4MjJkY2I0MDcyMSAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5jcHAKQEAgLTYy
LDYgKzYyLDExIEBAIHZvaWQgYWRkKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGNvbnN0IGZs
b2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0KiBvdXRwdXRWZWN0CiAgICAgdkRTUF92YWRkKGlucHV0
VmVjdG9yMSwgMSwgaW5wdXRWZWN0b3IyLCAxLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxl
bWVudHNUb1Byb2Nlc3MpOwogfQogCit2b2lkIHN1YnN0cmFjdChjb25zdCBmbG9hdCogaW5wdXRW
ZWN0b3IxLCBjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IyLCBmbG9hdCogb3V0cHV0VmVjdG9yLCBz
aXplX3QgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2VzcykKK3sKKyAgICB2RFNQX3ZzdWIoaW5wdXRW
ZWN0b3IxLCAxLCBpbnB1dFZlY3RvcjIsIDEsIG91dHB1dFZlY3RvciwgMSwgbnVtYmVyT2ZFbGVt
ZW50c1RvUHJvY2Vzcyk7Cit9CisKIHZvaWQgYWRkU2NhbGFyKGNvbnN0IGZsb2F0KiBpbnB1dFZl
Y3RvciwgZmxvYXQgc2NhbGFyLCBmbG9hdCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVyT2ZF
bGVtZW50c1RvUHJvY2VzcykKIHsKICAgICB2RFNQX3ZzYWRkKGlucHV0VmVjdG9yLCAxLCAmc2Nh
bGFyLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOwpAQCAtNzIs
NiArNzcsMTEgQEAgdm9pZCBtdWx0aXBseShjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25z
dCBmbG9hdCogaW5wdXRWZWN0b3IyLCBmbG9hdCogb3V0cHUKICAgICB2RFNQX3ZtdWwoaW5wdXRW
ZWN0b3IxLCAxLCBpbnB1dFZlY3RvcjIsIDEsIG91dHB1dFZlY3RvciwgMSwgbnVtYmVyT2ZFbGVt
ZW50c1RvUHJvY2Vzcyk7CiB9CiAKK3ZvaWQgaW50ZXJwb2xhdGUoY29uc3QgZmxvYXQqIGlucHV0
VmVjdG9yMSwgZmxvYXQqIGlucHV0VmVjdG9yMiwgZmxvYXQgaW50ZXJwb2xhdGlvbkZhY3Rvciwg
ZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpCit7
CisgICAgdkRTUF92aW50YihpbnB1dFZlY3RvcjEsIDEsIGlucHV0VmVjdG9yMiwgMSwgJmludGVy
cG9sYXRpb25GYWN0b3IsIG91dHB1dFZlY3RvciwgMSwgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2Vz
cyk7Cit9CisKIHZvaWQgbXVsdGlwbHlDb21wbGV4KGNvbnN0IGZsb2F0KiByZWFsVmVjdG9yMSwg
Y29uc3QgZmxvYXQqIGltYWdWZWN0b3IxLCBjb25zdCBmbG9hdCogcmVhbFZlY3RvcjIsIGNvbnN0
IGZsb2F0KiBpbWFnMlAsIGZsb2F0KiByZWFsT3V0cHV0VmVjdG9yLCBmbG9hdCogaW1hZ0Rlc3RQ
LCBzaXplX3QgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2VzcykKIHsKICAgICBEU1BTcGxpdENvbXBs
ZXggc2MxOwpAQCAtNDMwLDYgKzQ0MCwxMTUgQEAgdm9pZCBhZGQoY29uc3QgZmxvYXQqIGlucHV0
VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMiwgZmxvYXQqIG91dHB1dFZlY3QKICAg
ICB9CiB9CiAKK3ZvaWQgc3Vic3RyYWN0KGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGNvbnN0
IGZsb2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJP
ZkVsZW1lbnRzVG9Qcm9jZXNzKQoreworICAgIHNpemVfdCBuID0gbnVtYmVyT2ZFbGVtZW50c1Rv
UHJvY2VzczsKKworI2lmIENQVShYODZfU1NFMikKKyAgICAvLyBJZiB0aGUgaW5wdXRWZWN0b3Ig
YWRkcmVzcyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCB0aGUgZmlyc3Qgc2V2ZXJhbCBmcmFtZXMg
KGF0IG1vc3QgdGhyZWUpIHNob3VsZCBiZSBwcm9jZXNzZWQgc2VwYXJhdGVseS4KKyAgICB3aGls
ZSAoIWlzMTZCeXRlQWxpZ25lZChpbnB1dFZlY3RvcjEpICYmIG4pIHsKKyAgICAgICAgKm91dHB1
dFZlY3RvciA9ICppbnB1dFZlY3RvcjEgLSAqaW5wdXRWZWN0b3IyOworICAgICAgICBpbnB1dFZl
Y3RvcjErKzsKKyAgICAgICAgaW5wdXRWZWN0b3IyKys7CisgICAgICAgIG91dHB1dFZlY3Rvcisr
OworICAgICAgICBuLS07CisgICAgfQorCisgICAgLy8gTm93IHRoZSBpbnB1dFZlY3RvcjEgYWRk
cmVzcyBpcyBhbGlnbmVkIGFuZCBzdGFydCB0byBhcHBseSBTU0UuCisgICAgc2l6ZV90IGdyb3Vw
ID0gbiAvIDQ7CisgICAgX19tMTI4KiBwU291cmNlMTsKKyAgICBfX20xMjgqIHBTb3VyY2UyOwor
ICAgIF9fbTEyOCogcERlc3Q7CisgICAgX19tMTI4IHNvdXJjZTI7CisgICAgX19tMTI4IGRlc3Q7
CisKKyAgICBib29sIHNvdXJjZTJBbGlnbmVkID0gaXMxNkJ5dGVBbGlnbmVkKGlucHV0VmVjdG9y
Mik7CisgICAgYm9vbCBkZXN0QWxpZ25lZCA9IGlzMTZCeXRlQWxpZ25lZChvdXRwdXRWZWN0b3Ip
OworCisgICAgaWYgKHNvdXJjZTJBbGlnbmVkICYmIGRlc3RBbGlnbmVkKSB7IC8vIGFsbCBhbGln
bmVkCisgICAgICAgIHdoaWxlIChncm91cC0tKSB7CisgICAgICAgICAgICBwU291cmNlMSA9IHJl
aW50ZXJwcmV0X2Nhc3Q8X19tMTI4Kj4oY29uc3RfY2FzdDxmbG9hdCo+KGlucHV0VmVjdG9yMSkp
OworICAgICAgICAgICAgcFNvdXJjZTIgPSByZWludGVycHJldF9jYXN0PF9fbTEyOCo+KGNvbnN0
X2Nhc3Q8ZmxvYXQqPihpbnB1dFZlY3RvcjIpKTsKKyAgICAgICAgICAgIHBEZXN0ID0gcmVpbnRl
cnByZXRfY2FzdDxfX20xMjgqPihvdXRwdXRWZWN0b3IpOworICAgICAgICAgICAgKnBEZXN0ID0g
X21tX3N1Yl9wcygqcFNvdXJjZTEsICpwU291cmNlMik7CisKKyAgICAgICAgICAgIGlucHV0VmVj
dG9yMSArPSA0OworICAgICAgICAgICAgaW5wdXRWZWN0b3IyICs9IDQ7CisgICAgICAgICAgICBv
dXRwdXRWZWN0b3IgKz0gNDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc291cmNlMkFsaWdu
ZWQgJiYgIWRlc3RBbGlnbmVkKSB7IC8vIHNvdXJjZTIgYWxpZ25lZCBidXQgZGVzdCBub3QgYWxp
Z25lZAorICAgICAgICB3aGlsZSAoZ3JvdXAtLSkgeworICAgICAgICAgICAgcFNvdXJjZTEgPSBy
ZWludGVycHJldF9jYXN0PF9fbTEyOCo+KGNvbnN0X2Nhc3Q8ZmxvYXQqPihpbnB1dFZlY3RvcjEp
KTsKKyAgICAgICAgICAgIHBTb3VyY2UyID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjgqPihjb25z
dF9jYXN0PGZsb2F0Kj4oaW5wdXRWZWN0b3IyKSk7CisgICAgICAgICAgICBkZXN0ID0gX21tX3N1
Yl9wcygqcFNvdXJjZTEsICpwU291cmNlMik7CisgICAgICAgICAgICBfbW1fc3RvcmV1X3BzKG91
dHB1dFZlY3RvciwgZGVzdCk7CisKKyAgICAgICAgICAgIGlucHV0VmVjdG9yMSArPSA0OworICAg
ICAgICAgICAgaW5wdXRWZWN0b3IyICs9IDQ7CisgICAgICAgICAgICBvdXRwdXRWZWN0b3IgKz0g
NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXNvdXJjZTJBbGlnbmVkICYmIGRlc3RBbGln
bmVkKSB7IC8vIHNvdXJjZTIgbm90IGFsaWduZWQgYnV0IGRlc3QgYWxpZ25lZAorICAgICAgICB3
aGlsZSAoZ3JvdXAtLSkgeworICAgICAgICAgICAgcFNvdXJjZTEgPSByZWludGVycHJldF9jYXN0
PF9fbTEyOCo+KGNvbnN0X2Nhc3Q8ZmxvYXQqPihpbnB1dFZlY3RvcjEpKTsKKyAgICAgICAgICAg
IHNvdXJjZTIgPSBfbW1fbG9hZHVfcHMoaW5wdXRWZWN0b3IyKTsKKyAgICAgICAgICAgIHBEZXN0
ID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjgqPihvdXRwdXRWZWN0b3IpOworICAgICAgICAgICAg
KnBEZXN0ID0gX21tX3N1Yl9wcygqcFNvdXJjZTEsIHNvdXJjZTIpOworCisgICAgICAgICAgICBp
bnB1dFZlY3RvcjEgKz0gNDsKKyAgICAgICAgICAgIGlucHV0VmVjdG9yMiArPSA0OworICAgICAg
ICAgICAgb3V0cHV0VmVjdG9yICs9IDQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzb3Vy
Y2UyQWxpZ25lZCAmJiAhZGVzdEFsaWduZWQpIHsgLy8gYm90aCBzb3VyY2UyIGFuZCBkZXN0IG5v
dCBhbGlnbmVkCisgICAgICAgIHdoaWxlIChncm91cC0tKSB7CisgICAgICAgICAgICBwU291cmNl
MSA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4Kj4oY29uc3RfY2FzdDxmbG9hdCo+KGlucHV0VmVj
dG9yMSkpOworICAgICAgICAgICAgc291cmNlMiA9IF9tbV9sb2FkdV9wcyhpbnB1dFZlY3RvcjIp
OworICAgICAgICAgICAgZGVzdCA9IF9tbV9zdWJfcHMoKnBTb3VyY2UxLCBzb3VyY2UyKTsKKyAg
ICAgICAgICAgIF9tbV9zdG9yZXVfcHMob3V0cHV0VmVjdG9yLCBkZXN0KTsKKworICAgICAgICAg
ICAgaW5wdXRWZWN0b3IxICs9IDQ7CisgICAgICAgICAgICBpbnB1dFZlY3RvcjIgKz0gNDsKKyAg
ICAgICAgICAgIG91dHB1dFZlY3RvciArPSA0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
Tm9uLVNTRSBoYW5kbGluZyBmb3IgcmVtYWluaW5nIGZyYW1lcyB3aGljaCBpcyBsZXNzIHRoYW4g
NC4KKyAgICBuICU9IDQ7CisjZWxpZiBIQVZFKEFSTV9ORU9OX0lOVFJJTlNJQ1MpCisgICAgc2l6
ZV90IHRhaWxGcmFtZXMgPSBuICUgNDsKKyAgICBjb25zdCBmbG9hdCogZW5kUCA9IG91dHB1dFZl
Y3RvciArIG4gLSB0YWlsRnJhbWVzOworCisgICAgd2hpbGUgKG91dHB1dFZlY3RvciA8IGVuZFAp
IHsKKyAgICAgICAgZmxvYXQzMng0X3Qgc291cmNlMSA9IHZsZDFxX2YzMihpbnB1dFZlY3RvcjEp
OworICAgICAgICBmbG9hdDMyeDRfdCBzb3VyY2UyID0gdmxkMXFfZjMyKGlucHV0VmVjdG9yMik7
CisgICAgICAgIHZzdDFxX2YzMihvdXRwdXRWZWN0b3IsIHZzdWJxX2YzMihzb3VyY2UxLCBzb3Vy
Y2UyKSk7CisKKyAgICAgICAgaW5wdXRWZWN0b3IxICs9IDQ7CisgICAgICAgIGlucHV0VmVjdG9y
MiArPSA0OworICAgICAgICBvdXRwdXRWZWN0b3IgKz0gNDsKKyAgICB9CisgICAgbiA9IHRhaWxG
cmFtZXM7CisjZW5kaWYKKyAgICB3aGlsZSAobi0tKSB7CisgICAgICAgICpvdXRwdXRWZWN0b3Ig
PSAqaW5wdXRWZWN0b3IxIC0gKmlucHV0VmVjdG9yMjsKKyAgICAgICAgKytpbnB1dFZlY3RvcjE7
CisgICAgICAgICsraW5wdXRWZWN0b3IyOworICAgICAgICArK291dHB1dFZlY3RvcjsKKyAgICB9
Cit9CisKK3ZvaWQgaW50ZXJwb2xhdGUoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgZmxvYXQq
IGlucHV0VmVjdG9yMiwgZmxvYXQgaW50ZXJwb2xhdGlvbkZhY3RvciwgZmxvYXQqIG91dHB1dFZl
Y3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpCit7CisgICAgaWYgKGlucHV0
VmVjdG9yMSAhPSBvdXRwdXRWZWN0b3IpCisgICAgICAgIG1lbWNweShvdXRwdXRWZWN0b3IsIGlu
cHV0VmVjdG9yMSwgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2VzcyAqIHNpemVvZihmbG9hdCkpOwor
CisgICAgLy8gaW5wdXRWZWN0b3IyW2tdID0gaW5wdXRWZWN0b3IyW2tdIC0gaW5wdXRWZWN0b3Ix
W2tdCisgICAgc3Vic3RyYWN0KGlucHV0VmVjdG9yMiwgaW5wdXRWZWN0b3IxLCBpbnB1dFZlY3Rv
cjIsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOworCisgICAgLy8gb3V0cHV0VmVjdG9yW2td
ID0gb3V0cHV0VmVjdG9yW2tdICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIGlucHV0VmVjdG9yMltr
XQorICAgIC8vICAgICAgICAgICAgICAgICA9IGlucHV0VmVjdG9yMVtrXSArIGludGVycG9sYXRp
b25GYWN0b3IgKiAoaW5wdXRWZWN0b3IyW2tdIC0gaW5wdXRWZWN0b3IxW2tdKTsKKyAgICBtdWx0
aXBseUJ5U2NhbGFyVGhlbkFkZFRvT3V0cHV0KGlucHV0VmVjdG9yMiwgaW50ZXJwb2xhdGlvbkZh
Y3Rvciwgb3V0cHV0VmVjdG9yLCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKK30KKwogdm9p
ZCBtdWx0aXBseShjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25zdCBmbG9hdCogaW5wdXRW
ZWN0b3IyLCBmbG9hdCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVyT2ZFbGVtZW50c1RvUHJv
Y2VzcykKIHsKICAgICBzaXplX3QgbiA9IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3M7CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmgKaW5kZXggODgzNjZjOGY2NTk2
MzkyMWJiMDIxOTE5OTYzMmE0MTBjYTE2NmQ4YS4uZmY2YWI5YWVlYWI3ODhmNzYyYzA1OTM0MjEy
Nzc2ODk3OGI2NmU3MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
VmVjdG9yTWF0aC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1h
dGguaApAQCAtNDcsNiArNDcsNyBAQCB2b2lkIGFkZFZlY3RvcnNUaGVuTXVsdGlwbHlCeVNjYWxh
cihjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25zdCBmbG9hdCogaW5wdQogdm9pZCBtdWx0
aXBseUJ5U2NhbGFyKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvciwgZmxvYXQgc2NhbGFyLCBmbG9h
dCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2Vzcyk7CiB2b2lk
IGFkZFNjYWxhcihjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IsIGZsb2F0IHNjYWxhciwgZmxvYXQq
IG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOwogdm9pZCBh
ZGQoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMiwg
ZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOwor
dm9pZCBzdWJzdHJhY3QoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlu
cHV0VmVjdG9yMiwgZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNU
b1Byb2Nlc3MpOwogCiAvLyBGaW5kcyB0aGUgbWF4aW11bSBtYWduaXR1ZGUgb2YgYSBmbG9hdCB2
ZWN0b3IuCiBmbG9hdCBtYXhpbXVtTWFnbml0dWRlKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3Rvciwg
c2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOwpAQCAtNjUsNiArNjYsMTIgQEAgdm9p
ZCBjbGFtcChjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IsIGZsb2F0IG1pbmludW0sIGZsb2F0IG1h
eGltdW0sIGZsb2F0KiBvdXRwdXQKIAogdm9pZCBsaW5lYXJUb0RlY2liZWxzKGNvbnN0IGZsb2F0
KiBpbnB1dFZlY3RvciwgZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVu
dHNUb1Byb2Nlc3MpOwogCisvLyBDYWxjdWxhdGVzIHRoZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBi
ZXR3ZWVuIHRoZSBzdXBwbGllZCBzaW5nbGUtcHJlY2lzaW9uIHZlY3RvcnMKKy8vIGZvciAobiA9
IDA7IG4gPCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzOyArK24pCisvLyAgICAgb3V0cHV0VmVj
dG9yW25dID0gaW5wdXRWZWN0b3IxW25dICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIChpbnB1dFZl
Y3RvcjJbbl0gLSBpbnB1dFZlY3RvcjFbbl0pOworLy8gTk9URTogSW50ZXJuYWwgaW1wbGVtZW50
YXRpb24gbWF5IG1vZGlmeSBpbnB1dFZlY3RvcjIuCit2b2lkIGludGVycG9sYXRlKGNvbnN0IGZs
b2F0KiBpbnB1dFZlY3RvcjEsIGZsb2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0IGludGVycG9sYXRp
b25GYWN0b3IsIGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Q
cm9jZXNzKTsKKwogfSAvLyBuYW1lc3BhY2UgVmVjdG9yTWF0aAogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>430070</attachid>
            <date>2021-05-28 16:26:46 -0700</date>
            <delta_ts>2021-05-28 17:52:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-226358-20210528162645.patch</filename>
            <type>text/plain</type>
            <size>21713</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc4MjI3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMGQ2ZWYwYzAzZGM5NTFm
MGVmOTEyMjIyMDFlM2QyYzQ5NmY1ZTAwMS4uMTgxNWExNzFjYTNiMTUxNzAyZjE2MDIyMjkzMzkz
YjllYmE2Yjk5NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQzIEBACisyMDIxLTA1LTI4ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgRGVsYXlEU1BLZXJuZWw6OnBy
b2Nlc3MoKSBpcyBzbG93CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0yMjYzNTgKKworICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KKworICAg
ICAgICBXaGVuIEkgcHJvZmlsZWQgdGhlIGRlbW8gYXQgaHR0cHM6Ly9qc2ZpZGRsZS5uZXQvS3Jp
c0pvaG5zb24vczV2TDI0bzEvMTIzLyAoaW4gdGhlIGNvbnRleHQgb2YgQnVnIDIyMjA5OCksCisg
ICAgICAgIEkgbm90aWNlZCB0aGF0IDIwJSBvZiB0aGUgQ1BVIHRpbWUgd2FzIHNwZW50IHVuZGVy
IERlbGF5RFNQS2VybmVsOjpwcm9jZXNzKCkuCisKKyAgICAgICAgVG8gaW1wcm92ZSB0aGlzLCB3
ZSBub3cgdmVjdG9yaXplIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzKCkgaW4gdGhlIGNvbW1vbiBj
YXNlIHdoZXJlIHRoZXJlIGlzIG5vIGF1dG9tYXRpb24KKyAgICAgICAgYW5kIHRoZSBkZWxheSB0
aW1lIGlzIGNvbnN0YW50LgorCisgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHNp
bWlsYXIgdG8gdGhlIG9uZSBpbiBCbGluazoKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5jb20v
Y2hyb21pdW0vY2hyb21pdW0vYmxvYi9tYXN0ZXIvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIv
cGxhdGZvcm0vYXVkaW8vYXVkaW9fZGVsYXlfZHNwX2tlcm5lbC5jYworCisgICAgICAgIFNvbWUg
ZGlmZmVyZW5jZXMgY29tcGFyZWQgdG8gdGhlIEJsaW5rIGltcGxlbWVudGF0aW9uOgorICAgICAg
ICAtIEkgZGlkIG5vdCB2ZWN0b3JpemUgdGhlIEEtcmF0ZSBjYXNlIGZvciBzaW1wbGljaXR5LiBJ
dCBpcyBub3QgYXMgY29tbW9uIGFuZCBpdCBpcyBtb3JlIGNvbXBsaWNhdGVkLgorICAgICAgICAg
IFdlIG1heSBjb25zaWRlciBkb2luZyB0aGlzIGluIHRoZSBmdXR1cmUgaWYgcmVhbGx5IG5lZWRl
ZC4KKyAgICAgICAgLSBPbiBDb2NvYSwgd2UgbGV2ZWFnZSBBY2NlbGVyYXRlJ3MgdkRTUF92aW50
YigpIHRvIGRvIHRoZSBpbnRlcnBvbGF0aW9uIGluc3RlYWQgb2YgZG9pbmcgMiBzZXBhcmF0ZQor
ICAgICAgICAgIG9wZXJhdGlvbnMuCisKKyAgICAgICAgVGhpcyBkb2Vzbid0IGZpeCBCdWcgMjIy
MDk4IGJ1dCBpdCBkb2VzIGltcHJvdmUgdGhlIHNpdHVhdGlvbiBxdWl0ZSBhIGJpdC4gSSBhbHNv
IHNlZSB0aGF0IHRoZSBDUFUgdGltZQorICAgICAgICBzcGVudCB1bmRlciBEZWxheURTUEtlcm5l
bDo6cHJvY2VzcygpIHdlbnQgZnJvbSB+MjAlIHRvIDEuMiUgb24gdGhpcyBkZW1vLgorCisgICAg
ICAgIE5vIG5ldyB0ZXN0cywgbm8gV2ViLWZhY2luZyBiZWhhdmlvciBjaGFuZ2UsIGp1c3QgYSBw
ZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uCisKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL0Rl
bGF5RFNQS2VybmVsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlUb0NpcmN1bGFyQnVmZmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkRlbGF5RFNQS2VybmVsOjpEZWxheURTUEtlcm5lbCk6Cisg
ICAgICAgIChXZWJDb3JlOjpEZWxheURTUEtlcm5lbDo6YnVmZmVyTGVuZ3RoRm9yRGVsYXkgY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6RGVsYXlEU1BLZXJuZWw6OnByb2Nlc3MpOgorICAgICAg
ICAoV2ViQ29yZTo6RGVsYXlEU1BLZXJuZWw6OnByb2Nlc3NBUmF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpEZWxheURTUEtlcm5lbDo6cHJvY2Vzc0tSYXRlKToKKyAgICAgICAgKiBNb2R1bGVzL3dl
YmF1ZGlvL0RlbGF5RFNQS2VybmVsLmg6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vVmVjdG9y
TWF0aC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpWZWN0b3JNYXRoOjpzdWJzdHJhY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6VmVjdG9yTWF0aDo6aW50ZXJwb2xhdGUpOgorICAgICAgICAqIHBsYXRm
b3JtL2F1ZGlvL1ZlY3Rvck1hdGguaDoKKwogMjAyMS0wNS0yOCAgSmVhbi1ZdmVzIEF2ZW5hcmQg
IDxqeWFAYXBwbGUuY29tPgogCiAgICAgICAgIEFkZCBNZWRpYVNlc3Npb24uY2FsbEFjdGlvbkhh
bmRsZXIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vRGVsYXlE
U1BLZXJuZWwuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9EZWxheURTUEtl
cm5lbC5jcHAKaW5kZXggODk0ZGUwYWZmMDhmNmFlYjhiMGFkZTU5YTVjNjVjNmU0N2RlNjk5YS4u
YzFlODBlMzBkMGYwNTQ0OWIzNjczZDg1ODgyNDlmYjE2MjFhYWY4YyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9EZWxheURTUEtlcm5lbC5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9EZWxheURTUEtlcm5lbC5jcHAKQEAgLTI5LDEz
ICsyOSw0MyBAQAogI2luY2x1ZGUgIkRlbGF5RFNQS2VybmVsLmgiCiAKICNpbmNsdWRlICJBdWRp
b1V0aWxpdGllcy5oIgorI2luY2x1ZGUgIlZlY3Rvck1hdGguaCIKICNpbmNsdWRlIDxhbGdvcml0
aG0+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorc3RhdGljIHNpemVfdCBidWZmZXJMZW5ndGhG
b3JEZWxheShkb3VibGUgbWF4RGVsYXlUaW1lLCBkb3VibGUgc2FtcGxlUmF0ZSkKK3sKKyAgICAv
LyBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBuZWVkZWQgdG8gaGFuZGxlIGEgbWF4
IGRlbGF5IG9mIHxtYXhEZWxheVRpbWV8LiBBZGQgYW4gYWRkaXRpb25hbCByZW5kZXIgcXVhbnR1
bSBmcmFtZSBzaXplIHNvIHdlIGNhbgorICAgIC8vIHZlY3Rvcml6ZSB0aGUgZGVsYXkgcHJvY2Vz
c2luZy4gVGhlIGV4dHJhIHNwYWNlIGlzIG5lZWRlZCBzbyB0aGF0IHdyaXRlcyB0byB0aGUgYnVm
ZmVyIHdvbid0IG92ZXJsYXAgcmVhZHMgZnJvbSB0aGUgYnVmZmVyLgorICAgIHJldHVybiBBdWRp
b1V0aWxpdGllczo6cmVuZGVyUXVhbnR1bVNpemUgKyBBdWRpb1V0aWxpdGllczo6dGltZVRvU2Ft
cGxlRnJhbWUobWF4RGVsYXlUaW1lLCBzYW1wbGVSYXRlLCBBdWRpb1V0aWxpdGllczo6U2FtcGxl
RnJhbWVSb3VuZGluZzo6VXApOworfQorCisvLyBSZXR1cm5zIChhIC0gYikgaWYgYSBpcyBncmVh
dGVyIHRoYW4gYiwgMCBvdGhlcndpc2UuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgaW5s
aW5lIHNpemVfdCBwb3NpdGl2ZVN1YnRyYWN0KFQgYSwgVCBiKQoreworICAgIHJldHVybiBhIDw9
IGIgPyAwIDogc3RhdGljX2Nhc3Q8c2l6ZV90PihhIC0gYik7Cit9CisKK3N0YXRpYyB2b2lkIGNv
cHlUb0NpcmN1bGFyQnVmZmVyKGZsb2F0KiBidWZmZXIsIHNpemVfdCB3cml0ZUluZGV4LCBzaXpl
X3QgYnVmZmVyTGVuZ3RoLCBjb25zdCBmbG9hdCogc291cmNlLCBzaXplX3QgZnJhbWVzVG9Qcm9j
ZXNzKQoreworICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgZGVwZW5kcyBvbiB0aGlzIGJlaW5n
IHRydWUgYmVjYXVzZSB3ZSBkb24ndCBleHBlY3QgdG8gaGF2ZSB0byBmaWxsIHRoZSBlbnRpcmUg
YnVmZmVyIG1vcmUgdGhhbiBvbmNlLgorICAgIFJFTEVBU0VfQVNTRVJUKGJ1ZmZlckxlbmd0aCA+
PSBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gQ29weSB8ZnJhbWVzVG9Qcm9jZXNzfCB2YWx1
ZXMgZnJvbSB8c291cmNlfCB0byB0aGUgY2lyY3VsYXIgYnVmZmVyIHRoYXQgc3RhcnRzIGF0IHxi
dWZmZXJ8IG9mIGxlbmd0aCB8YnVmZmVyTGVuZ3RofC4gVGhlCisgICAgLy8gY29weSBzdGFydHMg
YXQgaW5kZXggfHdyaXRlSW5kZXh8IGludG8gdGhlIGJ1ZmZlci4KKyAgICBhdXRvKiB3cml0ZVBv
aW50ZXIgPSAmYnVmZmVyW3dyaXRlSW5kZXhdOworICAgIHNpemVfdCByZW1haW5kZXIgPSBwb3Np
dGl2ZVN1YnRyYWN0KGJ1ZmZlckxlbmd0aCwgd3JpdGVJbmRleCk7CisKKyAgICAvLyBDb3B5IHRo
ZSBmcmFtZXMgb3ZlciwgY2FyZWZ1bGx5IGhhbmRsaW5nIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQg
dG8gd3JhcCBhcm91bmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLgorICAgIG1lbWNw
eSh3cml0ZVBvaW50ZXIsIHNvdXJjZSwgc2l6ZW9mKCp3cml0ZVBvaW50ZXIpICogc3RkOjptaW4o
ZnJhbWVzVG9Qcm9jZXNzLCByZW1haW5kZXIpKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBzb3VyY2Ug
KyByZW1haW5kZXIsIHNpemVvZigqYnVmZmVyKSAqIHBvc2l0aXZlU3VidHJhY3QoZnJhbWVzVG9Q
cm9jZXNzLCByZW1haW5kZXIpKTsKK30KKwogRGVsYXlEU1BLZXJuZWw6OkRlbGF5RFNQS2VybmVs
KERlbGF5UHJvY2Vzc29yKiBwcm9jZXNzb3IpCiAgICAgOiBBdWRpb0RTUEtlcm5lbChwcm9jZXNz
b3IpCiAgICAgLCBtX2RlbGF5VGltZXMoQXVkaW9VdGlsaXRpZXM6OnJlbmRlclF1YW50dW1TaXpl
KQorICAgICwgbV90ZW1wQnVmZmVyKEF1ZGlvVXRpbGl0aWVzOjpyZW5kZXJRdWFudHVtU2l6ZSkK
IHsKICAgICBBU1NFUlQocHJvY2Vzc29yICYmIHByb2Nlc3Nvci0+c2FtcGxlUmF0ZSgpID4gMCk7
CiAgICAgaWYgKCEocHJvY2Vzc29yICYmIHByb2Nlc3Nvci0+c2FtcGxlUmF0ZSgpID4gMCkpCkBA
IC01Miw2ICs4Miw3IEBAIERlbGF5RFNQS2VybmVsOjpEZWxheURTUEtlcm5lbChEZWxheVByb2Nl
c3NvciogcHJvY2Vzc29yKQogRGVsYXlEU1BLZXJuZWw6OkRlbGF5RFNQS2VybmVsKGRvdWJsZSBt
YXhEZWxheVRpbWUsIGZsb2F0IHNhbXBsZVJhdGUpCiAgICAgOiBBdWRpb0RTUEtlcm5lbChzYW1w
bGVSYXRlKQogICAgICwgbV9tYXhEZWxheVRpbWUobWF4RGVsYXlUaW1lKQorICAgICwgbV90ZW1w
QnVmZmVyKEF1ZGlvVXRpbGl0aWVzOjpyZW5kZXJRdWFudHVtU2l6ZSkKIHsKICAgICBBU1NFUlQo
bWF4RGVsYXlUaW1lID4gMC4wKTsKICAgICBpZiAobWF4RGVsYXlUaW1lIDw9IDAuMCkKQEAgLTY1
LDcwICs5NiwxMDcgQEAgRGVsYXlEU1BLZXJuZWw6OkRlbGF5RFNQS2VybmVsKGRvdWJsZSBtYXhE
ZWxheVRpbWUsIGZsb2F0IHNhbXBsZVJhdGUpCiAgICAgbV9idWZmZXIucmVzaXplKGJ1ZmZlckxl
bmd0aCk7CiB9CiAKLXNpemVfdCBEZWxheURTUEtlcm5lbDo6YnVmZmVyTGVuZ3RoRm9yRGVsYXko
ZG91YmxlIG1heERlbGF5VGltZSwgZG91YmxlIHNhbXBsZVJhdGUpIGNvbnN0Ci17Ci0gICAgLy8g
Q29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRvIGhhbmRsZSBhIG1heCBk
ZWxheSBvZiB8bWF4RGVsYXlUaW1lfC4gT25lIGlzCi0gICAgLy8gYWRkZWQgdG8gaGFuZGxlIHRo
ZSBjYXNlIHdoZXJlIHRoZSBhY3R1YWwgZGVsYXkgZXF1YWxzIHRoZSBtYXhpbXVtIGRlbGF5Lgot
ICAgIHJldHVybiAxICsgQXVkaW9VdGlsaXRpZXM6OnRpbWVUb1NhbXBsZUZyYW1lKG1heERlbGF5
VGltZSwgc2FtcGxlUmF0ZSwgQXVkaW9VdGlsaXRpZXM6OlNhbXBsZUZyYW1lUm91bmRpbmc6OlVw
KTsKLX0KLQogdm9pZCBEZWxheURTUEtlcm5lbDo6cHJvY2Vzcyhjb25zdCBmbG9hdCogc291cmNl
LCBmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCiB7Ci0gICAgc2l6
ZV90IGJ1ZmZlckxlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKLSAgICBmbG9hdCogYnVmZmVyID0g
bV9idWZmZXIuZGF0YSgpOwotCi0gICAgQVNTRVJUKGJ1ZmZlckxlbmd0aCk7Ci0gICAgaWYgKCFi
dWZmZXJMZW5ndGgpCi0gICAgICAgIHJldHVybjsKLQorICAgIEFTU0VSVChtX2J1ZmZlci5zaXpl
KCkpOwogICAgIEFTU0VSVChzb3VyY2UgJiYgZGVzdGluYXRpb24pOwotICAgIGlmICghc291cmNl
IHx8ICFkZXN0aW5hdGlvbikKKyAgICBpZiAoVU5MSUtFTFkobV9idWZmZXIuaXNFbXB0eSgpIHx8
ICFzb3VyY2UgfHwgIWRlc3RpbmF0aW9uKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZmxvYXQg
c2FtcGxlUmF0ZSA9IHRoaXMtPnNhbXBsZVJhdGUoKTsKLSAgICBkb3VibGUgZGVsYXlUaW1lID0g
MDsKLSAgICBmbG9hdCogZGVsYXlUaW1lcyA9IG1fZGVsYXlUaW1lcy5kYXRhKCk7Ci0gICAgZG91
YmxlIG1heFRpbWUgPSBtYXhEZWxheVRpbWUoKTsKLQogICAgIGJvb2wgc2FtcGxlQWNjdXJhdGUg
PSBkZWxheVByb2Nlc3NvcigpICYmIGRlbGF5UHJvY2Vzc29yKCktPmRlbGF5VGltZSgpLmhhc1Nh
bXBsZUFjY3VyYXRlVmFsdWVzKCk7CiAgICAgYm9vbCBzaG91bGRVc2VBUmF0ZSA9IGRlbGF5UHJv
Y2Vzc29yKCkgJiYgZGVsYXlQcm9jZXNzb3IoKS0+ZGVsYXlUaW1lKCkuYXV0b21hdGlvblJhdGUo
KSA9PSBBdXRvbWF0aW9uUmF0ZTo6QVJhdGU7Ci0KICAgICBpZiAoc2FtcGxlQWNjdXJhdGUgJiYg
c2hvdWxkVXNlQVJhdGUpCi0gICAgICAgIGRlbGF5UHJvY2Vzc29yKCktPmRlbGF5VGltZSgpLmNh
bGN1bGF0ZVNhbXBsZUFjY3VyYXRlVmFsdWVzKGRlbGF5VGltZXMsIGZyYW1lc1RvUHJvY2Vzcyk7
Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRlbGF5VGltZSA9IGRlbGF5UHJvY2Vzc29yKCkgPyBkZWxh
eVByb2Nlc3NvcigpLT5kZWxheVRpbWUoKS5maW5hbFZhbHVlKCkgOiBtX2Rlc2lyZWREZWxheUZy
YW1lcyAvIHNhbXBsZVJhdGU7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVsYXkgdGltZSBp
cyBpbiBhIHZhbGlkIHJhbmdlLgotICAgICAgICBkZWxheVRpbWUgPSBzdGQ6OmNsYW1wKGRlbGF5
VGltZSwgMC4wLCBtYXhUaW1lKTsKLSAgICB9CisgICAgICAgIHByb2Nlc3NBUmF0ZShzb3VyY2Us
IGRlc3RpbmF0aW9uLCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIGVsc2UKKyAgICAgICAgcHJvY2Vz
c0tSYXRlKHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1RvUHJvY2Vzcyk7Cit9CiAKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnJhbWVzVG9Qcm9jZXNzOyArK2kpIHsKLSAgICAgICAg
aWYgKHNhbXBsZUFjY3VyYXRlICYmIHNob3VsZFVzZUFSYXRlKSB7Ci0gICAgICAgICAgICBkZWxh
eVRpbWUgPSBkZWxheVRpbWVzW2ldOwotICAgICAgICAgICAgZGVsYXlUaW1lID0gc3RkOjpjbGFt
cChkZWxheVRpbWUsIDAuMCwgbWF4VGltZSk7Ci0gICAgICAgIH0KK3ZvaWQgRGVsYXlEU1BLZXJu
ZWw6OnByb2Nlc3NBUmF0ZShjb25zdCBmbG9hdCogc291cmNlLCBmbG9hdCogZGVzdGluYXRpb24s
IHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IG1f
YnVmZmVyLnNpemUoKTsKKyAgICBhdXRvKiBidWZmZXIgPSBtX2J1ZmZlci5kYXRhKCk7CisKKyAg
ICBkZWxheVByb2Nlc3NvcigpLT5kZWxheVRpbWUoKS5jYWxjdWxhdGVTYW1wbGVBY2N1cmF0ZVZh
bHVlcyhtX2RlbGF5VGltZXMuZGF0YSgpLCBmcmFtZXNUb1Byb2Nlc3MpOwogCi0gICAgICAgIGRv
dWJsZSBkZXNpcmVkRGVsYXlGcmFtZXMgPSBkZWxheVRpbWUgKiBzYW1wbGVSYXRlOworICAgIGNv
cHlUb0NpcmN1bGFyQnVmZmVyKGJ1ZmZlciwgbV93cml0ZUluZGV4LCBidWZmZXJMZW5ndGgsIHNv
dXJjZSwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBm
cmFtZXNUb1Byb2Nlc3M7ICsraSkgeworICAgICAgICBkb3VibGUgZGVsYXlUaW1lID0gc3RkOjpj
bGFtcDxkb3VibGU+KG1fZGVsYXlUaW1lc1tpXSwgMC4wLCBtYXhEZWxheVRpbWUoKSk7CisgICAg
ICAgIGRvdWJsZSBkZXNpcmVkRGVsYXlGcmFtZXMgPSBkZWxheVRpbWUgKiBzYW1wbGVSYXRlKCk7
CiAKICAgICAgICAgZG91YmxlIHJlYWRQb3NpdGlvbiA9IG1fd3JpdGVJbmRleCArIGJ1ZmZlckxl
bmd0aCAtIGRlc2lyZWREZWxheUZyYW1lczsKICAgICAgICAgaWYgKHJlYWRQb3NpdGlvbiA+PSBi
dWZmZXJMZW5ndGgpCiAgICAgICAgICAgICByZWFkUG9zaXRpb24gLT0gYnVmZmVyTGVuZ3RoOwog
CiAgICAgICAgIC8vIExpbmVhcmx5IGludGVycG9sYXRlIGluLWJldHdlZW4gZGVsYXkgdGltZXMu
Ci0gICAgICAgIGludCByZWFkSW5kZXgxID0gc3RhdGljX2Nhc3Q8aW50PihyZWFkUG9zaXRpb24p
OwotICAgICAgICBpbnQgcmVhZEluZGV4MiA9IChyZWFkSW5kZXgxICsgMSkgJSBidWZmZXJMZW5n
dGg7Ci0gICAgICAgIGRvdWJsZSBpbnRlcnBvbGF0aW9uRmFjdG9yID0gcmVhZFBvc2l0aW9uIC0g
cmVhZEluZGV4MTsKKyAgICAgICAgc2l6ZV90IHJlYWRJbmRleDEgPSBzdGF0aWNfY2FzdDxzaXpl
X3Q+KHJlYWRQb3NpdGlvbik7CisgICAgICAgIHNpemVfdCByZWFkSW5kZXgyID0gKHJlYWRJbmRl
eDEgKyAxKSAlIGJ1ZmZlckxlbmd0aDsKKyAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGlvbkZhY3Rv
ciA9IHJlYWRQb3NpdGlvbiAtIHJlYWRJbmRleDE7CiAKLSAgICAgICAgZG91YmxlIGlucHV0ID0g
c3RhdGljX2Nhc3Q8ZmxvYXQ+KCpzb3VyY2UrKyk7Ci0gICAgICAgIGJ1ZmZlclttX3dyaXRlSW5k
ZXhdID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlucHV0KTsKICAgICAgICAgbV93cml0ZUluZGV4ID0g
KG1fd3JpdGVJbmRleCArIDEpICUgYnVmZmVyTGVuZ3RoOwogCi0gICAgICAgIGRvdWJsZSBzYW1w
bGUxID0gYnVmZmVyW3JlYWRJbmRleDFdOwotICAgICAgICBkb3VibGUgc2FtcGxlMiA9IGJ1ZmZl
cltyZWFkSW5kZXgyXTsKKyAgICAgICAgZmxvYXQgc2FtcGxlMSA9IGJ1ZmZlcltyZWFkSW5kZXgx
XTsKKyAgICAgICAgZmxvYXQgc2FtcGxlMiA9IGJ1ZmZlcltyZWFkSW5kZXgyXTsKKyAgICAgICAg
ZGVzdGluYXRpb25baV0gPSBzYW1wbGUxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIChzYW1wbGUy
IC0gc2FtcGxlMSk7CisgICAgfQorfQogCi0gICAgICAgIGRvdWJsZSBvdXRwdXQgPSAoMS4wIC0g
aW50ZXJwb2xhdGlvbkZhY3RvcikgKiBzYW1wbGUxICsgaW50ZXJwb2xhdGlvbkZhY3RvciAqIHNh
bXBsZTI7CisvLyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBwcm9jZXNzQVJhdGUoKSB3aGVuIHRoZSBk
ZWxheVRpbWUgaXMgY29uc3RhbnQuCit2b2lkIERlbGF5RFNQS2VybmVsOjpwcm9jZXNzS1JhdGUo
Y29uc3QgZmxvYXQqIHNvdXJjZSwgZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgZnJhbWVzVG9Q
cm9jZXNzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7Cisg
ICAgYXV0byogYnVmZmVyID0gbV9idWZmZXIuZGF0YSgpOworCisgICAgZG91YmxlIGRlbGF5VGlt
ZSA9IGRlbGF5UHJvY2Vzc29yKCkgPyBkZWxheVByb2Nlc3NvcigpLT5kZWxheVRpbWUoKS5maW5h
bFZhbHVlKCkgOiBtX2Rlc2lyZWREZWxheUZyYW1lcyAvIHNhbXBsZVJhdGUoKTsKKyAgICAvLyBN
YWtlIHN1cmUgdGhlIGRlbGF5IHRpbWUgaXMgaW4gYSB2YWxpZCByYW5nZS4KKyAgICBkZWxheVRp
bWUgPSBzdGQ6OmNsYW1wKGRlbGF5VGltZSwgMC4wLCBtYXhEZWxheVRpbWUoKSk7CisgICAgZG91
YmxlIGRlc2lyZWREZWxheUZyYW1lcyA9IGRlbGF5VGltZSAqIHNhbXBsZVJhdGUoKTsKKworICAg
IGRvdWJsZSByZWFkUG9zaXRpb24gPSBtX3dyaXRlSW5kZXggKyBidWZmZXJMZW5ndGggLSBkZXNp
cmVkRGVsYXlGcmFtZXM7CisgICAgaWYgKHJlYWRQb3NpdGlvbiA+PSBidWZmZXJMZW5ndGgpCisg
ICAgICAgIHJlYWRQb3NpdGlvbiAtPSBidWZmZXJMZW5ndGg7CisKKyAgICAvLyBMaW5lYXJseSBp
bnRlcnBvbGF0ZSBpbi1iZXR3ZWVuIGRlbGF5IHRpbWVzLiB8cmVhZEluZGV4MXwgYW5kIHxyZWFk
SW5kZXgyfCBhcmUgdGhlIGluZGljZXMgb2YgdGhlIGZyYW1lcyB0byBiZSB1c2VkCisgICAgLy8g
Zm9yIGludGVycG9sYXRpb24uCisgICAgc2l6ZV90IHJlYWRJbmRleDEgPSBzdGF0aWNfY2FzdDxz
aXplX3Q+KHJlYWRQb3NpdGlvbik7CisgICAgZmxvYXQgaW50ZXJwb2xhdGlvbkZhY3RvciA9IHJl
YWRQb3NpdGlvbiAtIHJlYWRJbmRleDE7CisgICAgYXV0byogYnVmZmVyRW5kID0gJmJ1ZmZlclti
dWZmZXJMZW5ndGhdOworICAgIEFTU0VSVChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYnVmZmVyTGVu
Z3RoKSA+PSBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gc2FtcGxlMSBhbmQgc2FtcGxlMiBo
b2xkIHRoZSBjdXJyZW50IGFuZCBuZXh0IHNhbXBsZXMgaW4gdGhlIGJ1ZmZlci4gVGhlc2UgYXJl
IHVzZWQgZm9yIGludGVyb3BsYXRpbmcgdGhlIGRlbGF5IHZhbHVlLgorICAgIC8vIFRvIHJlZHVj
ZSBtZW1vcnkgdXNhZ2UgYW5kIGFuIGV4dHJhIG1lbWNweSwgc2FtcGxlMSBjYW4gYmUgdGhlIHNh
bWUgYXMgZGVzdGluYXRpb24uCisgICAgLy8gVmVjdG9yTWF0aDo6aW50ZXJwb2xhdGUoKSBiZWxv
dyBoYXMgYW4gb3B0aW1pemF0aW9uIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBpbnB1dCBidWZmZXIg
aXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBvbmUuCisgICAgYXV0byogc2FtcGxlMSA9IGRlc3Rp
bmF0aW9uOworCisgICAgLy8gQ29weSBkYXRhIGZyb20gdGhlIHNvdXJjZSBpbnRvIHRoZSBidWZm
ZXIsIHN0YXJ0aW5nIGF0IHRoZSB3cml0ZSBpbmRleC4gVGhlIGJ1ZmZlciBpcyBjaXJjdWxhciwg
c28gY2FyZWZ1bGx5IGhhbmRsZQorICAgIC8vIHRoZSB3cmFwcGluZyBvZiB0aGUgd3JpdGUgcG9p
bnRlci4KKyAgICBjb3B5VG9DaXJjdWxhckJ1ZmZlcihidWZmZXIsIG1fd3JpdGVJbmRleCwgYnVm
ZmVyTGVuZ3RoLCBzb3VyY2UsIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgbV93cml0ZUluZGV4ID0g
KG1fd3JpdGVJbmRleCArIGZyYW1lc1RvUHJvY2VzcykgJSBidWZmZXJMZW5ndGg7CisKKyAgICAv
LyBOb3cgY29weSBvdXQgdGhlIHNhbXBsZXMgZnJvbSB0aGUgYnVmZmVyLCBzdGFydGluZyBhdCB0
aGUgcmVhZCBwb2ludGVyLCBjYXJlZnVsbHkgaGFuZGxpbmcgd3JhcHBpbmcgb2YgdGhlIHJlYWQg
cG9pbnRlci4KKyAgICBhdXRvKiByZWFkUG9pbnRlciA9ICZidWZmZXJbcmVhZEluZGV4MV07CisK
KyAgICBzaXplX3QgcmVtYWluZGVyID0gcG9zaXRpdmVTdWJ0cmFjdChidWZmZXJFbmQsIHJlYWRQ
b2ludGVyKTsKKyAgICBtZW1jcHkoc2FtcGxlMSwgcmVhZFBvaW50ZXIsIHNpemVvZigqc2FtcGxl
MSkgKiBzdGQ6Om1pbihmcmFtZXNUb1Byb2Nlc3MsIHJlbWFpbmRlcikpOworICAgIG1lbWNweShz
YW1wbGUxICsgcmVtYWluZGVyLCBidWZmZXIsIHNpemVvZigqc2FtcGxlMSkgKiBwb3NpdGl2ZVN1
YnRyYWN0KGZyYW1lc1RvUHJvY2VzcywgcmVtYWluZGVyKSk7CisKKyAgICAvLyBJZiBpbnRlcnBv
bGF0aW9uRmFjdG9yIGlzIDAsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IGludGVycG9sYXRpb24g
YW5kIHNhbXBsZTEgY29udGFpbnMgdGhlIGRlc2lyZWQgdmFsdWVzLgorICAgIGlmICghaW50ZXJw
b2xhdGlvbkZhY3RvcikKKyAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICpkZXN0aW5hdGlvbisr
ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG91dHB1dCk7Ci0gICAgfQorICAgIEFTU0VSVChmcmFtZXNU
b1Byb2Nlc3MgPD0gbV90ZW1wQnVmZmVyLnNpemUoKSk7CisKKyAgICBzaXplX3QgcmVhZEluZGV4
MiA9IChyZWFkSW5kZXgxICsgMSkgJSBidWZmZXJMZW5ndGg7CisgICAgYXV0byogc2FtcGxlMiA9
IG1fdGVtcEJ1ZmZlci5kYXRhKCk7CisKKyAgICByZWFkUG9pbnRlciA9ICZidWZmZXJbcmVhZElu
ZGV4Ml07CisgICAgcmVtYWluZGVyID0gcG9zaXRpdmVTdWJ0cmFjdChidWZmZXJFbmQsIHJlYWRQ
b2ludGVyKTsKKyAgICBtZW1jcHkoc2FtcGxlMiwgcmVhZFBvaW50ZXIsIHNpemVvZigqc2FtcGxl
MikgKiBzdGQ6Om1pbihmcmFtZXNUb1Byb2Nlc3MsIHJlbWFpbmRlcikpOworICAgIG1lbWNweShz
YW1wbGUyICsgcmVtYWluZGVyLCBidWZmZXIsIHNpemVvZigqc2FtcGxlMikgKiBwb3NpdGl2ZVN1
YnRyYWN0KGZyYW1lc1RvUHJvY2VzcywgcmVtYWluZGVyKSk7CisKKyAgICAvLyBJbnRlcnBvbGF0
ZSBzYW1wbGVzLgorICAgIC8vIGRlc3RpbmF0aW9uW2tdID0gc2FtcGxlMVtrXSArIGludGVycG9s
YXRpb25GYWN0b3IgKiAoc2FtcGxlMltrXSAtIHNhbXBsZTFba10pOworICAgIFZlY3Rvck1hdGg6
OmludGVycG9sYXRlKHNhbXBsZTEsIHNhbXBsZTIsIGludGVycG9sYXRpb25GYWN0b3IsIGRlc3Rp
bmF0aW9uLCBmcmFtZXNUb1Byb2Nlc3MpOwogfQogCiB2b2lkIERlbGF5RFNQS2VybmVsOjpwcm9j
ZXNzT25seUF1ZGlvUGFyYW1zKHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmggYi9Tb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0RlbGF5RFNQS2VybmVsLmgKaW5kZXggNThlNzgxZmUz
NTQwM2YyZjhmNzQ0MmJjYThkNjYwM2E5M2Q0MjhiNy4uYWUzMzcyZjIzY2FjMzhlNWY5OGYyNjIw
ZmM2YWZhZjVkODI5OWViOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJh
dWRpby9EZWxheURTUEtlcm5lbC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVk
aW8vRGVsYXlEU1BLZXJuZWwuaApAQCAtNTAsMTUgKzUwLDE5IEBAIHB1YmxpYzoKICAgICBib29s
IHJlcXVpcmVzVGFpbFByb2Nlc3NpbmcoKSBjb25zdCBmaW5hbDsKIAogcHJpdmF0ZToKKyAgICB2
b2lkIHByb2Nlc3NBUmF0ZShjb25zdCBmbG9hdCogc291cmNlLCBmbG9hdCogZGVzdGluYXRpb24s
IHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIHZvaWQgcHJvY2Vzc0tSYXRlKGNvbnN0IGZs
b2F0KiBzb3VyY2UsIGZsb2F0KiBkZXN0aW5hdGlvbiwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7
CisKICAgICBBdWRpb0Zsb2F0QXJyYXkgbV9idWZmZXI7CiAgICAgZG91YmxlIG1fbWF4RGVsYXlU
aW1lOwotICAgIGludCBtX3dyaXRlSW5kZXggeyAwIH07CisgICAgc2l6ZV90IG1fd3JpdGVJbmRl
eCB7IDAgfTsKICAgICBkb3VibGUgbV9kZXNpcmVkRGVsYXlGcmFtZXM7CiAKICAgICBBdWRpb0Zs
b2F0QXJyYXkgbV9kZWxheVRpbWVzOworICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCB0byBo
b2xkIHRoZSBzZWNvbmQgc2FtcGxlIGZvciBpbnRlcnBvbGF0aW9uIGlmIG5lZWRlZC4KKyAgICBB
dWRpb0Zsb2F0QXJyYXkgbV90ZW1wQnVmZmVyOwogCiAgICAgRGVsYXlQcm9jZXNzb3IqIGRlbGF5
UHJvY2Vzc29yKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8RGVsYXlQcm9jZXNzb3IqPihwcm9jZXNz
b3IoKSk7IH0KLSAgICBzaXplX3QgYnVmZmVyTGVuZ3RoRm9yRGVsYXkoZG91YmxlIGRlbGF5VGlt
ZSwgZG91YmxlIHNhbXBsZVJhdGUpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9BcnJheS5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vQXVkaW9BcnJheS5oCmluZGV4IGNkMWEz
MTQxYmJjZDYxMTdhZWM4ODNmMzU0NjM1MzJhYWE4OTcxM2IuLmIwNzM0ZGQ2MWI4YzQxNzIxYzll
OTRjODdkODc2MWI0YjFmMTM3ZmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL0F1ZGlvQXJyYXkuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9B
dWRpb0FycmF5LmgKQEAgLTcyLDYgKzcyLDcgQEAgcHVibGljOgogICAgIFQqIGRhdGEoKSB7IHJl
dHVybiBtX2FsbG9jYXRpb247IH0KICAgICBjb25zdCBUKiBkYXRhKCkgY29uc3QgeyByZXR1cm4g
bV9hbGxvY2F0aW9uOyB9CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7
IH0KKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhbV9zaXplOyB9CiAKICAgICBU
JiBhdChzaXplX3QgaSkKICAgICB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9WZWN0b3JNYXRoLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1Zl
Y3Rvck1hdGguY3BwCmluZGV4IGQxMDMyNzdiZWE0NGNiZGYxYTlmZDAyNmVjNDQyZTM0MzUwY2Zj
ODIuLjk1MWZkZjU2ZDcxNjAzODBlZGQ4YjIxYTY2ZTY0ODIyZGNiNDA3MjEgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGguY3BwCkBAIC02Miw2ICs2MiwxMSBA
QCB2b2lkIGFkZChjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25zdCBmbG9hdCogaW5wdXRW
ZWN0b3IyLCBmbG9hdCogb3V0cHV0VmVjdAogICAgIHZEU1BfdmFkZChpbnB1dFZlY3RvcjEsIDEs
IGlucHV0VmVjdG9yMiwgMSwgb3V0cHV0VmVjdG9yLCAxLCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9j
ZXNzKTsKIH0KIAordm9pZCBzdWJzdHJhY3QoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29u
c3QgZmxvYXQqIGlucHV0VmVjdG9yMiwgZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJl
ck9mRWxlbWVudHNUb1Byb2Nlc3MpCit7CisgICAgdkRTUF92c3ViKGlucHV0VmVjdG9yMSwgMSwg
aW5wdXRWZWN0b3IyLCAxLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nl
c3MpOworfQorCiB2b2lkIGFkZFNjYWxhcihjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IsIGZsb2F0
IHNjYWxhciwgZmxvYXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1By
b2Nlc3MpCiB7CiAgICAgdkRTUF92c2FkZChpbnB1dFZlY3RvciwgMSwgJnNjYWxhciwgb3V0cHV0
VmVjdG9yLCAxLCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKQEAgLTcyLDYgKzc3LDExIEBA
IHZvaWQgbXVsdGlwbHkoY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlu
cHV0VmVjdG9yMiwgZmxvYXQqIG91dHB1CiAgICAgdkRTUF92bXVsKGlucHV0VmVjdG9yMSwgMSwg
aW5wdXRWZWN0b3IyLCAxLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nl
c3MpOwogfQogCit2b2lkIGludGVycG9sYXRlKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGZs
b2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0IGludGVycG9sYXRpb25GYWN0b3IsIGZsb2F0KiBvdXRw
dXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKQoreworICAgIHZEU1Bf
dmludGIoaW5wdXRWZWN0b3IxLCAxLCBpbnB1dFZlY3RvcjIsIDEsICZpbnRlcnBvbGF0aW9uRmFj
dG9yLCBvdXRwdXRWZWN0b3IsIDEsIG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOworfQorCiB2
b2lkIG11bHRpcGx5Q29tcGxleChjb25zdCBmbG9hdCogcmVhbFZlY3RvcjEsIGNvbnN0IGZsb2F0
KiBpbWFnVmVjdG9yMSwgY29uc3QgZmxvYXQqIHJlYWxWZWN0b3IyLCBjb25zdCBmbG9hdCogaW1h
ZzJQLCBmbG9hdCogcmVhbE91dHB1dFZlY3RvciwgZmxvYXQqIGltYWdEZXN0UCwgc2l6ZV90IG51
bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpCiB7CiAgICAgRFNQU3BsaXRDb21wbGV4IHNjMTsKQEAg
LTQzMCw2ICs0NDAsMTE1IEBAIHZvaWQgYWRkKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGNv
bnN0IGZsb2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0KiBvdXRwdXRWZWN0CiAgICAgfQogfQogCit2
b2lkIHN1YnN0cmFjdChjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IxLCBjb25zdCBmbG9hdCogaW5w
dXRWZWN0b3IyLCBmbG9hdCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVyT2ZFbGVtZW50c1Rv
UHJvY2VzcykKK3sKKyAgICBzaXplX3QgbiA9IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3M7CisK
KyNpZiBDUFUoWDg2X1NTRTIpCisgICAgLy8gSWYgdGhlIGlucHV0VmVjdG9yIGFkZHJlc3MgaXMg
bm90IDE2LWJ5dGUgYWxpZ25lZCwgdGhlIGZpcnN0IHNldmVyYWwgZnJhbWVzIChhdCBtb3N0IHRo
cmVlKSBzaG91bGQgYmUgcHJvY2Vzc2VkIHNlcGFyYXRlbHkuCisgICAgd2hpbGUgKCFpczE2Qnl0
ZUFsaWduZWQoaW5wdXRWZWN0b3IxKSAmJiBuKSB7CisgICAgICAgICpvdXRwdXRWZWN0b3IgPSAq
aW5wdXRWZWN0b3IxIC0gKmlucHV0VmVjdG9yMjsKKyAgICAgICAgaW5wdXRWZWN0b3IxKys7Cisg
ICAgICAgIGlucHV0VmVjdG9yMisrOworICAgICAgICBvdXRwdXRWZWN0b3IrKzsKKyAgICAgICAg
bi0tOworICAgIH0KKworICAgIC8vIE5vdyB0aGUgaW5wdXRWZWN0b3IxIGFkZHJlc3MgaXMgYWxp
Z25lZCBhbmQgc3RhcnQgdG8gYXBwbHkgU1NFLgorICAgIHNpemVfdCBncm91cCA9IG4gLyA0Owor
ICAgIF9fbTEyOCogcFNvdXJjZTE7CisgICAgX19tMTI4KiBwU291cmNlMjsKKyAgICBfX20xMjgq
IHBEZXN0OworICAgIF9fbTEyOCBzb3VyY2UyOworICAgIF9fbTEyOCBkZXN0OworCisgICAgYm9v
bCBzb3VyY2UyQWxpZ25lZCA9IGlzMTZCeXRlQWxpZ25lZChpbnB1dFZlY3RvcjIpOworICAgIGJv
b2wgZGVzdEFsaWduZWQgPSBpczE2Qnl0ZUFsaWduZWQob3V0cHV0VmVjdG9yKTsKKworICAgIGlm
IChzb3VyY2UyQWxpZ25lZCAmJiBkZXN0QWxpZ25lZCkgeyAvLyBhbGwgYWxpZ25lZAorICAgICAg
ICB3aGlsZSAoZ3JvdXAtLSkgeworICAgICAgICAgICAgcFNvdXJjZTEgPSByZWludGVycHJldF9j
YXN0PF9fbTEyOCo+KGNvbnN0X2Nhc3Q8ZmxvYXQqPihpbnB1dFZlY3RvcjEpKTsKKyAgICAgICAg
ICAgIHBTb3VyY2UyID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjgqPihjb25zdF9jYXN0PGZsb2F0
Kj4oaW5wdXRWZWN0b3IyKSk7CisgICAgICAgICAgICBwRGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
X19tMTI4Kj4ob3V0cHV0VmVjdG9yKTsKKyAgICAgICAgICAgICpwRGVzdCA9IF9tbV9zdWJfcHMo
KnBTb3VyY2UxLCAqcFNvdXJjZTIpOworCisgICAgICAgICAgICBpbnB1dFZlY3RvcjEgKz0gNDsK
KyAgICAgICAgICAgIGlucHV0VmVjdG9yMiArPSA0OworICAgICAgICAgICAgb3V0cHV0VmVjdG9y
ICs9IDQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNvdXJjZTJBbGlnbmVkICYmICFkZXN0
QWxpZ25lZCkgeyAvLyBzb3VyY2UyIGFsaWduZWQgYnV0IGRlc3Qgbm90IGFsaWduZWQKKyAgICAg
ICAgd2hpbGUgKGdyb3VwLS0pIHsKKyAgICAgICAgICAgIHBTb3VyY2UxID0gcmVpbnRlcnByZXRf
Y2FzdDxfX20xMjgqPihjb25zdF9jYXN0PGZsb2F0Kj4oaW5wdXRWZWN0b3IxKSk7CisgICAgICAg
ICAgICBwU291cmNlMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8X19tMTI4Kj4oY29uc3RfY2FzdDxmbG9h
dCo+KGlucHV0VmVjdG9yMikpOworICAgICAgICAgICAgZGVzdCA9IF9tbV9zdWJfcHMoKnBTb3Vy
Y2UxLCAqcFNvdXJjZTIpOworICAgICAgICAgICAgX21tX3N0b3JldV9wcyhvdXRwdXRWZWN0b3Is
IGRlc3QpOworCisgICAgICAgICAgICBpbnB1dFZlY3RvcjEgKz0gNDsKKyAgICAgICAgICAgIGlu
cHV0VmVjdG9yMiArPSA0OworICAgICAgICAgICAgb3V0cHV0VmVjdG9yICs9IDQ7CisgICAgICAg
IH0KKyAgICB9IGVsc2UgaWYgKCFzb3VyY2UyQWxpZ25lZCAmJiBkZXN0QWxpZ25lZCkgeyAvLyBz
b3VyY2UyIG5vdCBhbGlnbmVkIGJ1dCBkZXN0IGFsaWduZWQKKyAgICAgICAgd2hpbGUgKGdyb3Vw
LS0pIHsKKyAgICAgICAgICAgIHBTb3VyY2UxID0gcmVpbnRlcnByZXRfY2FzdDxfX20xMjgqPihj
b25zdF9jYXN0PGZsb2F0Kj4oaW5wdXRWZWN0b3IxKSk7CisgICAgICAgICAgICBzb3VyY2UyID0g
X21tX2xvYWR1X3BzKGlucHV0VmVjdG9yMik7CisgICAgICAgICAgICBwRGVzdCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8X19tMTI4Kj4ob3V0cHV0VmVjdG9yKTsKKyAgICAgICAgICAgICpwRGVzdCA9IF9t
bV9zdWJfcHMoKnBTb3VyY2UxLCBzb3VyY2UyKTsKKworICAgICAgICAgICAgaW5wdXRWZWN0b3Ix
ICs9IDQ7CisgICAgICAgICAgICBpbnB1dFZlY3RvcjIgKz0gNDsKKyAgICAgICAgICAgIG91dHB1
dFZlY3RvciArPSA0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc291cmNlMkFsaWduZWQg
JiYgIWRlc3RBbGlnbmVkKSB7IC8vIGJvdGggc291cmNlMiBhbmQgZGVzdCBub3QgYWxpZ25lZAor
ICAgICAgICB3aGlsZSAoZ3JvdXAtLSkgeworICAgICAgICAgICAgcFNvdXJjZTEgPSByZWludGVy
cHJldF9jYXN0PF9fbTEyOCo+KGNvbnN0X2Nhc3Q8ZmxvYXQqPihpbnB1dFZlY3RvcjEpKTsKKyAg
ICAgICAgICAgIHNvdXJjZTIgPSBfbW1fbG9hZHVfcHMoaW5wdXRWZWN0b3IyKTsKKyAgICAgICAg
ICAgIGRlc3QgPSBfbW1fc3ViX3BzKCpwU291cmNlMSwgc291cmNlMik7CisgICAgICAgICAgICBf
bW1fc3RvcmV1X3BzKG91dHB1dFZlY3RvciwgZGVzdCk7CisKKyAgICAgICAgICAgIGlucHV0VmVj
dG9yMSArPSA0OworICAgICAgICAgICAgaW5wdXRWZWN0b3IyICs9IDQ7CisgICAgICAgICAgICBv
dXRwdXRWZWN0b3IgKz0gNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vbi1TU0UgaGFu
ZGxpbmcgZm9yIHJlbWFpbmluZyBmcmFtZXMgd2hpY2ggaXMgbGVzcyB0aGFuIDQuCisgICAgbiAl
PSA0OworI2VsaWYgSEFWRShBUk1fTkVPTl9JTlRSSU5TSUNTKQorICAgIHNpemVfdCB0YWlsRnJh
bWVzID0gbiAlIDQ7CisgICAgY29uc3QgZmxvYXQqIGVuZFAgPSBvdXRwdXRWZWN0b3IgKyBuIC0g
dGFpbEZyYW1lczsKKworICAgIHdoaWxlIChvdXRwdXRWZWN0b3IgPCBlbmRQKSB7CisgICAgICAg
IGZsb2F0MzJ4NF90IHNvdXJjZTEgPSB2bGQxcV9mMzIoaW5wdXRWZWN0b3IxKTsKKyAgICAgICAg
ZmxvYXQzMng0X3Qgc291cmNlMiA9IHZsZDFxX2YzMihpbnB1dFZlY3RvcjIpOworICAgICAgICB2
c3QxcV9mMzIob3V0cHV0VmVjdG9yLCB2c3VicV9mMzIoc291cmNlMSwgc291cmNlMikpOworCisg
ICAgICAgIGlucHV0VmVjdG9yMSArPSA0OworICAgICAgICBpbnB1dFZlY3RvcjIgKz0gNDsKKyAg
ICAgICAgb3V0cHV0VmVjdG9yICs9IDQ7CisgICAgfQorICAgIG4gPSB0YWlsRnJhbWVzOworI2Vu
ZGlmCisgICAgd2hpbGUgKG4tLSkgeworICAgICAgICAqb3V0cHV0VmVjdG9yID0gKmlucHV0VmVj
dG9yMSAtICppbnB1dFZlY3RvcjI7CisgICAgICAgICsraW5wdXRWZWN0b3IxOworICAgICAgICAr
K2lucHV0VmVjdG9yMjsKKyAgICAgICAgKytvdXRwdXRWZWN0b3I7CisgICAgfQorfQorCit2b2lk
IGludGVycG9sYXRlKGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGZsb2F0KiBpbnB1dFZlY3Rv
cjIsIGZsb2F0IGludGVycG9sYXRpb25GYWN0b3IsIGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVf
dCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKQoreworICAgIGlmIChpbnB1dFZlY3RvcjEgIT0g
b3V0cHV0VmVjdG9yKQorICAgICAgICBtZW1jcHkob3V0cHV0VmVjdG9yLCBpbnB1dFZlY3RvcjEs
IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIC8vIGlu
cHV0VmVjdG9yMltrXSA9IGlucHV0VmVjdG9yMltrXSAtIGlucHV0VmVjdG9yMVtrXQorICAgIHN1
YnN0cmFjdChpbnB1dFZlY3RvcjIsIGlucHV0VmVjdG9yMSwgaW5wdXRWZWN0b3IyLCBudW1iZXJP
ZkVsZW1lbnRzVG9Qcm9jZXNzKTsKKworICAgIC8vIG91dHB1dFZlY3RvcltrXSA9IG91dHB1dFZl
Y3RvcltrXSArIGludGVycG9sYXRpb25GYWN0b3IgKiBpbnB1dFZlY3RvcjJba10KKyAgICAvLyAg
ICAgICAgICAgICAgICAgPSBpbnB1dFZlY3RvcjFba10gKyBpbnRlcnBvbGF0aW9uRmFjdG9yICog
KGlucHV0VmVjdG9yMltrXSAtIGlucHV0VmVjdG9yMVtrXSk7CisgICAgbXVsdGlwbHlCeVNjYWxh
clRoZW5BZGRUb091dHB1dChpbnB1dFZlY3RvcjIsIGludGVycG9sYXRpb25GYWN0b3IsIG91dHB1
dFZlY3RvciwgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2Vzcyk7Cit9CisKIHZvaWQgbXVsdGlwbHko
Y29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHV0VmVjdG9yMiwgZmxv
YXQqIG91dHB1dFZlY3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpCiB7CiAg
ICAgc2l6ZV90IG4gPSBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzOwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vYXVkaW8vVmVjdG9yTWF0aC5oCmluZGV4IDg4MzY2YzhmNjU5NjM5MjFiYjAyMTkx
OTk2MzJhNDEwY2ExNjZkOGEuLmZmNmFiOWFlZWFiNzg4Zjc2MmMwNTkzNDIxMjc3Njg5NzhiNjZl
NzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1ZlY3Rvck1hdGgu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9WZWN0b3JNYXRoLmgKQEAgLTQ3
LDYgKzQ3LDcgQEAgdm9pZCBhZGRWZWN0b3JzVGhlbk11bHRpcGx5QnlTY2FsYXIoY29uc3QgZmxv
YXQqIGlucHV0VmVjdG9yMSwgY29uc3QgZmxvYXQqIGlucHUKIHZvaWQgbXVsdGlwbHlCeVNjYWxh
cihjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IsIGZsb2F0IHNjYWxhciwgZmxvYXQqIG91dHB1dFZl
Y3Rvciwgc2l6ZV90IG51bWJlck9mRWxlbWVudHNUb1Byb2Nlc3MpOwogdm9pZCBhZGRTY2FsYXIo
Y29uc3QgZmxvYXQqIGlucHV0VmVjdG9yLCBmbG9hdCBzY2FsYXIsIGZsb2F0KiBvdXRwdXRWZWN0
b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKIHZvaWQgYWRkKGNvbnN0IGZs
b2F0KiBpbnB1dFZlY3RvcjEsIGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjIsIGZsb2F0KiBvdXRw
dXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKK3ZvaWQgc3Vic3Ry
YWN0KGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjEsIGNvbnN0IGZsb2F0KiBpbnB1dFZlY3RvcjIs
IGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsK
IAogLy8gRmluZHMgdGhlIG1heGltdW0gbWFnbml0dWRlIG9mIGEgZmxvYXQgdmVjdG9yLgogZmxv
YXQgbWF4aW11bU1hZ25pdHVkZShjb25zdCBmbG9hdCogaW5wdXRWZWN0b3IsIHNpemVfdCBudW1i
ZXJPZkVsZW1lbnRzVG9Qcm9jZXNzKTsKQEAgLTY1LDYgKzY2LDEyIEBAIHZvaWQgY2xhbXAoY29u
c3QgZmxvYXQqIGlucHV0VmVjdG9yLCBmbG9hdCBtaW5pbnVtLCBmbG9hdCBtYXhpbXVtLCBmbG9h
dCogb3V0cHV0CiAKIHZvaWQgbGluZWFyVG9EZWNpYmVscyhjb25zdCBmbG9hdCogaW5wdXRWZWN0
b3IsIGZsb2F0KiBvdXRwdXRWZWN0b3IsIHNpemVfdCBudW1iZXJPZkVsZW1lbnRzVG9Qcm9jZXNz
KTsKIAorLy8gQ2FsY3VsYXRlcyB0aGUgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUg
c3VwcGxpZWQgc2luZ2xlLXByZWNpc2lvbiB2ZWN0b3JzCisvLyBmb3IgKG4gPSAwOyBuIDwgbnVt
YmVyT2ZFbGVtZW50c1RvUHJvY2VzczsgKytuKQorLy8gICAgIG91dHB1dFZlY3RvcltuXSA9IGlu
cHV0VmVjdG9yMVtuXSArIGludGVycG9sYXRpb25GYWN0b3IgKiAoaW5wdXRWZWN0b3IyW25dIC0g
aW5wdXRWZWN0b3IxW25dKTsKKy8vIE5PVEU6IEludGVybmFsIGltcGxlbWVudGF0aW9uIG1heSBt
b2RpZnkgaW5wdXRWZWN0b3IyLgordm9pZCBpbnRlcnBvbGF0ZShjb25zdCBmbG9hdCogaW5wdXRW
ZWN0b3IxLCBmbG9hdCogaW5wdXRWZWN0b3IyLCBmbG9hdCBpbnRlcnBvbGF0aW9uRmFjdG9yLCBm
bG9hdCogb3V0cHV0VmVjdG9yLCBzaXplX3QgbnVtYmVyT2ZFbGVtZW50c1RvUHJvY2Vzcyk7CisK
IH0gLy8gbmFtZXNwYWNlIFZlY3Rvck1hdGgKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>