<?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>34718</bug_id>
          
          <creation_ts>2010-02-08 12:56:22 -0800</creation_ts>
          <short_desc>readPixels must take PACK_ALIGNMENT into account</short_desc>
          <delta_ts>2010-04-14 03:24:06 -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>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>chinmaya</cc>
    
    <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>kbr</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>188737</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-02-08 12:56:22 -0800</bug_when>
    <thetext>The implementation of readPixels must take the PACK_ALIGNMENT into account, in particular the case where it is set to 8. This must be done for all calls to readPixels, including any done internally (for example, in the Chromium port).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>207455</commentid>
    <comment_count>1</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-01 16:00:34 -0700</bug_when>
    <thetext>The implementation must also handle the format parameter correctly, and likely perform a flush to work around apparent driver bugs where the most up-to-date rendering results are not read back.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210000</commentid>
    <comment_count>2</comment_count>
      <attachid>52825</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 22:29:29 -0700</bug_when>
    <thetext>Created attachment 52825
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210268</commentid>
    <comment_count>3</comment_count>
      <attachid>52879</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-08 10:56:27 -0700</bug_when>
    <thetext>Created attachment 52879
revised patch: flush before reading pixels</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210369</commentid>
    <comment_count>4</comment_count>
      <attachid>52894</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-08 13:59:34 -0700</bug_when>
    <thetext>Created attachment 52894
revised patch: deal with internal glReadPixels situation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210396</commentid>
    <comment_count>5</comment_count>
      <attachid>52894</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-08 14:46:33 -0700</bug_when>
    <thetext>Comment on attachment 52894
revised patch: deal with internal glReadPixels situation

Overall this looks excellent; a few comments below.

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 57249)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,21 @@
&gt; +2010-04-07  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        readPixels must take PACK_ALIGNMENT into account
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=34718
&gt; +
&gt; +        Test: fast/canvas/webgl/read-pixels.html
&gt; +
&gt; +        * html/canvas/WebGLRenderingContext.cpp:
&gt; +        (WebCore::WebGLRenderingContext::WebGLRenderingContext): Init members to support pack_alignment.
&gt; +        (WebCore::WebGLRenderingContext::pixelStorei): Save pack/unpack_alignment.
&gt; +        (WebCore::WebGLRenderingContext::readPixels): Validate enum and deal with pack_alignment.
&gt; +        * html/canvas/WebGLRenderingContext.h: Add members to support pack_alignment.
&gt; +        * platform/graphics/GraphicsContext3D.h: Refac readPixels.

Refac -&gt; Refactor

&gt; +        * platform/graphics/mac/GraphicsContext3DMac.cpp:
&gt; +        (WebCore::GraphicsContext3D::readPixels): Move array allocation and alpha fix to WebGLRenderingContext; flush before read pixels.
&gt; +
&gt;  2010-04-07  Dumitru Daniliuc  &lt;dumi@chromium.org&gt;
&gt;  
&gt;          Reviewed by Jeremy Orlow.
&gt; Index: WebCore/html/canvas/WebGLRenderingContext.cpp
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLRenderingContext.cpp	(revision 57240)
&gt; +++ WebCore/html/canvas/WebGLRenderingContext.cpp	(working copy)
&gt; @@ -38,6 +38,7 @@
&gt;  #include &quot;RenderBox.h&quot;
&gt;  #include &quot;RenderLayer.h&quot;
&gt;  #include &quot;WebGLActiveInfo.h&quot;
&gt; +#include &quot;WebGLUnsignedShortArray.h&quot;
&gt;  #include &quot;WebGLBuffer.h&quot;
&gt;  #include &quot;WebGLContextAttributes.h&quot;
&gt;  #include &quot;WebGLFramebuffer.h&quot;
&gt; @@ -85,11 +86,21 @@ WebGLRenderingContext::WebGLRenderingCon
&gt;      , m_needsUpdate(true)
&gt;      , m_markedCanvasDirty(false)
&gt;      , m_activeTextureUnit(0)
&gt; +    , m_packAlignment(4)
&gt; +    , m_unpackAlignment(4)
&gt;  {
&gt;      ASSERT(m_context);
&gt;      int numVertexAttribs = 0;
&gt;      m_context-&gt;getIntegerv(GraphicsContext3D::MAX_VERTEX_ATTRIBS, &amp;numVertexAttribs);
&gt;      m_maxVertexAttribs = numVertexAttribs;
&gt; +    int implementationColorReadFormat = GraphicsContext3D::RGBA;
&gt; +    m_context-&gt;getIntegerv(GraphicsContext3D::IMPLEMENTATION_COLOR_READ_FORMAT, &amp;implementationColorReadFormat);
&gt; +    m_implementationColorReadFormat = implementationColorReadFormat;
&gt; +    int implementationColorReadType = GraphicsContext3D::UNSIGNED_BYTE;
&gt; +    m_context-&gt;getIntegerv(GraphicsContext3D::IMPLEMENTATION_COLOR_READ_TYPE, &amp;implementationColorReadType);
&gt; +    // FIXME: remove the getError() when IMPLEMENTATION_COLOR_READ_FORMAT/TYPE are supported.
&gt; +    m_context-&gt;getError();
&gt; +    m_implementationColorReadType = implementationColorReadType;
&gt;      m_context-&gt;reshape(canvas()-&gt;width(), canvas()-&gt;height());
&gt;      m_context-&gt;viewport(0, 0, canvas()-&gt;width(), canvas()-&gt;height());
&gt;  }
&gt; @@ -1574,6 +1585,16 @@ void WebGLRenderingContext::linkProgram(
&gt;  void WebGLRenderingContext::pixelStorei(unsigned long pname, long param)
&gt;  {
&gt;      m_context-&gt;pixelStorei(pname, param);
&gt; +    if (param == 1 || param == 2 || param == 4 || param == 8) {
&gt; +        switch (pname) {
&gt; +        case GraphicsContext3D::PACK_ALIGNMENT:
&gt; +            m_packAlignment = static_cast&lt;int&gt;(param);
&gt; +            break;
&gt; +        case GraphicsContext3D::UNPACK_ALIGNMENT:
&gt; +            m_unpackAlignment = static_cast&lt;int&gt;(param);
&gt; +            break;
&gt; +        }
&gt; +    }
&gt;      cleanupAfterGraphicsCall(false);
&gt;  }
&gt;  
&gt; @@ -1585,7 +1606,76 @@ void WebGLRenderingContext::polygonOffse
&gt;  
&gt;  PassRefPtr&lt;WebGLArray&gt; WebGLRenderingContext::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type)
&gt;  {
&gt; -    RefPtr&lt;WebGLArray&gt; array = m_context-&gt;readPixels(x, y, width, height, format, type);
&gt; +    // Validate enums.
&gt; +    unsigned long componentsPerPixel = 0;
&gt; +    switch (format) {
&gt; +    case GraphicsContext3D::ALPHA:
&gt; +        componentsPerPixel = 1;
&gt; +        break;
&gt; +    case GraphicsContext3D::RGB:
&gt; +        componentsPerPixel = 3;
&gt; +        break;
&gt; +    case GraphicsContext3D::RGBA:
&gt; +        componentsPerPixel = 4;
&gt; +        break;

This is missing the LUMINANCE and LUMINANCE_ALPHA formats.

&gt; +    default:
&gt; +        m_context-&gt;synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
&gt; +        return 0;
&gt; +    }
&gt; +    unsigned long bytesPerComponent = 0;
&gt; +    switch (type) {
&gt; +    case GraphicsContext3D::UNSIGNED_BYTE:
&gt; +        bytesPerComponent = sizeof(unsigned char);
&gt; +        break;
&gt; +    case GraphicsContext3D::UNSIGNED_SHORT_5_6_5:
&gt; +    case GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4:
&gt; +    case GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1:
&gt; +        componentsPerPixel = 1;
&gt; +        bytesPerComponent = sizeof(unsigned short);
&gt; +        break;
&gt; +    default:
&gt; +        m_context-&gt;synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
&gt; +        return 0;
&gt; +    }
&gt; +    if (!(format == GraphicsContext3D::RGBA &amp;&amp; type == GraphicsContext3D::UNSIGNED_BYTE || format == m_implementationColorReadFormat &amp;&amp; type == m_implementationColorReadFormat)) {
&gt; +        m_context-&gt;synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
&gt; +        return 0;
&gt; +    }
&gt; +    // Calculate array size, taking into consideration of PACK_ALIGNMENT.
&gt; +    unsigned long bytesPerRow = componentsPerPixel * bytesPerComponent * width;
&gt; +    unsigned long padding = 0;
&gt; +    unsigned long residuleBytes = bytesPerRow % m_packAlignment;

residule -&gt; residual

&gt; +    if (residuleBytes) {
&gt; +        padding = m_packAlignment - residuleBytes;
&gt; +        bytesPerRow += padding;
&gt; +    }
&gt; +    // The last row needs no padding.
&gt; +    unsigned long totalBytes = bytesPerRow * height - padding;
&gt; +    unsigned long num = totalBytes / bytesPerComponent;
&gt; +    RefPtr&lt;WebGLArray&gt; array;
&gt; +    if (type == GraphicsContext3D::UNSIGNED_BYTE)
&gt; +        array = WebGLUnsignedByteArray::create(num);
&gt; +    else
&gt; +        array = WebGLUnsignedShortArray::create(num);
&gt; +    void* data = array-&gt;baseAddress();
&gt; +    m_context-&gt;readPixels(x, y, width, height, format, type, data);
&gt; +#if PLATFORM(CG)
&gt; +    // FIXME: remove this section when GL driver bug on Mac is fixed, i.e.,
&gt; +    // when alpha is off, readPixels should set alpha to 255 instead of 0.
&gt; +    if ((format == GraphicsContext3D::ALPHA || format == GraphicsContext3D::RGBA) &amp;&amp; !m_context-&gt;getContextAttributes().alpha) {
&gt; +        if (type == GraphicsContext3D::UNSIGNED_BYTE) {
&gt; +            unsigned char* pixels = reinterpret_cast&lt;unsigned char*&gt;(data);
&gt; +            for (unsigned long iy = 0; iy &lt; height; ++iy) {
&gt; +                for (unsigned long ix = 0; ix &lt; width; ++ix) {
&gt; +                    pixels[componentsPerPixel - 1] = 255;
&gt; +                    pixels += componentsPerPixel;
&gt; +                }
&gt; +                pixels += padding;
&gt; +            }
&gt; +        }
&gt; +        // FIXME: check whether we need to do the same with UNSIGNED_SHORT.
&gt; +    }
&gt; +#endif
&gt;      cleanupAfterGraphicsCall(false);
&gt;      return array;
&gt;  }
&gt; Index: WebCore/html/canvas/WebGLRenderingContext.h
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLRenderingContext.h	(revision 57240)
&gt; +++ WebCore/html/canvas/WebGLRenderingContext.h	(working copy)
&gt; @@ -342,6 +342,11 @@ class WebKitCSSMatrix;
&gt;          TextureUnitState m_textureUnits[32];
&gt;          unsigned long m_activeTextureUnit;
&gt;  
&gt; +        int m_packAlignment;
&gt; +        int m_unpackAlignment;
&gt; +        unsigned long m_implementationColorReadFormat;
&gt; +        unsigned long m_implementationColorReadType;
&gt; +
&gt;          // Helpers for getParameter and others
&gt;          WebGLGetInfo getBooleanParameter(unsigned long pname);
&gt;          WebGLGetInfo getFloatParameter(unsigned long pname);
&gt; Index: WebCore/platform/graphics/GraphicsContext3D.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/GraphicsContext3D.h	(revision 57240)
&gt; +++ WebCore/platform/graphics/GraphicsContext3D.h	(working copy)
&gt; @@ -592,7 +592,7 @@ namespace WebCore {
&gt;          void pixelStorei(unsigned long pname, long param);
&gt;          void polygonOffset(double factor, double units);
&gt;          
&gt; -        PassRefPtr&lt;WebGLArray&gt; readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type);
&gt; +        void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* data);
&gt;          
&gt;          void releaseShaderCompiler();
&gt;          void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height);
&gt; Index: WebCore/platform/graphics/mac/GraphicsContext3DMac.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/mac/GraphicsContext3DMac.cpp	(revision 57240)
&gt; +++ WebCore/platform/graphics/mac/GraphicsContext3DMac.cpp	(working copy)
&gt; @@ -785,36 +785,20 @@ void GraphicsContext3D::polygonOffset(do
&gt;      ::glPolygonOffset(static_cast&lt;float&gt;(factor), static_cast&lt;float&gt;(units));
&gt;  }
&gt;  
&gt; -PassRefPtr&lt;WebGLArray&gt; GraphicsContext3D::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type)
&gt; +void GraphicsContext3D::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* data)
&gt;  {
&gt;      ensureContext(m_contextObj);
&gt; -    
&gt; -    // FIXME: For now we only accept GL_UNSIGNED_BYTE/GL_RGBA. In reality OpenGL ES 2.0 accepts that pair and one other
&gt; -    // as specified by GL_IMPLEMENTATION_COLOR_READ_FORMAT and GL_IMPLEMENTATION_COLOR_READ_TYPE. But for now we will
&gt; -    // not accept those.
&gt; -    // FIXME: Also, we should throw when an unacceptable value is passed

The second FIXME should state that we should synthesize a GL error when an unacceptable value is passed. Actually, you should just synthesize an INVALID_OPERATION error and get rid of the FIXME.

&gt; -    if (type != GL_UNSIGNED_BYTE || format != GL_RGBA)
&gt; -        return 0;
&gt; -        
&gt; +    ::glFlush();

I think it&apos;s worth adding a note that the calls to glFlush appear to be necessary because of some OpenGL drivers which seem to not complete all of the previous rendering work before executing the glReadPixels.

&gt;      if (m_attrs.antialias &amp;&amp; m_boundFBO == m_multisampleFBO) {
&gt;          ::glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
&gt;          ::glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
&gt;          ::glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
&gt;          ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
&gt; +        ::glFlush();
&gt;      }
&gt; -    RefPtr&lt;WebGLUnsignedByteArray&gt; array = WebGLUnsignedByteArray::create(width * height * 4);
&gt; -    ::glReadPixels(x, y, width, height, format, type, (GLvoid*) array-&gt;data());
&gt; +    ::glReadPixels(x, y, width, height, format, type, data);
&gt;      if (m_attrs.antialias &amp;&amp; m_boundFBO == m_multisampleFBO)
&gt;          ::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_multisampleFBO);
&gt; -    if (!m_attrs.alpha) {
&gt; -        // If alpha is off, by default glReadPixels should set the alpha to 255 instead of 0.
&gt; -        // This is a hack until ::glReadPixels fixes its behavior.
&gt; -        GLubyte* data = reinterpret_cast&lt;GLubyte*&gt;(array-&gt;data());
&gt; -        unsigned byteLength = array-&gt;byteLength();
&gt; -        for (unsigned i = 3; i &lt; byteLength; i += 4)
&gt; -            data[i] = 255;
&gt; -    }
&gt; -    return array;    
&gt;  }
&gt;  
&gt;  void GraphicsContext3D::releaseShaderCompiler()
&gt; Index: WebKit/chromium/ChangeLog
&gt; ===================================================================
&gt; --- WebKit/chromium/ChangeLog	(revision 57249)
&gt; +++ WebKit/chromium/ChangeLog	(working copy)
&gt; @@ -1,3 +1,15 @@
&gt; +2010-04-07  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        readPixels must take PACK_ALIGNMENT into account
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=34718
&gt; +
&gt; +        * src/GraphicsContext3D.cpp: Refac readPixels.

Refac -&gt; Refactor

&gt; +        * src/WebGraphicsContext3DDefaultImpl.cpp:
&gt; +        (WebKit::WebGraphicsContext3DDefaultImpl::readBackFramebuffer): Temporarily disable pack alignment for glReadPixels.
&gt; +        (WebKit::WebGraphicsContext3DDefaultImpl::readPixels): Move array allocation and alpha fix to WebGLRenderingContext; flush before read pixels.
&gt; +
&gt;  2010-04-07  Pavel Feldman  &lt;pfeldman@chromium.org&gt;
&gt;  
&gt;          Reviewed by Yury Semikhatsky.
&gt; Index: WebKit/chromium/src/GraphicsContext3D.cpp
&gt; ===================================================================
&gt; --- WebKit/chromium/src/GraphicsContext3D.cpp	(revision 57240)
&gt; +++ WebKit/chromium/src/GraphicsContext3D.cpp	(working copy)
&gt; @@ -218,7 +218,7 @@ public:
&gt;      void pixelStorei(unsigned long pname, long param);
&gt;      void polygonOffset(double factor, double units);
&gt;  
&gt; -    PassRefPtr&lt;WebGLArray&gt; readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type);
&gt; +    void readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* data);
&gt;  
&gt;      void releaseShaderCompiler();
&gt;      void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height);
&gt; @@ -590,6 +590,12 @@ rt GraphicsContext3DInternal::name(t1 a1
&gt;      return m_impl-&gt;name(a1, a2, a3, a4, a5, a6);       \
&gt;  }
&gt;  
&gt; +#define DELEGATE_TO_IMPL_7(name, t1, t2, t3, t4, t5, t6, t7) \
&gt; +void GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
&gt; +{ \
&gt; +    m_impl-&gt;name(a1, a2, a3, a4, a5, a6, a7);   \
&gt; +}
&gt; +
&gt;  #define DELEGATE_TO_IMPL_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \
&gt;  rt GraphicsContext3DInternal::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
&gt;  { \
&gt; @@ -804,15 +810,7 @@ DELEGATE_TO_IMPL_1(lineWidth, double)
&gt;  DELEGATE_TO_IMPL_1_X(linkProgram, WebGLProgram*)
&gt;  DELEGATE_TO_IMPL_2(pixelStorei, unsigned long, long)
&gt;  DELEGATE_TO_IMPL_2(polygonOffset, double, double)
&gt; -
&gt; -PassRefPtr&lt;WebGLArray&gt; GraphicsContext3DInternal::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type)
&gt; -{
&gt; -    // FIXME: take into account pack alignment.
&gt; -    RefPtr&lt;WebGLUnsignedByteArray&gt; array = WebGLUnsignedByteArray::create(width * height * 4);
&gt; -    m_impl-&gt;readPixels(x, y, width, height, format, type, array-&gt;baseAddress());
&gt; -    return array;
&gt; -}
&gt; -
&gt; +DELEGATE_TO_IMPL_7(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, void*)
&gt;  DELEGATE_TO_IMPL(releaseShaderCompiler)
&gt;  DELEGATE_TO_IMPL_4(renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long)
&gt;  DELEGATE_TO_IMPL_2(sampleCoverage, double, bool)
&gt; @@ -1026,6 +1024,12 @@ rt GraphicsContext3D::name(t1 a1, t2 a2,
&gt;      return m_internal-&gt;name(a1, a2, a3, a4, a5, a6);       \
&gt;  }
&gt;  
&gt; +#define DELEGATE_TO_INTERNAL_7(name, t1, t2, t3, t4, t5, t6, t7) \
&gt; +void GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
&gt; +{ \
&gt; +    m_internal-&gt;name(a1, a2, a3, a4, a5, a6, a7);   \
&gt; +}
&gt; +
&gt;  #define DELEGATE_TO_INTERNAL_7R(name, t1, t2, t3, t4, t5, t6, t7, rt) \
&gt;  rt GraphicsContext3D::name(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) \
&gt;  { \
&gt; @@ -1183,7 +1187,7 @@ DELEGATE_TO_INTERNAL_1(linkProgram, WebG
&gt;  DELEGATE_TO_INTERNAL_2(pixelStorei, unsigned long, long)
&gt;  DELEGATE_TO_INTERNAL_2(polygonOffset, double, double)
&gt;  
&gt; -DELEGATE_TO_INTERNAL_6R(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, PassRefPtr&lt;WebGLArray&gt;)
&gt; +DELEGATE_TO_INTERNAL_7(readPixels, long, long, unsigned long, unsigned long, unsigned long, unsigned long, void*)
&gt;  
&gt;  DELEGATE_TO_INTERNAL(releaseShaderCompiler)
&gt;  DELEGATE_TO_INTERNAL_4(renderbufferStorage, unsigned long, unsigned long, unsigned long, unsigned long)
&gt; Index: WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp
&gt; ===================================================================
&gt; --- WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp	(revision 57240)
&gt; +++ WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp	(working copy)
&gt; @@ -661,6 +661,15 @@ bool WebGraphicsContext3DDefaultImpl::re
&gt;              glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
&gt;          }
&gt;      }
&gt; +
&gt; +    GLint packAlignment = 4;
&gt; +    bool mustRestorePackAlignment = false;
&gt; +    glGetIntegerv(GL_PACK_ALIGNMENT, &amp;packAlignment);
&gt; +    if (packAlignment &gt; 4) {
&gt; +        glPixelStorei(GL_PACK_ALIGNMENT, 4);
&gt; +        mustRestorePackAlignment = true;
&gt; +    }
&gt; +
&gt;  #if PLATFORM(SKIA)
&gt;      glReadPixels(0, 0, m_cachedWidth, m_cachedHeight, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
&gt;  #elif PLATFORM(CG)
&gt; @@ -669,6 +678,9 @@ bool WebGraphicsContext3DDefaultImpl::re
&gt;  #error Must port to your platform
&gt;  #endif
&gt;  
&gt; +    if (mustRestorePackAlignment)
&gt; +        glPixelStorei(GL_PACK_ALIGNMENT, packAlignment);
&gt; +
&gt;      if (mustRestoreFBO)
&gt;          glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
&gt;  
&gt; @@ -1118,27 +1130,17 @@ DELEGATE_TO_GL_2(polygonOffset, PolygonO
&gt;  
&gt;  void WebGraphicsContext3DDefaultImpl::readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type, void* pixels)
&gt;  {

I think we should add a comment about the need for the glFlush calls here too.

&gt; +    glFlush();
&gt;  #ifndef RENDER_TO_DEBUGGING_WINDOW
&gt;      if (m_attributes.antialias &amp;&amp; m_boundFBO == m_multisampleFBO) {
&gt;          glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_multisampleFBO);
&gt;          glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, m_fbo);
&gt;          glBlitFramebufferEXT(x, y, x + width, y + height, x, y, x + width, y + height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
&gt;          glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
&gt; +        glFlush();
&gt;      }
&gt;  #endif
&gt;      glReadPixels(x, y, width, height, format, type, pixels);
&gt; -#if PLATFORM(CG)
&gt; -    if (!m_attributes.alpha) {
&gt; -        // If alpha is off, by default glReadPixels should set the alpha to 255 instead of 0.
&gt; -        // This is a hack until glReadPixels fixes its behavior.
&gt; -        // Pixels are stored in WebGLUnsignedByteArray, which is unsigned char array.
&gt; -        unsigned char* data = reinterpret_cast&lt;unsigned char*&gt;(pixels);
&gt; -        // FIXME: take into account pack alignment.
&gt; -        unsigned long byteLength = width * height * 4 * sizeof(unsigned char);
&gt; -        for (unsigned long i = 3; i &lt; byteLength; i += 4)
&gt; -            data[i] = 255;
&gt; -    }
&gt; -#endif
&gt;  #ifndef RENDER_TO_DEBUGGING_WINDOW
&gt;      if (m_attributes.antialias &amp;&amp; m_boundFBO == m_multisampleFBO)
&gt;          glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_boundFBO);
&gt; Index: LayoutTests/ChangeLog
&gt; ===================================================================
&gt; --- LayoutTests/ChangeLog	(revision 57249)
&gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; @@ -1,3 +1,13 @@
&gt; +2010-04-07  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        readPixels must take PACK_ALIGNMENT into account
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=34718
&gt; +
&gt; +        * fast/canvas/webgl/read-pixels-expected.txt: Verify pixelStorei and readPixels.
&gt; +        * fast/canvas/webgl/read-pixels.html: Ditto.
&gt; +
&gt;  2010-04-07  Eric Seidel  &lt;eric@webkit.org&gt;
&gt;  
&gt;          Reviewed by Adam Barth.
&gt; Index: LayoutTests/fast/canvas/webgl/read-pixels-expected.txt
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/read-pixels-expected.txt	(revision 0)
&gt; +++ LayoutTests/fast/canvas/webgl/read-pixels-expected.txt	(revision 0)
&gt; @@ -0,0 +1,56 @@
&gt; +Verify readPixels() works fine with various PACK_ALIGNMENT values.
&gt; +
&gt; +On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
&gt; +
&gt; +PASS gl = initWebGL(&apos;example&apos;, &apos;vshader&apos;, &apos;fshader&apos;, [ &apos;pos&apos;, &apos;colorIn&apos; ], [ 0, 0, 0, 1 ], 1) is non-null.
&gt; +Testing PACK_ALIGNMENT = 1, width = 1, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 2, width = 1, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 4, width = 1, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 1, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 4, width = 2, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 2, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 4, width = 3, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 3, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 4, width = 4, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 4, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 5, height = 1
&gt; +PASS array.length is expectedSize
&gt; +Testing PACK_ALIGNMENT = 4, width = 5, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 5, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 6, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 7, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +Testing PACK_ALIGNMENT = 8, width = 8, height = 2
&gt; +PASS array.length is expectedSize
&gt; +PASS pixel is [ 51, 102, 204, 255]
&gt; +PASS successfullyParsed is true
&gt; +
&gt; +TEST COMPLETE
&gt; +
&gt; Index: LayoutTests/fast/canvas/webgl/read-pixels.html
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/read-pixels.html	(revision 0)
&gt; +++ LayoutTests/fast/canvas/webgl/read-pixels.html	(revision 0)
&gt; @@ -0,0 +1,112 @@
&gt; +&lt;html&gt;
&gt; +&lt;head&gt;
&gt; +&lt;link rel=&quot;stylesheet&quot; href=&quot;../../js/resources/js-test-style.css&quot;/&gt;
&gt; +&lt;script src=&quot;../../js/resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
&gt; +&lt;script src=&quot;resources/webgl-test.js&quot;&gt;&lt;/script&gt;
&gt; +&lt;script src=&quot;resources/utils3d.js&quot;&gt;&lt;/script&gt;
&gt; +&lt;script id=&quot;vshader&quot; type=&quot;x-shader/x-vertex&quot;&gt;
&gt; +attribute vec3 pos;
&gt; +attribute vec4 colorIn;
&gt; +varying vec4 color;
&gt; +
&gt; +void main()
&gt; +{
&gt; +    color = colorIn;
&gt; +    gl_Position = vec4(pos.xyz, 1.0);
&gt; +}
&gt; +&lt;/script&gt;
&gt; +
&gt; +&lt;script id=&quot;fshader&quot; type=&quot;x-shader/x-fragment&quot;&gt;
&gt; +varying vec4 color;
&gt; +
&gt; +void main()
&gt; +{
&gt; +    gl_FragColor = color;
&gt; +}
&gt; +&lt;/script&gt;
&gt; +
&gt; +&lt;script&gt;
&gt; +var successfullyParsed = false;
&gt; +
&gt; +// These four declarations need to be global for &quot;shouldBe&quot; to see them
&gt; +var gl = null;
&gt; +var array = null;
&gt; +var expectedSize = 0;
&gt; +var pixel = [ 0, 0, 0, 1 ];
&gt; +
&gt; +function init()
&gt; +{
&gt; +    if (window.layoutTestController) {
&gt; +        layoutTestController.overridePreference(&quot;WebKitWebGLEnabled&quot;, &quot;1&quot;);
&gt; +        layoutTestController.dumpAsText();
&gt; +        layoutTestController.waitUntilDone();
&gt; +    }
&gt; +
&gt; +    description(&apos;Verify readPixels() works fine with various PACK_ALIGNMENT values.&apos;);
&gt; +
&gt; +    runTest();
&gt; +}
&gt; +
&gt; +function runTestIteration(packAlignment, width, height, size)
&gt; +{
&gt; +    debug(&quot;Testing PACK_ALIGNMENT = &quot; + packAlignment + &quot;, width = &quot; + width + &quot;, height = &quot; + height);
&gt; +    gl.clearColor(0.2, 0.4, 0.8, 1);

It may be risky to rely on the precise rounding of these values. Perhaps specify them as e.g. (63.0 / 255.0) and check for 63 from readPixels.

&gt; +    gl.clear(gl.COLOR_BUFFER_BIT);
&gt; +    gl.pixelStorei(gl.PACK_ALIGNMENT, packAlignment);
&gt; +    array = gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE);
&gt; +    expectedSize = size;
&gt; +    shouldBe(&quot;array.length&quot;, &quot;expectedSize&quot;);
&gt; +    // Check the first pixel of the second row.
&gt; +    if (height &gt; 1) {
&gt; +        var padding = (size - width * height * 4) / (height - 1);
&gt; +        var bytesPerRow = width * 4 + padding;
&gt; +        pixel[0] = array[bytesPerRow];
&gt; +        pixel[1] = array[bytesPerRow + 1];
&gt; +        pixel[2] = array[bytesPerRow + 2];
&gt; +        pixel[3] = array[bytesPerRow + 3];
&gt; +        shouldBe(&quot;pixel&quot;, &quot;[ 51, 102, 204, 255]&quot;);

See above.

&gt; +    }
&gt; +}
&gt; +
&gt; +function runTest()
&gt; +{
&gt; +    shouldBeNonNull(&quot;gl = initWebGL(&apos;example&apos;, &apos;vshader&apos;, &apos;fshader&apos;, [ &apos;pos&apos;, &apos;colorIn&apos; ], [ 0, 0, 0, 1 ], 1)&quot;);
&gt; +    gl.disable(gl.BLEND);
&gt; +
&gt; +    runTestIteration(1, 1, 2, 8);
&gt; +    runTestIteration(2, 1, 2, 8);
&gt; +    runTestIteration(4, 1, 2, 8);
&gt; +    runTestIteration(8, 1, 2, 12);
&gt; +    runTestIteration(4, 2, 2, 16);
&gt; +    runTestIteration(8, 2, 2, 16);
&gt; +    runTestIteration(4, 3, 2, 24);
&gt; +    runTestIteration(8, 3, 2, 28);
&gt; +    runTestIteration(4, 4, 2, 32);
&gt; +    runTestIteration(8, 4, 2, 32);
&gt; +    runTestIteration(8, 5, 1, 20);
&gt; +    runTestIteration(4, 5, 2, 40);
&gt; +    runTestIteration(8, 5, 2, 44);
&gt; +    runTestIteration(8, 6, 2, 48);
&gt; +    runTestIteration(8, 7, 2, 60);
&gt; +    runTestIteration(8, 8, 2, 64);
&gt; +
&gt; +    successfullyParsed = true;
&gt; +    var epilogue = document.createElement(&quot;script&quot;);
&gt; +    epilogue.onload = finish;
&gt; +    epilogue.src = &quot;../../js/resources/js-test-post.js&quot;;
&gt; +    document.body.appendChild(epilogue);
&gt; +}
&gt; +
&gt; +function finish() {
&gt; +    if (window.layoutTestController) {
&gt; +        layoutTestController.notifyDone();
&gt; +    }
&gt; +}
&gt; +&lt;/script&gt;
&gt; +&lt;/head&gt;
&gt; +&lt;body onload=&quot;init()&quot;&gt;
&gt; +&lt;canvas id=&quot;example&quot; width=&quot;32px&quot; height=&quot;32px&quot;&gt;&lt;/canvas&gt;
&gt; +&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
&gt; +&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
&gt; +&lt;/body&gt;
&gt; +&lt;/html&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210416</commentid>
    <comment_count>6</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-08 15:10:46 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; This is missing the LUMINANCE and LUMINANCE_ALPHA formats.

Sorry, as we discussed offline, I&apos;m wrong about this.

&gt; The second FIXME should state that we should synthesize a GL error when an
&gt; unacceptable value is passed. Actually, you should just synthesize an
&gt; INVALID_OPERATION error and get rid of the FIXME.

Sorry, I failed to realize you deleted these FIXMEs. Ignore me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210445</commentid>
    <comment_count>7</comment_count>
      <attachid>52905</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-08 15:47:32 -0700</bug_when>
    <thetext>Created attachment 52905
revised patch: responding to Ken Russell&apos;s review

Also, modified the test to check the last pixel in the last row because that pixel is more PACK_ALIGNMENT sensitive.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210447</commentid>
    <comment_count>8</comment_count>
      <attachid>52905</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-08 15:51:51 -0700</bug_when>
    <thetext>Comment on attachment 52905
revised patch: responding to Ken Russell&apos;s review

Looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212191</commentid>
    <comment_count>9</comment_count>
      <attachid>52905</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-04-13 18:46:58 -0700</bug_when>
    <thetext>Comment on attachment 52905
revised patch: responding to Ken Russell&apos;s review

if kbr says kbr, I say rs=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212311</commentid>
    <comment_count>10</comment_count>
      <attachid>52905</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-14 03:23:59 -0700</bug_when>
    <thetext>Comment on attachment 52905
revised patch: responding to Ken Russell&apos;s review

Clearing flags on attachment: 52905

Committed r57574: &lt;http://trac.webkit.org/changeset/57574&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212312</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-14 03:24:06 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52825</attachid>
            <date>2010-04-07 22:29:29 -0700</date>
            <delta_ts>2010-04-08 10:56:27 -0700</delta_ts>
            <desc>patch</desc>
            <filename>pixels.patch</filename>
            <type>text/plain</type>
            <size>22769</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICByZWFkUGl4
ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBpbnRvIGFjY291bnQKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0NzE4CisKKyAgICAgICAgVGVzdDog
ZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMuaHRtbAorCisgICAgICAgICogaHRtbC9jYW52
YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVu
ZGVyaW5nQ29udGV4dDo6V2ViR0xSZW5kZXJpbmdDb250ZXh0KTogSW5pdCBtZW1iZXJzIHRvIHN1
cHBvcnQgcGFja19hbGlnbm1lbnQuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0Nv
bnRleHQ6OnBpeGVsU3RvcmVpKTogU2F2ZSBwYWNrL3VucGFja19hbGlnbm1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMpOiBWYWxpZGF0ZSBl
bnVtIGFuZCBkZWFsIHdpdGggcGFja19hbGlnbm1lbnQuCisgICAgICAgICogaHRtbC9jYW52YXMv
V2ViR0xSZW5kZXJpbmdDb250ZXh0Lmg6IEFkZCBtZW1iZXJzIHRvIHN1cHBvcnQgcGFja19hbGln
bm1lbnQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaDog
UmVmYWMgcmVhZFBpeGVscy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhp
Y3NDb250ZXh0M0RNYWMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnJlYWRQaXhlbHMpOiBNb3ZlIGFycmF5IGFsbG9jYXRpb24gYW5kIGFscGhhIGZpeCB0byBXZWJH
TFJlbmRlcmluZ0NvbnRleHQuCisKIDIwMTAtMDQtMDcgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1p
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKZXJlbXkgT3Jsb3cuCkluZGV4
OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCShyZXZp
c2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgIlJlbmRlckJv
eC5oIgogI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCiAjaW5jbHVkZSAiV2ViR0xBY3RpdmVJbmZv
LmgiCisjaW5jbHVkZSAiV2ViR0xVbnNpZ25lZFNob3J0QXJyYXkuaCIKICNpbmNsdWRlICJXZWJH
TEJ1ZmZlci5oIgogI2luY2x1ZGUgIldlYkdMQ29udGV4dEF0dHJpYnV0ZXMuaCIKICNpbmNsdWRl
ICJXZWJHTEZyYW1lYnVmZmVyLmgiCkBAIC04NSwxMSArODYsMjEgQEAgV2ViR0xSZW5kZXJpbmdD
b250ZXh0OjpXZWJHTFJlbmRlcmluZ0NvbgogICAgICwgbV9uZWVkc1VwZGF0ZSh0cnVlKQogICAg
ICwgbV9tYXJrZWRDYW52YXNEaXJ0eShmYWxzZSkKICAgICAsIG1fYWN0aXZlVGV4dHVyZVVuaXQo
MCkKKyAgICAsIG1fcGFja0FsaWdubWVudCg0KQorICAgICwgbV91bnBhY2tBbGlnbm1lbnQoNCkK
IHsKICAgICBBU1NFUlQobV9jb250ZXh0KTsKICAgICBpbnQgbnVtVmVydGV4QXR0cmlicyA9IDA7
CiAgICAgbV9jb250ZXh0LT5nZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRF
WF9BVFRSSUJTLCAmbnVtVmVydGV4QXR0cmlicyk7CiAgICAgbV9tYXhWZXJ0ZXhBdHRyaWJzID0g
bnVtVmVydGV4QXR0cmliczsKKyAgICBpbnQgaW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQg
PSBHcmFwaGljc0NvbnRleHQzRDo6UkdCQTsKKyAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2KEdy
YXBoaWNzQ29udGV4dDNEOjpJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCwgJmltcGxl
bWVudGF0aW9uQ29sb3JSZWFkRm9ybWF0KTsKKyAgICBtX2ltcGxlbWVudGF0aW9uQ29sb3JSZWFk
Rm9ybWF0ID0gaW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQ7CisgICAgaW50IGltcGxlbWVu
dGF0aW9uQ29sb3JSZWFkVHlwZSA9IEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFOwor
ICAgIG1fY29udGV4dC0+Z2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6OklNUExFTUVOVEFU
SU9OX0NPTE9SX1JFQURfVFlQRSwgJmltcGxlbWVudGF0aW9uQ29sb3JSZWFkVHlwZSk7CisgICAg
Ly8gRklYTUU6IHJlbW92ZSB0aGUgZ2V0RXJyb3IoKSB3aGVuIElNUExFTUVOVEFUSU9OX0NPTE9S
X1JFQURfRk9STUFUL1RZUEUgYXJlIHN1cHBvcnRlZC4KKyAgICBtX2NvbnRleHQtPmdldEVycm9y
KCk7CisgICAgbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZFR5cGUgPSBpbXBsZW1lbnRhdGlvbkNv
bG9yUmVhZFR5cGU7CiAgICAgbV9jb250ZXh0LT5yZXNoYXBlKGNhbnZhcygpLT53aWR0aCgpLCBj
YW52YXMoKS0+aGVpZ2h0KCkpOwogICAgIG1fY29udGV4dC0+dmlld3BvcnQoMCwgMCwgY2FudmFz
KCktPndpZHRoKCksIGNhbnZhcygpLT5oZWlnaHQoKSk7CiB9CkBAIC0xNTc0LDYgKzE1ODUsMTYg
QEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQcm9ncmFtKAogdm9pZCBXZWJHTFJl
bmRlcmluZ0NvbnRleHQ6OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxvbmcgcGFy
YW0pCiB7CiAgICAgbV9jb250ZXh0LT5waXhlbFN0b3JlaShwbmFtZSwgcGFyYW0pOworICAgIGlm
IChwYXJhbSA9PSAxIHx8IHBhcmFtID09IDIgfHwgcGFyYW0gPT0gNCB8fCBwYXJhbSA9PSA4KSB7
CisgICAgICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQz
RDo6UEFDS19BTElHTk1FTlQ6CisgICAgICAgICAgICBtX3BhY2tBbGlnbm1lbnQgPSBzdGF0aWNf
Y2FzdDxpbnQ+KHBhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdyYXBo
aWNzQ29udGV4dDNEOjpVTlBBQ0tfQUxJR05NRU5UOgorICAgICAgICAgICAgbV91bnBhY2tBbGln
bm1lbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHBhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgfQogICAgIGNsZWFudXBBZnRlckdyYXBoaWNzQ2FsbChmYWxzZSk7CiB9CiAK
QEAgLTE1ODUsNyArMTYwNiw3NiBAQCB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6cG9seWdv
bk9mZnNlCiAKIFBhc3NSZWZQdHI8V2ViR0xBcnJheT4gV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojpy
ZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSkKIHsK
LSAgICBSZWZQdHI8V2ViR0xBcnJheT4gYXJyYXkgPSBtX2NvbnRleHQtPnJlYWRQaXhlbHMoeCwg
eSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlKTsKKyAgICAvLyBWYWxpZGF0ZSBlbnVtcy4K
KyAgICB1bnNpZ25lZCBsb25nIGNvbXBvbmVudHNQZXJQaXhlbCA9IDA7CisgICAgc3dpdGNoIChm
b3JtYXQpIHsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpBTFBIQToKKyAgICAgICAgY29t
cG9uZW50c1BlclBpeGVsID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHcmFwaGljc0Nv
bnRleHQzRDo6UkdCOgorICAgICAgICBjb21wb25lbnRzUGVyUGl4ZWwgPSAzOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBOgorICAgICAgICBjb21wb25l
bnRzUGVyUGl4ZWwgPSA0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBt
X2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX0VO
VU0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdW5zaWduZWQgbG9uZyBieXRlc1Bl
ckNvbXBvbmVudCA9IDA7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHcmFwaGljc0Nv
bnRleHQzRDo6VU5TSUdORURfQllURToKKyAgICAgICAgYnl0ZXNQZXJDb21wb25lbnQgPSBzaXpl
b2YodW5zaWduZWQgY2hhcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR3JhcGhpY3NDb250
ZXh0M0Q6OlVOU0lHTkVEX1NIT1JUXzVfNl81OgorICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6
OlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ6CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5T
SUdORURfU0hPUlRfNV81XzVfMToKKyAgICAgICAgY29tcG9uZW50c1BlclBpeGVsID0gMTsKKyAg
ICAgICAgYnl0ZXNQZXJDb21wb25lbnQgPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICAgICAg
ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVy
cm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm4gMDsK
KyAgICB9CisgICAgaWYgKCEoZm9ybWF0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBICYmIHR5
cGUgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX0JZVEUgfHwgZm9ybWF0ID09IG1faW1w
bGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQgJiYgdHlwZSA9PSBtX2ltcGxlbWVudGF0aW9uQ29s
b3JSZWFkRm9ybWF0KSkgeworICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdy
YXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKyAgICAvLyBDYWxjdWxhdGUgYXJyYXkgc2l6ZSwgdGFraW5nIGludG8gY29uc2lkZXJh
dGlvbiBvZiBQQUNLX0FMSUdOTUVOVC4KKyAgICB1bnNpZ25lZCBsb25nIGJ5dGVzUGVyUm93ID0g
Y29tcG9uZW50c1BlclBpeGVsICogYnl0ZXNQZXJDb21wb25lbnQgKiB3aWR0aDsKKyAgICB1bnNp
Z25lZCBsb25nIHBhZGRpbmcgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgcmVzaWR1bGVCeXRlcyA9
IGJ5dGVzUGVyUm93ICUgbV9wYWNrQWxpZ25tZW50OworICAgIGlmIChyZXNpZHVsZUJ5dGVzKSB7
CisgICAgICAgIHBhZGRpbmcgPSBtX3BhY2tBbGlnbm1lbnQgLSByZXNpZHVsZUJ5dGVzOworICAg
ICAgICBieXRlc1BlclJvdyArPSBwYWRkaW5nOworICAgIH0KKyAgICAvLyBUaGUgbGFzdCByb3cg
bmVlZHMgbm8gcGFkZGluZy4KKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsQnl0ZXMgPSBieXRlc1Bl
clJvdyAqIGhlaWdodCAtIHBhZGRpbmc7CisgICAgdW5zaWduZWQgbG9uZyBudW0gPSB0b3RhbEJ5
dGVzIC8gYnl0ZXNQZXJDb21wb25lbnQ7CisgICAgUmVmUHRyPFdlYkdMQXJyYXk+IGFycmF5Owor
ICAgIGlmICh0eXBlID09IEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFKQorICAgICAg
ICBhcnJheSA9IFdlYkdMVW5zaWduZWRCeXRlQXJyYXk6OmNyZWF0ZShudW0pOworICAgIGVsc2UK
KyAgICAgICAgYXJyYXkgPSBXZWJHTFVuc2lnbmVkU2hvcnRBcnJheTo6Y3JlYXRlKG51bSk7Cisg
ICAgdm9pZCogZGF0YSA9IGFycmF5LT5iYXNlQWRkcmVzcygpOworICAgIG1fY29udGV4dC0+cmVh
ZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGRhdGEpOworI2lmIFBM
QVRGT1JNKENHKQorICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBzZWN0aW9uIHdoZW4gR0wgZHJp
dmVyIGJ1ZyBvbiBNYWMgaXMgZml4ZWQsIGkuZS4sCisgICAgLy8gd2hlbiBhbHBoYSBpcyBvZmYs
IHJlYWRQaXhlbHMgc2hvdWxkIHNldCBhbHBoYSB0byAyNTUgaW5zdGVhZCBvZiAwLgorICAgIGlm
ICgoZm9ybWF0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpBTFBIQSB8fCBmb3JtYXQgPT0gR3JhcGhp
Y3NDb250ZXh0M0Q6OlJHQkEpICYmICFtX2NvbnRleHQtPmdldENvbnRleHRBdHRyaWJ1dGVzKCku
YWxwaGEpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVE
X0JZVEUpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVscyA9IHJlaW50ZXJwcmV0
X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBs
b25nIGl5ID0gMDsgaXkgPCBoZWlnaHQ7ICsraXkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGxvbmcgaXggPSAwOyBpeCA8IHdpZHRoOyArK2l4KSB7CisgICAgICAgICAgICAgICAg
ICAgIHBpeGVsc1tjb21wb25lbnRzUGVyUGl4ZWwgLSAxXSA9IDI1NTsKKyAgICAgICAgICAgICAg
ICAgICAgcGl4ZWxzICs9IGNvbXBvbmVudHNQZXJQaXhlbDsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgcGl4ZWxzICs9IHBhZGRpbmc7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgLy8gRklYTUU6IGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBkbyB0aGUgc2Ft
ZSB3aXRoIFVOU0lHTkVEX1NIT1JULgorICAgIH0KKyNlbmRpZgogICAgIGNsZWFudXBBZnRlckdy
YXBoaWNzQ2FsbChmYWxzZSk7CiAgICAgcmV0dXJuIGFycmF5OwogfQpJbmRleDogV2ViQ29yZS9o
dG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCShyZXZpc2lvbiA1NzI0MCkKKysr
IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM0Miw2ICszNDIsMTEgQEAgY2xhc3MgV2ViS2l0Q1NTTWF0cml4OwogICAgICAgICBU
ZXh0dXJlVW5pdFN0YXRlIG1fdGV4dHVyZVVuaXRzWzMyXTsKICAgICAgICAgdW5zaWduZWQgbG9u
ZyBtX2FjdGl2ZVRleHR1cmVVbml0OwogCisgICAgICAgIGludCBtX3BhY2tBbGlnbm1lbnQ7Cisg
ICAgICAgIGludCBtX3VucGFja0FsaWdubWVudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtX2lt
cGxlbWVudGF0aW9uQ29sb3JSZWFkRm9ybWF0OworICAgICAgICB1bnNpZ25lZCBsb25nIG1faW1w
bGVtZW50YXRpb25Db2xvclJlYWRUeXBlOworCiAgICAgICAgIC8vIEhlbHBlcnMgZm9yIGdldFBh
cmFtZXRlciBhbmQgb3RoZXJzCiAgICAgICAgIFdlYkdMR2V0SW5mbyBnZXRCb29sZWFuUGFyYW1l
dGVyKHVuc2lnbmVkIGxvbmcgcG5hbWUpOwogICAgICAgICBXZWJHTEdldEluZm8gZ2V0RmxvYXRQ
YXJhbWV0ZXIodW5zaWduZWQgbG9uZyBwbmFtZSk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oCShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaAkod29ya2luZyBjb3B5KQpA
QCAtNTkyLDcgKzU5Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCBwaXhl
bFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKTsKICAgICAgICAgdm9pZCBw
b2x5Z29uT2Zmc2V0KGRvdWJsZSBmYWN0b3IsIGRvdWJsZSB1bml0cyk7CiAgICAgICAgIAotICAg
ICAgICBQYXNzUmVmUHRyPFdlYkdMQXJyYXk+IHJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVu
c2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZv
cm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKTsKKyAgICAgICAgdm9pZCByZWFkUGl4ZWxzKGxvbmcg
eCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5z
aWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgdm9pZCogZGF0YSk7CiAgICAg
ICAgIAogICAgICAgICB2b2lkIHJlbGVhc2VTaGFkZXJDb21waWxlcigpOwogICAgICAgICB2b2lk
IHJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcg
aW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0
KTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNE
TWFjLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5jcHAJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC03ODUsMzYgKzc4NSwxOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0
KGRvCiAgICAgOjpnbFBvbHlnb25PZmZzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZhY3RvciksIHN0
YXRpY19jYXN0PGZsb2F0Pih1bml0cykpOwogfQogCi1QYXNzUmVmUHRyPFdlYkdMQXJyYXk+IEdy
YXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25n
IHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2ln
bmVkIGxvbmcgdHlwZSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9uZyB4
LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNp
Z25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlLCB2b2lkKiBkYXRhKQogewogICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKLSAgICAvLyBGSVhNRTogRm9yIG5v
dyB3ZSBvbmx5IGFjY2VwdCBHTF9VTlNJR05FRF9CWVRFL0dMX1JHQkEuIEluIHJlYWxpdHkgT3Bl
bkdMIEVTIDIuMCBhY2NlcHRzIHRoYXQgcGFpciBhbmQgb25lIG90aGVyCi0gICAgLy8gYXMgc3Bl
Y2lmaWVkIGJ5IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUIGFuZCBHTF9JTVBM
RU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUuIEJ1dCBmb3Igbm93IHdlIHdpbGwKLSAgICAvLyBu
b3QgYWNjZXB0IHRob3NlLgotICAgIC8vIEZJWE1FOiBBbHNvLCB3ZSBzaG91bGQgdGhyb3cgd2hl
biBhbiB1bmFjY2VwdGFibGUgdmFsdWUgaXMgcGFzc2VkCi0gICAgaWYgKHR5cGUgIT0gR0xfVU5T
SUdORURfQllURSB8fCBmb3JtYXQgIT0gR0xfUkdCQSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
ICAgIAogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlz
YW1wbGVGQk8pIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1F
QlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKICAgICAgICAgOjpnbEJsaXRG
cmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0
aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKICAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKICAgICB9
Ci0gICAgUmVmUHRyPFdlYkdMVW5zaWduZWRCeXRlQXJyYXk+IGFycmF5ID0gV2ViR0xVbnNpZ25l
ZEJ5dGVBcnJheTo6Y3JlYXRlKHdpZHRoICogaGVpZ2h0ICogNCk7Ci0gICAgOjpnbFJlYWRQaXhl
bHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCAoR0x2b2lkKikgYXJyYXktPmRh
dGEoKSk7CisgICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0
eXBlLCBkYXRhKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBt
X211bHRpc2FtcGxlRkJPKQogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgaWYgKCFtX2F0dHJzLmFscGhhKSB7
Ci0gICAgICAgIC8vIElmIGFscGhhIGlzIG9mZiwgYnkgZGVmYXVsdCBnbFJlYWRQaXhlbHMgc2hv
dWxkIHNldCB0aGUgYWxwaGEgdG8gMjU1IGluc3RlYWQgb2YgMC4KLSAgICAgICAgLy8gVGhpcyBp
cyBhIGhhY2sgdW50aWwgOjpnbFJlYWRQaXhlbHMgZml4ZXMgaXRzIGJlaGF2aW9yLgotICAgICAg
ICBHTHVieXRlKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxHTHVieXRlKj4oYXJyYXktPmRhdGEo
KSk7Ci0gICAgICAgIHVuc2lnbmVkIGJ5dGVMZW5ndGggPSBhcnJheS0+Ynl0ZUxlbmd0aCgpOwot
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAzOyBpIDwgYnl0ZUxlbmd0aDsgaSArPSA0KQotICAg
ICAgICAgICAgZGF0YVtpXSA9IDI1NTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5OyAgICAKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKSW5kZXg6
IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwkocmV2aXNpb24gNTcyNDkpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8g
IDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICByZWFkUGl4ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBpbnRvIGFjY291
bnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0NzE4
CisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3NDb250ZXh0M0QuY3BwOiBSZWZhYyByZWFkUGl4ZWxz
LgorICAgICAgICAqIHNyYy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsLmNwcDoKKyAg
ICAgICAgKFdlYktpdDo6V2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbDo6cmVhZFBpeGVs
cyk6IE1vdmUgYXJyYXkgYWxsb2NhdGlvbiBhbmQgYWxwaGEgZml4IHRvIFdlYkdMUmVuZGVyaW5n
Q29udGV4dC4KKwogMjAxMC0wNC0wNyAgUGF2ZWwgRmVsZG1hbiAgPHBmZWxkbWFuQGNocm9taXVt
Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBZdXJ5IFNlbWlraGF0c2t5LgpJbmRleDogV2Vi
S2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRC5jcHAJKHJldmlzaW9uIDU3MjQwKQor
KysgV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTIxOCw3ICsyMTgsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBwaXhlbFN0b3JlaSh1bnNp
Z25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKTsKICAgICB2b2lkIHBvbHlnb25PZmZzZXQoZG91
YmxlIGZhY3RvciwgZG91YmxlIHVuaXRzKTsKIAotICAgIFBhc3NSZWZQdHI8V2ViR0xBcnJheT4g
cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQg
bG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUpOwor
ICAgIHZvaWQgcmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25n
IHR5cGUsIHZvaWQqIGRhdGEpOwogCiAgICAgdm9pZCByZWxlYXNlU2hhZGVyQ29tcGlsZXIoKTsK
ICAgICB2b2lkIHJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2ln
bmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxv
bmcgaGVpZ2h0KTsKQEAgLTU5MCw2ICs1OTAsMTIgQEAgcnQgR3JhcGhpY3NDb250ZXh0M0RJbnRl
cm5hbDo6bmFtZSh0MSBhMQogICAgIHJldHVybiBtX2ltcGwtPm5hbWUoYTEsIGEyLCBhMywgYTQs
IGE1LCBhNik7ICAgICAgIFwKIH0KIAorI2RlZmluZSBERUxFR0FURV9UT19JTVBMXzcobmFtZSwg
dDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcpIFwKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0RJbnRl
cm5hbDo6bmFtZSh0MSBhMSwgdDIgYTIsIHQzIGEzLCB0NCBhNCwgdDUgYTUsIHQ2IGE2LCB0NyBh
NykgXAoreyBcCisgICAgbV9pbXBsLT5uYW1lKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsg
ICBcCit9CisKICNkZWZpbmUgREVMRUdBVEVfVE9fSU1QTF83UihuYW1lLCB0MSwgdDIsIHQzLCB0
NCwgdDUsIHQ2LCB0NywgcnQpIFwKIHJ0IEdyYXBoaWNzQ29udGV4dDNESW50ZXJuYWw6Om5hbWUo
dDEgYTEsIHQyIGEyLCB0MyBhMywgdDQgYTQsIHQ1IGE1LCB0NiBhNiwgdDcgYTcpIFwKIHsgXApA
QCAtODA0LDE1ICs4MTAsNyBAQCBERUxFR0FURV9UT19JTVBMXzEobGluZVdpZHRoLCBkb3VibGUp
CiBERUxFR0FURV9UT19JTVBMXzFfWChsaW5rUHJvZ3JhbSwgV2ViR0xQcm9ncmFtKikKIERFTEVH
QVRFX1RPX0lNUExfMihwaXhlbFN0b3JlaSwgdW5zaWduZWQgbG9uZywgbG9uZykKIERFTEVHQVRF
X1RPX0lNUExfMihwb2x5Z29uT2Zmc2V0LCBkb3VibGUsIGRvdWJsZSkKLQotUGFzc1JlZlB0cjxX
ZWJHTEFycmF5PiBHcmFwaGljc0NvbnRleHQzREludGVybmFsOjpyZWFkUGl4ZWxzKGxvbmcgeCwg
bG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5zaWdu
ZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSkKLXsKLSAgICAvLyBGSVhNRTogdGFr
ZSBpbnRvIGFjY291bnQgcGFjayBhbGlnbm1lbnQuCi0gICAgUmVmUHRyPFdlYkdMVW5zaWduZWRC
eXRlQXJyYXk+IGFycmF5ID0gV2ViR0xVbnNpZ25lZEJ5dGVBcnJheTo6Y3JlYXRlKHdpZHRoICog
aGVpZ2h0ICogNCk7Ci0gICAgbV9pbXBsLT5yZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQs
IGZvcm1hdCwgdHlwZSwgYXJyYXktPmJhc2VBZGRyZXNzKCkpOwotICAgIHJldHVybiBhcnJheTsK
LX0KLQorREVMRUdBVEVfVE9fSU1QTF83KHJlYWRQaXhlbHMsIGxvbmcsIGxvbmcsIHVuc2lnbmVk
IGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHZvaWQq
KQogREVMRUdBVEVfVE9fSU1QTChyZWxlYXNlU2hhZGVyQ29tcGlsZXIpCiBERUxFR0FURV9UT19J
TVBMXzQocmVuZGVyYnVmZmVyU3RvcmFnZSwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywg
dW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykKIERFTEVHQVRFX1RPX0lNUExfMihzYW1wbGVD
b3ZlcmFnZSwgZG91YmxlLCBib29sKQpAQCAtMTAyNiw2ICsxMDI0LDEyIEBAIHJ0IEdyYXBoaWNz
Q29udGV4dDNEOjpuYW1lKHQxIGExLCB0MiBhMiwKICAgICByZXR1cm4gbV9pbnRlcm5hbC0+bmFt
ZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsgICAgICAgXAogfQogCisjZGVmaW5lIERFTEVHQVRF
X1RPX0lOVEVSTkFMXzcobmFtZSwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcpIFwKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6Om5hbWUodDEgYTEsIHQyIGEyLCB0MyBhMywgdDQgYTQsIHQ1IGE1
LCB0NiBhNiwgdDcgYTcpIFwKK3sgXAorICAgIG1faW50ZXJuYWwtPm5hbWUoYTEsIGEyLCBhMywg
YTQsIGE1LCBhNiwgYTcpOyAgIFwKK30KKwogI2RlZmluZSBERUxFR0FURV9UT19JTlRFUk5BTF83
UihuYW1lLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgcnQpIFwKIHJ0IEdyYXBoaWNzQ29u
dGV4dDNEOjpuYW1lKHQxIGExLCB0MiBhMiwgdDMgYTMsIHQ0IGE0LCB0NSBhNSwgdDYgYTYsIHQ3
IGE3KSBcCiB7IFwKQEAgLTExODMsNyArMTE4Nyw3IEBAIERFTEVHQVRFX1RPX0lOVEVSTkFMXzEo
bGlua1Byb2dyYW0sIFdlYkcKIERFTEVHQVRFX1RPX0lOVEVSTkFMXzIocGl4ZWxTdG9yZWksIHVu
c2lnbmVkIGxvbmcsIGxvbmcpCiBERUxFR0FURV9UT19JTlRFUk5BTF8yKHBvbHlnb25PZmZzZXQs
IGRvdWJsZSwgZG91YmxlKQogCi1ERUxFR0FURV9UT19JTlRFUk5BTF82UihyZWFkUGl4ZWxzLCBs
b25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1
bnNpZ25lZCBsb25nLCBQYXNzUmVmUHRyPFdlYkdMQXJyYXk+KQorREVMRUdBVEVfVE9fSU5URVJO
QUxfNyhyZWFkUGl4ZWxzLCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25n
LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkKikKIAogREVMRUdBVEVfVE9fSU5U
RVJOQUwocmVsZWFzZVNoYWRlckNvbXBpbGVyKQogREVMRUdBVEVfVE9fSU5URVJOQUxfNChyZW5k
ZXJidWZmZXJTdG9yYWdlLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBs
b25nLCB1bnNpZ25lZCBsb25nKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJHcmFwaGlj
c0NvbnRleHQzRERlZmF1bHRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGwuY3BwCShyZXZpc2lvbiA1NzI0MCkK
KysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTExMjcsMTggKzExMjcsNiBAQCB2b2lkIFdlYkdyYXBoaWNz
Q29udGV4dDNERGVmYXVsdEltcGw6OnJlCiAgICAgfQogI2VuZGlmCiAgICAgZ2xSZWFkUGl4ZWxz
KHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSNpZiBQTEFURk9S
TShDRykKLSAgICBpZiAoIW1fYXR0cmlidXRlcy5hbHBoYSkgewotICAgICAgICAvLyBJZiBhbHBo
YSBpcyBvZmYsIGJ5IGRlZmF1bHQgZ2xSZWFkUGl4ZWxzIHNob3VsZCBzZXQgdGhlIGFscGhhIHRv
IDI1NSBpbnN0ZWFkIG9mIDAuCi0gICAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHVudGlsIGdsUmVh
ZFBpeGVscyBmaXhlcyBpdHMgYmVoYXZpb3IuCi0gICAgICAgIC8vIFBpeGVscyBhcmUgc3RvcmVk
IGluIFdlYkdMVW5zaWduZWRCeXRlQXJyYXksIHdoaWNoIGlzIHVuc2lnbmVkIGNoYXIgYXJyYXku
Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqIGRhdGEgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVk
IGNoYXIqPihwaXhlbHMpOwotICAgICAgICAvLyBGSVhNRTogdGFrZSBpbnRvIGFjY291bnQgcGFj
ayBhbGlnbm1lbnQuCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZUxlbmd0aCA9IHdpZHRoICog
aGVpZ2h0ICogNCAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBsb25nIGkgPSAzOyBpIDwgYnl0ZUxlbmd0aDsgaSArPSA0KQotICAgICAgICAgICAgZGF0YVtp
XSA9IDI1NTsKLSAgICB9Ci0jZW5kaWYKICNpZm5kZWYgUkVOREVSX1RPX0RFQlVHR0lOR19XSU5E
T1cKICAgICBpZiAobV9hdHRyaWJ1dGVzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVs
dGlzYW1wbGVGQk8pCiAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVS
X0VYVCwgbV9ib3VuZEZCTyk7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1NzI0OSkKKysrIExheW91dFRl
c3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDEwLTA0LTA3
ICBaaGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgcmVhZFBpeGVscyBtdXN0IHRha2UgUEFDS19BTElHTk1F
TlQgaW50byBhY2NvdW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNDcxOAorCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMt
ZXhwZWN0ZWQudHh0OiBWZXJpZnkgcGl4ZWxTdG9yZWkgYW5kIHJlYWRQaXhlbHMuCisgICAgICAg
ICogZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMuaHRtbDogRGl0dG8uCisKIDIwMTAtMDQt
MDcgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFkYW0gQmFydGguCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBp
eGVscy1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMv
d2ViZ2wvcmVhZC1waXhlbHMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVz
dHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDU2IEBACitWZXJpZnkgcmVhZFBpeGVscygpIHdvcmtzIGZpbmUgd2l0aCB2
YXJpb3VzIFBBQ0tfQUxJR05NRU5UIHZhbHVlcy4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2Vl
IGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUi
LgorCitQQVNTIGdsID0gaW5pdFdlYkdMKCdleGFtcGxlJywgJ3ZzaGFkZXInLCAnZnNoYWRlcics
IFsgJ3BvcycsICdjb2xvckluJyBdLCBbIDAsIDAsIDAsIDEgXSwgMSkgaXMgbm9uLW51bGwuCitU
ZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gMSwgd2lkdGggPSAxLCBoZWlnaHQgPSAyCitQQVNTIGFy
cmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQs
IDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSAyLCB3aWR0aCA9IDEsIGhlaWdodCA9IDIK
K1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAx
MDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQsIHdpZHRoID0gMSwgaGVp
Z2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlz
IFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGgg
PSAxLCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1Mg
cGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA0
LCB3aWR0aCA9IDIsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6
ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdO
TUVOVCA9IDgsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhw
ZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBB
Q0tfQUxJR05NRU5UID0gNCwgd2lkdGggPSAzLCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0
aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rl
c3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9IDMsIGhlaWdodCA9IDIKK1BBU1MgYXJy
YXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwg
MjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMgor
UEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEw
MiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGggPSA0LCBoZWln
aHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMg
WyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9
IDUsIGhlaWdodCA9IDEKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorVGVzdGlu
ZyBQQUNLX0FMSUdOTUVOVCA9IDQsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5s
ZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVd
CitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGggPSA1LCBoZWlnaHQgPSAyCitQQVNT
IGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAy
MDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9IDYsIGhlaWdodCA9
IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUx
LCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gNywg
aGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVs
IGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lk
dGggPSA4LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BB
U1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2Vk
IGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZh
cy93ZWJnbC9yZWFkLXBpeGVscy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qv
Y2FudmFzL3dlYmdsL3JlYWQtcGl4ZWxzLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDExMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0i
Li4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIi8+Cis8c2NyaXB0IHNyYz0iLi4v
Li4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJy
ZXNvdXJjZXMvd2ViZ2wtdGVzdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2Vz
L3V0aWxzM2QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBpZD0idnNoYWRlciIgdHlwZT0ieC1zaGFk
ZXIveC12ZXJ0ZXgiPgorYXR0cmlidXRlIHZlYzMgcG9zOworYXR0cmlidXRlIHZlYzQgY29sb3JJ
bjsKK3ZhcnlpbmcgdmVjNCBjb2xvcjsKKwordm9pZCBtYWluKCkKK3sKKyAgICBjb2xvciA9IGNv
bG9ySW47CisgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54eXosIDEuMCk7Cit9Cis8L3Njcmlw
dD4KKworPHNjcmlwdCBpZD0iZnNoYWRlciIgdHlwZT0ieC1zaGFkZXIveC1mcmFnbWVudCI+Cit2
YXJ5aW5nIHZlYzQgY29sb3I7CisKK3ZvaWQgbWFpbigpCit7CisgICAgZ2xfRnJhZ0NvbG9yID0g
Y29sb3I7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlwdD4KK3ZhciBzdWNjZXNzZnVsbHlQYXJzZWQg
PSBmYWxzZTsKKworLy8gVGhlc2UgZm91ciBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSBnbG9iYWwg
Zm9yICJzaG91bGRCZSIgdG8gc2VlIHRoZW0KK3ZhciBnbCA9IG51bGw7Cit2YXIgYXJyYXkgPSBu
dWxsOwordmFyIGV4cGVjdGVkU2l6ZSA9IDA7Cit2YXIgcGl4ZWwgPSBbIDAsIDAsIDAsIDEgXTsK
KworZnVuY3Rpb24gaW5pdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxl
cikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZlcmVuY2UoIldl
YktpdFdlYkdMRW5hYmxlZCIsICIxIik7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1
bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgp
OworICAgIH0KKworICAgIGRlc2NyaXB0aW9uKCdWZXJpZnkgcmVhZFBpeGVscygpIHdvcmtzIGZp
bmUgd2l0aCB2YXJpb3VzIFBBQ0tfQUxJR05NRU5UIHZhbHVlcy4nKTsKKworICAgIHJ1blRlc3Qo
KTsKK30KKworZnVuY3Rpb24gcnVuVGVzdEl0ZXJhdGlvbihwYWNrQWxpZ25tZW50LCB3aWR0aCwg
aGVpZ2h0LCBzaXplKQoreworICAgIGRlYnVnKCJUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gIiAr
IHBhY2tBbGlnbm1lbnQgKyAiLCB3aWR0aCA9ICIgKyB3aWR0aCArICIsIGhlaWdodCA9ICIgKyBo
ZWlnaHQpOworICAgIGdsLmNsZWFyQ29sb3IoMC4yLCAwLjQsIDAuOCwgMSk7CisgICAgZ2wuY2xl
YXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuUEFDS19BTElH
Tk1FTlQsIHBhY2tBbGlnbm1lbnQpOworICAgIGFycmF5ID0gZ2wucmVhZFBpeGVscygwLCAwLCB3
aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFKTsKKyAgICBleHBlY3RlZFNp
emUgPSBzaXplOworICAgIHNob3VsZEJlKCJhcnJheS5sZW5ndGgiLCAiZXhwZWN0ZWRTaXplIik7
CisgICAgLy8gQ2hlY2sgdGhlIGZpcnN0IHBpeGVsIG9mIHRoZSBzZWNvbmQgcm93LgorICAgIGlm
IChoZWlnaHQgPiAxKSB7CisgICAgICAgIHZhciBwYWRkaW5nID0gKHNpemUgLSB3aWR0aCAqIGhl
aWdodCAqIDQpIC8gKGhlaWdodCAtIDEpOworICAgICAgICB2YXIgYnl0ZXNQZXJSb3cgPSB3aWR0
aCAqIDQgKyBwYWRkaW5nOworICAgICAgICBwaXhlbFswXSA9IGFycmF5W2J5dGVzUGVyUm93XTsK
KyAgICAgICAgcGl4ZWxbMV0gPSBhcnJheVtieXRlc1BlclJvdyArIDFdOworICAgICAgICBwaXhl
bFsyXSA9IGFycmF5W2J5dGVzUGVyUm93ICsgMl07CisgICAgICAgIHBpeGVsWzNdID0gYXJyYXlb
Ynl0ZXNQZXJSb3cgKyAzXTsKKyAgICAgICAgc2hvdWxkQmUoInBpeGVsIiwgIlsgNTEsIDEwMiwg
MjA0LCAyNTVdIik7CisgICAgfQorfQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBzaG91
bGRCZU5vbk51bGwoImdsID0gaW5pdFdlYkdMKCdleGFtcGxlJywgJ3ZzaGFkZXInLCAnZnNoYWRl
cicsIFsgJ3BvcycsICdjb2xvckluJyBdLCBbIDAsIDAsIDAsIDEgXSwgMSkiKTsKKyAgICBnbC5k
aXNhYmxlKGdsLkJMRU5EKTsKKworICAgIHJ1blRlc3RJdGVyYXRpb24oMSwgMSwgMiwgOCk7Cisg
ICAgcnVuVGVzdEl0ZXJhdGlvbigyLCAxLCAyLCA4KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDQs
IDEsIDIsIDgpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgMSwgMiwgMTIpOworICAgIHJ1blRl
c3RJdGVyYXRpb24oNCwgMiwgMiwgMTYpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgMiwgMiwg
MTYpOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgMywgMiwgMjQpOworICAgIHJ1blRlc3RJdGVy
YXRpb24oOCwgMywgMiwgMjgpOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgNCwgMiwgMzIpOwor
ICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNCwgMiwgMzIpOworICAgIHJ1blRlc3RJdGVyYXRpb24o
OCwgNSwgMSwgMjApOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgNSwgMiwgNDApOworICAgIHJ1
blRlc3RJdGVyYXRpb24oOCwgNSwgMiwgNDQpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNiwg
MiwgNDgpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNywgMiwgNjApOworICAgIHJ1blRlc3RJ
dGVyYXRpb24oOCwgOCwgMiwgNjQpOworCisgICAgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsK
KyAgICB2YXIgZXBpbG9ndWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKyAg
ICBlcGlsb2d1ZS5vbmxvYWQgPSBmaW5pc2g7CisgICAgZXBpbG9ndWUuc3JjID0gIi4uLy4uL2pz
L3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiOworICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hp
bGQoZXBpbG9ndWUpOworfQorCitmdW5jdGlvbiBmaW5pc2goKSB7CisgICAgaWYgKHdpbmRvdy5s
YXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3Rp
ZnlEb25lKCk7CisgICAgfQorfQorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keSBvbmxvYWQ9Imlu
aXQoKSI+Cis8Y2FudmFzIGlkPSJleGFtcGxlIiB3aWR0aD0iMzJweCIgaGVpZ2h0PSIzMnB4Ij48
L2NhbnZhcz4KKzxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKzxkaXYgaWQ9ImNvbnNvbGUi
PjwvZGl2PgorPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52879</attachid>
            <date>2010-04-08 10:56:27 -0700</date>
            <delta_ts>2010-04-08 13:59:34 -0700</delta_ts>
            <desc>revised patch: flush before reading pixels</desc>
            <filename>pixels.patch</filename>
            <type>text/plain</type>
            <size>23489</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICByZWFkUGl4
ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBpbnRvIGFjY291bnQKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0NzE4CisKKyAgICAgICAgVGVzdDog
ZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMuaHRtbAorCisgICAgICAgICogaHRtbC9jYW52
YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVu
ZGVyaW5nQ29udGV4dDo6V2ViR0xSZW5kZXJpbmdDb250ZXh0KTogSW5pdCBtZW1iZXJzIHRvIHN1
cHBvcnQgcGFja19hbGlnbm1lbnQuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0Nv
bnRleHQ6OnBpeGVsU3RvcmVpKTogU2F2ZSBwYWNrL3VucGFja19hbGlnbm1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMpOiBWYWxpZGF0ZSBl
bnVtIGFuZCBkZWFsIHdpdGggcGFja19hbGlnbm1lbnQuCisgICAgICAgICogaHRtbC9jYW52YXMv
V2ViR0xSZW5kZXJpbmdDb250ZXh0Lmg6IEFkZCBtZW1iZXJzIHRvIHN1cHBvcnQgcGFja19hbGln
bm1lbnQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaDog
UmVmYWMgcmVhZFBpeGVscy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhp
Y3NDb250ZXh0M0RNYWMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnJlYWRQaXhlbHMpOiBNb3ZlIGFycmF5IGFsbG9jYXRpb24gYW5kIGFscGhhIGZpeCB0byBXZWJH
TFJlbmRlcmluZ0NvbnRleHQ7IGZsdXNoIGJlZm9yZSByZWFkIHBpeGVscy4KKwogMjAxMC0wNC0w
NyAgRHVtaXRydSBEYW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IEplcmVteSBPcmxvdy4KSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5k
ZXJpbmdDb250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdM
UmVuZGVyaW5nQ29udGV4dC5jcHAJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9odG1sL2Nh
bnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICsz
OCw3IEBACiAjaW5jbHVkZSAiUmVuZGVyQm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIK
ICNpbmNsdWRlICJXZWJHTEFjdGl2ZUluZm8uaCIKKyNpbmNsdWRlICJXZWJHTFVuc2lnbmVkU2hv
cnRBcnJheS5oIgogI2luY2x1ZGUgIldlYkdMQnVmZmVyLmgiCiAjaW5jbHVkZSAiV2ViR0xDb250
ZXh0QXR0cmlidXRlcy5oIgogI2luY2x1ZGUgIldlYkdMRnJhbWVidWZmZXIuaCIKQEAgLTg1LDEx
ICs4NiwyMSBAQCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OldlYkdMUmVuZGVyaW5nQ29uCiAgICAg
LCBtX25lZWRzVXBkYXRlKHRydWUpCiAgICAgLCBtX21hcmtlZENhbnZhc0RpcnR5KGZhbHNlKQog
ICAgICwgbV9hY3RpdmVUZXh0dXJlVW5pdCgwKQorICAgICwgbV9wYWNrQWxpZ25tZW50KDQpCisg
ICAgLCBtX3VucGFja0FsaWdubWVudCg0KQogewogICAgIEFTU0VSVChtX2NvbnRleHQpOwogICAg
IGludCBudW1WZXJ0ZXhBdHRyaWJzID0gMDsKICAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2KEdy
YXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX0FUVFJJQlMsICZudW1WZXJ0ZXhBdHRyaWJzKTsK
ICAgICBtX21heFZlcnRleEF0dHJpYnMgPSBudW1WZXJ0ZXhBdHRyaWJzOworICAgIGludCBpbXBs
ZW1lbnRhdGlvbkNvbG9yUmVhZEZvcm1hdCA9IEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBOworICAg
IG1fY29udGV4dC0+Z2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6OklNUExFTUVOVEFUSU9O
X0NPTE9SX1JFQURfRk9STUFULCAmaW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQpOworICAg
IG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQgPSBpbXBsZW1lbnRhdGlvbkNvbG9yUmVh
ZEZvcm1hdDsKKyAgICBpbnQgaW1wbGVtZW50YXRpb25Db2xvclJlYWRUeXBlID0gR3JhcGhpY3ND
b250ZXh0M0Q6OlVOU0lHTkVEX0JZVEU7CisgICAgbV9jb250ZXh0LT5nZXRJbnRlZ2VydihHcmFw
aGljc0NvbnRleHQzRDo6SU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFLCAmaW1wbGVtZW50
YXRpb25Db2xvclJlYWRUeXBlKTsKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSBnZXRFcnJvcigp
IHdoZW4gSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQvVFlQRSBhcmUgc3VwcG9ydGVk
LgorICAgIG1fY29udGV4dC0+Z2V0RXJyb3IoKTsKKyAgICBtX2ltcGxlbWVudGF0aW9uQ29sb3JS
ZWFkVHlwZSA9IGltcGxlbWVudGF0aW9uQ29sb3JSZWFkVHlwZTsKICAgICBtX2NvbnRleHQtPnJl
c2hhcGUoY2FudmFzKCktPndpZHRoKCksIGNhbnZhcygpLT5oZWlnaHQoKSk7CiAgICAgbV9jb250
ZXh0LT52aWV3cG9ydCgwLCAwLCBjYW52YXMoKS0+d2lkdGgoKSwgY2FudmFzKCktPmhlaWdodCgp
KTsKIH0KQEAgLTE1NzQsNiArMTU4NSwxNiBAQCB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6
bGlua1Byb2dyYW0oCiB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6cGl4ZWxTdG9yZWkodW5z
aWduZWQgbG9uZyBwbmFtZSwgbG9uZyBwYXJhbSkKIHsKICAgICBtX2NvbnRleHQtPnBpeGVsU3Rv
cmVpKHBuYW1lLCBwYXJhbSk7CisgICAgaWYgKHBhcmFtID09IDEgfHwgcGFyYW0gPT0gMiB8fCBw
YXJhbSA9PSA0IHx8IHBhcmFtID09IDgpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAg
ICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpQQUNLX0FMSUdOTUVOVDoKKyAgICAgICAgICAg
IG1fcGFja0FsaWdubWVudCA9IHN0YXRpY19jYXN0PGludD4ocGFyYW0pOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OlVOUEFDS19BTElHTk1FTlQ6
CisgICAgICAgICAgICBtX3VucGFja0FsaWdubWVudCA9IHN0YXRpY19jYXN0PGludD4ocGFyYW0p
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAgICAgY2xlYW51cEFmdGVy
R3JhcGhpY3NDYWxsKGZhbHNlKTsKIH0KIApAQCAtMTU4NSw3ICsxNjA2LDc2IEBAIHZvaWQgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0Ojpwb2x5Z29uT2Zmc2UKIAogUGFzc1JlZlB0cjxXZWJHTEFycmF5
PiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2ln
bmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1h
dCwgdW5zaWduZWQgbG9uZyB0eXBlKQogewotICAgIFJlZlB0cjxXZWJHTEFycmF5PiBhcnJheSA9
IG1fY29udGV4dC0+cmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUp
OworICAgIC8vIFZhbGlkYXRlIGVudW1zLgorICAgIHVuc2lnbmVkIGxvbmcgY29tcG9uZW50c1Bl
clBpeGVsID0gMDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR3JhcGhpY3NDb250
ZXh0M0Q6OkFMUEhBOgorICAgICAgICBjb21wb25lbnRzUGVyUGl4ZWwgPSAxOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpSR0I6CisgICAgICAgIGNvbXBvbmVu
dHNQZXJQaXhlbCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0
M0Q6OlJHQkE6CisgICAgICAgIGNvbXBvbmVudHNQZXJQaXhlbCA9IDQ7CisgICAgICAgIGJyZWFr
OworICAgIGRlZmF1bHQ6CisgICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3Jh
cGhpY3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KyAgICB1bnNpZ25lZCBsb25nIGJ5dGVzUGVyQ29tcG9uZW50ID0gMDsKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFOgorICAgICAg
ICBieXRlc1BlckNvbXBvbmVudCA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlRfNV82XzU6Cisg
ICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlRfNF80XzRfNDoKKyAgICBj
YXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9TSE9SVF81XzVfNV8xOgorICAgICAgICBj
b21wb25lbnRzUGVyUGl4ZWwgPSAxOworICAgICAgICBieXRlc1BlckNvbXBvbmVudCA9IHNpemVv
Zih1bnNpZ25lZCBzaG9ydCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAg
IG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURf
RU5VTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIShmb3JtYXQgPT0gR3Jh
cGhpY3NDb250ZXh0M0Q6OlJHQkEgJiYgdHlwZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdO
RURfQllURSB8fCBmb3JtYXQgPT0gbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZEZvcm1hdCAmJiB0
eXBlID09IG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQpKSB7CisgICAgICAgIG1fY29u
dGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfT1BFUkFU
SU9OKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIENhbGN1bGF0ZSBhcnJheSBz
aXplLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIG9mIFBBQ0tfQUxJR05NRU5ULgorICAgIHVu
c2lnbmVkIGxvbmcgYnl0ZXNQZXJSb3cgPSBjb21wb25lbnRzUGVyUGl4ZWwgKiBieXRlc1BlckNv
bXBvbmVudCAqIHdpZHRoOworICAgIHVuc2lnbmVkIGxvbmcgcGFkZGluZyA9IDA7CisgICAgdW5z
aWduZWQgbG9uZyByZXNpZHVsZUJ5dGVzID0gYnl0ZXNQZXJSb3cgJSBtX3BhY2tBbGlnbm1lbnQ7
CisgICAgaWYgKHJlc2lkdWxlQnl0ZXMpIHsKKyAgICAgICAgcGFkZGluZyA9IG1fcGFja0FsaWdu
bWVudCAtIHJlc2lkdWxlQnl0ZXM7CisgICAgICAgIGJ5dGVzUGVyUm93ICs9IHBhZGRpbmc7Cisg
ICAgfQorICAgIC8vIFRoZSBsYXN0IHJvdyBuZWVkcyBubyBwYWRkaW5nLgorICAgIHVuc2lnbmVk
IGxvbmcgdG90YWxCeXRlcyA9IGJ5dGVzUGVyUm93ICogaGVpZ2h0IC0gcGFkZGluZzsKKyAgICB1
bnNpZ25lZCBsb25nIG51bSA9IHRvdGFsQnl0ZXMgLyBieXRlc1BlckNvbXBvbmVudDsKKyAgICBS
ZWZQdHI8V2ViR0xBcnJheT4gYXJyYXk7CisgICAgaWYgKHR5cGUgPT0gR3JhcGhpY3NDb250ZXh0
M0Q6OlVOU0lHTkVEX0JZVEUpCisgICAgICAgIGFycmF5ID0gV2ViR0xVbnNpZ25lZEJ5dGVBcnJh
eTo6Y3JlYXRlKG51bSk7CisgICAgZWxzZQorICAgICAgICBhcnJheSA9IFdlYkdMVW5zaWduZWRT
aG9ydEFycmF5OjpjcmVhdGUobnVtKTsKKyAgICB2b2lkKiBkYXRhID0gYXJyYXktPmJhc2VBZGRy
ZXNzKCk7CisgICAgbV9jb250ZXh0LT5yZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZv
cm1hdCwgdHlwZSwgZGF0YSk7CisjaWYgUExBVEZPUk0oQ0cpCisgICAgLy8gRklYTUU6IHJlbW92
ZSB0aGlzIHNlY3Rpb24gd2hlbiBHTCBkcml2ZXIgYnVnIG9uIE1hYyBpcyBmaXhlZCwgaS5lLiwK
KyAgICAvLyB3aGVuIGFscGhhIGlzIG9mZiwgcmVhZFBpeGVscyBzaG91bGQgc2V0IGFscGhhIHRv
IDI1NSBpbnN0ZWFkIG9mIDAuCisgICAgaWYgKChmb3JtYXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6
OkFMUEhBIHx8IGZvcm1hdCA9PSBHcmFwaGljc0NvbnRleHQzRDo6UkdCQSkgJiYgIW1fY29udGV4
dC0+Z2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSkgeworICAgICAgICBpZiAodHlwZSA9PSBH
cmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfQllURSkgeworICAgICAgICAgICAgdW5zaWduZWQg
Y2hhciogcGl4ZWxzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YSk7Cisg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaXkgPSAwOyBpeSA8IGhlaWdodDsgKytpeSkg
eworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgbG9uZyBpeCA9IDA7IGl4IDwgd2lkdGg7
ICsraXgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2NvbXBvbmVudHNQZXJQaXhlbCAt
IDFdID0gMjU1OworICAgICAgICAgICAgICAgICAgICBwaXhlbHMgKz0gY29tcG9uZW50c1BlclBp
eGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbHMgKz0gcGFkZGlu
ZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogY2hlY2sgd2hl
dGhlciB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIHdpdGggVU5TSUdORURfU0hPUlQuCisgICAgfQor
I2VuZGlmCiAgICAgY2xlYW51cEFmdGVyR3JhcGhpY3NDYWxsKGZhbHNlKTsKICAgICByZXR1cm4g
YXJyYXk7CiB9CkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250
ZXh0LmgJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRl
cmluZ0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMzQyLDYgKzM0MiwxMSBAQCBjbGFzcyBX
ZWJLaXRDU1NNYXRyaXg7CiAgICAgICAgIFRleHR1cmVVbml0U3RhdGUgbV90ZXh0dXJlVW5pdHNb
MzJdOwogICAgICAgICB1bnNpZ25lZCBsb25nIG1fYWN0aXZlVGV4dHVyZVVuaXQ7CiAKKyAgICAg
ICAgaW50IG1fcGFja0FsaWdubWVudDsKKyAgICAgICAgaW50IG1fdW5wYWNrQWxpZ25tZW50Owor
ICAgICAgICB1bnNpZ25lZCBsb25nIG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQ7Cisg
ICAgICAgIHVuc2lnbmVkIGxvbmcgbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZFR5cGU7CisKICAg
ICAgICAgLy8gSGVscGVycyBmb3IgZ2V0UGFyYW1ldGVyIGFuZCBvdGhlcnMKICAgICAgICAgV2Vi
R0xHZXRJbmZvIGdldEJvb2xlYW5QYXJhbWV0ZXIodW5zaWduZWQgbG9uZyBwbmFtZSk7CiAgICAg
ICAgIFdlYkdMR2V0SW5mbyBnZXRGbG9hdFBhcmFtZXRlcih1bnNpZ25lZCBsb25nIHBuYW1lKTsK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgJ
KHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHQzRC5oCSh3b3JraW5nIGNvcHkpCkBAIC01OTIsNyArNTkyLDcgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgICAgICB2b2lkIHBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxv
bmcgcGFyYW0pOwogICAgICAgICB2b2lkIHBvbHlnb25PZmZzZXQoZG91YmxlIGZhY3RvciwgZG91
YmxlIHVuaXRzKTsKICAgICAgICAgCi0gICAgICAgIFBhc3NSZWZQdHI8V2ViR0xBcnJheT4gcmVh
ZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9u
ZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUpOworICAg
ICAgICB2b2lkIHJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgs
IHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9u
ZyB0eXBlLCB2b2lkKiBkYXRhKTsKICAgICAgICAgCiAgICAgICAgIHZvaWQgcmVsZWFzZVNoYWRl
ckNvbXBpbGVyKCk7CiAgICAgICAgIHZvaWQgcmVuZGVyYnVmZmVyU3RvcmFnZSh1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgbG9uZyB3
aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLmNwcAkocmV2aXNpb24g
NTcyNDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQz
RE1hYy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4NSwzNiArNzg1LDIwIEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQoZG8KICAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0
aWNfY2FzdDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7CiB9CiAK
LVBhc3NSZWZQdHI8V2ViR0xBcnJheT4gR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9u
ZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1
bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKQordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25n
IHR5cGUsIHZvaWQqIGRhdGEpCiB7CiAgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIAotICAgIC8vIEZJWE1FOiBGb3Igbm93IHdlIG9ubHkgYWNjZXB0IEdMX1VOU0lHTkVEX0JZ
VEUvR0xfUkdCQS4gSW4gcmVhbGl0eSBPcGVuR0wgRVMgMi4wIGFjY2VwdHMgdGhhdCBwYWlyIGFu
ZCBvbmUgb3RoZXIKLSAgICAvLyBhcyBzcGVjaWZpZWQgYnkgR0xfSU1QTEVNRU5UQVRJT05fQ09M
T1JfUkVBRF9GT1JNQVQgYW5kIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRS4gQnV0
IGZvciBub3cgd2Ugd2lsbAotICAgIC8vIG5vdCBhY2NlcHQgdGhvc2UuCi0gICAgLy8gRklYTUU6
IEFsc28sIHdlIHNob3VsZCB0aHJvdyB3aGVuIGFuIHVuYWNjZXB0YWJsZSB2YWx1ZSBpcyBwYXNz
ZWQKLSAgICBpZiAodHlwZSAhPSBHTF9VTlNJR05FRF9CWVRFIHx8IGZvcm1hdCAhPSBHTF9SR0JB
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgCisgICAgOjpnbEZsdXNoKCk7CiAgICAgaWYg
KG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewog
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFX
X0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwogICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhU
KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0
LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwogICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6OmdsRmx1c2go
KTsKICAgICB9Ci0gICAgUmVmUHRyPFdlYkdMVW5zaWduZWRCeXRlQXJyYXk+IGFycmF5ID0gV2Vi
R0xVbnNpZ25lZEJ5dGVBcnJheTo6Y3JlYXRlKHdpZHRoICogaGVpZ2h0ICogNCk7Ci0gICAgOjpn
bFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCAoR0x2b2lkKikg
YXJyYXktPmRhdGEoKSk7CisgICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwg
Zm9ybWF0LCB0eXBlLCBkYXRhKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3Vu
ZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgaWYgKCFtX2F0dHJz
LmFscGhhKSB7Ci0gICAgICAgIC8vIElmIGFscGhhIGlzIG9mZiwgYnkgZGVmYXVsdCBnbFJlYWRQ
aXhlbHMgc2hvdWxkIHNldCB0aGUgYWxwaGEgdG8gMjU1IGluc3RlYWQgb2YgMC4KLSAgICAgICAg
Ly8gVGhpcyBpcyBhIGhhY2sgdW50aWwgOjpnbFJlYWRQaXhlbHMgZml4ZXMgaXRzIGJlaGF2aW9y
LgotICAgICAgICBHTHVieXRlKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxHTHVieXRlKj4oYXJy
YXktPmRhdGEoKSk7Ci0gICAgICAgIHVuc2lnbmVkIGJ5dGVMZW5ndGggPSBhcnJheS0+Ynl0ZUxl
bmd0aCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAzOyBpIDwgYnl0ZUxlbmd0aDsgaSAr
PSA0KQotICAgICAgICAgICAgZGF0YVtpXSA9IDI1NTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5
OyAgICAKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVy
KCkKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTcyNDkpCisrKyBXZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTAtMDQtMDcgIFpo
ZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICByZWFkUGl4ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBp
bnRvIGFjY291bnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTM0NzE4CisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3NDb250ZXh0M0QuY3BwOiBSZWZhYyBy
ZWFkUGl4ZWxzLgorICAgICAgICAqIHNyYy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBs
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbDo6
cmVhZFBpeGVscyk6IE1vdmUgYXJyYXkgYWxsb2NhdGlvbiBhbmQgYWxwaGEgZml4IHRvIFdlYkdM
UmVuZGVyaW5nQ29udGV4dDsgZmx1c2ggYmVmb3JlIHJlYWQgcGl4ZWxzLgorCiAyMDEwLTA0LTA3
ICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IFl1cnkgU2VtaWtoYXRza3kuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0dyYXBo
aWNzQ29udGV4dDNELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0dyYXBo
aWNzQ29udGV4dDNELmNwcAkocmV2aXNpb24gNTcyNDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3Jj
L0dyYXBoaWNzQ29udGV4dDNELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjE4LDcgKzIxOCw3IEBA
IHB1YmxpYzoKICAgICB2b2lkIHBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxvbmcg
cGFyYW0pOwogICAgIHZvaWQgcG9seWdvbk9mZnNldChkb3VibGUgZmFjdG9yLCBkb3VibGUgdW5p
dHMpOwogCi0gICAgUGFzc1JlZlB0cjxXZWJHTEFycmF5PiByZWFkUGl4ZWxzKGxvbmcgeCwgbG9u
ZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5zaWduZWQg
bG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSk7CisgICAgdm9pZCByZWFkUGl4ZWxzKGxv
bmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwg
dW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgdm9pZCogZGF0YSk7CiAK
ICAgICB2b2lkIHJlbGVhc2VTaGFkZXJDb21waWxlcigpOwogICAgIHZvaWQgcmVuZGVyYnVmZmVy
U3RvcmFnZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1h
dCwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpOwpAQCAtNTkwLDYg
KzU5MCwxMiBAQCBydCBHcmFwaGljc0NvbnRleHQzREludGVybmFsOjpuYW1lKHQxIGExCiAgICAg
cmV0dXJuIG1faW1wbC0+bmFtZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsgICAgICAgXAogfQog
CisjZGVmaW5lIERFTEVHQVRFX1RPX0lNUExfNyhuYW1lLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2
LCB0NykgXAordm9pZCBHcmFwaGljc0NvbnRleHQzREludGVybmFsOjpuYW1lKHQxIGExLCB0MiBh
MiwgdDMgYTMsIHQ0IGE0LCB0NSBhNSwgdDYgYTYsIHQ3IGE3KSBcCit7IFwKKyAgICBtX2ltcGwt
Pm5hbWUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOyAgIFwKK30KKwogI2RlZmluZSBERUxF
R0FURV9UT19JTVBMXzdSKG5hbWUsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCBydCkgXAog
cnQgR3JhcGhpY3NDb250ZXh0M0RJbnRlcm5hbDo6bmFtZSh0MSBhMSwgdDIgYTIsIHQzIGEzLCB0
NCBhNCwgdDUgYTUsIHQ2IGE2LCB0NyBhNykgXAogeyBcCkBAIC04MDQsMTUgKzgxMCw3IEBAIERF
TEVHQVRFX1RPX0lNUExfMShsaW5lV2lkdGgsIGRvdWJsZSkKIERFTEVHQVRFX1RPX0lNUExfMV9Y
KGxpbmtQcm9ncmFtLCBXZWJHTFByb2dyYW0qKQogREVMRUdBVEVfVE9fSU1QTF8yKHBpeGVsU3Rv
cmVpLCB1bnNpZ25lZCBsb25nLCBsb25nKQogREVMRUdBVEVfVE9fSU1QTF8yKHBvbHlnb25PZmZz
ZXQsIGRvdWJsZSwgZG91YmxlKQotCi1QYXNzUmVmUHRyPFdlYkdMQXJyYXk+IEdyYXBoaWNzQ29u
dGV4dDNESW50ZXJuYWw6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcg
d2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWdu
ZWQgbG9uZyB0eXBlKQotewotICAgIC8vIEZJWE1FOiB0YWtlIGludG8gYWNjb3VudCBwYWNrIGFs
aWdubWVudC4KLSAgICBSZWZQdHI8V2ViR0xVbnNpZ25lZEJ5dGVBcnJheT4gYXJyYXkgPSBXZWJH
TFVuc2lnbmVkQnl0ZUFycmF5OjpjcmVhdGUod2lkdGggKiBoZWlnaHQgKiA0KTsKLSAgICBtX2lt
cGwtPnJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBhcnJheS0+
YmFzZUFkZHJlc3MoKSk7Ci0gICAgcmV0dXJuIGFycmF5OwotfQotCitERUxFR0FURV9UT19JTVBM
XzcocmVhZFBpeGVscywgbG9uZywgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywg
dW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdm9pZCopCiBERUxFR0FURV9UT19JTVBMKHJl
bGVhc2VTaGFkZXJDb21waWxlcikKIERFTEVHQVRFX1RPX0lNUExfNChyZW5kZXJidWZmZXJTdG9y
YWdlLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25l
ZCBsb25nKQogREVMRUdBVEVfVE9fSU1QTF8yKHNhbXBsZUNvdmVyYWdlLCBkb3VibGUsIGJvb2wp
CkBAIC0xMDI2LDYgKzEwMjQsMTIgQEAgcnQgR3JhcGhpY3NDb250ZXh0M0Q6Om5hbWUodDEgYTEs
IHQyIGEyLAogICAgIHJldHVybiBtX2ludGVybmFsLT5uYW1lKGExLCBhMiwgYTMsIGE0LCBhNSwg
YTYpOyAgICAgICBcCiB9CiAKKyNkZWZpbmUgREVMRUdBVEVfVE9fSU5URVJOQUxfNyhuYW1lLCB0
MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NykgXAordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bmFt
ZSh0MSBhMSwgdDIgYTIsIHQzIGEzLCB0NCBhNCwgdDUgYTUsIHQ2IGE2LCB0NyBhNykgXAoreyBc
CisgICAgbV9pbnRlcm5hbC0+bmFtZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7ICAgXAor
fQorCiAjZGVmaW5lIERFTEVHQVRFX1RPX0lOVEVSTkFMXzdSKG5hbWUsIHQxLCB0MiwgdDMsIHQ0
LCB0NSwgdDYsIHQ3LCBydCkgXAogcnQgR3JhcGhpY3NDb250ZXh0M0Q6Om5hbWUodDEgYTEsIHQy
IGEyLCB0MyBhMywgdDQgYTQsIHQ1IGE1LCB0NiBhNiwgdDcgYTcpIFwKIHsgXApAQCAtMTE4Myw3
ICsxMTg3LDcgQEAgREVMRUdBVEVfVE9fSU5URVJOQUxfMShsaW5rUHJvZ3JhbSwgV2ViRwogREVM
RUdBVEVfVE9fSU5URVJOQUxfMihwaXhlbFN0b3JlaSwgdW5zaWduZWQgbG9uZywgbG9uZykKIERF
TEVHQVRFX1RPX0lOVEVSTkFMXzIocG9seWdvbk9mZnNldCwgZG91YmxlLCBkb3VibGUpCiAKLURF
TEVHQVRFX1RPX0lOVEVSTkFMXzZSKHJlYWRQaXhlbHMsIGxvbmcsIGxvbmcsIHVuc2lnbmVkIGxv
bmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIFBhc3NSZWZQ
dHI8V2ViR0xBcnJheT4pCitERUxFR0FURV9UT19JTlRFUk5BTF83KHJlYWRQaXhlbHMsIGxvbmcs
IGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2ln
bmVkIGxvbmcsIHZvaWQqKQogCiBERUxFR0FURV9UT19JTlRFUk5BTChyZWxlYXNlU2hhZGVyQ29t
cGlsZXIpCiBERUxFR0FURV9UT19JTlRFUk5BTF80KHJlbmRlcmJ1ZmZlclN0b3JhZ2UsIHVuc2ln
bmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpCklu
ZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViR3JhcGhpY3NDb250ZXh0
M0REZWZhdWx0SW1wbC5jcHAJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTExOCwyNyArMTExOCwxNyBAQCBERUxFR0FURV9UT19HTF8yKHBvbHlnb25PZmZzZXQsIFBvbHln
b25PCiAKIHZvaWQgV2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbDo6cmVhZFBpeGVscyhs
b25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQs
IHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIHBpeGVscykK
IHsKKyAgICBnbEZsdXNoKCk7CiAjaWZuZGVmIFJFTkRFUl9UT19ERUJVR0dJTkdfV0lORE9XCiAg
ICAgaWYgKG1fYXR0cmlidXRlcy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2Ft
cGxlRkJPKSB7CiAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZG
RVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQo
R0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKICAgICAgICAgZ2xCbGl0RnJhbWVidWZm
ZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBo
ZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CiAgICAgICAgIGdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICBnbEZsdXNo
KCk7CiAgICAgfQogI2VuZGlmCiAgICAgZ2xSZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQs
IGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSNpZiBQTEFURk9STShDRykKLSAgICBpZiAoIW1fYXR0
cmlidXRlcy5hbHBoYSkgewotICAgICAgICAvLyBJZiBhbHBoYSBpcyBvZmYsIGJ5IGRlZmF1bHQg
Z2xSZWFkUGl4ZWxzIHNob3VsZCBzZXQgdGhlIGFscGhhIHRvIDI1NSBpbnN0ZWFkIG9mIDAuCi0g
ICAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHVudGlsIGdsUmVhZFBpeGVscyBmaXhlcyBpdHMgYmVo
YXZpb3IuCi0gICAgICAgIC8vIFBpeGVscyBhcmUgc3RvcmVkIGluIFdlYkdMVW5zaWduZWRCeXRl
QXJyYXksIHdoaWNoIGlzIHVuc2lnbmVkIGNoYXIgYXJyYXkuCi0gICAgICAgIHVuc2lnbmVkIGNo
YXIqIGRhdGEgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihwaXhlbHMpOwotICAg
ICAgICAvLyBGSVhNRTogdGFrZSBpbnRvIGFjY291bnQgcGFjayBhbGlnbm1lbnQuCi0gICAgICAg
IHVuc2lnbmVkIGxvbmcgYnl0ZUxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNCAqIHNpemVvZih1
bnNpZ25lZCBjaGFyKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBsb25nIGkgPSAzOyBpIDwgYnl0
ZUxlbmd0aDsgaSArPSA0KQotICAgICAgICAgICAgZGF0YVtpXSA9IDI1NTsKLSAgICB9Ci0jZW5k
aWYKICNpZm5kZWYgUkVOREVSX1RPX0RFQlVHR0lOR19XSU5ET1cKICAgICBpZiAobV9hdHRyaWJ1
dGVzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCiAgICAgICAg
IGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7Cklu
ZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCShyZXZpc2lvbiA1NzI0OSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDEwLTA0LTA3ICBaaGVueWFvIE1vICA8em1vQGdv
b2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgcmVhZFBpeGVscyBtdXN0IHRha2UgUEFDS19BTElHTk1FTlQgaW50byBhY2NvdW50CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDcxOAorCisgICAg
ICAgICogZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMtZXhwZWN0ZWQudHh0OiBWZXJpZnkg
cGl4ZWxTdG9yZWkgYW5kIHJlYWRQaXhlbHMuCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wv
cmVhZC1waXhlbHMuaHRtbDogRGl0dG8uCisKIDIwMTAtMDQtMDcgIEVyaWMgU2VpZGVsICA8ZXJp
Y0B3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy1leHBlY3RlZC50eHQKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMtZXhw
ZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wv
cmVhZC1waXhlbHMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU2IEBACitW
ZXJpZnkgcmVhZFBpeGVscygpIHdvcmtzIGZpbmUgd2l0aCB2YXJpb3VzIFBBQ0tfQUxJR05NRU5U
IHZhbHVlcy4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBt
ZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIGdsID0gaW5pdFdl
YkdMKCdleGFtcGxlJywgJ3ZzaGFkZXInLCAnZnNoYWRlcicsIFsgJ3BvcycsICdjb2xvckluJyBd
LCBbIDAsIDAsIDAsIDEgXSwgMSkgaXMgbm9uLW51bGwuCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5U
ID0gMSwgd2lkdGggPSAxLCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3Rl
ZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19B
TElHTk1FTlQgPSAyLCB3aWR0aCA9IDEsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlz
IGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVzdGlu
ZyBQQUNLX0FMSUdOTUVOVCA9IDQsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5s
ZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVd
CitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGggPSAxLCBoZWlnaHQgPSAyCitQQVNT
IGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAy
MDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA0LCB3aWR0aCA9IDIsIGhlaWdodCA9
IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUx
LCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gMiwg
aGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVs
IGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gNCwgd2lk
dGggPSAzLCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BB
U1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQg
PSA4LCB3aWR0aCA9IDMsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVk
U2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FM
SUdOTUVOVCA9IDQsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMg
ZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5n
IFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGggPSA0LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxl
bmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0K
K1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9IDUsIGhlaWdodCA9IDEKK1BBU1Mg
YXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQs
IHdpZHRoID0gNSwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXpl
CitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05N
RU5UID0gOCwgd2lkdGggPSA1LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBl
Y3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFD
S19BTElHTk1FTlQgPSA4LCB3aWR0aCA9IDYsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3Ro
IGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVz
dGluZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gNywgaGVpZ2h0ID0gMgorUEFTUyBhcnJh
eS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAy
NTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGggPSA4LCBoZWlnaHQgPSAyCitQ
QVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAy
LCAyMDQsIDI1NV0KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01Q
TEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy5o
dG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3JlYWQtcGl4
ZWxzLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9y
ZWFkLXBpeGVscy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExMiBAQAorPGh0bWw+Cis8
aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pz
LXRlc3Qtc3R5bGUuY3NzIi8+Cis8c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRl
c3QtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2ViZ2wtdGVzdC5q
cyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL3V0aWxzM2QuanMiPjwvc2NyaXB0
PgorPHNjcmlwdCBpZD0idnNoYWRlciIgdHlwZT0ieC1zaGFkZXIveC12ZXJ0ZXgiPgorYXR0cmli
dXRlIHZlYzMgcG9zOworYXR0cmlidXRlIHZlYzQgY29sb3JJbjsKK3ZhcnlpbmcgdmVjNCBjb2xv
cjsKKwordm9pZCBtYWluKCkKK3sKKyAgICBjb2xvciA9IGNvbG9ySW47CisgICAgZ2xfUG9zaXRp
b24gPSB2ZWM0KHBvcy54eXosIDEuMCk7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0iZnNo
YWRlciIgdHlwZT0ieC1zaGFkZXIveC1mcmFnbWVudCI+Cit2YXJ5aW5nIHZlYzQgY29sb3I7CisK
K3ZvaWQgbWFpbigpCit7CisgICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7Cit9Cis8L3NjcmlwdD4K
KworPHNjcmlwdD4KK3ZhciBzdWNjZXNzZnVsbHlQYXJzZWQgPSBmYWxzZTsKKworLy8gVGhlc2Ug
Zm91ciBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSBnbG9iYWwgZm9yICJzaG91bGRCZSIgdG8gc2Vl
IHRoZW0KK3ZhciBnbCA9IG51bGw7Cit2YXIgYXJyYXkgPSBudWxsOwordmFyIGV4cGVjdGVkU2l6
ZSA9IDA7Cit2YXIgcGl4ZWwgPSBbIDAsIDAsIDAsIDEgXTsKKworZnVuY3Rpb24gaW5pdCgpCit7
CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRU
ZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZlcmVuY2UoIldlYktpdFdlYkdMRW5hYmxlZCIsICIx
Iik7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAg
bGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIGRlc2Ny
aXB0aW9uKCdWZXJpZnkgcmVhZFBpeGVscygpIHdvcmtzIGZpbmUgd2l0aCB2YXJpb3VzIFBBQ0tf
QUxJR05NRU5UIHZhbHVlcy4nKTsKKworICAgIHJ1blRlc3QoKTsKK30KKworZnVuY3Rpb24gcnVu
VGVzdEl0ZXJhdGlvbihwYWNrQWxpZ25tZW50LCB3aWR0aCwgaGVpZ2h0LCBzaXplKQoreworICAg
IGRlYnVnKCJUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gIiArIHBhY2tBbGlnbm1lbnQgKyAiLCB3
aWR0aCA9ICIgKyB3aWR0aCArICIsIGhlaWdodCA9ICIgKyBoZWlnaHQpOworICAgIGdsLmNsZWFy
Q29sb3IoMC4yLCAwLjQsIDAuOCwgMSk7CisgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJ
VCk7CisgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuUEFDS19BTElHTk1FTlQsIHBhY2tBbGlnbm1lbnQp
OworICAgIGFycmF5ID0gZ2wucmVhZFBpeGVscygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JB
LCBnbC5VTlNJR05FRF9CWVRFKTsKKyAgICBleHBlY3RlZFNpemUgPSBzaXplOworICAgIHNob3Vs
ZEJlKCJhcnJheS5sZW5ndGgiLCAiZXhwZWN0ZWRTaXplIik7CisgICAgLy8gQ2hlY2sgdGhlIGZp
cnN0IHBpeGVsIG9mIHRoZSBzZWNvbmQgcm93LgorICAgIGlmIChoZWlnaHQgPiAxKSB7CisgICAg
ICAgIHZhciBwYWRkaW5nID0gKHNpemUgLSB3aWR0aCAqIGhlaWdodCAqIDQpIC8gKGhlaWdodCAt
IDEpOworICAgICAgICB2YXIgYnl0ZXNQZXJSb3cgPSB3aWR0aCAqIDQgKyBwYWRkaW5nOworICAg
ICAgICBwaXhlbFswXSA9IGFycmF5W2J5dGVzUGVyUm93XTsKKyAgICAgICAgcGl4ZWxbMV0gPSBh
cnJheVtieXRlc1BlclJvdyArIDFdOworICAgICAgICBwaXhlbFsyXSA9IGFycmF5W2J5dGVzUGVy
Um93ICsgMl07CisgICAgICAgIHBpeGVsWzNdID0gYXJyYXlbYnl0ZXNQZXJSb3cgKyAzXTsKKyAg
ICAgICAgc2hvdWxkQmUoInBpeGVsIiwgIlsgNTEsIDEwMiwgMjA0LCAyNTVdIik7CisgICAgfQor
fQorCitmdW5jdGlvbiBydW5UZXN0KCkKK3sKKyAgICBzaG91bGRCZU5vbk51bGwoImdsID0gaW5p
dFdlYkdMKCdleGFtcGxlJywgJ3ZzaGFkZXInLCAnZnNoYWRlcicsIFsgJ3BvcycsICdjb2xvcklu
JyBdLCBbIDAsIDAsIDAsIDEgXSwgMSkiKTsKKyAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTsKKwor
ICAgIHJ1blRlc3RJdGVyYXRpb24oMSwgMSwgMiwgOCk7CisgICAgcnVuVGVzdEl0ZXJhdGlvbigy
LCAxLCAyLCA4KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDQsIDEsIDIsIDgpOworICAgIHJ1blRl
c3RJdGVyYXRpb24oOCwgMSwgMiwgMTIpOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgMiwgMiwg
MTYpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgMiwgMiwgMTYpOworICAgIHJ1blRlc3RJdGVy
YXRpb24oNCwgMywgMiwgMjQpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgMywgMiwgMjgpOwor
ICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgNCwgMiwgMzIpOworICAgIHJ1blRlc3RJdGVyYXRpb24o
OCwgNCwgMiwgMzIpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNSwgMSwgMjApOworICAgIHJ1
blRlc3RJdGVyYXRpb24oNCwgNSwgMiwgNDApOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNSwg
MiwgNDQpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNiwgMiwgNDgpOworICAgIHJ1blRlc3RJ
dGVyYXRpb24oOCwgNywgMiwgNjApOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgOCwgMiwgNjQp
OworCisgICAgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKKyAgICB2YXIgZXBpbG9ndWUgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKyAgICBlcGlsb2d1ZS5vbmxvYWQgPSBm
aW5pc2g7CisgICAgZXBpbG9ndWUuc3JjID0gIi4uLy4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXBv
c3QuanMiOworICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZXBpbG9ndWUpOworfQorCitm
dW5jdGlvbiBmaW5pc2goKSB7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikg
eworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7CisgICAgfQorfQor
PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keSBvbmxvYWQ9ImluaXQoKSI+Cis8Y2FudmFzIGlkPSJl
eGFtcGxlIiB3aWR0aD0iMzJweCIgaGVpZ2h0PSIzMnB4Ij48L2NhbnZhcz4KKzxkaXYgaWQ9ImRl
c2NyaXB0aW9uIj48L2Rpdj4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPC9ib2R5PgorPC9o
dG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52894</attachid>
            <date>2010-04-08 13:59:34 -0700</date>
            <delta_ts>2010-04-08 15:47:32 -0700</delta_ts>
            <desc>revised patch: deal with internal glReadPixels situation</desc>
            <filename>pixels.patch</filename>
            <type>text/plain</type>
            <size>24437</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICByZWFkUGl4
ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBpbnRvIGFjY291bnQKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0NzE4CisKKyAgICAgICAgVGVzdDog
ZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMuaHRtbAorCisgICAgICAgICogaHRtbC9jYW52
YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVu
ZGVyaW5nQ29udGV4dDo6V2ViR0xSZW5kZXJpbmdDb250ZXh0KTogSW5pdCBtZW1iZXJzIHRvIHN1
cHBvcnQgcGFja19hbGlnbm1lbnQuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0Nv
bnRleHQ6OnBpeGVsU3RvcmVpKTogU2F2ZSBwYWNrL3VucGFja19hbGlnbm1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMpOiBWYWxpZGF0ZSBl
bnVtIGFuZCBkZWFsIHdpdGggcGFja19hbGlnbm1lbnQuCisgICAgICAgICogaHRtbC9jYW52YXMv
V2ViR0xSZW5kZXJpbmdDb250ZXh0Lmg6IEFkZCBtZW1iZXJzIHRvIHN1cHBvcnQgcGFja19hbGln
bm1lbnQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaDog
UmVmYWMgcmVhZFBpeGVscy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhp
Y3NDb250ZXh0M0RNYWMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnJlYWRQaXhlbHMpOiBNb3ZlIGFycmF5IGFsbG9jYXRpb24gYW5kIGFscGhhIGZpeCB0byBXZWJH
TFJlbmRlcmluZ0NvbnRleHQ7IGZsdXNoIGJlZm9yZSByZWFkIHBpeGVscy4KKwogMjAxMC0wNC0w
NyAgRHVtaXRydSBEYW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IEplcmVteSBPcmxvdy4KSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5k
ZXJpbmdDb250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdM
UmVuZGVyaW5nQ29udGV4dC5jcHAJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9odG1sL2Nh
bnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICsz
OCw3IEBACiAjaW5jbHVkZSAiUmVuZGVyQm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIK
ICNpbmNsdWRlICJXZWJHTEFjdGl2ZUluZm8uaCIKKyNpbmNsdWRlICJXZWJHTFVuc2lnbmVkU2hv
cnRBcnJheS5oIgogI2luY2x1ZGUgIldlYkdMQnVmZmVyLmgiCiAjaW5jbHVkZSAiV2ViR0xDb250
ZXh0QXR0cmlidXRlcy5oIgogI2luY2x1ZGUgIldlYkdMRnJhbWVidWZmZXIuaCIKQEAgLTg1LDEx
ICs4NiwyMSBAQCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OldlYkdMUmVuZGVyaW5nQ29uCiAgICAg
LCBtX25lZWRzVXBkYXRlKHRydWUpCiAgICAgLCBtX21hcmtlZENhbnZhc0RpcnR5KGZhbHNlKQog
ICAgICwgbV9hY3RpdmVUZXh0dXJlVW5pdCgwKQorICAgICwgbV9wYWNrQWxpZ25tZW50KDQpCisg
ICAgLCBtX3VucGFja0FsaWdubWVudCg0KQogewogICAgIEFTU0VSVChtX2NvbnRleHQpOwogICAg
IGludCBudW1WZXJ0ZXhBdHRyaWJzID0gMDsKICAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2KEdy
YXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX0FUVFJJQlMsICZudW1WZXJ0ZXhBdHRyaWJzKTsK
ICAgICBtX21heFZlcnRleEF0dHJpYnMgPSBudW1WZXJ0ZXhBdHRyaWJzOworICAgIGludCBpbXBs
ZW1lbnRhdGlvbkNvbG9yUmVhZEZvcm1hdCA9IEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBOworICAg
IG1fY29udGV4dC0+Z2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6OklNUExFTUVOVEFUSU9O
X0NPTE9SX1JFQURfRk9STUFULCAmaW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQpOworICAg
IG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQgPSBpbXBsZW1lbnRhdGlvbkNvbG9yUmVh
ZEZvcm1hdDsKKyAgICBpbnQgaW1wbGVtZW50YXRpb25Db2xvclJlYWRUeXBlID0gR3JhcGhpY3ND
b250ZXh0M0Q6OlVOU0lHTkVEX0JZVEU7CisgICAgbV9jb250ZXh0LT5nZXRJbnRlZ2VydihHcmFw
aGljc0NvbnRleHQzRDo6SU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFLCAmaW1wbGVtZW50
YXRpb25Db2xvclJlYWRUeXBlKTsKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSBnZXRFcnJvcigp
IHdoZW4gSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQvVFlQRSBhcmUgc3VwcG9ydGVk
LgorICAgIG1fY29udGV4dC0+Z2V0RXJyb3IoKTsKKyAgICBtX2ltcGxlbWVudGF0aW9uQ29sb3JS
ZWFkVHlwZSA9IGltcGxlbWVudGF0aW9uQ29sb3JSZWFkVHlwZTsKICAgICBtX2NvbnRleHQtPnJl
c2hhcGUoY2FudmFzKCktPndpZHRoKCksIGNhbnZhcygpLT5oZWlnaHQoKSk7CiAgICAgbV9jb250
ZXh0LT52aWV3cG9ydCgwLCAwLCBjYW52YXMoKS0+d2lkdGgoKSwgY2FudmFzKCktPmhlaWdodCgp
KTsKIH0KQEAgLTE1NzQsNiArMTU4NSwxNiBAQCB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6
bGlua1Byb2dyYW0oCiB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6cGl4ZWxTdG9yZWkodW5z
aWduZWQgbG9uZyBwbmFtZSwgbG9uZyBwYXJhbSkKIHsKICAgICBtX2NvbnRleHQtPnBpeGVsU3Rv
cmVpKHBuYW1lLCBwYXJhbSk7CisgICAgaWYgKHBhcmFtID09IDEgfHwgcGFyYW0gPT0gMiB8fCBw
YXJhbSA9PSA0IHx8IHBhcmFtID09IDgpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAg
ICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpQQUNLX0FMSUdOTUVOVDoKKyAgICAgICAgICAg
IG1fcGFja0FsaWdubWVudCA9IHN0YXRpY19jYXN0PGludD4ocGFyYW0pOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OlVOUEFDS19BTElHTk1FTlQ6
CisgICAgICAgICAgICBtX3VucGFja0FsaWdubWVudCA9IHN0YXRpY19jYXN0PGludD4ocGFyYW0p
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAgICAgY2xlYW51cEFmdGVy
R3JhcGhpY3NDYWxsKGZhbHNlKTsKIH0KIApAQCAtMTU4NSw3ICsxNjA2LDc2IEBAIHZvaWQgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0Ojpwb2x5Z29uT2Zmc2UKIAogUGFzc1JlZlB0cjxXZWJHTEFycmF5
PiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2ln
bmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1h
dCwgdW5zaWduZWQgbG9uZyB0eXBlKQogewotICAgIFJlZlB0cjxXZWJHTEFycmF5PiBhcnJheSA9
IG1fY29udGV4dC0+cmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUp
OworICAgIC8vIFZhbGlkYXRlIGVudW1zLgorICAgIHVuc2lnbmVkIGxvbmcgY29tcG9uZW50c1Bl
clBpeGVsID0gMDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR3JhcGhpY3NDb250
ZXh0M0Q6OkFMUEhBOgorICAgICAgICBjb21wb25lbnRzUGVyUGl4ZWwgPSAxOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpSR0I6CisgICAgICAgIGNvbXBvbmVu
dHNQZXJQaXhlbCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0
M0Q6OlJHQkE6CisgICAgICAgIGNvbXBvbmVudHNQZXJQaXhlbCA9IDQ7CisgICAgICAgIGJyZWFr
OworICAgIGRlZmF1bHQ6CisgICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3Jh
cGhpY3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KyAgICB1bnNpZ25lZCBsb25nIGJ5dGVzUGVyQ29tcG9uZW50ID0gMDsKKyAgICBzd2l0Y2ggKHR5
cGUpIHsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFOgorICAgICAg
ICBieXRlc1BlckNvbXBvbmVudCA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlRfNV82XzU6Cisg
ICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlRfNF80XzRfNDoKKyAgICBj
YXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9TSE9SVF81XzVfNV8xOgorICAgICAgICBj
b21wb25lbnRzUGVyUGl4ZWwgPSAxOworICAgICAgICBieXRlc1BlckNvbXBvbmVudCA9IHNpemVv
Zih1bnNpZ25lZCBzaG9ydCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAg
IG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURf
RU5VTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIShmb3JtYXQgPT0gR3Jh
cGhpY3NDb250ZXh0M0Q6OlJHQkEgJiYgdHlwZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdO
RURfQllURSB8fCBmb3JtYXQgPT0gbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZEZvcm1hdCAmJiB0
eXBlID09IG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQpKSB7CisgICAgICAgIG1fY29u
dGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfT1BFUkFU
SU9OKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIENhbGN1bGF0ZSBhcnJheSBz
aXplLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIG9mIFBBQ0tfQUxJR05NRU5ULgorICAgIHVu
c2lnbmVkIGxvbmcgYnl0ZXNQZXJSb3cgPSBjb21wb25lbnRzUGVyUGl4ZWwgKiBieXRlc1BlckNv
bXBvbmVudCAqIHdpZHRoOworICAgIHVuc2lnbmVkIGxvbmcgcGFkZGluZyA9IDA7CisgICAgdW5z
aWduZWQgbG9uZyByZXNpZHVsZUJ5dGVzID0gYnl0ZXNQZXJSb3cgJSBtX3BhY2tBbGlnbm1lbnQ7
CisgICAgaWYgKHJlc2lkdWxlQnl0ZXMpIHsKKyAgICAgICAgcGFkZGluZyA9IG1fcGFja0FsaWdu
bWVudCAtIHJlc2lkdWxlQnl0ZXM7CisgICAgICAgIGJ5dGVzUGVyUm93ICs9IHBhZGRpbmc7Cisg
ICAgfQorICAgIC8vIFRoZSBsYXN0IHJvdyBuZWVkcyBubyBwYWRkaW5nLgorICAgIHVuc2lnbmVk
IGxvbmcgdG90YWxCeXRlcyA9IGJ5dGVzUGVyUm93ICogaGVpZ2h0IC0gcGFkZGluZzsKKyAgICB1
bnNpZ25lZCBsb25nIG51bSA9IHRvdGFsQnl0ZXMgLyBieXRlc1BlckNvbXBvbmVudDsKKyAgICBS
ZWZQdHI8V2ViR0xBcnJheT4gYXJyYXk7CisgICAgaWYgKHR5cGUgPT0gR3JhcGhpY3NDb250ZXh0
M0Q6OlVOU0lHTkVEX0JZVEUpCisgICAgICAgIGFycmF5ID0gV2ViR0xVbnNpZ25lZEJ5dGVBcnJh
eTo6Y3JlYXRlKG51bSk7CisgICAgZWxzZQorICAgICAgICBhcnJheSA9IFdlYkdMVW5zaWduZWRT
aG9ydEFycmF5OjpjcmVhdGUobnVtKTsKKyAgICB2b2lkKiBkYXRhID0gYXJyYXktPmJhc2VBZGRy
ZXNzKCk7CisgICAgbV9jb250ZXh0LT5yZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZv
cm1hdCwgdHlwZSwgZGF0YSk7CisjaWYgUExBVEZPUk0oQ0cpCisgICAgLy8gRklYTUU6IHJlbW92
ZSB0aGlzIHNlY3Rpb24gd2hlbiBHTCBkcml2ZXIgYnVnIG9uIE1hYyBpcyBmaXhlZCwgaS5lLiwK
KyAgICAvLyB3aGVuIGFscGhhIGlzIG9mZiwgcmVhZFBpeGVscyBzaG91bGQgc2V0IGFscGhhIHRv
IDI1NSBpbnN0ZWFkIG9mIDAuCisgICAgaWYgKChmb3JtYXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6
OkFMUEhBIHx8IGZvcm1hdCA9PSBHcmFwaGljc0NvbnRleHQzRDo6UkdCQSkgJiYgIW1fY29udGV4
dC0+Z2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSkgeworICAgICAgICBpZiAodHlwZSA9PSBH
cmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfQllURSkgeworICAgICAgICAgICAgdW5zaWduZWQg
Y2hhciogcGl4ZWxzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YSk7Cisg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaXkgPSAwOyBpeSA8IGhlaWdodDsgKytpeSkg
eworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgbG9uZyBpeCA9IDA7IGl4IDwgd2lkdGg7
ICsraXgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2NvbXBvbmVudHNQZXJQaXhlbCAt
IDFdID0gMjU1OworICAgICAgICAgICAgICAgICAgICBwaXhlbHMgKz0gY29tcG9uZW50c1BlclBp
eGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbHMgKz0gcGFkZGlu
ZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogY2hlY2sgd2hl
dGhlciB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIHdpdGggVU5TSUdORURfU0hPUlQuCisgICAgfQor
I2VuZGlmCiAgICAgY2xlYW51cEFmdGVyR3JhcGhpY3NDYWxsKGZhbHNlKTsKICAgICByZXR1cm4g
YXJyYXk7CiB9CkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250
ZXh0LmgJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRl
cmluZ0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMzQyLDYgKzM0MiwxMSBAQCBjbGFzcyBX
ZWJLaXRDU1NNYXRyaXg7CiAgICAgICAgIFRleHR1cmVVbml0U3RhdGUgbV90ZXh0dXJlVW5pdHNb
MzJdOwogICAgICAgICB1bnNpZ25lZCBsb25nIG1fYWN0aXZlVGV4dHVyZVVuaXQ7CiAKKyAgICAg
ICAgaW50IG1fcGFja0FsaWdubWVudDsKKyAgICAgICAgaW50IG1fdW5wYWNrQWxpZ25tZW50Owor
ICAgICAgICB1bnNpZ25lZCBsb25nIG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQ7Cisg
ICAgICAgIHVuc2lnbmVkIGxvbmcgbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZFR5cGU7CisKICAg
ICAgICAgLy8gSGVscGVycyBmb3IgZ2V0UGFyYW1ldGVyIGFuZCBvdGhlcnMKICAgICAgICAgV2Vi
R0xHZXRJbmZvIGdldEJvb2xlYW5QYXJhbWV0ZXIodW5zaWduZWQgbG9uZyBwbmFtZSk7CiAgICAg
ICAgIFdlYkdMR2V0SW5mbyBnZXRGbG9hdFBhcmFtZXRlcih1bnNpZ25lZCBsb25nIHBuYW1lKTsK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgJ
KHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHQzRC5oCSh3b3JraW5nIGNvcHkpCkBAIC01OTIsNyArNTkyLDcgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgICAgICB2b2lkIHBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxv
bmcgcGFyYW0pOwogICAgICAgICB2b2lkIHBvbHlnb25PZmZzZXQoZG91YmxlIGZhY3RvciwgZG91
YmxlIHVuaXRzKTsKICAgICAgICAgCi0gICAgICAgIFBhc3NSZWZQdHI8V2ViR0xBcnJheT4gcmVh
ZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9u
ZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUpOworICAg
ICAgICB2b2lkIHJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgs
IHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9u
ZyB0eXBlLCB2b2lkKiBkYXRhKTsKICAgICAgICAgCiAgICAgICAgIHZvaWQgcmVsZWFzZVNoYWRl
ckNvbXBpbGVyKCk7CiAgICAgICAgIHZvaWQgcmVuZGVyYnVmZmVyU3RvcmFnZSh1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgbG9uZyB3
aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLmNwcAkocmV2aXNpb24g
NTcyNDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQz
RE1hYy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4NSwzNiArNzg1LDIwIEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQoZG8KICAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0
aWNfY2FzdDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7CiB9CiAK
LVBhc3NSZWZQdHI8V2ViR0xBcnJheT4gR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9u
ZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1
bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKQordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25n
IHR5cGUsIHZvaWQqIGRhdGEpCiB7CiAgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIAotICAgIC8vIEZJWE1FOiBGb3Igbm93IHdlIG9ubHkgYWNjZXB0IEdMX1VOU0lHTkVEX0JZ
VEUvR0xfUkdCQS4gSW4gcmVhbGl0eSBPcGVuR0wgRVMgMi4wIGFjY2VwdHMgdGhhdCBwYWlyIGFu
ZCBvbmUgb3RoZXIKLSAgICAvLyBhcyBzcGVjaWZpZWQgYnkgR0xfSU1QTEVNRU5UQVRJT05fQ09M
T1JfUkVBRF9GT1JNQVQgYW5kIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRS4gQnV0
IGZvciBub3cgd2Ugd2lsbAotICAgIC8vIG5vdCBhY2NlcHQgdGhvc2UuCi0gICAgLy8gRklYTUU6
IEFsc28sIHdlIHNob3VsZCB0aHJvdyB3aGVuIGFuIHVuYWNjZXB0YWJsZSB2YWx1ZSBpcyBwYXNz
ZWQKLSAgICBpZiAodHlwZSAhPSBHTF9VTlNJR05FRF9CWVRFIHx8IGZvcm1hdCAhPSBHTF9SR0JB
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgCisgICAgOjpnbEZsdXNoKCk7CiAgICAgaWYg
KG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewog
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFX
X0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwogICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhU
KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0
LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwogICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6OmdsRmx1c2go
KTsKICAgICB9Ci0gICAgUmVmUHRyPFdlYkdMVW5zaWduZWRCeXRlQXJyYXk+IGFycmF5ID0gV2Vi
R0xVbnNpZ25lZEJ5dGVBcnJheTo6Y3JlYXRlKHdpZHRoICogaGVpZ2h0ICogNCk7Ci0gICAgOjpn
bFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCAoR0x2b2lkKikg
YXJyYXktPmRhdGEoKSk7CisgICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwg
Zm9ybWF0LCB0eXBlLCBkYXRhKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3Vu
ZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgaWYgKCFtX2F0dHJz
LmFscGhhKSB7Ci0gICAgICAgIC8vIElmIGFscGhhIGlzIG9mZiwgYnkgZGVmYXVsdCBnbFJlYWRQ
aXhlbHMgc2hvdWxkIHNldCB0aGUgYWxwaGEgdG8gMjU1IGluc3RlYWQgb2YgMC4KLSAgICAgICAg
Ly8gVGhpcyBpcyBhIGhhY2sgdW50aWwgOjpnbFJlYWRQaXhlbHMgZml4ZXMgaXRzIGJlaGF2aW9y
LgotICAgICAgICBHTHVieXRlKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxHTHVieXRlKj4oYXJy
YXktPmRhdGEoKSk7Ci0gICAgICAgIHVuc2lnbmVkIGJ5dGVMZW5ndGggPSBhcnJheS0+Ynl0ZUxl
bmd0aCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAzOyBpIDwgYnl0ZUxlbmd0aDsgaSAr
PSA0KQotICAgICAgICAgICAgZGF0YVtpXSA9IDI1NTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5
OyAgICAKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVy
KCkKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTcyNDkpCisrKyBXZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTAtMDQtMDcgIFpo
ZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICByZWFkUGl4ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBp
bnRvIGFjY291bnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTM0NzE4CisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3NDb250ZXh0M0QuY3BwOiBSZWZhYyBy
ZWFkUGl4ZWxzLgorICAgICAgICAqIHNyYy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBs
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbDo6
cmVhZEJhY2tGcmFtZWJ1ZmZlcik6IFRlbXBvcmFyaWx5IGRpc2FibGUgcGFjayBhbGlnbm1lbnQg
Zm9yIGdsUmVhZFBpeGVscy4KKyAgICAgICAgKFdlYktpdDo6V2ViR3JhcGhpY3NDb250ZXh0M0RE
ZWZhdWx0SW1wbDo6cmVhZFBpeGVscyk6IE1vdmUgYXJyYXkgYWxsb2NhdGlvbiBhbmQgYWxwaGEg
Zml4IHRvIFdlYkdMUmVuZGVyaW5nQ29udGV4dDsgZmx1c2ggYmVmb3JlIHJlYWQgcGl4ZWxzLgor
CiAyMDEwLTA0LTA3ICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFl1cnkgU2VtaWtoYXRza3kuCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL0dyYXBoaWNzQ29udGV4dDNELmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21p
dW0vc3JjL0dyYXBoaWNzQ29udGV4dDNELmNwcAkocmV2aXNpb24gNTcyNDApCisrKyBXZWJLaXQv
Y2hyb21pdW0vc3JjL0dyYXBoaWNzQ29udGV4dDNELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjE4
LDcgKzIxOCw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcg
cG5hbWUsIGxvbmcgcGFyYW0pOwogICAgIHZvaWQgcG9seWdvbk9mZnNldChkb3VibGUgZmFjdG9y
LCBkb3VibGUgdW5pdHMpOwogCi0gICAgUGFzc1JlZlB0cjxXZWJHTEFycmF5PiByZWFkUGl4ZWxz
KGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdo
dCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSk7CisgICAgdm9pZCBy
ZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgdm9p
ZCogZGF0YSk7CiAKICAgICB2b2lkIHJlbGVhc2VTaGFkZXJDb21waWxlcigpOwogICAgIHZvaWQg
cmVuZGVyYnVmZmVyU3RvcmFnZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBp
bnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQp
OwpAQCAtNTkwLDYgKzU5MCwxMiBAQCBydCBHcmFwaGljc0NvbnRleHQzREludGVybmFsOjpuYW1l
KHQxIGExCiAgICAgcmV0dXJuIG1faW1wbC0+bmFtZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsg
ICAgICAgXAogfQogCisjZGVmaW5lIERFTEVHQVRFX1RPX0lNUExfNyhuYW1lLCB0MSwgdDIsIHQz
LCB0NCwgdDUsIHQ2LCB0NykgXAordm9pZCBHcmFwaGljc0NvbnRleHQzREludGVybmFsOjpuYW1l
KHQxIGExLCB0MiBhMiwgdDMgYTMsIHQ0IGE0LCB0NSBhNSwgdDYgYTYsIHQ3IGE3KSBcCit7IFwK
KyAgICBtX2ltcGwtPm5hbWUoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOyAgIFwKK30KKwog
I2RlZmluZSBERUxFR0FURV9UT19JTVBMXzdSKG5hbWUsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYs
IHQ3LCBydCkgXAogcnQgR3JhcGhpY3NDb250ZXh0M0RJbnRlcm5hbDo6bmFtZSh0MSBhMSwgdDIg
YTIsIHQzIGEzLCB0NCBhNCwgdDUgYTUsIHQ2IGE2LCB0NyBhNykgXAogeyBcCkBAIC04MDQsMTUg
KzgxMCw3IEBAIERFTEVHQVRFX1RPX0lNUExfMShsaW5lV2lkdGgsIGRvdWJsZSkKIERFTEVHQVRF
X1RPX0lNUExfMV9YKGxpbmtQcm9ncmFtLCBXZWJHTFByb2dyYW0qKQogREVMRUdBVEVfVE9fSU1Q
TF8yKHBpeGVsU3RvcmVpLCB1bnNpZ25lZCBsb25nLCBsb25nKQogREVMRUdBVEVfVE9fSU1QTF8y
KHBvbHlnb25PZmZzZXQsIGRvdWJsZSwgZG91YmxlKQotCi1QYXNzUmVmUHRyPFdlYkdMQXJyYXk+
IEdyYXBoaWNzQ29udGV4dDNESW50ZXJuYWw6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVu
c2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZv
cm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKQotewotICAgIC8vIEZJWE1FOiB0YWtlIGludG8gYWNj
b3VudCBwYWNrIGFsaWdubWVudC4KLSAgICBSZWZQdHI8V2ViR0xVbnNpZ25lZEJ5dGVBcnJheT4g
YXJyYXkgPSBXZWJHTFVuc2lnbmVkQnl0ZUFycmF5OjpjcmVhdGUod2lkdGggKiBoZWlnaHQgKiA0
KTsKLSAgICBtX2ltcGwtPnJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0
eXBlLCBhcnJheS0+YmFzZUFkZHJlc3MoKSk7Ci0gICAgcmV0dXJuIGFycmF5OwotfQotCitERUxF
R0FURV9UT19JTVBMXzcocmVhZFBpeGVscywgbG9uZywgbG9uZywgdW5zaWduZWQgbG9uZywgdW5z
aWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdm9pZCopCiBERUxFR0FU
RV9UT19JTVBMKHJlbGVhc2VTaGFkZXJDb21waWxlcikKIERFTEVHQVRFX1RPX0lNUExfNChyZW5k
ZXJidWZmZXJTdG9yYWdlLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBs
b25nLCB1bnNpZ25lZCBsb25nKQogREVMRUdBVEVfVE9fSU1QTF8yKHNhbXBsZUNvdmVyYWdlLCBk
b3VibGUsIGJvb2wpCkBAIC0xMDI2LDYgKzEwMjQsMTIgQEAgcnQgR3JhcGhpY3NDb250ZXh0M0Q6
Om5hbWUodDEgYTEsIHQyIGEyLAogICAgIHJldHVybiBtX2ludGVybmFsLT5uYW1lKGExLCBhMiwg
YTMsIGE0LCBhNSwgYTYpOyAgICAgICBcCiB9CiAKKyNkZWZpbmUgREVMRUdBVEVfVE9fSU5URVJO
QUxfNyhuYW1lLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NykgXAordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6bmFtZSh0MSBhMSwgdDIgYTIsIHQzIGEzLCB0NCBhNCwgdDUgYTUsIHQ2IGE2LCB0
NyBhNykgXAoreyBcCisgICAgbV9pbnRlcm5hbC0+bmFtZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2
LCBhNyk7ICAgXAorfQorCiAjZGVmaW5lIERFTEVHQVRFX1RPX0lOVEVSTkFMXzdSKG5hbWUsIHQx
LCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCBydCkgXAogcnQgR3JhcGhpY3NDb250ZXh0M0Q6Om5h
bWUodDEgYTEsIHQyIGEyLCB0MyBhMywgdDQgYTQsIHQ1IGE1LCB0NiBhNiwgdDcgYTcpIFwKIHsg
XApAQCAtMTE4Myw3ICsxMTg3LDcgQEAgREVMRUdBVEVfVE9fSU5URVJOQUxfMShsaW5rUHJvZ3Jh
bSwgV2ViRwogREVMRUdBVEVfVE9fSU5URVJOQUxfMihwaXhlbFN0b3JlaSwgdW5zaWduZWQgbG9u
ZywgbG9uZykKIERFTEVHQVRFX1RPX0lOVEVSTkFMXzIocG9seWdvbk9mZnNldCwgZG91YmxlLCBk
b3VibGUpCiAKLURFTEVHQVRFX1RPX0lOVEVSTkFMXzZSKHJlYWRQaXhlbHMsIGxvbmcsIGxvbmcs
IHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxv
bmcsIFBhc3NSZWZQdHI8V2ViR0xBcnJheT4pCitERUxFR0FURV9UT19JTlRFUk5BTF83KHJlYWRQ
aXhlbHMsIGxvbmcsIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVk
IGxvbmcsIHVuc2lnbmVkIGxvbmcsIHZvaWQqKQogCiBERUxFR0FURV9UT19JTlRFUk5BTChyZWxl
YXNlU2hhZGVyQ29tcGlsZXIpCiBERUxFR0FURV9UT19JTlRFUk5BTF80KHJlbmRlcmJ1ZmZlclN0
b3JhZ2UsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2ln
bmVkIGxvbmcpCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkdyYXBoaWNzQ29udGV4dDNE
RGVmYXVsdEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViR3Jh
cGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbC5jcHAJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViS2l0
L2Nocm9taXVtL3NyYy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNjYxLDYgKzY2MSwxNSBAQCBib29sIFdlYkdyYXBoaWNzQ29udGV4dDNERGVm
YXVsdEltcGw6OnJlCiAgICAgICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJV
RkZFUl9FWFQsIG1fZmJvKTsKICAgICAgICAgfQogICAgIH0KKworICAgIEdMaW50IHBhY2tBbGln
bm1lbnQgPSA0OworICAgIGJvb2wgbXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gZmFsc2U7Cisg
ICAgZ2xHZXRJbnRlZ2VydihHTF9QQUNLX0FMSUdOTUVOVCwgJnBhY2tBbGlnbm1lbnQpOworICAg
IGlmIChwYWNrQWxpZ25tZW50ID4gNCkgeworICAgICAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tf
QUxJR05NRU5ULCA0KTsKKyAgICAgICAgbXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gdHJ1ZTsK
KyAgICB9CisKICNpZiBQTEFURk9STShTS0lBKQogICAgIGdsUmVhZFBpeGVscygwLCAwLCBtX2Nh
Y2hlZFdpZHRoLCBtX2NhY2hlZEhlaWdodCwgR0xfQkdSQSwgR0xfVU5TSUdORURfQllURSwgcGl4
ZWxzKTsKICNlbGlmIFBMQVRGT1JNKENHKQpAQCAtNjY5LDYgKzY3OCw5IEBAIGJvb2wgV2ViR3Jh
cGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbDo6cmUKICNlcnJvciBNdXN0IHBvcnQgdG8geW91ciBw
bGF0Zm9ybQogI2VuZGlmCiAKKyAgICBpZiAobXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50KQorICAg
ICAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCBwYWNrQWxpZ25tZW50KTsKKwog
ICAgIGlmIChtdXN0UmVzdG9yZUZCTykKICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKIApAQCAtMTExOCwyNyArMTEzMCwxNyBAQCBE
RUxFR0FURV9UT19HTF8yKHBvbHlnb25PZmZzZXQsIFBvbHlnb25PCiAKIHZvaWQgV2ViR3JhcGhp
Y3NDb250ZXh0M0REZWZhdWx0SW1wbDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWdu
ZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0
LCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIHBpeGVscykKIHsKKyAgICBnbEZsdXNoKCk7CiAj
aWZuZGVmIFJFTkRFUl9UT19ERUJVR0dJTkdfV0lORE9XCiAgICAgaWYgKG1fYXR0cmlidXRlcy5h
bnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAgICAgIGds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxl
RkJPKTsKICAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9F
WFQsIG1fZmJvKTsKICAgICAgICAgZ2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRo
LCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZF
Ul9CSVQsIEdMX0xJTkVBUik7CiAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICBnbEZsdXNoKCk7CiAgICAgfQogI2VuZGlmCiAg
ICAgZ2xSZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxz
KTsKLSNpZiBQTEFURk9STShDRykKLSAgICBpZiAoIW1fYXR0cmlidXRlcy5hbHBoYSkgewotICAg
ICAgICAvLyBJZiBhbHBoYSBpcyBvZmYsIGJ5IGRlZmF1bHQgZ2xSZWFkUGl4ZWxzIHNob3VsZCBz
ZXQgdGhlIGFscGhhIHRvIDI1NSBpbnN0ZWFkIG9mIDAuCi0gICAgICAgIC8vIFRoaXMgaXMgYSBo
YWNrIHVudGlsIGdsUmVhZFBpeGVscyBmaXhlcyBpdHMgYmVoYXZpb3IuCi0gICAgICAgIC8vIFBp
eGVscyBhcmUgc3RvcmVkIGluIFdlYkdMVW5zaWduZWRCeXRlQXJyYXksIHdoaWNoIGlzIHVuc2ln
bmVkIGNoYXIgYXJyYXkuCi0gICAgICAgIHVuc2lnbmVkIGNoYXIqIGRhdGEgPSByZWludGVycHJl
dF9jYXN0PHVuc2lnbmVkIGNoYXIqPihwaXhlbHMpOwotICAgICAgICAvLyBGSVhNRTogdGFrZSBp
bnRvIGFjY291bnQgcGFjayBhbGlnbm1lbnQuCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZUxl
bmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNCAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLSAgICAg
ICAgZm9yICh1bnNpZ25lZCBsb25nIGkgPSAzOyBpIDwgYnl0ZUxlbmd0aDsgaSArPSA0KQotICAg
ICAgICAgICAgZGF0YVtpXSA9IDI1NTsKLSAgICB9Ci0jZW5kaWYKICNpZm5kZWYgUkVOREVSX1RP
X0RFQlVHR0lOR19XSU5ET1cKICAgICBpZiAobV9hdHRyaWJ1dGVzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCiAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1NzI0
OSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEz
IEBACisyMDEwLTA0LTA3ICBaaGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgcmVhZFBpeGVscyBtdXN0IHRh
a2UgUEFDS19BTElHTk1FTlQgaW50byBhY2NvdW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDcxOAorCisgICAgICAgICogZmFzdC9jYW52YXMvd2Vi
Z2wvcmVhZC1waXhlbHMtZXhwZWN0ZWQudHh0OiBWZXJpZnkgcGl4ZWxTdG9yZWkgYW5kIHJlYWRQ
aXhlbHMuCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMuaHRtbDogRGl0
dG8uCisKIDIwMTAtMDQtMDcgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZh
cy93ZWJnbC9yZWFkLXBpeGVscy1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAw
KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMtZXhwZWN0ZWQu
dHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU2IEBACitWZXJpZnkgcmVhZFBpeGVscygpIHdv
cmtzIGZpbmUgd2l0aCB2YXJpb3VzIFBBQ0tfQUxJR05NRU5UIHZhbHVlcy4KKworT24gc3VjY2Vz
cywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkg
IlRFU1QgQ09NUExFVEUiLgorCitQQVNTIGdsID0gaW5pdFdlYkdMKCdleGFtcGxlJywgJ3ZzaGFk
ZXInLCAnZnNoYWRlcicsIFsgJ3BvcycsICdjb2xvckluJyBdLCBbIDAsIDAsIDAsIDEgXSwgMSkg
aXMgbm9uLW51bGwuCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gMSwgd2lkdGggPSAxLCBoZWln
aHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMg
WyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSAyLCB3aWR0aCA9
IDEsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBw
aXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQs
IHdpZHRoID0gMSwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXpl
CitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05N
RU5UID0gOCwgd2lkdGggPSAxLCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBl
Y3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFD
S19BTElHTk1FTlQgPSA0LCB3aWR0aCA9IDIsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3Ro
IGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVz
dGluZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gMiwgaGVpZ2h0ID0gMgorUEFTUyBhcnJh
eS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAy
NTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gNCwgd2lkdGggPSAzLCBoZWlnaHQgPSAyCitQ
QVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAy
LCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9IDMsIGhlaWdo
dCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBb
IDUxLCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQsIHdpZHRoID0g
NCwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBp
eGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwg
d2lkdGggPSA0LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUK
K1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1F
TlQgPSA4LCB3aWR0aCA9IDUsIGhlaWdodCA9IDEKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVj
dGVkU2l6ZQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQsIHdpZHRoID0gNSwgaGVpZ2h0ID0g
MgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgNTEs
IDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGggPSA1LCBo
ZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwg
aXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0
aCA9IDYsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFT
UyBwaXhlbCBpcyBbIDUxLCAxMDIsIDIwNCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9
IDgsIHdpZHRoID0gNywgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRT
aXplCitQQVNTIHBpeGVsIGlzIFsgNTEsIDEwMiwgMjA0LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJ
R05NRU5UID0gOCwgd2lkdGggPSA4LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBl
eHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyA1MSwgMTAyLCAyMDQsIDI1NV0KK1BBU1Mgc3Vj
Y2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRU
ZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy5odG1sCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3JlYWQtcGl4ZWxzLmh0bWwJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy5odG1sCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDExMiBAQAorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5
bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIi8+Cis8
c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4K
KzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2ViZ2wtdGVzdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0
IHNyYz0icmVzb3VyY2VzL3V0aWxzM2QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBpZD0idnNoYWRl
ciIgdHlwZT0ieC1zaGFkZXIveC12ZXJ0ZXgiPgorYXR0cmlidXRlIHZlYzMgcG9zOworYXR0cmli
dXRlIHZlYzQgY29sb3JJbjsKK3ZhcnlpbmcgdmVjNCBjb2xvcjsKKwordm9pZCBtYWluKCkKK3sK
KyAgICBjb2xvciA9IGNvbG9ySW47CisgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54eXosIDEu
MCk7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0iZnNoYWRlciIgdHlwZT0ieC1zaGFkZXIv
eC1mcmFnbWVudCI+Cit2YXJ5aW5nIHZlYzQgY29sb3I7CisKK3ZvaWQgbWFpbigpCit7CisgICAg
Z2xfRnJhZ0NvbG9yID0gY29sb3I7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlwdD4KK3ZhciBzdWNj
ZXNzZnVsbHlQYXJzZWQgPSBmYWxzZTsKKworLy8gVGhlc2UgZm91ciBkZWNsYXJhdGlvbnMgbmVl
ZCB0byBiZSBnbG9iYWwgZm9yICJzaG91bGRCZSIgdG8gc2VlIHRoZW0KK3ZhciBnbCA9IG51bGw7
Cit2YXIgYXJyYXkgPSBudWxsOwordmFyIGV4cGVjdGVkU2l6ZSA9IDA7Cit2YXIgcGl4ZWwgPSBb
IDAsIDAsIDAsIDEgXTsKKworZnVuY3Rpb24gaW5pdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlv
dXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5vdmVycmlk
ZVByZWZlcmVuY2UoIldlYktpdFdlYkdMRW5hYmxlZCIsICIxIik7CisgICAgICAgIGxheW91dFRl
c3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIu
d2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIGRlc2NyaXB0aW9uKCdWZXJpZnkgcmVhZFBp
eGVscygpIHdvcmtzIGZpbmUgd2l0aCB2YXJpb3VzIFBBQ0tfQUxJR05NRU5UIHZhbHVlcy4nKTsK
KworICAgIHJ1blRlc3QoKTsKK30KKworZnVuY3Rpb24gcnVuVGVzdEl0ZXJhdGlvbihwYWNrQWxp
Z25tZW50LCB3aWR0aCwgaGVpZ2h0LCBzaXplKQoreworICAgIGRlYnVnKCJUZXN0aW5nIFBBQ0tf
QUxJR05NRU5UID0gIiArIHBhY2tBbGlnbm1lbnQgKyAiLCB3aWR0aCA9ICIgKyB3aWR0aCArICIs
IGhlaWdodCA9ICIgKyBoZWlnaHQpOworICAgIGdsLmNsZWFyQ29sb3IoMC4yLCAwLjQsIDAuOCwg
MSk7CisgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2wucGl4ZWxTdG9y
ZWkoZ2wuUEFDS19BTElHTk1FTlQsIHBhY2tBbGlnbm1lbnQpOworICAgIGFycmF5ID0gZ2wucmVh
ZFBpeGVscygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFKTsK
KyAgICBleHBlY3RlZFNpemUgPSBzaXplOworICAgIHNob3VsZEJlKCJhcnJheS5sZW5ndGgiLCAi
ZXhwZWN0ZWRTaXplIik7CisgICAgLy8gQ2hlY2sgdGhlIGZpcnN0IHBpeGVsIG9mIHRoZSBzZWNv
bmQgcm93LgorICAgIGlmIChoZWlnaHQgPiAxKSB7CisgICAgICAgIHZhciBwYWRkaW5nID0gKHNp
emUgLSB3aWR0aCAqIGhlaWdodCAqIDQpIC8gKGhlaWdodCAtIDEpOworICAgICAgICB2YXIgYnl0
ZXNQZXJSb3cgPSB3aWR0aCAqIDQgKyBwYWRkaW5nOworICAgICAgICBwaXhlbFswXSA9IGFycmF5
W2J5dGVzUGVyUm93XTsKKyAgICAgICAgcGl4ZWxbMV0gPSBhcnJheVtieXRlc1BlclJvdyArIDFd
OworICAgICAgICBwaXhlbFsyXSA9IGFycmF5W2J5dGVzUGVyUm93ICsgMl07CisgICAgICAgIHBp
eGVsWzNdID0gYXJyYXlbYnl0ZXNQZXJSb3cgKyAzXTsKKyAgICAgICAgc2hvdWxkQmUoInBpeGVs
IiwgIlsgNTEsIDEwMiwgMjA0LCAyNTVdIik7CisgICAgfQorfQorCitmdW5jdGlvbiBydW5UZXN0
KCkKK3sKKyAgICBzaG91bGRCZU5vbk51bGwoImdsID0gaW5pdFdlYkdMKCdleGFtcGxlJywgJ3Zz
aGFkZXInLCAnZnNoYWRlcicsIFsgJ3BvcycsICdjb2xvckluJyBdLCBbIDAsIDAsIDAsIDEgXSwg
MSkiKTsKKyAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTsKKworICAgIHJ1blRlc3RJdGVyYXRpb24o
MSwgMSwgMiwgOCk7CisgICAgcnVuVGVzdEl0ZXJhdGlvbigyLCAxLCAyLCA4KTsKKyAgICBydW5U
ZXN0SXRlcmF0aW9uKDQsIDEsIDIsIDgpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgMSwgMiwg
MTIpOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgMiwgMiwgMTYpOworICAgIHJ1blRlc3RJdGVy
YXRpb24oOCwgMiwgMiwgMTYpOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgMywgMiwgMjQpOwor
ICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgMywgMiwgMjgpOworICAgIHJ1blRlc3RJdGVyYXRpb24o
NCwgNCwgMiwgMzIpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNCwgMiwgMzIpOworICAgIHJ1
blRlc3RJdGVyYXRpb24oOCwgNSwgMSwgMjApOworICAgIHJ1blRlc3RJdGVyYXRpb24oNCwgNSwg
MiwgNDApOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNSwgMiwgNDQpOworICAgIHJ1blRlc3RJ
dGVyYXRpb24oOCwgNiwgMiwgNDgpOworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgNywgMiwgNjAp
OworICAgIHJ1blRlc3RJdGVyYXRpb24oOCwgOCwgMiwgNjQpOworCisgICAgc3VjY2Vzc2Z1bGx5
UGFyc2VkID0gdHJ1ZTsKKyAgICB2YXIgZXBpbG9ndWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJzY3JpcHQiKTsKKyAgICBlcGlsb2d1ZS5vbmxvYWQgPSBmaW5pc2g7CisgICAgZXBpbG9ndWUu
c3JjID0gIi4uLy4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiOworICAgIGRvY3VtZW50
LmJvZHkuYXBwZW5kQ2hpbGQoZXBpbG9ndWUpOworfQorCitmdW5jdGlvbiBmaW5pc2goKSB7Cisg
ICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0
Q29udHJvbGxlci5ub3RpZnlEb25lKCk7CisgICAgfQorfQorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8
Ym9keSBvbmxvYWQ9ImluaXQoKSI+Cis8Y2FudmFzIGlkPSJleGFtcGxlIiB3aWR0aD0iMzJweCIg
aGVpZ2h0PSIzMnB4Ij48L2NhbnZhcz4KKzxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKzxk
aXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52905</attachid>
            <date>2010-04-08 15:47:32 -0700</date>
            <delta_ts>2010-04-14 03:23:59 -0700</delta_ts>
            <desc>revised patch: responding to Ken Russell&apos;s review</desc>
            <filename>pixels.patch</filename>
            <type>text/plain</type>
            <size>24777</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICByZWFkUGl4
ZWxzIG11c3QgdGFrZSBQQUNLX0FMSUdOTUVOVCBpbnRvIGFjY291bnQKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0NzE4CisKKyAgICAgICAgVGVzdDog
ZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMuaHRtbAorCisgICAgICAgICogaHRtbC9jYW52
YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVu
ZGVyaW5nQ29udGV4dDo6V2ViR0xSZW5kZXJpbmdDb250ZXh0KTogSW5pdCBtZW1iZXJzIHRvIHN1
cHBvcnQgcGFja19hbGlnbm1lbnQuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0Nv
bnRleHQ6OnBpeGVsU3RvcmVpKTogU2F2ZSBwYWNrL3VucGFja19hbGlnbm1lbnQuCisgICAgICAg
IChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMpOiBWYWxpZGF0ZSBl
bnVtIGFuZCBkZWFsIHdpdGggcGFja19hbGlnbm1lbnQuCisgICAgICAgICogaHRtbC9jYW52YXMv
V2ViR0xSZW5kZXJpbmdDb250ZXh0Lmg6IEFkZCBtZW1iZXJzIHRvIHN1cHBvcnQgcGFja19hbGln
bm1lbnQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaDog
UmVmYWN0b3IgcmVhZFBpeGVscy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3Jh
cGhpY3NDb250ZXh0M0RNYWMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnJlYWRQaXhlbHMpOiBNb3ZlIGFycmF5IGFsbG9jYXRpb24gYW5kIGFscGhhIGZpeCB0byBX
ZWJHTFJlbmRlcmluZ0NvbnRleHQ7IGZsdXNoIGJlZm9yZSByZWFkIHBpeGVscy4KKwogMjAxMC0w
NC0wNyAgRHVtaXRydSBEYW5pbGl1YyAgPGR1bWlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEplcmVteSBPcmxvdy4KSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xS
ZW5kZXJpbmdDb250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dl
YkdMUmVuZGVyaW5nQ29udGV4dC5jcHAJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9odG1s
L2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2
ICszOCw3IEBACiAjaW5jbHVkZSAiUmVuZGVyQm94LmgiCiAjaW5jbHVkZSAiUmVuZGVyTGF5ZXIu
aCIKICNpbmNsdWRlICJXZWJHTEFjdGl2ZUluZm8uaCIKKyNpbmNsdWRlICJXZWJHTFVuc2lnbmVk
U2hvcnRBcnJheS5oIgogI2luY2x1ZGUgIldlYkdMQnVmZmVyLmgiCiAjaW5jbHVkZSAiV2ViR0xD
b250ZXh0QXR0cmlidXRlcy5oIgogI2luY2x1ZGUgIldlYkdMRnJhbWVidWZmZXIuaCIKQEAgLTg1
LDExICs4NiwyMSBAQCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OldlYkdMUmVuZGVyaW5nQ29uCiAg
ICAgLCBtX25lZWRzVXBkYXRlKHRydWUpCiAgICAgLCBtX21hcmtlZENhbnZhc0RpcnR5KGZhbHNl
KQogICAgICwgbV9hY3RpdmVUZXh0dXJlVW5pdCgwKQorICAgICwgbV9wYWNrQWxpZ25tZW50KDQp
CisgICAgLCBtX3VucGFja0FsaWdubWVudCg0KQogewogICAgIEFTU0VSVChtX2NvbnRleHQpOwog
ICAgIGludCBudW1WZXJ0ZXhBdHRyaWJzID0gMDsKICAgICBtX2NvbnRleHQtPmdldEludGVnZXJ2
KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX0FUVFJJQlMsICZudW1WZXJ0ZXhBdHRyaWJz
KTsKICAgICBtX21heFZlcnRleEF0dHJpYnMgPSBudW1WZXJ0ZXhBdHRyaWJzOworICAgIGludCBp
bXBsZW1lbnRhdGlvbkNvbG9yUmVhZEZvcm1hdCA9IEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBOwor
ICAgIG1fY29udGV4dC0+Z2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6OklNUExFTUVOVEFU
SU9OX0NPTE9SX1JFQURfRk9STUFULCAmaW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQpOwor
ICAgIG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQgPSBpbXBsZW1lbnRhdGlvbkNvbG9y
UmVhZEZvcm1hdDsKKyAgICBpbnQgaW1wbGVtZW50YXRpb25Db2xvclJlYWRUeXBlID0gR3JhcGhp
Y3NDb250ZXh0M0Q6OlVOU0lHTkVEX0JZVEU7CisgICAgbV9jb250ZXh0LT5nZXRJbnRlZ2VydihH
cmFwaGljc0NvbnRleHQzRDo6SU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFLCAmaW1wbGVt
ZW50YXRpb25Db2xvclJlYWRUeXBlKTsKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSBnZXRFcnJv
cigpIHdoZW4gSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQvVFlQRSBhcmUgc3VwcG9y
dGVkLgorICAgIG1fY29udGV4dC0+Z2V0RXJyb3IoKTsKKyAgICBtX2ltcGxlbWVudGF0aW9uQ29s
b3JSZWFkVHlwZSA9IGltcGxlbWVudGF0aW9uQ29sb3JSZWFkVHlwZTsKICAgICBtX2NvbnRleHQt
PnJlc2hhcGUoY2FudmFzKCktPndpZHRoKCksIGNhbnZhcygpLT5oZWlnaHQoKSk7CiAgICAgbV9j
b250ZXh0LT52aWV3cG9ydCgwLCAwLCBjYW52YXMoKS0+d2lkdGgoKSwgY2FudmFzKCktPmhlaWdo
dCgpKTsKIH0KQEAgLTE1NzQsNiArMTU4NSwxNiBAQCB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4
dDo6bGlua1Byb2dyYW0oCiB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6cGl4ZWxTdG9yZWko
dW5zaWduZWQgbG9uZyBwbmFtZSwgbG9uZyBwYXJhbSkKIHsKICAgICBtX2NvbnRleHQtPnBpeGVs
U3RvcmVpKHBuYW1lLCBwYXJhbSk7CisgICAgaWYgKHBhcmFtID09IDEgfHwgcGFyYW0gPT0gMiB8
fCBwYXJhbSA9PSA0IHx8IHBhcmFtID09IDgpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgewor
ICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpQQUNLX0FMSUdOTUVOVDoKKyAgICAgICAg
ICAgIG1fcGFja0FsaWdubWVudCA9IHN0YXRpY19jYXN0PGludD4ocGFyYW0pOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OlVOUEFDS19BTElHTk1F
TlQ6CisgICAgICAgICAgICBtX3VucGFja0FsaWdubWVudCA9IHN0YXRpY19jYXN0PGludD4ocGFy
YW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAgICAgY2xlYW51cEFm
dGVyR3JhcGhpY3NDYWxsKGZhbHNlKTsKIH0KIApAQCAtMTU4NSw3ICsxNjA2LDc2IEBAIHZvaWQg
V2ViR0xSZW5kZXJpbmdDb250ZXh0Ojpwb2x5Z29uT2Zmc2UKIAogUGFzc1JlZlB0cjxXZWJHTEFy
cmF5PiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVu
c2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZv
cm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKQogewotICAgIFJlZlB0cjxXZWJHTEFycmF5PiBhcnJh
eSA9IG1fY29udGV4dC0+cmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5
cGUpOworICAgIC8vIFZhbGlkYXRlIGVudW1zLgorICAgIHVuc2lnbmVkIGxvbmcgY29tcG9uZW50
c1BlclBpeGVsID0gMDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR3JhcGhpY3ND
b250ZXh0M0Q6OkFMUEhBOgorICAgICAgICBjb21wb25lbnRzUGVyUGl4ZWwgPSAxOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpSR0I6CisgICAgICAgIGNvbXBv
bmVudHNQZXJQaXhlbCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR3JhcGhpY3NDb250
ZXh0M0Q6OlJHQkE6CisgICAgICAgIGNvbXBvbmVudHNQZXJQaXhlbCA9IDQ7CisgICAgICAgIGJy
ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3Io
R3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybiAwOworICAg
IH0KKyAgICB1bnNpZ25lZCBsb25nIGJ5dGVzUGVyQ29tcG9uZW50ID0gMDsKKyAgICBzd2l0Y2gg
KHR5cGUpIHsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFOgorICAg
ICAgICBieXRlc1BlckNvbXBvbmVudCA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlRfNV82XzU6
CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlRfNF80XzRfNDoKKyAg
ICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9TSE9SVF81XzVfNV8xOgorICAgICAg
ICBjb21wb25lbnRzUGVyUGl4ZWwgPSAxOworICAgICAgICBieXRlc1BlckNvbXBvbmVudCA9IHNp
emVvZih1bnNpZ25lZCBzaG9ydCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAg
ICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFM
SURfRU5VTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIShmb3JtYXQgPT0g
R3JhcGhpY3NDb250ZXh0M0Q6OlJHQkEgJiYgdHlwZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6VU5T
SUdORURfQllURSB8fCBmb3JtYXQgPT0gbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZEZvcm1hdCAm
JiB0eXBlID09IG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQpKSB7CisgICAgICAgIG1f
Y29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfT1BF
UkFUSU9OKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIENhbGN1bGF0ZSBhcnJh
eSBzaXplLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIG9mIFBBQ0tfQUxJR05NRU5ULgorICAg
IHVuc2lnbmVkIGxvbmcgYnl0ZXNQZXJSb3cgPSBjb21wb25lbnRzUGVyUGl4ZWwgKiBieXRlc1Bl
ckNvbXBvbmVudCAqIHdpZHRoOworICAgIHVuc2lnbmVkIGxvbmcgcGFkZGluZyA9IDA7CisgICAg
dW5zaWduZWQgbG9uZyByZXNpZHVhbEJ5dGVzID0gYnl0ZXNQZXJSb3cgJSBtX3BhY2tBbGlnbm1l
bnQ7CisgICAgaWYgKHJlc2lkdWFsQnl0ZXMpIHsKKyAgICAgICAgcGFkZGluZyA9IG1fcGFja0Fs
aWdubWVudCAtIHJlc2lkdWFsQnl0ZXM7CisgICAgICAgIGJ5dGVzUGVyUm93ICs9IHBhZGRpbmc7
CisgICAgfQorICAgIC8vIFRoZSBsYXN0IHJvdyBuZWVkcyBubyBwYWRkaW5nLgorICAgIHVuc2ln
bmVkIGxvbmcgdG90YWxCeXRlcyA9IGJ5dGVzUGVyUm93ICogaGVpZ2h0IC0gcGFkZGluZzsKKyAg
ICB1bnNpZ25lZCBsb25nIG51bSA9IHRvdGFsQnl0ZXMgLyBieXRlc1BlckNvbXBvbmVudDsKKyAg
ICBSZWZQdHI8V2ViR0xBcnJheT4gYXJyYXk7CisgICAgaWYgKHR5cGUgPT0gR3JhcGhpY3NDb250
ZXh0M0Q6OlVOU0lHTkVEX0JZVEUpCisgICAgICAgIGFycmF5ID0gV2ViR0xVbnNpZ25lZEJ5dGVB
cnJheTo6Y3JlYXRlKG51bSk7CisgICAgZWxzZQorICAgICAgICBhcnJheSA9IFdlYkdMVW5zaWdu
ZWRTaG9ydEFycmF5OjpjcmVhdGUobnVtKTsKKyAgICB2b2lkKiBkYXRhID0gYXJyYXktPmJhc2VB
ZGRyZXNzKCk7CisgICAgbV9jb250ZXh0LT5yZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQs
IGZvcm1hdCwgdHlwZSwgZGF0YSk7CisjaWYgUExBVEZPUk0oQ0cpCisgICAgLy8gRklYTUU6IHJl
bW92ZSB0aGlzIHNlY3Rpb24gd2hlbiBHTCBkcml2ZXIgYnVnIG9uIE1hYyBpcyBmaXhlZCwgaS5l
LiwKKyAgICAvLyB3aGVuIGFscGhhIGlzIG9mZiwgcmVhZFBpeGVscyBzaG91bGQgc2V0IGFscGhh
IHRvIDI1NSBpbnN0ZWFkIG9mIDAuCisgICAgaWYgKChmb3JtYXQgPT0gR3JhcGhpY3NDb250ZXh0
M0Q6OkFMUEhBIHx8IGZvcm1hdCA9PSBHcmFwaGljc0NvbnRleHQzRDo6UkdCQSkgJiYgIW1fY29u
dGV4dC0+Z2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSkgeworICAgICAgICBpZiAodHlwZSA9
PSBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfQllURSkgeworICAgICAgICAgICAgdW5zaWdu
ZWQgY2hhciogcGl4ZWxzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YSk7
CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGxvbmcgaXkgPSAwOyBpeSA8IGhlaWdodDsgKytp
eSkgeworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgbG9uZyBpeCA9IDA7IGl4IDwgd2lk
dGg7ICsraXgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2NvbXBvbmVudHNQZXJQaXhl
bCAtIDFdID0gMjU1OworICAgICAgICAgICAgICAgICAgICBwaXhlbHMgKz0gY29tcG9uZW50c1Bl
clBpeGVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbHMgKz0gcGFk
ZGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogY2hlY2sg
d2hldGhlciB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIHdpdGggVU5TSUdORURfU0hPUlQuCisgICAg
fQorI2VuZGlmCiAgICAgY2xlYW51cEFmdGVyR3JhcGhpY3NDYWxsKGZhbHNlKTsKICAgICByZXR1
cm4gYXJyYXk7CiB9CkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29u
dGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdD
b250ZXh0LmgJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJl
bmRlcmluZ0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMzQyLDYgKzM0MiwxMSBAQCBjbGFz
cyBXZWJLaXRDU1NNYXRyaXg7CiAgICAgICAgIFRleHR1cmVVbml0U3RhdGUgbV90ZXh0dXJlVW5p
dHNbMzJdOwogICAgICAgICB1bnNpZ25lZCBsb25nIG1fYWN0aXZlVGV4dHVyZVVuaXQ7CiAKKyAg
ICAgICAgaW50IG1fcGFja0FsaWdubWVudDsKKyAgICAgICAgaW50IG1fdW5wYWNrQWxpZ25tZW50
OworICAgICAgICB1bnNpZ25lZCBsb25nIG1faW1wbGVtZW50YXRpb25Db2xvclJlYWRGb3JtYXQ7
CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbV9pbXBsZW1lbnRhdGlvbkNvbG9yUmVhZFR5cGU7CisK
ICAgICAgICAgLy8gSGVscGVycyBmb3IgZ2V0UGFyYW1ldGVyIGFuZCBvdGhlcnMKICAgICAgICAg
V2ViR0xHZXRJbmZvIGdldEJvb2xlYW5QYXJhbWV0ZXIodW5zaWduZWQgbG9uZyBwbmFtZSk7CiAg
ICAgICAgIFdlYkdMR2V0SW5mbyBnZXRGbG9hdFBhcmFtZXRlcih1bnNpZ25lZCBsb25nIHBuYW1l
KTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNE
LmgJKHJldmlzaW9uIDU3MjQwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGlj
c0NvbnRleHQzRC5oCSh3b3JraW5nIGNvcHkpCkBAIC01OTIsNyArNTkyLDcgQEAgbmFtZXNwYWNl
IFdlYkNvcmUgewogICAgICAgICB2b2lkIHBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUs
IGxvbmcgcGFyYW0pOwogICAgICAgICB2b2lkIHBvbHlnb25PZmZzZXQoZG91YmxlIGZhY3Rvciwg
ZG91YmxlIHVuaXRzKTsKICAgICAgICAgCi0gICAgICAgIFBhc3NSZWZQdHI8V2ViR0xBcnJheT4g
cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQg
bG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUpOwor
ICAgICAgICB2b2lkIHJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lk
dGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQg
bG9uZyB0eXBlLCB2b2lkKiBkYXRhKTsKICAgICAgICAgCiAgICAgICAgIHZvaWQgcmVsZWFzZVNo
YWRlckNvbXBpbGVyKCk7CiAgICAgICAgIHZvaWQgcmVuZGVyYnVmZmVyU3RvcmFnZSh1bnNpZ25l
ZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgbG9u
ZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLmNwcAkocmV2aXNp
b24gNTcyNDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRl
eHQzRE1hYy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4NSwzNiArNzg1LDIyIEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQoZG8KICAgICA6OmdsUG9seWdvbk9mZnNldChz
dGF0aWNfY2FzdDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7CiB9
CiAKLVBhc3NSZWZQdHI8V2ViR0xBcnJheT4gR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMo
bG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0
LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKQordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0
aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBs
b25nIHR5cGUsIHZvaWQqIGRhdGEpCiB7CisgICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGds
Rmx1c2ggY2FsbHMgd2hlbiB0aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKKyAgICAvLyBh
bGwgcHJldmlvdXMgcmVuZGVyaW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5n
IHBpeGVscy4KICAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgLy8g
RklYTUU6IEZvciBub3cgd2Ugb25seSBhY2NlcHQgR0xfVU5TSUdORURfQllURS9HTF9SR0JBLiBJ
biByZWFsaXR5IE9wZW5HTCBFUyAyLjAgYWNjZXB0cyB0aGF0IHBhaXIgYW5kIG9uZSBvdGhlcgot
ICAgIC8vIGFzIHNwZWNpZmllZCBieSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1B
VCBhbmQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFLiBCdXQgZm9yIG5vdyB3ZSB3
aWxsCi0gICAgLy8gbm90IGFjY2VwdCB0aG9zZS4KLSAgICAvLyBGSVhNRTogQWxzbywgd2Ugc2hv
dWxkIHRocm93IHdoZW4gYW4gdW5hY2NlcHRhYmxlIHZhbHVlIGlzIHBhc3NlZAotICAgIGlmICh0
eXBlICE9IEdMX1VOU0lHTkVEX0JZVEUgfHwgZm9ybWF0ICE9IEdMX1JHQkEpCi0gICAgICAgIHJl
dHVybiAwOwotICAgICAgICAKKyAgICA6OmdsRmx1c2goKTsKICAgICBpZiAobV9hdHRycy5hbnRp
YWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAgICAgIDo6Z2xC
aW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVG
Qk8pOwogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJf
RVhULCBtX2Zibyk7CiAgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdp
ZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JV
RkZFUl9CSVQsIEdMX0xJTkVBUik7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xGbHVzaCgpOwogICAgIH0KLSAg
ICBSZWZQdHI8V2ViR0xVbnNpZ25lZEJ5dGVBcnJheT4gYXJyYXkgPSBXZWJHTFVuc2lnbmVkQnl0
ZUFycmF5OjpjcmVhdGUod2lkdGggKiBoZWlnaHQgKiA0KTsKLSAgICA6OmdsUmVhZFBpeGVscyh4
LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIChHTHZvaWQqKSBhcnJheS0+ZGF0YSgp
KTsKKyAgICA6OmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUs
IGRhdGEpOwogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVs
dGlzYW1wbGVGQk8pCiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZG
RVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICBpZiAoIW1fYXR0cnMuYWxwaGEpIHsKLSAg
ICAgICAgLy8gSWYgYWxwaGEgaXMgb2ZmLCBieSBkZWZhdWx0IGdsUmVhZFBpeGVscyBzaG91bGQg
c2V0IHRoZSBhbHBoYSB0byAyNTUgaW5zdGVhZCBvZiAwLgotICAgICAgICAvLyBUaGlzIGlzIGEg
aGFjayB1bnRpbCA6OmdsUmVhZFBpeGVscyBmaXhlcyBpdHMgYmVoYXZpb3IuCi0gICAgICAgIEdM
dWJ5dGUqIGRhdGEgPSByZWludGVycHJldF9jYXN0PEdMdWJ5dGUqPihhcnJheS0+ZGF0YSgpKTsK
LSAgICAgICAgdW5zaWduZWQgYnl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3RoKCk7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDM7IGkgPCBieXRlTGVuZ3RoOyBpICs9IDQpCi0gICAgICAg
ICAgICBkYXRhW2ldID0gMjU1OwotICAgIH0KLSAgICByZXR1cm4gYXJyYXk7ICAgIAogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGlsZXIoKQpJbmRleDogV2Vi
S2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCShyZXZpc2lvbiA1NzI0OSkKKysrIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdv
cmtpbmcgY29weSkKQEAgLTEsMyArMSwxNSBAQAorMjAxMC0wNC0wNyAgWmhlbnlhbyBNbyAgPHpt
b0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIHJlYWRQaXhlbHMgbXVzdCB0YWtlIFBBQ0tfQUxJR05NRU5UIGludG8gYWNjb3VudAor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3MTgKKwor
ICAgICAgICAqIHNyYy9HcmFwaGljc0NvbnRleHQzRC5jcHA6IFJlZmFjdG9yIHJlYWRQaXhlbHMu
CisgICAgICAgICogc3JjL1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGwuY3BwOgorICAg
ICAgICAoV2ViS2l0OjpXZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsOjpyZWFkQmFja0Zy
YW1lYnVmZmVyKTogVGVtcG9yYXJpbHkgZGlzYWJsZSBwYWNrIGFsaWdubWVudCBmb3IgZ2xSZWFk
UGl4ZWxzLgorICAgICAgICAoV2ViS2l0OjpXZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBs
OjpyZWFkUGl4ZWxzKTogTW92ZSBhcnJheSBhbGxvY2F0aW9uIGFuZCBhbHBoYSBmaXggdG8gV2Vi
R0xSZW5kZXJpbmdDb250ZXh0OyBmbHVzaCBiZWZvcmUgcmVhZCBwaXhlbHMuCisKIDIwMTAtMDQt
MDcgIFBhdmVsIEZlbGRtYW4gIDxwZmVsZG1hbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgWXVyeSBTZW1pa2hhdHNreS4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvR3Jh
cGhpY3NDb250ZXh0M0QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvR3Jh
cGhpY3NDb250ZXh0M0QuY3BwCShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYktpdC9jaHJvbWl1bS9z
cmMvR3JhcGhpY3NDb250ZXh0M0QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTgsNyArMjE4LDcg
QEAgcHVibGljOgogICAgIHZvaWQgcGl4ZWxTdG9yZWkodW5zaWduZWQgbG9uZyBwbmFtZSwgbG9u
ZyBwYXJhbSk7CiAgICAgdm9pZCBwb2x5Z29uT2Zmc2V0KGRvdWJsZSBmYWN0b3IsIGRvdWJsZSB1
bml0cyk7CiAKLSAgICBQYXNzUmVmUHRyPFdlYkdMQXJyYXk+IHJlYWRQaXhlbHMobG9uZyB4LCBs
b25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25l
ZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlKTsKKyAgICB2b2lkIHJlYWRQaXhlbHMo
bG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0
LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlLCB2b2lkKiBkYXRhKTsK
IAogICAgIHZvaWQgcmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7CiAgICAgdm9pZCByZW5kZXJidWZm
ZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9y
bWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCk7CkBAIC01OTAs
NiArNTkwLDEyIEBAIHJ0IEdyYXBoaWNzQ29udGV4dDNESW50ZXJuYWw6Om5hbWUodDEgYTEKICAg
ICByZXR1cm4gbV9pbXBsLT5uYW1lKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOyAgICAgICBcCiB9
CiAKKyNkZWZpbmUgREVMRUdBVEVfVE9fSU1QTF83KG5hbWUsIHQxLCB0MiwgdDMsIHQ0LCB0NSwg
dDYsIHQ3KSBcCit2b2lkIEdyYXBoaWNzQ29udGV4dDNESW50ZXJuYWw6Om5hbWUodDEgYTEsIHQy
IGEyLCB0MyBhMywgdDQgYTQsIHQ1IGE1LCB0NiBhNiwgdDcgYTcpIFwKK3sgXAorICAgIG1faW1w
bC0+bmFtZShhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7ICAgXAorfQorCiAjZGVmaW5lIERF
TEVHQVRFX1RPX0lNUExfN1IobmFtZSwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHJ0KSBc
CiBydCBHcmFwaGljc0NvbnRleHQzREludGVybmFsOjpuYW1lKHQxIGExLCB0MiBhMiwgdDMgYTMs
IHQ0IGE0LCB0NSBhNSwgdDYgYTYsIHQ3IGE3KSBcCiB7IFwKQEAgLTgwNCwxNSArODEwLDcgQEAg
REVMRUdBVEVfVE9fSU1QTF8xKGxpbmVXaWR0aCwgZG91YmxlKQogREVMRUdBVEVfVE9fSU1QTF8x
X1gobGlua1Byb2dyYW0sIFdlYkdMUHJvZ3JhbSopCiBERUxFR0FURV9UT19JTVBMXzIocGl4ZWxT
dG9yZWksIHVuc2lnbmVkIGxvbmcsIGxvbmcpCiBERUxFR0FURV9UT19JTVBMXzIocG9seWdvbk9m
ZnNldCwgZG91YmxlLCBkb3VibGUpCi0KLVBhc3NSZWZQdHI8V2ViR0xBcnJheT4gR3JhcGhpY3ND
b250ZXh0M0RJbnRlcm5hbDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9u
ZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNp
Z25lZCBsb25nIHR5cGUpCi17Ci0gICAgLy8gRklYTUU6IHRha2UgaW50byBhY2NvdW50IHBhY2sg
YWxpZ25tZW50LgotICAgIFJlZlB0cjxXZWJHTFVuc2lnbmVkQnl0ZUFycmF5PiBhcnJheSA9IFdl
YkdMVW5zaWduZWRCeXRlQXJyYXk6OmNyZWF0ZSh3aWR0aCAqIGhlaWdodCAqIDQpOwotICAgIG1f
aW1wbC0+cmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGFycmF5
LT5iYXNlQWRkcmVzcygpKTsKLSAgICByZXR1cm4gYXJyYXk7Ci19Ci0KK0RFTEVHQVRFX1RPX0lN
UExfNyhyZWFkUGl4ZWxzLCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25n
LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkKikKIERFTEVHQVRFX1RPX0lNUEwo
cmVsZWFzZVNoYWRlckNvbXBpbGVyKQogREVMRUdBVEVfVE9fSU1QTF80KHJlbmRlcmJ1ZmZlclN0
b3JhZ2UsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2ln
bmVkIGxvbmcpCiBERUxFR0FURV9UT19JTVBMXzIoc2FtcGxlQ292ZXJhZ2UsIGRvdWJsZSwgYm9v
bCkKQEAgLTEwMjYsNiArMTAyNCwxMiBAQCBydCBHcmFwaGljc0NvbnRleHQzRDo6bmFtZSh0MSBh
MSwgdDIgYTIsCiAgICAgcmV0dXJuIG1faW50ZXJuYWwtPm5hbWUoYTEsIGEyLCBhMywgYTQsIGE1
LCBhNik7ICAgICAgIFwKIH0KIAorI2RlZmluZSBERUxFR0FURV9UT19JTlRFUk5BTF83KG5hbWUs
IHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3KSBcCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpu
YW1lKHQxIGExLCB0MiBhMiwgdDMgYTMsIHQ0IGE0LCB0NSBhNSwgdDYgYTYsIHQ3IGE3KSBcCit7
IFwKKyAgICBtX2ludGVybmFsLT5uYW1lKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsgICBc
Cit9CisKICNkZWZpbmUgREVMRUdBVEVfVE9fSU5URVJOQUxfN1IobmFtZSwgdDEsIHQyLCB0Mywg
dDQsIHQ1LCB0NiwgdDcsIHJ0KSBcCiBydCBHcmFwaGljc0NvbnRleHQzRDo6bmFtZSh0MSBhMSwg
dDIgYTIsIHQzIGEzLCB0NCBhNCwgdDUgYTUsIHQ2IGE2LCB0NyBhNykgXAogeyBcCkBAIC0xMTgz
LDcgKzExODcsNyBAQCBERUxFR0FURV9UT19JTlRFUk5BTF8xKGxpbmtQcm9ncmFtLCBXZWJHCiBE
RUxFR0FURV9UT19JTlRFUk5BTF8yKHBpeGVsU3RvcmVpLCB1bnNpZ25lZCBsb25nLCBsb25nKQog
REVMRUdBVEVfVE9fSU5URVJOQUxfMihwb2x5Z29uT2Zmc2V0LCBkb3VibGUsIGRvdWJsZSkKIAot
REVMRUdBVEVfVE9fSU5URVJOQUxfNlIocmVhZFBpeGVscywgbG9uZywgbG9uZywgdW5zaWduZWQg
bG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgUGFzc1Jl
ZlB0cjxXZWJHTEFycmF5PikKK0RFTEVHQVRFX1RPX0lOVEVSTkFMXzcocmVhZFBpeGVscywgbG9u
ZywgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5z
aWduZWQgbG9uZywgdm9pZCopCiAKIERFTEVHQVRFX1RPX0lOVEVSTkFMKHJlbGVhc2VTaGFkZXJD
b21waWxlcikKIERFTEVHQVRFX1RPX0lOVEVSTkFMXzQocmVuZGVyYnVmZmVyU3RvcmFnZSwgdW5z
aWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykK
SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJHcmFwaGljc0NvbnRl
eHQzRERlZmF1bHRJbXBsLmNwcAkocmV2aXNpb24gNTcyNDApCisrKyBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC02NjEsNiArNjYxLDE1IEBAIGJvb2wgV2ViR3JhcGhpY3NDb250ZXh0M0REZWZhdWx0SW1wbDo6
cmUKICAgICAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOwogICAgICAgICB9CiAgICAgfQorCisgICAgR0xpbnQgcGFja0FsaWdubWVudCA9IDQ7
CisgICAgYm9vbCBtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSBmYWxzZTsKKyAgICBnbEdldElu
dGVnZXJ2KEdMX1BBQ0tfQUxJR05NRU5ULCAmcGFja0FsaWdubWVudCk7CisgICAgaWYgKHBhY2tB
bGlnbm1lbnQgPiA0KSB7CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQs
IDQpOworICAgICAgICBtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSB0cnVlOworICAgIH0KKwog
I2lmIFBMQVRGT1JNKFNLSUEpCiAgICAgZ2xSZWFkUGl4ZWxzKDAsIDAsIG1fY2FjaGVkV2lkdGgs
IG1fY2FjaGVkSGVpZ2h0LCBHTF9CR1JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOwogI2Vs
aWYgUExBVEZPUk0oQ0cpCkBAIC02NjksNiArNjc4LDkgQEAgYm9vbCBXZWJHcmFwaGljc0NvbnRl
eHQzRERlZmF1bHRJbXBsOjpyZQogI2Vycm9yIE11c3QgcG9ydCB0byB5b3VyIHBsYXRmb3JtCiAj
ZW5kaWYKIAorICAgIGlmIChtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQpCisgICAgICAgIGdsUGl4
ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIHBhY2tBbGlnbm1lbnQpOworCiAgICAgaWYgKG11
c3RSZXN0b3JlRkJPKQogICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZF
Ul9FWFQsIG1fYm91bmRGQk8pOwogCkBAIC0xMTE4LDI3ICsxMTMwLDE5IEBAIERFTEVHQVRFX1RP
X0dMXzIocG9seWdvbk9mZnNldCwgUG9seWdvbk8KIAogdm9pZCBXZWJHcmFwaGljc0NvbnRleHQz
RERlZmF1bHRJbXBsOjpyZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdp
ZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVk
IGxvbmcgdHlwZSwgdm9pZCogcGl4ZWxzKQogeworICAgIC8vIEZJWE1FOiByZW1vdmUgdGhlIHR3
byBnbEZsdXNoIGNhbGxzIHdoZW4gdGhlIGRyaXZlciBidWcgaXMgZml4ZWQsIGkuZS4sCisgICAg
Ly8gYWxsIHByZXZpb3VzIHJlbmRlcmluZyBjYWxscyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgcmVh
ZGluZyBwaXhlbHMuCisgICAgZ2xGbHVzaCgpOwogI2lmbmRlZiBSRU5ERVJfVE9fREVCVUdHSU5H
X1dJTkRPVwogICAgIGlmIChtX2F0dHJpYnV0ZXMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0g
bV9tdWx0aXNhbXBsZUZCTykgewogICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFE
X0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CiAgICAgICAgIGdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CiAgICAgICAgIGdsQmxp
dEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdp
ZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwogICAgICAg
ICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAg
ICAgZ2xGbHVzaCgpOwogICAgIH0KICNlbmRpZgogICAgIGdsUmVhZFBpeGVscyh4LCB5LCB3aWR0
aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci0jaWYgUExBVEZPUk0oQ0cpCi0gICAg
aWYgKCFtX2F0dHJpYnV0ZXMuYWxwaGEpIHsKLSAgICAgICAgLy8gSWYgYWxwaGEgaXMgb2ZmLCBi
eSBkZWZhdWx0IGdsUmVhZFBpeGVscyBzaG91bGQgc2V0IHRoZSBhbHBoYSB0byAyNTUgaW5zdGVh
ZCBvZiAwLgotICAgICAgICAvLyBUaGlzIGlzIGEgaGFjayB1bnRpbCBnbFJlYWRQaXhlbHMgZml4
ZXMgaXRzIGJlaGF2aW9yLgotICAgICAgICAvLyBQaXhlbHMgYXJlIHN0b3JlZCBpbiBXZWJHTFVu
c2lnbmVkQnl0ZUFycmF5LCB3aGljaCBpcyB1bnNpZ25lZCBjaGFyIGFycmF5LgotICAgICAgICB1
bnNpZ25lZCBjaGFyKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4ocGl4
ZWxzKTsKLSAgICAgICAgLy8gRklYTUU6IHRha2UgaW50byBhY2NvdW50IHBhY2sgYWxpZ25tZW50
LgotICAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIDQg
KiBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgbG9uZyBpID0g
MzsgaSA8IGJ5dGVMZW5ndGg7IGkgKz0gNCkKLSAgICAgICAgICAgIGRhdGFbaV0gPSAyNTU7Ci0g
ICAgfQotI2VuZGlmCiAjaWZuZGVmIFJFTkRFUl9UT19ERUJVR0dJTkdfV0lORE9XCiAgICAgaWYg
KG1fYXR0cmlidXRlcy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJP
KQogICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91
bmRGQk8pOwpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNTcyNDkpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxMC0wNC0wNyAgWmhlbnlhbyBN
byAgPHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIHJlYWRQaXhlbHMgbXVzdCB0YWtlIFBBQ0tfQUxJR05NRU5UIGludG8gYWNj
b3VudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ3
MTgKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL3JlYWQtcGl4ZWxzLWV4cGVjdGVkLnR4
dDogVmVyaWZ5IHBpeGVsU3RvcmVpIGFuZCByZWFkUGl4ZWxzLgorICAgICAgICAqIGZhc3QvY2Fu
dmFzL3dlYmdsL3JlYWQtcGl4ZWxzLmh0bWw6IERpdHRvLgorCiAyMDEwLTA0LTA3ICBFcmljIFNl
aWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIEJhcnRo
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVhZC1waXhlbHMtZXhwZWN0
ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3JlYWQt
cGl4ZWxzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2Fu
dmFzL3dlYmdsL3JlYWQtcGl4ZWxzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw1NyBAQAorVmVyaWZ5IHJlYWRQaXhlbHMoKSB3b3JrcyBmaW5lIHdpdGggdmFyaW91cyBQQUNL
X0FMSUdOTUVOVCB2YWx1ZXMuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBv
ZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworUEFTUyBn
bCA9IGluaXRXZWJHTCgnZXhhbXBsZScsICd2c2hhZGVyJywgJ2ZzaGFkZXInLCBbICdwb3MnLCAn
Y29sb3JJbicgXSwgWyAwLCAwLCAwLCAxIF0sIDEpIGlzIG5vbi1udWxsLgorVGVzdGluZyBQQUNL
X0FMSUdOTUVOVCA9IDEsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGgg
aXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgMjU1LCAyNTUsIDAsIDI1NV0KK1Rlc3Rp
bmcgUEFDS19BTElHTk1FTlQgPSAyLCB3aWR0aCA9IDEsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXku
bGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDI1NSwgMjU1LCAwLCAyNTVd
CitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gNCwgd2lkdGggPSAxLCBoZWlnaHQgPSAyCitQQVNT
IGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyAyNTUsIDI1NSwg
MCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gMSwgaGVpZ2h0ID0g
MgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgMjU1
LCAyNTUsIDAsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA0LCB3aWR0aCA9IDIsIGhl
aWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBp
cyBbIDI1NSwgMjU1LCAwLCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwgd2lkdGgg
PSAyLCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1Mg
cGl4ZWwgaXMgWyAyNTUsIDI1NSwgMCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDQs
IHdpZHRoID0gMywgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXpl
CitQQVNTIHBpeGVsIGlzIFsgMjU1LCAyNTUsIDAsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1F
TlQgPSA4LCB3aWR0aCA9IDMsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVj
dGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDI1NSwgMjU1LCAwLCAyNTVdCitUZXN0aW5nIFBBQ0tf
QUxJR05NRU5UID0gNCwgd2lkdGggPSA0LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBp
cyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyAyNTUsIDI1NSwgMCwgMjU1XQorVGVzdGlu
ZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gNCwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5s
ZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgMjU1LCAyNTUsIDAsIDI1NV0K
K1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9IDUsIGhlaWdodCA9IDEKK1BBU1Mg
YXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBwaXhlbCBpcyBbIDI1NSwgMjU1LCAw
LCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gNCwgd2lkdGggPSA1LCBoZWlnaHQgPSAy
CitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUKK1BBU1MgcGl4ZWwgaXMgWyAyNTUs
IDI1NSwgMCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVOVCA9IDgsIHdpZHRoID0gNSwgaGVp
Z2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0ZWRTaXplCitQQVNTIHBpeGVsIGlz
IFsgMjU1LCAyNTUsIDAsIDI1NV0KK1Rlc3RpbmcgUEFDS19BTElHTk1FTlQgPSA4LCB3aWR0aCA9
IDYsIGhlaWdodCA9IDIKK1BBU1MgYXJyYXkubGVuZ3RoIGlzIGV4cGVjdGVkU2l6ZQorUEFTUyBw
aXhlbCBpcyBbIDI1NSwgMjU1LCAwLCAyNTVdCitUZXN0aW5nIFBBQ0tfQUxJR05NRU5UID0gOCwg
d2lkdGggPSA3LCBoZWlnaHQgPSAyCitQQVNTIGFycmF5Lmxlbmd0aCBpcyBleHBlY3RlZFNpemUK
K1BBU1MgcGl4ZWwgaXMgWyAyNTUsIDI1NSwgMCwgMjU1XQorVGVzdGluZyBQQUNLX0FMSUdOTUVO
VCA9IDgsIHdpZHRoID0gOCwgaGVpZ2h0ID0gMgorUEFTUyBhcnJheS5sZW5ndGggaXMgZXhwZWN0
ZWRTaXplCitQQVNTIHBpeGVsIGlzIFsgMjU1LCAyNTUsIDAsIDI1NV0KK1BBU1Mgc3VjY2Vzc2Z1
bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9m
YXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2Zhc3QvY2FudmFzL3dlYmdsL3JlYWQtcGl4ZWxzLmh0bWwJKHJldmlzaW9uIDApCisrKyBM
YXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9yZWFkLXBpeGVscy5odG1sCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDExMyBAQAorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVl
dCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIi8+Cis8c2NyaXB0
IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3Jp
cHQgc3JjPSJyZXNvdXJjZXMvd2ViZ2wtdGVzdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0i
cmVzb3VyY2VzL3V0aWxzM2QuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBpZD0idnNoYWRlciIgdHlw
ZT0ieC1zaGFkZXIveC12ZXJ0ZXgiPgorYXR0cmlidXRlIHZlYzMgcG9zOworYXR0cmlidXRlIHZl
YzQgY29sb3JJbjsKK3ZhcnlpbmcgdmVjNCBjb2xvcjsKKwordm9pZCBtYWluKCkKK3sKKyAgICBj
b2xvciA9IGNvbG9ySW47CisgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54eXosIDEuMCk7Cit9
Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0iZnNoYWRlciIgdHlwZT0ieC1zaGFkZXIveC1mcmFn
bWVudCI+Cit2YXJ5aW5nIHZlYzQgY29sb3I7CisKK3ZvaWQgbWFpbigpCit7CisgICAgZ2xfRnJh
Z0NvbG9yID0gY29sb3I7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlwdD4KK3ZhciBzdWNjZXNzZnVs
bHlQYXJzZWQgPSBmYWxzZTsKKworLy8gVGhlc2UgZm91ciBkZWNsYXJhdGlvbnMgbmVlZCB0byBi
ZSBnbG9iYWwgZm9yICJzaG91bGRCZSIgdG8gc2VlIHRoZW0KK3ZhciBnbCA9IG51bGw7Cit2YXIg
YXJyYXkgPSBudWxsOwordmFyIGV4cGVjdGVkU2l6ZSA9IDA7Cit2YXIgcGl4ZWwgPSBbIDAsIDAs
IDAsIDEgXTsKKworZnVuY3Rpb24gaW5pdCgpCit7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0
Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZl
cmVuY2UoIldlYktpdFdlYkdMRW5hYmxlZCIsICIxIik7CisgICAgICAgIGxheW91dFRlc3RDb250
cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVu
dGlsRG9uZSgpOworICAgIH0KKworICAgIGRlc2NyaXB0aW9uKCdWZXJpZnkgcmVhZFBpeGVscygp
IHdvcmtzIGZpbmUgd2l0aCB2YXJpb3VzIFBBQ0tfQUxJR05NRU5UIHZhbHVlcy4nKTsKKworICAg
IHJ1blRlc3QoKTsKK30KKworZnVuY3Rpb24gcnVuVGVzdEl0ZXJhdGlvbihwYWNrQWxpZ25tZW50
LCB3aWR0aCwgaGVpZ2h0LCBzaXplKQoreworICAgIGRlYnVnKCJUZXN0aW5nIFBBQ0tfQUxJR05N
RU5UID0gIiArIHBhY2tBbGlnbm1lbnQgKyAiLCB3aWR0aCA9ICIgKyB3aWR0aCArICIsIGhlaWdo
dCA9ICIgKyBoZWlnaHQpOworICAgIGdsLmNsZWFyQ29sb3IoMSwgMSwgMCwgMSk7CisgICAgZ2wu
Y2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuUEFDS19B
TElHTk1FTlQsIHBhY2tBbGlnbm1lbnQpOworICAgIGFycmF5ID0gZ2wucmVhZFBpeGVscygwLCAw
LCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFKTsKKyAgICBleHBlY3Rl
ZFNpemUgPSBzaXplOworICAgIHNob3VsZEJlKCJhcnJheS5sZW5ndGgiLCAiZXhwZWN0ZWRTaXpl
Iik7CisgICAgLy8gQ2hlY2sgdGhlIGxhc3QgcGl4ZWwgb2YgdGhlIGxhc3Qgcm93LgorICAgIHZh
ciBwYWRkaW5nID0gMDsKKyAgICBpZiAoaGVpZ2h0ID4gMSkKKyAgICAgICAgcGFkZGluZyA9IChz
aXplIC0gd2lkdGggKiBoZWlnaHQgKiA0KSAvIChoZWlnaHQgLSAxKTsKKyAgICB2YXIgYnl0ZXNQ
ZXJSb3cgPSB3aWR0aCAqIDQgKyBwYWRkaW5nOworICAgIHZhciBwb3MgPSBieXRlc1BlclJvdyAq
IChoZWlnaHQgLSAxKSArICh3aWR0aCAtIDEpICogNDsKKyAgICBwaXhlbFswXSA9IGFycmF5W3Bv
c107CisgICAgcGl4ZWxbMV0gPSBhcnJheVtwb3MgKyAxXTsKKyAgICBwaXhlbFsyXSA9IGFycmF5
W3BvcyArIDJdOworICAgIHBpeGVsWzNdID0gYXJyYXlbcG9zICsgM107CisgICAgc2hvdWxkQmUo
InBpeGVsIiwgIlsgMjU1LCAyNTUsIDAsIDI1NV0iKTsKK30KKworZnVuY3Rpb24gcnVuVGVzdCgp
Cit7CisgICAgc2hvdWxkQmVOb25OdWxsKCJnbCA9IGluaXRXZWJHTCgnZXhhbXBsZScsICd2c2hh
ZGVyJywgJ2ZzaGFkZXInLCBbICdwb3MnLCAnY29sb3JJbicgXSwgWyAwLCAwLCAwLCAxIF0sIDEp
Iik7CisgICAgZ2wuZGlzYWJsZShnbC5CTEVORCk7CisKKyAgICBydW5UZXN0SXRlcmF0aW9uKDEs
IDEsIDIsIDgpOworICAgIHJ1blRlc3RJdGVyYXRpb24oMiwgMSwgMiwgOCk7CisgICAgcnVuVGVz
dEl0ZXJhdGlvbig0LCAxLCAyLCA4KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDgsIDEsIDIsIDEy
KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDQsIDIsIDIsIDE2KTsKKyAgICBydW5UZXN0SXRlcmF0
aW9uKDgsIDIsIDIsIDE2KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDQsIDMsIDIsIDI0KTsKKyAg
ICBydW5UZXN0SXRlcmF0aW9uKDgsIDMsIDIsIDI4KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDQs
IDQsIDIsIDMyKTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDgsIDQsIDIsIDMyKTsKKyAgICBydW5U
ZXN0SXRlcmF0aW9uKDgsIDUsIDEsIDIwKTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDQsIDUsIDIs
IDQwKTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDgsIDUsIDIsIDQ0KTsKKyAgICBydW5UZXN0SXRl
cmF0aW9uKDgsIDYsIDIsIDQ4KTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKDgsIDcsIDIsIDYwKTsK
KyAgICBydW5UZXN0SXRlcmF0aW9uKDgsIDgsIDIsIDY0KTsKKworICAgIHN1Y2Nlc3NmdWxseVBh
cnNlZCA9IHRydWU7CisgICAgdmFyIGVwaWxvZ3VlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi
c2NyaXB0Iik7CisgICAgZXBpbG9ndWUub25sb2FkID0gZmluaXNoOworICAgIGVwaWxvZ3VlLnNy
YyA9ICIuLi8uLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIjsKKyAgICBkb2N1bWVudC5i
b2R5LmFwcGVuZENoaWxkKGVwaWxvZ3VlKTsKK30KKworZnVuY3Rpb24gZmluaXNoKCkgeworICAg
IGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENv
bnRyb2xsZXIubm90aWZ5RG9uZSgpOworICAgIH0KK30KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJv
ZHkgb25sb2FkPSJpbml0KCkiPgorPGNhbnZhcyBpZD0iZXhhbXBsZSIgd2lkdGg9IjMycHgiIGhl
aWdodD0iMzJweCI+PC9jYW52YXM+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+PC9kaXY+Cis8ZGl2
IGlkPSJjb25zb2xlIj48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>