<?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>32466</bug_id>
          
          <creation_ts>2009-12-12 00:47:59 -0800</creation_ts>
          <short_desc>Performance problems with index validation code for drawElements</short_desc>
          <delta_ts>2009-12-16 10:51:10 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>32457</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>brettw</cc>
    
    <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>oliver</cc>
    
    <cc>petersont</cc>
    
    <cc>rlp</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>171074</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-12 00:47:59 -0800</bug_when>
    <thetext>The code added in https://bugs.webkit.org/show_bug.cgi?id=31239 which validates indices during drawElements calls is inefficient and performs repeated work every frame. It is difficult to optimize these checks for all usage patterns, but a simple cache of the maximum index per element array buffer can bring a large speedup in the common case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171080</commentid>
    <comment_count>1</comment_count>
      <attachid>44734</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-12 01:17:18 -0800</bug_when>
    <thetext>Created attachment 44734
Patch

Added a cache of the maximum index for each element type to WebGLBuffer, querying it before iterating through the indices in the client-side copy of the buffer&apos;s data. Hoisted checks of the size of the element array itself into validateElementArraySize to avoid duplicating code.

Because this is a performance fix I wasn&apos;t able to write a layout test for it. A manual test, manual-tests/webgl/ManyPlanetsDeepHiRes.html, was added which runs 50% faster after this fix. All previous layout tests for out-of-range indices continue to pass.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171081</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-12 01:19:09 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 44734 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171148</commentid>
    <comment_count>3</comment_count>
      <attachid>44734</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-12-12 18:47:54 -0800</bug_when>
    <thetext>Comment on attachment 44734
Patch

What happens if I write an out of range value into the array?  Afaict that won&apos;t invalidate the cache</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171166</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-12 22:38:48 -0800</bug_when>
    <thetext>The only way to upload data to the GL&apos;s element array is via bufferData or bufferSubData.

If there is any way that mutating a WebGL[T]Array can cause the client-side data referred to by the WebGLBuffer to change, that is a separate preexisting bug that needs to be filed. The current validation code would already be wrong in that case. Data with an out of range value could be uploaded to the GL, and then the source WebGLUnsignedByte/UnsignedShortArray could be mutated to change the out of range value to a valid one. The validation code would pass, since it is looking at client-side data, but the GL&apos;s uploaded version could still cause a crash.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171944</commentid>
    <comment_count>5</comment_count>
      <attachid>44734</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-12-15 11:26:54 -0800</bug_when>
    <thetext>Comment on attachment 44734
Patch

&gt; Index: WebCore/html/canvas/WebGLBuffer.cpp
...
&gt; +void WebGLBuffer::setCachedMaxIndex(unsigned long type, long value)
&gt; +{
&gt; +    int numEntries = sizeof(m_maxIndexCache) / sizeof(MaxIndexCacheEntry);

nit: You should probably change &quot;i&quot; and &quot;numEntries&quot; to be size_t.


&gt; Index: WebCore/html/canvas/WebGLBuffer.h
...
&gt; +        // Optimization for index validation. For each type of index
&gt; +        // (i.e., UNSIGNED_SHORT), cache the maximum index in the
&gt; +        // entire buffer.
&gt; +        // 
&gt; +        // This is sufficient to eliminate a lot of work upon each
&gt; +        // draw call as long as all bound array buffers are at least
&gt; +        // that size.
&gt; +        struct MaxIndexCacheEntry {
&gt; +            unsigned long type;
&gt; +            long maxIndex;
&gt; +        };
&gt; +        // OpenGL ES 2.0 only has two valid index types (UNSIGNED_BYTE
&gt; +        // and UNSIGNED_SHORT), but might as well leave open the
&gt; +        // possibility of adding others.
&gt; +        MaxIndexCacheEntry m_maxIndexCache[4];
&gt; +        unsigned m_nextAvailableCacheEntry;

nit: If I were writing this code, I would just have two member variables:

  long m_unsignedByteMaxIndex;
  long m_unsignedShortMaxIndex;

Then I&apos;d have a case-switch in the set function that hits an ASSERT_NOT_REACHED
if given an unknown type.  That way it is really obvious that we should add
another variable in the future.  I think this is simpler, but I agree that your
solution avoids the need to make any future code changes, which might be nice.


&gt; Index: WebCore/html/canvas/WebGLRenderingContext.cpp
...
&gt; -    if (offset &lt; 0 || !validateIndexArray(count, type, offset, numElements) || !validateRenderingState(numElements)) {
&gt; +     if (offset &lt; 0
&gt; +         || !validateElementArraySize(count, type, offset)
&gt; +         || ((!validateIndexArrayConservative(type, numElements) || !validateRenderingState(numElements))
&gt; +               &amp;&amp; (!validateIndexArrayPrecise(count, type, offset, numElements) || !validateRenderingState(numElements)))) {

nit: I think it would help readability to break this out into a separate
helper function or multiple if checks.


&gt; Index: WebCore/manual-tests/webgl/ManyPlanetsDeepHiRes.html

Since this is mostly a copy of ManyPlanetsDeep.html, can you please
re-factor to avoid duplication?  Maybe the original HTML file can be
loaded as an IFRAME w/ a query parameter to adjust the values of the
call to makeSphere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171972</commentid>
    <comment_count>6</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-12-15 12:12:48 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; The only way to upload data to the GL&apos;s element array is via bufferData or
&gt; bufferSubData.
&gt; 
&gt; If there is any way that mutating a WebGL[T]Array can cause the client-side
&gt; data referred to by the WebGLBuffer to change, that is a separate preexisting
&gt; bug that needs to be filed. The current validation code would already be wrong
&gt; in that case. Data with an out of range value could be uploaded to the GL, and
&gt; then the source WebGLUnsignedByte/UnsignedShortArray could be mutated to change
&gt; the out of range value to a valid one. The validation code would pass, since it
&gt; is looking at client-side data, but the GL&apos;s uploaded version could still cause
&gt; a crash.

Ken, ah so you&apos;re caching the bounds when the array is bound?  I was assuming a better way would be to cache on set otherwise every time you rebind an object it would need its bounds recomputed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171990</commentid>
    <comment_count>7</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 13:09:47 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #4)
&gt; &gt; The only way to upload data to the GL&apos;s element array is via bufferData or
&gt; &gt; bufferSubData.
&gt; &gt; 
&gt; &gt; If there is any way that mutating a WebGL[T]Array can cause the client-side
&gt; &gt; data referred to by the WebGLBuffer to change, that is a separate preexisting
&gt; &gt; bug that needs to be filed. The current validation code would already be wrong
&gt; &gt; in that case. Data with an out of range value could be uploaded to the GL, and
&gt; &gt; then the source WebGLUnsignedByte/UnsignedShortArray could be mutated to change
&gt; &gt; the out of range value to a valid one. The validation code would pass, since it
&gt; &gt; is looking at client-side data, but the GL&apos;s uploaded version could still cause
&gt; &gt; a crash.
&gt; 
&gt; Ken, ah so you&apos;re caching the bounds when the array is bound?  I was assuming a
&gt; better way would be to cache on set otherwise every time you rebind an object
&gt; it would need its bounds recomputed.

No, the caches are computed lazily, when the index buffer is referenced by a drawElements call. The caches are cleared whenever new user data is uploaded into the index buffer via bufferData or bufferSubData.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172036</commentid>
    <comment_count>8</comment_count>
      <attachid>44910</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 14:24:32 -0800</bug_when>
    <thetext>Created attachment 44910
Revised patch

Changed int variables in WebGLBuffer::setCachedMaxIndex to size_t.

Split complex if statement in WebGLRenderingContext::drawElements into a few separate ifs.

Refactored JavaScript code in ManyPlanetsDeep into ManyPlanetsDeep.js. I tried sourcing ManyPlanetsDeep.html as an iframe but the computation of the canvas&apos;s size broke, so this was the most easily achievable refactoring.

I left the caching code as is. The current code is not that complex and is future-proof.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172083</commentid>
    <comment_count>9</comment_count>
      <attachid>44910</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-15 16:03:40 -0800</bug_when>
    <thetext>Comment on attachment 44910
Revised patch

Rejecting patch 44910 from commit-queue.

Failed to run &quot;[&apos;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply&apos;, &apos;--reviewer&apos;, &apos;Darin Fisher&apos;, &apos;--force&apos;]&quot; exit_code: 1
Last 500 characters of output:
------------
|Index: WebCore/manual-tests/webgl/ManyPlanetsDeep.html
|===================================================================
|--- WebCore/manual-tests/webgl/ManyPlanetsDeep.html	(revision 52167)
|+++ WebCore/manual-tests/webgl/ManyPlanetsDeep.html	(working copy)
--------------------------
No file to patch.  Skipping patch.
2 out of 2 hunks ignored
patching file WebCore/manual-tests/webgl/ManyPlanetsDeepHiRes.html
patching file WebCore/manual-tests/webgl/resources/ManyPlanetsDeep.js

Full output: http://webkit-commit-queue.appspot.com/results/128313</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172105</commentid>
    <comment_count>10</comment_count>
      <attachid>44910</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-15 16:52:22 -0800</bug_when>
    <thetext>Comment on attachment 44910
Revised patch

Rejecting patch 44910 from commit-queue.

Failed to run &quot;[&apos;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply&apos;, &apos;--reviewer&apos;, &apos;Darin Fisher&apos;, &apos;--force&apos;]&quot; exit_code: 1
Last 500 characters of output:
------------
|Index: WebCore/manual-tests/webgl/ManyPlanetsDeep.html
|===================================================================
|--- WebCore/manual-tests/webgl/ManyPlanetsDeep.html	(revision 52167)
|+++ WebCore/manual-tests/webgl/ManyPlanetsDeep.html	(working copy)
--------------------------
No file to patch.  Skipping patch.
2 out of 2 hunks ignored
patching file WebCore/manual-tests/webgl/ManyPlanetsDeepHiRes.html
patching file WebCore/manual-tests/webgl/resources/ManyPlanetsDeep.js

Full output: http://webkit-commit-queue.appspot.com/results/127359</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172108</commentid>
    <comment_count>11</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-12-15 16:57:06 -0800</bug_when>
    <thetext>I think svn-apply might be failing to create the directory if WebCore/manual-tests/webgl/ is a new directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172110</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-12-15 17:00:39 -0800</bug_when>
    <thetext>Filed bug 32588 about the svn-apply failure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172111</commentid>
    <comment_count>13</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 17:02:39 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; I think svn-apply might be failing to create the directory if
&gt; WebCore/manual-tests/webgl/ is a new directory.

The directory already exists.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172115</commentid>
    <comment_count>14</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 17:07:00 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; Filed bug 32588 about the svn-apply failure.

svn-apply applies the patch successfully to a clean workspace on my machine. Is it possible that that commit bot&apos;s workspace is out of date and doesn&apos;t have this file checked out?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172117</commentid>
    <comment_count>15</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-15 17:24:05 -0800</bug_when>
    <thetext>Sorry, I just saw this. Why are there files from manual-tests in this patch? This was a directory I created before we could add WebGL tests to LayoutTests. Now that we can we should really put tests there. To that end my team agreed that we should delete manual-tests/webgl. All the tests there are in other places (on my blog, in the WebGL public repo). So I deleted the directory, which may be causing some of your headaches. We can recover it, of course. But I think we should leave it deleted and use LayoutTests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172122</commentid>
    <comment_count>16</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 17:45:47 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; Sorry, I just saw this. Why are there files from manual-tests in this patch?
&gt; This was a directory I created before we could add WebGL tests to LayoutTests.
&gt; Now that we can we should really put tests there. To that end my team agreed
&gt; that we should delete manual-tests/webgl. All the tests there are in other
&gt; places (on my blog, in the WebGL public repo). So I deleted the directory,
&gt; which may be causing some of your headaches. We can recover it, of course. But
&gt; I think we should leave it deleted and use LayoutTests.

I wasn&apos;t aware that this directory had been deleted. Clearly this just happened today. I only just picked up the deletion in my own workspaces.

It will be basically impossible to write an automated test to verify the performance improvement associated with this fix. The relative performance of affected test cases depends on the speeds of both the CPU and GPU. It isn&apos;t possible to quantify it in a manner such as &quot;this test must be within X% of the performance of this other one&quot;. I&apos;m open to suggestions on what to do but for expediency I would prefer to just drop the test from this patch. I could check it in to the WebGL public repository.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172123</commentid>
    <comment_count>17</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-15 17:48:28 -0800</bug_when>
    <thetext>In cases like this, I don&apos;t think it&apos;s crucial that a test be contrived that shows performance improvement. It just needs to show proper functionality, to show that this patch doesn&apos;t break anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172128</commentid>
    <comment_count>18</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 18:00:47 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; In cases like this, I don&apos;t think it&apos;s crucial that a test be contrived that
&gt; shows performance improvement. It just needs to show proper functionality, to
&gt; show that this patch doesn&apos;t break anything.

OK. Revised patch to follow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172129</commentid>
    <comment_count>19</comment_count>
      <attachid>44930</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-12-15 18:03:52 -0800</bug_when>
    <thetext>Created attachment 44930
Revised patch

Removed manual test, the directory of which has been deleted. Updated ChangeLog to indicate that existing layout tests cover the affected functionality and continue to pass.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172131</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-15 18:05:11 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 44930 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172399</commentid>
    <comment_count>21</comment_count>
      <attachid>44930</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-16 10:51:02 -0800</bug_when>
    <thetext>Comment on attachment 44930
Revised patch

Clearing flags on attachment: 44930

Committed r52205: &lt;http://trac.webkit.org/changeset/52205&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>172400</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-16 10:51:10 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44734</attachid>
            <date>2009-12-12 01:17:18 -0800</date>
            <delta_ts>2009-12-15 14:24:32 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>performance.patch</filename>
            <type>text/plain</type>
            <size>22112</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MjA0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMDktMTItMTIgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBl
cmZvcm1hbmNlIHByb2JsZW1zIHdpdGggaW5kZXggdmFsaWRhdGlvbiBjb2RlIGZvciBkcmF3RWxl
bWVudHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMy
NDY2CisKKyAgICAgICAgQWRkZWQgYSBjYWNoZSBvZiB0aGUgbWF4aW11bSBpbmRleCBmb3IgZWFj
aCBlbGVtZW50IHR5cGUgdG8KKyAgICAgICAgV2ViR0xCdWZmZXIsIHF1ZXJ5aW5nIGl0IGJlZm9y
ZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgaW5kaWNlcyBpbgorICAgICAgICB0aGUgY2xpZW50LXNp
ZGUgY29weSBvZiB0aGUgYnVmZmVyJ3MgZGF0YS4gSG9pc3RlZCBjaGVja3Mgb2YgdGhlCisgICAg
ICAgIHNpemUgb2YgdGhlIGVsZW1lbnQgYXJyYXkgaXRzZWxmIGludG8gdmFsaWRhdGVFbGVtZW50
QXJyYXlTaXplIHRvCisgICAgICAgIGF2b2lkIGR1cGxpY2F0aW5nIGNvZGUuCisKKyAgICAgICAg
QmVjYXVzZSB0aGlzIGlzIGEgcGVyZm9ybWFuY2UgZml4IEkgd2Fzbid0IGFibGUgdG8gd3JpdGUg
YSBsYXlvdXQKKyAgICAgICAgdGVzdCBmb3IgaXQuIEEgbWFudWFsIHRlc3QsCisgICAgICAgIG1h
bnVhbC10ZXN0cy93ZWJnbC9NYW55UGxhbmV0c0RlZXBIaVJlcy5odG1sLCB3YXMgYWRkZWQgd2hp
Y2ggcnVucworICAgICAgICA1MCUgZmFzdGVyIGFmdGVyIHRoaXMgZml4LiBBbGwgcHJldmlvdXMg
bGF5b3V0IHRlc3RzIGZvcgorICAgICAgICBvdXQtb2YtcmFuZ2UgaW5kaWNlcyBjb250aW51ZSB0
byBwYXNzLgorCisgICAgICAgICogaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6V2ViR0xCdWZmZXI6OldlYkdMQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OldlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMQnVmZmVyOjpnZXRDYWNoZWRNYXhJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1
ZmZlcjo6c2V0Q2FjaGVkTWF4SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xCdWZmZXI6
OmNsZWFyQ2FjaGVkTWF4SW5kaWNlcyk6CisgICAgICAgICogaHRtbC9jYW52YXMvV2ViR0xCdWZm
ZXIuaDoKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUVsZW1lbnRB
cnJheVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxp
ZGF0ZUluZGV4QXJyYXlDb25zZXJ2YXRpdmUpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5k
ZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGV4QXJyYXlQcmVjaXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVSZW5kZXJpbmdTdGF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmRyYXdFbGVtZW50cyk6CisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0Lmg6CisgICAgICAgICogbWFu
dWFsLXRlc3RzL3dlYmdsL01hbnlQbGFuZXRzRGVlcEhpUmVzLmh0bWw6IEFkZGVkLgorCiAyMDA5
LTEyLTExICBFcmljIFJvbWFuICA8ZXJvbWFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJl
dmlld2VkIGJ1aWxkIGZpeC4KSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuY3BwCShy
ZXZpc2lvbiA1MjA0MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC00NywxNCArNDcsMTggQEAgV2ViR0xCdWZmZXI6OldlYkdMQnVmZmVy
KFdlYkdMUmVuZGVyaW5nQwogICAgICwgbV9lbGVtZW50QXJyYXlCdWZmZXJCeXRlTGVuZ3RoKDAp
CiAgICAgLCBtX2FycmF5QnVmZmVyQnl0ZUxlbmd0aCgwKQogICAgICwgbV9lbGVtZW50QXJyYXlC
dWZmZXJDbG9uZWQoZmFsc2UpCisgICAgLCBtX25leHRBdmFpbGFibGVDYWNoZUVudHJ5KDApCiB7
CiAgICAgc2V0T2JqZWN0KGNvbnRleHQoKS0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+Y3JlYXRlQnVm
ZmVyKCkpOworICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwogfQogCiBXZWJHTEJ1ZmZlcjo6
V2ViR0xCdWZmZXIoV2ViR0xSZW5kZXJpbmdDb250ZXh0KiBjdHgsIFBsYXRmb3JtM0RPYmplY3Qg
b2JqKQogICAgIDogQ2FudmFzT2JqZWN0KGN0eCkKKyAgICAsIG1fbmV4dEF2YWlsYWJsZUNhY2hl
RW50cnkoMCkKIHsKICAgICBzZXRPYmplY3Qob2JqLCBmYWxzZSk7CisgICAgY2xlYXJDYWNoZWRN
YXhJbmRpY2VzKCk7CiB9CiAKIHZvaWQgV2ViR0xCdWZmZXI6Ol9kZWxldGVPYmplY3QoUGxhdGZv
cm0zRE9iamVjdCBvYmplY3QpCkBAIC04Myw2ICs4Nyw3IEBAIGJvb2wgV2ViR0xCdWZmZXI6OmFz
c29jaWF0ZUJ1ZmZlckRhdGEodW4KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAKICAg
ICBpZiAodGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikg
eworICAgICAgICBjbGVhckNhY2hlZE1heEluZGljZXMoKTsKICAgICAgICAgbV9lbGVtZW50QXJy
YXlCdWZmZXJCeXRlTGVuZ3RoID0gYXJyYXktPmJ5dGVMZW5ndGgoKTsKICAgICAgICAgbV9lbGVt
ZW50QXJyYXlCdWZmZXIgPSBhcnJheS0+YnVmZmVyKCk7CiAgICAgICAgIG1fZWxlbWVudEFycmF5
QnVmZmVyQ2xvbmVkID0gZmFsc2U7CkBAIC0xMDMsNiArMTA4LDggQEAgYm9vbCBXZWJHTEJ1ZmZl
cjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAg
IAogICAgIGlmICh0YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVG
RkVSKSB7CisgICAgICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOworCiAgICAgICAgIC8vIFdl
IG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVnZXIgb3ZlcmZsb3cgd2l0aCB0aGVzZSB0ZXN0
cwogICAgICAgICBpZiAob2Zmc2V0IDwgMCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAg
LTEzMiw2ICsxMzksMzMgQEAgdW5zaWduZWQgV2ViR0xCdWZmZXI6OmJ5dGVMZW5ndGgodW5zaWdu
ZQogICAgIHJldHVybiAodGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIp
ID8gbV9hcnJheUJ1ZmZlckJ5dGVMZW5ndGggOiBtX2VsZW1lbnRBcnJheUJ1ZmZlckJ5dGVMZW5n
dGg7CiB9CiAKK2xvbmcgV2ViR0xCdWZmZXI6OmdldENhY2hlZE1heEluZGV4KHVuc2lnbmVkIGxv
bmcgdHlwZSkKK3sKKyAgICBpbnQgbnVtRW50cmllcyA9IHNpemVvZihtX21heEluZGV4Q2FjaGUp
IC8gc2l6ZW9mKE1heEluZGV4Q2FjaGVFbnRyeSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu
dW1FbnRyaWVzOyBpKyspCisgICAgICAgIGlmIChtX21heEluZGV4Q2FjaGVbaV0udHlwZSA9PSB0
eXBlKQorICAgICAgICAgICAgcmV0dXJuIG1fbWF4SW5kZXhDYWNoZVtpXS5tYXhJbmRleDsKKyAg
ICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgV2ViR0xCdWZmZXI6OnNldENhY2hlZE1heEluZGV4KHVu
c2lnbmVkIGxvbmcgdHlwZSwgbG9uZyB2YWx1ZSkKK3sKKyAgICBpbnQgbnVtRW50cmllcyA9IHNp
emVvZihtX21heEluZGV4Q2FjaGUpIC8gc2l6ZW9mKE1heEluZGV4Q2FjaGVFbnRyeSk7CisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspCisgICAgICAgIGlmIChtX21heElu
ZGV4Q2FjaGVbaV0udHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBtX21heEluZGV4Q2FjaGVb
aV0ubWF4SW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
IG1fbWF4SW5kZXhDYWNoZVttX25leHRBdmFpbGFibGVDYWNoZUVudHJ5XS50eXBlID0gdHlwZTsK
KyAgICBtX21heEluZGV4Q2FjaGVbbV9uZXh0QXZhaWxhYmxlQ2FjaGVFbnRyeV0ubWF4SW5kZXgg
PSB2YWx1ZTsKKyAgICBtX25leHRBdmFpbGFibGVDYWNoZUVudHJ5ID0gKG1fbmV4dEF2YWlsYWJs
ZUNhY2hlRW50cnkgKyAxKSAlIG51bUVudHJpZXM7Cit9CisKK3ZvaWQgV2ViR0xCdWZmZXI6OmNs
ZWFyQ2FjaGVkTWF4SW5kaWNlcygpCit7CisgICAgbWVtc2V0KG1fbWF4SW5kZXhDYWNoZSwgMCwg
c2l6ZW9mKG1fbWF4SW5kZXhDYWNoZSkpOworfQorCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoM0Rf
Q0FOVkFTKQpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAkocmV2aXNpb24gNTIwNDAp
CisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmgJKHdvcmtpbmcgY29weSkKQEAg
LTUxLDYgKzUxLDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdW5zaWduZWQgYnl0
ZUxlbmd0aCh1bnNpZ25lZCBsb25nIHRhcmdldCkgY29uc3Q7CiAgICAgICAgIGNvbnN0IFdlYkdM
QXJyYXlCdWZmZXIqIGVsZW1lbnRBcnJheUJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVu
dEFycmF5QnVmZmVyLmdldCgpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
Ly8gR2V0cyB0aGUgY2FjaGVkIG1heCBpbmRleCBmb3IgdGhlIGdpdmVuIHR5cGUuIFJldHVybnMg
LTEgaWYKKyAgICAgICAgLy8gbm9uZSBoYXMgYmVlbiBzZXQuCisgICAgICAgIGxvbmcgZ2V0Q2Fj
aGVkTWF4SW5kZXgodW5zaWduZWQgbG9uZyB0eXBlKTsKKyAgICAgICAgLy8gU2V0cyB0aGUgY2Fj
aGVkIG1heCBpbmRleCBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICAgIHZvaWQgc2V0Q2FjaGVk
TWF4SW5kZXgodW5zaWduZWQgbG9uZyB0eXBlLCBsb25nIHZhbHVlKTsKKwogICAgIHByb3RlY3Rl
ZDoKICAgICAgICAgV2ViR0xCdWZmZXIoV2ViR0xSZW5kZXJpbmdDb250ZXh0Kik7CiAgICAgICAg
IFdlYkdMQnVmZmVyKFdlYkdMUmVuZGVyaW5nQ29udGV4dCosIFBsYXRmb3JtM0RPYmplY3Qgb2Jq
KTsKQEAgLTYyLDYgKzY4LDI2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdW5zaWdu
ZWQgbV9lbGVtZW50QXJyYXlCdWZmZXJCeXRlTGVuZ3RoOwogICAgICAgICB1bnNpZ25lZCBtX2Fy
cmF5QnVmZmVyQnl0ZUxlbmd0aDsKICAgICAgICAgYm9vbCBtX2VsZW1lbnRBcnJheUJ1ZmZlckNs
b25lZDsKKworICAgICAgICAvLyBPcHRpbWl6YXRpb24gZm9yIGluZGV4IHZhbGlkYXRpb24uIEZv
ciBlYWNoIHR5cGUgb2YgaW5kZXgKKyAgICAgICAgLy8gKGkuZS4sIFVOU0lHTkVEX1NIT1JUKSwg
Y2FjaGUgdGhlIG1heGltdW0gaW5kZXggaW4gdGhlCisgICAgICAgIC8vIGVudGlyZSBidWZmZXIu
CisgICAgICAgIC8vIAorICAgICAgICAvLyBUaGlzIGlzIHN1ZmZpY2llbnQgdG8gZWxpbWluYXRl
IGEgbG90IG9mIHdvcmsgdXBvbiBlYWNoCisgICAgICAgIC8vIGRyYXcgY2FsbCBhcyBsb25nIGFz
IGFsbCBib3VuZCBhcnJheSBidWZmZXJzIGFyZSBhdCBsZWFzdAorICAgICAgICAvLyB0aGF0IHNp
emUuCisgICAgICAgIHN0cnVjdCBNYXhJbmRleENhY2hlRW50cnkgeworICAgICAgICAgICAgdW5z
aWduZWQgbG9uZyB0eXBlOworICAgICAgICAgICAgbG9uZyBtYXhJbmRleDsKKyAgICAgICAgfTsK
KyAgICAgICAgLy8gT3BlbkdMIEVTIDIuMCBvbmx5IGhhcyB0d28gdmFsaWQgaW5kZXggdHlwZXMg
KFVOU0lHTkVEX0JZVEUKKyAgICAgICAgLy8gYW5kIFVOU0lHTkVEX1NIT1JUKSwgYnV0IG1pZ2h0
IGFzIHdlbGwgbGVhdmUgb3BlbiB0aGUKKyAgICAgICAgLy8gcG9zc2liaWxpdHkgb2YgYWRkaW5n
IG90aGVycy4KKyAgICAgICAgTWF4SW5kZXhDYWNoZUVudHJ5IG1fbWF4SW5kZXhDYWNoZVs0XTsK
KyAgICAgICAgdW5zaWduZWQgbV9uZXh0QXZhaWxhYmxlQ2FjaGVFbnRyeTsKKworICAgICAgICAv
LyBDbGVhcnMgYWxsIG9mIHRoZSBjYWNoZWQgbWF4IGluZGljZXMuCisgICAgICAgIHZvaWQgY2xl
YXJDYWNoZWRNYXhJbmRpY2VzKCk7CiAgICAgfTsKICAgICAKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5j
cHAJKHJldmlzaW9uIDUyMDQwKQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmlu
Z0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NzQsMzEgKzU3NCw5NSBAQCB2b2lkIFdl
YkdMUmVuZGVyaW5nQ29udGV4dDo6ZGlzYWJsZVZlcnRlCiAgICAgY2xlYW51cEFmdGVyR3JhcGhp
Y3NDYWxsKGZhbHNlKTsKIH0KIAotYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRl
SW5kZXhBcnJheSh1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcg
b2Zmc2V0LCBsb25nJiBudW1FbGVtZW50cykKK2Jvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2
YWxpZGF0ZUVsZW1lbnRBcnJheVNpemUodW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9u
ZyB0eXBlLCBsb25nIG9mZnNldCkKIHsKLSAgICBsb25nIGxhc3RJbmRleCA9IC0xOwogICAgIGlm
ICghbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlcikKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAKKwogICAgIGlmIChvZmZzZXQgPCAwKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIAotICAgIC8vIFRoZSBHTCBzcGVjIHNheXMgdGhhdCBjb3VudCBtdXN0IGJlICJncmVhdGVy
Ci0gICAgCisKICAgICB1bnNpZ25lZCBsb25nIHVvZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZCBsb25nPihvZmZzZXQpOwotICAgIAorCiAgICAgaWYgKHR5cGUgPT0gR3JhcGhpY3NDb250ZXh0
M0Q6OlVOU0lHTkVEX1NIT1JUKSB7CiAgICAgICAgIC8vIEZvciBhbiB1bnNpZ25lZCBzaG9ydCBh
cnJheSwgb2Zmc2V0IG11c3QgYmUgZGl2aXNpYmxlIGJ5IDIgZm9yIGFsaWdubWVudCByZWFzb25z
LgogICAgICAgICBpZiAodW9mZnNldCAmIDEpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIAorCiAgICAgICAgIC8vIE1ha2UgdW9mZnNldCBhbiBlbGVtZW50IG9mZnNldC4KICAg
ICAgICAgdW9mZnNldCAvPSAyOwotICAgIAorCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbiA9IG1f
Ym91bmRFbGVtZW50QXJyYXlCdWZmZXItPmJ5dGVMZW5ndGgoR3JhcGhpY3NDb250ZXh0M0Q6OkVM
RU1FTlRfQVJSQVlfQlVGRkVSKSAvIDI7CiAgICAgICAgIGlmICh1b2Zmc2V0ID4gbiB8fCBjb3Vu
dCA+IG4gLSB1b2Zmc2V0KQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAg
CisgICAgfSBlbHNlIGlmICh0eXBlID09IEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRF
KSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbiA9IG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXIt
PmJ5dGVMZW5ndGgoR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKTsKKyAg
ICAgICAgaWYgKHVvZmZzZXQgPiBuIHx8IGNvdW50ID4gbiAtIHVvZmZzZXQpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFdlYkdM
UmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVJbmRleEFycmF5Q29uc2VydmF0aXZlKHVuc2lnbmVk
IGxvbmcgdHlwZSwgbG9uZyYgbnVtRWxlbWVudHNSZXF1aXJlZCkKK3sKKyAgICAvLyBQZXJmb3Jt
cyBjb25zZXJ2YXRpdmUgdmFsaWRhdGlvbiBieSBjYWNoaW5nIGEgbWF4aW11bSBpbmRleCBvZgor
ICAgIC8vIHRoZSBnaXZlbiB0eXBlIHBlciBlbGVtZW50IGFycmF5IGJ1ZmZlci4gSWYgYWxsIG9m
IHRoZSBib3VuZAorICAgIC8vIGFycmF5IGJ1ZmZlcnMgaGF2ZSBlbm91Z2ggZWxlbWVudHMgdG8g
c2F0aXNmeSB0aGF0IG1heGltdW0KKyAgICAvLyBpbmRleCwgc2tpcHMgdGhlIGV4cGVuc2l2ZSBw
ZXItZHJhdy1jYWxsIGl0ZXJhdGlvbiBpbgorICAgIC8vIHZhbGlkYXRlSW5kZXhBcnJheVByZWNp
c2UuCisKKyAgICBsb25nIG1heEluZGV4ID0gbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+Z2V0
Q2FjaGVkTWF4SW5kZXgodHlwZSk7CisgICAgaWYgKG1heEluZGV4IDwgMCkgeworICAgICAgICAv
LyBDb21wdXRlIHRoZSBtYXhpbXVtIGluZGV4IGluIHRoZSBlbnRpcmUgYnVmZmVyIGZvciB0aGUg
Z2l2ZW4gdHlwZSBvZiBpbmRleC4KKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNh
c2UgR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX0JZVEU6IHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIG51bUVsZW1lbnRzID0gbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+Ynl0ZUxlbmd0aChH
cmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpOworICAgICAgICAgICAgY29u
c3QgdW5zaWduZWQgY2hhciogcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiht
X2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5lbGVtZW50QXJyYXlCdWZmZXIoKS0+ZGF0YSgpKTsK
KyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKQor
ICAgICAgICAgICAgICAgIG1heEluZGV4ID0gbWF4KG1heEluZGV4LCBzdGF0aWNfY2FzdDxsb25n
PihwW2ldKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdy
YXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9TSE9SVDogeworICAgICAgICAgICAgdW5zaWduZWQg
bnVtRWxlbWVudHMgPSBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5ieXRlTGVuZ3RoKEdyYXBo
aWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgLyBzaXplb2YodW5zaWduZWQgc2hv
cnQpOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIHAgPSBzdGF0aWNfY2FzdDxj
b25zdCB1bnNpZ25lZCBzaG9ydCo+KG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPmVsZW1lbnRB
cnJheUJ1ZmZlcigpLT5kYXRhKCkpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG51bUVsZW1lbnRzOyBpKyspCisgICAgICAgICAgICAgICAgbWF4SW5kZXggPSBtYXgobWF4
SW5kZXgsIHN0YXRpY19jYXN0PGxvbmc+KHBbaV0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+c2V0Q2FjaGVkTWF4SW5k
ZXgodHlwZSwgbWF4SW5kZXgpOworICAgIH0KKworICAgIGlmIChtYXhJbmRleCA+PSAwKSB7Cisg
ICAgICAgIC8vIFRoZSBudW1iZXIgb2YgcmVxdWlyZWQgZWxlbWVudHMgaXMgb25lIG1vcmUgdGhh
biB0aGUgbWF4aW11bQorICAgICAgICAvLyBpbmRleCB0aGF0IHdpbGwgYmUgYWNjZXNzZWQuCisg
ICAgICAgIG51bUVsZW1lbnRzUmVxdWlyZWQgPSBtYXhJbmRleCArIDE7CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlSW5kZXhBcnJheVByZWNpc2UodW5zaWduZWQgbG9uZyBjb3Vu
dCwgdW5zaWduZWQgbG9uZyB0eXBlLCBsb25nIG9mZnNldCwgbG9uZyYgbnVtRWxlbWVudHNSZXF1
aXJlZCkKK3sKKyAgICAvLyBGSVhNRTogImNvdW50IiBzaG91bGQgbmVlZCB0byBiZSB1c2VkIGlu
IHRoZSBjb21wdXRhdGlvbiBiZWxvdworICAgIFVOVVNFRF9QQVJBTShjb3VudCk7CisgICAgbG9u
ZyBsYXN0SW5kZXggPSAtMTsKKworICAgIGlmICghbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlcikK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAvLyBUaGUgR0wgc3BlYyBzYXlz
IHRoYXQgY291bnQgbXVzdCBiZSAiZ3JlYXRlcgorICAgIAorICAgIHVuc2lnbmVkIGxvbmcgdW9m
ZnNldCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldCk7CisgICAgCisgICAgaWYg
KHR5cGUgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX1NIT1JUKSB7CisgICAgICAgIC8v
IE1ha2UgdW9mZnNldCBhbiBlbGVtZW50IG9mZnNldC4KKyAgICAgICAgdW9mZnNldCAvPSAyOwor
ICAgIAorICAgICAgICB1bnNpZ25lZCBsb25nIG4gPSBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVy
LT5ieXRlTGVuZ3RoKEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgLyAy
OwogICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVu
c2lnbmVkIHNob3J0Kj4obV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+ZWxlbWVudEFycmF5QnVm
ZmVyKCktPmRhdGEoKSk7CiAgICAgICAgIHdoaWxlIChuLS0gPiAwKSB7CiAgICAgICAgICAgICBp
ZiAoKnAgPiBsYXN0SW5kZXgpCkBAIC02MDcsOSArNjcxLDYgQEAgYm9vbCBXZWJHTFJlbmRlcmlu
Z0NvbnRleHQ6OnZhbGlkYXRlSW5kZQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh0eXBlID09
IEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFKSB7CiAgICAgICAgIHVuc2lnbmVkIGxv
bmcgbiA9IG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPmJ5dGVMZW5ndGgoR3JhcGhpY3NDb250
ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKTsKLSAgICAgICAgaWYgKHVvZmZzZXQgPiBuIHx8
IGNvdW50ID4gbiAtIHVvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
ICAgICAKICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHN0YXRpY19jYXN0PGNvbnN0
IHVuc2lnbmVkIGNoYXIqPihtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5lbGVtZW50QXJyYXlC
dWZmZXIoKS0+ZGF0YSgpKTsKICAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKICAgICAgICAgICAg
IGlmICgqcCA+IGxhc3RJbmRleCkKQEAgLTYxOSwxMSArNjgwLDExIEBAIGJvb2wgV2ViR0xSZW5k
ZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGUKICAgICB9ICAgIAogICAgICAgICAKICAgICAvLyBU
aGVuIHNldCB0aGUgbGFzdCBpbmRleCBpbiB0aGUgaW5kZXggYXJyYXkgYW5kIG1ha2Ugc3VyZSBp
dCBpcyB2YWxpZC4KLSAgICBudW1FbGVtZW50cyA9IGxhc3RJbmRleCArIDE7Ci0gICAgcmV0dXJu
IG51bUVsZW1lbnRzID4gMDsKKyAgICBudW1FbGVtZW50c1JlcXVpcmVkID0gbGFzdEluZGV4ICsg
MTsKKyAgICByZXR1cm4gbnVtRWxlbWVudHNSZXF1aXJlZCA+IDA7CiB9CiAKLWJvb2wgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmRlcmluZ1N0YXRlKGxvbmcgbnVtRWxlbWVudHMp
Citib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVSZW5kZXJpbmdTdGF0ZShsb25n
IG51bUVsZW1lbnRzUmVxdWlyZWQpCiB7CiAgICAgLy8gTG9vayBpbiBlYWNoIGVuYWJsZWQgdmVy
dGV4IGF0dHJpYiBhbmQgZmluZCB0aGUgc21hbGxlc3QgYnVmZmVyIHNpemUKICAgICBsb25nIHNt
YWxsZXN0TnVtRWxlbWVudHMgPSBMT05HX01BWDsKQEAgLTYzNiw3ICs2OTcsNyBAQCBib29sIFdl
YkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVSZW5kCiAgICAgaWYgKHNtYWxsZXN0TnVtRWxl
bWVudHMgPT0gTE9OR19NQVgpCiAgICAgICAgIHNtYWxsZXN0TnVtRWxlbWVudHMgPSAwOwogICAg
IAotICAgIHJldHVybiBudW1FbGVtZW50cyA8PSBzbWFsbGVzdE51bUVsZW1lbnRzOworICAgIHJl
dHVybiBudW1FbGVtZW50c1JlcXVpcmVkIDw9IHNtYWxsZXN0TnVtRWxlbWVudHM7CiB9CiAKIHZv
aWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpkcmF3QXJyYXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwg
bG9uZyBmaXJzdCwgbG9uZyBjb3VudCwgRXhjZXB0aW9uQ29kZSYgZWMpCkBAIC02NTgsNyArNzE5
LDEwIEBAIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpkcmF3RWxlbWVudHMKICAgICAvLyBF
bnN1cmUgd2UgaGF2ZSBhIHZhbGlkIHJlbmRlcmluZyBzdGF0ZQogICAgIGxvbmcgbnVtRWxlbWVu
dHM7CiAgICAgCi0gICAgaWYgKG9mZnNldCA8IDAgfHwgIXZhbGlkYXRlSW5kZXhBcnJheShjb3Vu
dCwgdHlwZSwgb2Zmc2V0LCBudW1FbGVtZW50cykgfHwgIXZhbGlkYXRlUmVuZGVyaW5nU3RhdGUo
bnVtRWxlbWVudHMpKSB7CisgICAgIGlmIChvZmZzZXQgPCAwCisgICAgICAgICB8fCAhdmFsaWRh
dGVFbGVtZW50QXJyYXlTaXplKGNvdW50LCB0eXBlLCBvZmZzZXQpCisgICAgICAgICB8fCAoKCF2
YWxpZGF0ZUluZGV4QXJyYXlDb25zZXJ2YXRpdmUodHlwZSwgbnVtRWxlbWVudHMpIHx8ICF2YWxp
ZGF0ZVJlbmRlcmluZ1N0YXRlKG51bUVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICYmICghdmFs
aWRhdGVJbmRleEFycmF5UHJlY2lzZShjb3VudCwgdHlwZSwgb2Zmc2V0LCBudW1FbGVtZW50cykg
fHwgIXZhbGlkYXRlUmVuZGVyaW5nU3RhdGUobnVtRWxlbWVudHMpKSkpIHsKICAgICAgICAgbV9j
b250ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFwaGljc0NvbnRleHQzRDo6SU5WQUxJRF9PUEVS
QVRJT04pOwogICAgICAgICByZXR1cm47CiAgICAgfQpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZh
cy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCShyZXZpc2lvbiA1MjA0MCkKKysrIFdlYkNvcmUv
aHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTMw
MSw3ICszMDEsMTQgQEAgY2xhc3MgV2ViS2l0Q1NTTWF0cml4OwogICAgICAgICAgICAgICAgIG1h
cmtDb250ZXh0Q2hhbmdlZCgpOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBib29sIHZh
bGlkYXRlSW5kZXhBcnJheSh1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHR5cGUs
IGxvbmcgb2Zmc2V0LCBsb25nJiBudW1FbGVtZW50cyk7CisgICAgICAgIC8vIEJhc2ljIHZhbGlk
YXRpb24gb2YgY291bnQgYW5kIG9mZnNldCBhZ2FpbnN0IG51bWJlciBvZiBlbGVtZW50cyBpbiBl
bGVtZW50IGFycmF5IGJ1ZmZlcgorICAgICAgICBib29sIHZhbGlkYXRlRWxlbWVudEFycmF5U2l6
ZSh1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcgb2Zmc2V0KTsK
KworICAgICAgICAvLyBDb25zZXJ2YXRpdmUgYnV0IHF1aWNrIGluZGV4IHZhbGlkYXRpb24KKyAg
ICAgICAgYm9vbCB2YWxpZGF0ZUluZGV4QXJyYXlDb25zZXJ2YXRpdmUodW5zaWduZWQgbG9uZyB0
eXBlLCBsb25nJiBudW1FbGVtZW50c1JlcXVpcmVkKTsKKworICAgICAgICAvLyBQcmVjaXNlIGJ1
dCBzbG93IGluZGV4IHZhbGlkYXRpb24gLS0gb25seSBkb25lIGlmIGNvbnNlcnZhdGl2ZSBjaGVj
a3MgZmFpbAorICAgICAgICBib29sIHZhbGlkYXRlSW5kZXhBcnJheVByZWNpc2UodW5zaWduZWQg
bG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBsb25nIG9mZnNldCwgbG9uZyYgbnVtRWxl
bWVudHNSZXF1aXJlZCk7CiAgICAgICAgIGJvb2wgdmFsaWRhdGVSZW5kZXJpbmdTdGF0ZShsb25n
IG51bUVsZW1lbnRzKTsKIAogICAgICAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IG1fY29u
dGV4dDsKSW5kZXg6IFdlYkNvcmUvbWFudWFsLXRlc3RzL3dlYmdsL01hbnlQbGFuZXRzRGVlcEhp
UmVzLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9tYW51YWwtdGVzdHMvd2ViZ2wvTWFueVBs
YW5ldHNEZWVwSGlSZXMuaHRtbAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvbWFudWFsLXRlc3Rz
L3dlYmdsL01hbnlQbGFuZXRzRGVlcEhpUmVzLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MjA5IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+TWFu
eSBQbGFuZXRzIERlZXA8L3RpdGxlPgorICAgIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvQ2FudmFz
TWF0cml4LmpzIj4gPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy91dGlsczNk
LmpzIj4gPC9zY3JpcHQ+CisgICAgCisgICAgPHNjcmlwdCBpZD0idnNoYWRlciIgdHlwZT0ieC1z
aGFkZXIveC12ZXJ0ZXgiPgorICAgICAgICB1bmlmb3JtIG1hdDQgdV9tb2RlbFZpZXdNYXRyaXg7
CisgICAgICAgIHVuaWZvcm0gbWF0NCB1X21vZGVsVmlld1Byb2pNYXRyaXg7CisgICAgICAgIHVu
aWZvcm0gbWF0NCB1X25vcm1hbE1hdHJpeDsKKyAgICAgICAgdW5pZm9ybSB2ZWMzIGxpZ2h0RGly
OworCisgICAgICAgIGF0dHJpYnV0ZSB2ZWMzIHZOb3JtYWw7CisgICAgICAgIGF0dHJpYnV0ZSB2
ZWM0IHZUZXhDb29yZDsKKyAgICAgICAgYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9uOworICAgICAg
ICAKKyAgICAgICAgdmFyeWluZyBmbG9hdCB2X0RvdDsKKyAgICAgICAgdmFyeWluZyB2ZWMyIHZf
dGV4Q29vcmQ7CisgICAgICAgIAorICAgICAgICB2b2lkIG1haW4oKQorICAgICAgICB7CisgICAg
ICAgICAgICBnbF9Qb3NpdGlvbiA9IHVfbW9kZWxWaWV3UHJvak1hdHJpeCAqIHZQb3NpdGlvbjsK
KyAgICAgICAgICAgIHZfdGV4Q29vcmQgPSB2VGV4Q29vcmQuc3Q7CisgICAgICAgICAgICB2ZWM0
IHRyYW5zTm9ybWFsID0gdV9ub3JtYWxNYXRyaXggKiB2ZWM0KHZOb3JtYWwsMSk7CisgICAgICAg
ICAgICB2X0RvdCA9IG1heChkb3QodHJhbnNOb3JtYWwueHl6LCBsaWdodERpciksIDAuMCk7Cisg
ICAgICAgIH0KKyAgICA8L3NjcmlwdD4KKworICAgIDxzY3JpcHQgaWQ9ImZzaGFkZXIiIHR5cGU9
Ingtc2hhZGVyL3gtZnJhZ21lbnQiPgorICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVy
MmQ7CisKKyAgICAgICAgdmFyeWluZyBmbG9hdCB2X0RvdDsKKyAgICAgICAgdmFyeWluZyB2ZWMy
IHZfdGV4Q29vcmQ7CisgICAgICAgIAorICAgICAgICB2b2lkIG1haW4oKQorICAgICAgICB7Cisg
ICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHNhbXBsZXIyZCx2X3RleENvb3JkKTsK
KyAgICAgICAgICAgIGNvbG9yICs9IHZlYzQoMC4xLDAuMSwwLjEsMSk7CisgICAgICAgICAgICBn
bF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnh5eiAqIHZfRG90LCBjb2xvci5hKTsKKyAgICAgICAg
fQorICAgIDwvc2NyaXB0PgorCisgICAgPHNjcmlwdD4KKyAgICAgICAgY29uc3QgbnVtUm93Q29s
cyA9IDQ7CisgICAgICAgIGNvbnN0IG51bUxheWVycyA9IDM7CisgICAgICAgIGNvbnN0IGxheW91
dFdpZHRoID0gMTA7CisgICAgICAgIGNvbnN0IGxheW91dEhlaWdodCA9IDg7CisgICAgICAgIGNv
bnN0IGdsb2JlU2l6ZSA9IDI1OworICAgICAgICBjb25zdCBtaW5JbmNBbmdsZSA9IDAuMjsKKyAg
ICAgICAgY29uc3QgbWF4SW5jQW5nbGUgPSAyOworICAgIAorICAgICAgICBmdW5jdGlvbiBpbml0
KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGdsID0gaW5pdFdlYkdMKCJleGFtcGxlIiwg
InZzaGFkZXIiLCAiZnNoYWRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBb
ICJ2Tm9ybWFsIiwgInZUZXhDb29yZCIsICJ2UG9zaXRpb24iXSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgWyAwLCAwLCAwLCAxIF0sIDEwMDAwKTsKKworICAgICAgICAgICAgZ2wu
dW5pZm9ybTNmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihnbC5wcm9ncmFtLCAibGlnaHREaXIiKSwg
MCwgMCwgMSk7CisgICAgICAgICAgICBnbC51bmlmb3JtMWkoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9u
KGdsLnByb2dyYW0sICJzYW1wbGVyMmQiKSwgMCk7CisKKyAgICAgICAgICAgIGdsLmVuYWJsZShn
bC5URVhUVVJFXzJEKTsKKworICAgICAgICAgICAgLy8gTWFrZSBhIHZlcnkgaGlnaCByZXNvbHV0
aW9uIHNwaGVyZSB0byBoaWdobGlnaHQgYW55CisgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBw
cm9ibGVtcyB3aXRoIHRoZSBpbmRleCB2YWxpZGF0aW9uIGNvZGUuCisgICAgICAgICAgICBnbC5z
cGhlcmUgPSBtYWtlU3BoZXJlKGdsLCAxLCAyNTQsIDI1NCk7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIC8vIGdldCB0aGUgaW1hZ2VzCisgICAgICAgICAgICBlYXJ0aFRleHR1cmUgPSBsb2Fk
SW1hZ2VUZXh0dXJlKGdsLCAicmVzb3VyY2VzL2VhcnRobWFwMWsuanBnIik7CisgICAgICAgICAg
ICBtYXJzVGV4dHVyZSA9IGxvYWRJbWFnZVRleHR1cmUoZ2wsICJyZXNvdXJjZXMvbWFyczUwMHgy
NTAucG5nIik7CisKKyAgICAgICAgICAgIHJldHVybiBnbDsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgd2lkdGggPSAtMTsKKyAgICAgICAgaGVpZ2h0ID0gLTE7CisgICAgICAgIAorICAg
ICAgICBmdW5jdGlvbiByZXNoYXBlKGN0eCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNh
bnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlJyk7CisgICAgICAgICAgICBp
ZiAoY2FudmFzLmNsaWVudFdpZHRoID09IHdpZHRoICYmIGNhbnZhcy5jbGllbnRIZWlnaHQgPT0g
aGVpZ2h0KQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgd2lkdGggPSBj
YW52YXMuY2xpZW50V2lkdGg7CisgICAgICAgICAgICBoZWlnaHQgPSBjYW52YXMuY2xpZW50SGVp
Z2h0OworICAgICAgICAgICAgCisgICAgICAgICAgICBjdHgudmlld3BvcnQoMCwgMCwgd2lkdGgs
IGhlaWdodCk7CisKKyAgICAgICAgICAgIGN0eC5wZXJzcGVjdGl2ZU1hdHJpeCA9IG5ldyBDYW52
YXNNYXRyaXg0KCk7CisgICAgICAgICAgICBjdHgucGVyc3BlY3RpdmVNYXRyaXgubG9va2F0KDAs
MCwyMCwgMCwgMCwgMCwgMCwgMSwgMCk7CisgICAgICAgICAgICBjdHgucGVyc3BlY3RpdmVNYXRy
aXgucGVyc3BlY3RpdmUoMzAsIHdpZHRoL2hlaWdodCwgMSwgMTAwMDApOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICBmdW5jdGlvbiBkcmF3T25lKGN0eCwgYW5nbGUsIHgsIHksIHosIHNj
YWxlLCB0ZXh0dXJlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzZXR1cCBWQk9zCisgICAg
ICAgICAgICBjdHguZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCk7CisgICAgICAgICAgICBjdHgu
ZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMSk7CisgICAgICAgICAgICBjdHguZW5hYmxlVmVydGV4
QXR0cmliQXJyYXkoMik7CisKKyAgICAgICAgICAgIGN0eC5iaW5kQnVmZmVyKGN0eC5BUlJBWV9C
VUZGRVIsIGN0eC5zcGhlcmUudmVydGV4T2JqZWN0KTsKKyAgICAgICAgICAgIGN0eC52ZXJ0ZXhB
dHRyaWJQb2ludGVyKDIsIDMsIGN0eC5GTE9BVCwgZmFsc2UsIDAsIDApOworICAgICAgICAgICAg
CisgICAgICAgICAgICBjdHguYmluZEJ1ZmZlcihjdHguQVJSQVlfQlVGRkVSLCBjdHguc3BoZXJl
Lm5vcm1hbE9iamVjdCk7CisgICAgICAgICAgICBjdHgudmVydGV4QXR0cmliUG9pbnRlcigwLCAz
LCBjdHguRkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3R4
LmJpbmRCdWZmZXIoY3R4LkFSUkFZX0JVRkZFUiwgY3R4LnNwaGVyZS50ZXhDb29yZE9iamVjdCk7
CisgICAgICAgICAgICBjdHgudmVydGV4QXR0cmliUG9pbnRlcigxLCAyLCBjdHguRkxPQVQsIGZh
bHNlLCAwLCAwKTsKKworICAgICAgICAgICAgY3R4LmJpbmRCdWZmZXIoY3R4LkVMRU1FTlRfQVJS
QVlfQlVGRkVSLCBjdHguc3BoZXJlLmluZGV4T2JqZWN0KTsKKworICAgICAgICAgICAgLy8gZ2Vu
ZXJhdGUgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICAgICAgICB2YXIgbXZNYXRyaXggPSBu
ZXcgQ2FudmFzTWF0cml4NCgpOworICAgICAgICAgICAgbXZNYXRyaXguc2NhbGUoc2NhbGUsIHNj
YWxlLCBzY2FsZSk7CisgICAgICAgICAgICBtdk1hdHJpeC5yb3RhdGUoYW5nbGUsIDAsMSwwKTsK
KyAgICAgICAgICAgIG12TWF0cml4LnJvdGF0ZSgzMCwgMSwwLDApOworICAgICAgICAgICAgbXZN
YXRyaXgudHJhbnNsYXRlKHgseSx6KTsKKyAgICAgICAgICAgIGN0eC51bmlmb3JtTWF0cml4NGZ2
KGN0eC5nZXRVbmlmb3JtTG9jYXRpb24oY3R4LnByb2dyYW0sICJ1X21vZGVsVmlld01hdHJpeCIp
LCBmYWxzZSwgbXZNYXRyaXguZ2V0QXNXZWJHTEZsb2F0QXJyYXkoKSk7CisKKyAgICAgICAgICAg
IC8vIGNvbnN0cnVjdCB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tIHRoZSBtb2RlbC12aWV3IG1hdHJp
eAorICAgICAgICAgICAgdmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBDYW52YXNNYXRyaXg0KG12TWF0
cml4KTsKKyAgICAgICAgICAgIG5vcm1hbE1hdHJpeC5pbnZlcnQoKTsKKyAgICAgICAgICAgIG5v
cm1hbE1hdHJpeC50cmFuc3Bvc2UoKTsKKyAgICAgICAgICAgIGN0eC51bmlmb3JtTWF0cml4NGZ2
KGN0eC5nZXRVbmlmb3JtTG9jYXRpb24oY3R4LnByb2dyYW0sICJ1X25vcm1hbE1hdHJpeCIpLCBm
YWxzZSwgbm9ybWFsTWF0cml4LmdldEFzV2ViR0xGbG9hdEFycmF5KCkpOworICAgICAgICAgICAg
CisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIG1vZGVsLXZpZXcgKiBwcm9qZWN0aW9uIG1h
dHJpeAorICAgICAgICAgICAgdmFyIG12cE1hdHJpeCA9IG5ldyBDYW52YXNNYXRyaXg0KG12TWF0
cml4KTsKKyAgICAgICAgICAgIG12cE1hdHJpeC5tdWx0UmlnaHQoY3R4LnBlcnNwZWN0aXZlTWF0
cml4KTsKKyAgICAgICAgICAgIGN0eC51bmlmb3JtTWF0cml4NGZ2KGN0eC5nZXRVbmlmb3JtTG9j
YXRpb24oY3R4LnByb2dyYW0sICJ1X21vZGVsVmlld1Byb2pNYXRyaXgiKSwgZmFsc2UsIG12cE1h
dHJpeC5nZXRBc1dlYkdMRmxvYXRBcnJheSgpKTsKKworICAgICAgICAgICAgY3R4LmJpbmRUZXh0
dXJlKGN0eC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICAgICAgICAgIGN0eC5kcmF3RWxlbWVu
dHMoY3R4LlRSSUFOR0xFUywgY3R4LnNwaGVyZS5udW1JbmRpY2VzLCBjdHguVU5TSUdORURfU0hP
UlQsIDApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmdW5jdGlvbiBkcmF3UGljdHVy
ZShjdHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc2hhcGUoY3R4KTsKKyAgICAgICAgICAg
IGN0eC5jbGVhcihjdHguQ09MT1JfQlVGRkVSX0JJVCB8IGN0eC5ERVBUSF9CVUZGRVJfQklUKTsK
KyAgICAKKyAgICAgICAgICAgIHZhciBzdGFydFggPSAtbGF5b3V0V2lkdGgvMjsKKyAgICAgICAg
ICAgIHZhciBzdGFydFkgPSAtbGF5b3V0SGVpZ2h0LzI7CisgICAgICAgICAgICB2YXIgc3RhcnRa
ID0gMDsKKyAgICAgICAgICAgIHZhciBpbmNYID0gbGF5b3V0V2lkdGggLyAobnVtUm93Q29scy0x
KTsKKyAgICAgICAgICAgIHZhciBpbmNZID0gbGF5b3V0SGVpZ2h0IC8gKG51bVJvd0NvbHMtMSk7
CisgICAgICAgICAgICB2YXIgaW5jWiA9IC01OworICAgICAgICAgICAgCisgICAgICAgICAgICBm
b3IgKGkgPSAwOyBpIDwgbnVtTGF5ZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGog
PSAwOyBqIDwgbnVtUm93Q29sczsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9
IDA7IGsgPCBudW1Sb3dDb2xzOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBp
bmRleCA9IGkgKiBudW1MYXllcnMgKiBudW1Sb3dDb2xzICsgaiAqIG51bVJvd0NvbHMgKyBrOwor
ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdPbmUoY3R4
LCBjdXJyZW50QW5nbGVzW2luZGV4XSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXJ0WCArIGluY1ggKiBrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
cnRZICsgaW5jWSAqIGosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFog
KyBpbmNaICogaSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFYXJ0aFtp
bmRleF0gPyAxIDogMC42LCBzaG93RWFydGhbaW5kZXhdID8gZWFydGhUZXh0dXJlIDogbWFyc1Rl
eHR1cmUpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1
cnJlbnRBbmdsZXNbaW5kZXhdICs9IGluY0FuZ2xlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChjdXJyZW50QW5nbGVzW2luZGV4XSA+IDM2MCkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjdXJyZW50QW5nbGVzW2luZGV4XSAtPSAzNjA7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN0eC5i
aW5kVGV4dHVyZShjdHguVEVYVFVSRV8yRCwgMCk7CisgICAgICAgICAgICBjdHguZmx1c2goKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgZnJhbWVyYXRlLnNuYXBzaG90KCk7CisgICAgICAg
IH0KKworICAgICAgICBmdW5jdGlvbiBzdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZh
ciBjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImV4YW1wbGUiKTsKKyAgICAgICAgICAgIHZh
ciB3ID0gTWF0aC5mbG9vcih3aW5kb3cuaW5uZXJXaWR0aCAqIDAuOSk7CisgICAgICAgICAgICB2
YXIgaCA9IE1hdGguZmxvb3Iod2luZG93LmlubmVySGVpZ2h0ICogMC45KTsKKworICAgICAgICAg
ICAgYy53aWR0aCA9IHc7CisgICAgICAgICAgICBjLmhlaWdodCA9IGg7CisKKyAgICAgICAgICAg
IHZhciBjdHggPSBpbml0KCk7CisgICAgICAgICAgICBjdXJyZW50QW5nbGVzID0gWyBdOworICAg
ICAgICAgICAgaW5jQW5nbGVzID0gWyBdOworICAgICAgICAgICAgc2hvd0VhcnRoID0gWyBdOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVJvd0NvbHMg
KiBudW1Sb3dDb2xzICogbnVtTGF5ZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50
QW5nbGVzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBpbmNBbmdsZXNbaV0gPSBNYXRoLnJhbmRv
bSgpICogKG1heEluY0FuZ2xlIC0gbWluSW5jQW5nbGUpICsgbWluSW5jQW5nbGU7CisgICAgICAg
ICAgICAgICAgc2hvd0VhcnRoW2ldID0gTWF0aC5yYW5kb20oKSA+IDAuNTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZyYW1lcmF0ZSA9IG5ldyBGcmFtZXJh
dGUoImZyYW1lcmF0ZSIpOworCisgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uKCkgeyBkcmF3
UGljdHVyZShjdHgpIH07CisgICAgICAgICAgICBzZXRJbnRlcnZhbChmLCAxMCk7CisgICAgICAg
IH0KKyAgICA8L3NjcmlwdD4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICBj
YW52YXMgeworICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7CisgICAgICAgIH0K
KyAgICA8L3N0eWxlPgorICA8L2hlYWQ+CisgIDxib2R5IG9ubG9hZD0ic3RhcnQoKSI+CisgICAg
PGNhbnZhcyBpZD0iZXhhbXBsZSI+CisgICAgVGhlcmUgaXMgc3VwcG9zZWQgdG8gYmUgYW4gZXhh
bXBsZSBkcmF3aW5nIGhlcmUsIGJ1dCBpdCdzIG5vdCBpbXBvcnRhbnQuCisgICAgPC9jYW52YXM+
CisgICAgPGRpdiBpZD0iZnJhbWVyYXRlIj48L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgo=
</data>
<flag name="review"
          id="26636"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44910</attachid>
            <date>2009-12-15 14:24:32 -0800</date>
            <delta_ts>2009-12-15 18:03:52 -0800</delta_ts>
            <desc>Revised patch</desc>
            <filename>performance.patch</filename>
            <type>text/plain</type>
            <size>28671</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MjE3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDggQEAKKzIwMDktMTItMTUgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBl
cmZvcm1hbmNlIHByb2JsZW1zIHdpdGggaW5kZXggdmFsaWRhdGlvbiBjb2RlIGZvciBkcmF3RWxl
bWVudHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMy
NDY2CisKKyAgICAgICAgQWRkZWQgYSBjYWNoZSBvZiB0aGUgbWF4aW11bSBpbmRleCBmb3IgZWFj
aCBlbGVtZW50IHR5cGUgdG8KKyAgICAgICAgV2ViR0xCdWZmZXIsIHF1ZXJ5aW5nIGl0IGJlZm9y
ZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgaW5kaWNlcyBpbgorICAgICAgICB0aGUgY2xpZW50LXNp
ZGUgY29weSBvZiB0aGUgYnVmZmVyJ3MgZGF0YS4gSG9pc3RlZCBjaGVja3Mgb2YgdGhlCisgICAg
ICAgIHNpemUgb2YgdGhlIGVsZW1lbnQgYXJyYXkgaXRzZWxmIGludG8gdmFsaWRhdGVFbGVtZW50
QXJyYXlTaXplIHRvCisgICAgICAgIGF2b2lkIGR1cGxpY2F0aW5nIGNvZGUuCisKKyAgICAgICAg
QmVjYXVzZSB0aGlzIGlzIGEgcGVyZm9ybWFuY2UgZml4IEkgd2Fzbid0IGFibGUgdG8gd3JpdGUg
YSBsYXlvdXQKKyAgICAgICAgdGVzdCBmb3IgaXQuIEEgbWFudWFsIHRlc3QsCisgICAgICAgIG1h
bnVhbC10ZXN0cy93ZWJnbC9NYW55UGxhbmV0c0RlZXBIaVJlcy5odG1sLCB3YXMgYWRkZWQgd2hp
Y2ggcnVucworICAgICAgICA1MCUgZmFzdGVyIGFmdGVyIHRoaXMgZml4LiBSZWZhY3RvcmVkIHRo
ZSBKYXZhU2NyaXB0IGNvZGUgZnJvbQorICAgICAgICBNYW55UGxhbmV0c0RlZXAuaHRtbCBpbnRv
IHJlc291cmNlcy9NYW55UGxhbmV0c0RlZXAuanMuIEFsbAorICAgICAgICBwcmV2aW91cyBsYXlv
dXQgdGVzdHMgZm9yIG91dC1vZi1yYW5nZSBpbmRpY2VzIGNvbnRpbnVlIHRvIHBhc3MuCisKKyAg
ICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpX
ZWJHTEJ1ZmZlcjo6V2ViR0xCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xCdWZmZXI6
OmFzc29jaWF0ZUJ1ZmZlckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xCdWZmZXI6OmFz
c29jaWF0ZUJ1ZmZlclN1YkRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xCdWZmZXI6Omdl
dENhY2hlZE1heEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMQnVmZmVyOjpzZXRDYWNo
ZWRNYXhJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6Y2xlYXJDYWNoZWRN
YXhJbmRpY2VzKToKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5oOgorICAgICAg
ICAqIGh0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlRWxlbWVudEFycmF5U2l6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlSW5kZXhBcnJh
eUNvbnNlcnZhdGl2ZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6
OnZhbGlkYXRlSW5kZXhBcnJheVByZWNpc2UpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5k
ZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmRlcmluZ1N0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZHJhd0VsZW1lbnRzKToKKyAgICAgICAgKiBodG1sL2Nh
bnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuaDoKKyAgICAgICAgKiBtYW51YWwtdGVzdHMvd2Vi
Z2wvTWFueVBsYW5ldHNEZWVwLmh0bWw6CisgICAgICAgICogbWFudWFsLXRlc3RzL3dlYmdsL01h
bnlQbGFuZXRzRGVlcEhpUmVzLmh0bWw6IEFkZGVkLgorICAgICAgICAqIG1hbnVhbC10ZXN0cy93
ZWJnbC9yZXNvdXJjZXMvTWFueVBsYW5ldHNEZWVwLmpzOiBBZGRlZC4KKyAgICAgICAgKGluaXQp
OgorICAgICAgICAocmVzaGFwZSk6CisgICAgICAgIChkcmF3T25lKToKKyAgICAgICAgKGRyYXdQ
aWN0dXJlKToKKyAgICAgICAgKHN0YXJ0LmYpOgorICAgICAgICAoc3RhcnQpOgorCiAyMDA5LTEy
LTE1ICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkocmV2
aXNpb24gNTIxNjcpCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDcsMTQgKzQ3LDE4IEBAIFdlYkdMQnVmZmVyOjpXZWJHTEJ1ZmZlcihX
ZWJHTFJlbmRlcmluZ0MKICAgICAsIG1fZWxlbWVudEFycmF5QnVmZmVyQnl0ZUxlbmd0aCgwKQog
ICAgICwgbV9hcnJheUJ1ZmZlckJ5dGVMZW5ndGgoMCkKICAgICAsIG1fZWxlbWVudEFycmF5QnVm
ZmVyQ2xvbmVkKGZhbHNlKQorICAgICwgbV9uZXh0QXZhaWxhYmxlQ2FjaGVFbnRyeSgwKQogewog
ICAgIHNldE9iamVjdChjb250ZXh0KCktPmdyYXBoaWNzQ29udGV4dDNEKCktPmNyZWF0ZUJ1ZmZl
cigpKTsKKyAgICBjbGVhckNhY2hlZE1heEluZGljZXMoKTsKIH0KIAogV2ViR0xCdWZmZXI6Oldl
YkdMQnVmZmVyKFdlYkdMUmVuZGVyaW5nQ29udGV4dCogY3R4LCBQbGF0Zm9ybTNET2JqZWN0IG9i
aikKICAgICA6IENhbnZhc09iamVjdChjdHgpCisgICAgLCBtX25leHRBdmFpbGFibGVDYWNoZUVu
dHJ5KDApCiB7CiAgICAgc2V0T2JqZWN0KG9iaiwgZmFsc2UpOworICAgIGNsZWFyQ2FjaGVkTWF4
SW5kaWNlcygpOwogfQogCiB2b2lkIFdlYkdMQnVmZmVyOjpfZGVsZXRlT2JqZWN0KFBsYXRmb3Jt
M0RPYmplY3Qgb2JqZWN0KQpAQCAtODMsNiArODcsNyBAQCBib29sIFdlYkdMQnVmZmVyOjphc3Nv
Y2lhdGVCdWZmZXJEYXRhKHVuCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgCiAgICAg
aWYgKHRhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsK
KyAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7CiAgICAgICAgIG1fZWxlbWVudEFycmF5
QnVmZmVyQnl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3RoKCk7CiAgICAgICAgIG1fZWxlbWVu
dEFycmF5QnVmZmVyID0gYXJyYXktPmJ1ZmZlcigpOwogICAgICAgICBtX2VsZW1lbnRBcnJheUJ1
ZmZlckNsb25lZCA9IGZhbHNlOwpAQCAtMTAzLDYgKzEwOCw4IEBAIGJvb2wgV2ViR0xCdWZmZXI6
OmFzc29jaWF0ZUJ1ZmZlclN1YkRhdGEKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAK
ICAgICBpZiAodGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZF
UikgeworICAgICAgICBjbGVhckNhY2hlZE1heEluZGljZXMoKTsKKwogICAgICAgICAvLyBXZSBu
ZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBpbnRlZ2VyIG92ZXJmbG93IHdpdGggdGhlc2UgdGVzdHMK
ICAgICAgICAgaWYgKG9mZnNldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0x
MzIsNiArMTM5LDMzIEBAIHVuc2lnbmVkIFdlYkdMQnVmZmVyOjpieXRlTGVuZ3RoKHVuc2lnbmUK
ICAgICByZXR1cm4gKHRhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSKSA/
IG1fYXJyYXlCdWZmZXJCeXRlTGVuZ3RoIDogbV9lbGVtZW50QXJyYXlCdWZmZXJCeXRlTGVuZ3Ro
OwogfQogCitsb25nIFdlYkdMQnVmZmVyOjpnZXRDYWNoZWRNYXhJbmRleCh1bnNpZ25lZCBsb25n
IHR5cGUpCit7CisgICAgc2l6ZV90IG51bUVudHJpZXMgPSBzaXplb2YobV9tYXhJbmRleENhY2hl
KSAvIHNpemVvZihNYXhJbmRleENhY2hlRW50cnkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbnVtRW50cmllczsgaSsrKQorICAgICAgICBpZiAobV9tYXhJbmRleENhY2hlW2ldLnR5cGUg
PT0gdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBtX21heEluZGV4Q2FjaGVbaV0ubWF4SW5kZXg7
CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIFdlYkdMQnVmZmVyOjpzZXRDYWNoZWRNYXhJbmRl
eCh1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcgdmFsdWUpCit7CisgICAgaW50IG51bUVudHJpZXMg
PSBzaXplb2YobV9tYXhJbmRleENhY2hlKSAvIHNpemVvZihNYXhJbmRleENhY2hlRW50cnkpOwor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKQorICAgICAgICBpZiAobV9t
YXhJbmRleENhY2hlW2ldLnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgbV9tYXhJbmRleENh
Y2hlW2ldLm1heEluZGV4ID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICBtX21heEluZGV4Q2FjaGVbbV9uZXh0QXZhaWxhYmxlQ2FjaGVFbnRyeV0udHlwZSA9IHR5
cGU7CisgICAgbV9tYXhJbmRleENhY2hlW21fbmV4dEF2YWlsYWJsZUNhY2hlRW50cnldLm1heElu
ZGV4ID0gdmFsdWU7CisgICAgbV9uZXh0QXZhaWxhYmxlQ2FjaGVFbnRyeSA9IChtX25leHRBdmFp
bGFibGVDYWNoZUVudHJ5ICsgMSkgJSBudW1FbnRyaWVzOworfQorCit2b2lkIFdlYkdMQnVmZmVy
OjpjbGVhckNhY2hlZE1heEluZGljZXMoKQoreworICAgIG1lbXNldChtX21heEluZGV4Q2FjaGUs
IDAsIHNpemVvZihtX21heEluZGV4Q2FjaGUpKTsKK30KKwogfQogCiAjZW5kaWYgLy8gRU5BQkxF
KDNEX0NBTlZBUykKSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmgJKHJldmlzaW9uIDUy
MTY3KQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5oCSh3b3JraW5nIGNvcHkp
CkBAIC01MSw2ICs1MSwxMiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHVuc2lnbmVk
IGJ5dGVMZW5ndGgodW5zaWduZWQgbG9uZyB0YXJnZXQpIGNvbnN0OwogICAgICAgICBjb25zdCBX
ZWJHTEFycmF5QnVmZmVyKiBlbGVtZW50QXJyYXlCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX2Vs
ZW1lbnRBcnJheUJ1ZmZlci5nZXQoKTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgIC8vIEdldHMgdGhlIGNhY2hlZCBtYXggaW5kZXggZm9yIHRoZSBnaXZlbiB0eXBlLiBSZXR1
cm5zIC0xIGlmCisgICAgICAgIC8vIG5vbmUgaGFzIGJlZW4gc2V0LgorICAgICAgICBsb25nIGdl
dENhY2hlZE1heEluZGV4KHVuc2lnbmVkIGxvbmcgdHlwZSk7CisgICAgICAgIC8vIFNldHMgdGhl
IGNhY2hlZCBtYXggaW5kZXggZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAgICB2b2lkIHNldENh
Y2hlZE1heEluZGV4KHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyB2YWx1ZSk7CisKICAgICBwcm90
ZWN0ZWQ6CiAgICAgICAgIFdlYkdMQnVmZmVyKFdlYkdMUmVuZGVyaW5nQ29udGV4dCopOwogICAg
ICAgICBXZWJHTEJ1ZmZlcihXZWJHTFJlbmRlcmluZ0NvbnRleHQqLCBQbGF0Zm9ybTNET2JqZWN0
IG9iaik7CkBAIC02Miw2ICs2OCwyNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHVu
c2lnbmVkIG1fZWxlbWVudEFycmF5QnVmZmVyQnl0ZUxlbmd0aDsKICAgICAgICAgdW5zaWduZWQg
bV9hcnJheUJ1ZmZlckJ5dGVMZW5ndGg7CiAgICAgICAgIGJvb2wgbV9lbGVtZW50QXJyYXlCdWZm
ZXJDbG9uZWQ7CisKKyAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBpbmRleCB2YWxpZGF0aW9u
LiBGb3IgZWFjaCB0eXBlIG9mIGluZGV4CisgICAgICAgIC8vIChpLmUuLCBVTlNJR05FRF9TSE9S
VCksIGNhY2hlIHRoZSBtYXhpbXVtIGluZGV4IGluIHRoZQorICAgICAgICAvLyBlbnRpcmUgYnVm
ZmVyLgorICAgICAgICAvLyAKKyAgICAgICAgLy8gVGhpcyBpcyBzdWZmaWNpZW50IHRvIGVsaW1p
bmF0ZSBhIGxvdCBvZiB3b3JrIHVwb24gZWFjaAorICAgICAgICAvLyBkcmF3IGNhbGwgYXMgbG9u
ZyBhcyBhbGwgYm91bmQgYXJyYXkgYnVmZmVycyBhcmUgYXQgbGVhc3QKKyAgICAgICAgLy8gdGhh
dCBzaXplLgorICAgICAgICBzdHJ1Y3QgTWF4SW5kZXhDYWNoZUVudHJ5IHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIGxvbmcgdHlwZTsKKyAgICAgICAgICAgIGxvbmcgbWF4SW5kZXg7CisgICAgICAg
IH07CisgICAgICAgIC8vIE9wZW5HTCBFUyAyLjAgb25seSBoYXMgdHdvIHZhbGlkIGluZGV4IHR5
cGVzIChVTlNJR05FRF9CWVRFCisgICAgICAgIC8vIGFuZCBVTlNJR05FRF9TSE9SVCksIGJ1dCBt
aWdodCBhcyB3ZWxsIGxlYXZlIG9wZW4gdGhlCisgICAgICAgIC8vIHBvc3NpYmlsaXR5IG9mIGFk
ZGluZyBvdGhlcnMuCisgICAgICAgIE1heEluZGV4Q2FjaGVFbnRyeSBtX21heEluZGV4Q2FjaGVb
NF07CisgICAgICAgIHVuc2lnbmVkIG1fbmV4dEF2YWlsYWJsZUNhY2hlRW50cnk7CisKKyAgICAg
ICAgLy8gQ2xlYXJzIGFsbCBvZiB0aGUgY2FjaGVkIG1heCBpbmRpY2VzLgorICAgICAgICB2b2lk
IGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwogICAgIH07CiAgICAgCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRl
eHQuY3BwCShyZXZpc2lvbiA1MjE2NykKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5k
ZXJpbmdDb250ZXh0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTc0LDMxICs1NzQsOTUgQEAgdm9p
ZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmRpc2FibGVWZXJ0ZQogICAgIGNsZWFudXBBZnRlckdy
YXBoaWNzQ2FsbChmYWxzZSk7CiB9CiAKLWJvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxp
ZGF0ZUluZGV4QXJyYXkodW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBs
b25nIG9mZnNldCwgbG9uZyYgbnVtRWxlbWVudHMpCitib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4
dDo6dmFsaWRhdGVFbGVtZW50QXJyYXlTaXplKHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVk
IGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpCiB7Ci0gICAgbG9uZyBsYXN0SW5kZXggPSAtMTsKICAg
ICBpZiAoIW1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgCisKICAgICBpZiAob2Zmc2V0IDwgMCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICAKLSAgICAvLyBUaGUgR0wgc3BlYyBzYXlzIHRoYXQgY291bnQgbXVzdCBiZSAiZ3Jl
YXRlcgotICAgIAorCiAgICAgdW5zaWduZWQgbG9uZyB1b2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQgbG9uZz4ob2Zmc2V0KTsKLSAgICAKKwogICAgIGlmICh0eXBlID09IEdyYXBoaWNzQ29u
dGV4dDNEOjpVTlNJR05FRF9TSE9SVCkgewogICAgICAgICAvLyBGb3IgYW4gdW5zaWduZWQgc2hv
cnQgYXJyYXksIG9mZnNldCBtdXN0IGJlIGRpdmlzaWJsZSBieSAyIGZvciBhbGlnbm1lbnQgcmVh
c29ucy4KICAgICAgICAgaWYgKHVvZmZzZXQgJiAxKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAKKwogICAgICAgICAvLyBNYWtlIHVvZmZzZXQgYW4gZWxlbWVudCBvZmZzZXQu
CiAgICAgICAgIHVvZmZzZXQgLz0gMjsKLSAgICAKKwogICAgICAgICB1bnNpZ25lZCBsb25nIG4g
PSBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5ieXRlTGVuZ3RoKEdyYXBoaWNzQ29udGV4dDNE
OjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgLyAyOwogICAgICAgICBpZiAodW9mZnNldCA+IG4gfHwg
Y291bnQgPiBuIC0gdW9mZnNldCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgIAorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURf
QllURSkgeworICAgICAgICB1bnNpZ25lZCBsb25nIG4gPSBtX2JvdW5kRWxlbWVudEFycmF5QnVm
ZmVyLT5ieXRlTGVuZ3RoKEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUik7
CisgICAgICAgIGlmICh1b2Zmc2V0ID4gbiB8fCBjb3VudCA+IG4gLSB1b2Zmc2V0KQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBX
ZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlSW5kZXhBcnJheUNvbnNlcnZhdGl2ZSh1bnNp
Z25lZCBsb25nIHR5cGUsIGxvbmcmIG51bUVsZW1lbnRzUmVxdWlyZWQpCit7CisgICAgLy8gUGVy
Zm9ybXMgY29uc2VydmF0aXZlIHZhbGlkYXRpb24gYnkgY2FjaGluZyBhIG1heGltdW0gaW5kZXgg
b2YKKyAgICAvLyB0aGUgZ2l2ZW4gdHlwZSBwZXIgZWxlbWVudCBhcnJheSBidWZmZXIuIElmIGFs
bCBvZiB0aGUgYm91bmQKKyAgICAvLyBhcnJheSBidWZmZXJzIGhhdmUgZW5vdWdoIGVsZW1lbnRz
IHRvIHNhdGlzZnkgdGhhdCBtYXhpbXVtCisgICAgLy8gaW5kZXgsIHNraXBzIHRoZSBleHBlbnNp
dmUgcGVyLWRyYXctY2FsbCBpdGVyYXRpb24gaW4KKyAgICAvLyB2YWxpZGF0ZUluZGV4QXJyYXlQ
cmVjaXNlLgorCisgICAgbG9uZyBtYXhJbmRleCA9IG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXIt
PmdldENhY2hlZE1heEluZGV4KHR5cGUpOworICAgIGlmIChtYXhJbmRleCA8IDApIHsKKyAgICAg
ICAgLy8gQ29tcHV0ZSB0aGUgbWF4aW11bSBpbmRleCBpbiB0aGUgZW50aXJlIGJ1ZmZlciBmb3Ig
dGhlIGdpdmVuIHR5cGUgb2YgaW5kZXguCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAg
ICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFOiB7CisgICAgICAgICAgICB1
bnNpZ25lZCBudW1FbGVtZW50cyA9IG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPmJ5dGVMZW5n
dGgoR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKTsKKyAgICAgICAgICAg
IGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFy
Kj4obV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+ZWxlbWVudEFycmF5QnVmZmVyKCktPmRhdGEo
KSk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkr
KykKKyAgICAgICAgICAgICAgICBtYXhJbmRleCA9IG1heChtYXhJbmRleCwgc3RhdGljX2Nhc3Q8
bG9uZz4ocFtpXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2Fz
ZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlQ6IHsKKyAgICAgICAgICAgIHVuc2ln
bmVkIG51bUVsZW1lbnRzID0gbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+Ynl0ZUxlbmd0aChH
cmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIC8gc2l6ZW9mKHVuc2lnbmVk
IHNob3J0KTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwID0gc3RhdGljX2Nh
c3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5lbGVt
ZW50QXJyYXlCdWZmZXIoKS0+ZGF0YSgpKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKQorICAgICAgICAgICAgICAgIG1heEluZGV4ID0gbWF4
KG1heEluZGV4LCBzdGF0aWNfY2FzdDxsb25nPihwW2ldKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgICAgIG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPnNldENhY2hlZE1h
eEluZGV4KHR5cGUsIG1heEluZGV4KTsKKyAgICB9CisKKyAgICBpZiAobWF4SW5kZXggPj0gMCkg
eworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcXVpcmVkIGVsZW1lbnRzIGlzIG9uZSBtb3Jl
IHRoYW4gdGhlIG1heGltdW0KKyAgICAgICAgLy8gaW5kZXggdGhhdCB3aWxsIGJlIGFjY2Vzc2Vk
LgorICAgICAgICBudW1FbGVtZW50c1JlcXVpcmVkID0gbWF4SW5kZXggKyAxOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGV4QXJyYXlQcmVjaXNlKHVuc2lnbmVkIGxvbmcg
Y291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQsIGxvbmcmIG51bUVsZW1lbnRz
UmVxdWlyZWQpCit7CisgICAgLy8gRklYTUU6ICJjb3VudCIgc2hvdWxkIG5lZWQgdG8gYmUgdXNl
ZCBpbiB0aGUgY29tcHV0YXRpb24gYmVsb3cKKyAgICBVTlVTRURfUEFSQU0oY291bnQpOworICAg
IGxvbmcgbGFzdEluZGV4ID0gLTE7CisKKyAgICBpZiAoIW1fYm91bmRFbGVtZW50QXJyYXlCdWZm
ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgLy8gVGhlIEdMIHNwZWMg
c2F5cyB0aGF0IGNvdW50IG11c3QgYmUgImdyZWF0ZXIKKyAgICAKKyAgICB1bnNpZ25lZCBsb25n
IHVvZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXQpOworICAgIAorICAg
IGlmICh0eXBlID09IEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9TSE9SVCkgeworICAgICAg
ICAvLyBNYWtlIHVvZmZzZXQgYW4gZWxlbWVudCBvZmZzZXQuCisgICAgICAgIHVvZmZzZXQgLz0g
MjsKKyAgICAKKyAgICAgICAgdW5zaWduZWQgbG9uZyBuID0gbV9ib3VuZEVsZW1lbnRBcnJheUJ1
ZmZlci0+Ynl0ZUxlbmd0aChHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIp
IC8gMjsKICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIHAgPSBzdGF0aWNfY2FzdDxjb25z
dCB1bnNpZ25lZCBzaG9ydCo+KG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPmVsZW1lbnRBcnJh
eUJ1ZmZlcigpLT5kYXRhKCkpOwogICAgICAgICB3aGlsZSAobi0tID4gMCkgewogICAgICAgICAg
ICAgaWYgKCpwID4gbGFzdEluZGV4KQpAQCAtNjA3LDkgKzY3MSw2IEBAIGJvb2wgV2ViR0xSZW5k
ZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGUKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAodHlw
ZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfQllURSkgewogICAgICAgICB1bnNpZ25l
ZCBsb25nIG4gPSBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5ieXRlTGVuZ3RoKEdyYXBoaWNz
Q29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUik7Ci0gICAgICAgIGlmICh1b2Zmc2V0ID4g
biB8fCBjb3VudCA+IG4gLSB1b2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgICAgCiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSBzdGF0aWNfY2FzdDxj
b25zdCB1bnNpZ25lZCBjaGFyKj4obV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+ZWxlbWVudEFy
cmF5QnVmZmVyKCktPmRhdGEoKSk7CiAgICAgICAgIHdoaWxlIChuLS0gPiAwKSB7CiAgICAgICAg
ICAgICBpZiAoKnAgPiBsYXN0SW5kZXgpCkBAIC02MTksMTEgKzY4MCwxMSBAQCBib29sIFdlYkdM
UmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVJbmRlCiAgICAgfSAgICAKICAgICAgICAgCiAgICAg
Ly8gVGhlbiBzZXQgdGhlIGxhc3QgaW5kZXggaW4gdGhlIGluZGV4IGFycmF5IGFuZCBtYWtlIHN1
cmUgaXQgaXMgdmFsaWQuCi0gICAgbnVtRWxlbWVudHMgPSBsYXN0SW5kZXggKyAxOwotICAgIHJl
dHVybiBudW1FbGVtZW50cyA+IDA7CisgICAgbnVtRWxlbWVudHNSZXF1aXJlZCA9IGxhc3RJbmRl
eCArIDE7CisgICAgcmV0dXJuIG51bUVsZW1lbnRzUmVxdWlyZWQgPiAwOwogfQogCi1ib29sIFdl
YkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVSZW5kZXJpbmdTdGF0ZShsb25nIG51bUVsZW1l
bnRzKQorYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUo
bG9uZyBudW1FbGVtZW50c1JlcXVpcmVkKQogewogICAgIC8vIExvb2sgaW4gZWFjaCBlbmFibGVk
IHZlcnRleCBhdHRyaWIgYW5kIGZpbmQgdGhlIHNtYWxsZXN0IGJ1ZmZlciBzaXplCiAgICAgbG9u
ZyBzbWFsbGVzdE51bUVsZW1lbnRzID0gTE9OR19NQVg7CkBAIC02MzYsNyArNjk3LDcgQEAgYm9v
bCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZAogICAgIGlmIChzbWFsbGVzdE51
bUVsZW1lbnRzID09IExPTkdfTUFYKQogICAgICAgICBzbWFsbGVzdE51bUVsZW1lbnRzID0gMDsK
ICAgICAKLSAgICByZXR1cm4gbnVtRWxlbWVudHMgPD0gc21hbGxlc3ROdW1FbGVtZW50czsKKyAg
ICByZXR1cm4gbnVtRWxlbWVudHNSZXF1aXJlZCA8PSBzbWFsbGVzdE51bUVsZW1lbnRzOwogfQog
CiB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZHJhd0FycmF5cyh1bnNpZ25lZCBsb25nIG1v
ZGUsIGxvbmcgZmlyc3QsIGxvbmcgY291bnQsIEV4Y2VwdGlvbkNvZGUmIGVjKQpAQCAtNjU4LDEw
ICs3MTksMTYgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmRyYXdFbGVtZW50cwogICAg
IC8vIEVuc3VyZSB3ZSBoYXZlIGEgdmFsaWQgcmVuZGVyaW5nIHN0YXRlCiAgICAgbG9uZyBudW1F
bGVtZW50czsKICAgICAKLSAgICBpZiAob2Zmc2V0IDwgMCB8fCAhdmFsaWRhdGVJbmRleEFycmF5
KGNvdW50LCB0eXBlLCBvZmZzZXQsIG51bUVsZW1lbnRzKSB8fCAhdmFsaWRhdGVSZW5kZXJpbmdT
dGF0ZShudW1FbGVtZW50cykpIHsKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCAhdmFsaWRhdGVFbGVt
ZW50QXJyYXlTaXplKGNvdW50LCB0eXBlLCBvZmZzZXQpKSB7CiAgICAgICAgIG1fY29udGV4dC0+
c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfT1BFUkFUSU9OKTsK
ICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmICghdmFsaWRhdGVJbmRleEFycmF5Q29u
c2VydmF0aXZlKHR5cGUsIG51bUVsZW1lbnRzKSB8fCAhdmFsaWRhdGVSZW5kZXJpbmdTdGF0ZShu
dW1FbGVtZW50cykpCisgICAgICAgIGlmICghdmFsaWRhdGVJbmRleEFycmF5UHJlY2lzZShjb3Vu
dCwgdHlwZSwgb2Zmc2V0LCBudW1FbGVtZW50cykgfHwgIXZhbGlkYXRlUmVuZGVyaW5nU3RhdGUo
bnVtRWxlbWVudHMpKSB7CisgICAgICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9y
KEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KICAgICAKICAgICBtX2NvbnRleHQtPmRyYXdFbGVtZW50cyhtb2RlLCBj
b3VudCwgdHlwZSwgb2Zmc2V0KTsKICAgICBjbGVhbnVwQWZ0ZXJHcmFwaGljc0NhbGwodHJ1ZSk7
CkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmgJKHJl
dmlzaW9uIDUyMTY3KQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRl
eHQuaAkod29ya2luZyBjb3B5KQpAQCAtMzAxLDcgKzMwMSwxNCBAQCBjbGFzcyBXZWJLaXRDU1NN
YXRyaXg7CiAgICAgICAgICAgICAgICAgbWFya0NvbnRleHRDaGFuZ2VkKCk7CiAgICAgICAgIH0K
ICAgICAgICAgCi0gICAgICAgIGJvb2wgdmFsaWRhdGVJbmRleEFycmF5KHVuc2lnbmVkIGxvbmcg
Y291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQsIGxvbmcmIG51bUVsZW1lbnRz
KTsKKyAgICAgICAgLy8gQmFzaWMgdmFsaWRhdGlvbiBvZiBjb3VudCBhbmQgb2Zmc2V0IGFnYWlu
c3QgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGVsZW1lbnQgYXJyYXkgYnVmZmVyCisgICAgICAgIGJv
b2wgdmFsaWRhdGVFbGVtZW50QXJyYXlTaXplKHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVk
IGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpOworCisgICAgICAgIC8vIENvbnNlcnZhdGl2ZSBidXQg
cXVpY2sgaW5kZXggdmFsaWRhdGlvbgorICAgICAgICBib29sIHZhbGlkYXRlSW5kZXhBcnJheUNv
bnNlcnZhdGl2ZSh1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcmIG51bUVsZW1lbnRzUmVxdWlyZWQp
OworCisgICAgICAgIC8vIFByZWNpc2UgYnV0IHNsb3cgaW5kZXggdmFsaWRhdGlvbiAtLSBvbmx5
IGRvbmUgaWYgY29uc2VydmF0aXZlIGNoZWNrcyBmYWlsCisgICAgICAgIGJvb2wgdmFsaWRhdGVJ
bmRleEFycmF5UHJlY2lzZSh1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHR5cGUs
IGxvbmcgb2Zmc2V0LCBsb25nJiBudW1FbGVtZW50c1JlcXVpcmVkKTsKICAgICAgICAgYm9vbCB2
YWxpZGF0ZVJlbmRlcmluZ1N0YXRlKGxvbmcgbnVtRWxlbWVudHMpOwogCiAgICAgICAgIE93blB0
cjxHcmFwaGljc0NvbnRleHQzRD4gbV9jb250ZXh0OwpJbmRleDogV2ViQ29yZS9tYW51YWwtdGVz
dHMvd2ViZ2wvTWFueVBsYW5ldHNEZWVwLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9tYW51
YWwtdGVzdHMvd2ViZ2wvTWFueVBsYW5ldHNEZWVwLmh0bWwJKHJldmlzaW9uIDUyMTY3KQorKysg
V2ViQ29yZS9tYW51YWwtdGVzdHMvd2ViZ2wvTWFueVBsYW5ldHNEZWVwLmh0bWwJKHdvcmtpbmcg
Y29weSkKQEAgLTQxLDE1NSArNDEsMTMgQEAKICAgICAgICAgfQogICAgIDwvc2NyaXB0PgogCisg
ICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9NYW55UGxhbmV0c0RlZXAuanMiPiA8L3NjcmlwdD4K
ICAgICA8c2NyaXB0PgotICAgICAgICBjb25zdCBudW1Sb3dDb2xzID0gNDsKLSAgICAgICAgY29u
c3QgbnVtTGF5ZXJzID0gMzsKLSAgICAgICAgY29uc3QgbGF5b3V0V2lkdGggPSAxMDsKLSAgICAg
ICAgY29uc3QgbGF5b3V0SGVpZ2h0ID0gODsKLSAgICAgICAgY29uc3QgZ2xvYmVTaXplID0gMjU7
Ci0gICAgICAgIGNvbnN0IG1pbkluY0FuZ2xlID0gMC4yOwotICAgICAgICBjb25zdCBtYXhJbmNB
bmdsZSA9IDI7Ci0gICAgCi0gICAgICAgIGZ1bmN0aW9uIGluaXQoKQotICAgICAgICB7Ci0gICAg
ICAgICAgICB2YXIgZ2wgPSBpbml0V2ViR0woImV4YW1wbGUiLCAidnNoYWRlciIsICJmc2hhZGVy
IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgInZOb3JtYWwiLCAidlRleENv
b3JkIiwgInZQb3NpdGlvbiJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDAs
IDAsIDAsIDEgXSwgMTAwMDApOwotCi0gICAgICAgICAgICBnbC51bmlmb3JtM2YoZ2wuZ2V0VW5p
Zm9ybUxvY2F0aW9uKGdsLnByb2dyYW0sICJsaWdodERpciIpLCAwLCAwLCAxKTsKLSAgICAgICAg
ICAgIGdsLnVuaWZvcm0xaShnbC5nZXRVbmlmb3JtTG9jYXRpb24oZ2wucHJvZ3JhbSwgInNhbXBs
ZXIyZCIpLCAwKTsKLQotICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLlRFWFRVUkVfMkQpOwotCi0g
ICAgICAgICAgICBnbC5zcGhlcmUgPSBtYWtlU3BoZXJlKGdsLCAxLCAzMCwgMzApOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGltYWdlcwotICAgICAgICAgICAgZWFydGhU
ZXh0dXJlID0gbG9hZEltYWdlVGV4dHVyZShnbCwgInJlc291cmNlcy9lYXJ0aG1hcDFrLmpwZyIp
OwotICAgICAgICAgICAgbWFyc1RleHR1cmUgPSBsb2FkSW1hZ2VUZXh0dXJlKGdsLCAicmVzb3Vy
Y2VzL21hcnM1MDB4MjUwLnBuZyIpOwotCi0gICAgICAgICAgICByZXR1cm4gZ2w7Ci0gICAgICAg
IH0KLSAgICAgICAgCi0gICAgICAgIHdpZHRoID0gLTE7Ci0gICAgICAgIGhlaWdodCA9IC0xOwot
ICAgICAgICAKLSAgICAgICAgZnVuY3Rpb24gcmVzaGFwZShjdHgpCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZScpOwot
ICAgICAgICAgICAgaWYgKGNhbnZhcy5jbGllbnRXaWR0aCA9PSB3aWR0aCAmJiBjYW52YXMuY2xp
ZW50SGVpZ2h0ID09IGhlaWdodCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAg
ICAgIHdpZHRoID0gY2FudmFzLmNsaWVudFdpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gY2Fu
dmFzLmNsaWVudEhlaWdodDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3R4LnZpZXdwb3J0
KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgICAgICBjdHgucGVyc3BlY3RpdmVNYXRy
aXggPSBuZXcgQ2FudmFzTWF0cml4NCgpOwotICAgICAgICAgICAgY3R4LnBlcnNwZWN0aXZlTWF0
cml4Lmxvb2thdCgwLDAsMjAsIDAsIDAsIDAsIDAsIDEsIDApOwotICAgICAgICAgICAgY3R4LnBl
cnNwZWN0aXZlTWF0cml4LnBlcnNwZWN0aXZlKDMwLCB3aWR0aC9oZWlnaHQsIDEsIDEwMDAwKTsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZnVuY3Rpb24gZHJhd09uZShjdHgsIGFuZ2xl
LCB4LCB5LCB6LCBzY2FsZSwgdGV4dHVyZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2V0
dXAgVkJPcwotICAgICAgICAgICAgY3R4LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApOwotICAg
ICAgICAgICAgY3R4LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpOwotICAgICAgICAgICAgY3R4
LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpOwotCi0gICAgICAgICAgICBjdHguYmluZEJ1ZmZl
cihjdHguQVJSQVlfQlVGRkVSLCBjdHguc3BoZXJlLnZlcnRleE9iamVjdCk7Ci0gICAgICAgICAg
ICBjdHgudmVydGV4QXR0cmliUG9pbnRlcigyLCAzLCBjdHguRkxPQVQsIGZhbHNlLCAwLCAwKTsK
LSAgICAgICAgICAgIAotICAgICAgICAgICAgY3R4LmJpbmRCdWZmZXIoY3R4LkFSUkFZX0JVRkZF
UiwgY3R4LnNwaGVyZS5ub3JtYWxPYmplY3QpOwotICAgICAgICAgICAgY3R4LnZlcnRleEF0dHJp
YlBvaW50ZXIoMCwgMywgY3R4LkZMT0FULCBmYWxzZSwgMCwgMCk7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIGN0eC5iaW5kQnVmZmVyKGN0eC5BUlJBWV9CVUZGRVIsIGN0eC5zcGhlcmUudGV4
Q29vcmRPYmplY3QpOwotICAgICAgICAgICAgY3R4LnZlcnRleEF0dHJpYlBvaW50ZXIoMSwgMiwg
Y3R4LkZMT0FULCBmYWxzZSwgMCwgMCk7Ci0KLSAgICAgICAgICAgIGN0eC5iaW5kQnVmZmVyKGN0
eC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgY3R4LnNwaGVyZS5pbmRleE9iamVjdCk7Ci0KLSAgICAg
ICAgICAgIC8vIGdlbmVyYXRlIHRoZSBtb2RlbC12aWV3IG1hdHJpeAotICAgICAgICAgICAgdmFy
IG12TWF0cml4ID0gbmV3IENhbnZhc01hdHJpeDQoKTsKLSAgICAgICAgICAgIG12TWF0cml4LnNj
YWxlKHNjYWxlLCBzY2FsZSwgc2NhbGUpOwotICAgICAgICAgICAgbXZNYXRyaXgucm90YXRlKGFu
Z2xlLCAwLDEsMCk7Ci0gICAgICAgICAgICBtdk1hdHJpeC5yb3RhdGUoMzAsIDEsMCwwKTsKLSAg
ICAgICAgICAgIG12TWF0cml4LnRyYW5zbGF0ZSh4LHkseik7Ci0gICAgICAgICAgICBjdHgudW5p
Zm9ybU1hdHJpeDRmdihjdHguZ2V0VW5pZm9ybUxvY2F0aW9uKGN0eC5wcm9ncmFtLCAidV9tb2Rl
bFZpZXdNYXRyaXgiKSwgZmFsc2UsIG12TWF0cml4LmdldEFzV2ViR0xGbG9hdEFycmF5KCkpOwot
Ci0gICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIG5vcm1hbCBtYXRyaXggZnJvbSB0aGUgbW9k
ZWwtdmlldyBtYXRyaXgKLSAgICAgICAgICAgIHZhciBub3JtYWxNYXRyaXggPSBuZXcgQ2FudmFz
TWF0cml4NChtdk1hdHJpeCk7Ci0gICAgICAgICAgICBub3JtYWxNYXRyaXguaW52ZXJ0KCk7Ci0g
ICAgICAgICAgICBub3JtYWxNYXRyaXgudHJhbnNwb3NlKCk7Ci0gICAgICAgICAgICBjdHgudW5p
Zm9ybU1hdHJpeDRmdihjdHguZ2V0VW5pZm9ybUxvY2F0aW9uKGN0eC5wcm9ncmFtLCAidV9ub3Jt
YWxNYXRyaXgiKSwgZmFsc2UsIG5vcm1hbE1hdHJpeC5nZXRBc1dlYkdMRmxvYXRBcnJheSgpKTsK
LSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBtb2RlbC12aWV3ICog
cHJvamVjdGlvbiBtYXRyaXgKLSAgICAgICAgICAgIHZhciBtdnBNYXRyaXggPSBuZXcgQ2FudmFz
TWF0cml4NChtdk1hdHJpeCk7Ci0gICAgICAgICAgICBtdnBNYXRyaXgubXVsdFJpZ2h0KGN0eC5w
ZXJzcGVjdGl2ZU1hdHJpeCk7Ci0gICAgICAgICAgICBjdHgudW5pZm9ybU1hdHJpeDRmdihjdHgu
Z2V0VW5pZm9ybUxvY2F0aW9uKGN0eC5wcm9ncmFtLCAidV9tb2RlbFZpZXdQcm9qTWF0cml4Iiks
IGZhbHNlLCBtdnBNYXRyaXguZ2V0QXNXZWJHTEZsb2F0QXJyYXkoKSk7Ci0KLSAgICAgICAgICAg
IGN0eC5iaW5kVGV4dHVyZShjdHguVEVYVFVSRV8yRCwgdGV4dHVyZSk7Ci0gICAgICAgICAgICBj
dHguZHJhd0VsZW1lbnRzKGN0eC5UUklBTkdMRVMsIGN0eC5zcGhlcmUubnVtSW5kaWNlcywgY3R4
LlVOU0lHTkVEX1NIT1JULCAwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZnVuY3Rp
b24gZHJhd1BpY3R1cmUoY3R4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXNoYXBlKGN0eCk7
Ci0gICAgICAgICAgICBjdHguY2xlYXIoY3R4LkNPTE9SX0JVRkZFUl9CSVQgfCBjdHguREVQVEhf
QlVGRkVSX0JJVCk7Ci0gICAgCi0gICAgICAgICAgICB2YXIgc3RhcnRYID0gLWxheW91dFdpZHRo
LzI7Ci0gICAgICAgICAgICB2YXIgc3RhcnRZID0gLWxheW91dEhlaWdodC8yOwotICAgICAgICAg
ICAgdmFyIHN0YXJ0WiA9IDA7Ci0gICAgICAgICAgICB2YXIgaW5jWCA9IGxheW91dFdpZHRoIC8g
KG51bVJvd0NvbHMtMSk7Ci0gICAgICAgICAgICB2YXIgaW5jWSA9IGxheW91dEhlaWdodCAvIChu
dW1Sb3dDb2xzLTEpOwotICAgICAgICAgICAgdmFyIGluY1ogPSAtNTsKLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUxheWVyczsgKytpKSB7Ci0gICAgICAgICAg
ICAgICAgZm9yIChqID0gMDsgaiA8IG51bVJvd0NvbHM7ICsraikgewotICAgICAgICAgICAgICAg
ICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtUm93Q29sczsgKytrKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB2YXIgaW5kZXggPSBpICogbnVtTGF5ZXJzICogbnVtUm93Q29scyArIGogKiBudW1S
b3dDb2xzICsgazsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAg
ICBkcmF3T25lKGN0eCwgY3VycmVudEFuZ2xlc1tpbmRleF0sIAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGFydFggKyBpbmNYICogaywgCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXJ0WSArIGluY1kgKiBqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhcnRaICsgaW5jWiAqIGksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzaG93RWFydGhbaW5kZXhdID8gMSA6IDAuNiwgc2hvd0VhcnRoW2luZGV4XSA/IGVhcnRoVGV4
dHVyZSA6IG1hcnNUZXh0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgICAgICAgICBjdXJyZW50QW5nbGVzW2luZGV4XSArPSBpbmNBbmdsZXNbaV07Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEFuZ2xlc1tpbmRleF0gPiAzNjApCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuZ2xlc1tpbmRleF0gLT0gMzYwOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBjdHguYmluZFRleHR1cmUoY3R4LlRFWFRVUkVfMkQsIDApOwotICAgICAgICAgICAg
Y3R4LmZsdXNoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZyYW1lcmF0ZS5zbmFwc2hv
dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gc3RhcnQoKQotICAgICAgICB7Ci0g
ICAgICAgICAgICB2YXIgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJleGFtcGxlIik7Ci0g
ICAgICAgICAgICB2YXIgdyA9IE1hdGguZmxvb3Iod2luZG93LmlubmVyV2lkdGggKiAwLjkpOwot
ICAgICAgICAgICAgdmFyIGggPSBNYXRoLmZsb29yKHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOSk7
Ci0KLSAgICAgICAgICAgIGMud2lkdGggPSB3OwotICAgICAgICAgICAgYy5oZWlnaHQgPSBoOwot
Ci0gICAgICAgICAgICB2YXIgY3R4ID0gaW5pdCgpOwotICAgICAgICAgICAgY3VycmVudEFuZ2xl
cyA9IFsgXTsKLSAgICAgICAgICAgIGluY0FuZ2xlcyA9IFsgXTsKLSAgICAgICAgICAgIHNob3dF
YXJ0aCA9IFsgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBudW1Sb3dDb2xzICogbnVtUm93Q29scyAqIG51bUxheWVyczsgKytpKSB7Ci0gICAgICAgICAg
ICAgICAgY3VycmVudEFuZ2xlc1tpXSA9IDA7Ci0gICAgICAgICAgICAgICAgaW5jQW5nbGVzW2ld
ID0gTWF0aC5yYW5kb20oKSAqIChtYXhJbmNBbmdsZSAtIG1pbkluY0FuZ2xlKSArIG1pbkluY0Fu
Z2xlOwotICAgICAgICAgICAgICAgIHNob3dFYXJ0aFtpXSA9IE1hdGgucmFuZG9tKCkgPiAwLjU7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBmcmFtZXJhdGUg
PSBuZXcgRnJhbWVyYXRlKCJmcmFtZXJhdGUiKTsKLQotICAgICAgICAgICAgdmFyIGYgPSBmdW5j
dGlvbigpIHsgZHJhd1BpY3R1cmUoY3R4KSB9OwotICAgICAgICAgICAgc2V0SW50ZXJ2YWwoZiwg
MTApOworICAgICAgICBmdW5jdGlvbiBtYWluKCkgeworICAgICAgICAgICAgc3RhcnQoZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoImV4YW1wbGUiKSwKKyAgICAgICAgICAgICAgICAgIE1hdGguZmxv
b3Iod2luZG93LmlubmVyV2lkdGggKiAwLjkpLAorICAgICAgICAgICAgICAgICAgTWF0aC5mbG9v
cih3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjkpLAorICAgICAgICAgICAgICAgICAgMzApOwogICAg
ICAgICB9CiAgICAgPC9zY3JpcHQ+CiAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KQEAgLTE5
OCw3ICs1Niw3IEBACiAgICAgICAgIH0KICAgICA8L3N0eWxlPgogICA8L2hlYWQ+Ci0gIDxib2R5
IG9ubG9hZD0ic3RhcnQoKSI+CisgIDxib2R5IG9ubG9hZD0ibWFpbigpIj4KICAgICA8Y2FudmFz
IGlkPSJleGFtcGxlIj4KICAgICBUaGVyZSBpcyBzdXBwb3NlZCB0byBiZSBhbiBleGFtcGxlIGRy
YXdpbmcgaGVyZSwgYnV0IGl0J3Mgbm90IGltcG9ydGFudC4KICAgICA8L2NhbnZhcz4KSW5kZXg6
IFdlYkNvcmUvbWFudWFsLXRlc3RzL3dlYmdsL01hbnlQbGFuZXRzRGVlcEhpUmVzLmh0bWwKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9tYW51YWwtdGVzdHMvd2ViZ2wvTWFueVBsYW5ldHNEZWVwSGlS
ZXMuaHRtbAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvbWFudWFsLXRlc3RzL3dlYmdsL01hbnlQ
bGFuZXRzRGVlcEhpUmVzLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjUgQEAKKzwhRE9D
VFlQRSBodG1sPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5NYW55IFBsYW5ldHMgRGVl
cCBIaS1SZXM8L3RpdGxlPgorICAgIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvQ2FudmFzTWF0cml4
LmpzIj4gPC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy91dGlsczNkLmpzIj4g
PC9zY3JpcHQ+CisgICAgCisgICAgPHNjcmlwdCBpZD0idnNoYWRlciIgdHlwZT0ieC1zaGFkZXIv
eC12ZXJ0ZXgiPgorICAgICAgICB1bmlmb3JtIG1hdDQgdV9tb2RlbFZpZXdNYXRyaXg7CisgICAg
ICAgIHVuaWZvcm0gbWF0NCB1X21vZGVsVmlld1Byb2pNYXRyaXg7CisgICAgICAgIHVuaWZvcm0g
bWF0NCB1X25vcm1hbE1hdHJpeDsKKyAgICAgICAgdW5pZm9ybSB2ZWMzIGxpZ2h0RGlyOworCisg
ICAgICAgIGF0dHJpYnV0ZSB2ZWMzIHZOb3JtYWw7CisgICAgICAgIGF0dHJpYnV0ZSB2ZWM0IHZU
ZXhDb29yZDsKKyAgICAgICAgYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9uOworICAgICAgICAKKyAg
ICAgICAgdmFyeWluZyBmbG9hdCB2X0RvdDsKKyAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29v
cmQ7CisgICAgICAgIAorICAgICAgICB2b2lkIG1haW4oKQorICAgICAgICB7CisgICAgICAgICAg
ICBnbF9Qb3NpdGlvbiA9IHVfbW9kZWxWaWV3UHJvak1hdHJpeCAqIHZQb3NpdGlvbjsKKyAgICAg
ICAgICAgIHZfdGV4Q29vcmQgPSB2VGV4Q29vcmQuc3Q7CisgICAgICAgICAgICB2ZWM0IHRyYW5z
Tm9ybWFsID0gdV9ub3JtYWxNYXRyaXggKiB2ZWM0KHZOb3JtYWwsMSk7CisgICAgICAgICAgICB2
X0RvdCA9IG1heChkb3QodHJhbnNOb3JtYWwueHl6LCBsaWdodERpciksIDAuMCk7CisgICAgICAg
IH0KKyAgICA8L3NjcmlwdD4KKworICAgIDxzY3JpcHQgaWQ9ImZzaGFkZXIiIHR5cGU9Ingtc2hh
ZGVyL3gtZnJhZ21lbnQiPgorICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyMmQ7CisK
KyAgICAgICAgdmFyeWluZyBmbG9hdCB2X0RvdDsKKyAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4
Q29vcmQ7CisgICAgICAgIAorICAgICAgICB2b2lkIG1haW4oKQorICAgICAgICB7CisgICAgICAg
ICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHNhbXBsZXIyZCx2X3RleENvb3JkKTsKKyAgICAg
ICAgICAgIGNvbG9yICs9IHZlYzQoMC4xLDAuMSwwLjEsMSk7CisgICAgICAgICAgICBnbF9GcmFn
Q29sb3IgPSB2ZWM0KGNvbG9yLnh5eiAqIHZfRG90LCBjb2xvci5hKTsKKyAgICAgICAgfQorICAg
IDwvc2NyaXB0PgorCisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9NYW55UGxhbmV0c0RlZXAu
anMiPiA8L3NjcmlwdD4KKyAgICA8c2NyaXB0PgorICAgICAgICBmdW5jdGlvbiBtYWluKCkgewor
ICAgICAgICAgICAgc3RhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImV4YW1wbGUiKSwKKyAg
ICAgICAgICAgICAgICAgIE1hdGguZmxvb3Iod2luZG93LmlubmVyV2lkdGggKiAwLjkpLAorICAg
ICAgICAgICAgICAgICAgTWF0aC5mbG9vcih3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjkpLAorICAg
ICAgICAgICAgICAgICAgMjU0KTsKKyAgICAgICAgfQorICAgIDwvc2NyaXB0PgorICAgIDxzdHls
ZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIGNhbnZhcyB7CisgICAgICAgICAgICBib3JkZXI6
IDJweCBzb2xpZCBibGFjazsKKyAgICAgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAg
PGJvZHkgb25sb2FkPSJtYWluKCkiPgorICAgIDxjYW52YXMgaWQ9ImV4YW1wbGUiPgorICAgIFRo
ZXJlIGlzIHN1cHBvc2VkIHRvIGJlIGFuIGV4YW1wbGUgZHJhd2luZyBoZXJlLCBidXQgaXQncyBu
b3QgaW1wb3J0YW50LgorICAgIDwvY2FudmFzPgorICAgIDxkaXYgaWQ9ImZyYW1lcmF0ZSI+PC9k
aXY+CisgIDwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IFdlYkNvcmUvbWFudWFsLXRlc3RzL3dlYmds
L3Jlc291cmNlcy9NYW55UGxhbmV0c0RlZXAuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9tYW51
YWwtdGVzdHMvd2ViZ2wvcmVzb3VyY2VzL01hbnlQbGFuZXRzRGVlcC5qcwkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvbWFudWFsLXRlc3RzL3dlYmdsL3Jlc291cmNlcy9NYW55UGxhbmV0c0RlZXAu
anMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQ3IEBACitjb25zdCBudW1Sb3dDb2xzID0gNDsK
K2NvbnN0IG51bUxheWVycyA9IDM7Citjb25zdCBsYXlvdXRXaWR0aCA9IDEwOworY29uc3QgbGF5
b3V0SGVpZ2h0ID0gODsKK2NvbnN0IGdsb2JlU2l6ZSA9IDI1OworY29uc3QgbWluSW5jQW5nbGUg
PSAwLjI7Citjb25zdCBtYXhJbmNBbmdsZSA9IDI7CisKK2Z1bmN0aW9uIGluaXQoc3BoZXJlU2l6
ZSkKK3sKKyAgICB2YXIgZ2wgPSBpbml0V2ViR0woImV4YW1wbGUiLCAidnNoYWRlciIsICJmc2hh
ZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgWyAidk5vcm1hbCIsICJ2VGV4Q29vcmQiLCAi
dlBvc2l0aW9uIl0sCisgICAgICAgICAgICAgICAgICAgICAgIFsgMCwgMCwgMCwgMSBdLCAxMDAw
MCk7CisKKyAgICBnbC51bmlmb3JtM2YoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKGdsLnByb2dyYW0s
ICJsaWdodERpciIpLCAwLCAwLCAxKTsKKyAgICBnbC51bmlmb3JtMWkoZ2wuZ2V0VW5pZm9ybUxv
Y2F0aW9uKGdsLnByb2dyYW0sICJzYW1wbGVyMmQiKSwgMCk7CisKKyAgICBnbC5lbmFibGUoZ2wu
VEVYVFVSRV8yRCk7CisgICAgZ2wuc3BoZXJlID0gbWFrZVNwaGVyZShnbCwgMSwgc3BoZXJlU2l6
ZSwgc3BoZXJlU2l6ZSk7CisKKyAgICAvLyBnZXQgdGhlIGltYWdlcworICAgIGVhcnRoVGV4dHVy
ZSA9IGxvYWRJbWFnZVRleHR1cmUoZ2wsICJyZXNvdXJjZXMvZWFydGhtYXAxay5qcGciKTsKKyAg
ICBtYXJzVGV4dHVyZSA9IGxvYWRJbWFnZVRleHR1cmUoZ2wsICJyZXNvdXJjZXMvbWFyczUwMHgy
NTAucG5nIik7CisKKyAgICByZXR1cm4gZ2w7Cit9CisKK3dpZHRoID0gLTE7CitoZWlnaHQgPSAt
MTsKKworZnVuY3Rpb24gcmVzaGFwZShjdHgpCit7CisgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlJyk7CisgICAgaWYgKGNhbnZhcy5jbGllbnRXaWR0aCA9
PSB3aWR0aCAmJiBjYW52YXMuY2xpZW50SGVpZ2h0ID09IGhlaWdodCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgd2lkdGggPSBjYW52YXMuY2xpZW50V2lkdGg7CisgICAgaGVpZ2h0ID0gY2FudmFz
LmNsaWVudEhlaWdodDsKKworICAgIGN0eC52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsK
KworICAgIGN0eC5wZXJzcGVjdGl2ZU1hdHJpeCA9IG5ldyBDYW52YXNNYXRyaXg0KCk7CisgICAg
Y3R4LnBlcnNwZWN0aXZlTWF0cml4Lmxvb2thdCgwLDAsMjAsIDAsIDAsIDAsIDAsIDEsIDApOwor
ICAgIGN0eC5wZXJzcGVjdGl2ZU1hdHJpeC5wZXJzcGVjdGl2ZSgzMCwgd2lkdGgvaGVpZ2h0LCAx
LCAxMDAwMCk7Cit9CisKK2Z1bmN0aW9uIGRyYXdPbmUoY3R4LCBhbmdsZSwgeCwgeSwgeiwgc2Nh
bGUsIHRleHR1cmUpCit7CisgICAgLy8gc2V0dXAgVkJPcworICAgIGN0eC5lbmFibGVWZXJ0ZXhB
dHRyaWJBcnJheSgwKTsKKyAgICBjdHguZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMSk7CisgICAg
Y3R4LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpOworCisgICAgY3R4LmJpbmRCdWZmZXIoY3R4
LkFSUkFZX0JVRkZFUiwgY3R4LnNwaGVyZS52ZXJ0ZXhPYmplY3QpOworICAgIGN0eC52ZXJ0ZXhB
dHRyaWJQb2ludGVyKDIsIDMsIGN0eC5GTE9BVCwgZmFsc2UsIDAsIDApOworCisgICAgY3R4LmJp
bmRCdWZmZXIoY3R4LkFSUkFZX0JVRkZFUiwgY3R4LnNwaGVyZS5ub3JtYWxPYmplY3QpOworICAg
IGN0eC52ZXJ0ZXhBdHRyaWJQb2ludGVyKDAsIDMsIGN0eC5GTE9BVCwgZmFsc2UsIDAsIDApOwor
CisgICAgY3R4LmJpbmRCdWZmZXIoY3R4LkFSUkFZX0JVRkZFUiwgY3R4LnNwaGVyZS50ZXhDb29y
ZE9iamVjdCk7CisgICAgY3R4LnZlcnRleEF0dHJpYlBvaW50ZXIoMSwgMiwgY3R4LkZMT0FULCBm
YWxzZSwgMCwgMCk7CisKKyAgICBjdHguYmluZEJ1ZmZlcihjdHguRUxFTUVOVF9BUlJBWV9CVUZG
RVIsIGN0eC5zcGhlcmUuaW5kZXhPYmplY3QpOworCisgICAgLy8gZ2VuZXJhdGUgdGhlIG1vZGVs
LXZpZXcgbWF0cml4CisgICAgdmFyIG12TWF0cml4ID0gbmV3IENhbnZhc01hdHJpeDQoKTsKKyAg
ICBtdk1hdHJpeC5zY2FsZShzY2FsZSwgc2NhbGUsIHNjYWxlKTsKKyAgICBtdk1hdHJpeC5yb3Rh
dGUoYW5nbGUsIDAsMSwwKTsKKyAgICBtdk1hdHJpeC5yb3RhdGUoMzAsIDEsMCwwKTsKKyAgICBt
dk1hdHJpeC50cmFuc2xhdGUoeCx5LHopOworICAgIGN0eC51bmlmb3JtTWF0cml4NGZ2KGN0eC5n
ZXRVbmlmb3JtTG9jYXRpb24oY3R4LnByb2dyYW0sICJ1X21vZGVsVmlld01hdHJpeCIpLCBmYWxz
ZSwgbXZNYXRyaXguZ2V0QXNXZWJHTEZsb2F0QXJyYXkoKSk7CisKKyAgICAvLyBjb25zdHJ1Y3Qg
dGhlIG5vcm1hbCBtYXRyaXggZnJvbSB0aGUgbW9kZWwtdmlldyBtYXRyaXgKKyAgICB2YXIgbm9y
bWFsTWF0cml4ID0gbmV3IENhbnZhc01hdHJpeDQobXZNYXRyaXgpOworICAgIG5vcm1hbE1hdHJp
eC5pbnZlcnQoKTsKKyAgICBub3JtYWxNYXRyaXgudHJhbnNwb3NlKCk7CisgICAgY3R4LnVuaWZv
cm1NYXRyaXg0ZnYoY3R4LmdldFVuaWZvcm1Mb2NhdGlvbihjdHgucHJvZ3JhbSwgInVfbm9ybWFs
TWF0cml4IiksIGZhbHNlLCBub3JtYWxNYXRyaXguZ2V0QXNXZWJHTEZsb2F0QXJyYXkoKSk7CisK
KyAgICAvLyBjb25zdHJ1Y3QgdGhlIG1vZGVsLXZpZXcgKiBwcm9qZWN0aW9uIG1hdHJpeAorICAg
IHZhciBtdnBNYXRyaXggPSBuZXcgQ2FudmFzTWF0cml4NChtdk1hdHJpeCk7CisgICAgbXZwTWF0
cml4Lm11bHRSaWdodChjdHgucGVyc3BlY3RpdmVNYXRyaXgpOworICAgIGN0eC51bmlmb3JtTWF0
cml4NGZ2KGN0eC5nZXRVbmlmb3JtTG9jYXRpb24oY3R4LnByb2dyYW0sICJ1X21vZGVsVmlld1By
b2pNYXRyaXgiKSwgZmFsc2UsIG12cE1hdHJpeC5nZXRBc1dlYkdMRmxvYXRBcnJheSgpKTsKKwor
ICAgIGN0eC5iaW5kVGV4dHVyZShjdHguVEVYVFVSRV8yRCwgdGV4dHVyZSk7CisgICAgY3R4LmRy
YXdFbGVtZW50cyhjdHguVFJJQU5HTEVTLCBjdHguc3BoZXJlLm51bUluZGljZXMsIGN0eC5VTlNJ
R05FRF9TSE9SVCwgMCk7Cit9CisKK2Z1bmN0aW9uIGRyYXdQaWN0dXJlKGN0eCkKK3sKKyAgICBy
ZXNoYXBlKGN0eCk7CisgICAgY3R4LmNsZWFyKGN0eC5DT0xPUl9CVUZGRVJfQklUIHwgY3R4LkRF
UFRIX0JVRkZFUl9CSVQpOworCisgICAgdmFyIHN0YXJ0WCA9IC1sYXlvdXRXaWR0aC8yOworICAg
IHZhciBzdGFydFkgPSAtbGF5b3V0SGVpZ2h0LzI7CisgICAgdmFyIHN0YXJ0WiA9IDA7CisgICAg
dmFyIGluY1ggPSBsYXlvdXRXaWR0aCAvIChudW1Sb3dDb2xzLTEpOworICAgIHZhciBpbmNZID0g
bGF5b3V0SGVpZ2h0IC8gKG51bVJvd0NvbHMtMSk7CisgICAgdmFyIGluY1ogPSAtNTsKKworICAg
IGZvciAoaSA9IDA7IGkgPCBudW1MYXllcnM7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBq
IDwgbnVtUm93Q29sczsgKytqKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtUm93
Q29sczsgKytrKSB7CisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIG51bUxheWVycyAq
IG51bVJvd0NvbHMgKyBqICogbnVtUm93Q29scyArIGs7CisKKyAgICAgICAgICAgICAgICBkcmF3
T25lKGN0eCwgY3VycmVudEFuZ2xlc1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICBz
dGFydFggKyBpbmNYICogaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WSArIGluY1kg
KiBqLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRaICsgaW5jWiAqIGksCisgICAgICAg
ICAgICAgICAgICAgICAgICBzaG93RWFydGhbaW5kZXhdID8gMSA6IDAuNiwgc2hvd0VhcnRoW2lu
ZGV4XSA/IGVhcnRoVGV4dHVyZSA6IG1hcnNUZXh0dXJlKTsKKworICAgICAgICAgICAgICAgIGN1
cnJlbnRBbmdsZXNbaW5kZXhdICs9IGluY0FuZ2xlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAo
Y3VycmVudEFuZ2xlc1tpbmRleF0gPiAzNjApCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRB
bmdsZXNbaW5kZXhdIC09IDM2MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGN0eC5iaW5kVGV4dHVyZShjdHguVEVYVFVSRV8yRCwgMCk7CisgICAgY3R4LmZsdXNoKCk7
CisKKyAgICBmcmFtZXJhdGUuc25hcHNob3QoKTsKK30KKworZnVuY3Rpb24gc3RhcnQoYywgdywg
aCwgc3BoZXJlU2l6ZSkKK3sKKyAgICBjLndpZHRoID0gdzsKKyAgICBjLmhlaWdodCA9IGg7CisK
KyAgICBpZiAoIXNwaGVyZVNpemUpCisgICAgICAgIHNwaGVyZVNpemUgPSAzMDsKKworICAgIHZh
ciBjdHggPSBpbml0KHNwaGVyZVNpemUpOworICAgIGN1cnJlbnRBbmdsZXMgPSBbIF07CisgICAg
aW5jQW5nbGVzID0gWyBdOworICAgIHNob3dFYXJ0aCA9IFsgXTsKKworICAgIGZvciAodmFyIGkg
PSAwOyBpIDwgbnVtUm93Q29scyAqIG51bVJvd0NvbHMgKiBudW1MYXllcnM7ICsraSkgeworICAg
ICAgICBjdXJyZW50QW5nbGVzW2ldID0gMDsKKyAgICAgICAgaW5jQW5nbGVzW2ldID0gTWF0aC5y
YW5kb20oKSAqIChtYXhJbmNBbmdsZSAtIG1pbkluY0FuZ2xlKSArIG1pbkluY0FuZ2xlOworICAg
ICAgICBzaG93RWFydGhbaV0gPSBNYXRoLnJhbmRvbSgpID4gMC41OworICAgIH0KKworICAgIGZy
YW1lcmF0ZSA9IG5ldyBGcmFtZXJhdGUoImZyYW1lcmF0ZSIpOworCisgICAgdmFyIGYgPSBmdW5j
dGlvbigpIHsgZHJhd1BpY3R1cmUoY3R4KSB9OworICAgIHNldEludGVydmFsKGYsIDEwKTsKK30K
</data>
<flag name="review"
          id="26841"
          type_id="1"
          status="+"
          setter="fishd"
    />
    <flag name="commit-queue"
          id="26852"
          type_id="3"
          status="-"
          setter="commit-queue"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44930</attachid>
            <date>2009-12-15 18:03:52 -0800</date>
            <delta_ts>2009-12-16 10:51:02 -0800</delta_ts>
            <desc>Revised patch</desc>
            <filename>performance.patch</filename>
            <type>text/plain</type>
            <size>14220</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MjE3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzYgQEAKKzIwMDktMTItMTUgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBl
cmZvcm1hbmNlIHByb2JsZW1zIHdpdGggaW5kZXggdmFsaWRhdGlvbiBjb2RlIGZvciBkcmF3RWxl
bWVudHMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMy
NDY2CisKKyAgICAgICAgQWRkZWQgYSBjYWNoZSBvZiB0aGUgbWF4aW11bSBpbmRleCBmb3IgZWFj
aCBlbGVtZW50IHR5cGUgdG8KKyAgICAgICAgV2ViR0xCdWZmZXIsIHF1ZXJ5aW5nIGl0IGJlZm9y
ZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgaW5kaWNlcyBpbgorICAgICAgICB0aGUgY2xpZW50LXNp
ZGUgY29weSBvZiB0aGUgYnVmZmVyJ3MgZGF0YS4gSG9pc3RlZCBjaGVja3Mgb2YgdGhlCisgICAg
ICAgIHNpemUgb2YgdGhlIGVsZW1lbnQgYXJyYXkgaXRzZWxmIGludG8gdmFsaWRhdGVFbGVtZW50
QXJyYXlTaXplIHRvCisgICAgICAgIGF2b2lkIGR1cGxpY2F0aW5nIGNvZGUuCisKKyAgICAgICAg
VGhlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGhhcyBiZWVuIG1lYXN1cmVkIHdpdGggbWFudWFs
IHRlc3RzLgorICAgICAgICBFeGlzdGluZyBsYXlvdXQgdGVzdHMgY292ZXIgdGhlIGluZGV4IHZh
bGlkYXRpb24gZnVuY3Rpb25hbGl0eQorICAgICAgICBhbmQgY29udGludWUgdG8gcGFzcyBhcyBi
ZWZvcmUuCisKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6V2ViR0xCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6
V2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6V2Vi
R0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlclN1YkRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6V2Vi
R0xCdWZmZXI6OmdldENhY2hlZE1heEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMQnVm
ZmVyOjpzZXRDYWNoZWRNYXhJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6
Y2xlYXJDYWNoZWRNYXhJbmRpY2VzKToKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTEJ1ZmZl
ci5oOgorICAgICAgICAqIGh0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlRWxlbWVudEFy
cmF5U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlk
YXRlSW5kZXhBcnJheUNvbnNlcnZhdGl2ZSk6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlSW5kZXhBcnJheVByZWNpc2UpOgorICAgICAgICAoV2ViQ29y
ZTo6V2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmRlcmluZ1N0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZHJhd0VsZW1lbnRzKToKKyAgICAg
ICAgKiBodG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuaDoKKwogMjAwOS0xMi0xNSAg
RGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERh
cmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5jcHAJKHJldmlzaW9u
IDUyMTY3KQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ3LDE0ICs0NywxOCBAQCBXZWJHTEJ1ZmZlcjo6V2ViR0xCdWZmZXIoV2ViR0xS
ZW5kZXJpbmdDCiAgICAgLCBtX2VsZW1lbnRBcnJheUJ1ZmZlckJ5dGVMZW5ndGgoMCkKICAgICAs
IG1fYXJyYXlCdWZmZXJCeXRlTGVuZ3RoKDApCiAgICAgLCBtX2VsZW1lbnRBcnJheUJ1ZmZlckNs
b25lZChmYWxzZSkKKyAgICAsIG1fbmV4dEF2YWlsYWJsZUNhY2hlRW50cnkoMCkKIHsKICAgICBz
ZXRPYmplY3QoY29udGV4dCgpLT5ncmFwaGljc0NvbnRleHQzRCgpLT5jcmVhdGVCdWZmZXIoKSk7
CisgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7CiB9CiAKIFdlYkdMQnVmZmVyOjpXZWJHTEJ1
ZmZlcihXZWJHTFJlbmRlcmluZ0NvbnRleHQqIGN0eCwgUGxhdGZvcm0zRE9iamVjdCBvYmopCiAg
ICAgOiBDYW52YXNPYmplY3QoY3R4KQorICAgICwgbV9uZXh0QXZhaWxhYmxlQ2FjaGVFbnRyeSgw
KQogewogICAgIHNldE9iamVjdChvYmosIGZhbHNlKTsKKyAgICBjbGVhckNhY2hlZE1heEluZGlj
ZXMoKTsKIH0KIAogdm9pZCBXZWJHTEJ1ZmZlcjo6X2RlbGV0ZU9iamVjdChQbGF0Zm9ybTNET2Jq
ZWN0IG9iamVjdCkKQEAgLTgzLDYgKzg3LDcgQEAgYm9vbCBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRl
QnVmZmVyRGF0YSh1bgogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIAogICAgIGlmICh0
YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKSB7CisgICAg
ICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwogICAgICAgICBtX2VsZW1lbnRBcnJheUJ1ZmZl
ckJ5dGVMZW5ndGggPSBhcnJheS0+Ynl0ZUxlbmd0aCgpOwogICAgICAgICBtX2VsZW1lbnRBcnJh
eUJ1ZmZlciA9IGFycmF5LT5idWZmZXIoKTsKICAgICAgICAgbV9lbGVtZW50QXJyYXlCdWZmZXJD
bG9uZWQgPSBmYWxzZTsKQEAgLTEwMyw2ICsxMDgsOCBAQCBib29sIFdlYkdMQnVmZmVyOjphc3Nv
Y2lhdGVCdWZmZXJTdWJEYXRhCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgCiAgICAg
aWYgKHRhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsK
KyAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7CisKICAgICAgICAgLy8gV2UgbmVlZCB0
byBwcm90ZWN0IGFnYWluc3QgaW50ZWdlciBvdmVyZmxvdyB3aXRoIHRoZXNlIHRlc3RzCiAgICAg
ICAgIGlmIChvZmZzZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTMyLDYg
KzEzOSwzMyBAQCB1bnNpZ25lZCBXZWJHTEJ1ZmZlcjo6Ynl0ZUxlbmd0aCh1bnNpZ25lCiAgICAg
cmV0dXJuICh0YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUikgPyBtX2Fy
cmF5QnVmZmVyQnl0ZUxlbmd0aCA6IG1fZWxlbWVudEFycmF5QnVmZmVyQnl0ZUxlbmd0aDsKIH0K
IAorbG9uZyBXZWJHTEJ1ZmZlcjo6Z2V0Q2FjaGVkTWF4SW5kZXgodW5zaWduZWQgbG9uZyB0eXBl
KQoreworICAgIHNpemVfdCBudW1FbnRyaWVzID0gc2l6ZW9mKG1fbWF4SW5kZXhDYWNoZSkgLyBz
aXplb2YoTWF4SW5kZXhDYWNoZUVudHJ5KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51
bUVudHJpZXM7IGkrKykKKyAgICAgICAgaWYgKG1fbWF4SW5kZXhDYWNoZVtpXS50eXBlID09IHR5
cGUpCisgICAgICAgICAgICByZXR1cm4gbV9tYXhJbmRleENhY2hlW2ldLm1heEluZGV4OworICAg
IHJldHVybiAtMTsKK30KKwordm9pZCBXZWJHTEJ1ZmZlcjo6c2V0Q2FjaGVkTWF4SW5kZXgodW5z
aWduZWQgbG9uZyB0eXBlLCBsb25nIHZhbHVlKQoreworICAgIGludCBudW1FbnRyaWVzID0gc2l6
ZW9mKG1fbWF4SW5kZXhDYWNoZSkgLyBzaXplb2YoTWF4SW5kZXhDYWNoZUVudHJ5KTsKKyAgICBm
b3IgKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykKKyAgICAgICAgaWYgKG1fbWF4SW5k
ZXhDYWNoZVtpXS50eXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIG1fbWF4SW5kZXhDYWNoZVtp
XS5tYXhJbmRleCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
bV9tYXhJbmRleENhY2hlW21fbmV4dEF2YWlsYWJsZUNhY2hlRW50cnldLnR5cGUgPSB0eXBlOwor
ICAgIG1fbWF4SW5kZXhDYWNoZVttX25leHRBdmFpbGFibGVDYWNoZUVudHJ5XS5tYXhJbmRleCA9
IHZhbHVlOworICAgIG1fbmV4dEF2YWlsYWJsZUNhY2hlRW50cnkgPSAobV9uZXh0QXZhaWxhYmxl
Q2FjaGVFbnRyeSArIDEpICUgbnVtRW50cmllczsKK30KKwordm9pZCBXZWJHTEJ1ZmZlcjo6Y2xl
YXJDYWNoZWRNYXhJbmRpY2VzKCkKK3sKKyAgICBtZW1zZXQobV9tYXhJbmRleENhY2hlLCAwLCBz
aXplb2YobV9tYXhJbmRleENhY2hlKSk7Cit9CisKIH0KIAogI2VuZGlmIC8vIEVOQUJMRSgzRF9D
QU5WQVMpCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5oCShyZXZpc2lvbiA1MjE2NykK
KysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAkod29ya2luZyBjb3B5KQpAQCAt
NTEsNiArNTEsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB1bnNpZ25lZCBieXRl
TGVuZ3RoKHVuc2lnbmVkIGxvbmcgdGFyZ2V0KSBjb25zdDsKICAgICAgICAgY29uc3QgV2ViR0xB
cnJheUJ1ZmZlciogZWxlbWVudEFycmF5QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50
QXJyYXlCdWZmZXIuZ2V0KCk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAv
LyBHZXRzIHRoZSBjYWNoZWQgbWF4IGluZGV4IGZvciB0aGUgZ2l2ZW4gdHlwZS4gUmV0dXJucyAt
MSBpZgorICAgICAgICAvLyBub25lIGhhcyBiZWVuIHNldC4KKyAgICAgICAgbG9uZyBnZXRDYWNo
ZWRNYXhJbmRleCh1bnNpZ25lZCBsb25nIHR5cGUpOworICAgICAgICAvLyBTZXRzIHRoZSBjYWNo
ZWQgbWF4IGluZGV4IGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgICAgdm9pZCBzZXRDYWNoZWRN
YXhJbmRleCh1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcgdmFsdWUpOworCiAgICAgcHJvdGVjdGVk
OgogICAgICAgICBXZWJHTEJ1ZmZlcihXZWJHTFJlbmRlcmluZ0NvbnRleHQqKTsKICAgICAgICAg
V2ViR0xCdWZmZXIoV2ViR0xSZW5kZXJpbmdDb250ZXh0KiwgUGxhdGZvcm0zRE9iamVjdCBvYmop
OwpAQCAtNjIsNiArNjgsMjYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB1bnNpZ25l
ZCBtX2VsZW1lbnRBcnJheUJ1ZmZlckJ5dGVMZW5ndGg7CiAgICAgICAgIHVuc2lnbmVkIG1fYXJy
YXlCdWZmZXJCeXRlTGVuZ3RoOwogICAgICAgICBib29sIG1fZWxlbWVudEFycmF5QnVmZmVyQ2xv
bmVkOworCisgICAgICAgIC8vIE9wdGltaXphdGlvbiBmb3IgaW5kZXggdmFsaWRhdGlvbi4gRm9y
IGVhY2ggdHlwZSBvZiBpbmRleAorICAgICAgICAvLyAoaS5lLiwgVU5TSUdORURfU0hPUlQpLCBj
YWNoZSB0aGUgbWF4aW11bSBpbmRleCBpbiB0aGUKKyAgICAgICAgLy8gZW50aXJlIGJ1ZmZlci4K
KyAgICAgICAgLy8gCisgICAgICAgIC8vIFRoaXMgaXMgc3VmZmljaWVudCB0byBlbGltaW5hdGUg
YSBsb3Qgb2Ygd29yayB1cG9uIGVhY2gKKyAgICAgICAgLy8gZHJhdyBjYWxsIGFzIGxvbmcgYXMg
YWxsIGJvdW5kIGFycmF5IGJ1ZmZlcnMgYXJlIGF0IGxlYXN0CisgICAgICAgIC8vIHRoYXQgc2l6
ZS4KKyAgICAgICAgc3RydWN0IE1heEluZGV4Q2FjaGVFbnRyeSB7CisgICAgICAgICAgICB1bnNp
Z25lZCBsb25nIHR5cGU7CisgICAgICAgICAgICBsb25nIG1heEluZGV4OworICAgICAgICB9Owor
ICAgICAgICAvLyBPcGVuR0wgRVMgMi4wIG9ubHkgaGFzIHR3byB2YWxpZCBpbmRleCB0eXBlcyAo
VU5TSUdORURfQllURQorICAgICAgICAvLyBhbmQgVU5TSUdORURfU0hPUlQpLCBidXQgbWlnaHQg
YXMgd2VsbCBsZWF2ZSBvcGVuIHRoZQorICAgICAgICAvLyBwb3NzaWJpbGl0eSBvZiBhZGRpbmcg
b3RoZXJzLgorICAgICAgICBNYXhJbmRleENhY2hlRW50cnkgbV9tYXhJbmRleENhY2hlWzRdOwor
ICAgICAgICB1bnNpZ25lZCBtX25leHRBdmFpbGFibGVDYWNoZUVudHJ5OworCisgICAgICAgIC8v
IENsZWFycyBhbGwgb2YgdGhlIGNhY2hlZCBtYXggaW5kaWNlcy4KKyAgICAgICAgdm9pZCBjbGVh
ckNhY2hlZE1heEluZGljZXMoKTsKICAgICB9OwogICAgIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNw
cAkocmV2aXNpb24gNTIxNjcpCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5n
Q29udGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU3NCwzMSArNTc0LDk1IEBAIHZvaWQgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0OjpkaXNhYmxlVmVydGUKICAgICBjbGVhbnVwQWZ0ZXJHcmFwaGlj
c0NhbGwoZmFsc2UpOwogfQogCi1ib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVJ
bmRleEFycmF5KHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBv
ZmZzZXQsIGxvbmcmIG51bUVsZW1lbnRzKQorYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZh
bGlkYXRlRWxlbWVudEFycmF5U2l6ZSh1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25n
IHR5cGUsIGxvbmcgb2Zmc2V0KQogewotICAgIGxvbmcgbGFzdEluZGV4ID0gLTE7CiAgICAgaWYg
KCFtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIAorCiAgICAgaWYgKG9mZnNldCA8IDApCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgCi0gICAgLy8gVGhlIEdMIHNwZWMgc2F5cyB0aGF0IGNvdW50IG11c3QgYmUgImdyZWF0ZXIK
LSAgICAKKwogICAgIHVuc2lnbmVkIGxvbmcgdW9mZnNldCA9IHN0YXRpY19jYXN0PHVuc2lnbmVk
IGxvbmc+KG9mZnNldCk7Ci0gICAgCisKICAgICBpZiAodHlwZSA9PSBHcmFwaGljc0NvbnRleHQz
RDo6VU5TSUdORURfU0hPUlQpIHsKICAgICAgICAgLy8gRm9yIGFuIHVuc2lnbmVkIHNob3J0IGFy
cmF5LCBvZmZzZXQgbXVzdCBiZSBkaXZpc2libGUgYnkgMiBmb3IgYWxpZ25tZW50IHJlYXNvbnMu
CiAgICAgICAgIGlmICh1b2Zmc2V0ICYgMSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgCisKICAgICAgICAgLy8gTWFrZSB1b2Zmc2V0IGFuIGVsZW1lbnQgb2Zmc2V0LgogICAg
ICAgICB1b2Zmc2V0IC89IDI7Ci0gICAgCisKICAgICAgICAgdW5zaWduZWQgbG9uZyBuID0gbV9i
b3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+Ynl0ZUxlbmd0aChHcmFwaGljc0NvbnRleHQzRDo6RUxF
TUVOVF9BUlJBWV9CVUZGRVIpIC8gMjsKICAgICAgICAgaWYgKHVvZmZzZXQgPiBuIHx8IGNvdW50
ID4gbiAtIHVvZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAK
KyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX0JZVEUp
IHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBuID0gbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+
Ynl0ZUxlbmd0aChHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpOworICAg
ICAgICBpZiAodW9mZnNldCA+IG4gfHwgY291bnQgPiBuIC0gdW9mZnNldCkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGV4QXJyYXlDb25zZXJ2YXRpdmUodW5zaWduZWQg
bG9uZyB0eXBlLCBsb25nJiBudW1FbGVtZW50c1JlcXVpcmVkKQoreworICAgIC8vIFBlcmZvcm1z
IGNvbnNlcnZhdGl2ZSB2YWxpZGF0aW9uIGJ5IGNhY2hpbmcgYSBtYXhpbXVtIGluZGV4IG9mCisg
ICAgLy8gdGhlIGdpdmVuIHR5cGUgcGVyIGVsZW1lbnQgYXJyYXkgYnVmZmVyLiBJZiBhbGwgb2Yg
dGhlIGJvdW5kCisgICAgLy8gYXJyYXkgYnVmZmVycyBoYXZlIGVub3VnaCBlbGVtZW50cyB0byBz
YXRpc2Z5IHRoYXQgbWF4aW11bQorICAgIC8vIGluZGV4LCBza2lwcyB0aGUgZXhwZW5zaXZlIHBl
ci1kcmF3LWNhbGwgaXRlcmF0aW9uIGluCisgICAgLy8gdmFsaWRhdGVJbmRleEFycmF5UHJlY2lz
ZS4KKworICAgIGxvbmcgbWF4SW5kZXggPSBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5nZXRD
YWNoZWRNYXhJbmRleCh0eXBlKTsKKyAgICBpZiAobWF4SW5kZXggPCAwKSB7CisgICAgICAgIC8v
IENvbXB1dGUgdGhlIG1heGltdW0gaW5kZXggaW4gdGhlIGVudGlyZSBidWZmZXIgZm9yIHRoZSBn
aXZlbiB0eXBlIG9mIGluZGV4LgorICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2Fz
ZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfQllURTogeworICAgICAgICAgICAgdW5zaWdu
ZWQgbnVtRWxlbWVudHMgPSBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5ieXRlTGVuZ3RoKEdy
YXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUik7CisgICAgICAgICAgICBjb25z
dCB1bnNpZ25lZCBjaGFyKiBwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KG1f
Ym91bmRFbGVtZW50QXJyYXlCdWZmZXItPmVsZW1lbnRBcnJheUJ1ZmZlcigpLT5kYXRhKCkpOwor
ICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUVsZW1lbnRzOyBpKyspCisg
ICAgICAgICAgICAgICAgbWF4SW5kZXggPSBtYXgobWF4SW5kZXgsIHN0YXRpY19jYXN0PGxvbmc+
KHBbaV0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgR3Jh
cGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX1NIT1JUOiB7CisgICAgICAgICAgICB1bnNpZ25lZCBu
dW1FbGVtZW50cyA9IG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPmJ5dGVMZW5ndGgoR3JhcGhp
Y3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKSAvIHNpemVvZih1bnNpZ25lZCBzaG9y
dCk7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogcCA9IHN0YXRpY19jYXN0PGNv
bnN0IHVuc2lnbmVkIHNob3J0Kj4obV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+ZWxlbWVudEFy
cmF5QnVmZmVyKCktPmRhdGEoKSk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbnVtRWxlbWVudHM7IGkrKykKKyAgICAgICAgICAgICAgICBtYXhJbmRleCA9IG1heChtYXhJ
bmRleCwgc3RhdGljX2Nhc3Q8bG9uZz4ocFtpXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICBtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5zZXRDYWNoZWRNYXhJbmRl
eCh0eXBlLCBtYXhJbmRleCk7CisgICAgfQorCisgICAgaWYgKG1heEluZGV4ID49IDApIHsKKyAg
ICAgICAgLy8gVGhlIG51bWJlciBvZiByZXF1aXJlZCBlbGVtZW50cyBpcyBvbmUgbW9yZSB0aGFu
IHRoZSBtYXhpbXVtCisgICAgICAgIC8vIGluZGV4IHRoYXQgd2lsbCBiZSBhY2Nlc3NlZC4KKyAg
ICAgICAgbnVtRWxlbWVudHNSZXF1aXJlZCA9IG1heEluZGV4ICsgMTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFdlYkdMUmVuZGVy
aW5nQ29udGV4dDo6dmFsaWRhdGVJbmRleEFycmF5UHJlY2lzZSh1bnNpZ25lZCBsb25nIGNvdW50
LCB1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcgb2Zmc2V0LCBsb25nJiBudW1FbGVtZW50c1JlcXVp
cmVkKQoreworICAgIC8vIEZJWE1FOiAiY291bnQiIHNob3VsZCBuZWVkIHRvIGJlIHVzZWQgaW4g
dGhlIGNvbXB1dGF0aW9uIGJlbG93CisgICAgVU5VU0VEX1BBUkFNKGNvdW50KTsKKyAgICBsb25n
IGxhc3RJbmRleCA9IC0xOworCisgICAgaWYgKCFtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgIC8vIFRoZSBHTCBzcGVjIHNheXMg
dGhhdCBjb3VudCBtdXN0IGJlICJncmVhdGVyCisgICAgCisgICAgdW5zaWduZWQgbG9uZyB1b2Zm
c2V0ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ob2Zmc2V0KTsKKyAgICAKKyAgICBpZiAo
dHlwZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlQpIHsKKyAgICAgICAgLy8g
TWFrZSB1b2Zmc2V0IGFuIGVsZW1lbnQgb2Zmc2V0LgorICAgICAgICB1b2Zmc2V0IC89IDI7Cisg
ICAgCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbiA9IG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXIt
PmJ5dGVMZW5ndGgoR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKSAvIDI7
CiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5z
aWduZWQgc2hvcnQqPihtX2JvdW5kRWxlbWVudEFycmF5QnVmZmVyLT5lbGVtZW50QXJyYXlCdWZm
ZXIoKS0+ZGF0YSgpKTsKICAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKICAgICAgICAgICAgIGlm
ICgqcCA+IGxhc3RJbmRleCkKQEAgLTYwNyw5ICs2NzEsNiBAQCBib29sIFdlYkdMUmVuZGVyaW5n
Q29udGV4dDo6dmFsaWRhdGVJbmRlCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHR5cGUgPT0g
R3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX0JZVEUpIHsKICAgICAgICAgdW5zaWduZWQgbG9u
ZyBuID0gbV9ib3VuZEVsZW1lbnRBcnJheUJ1ZmZlci0+Ynl0ZUxlbmd0aChHcmFwaGljc0NvbnRl
eHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpOwotICAgICAgICBpZiAodW9mZnNldCA+IG4gfHwg
Y291bnQgPiBuIC0gdW9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgIAogICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
dW5zaWduZWQgY2hhcio+KG1fYm91bmRFbGVtZW50QXJyYXlCdWZmZXItPmVsZW1lbnRBcnJheUJ1
ZmZlcigpLT5kYXRhKCkpOwogICAgICAgICB3aGlsZSAobi0tID4gMCkgewogICAgICAgICAgICAg
aWYgKCpwID4gbGFzdEluZGV4KQpAQCAtNjE5LDExICs2ODAsMTEgQEAgYm9vbCBXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlSW5kZQogICAgIH0gICAgCiAgICAgICAgIAogICAgIC8vIFRo
ZW4gc2V0IHRoZSBsYXN0IGluZGV4IGluIHRoZSBpbmRleCBhcnJheSBhbmQgbWFrZSBzdXJlIGl0
IGlzIHZhbGlkLgotICAgIG51bUVsZW1lbnRzID0gbGFzdEluZGV4ICsgMTsKLSAgICByZXR1cm4g
bnVtRWxlbWVudHMgPiAwOworICAgIG51bUVsZW1lbnRzUmVxdWlyZWQgPSBsYXN0SW5kZXggKyAx
OworICAgIHJldHVybiBudW1FbGVtZW50c1JlcXVpcmVkID4gMDsKIH0KIAotYm9vbCBXZWJHTFJl
bmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUobG9uZyBudW1FbGVtZW50cykK
K2Jvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmRlcmluZ1N0YXRlKGxvbmcg
bnVtRWxlbWVudHNSZXF1aXJlZCkKIHsKICAgICAvLyBMb29rIGluIGVhY2ggZW5hYmxlZCB2ZXJ0
ZXggYXR0cmliIGFuZCBmaW5kIHRoZSBzbWFsbGVzdCBidWZmZXIgc2l6ZQogICAgIGxvbmcgc21h
bGxlc3ROdW1FbGVtZW50cyA9IExPTkdfTUFYOwpAQCAtNjM2LDcgKzY5Nyw3IEBAIGJvb2wgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmQKICAgICBpZiAoc21hbGxlc3ROdW1FbGVt
ZW50cyA9PSBMT05HX01BWCkKICAgICAgICAgc21hbGxlc3ROdW1FbGVtZW50cyA9IDA7CiAgICAg
Ci0gICAgcmV0dXJuIG51bUVsZW1lbnRzIDw9IHNtYWxsZXN0TnVtRWxlbWVudHM7CisgICAgcmV0
dXJuIG51bUVsZW1lbnRzUmVxdWlyZWQgPD0gc21hbGxlc3ROdW1FbGVtZW50czsKIH0KIAogdm9p
ZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmRyYXdBcnJheXModW5zaWduZWQgbG9uZyBtb2RlLCBs
b25nIGZpcnN0LCBsb25nIGNvdW50LCBFeGNlcHRpb25Db2RlJiBlYykKQEAgLTY1OCwxMCArNzE5
LDE2IEBAIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpkcmF3RWxlbWVudHMKICAgICAvLyBF
bnN1cmUgd2UgaGF2ZSBhIHZhbGlkIHJlbmRlcmluZyBzdGF0ZQogICAgIGxvbmcgbnVtRWxlbWVu
dHM7CiAgICAgCi0gICAgaWYgKG9mZnNldCA8IDAgfHwgIXZhbGlkYXRlSW5kZXhBcnJheShjb3Vu
dCwgdHlwZSwgb2Zmc2V0LCBudW1FbGVtZW50cykgfHwgIXZhbGlkYXRlUmVuZGVyaW5nU3RhdGUo
bnVtRWxlbWVudHMpKSB7CisgICAgaWYgKG9mZnNldCA8IDAgfHwgIXZhbGlkYXRlRWxlbWVudEFy
cmF5U2l6ZShjb3VudCwgdHlwZSwgb2Zmc2V0KSkgewogICAgICAgICBtX2NvbnRleHQtPnN5bnRo
ZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJBVElPTik7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CisKKyAgICBpZiAoIXZhbGlkYXRlSW5kZXhBcnJheUNvbnNlcnZh
dGl2ZSh0eXBlLCBudW1FbGVtZW50cykgfHwgIXZhbGlkYXRlUmVuZGVyaW5nU3RhdGUobnVtRWxl
bWVudHMpKQorICAgICAgICBpZiAoIXZhbGlkYXRlSW5kZXhBcnJheVByZWNpc2UoY291bnQsIHR5
cGUsIG9mZnNldCwgbnVtRWxlbWVudHMpIHx8ICF2YWxpZGF0ZVJlbmRlcmluZ1N0YXRlKG51bUVs
ZW1lbnRzKSkgeworICAgICAgICAgICAgbV9jb250ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFw
aGljc0NvbnRleHQzRDo6SU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CiAgICAgCiAgICAgbV9jb250ZXh0LT5kcmF3RWxlbWVudHMobW9kZSwgY291bnQs
IHR5cGUsIG9mZnNldCk7CiAgICAgY2xlYW51cEFmdGVyR3JhcGhpY3NDYWxsKHRydWUpOwpJbmRl
eDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCShyZXZpc2lv
biA1MjE2NykKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTMwMSw3ICszMDEsMTQgQEAgY2xhc3MgV2ViS2l0Q1NTTWF0cml4
OwogICAgICAgICAgICAgICAgIG1hcmtDb250ZXh0Q2hhbmdlZCgpOwogICAgICAgICB9CiAgICAg
ICAgIAotICAgICAgICBib29sIHZhbGlkYXRlSW5kZXhBcnJheSh1bnNpZ25lZCBsb25nIGNvdW50
LCB1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcgb2Zmc2V0LCBsb25nJiBudW1FbGVtZW50cyk7Cisg
ICAgICAgIC8vIEJhc2ljIHZhbGlkYXRpb24gb2YgY291bnQgYW5kIG9mZnNldCBhZ2FpbnN0IG51
bWJlciBvZiBlbGVtZW50cyBpbiBlbGVtZW50IGFycmF5IGJ1ZmZlcgorICAgICAgICBib29sIHZh
bGlkYXRlRWxlbWVudEFycmF5U2l6ZSh1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25n
IHR5cGUsIGxvbmcgb2Zmc2V0KTsKKworICAgICAgICAvLyBDb25zZXJ2YXRpdmUgYnV0IHF1aWNr
IGluZGV4IHZhbGlkYXRpb24KKyAgICAgICAgYm9vbCB2YWxpZGF0ZUluZGV4QXJyYXlDb25zZXJ2
YXRpdmUodW5zaWduZWQgbG9uZyB0eXBlLCBsb25nJiBudW1FbGVtZW50c1JlcXVpcmVkKTsKKwor
ICAgICAgICAvLyBQcmVjaXNlIGJ1dCBzbG93IGluZGV4IHZhbGlkYXRpb24gLS0gb25seSBkb25l
IGlmIGNvbnNlcnZhdGl2ZSBjaGVja3MgZmFpbAorICAgICAgICBib29sIHZhbGlkYXRlSW5kZXhB
cnJheVByZWNpc2UodW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBsb25n
IG9mZnNldCwgbG9uZyYgbnVtRWxlbWVudHNSZXF1aXJlZCk7CiAgICAgICAgIGJvb2wgdmFsaWRh
dGVSZW5kZXJpbmdTdGF0ZShsb25nIG51bUVsZW1lbnRzKTsKIAogICAgICAgICBPd25QdHI8R3Jh
cGhpY3NDb250ZXh0M0Q+IG1fY29udGV4dDsK
</data>

          </attachment>
      

    </bug>

</bugzilla>