<?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>34349</bug_id>
          
          <creation_ts>2010-01-29 14:56:31 -0800</creation_ts>
          <short_desc>[Symbian] Lazy commit of memory required in JSC register file</short_desc>
          <delta_ts>2011-04-19 05:15:29 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>S60 Hardware</rep_platform>
          <op_sys>S60 3rd edition</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Major</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>27065</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Siddharth Mathur">s.mathur</reporter>
          <assigned_to name="Jay Tucker">jay.tucker</assigned_to>
          <cc>christian.webkit</cc>
    
    <cc>ggaren</cc>
    
    <cc>hausmann</cc>
    
    <cc>jay.tucker</cc>
    
    <cc>jesus</cc>
    
    <cc>kenneth</cc>
    
    <cc>kent.hansen</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>norbert.leser</cc>
    
    <cc>oliver</cc>
    
    <cc>skyul</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>185974</commentid>
    <comment_count>0</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-01-29 14:56:31 -0800</bug_when>
    <thetext>To be smart on RAM usage, RegisterFile should NOT allocate (commit) 4MB upfront, but use logic similar to the HAVE(VIRTUALALLOC) case. 

a) use RChunk.CreateLocalDisconnected() to reserve virtual address space in the c&apos;tor. 
https://trac.webkit.org/browser/trunk/JavaScriptCore/interpreter/RegisterFile.h

b) use RChunk.commit() to commit only what is needed in RegisterFile::grow()
https://trac.webkit.org/changeset/42842/trunk/JavaScriptCore/interpreter/RegisterFile.cpp

c) decommit using RChunk.decommit() what&apos;s not needed in RegisterFile::shrink()

Note that there are some alignment requirements for allocated memory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197623</commentid>
    <comment_count>1</comment_count>
    <who name="Kent Hansen">kent.hansen</who>
    <bug_when>2010-03-09 09:23:33 -0800</bug_when>
    <thetext>How required is it (i.e. does the current implementation cause out of memory on some configuration)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198743</commentid>
    <comment_count>2</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-03-11 12:32:19 -0800</bug_when>
    <thetext>Kent, 

High (but not top) priority. We are very frequently out of memory on Symbian, since the devices have ~128MB of RAM and only 50-60MB free after boot. Due to mid-market positioning of Symbian devices, there will always be new phones out with only 128MB of RAM (and no virtual memory of course). :)

The user of custom memory allocators for Qt-Symbian apps helps a bit here, but only a few will be using it. 

In my patch for Bug 34350, I was initially attempting to make the logic support RegisterFile&apos;s needs too, but the code got complicated quickly, so I only addressed Collector&apos;s needs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227304</commentid>
    <comment_count>3</comment_count>
      <attachid>56375</attachid>
    <who name="Jay Tucker">jay.tucker</who>
    <bug_when>2010-05-18 07:53:59 -0700</bug_when>
    <thetext>Created attachment 56375
patch file -- first take

This is my first attempt at a patch for this issue. There&apos;s still some debugging code in the patch which can and will be removed before the patch is landed. Mostly, I&apos;d just appreciate some early feedback at the moment. I&apos;m working on a suite of unit tests for the patch and will post that shortly, too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227306</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-18 07:56:05 -0700</bug_when>
    <thetext>Attachment 56375 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
JavaScriptCore/wtf/symbian/ContigBlockAllocator.cpp:33:  Found other header before a header this file implements. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.cpp:34:  Found header this file implements after other header. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.cpp:105:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.cpp:145:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
JavaScriptCore/interpreter/RegisterFile.h:173:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.h:29:  #ifndef header guard has wrong style, please use: ContigBlockAllocator_h  [build/header_guard] [5]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.h:55:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.h:56:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.h:57:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/symbian/ContigBlockAllocator.h:58:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/symbian/SymbianDefines.h:1:  One or more unexpected \r (^M) found; better to use only a \n  [whitespace/carriage_return] [1]
Suppressing further [whitespace/carriage_return] reports for this file.
JavaScriptCore/wtf/symbian/SymbianDefines.h:29:  #ifndef header guard has wrong style, please use: SymbianDefines_h  [build/header_guard] [5]
Total errors found: 51 in 7 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>227311</commentid>
    <comment_count>5</comment_count>
      <attachid>56376</attachid>
    <who name="Jay Tucker">jay.tucker</who>
    <bug_when>2010-05-18 08:14:17 -0700</bug_when>
    <thetext>Created attachment 56376
patch -- first take, style fixed

D&apos;oh! OK, let&apos;s try this again with improved style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227312</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-05-18 08:15:19 -0700</bug_when>
    <thetext>Attachment 56376 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
JavaScriptCore/interpreter/RegisterFile.h:173:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 1 in 7 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>227623</commentid>
    <comment_count>7</comment_count>
      <attachid>56376</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-05-18 19:57:17 -0700</bug_when>
    <thetext>Comment on attachment 56376
patch -- first take, style fixed

I don&apos;t think you should allocate m_blockAllocator using new.

Who&apos;s a good person to review the symbian parts of this patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228144</commentid>
    <comment_count>8</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-05-19 19:24:52 -0700</bug_when>
    <thetext>Geoffrey, thanks for the look I plan to review this the Symbian part of this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229064</commentid>
    <comment_count>9</comment_count>
      <attachid>56376</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-05-21 13:14:35 -0700</bug_when>
    <thetext>Comment on attachment 56376
patch -- first take, style fixed


&gt; Index: JavaScriptCore/JavaScriptCore.pro
&gt; ===================================================================
&gt; --- JavaScriptCore/JavaScriptCore.pro	(revision 59669)
&gt; +++ JavaScriptCore/JavaScriptCore.pro	(working copy)
&gt; @@ -214,6 +214,7 @@ SOURCES += \
&gt;      wtf/RandomNumber.cpp \
&gt;      wtf/RefCountedLeakCounter.cpp \
&gt;      wtf/symbian/BlockAllocatorSymbian.cpp \
&gt; +    wtf/symbian/ContigBlockAllocator.cpp \

May I suggest RegisterFileAllocatorSymbian.cpp ? Ditto for the header file. The grow/shrink logic is custom made for the register file, and besides Qt conventionally adds platform suffix at the end of the filename.
This may also give space to future contributors/other ports to move out some of the current platform-specific code for mmap() and VirtualAlloc() into their own RegisterFileAllocator&lt;Platform&gt;.cpp. 

&gt; Index: JavaScriptCore/interpreter/RegisterFile.cpp
&gt; ===================================================================
&gt; --- JavaScriptCore/interpreter/RegisterFile.cpp	(revision 59669)
&gt; +++ JavaScriptCore/interpreter/RegisterFile.cpp	(working copy)
&gt; @@ -42,6 +42,8 @@ RegisterFile::~RegisterFile()
&gt;      VirtualFree(m_buffer, DWORD(m_commitEnd) - DWORD(m_buffer), MEM_DECOMMIT);
&gt;  #endif
&gt;      VirtualFree(m_buffer, 0, MEM_RELEASE);
&gt; +#elif PLATFORM(SYMBIAN)
&gt; +    delete m_blockAllocator;

m_registerFileAllocator ? Which is also not heap allocated as ggaren suggests. 

&gt;  #else
&gt;      fastFree(m_buffer);
&gt;  #endif
&gt; Index: JavaScriptCore/interpreter/RegisterFile.h
&gt; ===================================================================
&gt; --- JavaScriptCore/interpreter/RegisterFile.h	(revision 59669)
&gt; +++ JavaScriptCore/interpreter/RegisterFile.h	(working copy)
&gt; @@ -42,6 +42,10 @@
&gt;  #include &lt;sys/mman.h&gt;
&gt;  #endif
&gt;  
&gt; +#if PLATFORM(SYMBIAN)
&gt; +#include &lt;wtf/symbian/ContigBlockAllocator.h&gt;
&gt; +#endif
&gt; +

Header file name change.


&gt;  #if HAVE(VIRTUALALLOC)
&gt;          Register* m_commitEnd;
&gt;  #endif
&gt; @@ -159,7 +168,12 @@ namespace JSC {
&gt;      };
&gt;  
&gt;      // FIXME: Add a generic getpagesize() to WTF, then move this function to WTF as well.
&gt; +    // This is still a hack that should be fixed later. We know that a Symbian page size is 4K.
&gt; +#if PLATFORM(SYMBIAN)
&gt; +    inline bool isPageAligned(size_t size) { return size != 0 &amp;&amp; size % (4 * 1024) == 0; }
&gt; +#else    
&gt;      inline bool isPageAligned(size_t size) { return size != 0 &amp;&amp; size % (8 * 1024) == 0; }
&gt; +#endif
&gt;  
&gt;      inline RegisterFile::RegisterFile(size_t capacity, size_t maxGlobals)
&gt;          : m_numGlobals(0)
&gt; @@ -205,6 +219,14 @@ namespace JSC {
&gt;              CRASH();
&gt;          }
&gt;          m_commitEnd = reinterpret_cast&lt;Register*&gt;(reinterpret_cast&lt;char*&gt;(m_buffer) + committedSize);
&gt; +    #elif PLATFORM(SYMBIAN)
&gt; +        // A convenience class to allocate contiguous blocks efficiently
&gt; +        m_blockAllocator = new WTF::ContigBlockAllocator(bufferLength, 64 * 1024);
&gt; +        m_buffer = (Register*)(m_blockAllocator-&gt;buffer());
&gt; +        

Regarding the second argument to the c&apos;tor, it seems to be the threshold below which we don&apos;t commit or decommit (i.e the internal pool of committed memory). What are the typical shrink/grow delta you see requested in typical web browsing? Perhaps ggaren can help here .  
The c&apos;tor arg should also be #defined and parked inside wtf/symbian/youheaderfile.h 

&gt; +        // start by committing enough space to hold maxGlobals
&gt; +        void* newEnd = (void*)((int)m_buffer + (maxGlobals * sizeof(Register)));
&gt; +        m_blockAllocator-&gt;grow(newEnd);
&gt;      #else 

static_cast&lt;void*&gt;m_buffer + (maxGlobals * sizeof(Register)) ? 


&gt;          /* 
&gt;           * If neither MMAP nor VIRTUALALLOC are available - use fastMalloc instead.
&gt; @@ -227,8 +249,12 @@ namespace JSC {
&gt;          if (newEnd &gt;= m_end)
&gt;              return;
&gt;          m_end = newEnd;
&gt; -        if (m_end == m_start &amp;&amp; (m_maxUsed - m_start) &gt; maxExcessCapacity)
&gt; +        if (m_end == m_start &amp;&amp; (m_maxUsed - m_start) &gt; maxExcessCapacity) {
&gt; +#if PLATFORM(SYMBIAN)
&gt; +            m_blockAllocator-&gt;shrink(newEnd);
&gt; +#endif 
&gt;              releaseExcessCapacity();
&gt; +        }
&gt;      }
&gt;  

I presume we can&apos;t use the (m_max - m_start)* sizeof(Register) logic in releaseExcessCapacity() to decommit ? Sorry if I missed something here. 

&gt;      inline bool RegisterFile::grow(Register* newEnd)
&gt; @@ -254,6 +280,10 @@ namespace JSC {
&gt;          }
&gt;  #endif
&gt;  
&gt; +#if PLATFORM(SYMBIAN)
&gt; +        m_blockAllocator-&gt;grow((void*)newEnd);
&gt; +#endif
&gt; +
&gt;          if (newEnd &gt; m_maxUsed)
&gt;              m_maxUsed = newEnd;
&gt;  
&gt; Index: JavaScriptCore/wtf/symbian/ContigBlockAllocator.cpp
&gt; ===================================================================
&gt; +#include &lt;QDebug&gt;
&gt; +
&gt; +namespace WTF {
&gt; +
&gt; +/** Efficiently allocates blocks of size blockSize with blockSize alignment. 
&gt; + * Primarily designed for JSC RegisterFile&apos;s needs. 
&gt; + * Not thread-safe.    
&gt; + */

Just for my education, do other ports expect the RegisterFile object to shared across threads? 


&gt; +ContigBlockAllocator::ContigBlockAllocator(TUint32 reservationSize, TUint32 blockSize )
&gt; +    : m_reserved(reservationSize), 
&gt; +      m_blockSize(blockSize)
&gt; +{

Somewhat subjective, but perhaps m_blockSize could be renamed to m_poolSize or similar? 

&gt; +     // Get system&apos;s page size value.
&gt; +     SYMBIAN_PAGESIZE(m_pageSize); 
&gt; +     // We only accept multiples of system page size for both initial reservation and the alignment/block size
&gt; +     m_reserved = SYMBIAN_ROUNDUPTOMULTIPLE(m_reserved, m_pageSize);
&gt; +     __ASSERT_ALWAYS(SYMBIAN_ROUNDUPTOMULTIPLE(m_blockSize, m_pageSize), User::Panic(_L(&quot;ContigBlockAllocator1&quot;), KErrArgument));
&gt; +     
&gt; +     // Open a Symbian RChunk, and reserve requested virtual address range   
&gt; +     // Any thread in this process can operate this rchunk due to EOwnerProcess access rights. 
&gt; +     TInt ret = m_chunk.CreateDisconnectedLocal(0 , 0, (TInt)m_reserved , EOwnerProcess);  
&gt; +     if (ret != KErrNone) 
&gt; +         User::Panic(_L(&quot;ContigBlockAllocator2&quot;), ret);
&gt; +       
&gt; +     // This is the offset to m_chunk.Base() required to make it m_blockSize-aligned
&gt; +     m_offset = SYMBIAN_ROUNDUPTOMULTIPLE(TUint32(m_chunk.Base()), m_blockSize) - TUint(m_chunk.Base());

So, we are really requesting our m_buffer to be blockSize aligned here. I don&apos;t think there is such a need for RegisterFile. At most, there may be a need to have sizeof(RegisterFile) alignment. 
Please correct me if I missed something. 

&gt; +     qDebug(&quot;CBA::CBA() handle=%d, reserved=%d, blocksize=%d&quot;,
&gt; +             m_chunk.Handle(), m_reserved, m_blockSize); 
&gt; +     qDebug(&quot;CBA::CBA() base=%d, offset=%d&quot;, m_chunk.Base(), m_offset);
&gt; +}
&gt; +
&gt; +ContigBlockAllocator::~ContigBlockAllocator()
&gt; +{
&gt; +    // release everything!
&gt; +    qDebug(&quot;CBA::~CBA() destroying everything!&quot;);
&gt; +    m_chunk.Decommit(0, m_chunk.MaxSize());
&gt; +    m_chunk.Close();
&gt; +}
&gt; +
&gt; +void* ContigBlockAllocator::buffer() const
&gt; +{
&gt; +    void* buf = (void*)(TUint(m_chunk.Base()) + m_offset); 
&gt; +    qDebug(&quot;CBA::buffer() base=%d, offset=%d, buffer=%d &quot;, m_chunk.Base(), m_offset, buf);
&gt; +    return buf;
&gt; +}
&gt; +
&gt; +void ContigBlockAllocator::grow(void* newEnd)
&gt; +{
&gt; +    qDebug(&quot;CBA::grow() newEnd=%d&quot;, newEnd);
&gt; +
&gt; +    // find the current end of the committed block
&gt; +    void* curEnd = (void*)(m_chunk.Base() + m_offset + m_chunk.Size());
&gt; +    // find the end of the reserved block
&gt; +    void* maxEnd = (void*)(m_chunk.Base() + m_chunk.MaxSize());
&gt; +
&gt; +    qDebug(&quot;CBA::grow() base=%d, offset=%d, committed=%d, curEnd=%d, maxEnd=%d&quot;,
&gt; +            m_chunk.Base(), m_offset, m_chunk.Size(), curEnd, maxEnd);
&gt; +    
&gt; +    if (newEnd &gt; maxEnd) {
&gt; +        qDebug(&quot;CBA::grow() trying to commit more memory than reserved&quot;);
&gt; +        return;
&gt; +    }
&gt; +    
&gt; +    if (newEnd &gt; curEnd) {
&gt; +        TInt nBytes = (TInt)(newEnd) - (TInt)(curEnd);
&gt; +        nBytes = SYMBIAN_ROUNDUPTOMULTIPLE(nBytes, m_blockSize);
&gt; +        TInt offset = (TInt)(curEnd) - (TInt)m_chunk.Base();
&gt; +        qDebug(&quot;CBA::grow() Committing %d bytes at offset %d&quot;, nBytes, offset);
&gt; +        
&gt; +        TInt ret = m_chunk.Commit(offset, nBytes);
&gt; +        if (ret != KErrNone)
&gt; +            qDebug(&quot;CBA::grow() failed! Commit: %d&quot;, ret);
&gt; +    }
&gt; +}
&gt; +
&gt; +void ContigBlockAllocator::shrink(void* newEnd)
&gt; +{
&gt; +    qDebug(&quot;CBA::shrink() newEnd=%d&quot;, newEnd);
&gt; +
&gt; +    // find the current end of the committed block
&gt; +    void* curEnd = (void*)(m_chunk.Base() + m_offset + m_chunk.Size());
&gt; +    // find the end of the reserved block
&gt; +    void* maxEnd = (void*)(m_chunk.Base() + m_chunk.MaxSize());
&gt; +
&gt; +    qDebug(&quot;CBA::shrink() base=%d, offset=%d, committed=%d, curEnd=%d, maxEnd=%d&quot;,
&gt; +            m_chunk.Base(), m_offset, m_chunk.Size(), curEnd, maxEnd);
&gt; +    
&gt; +    if (newEnd &lt; curEnd) {
&gt; +        TInt nBytes = (TInt)(newEnd) - (TInt)(curEnd);
&gt; +        if (nBytes &lt; m_blockSize)
&gt; +            return;
&gt; +        
&gt; +        TInt offset = SYMBIAN_ROUNDUPTOMULTIPLE((TUint)newEnd, m_blockSize) - (TInt)m_chunk.Base();
&gt; +        nBytes = (TInt)curEnd - offset - (TInt)m_chunk.Base(); 
&gt; +        
&gt; +        if (nBytes &gt; 0) {
&gt; +            qDebug(&quot;CBA::shrink() Decommitting %d bytes at offset %d&quot;, nBytes, offset);
&gt; +        
&gt; +            TInt ret = m_chunk.Decommit(offset, nBytes);
&gt; +            if (ret != KErrNone)
&gt; +                qDebug(&quot;CBA::shrink() failed! Decommit: %d&quot;, ret);
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +} // end of namespace
&gt; +
&gt; +#endif // SYMBIAN
&gt; 
&gt; Property changes on: JavaScriptCore/wtf/symbian/ContigBlockAllocator.cpp
&gt; ___________________________________________________________________
&gt; Added: svn:executable
&gt;    + *
&gt; 
&gt; Index: JavaScriptCore/wtf/symbian/ContigBlockAllocator.h
&gt; ===================================================================
&gt; --- JavaScriptCore/wtf/symbian/ContigBlockAllocator.h	(revision 0)
&gt; +++ JavaScriptCore/wtf/symbian/ContigBlockAllocator.h	(revision 0)
&gt; @@ -0,0 +1,66 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer. 
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution. 
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission. 
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ContigBlockAllocator_h
&gt; +#define ContigBlockAllocator_h
&gt; +
&gt; +#include &quot;SymbianDefines.h&quot;
&gt; +
&gt; +namespace WTF {
&gt; +
&gt; +/** 
&gt; + *  Allocates contiguous regions of size blockSize with blockSize-aligned address. 
&gt; + *  blockSize must be a multiple of system page size (typically 4K on Symbian/ARM)
&gt; + *
&gt; + *  @param reservationSize Virtual address range to be reserved upon creation of chunk (bytes).
&gt; + *  @param blockSize Size of a single allocation. Returned address will also be blockSize-aligned.
&gt; + */
&gt; +class ContigBlockAllocator {
&gt; +    public:
&gt; +        ContigBlockAllocator(TUint32 reservationSize, TUint32 blockSize);
&gt; +        ~ContigBlockAllocator();
&gt; +        void* buffer() const;
&gt; +        void grow(void* newEnd);
&gt; +        void shrink(void* newEnd);
&gt; +    
&gt; +    private: 
&gt; +        RChunk   m_chunk; // Symbian chunk that lets us reserve/commit/decommit
&gt; +        
&gt; +        // all following values are in numbers of bytes
&gt; +        TInt     m_pageSize; // cached value of system page size, typically 4K on Symbian
&gt; +        TUint    m_offset; // offset of first block from base
&gt; +        TUint32  m_reserved; // total number of reserved bytes in virtual memory
&gt; +        TUint32  m_blockSize; // size of one memory block, set by default to 64K in JSC/interpreter/RegisterFile.h
&gt; +
&gt; +};
&gt; +
&gt; +}
&gt; +
&gt; +#endif // ContigBlockAllocator_h
&gt; +
&gt; +
&gt; 
&gt; Property changes on: JavaScriptCore/wtf/symbian/ContigBlockAllocator.h
&gt; ___________________________________________________________________
&gt; Added: svn:executable
&gt;    + *
&gt; 
&gt; Index: JavaScriptCore/wtf/symbian/SymbianDefines.h
&gt; ===================================================================
&gt; --- JavaScriptCore/wtf/symbian/SymbianDefines.h	(revision 0)
&gt; +++ JavaScriptCore/wtf/symbian/SymbianDefines.h	(revision 0)
&gt; @@ -0,0 +1,40 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer. 
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution. 
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission. 
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef SymbianDefines_h
&gt; +#define SymbianDefines_h
&gt; +
&gt; +#include &lt;e32cmn.h&gt;
&gt; +#include &lt;e32std.h&gt;
&gt; +#include &lt;hal.h&gt;
&gt; +
&gt; +#define SYMBIAN_PAGESIZE(x) (HAL::Get(HALData::EMemoryPageSize, x));
&gt; +#define SYMBIAN_FREERAM(x)  (HAL::Get(HALData::EMemoryRAMFree, x));
&gt; +#define SYMBIAN_ROUNDUPTOMULTIPLE(x, multipleof) ( (x + multipleof - 1) &amp; ~(multipleof - 1) )
&gt; +
&gt; +#endif // SymbianDefines_h
&gt; 
&gt; Property changes on: JavaScriptCore/wtf/symbian/SymbianDefines.h
&gt; ___________________________________________________________________
&gt; Added: svn:executable
&gt;    + *
&gt; 

I will review everything after grow/shrink implementation later..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236897</commentid>
    <comment_count>10</comment_count>
      <attachid>58485</attachid>
    <who name="Jay Tucker">jay.tucker</who>
    <bug_when>2010-06-11 10:41:13 -0700</bug_when>
    <thetext>Created attachment 58485
revised patch

Here&apos;s a revised patch based on Siddharth&apos;s comments. One thing I  haven&apos;t done is to move m_registerFileAllocator in RegisterFile from the heap to the stack. The reason is that its constructor needs to be initialized with the total number of bytes to reserve, which isn&apos;t calculated until later as the local variable bufferLength at the top of the RegisterFile constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236921</commentid>
    <comment_count>11</comment_count>
    <who name="Jesus Sanchez-Palencia">jesus</who>
    <bug_when>2010-06-11 11:10:56 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Created an attachment (id=58485) [details]
&gt; revised patch

Did you forget to mark it for review or is this a still work in progress patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236944</commentid>
    <comment_count>12</comment_count>
    <who name="Jay Tucker">jay.tucker</who>
    <bug_when>2010-06-11 11:41:36 -0700</bug_when>
    <thetext>The functionality of the patch is all there and appears to be working correctly, but there&apos;s still some debugging code left in. At the moment, I&apos;d just like people to take a look and offer comments and suggestions for improvement, which I&apos;ll incorporate in a further go-around. Once everybody seems happy with the patch, I&apos;ll remove the debugging code from it and submit it for official review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239378</commentid>
    <comment_count>13</comment_count>
      <attachid>58485</attachid>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-06-17 07:28:49 -0700</bug_when>
    <thetext>Comment on attachment 58485
revised patch

Looks good! Excited that this will save 4MB per JSC instance on a device :) 
---------------------------------
http://wkrietveld.appspot.com/34349/diff/1/5
File JavaScriptCore/interpreter/RegisterFile.h (right):

http://wkrietveld.appspot.com/34349/diff/1/5#newcode161
JavaScriptCore/interpreter/RegisterFile.h:161: WTF::RegisterFileAllocator* m_registerFileAllocator;
The code comments are incorrect, please fix.

http://wkrietveld.appspot.com/34349/diff/1/5#newcode222
JavaScriptCore/interpreter/RegisterFile.h:222: m_buffer = (Register*)(m_registerFileAllocator-&gt;buffer());
Code comments need fixing, or may even be removed in this instance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239927</commentid>
    <comment_count>14</comment_count>
      <attachid>59110</attachid>
    <who name="Jay Tucker">jay.tucker</who>
    <bug_when>2010-06-18 08:24:12 -0700</bug_when>
    <thetext>Created attachment 59110
patch for review

Here&apos;s a patch ready to be reviewed.

I&apos;ve also created a number of QtestLib-based test cases for the new RegisterFileAllocator class. I&apos;ll submit those test cases in a new bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241335</commentid>
    <comment_count>15</comment_count>
    <who name="Laszlo Gombos">laszlo.gombos</who>
    <bug_when>2010-06-22 10:57:30 -0700</bug_when>
    <thetext>I would like to see performance numbers (sunspider) from an actual Symbian device (most device will do) for this patch to make sure there is no significant performance degradation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241449</commentid>
    <comment_count>16</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-06-22 14:02:46 -0700</bug_when>
    <thetext>I wonder if it wouldn&apos;t be simpler to use the RChunk directly in RegisterFile? I admit there&apos;s a fair bit of #ifdeffery there and it&apos;s not pretty :)

The new class on the other hand - RegisterFileAllocator - is not actually a platform independent interface as the name suggest. Instead it is Symbian specific.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241847</commentid>
    <comment_count>17</comment_count>
    <who name="Jay Tucker">jay.tucker</who>
    <bug_when>2010-06-23 07:37:44 -0700</bug_when>
    <thetext>Well, the (future-looking) intention is to make the RegisterFileAllocator class platform-independent. That&apos;s why the class is named RegisterFileAllocator, but the associated .h and .cpp files are called RegisterFileAllocatorSymbian.

The idea is that each platform can define its own version of the RegisterFileAllocator class in its own RegisterFileAllocator&lt;Platform&gt; source files. That way, the only significant #ifdef stuff can take place at the very top of RegisterFile.h, where you choose which header file to include based on the platform. After that, you just use the RegisterFileAllocator class (which may be better thought of and even implemented as a pure virtual class, like a Java interface). You could then get rid of all the other #ifdef stuff like HAVE(MMAP) and HAVE(VIRTUALALLOC) and OS(WINCE) and so on and put all the platform-specific code into platform-specific source files: RegisterFileAllocatorMmap and so on.

If anything, that will clean up the code in RegisterFile.h and make it easier to read.

I&apos;ve just taken the first step here since I didn&apos;t want to try to completely rewrite the RegisterFile class on my own just for the sake of this patch. I didn&apos;t think that that would go over so well in the community. :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255458</commentid>
    <comment_count>18</comment_count>
    <who name="Kent Hansen">kent.hansen</who>
    <bug_when>2010-07-23 10:20:09 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; Created an attachment (id=59110) [details]
&gt; patch for review

The changes in RegisterFile.h seem to be 99% indenting changes, which is completely unrelated to this issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255463</commentid>
    <comment_count>19</comment_count>
    <who name="Kent Hansen">kent.hansen</who>
    <bug_when>2010-07-23 10:32:02 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Well, the (future-looking) intention is to make the RegisterFileAllocator class platform-independent. That&apos;s why the class is named RegisterFileAllocator, but the associated .h and .cpp files are called RegisterFileAllocatorSymbian.
&gt; 
&gt; The idea is that each platform can define its own version of the RegisterFileAllocator class in its own RegisterFileAllocator&lt;Platform&gt; source files. That way, the only significant #ifdef stuff can take place at the very top of RegisterFile.h, where you choose which header file to include based on the platform. After that, you just use the RegisterFileAllocator class (which may be better thought of and even implemented as a pure virtual class, like a Java interface). You could then get rid of all the other #ifdef stuff like HAVE(MMAP) and HAVE(VIRTUALALLOC) and OS(WINCE) and so on and put all the platform-specific code into platform-specific source files: RegisterFileAllocatorMmap and so on.
&gt; 
&gt; If anything, that will clean up the code in RegisterFile.h and make it easier to read.
&gt; 
&gt; I&apos;ve just taken the first step here since I didn&apos;t want to try to completely rewrite the RegisterFile class on my own just for the sake of this patch. I didn&apos;t think that that would go over so well in the community. :-)

The idea is good, but so long as the RegisterFileAllocator interface is not platform-neutral, the implementation is confusing. If you want to make this abstraction, why not try it with the existing  platforms to make sure it&apos;ll actually work out OK.

My recommendation would be to either 1) do what Simon suggested (ifdeffery directly in RegisterFile, no new classes); or 2) implement RegisterFileAllocator for the existing platforms (showing that your above idea works, i.e. getting rid of the ifdefs), and _then_ add the Symbian implementation of RegisterFileAllocator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260173</commentid>
    <comment_count>20</comment_count>
      <attachid>59110</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-08-04 13:01:52 -0700</bug_when>
    <thetext>Comment on attachment 59110
patch for review

I agree with Kent&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270423</commentid>
    <comment_count>21</comment_count>
    <who name="Kent Hansen">kent.hansen</who>
    <bug_when>2010-08-27 04:55:17 -0700</bug_when>
    <thetext>Does r64782 (https://bugs.webkit.org/show_bug.cgi?id=43185) fix this issue?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318978</commentid>
    <comment_count>22</comment_count>
    <who name="Siddharth Mathur">s.mathur</who>
    <bug_when>2010-12-08 13:26:41 -0800</bug_when>
    <thetext>No more action required on this bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56375</attachid>
            <date>2010-05-18 07:53:59 -0700</date>
            <delta_ts>2010-05-18 08:14:17 -0700</delta_ts>
            <desc>patch file -- first take</desc>
            <filename>bug-34349.patch</filename>
            <type>text/plain</type>
            <size>18427</size>
            <attacher name="Jay Tucker">jay.tucker</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU5NjY5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjkgQEAKKzIwMTAtMDUtMTggIFR1Y2tlciBK
YXkgIDxqYXkudHVja2VyQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbU3ltYmlhbl0gTGF6eSBjb21taXQgb2YgbWVtb3J5IHJlcXVp
cmVkIGluIEpTQyByZWdpc3RlciBmaWxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNDM0OQorCisgICAgICAgICogSmF2YVNjcmlwdENvcmUucHJvOiBB
ZGRlZCAxIG5ldyBTeW1iaWFuIHNvdXJjZSBmaWxlCisgICAgICAgICogaW50ZXJwcmV0ZXIvUmVn
aXN0ZXJGaWxlLmNwcDoKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjp+UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKiBpbnRlcnByZXRlci9SZWdpc3RlckZpbGUuaDoKKyAgICAgICAgKEpTQzo6
aXNQYWdlQWxpZ25lZCk6CisgICAgICAgIChKU0M6OlJlZ2lzdGVyRmlsZTo6UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjpzaHJpbmspOgorICAgICAgICAoSlNDOjpS
ZWdpc3RlckZpbGU6Omdyb3cpOgorICAgICAgICAqIHd0Zi9zeW1iaWFuL0NvbnRpZ0Jsb2NrQWxs
b2NhdG9yLmNwcDogQWRkZWQuCisgICAgICAgIChXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yOjpD
b250aWdCbG9ja0FsbG9jYXRvcik6CisgICAgICAgIEhlbHBlciBjbGFzcyB0byBhbGxvY2F0ZSBt
ZW1vcnkgcmVxdWlyZWQgYnkgUmVnaXN0ZXJGaWxlCisgICAgICAgIG1vcmUgZWZmaWNpZW50bHku
CisgICAgICAgIChXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yOjp+Q29udGlnQmxvY2tBbGxvY2F0
b3IpOgorICAgICAgICAoV1RGOjpDb250aWdCbG9ja0FsbG9jYXRvcjo6YnVmZmVyKToKKyAgICAg
ICAgKFdURjo6Q29udGlnQmxvY2tBbGxvY2F0b3I6Omdyb3cpOgorICAgICAgICAoV1RGOjpDb250
aWdCbG9ja0FsbG9jYXRvcjo6c2hyaW5rKToKKyAgICAgICAgKiB3dGYvc3ltYmlhbi9Db250aWdC
bG9ja0FsbG9jYXRvci5oOiBBZGRlZC4KKyAgICAgICAgKiB3dGYvc3ltYmlhbi9TeW1iaWFuRGVm
aW5lcy5oOiBBZGRlZC4KKwogMjAxMC0wNS0xNyAgR2F2aW4gQmFycmFjbG91Z2ggIDxiYXJyYWNs
b3VnaEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR2VvZmYgR2FyZW4uCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJvCShyZXZpc2lvbiA1OTY2OSkKKysrIEphdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtMjE0LDYgKzIxNCw3
IEBAIFNPVVJDRVMgKz0gXAogICAgIHd0Zi9SYW5kb21OdW1iZXIuY3BwIFwKICAgICB3dGYvUmVm
Q291bnRlZExlYWtDb3VudGVyLmNwcCBcCiAgICAgd3RmL3N5bWJpYW4vQmxvY2tBbGxvY2F0b3JT
eW1iaWFuLmNwcCBcCisgICAgd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3BwIFwK
ICAgICB3dGYvVGhyZWFkaW5nTm9uZS5jcHAgXAogICAgIHd0Zi9UaHJlYWRpbmcuY3BwIFwKICAg
ICB3dGYvVHlwZVRyYWl0cy5jcHAgXApJbmRleDogSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIv
UmVnaXN0ZXJGaWxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRl
ci9SZWdpc3RlckZpbGUuY3BwCShyZXZpc2lvbiA1OTY2OSkKKysrIEphdmFTY3JpcHRDb3JlL2lu
dGVycHJldGVyL1JlZ2lzdGVyRmlsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDgg
QEAgUmVnaXN0ZXJGaWxlOjp+UmVnaXN0ZXJGaWxlKCkKICAgICBWaXJ0dWFsRnJlZShtX2J1ZmZl
ciwgRFdPUkQobV9jb21taXRFbmQpIC0gRFdPUkQobV9idWZmZXIpLCBNRU1fREVDT01NSVQpOwog
I2VuZGlmCiAgICAgVmlydHVhbEZyZWUobV9idWZmZXIsIDAsIE1FTV9SRUxFQVNFKTsKKyNlbGlm
IFBMQVRGT1JNKFNZTUJJQU4pCisgICAgZGVsZXRlIG1fYmxvY2tBbGxvY2F0b3I7CiAjZWxzZQog
ICAgIGZhc3RGcmVlKG1fYnVmZmVyKTsKICNlbmRpZgpJbmRleDogSmF2YVNjcmlwdENvcmUvaW50
ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvaW50
ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmgJKHJldmlzaW9uIDU5NjY5KQorKysgSmF2YVNjcmlwdENv
cmUvaW50ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQy
LDEwIEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNlbmRpZgogCisjaWYgUExBVEZPUk0oU1lN
QklBTikKKyNpbmNsdWRlIDx3dGYvc3ltYmlhbi9Db250aWdCbG9ja0FsbG9jYXRvci5oPgorI2Vu
ZGlmCisKIG5hbWVzcGFjZSBKU0MgewogCiAvKgpAQCAtMTUxLDYgKzE1NSwxMSBAQCBuYW1lc3Bh
Y2UgSlNDIHsKICAgICAgICAgUmVnaXN0ZXIqIG1fYnVmZmVyOwogICAgICAgICBSZWdpc3Rlciog
bV9tYXhVc2VkOwogCisjaWYgUExBVEZPUk0oU1lNQklBTikKKyAgICAgICAgLy8gQWxsb2NhdGVz
IGNvbnRpbmd1b3VzIGJsb2NrcyB3aXRoIGNvcnJlY3QgYWxpZ25tZW50IHJlcXVpcmVtZW50cwor
ICAgICAgICBXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yKiBtX2Jsb2NrQWxsb2NhdG9yOyAKKyNl
bmRpZgorCiAjaWYgSEFWRShWSVJUVUFMQUxMT0MpCiAgICAgICAgIFJlZ2lzdGVyKiBtX2NvbW1p
dEVuZDsKICNlbmRpZgpAQCAtMTU5LDcgKzE2OCwxMiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICB9
OwogCiAgICAgLy8gRklYTUU6IEFkZCBhIGdlbmVyaWMgZ2V0cGFnZXNpemUoKSB0byBXVEYsIHRo
ZW4gbW92ZSB0aGlzIGZ1bmN0aW9uIHRvIFdURiBhcyB3ZWxsLgorICAgIC8vIFRoaXMgaXMgc3Rp
bGwgYSBoYWNrIHRoYXQgc2hvdWxkIGJlIGZpeGVkIGxhdGVyLiBXZSBrbm93IHRoYXQgYSBTeW1i
aWFuIHBhZ2Ugc2l6ZSBpcyA0Sy4KKyNpZiBQTEFURk9STShTWU1CSUFOKQorICAgIGlubGluZSBi
b29sIGlzUGFnZUFsaWduZWQoc2l6ZV90IHNpemUpIHsgcmV0dXJuIHNpemUgIT0gMCAmJiBzaXpl
ICUgKDQgKiAxMDI0KSA9PSAwOyB9CisjZWxzZSAgICAKICAgICBpbmxpbmUgYm9vbCBpc1BhZ2VB
bGlnbmVkKHNpemVfdCBzaXplKSB7IHJldHVybiBzaXplICE9IDAgJiYgc2l6ZSAlICg4ICogMTAy
NCkgPT0gMDsgfQorI2VuZGlmCiAKICAgICBpbmxpbmUgUmVnaXN0ZXJGaWxlOjpSZWdpc3RlckZp
bGUoc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgbWF4R2xvYmFscykKICAgICAgICAgOiBtX251bUds
b2JhbHMoMCkKQEAgLTIwNSw2ICsyMTksMTQgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgICAg
ICBDUkFTSCgpOwogICAgICAgICB9CiAgICAgICAgIG1fY29tbWl0RW5kID0gcmVpbnRlcnByZXRf
Y2FzdDxSZWdpc3Rlcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fYnVmZmVyKSArIGNvbW1p
dHRlZFNpemUpOworICAgICNlbGlmIFBMQVRGT1JNKFNZTUJJQU4pCisgICAgICAgIC8vIEEgY29u
dmVuaWVuY2UgY2xhc3MgdG8gYWxsb2NhdGUgY29udGlndW91cyBibG9ja3MgZWZmaWNpZW50bHkK
KyAgICAgICAgbV9ibG9ja0FsbG9jYXRvciA9IG5ldyBXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9y
KGJ1ZmZlckxlbmd0aCwgNjQgKiAxMDI0KTsKKyAgICAgICAgbV9idWZmZXIgPSAoUmVnaXN0ZXIq
KShtX2Jsb2NrQWxsb2NhdG9yLT5idWZmZXIoKSk7CisgICAgICAgIAorICAgICAgICAvLyBzdGFy
dCBieSBjb21taXR0aW5nIGVub3VnaCBzcGFjZSB0byBob2xkIG1heEdsb2JhbHMKKyAgICAgICAg
dm9pZCogbmV3RW5kID0gKHZvaWQqKSgoaW50KW1fYnVmZmVyICsgKG1heEdsb2JhbHMgKiBzaXpl
b2YoUmVnaXN0ZXIpKSk7CisgICAgICAgIG1fYmxvY2tBbGxvY2F0b3ItPmdyb3cobmV3RW5kKTsK
ICAgICAjZWxzZSAKICAgICAgICAgLyogCiAgICAgICAgICAqIElmIG5laXRoZXIgTU1BUCBub3Ig
VklSVFVBTEFMTE9DIGFyZSBhdmFpbGFibGUgLSB1c2UgZmFzdE1hbGxvYyBpbnN0ZWFkLgpAQCAt
MjI3LDggKzI0OSwxMiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgaWYgKG5ld0VuZCA+PSBt
X2VuZCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgbV9lbmQgPSBuZXdFbmQ7Ci0gICAg
ICAgIGlmIChtX2VuZCA9PSBtX3N0YXJ0ICYmIChtX21heFVzZWQgLSBtX3N0YXJ0KSA+IG1heEV4
Y2Vzc0NhcGFjaXR5KQorICAgICAgICBpZiAobV9lbmQgPT0gbV9zdGFydCAmJiAobV9tYXhVc2Vk
IC0gbV9zdGFydCkgPiBtYXhFeGNlc3NDYXBhY2l0eSkgeworI2lmIFBMQVRGT1JNKFNZTUJJQU4p
CisgICAgICAgICAgICBtX2Jsb2NrQWxsb2NhdG9yLT5zaHJpbmsobmV3RW5kKTsKKyNlbmRpZiAK
ICAgICAgICAgICAgIHJlbGVhc2VFeGNlc3NDYXBhY2l0eSgpOworICAgICAgICB9CiAgICAgfQog
CiAgICAgaW5saW5lIGJvb2wgUmVnaXN0ZXJGaWxlOjpncm93KFJlZ2lzdGVyKiBuZXdFbmQpCkBA
IC0yNTQsNiArMjgwLDEwIEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICB9CiAjZW5kaWYKIAor
I2lmIFBMQVRGT1JNKFNZTUJJQU4pCisgICAgICAgIG1fYmxvY2tBbGxvY2F0b3ItPmdyb3coKHZv
aWQqKW5ld0VuZCk7CisjZW5kaWYKKwogICAgICAgICBpZiAobmV3RW5kID4gbV9tYXhVc2VkKQog
ICAgICAgICAgICAgbV9tYXhVc2VkID0gbmV3RW5kOwogCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93
dGYvc3ltYmlhbi9Db250aWdCbG9ja0FsbG9jYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3BwCShyZXZpc2lvbiAw
KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAg
ZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpZiBPUyhTWU1CSUFOKQorCisjaW5jbHVkZSA8UURlYnVnPgorI2lu
Y2x1ZGUgIkNvbnRpZ0Jsb2NrQWxsb2NhdG9yLmgiCisKK25hbWVzcGFjZSBXVEYgeworCisvKiog
RWZmaWNpZW50bHkgYWxsb2NhdGVzIGJsb2NrcyBvZiBzaXplIGJsb2NrU2l6ZSB3aXRoIGJsb2Nr
U2l6ZSBhbGlnbm1lbnQuIAorICogUHJpbWFyaWx5IGRlc2lnbmVkIGZvciBKU0MgUmVnaXN0ZXJG
aWxlJ3MgbmVlZHMuIAorICogTm90IHRocmVhZC1zYWZlLiAgICAKKyAqLworQ29udGlnQmxvY2tB
bGxvY2F0b3I6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yKFRVaW50MzIgcmVzZXJ2YXRpb25TaXplLCBU
VWludDMyIGJsb2NrU2l6ZSApCisgICAgOiBtX3Jlc2VydmVkKHJlc2VydmF0aW9uU2l6ZSksIAor
ICAgICAgbV9ibG9ja1NpemUoYmxvY2tTaXplKQoreworICAgICAvLyBHZXQgc3lzdGVtJ3MgcGFn
ZSBzaXplIHZhbHVlLgorICAgICBTWU1CSUFOX1BBR0VTSVpFKG1fcGFnZVNpemUpOyAKKyAgICAg
Ly8gV2Ugb25seSBhY2NlcHQgbXVsdGlwbGVzIG9mIHN5c3RlbSBwYWdlIHNpemUgZm9yIGJvdGgg
aW5pdGlhbCByZXNlcnZhdGlvbiBhbmQgdGhlIGFsaWdubWVudC9ibG9jayBzaXplCisgICAgIG1f
cmVzZXJ2ZWQgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG1fcmVzZXJ2ZWQsIG1fcGFnZVNp
emUpOworICAgICBfX0FTU0VSVF9BTFdBWVMoU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRShtX2Js
b2NrU2l6ZSwgbV9wYWdlU2l6ZSksIFVzZXI6OlBhbmljKF9MKCJDb250aWdCbG9ja0FsbG9jYXRv
cjEiKSwgS0VyckFyZ3VtZW50KSk7CisgICAgIAorICAgICAvLyBPcGVuIGEgU3ltYmlhbiBSQ2h1
bmssIGFuZCByZXNlcnZlIHJlcXVlc3RlZCB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgICAKKyAgICAg
Ly8gQW55IHRocmVhZCBpbiB0aGlzIHByb2Nlc3MgY2FuIG9wZXJhdGUgdGhpcyByY2h1bmsgZHVl
IHRvIEVPd25lclByb2Nlc3MgYWNjZXNzIHJpZ2h0cy4gCisgICAgIFRJbnQgcmV0ID0gbV9jaHVu
ay5DcmVhdGVEaXNjb25uZWN0ZWRMb2NhbCgwICwgMCwgKFRJbnQpbV9yZXNlcnZlZCAsIEVPd25l
clByb2Nlc3MpOyAgCisgICAgIGlmIChyZXQgIT0gS0Vyck5vbmUpIAorICAgICAgICAgVXNlcjo6
UGFuaWMoX0woIkNvbnRpZ0Jsb2NrQWxsb2NhdG9yMiIpLCByZXQpOworICAgICAgIAorICAgICAv
LyBUaGlzIGlzIHRoZSBvZmZzZXQgdG8gbV9jaHVuay5CYXNlKCkgcmVxdWlyZWQgdG8gbWFrZSBp
dCBtX2Jsb2NrU2l6ZS1hbGlnbmVkCisgICAgIG1fb2Zmc2V0ID0gU1lNQklBTl9ST1VORFVQVE9N
VUxUSVBMRShUVWludDMyKG1fY2h1bmsuQmFzZSgpKSwgbV9ibG9ja1NpemUpIC0gVFVpbnQobV9j
aHVuay5CYXNlKCkpOworCisgICAgIHFEZWJ1ZygiQ0JBOjpDQkEoKSBoYW5kbGU9JWQsIHJlc2Vy
dmVkPSVkLCBibG9ja3NpemU9JWQiLAorICAgICAgICAgICAgIG1fY2h1bmsuSGFuZGxlKCksIG1f
cmVzZXJ2ZWQsIG1fYmxvY2tTaXplKTsgCisgICAgIHFEZWJ1ZygiQ0JBOjpDQkEoKSBiYXNlPSVk
LCBvZmZzZXQ9JWQiLCBtX2NodW5rLkJhc2UoKSwgbV9vZmZzZXQpOworfQorCitDb250aWdCbG9j
a0FsbG9jYXRvcjo6fkNvbnRpZ0Jsb2NrQWxsb2NhdG9yKCkKK3sKKyAgICAvLyByZWxlYXNlIGV2
ZXJ5dGhpbmchCisgICAgcURlYnVnKCJDQkE6On5DQkEoKSBkZXN0cm95aW5nIGV2ZXJ5dGhpbmch
Iik7CisgICAgbV9jaHVuay5EZWNvbW1pdCgwLCBtX2NodW5rLk1heFNpemUoKSk7CisgICAgbV9j
aHVuay5DbG9zZSgpOworfQorCit2b2lkKiBDb250aWdCbG9ja0FsbG9jYXRvcjo6YnVmZmVyKCkg
Y29uc3QKK3sKKyAgICB2b2lkKiBidWYgPSAodm9pZCopKFRVaW50KG1fY2h1bmsuQmFzZSgpKSAr
IG1fb2Zmc2V0KTsgCisgICAgcURlYnVnKCJDQkE6OmJ1ZmZlcigpIGJhc2U9JWQsIG9mZnNldD0l
ZCwgYnVmZmVyPSVkICIsIG1fY2h1bmsuQmFzZSgpLCBtX29mZnNldCwgYnVmKTsKKyAgICByZXR1
cm4gYnVmOworfQorCit2b2lkIENvbnRpZ0Jsb2NrQWxsb2NhdG9yOjpncm93KHZvaWQqIG5ld0Vu
ZCkKK3sKKyAgICBxRGVidWcoIkNCQTo6Z3JvdygpIG5ld0VuZD0lZCIsIG5ld0VuZCk7CisKKyAg
ICAvLyBmaW5kIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgY29tbWl0dGVkIGJsb2NrCisgICAgdm9p
ZCogY3VyRW5kID0gKHZvaWQqKShtX2NodW5rLkJhc2UoKSArIG1fb2Zmc2V0ICsgbV9jaHVuay5T
aXplKCkpOworICAgIC8vIGZpbmQgdGhlIGVuZCBvZiB0aGUgcmVzZXJ2ZWQgYmxvY2sKKyAgICB2
b2lkKiBtYXhFbmQgPSAodm9pZCopKG1fY2h1bmsuQmFzZSgpICsgbV9jaHVuay5NYXhTaXplKCkp
OworCisgICAgcURlYnVnKCJDQkE6Omdyb3coKSBiYXNlPSVkLCBvZmZzZXQ9JWQsIGNvbW1pdHRl
ZD0lZCwgY3VyRW5kPSVkLCBtYXhFbmQ9JWQiLAorICAgICAgICAgICAgbV9jaHVuay5CYXNlKCks
IG1fb2Zmc2V0LCBtX2NodW5rLlNpemUoKSwgY3VyRW5kLCBtYXhFbmQpOworICAgIAorICAgIGlm
IChuZXdFbmQgPiBtYXhFbmQpIHsKKyAgICAgICAgcURlYnVnKCJDQkE6Omdyb3coKSB0cnlpbmcg
dG8gY29tbWl0IG1vcmUgbWVtb3J5IHRoYW4gcmVzZXJ2ZWQiKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICAKKyAgICBpZiAobmV3RW5kID4gY3VyRW5kKSB7CisgICAgICAgIFRJbnQgbkJ5
dGVzID0gKFRJbnQpKG5ld0VuZCkgLSAoVEludCkoY3VyRW5kKTsKKyAgICAgICAgbkJ5dGVzID0g
U1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRShuQnl0ZXMsIG1fYmxvY2tTaXplKTsKKyAgICAgICAg
VEludCBvZmZzZXQgPSAoVEludCkoY3VyRW5kKSAtIChUSW50KW1fY2h1bmsuQmFzZSgpOworICAg
ICAgICBxRGVidWcoIkNCQTo6Z3JvdygpIENvbW1pdHRpbmcgJWQgYnl0ZXMgYXQgb2Zmc2V0ICVk
IiwgbkJ5dGVzLCBvZmZzZXQpOworICAgICAgICAKKyAgICAgICAgVEludCByZXQgPSBtX2NodW5r
LkNvbW1pdChvZmZzZXQsIG5CeXRlcyk7CisgICAgICAgIGlmIChyZXQgIT0gS0Vyck5vbmUpIHsg
CisgICAgICAgICAgICBxRGVidWcoIkNCQTo6Z3JvdygpIGZhaWxlZCEgQ29tbWl0OiAlZCIsIHJl
dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAv
LyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZy4KKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIGN1
cnJlbnQgZW5kIG9mIHRoZSBjb21taXR0ZWQgYmxvY2sKKyAgICAgICAgICAgIGN1ckVuZCA9ICh2
b2lkKikobV9jaHVuay5CYXNlKCkgKyBtX29mZnNldCArIG1fY2h1bmsuU2l6ZSgpKTsKKyAgICAg
ICAgICAgIC8vIGZpbmQgdGhlIG1heCBlbmQgb2YgdGhlIGNvbW1pdHRlZCBibG9jaworICAgICAg
ICAgICAgbWF4RW5kID0gKHZvaWQqKShtX2NodW5rLkJhc2UoKSArIG1fY2h1bmsuTWF4U2l6ZSgp
KTsKKyAgICAgICAgICAgIHFEZWJ1ZygiQ0JBOjpncm93KCkgc3VjY2VzcyEiKTsKKyAgICAgICAg
ICAgIHFEZWJ1ZygiQ0JBOjpncm93KCkgYmFzZT0lZCwgb2Zmc2V0PSVkLCBjb21taXR0ZWQ9JWQs
IGN1ckVuZD0lZCwgbWF4RW5kPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgbV9jaHVuay5CYXNl
KCksIG1fb2Zmc2V0LCBtX2NodW5rLlNpemUoKSwgY3VyRW5kLCBtYXhFbmQpOworICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIENvbnRpZ0Jsb2NrQWxsb2NhdG9yOjpzaHJpbmsodm9pZCogbmV3
RW5kKQoreworICAgIHFEZWJ1ZygiQ0JBOjpzaHJpbmsoKSBuZXdFbmQ9JWQiLCBuZXdFbmQpOwor
CisgICAgLy8gZmluZCB0aGUgY3VycmVudCBlbmQgb2YgdGhlIGNvbW1pdHRlZCBibG9jaworICAg
IHZvaWQqIGN1ckVuZCA9ICh2b2lkKikobV9jaHVuay5CYXNlKCkgKyBtX29mZnNldCArIG1fY2h1
bmsuU2l6ZSgpKTsKKyAgICAvLyBmaW5kIHRoZSBlbmQgb2YgdGhlIHJlc2VydmVkIGJsb2NrCisg
ICAgdm9pZCogbWF4RW5kID0gKHZvaWQqKShtX2NodW5rLkJhc2UoKSArIG1fY2h1bmsuTWF4U2l6
ZSgpKTsKKworICAgIHFEZWJ1ZygiQ0JBOjpzaHJpbmsoKSBiYXNlPSVkLCBvZmZzZXQ9JWQsIGNv
bW1pdHRlZD0lZCwgY3VyRW5kPSVkLCBtYXhFbmQ9JWQiLAorICAgICAgICAgICAgbV9jaHVuay5C
YXNlKCksIG1fb2Zmc2V0LCBtX2NodW5rLlNpemUoKSwgY3VyRW5kLCBtYXhFbmQpOworICAgIAor
ICAgIGlmIChuZXdFbmQgPCBjdXJFbmQpIHsKKyAgICAgICAgVEludCBuQnl0ZXMgPSAoVEludCko
bmV3RW5kKSAtIChUSW50KShjdXJFbmQpOworICAgICAgICBpZiAobkJ5dGVzIDwgbV9ibG9ja1Np
emUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBUSW50IG9mZnNldCA9
IFNZTUJJQU5fUk9VTkRVUFRPTVVMVElQTEUoKFRVaW50KW5ld0VuZCwgbV9ibG9ja1NpemUpIC0g
KFRJbnQpbV9jaHVuay5CYXNlKCk7CisgICAgICAgIG5CeXRlcyA9IChUSW50KWN1ckVuZCAtIG9m
ZnNldCAtIChUSW50KW1fY2h1bmsuQmFzZSgpOyAKKyAgICAgICAgCisgICAgICAgIGlmIChuQnl0
ZXMgPiAwKSB7CisgICAgICAgICAgICBxRGVidWcoIkNCQTo6c2hyaW5rKCkgRGVjb21taXR0aW5n
ICVkIGJ5dGVzIGF0IG9mZnNldCAlZCIsIG5CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgCisgICAg
ICAgICAgICBUSW50IHJldCA9IG1fY2h1bmsuRGVjb21taXQob2Zmc2V0LCBuQnl0ZXMpOworICAg
ICAgICAgICAgaWYgKHJldCAhPSBLRXJyTm9uZSkgeyAKKyAgICAgICAgICAgICAgICBxRGVidWco
IkNCQTo6c2hyaW5rKCkgZmFpbGVkISBEZWNvbW1pdDogJWQiLCByZXQpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhp
cyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcuCisgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgY3Vy
cmVudCBlbmQgb2YgdGhlIGNvbW1pdHRlZCBibG9jaworICAgICAgICAgICAgICAgIGN1ckVuZCA9
ICh2b2lkKikobV9jaHVuay5CYXNlKCkgKyBtX29mZnNldCArIG1fY2h1bmsuU2l6ZSgpKTsKKyAg
ICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBtYXggZW5kIG9mIHRoZSBjb21taXR0ZWQgYmxvY2sK
KyAgICAgICAgICAgICAgICBtYXhFbmQgPSAodm9pZCopKG1fY2h1bmsuQmFzZSgpICsgbV9jaHVu
ay5NYXhTaXplKCkpOworICAgICAgICAgICAgICAgIHFEZWJ1ZygiQ0JBOjpzaHJpbmsoKSBzdWNj
ZXNzISIpOworICAgICAgICAgICAgICAgIHFEZWJ1ZygiQ0JBOjpzaHJpbmsoKSBiYXNlPSVkLCBv
ZmZzZXQ9JWQsIGNvbW1pdHRlZD0lZCwgY3VyRW5kPSVkLCBtYXhFbmQ9JWQiLAorICAgICAgICAg
ICAgICAgICAgICAgICBtX2NodW5rLkJhc2UoKSwgbV9vZmZzZXQsIG1fY2h1bmsuU2l6ZSgpLCBj
dXJFbmQsIG1heEVuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30g
Ly8gZW5kIG9mIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gU1lNQklBTgoKUHJvcGVydHkgY2hhbmdl
cyBvbjogSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3Bw
Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL3d0Zi9zeW1iaWFuL0NvbnRpZ0Jsb2NrQWxsb2NhdG9yLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuaAkocmV2aXNp
b24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL0NvbnRpZ0Jsb2NrQWxsb2NhdG9y
LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBDT05USUdCTE9DS0FMTE9DQVRPUl9ICisjZGVmaW5lIENPTlRJR0JMT0NLQUxMT0NBVE9SX0gK
KworI2luY2x1ZGUgIlN5bWJpYW5EZWZpbmVzLmgiCisKK25hbWVzcGFjZSBXVEYgeworCisvKiog
CisgKiAgQWxsb2NhdGVzIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBzaXplIGJsb2NrU2l6ZSB3aXRo
IGJsb2NrU2l6ZS1hbGlnbmVkIGFkZHJlc3MuIAorICogIGJsb2NrU2l6ZSBtdXN0IGJlIGEgbXVs
dGlwbGUgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSAodHlwaWNhbGx5IDRLIG9uIFN5bWJpYW4vQVJNKQor
ICoKKyAqICBAcGFyYW0gcmVzZXJ2YXRpb25TaXplIFZpcnR1YWwgYWRkcmVzcyByYW5nZSB0byBi
ZSByZXNlcnZlZCB1cG9uIGNyZWF0aW9uIG9mIGNodW5rIChieXRlcykuCisgKiAgQHBhcmFtIGJs
b2NrU2l6ZSBTaXplIG9mIGEgc2luZ2xlIGFsbG9jYXRpb24uIFJldHVybmVkIGFkZHJlc3Mgd2ls
bCBhbHNvIGJlIGJsb2NrU2l6ZS1hbGlnbmVkLgorICovCitjbGFzcyBDb250aWdCbG9ja0FsbG9j
YXRvciB7CisgICAgcHVibGljOgorICAgICAgICBDb250aWdCbG9ja0FsbG9jYXRvcihUVWludDMy
IHJlc2VydmF0aW9uU2l6ZSwgVFVpbnQzMiBibG9ja1NpemUpOworICAgICAgICB+Q29udGlnQmxv
Y2tBbGxvY2F0b3IoKTsKKyAgICAgICAgdm9pZCogYnVmZmVyKCkgY29uc3Q7CisgICAgICAgIHZv
aWQgZ3Jvdyh2b2lkKiBuZXdFbmQpOworICAgICAgICB2b2lkIHNocmluayh2b2lkKiBuZXdFbmQp
OworICAgIAorICAgIHByaXZhdGU6IAorICAgICAgICBSQ2h1bmsgICBtX2NodW5rOyAvLyBTeW1i
aWFuIGNodW5rIHRoYXQgbGV0cyB1cyByZXNlcnZlL2NvbW1pdC9kZWNvbW1pdAorICAgICAgICAK
KyAgICAgICAgLy8gYWxsIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGluIG51bWJlcnMgb2YgYnl0ZXMK
KyAgICAgICAgVEludCAgICAgbV9wYWdlU2l6ZTsgICAvLyBjYWNoZWQgdmFsdWUgb2Ygc3lzdGVt
IHBhZ2Ugc2l6ZSwgdHlwaWNhbGx5IDRLIG9uIFN5bWJpYW4KKyAgICAgICAgVFVpbnQgICAgbV9v
ZmZzZXQ7ICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgYmxvY2sgZnJvbSBiYXNlCisgICAgICAgIFRV
aW50MzIgIG1fcmVzZXJ2ZWQ7ICAgLy8gdG90YWwgbnVtYmVyIG9mIHJlc2VydmVkIGJ5dGVzIGlu
IHZpcnR1YWwgbWVtb3J5CisgICAgICAgIFRVaW50MzIgIG1fYmxvY2tTaXplOyAgLy8gc2l6ZSBv
ZiBvbmUgbWVtb3J5IGJsb2NrLCBzZXQgYnkgZGVmYXVsdCB0byA2NEsgaW4gSlNDL2ludGVycHJl
dGVyL1JlZ2lzdGVyRmlsZS5oCisKK307CisKK30KKworI2VuZGlmIC8vIENPTlRJR0JMT0NLQUxM
T0NBVE9SX0gKKworCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBKYXZhU2NyaXB0Q29yZS93dGYvc3lt
Ymlhbi9Db250aWdCbG9ja0FsbG9jYXRvci5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRh
YmxlCiAgICsgKgoKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1N5bWJpYW5EZWZp
bmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vU3ltYmlhbkRl
ZmluZXMuaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1N5bWJp
YW5EZWZpbmVzLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDAgQEAKKy8qDQorICogQ29weXJp
Z2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVz
KQ0KKyAqDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQorICogYXJlIG1ldDoNCisgKg0K
KyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodA0KKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIA0KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlDQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIA0KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mDQorICog
ICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQNCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiANCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZDQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRA0KKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZDQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMNCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7DQorICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EDQorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YNCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KKyNpZm5kZWYgU1lNQklBTkRFRklORVNfSA0K
KyNkZWZpbmUgU1lNQklBTkRFRklORVNfSA0KKw0KKyNpbmNsdWRlIDxlMzJjbW4uaD4NCisjaW5j
bHVkZSA8ZTMyc3RkLmg+DQorI2luY2x1ZGUgPGhhbC5oPg0KKw0KKyNkZWZpbmUgU1lNQklBTl9Q
QUdFU0laRSh4KSAoSEFMOjpHZXQoSEFMRGF0YTo6RU1lbW9yeVBhZ2VTaXplLCB4KSk7DQorI2Rl
ZmluZSBTWU1CSUFOX0ZSRUVSQU0oeCkgIChIQUw6OkdldChIQUxEYXRhOjpFTWVtb3J5UkFNRnJl
ZSwgeCkpOw0KKyNkZWZpbmUgU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRSh4LCBtdWx0aXBsZW9m
KSAoICh4ICsgbXVsdGlwbGVvZiAtIDEpICYgfihtdWx0aXBsZW9mIC0gMSkgKQ0KKw0KKyNlbmRp
ZiAvLyBTWU1CSUFOREVGSU5FU19IDQoKUHJvcGVydHkgY2hhbmdlcyBvbjogSmF2YVNjcmlwdENv
cmUvd3RmL3N5bWJpYW4vU3ltYmlhbkRlZmluZXMuaApfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZXhl
Y3V0YWJsZQogICArICoKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56376</attachid>
            <date>2010-05-18 08:14:17 -0700</date>
            <delta_ts>2010-06-11 10:41:13 -0700</delta_ts>
            <desc>patch -- first take, style fixed</desc>
            <filename>bug-34349.patch</filename>
            <type>text/plain</type>
            <size>17193</size>
            <attacher name="Jay Tucker">jay.tucker</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU5NjY5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjkgQEAKKzIwMTAtMDUtMTggIFR1Y2tlciBK
YXkgIDxqYXkudHVja2VyQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbU3ltYmlhbl0gTGF6eSBjb21taXQgb2YgbWVtb3J5IHJlcXVp
cmVkIGluIEpTQyByZWdpc3RlciBmaWxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNDM0OQorCisgICAgICAgICogSmF2YVNjcmlwdENvcmUucHJvOiBB
ZGRlZCAxIG5ldyBTeW1iaWFuIHNvdXJjZSBmaWxlCisgICAgICAgICogaW50ZXJwcmV0ZXIvUmVn
aXN0ZXJGaWxlLmNwcDoKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjp+UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKiBpbnRlcnByZXRlci9SZWdpc3RlckZpbGUuaDoKKyAgICAgICAgKEpTQzo6
aXNQYWdlQWxpZ25lZCk6CisgICAgICAgIChKU0M6OlJlZ2lzdGVyRmlsZTo6UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjpzaHJpbmspOgorICAgICAgICAoSlNDOjpS
ZWdpc3RlckZpbGU6Omdyb3cpOgorICAgICAgICAqIHd0Zi9zeW1iaWFuL0NvbnRpZ0Jsb2NrQWxs
b2NhdG9yLmNwcDogQWRkZWQuCisgICAgICAgIChXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yOjpD
b250aWdCbG9ja0FsbG9jYXRvcik6CisgICAgICAgIEhlbHBlciBjbGFzcyB0byBhbGxvY2F0ZSBt
ZW1vcnkgcmVxdWlyZWQgYnkgUmVnaXN0ZXJGaWxlCisgICAgICAgIG1vcmUgZWZmaWNpZW50bHku
CisgICAgICAgIChXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yOjp+Q29udGlnQmxvY2tBbGxvY2F0
b3IpOgorICAgICAgICAoV1RGOjpDb250aWdCbG9ja0FsbG9jYXRvcjo6YnVmZmVyKToKKyAgICAg
ICAgKFdURjo6Q29udGlnQmxvY2tBbGxvY2F0b3I6Omdyb3cpOgorICAgICAgICAoV1RGOjpDb250
aWdCbG9ja0FsbG9jYXRvcjo6c2hyaW5rKToKKyAgICAgICAgKiB3dGYvc3ltYmlhbi9Db250aWdC
bG9ja0FsbG9jYXRvci5oOiBBZGRlZC4KKyAgICAgICAgKiB3dGYvc3ltYmlhbi9TeW1iaWFuRGVm
aW5lcy5oOiBBZGRlZC4KKwogMjAxMC0wNS0xNyAgR2F2aW4gQmFycmFjbG91Z2ggIDxiYXJyYWNs
b3VnaEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR2VvZmYgR2FyZW4uCkluZGV4
OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJvCShyZXZpc2lvbiA1OTY2OSkKKysrIEphdmFTY3Jp
cHRDb3JlL0phdmFTY3JpcHRDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtMjE0LDYgKzIxNCw3
IEBAIFNPVVJDRVMgKz0gXAogICAgIHd0Zi9SYW5kb21OdW1iZXIuY3BwIFwKICAgICB3dGYvUmVm
Q291bnRlZExlYWtDb3VudGVyLmNwcCBcCiAgICAgd3RmL3N5bWJpYW4vQmxvY2tBbGxvY2F0b3JT
eW1iaWFuLmNwcCBcCisgICAgd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3BwIFwK
ICAgICB3dGYvVGhyZWFkaW5nTm9uZS5jcHAgXAogICAgIHd0Zi9UaHJlYWRpbmcuY3BwIFwKICAg
ICB3dGYvVHlwZVRyYWl0cy5jcHAgXApJbmRleDogSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIv
UmVnaXN0ZXJGaWxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRl
ci9SZWdpc3RlckZpbGUuY3BwCShyZXZpc2lvbiA1OTY2OSkKKysrIEphdmFTY3JpcHRDb3JlL2lu
dGVycHJldGVyL1JlZ2lzdGVyRmlsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDgg
QEAgUmVnaXN0ZXJGaWxlOjp+UmVnaXN0ZXJGaWxlKCkKICAgICBWaXJ0dWFsRnJlZShtX2J1ZmZl
ciwgRFdPUkQobV9jb21taXRFbmQpIC0gRFdPUkQobV9idWZmZXIpLCBNRU1fREVDT01NSVQpOwog
I2VuZGlmCiAgICAgVmlydHVhbEZyZWUobV9idWZmZXIsIDAsIE1FTV9SRUxFQVNFKTsKKyNlbGlm
IFBMQVRGT1JNKFNZTUJJQU4pCisgICAgZGVsZXRlIG1fYmxvY2tBbGxvY2F0b3I7CiAjZWxzZQog
ICAgIGZhc3RGcmVlKG1fYnVmZmVyKTsKICNlbmRpZgpJbmRleDogSmF2YVNjcmlwdENvcmUvaW50
ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvaW50
ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmgJKHJldmlzaW9uIDU5NjY5KQorKysgSmF2YVNjcmlwdENv
cmUvaW50ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQy
LDEwIEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNlbmRpZgogCisjaWYgUExBVEZPUk0oU1lN
QklBTikKKyNpbmNsdWRlIDx3dGYvc3ltYmlhbi9Db250aWdCbG9ja0FsbG9jYXRvci5oPgorI2Vu
ZGlmCisKIG5hbWVzcGFjZSBKU0MgewogCiAvKgpAQCAtMTUxLDYgKzE1NSwxMSBAQCBuYW1lc3Bh
Y2UgSlNDIHsKICAgICAgICAgUmVnaXN0ZXIqIG1fYnVmZmVyOwogICAgICAgICBSZWdpc3Rlciog
bV9tYXhVc2VkOwogCisjaWYgUExBVEZPUk0oU1lNQklBTikKKyAgICAgICAgLy8gQWxsb2NhdGVz
IGNvbnRpbmd1b3VzIGJsb2NrcyB3aXRoIGNvcnJlY3QgYWxpZ25tZW50IHJlcXVpcmVtZW50cwor
ICAgICAgICBXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9yKiBtX2Jsb2NrQWxsb2NhdG9yOyAKKyNl
bmRpZgorCiAjaWYgSEFWRShWSVJUVUFMQUxMT0MpCiAgICAgICAgIFJlZ2lzdGVyKiBtX2NvbW1p
dEVuZDsKICNlbmRpZgpAQCAtMTU5LDcgKzE2OCwxMiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICB9
OwogCiAgICAgLy8gRklYTUU6IEFkZCBhIGdlbmVyaWMgZ2V0cGFnZXNpemUoKSB0byBXVEYsIHRo
ZW4gbW92ZSB0aGlzIGZ1bmN0aW9uIHRvIFdURiBhcyB3ZWxsLgorICAgIC8vIFRoaXMgaXMgc3Rp
bGwgYSBoYWNrIHRoYXQgc2hvdWxkIGJlIGZpeGVkIGxhdGVyLiBXZSBrbm93IHRoYXQgYSBTeW1i
aWFuIHBhZ2Ugc2l6ZSBpcyA0Sy4KKyNpZiBQTEFURk9STShTWU1CSUFOKQorICAgIGlubGluZSBi
b29sIGlzUGFnZUFsaWduZWQoc2l6ZV90IHNpemUpIHsgcmV0dXJuIHNpemUgIT0gMCAmJiBzaXpl
ICUgKDQgKiAxMDI0KSA9PSAwOyB9CisjZWxzZSAgICAKICAgICBpbmxpbmUgYm9vbCBpc1BhZ2VB
bGlnbmVkKHNpemVfdCBzaXplKSB7IHJldHVybiBzaXplICE9IDAgJiYgc2l6ZSAlICg4ICogMTAy
NCkgPT0gMDsgfQorI2VuZGlmCiAKICAgICBpbmxpbmUgUmVnaXN0ZXJGaWxlOjpSZWdpc3RlckZp
bGUoc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgbWF4R2xvYmFscykKICAgICAgICAgOiBtX251bUds
b2JhbHMoMCkKQEAgLTIwNSw2ICsyMTksMTQgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgICAg
ICBDUkFTSCgpOwogICAgICAgICB9CiAgICAgICAgIG1fY29tbWl0RW5kID0gcmVpbnRlcnByZXRf
Y2FzdDxSZWdpc3Rlcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fYnVmZmVyKSArIGNvbW1p
dHRlZFNpemUpOworICAgICNlbGlmIFBMQVRGT1JNKFNZTUJJQU4pCisgICAgICAgIC8vIEEgY29u
dmVuaWVuY2UgY2xhc3MgdG8gYWxsb2NhdGUgY29udGlndW91cyBibG9ja3MgZWZmaWNpZW50bHkK
KyAgICAgICAgbV9ibG9ja0FsbG9jYXRvciA9IG5ldyBXVEY6OkNvbnRpZ0Jsb2NrQWxsb2NhdG9y
KGJ1ZmZlckxlbmd0aCwgNjQgKiAxMDI0KTsKKyAgICAgICAgbV9idWZmZXIgPSAoUmVnaXN0ZXIq
KShtX2Jsb2NrQWxsb2NhdG9yLT5idWZmZXIoKSk7CisgICAgICAgIAorICAgICAgICAvLyBzdGFy
dCBieSBjb21taXR0aW5nIGVub3VnaCBzcGFjZSB0byBob2xkIG1heEdsb2JhbHMKKyAgICAgICAg
dm9pZCogbmV3RW5kID0gKHZvaWQqKSgoaW50KW1fYnVmZmVyICsgKG1heEdsb2JhbHMgKiBzaXpl
b2YoUmVnaXN0ZXIpKSk7CisgICAgICAgIG1fYmxvY2tBbGxvY2F0b3ItPmdyb3cobmV3RW5kKTsK
ICAgICAjZWxzZSAKICAgICAgICAgLyogCiAgICAgICAgICAqIElmIG5laXRoZXIgTU1BUCBub3Ig
VklSVFVBTEFMTE9DIGFyZSBhdmFpbGFibGUgLSB1c2UgZmFzdE1hbGxvYyBpbnN0ZWFkLgpAQCAt
MjI3LDggKzI0OSwxMiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgaWYgKG5ld0VuZCA+PSBt
X2VuZCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgbV9lbmQgPSBuZXdFbmQ7Ci0gICAg
ICAgIGlmIChtX2VuZCA9PSBtX3N0YXJ0ICYmIChtX21heFVzZWQgLSBtX3N0YXJ0KSA+IG1heEV4
Y2Vzc0NhcGFjaXR5KQorICAgICAgICBpZiAobV9lbmQgPT0gbV9zdGFydCAmJiAobV9tYXhVc2Vk
IC0gbV9zdGFydCkgPiBtYXhFeGNlc3NDYXBhY2l0eSkgeworI2lmIFBMQVRGT1JNKFNZTUJJQU4p
CisgICAgICAgICAgICBtX2Jsb2NrQWxsb2NhdG9yLT5zaHJpbmsobmV3RW5kKTsKKyNlbmRpZiAK
ICAgICAgICAgICAgIHJlbGVhc2VFeGNlc3NDYXBhY2l0eSgpOworICAgICAgICB9CiAgICAgfQog
CiAgICAgaW5saW5lIGJvb2wgUmVnaXN0ZXJGaWxlOjpncm93KFJlZ2lzdGVyKiBuZXdFbmQpCkBA
IC0yNTQsNiArMjgwLDEwIEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICB9CiAjZW5kaWYKIAor
I2lmIFBMQVRGT1JNKFNZTUJJQU4pCisgICAgICAgIG1fYmxvY2tBbGxvY2F0b3ItPmdyb3coKHZv
aWQqKW5ld0VuZCk7CisjZW5kaWYKKwogICAgICAgICBpZiAobmV3RW5kID4gbV9tYXhVc2VkKQog
ICAgICAgICAgICAgbV9tYXhVc2VkID0gbmV3RW5kOwogCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93
dGYvc3ltYmlhbi9Db250aWdCbG9ja0FsbG9jYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3BwCShyZXZpc2lvbiAw
KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0b3IuY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAg
ZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpZiBPUyhTWU1CSUFOKQorCisjaW5jbHVkZSAiQ29udGlnQmxvY2tB
bGxvY2F0b3IuaCIKKworI2luY2x1ZGUgPFFEZWJ1Zz4KKworbmFtZXNwYWNlIFdURiB7CisKKy8q
KiBFZmZpY2llbnRseSBhbGxvY2F0ZXMgYmxvY2tzIG9mIHNpemUgYmxvY2tTaXplIHdpdGggYmxv
Y2tTaXplIGFsaWdubWVudC4gCisgKiBQcmltYXJpbHkgZGVzaWduZWQgZm9yIEpTQyBSZWdpc3Rl
ckZpbGUncyBuZWVkcy4gCisgKiBOb3QgdGhyZWFkLXNhZmUuICAgIAorICovCitDb250aWdCbG9j
a0FsbG9jYXRvcjo6Q29udGlnQmxvY2tBbGxvY2F0b3IoVFVpbnQzMiByZXNlcnZhdGlvblNpemUs
IFRVaW50MzIgYmxvY2tTaXplICkKKyAgICA6IG1fcmVzZXJ2ZWQocmVzZXJ2YXRpb25TaXplKSwg
CisgICAgICBtX2Jsb2NrU2l6ZShibG9ja1NpemUpCit7CisgICAgIC8vIEdldCBzeXN0ZW0ncyBw
YWdlIHNpemUgdmFsdWUuCisgICAgIFNZTUJJQU5fUEFHRVNJWkUobV9wYWdlU2l6ZSk7IAorICAg
ICAvLyBXZSBvbmx5IGFjY2VwdCBtdWx0aXBsZXMgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSBmb3IgYm90
aCBpbml0aWFsIHJlc2VydmF0aW9uIGFuZCB0aGUgYWxpZ25tZW50L2Jsb2NrIHNpemUKKyAgICAg
bV9yZXNlcnZlZCA9IFNZTUJJQU5fUk9VTkRVUFRPTVVMVElQTEUobV9yZXNlcnZlZCwgbV9wYWdl
U2l6ZSk7CisgICAgIF9fQVNTRVJUX0FMV0FZUyhTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG1f
YmxvY2tTaXplLCBtX3BhZ2VTaXplKSwgVXNlcjo6UGFuaWMoX0woIkNvbnRpZ0Jsb2NrQWxsb2Nh
dG9yMSIpLCBLRXJyQXJndW1lbnQpKTsKKyAgICAgCisgICAgIC8vIE9wZW4gYSBTeW1iaWFuIFJD
aHVuaywgYW5kIHJlc2VydmUgcmVxdWVzdGVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZSAgIAorICAg
ICAvLyBBbnkgdGhyZWFkIGluIHRoaXMgcHJvY2VzcyBjYW4gb3BlcmF0ZSB0aGlzIHJjaHVuayBk
dWUgdG8gRU93bmVyUHJvY2VzcyBhY2Nlc3MgcmlnaHRzLiAKKyAgICAgVEludCByZXQgPSBtX2No
dW5rLkNyZWF0ZURpc2Nvbm5lY3RlZExvY2FsKDAgLCAwLCAoVEludCltX3Jlc2VydmVkICwgRU93
bmVyUHJvY2Vzcyk7ICAKKyAgICAgaWYgKHJldCAhPSBLRXJyTm9uZSkgCisgICAgICAgICBVc2Vy
OjpQYW5pYyhfTCgiQ29udGlnQmxvY2tBbGxvY2F0b3IyIiksIHJldCk7CisgICAgICAgCisgICAg
IC8vIFRoaXMgaXMgdGhlIG9mZnNldCB0byBtX2NodW5rLkJhc2UoKSByZXF1aXJlZCB0byBtYWtl
IGl0IG1fYmxvY2tTaXplLWFsaWduZWQKKyAgICAgbV9vZmZzZXQgPSBTWU1CSUFOX1JPVU5EVVBU
T01VTFRJUExFKFRVaW50MzIobV9jaHVuay5CYXNlKCkpLCBtX2Jsb2NrU2l6ZSkgLSBUVWludCht
X2NodW5rLkJhc2UoKSk7CisKKyAgICAgcURlYnVnKCJDQkE6OkNCQSgpIGhhbmRsZT0lZCwgcmVz
ZXJ2ZWQ9JWQsIGJsb2Nrc2l6ZT0lZCIsCisgICAgICAgICAgICAgbV9jaHVuay5IYW5kbGUoKSwg
bV9yZXNlcnZlZCwgbV9ibG9ja1NpemUpOyAKKyAgICAgcURlYnVnKCJDQkE6OkNCQSgpIGJhc2U9
JWQsIG9mZnNldD0lZCIsIG1fY2h1bmsuQmFzZSgpLCBtX29mZnNldCk7Cit9CisKK0NvbnRpZ0Js
b2NrQWxsb2NhdG9yOjp+Q29udGlnQmxvY2tBbGxvY2F0b3IoKQoreworICAgIC8vIHJlbGVhc2Ug
ZXZlcnl0aGluZyEKKyAgICBxRGVidWcoIkNCQTo6fkNCQSgpIGRlc3Ryb3lpbmcgZXZlcnl0aGlu
ZyEiKTsKKyAgICBtX2NodW5rLkRlY29tbWl0KDAsIG1fY2h1bmsuTWF4U2l6ZSgpKTsKKyAgICBt
X2NodW5rLkNsb3NlKCk7Cit9CisKK3ZvaWQqIENvbnRpZ0Jsb2NrQWxsb2NhdG9yOjpidWZmZXIo
KSBjb25zdAoreworICAgIHZvaWQqIGJ1ZiA9ICh2b2lkKikoVFVpbnQobV9jaHVuay5CYXNlKCkp
ICsgbV9vZmZzZXQpOyAKKyAgICBxRGVidWcoIkNCQTo6YnVmZmVyKCkgYmFzZT0lZCwgb2Zmc2V0
PSVkLCBidWZmZXI9JWQgIiwgbV9jaHVuay5CYXNlKCksIG1fb2Zmc2V0LCBidWYpOworICAgIHJl
dHVybiBidWY7Cit9CisKK3ZvaWQgQ29udGlnQmxvY2tBbGxvY2F0b3I6Omdyb3codm9pZCogbmV3
RW5kKQoreworICAgIHFEZWJ1ZygiQ0JBOjpncm93KCkgbmV3RW5kPSVkIiwgbmV3RW5kKTsKKwor
ICAgIC8vIGZpbmQgdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBjb21taXR0ZWQgYmxvY2sKKyAgICB2
b2lkKiBjdXJFbmQgPSAodm9pZCopKG1fY2h1bmsuQmFzZSgpICsgbV9vZmZzZXQgKyBtX2NodW5r
LlNpemUoKSk7CisgICAgLy8gZmluZCB0aGUgZW5kIG9mIHRoZSByZXNlcnZlZCBibG9jaworICAg
IHZvaWQqIG1heEVuZCA9ICh2b2lkKikobV9jaHVuay5CYXNlKCkgKyBtX2NodW5rLk1heFNpemUo
KSk7CisKKyAgICBxRGVidWcoIkNCQTo6Z3JvdygpIGJhc2U9JWQsIG9mZnNldD0lZCwgY29tbWl0
dGVkPSVkLCBjdXJFbmQ9JWQsIG1heEVuZD0lZCIsCisgICAgICAgICAgICBtX2NodW5rLkJhc2Uo
KSwgbV9vZmZzZXQsIG1fY2h1bmsuU2l6ZSgpLCBjdXJFbmQsIG1heEVuZCk7CisgICAgCisgICAg
aWYgKG5ld0VuZCA+IG1heEVuZCkgeworICAgICAgICBxRGVidWcoIkNCQTo6Z3JvdygpIHRyeWlu
ZyB0byBjb21taXQgbW9yZSBtZW1vcnkgdGhhbiByZXNlcnZlZCIpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIAorICAgIGlmIChuZXdFbmQgPiBjdXJFbmQpIHsKKyAgICAgICAgVEludCBu
Qnl0ZXMgPSAoVEludCkobmV3RW5kKSAtIChUSW50KShjdXJFbmQpOworICAgICAgICBuQnl0ZXMg
PSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG5CeXRlcywgbV9ibG9ja1NpemUpOworICAgICAg
ICBUSW50IG9mZnNldCA9IChUSW50KShjdXJFbmQpIC0gKFRJbnQpbV9jaHVuay5CYXNlKCk7Cisg
ICAgICAgIHFEZWJ1ZygiQ0JBOjpncm93KCkgQ29tbWl0dGluZyAlZCBieXRlcyBhdCBvZmZzZXQg
JWQiLCBuQnl0ZXMsIG9mZnNldCk7CisgICAgICAgIAorICAgICAgICBUSW50IHJldCA9IG1fY2h1
bmsuQ29tbWl0KG9mZnNldCwgbkJ5dGVzKTsKKyAgICAgICAgaWYgKHJldCAhPSBLRXJyTm9uZSkK
KyAgICAgICAgICAgIHFEZWJ1ZygiQ0JBOjpncm93KCkgZmFpbGVkISBDb21taXQ6ICVkIiwgcmV0
KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGlnQmxvY2tBbGxvY2F0b3I6OnNocmluayh2b2lkKiBu
ZXdFbmQpCit7CisgICAgcURlYnVnKCJDQkE6OnNocmluaygpIG5ld0VuZD0lZCIsIG5ld0VuZCk7
CisKKyAgICAvLyBmaW5kIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgY29tbWl0dGVkIGJsb2NrCisg
ICAgdm9pZCogY3VyRW5kID0gKHZvaWQqKShtX2NodW5rLkJhc2UoKSArIG1fb2Zmc2V0ICsgbV9j
aHVuay5TaXplKCkpOworICAgIC8vIGZpbmQgdGhlIGVuZCBvZiB0aGUgcmVzZXJ2ZWQgYmxvY2sK
KyAgICB2b2lkKiBtYXhFbmQgPSAodm9pZCopKG1fY2h1bmsuQmFzZSgpICsgbV9jaHVuay5NYXhT
aXplKCkpOworCisgICAgcURlYnVnKCJDQkE6OnNocmluaygpIGJhc2U9JWQsIG9mZnNldD0lZCwg
Y29tbWl0dGVkPSVkLCBjdXJFbmQ9JWQsIG1heEVuZD0lZCIsCisgICAgICAgICAgICBtX2NodW5r
LkJhc2UoKSwgbV9vZmZzZXQsIG1fY2h1bmsuU2l6ZSgpLCBjdXJFbmQsIG1heEVuZCk7CisgICAg
CisgICAgaWYgKG5ld0VuZCA8IGN1ckVuZCkgeworICAgICAgICBUSW50IG5CeXRlcyA9IChUSW50
KShuZXdFbmQpIC0gKFRJbnQpKGN1ckVuZCk7CisgICAgICAgIGlmIChuQnl0ZXMgPCBtX2Jsb2Nr
U2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIFRJbnQgb2Zmc2V0
ID0gU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRSgoVFVpbnQpbmV3RW5kLCBtX2Jsb2NrU2l6ZSkg
LSAoVEludCltX2NodW5rLkJhc2UoKTsKKyAgICAgICAgbkJ5dGVzID0gKFRJbnQpY3VyRW5kIC0g
b2Zmc2V0IC0gKFRJbnQpbV9jaHVuay5CYXNlKCk7IAorICAgICAgICAKKyAgICAgICAgaWYgKG5C
eXRlcyA+IDApIHsKKyAgICAgICAgICAgIHFEZWJ1ZygiQ0JBOjpzaHJpbmsoKSBEZWNvbW1pdHRp
bmcgJWQgYnl0ZXMgYXQgb2Zmc2V0ICVkIiwgbkJ5dGVzLCBvZmZzZXQpOworICAgICAgICAKKyAg
ICAgICAgICAgIFRJbnQgcmV0ID0gbV9jaHVuay5EZWNvbW1pdChvZmZzZXQsIG5CeXRlcyk7Cisg
ICAgICAgICAgICBpZiAocmV0ICE9IEtFcnJOb25lKQorICAgICAgICAgICAgICAgIHFEZWJ1Zygi
Q0JBOjpzaHJpbmsoKSBmYWlsZWQhIERlY29tbWl0OiAlZCIsIHJldCk7CisgICAgICAgIH0KKyAg
ICB9Cit9CisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gU1lNQklBTgoKUHJv
cGVydHkgY2hhbmdlcyBvbjogSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tB
bGxvY2F0b3IuY3BwCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL0NvbnRpZ0Jsb2NrQWxsb2NhdG9yLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vQ29udGlnQmxvY2tBbGxvY2F0
b3IuaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL0NvbnRpZ0Js
b2NrQWxsb2NhdG9yLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1p
ZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBDb250aWdCbG9ja0FsbG9jYXRvcl9oCisjZGVmaW5lIENvbnRpZ0Jsb2Nr
QWxsb2NhdG9yX2gKKworI2luY2x1ZGUgIlN5bWJpYW5EZWZpbmVzLmgiCisKK25hbWVzcGFjZSBX
VEYgeworCisvKiogCisgKiAgQWxsb2NhdGVzIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBzaXplIGJs
b2NrU2l6ZSB3aXRoIGJsb2NrU2l6ZS1hbGlnbmVkIGFkZHJlc3MuIAorICogIGJsb2NrU2l6ZSBt
dXN0IGJlIGEgbXVsdGlwbGUgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSAodHlwaWNhbGx5IDRLIG9uIFN5
bWJpYW4vQVJNKQorICoKKyAqICBAcGFyYW0gcmVzZXJ2YXRpb25TaXplIFZpcnR1YWwgYWRkcmVz
cyByYW5nZSB0byBiZSByZXNlcnZlZCB1cG9uIGNyZWF0aW9uIG9mIGNodW5rIChieXRlcykuCisg
KiAgQHBhcmFtIGJsb2NrU2l6ZSBTaXplIG9mIGEgc2luZ2xlIGFsbG9jYXRpb24uIFJldHVybmVk
IGFkZHJlc3Mgd2lsbCBhbHNvIGJlIGJsb2NrU2l6ZS1hbGlnbmVkLgorICovCitjbGFzcyBDb250
aWdCbG9ja0FsbG9jYXRvciB7CisgICAgcHVibGljOgorICAgICAgICBDb250aWdCbG9ja0FsbG9j
YXRvcihUVWludDMyIHJlc2VydmF0aW9uU2l6ZSwgVFVpbnQzMiBibG9ja1NpemUpOworICAgICAg
ICB+Q29udGlnQmxvY2tBbGxvY2F0b3IoKTsKKyAgICAgICAgdm9pZCogYnVmZmVyKCkgY29uc3Q7
CisgICAgICAgIHZvaWQgZ3Jvdyh2b2lkKiBuZXdFbmQpOworICAgICAgICB2b2lkIHNocmluayh2
b2lkKiBuZXdFbmQpOworICAgIAorICAgIHByaXZhdGU6IAorICAgICAgICBSQ2h1bmsgICBtX2No
dW5rOyAvLyBTeW1iaWFuIGNodW5rIHRoYXQgbGV0cyB1cyByZXNlcnZlL2NvbW1pdC9kZWNvbW1p
dAorICAgICAgICAKKyAgICAgICAgLy8gYWxsIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGluIG51bWJl
cnMgb2YgYnl0ZXMKKyAgICAgICAgVEludCAgICAgbV9wYWdlU2l6ZTsgLy8gY2FjaGVkIHZhbHVl
IG9mIHN5c3RlbSBwYWdlIHNpemUsIHR5cGljYWxseSA0SyBvbiBTeW1iaWFuCisgICAgICAgIFRV
aW50ICAgIG1fb2Zmc2V0OyAvLyBvZmZzZXQgb2YgZmlyc3QgYmxvY2sgZnJvbSBiYXNlCisgICAg
ICAgIFRVaW50MzIgIG1fcmVzZXJ2ZWQ7IC8vIHRvdGFsIG51bWJlciBvZiByZXNlcnZlZCBieXRl
cyBpbiB2aXJ0dWFsIG1lbW9yeQorICAgICAgICBUVWludDMyICBtX2Jsb2NrU2l6ZTsgLy8gc2l6
ZSBvZiBvbmUgbWVtb3J5IGJsb2NrLCBzZXQgYnkgZGVmYXVsdCB0byA2NEsgaW4gSlNDL2ludGVy
cHJldGVyL1JlZ2lzdGVyRmlsZS5oCisKK307CisKK30KKworI2VuZGlmIC8vIENvbnRpZ0Jsb2Nr
QWxsb2NhdG9yX2gKKworCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBKYXZhU2NyaXB0Q29yZS93dGYv
c3ltYmlhbi9Db250aWdCbG9ja0FsbG9jYXRvci5oCl9fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVj
dXRhYmxlCiAgICsgKgoKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1N5bWJpYW5E
ZWZpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vU3ltYmlh
bkRlZmluZXMuaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1N5
bWJpYW5EZWZpbmVzLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1p
ZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBTeW1iaWFuRGVmaW5lc19oCisjZGVmaW5lIFN5bWJpYW5EZWZpbmVzX2gK
KworI2luY2x1ZGUgPGUzMmNtbi5oPgorI2luY2x1ZGUgPGUzMnN0ZC5oPgorI2luY2x1ZGUgPGhh
bC5oPgorCisjZGVmaW5lIFNZTUJJQU5fUEFHRVNJWkUoeCkgKEhBTDo6R2V0KEhBTERhdGE6OkVN
ZW1vcnlQYWdlU2l6ZSwgeCkpOworI2RlZmluZSBTWU1CSUFOX0ZSRUVSQU0oeCkgIChIQUw6Okdl
dChIQUxEYXRhOjpFTWVtb3J5UkFNRnJlZSwgeCkpOworI2RlZmluZSBTWU1CSUFOX1JPVU5EVVBU
T01VTFRJUExFKHgsIG11bHRpcGxlb2YpICggKHggKyBtdWx0aXBsZW9mIC0gMSkgJiB+KG11bHRp
cGxlb2YgLSAxKSApCisKKyNlbmRpZiAvLyBTeW1iaWFuRGVmaW5lc19oCgpQcm9wZXJ0eSBjaGFu
Z2VzIG9uOiBKYXZhU2NyaXB0Q29yZS93dGYvc3ltYmlhbi9TeW1iaWFuRGVmaW5lcy5oCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoK
</data>
<flag name="review"
          id="40777"
          type_id="1"
          status="-"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58485</attachid>
            <date>2010-06-11 10:41:13 -0700</date>
            <delta_ts>2010-06-18 08:24:12 -0700</delta_ts>
            <desc>revised patch</desc>
            <filename>bug-34349.patch</filename>
            <type>text/plain</type>
            <size>18185</size>
            <attacher name="Jay Tucker">jay.tucker</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDYxMDI0KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjkgQEAKKzIwMTAtMDYtMTEgIFR1Y2tlciBK
YXkgIDxqYXkudHVja2VyQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbU3ltYmlhbl0gTGF6eSBjb21taXQgb2YgbWVtb3J5IHJlcXVp
cmVkIGluIEpTQyByZWdpc3RlciBmaWxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNDM0OQorCisgICAgICAgICogSmF2YVNjcmlwdENvcmUucHJvOiBB
ZGRlZCAxIG5ldyBTeW1iaWFuIHNvdXJjZSBmaWxlCisgICAgICAgICogaW50ZXJwcmV0ZXIvUmVn
aXN0ZXJGaWxlLmNwcDoKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjp+UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKiBpbnRlcnByZXRlci9SZWdpc3RlckZpbGUuaDoKKyAgICAgICAgKEpTQzo6
aXNQYWdlQWxpZ25lZCk6CisgICAgICAgIChKU0M6OlJlZ2lzdGVyRmlsZTo6UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjpzaHJpbmspOgorICAgICAgICAoSlNDOjpS
ZWdpc3RlckZpbGU6Omdyb3cpOgorICAgICAgICAqIHd0Zi9zeW1iaWFuL1JlZ2lzdGVyRmlsZUFs
bG9jYXRvclN5bWJpYW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdURjo6UmVnaXN0ZXJGaWxlQWxs
b2NhdG9yOjpSZWdpc3RlckZpbGVBbGxvY2F0b3IpOgorICAgICAgICBIZWxwZXIgY2xhc3MgdG8g
YWxsb2NhdGUgbWVtb3J5IHJlcXVpcmVkIGJ5IFJlZ2lzdGVyRmlsZQorICAgICAgICBtb3JlIGVm
ZmljaWVudGx5LgorICAgICAgICAoV1RGOjpSZWdpc3RlckZpbGVBbGxvY2F0b3I6On5SZWdpc3Rl
ckZpbGVBbGxvY2F0b3IpOgorICAgICAgICAoV1RGOjpSZWdpc3RlckZpbGVBbGxvY2F0b3I6OmJ1
ZmZlcik6CisgICAgICAgIChXVEY6OlJlZ2lzdGVyRmlsZUFsbG9jYXRvcjo6Z3Jvdyk6CisgICAg
ICAgIChXVEY6OlJlZ2lzdGVyRmlsZUFsbG9jYXRvcjo6c2hyaW5rKToKKyAgICAgICAgKiB3dGYv
c3ltYmlhbi9SZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuLmg6IEFkZGVkLgorICAgICAgICAq
IHd0Zi9zeW1iaWFuL1N5bWJpYW5EZWZpbmVzLmg6IEFkZGVkLgorCiAyMDEwLTA2LTExICBKZWRy
emVqIE5vd2Fja2kgIDxqZWRyemVqLm5vd2Fja2lAbm9raWEuY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENv
cmUucHJvCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnBybwko
cmV2aXNpb24gNjEwMjQpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8JKHdv
cmtpbmcgY29weSkKQEAgLTIxNiw2ICsyMTYsNyBAQCBTT1VSQ0VTICs9IFwKICAgICB3dGYvUmFu
ZG9tTnVtYmVyLmNwcCBcCiAgICAgd3RmL1JlZkNvdW50ZWRMZWFrQ291bnRlci5jcHAgXAogICAg
IHd0Zi9zeW1iaWFuL0Jsb2NrQWxsb2NhdG9yU3ltYmlhbi5jcHAgXAorICAgIHd0Zi9zeW1iaWFu
L1JlZ2lzdGVyRmlsZUFsbG9jYXRvclN5bWJpYW4uY3BwIFwKICAgICB3dGYvVGhyZWFkaW5nTm9u
ZS5jcHAgXAogICAgIHd0Zi9UaHJlYWRpbmcuY3BwIFwKICAgICB3dGYvVHlwZVRyYWl0cy5jcHAg
XApJbmRleDogSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9SZWdpc3RlckZpbGUuY3BwCShy
ZXZpc2lvbiA2MTAyNCkKKysrIEphdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL1JlZ2lzdGVyRmls
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDggQEAgUmVnaXN0ZXJGaWxlOjp+UmVn
aXN0ZXJGaWxlKCkKICAgICBWaXJ0dWFsRnJlZShtX2J1ZmZlciwgRFdPUkQobV9jb21taXRFbmQp
IC0gRFdPUkQobV9idWZmZXIpLCBNRU1fREVDT01NSVQpOwogI2VuZGlmCiAgICAgVmlydHVhbEZy
ZWUobV9idWZmZXIsIDAsIE1FTV9SRUxFQVNFKTsKKyNlbGlmIE9TKFNZTUJJQU4pCisgICAgZGVs
ZXRlIG1fcmVnaXN0ZXJGaWxlQWxsb2NhdG9yOwogI2Vsc2UKICAgICBmYXN0RnJlZShtX2J1ZmZl
cik7CiAjZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL1JlZ2lzdGVyRmls
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL1JlZ2lzdGVyRmls
ZS5oCShyZXZpc2lvbiA2MTAyNCkKKysrIEphdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL1JlZ2lz
dGVyRmlsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2ICs0MiwxMCBAQAogI2luY2x1ZGUgPHN5
cy9tbWFuLmg+CiAjZW5kaWYKIAorI2lmIE9TKFNZTUJJQU4pCisjaW5jbHVkZSA8d3RmL3N5bWJp
YW4vUmVnaXN0ZXJGaWxlQWxsb2NhdG9yU3ltYmlhbi5oPgorI2VuZGlmCisKIG5hbWVzcGFjZSBK
U0MgewogCiAvKgpAQCAtMTUyLDExICsxNTYsMjEgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAg
IFJlZ2lzdGVyKiBtX2NvbW1pdEVuZDsKICNlbmRpZgogCisjaWYgT1MoU1lNQklBTikKKyAgICAg
ICAgLy8gQWxsb2NhdGVzIGNvbnRpbmd1b3VzIGJsb2NrcyB3aXRoIGNvcnJlY3QgYWxpZ25tZW50
IHJlcXVpcmVtZW50cworICAgICAgICBXVEY6OlJlZ2lzdGVyRmlsZUFsbG9jYXRvciogbV9yZWdp
c3RlckZpbGVBbGxvY2F0b3I7IAorI2VuZGlmCisKICAgICAgICAgV2Vha0dDUHRyPEpTR2xvYmFs
T2JqZWN0PiBtX2dsb2JhbE9iamVjdDsgLy8gVGhlIGdsb2JhbCBvYmplY3Qgd2hvc2UgdmFycyBh
cmUgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgZmlsZS4KICAgICB9OwogCiAgICAg
Ly8gRklYTUU6IEFkZCBhIGdlbmVyaWMgZ2V0cGFnZXNpemUoKSB0byBXVEYsIHRoZW4gbW92ZSB0
aGlzIGZ1bmN0aW9uIHRvIFdURiBhcyB3ZWxsLgotICAgIGlubGluZSBib29sIGlzUGFnZUFsaWdu
ZWQoc2l6ZV90IHNpemUpIHsgcmV0dXJuIHNpemUgIT0gMCAmJiBzaXplICUgKDggKiAxMDI0KSA9
PSAwOyB9CisgICAgLy8gVGhpcyBpcyBzdGlsbCBhIGhhY2sgdGhhdCBzaG91bGQgYmUgZml4ZWQg
bGF0ZXIuIFdlIGtub3cgdGhhdCBhIFN5bWJpYW4gcGFnZSBzaXplIGlzIDRLLgorI2lmIE9TKFNZ
TUJJQU4pCisgICAgaW5saW5lIGJvb2wgaXNQYWdlQWxpZ25lZChzaXplX3Qgc2l6ZSkgeyByZXR1
cm4gc2l6ZSAmJiAhKHNpemUgJSAoNCAqIDEwMjQpKTsgfQorI2Vsc2UgICAgCisgICAgaW5saW5l
IGJvb2wgaXNQYWdlQWxpZ25lZChzaXplX3Qgc2l6ZSkgeyByZXR1cm4gc2l6ZSAmJiAhKHNpemUg
JSAoOCAqIDEwMjQpKTsgfQorI2VuZGlmCiAKICAgICBpbmxpbmUgUmVnaXN0ZXJGaWxlOjpSZWdp
c3RlckZpbGUoc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgbWF4R2xvYmFscykKICAgICAgICAgOiBt
X251bUdsb2JhbHMoMCkKQEAgLTE3Miw3ICsxODYsNyBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAg
ICAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gKGNhcGFjaXR5ICsgbWF4R2xvYmFscykgKiBzaXpl
b2YoUmVnaXN0ZXIpOwogICAgICNpZiBIQVZFKE1NQVApCi0gICAgICAgIG1fYnVmZmVyID0gc3Rh
dGljX2Nhc3Q8UmVnaXN0ZXIqPihtbWFwKDAsIGJ1ZmZlckxlbmd0aCwgUFJPVF9SRUFEfFBST1Rf
V1JJVEUsIE1BUF9QUklWQVRFfE1BUF9BTk9OLCBWTV9UQUdfRk9SX1JFR0lTVEVSRklMRV9NRU1P
UlksIDApKTsKKyAgICAgICAgbV9idWZmZXIgPSBzdGF0aWNfY2FzdDxSZWdpc3Rlcio+KG1tYXAo
MCwgYnVmZmVyTGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSB8IE1B
UF9BTk9OLCBWTV9UQUdfRk9SX1JFR0lTVEVSRklMRV9NRU1PUlksIDApKTsKICAgICAgICAgaWYg
KG1fYnVmZmVyID09IE1BUF9GQUlMRUQpIHsKICNpZiBPUyhXSU5DRSkKICAgICAgICAgICAgIGZw
cmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIGZpbGU6ICVkXG4iLCBH
ZXRMYXN0RXJyb3IoKSk7CkBAIC0yMDIsNiArMjE2LDE0IEBAIG5hbWVzcGFjZSBKU0MgewogICAg
ICAgICAgICAgQ1JBU0goKTsKICAgICAgICAgfQogICAgICAgICBtX2NvbW1pdEVuZCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXIqPihyZWludGVycHJldF9jYXN0PGNoYXIqPihtX2J1ZmZlcikg
KyBjb21taXR0ZWRTaXplKTsKKyAgICAjZWxpZiBPUyhTWU1CSUFOKQorICAgICAgICAvLyBBIGNv
bnZlbmllbmNlIGNsYXNzIHRvIGFsbG9jYXRlIGNvbnRpZ3VvdXMgYmxvY2tzIGVmZmljaWVudGx5
CisgICAgICAgIG1fcmVnaXN0ZXJGaWxlQWxsb2NhdG9yID0gbmV3IFdURjo6UmVnaXN0ZXJGaWxl
QWxsb2NhdG9yKGJ1ZmZlckxlbmd0aCk7CisgICAgICAgIG1fYnVmZmVyID0gKFJlZ2lzdGVyKiko
bV9yZWdpc3RlckZpbGVBbGxvY2F0b3ItPmJ1ZmZlcigpKTsKKyAgICAgICAgCisgICAgICAgIC8v
IHN0YXJ0IGJ5IGNvbW1pdHRpbmcgZW5vdWdoIHNwYWNlIHRvIGhvbGQgbWF4R2xvYmFscworICAg
ICAgICB2b2lkKiBuZXdFbmQgPSAodm9pZCopKChpbnQpbV9idWZmZXIgKyAobWF4R2xvYmFscyAq
IHNpemVvZihSZWdpc3RlcikpKTsKKyAgICAgICAgbV9yZWdpc3RlckZpbGVBbGxvY2F0b3ItPmdy
b3cobmV3RW5kKTsKICAgICAjZWxzZSAKICAgICAgICAgLyogCiAgICAgICAgICAqIElmIG5laXRo
ZXIgTU1BUCBub3IgVklSVFVBTEFMTE9DIGFyZSBhdmFpbGFibGUgLSB1c2UgZmFzdE1hbGxvYyBp
bnN0ZWFkLgpAQCAtMjI0LDggKzI0NiwxMiBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgaWYg
KG5ld0VuZCA+PSBtX2VuZCkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgbV9lbmQgPSBu
ZXdFbmQ7Ci0gICAgICAgIGlmIChtX2VuZCA9PSBtX3N0YXJ0ICYmIChtX21heFVzZWQgLSBtX3N0
YXJ0KSA+IG1heEV4Y2Vzc0NhcGFjaXR5KQorICAgICAgICBpZiAobV9lbmQgPT0gbV9zdGFydCAm
JiAobV9tYXhVc2VkIC0gbV9zdGFydCkgPiBtYXhFeGNlc3NDYXBhY2l0eSkgeworI2lmIE9TKFNZ
TUJJQU4pCisgICAgICAgICAgICBtX3JlZ2lzdGVyRmlsZUFsbG9jYXRvci0+c2hyaW5rKG5ld0Vu
ZCk7CisjZW5kaWYgCiAgICAgICAgICAgICByZWxlYXNlRXhjZXNzQ2FwYWNpdHkoKTsKKyAgICAg
ICAgfQogICAgIH0KIAogICAgIGlubGluZSBib29sIFJlZ2lzdGVyRmlsZTo6Z3JvdyhSZWdpc3Rl
ciogbmV3RW5kKQpAQCAtMjUxLDYgKzI3NywxMCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAg
fQogI2VuZGlmCiAKKyNpZiBPUyhTWU1CSUFOKQorICAgICAgICBtX3JlZ2lzdGVyRmlsZUFsbG9j
YXRvci0+Z3Jvdygodm9pZCopbmV3RW5kKTsKKyNlbmRpZgorCiAgICAgICAgIGlmIChuZXdFbmQg
PiBtX21heFVzZWQpCiAgICAgICAgICAgICBtX21heFVzZWQgPSBuZXdFbmQ7CiAKSW5kZXg6IEph
dmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1JlZ2lzdGVyRmlsZUFsbG9jYXRvclN5bWJpYW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1JlZ2lzdGVyRmlsZUFs
bG9jYXRvclN5bWJpYW4uY3BwCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3N5
bWJpYW4vUmVnaXN0ZXJGaWxlQWxsb2NhdG9yU3ltYmlhbi5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9u
IGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lm
IE9TKFNZTUJJQU4pCisKKyNpbmNsdWRlICJSZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuLmgi
CisKKyNpbmNsdWRlIDxRRGVidWc+CisKK25hbWVzcGFjZSBXVEYgeworCisvKiogRWZmaWNpZW50
bHkgYWxsb2NhdGVzIG1lbW9yeSBwb29scyBvZiBzaXplIHBvb2xTaXplLgorICogUHJpbWFyaWx5
IGRlc2lnbmVkIGZvciBKU0MgUmVnaXN0ZXJGaWxlJ3MgbmVlZHMuIAorICogTm90IHRocmVhZC1z
YWZlLiAgICAKKyAqLworUmVnaXN0ZXJGaWxlQWxsb2NhdG9yOjpSZWdpc3RlckZpbGVBbGxvY2F0
b3IoVFVpbnQzMiByZXNlcnZhdGlvblNpemUsIFRVaW50MzIgcG9vbFNpemUpIDoKKyAgICBtX3Jl
c2VydmVkKHJlc2VydmF0aW9uU2l6ZSksIG1fcG9vbFNpemUocG9vbFNpemUpCit7CisgICAgLy8g
R2V0IHN5c3RlbSdzIHBhZ2Ugc2l6ZSB2YWx1ZS4KKyAgICBTWU1CSUFOX1BBR0VTSVpFKG1fcGFn
ZVNpemUpOworCisgICAgLy8gV2Ugb25seSBhY2NlcHQgbXVsdGlwbGVzIG9mIHN5c3RlbSBwYWdl
IHNpemUgZm9yIGJvdGggaW5pdGlhbCByZXNlcnZhdGlvbgorICAgIC8vIGFuZCB0aGUgYWxpZ25t
ZW50L3Bvb2wgc2l6ZQorICAgIG1fcmVzZXJ2ZWQgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExF
KG1fcmVzZXJ2ZWQsIG1fcGFnZVNpemUpOworICAgIF9fQVNTRVJUX0FMV0FZUyhTWU1CSUFOX1JP
VU5EVVBUT01VTFRJUExFKG1fcG9vbFNpemUsIG1fcGFnZVNpemUpLCAKKyAgICAgICAgICAgICAg
ICAgICAgVXNlcjo6UGFuaWMoX0woIlJlZ2lzdGVyRmlsZUFsbG9jYXRvcjEiKSwgS0VyckFyZ3Vt
ZW50KSk7CisgICAgIAorICAgIC8vIE9wZW4gYSBTeW1iaWFuIFJDaHVuaywgYW5kIHJlc2VydmUg
cmVxdWVzdGVkIHZpcnR1YWwgYWRkcmVzcyByYW5nZSAgIAorICAgIC8vIEFueSB0aHJlYWQgaW4g
dGhpcyBwcm9jZXNzIGNhbiBvcGVyYXRlIHRoaXMgUkNodW5rIGR1ZSB0byBFT3duZXJQcm9jZXNz
IGFjY2VzcyByaWdodHMuIAorICAgIFRJbnQgcmV0ID0gbV9jaHVuay5DcmVhdGVEaXNjb25uZWN0
ZWRMb2NhbCgwICwgMCwgKFRJbnQpbV9yZXNlcnZlZCAsIEVPd25lclByb2Nlc3MpOyAgCisgICAg
aWYgKHJldCAhPSBLRXJyTm9uZSkgCisgICAgICAgIFVzZXI6OlBhbmljKF9MKCJSZWdpc3RlckZp
bGVBbGxvY2F0b3IyIiksIHJldCk7CisKKyAgICBtX2J1ZmZlciA9ICh2b2lkKiltX2NodW5rLkJh
c2UoKTsKKyAgICBtX3Jlc0VuZCA9ICh2b2lkKikobV9jaHVuay5CYXNlKCkgKyBtX2NodW5rLk1h
eFNpemUoKSk7CisgICAgbV9jb21FbmQgPSBtX2J1ZmZlcjsKKyAgICBxRGVidWcoIlJGQTo6UkZB
KCkgaGFuZGxlPSVkLCByZXNlcnZlZD0lZCwgcG9vbHNpemU9JWQsIGJhc2U9JWQiLAorICAgICAg
ICAgICBtX2NodW5rLkhhbmRsZSgpLCBtX3Jlc2VydmVkLCBtX3Bvb2xTaXplLCBtX2J1ZmZlcik7
IAorfQorCitSZWdpc3RlckZpbGVBbGxvY2F0b3I6On5SZWdpc3RlckZpbGVBbGxvY2F0b3IoKQor
eworICAgIC8vIHJlbGVhc2UgZXZlcnl0aGluZyEKKyAgICBxRGVidWcoIlJGQTo6flJGQSgpIGRl
c3Ryb3lpbmcgZXZlcnl0aGluZyEiKTsKKyAgICBtX2NodW5rLkRlY29tbWl0KDAsIG1fY2h1bmsu
TWF4U2l6ZSgpKTsKKyAgICBtX2NodW5rLkNsb3NlKCk7Cit9CisKK3ZvaWQqIFJlZ2lzdGVyRmls
ZUFsbG9jYXRvcjo6YnVmZmVyKCkgY29uc3QKK3sKKyAgICBxRGVidWcoIlJGQTo6YnVmZmVyKCkg
YnVmZmVyPSVkICIsIG1fYnVmZmVyKTsKKyAgICByZXR1cm4gbV9idWZmZXI7Cit9CisKK3ZvaWQg
UmVnaXN0ZXJGaWxlQWxsb2NhdG9yOjpncm93KHZvaWQqIG5ld0VuZCkKK3sKKyAgICBxRGVidWco
IlJGQTo6Z3JvdygpIG5ld0VuZD0lZCIsIG5ld0VuZCk7CisgICAgcURlYnVnKCJSRkE6Omdyb3co
KSBiYXNlPSVkLCBjb21taXR0ZWQ9JWQsIGNvbUVuZD0lZCwgcmVzRW5kPSVkIiwKKyAgICAgICAg
ICAgbV9idWZmZXIsIG1fY2h1bmsuU2l6ZSgpLCBtX2NvbUVuZCwgbV9yZXNFbmQpOworICAgIAor
ICAgIGlmIChuZXdFbmQgPiBtX3Jlc0VuZCkgeworICAgICAgICBxRGVidWcoIlJGQTo6Z3Jvdygp
IHRyeWluZyB0byBjb21taXQgbW9yZSBtZW1vcnkgdGhhbiByZXNlcnZlZCIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIAorICAgIGlmIChuZXdFbmQgPiBtX2NvbUVuZCkgeworICAgICAg
ICBUSW50IG5CeXRlcyA9IChUSW50KShuZXdFbmQpIC0gKFRJbnQpKG1fY29tRW5kKTsKKyAgICAg
ICAgcURlYnVnKCJSRkE6Omdyb3coKSAlZCBieXRlcyByZXF1ZXN0ZWQiLCBuQnl0ZXMpOworICAg
ICAgICBuQnl0ZXMgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG5CeXRlcywgbV9wb29sU2l6
ZSk7CisgICAgICAgIFRJbnQgb2Zmc2V0ID0gKFRJbnQpbV9jb21FbmQgLSAoVEludCltX2J1ZmZl
cjsKKyAgICAgICAgcURlYnVnKCJSRkE6Omdyb3coKSBDb21taXR0aW5nICVkIGJ5dGVzIGF0IG9m
ZnNldCAlZCIsIG5CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgCisgICAgICAgIFRJbnQgcmV0ID0g
bV9jaHVuay5Db21taXQob2Zmc2V0LCBuQnl0ZXMpOworICAgICAgICBpZiAocmV0ICE9IEtFcnJO
b25lKQorICAgICAgICAgICAgcURlYnVnKCJSRkE6Omdyb3coKSBmYWlsZWQhIENvbW1pdDogJWQi
LCByZXQpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fY29tRW5kID0gKHZvaWQqKSht
X2NodW5rLkJhc2UoKSArIG1fY2h1bmsuU2l6ZSgpKTsKKyAgICAgICAgICAgIHFEZWJ1ZygiUkZB
Ojpncm93KCkgc3VjY2VzcyEiKTsKKyAgICAgICAgICAgIHFEZWJ1ZygiUkZBOjpncm93KCkgYmFz
ZT0lZCwgIGNvbW1pdHRlZD0lZCwgY29tRW5kPSVkLCByZXNFbmQ9JWQiLAorICAgICAgICAgICAg
ICAgICAgIG1fY2h1bmsuQmFzZSgpLCBtX2NodW5rLlNpemUoKSwgbV9jb21FbmQsIG1fcmVzRW5k
KTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBxRGVidWcoIlJGQTo6Z3JvdygpIG5v
IG5lZWQgdG8gZ3JvdyIpOworfQorCit2b2lkIFJlZ2lzdGVyRmlsZUFsbG9jYXRvcjo6c2hyaW5r
KHZvaWQqIG5ld0VuZCkKK3sKKyAgICBxRGVidWcoIlJGQTo6c2hyaW5rKCkgbmV3RW5kPSVkIiwg
bmV3RW5kKTsKKyAgICBxRGVidWcoIlJGQTo6c2hyaW5rKCkgYmFzZT0lZCwgY29tbWl0dGVkPSVk
LCBjb21FbmQ9JWQsIHJlc0VuZD0lZCIsCisgICAgICAgICAgIG1fYnVmZmVyLCBtX2NodW5rLlNp
emUoKSwgbV9jb21FbmQsIG1fcmVzRW5kKTsKKworICAgIGlmIChuZXdFbmQgPCBtX2NvbUVuZCkg
eworICAgICAgICBUSW50IG5CeXRlcyA9IChUSW50KW5ld0VuZCAtIChUSW50KW1fY29tRW5kOwor
ICAgICAgICBpZiAobkJ5dGVzID49IG1fcG9vbFNpemUpIHsKKyAgICAgICAgICAgIFRJbnQgb2Zm
c2V0ID0gU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRSgoVFVpbnQpbmV3RW5kLCBtX3Bvb2xTaXpl
KSAtIChUSW50KW1fYnVmZmVyOworICAgICAgICAgICAgbkJ5dGVzID0gKFRJbnQpbV9jb21FbmQg
LSBvZmZzZXQgLSAoVEludCltX2J1ZmZlcjsgCisgICAgICAgICAgICBpZiAobkJ5dGVzID4gMCkg
eworICAgICAgICAgICAgICAgIHFEZWJ1ZygiUkZBOjpzaHJpbmsoKSBEZWNvbW1pdHRpbmcgJWQg
Ynl0ZXMgYXQgb2Zmc2V0ICVkIiwgbkJ5dGVzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIFRJ
bnQgcmV0ID0gbV9jaHVuay5EZWNvbW1pdChvZmZzZXQsIG5CeXRlcyk7CisgICAgICAgICAgICAg
ICAgaWYgKHJldCAhPSBLRXJyTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgcURlYnVnKCJSRkE6
OnNocmluaygpIGZhaWxlZCEgRGVjb21taXQ6ICVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBl
bHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV9jb21FbmQgPSAodm9pZCopKG1fY2h1bmsuQmFz
ZSgpICsgbV9jaHVuay5TaXplKCkpOworICAgICAgICAgICAgICAgICAgICBxRGVidWcoIlJGQTo6
c2hyaW5rKCkgc3VjY2VzcyEiKTsKKyAgICAgICAgICAgICAgICAgICAgcURlYnVnKCJSRkE6OnNo
cmluaygpIGJhc2U9JWQsIGNvbW1pdHRlZD0lZCwgY29tRW5kPSVkLCByZXNFbmQ9JWQiLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV9jaHVuay5CYXNlKCksIG1fY2h1bmsuU2l6ZSgpLCBt
X2NvbUVuZCwgbV9yZXNFbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBy
ZXR1cm47IC8vIGF2b2lkIHFEZWJ1ZyBzdGF0ZW1lbnQgYmVsb3cKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIHFEZWJ1ZygiUkZBOjpzaHJpbmsoKSBubyBuZWVkIHRvIHNo
cmluayIpOworfQorCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UKKworI2VuZGlmIC8vIFNZTUJJQU4K
ClByb3BlcnR5IGNoYW5nZXMgb246IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1JlZ2lzdGVy
RmlsZUFsbG9jYXRvclN5bWJpYW4uY3BwCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxl
CiAgICsgKgoKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1JlZ2lzdGVyRmlsZUFs
bG9jYXRvclN5bWJpYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvc3ltYmlh
bi9SZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2Ny
aXB0Q29yZS93dGYvc3ltYmlhbi9SZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuLmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEg
Q29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZWdpc3Rl
ckZpbGVBbGxvY2F0b3JTeW1iaWFuX2gKKyNkZWZpbmUgUmVnaXN0ZXJGaWxlQWxsb2NhdG9yU3lt
Ymlhbl9oCisKKyNpbmNsdWRlICJTeW1iaWFuRGVmaW5lcy5oIgorCituYW1lc3BhY2UgV1RGIHsK
KworLyoqIAorICogIEFsbG9jYXRlcyBjb250aWd1b3VzIHJlZ2lvbnMgb2Ygc2l6ZSBwb29sU2l6
ZS4KKyAqICBwb29sU2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSAo
dHlwaWNhbGx5IDRLIG9uIFN5bWJpYW4vQVJNKQorICoKKyAqICBAcGFyYW0gcmVzZXJ2YXRpb25T
aXplIFZpcnR1YWwgYWRkcmVzcyByYW5nZSB0byBiZSByZXNlcnZlZCB1cG9uIGNyZWF0aW9uIG9m
IGNodW5rIChieXRlcykuCisgKiAgQHBhcmFtIHBvb2xTaXplIFNpemUgb2YgYSBzaW5nbGUgYWxs
b2NhdGlvbi4KKyAqLworY2xhc3MgUmVnaXN0ZXJGaWxlQWxsb2NhdG9yIHsKKworcHVibGljOgor
ICAgIFJlZ2lzdGVyRmlsZUFsbG9jYXRvcigKKyAgICAgICAgICAgIFRVaW50MzIgcmVzZXJ2YXRp
b25TaXplLCBUVWludDMyIHBvb2xTaXplID0gU1lNQklBTl9SRUdGSUxFQUxMT0NfREVGQVVMVFBP
T0xTSVpFKTsKKyAgICB+UmVnaXN0ZXJGaWxlQWxsb2NhdG9yKCk7CisgICAgdm9pZCogYnVmZmVy
KCkgY29uc3Q7CisgICAgdm9pZCBncm93KHZvaWQqIG5ld0VuZCk7CisgICAgdm9pZCBzaHJpbmso
dm9pZCogbmV3RW5kKTsKKyAgICAKK3ByaXZhdGU6IAorICAgIFJDaHVuayAgIG1fY2h1bms7IC8v
IFN5bWJpYW4gY2h1bmsgdGhhdCBsZXRzIHVzIHJlc2VydmUvY29tbWl0L2RlY29tbWl0CisgICAg
ICAgIAorICAgIC8vIGFsbCBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbiBudW1iZXJzIG9mIGJ5dGVz
CisgICAgVEludCAgICAgbV9wYWdlU2l6ZTsgLy8gY2FjaGVkIHZhbHVlIG9mIHN5c3RlbSBwYWdl
IHNpemUsIHR5cGljYWxseSA0SyBvbiBTeW1iaWFuCisgICAgVFVpbnQzMiAgbV9yZXNlcnZlZDsg
Ly8gdG90YWwgbnVtYmVyIG9mIHJlc2VydmVkIGJ5dGVzIGluIHZpcnR1YWwgbWVtb3J5CisgICAg
VFVpbnQzMiAgbV9wb29sU2l6ZTsgLy8gc2l6ZSBvZiBvbmUgbWVtb3J5IHBvb2wsIHNldCBieSBk
ZWZhdWx0IHRvIDY0SyBpbiB3dGYvc3ltYmlhbi9TeW1iaWFuRGVmaW5lcy5oCisgICAgICAgIAor
ICAgIHZvaWQqIG1fYnVmZmVyOyAvLyBwb2ludGVyIHRvIGJhc2Ugb2YgdGhlIGNodW5rCisgICAg
dm9pZCogbV9jb21FbmQ7IC8vIHBvaW50ZXIgdG8gZW5kIG9mIGN1cnJlbnRseSBjb21taXR0ZWQg
bWVtb3J5CisgICAgdm9pZCogbV9yZXNFbmQ7IC8vIHBvaW50ZXIgdG8gZW5kIG9mIHJlc2VydmVk
IG1lbW9yeQorIAorfTsKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBSZWdp
c3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuX2gKClByb3BlcnR5IGNoYW5nZXMgb246IEphdmFTY3Jp
cHRDb3JlL3d0Zi9zeW1iaWFuL1JlZ2lzdGVyRmlsZUFsbG9jYXRvclN5bWJpYW4uaApfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCkFkZGVkOiBzdm46ZXhlY3V0YWJsZQogICArICoKCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93
dGYvc3ltYmlhbi9TeW1iaWFuRGVmaW5lcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L3d0Zi9zeW1iaWFuL1N5bWJpYW5EZWZpbmVzLmgJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0
Q29yZS93dGYvc3ltYmlhbi9TeW1iaWFuRGVmaW5lcy5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgU3ltYmlhbkRlZmluZXNfaAorI2RlZmlu
ZSBTeW1iaWFuRGVmaW5lc19oCisKKyNpbmNsdWRlIDxlMzJjbW4uaD4KKyNpbmNsdWRlIDxlMzJz
dGQuaD4KKyNpbmNsdWRlIDxoYWwuaD4KKworI2RlZmluZSBTWU1CSUFOX1BBR0VTSVpFKHgpIChI
QUw6OkdldChIQUxEYXRhOjpFTWVtb3J5UGFnZVNpemUsIHgpKTsKKyNkZWZpbmUgU1lNQklBTl9G
UkVFUkFNKHgpICAoSEFMOjpHZXQoSEFMRGF0YTo6RU1lbW9yeVJBTUZyZWUsIHgpKTsKKyNkZWZp
bmUgU1lNQklBTl9ST1VORFVQVE9NVUxUSVBMRSh4LCBtdWx0aXBsZW9mKSAoICh4ICsgbXVsdGlw
bGVvZiAtIDEpICYgfihtdWx0aXBsZW9mIC0gMSkgKQorCisjZGVmaW5lIFNZTUJJQU5fUkVHRklM
RUFMTE9DX0RFRkFVTFRQT09MU0laRSA2NTUzNiAvLyA2NEsKKworI2VuZGlmIC8vIFN5bWJpYW5E
ZWZpbmVzX2gKClByb3BlcnR5IGNoYW5nZXMgb246IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFu
L1N5bWJpYW5EZWZpbmVzLmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmV4ZWN1dGFibGUKICAgKyAq
Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>59110</attachid>
            <date>2010-06-18 08:24:12 -0700</date>
            <delta_ts>2010-08-04 13:01:52 -0700</delta_ts>
            <desc>patch for review</desc>
            <filename>bug-34349.patch</filename>
            <type>text/plain</type>
            <size>26896</size>
            <attacher name="Jay Tucker">jay.tucker</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDYxNDA2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzkgQEAKKzIwMTAtMDYtMTggIFR1Y2tlciBK
YXkgIDxqYXkudHVja2VyQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbU3ltYmlhbl0gTGF6eSBjb21taXQgb2YgbWVtb3J5IHJlcXVp
cmVkIGluIEpTQyByZWdpc3RlciBmaWxlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNDM0OQorCisgICAgICAgICogSmF2YVNjcmlwdENvcmUucHJvOiBB
ZGRlZCAxIG5ldyBTeW1iaWFuIHNvdXJjZSBmaWxlCisgICAgICAgICogaW50ZXJwcmV0ZXIvUmVn
aXN0ZXJGaWxlLmNwcDoKKyAgICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjp+UmVnaXN0ZXJGaWxl
KToKKyAgICAgICAgKiBpbnRlcnByZXRlci9SZWdpc3RlckZpbGUuaDoKKyAgICAgICAgKEpTQzo6
UmVnaXN0ZXJGaWxlOjopOgorICAgICAgICAoSlNDOjpSZWdpc3RlckZpbGU6OnN0YXJ0KToKKyAg
ICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjplbmQpOgorICAgICAgICAoSlNDOjpSZWdpc3RlckZp
bGU6OnNpemUpOgorICAgICAgICAoSlNDOjpSZWdpc3RlckZpbGU6OnNldE51bUdsb2JhbHMpOgor
ICAgICAgICAoSlNDOjpSZWdpc3RlckZpbGU6Om51bUdsb2JhbHMpOgorICAgICAgICAoSlNDOjpS
ZWdpc3RlckZpbGU6Om1heEdsb2JhbHMpOgorICAgICAgICAoSlNDOjpSZWdpc3RlckZpbGU6Omxh
c3RHbG9iYWwpOgorICAgICAgICAoSlNDOjpSZWdpc3RlckZpbGU6Om1hcmtHbG9iYWxzKToKKyAg
ICAgICAgKEpTQzo6UmVnaXN0ZXJGaWxlOjptYXJrQ2FsbEZyYW1lcyk6CisgICAgICAgIChKU0M6
OmlzUGFnZUFsaWduZWQpOgorICAgICAgICAoSlNDOjpSZWdpc3RlckZpbGU6OlJlZ2lzdGVyRmls
ZSk6CisgICAgICAgIChKU0M6OlJlZ2lzdGVyRmlsZTo6c2hyaW5rKToKKyAgICAgICAgKEpTQzo6
UmVnaXN0ZXJGaWxlOjpncm93KToKKyAgICAgICAgKiB3dGYvc3ltYmlhbi9SZWdpc3RlckZpbGVB
bGxvY2F0b3JTeW1iaWFuLmNwcDogQWRkZWQuCisgICAgICAgIChXVEY6OlJlZ2lzdGVyRmlsZUFs
bG9jYXRvcjo6UmVnaXN0ZXJGaWxlQWxsb2NhdG9yKToKKyAgICAgICAgSGVscGVyIGNsYXNzIHRv
IGFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCBieSBSZWdpc3RlckZpbGUKKyAgICAgICAgbW9yZSBl
ZmZpY2llbnRseS4KKyAgICAgICAgKFdURjo6UmVnaXN0ZXJGaWxlQWxsb2NhdG9yOjp+UmVnaXN0
ZXJGaWxlQWxsb2NhdG9yKToKKyAgICAgICAgKFdURjo6UmVnaXN0ZXJGaWxlQWxsb2NhdG9yOjpi
dWZmZXIpOgorICAgICAgICAoV1RGOjpSZWdpc3RlckZpbGVBbGxvY2F0b3I6Omdyb3cpOgorICAg
ICAgICAoV1RGOjpSZWdpc3RlckZpbGVBbGxvY2F0b3I6OnNocmluayk6CisgICAgICAgICogd3Rm
L3N5bWJpYW4vUmVnaXN0ZXJGaWxlQWxsb2NhdG9yU3ltYmlhbi5oOiBBZGRlZC4KKyAgICAgICAg
KiB3dGYvc3ltYmlhbi9TeW1iaWFuRGVmaW5lcy5oOiBBZGRlZC4KKwogMjAxMC0wNi0xNyAgU2h1
IENoYW5nICA8Y2hhbmcuc2h1QG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBLZW5u
ZXRoIFJvaGRlIENocmlzdGlhbnNlbi4KSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRD
b3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8J
KHJldmlzaW9uIDYxNDA0KQorKysgSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJvCSh3
b3JraW5nIGNvcHkpCkBAIC0yMTYsNiArMjE2LDcgQEAgU09VUkNFUyArPSBcCiAgICAgd3RmL1Jh
bmRvbU51bWJlci5jcHAgXAogICAgIHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIuY3BwIFwKICAg
ICB3dGYvc3ltYmlhbi9CbG9ja0FsbG9jYXRvclN5bWJpYW4uY3BwIFwKKyAgICB3dGYvc3ltYmlh
bi9SZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuLmNwcCBcCiAgICAgd3RmL1RocmVhZGluZ05v
bmUuY3BwIFwKICAgICB3dGYvVGhyZWFkaW5nLmNwcCBcCiAgICAgd3RmL1R5cGVUcmFpdHMuY3Bw
IFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL1JlZ2lzdGVyRmlsZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmNwcAko
cmV2aXNpb24gNjE0MDQpCisrKyBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9SZWdpc3RlckZp
bGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2ICs0Miw4IEBAIFJlZ2lzdGVyRmlsZTo6flJl
Z2lzdGVyRmlsZSgpCiAgICAgVmlydHVhbEZyZWUobV9idWZmZXIsIERXT1JEKG1fY29tbWl0RW5k
KSAtIERXT1JEKG1fYnVmZmVyKSwgTUVNX0RFQ09NTUlUKTsKICNlbmRpZgogICAgIFZpcnR1YWxG
cmVlKG1fYnVmZmVyLCAwLCBNRU1fUkVMRUFTRSk7CisjZWxpZiBPUyhTWU1CSUFOKQorICAgIGRl
bGV0ZSBtX3JlZ2lzdGVyRmlsZUFsbG9jYXRvcjsKICNlbHNlCiAgICAgZmFzdEZyZWUobV9idWZm
ZXIpOwogI2VuZGlmCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9SZWdpc3RlckZp
bGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9SZWdpc3RlckZp
bGUuaAkocmV2aXNpb24gNjE0MDQpCisrKyBKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9SZWdp
c3RlckZpbGUuaAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsMTAgQEAKICNpbmNsdWRlIDxz
eXMvbW1hbi5oPgogI2VuZGlmCiAKKyNpZiBPUyhTWU1CSUFOKQorI2luY2x1ZGUgPHd0Zi9zeW1i
aWFuL1JlZ2lzdGVyRmlsZUFsbG9jYXRvclN5bWJpYW4uaD4KKyNlbmRpZgorCiBuYW1lc3BhY2Ug
SlNDIHsKIAogLyoKQEAgLTkxLDE3MiArOTUsMTk2IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICJi
YXNlIiwgbm90ICJidWZmZXIiLgogKi8KIAotICAgIGNsYXNzIEpTR2xvYmFsT2JqZWN0OworY2xh
c3MgSlNHbG9iYWxPYmplY3Q7CiAKLSAgICBjbGFzcyBSZWdpc3RlckZpbGUgOiBwdWJsaWMgTm9u
Y29weWFibGUgewotICAgICAgICBmcmllbmQgY2xhc3MgSklUOwotICAgIHB1YmxpYzoKLSAgICAg
ICAgZW51bSBDYWxsRnJhbWVIZWFkZXJFbnRyeSB7Ci0gICAgICAgICAgICBDYWxsRnJhbWVIZWFk
ZXJTaXplID0gNiwKLQotICAgICAgICAgICAgQXJndW1lbnRDb3VudCA9IC02LAotICAgICAgICAg
ICAgQ2FsbGVyRnJhbWUgPSAtNSwKLSAgICAgICAgICAgIENhbGxlZSA9IC00LAotICAgICAgICAg
ICAgU2NvcGVDaGFpbiA9IC0zLAotICAgICAgICAgICAgUmV0dXJuUEMgPSAtMiwgLy8gVGhpcyBp
cyBlaXRoZXIgYW4gSW5zdHJ1Y3Rpb24qIG9yIGEgcG9pbnRlciBpbnRvIEpJVCBnZW5lcmF0ZWQg
Y29kZSBzdG9yZWQgYXMgYW4gSW5zdHJ1Y3Rpb24qLgotICAgICAgICAgICAgQ29kZUJsb2NrID0g
LTEsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZW51bSB7IFByb2dyYW1Db2RlVGhpc1JlZ2lzdGVy
ID0gLUNhbGxGcmFtZUhlYWRlclNpemUgLSAxIH07Ci0KLSAgICAgICAgc3RhdGljIGNvbnN0IHNp
emVfdCBkZWZhdWx0Q2FwYWNpdHkgPSA1MjQyODg7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaXpl
X3QgZGVmYXVsdE1heEdsb2JhbHMgPSA4MTkyOwotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90
IGNvbW1pdFNpemUgPSAxIDw8IDE0OwotICAgICAgICAvLyBBbGxvdyA4ayBvZiBleGNlc3MgcmVn
aXN0ZXJzIGJlZm9yZSB3ZSBzdGFydCB0cnlpbmcgdG8gcmVhcCB0aGUgcmVnaXN0ZXJmaWxlCi0g
ICAgICAgIHN0YXRpYyBjb25zdCBwdHJkaWZmX3QgbWF4RXhjZXNzQ2FwYWNpdHkgPSA4ICogMTAy
NDsKLQotICAgICAgICBSZWdpc3RlckZpbGUoc2l6ZV90IGNhcGFjaXR5ID0gZGVmYXVsdENhcGFj
aXR5LCBzaXplX3QgbWF4R2xvYmFscyA9IGRlZmF1bHRNYXhHbG9iYWxzKTsKLSAgICAgICAgflJl
Z2lzdGVyRmlsZSgpOwotCi0gICAgICAgIFJlZ2lzdGVyKiBzdGFydCgpIGNvbnN0IHsgcmV0dXJu
IG1fc3RhcnQ7IH0KLSAgICAgICAgUmVnaXN0ZXIqIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fZW5k
OyB9Ci0gICAgICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9lbmQgLSBtX3N0YXJ0
OyB9Ci0KLSAgICAgICAgdm9pZCBzZXRHbG9iYWxPYmplY3QoSlNHbG9iYWxPYmplY3QqKTsKLSAg
ICAgICAgYm9vbCBjbGVhckdsb2JhbE9iamVjdChKU0dsb2JhbE9iamVjdCopOwotICAgICAgICBK
U0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KCk7Ci0KLSAgICAgICAgYm9vbCBncm93KFJlZ2lz
dGVyKiBuZXdFbmQpOwotICAgICAgICB2b2lkIHNocmluayhSZWdpc3RlciogbmV3RW5kKTsKLSAg
ICAgICAgCi0gICAgICAgIHZvaWQgc2V0TnVtR2xvYmFscyhzaXplX3QgbnVtR2xvYmFscykgeyBt
X251bUdsb2JhbHMgPSBudW1HbG9iYWxzOyB9Ci0gICAgICAgIGludCBudW1HbG9iYWxzKCkgY29u
c3QgeyByZXR1cm4gbV9udW1HbG9iYWxzOyB9Ci0gICAgICAgIHNpemVfdCBtYXhHbG9iYWxzKCkg
Y29uc3QgeyByZXR1cm4gbV9tYXhHbG9iYWxzOyB9Ci0KLSAgICAgICAgUmVnaXN0ZXIqIGxhc3RH
bG9iYWwoKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0IC0gbV9udW1HbG9iYWxzOyB9Ci0gICAgICAg
IAotICAgICAgICB2b2lkIG1hcmtHbG9iYWxzKE1hcmtTdGFjayYgbWFya1N0YWNrLCBIZWFwKiBo
ZWFwKSB7IGhlYXAtPm1hcmtDb25zZXJ2YXRpdmVseShtYXJrU3RhY2ssIGxhc3RHbG9iYWwoKSwg
bV9zdGFydCk7IH0KLSAgICAgICAgdm9pZCBtYXJrQ2FsbEZyYW1lcyhNYXJrU3RhY2smIG1hcmtT
dGFjaywgSGVhcCogaGVhcCkgeyBoZWFwLT5tYXJrQ29uc2VydmF0aXZlbHkobWFya1N0YWNrLCBt
X3N0YXJ0LCBtX2VuZCk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQgcmVsZWFzZUV4
Y2Vzc0NhcGFjaXR5KCk7Ci0gICAgICAgIHNpemVfdCBtX251bUdsb2JhbHM7Ci0gICAgICAgIGNv
bnN0IHNpemVfdCBtX21heEdsb2JhbHM7Ci0gICAgICAgIFJlZ2lzdGVyKiBtX3N0YXJ0OwotICAg
ICAgICBSZWdpc3RlciogbV9lbmQ7Ci0gICAgICAgIFJlZ2lzdGVyKiBtX21heDsKLSAgICAgICAg
UmVnaXN0ZXIqIG1fYnVmZmVyOwotICAgICAgICBSZWdpc3RlciogbV9tYXhVc2VkOworY2xhc3Mg
UmVnaXN0ZXJGaWxlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKKyAgICBmcmllbmQgY2xhc3MgSklU
OworcHVibGljOgorICAgIGVudW0gQ2FsbEZyYW1lSGVhZGVyRW50cnkgeworICAgICAgICBDYWxs
RnJhbWVIZWFkZXJTaXplID0gNiwKKworICAgICAgICBBcmd1bWVudENvdW50ID0gLTYsCisgICAg
ICAgIENhbGxlckZyYW1lID0gLTUsCisgICAgICAgIENhbGxlZSA9IC00LAorICAgICAgICBTY29w
ZUNoYWluID0gLTMsCisgICAgICAgIFJldHVyblBDID0gLTIsIC8vIFRoaXMgaXMgZWl0aGVyIGFu
IEluc3RydWN0aW9uKiBvciBhIHBvaW50ZXIgaW50byBKSVQgZ2VuZXJhdGVkIGNvZGUgc3RvcmVk
IGFzIGFuIEluc3RydWN0aW9uKi4KKyAgICAgICAgQ29kZUJsb2NrID0gLTEsCisgICAgfTsKIAot
I2lmIEhBVkUoVklSVFVBTEFMTE9DKQotICAgICAgICBSZWdpc3RlciogbV9jb21taXRFbmQ7Ci0j
ZW5kaWYKKyAgICBlbnVtIHsgUHJvZ3JhbUNvZGVUaGlzUmVnaXN0ZXIgPSAtQ2FsbEZyYW1lSGVh
ZGVyU2l6ZSAtIDEgfTsKIAotICAgICAgICBXZWFrR0NQdHI8SlNHbG9iYWxPYmplY3Q+IG1fZ2xv
YmFsT2JqZWN0OyAvLyBUaGUgZ2xvYmFsIG9iamVjdCB3aG9zZSB2YXJzIGFyZSBjdXJyZW50bHkg
c3RvcmVkIGluIHRoZSByZWdpc3RlciBmaWxlLgotICAgIH07CisgICAgc3RhdGljIGNvbnN0IHNp
emVfdCBkZWZhdWx0Q2FwYWNpdHkgPSA1MjQyODg7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBk
ZWZhdWx0TWF4R2xvYmFscyA9IDgxOTI7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBjb21taXRT
aXplID0gMSA8PCAxNDsKKyAgICAvLyBBbGxvdyA4ayBvZiBleGNlc3MgcmVnaXN0ZXJzIGJlZm9y
ZSB3ZSBzdGFydCB0cnlpbmcgdG8gcmVhcCB0aGUgcmVnaXN0ZXJmaWxlCisgICAgc3RhdGljIGNv
bnN0IHB0cmRpZmZfdCBtYXhFeGNlc3NDYXBhY2l0eSA9IDggKiAxMDI0OworCisgICAgUmVnaXN0
ZXJGaWxlKHNpemVfdCBjYXBhY2l0eSA9IGRlZmF1bHRDYXBhY2l0eSwgc2l6ZV90IG1heEdsb2Jh
bHMgPSBkZWZhdWx0TWF4R2xvYmFscyk7CisgICAgflJlZ2lzdGVyRmlsZSgpOworCisgICAgUmVn
aXN0ZXIqIHN0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9zdGFydDsgfQorICAgIFJlZ2lzdGVyKiBl
bmQoKSBjb25zdCB7IHJldHVybiBtX2VuZDsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyBy
ZXR1cm4gbV9lbmQgLSBtX3N0YXJ0OyB9CisKKyAgICB2b2lkIHNldEdsb2JhbE9iamVjdChKU0ds
b2JhbE9iamVjdCopOworICAgIGJvb2wgY2xlYXJHbG9iYWxPYmplY3QoSlNHbG9iYWxPYmplY3Qq
KTsKKyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KCk7CisKKyAgICBib29sIGdyb3co
UmVnaXN0ZXIqIG5ld0VuZCk7CisgICAgdm9pZCBzaHJpbmsoUmVnaXN0ZXIqIG5ld0VuZCk7Cisg
ICAgCisgICAgdm9pZCBzZXROdW1HbG9iYWxzKHNpemVfdCBudW1HbG9iYWxzKSB7IG1fbnVtR2xv
YmFscyA9IG51bUdsb2JhbHM7IH0KKyAgICBpbnQgbnVtR2xvYmFscygpIGNvbnN0IHsgcmV0dXJu
IG1fbnVtR2xvYmFsczsgfQorICAgIHNpemVfdCBtYXhHbG9iYWxzKCkgY29uc3QgeyByZXR1cm4g
bV9tYXhHbG9iYWxzOyB9CisKKyAgICBSZWdpc3RlciogbGFzdEdsb2JhbCgpIGNvbnN0IHsgcmV0
dXJuIG1fc3RhcnQgLSBtX251bUdsb2JhbHM7IH0KKyAgICAKKyAgICB2b2lkIG1hcmtHbG9iYWxz
KE1hcmtTdGFjayYgbWFya1N0YWNrLCBIZWFwKiBoZWFwKSB7IGhlYXAtPm1hcmtDb25zZXJ2YXRp
dmVseShtYXJrU3RhY2ssIGxhc3RHbG9iYWwoKSwgbV9zdGFydCk7IH0KKyAgICB2b2lkIG1hcmtD
YWxsRnJhbWVzKE1hcmtTdGFjayYgbWFya1N0YWNrLCBIZWFwKiBoZWFwKSB7IGhlYXAtPm1hcmtD
b25zZXJ2YXRpdmVseShtYXJrU3RhY2ssIG1fc3RhcnQsIG1fZW5kKTsgfQorCitwcml2YXRlOgor
ICAgIHZvaWQgcmVsZWFzZUV4Y2Vzc0NhcGFjaXR5KCk7CisgICAgc2l6ZV90IG1fbnVtR2xvYmFs
czsKKyAgICBjb25zdCBzaXplX3QgbV9tYXhHbG9iYWxzOworICAgIFJlZ2lzdGVyKiBtX3N0YXJ0
OworICAgIFJlZ2lzdGVyKiBtX2VuZDsKKyAgICBSZWdpc3RlciogbV9tYXg7CisgICAgUmVnaXN0
ZXIqIG1fYnVmZmVyOworICAgIFJlZ2lzdGVyKiBtX21heFVzZWQ7CiAKLSAgICAvLyBGSVhNRTog
QWRkIGEgZ2VuZXJpYyBnZXRwYWdlc2l6ZSgpIHRvIFdURiwgdGhlbiBtb3ZlIHRoaXMgZnVuY3Rp
b24gdG8gV1RGIGFzIHdlbGwuCi0gICAgaW5saW5lIGJvb2wgaXNQYWdlQWxpZ25lZChzaXplX3Qg
c2l6ZSkgeyByZXR1cm4gc2l6ZSAhPSAwICYmIHNpemUgJSAoOCAqIDEwMjQpID09IDA7IH0KKyNp
ZiBIQVZFKFZJUlRVQUxBTExPQykKKyAgICBSZWdpc3RlciogbV9jb21taXRFbmQ7CisjZW5kaWYK
IAotICAgIGlubGluZSBSZWdpc3RlckZpbGU6OlJlZ2lzdGVyRmlsZShzaXplX3QgY2FwYWNpdHks
IHNpemVfdCBtYXhHbG9iYWxzKQotICAgICAgICA6IG1fbnVtR2xvYmFscygwKQotICAgICAgICAs
IG1fbWF4R2xvYmFscyhtYXhHbG9iYWxzKQotICAgICAgICAsIG1fc3RhcnQoMCkKLSAgICAgICAg
LCBtX2VuZCgwKQotICAgICAgICAsIG1fbWF4KDApCi0gICAgICAgICwgbV9idWZmZXIoMCkKLSAg
ICB7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IG91ciB2YWx1ZXMgd2lsbCBwbGF5IG5pY2Ugd2l0
aCBtbWFwIGFuZCBWaXJ0dWFsQWxsb2MuCi0gICAgICAgIEFTU0VSVChpc1BhZ2VBbGlnbmVkKG1h
eEdsb2JhbHMpKTsKLSAgICAgICAgQVNTRVJUKGlzUGFnZUFsaWduZWQoY2FwYWNpdHkpKTsKLQot
ICAgICAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gKGNhcGFjaXR5ICsgbWF4R2xvYmFscykgKiBz
aXplb2YoUmVnaXN0ZXIpOwotICAgICNpZiBIQVZFKE1NQVApCi0gICAgICAgIG1fYnVmZmVyID0g
c3RhdGljX2Nhc3Q8UmVnaXN0ZXIqPihtbWFwKDAsIGJ1ZmZlckxlbmd0aCwgUFJPVF9SRUFEfFBS
T1RfV1JJVEUsIE1BUF9QUklWQVRFfE1BUF9BTk9OLCBWTV9UQUdfRk9SX1JFR0lTVEVSRklMRV9N
RU1PUlksIDApKTsKLSAgICAgICAgaWYgKG1fYnVmZmVyID09IE1BUF9GQUlMRUQpIHsKKyNpZiBP
UyhTWU1CSUFOKQorICAgIC8vIENvbW1pdHMgYW5kIGZyZWVzIGEgY29udGluZ3VvdXMgY2h1bmsg
b2YgbWVtb3J5IGFzIHJlcXVpcmVkCisgICAgV1RGOjpSZWdpc3RlckZpbGVBbGxvY2F0b3IqIG1f
cmVnaXN0ZXJGaWxlQWxsb2NhdG9yOyAKKyNlbmRpZgorCisgICAgV2Vha0dDUHRyPEpTR2xvYmFs
T2JqZWN0PiBtX2dsb2JhbE9iamVjdDsgLy8gVGhlIGdsb2JhbCBvYmplY3Qgd2hvc2UgdmFycyBh
cmUgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgZmlsZS4KK307CisKKy8vIEZJWE1F
OiBBZGQgYSBnZW5lcmljIGdldHBhZ2VzaXplKCkgdG8gV1RGLCB0aGVuIG1vdmUgdGhpcyBmdW5j
dGlvbiB0byBXVEYgYXMgd2VsbC4KKy8vIFRoaXMgaXMgc3RpbGwgYSBoYWNrIHRoYXQgc2hvdWxk
IGJlIGZpeGVkIGxhdGVyLiBXZSBrbm93IHRoYXQgYSBTeW1iaWFuIHBhZ2Ugc2l6ZSBpcyA0Sy4K
KyNpZiBPUyhTWU1CSUFOKQoraW5saW5lIGJvb2wgaXNQYWdlQWxpZ25lZChzaXplX3Qgc2l6ZSkg
eyByZXR1cm4gc2l6ZSAmJiAhKHNpemUgJSAoNCAqIDEwMjQpKTsgfQorI2Vsc2UgICAgCitpbmxp
bmUgYm9vbCBpc1BhZ2VBbGlnbmVkKHNpemVfdCBzaXplKSB7IHJldHVybiBzaXplICYmICEoc2l6
ZSAlICg4ICogMTAyNCkpOyB9CisjZW5kaWYKKworaW5saW5lIFJlZ2lzdGVyRmlsZTo6UmVnaXN0
ZXJGaWxlKHNpemVfdCBjYXBhY2l0eSwgc2l6ZV90IG1heEdsb2JhbHMpCisgICAgOiBtX251bUds
b2JhbHMoMCkKKyAgICAsIG1fbWF4R2xvYmFscyhtYXhHbG9iYWxzKQorICAgICwgbV9zdGFydCgw
KQorICAgICwgbV9lbmQoMCkKKyAgICAsIG1fbWF4KDApCisgICAgLCBtX2J1ZmZlcigwKQorewor
ICAgIC8vIFZlcmlmeSB0aGF0IG91ciB2YWx1ZXMgd2lsbCBwbGF5IG5pY2Ugd2l0aCBtbWFwIGFu
ZCBWaXJ0dWFsQWxsb2MuCisgICAgQVNTRVJUKGlzUGFnZUFsaWduZWQobWF4R2xvYmFscykpOwor
ICAgIEFTU0VSVChpc1BhZ2VBbGlnbmVkKGNhcGFjaXR5KSk7CisKKyAgICBzaXplX3QgYnVmZmVy
TGVuZ3RoID0gKGNhcGFjaXR5ICsgbWF4R2xvYmFscykgKiBzaXplb2YoUmVnaXN0ZXIpOworI2lm
IEhBVkUoTU1BUCkKKyAgICBtX2J1ZmZlciA9IHN0YXRpY19jYXN0PFJlZ2lzdGVyKj4obW1hcCgw
LCBidWZmZXJMZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQ
X0FOT04sIFZNX1RBR19GT1JfUkVHSVNURVJGSUxFX01FTU9SWSwgMCkpOworICAgIGlmIChtX2J1
ZmZlciA9PSBNQVBfRkFJTEVEKSB7CiAjaWYgT1MoV0lOQ0UpCi0gICAgICAgICAgICBmcHJpbnRm
KHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByZWdpc3RlciBmaWxlOiAlZFxuIiwgR2V0TGFz
dEVycm9yKCkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBy
ZWdpc3RlciBmaWxlOiAlZFxuIiwgR2V0TGFzdEVycm9yKCkpOwogI2Vsc2UKLSAgICAgICAgICAg
IGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIGZpbGU6ICVkXG4i
LCBlcnJubyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJl
Z2lzdGVyIGZpbGU6ICVkXG4iLCBlcnJubyk7CiAjZW5kaWYKLSAgICAgICAgICAgIENSQVNIKCk7
Ci0gICAgICAgIH0KLSAgICAjZWxpZiBIQVZFKFZJUlRVQUxBTExPQykKLSAgICAgICAgbV9idWZm
ZXIgPSBzdGF0aWNfY2FzdDxSZWdpc3Rlcio+KFZpcnR1YWxBbGxvYygwLCByb3VuZFVwQWxsb2Nh
dGlvblNpemUoYnVmZmVyTGVuZ3RoLCBjb21taXRTaXplKSwgTUVNX1JFU0VSVkUsIFBBR0VfUkVB
RFdSSVRFKSk7Ci0gICAgICAgIGlmICghbV9idWZmZXIpIHsKKyAgICAgICAgQ1JBU0goKTsKKyAg
ICB9CisjZWxpZiBIQVZFKFZJUlRVQUxBTExPQykKKyAgICBtX2J1ZmZlciA9IHN0YXRpY19jYXN0
PFJlZ2lzdGVyKj4oVmlydHVhbEFsbG9jKDAsIHJvdW5kVXBBbGxvY2F0aW9uU2l6ZShidWZmZXJM
ZW5ndGgsIGNvbW1pdFNpemUpLCBNRU1fUkVTRVJWRSwgUEFHRV9SRUFEV1JJVEUpKTsKKyAgICBp
ZiAoIW1fYnVmZmVyKSB7CiAjaWYgT1MoV0lOQ0UpCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVy
ciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByZWdpc3RlciBmaWxlOiAlZFxuIiwgR2V0TGFzdEVycm9y
KCkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByZWdpc3Rl
ciBmaWxlOiAlZFxuIiwgR2V0TGFzdEVycm9yKCkpOwogI2Vsc2UKLSAgICAgICAgICAgIGZwcmlu
dGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIGZpbGU6ICVkXG4iLCBlcnJu
byk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVy
IGZpbGU6ICVkXG4iLCBlcnJubyk7CiAjZW5kaWYKLSAgICAgICAgICAgIENSQVNIKCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgc2l6ZV90IGNvbW1pdHRlZFNpemUgPSByb3VuZFVwQWxsb2NhdGlvblNp
emUobWF4R2xvYmFscyAqIHNpemVvZihSZWdpc3RlciksIGNvbW1pdFNpemUpOwotICAgICAgICB2
b2lkKiBjb21taXRDaGVjayA9IFZpcnR1YWxBbGxvYyhtX2J1ZmZlciwgY29tbWl0dGVkU2l6ZSwg
TUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOwotICAgICAgICBpZiAoY29tbWl0Q2hlY2sgIT0g
bV9idWZmZXIpIHsKKyAgICAgICAgQ1JBU0goKTsKKyAgICB9CisgICAgc2l6ZV90IGNvbW1pdHRl
ZFNpemUgPSByb3VuZFVwQWxsb2NhdGlvblNpemUobWF4R2xvYmFscyAqIHNpemVvZihSZWdpc3Rl
ciksIGNvbW1pdFNpemUpOworICAgIHZvaWQqIGNvbW1pdENoZWNrID0gVmlydHVhbEFsbG9jKG1f
YnVmZmVyLCBjb21taXR0ZWRTaXplLCBNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSk7CisgICAg
aWYgKGNvbW1pdENoZWNrICE9IG1fYnVmZmVyKSB7CiAjaWYgT1MoV0lOQ0UpCi0gICAgICAgICAg
ICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByZWdpc3RlciBmaWxlOiAlZFxu
IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBh
bGxvY2F0ZSByZWdpc3RlciBmaWxlOiAlZFxuIiwgR2V0TGFzdEVycm9yKCkpOwogI2Vsc2UKLSAg
ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIGZp
bGU6ICVkXG4iLCBlcnJubyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFs
bG9jYXRlIHJlZ2lzdGVyIGZpbGU6ICVkXG4iLCBlcnJubyk7CiAjZW5kaWYKLSAgICAgICAgICAg
IENSQVNIKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9jb21taXRFbmQgPSByZWludGVycHJldF9j
YXN0PFJlZ2lzdGVyKj4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obV9idWZmZXIpICsgY29tbWl0
dGVkU2l6ZSk7Ci0gICAgI2Vsc2UgCi0gICAgICAgIC8qIAotICAgICAgICAgKiBJZiBuZWl0aGVy
IE1NQVAgbm9yIFZJUlRVQUxBTExPQyBhcmUgYXZhaWxhYmxlIC0gdXNlIGZhc3RNYWxsb2MgaW5z
dGVhZC4KLSAgICAgICAgICoKLSAgICAgICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIHRo
ZSBmYWxsYmFjayBjYXNlLCB3aGljaCBpcyBub24tb3B0aW1hbC4KLSAgICAgICAgICogSWYgYW55
IHBvc3NpYmxlLCB0aGUgcGxhdGZvcm0gc2hvdWxkIHByb3ZpZGUgZm9yIGEgYmV0dGVyIG1lbW9y
eQotICAgICAgICAgKiBhbGxvY2F0aW9uIG1lY2hhbmlzbSB0aGF0IGFsbG93cyBmb3IgImxhenkg
Y29tbWl0IiBvciBkeW5hbWljCi0gICAgICAgICAqIHByZS1hbGxvY2F0aW9uLCBzaW1pbGFyIHRv
IG1tYXAgb3IgVmlydHVhbEFsbG9jLCB0byBhdm9pZCB3YXN0ZSBvZiBtZW1vcnkuCi0gICAgICAg
ICAqLwotICAgICAgICBtX2J1ZmZlciA9IHN0YXRpY19jYXN0PFJlZ2lzdGVyKj4oZmFzdE1hbGxv
YyhidWZmZXJMZW5ndGgpKTsKLSAgICAjZW5kaWYKLSAgICAgICAgbV9zdGFydCA9IG1fYnVmZmVy
ICsgbWF4R2xvYmFsczsKLSAgICAgICAgbV9lbmQgPSBtX3N0YXJ0OwotICAgICAgICBtX21heFVz
ZWQgPSBtX2VuZDsKLSAgICAgICAgbV9tYXggPSBtX3N0YXJ0ICsgY2FwYWNpdHk7CisgICAgICAg
IENSQVNIKCk7CiAgICAgfQotCi0gICAgaW5saW5lIHZvaWQgUmVnaXN0ZXJGaWxlOjpzaHJpbmso
UmVnaXN0ZXIqIG5ld0VuZCkKLSAgICB7Ci0gICAgICAgIGlmIChuZXdFbmQgPj0gbV9lbmQpCi0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG1fZW5kID0gbmV3RW5kOwotICAgICAgICBpZiAo
bV9lbmQgPT0gbV9zdGFydCAmJiAobV9tYXhVc2VkIC0gbV9zdGFydCkgPiBtYXhFeGNlc3NDYXBh
Y2l0eSkKLSAgICAgICAgICAgIHJlbGVhc2VFeGNlc3NDYXBhY2l0eSgpOworICAgIG1fY29tbWl0
RW5kID0gcmVpbnRlcnByZXRfY2FzdDxSZWdpc3Rlcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+
KG1fYnVmZmVyKSArIGNvbW1pdHRlZFNpemUpOworI2VsaWYgT1MoU1lNQklBTikKKyAgICBtX3Jl
Z2lzdGVyRmlsZUFsbG9jYXRvciA9IG5ldyBXVEY6OlJlZ2lzdGVyRmlsZUFsbG9jYXRvcihidWZm
ZXJMZW5ndGgpOworICAgIG1fYnVmZmVyID0gKFJlZ2lzdGVyKikobV9yZWdpc3RlckZpbGVBbGxv
Y2F0b3ItPmJ1ZmZlcigpKTsKKyAgICAvLyBzdGFydCBieSBjb21taXR0aW5nIGVub3VnaCBzcGFj
ZSB0byBob2xkIG1heEdsb2JhbHMKKyAgICB2b2lkKiBuZXdFbmQgPSAodm9pZCopKChpbnQpbV9i
dWZmZXIgKyAobWF4R2xvYmFscyAqIHNpemVvZihSZWdpc3RlcikpKTsKKyAgICBtX3JlZ2lzdGVy
RmlsZUFsbG9jYXRvci0+Z3JvdyhuZXdFbmQpOworI2Vsc2UgCisgICAgLyogCisgICAgICogSWYg
bmVpdGhlciBNTUFQIG5vciBWSVJUVUFMQUxMT0MgYXJlIGF2YWlsYWJsZSAtIHVzZSBmYXN0TWFs
bG9jIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgdGhl
IGZhbGxiYWNrIGNhc2UsIHdoaWNoIGlzIG5vbi1vcHRpbWFsLgorICAgICAqIElmIGFueSBwb3Nz
aWJsZSwgdGhlIHBsYXRmb3JtIHNob3VsZCBwcm92aWRlIGZvciBhIGJldHRlciBtZW1vcnkKKyAg
ICAgKiBhbGxvY2F0aW9uIG1lY2hhbmlzbSB0aGF0IGFsbG93cyBmb3IgImxhenkgY29tbWl0IiBv
ciBkeW5hbWljCisgICAgICogcHJlLWFsbG9jYXRpb24sIHNpbWlsYXIgdG8gbW1hcCBvciBWaXJ0
dWFsQWxsb2MsIHRvIGF2b2lkIHdhc3RlIG9mIG1lbW9yeS4KKyAgICAgKi8KKyAgICBtX2J1ZmZl
ciA9IHN0YXRpY19jYXN0PFJlZ2lzdGVyKj4oZmFzdE1hbGxvYyhidWZmZXJMZW5ndGgpKTsKKyNl
bmRpZgorICAgIG1fc3RhcnQgPSBtX2J1ZmZlciArIG1heEdsb2JhbHM7CisgICAgbV9lbmQgPSBt
X3N0YXJ0OworICAgIG1fbWF4VXNlZCA9IG1fZW5kOworICAgIG1fbWF4ID0gbV9zdGFydCArIGNh
cGFjaXR5OworfQorCitpbmxpbmUgdm9pZCBSZWdpc3RlckZpbGU6OnNocmluayhSZWdpc3Rlciog
bmV3RW5kKQoreworICAgIGlmIChuZXdFbmQgPj0gbV9lbmQpCisgICAgICAgIHJldHVybjsKKyAg
ICBtX2VuZCA9IG5ld0VuZDsKKyAgICBpZiAobV9lbmQgPT0gbV9zdGFydCAmJiAobV9tYXhVc2Vk
IC0gbV9zdGFydCkgPiBtYXhFeGNlc3NDYXBhY2l0eSkgeworI2lmIE9TKFNZTUJJQU4pCisgICAg
ICAgIG1fcmVnaXN0ZXJGaWxlQWxsb2NhdG9yLT5zaHJpbmsobmV3RW5kKTsKKyNlbmRpZiAKKyAg
ICAgICAgcmVsZWFzZUV4Y2Vzc0NhcGFjaXR5KCk7CiAgICAgfQorfQogCi0gICAgaW5saW5lIGJv
b2wgUmVnaXN0ZXJGaWxlOjpncm93KFJlZ2lzdGVyKiBuZXdFbmQpCi0gICAgewotICAgICAgICBp
ZiAobmV3RW5kIDwgbV9lbmQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKK2lubGluZSBib29s
IFJlZ2lzdGVyRmlsZTo6Z3JvdyhSZWdpc3RlciogbmV3RW5kKQoreworICAgIGlmIChuZXdFbmQg
PCBtX2VuZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgaWYgKG5ld0VuZCA+IG1f
bWF4KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChuZXdFbmQgPiBtX21heCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAjaWYgIUhBVkUoTU1BUCkgJiYgSEFWRShWSVJUVUFM
QUxMT0MpCi0gICAgICAgIGlmIChuZXdFbmQgPiBtX2NvbW1pdEVuZCkgewotICAgICAgICAgICAg
c2l6ZV90IHNpemUgPSByb3VuZFVwQWxsb2NhdGlvblNpemUocmVpbnRlcnByZXRfY2FzdDxjaGFy
Kj4obmV3RW5kKSAtIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fY29tbWl0RW5kKSwgY29tbWl0
U2l6ZSk7Ci0gICAgICAgICAgICBpZiAoIVZpcnR1YWxBbGxvYyhtX2NvbW1pdEVuZCwgc2l6ZSwg
TUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpKSB7CisgICAgaWYgKG5ld0VuZCA+IG1fY29tbWl0
RW5kKSB7CisgICAgICAgIHNpemVfdCBzaXplID0gcm91bmRVcEFsbG9jYXRpb25TaXplKHJlaW50
ZXJwcmV0X2Nhc3Q8Y2hhcio+KG5ld0VuZCkgLSByZWludGVycHJldF9jYXN0PGNoYXIqPihtX2Nv
bW1pdEVuZCksIGNvbW1pdFNpemUpOworICAgICAgICBpZiAoIVZpcnR1YWxBbGxvYyhtX2NvbW1p
dEVuZCwgc2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpKSB7CiAjaWYgT1MoV0lOQ0Up
Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgcmVn
aXN0ZXIgZmlsZTogJWRcbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgIGZwcmludGYo
c3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJlZ2lzdGVyIGZpbGU6ICVkXG4iLCBHZXRMYXN0
RXJyb3IoKSk7CiAjZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQg
bm90IGFsbG9jYXRlIHJlZ2lzdGVyIGZpbGU6ICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICBm
cHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByZWdpc3RlciBmaWxlOiAlZFxuIiwg
ZXJybm8pOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgQ1JBU0goKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIG1fY29tbWl0RW5kID0gcmVpbnRlcnByZXRfY2FzdDxSZWdpc3Rlcio+KHJl
aW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fY29tbWl0RW5kKSArIHNpemUpOworICAgICAgICAgICAg
Q1JBU0goKTsKICAgICAgICAgfQorICAgICAgICBtX2NvbW1pdEVuZCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8UmVnaXN0ZXIqPihyZWludGVycHJldF9jYXN0PGNoYXIqPihtX2NvbW1pdEVuZCkgKyBzaXpl
KTsKKyAgICB9CiAjZW5kaWYKIAotICAgICAgICBpZiAobmV3RW5kID4gbV9tYXhVc2VkKQotICAg
ICAgICAgICAgbV9tYXhVc2VkID0gbmV3RW5kOworI2lmIE9TKFNZTUJJQU4pCisgICAgbV9yZWdp
c3RlckZpbGVBbGxvY2F0b3ItPmdyb3coKHZvaWQqKW5ld0VuZCk7CisjZW5kaWYKIAotICAgICAg
ICBtX2VuZCA9IG5ld0VuZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQorICAgIGlmIChu
ZXdFbmQgPiBtX21heFVzZWQpCisgICAgICAgIG1fbWF4VXNlZCA9IG5ld0VuZDsKKworICAgIG1f
ZW5kID0gbmV3RW5kOworICAgIHJldHVybiB0cnVlOworfQogCiB9IC8vIG5hbWVzcGFjZSBKU0MK
IApJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vUmVnaXN0ZXJGaWxlQWxsb2NhdG9y
U3ltYmlhbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vUmVn
aXN0ZXJGaWxlQWxsb2NhdG9yU3ltYmlhbi5jcHAJKHJldmlzaW9uIDApCisrKyBKYXZhU2NyaXB0
Q29yZS93dGYvc3ltYmlhbi9SZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEg
Q29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorCisjaWYgT1MoU1lNQklBTikKKworI2luY2x1ZGUgIlJlZ2lzdGVyRmlsZUFsbG9jYXRv
clN5bWJpYW4uaCIKKworbmFtZXNwYWNlIFdURiB7CisKKy8qKiBFZmZpY2llbnRseSBhbGxvY2F0
ZXMgbWVtb3J5IHBvb2xzIG9mIHNpemUgcG9vbFNpemUuCisgKiBQcmltYXJpbHkgZGVzaWduZWQg
Zm9yIEpTQyBSZWdpc3RlckZpbGUncyBuZWVkcy4gCisgKiBOb3QgdGhyZWFkLXNhZmUuICAgIAor
ICovCitSZWdpc3RlckZpbGVBbGxvY2F0b3I6OlJlZ2lzdGVyRmlsZUFsbG9jYXRvcihUVWludDMy
IHJlc2VydmF0aW9uU2l6ZSwgVFVpbnQzMiBwb29sU2l6ZSkgOgorICAgIG1fcmVzZXJ2ZWQocmVz
ZXJ2YXRpb25TaXplKSwgbV9wb29sU2l6ZShwb29sU2l6ZSkKK3sKKyAgICAvLyBHZXQgc3lzdGVt
J3MgcGFnZSBzaXplIHZhbHVlLgorICAgIFNZTUJJQU5fUEFHRVNJWkUobV9wYWdlU2l6ZSk7CisK
KyAgICAvLyBXZSBvbmx5IGFjY2VwdCBtdWx0aXBsZXMgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSBmb3Ig
Ym90aCBpbml0aWFsIHJlc2VydmF0aW9uCisgICAgLy8gYW5kIHRoZSBhbGlnbm1lbnQvcG9vbCBz
aXplCisgICAgbV9yZXNlcnZlZCA9IFNZTUJJQU5fUk9VTkRVUFRPTVVMVElQTEUobV9yZXNlcnZl
ZCwgbV9wYWdlU2l6ZSk7CisgICAgX19BU1NFUlRfQUxXQVlTKFNZTUJJQU5fUk9VTkRVUFRPTVVM
VElQTEUobV9wb29sU2l6ZSwgbV9wYWdlU2l6ZSksIAorICAgICAgICAgICAgICAgICAgICBVc2Vy
OjpQYW5pYyhfTCgiUmVnaXN0ZXJGaWxlQWxsb2NhdG9yMSIpLCBLRXJyQXJndW1lbnQpKTsKKyAg
ICAgCisgICAgLy8gT3BlbiBhIFN5bWJpYW4gUkNodW5rLCBhbmQgcmVzZXJ2ZSByZXF1ZXN0ZWQg
dmlydHVhbCBhZGRyZXNzIHJhbmdlICAgCisgICAgLy8gQW55IHRocmVhZCBpbiB0aGlzIHByb2Nl
c3MgY2FuIG9wZXJhdGUgdGhpcyBSQ2h1bmsgZHVlIHRvIEVPd25lclByb2Nlc3MgYWNjZXNzIHJp
Z2h0cy4gCisgICAgVEludCByZXQgPSBtX2NodW5rLkNyZWF0ZURpc2Nvbm5lY3RlZExvY2FsKDAg
LCAwLCAoVEludCltX3Jlc2VydmVkICwgRU93bmVyUHJvY2Vzcyk7ICAKKyAgICBpZiAocmV0ICE9
IEtFcnJOb25lKSAKKyAgICAgICAgVXNlcjo6UGFuaWMoX0woIlJlZ2lzdGVyRmlsZUFsbG9jYXRv
cjIiKSwgcmV0KTsKKworICAgIG1fYnVmZmVyID0gKHZvaWQqKW1fY2h1bmsuQmFzZSgpOworICAg
IG1fcmVzRW5kID0gKHZvaWQqKShtX2NodW5rLkJhc2UoKSArIG1fY2h1bmsuTWF4U2l6ZSgpKTsK
KyAgICBtX2NvbUVuZCA9IG1fYnVmZmVyOworfQorCitSZWdpc3RlckZpbGVBbGxvY2F0b3I6On5S
ZWdpc3RlckZpbGVBbGxvY2F0b3IoKQoreworICAgIC8vIHJlbGVhc2UgZXZlcnl0aGluZyEKKyAg
ICBtX2NodW5rLkRlY29tbWl0KDAsIG1fY2h1bmsuTWF4U2l6ZSgpKTsKKyAgICBtX2NodW5rLkNs
b3NlKCk7Cit9CisKK3ZvaWQqIFJlZ2lzdGVyRmlsZUFsbG9jYXRvcjo6YnVmZmVyKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9idWZmZXI7Cit9CisKK3ZvaWQgUmVnaXN0ZXJGaWxlQWxsb2NhdG9y
Ojpncm93KHZvaWQqIG5ld0VuZCkKK3sKKyAgICAvLyB0cnlpbmcgdG8gY29tbWl0IG1vcmUgbWVt
b3J5IHRoYW4gcmVzZXJ2ZWQhCisgICAgaWYgKG5ld0VuZCA+IG1fcmVzRW5kKQorICAgICAgICBy
ZXR1cm47CisgICAgCisgICAgaWYgKG5ld0VuZCA+IG1fY29tRW5kKSB7CisgICAgICAgIFRJbnQg
bkJ5dGVzID0gKFRJbnQpKG5ld0VuZCkgLSAoVEludCkobV9jb21FbmQpOworICAgICAgICBuQnl0
ZXMgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKG5CeXRlcywgbV9wb29sU2l6ZSk7CisgICAg
ICAgIFRJbnQgb2Zmc2V0ID0gKFRJbnQpbV9jb21FbmQgLSAoVEludCltX2J1ZmZlcjsKKyAgICAg
ICAgCisgICAgICAgIFRJbnQgcmV0ID0gbV9jaHVuay5Db21taXQob2Zmc2V0LCBuQnl0ZXMpOwor
ICAgICAgICBpZiAocmV0ID09IEtFcnJOb25lKQorICAgICAgICAgICAgbV9jb21FbmQgPSAodm9p
ZCopKG1fY2h1bmsuQmFzZSgpICsgbV9jaHVuay5TaXplKCkpOworICAgIH0KK30KKwordm9pZCBS
ZWdpc3RlckZpbGVBbGxvY2F0b3I6OnNocmluayh2b2lkKiBuZXdFbmQpCit7CisgICAgaWYgKG5l
d0VuZCA8IG1fY29tRW5kKSB7CisgICAgICAgIFRJbnQgbkJ5dGVzID0gKFRJbnQpbmV3RW5kIC0g
KFRJbnQpbV9jb21FbmQ7CisgICAgICAgIGlmIChuQnl0ZXMgPj0gbV9wb29sU2l6ZSkgeworICAg
ICAgICAgICAgVEludCBvZmZzZXQgPSBTWU1CSUFOX1JPVU5EVVBUT01VTFRJUExFKChUVWludClu
ZXdFbmQsIG1fcG9vbFNpemUpIC0gKFRJbnQpbV9idWZmZXI7CisgICAgICAgICAgICBuQnl0ZXMg
PSAoVEludCltX2NvbUVuZCAtIG9mZnNldCAtIChUSW50KW1fYnVmZmVyOyAKKyAgICAgICAgICAg
IGlmIChuQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgVEludCByZXQgPSBtX2NodW5rLkRl
Y29tbWl0KG9mZnNldCwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEtFcnJO
b25lKQorICAgICAgICAgICAgICAgICAgICBtX2NvbUVuZCA9ICh2b2lkKikobV9jaHVuay5CYXNl
KCkgKyBtX2NodW5rLlNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9
CisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gU1lNQklBTgoKUHJvcGVydHkg
Y2hhbmdlcyBvbjogSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vUmVnaXN0ZXJGaWxlQWxsb2Nh
dG9yU3ltYmlhbi5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmV4ZWN1dGFibGUKICAgKyAqCgpJ
bmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vUmVnaXN0ZXJGaWxlQWxsb2NhdG9yU3lt
Ymlhbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFuL1JlZ2lzdGVy
RmlsZUFsbG9jYXRvclN5bWJpYW4uaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0
Zi9zeW1iaWFuL1JlZ2lzdGVyRmlsZUFsbG9jYXRvclN5bWJpYW4uaAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlv
biBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4g
IE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0
aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJlZ2lzdGVyRmlsZUFsbG9j
YXRvclN5bWJpYW5faAorI2RlZmluZSBSZWdpc3RlckZpbGVBbGxvY2F0b3JTeW1iaWFuX2gKKwor
I2luY2x1ZGUgIlN5bWJpYW5EZWZpbmVzLmgiCisKK25hbWVzcGFjZSBXVEYgeworCisvKiogCisg
KiAgQWxsb2NhdGVzIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBzaXplIHBvb2xTaXplLgorICogIHBv
b2xTaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzeXN0ZW0gcGFnZSBzaXplICh0eXBpY2FsbHkg
NEsgb24gU3ltYmlhbi9BUk0pCisgKgorICogIEBwYXJhbSByZXNlcnZhdGlvblNpemUgVmlydHVh
bCBhZGRyZXNzIHJhbmdlIHRvIGJlIHJlc2VydmVkIHVwb24gY3JlYXRpb24gb2YgY2h1bmsgKGJ5
dGVzKS4KKyAqICBAcGFyYW0gcG9vbFNpemUgU2l6ZSBvZiBhIHNpbmdsZSBhbGxvY2F0aW9uLgor
ICovCitjbGFzcyBSZWdpc3RlckZpbGVBbGxvY2F0b3IgeworCitwdWJsaWM6CisgICAgUmVnaXN0
ZXJGaWxlQWxsb2NhdG9yKAorICAgICAgICAgICAgVFVpbnQzMiByZXNlcnZhdGlvblNpemUsIFRV
aW50MzIgcG9vbFNpemUgPSBTWU1CSUFOX1JFR0ZJTEVBTExPQ19ERUZBVUxUUE9PTFNJWkUpOwor
ICAgIH5SZWdpc3RlckZpbGVBbGxvY2F0b3IoKTsKKyAgICB2b2lkKiBidWZmZXIoKSBjb25zdDsK
KyAgICB2b2lkIGdyb3codm9pZCogbmV3RW5kKTsKKyAgICB2b2lkIHNocmluayh2b2lkKiBuZXdF
bmQpOworICAgIAorcHJpdmF0ZTogCisgICAgUkNodW5rICAgbV9jaHVuazsgLy8gU3ltYmlhbiBj
aHVuayB0aGF0IGxldHMgdXMgcmVzZXJ2ZS9jb21taXQvZGVjb21taXQKKyAgICAgICAgCisgICAg
Ly8gYWxsIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGluIG51bWJlcnMgb2YgYnl0ZXMKKyAgICBUSW50
ICAgICBtX3BhZ2VTaXplOyAvLyBjYWNoZWQgdmFsdWUgb2Ygc3lzdGVtIHBhZ2Ugc2l6ZSwgdHlw
aWNhbGx5IDRLIG9uIFN5bWJpYW4KKyAgICBUVWludDMyICBtX3Jlc2VydmVkOyAvLyB0b3RhbCBu
dW1iZXIgb2YgcmVzZXJ2ZWQgYnl0ZXMgaW4gdmlydHVhbCBtZW1vcnkKKyAgICBUVWludDMyICBt
X3Bvb2xTaXplOyAvLyBzaXplIG9mIG9uZSBtZW1vcnkgcG9vbCwgc2V0IGJ5IGRlZmF1bHQgdG8g
NjRLIGluIHd0Zi9zeW1iaWFuL1N5bWJpYW5EZWZpbmVzLmgKKyAgICAgICAgCisgICAgdm9pZCog
bV9idWZmZXI7IC8vIHBvaW50ZXIgdG8gYmFzZSBvZiB0aGUgY2h1bmsKKyAgICB2b2lkKiBtX2Nv
bUVuZDsgLy8gcG9pbnRlciB0byBlbmQgb2YgY3VycmVudGx5IGNvbW1pdHRlZCBtZW1vcnkKKyAg
ICB2b2lkKiBtX3Jlc0VuZDsgLy8gcG9pbnRlciB0byBlbmQgb2YgcmVzZXJ2ZWQgbWVtb3J5Cisg
Cit9OworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UKKworI2VuZGlmIC8vIFJlZ2lzdGVyRmlsZUFs
bG9jYXRvclN5bWJpYW5faAoKUHJvcGVydHkgY2hhbmdlcyBvbjogSmF2YVNjcmlwdENvcmUvd3Rm
L3N5bWJpYW4vUmVnaXN0ZXJGaWxlQWxsb2NhdG9yU3ltYmlhbi5oCl9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6
IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9zeW1iaWFu
L1N5bWJpYW5EZWZpbmVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJp
YW4vU3ltYmlhbkRlZmluZXMuaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi9z
eW1iaWFuL1N5bWJpYW5EZWZpbmVzLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBTeW1iaWFuRGVmaW5lc19oCisjZGVmaW5lIFN5bWJpYW5E
ZWZpbmVzX2gKKworI2luY2x1ZGUgPGUzMmNtbi5oPgorI2luY2x1ZGUgPGUzMnN0ZC5oPgorI2lu
Y2x1ZGUgPGhhbC5oPgorCisjZGVmaW5lIFNZTUJJQU5fUEFHRVNJWkUoeCkgKEhBTDo6R2V0KEhB
TERhdGE6OkVNZW1vcnlQYWdlU2l6ZSwgeCkpOworI2RlZmluZSBTWU1CSUFOX0ZSRUVSQU0oeCkg
IChIQUw6OkdldChIQUxEYXRhOjpFTWVtb3J5UkFNRnJlZSwgeCkpOworI2RlZmluZSBTWU1CSUFO
X1JPVU5EVVBUT01VTFRJUExFKHgsIG11bHRpcGxlb2YpICggKHggKyBtdWx0aXBsZW9mIC0gMSkg
JiB+KG11bHRpcGxlb2YgLSAxKSApCisKKyNkZWZpbmUgU1lNQklBTl9SRUdGSUxFQUxMT0NfREVG
QVVMVFBPT0xTSVpFIDY1NTM2IC8vIDY0SworCisjZW5kaWYgLy8gU3ltYmlhbkRlZmluZXNfaAoK
UHJvcGVydHkgY2hhbmdlcyBvbjogSmF2YVNjcmlwdENvcmUvd3RmL3N5bWJpYW4vU3ltYmlhbkRl
ZmluZXMuaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZXhlY3V0YWJsZQogICArICoKCg==
</data>
<flag name="review"
          id="45764"
          type_id="1"
          status="-"
          setter="hausmann"
    />
    <flag name="commit-queue"
          id="45765"
          type_id="3"
          status="-"
          setter="hausmann"
    />
          </attachment>
      

    </bug>

</bugzilla>