<?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>154485</bug_id>
          
          <creation_ts>2016-02-19 17:46:01 -0800</creation_ts>
          <short_desc>MallocBench: Added recording for nimlang website, new recording details and added new options</short_desc>
          <delta_ts>2016-02-23 09:37:21 -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>Tools / Tests</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>lforschler</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1166638</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2016-02-19 17:46:01 -0800</bug_when>
    <thetext>In the process of debugging https://bugs.webkit.org/show_bug.cgi?id=154091 I added new capabilities to MallocBench.  These include:
 - Added a recording of http://nim-lang.org/docs/lib.html.
 - Added thread id to the recording and the ability to playback switching threads in MallocBench
 - Added aligned allocations to recordings and the ability to playback 
 - Added --use-thread-id option to honor recorded thread ids
 - Added --detailed-report to output remaining allocations by size after playback
 - Added --no-warmup to not run the warm up iteration</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1166642</commentid>
    <comment_count>1</comment_count>
      <attachid>271832</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2016-02-19 18:04:49 -0800</bug_when>
    <thetext>Created attachment 271832
Patch

I did not include the new nimlang.ops in this patch.  I&apos;ll land it separately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1166643</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-02-19 18:06:27 -0800</bug_when>
    <thetext>Attachment 271832 did not pass style-queue:


ERROR: PerformanceTests/MallocBench/MallocBench/stress.h:31:  benchmark_stress is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/theverge.cpp:45:  benchmark_theverge is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/theverge.cpp:57:  benchmark_theverge_memory_warning is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/theverge.h:31:  benchmark_theverge is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/theverge.h:32:  benchmark_theverge_memory_warning is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/alloc_free.cpp:26:  Found header this file implements before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/alloc_free.cpp:31:  benchmark_alloc_free is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/big.cpp:42:  benchmark_big is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/tree.cpp:178:  benchmark_tree_allocate is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/tree.cpp:193:  benchmark_tree_traverse is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/tree.cpp:208:  benchmark_tree_churn is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/flickr.h:31:  benchmark_flickr is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/flickr.h:32:  benchmark_flickr_memory_warning is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:33:  Streams are highly discouraged.  [readability/streams] [3]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:35:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:160:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:161:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:166:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:173:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:175:  More than one command on the same line  [whitespace/newline] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:175:  Missing space before {  [whitespace/braces] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:175:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:246:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:307:  More than one command on the same line  [whitespace/newline] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:307:  Missing space before {  [whitespace/braces] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:315:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/tree.h:31:  benchmark_tree_allocate is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/tree.h:32:  benchmark_tree_traverse is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/tree.h:33:  benchmark_tree_churn is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/medium.cpp:42:  benchmark_medium is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/flickr.cpp:45:  benchmark_flickr is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/flickr.cpp:57:  benchmark_flickr_memory_warning is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/message.cpp:113:  benchmark_message_one is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/message.cpp:141:  benchmark_message_many is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/reddit.h:31:  benchmark_reddit is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/reddit.h:32:  benchmark_reddit_memory_warning is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/nimlang.h:31:  benchmark_nimlang is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/medium.h:31:  benchmark_medium is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/nimlang.cpp:26:  Found other header before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/nimlang.cpp:28:  Found header this file implements after other header. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/nimlang.cpp:31:  &quot;cstddef&quot; already included at PerformanceTests/MallocBench/MallocBench/nimlang.cpp:30  [build/include] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/nimlang.cpp:43:  Bad include order. Mixing system and custom headers.  [build/include_order] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/nimlang.cpp:45:  benchmark_nimlang is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/list.cpp:99:  benchmark_list_allocate is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/list.cpp:127:  benchmark_list_traverse is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/alloc_free.h:31:  benchmark_alloc_free is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/list.h:31:  benchmark_list_allocate is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/list.h:32:  benchmark_list_traverse is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/fragment.h:31:  benchmark_fragment is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/fragment.h:32:  benchmark_fragment_iterate is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/stress_aligned.h:31:  benchmark_stress_aligned is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/fragment.cpp:82:  benchmark_fragment is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/fragment.cpp:110:  benchmark_fragment_iterate is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/big.h:31:  benchmark_big is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/balloon.h:31:  benchmark_balloon is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/balloon.cpp:36:  benchmark_balloon is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/facebook.cpp:45:  benchmark_facebook is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/memalign.cpp:30:  Bad include order. Mixing system and custom headers.  [build/include_order] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/memalign.cpp:44:  benchmark_memalign is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/realloc.h:31:  benchmark_realloc is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/realloc.cpp:32:  benchmark_realloc is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/memalign.h:31:  benchmark_memalign is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/facebook.h:31:  benchmark_facebook is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.h:45:  enum members should use InterCaps with an initial capital letter or initial &apos;k&apos; for C-style enums.  [readability/enum_casing] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.h:46:  More than one command on the same line  [whitespace/newline] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.h:50:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/Interpreter.h:61:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
ERROR: PerformanceTests/MallocBench/MallocBench/stress.cpp:123:  benchmark_stress is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/message.h:31:  benchmark_message_one is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/message.h:32:  benchmark_message_many is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/churn.h:31:  benchmark_churn is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/churn.cpp:42:  benchmark_churn is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/reddit.cpp:45:  benchmark_reddit is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/reddit.cpp:57:  benchmark_reddit_memory_warning is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/stress_aligned.cpp:140:  benchmark_stress_aligned is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
ERROR: PerformanceTests/MallocBench/MallocBench/CommandLine.h:60:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]
Total errors found: 76 in 45 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167134</commentid>
    <comment_count>3</comment_count>
      <attachid>271832</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-02-22 12:15:06 -0800</bug_when>
    <thetext>Comment on attachment 271832
Patch

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

r=me

&gt; PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:148
&gt; +            if (m_useThreadId &amp;&amp; (runThreadId != threadId)) {
&gt; +                switchToThread(threadId);
&gt; +                break;
&gt; +            }

This won&apos;t be very useful for testing throughput since it will artificially incur synchronization overhead. But I guess it could be useful to catching bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167148</commentid>
    <comment_count>4</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2016-02-22 12:40:36 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 271832 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=271832&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:148
&gt; &gt; +            if (m_useThreadId &amp;&amp; (runThreadId != threadId)) {
&gt; &gt; +                switchToThread(threadId);
&gt; &gt; +                break;
&gt; &gt; +            }
&gt; 
&gt; This won&apos;t be very useful for testing throughput since it will artificially
&gt; incur synchronization overhead. But I guess it could be useful to catching
&gt; bugs.

Agreed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167172</commentid>
    <comment_count>5</comment_count>
      <attachid>271832</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-02-22 13:28:36 -0800</bug_when>
    <thetext>Comment on attachment 271832
Patch

Rejecting attachment 271832 from commit-queue.

Failed to run &quot;[&apos;/Volumes/Data/EWS/WebKit/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=webkit-queues.webkit.org&apos;, &apos;--bot-id=webkit-cq-02&apos;, &apos;land-attachment&apos;, &apos;--force-clean&apos;, &apos;--non-interactive&apos;, &apos;--parent-command=commit-queue&apos;, 271832, &apos;--port=mac&apos;]&quot; exit_code: 2 cwd: /Volumes/Data/EWS/WebKit

Last 500 characters of output:
/git.webkit.org/WebKit
   abd2e00..3c44510  master     -&gt; origin/master
Partial-rebuilding .git/svn/refs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc ...
Currently at 196951 = abd2e004968543c90d575b9444879cfd024dae2f
r196952 = 3c44510dcb10a0de38505ef976c12b1e83cac895
Done rebuilding .git/svn/refs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.

Full output: http://webkit-queues.webkit.org/results/869131</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167183</commentid>
    <comment_count>6</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2016-02-22 14:02:18 -0800</bug_when>
    <thetext>Committed r196955: &lt;http://trac.webkit.org/changeset/196955&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167419</commentid>
    <comment_count>7</comment_count>
      <attachid>271832</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-02-23 09:26:36 -0800</bug_when>
    <thetext>Comment on attachment 271832
Patch

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

&gt; PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:97
&gt; +    fprintf(stderr, &quot;Done running\n&quot;);

Revert this too -- it clutters the output and seems accidental. If it&apos;s valuable, you can conditionalize it based on --detailed-report.

&gt; PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:241
&gt; +static void writeData(void* start, size_t size)
&gt; +{
&gt; +    char* writePtr = reinterpret_cast&lt;char*&gt;(start);
&gt; +
&gt; +    for (size_t sizeLeft = size; !!sizeLeft; ) {
&gt; +        size_t sizeThisIter = std::min(sizeLeft, 4096ul);
&gt; +        
&gt; +        writePtr[0] = random() &amp; 0xff;
&gt; +        writePtr[1] = random() &amp; 0xff;
&gt; +        writePtr[2] = random() &amp; 0xff;
&gt; +        writePtr[3] = random() &amp; 0xff;
&gt; +
&gt; +        writePtr += sizeThisIter;
&gt; +        sizeLeft -= sizeThisIter;
&gt; +    }
&gt; +}

I didn&apos;t notice this change initially. I think you should revert it.

I&apos;m not familiar with any programs that write to four random byte locations inside each 4kB of memory. Most programs I&apos;m familiar with initialize (all of) their allocated memory, and then read it a bunch too. The one exception I can think of is vector-like objects, which may initialize only 50%.

The performance of a memory allocator depends not only on the speed of its function calls but also on the speed of *reading and writing* the memory it returns. If our benchmark neglects to read or write 99.9% of the memory it allocates, it misses an important aspect of performance.

Our old behavior used zeroing to reflect the bare minimum memory traffic that we expect each allocation to experience. (Most allocations will experience more, since they will read after writing.) There may be an argument for doing more reads and writes -- but I don&apos;t think there can be an argument for doing fewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1167428</commentid>
    <comment_count>8</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2016-02-23 09:37:21 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Comment on attachment 271832 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=271832&amp;action=review
&gt; 
&gt; &gt; PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:97
&gt; &gt; +    fprintf(stderr, &quot;Done running\n&quot;);
&gt; 
&gt; Revert this too -- it clutters the output and seems accidental. If it&apos;s
&gt; valuable, you can conditionalize it based on --detailed-report.
&gt; 
&gt; &gt; PerformanceTests/MallocBench/MallocBench/Interpreter.cpp:241
&gt; &gt; +static void writeData(void* start, size_t size)
&gt; &gt; +{
&gt; &gt; +    char* writePtr = reinterpret_cast&lt;char*&gt;(start);
&gt; &gt; +
&gt; &gt; +    for (size_t sizeLeft = size; !!sizeLeft; ) {
&gt; &gt; +        size_t sizeThisIter = std::min(sizeLeft, 4096ul);
&gt; &gt; +        
&gt; &gt; +        writePtr[0] = random() &amp; 0xff;
&gt; &gt; +        writePtr[1] = random() &amp; 0xff;
&gt; &gt; +        writePtr[2] = random() &amp; 0xff;
&gt; &gt; +        writePtr[3] = random() &amp; 0xff;
&gt; &gt; +
&gt; &gt; +        writePtr += sizeThisIter;
&gt; &gt; +        sizeLeft -= sizeThisIter;
&gt; &gt; +    }
&gt; &gt; +}
&gt; 
&gt; I didn&apos;t notice this change initially. I think you should revert it.
&gt; 
&gt; I&apos;m not familiar with any programs that write to four random byte locations
&gt; inside each 4kB of memory. Most programs I&apos;m familiar with initialize (all
&gt; of) their allocated memory, and then read it a bunch too. The one exception
&gt; I can think of is vector-like objects, which may initialize only 50%.
&gt; 
&gt; The performance of a memory allocator depends not only on the speed of its
&gt; function calls but also on the speed of *reading and writing* the memory it
&gt; returns. If our benchmark neglects to read or write 99.9% of the memory it
&gt; allocates, it misses an important aspect of performance.
&gt; 
&gt; Our old behavior used zeroing to reflect the bare minimum memory traffic
&gt; that we expect each allocation to experience. (Most allocations will
&gt; experience more, since they will read after writing.) There may be an
&gt; argument for doing more reads and writes -- but I don&apos;t think there can be
&gt; an argument for doing fewer.

I&apos;ll revert both of these.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>271832</attachid>
            <date>2016-02-19 18:04:49 -0800</date>
            <delta_ts>2016-02-22 13:28:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>154485.patch</filename>
            <type>text/plain</type>
            <size>54857</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvcnVuLW1hbGxvYy1iZW5jaG1hcmtz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvcnVuLW1hbGxvYy1i
ZW5jaG1hcmtzCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0Jl
bmNoL3J1bi1tYWxsb2MtYmVuY2htYXJrcwkod29ya2luZyBjb3B5KQpAQCAtMjIsNiArMjIsNyBA
QCAkYmVuY2htYXJrcyA9IFsKICAgICAicmVkZGl0IiwKICAgICAiZmxpY2tyIiwKICAgICAidGhl
dmVyZ2UiLAorICAgICJuaW1sYW5nIiwKIAogICAgICMgTXVsdGktdGhyZWFkZWQgYmVuY2htYXJr
IHZhcmlhbnRzLgogICAgICJtZXNzYWdlX29uZSIsCkBAIC0zNCw2ICszNSw3IEBAICRiZW5jaG1h
cmtzID0gWwogICAgICMgInJlZGRpdCAtLXBhcmFsbGVsIiwKICAgICAjICJmbGlja3IgLS1wYXJh
bGxlbCIsCiAgICAgIyAidGhldmVyZ2UgLS1wYXJhbGxlbCIsCisgICAgIyAibmltbGFuZyAtLXVz
ZS10aHJlYWQtaWQiLAogICAgICJmcmFnbWVudCAtLXBhcmFsbGVsIiwKICAgICAiZnJhZ21lbnRf
aXRlcmF0ZSAtLXBhcmFsbGVsIiwKIApJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5j
aC9NYWxsb2NCZW5jaC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBl
cmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5j
aC9NYWxsb2NCZW5jaC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBA
IC0zOCw2ICszOCw4IEBACiAJCTE0RDYzMjJFMUE2OUJFMEIwMEE4Rjg0RiAvKiBtZW1hbGlnbi5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEQ2MzIy
QzFBNjlCRTBCMDBBOEY4NEYgLyogbWVtYWxpZ24uY3BwICovOyB9OwogCQkxNEUxMTkzMjE3N0VD
QzhCMDAzQThEMTUgLyogQ1BVQ291bnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMTRFMTE5MzAxNzdFQ0M4QjAwM0E4RDE1IC8qIENQVUNvdW50LmNw
cCAqLzsgfTsKIAkJMTRGQ0EzNjExOUE3QzkxNzAwMUNGREE5IC8qIHN0cmVzcy5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEZDQTM1RjE5QTdDOTE3
MDAxQ0ZEQTkgLyogc3RyZXNzLmNwcCAqLzsgfTsKKwkJNjVFNDAxQTYxQzY1N0E4NzAwM0M2RTlD
IC8qIG5pbWxhbmcuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gNjVFNDAxQTQxQzY1N0E4NzAwM0M2RTlDIC8qIG5pbWxhbmcuY3BwICovOyB9OworCQk2
NUU0MDFBQzFDNzNCMDY4MDAzQzZFOUMgLyogYWxsb2NfZnJlZS5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2NUU0MDFBQTFDNzNCMDY4MDAzQzZFOUMg
LyogYWxsb2NfZnJlZS5jcHAgKi87IH07CiAvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8K
IAogLyogQmVnaW4gUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCkBAIC0xMTQsNiAr
MTE2LDExIEBACiAJCTE0RTExOTM0MTc3RjUyMTkwMDNBOEQxNSAvKiBtYm1hbGxvYy5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBtYm1hbGxvYy5oOyBwYXRoID0gTWFsbG9jQmVu
Y2gvbWJtYWxsb2MuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTRGQ0EzNUYxOUE3
QzkxNzAwMUNGREE5IC8qIHN0cmVzcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IG5hbWUgPSBzdHJlc3MuY3BwOyBwYXRoID0gTWFsbG9jQmVuY2gvc3RyZXNzLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTRGQ0EzNjAxOUE3QzkxNzAwMUNGREE5IC8qIHN0cmVz
cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBzdHJlc3MuaDsgcGF0aCA9IE1h
bGxvY0JlbmNoL3N0cmVzcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2NUU0MDFB
NDFDNjU3QTg3MDAzQzZFOUMgLyogbmltbGFuZy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IG5hbWUgPSBuaW1sYW5nLmNwcDsgcGF0aCA9IE1hbGxvY0JlbmNoL25pbWxhbmcuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2NUU0MDFBNTFDNjU3QTg3MDAzQzZFOUMg
LyogbmltbGFuZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBuaW1sYW5nLmg7
IHBhdGggPSBNYWxsb2NCZW5jaC9uaW1sYW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTY1RTQwMUFBMUM3M0IwNjgwMDNDNkU5QyAvKiBhbGxvY19mcmVlLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IGFsbG9jX2ZyZWUuY3BwOyBwYXRoID0gTWFsbG9j
QmVuY2gvYWxsb2NfZnJlZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTY1RTQw
MUFCMUM3M0IwNjgwMDNDNkU5QyAvKiBhbGxvY19mcmVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgbmFtZSA9IGFsbG9jX2ZyZWUuaDsgcGF0aCA9IE1hbGxvY0JlbmNoL2FsbG9jX2ZyZWUu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNjVFNDAxQUQxQzc3RTdDODAwM0M2RTlD
IC8qIG5pbWxhbmcub3BzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZp
bGVUeXBlID0gZmlsZTsgbmFtZSA9IG5pbWxhbmcub3BzOyBwYXRoID0gTWFsbG9jQmVuY2gvbmlt
bGFuZy5vcHM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAvKiBFbmQgUEJYRmlsZVJlZmVy
ZW5jZSBzZWN0aW9uICovCiAKIC8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rp
b24gKi8KQEAgLTE5Miw2ICsxOTksOCBAQAogCQkxNEUxMTkzMzE3N0Y1MUFDMDAzQThEMTUgLyog
QmVuY2htYXJrcyAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCisJ
CQkJNjVFNDAxQUExQzczQjA2ODAwM0M2RTlDIC8qIGFsbG9jX2ZyZWUuY3BwICovLAorCQkJCTY1
RTQwMUFCMUM3M0IwNjgwMDNDNkU5QyAvKiBhbGxvY19mcmVlLmggKi8sCiAJCQkJMTQxMDVFN0Qx
OERGN0Q3MzAwM0ExMDZFIC8qIGJhbGxvb24uY3BwICovLAogCQkJCTE0MTA1RTdFMThERjdENzMw
MDNBMTA2RSAvKiBiYWxsb29uLmggKi8sCiAJCQkJMTRDRTRBNUUxN0JEMzU1ODAwMjg4REFBIC8q
IGJpZy5jcHAgKi8sCkBAIC0yMTYsNiArMjI1LDkgQEAKIAkJCQkxNDQ0QUU5NDE3N0U4REYyMDBG
ODAzMEEgLyogbWVzc2FnZS5jcHAgKi8sCiAJCQkJMTQ0NEFFOTUxNzdFOERGMjAwRjgwMzBBIC8q
IG1lc3NhZ2UuaCAqLywKIAkJCQkxNDEwNUU4MDE4RTEzRUVDMDAzQTEwNkUgLyogcmVhbGxvYy5j
cHAgKi8sCisJCQkJNjVFNDAxQTQxQzY1N0E4NzAwM0M2RTlDIC8qIG5pbWxhbmcuY3BwICovLAor
CQkJCTY1RTQwMUFEMUM3N0U3QzgwMDNDNkU5QyAvKiBuaW1sYW5nLm9wcyAqLywKKwkJCQk2NUU0
MDFBNTFDNjU3QTg3MDAzQzZFOUMgLyogbmltbGFuZy5oICovLAogCQkJCTE0MTA1RTgxMThFMTNF
RUMwMDNBMTA2RSAvKiByZWFsbG9jLmggKi8sCiAJCQkJMTQ0N0FFOTcxOEZCNTlEOTAwQjNEN0ZG
IC8qIHJlZGRpdF9tZW1vcnlfd2FybmluZy5vcHMgKi8sCiAJCQkJMTQ0N0FFOEExOEZCNTg0MjAw
QjNEN0ZGIC8qIHJlZGRpdC5jcHAgKi8sCkBAIC0zMTcsNiArMzI5LDcgQEAKIAkJCQkxNENFNEE2
MDE3QkQzNTU4MDAyODhEQUEgLyogYmlnLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0OTc2RUQx
MTc3RTRBRjcwMDZCODE5QSAvKiB0cmVlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0NDRBRTk2
MTc3RThERjIwMEY4MDMwQSAvKiBtZXNzYWdlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTY1RTQw
MUFDMUM3M0IwNjgwMDNDNkU5QyAvKiBhbGxvY19mcmVlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTE0NDUyQ0VGMTc3RDQ3MTEwMDk3RTA1NyAvKiBjaHVybi5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQkxNDQ1MkNCMDE3N0QyNDQ2MDA5N0UwNTcgLyogbWFpbi5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQkxNEZDQTM2MTE5QTdDOTE3MDAxQ0ZEQTkgLyogc3RyZXNzLmNwcCBpbiBTb3VyY2VzICovLApA
QCAtMzI0LDYgKzMzNyw3IEBACiAJCQkJMTQ0N0FFOTAxOEZCNTg0MjAwQjNEN0ZGIC8qIGZsaWNr
ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDk3NkVDODE3N0UzNjQ5MDA2QjgxOUEgLyogbGlz
dC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDk3NkVDQzE3N0UzQzg3MDA2QjgxOUEgLyogQ29t
bWFuZExpbmUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNjVFNDAxQTYxQzY1N0E4NzAwM0M2RTlD
IC8qIG5pbWxhbmcuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQ0N0FFOTIxOEZCNTg0MjAwQjNE
N0ZGIC8qIHRoZXZlcmdlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0RDBCRkYzMUE2RjREM0Iw
MDEwOUYzMSAvKiBzdHJlc3NfYWxpZ25lZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDUxRkFF
RDE4QjE0QjcxMDBEQjZENDcgLyogbWVkaXVtLmNwcCBpbiBTb3VyY2VzICovLApJbmRleDogUGVy
Zm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9CZW5jaG1hcmsuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvQmVuY2ht
YXJrLmNwcAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5j
aC9NYWxsb2NCZW5jaC9CZW5jaG1hcmsuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw2ICsyNSw3
IEBACiAKICNpbmNsdWRlICJCZW5jaG1hcmsuaCIKICNpbmNsdWRlICJDUFVDb3VudC5oIgorI2lu
Y2x1ZGUgImFsbG9jX2ZyZWUuaCIKICNpbmNsdWRlICJiYWxsb29uLmgiCiAjaW5jbHVkZSAiYmln
LmgiCiAjaW5jbHVkZSAiY2h1cm4uaCIKQEAgLTM1LDggKzM2LDEwIEBACiAjaW5jbHVkZSAibWVk
aXVtLmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCisjaW5j
bHVkZSAibmltbGFuZy5oIgogI2luY2x1ZGUgInJlZGRpdC5oIgogI2luY2x1ZGUgInJlYWxsb2Mu
aCIKKyNpbmNsdWRlICJzaW1wbGUuaCIKICNpbmNsdWRlICJzdHJlc3MuaCIKICNpbmNsdWRlICJz
dHJlc3NfYWxpZ25lZC5oIgogI2luY2x1ZGUgInRoZXZlcmdlLmgiCkBAIC02MSw2ICs2NCw3IEBA
IHN0cnVjdCBCZW5jaG1hcmtQYWlyIHsKIH07CiAKIHN0YXRpYyBjb25zdCBCZW5jaG1hcmtQYWly
IGJlbmNobWFya1BhaXJzW10gPSB7CisgICAgeyAiYWxsb2NfZnJlZSIsIGJlbmNobWFya19hbGxv
Y19mcmVlIH0sCiAgICAgeyAiYmFsbG9vbiIsIGJlbmNobWFya19iYWxsb29uIH0sCiAgICAgeyAi
YmlnIiwgYmVuY2htYXJrX2JpZyB9LAogICAgIHsgImNodXJuIiwgYmVuY2htYXJrX2NodXJuIH0s
CkBAIC03NSw2ICs3OSw3IEBAIHN0YXRpYyBjb25zdCBCZW5jaG1hcmtQYWlyIGJlbmNobWFya1Bh
aXIKICAgICB7ICJtZW1hbGlnbiIsIGJlbmNobWFya19tZW1hbGlnbiB9LAogICAgIHsgIm1lc3Nh
Z2VfbWFueSIsIGJlbmNobWFya19tZXNzYWdlX21hbnkgfSwKICAgICB7ICJtZXNzYWdlX29uZSIs
IGJlbmNobWFya19tZXNzYWdlX29uZSB9LAorICAgIHsgIm5pbWxhbmciLCBiZW5jaG1hcmtfbmlt
bGFuZyB9LAogICAgIHsgInJlYWxsb2MiLCBiZW5jaG1hcmtfcmVhbGxvYyB9LAogICAgIHsgInJl
ZGRpdCIsIGJlbmNobWFya19yZWRkaXQgfSwKICAgICB7ICJyZWRkaXRfbWVtb3J5X3dhcm5pbmci
LCBiZW5jaG1hcmtfcmVkZGl0X21lbW9yeV93YXJuaW5nIH0sCkBAIC0xMjcsMTUgKzEzMiwxMyBA
QCBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlSGVhcCh2b2lkKioqIGNodW5rCiAgICAgbWJmcmVlKGNo
dW5rcywgY2h1bmtDb3VudCAqIHNpemVvZih2b2lkKiopKTsKIH0KIAotQmVuY2htYXJrOjpCZW5j
aG1hcmsoY29uc3Qgc3RyaW5nJiBiZW5jaG1hcmtOYW1lLCBib29sIGlzUGFyYWxsZWwsIHNpemVf
dCBydW5zLCBzaXplX3QgaGVhcFNpemUpCitCZW5jaG1hcms6OkJlbmNobWFyayhDb21tYW5kTGlu
ZSYgY29tbWFuZExpbmUpCiAgICAgOiBtX2JlbmNobWFya1BhaXIoKQogICAgICwgbV9lbGFwc2Vk
VGltZSgpCi0gICAgLCBtX2lzUGFyYWxsZWwoaXNQYXJhbGxlbCkKLSAgICAsIG1faGVhcFNpemUo
aGVhcFNpemUpCi0gICAgLCBtX3J1bnMocnVucykKKyAgICAsIG1fY29tbWFuZExpbmUoY29tbWFu
ZExpbmUpCiB7CiAgICAgY29uc3QgQmVuY2htYXJrUGFpciogYmVuY2htYXJrUGFpciA9IHN0ZDo6
ZmluZCgKLSAgICAgICAgYmVuY2htYXJrUGFpcnMsIGJlbmNobWFya1BhaXJzICsgYmVuY2htYXJr
c1BhaXJzQ291bnQsIGJlbmNobWFya05hbWUpOworICAgICAgICBiZW5jaG1hcmtQYWlycywgYmVu
Y2htYXJrUGFpcnMgKyBiZW5jaG1hcmtzUGFpcnNDb3VudCwgbV9jb21tYW5kTGluZS5iZW5jaG1h
cmtOYW1lKCkpOwogICAgIGlmIChiZW5jaG1hcmtQYWlyID09IGJlbmNobWFya1BhaXJzICsgYmVu
Y2htYXJrc1BhaXJzQ291bnQpCiAgICAgICAgIHJldHVybjsKICAgICAKQEAgLTE1MSw4ICsxNTQs
OCBAQCB2b2lkIEJlbmNobWFyazo6cHJpbnRCZW5jaG1hcmtzKCkKIAogdm9pZCBCZW5jaG1hcms6
OnJ1bk9uY2UoKQogewotICAgIGlmICghbV9pc1BhcmFsbGVsKSB7Ci0gICAgICAgIG1fYmVuY2ht
YXJrUGFpci0+ZnVuY3Rpb24obV9pc1BhcmFsbGVsKTsKKyAgICBpZiAoIW1fY29tbWFuZExpbmUu
aXNQYXJhbGxlbCgpKSB7CisgICAgICAgIG1fYmVuY2htYXJrUGFpci0+ZnVuY3Rpb24obV9jb21t
YW5kTGluZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE2MCw3ICsxNjMsNyBAQCB2
b2lkIEJlbmNobWFyazo6cnVuT25jZSgpCiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNw
dUNvdW50KCk7ICsraSkgewogICAgICAgICBkaXNwYXRjaF9ncm91cF9hc3luYyhncm91cCwgZGlz
cGF0Y2hfZ2V0X2dsb2JhbF9xdWV1ZShESVNQQVRDSF9RVUVVRV9QUklPUklUWV9ISUdILCAwKSwg
XnsKLSAgICAgICAgICAgIG1fYmVuY2htYXJrUGFpci0+ZnVuY3Rpb24obV9pc1BhcmFsbGVsKTsK
KyAgICAgICAgICAgIG1fYmVuY2htYXJrUGFpci0+ZnVuY3Rpb24obV9jb21tYW5kTGluZSk7CiAg
ICAgICAgIH0pOwogICAgIH0KIApAQCAtMTc0LDIwICsxNzcsMjMgQEAgdm9pZCBCZW5jaG1hcms6
OnJ1bigpCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBvYmplY3RTaXplID0gMzI7CiAgICAgc3Rh
dGljIGNvbnN0IHNpemVfdCBjaHVua1NpemUgPSAxMDI0ICogMTAyNDsKICAgICAKLSAgICB2b2lk
KioqIGhlYXAgPSBhbGxvY2F0ZUhlYXAobV9oZWFwU2l6ZSwgY2h1bmtTaXplLCBvYmplY3RTaXpl
KTsKKyAgICB2b2lkKioqIGhlYXAgPSBhbGxvY2F0ZUhlYXAobV9jb21tYW5kTGluZS5oZWFwU2l6
ZSgpLCBjaHVua1NpemUsIG9iamVjdFNpemUpOwogCi0gICAgcnVuT25jZSgpOyAvLyBXYXJtdXAg
cnVuLgorICAgIGlmIChtX2NvbW1hbmRMaW5lLndhcm1VcCgpKQorICAgICAgICBydW5PbmNlKCk7
IC8vIFdhcm11cCBydW4uCiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcnVuczsgKytp
KSB7CisgICAgc2l6ZV90IHJ1bnMgPSBtX2NvbW1hbmRMaW5lLnJ1bnMoKTsKKworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcnVuczsgKytpKSB7CiAgICAgICAgIGRvdWJsZSBzdGFydCA9IGN1
cnJlbnRUaW1lTVMoKTsKICAgICAgICAgcnVuT25jZSgpOwogICAgICAgICBkb3VibGUgZW5kID0g
Y3VycmVudFRpbWVNUygpOwogICAgICAgICBkb3VibGUgZWxhcHNlZCA9IGVuZCAtIHN0YXJ0Owog
ICAgICAgICBtX2VsYXBzZWRUaW1lICs9IGVsYXBzZWQ7CiAgICAgfQotICAgIG1fZWxhcHNlZFRp
bWUgLz0gbV9ydW5zOworICAgIG1fZWxhcHNlZFRpbWUgLz0gcnVuczsKIAotICAgIGRlYWxsb2Nh
dGVIZWFwKGhlYXAsIG1faGVhcFNpemUsIGNodW5rU2l6ZSwgb2JqZWN0U2l6ZSk7CisgICAgZGVh
bGxvY2F0ZUhlYXAoaGVhcCwgbV9jb21tYW5kTGluZS5oZWFwU2l6ZSgpLCBjaHVua1NpemUsIG9i
amVjdFNpemUpOwogICAgIAogICAgIG1ic2NhdmVuZ2UoKTsKICAgICBtX21lbW9yeSA9IGN1cnJl
bnRNZW1vcnlCeXRlcygpOwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxs
b2NCZW5jaC9CZW5jaG1hcmsuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxv
Y0JlbmNoL01hbGxvY0JlbmNoL0JlbmNobWFyay5oCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJm
b3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL0JlbmNobWFyay5oCSh3b3JraW5n
IGNvcHkpCkBAIC0yNiwxMCArMjYsMTEgQEAKICNpZm5kZWYgQmVuY2htYXJrX2gKICNkZWZpbmUg
QmVuY2htYXJrX2gKIAorI2luY2x1ZGUgIkNvbW1hbmRMaW5lLmgiCiAjaW5jbHVkZSA8bWFwPgog
I2luY2x1ZGUgPHN0cmluZz4KIAotdHlwZWRlZiB2b2lkICgqQmVuY2htYXJrRnVuY3Rpb24pKGJv
b2wgaXNQYXJhbGxlbCk7Cit0eXBlZGVmIHZvaWQgKCpCZW5jaG1hcmtGdW5jdGlvbikoQ29tbWFu
ZExpbmUmIGNvbW1hbmRMaW5lKTsKIHN0cnVjdCBCZW5jaG1hcmtQYWlyOwogCiBjbGFzcyBCZW5j
aG1hcmsgewpAQCAtNTksNyArNjAsNyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIGRvdWJsZSBjdXJy
ZW50VGltZU1TKCk7CiAgICAgc3RhdGljIE1lbW9yeSBjdXJyZW50TWVtb3J5Qnl0ZXMoKTsKIAot
ICAgIEJlbmNobWFyayhjb25zdCBzdGQ6OnN0cmluZyYsIGJvb2wgaXNQYXJhbGxlbCwgc2l6ZV90
IHJ1bnMsIHNpemVfdCBoZWFwU2l6ZSk7CisgICAgQmVuY2htYXJrKENvbW1hbmRMaW5lJik7CiAg
ICAgCiAgICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbV9iZW5jaG1hcmtQYWlyOyB9CiAgICAg
CkBAIC03NSw5ICs3Niw4IEBAIHByaXZhdGU6CiAgICAgTWFwVHlwZSBtX21hcDsKIAogICAgIGNv
bnN0IEJlbmNobWFya1BhaXIqIG1fYmVuY2htYXJrUGFpcjsKLSAgICBib29sIG1faXNQYXJhbGxl
bDsKLSAgICBzaXplX3QgbV9ydW5zOwotICAgIHNpemVfdCBtX2hlYXBTaXplOworCisgICAgQ29t
bWFuZExpbmUmIG1fY29tbWFuZExpbmU7CiAKICAgICBNZW1vcnkgbV9tZW1vcnk7CiAgICAgZG91
YmxlIG1fZWxhcHNlZFRpbWU7CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01h
bGxvY0JlbmNoL0NvbW1hbmRMaW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3Rz
L01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL0NvbW1hbmRMaW5lLmNwcAkocmV2aXNpb24gMTk2ODQ2
KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9Db21tYW5kTGlu
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDMyICszMCw0NiBAQAogc3RydWN0IG9wdGlvbiBD
b21tYW5kTGluZTo6bG9uZ09wdGlvbnNbXSA9CiB7CiAgICAgeyJiZW5jaG1hcmsiLCByZXF1aXJl
ZF9hcmd1bWVudCwgMCwgJ2InfSwKKyAgICB7ImRldGFpbGVkLXJlcG9ydCIsIG5vX2FyZ3VtZW50
LCAwLCAnZCd9LAorICAgIHsibm8td2FybXVwIiwgbm9fYXJndW1lbnQsIDAsICduJyB9LAogICAg
IHsicGFyYWxsZWwiLCBub19hcmd1bWVudCwgMCwgJ3AnfSwKICAgICB7ImhlYXAiLCByZXF1aXJl
ZF9hcmd1bWVudCwgMCwgJ2gnfSwKICAgICB7InJ1bnMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwg
J3InfSwKKyAgICB7InVzZS10aHJlYWQtaWQiLCBub19hcmd1bWVudCwgMCwgJ3QnfSwKICAgICB7
MCwgMCwgMCwgMH0KIH07CiAKIENvbW1hbmRMaW5lOjpDb21tYW5kTGluZShpbnQgYXJnYywgY2hh
cioqIGFyZ3YpCiAgICAgOiBtX2FyZ2MoYXJnYykKICAgICAsIG1fYXJndihhcmd2KQorICAgICwg
bV9kZXRhaWxlZFJlcG9ydChmYWxzZSkKICAgICAsIG1faXNQYXJhbGxlbChmYWxzZSkKKyAgICAs
IG1fdXNlVGhyZWFkSUQoZmFsc2UpCisgICAgLCBtX3dhcm1VcCh0cnVlKQogICAgICwgbV9oZWFw
U2l6ZSgwKQogICAgICwgbV9ydW5zKDQpCiB7CiAgICAgaW50IG9wdGlvbkluZGV4ID0gMDsKICAg
ICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJiOnA6
aDpyIiwgbG9uZ09wdGlvbnMsICZvcHRpb25JbmRleCkpICE9IC0xKSB7CisgICAgd2hpbGUgKChj
aCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJiOmRucGg6cjp0IiwgbG9uZ09wdGlvbnMsICZv
cHRpb25JbmRleCkpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoY2gpCiAgICAgICAgIHsKICAg
ICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICAgICAgIG1fYmVuY2htYXJrTmFtZSA9IG9w
dGFyZzsKICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgY2FzZSAnZCc6Cisg
ICAgICAgICAgICAgICAgbV9kZXRhaWxlZFJlcG9ydCA9IHRydWU7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAg
ICAgICAgICBtX3dhcm1VcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAg
ICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgICAgICBtX2lzUGFyYWxsZWwgPSB0cnVlOwog
ICAgICAgICAgICAgICAgIGJyZWFrOwotCisgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBj
YXNlICdoJzoKICAgICAgICAgICAgICAgICBtX2hlYXBTaXplID0gYXRvaShvcHRhcmcpICogMTAy
NCAqIDEwMjQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NCw2ICs3OCwxMCBAQCBDb21t
YW5kTGluZTo6Q29tbWFuZExpbmUoaW50IGFyZ2MsIGNoYXIqCiAgICAgICAgICAgICAgICAgbV9y
dW5zID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAg
ICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICBtX3VzZVRocmVhZElEID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGRlZmF1bHQ6
CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTc1LDUgKzkzLDUgQEAgdm9p
ZCBDb21tYW5kTGluZTo6cHJpbnRVc2FnZSgpCiAgICAgc3RkOjpzdHJpbmcgZnVsbFBhdGgobV9h
cmd2WzBdKTsKICAgICBzaXplX3QgcG9zID0gZnVsbFBhdGguZmluZF9sYXN0X29mKCIvIikgKyAx
OwogICAgIHN0ZDo6c3RyaW5nIHByb2dyYW0gPSBmdWxsUGF0aC5zdWJzdHIocG9zKTsKLSAgICBz
dGQ6OmNvdXQgPDwgIlVzYWdlOiAiIDw8IHByb2dyYW0gPDwgIiAtLWJlbmNobWFyayBiZW5jaG1h
cmtfbmFtZSBbIC0tcGFyYWxsZWwgXSBbIC0taGVhcCBNQiBdIiA8PCBzdGQ6OmVuZGw7CisgICAg
c3RkOjpjb3V0IDw8ICJVc2FnZTogIiA8PCBwcm9ncmFtIDw8ICIgLS1iZW5jaG1hcmsgYmVuY2ht
YXJrX25hbWUgWy0tcGFyYWxsZWwgXSBbLS11c2UtdGhyZWFkLWlkIF0gWy0tZGV0YWlsZWQtcmVw
b3J0XSBbLS1uby13YXJtdXBdIFstLXJ1bnMgY291bnRdIFstLWhlYXAgTUIgXSIgPDwgc3RkOjpl
bmRsOwogfQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9D
b21tYW5kTGluZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gv
TWFsbG9jQmVuY2gvQ29tbWFuZExpbmUuaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFu
Y2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9Db21tYW5kTGluZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0yMyw2ICsyMyw5IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICAqLwogCisjaWZuZGVmIENv
bW1hbmRMaW5lX2gKKyNkZWZpbmUgQ29tbWFuZExpbmVfaAorCiAjaW5jbHVkZSA8c3RyaW5nPgog
CiBjbGFzcyBDb21tYW5kTGluZSB7CkBAIC0zMiw2ICszNSw5IEBAIHB1YmxpYzoKICAgICBib29s
IGlzVmFsaWQoKSB7IHJldHVybiBtX2JlbmNobWFya05hbWUuc2l6ZSgpOyB9CiAgICAgY29uc3Qg
c3RkOjpzdHJpbmcmIGJlbmNobWFya05hbWUoKSB7IHJldHVybiBtX2JlbmNobWFya05hbWU7IH0K
ICAgICBib29sIGlzUGFyYWxsZWwoKSB7IHJldHVybiBtX2lzUGFyYWxsZWw7IH0KKyAgICBib29s
IHVzZVRocmVhZElEKCkgeyByZXR1cm4gbV91c2VUaHJlYWRJRDsgfQorICAgIGJvb2wgZGV0YWls
ZWRSZXBvcnQoKSB7IHJldHVybiBtX2RldGFpbGVkUmVwb3J0OyB9CisgICAgYm9vbCB3YXJtVXAo
KSB7IHJldHVybiBtX3dhcm1VcDsgfQogICAgIHNpemVfdCBoZWFwU2l6ZSgpIHsgcmV0dXJuIG1f
aGVhcFNpemU7IH0KICAgICBzaXplX3QgcnVucygpIHsgcmV0dXJuIG1fcnVuczsgfQogCkBAIC00
Myw3ICs0OSwxMiBAQCBwcml2YXRlOgogICAgIGludCBtX2FyZ2M7CiAgICAgY2hhcioqIG1fYXJn
djsKICAgICBzdGQ6OnN0cmluZyBtX2JlbmNobWFya05hbWU7CisgICAgYm9vbCBtX2RldGFpbGVk
UmVwb3J0OwogICAgIGJvb2wgbV9pc1BhcmFsbGVsOworICAgIGJvb2wgbV91c2VUaHJlYWRJRDsK
KyAgICBib29sIG1fd2FybVVwOwogICAgIHNpemVfdCBtX2hlYXBTaXplOwogICAgIHNpemVfdCBt
X3J1bnM7CiB9OworCisjZW5kaWYgLy8gQ29tbWFuZExpbmVfaApcIE5vIG5ld2xpbmUgYXQgZW5k
IG9mIGZpbGUKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gv
SW50ZXJwcmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVu
Y2gvTWFsbG9jQmVuY2gvSW50ZXJwcmV0ZXIuY3BwCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJm
b3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL0ludGVycHJldGVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzAsNyArMzAsOSBAQAogI2luY2x1ZGUgPGNzdGRsaWI+CiAjaW5jbHVk
ZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgogI2lu
Y2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5o
PgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC00MCw4
ICs0MiwxMSBAQAogCiAjaW5jbHVkZSAibWJtYWxsb2MuaCIKIAotSW50ZXJwcmV0ZXI6OkludGVy
cHJldGVyKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBib29sIHNob3VsZEZyZWVBbGxPYmplY3RzKQor
SW50ZXJwcmV0ZXI6OkludGVycHJldGVyKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBib29sIHNob3Vs
ZEZyZWVBbGxPYmplY3RzLCBib29sIHVzZVRocmVhZElkKQogICAgIDogbV9zaG91bGRGcmVlQWxs
T2JqZWN0cyhzaG91bGRGcmVlQWxsT2JqZWN0cykKKyAgICAsIG1fdXNlVGhyZWFkSWQodXNlVGhy
ZWFkSWQpCisgICAgLCBtX2N1cnJlbnRUaHJlYWRJZCgwKQorICAgICwgbV9vcHMoMTAyNCkKIHsK
ICAgICBtX2ZkID0gb3BlbihmaWxlTmFtZSwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CiAg
ICAgaWYgKG1fZmQgPT0gLTEpCkBAIC04NCw0MyArODksMTcgQEAgdm9pZCBJbnRlcnByZXRlcjo6
cnVuKCkKIHsKICAgICBzdGQ6OnZlY3RvcjxPcD4gb3BzKDEwMjQpOwogICAgIGxzZWVrKG1fZmQs
IDAsIFNFRUtfU0VUKTsKLSAgICBzaXplX3QgcmVtYWluaW5nID0gbV9vcENvdW50ICogc2l6ZW9m
KE9wKTsKLSAgICB3aGlsZSAocmVtYWluaW5nKSB7Ci0gICAgICAgIHNpemVfdCBieXRlcyA9IHN0
ZDo6bWluKHJlbWFpbmluZywgb3BzLnNpemUoKSAqIHNpemVvZihPcCkpOwotICAgICAgICByZW1h
aW5pbmcgLT0gYnl0ZXM7Ci0gICAgICAgIHJlYWQobV9mZCwgb3BzLmRhdGEoKSwgYnl0ZXMpOwog
Ci0gICAgICAgIHNpemVfdCBvcENvdW50ID0gYnl0ZXMgLyBzaXplb2YoT3ApOwotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG9wQ291bnQ7ICsraSkgewotICAgICAgICAgICAgT3Agb3Ag
PSBvcHNbaV07Ci0gICAgICAgICAgICBzd2l0Y2ggKG9wLm9wY29kZSkgewotICAgICAgICAgICAg
Y2FzZSBvcF9tYWxsb2M6IHsKLSAgICAgICAgICAgICAgICBtX29iamVjdHNbb3Auc2xvdF0gPSB7
IG1ibWFsbG9jKG9wLnNpemUpLCBvcC5zaXplIH07Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KG1f
b2JqZWN0c1tvcC5zbG90XS5vYmplY3QpOwotICAgICAgICAgICAgICAgIGJ6ZXJvKG1fb2JqZWN0
c1tvcC5zbG90XS5vYmplY3QsIG9wLnNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBvcF9mcmVlOiB7Ci0gICAgICAgICAgICAgICAg
aWYgKCFtX29iamVjdHNbb3Auc2xvdF0ub2JqZWN0KQotICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgICAgICBtYmZyZWUobV9vYmplY3RzW29wLnNsb3RdLm9iamVjdCwg
bV9vYmplY3RzW29wLnNsb3RdLnNpemUpOwotICAgICAgICAgICAgICAgIG1fb2JqZWN0c1tvcC5z
bG90XSA9IHsgMCwgMCB9OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgY2FzZSBvcF9yZWFsbG9jOiB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX29i
amVjdHNbb3Auc2xvdF0ub2JqZWN0KQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgICAgICBtX29iamVjdHNbb3Auc2xvdF0gPSB7IG1icmVhbGxvYyhtX29iamVjdHNb
b3Auc2xvdF0ub2JqZWN0LCBtX29iamVjdHNbb3Auc2xvdF0uc2l6ZSwgb3Auc2l6ZSksIG9wLnNp
emUgfTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBvcGNvZGU6
ICVkXG4iLCBvcC5vcGNvZGUpOwotICAgICAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9CisgICAgbV9yZW1haW5pbmcgPSBtX29wQ291bnQgKiBzaXplb2YoT3ApOworICAgIG1fb3Bz
Q3Vyc29yID0gbV9vcHNJbkJ1ZmZlciA9IDA7CisgICAgZG9PblNhbWVUaHJlYWQoMCk7CisKKyAg
ICBmcHJpbnRmKHN0ZGVyciwgIkRvbmUgcnVubmluZ1xuIik7CisgICAgZm9yIChhdXRvIHRocmVh
ZCA6IG1fdGhyZWFkcykKKyAgICAgICAgdGhyZWFkLT5zdG9wKCk7CisKKyAgICBmb3IgKGF1dG8g
dGhyZWFkIDogbV90aHJlYWRzKQorICAgICAgICBkZWxldGUgdGhyZWFkOwogCiAgICAgLy8gQSBy
ZWNvcmRpbmcgbWlnaHQgbm90IGZyZWUgYWxsIG9mIGl0cyBhbGxvY2F0aW9ucy4KICAgICBpZiAo
IW1fc2hvdWxkRnJlZUFsbE9iamVjdHMpCkBAIC0xMzMsMyArMTEyLDIwNCBAQCB2b2lkIEludGVy
cHJldGVyOjpydW4oKQogICAgICAgICBtX29iamVjdHNbaV0gPSB7IDAsIDAgfTsKICAgICB9CiB9
CisKK2Jvb2wgSW50ZXJwcmV0ZXI6OnJlYWRPcHMoKQoreworICAgIGlmICghbV9yZW1haW5pbmcp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHNpemVfdCBieXRlcyA9IHN0ZDo6bWluKG1f
cmVtYWluaW5nLCBtX29wcy5zaXplKCkgKiBzaXplb2YoT3ApKTsKKyAgICBtX3JlbWFpbmluZyAt
PSBieXRlczsKKyAgICByZWFkKG1fZmQsIG1fb3BzLmRhdGEoKSwgYnl0ZXMpOworICAgIG1fb3Bz
Q3Vyc29yID0gMDsKKyAgICBtX29wc0luQnVmZmVyID0gYnl0ZXMgLyBzaXplb2YoT3ApOworICAg
IAorICAgIGlmICghbV9vcHNJbkJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OmRvT25TYW1lVGhyZWFkKFRocmVh
ZElkIHJ1blRocmVhZElkKQoreworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICgobV9v
cHNDdXJzb3IgPj0gbV9vcHNJbkJ1ZmZlcikgJiYgKCFyZWFkT3BzKCkpKSB7CisgICAgICAgICAg
ICBpZiAocnVuVGhyZWFkSWQpCisgICAgICAgICAgICAgICAgc3dpdGNoVG9UaHJlYWQoMCk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKDsgbV9vcHNDdXJz
b3IgPCBtX29wc0luQnVmZmVyOyArK21fb3BzQ3Vyc29yKSB7CisgICAgICAgICAgICBPcCBvcCA9
IG1fb3BzW21fb3BzQ3Vyc29yXTsKKyAgICAgICAgICAgIFRocmVhZElkIHRocmVhZElkID0gb3Au
dGhyZWFkSWQ7CisgICAgICAgICAgICBpZiAobV91c2VUaHJlYWRJZCAmJiAocnVuVGhyZWFkSWQg
IT0gdGhyZWFkSWQpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoVG9UaHJlYWQodGhyZWFkSWQp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBk
b01hbGxvY09wKG9wLCBtX2N1cnJlbnRUaHJlYWRJZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisK
K3ZvaWQgSW50ZXJwcmV0ZXI6OnN3aXRjaFRvVGhyZWFkKFRocmVhZElkIHRocmVhZElkKQorewor
ICAgIGlmIChtX2N1cnJlbnRUaHJlYWRJZCA9PSB0aHJlYWRJZCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgZm9yIChUaHJlYWRJZCB0aHJlYWRJbmRleCA9IHN0YXRpY19jYXN0PFRocmVhZElkPiht
X3RocmVhZHMuc2l6ZSgpKTsKKyAgICAgICAgIHRocmVhZEluZGV4IDwgdGhyZWFkSWQ7ICsrdGhy
ZWFkSW5kZXgpCisgICAgICAgIG1fdGhyZWFkcy5wdXNoX2JhY2sobmV3IFRocmVhZCh0aGlzLCB0
aHJlYWRJZCkpOworCisgICAgVGhyZWFkSWQgY3VycmVudFRocmVhZElkID0gbV9jdXJyZW50VGhy
ZWFkSWQ7CisKKyAgICBpZiAodGhyZWFkSWQgPT0gMCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9s
b2NrPHN0ZDo6bXV0ZXg+IGxvY2sobV90aHJlYWRNdXRleCk7CisgICAgICAgIG1fY3VycmVudFRo
cmVhZElkID0gdGhyZWFkSWQ7CisgICAgICAgIG1fc2hvdWxkUnVuLm5vdGlmeV9vbmUoKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgbV90aHJlYWRzW3RocmVhZElkIC0gMV0tPnN3aXRjaFRvKCk7Cisg
ICAgCisgICAgaWYgKGN1cnJlbnRUaHJlYWRJZCA9PSAwKSB7CisgICAgICAgIHN0ZDo6dW5pcXVl
X2xvY2s8c3RkOjptdXRleD4gbG9jayhtX3RocmVhZE11dGV4KTsKKyAgICAgICAgbV9zaG91bGRS
dW4ud2FpdChsb2NrLCBbdGhpc10oKXtyZXR1cm4gbV9jdXJyZW50VGhyZWFkSWQgPT0gMDsgfSk7
CisgICAgfSBlbHNlCisgICAgICAgIG1fdGhyZWFkc1tjdXJyZW50VGhyZWFkSWQgLSAxXS0+d2Fp
dFRvUnVuKCk7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OmRldGFpbGVkUmVwb3J0KCkKK3sKKyAg
ICBzaXplX3QgdG90YWxJblVzZSA9IDA7CisgICAgc2l6ZV90IHNtYWxsSW5Vc2UgPSAwOworICAg
IHNpemVfdCBtZWRpdW1JblVzZSA9IDA7CisgICAgc2l6ZV90IGxhcmdlSW5Vc2UgPSAwOworICAg
IHNpemVfdCBleHRyYUxhcmdlSW5Vc2UgPSAwOworICAgIHNpemVfdCBtZW1vcnlBbGxvY2F0ZWQg
PSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX29iamVjdHMuc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgaWYgKCFtX29iamVjdHNbaV0ub2JqZWN0KQorICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIHNpemVfdCBvYmplY3RTaXplID0gbV9vYmplY3RzW2ldLnNpemU7CisgICAg
ICAgIG1lbW9yeUFsbG9jYXRlZCArPSBvYmplY3RTaXplOworICAgICAgICB0b3RhbEluVXNlKys7
CisKKyAgICAgICAgaWYgKG9iamVjdFNpemUgPD0gMjU2KQorICAgICAgICAgICAgc21hbGxJblVz
ZSsrOworICAgICAgICBlbHNlIGlmIChvYmplY3RTaXplIDw9IDEwMjQpCisgICAgICAgICAgICBt
ZWRpdW1JblVzZSsrOworICAgICAgICBlbHNlIGlmIChvYmplY3RTaXplIDw9IDEwMzIxOTIpCisg
ICAgICAgICAgICBsYXJnZUluVXNlKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4dHJh
TGFyZ2VJblVzZSsrOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiMEItMjU2QiBvYmplY3Rz
IGluIHVzZTogIiA8PCBzbWFsbEluVXNlIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwg
IjI1N0ItMUsgb2JqZWN0cyBpbiB1c2U6ICIgPDwgbWVkaXVtSW5Vc2UgPDwgc3RkOjplbmRsOwor
ICAgIHN0ZDo6Y291dCA8PCAiICAxSy0xTSBvYmplY3RzIGluIHVzZTogIiA8PCBsYXJnZUluVXNl
IDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgICAxTSsgb2JqZWN0cyBpbiB1c2U6
ICIgPDwgZXh0cmFMYXJnZUluVXNlIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIiAg
VG90YWwgb2JqZWN0cyBpbiB1c2U6ICIgPDwgdG90YWxJblVzZSA8PCBzdGQ6OmVuZGw7CisgICAg
c3RkOjpjb3V0IDw8ICJUb3RhbCBhbGxvY2F0ZWQgbWVtb3J5OiAiIDw8IG1lbW9yeUFsbG9jYXRl
ZCAvIDEwMjQgPDwgImtCIiA8PCBzdGQ6OmVuZGw7Cit9CitzdGF0aWMgc2l6ZV90IGNvbXB1dGUy
dG9Qb3dlcih1bnNpZ25lZCBsb2cybikKK3sKKyAgICAvLyBDaGVjayBmb3IgYmFkIGFsaWdubWVu
dCBsb2cyIHZhbHVlIGFuZCByZXR1cm4gYSBiYWQgYWxpZ25tZW50LgorICAgIGlmIChsb2cybiA+
IDY0KQorICAgICAgICByZXR1cm4gMHhmZjAwOworCisgICAgc2l6ZV90IHJlc3VsdCA9IDE7Cisg
ICAgd2hpbGUgKGxvZzJuLS0pCisgICAgICAgIHJlc3VsdCA8PD0gMTsKKyAgICAKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB3cml0ZURhdGEodm9pZCogc3RhcnQsIHNpemVf
dCBzaXplKQoreworICAgIGNoYXIqIHdyaXRlUHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4o
c3RhcnQpOworCisgICAgZm9yIChzaXplX3Qgc2l6ZUxlZnQgPSBzaXplOyAhIXNpemVMZWZ0OyAp
IHsKKyAgICAgICAgc2l6ZV90IHNpemVUaGlzSXRlciA9IHN0ZDo6bWluKHNpemVMZWZ0LCA0MDk2
dWwpOworICAgICAgICAKKyAgICAgICAgd3JpdGVQdHJbMF0gPSByYW5kb20oKSAmIDB4ZmY7Cisg
ICAgICAgIHdyaXRlUHRyWzFdID0gcmFuZG9tKCkgJiAweGZmOworICAgICAgICB3cml0ZVB0clsy
XSA9IHJhbmRvbSgpICYgMHhmZjsKKyAgICAgICAgd3JpdGVQdHJbM10gPSByYW5kb20oKSAmIDB4
ZmY7CisKKyAgICAgICAgd3JpdGVQdHIgKz0gc2l6ZVRoaXNJdGVyOworICAgICAgICBzaXplTGVm
dCAtPSBzaXplVGhpc0l0ZXI7CisgICAgfQorfQorCit2b2lkIEludGVycHJldGVyOjpkb01hbGxv
Y09wKE9wIG9wLCBUaHJlYWRJZCB0aHJlYWRJZCkKK3sKKyAgICBzd2l0Y2ggKG9wLm9wY29kZSkg
eworICAgICAgICBjYXNlIG9wX21hbGxvYzogeworICAgICAgICAgICAgbV9vYmplY3RzW29wLnNs
b3RdID0geyBtYm1hbGxvYyhvcC5zaXplKSwgb3Auc2l6ZSB9OworICAgICAgICAgICAgYXNzZXJ0
KG1fb2JqZWN0c1tvcC5zbG90XS5vYmplY3QpOworICAgICAgICAgICAgd3JpdGVEYXRhKG1fb2Jq
ZWN0c1tvcC5zbG90XS5vYmplY3QsIG9wLnNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBvcF9mcmVlOiB7CisgICAgICAgICAgICBpZiAoIW1fb2JqZWN0
c1tvcC5zbG90XS5vYmplY3QpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
bWJmcmVlKG1fb2JqZWN0c1tvcC5zbG90XS5vYmplY3QsIG1fb2JqZWN0c1tvcC5zbG90XS5zaXpl
KTsKKyAgICAgICAgICAgIG1fb2JqZWN0c1tvcC5zbG90XSA9IHsgMCwgMCB9OworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBvcF9yZWFsbG9jOiB7CisgICAgICAg
ICAgICBpZiAoIW1fb2JqZWN0c1tvcC5zbG90XS5vYmplY3QpCisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgbV9vYmplY3RzW29wLnNsb3RdID0geyBtYnJlYWxsb2MobV9vYmpl
Y3RzW29wLnNsb3RdLm9iamVjdCwgbV9vYmplY3RzW29wLnNsb3RdLnNpemUsIG9wLnNpemUpLCBv
cC5zaXplIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIG9w
X2FsaWduX21hbGxvYzogeworICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IGNvbXB1dGUy
dG9Qb3dlcihvcC5hbGlnbkxvZzIpOworICAgICAgICAgICAgbV9vYmplY3RzW29wLnNsb3RdID0g
eyBtYm1lbWFsaWduKGFsaWdubWVudCwgb3Auc2l6ZSksIG9wLnNpemUgfTsKKyAgICAgICAgICAg
IGFzc2VydChtX29iamVjdHNbb3Auc2xvdF0ub2JqZWN0KTsKKyAgICAgICAgICAgIHdyaXRlRGF0
YShtX29iamVjdHNbb3Auc2xvdF0ub2JqZWN0LCBvcC5zaXplKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGZwcmludGYoc3Rk
ZXJyLCAiYmFkIG9wY29kZTogJWRcbiIsIG9wLm9wY29kZSk7CisgICAgICAgICAgICBhYm9ydCgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ludGVycHJldGVy
OjpUaHJlYWQ6OlRocmVhZChJbnRlcnByZXRlciogbXlJbnRlcnByZXRlciwgVGhyZWFkSWQgdGhy
ZWFkSWQpCisgICAgOiBtX3RocmVhZElkKHRocmVhZElkKQorICAgICwgbV9teUludGVycHJldGVy
KG15SW50ZXJwcmV0ZXIpCit7CisgICAgbV90aHJlYWQgPSBzdGQ6OnRocmVhZCgmVGhyZWFkOjpy
dW5UaHJlYWQsIHRoaXMpOworfQorCit2b2lkIEludGVycHJldGVyOjpUaHJlYWQ6OnN0b3AoKQor
eworICAgIG1fbXlJbnRlcnByZXRlci0+c3dpdGNoVG9UaHJlYWQobV90aHJlYWRJZCk7Cit9CisK
K0ludGVycHJldGVyOjpUaHJlYWQ6On5UaHJlYWQoKQoreworICAgIHN3aXRjaFRvKCk7CisgICAg
bV90aHJlYWQuam9pbigpOworfQorCit2b2lkIEludGVycHJldGVyOjpUaHJlYWQ6OnJ1blRocmVh
ZCgpCit7CisgICAgd2FpdFRvUnVuKCk7CisgICAgbV9teUludGVycHJldGVyLT5kb09uU2FtZVRo
cmVhZChtX3RocmVhZElkKTsKK30KKwordm9pZCBJbnRlcnByZXRlcjo6VGhyZWFkOjp3YWl0VG9S
dW4oKQoreworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtX215SW50ZXJw
cmV0ZXItPm1fdGhyZWFkTXV0ZXgpOworICAgIG1fc2hvdWxkUnVuLndhaXQobG9jaywgW3RoaXNd
KCl7cmV0dXJuIG1fbXlJbnRlcnByZXRlci0+bV9jdXJyZW50VGhyZWFkSWQgPT0gbV90aHJlYWRJ
ZDsgfSk7Cit9CisKK3ZvaWQgSW50ZXJwcmV0ZXI6OlRocmVhZDo6c3dpdGNoVG8oKQoreworICAg
IHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtX215SW50ZXJwcmV0ZXItPm1fdGhy
ZWFkTXV0ZXgpOworICAgIG1fbXlJbnRlcnByZXRlci0+bV9jdXJyZW50VGhyZWFkSWQgPSBtX3Ro
cmVhZElkOworICAgIG1fc2hvdWxkUnVuLm5vdGlmeV9vbmUoKTsKK30KXCBObyBuZXdsaW5lIGF0
IGVuZCBvZiBmaWxlCkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0Jl
bmNoL0ludGVycHJldGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NC
ZW5jaC9NYWxsb2NCZW5jaC9JbnRlcnByZXRlci5oCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJm
b3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL0ludGVycHJldGVyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTI2LDIzICsyNiw2NSBAQAogI2lmbmRlZiBJbnRlcnByZXRlcl9oCiAjZGVm
aW5lIEludGVycHJldGVyX2gKIAorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNs
dWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiBjbGFz
cyBJbnRlcnByZXRlciB7CiBwdWJsaWM6Ci0gICAgSW50ZXJwcmV0ZXIoY29uc3QgY2hhciogZmls
ZU5hbWUsIGJvb2wgc2hvdWxkRnJlZUFsbE9iamVjdHMgPSB0cnVlKTsKKyAgICBJbnRlcnByZXRl
cihjb25zdCBjaGFyKiBmaWxlTmFtZSwgYm9vbCBzaG91bGRGcmVlQWxsT2JqZWN0cyA9IHRydWUs
IGJvb2wgdXNlVGhyZWFkSWQgPSBmYWxzZSk7CiAgICAgfkludGVycHJldGVyKCk7CiAKICAgICB2
b2lkIHJ1bigpOworICAgIHZvaWQgZGV0YWlsZWRSZXBvcnQoKTsKIAogcHJpdmF0ZToKLSAgICBl
bnVtIE9wY29kZSB7IG9wX21hbGxvYywgb3BfZnJlZSwgb3BfcmVhbGxvYyB9OwotICAgIHN0cnVj
dCBPcCB7IE9wY29kZSBvcGNvZGU7IHNpemVfdCBzbG90OyBzaXplX3Qgc2l6ZTsgfTsKKyAgICB0
eXBlZGVmIHVuc2lnbmVkIHNob3J0IFRocmVhZElkOyAvLyAwIGlzIHRoZSBtYWluIHRocmVhZAor
ICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgTG9nMkFsaWdubWVudDsgLy8gbG9nMihhbGlnbm1l
bnQpIG9yIH4wIGZvciBub24gcG93ZXIgb2YgMi4KKyAgICBlbnVtIE9wY29kZSB7IG9wX21hbGxv
Yywgb3BfZnJlZSwgb3BfcmVhbGxvYywgb3BfYWxpZ25fbWFsbG9jIH07CisgICAgc3RydWN0IE9w
IHsgT3Bjb2RlIG9wY29kZTsgVGhyZWFkSWQgdGhyZWFkSWQ7IExvZzJBbGlnbm1lbnQgYWxpZ25M
b2cyOyBzaXplX3Qgc2xvdDsgc2l6ZV90IHNpemU7IH07CiAgICAgc3RydWN0IFJlY29yZCB7IHZv
aWQqIG9iamVjdDsgc2l6ZV90IHNpemU7IH07CiAKKyAgICBjbGFzcyBUaHJlYWQKKyAgICB7Cisg
ICAgcHVibGljOgorICAgICAgICBUaHJlYWQoSW50ZXJwcmV0ZXIqLCBUaHJlYWRJZCk7CisgICAg
ICAgIH5UaHJlYWQoKTsKKworICAgICAgICB2b2lkIHJ1blRocmVhZCgpOworCisgICAgICAgIHZv
aWQgd2FpdFRvUnVuKCk7CisgICAgICAgIHZvaWQgc3dpdGNoVG8oKTsKKyAgICAgICAgdm9pZCBz
dG9wKCk7CisgICAgICAgIAorICAgICAgICBib29sIGlzTWFpblRocmVhZCgpIHsgcmV0dXJuIG1f
dGhyZWFkSWQgPT0gMDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVGhyZWFkSWQgbV90aHJl
YWRJZDsKKyAgICAgICAgSW50ZXJwcmV0ZXIqIG1fbXlJbnRlcnByZXRlcjsKKyAgICAgICAgc3Rk
Ojpjb25kaXRpb25fdmFyaWFibGUgbV9zaG91bGRSdW47CisgICAgICAgIHN0ZDo6dGhyZWFkIG1f
dGhyZWFkOworICAgIH07CisKKyAgICBib29sIHJlYWRPcHMoKTsKKyAgICB2b2lkIGRvT25TYW1l
VGhyZWFkKFRocmVhZElkKTsKKyAgICB2b2lkIHN3aXRjaFRvVGhyZWFkKFRocmVhZElkKTsKKwor
ICAgIHZvaWQgZG9NYWxsb2NPcChPcCwgVGhyZWFkSWQpOworICAgIAogICAgIGJvb2wgbV9zaG91
bGRGcmVlQWxsT2JqZWN0czsKKyAgICBib29sIG1fdXNlVGhyZWFkSWQ7CiAgICAgaW50IG1fZmQ7
CiAgICAgc2l6ZV90IG1fb3BDb3VudDsKKyAgICBzaXplX3QgbV9yZW1haW5pbmc7CisgICAgc2l6
ZV90IG1fb3BzQ3Vyc29yOworICAgIHNpemVfdCBtX29wc0luQnVmZmVyOworICAgIFRocmVhZElk
IG1fY3VycmVudFRocmVhZElkOworICAgIHN0ZDo6dmVjdG9yPE9wPiBtX29wczsKKyAgICBzdGQ6
Om11dGV4IG1fdGhyZWFkTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbV9zaG91
bGRSdW47CisgICAgc3RkOjp2ZWN0b3I8VGhyZWFkKj4gbV90aHJlYWRzOwogICAgIHN0ZDo6dmVj
dG9yPFJlY29yZD4gbV9vYmplY3RzOwogfTsKIApJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxs
b2NCZW5jaC9NYWxsb2NCZW5jaC9hbGxvY19mcmVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3Jt
YW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2FsbG9jX2ZyZWUuY3BwCShyZXZpc2lv
biAwKQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9hbGxvY19m
cmVlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJhbGxvY19mcmVlLmgiCisK
KyNpbmNsdWRlICJtYm1hbGxvYy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIGJlbmNo
bWFya19hbGxvY19mcmVlKENvbW1hbmRMaW5lJikKK3sKKyAgICBzaXplX3QgbG9vcHMgPSAxMDAw
MDAwOworCisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IDEwMzA7CisgICAgCisgICAgY2hhciogZHVt
bXkxID0gKGNoYXIqKW1ibWFsbG9jKGFsbG9jU2l6ZSk7CisgICAgY2hhciogZHVtbXkyID0gKGNo
YXIqKW1ibWFsbG9jKGFsbG9jU2l6ZSk7CisgICAgZHVtbXkyWzBdID0gJ2EnOworICAgIG1iZnJl
ZShkdW1teTEsIGFsbG9jU2l6ZSk7CisKKyAgICB3aGlsZSAoLS1sb29wcykgeworICAgICAgICBj
aGFyKiBvYmplY3QgPSAoY2hhciopbWJtYWxsb2MoYWxsb2NTaXplKTsKKworICAgICAgICBtZW1z
ZXQob2JqZWN0LCAnYScsIGFsbG9jU2l6ZSk7CisKKyAgICAgICAgbWJmcmVlKG9iamVjdCwgYWxs
b2NTaXplKTsKKyAgICB9Cit9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01h
bGxvY0JlbmNoL2FsbG9jX2ZyZWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01h
bGxvY0JlbmNoL01hbGxvY0JlbmNoL2FsbG9jX2ZyZWUuaAkocmV2aXNpb24gMCkKKysrIFBlcmZv
cm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvYWxsb2NfZnJlZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmbmRlZiBhbGxvY19mcmVlX2gKKyNkZWZpbmUgYWxsb2NfZnJlZV9o
CisKKyNpbmNsdWRlICJDb21tYW5kTGluZS5oIgorCit2b2lkIGJlbmNobWFya19hbGxvY19mcmVl
KENvbW1hbmRMaW5lJik7CisKKyNlbmRpZiAvLyBhbGxvY19mcmVlX2gKKwpJbmRleDogUGVyZm9y
bWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9iYWxsb29uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2JhbGxvb24uY3Bw
CShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxv
Y0JlbmNoL2JhbGxvb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3ICszMyw3IEBACiAKICNp
bmNsdWRlICJtYm1hbGxvYy5oIgogCi12b2lkIGJlbmNobWFya19iYWxsb29uKGJvb2wgaXNQYXJh
bGxlbCkKK3ZvaWQgYmVuY2htYXJrX2JhbGxvb24oQ29tbWFuZExpbmUmKQogewogICAgIGNvbnN0
IHNpemVfdCBjaHVua1NpemUgPSAxICogMTAyNDsKICAgICBjb25zdCBzaXplX3QgYmFsbG9vblNp
emUgPSAxMDAgKiAxMDI0ICogMTAyNDsKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVu
Y2gvTWFsbG9jQmVuY2gvYmFsbG9vbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMv
TWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvYmFsbG9vbi5oCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQ
ZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2JhbGxvb24uaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjYsNyArMjYsOSBAQAogI2lmbmRlZiBiYWxsb29uX2gKICNkZWZpbmUgYmFs
bG9vbl9oCiAKLXZvaWQgYmVuY2htYXJrX2JhbGxvb24oYm9vbCBpc1BhcmFsbGVsKTsKKyNpbmNs
dWRlICJDb21tYW5kTGluZS5oIgorCit2b2lkIGJlbmNobWFya19iYWxsb29uKENvbW1hbmRMaW5l
Jik7CiAKICNlbmRpZiAvLyBiYWxsb29uX2gKIApJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxs
b2NCZW5jaC9NYWxsb2NCZW5jaC9iaWcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVz
dHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvYmlnLmNwcAkocmV2aXNpb24gMTk2ODQ2KQorKysg
UGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9iaWcuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zOSwxNCArMzksMTQgQEAgc3RydWN0IE9iamVjdCB7CiAgICAgc2l6ZV90IHNp
emU7CiB9OwogCi12b2lkIGJlbmNobWFya19iaWcoYm9vbCBpc1BhcmFsbGVsKQordm9pZCBiZW5j
aG1hcmtfYmlnKENvbW1hbmRMaW5lJiBjb21tYW5kTGluZSkKIHsKICAgICBzaXplX3QgdGltZXMg
PSAxOwogCiAgICAgc2l6ZV90IHZtU2l6ZSA9IDF1bCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKICAg
ICBzaXplX3Qgb2JqZWN0U2l6ZU1pbiA9IDQgKiAxMDI0OwogICAgIHNpemVfdCBvYmplY3RTaXpl
TWF4ID0gNjQgKiAxMDI0OwotICAgIGlmIChpc1BhcmFsbGVsKQorICAgIGlmIChjb21tYW5kTGlu
ZS5pc1BhcmFsbGVsKCkpCiAgICAgICAgIHZtU2l6ZSAvPSBjcHVDb3VudCgpOwogCiAgICAgc2l6
ZV90IG9iamVjdENvdW50ID0gdm1TaXplIC8gb2JqZWN0U2l6ZU1pbjsKSW5kZXg6IFBlcmZvcm1h
bmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvYmlnLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVy
Zm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9iaWcuaAkocmV2aXNpb24gMTk2
ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9iaWcuaAko
d29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsOSBAQAogI2lmbmRlZiBiaWdfaAogI2RlZmluZSBi
aWdfaAogCi12b2lkIGJlbmNobWFya19iaWcoYm9vbCBpc1BhcmFsbGVsKTsKKyNpbmNsdWRlICJD
b21tYW5kTGluZS5oIgorCit2b2lkIGJlbmNobWFya19iaWcoQ29tbWFuZExpbmUmKTsKIAogI2Vu
ZGlmIC8vIGJpZ19oCiAKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9j
QmVuY2gvY2h1cm4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVu
Y2gvTWFsbG9jQmVuY2gvY2h1cm4uY3BwCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJmb3JtYW5j
ZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2NodXJuLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMzksMTAgKzM5LDEwIEBAIHN0cnVjdCBIZWFwRG91YmxlIHsKICAgICBkb3VibGUgdmFsdWU7
CiB9OwogCi12b2lkIGJlbmNobWFya19jaHVybihib29sIGlzUGFyYWxsZWwpCit2b2lkIGJlbmNo
bWFya19jaHVybihDb21tYW5kTGluZSYgY29tbWFuZExpbmUpCiB7CiAgICAgc2l6ZV90IHRpbWVz
ID0gNzAwMDAwMDsKLSAgICBpZiAoaXNQYXJhbGxlbCkKKyAgICBpZiAoY29tbWFuZExpbmUuaXNQ
YXJhbGxlbCgpKQogICAgICAgICB0aW1lcyAvPSBjcHVDb3VudCgpOwogCiAgICAgYXV0byB0b3Rh
bCA9IHN0ZDo6dW5pcXVlX3B0cjxIZWFwRG91YmxlPihuZXcgSGVhcERvdWJsZSgwLjApKTsKSW5k
ZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvY2h1cm4uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2NodXJu
LmgJKHJldmlzaW9uIDE5Njg0NikKKysrIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFs
bG9jQmVuY2gvY2h1cm4uaAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsOSBAQAogI2lmbmRl
ZiBjaHVybl9oCiAjZGVmaW5lIGNodXJuX2gKIAotdm9pZCBiZW5jaG1hcmtfY2h1cm4oYm9vbCBp
c1BhcmFsbGVsKTsKKyNpbmNsdWRlICJDb21tYW5kTGluZS5oIgorCit2b2lkIGJlbmNobWFya19j
aHVybihDb21tYW5kTGluZSYpOwogCiAjZW5kaWYgLy8gY2h1cm5faAogCkluZGV4OiBQZXJmb3Jt
YW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2ZhY2Vib29rLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2ZhY2Vib29rLmNw
cAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxs
b2NCZW5jaC9mYWNlYm9vay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDExICs0MiwxNCBAQAog
CiAjaW5jbHVkZSAibWJtYWxsb2MuaCIKIAotdm9pZCBiZW5jaG1hcmtfZmFjZWJvb2soYm9vbCBp
c1BhcmFsbGVsKQordm9pZCBiZW5jaG1hcmtfZmFjZWJvb2soQ29tbWFuZExpbmUmIGNvbW1hbmRM
aW5lKQogewogICAgIHNpemVfdCB0aW1lcyA9IDE7CiAKICAgICBJbnRlcnByZXRlciBpbnRlcnBy
ZXRlcigiZmFjZWJvb2sub3BzIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aW1lczsg
KytpKQogICAgICAgICBpbnRlcnByZXRlci5ydW4oKTsKKworICAgIGlmIChjb21tYW5kTGluZS5k
ZXRhaWxlZFJlcG9ydCgpKQorICAgICAgICBpbnRlcnByZXRlci5kZXRhaWxlZFJlcG9ydCgpOwog
fQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9mYWNlYm9v
ay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVu
Y2gvZmFjZWJvb2suaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxs
b2NCZW5jaC9NYWxsb2NCZW5jaC9mYWNlYm9vay5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsy
Niw5IEBACiAjaWZuZGVmIGZhY2Vib29rX2gKICNkZWZpbmUgZmFjZWJvb2tfaAogCi12b2lkIGJl
bmNobWFya19mYWNlYm9vayhib29sIGlzUGFyYWxsZWwpOworI2luY2x1ZGUgIkNvbW1hbmRMaW5l
LmgiCisKK3ZvaWQgYmVuY2htYXJrX2ZhY2Vib29rKENvbW1hbmRMaW5lJik7CiAKICNlbmRpZiAv
LyBmYWNlYm9va19oCiAKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9j
QmVuY2gvZmxpY2tyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0Jl
bmNoL01hbGxvY0JlbmNoL2ZsaWNrci5jcHAJKHJldmlzaW9uIDE5Njg0NikKKysrIFBlcmZvcm1h
bmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvZmxpY2tyLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDIsMTYgKzQyLDE5IEBACiAKICNpbmNsdWRlICJtYm1hbGxvYy5oIgogCi12b2lkIGJl
bmNobWFya19mbGlja3IoYm9vbCBpc1BhcmFsbGVsKQordm9pZCBiZW5jaG1hcmtfZmxpY2tyKENv
bW1hbmRMaW5lJiBjb21tYW5kTGluZSkKIHsKICAgICBzaXplX3QgdGltZXMgPSAzOwogCiAgICAg
SW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIoImZsaWNrci5vcHMiKTsKICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRpbWVzOyArK2kpCiAgICAgICAgIGludGVycHJldGVyLnJ1bigpOworCisgICAg
aWYgKGNvbW1hbmRMaW5lLmRldGFpbGVkUmVwb3J0KCkpCisgICAgICAgIGludGVycHJldGVyLmRl
dGFpbGVkUmVwb3J0KCk7CiB9CiAKLXZvaWQgYmVuY2htYXJrX2ZsaWNrcl9tZW1vcnlfd2Fybmlu
Zyhib29sIGlzUGFyYWxsZWwpCit2b2lkIGJlbmNobWFya19mbGlja3JfbWVtb3J5X3dhcm5pbmco
Q29tbWFuZExpbmUmIGNvbW1hbmRMaW5lKQogewogICAgIHNpemVfdCB0aW1lcyA9IDE7CiAKQEAg
LTU5LDQgKzYyLDcgQEAgdm9pZCBiZW5jaG1hcmtfZmxpY2tyX21lbW9yeV93YXJuaW5nKGJvbwog
ICAgIEludGVycHJldGVyIGludGVycHJldGVyKCJmbGlja3JfbWVtb3J5X3dhcm5pbmcub3BzIiwg
c2hvdWxkRnJlZUFsbE9iamVjdHMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGltZXM7
ICsraSkKICAgICAgICAgaW50ZXJwcmV0ZXIucnVuKCk7CisKKyAgICBpZiAoY29tbWFuZExpbmUu
ZGV0YWlsZWRSZXBvcnQoKSkKKyAgICAgICAgaW50ZXJwcmV0ZXIuZGV0YWlsZWRSZXBvcnQoKTsK
IH0KSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvZmxpY2ty
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5j
aC9mbGlja3IuaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NC
ZW5jaC9NYWxsb2NCZW5jaC9mbGlja3IuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsOSBA
QAogI2lmbmRlZiBmbGlja3JfaAogI2RlZmluZSBmbGlja3JfaAogCi12b2lkIGJlbmNobWFya19m
bGlja3IoYm9vbCBpc1BhcmFsbGVsKTsKLXZvaWQgYmVuY2htYXJrX2ZsaWNrcl9tZW1vcnlfd2Fy
bmluZyhib29sIGlzUGFyYWxsZWwpOworI2luY2x1ZGUgIkNvbW1hbmRMaW5lLmgiCisKK3ZvaWQg
YmVuY2htYXJrX2ZsaWNrcihDb21tYW5kTGluZSYpOwordm9pZCBiZW5jaG1hcmtfZmxpY2tyX21l
bW9yeV93YXJuaW5nKENvbW1hbmRMaW5lJik7CiAKICNlbmRpZiAvLyBmbGlja3JfaApJbmRleDog
UGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9mcmFnbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9mcmFn
bWVudC5jcHAJKHJldmlzaW9uIDE5Njg0NikKKysrIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVu
Y2gvTWFsbG9jQmVuY2gvZnJhZ21lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03OSwxMCArNzks
MTAgQEAgdm9pZCB2YWxpZGF0ZShOb2RlKiBoZWFkKQogICAgICAgICBub2RlLT52YWxpZGF0ZSgp
OwogfQogCi12b2lkIGJlbmNobWFya19mcmFnbWVudChib29sIGlzUGFyYWxsZWwpCit2b2lkIGJl
bmNobWFya19mcmFnbWVudChDb21tYW5kTGluZSYgY29tbWFuZExpbmUpCiB7CiAgICAgc2l6ZV90
IG5vZGVDb3VudCA9IDEyOCAqIDEwMjQ7Ci0gICAgaWYgKGlzUGFyYWxsZWwpCisgICAgaWYgKGNv
bW1hbmRMaW5lLmlzUGFyYWxsZWwoKSkKICAgICAgICAgbm9kZUNvdW50IC89IGNwdUNvdW50KCk7
CiAgICAgc2l6ZV90IHJlcGxhY2VDb3VudCA9IG5vZGVDb3VudCAvIDQ7CiAgICAgc2l6ZV90IHRp
bWVzID0gMjU7CkBAIC0xMDcsMTEgKzEwNywxMSBAQCB2b2lkIGJlbmNobWFya19mcmFnbWVudChi
b29sIGlzUGFyYWxsZWwpCiAgICAgfQogfQogCi12b2lkIGJlbmNobWFya19mcmFnbWVudF9pdGVy
YXRlKGJvb2wgaXNQYXJhbGxlbCkKK3ZvaWQgYmVuY2htYXJrX2ZyYWdtZW50X2l0ZXJhdGUoQ29t
bWFuZExpbmUmIGNvbW1hbmRMaW5lKQogewogICAgIHNpemVfdCBub2RlQ291bnQgPSA1MTIgKiAx
MDI0OwogICAgIHNpemVfdCB0aW1lcyA9IDIwOwotICAgIGlmIChpc1BhcmFsbGVsKQorICAgIGlm
IChjb21tYW5kTGluZS5pc1BhcmFsbGVsKCkpCiAgICAgICAgIG5vZGVDb3VudCAvPSBjcHVDb3Vu
dCgpOwogICAgIHNpemVfdCByZXBsYWNlQ291bnQgPSBub2RlQ291bnQgLyA0OwogCkluZGV4OiBQ
ZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL2ZyYWdtZW50LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9mcmFnbWVu
dC5oCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01h
bGxvY0JlbmNoL2ZyYWdtZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDkgQEAKICNp
Zm5kZWYgZnJhZ21lbnRfaAogI2RlZmluZSBmcmFnbWVudF9oCiAKLXZvaWQgYmVuY2htYXJrX2Zy
YWdtZW50KGJvb2wgaXNQYXJhbGxlbCk7Ci12b2lkIGJlbmNobWFya19mcmFnbWVudF9pdGVyYXRl
KGJvb2wgaXNQYXJhbGxlbCk7CisjaW5jbHVkZSAiQ29tbWFuZExpbmUuaCIKKwordm9pZCBiZW5j
aG1hcmtfZnJhZ21lbnQoQ29tbWFuZExpbmUmKTsKK3ZvaWQgYmVuY2htYXJrX2ZyYWdtZW50X2l0
ZXJhdGUoQ29tbWFuZExpbmUmKTsKIAogI2VuZGlmIC8vIGZyYWdtZW50X2gKSW5kZXg6IFBlcmZv
cm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbGlzdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9saXN0LmNwcAkocmV2
aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5j
aC9saXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTYsMTIgKzk2LDEyIEBAIHN0cnVjdCBOb2Rl
IHsKIAogfSAvLyBuYW1lc3BhY2UKIAotdm9pZCBiZW5jaG1hcmtfbGlzdF9hbGxvY2F0ZShib29s
IGlzUGFyYWxsZWwpCit2b2lkIGJlbmNobWFya19saXN0X2FsbG9jYXRlKENvbW1hbmRMaW5lJiBj
b21tYW5kTGluZSkKIHsKICAgICBOb2RlKiBoZWFkID0gMDsKICAgICBzaXplX3QgdGltZXMgPSA3
MDsKICAgICBzaXplX3Qgbm9kZXMgPSAzMiAqIDEwMjQ7Ci0gICAgaWYgKGlzUGFyYWxsZWwpIHsK
KyAgICBpZiAoY29tbWFuZExpbmUuaXNQYXJhbGxlbCgpKSB7CiAgICAgICAgIG5vZGVzIC89IGNw
dUNvdW50KCk7CiAgICAgICAgIHRpbWVzICo9IDI7CiAgICAgfQpAQCAtMTI0LDEyICsxMjQsMTIg
QEAgdm9pZCBiZW5jaG1hcmtfbGlzdF9hbGxvY2F0ZShib29sIGlzUGFyYQogICAgIH0KIH0KIAot
dm9pZCBiZW5jaG1hcmtfbGlzdF90cmF2ZXJzZShib29sIGlzUGFyYWxsZWwpCit2b2lkIGJlbmNo
bWFya19saXN0X3RyYXZlcnNlKENvbW1hbmRMaW5lJiBjb21tYW5kTGluZSkKIHsKICAgICBOb2Rl
KiBoZWFkID0gMDsKICAgICBzaXplX3QgdGltZXMgPSAxICogMTAyNDsKICAgICBzaXplX3Qgbm9k
ZXMgPSAzMiAqIDEwMjQ7Ci0gICAgaWYgKGlzUGFyYWxsZWwpIHsKKyAgICBpZiAoY29tbWFuZExp
bmUuaXNQYXJhbGxlbCgpKSB7CiAgICAgICAgIG5vZGVzIC89IGNwdUNvdW50KCk7CiAgICAgICAg
IHRpbWVzICo9IDQ7CiAgICAgfQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9N
YWxsb2NCZW5jaC9saXN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NC
ZW5jaC9NYWxsb2NCZW5jaC9saXN0LmgJKHJldmlzaW9uIDE5Njg0NikKKysrIFBlcmZvcm1hbmNl
VGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbGlzdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
Niw3ICsyNiw5IEBACiAjaWZuZGVmIGxpc3RfaAogI2RlZmluZSBsaXN0X2gKIAotdm9pZCBiZW5j
aG1hcmtfbGlzdF9hbGxvY2F0ZShib29sIGlzUGFyYWxsZWwpOwotdm9pZCBiZW5jaG1hcmtfbGlz
dF90cmF2ZXJzZShib29sIGlzUGFyYWxsZWwpOworI2luY2x1ZGUgIkNvbW1hbmRMaW5lLmgiCisK
K3ZvaWQgYmVuY2htYXJrX2xpc3RfYWxsb2NhdGUoQ29tbWFuZExpbmUmKTsKK3ZvaWQgYmVuY2ht
YXJrX2xpc3RfdHJhdmVyc2UoQ29tbWFuZExpbmUmKTsKIAogI2VuZGlmIC8vIGxpc3RfaApJbmRl
eDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9tYWluLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL21haW4u
Y3BwCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01h
bGxvY0JlbmNoL21haW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBAIGludCBt
YWluKGludCBhcmdjLCBjaGFyKiogYXJndikKICAgICAgICAgZXhpdCgxKTsKICAgICB9CiAKLSAg
ICBCZW5jaG1hcmsgYmVuY2htYXJrKGNvbW1hbmRMaW5lLmJlbmNobWFya05hbWUoKSwgY29tbWFu
ZExpbmUuaXNQYXJhbGxlbCgpLCBjb21tYW5kTGluZS5ydW5zKCksIGNvbW1hbmRMaW5lLmhlYXBT
aXplKCkpOworICAgIEJlbmNobWFyayBiZW5jaG1hcmsoY29tbWFuZExpbmUpOwogICAgIGlmICgh
YmVuY2htYXJrLmlzVmFsaWQoKSkgewogICAgICAgICBjb3V0IDw8ICJJbnZhbGlkIGJlbmNobWFy
azogIiA8PCBjb21tYW5kTGluZS5iZW5jaG1hcmtOYW1lKCkgPDwgZW5kbCA8PCBlbmRsOwogICAg
ICAgICBiZW5jaG1hcmsucHJpbnRCZW5jaG1hcmtzKCk7CkBAIC00OCw2ICs0OCw3IEBAIGludCBt
YWluKGludCBhcmdjLCBjaGFyKiogYXJndikKICAgICB9CiAKICAgICBzdHJpbmcgcGFyYWxsZWwg
PSBjb21tYW5kTGluZS5pc1BhcmFsbGVsKCkgPyBzdHJpbmcoIiBbIHBhcmFsbGVsIF0iKSA6IHN0
cmluZygiIFsgbm90IHBhcmFsbGVsIF0iKTsKKyAgICBzdHJpbmcgdGhyZWFkZWQgPSBjb21tYW5k
TGluZS51c2VUaHJlYWRJRCgpID8gc3RyaW5nKCIgWyB1c2UtdGhyZWFkLWlkIF0iKSA6IHN0cmlu
ZygiIFsgZG9uJ3QgdXNlLXRocmVhZC1pZCBdIik7CiAKICAgICBzdHJpbmdzdHJlYW0gcnVuczsK
ICAgICBydW5zIDw8ICIgWyBydW5zOiAiIDw8IGNvbW1hbmRMaW5lLnJ1bnMoKSA8PCAiIF0iOwpA
QCAtNTgsNyArNTksNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiAgICAgZWxz
ZQogICAgICAgICBoZWFwU2l6ZSA8PCAiIFsgaGVhcDogME1CIF0iOwogCi0gICAgY291dCA8PCAi
UnVubmluZyAiIDw8IGNvbW1hbmRMaW5lLmJlbmNobWFya05hbWUoKSA8PCBwYXJhbGxlbCA8PCBo
ZWFwU2l6ZS5zdHIoKSA8PCBydW5zLnN0cigpIDw8ICIuLi4iIDw8IGVuZGw7CisgICAgY291dCA8
PCAiUnVubmluZyAiIDw8IGNvbW1hbmRMaW5lLmJlbmNobWFya05hbWUoKSA8PCBwYXJhbGxlbCA8
PCB0aHJlYWRlZCA8PCBoZWFwU2l6ZS5zdHIoKSA8PCBydW5zLnN0cigpIDw8ICIuLi4iIDw8IGVu
ZGw7CiAgICAgYmVuY2htYXJrLnJ1bigpOwogICAgIGJlbmNobWFyay5wcmludFJlcG9ydCgpOwog
ICAgICAgICAKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gv
bWVkaXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01h
bGxvY0JlbmNoL21lZGl1bS5jcHAJKHJldmlzaW9uIDE5Njg0NikKKysrIFBlcmZvcm1hbmNlVGVz
dHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbWVkaXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MzksMTQgKzM5LDE0IEBAIHN0cnVjdCBPYmplY3QgewogICAgIHNpemVfdCBzaXplOwogfTsKIAot
dm9pZCBiZW5jaG1hcmtfbWVkaXVtKGJvb2wgaXNQYXJhbGxlbCkKK3ZvaWQgYmVuY2htYXJrX21l
ZGl1bShDb21tYW5kTGluZSYgY29tbWFuZExpbmUpCiB7CiAgICAgc2l6ZV90IHRpbWVzID0gMTsK
IAogICAgIHNpemVfdCB2bVNpemUgPSAxdWwgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CiAgICAgc2l6
ZV90IG9iamVjdFNpemVNaW4gPSAyICogMTAyNDsKICAgICBzaXplX3Qgb2JqZWN0U2l6ZU1heCA9
IDggKiAxMDI0OwotICAgIGlmIChpc1BhcmFsbGVsKQorICAgIGlmIChjb21tYW5kTGluZS5pc1Bh
cmFsbGVsKCkpCiAgICAgICAgIHZtU2l6ZSAvPSBjcHVDb3VudCgpOwogCiAgICAgc2l6ZV90IG9i
amVjdENvdW50ID0gdm1TaXplIC8gb2JqZWN0U2l6ZU1pbjsKSW5kZXg6IFBlcmZvcm1hbmNlVGVz
dHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbWVkaXVtLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9y
bWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9tZWRpdW0uaAkocmV2aXNpb24gMTk2
ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9tZWRpdW0u
aAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsOSBAQAogI2lmbmRlZiBtZWRpdW1faAogI2Rl
ZmluZSBtZWRpdW1faAogCi12b2lkIGJlbmNobWFya19tZWRpdW0oYm9vbCBpc1BhcmFsbGVsKTsK
KyNpbmNsdWRlICJDb21tYW5kTGluZS5oIgorCit2b2lkIGJlbmNobWFya19tZWRpdW0oQ29tbWFu
ZExpbmUmKTsKIAogI2VuZGlmIC8vIG1lZGl1bV9oCiAKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMv
TWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbWVtYWxpZ24uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZv
cm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbWVtYWxpZ24uY3BwCShyZXZpc2lv
biAxOTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL21l
bWFsaWduLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIm1l
bWFsaWduLmgiCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1
ZGUgIkNvbW1hbmRMaW5lLmgiCiAKICNpbmNsdWRlICJtYm1hbGxvYy5oIgogCkBAIC00MCw3ICs0
MSw3IEBAIHZvaWQgdGVzdChzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSkKICAgICBtYmZy
ZWUocmVzdWx0LCBzaXplKTsKIH0KIAotdm9pZCBiZW5jaG1hcmtfbWVtYWxpZ24oYm9vbCBpc1Bh
cmFsbGVsKQordm9pZCBiZW5jaG1hcmtfbWVtYWxpZ24oQ29tbWFuZExpbmUmKQogewogICAgIGZv
ciAoc2l6ZV90IGFsaWdubWVudCA9IDI7IGFsaWdubWVudCA8IDQwOTY7IGFsaWdubWVudCAqPSAy
KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgPSAwOyBzaXplIDwgNDA5NjsgKytzaXplKQpJ
bmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9tZW1hbGlnbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gv
bWVtYWxpZ24uaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NC
ZW5jaC9NYWxsb2NCZW5jaC9tZW1hbGlnbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw5
IEBACiAjaWZuZGVmIG1lbWFsaWduX2gKICNkZWZpbmUgbWVtYWxpZ25faAogCi12b2lkIGJlbmNo
bWFya19tZW1hbGlnbihib29sIGlzUGFyYWxsZWwpOworI2luY2x1ZGUgIkNvbW1hbmRMaW5lLmgi
CisKK3ZvaWQgYmVuY2htYXJrX21lbWFsaWduKENvbW1hbmRMaW5lJik7CiAKICNlbmRpZiAvLyBt
ZW1hbGlnbl9oCiAKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVu
Y2gvbWVzc2FnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5j
aC9NYWxsb2NCZW5jaC9tZXNzYWdlLmNwcAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFu
Y2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9tZXNzYWdlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTEwLDkgKzExMCw5IEBAIHByaXZhdGU6CiAKIH0gLy8gbmFtZXNwYWNlCiAKLXZvaWQg
YmVuY2htYXJrX21lc3NhZ2Vfb25lKGJvb2wgaXNQYXJhbGxlbCkKK3ZvaWQgYmVuY2htYXJrX21l
c3NhZ2Vfb25lKENvbW1hbmRMaW5lJiBjb21tYW5kTGluZSkKIHsKLSAgICBpZiAoaXNQYXJhbGxl
bCkKKyAgICBpZiAoY29tbWFuZExpbmUuaXNQYXJhbGxlbCgpKQogICAgICAgICBhYm9ydCgpOwog
CiAgICAgY29uc3Qgc2l6ZV90IHRpbWVzID0gMjA0ODsKQEAgLTEzOCw5ICsxMzgsOSBAQCB2b2lk
IGJlbmNobWFya19tZXNzYWdlX29uZShib29sIGlzUGFyYWxsCiAgICAgZGlzcGF0Y2hfcmVsZWFz
ZShxdWV1ZSk7CiB9CiAKLXZvaWQgYmVuY2htYXJrX21lc3NhZ2VfbWFueShib29sIGlzUGFyYWxs
ZWwpCit2b2lkIGJlbmNobWFya19tZXNzYWdlX21hbnkoQ29tbWFuZExpbmUmIGNvbW1hbmRMaW5l
KQogewotICAgIGlmIChpc1BhcmFsbGVsKQorICAgIGlmIChjb21tYW5kTGluZS5pc1BhcmFsbGVs
KCkpCiAgICAgICAgIGFib3J0KCk7CiAKICAgICBjb25zdCBzaXplX3QgdGltZXMgPSA3Njg7Cklu
ZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL21lc3NhZ2UuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL21l
c3NhZ2UuaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5j
aC9NYWxsb2NCZW5jaC9tZXNzYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDkgQEAK
ICNpZm5kZWYgbWVzc2FnZV9oCiAjZGVmaW5lIG1lc3NhZ2VfaAogCi12b2lkIGJlbmNobWFya19t
ZXNzYWdlX29uZShib29sIGlzUGFyYWxsZWwpOwotdm9pZCBiZW5jaG1hcmtfbWVzc2FnZV9tYW55
KGJvb2wgaXNQYXJhbGxlbCk7CisjaW5jbHVkZSAiQ29tbWFuZExpbmUuaCIKKwordm9pZCBiZW5j
aG1hcmtfbWVzc2FnZV9vbmUoQ29tbWFuZExpbmUmKTsKK3ZvaWQgYmVuY2htYXJrX21lc3NhZ2Vf
bWFueShDb21tYW5kTGluZSYpOwogCiAjZW5kaWYgLy8gbWVzc2FnZV9oCkluZGV4OiBQZXJmb3Jt
YW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL25pbWxhbmcuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvbmltbGFuZy5jcHAJ
KHJldmlzaW9uIDApCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNo
L25pbWxhbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgIkNQVUNvdW50Lmgi
CisjaW5jbHVkZSAiSW50ZXJwcmV0ZXIuaCIKKyNpbmNsdWRlICJuaW1sYW5nLmgiCisjaW5jbHVk
ZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2lu
Y2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgor
I2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9z
dGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2lu
Y2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIm1ibWFsbG9j
LmgiCisKK3ZvaWQgYmVuY2htYXJrX25pbWxhbmcoQ29tbWFuZExpbmUmIGNvbW1hbmRMaW5lKQor
eworICAgIHNpemVfdCB0aW1lcyA9IDE7CisKKyAgICBib29sIHNob3VsZEZyZWVBbGxPYmplY3Rz
ID0gZmFsc2U7CisgICAgSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIoIm5pbWxhbmcub3BzIiwgc2hv
dWxkRnJlZUFsbE9iamVjdHMsIGNvbW1hbmRMaW5lLnVzZVRocmVhZElEKCkpOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgdGltZXM7ICsraSkKKyAgICAgICAgaW50ZXJwcmV0ZXIucnVuKCk7
CisKKyAgICAgICAgaWYgKGNvbW1hbmRMaW5lLmRldGFpbGVkUmVwb3J0KCkpCisgICAgICAgICAg
ICBpbnRlcnByZXRlci5kZXRhaWxlZFJlcG9ydCgpOworfQpJbmRleDogUGVyZm9ybWFuY2VUZXN0
cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9uaW1sYW5nLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9y
bWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9uaW1sYW5nLmgJKHJldmlzaW9uIDAp
CisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL25pbWxhbmcuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgbmltbGFuZ19oCisjZGVmaW5lIG5pbWxhbmdf
aAorCisjaW5jbHVkZSAiQ29tbWFuZExpbmUuaCIKKwordm9pZCBiZW5jaG1hcmtfbmltbGFuZyhD
b21tYW5kTGluZSYpOworCisjZW5kaWYgLy8gbmltbGFuZ19oCisKSW5kZXg6IFBlcmZvcm1hbmNl
VGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvcmVhbGxvYy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
UGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9yZWFsbG9jLmNwcAkocmV2
aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5j
aC9yZWFsbG9jLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNiBAQAogCiAjaW5jbHVk
ZSAibWJtYWxsb2MuaCIKIAotdm9pZCBiZW5jaG1hcmtfcmVhbGxvYyhib29sIGlzUGFyYWxsZWwp
Cit2b2lkIGJlbmNobWFya19yZWFsbG9jKENvbW1hbmRMaW5lJikKIHsKIH0KSW5kZXg6IFBlcmZv
cm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvcmVhbGxvYy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvcmVhbGxvYy5oCShy
ZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0Jl
bmNoL3JlYWxsb2MuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsOSBAQAogI2lmbmRlZiBy
ZWFsbG9jX2gKICNkZWZpbmUgcmVhbGxvY19oCiAKLXZvaWQgYmVuY2htYXJrX3JlYWxsb2MoYm9v
bCBpc1BhcmFsbGVsKTsKKyNpbmNsdWRlICJDb21tYW5kTGluZS5oIgorCit2b2lkIGJlbmNobWFy
a19yZWFsbG9jKENvbW1hbmRMaW5lJik7CiAKICNlbmRpZiAvLyByZWFsbG9jX2gKIApJbmRleDog
UGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9yZWRkaXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvcmVkZGl0
LmNwcAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9N
YWxsb2NCZW5jaC9yZWRkaXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MiwxNiArNDIsMTkgQEAK
IAogI2luY2x1ZGUgIm1ibWFsbG9jLmgiCiAKLXZvaWQgYmVuY2htYXJrX3JlZGRpdChib29sIGlz
UGFyYWxsZWwpCit2b2lkIGJlbmNobWFya19yZWRkaXQoQ29tbWFuZExpbmUmIGNvbW1hbmRMaW5l
KQogewogICAgIHNpemVfdCB0aW1lcyA9IDY7CiAKICAgICBJbnRlcnByZXRlciBpbnRlcnByZXRl
cigicmVkZGl0Lm9wcyIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGltZXM7ICsraSkK
ICAgICAgICAgaW50ZXJwcmV0ZXIucnVuKCk7CisKKyAgICBpZiAoY29tbWFuZExpbmUuZGV0YWls
ZWRSZXBvcnQoKSkKKyAgICAgICAgaW50ZXJwcmV0ZXIuZGV0YWlsZWRSZXBvcnQoKTsKIH0KIAot
dm9pZCBiZW5jaG1hcmtfcmVkZGl0X21lbW9yeV93YXJuaW5nKGJvb2wgaXNQYXJhbGxlbCkKK3Zv
aWQgYmVuY2htYXJrX3JlZGRpdF9tZW1vcnlfd2FybmluZyhDb21tYW5kTGluZSYgY29tbWFuZExp
bmUpCiB7CiAgICAgc2l6ZV90IHRpbWVzID0gMTsKIApAQCAtNTksNCArNjIsNyBAQCB2b2lkIGJl
bmNobWFya19yZWRkaXRfbWVtb3J5X3dhcm5pbmcoYm9vCiAgICAgSW50ZXJwcmV0ZXIgaW50ZXJw
cmV0ZXIoInJlZGRpdF9tZW1vcnlfd2FybmluZy5vcHMiLCBzaG91bGRGcmVlQWxsT2JqZWN0cyk7
CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aW1lczsgKytpKQogICAgICAgICBpbnRlcnBy
ZXRlci5ydW4oKTsKKworICAgIGlmIChjb21tYW5kTGluZS5kZXRhaWxlZFJlcG9ydCgpKQorICAg
ICAgICBpbnRlcnByZXRlci5kZXRhaWxlZFJlcG9ydCgpOwogfQpJbmRleDogUGVyZm9ybWFuY2VU
ZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9yZWRkaXQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJm
b3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3JlZGRpdC5oCShyZXZpc2lvbiAx
OTY4NDYpCisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3JlZGRp
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw5IEBACiAjaWZuZGVmIHJlZGRpdF9oCiAj
ZGVmaW5lIHJlZGRpdF9oCiAKLXZvaWQgYmVuY2htYXJrX3JlZGRpdChib29sIGlzUGFyYWxsZWwp
Owotdm9pZCBiZW5jaG1hcmtfcmVkZGl0X21lbW9yeV93YXJuaW5nKGJvb2wgaXNQYXJhbGxlbCk7
CisjaW5jbHVkZSAiQ29tbWFuZExpbmUuaCIKKwordm9pZCBiZW5jaG1hcmtfcmVkZGl0KENvbW1h
bmRMaW5lJik7Cit2b2lkIGJlbmNobWFya19yZWRkaXRfbWVtb3J5X3dhcm5pbmcoQ29tbWFuZExp
bmUmKTsKIAogI2VuZGlmIC8vIHJlZGRpdF9oCkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxv
Y0JlbmNoL01hbGxvY0JlbmNoL3N0cmVzcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VU
ZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9zdHJlc3MuY3BwCShyZXZpc2lvbiAxOTY4NDYp
CisrKyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3N0cmVzcy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEyMCw3ICsxMjAsNyBAQCB2b2lkIGRlYWxsb2NhdGUoY29uc3Qg
T2JqZWN0JiBvYmplY3QpCiAgICAgbWJmcmVlKG9iamVjdC5wb2ludGVyLCBvYmplY3Quc2l6ZSk7
CiB9CiAKLXZvaWQgYmVuY2htYXJrX3N0cmVzcyhib29sIGlzUGFyYWxsZWwpCit2b2lkIGJlbmNo
bWFya19zdHJlc3MoQ29tbWFuZExpbmUmKQogewogICAgIGNvbnN0IHNpemVfdCBoZWFwU2l6ZSA9
IDEwMCAqIE1COwogICAgIGNvbnN0IHNpemVfdCBjaHVyblNpemUgPSAuMDUgKiBoZWFwU2l6ZTsK
SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9jQmVuY2gvTWFsbG9jQmVuY2gvc3RyZXNzLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9z
dHJlc3MuaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5j
aC9NYWxsb2NCZW5jaC9zdHJlc3MuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsNiArMjYsOCBAQAog
I2lmbmRlZiBzdHJlc3NfaAogI2RlZmluZSBzdHJlc3NfaAogCi12b2lkIGJlbmNobWFya19zdHJl
c3MoYm9vbCBpc1BhcmFsbGVsKTsKKyNpbmNsdWRlICJDb21tYW5kTGluZS5oIgorCit2b2lkIGJl
bmNobWFya19zdHJlc3MoQ29tbWFuZExpbmUmKTsKIAogI2VuZGlmIC8vIHN0cmVzc19oCkluZGV4
OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3N0cmVzc19hbGlnbmVk
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0Jl
bmNoL3N0cmVzc19hbGlnbmVkLmNwcAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VU
ZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9zdHJlc3NfYWxpZ25lZC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTEzNyw3ICsxMzcsNyBAQCBzaXplX3QgcmFuZG9tQWxpZ25tZW50KCkKIAogfQog
Ci12b2lkIGJlbmNobWFya19zdHJlc3NfYWxpZ25lZChib29sIGlzUGFyYWxsZWwpCit2b2lkIGJl
bmNobWFya19zdHJlc3NfYWxpZ25lZChDb21tYW5kTGluZSYpCiB7CiAgICAgY29uc3Qgc2l6ZV90
IGhlYXBTaXplID0gMTAwICogTUI7CiAgICAgY29uc3Qgc2l6ZV90IGNodXJuU2l6ZSA9IC4wNSAq
IGhlYXBTaXplOwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5j
aC9zdHJlc3NfYWxpZ25lZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvTWFsbG9j
QmVuY2gvTWFsbG9jQmVuY2gvc3RyZXNzX2FsaWduZWQuaAkocmV2aXNpb24gMTk2ODQ2KQorKysg
UGVyZm9ybWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC9zdHJlc3NfYWxpZ25lZC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw4IEBACiAjaWZuZGVmIHN0cmVzc19hbGlnbmVk
X2gKICNkZWZpbmUgc3RyZXNzX2FsaWduZWRfaAogCi12b2lkIGJlbmNobWFya19zdHJlc3NfYWxp
Z25lZChib29sIGlzUGFyYWxsZWwpOworI2luY2x1ZGUgIkNvbW1hbmRMaW5lLmgiCisKK3ZvaWQg
YmVuY2htYXJrX3N0cmVzc19hbGlnbmVkKENvbW1hbmRMaW5lJik7CiAKICNlbmRpZiAvLyBzdHJl
c3NfYWxpZ25lZF9oCkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0Jl
bmNoL3RoZXZlcmdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0Jl
bmNoL01hbGxvY0JlbmNoL3RoZXZlcmdlLmNwcAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9y
bWFuY2VUZXN0cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC90aGV2ZXJnZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQyLDE2ICs0MiwxOSBAQAogCiAjaW5jbHVkZSAibWJtYWxsb2MuaCIKIAotdm9p
ZCBiZW5jaG1hcmtfdGhldmVyZ2UoYm9vbCBpc1BhcmFsbGVsKQordm9pZCBiZW5jaG1hcmtfdGhl
dmVyZ2UoQ29tbWFuZExpbmUmIGNvbW1hbmRMaW5lKQogewogICAgIHNpemVfdCB0aW1lcyA9IDM7
CiAKICAgICBJbnRlcnByZXRlciBpbnRlcnByZXRlcigidGhldmVyZ2Uub3BzIik7CiAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCB0aW1lczsgKytpKQogICAgICAgICBpbnRlcnByZXRlci5ydW4o
KTsKKworICAgIGlmIChjb21tYW5kTGluZS5kZXRhaWxlZFJlcG9ydCgpKQorICAgICAgICBpbnRl
cnByZXRlci5kZXRhaWxlZFJlcG9ydCgpOwogfQogCi12b2lkIGJlbmNobWFya190aGV2ZXJnZV9t
ZW1vcnlfd2FybmluZyhib29sIGlzUGFyYWxsZWwpCit2b2lkIGJlbmNobWFya190aGV2ZXJnZV9t
ZW1vcnlfd2FybmluZyhDb21tYW5kTGluZSYgY29tbWFuZExpbmUpCiB7CiAgICAgc2l6ZV90IHRp
bWVzID0gMTsKIApAQCAtNTksNCArNjIsNyBAQCB2b2lkIGJlbmNobWFya190aGV2ZXJnZV9tZW1v
cnlfd2FybmluZyhiCiAgICAgSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIoInRoZXZlcmdlX21lbW9y
eV93YXJuaW5nLm9wcyIsIHNob3VsZEZyZWVBbGxPYmplY3RzKTsKICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRpbWVzOyArK2kpCiAgICAgICAgIGludGVycHJldGVyLnJ1bigpOworCisgICAg
aWYgKGNvbW1hbmRMaW5lLmRldGFpbGVkUmVwb3J0KCkpCisgICAgICAgIGludGVycHJldGVyLmRl
dGFpbGVkUmVwb3J0KCk7CiB9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01h
bGxvY0JlbmNoL3RoZXZlcmdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9NYWxs
b2NCZW5jaC9NYWxsb2NCZW5jaC90aGV2ZXJnZS5oCShyZXZpc2lvbiAxOTY4NDYpCisrKyBQZXJm
b3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3RoZXZlcmdlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI2LDcgKzI2LDkgQEAKICNpZm5kZWYgdGhldmVyZ2VfaAogI2RlZmluZSB0aGV2
ZXJnZV9oCiAKLXZvaWQgYmVuY2htYXJrX3RoZXZlcmdlKGJvb2wgaXNQYXJhbGxlbCk7Ci12b2lk
IGJlbmNobWFya190aGV2ZXJnZV9tZW1vcnlfd2FybmluZyhib29sIGlzUGFyYWxsZWwpOworI2lu
Y2x1ZGUgIkNvbW1hbmRMaW5lLmgiCisKK3ZvaWQgYmVuY2htYXJrX3RoZXZlcmdlKENvbW1hbmRM
aW5lJik7Cit2b2lkIGJlbmNobWFya190aGV2ZXJnZV9tZW1vcnlfd2FybmluZyhDb21tYW5kTGlu
ZSYpOwogCiAjZW5kaWYgLy8gdGhldmVyZ2VfaApJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9NYWxs
b2NCZW5jaC9NYWxsb2NCZW5jaC90cmVlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRl
c3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3RyZWUuY3BwCShyZXZpc2lvbiAxOTY4NDYpCisr
KyBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxvY0JlbmNoL3RyZWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNzUsMTEgKzE3NSwxMSBAQCB2b2lkIGNodXJuVHJlZShOb2RlKiB0cmVl
LCBzaXplX3Qgc3RyaWRlCiAKIH0gLy8gbmFtZXNwYWNlCiAKLXZvaWQgYmVuY2htYXJrX3RyZWVf
YWxsb2NhdGUoYm9vbCBpc1BhcmFsbGVsKQordm9pZCBiZW5jaG1hcmtfdHJlZV9hbGxvY2F0ZShD
b21tYW5kTGluZSYgY29tbWFuZExpbmUpCiB7CiAgICAgc2l6ZV90IHRpbWVzID0gMjQ7CiAgICAg
c2l6ZV90IGRlcHRoID0gMTY7Ci0gICAgaWYgKGlzUGFyYWxsZWwpIHsKKyAgICBpZiAoY29tbWFu
ZExpbmUuaXNQYXJhbGxlbCgpKSB7CiAgICAgICAgIHRpbWVzICo9IDQ7CiAgICAgICAgIGRlcHRo
ID0gMTM7CiAgICAgfQpAQCAtMTkwLDExICsxOTAsMTEgQEAgdm9pZCBiZW5jaG1hcmtfdHJlZV9h
bGxvY2F0ZShib29sIGlzUGFyYQogICAgIH0KIH0KIAotdm9pZCBiZW5jaG1hcmtfdHJlZV90cmF2
ZXJzZShib29sIGlzUGFyYWxsZWwpCit2b2lkIGJlbmNobWFya190cmVlX3RyYXZlcnNlKENvbW1h
bmRMaW5lJiBjb21tYW5kTGluZSkKIHsKICAgICBzaXplX3QgdGltZXMgPSAyNTY7CiAgICAgc2l6
ZV90IGRlcHRoID0gMTU7Ci0gICAgaWYgKGlzUGFyYWxsZWwpIHsKKyAgICBpZiAoY29tbWFuZExp
bmUuaXNQYXJhbGxlbCgpKSB7CiAgICAgICAgIHRpbWVzID0gNTEyOwogICAgICAgICBkZXB0aCA9
IDEzOwogICAgIH0KQEAgLTIwNSwxMSArMjA1LDExIEBAIHZvaWQgYmVuY2htYXJrX3RyZWVfdHJh
dmVyc2UoYm9vbCBpc1BhcmEKICAgICB0cmVlLT5kZXJlZigpOwogfQogCi12b2lkIGJlbmNobWFy
a190cmVlX2NodXJuKGJvb2wgaXNQYXJhbGxlbCkKK3ZvaWQgYmVuY2htYXJrX3RyZWVfY2h1cm4o
Q29tbWFuZExpbmUmIGNvbW1hbmRMaW5lKQogewogICAgIHNpemVfdCB0aW1lcyA9IDEzMDsKICAg
ICBzaXplX3QgZGVwdGggPSAxNTsKLSAgICBpZiAoaXNQYXJhbGxlbCkgeworICAgIGlmIChjb21t
YW5kTGluZS5pc1BhcmFsbGVsKCkpIHsKICAgICAgICAgdGltZXMgKj0gNDsKICAgICAgICAgZGVw
dGggPSAxMjsKICAgICB9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNoL01hbGxv
Y0JlbmNoL3RyZWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL01hbGxvY0JlbmNo
L01hbGxvY0JlbmNoL3RyZWUuaAkocmV2aXNpb24gMTk2ODQ2KQorKysgUGVyZm9ybWFuY2VUZXN0
cy9NYWxsb2NCZW5jaC9NYWxsb2NCZW5jaC90cmVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDgg
KzI2LDEwIEBACiAjaWZuZGVmIHRyZWVfaAogI2RlZmluZSB0cmVlX2gKIAotdm9pZCBiZW5jaG1h
cmtfdHJlZV9hbGxvY2F0ZShib29sIGlzUGFyYWxsZWwpOwotdm9pZCBiZW5jaG1hcmtfdHJlZV90
cmF2ZXJzZShib29sIGlzUGFyYWxsZWwpOwotdm9pZCBiZW5jaG1hcmtfdHJlZV9jaHVybihib29s
IGlzUGFyYWxsZWwpOworI2luY2x1ZGUgIkNvbW1hbmRMaW5lLmgiCisKK3ZvaWQgYmVuY2htYXJr
X3RyZWVfYWxsb2NhdGUoQ29tbWFuZExpbmUmKTsKK3ZvaWQgYmVuY2htYXJrX3RyZWVfdHJhdmVy
c2UoQ29tbWFuZExpbmUmKTsKK3ZvaWQgYmVuY2htYXJrX3RyZWVfY2h1cm4oQ29tbWFuZExpbmUm
KTsKIAogI2VuZGlmIC8vIHRyZWVfaAo=
</data>
<flag name="review"
          id="296654"
          type_id="1"
          status="+"
          setter="ggaren"
    />
    <flag name="commit-queue"
          id="296767"
          type_id="3"
          status="-"
          setter="commit-queue"
    />
          </attachment>
      

    </bug>

</bugzilla>