<?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>30960</bug_id>
          
          <creation_ts>2009-10-30 12:26:31 -0700</creation_ts>
          <short_desc>[CAIRO] shadow support for Canvas and SVG</short_desc>
          <delta_ts>2009-11-13 23:12:45 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>525.x (Safari 3.1)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>26102</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Schulze">krit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>gustavo</cc>
    
    <cc>otte</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>159401</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-10-30 12:26:31 -0700</bug_when>
    <thetext>Cairo needs shadow support for Canvas and SVG.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159408</commentid>
    <comment_count>1</comment_count>
      <attachid>42227</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-10-30 12:56:02 -0700</bug_when>
    <thetext>Created attachment 42227
shadow support for Cairo

Canvas/SVG shadow support for Cairo</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159523</commentid>
    <comment_count>2</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-10-30 16:54:10 -0700</bug_when>
    <thetext>You will need to add the new GraphicContextFilter.cpp to the Visual Studio (and probably Xcode) projects.  I can help you with this, perhaps as a second patch, since messing with these project files is historically hard to do as a landable patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159543</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-10-31 00:28:49 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; You will need to add the new GraphicContextFilter.cpp to the Visual Studio (and
&gt; probably Xcode) projects.  I can help you with this, perhaps as a second patch,
&gt; since messing with these project files is historically hard to do as a landable
&gt; patch.

It would ne neccessary for WinCairo, yes. This can be a follow-up.
XCode and the other build systems don&apos;t need GraphicContextFilter.cpp yet, since it is just used to add shadows on Cairo at the moment (but can be added and may be usefull for CSS filters in the future).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159581</commentid>
    <comment_count>4</comment_count>
      <attachid>42260</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-10-31 14:35:44 -0700</bug_when>
    <thetext>Created attachment 42260
add GCFilter to the win build system

This should add GraphicsContextFilter to the windows build system.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>161231</commentid>
    <comment_count>5</comment_count>
      <attachid>42227</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-11-06 13:04:03 -0800</bug_when>
    <thetext>Comment on attachment 42227
shadow support for Cairo

&gt; Index: WebCore/platform/graphics/GraphicsContext.h
&gt; ===================================================================
&gt; +        void createPlatformShadow(PassOwnPtr&lt;ImageBuffer&gt; buffer, Color shadowColor, FloatRect shadowRect, float kernelSize);

You should pass Color and FloatRect as const references.

&gt; Index: WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp
&gt; ===================================================================

&gt; +static inline void drawPathShadow(GraphicsContext* context, GraphicsContextPrivate* gcp, bool fillShadow, bool strokeShadow)
&gt; +{
&gt; +
&gt; +        // calculate the kernel size according to the HTML5 specification

Huh? HTML5 has something to say about filters? Oh, canvas. You should say canvas (but this isn&apos;t just called for canvas).


&gt; Index: WebCore/platform/graphics/cairo/ImageCairo.cpp
&gt; ===================================================================

&gt; +    // Draw the shadow
&gt; +#if ENABLE(FILTERS)
&gt; +    IntSize shadowSize;
&gt; +    int shadowBlur;
&gt; +    Color shadowColor;
&gt; +    if (context-&gt;getShadow(shadowSize, shadowBlur, shadowColor)) {
&gt; +        // calculate the kernel size according to the HTML5 specification
&gt; +        float kernelSize = (shadowBlur &lt; 8 ? shadowBlur / 2.f : sqrt(shadowBlur * 2.f));
&gt; +        int blurRadius = ceil(kernelSize);
&gt; +        IntSize shadowBufferSize(dstRect.width() + blurRadius * 2, dstRect.height() + blurRadius * 2);
&gt; +        FloatRect shadowRect = FloatRect(dstRect.location(), shadowBufferSize);
&gt; +        shadowRect.move(shadowSize.width() - kernelSize, shadowSize.height() - kernelSize);
&gt; +        shadowColor = colorWithOverrideAlpha(shadowColor.rgb(), (shadowColor.alpha() *  context-&gt;getAlpha()) / 255.f);
&gt; +
&gt; +        //draw shadow into a new ImageBuffer
&gt; +        OwnPtr&lt;ImageBuffer&gt; shadowBuffer = ImageBuffer::create(shadowBufferSize);
&gt; +        cairo_t* shadowContext = shadowBuffer-&gt;context()-&gt;platformContext();
&gt; +        cairo_set_source(shadowContext, pattern);
&gt; +        cairo_translate(shadowContext, -dstRect.x(), -dstRect.y());
&gt; +        cairo_rectangle(shadowContext, 0, 0, dstRect.width(), dstRect.height());
&gt; +        cairo_fill(shadowContext);
&gt; +
&gt; +        context-&gt;createPlatformShadow(shadowBuffer.release(), shadowColor, shadowRect, kernelSize);

Can you share this code?

&gt; Index: WebCore/platform/graphics/filters/GraphicsContextFilter.h
&gt; ===================================================================

&gt; +    class GraphicsContextFilter : public Filter {

The name of this class is confusing. There&apos;s an SVGFilter, but that ultimately renders into a GraphicsContext. What is special about this one? Should this instead be some kind of helper class that makes it easy to apply some filter to drawing into a GraphicsContext?

&gt; +    public:
&gt; +        static PassRefPtr&lt;GraphicsContextFilter&gt; create();
&gt; +
&gt; +        bool effectBoundingBoxMode() { return false; }

This method should be const, and I prefer to see &apos;virtual&apos; in all subclasses.

&gt; +        void calculateEffectSubRegion(FilterEffect*) { }
&gt; +        FloatRect filterRegion() { return FloatRect(); }

This should be const (in the base class and all subclasses).

&gt; +        FloatRect sourceImageRect() { return FloatRect(); }

This should be const (in the base class and all subclasses).

It looks OK, but I&apos;d like to hear some thoughts about GraphicsContextFilter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162201</commentid>
    <comment_count>6</comment_count>
      <attachid>42260</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-11-10 13:59:39 -0800</bug_when>
    <thetext>Comment on attachment 42260
add GCFilter to the win build system

I&apos;m not sure why this patch exists by itself.  It seems it should be part of the other patch.  r-</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163004</commentid>
    <comment_count>7</comment_count>
      <attachid>43089</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-12 12:14:45 -0800</bug_when>
    <thetext>Created attachment 43089
Update patch for Simon Fraser and Eric Seidel&apos;s comments.

Updated original patch:
1.  Updated to build with new ColorSpace data types.
2.  Revised const values per Simon&apos;s comments.
3.  Clarified HTML5 comment regarding origins of the shadow calculation.
4.  Renamed GraphicsContextFilter as &quot;ImageBufferFilter&quot;, since that more accurately describes its function.
5.  Included the VS project changes in the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163019</commentid>
    <comment_count>8</comment_count>
    <who name="Benjamin Otte">otte</who>
    <bug_when>2009-11-12 12:55:18 -0800</bug_when>
    <thetext>&gt; +static inline void copyContextProperties(cairo_t* srcCr, cairo_t* dstCr)
&gt; +{
&gt; +    cairo_set_antialias(dstCr, cairo_get_antialias(srcCr));
&gt; +    double dashes, offset;
&gt; +    cairo_get_dash(srcCr, &amp;dashes, &amp;offset);
&gt; +    cairo_set_dash(dstCr, &amp;dashes, cairo_get_dash_count(srcCr), offset);
&gt;
This is wrong. cairo_get_dash() expects to be passed an array that has at least cairo_get_dash_count(srcCr) members. This will write random memory if dash count is &gt; 1.

&gt; +        cairo_stroke_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
&gt;
This is a nitpick, but I guess it wouldn&apos;t hurt to do it like this:
if (strokeShadow)
    cairo_stroke_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
else
    cairo_fill_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
Fill extents are smaller and faster to compute, though I guess this gets lost in the noise of actually doing the blur.

&gt; +     static void calculateShadowBufferDimensions(IntSize&amp; shadowBufferSize, FloatRect&amp; shadowRect, float&amp; kernelSize, const FloatRect&amp; sourceRect, const IntSize&amp; shadowSize, int shadowBlur);
&gt;
I dislike this function, because it has an ugly prototype. It has 2 out variables and they even share the size. Also, the code always creates a blur image afterwards and moves it. Wouldn&apos;t it be nicer to have a function like createShadowImage() that does all of this and just returns the ImageBuffer ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163076</commentid>
    <comment_count>9</comment_count>
      <attachid>43089</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-11-12 15:22:12 -0800</bug_when>
    <thetext>Comment on attachment 43089
Update patch for Simon Fraser and Eric Seidel&apos;s comments.

&gt; Index: WebCore/GNUmakefile.am
&gt; ===================================================================
&gt; --- WebCore/GNUmakefile.am	(revision 50863)
&gt; +++ WebCore/GNUmakefile.am	(working copy)
&gt; @@ -2625,6 +2625,8 @@ webcore_sources += \
&gt;  	WebCore/platform/graphics/filters/Filter.h \
&gt;  	WebCore/platform/graphics/filters/FilterEffect.cpp \
&gt;  	WebCore/platform/graphics/filters/FilterEffect.h \
&gt; +	WebCore/platform/graphics/filters/GraphicsContextFilter.cpp \
&gt; +	WebCore/platform/graphics/filters/GraphicsContextFilter.h \

Stale file names.

Should you add ImageBufferFilter to the xcode project as well? It seems generally useful.

&gt; Index: WebCore/platform/graphics/cairo/GraphicsContextCairo.cpp
&gt; ===================================================================


&gt; +        Color fillColor = colorWithOverrideAlpha(context-&gt;fillColor().rgb(), context-&gt;fillColor().alpha() / 255.f * gcp-&gt;state.globalAlpha);

If alpha() returns a float no need to make the 255 literal a float; the compiler will promote it.

&gt; +static inline void drawPathShadow(GraphicsContext* context, GraphicsContextPrivate* gcp, bool fillShadow, bool strokeShadow)
&gt; +{
&gt; +#if ENABLE(FILTERS)
&gt; +    IntSize shadowSize;
&gt; +    int shadowBlur;
&gt; +    Color shadowColor;
&gt; +    if (context-&gt;getShadow(shadowSize, shadowBlur, shadowColor)) {
&gt; +        //calculate filter values
&gt; +        cairo_t* cr = context-&gt;platformContext();
&gt; +        cairo_path_t* path = cairo_copy_path(cr);
&gt; +        double x0, x1, y0, y1;
&gt; +        cairo_stroke_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
&gt; +        FloatRect rect(x0, y0, x1 - x0, y1 - y0);
&gt; +
&gt; +        IntSize shadowBufferSize;
&gt; +        FloatRect shadowRect;
&gt; +        float kernelSize (0.0);
&gt; +        GraphicsContext::calculateShadowBufferDimensions(shadowBufferSize, shadowRect, kernelSize, rect, shadowSize, shadowBlur);
&gt; +
&gt; +        // create suitably-sized ImageBuffer to hold the shadow
&gt; +        OwnPtr&lt;ImageBuffer&gt; shadowBuffer = ImageBuffer::create(shadowBufferSize);
&gt; +
&gt; +        //draw shadow into a new ImageBuffer
&gt; +        cairo_t* shadowContext = shadowBuffer-&gt;context()-&gt;platformContext();
&gt; +        copyContextProperties(cr, shadowContext);
&gt; +        cairo_translate(shadowContext, -rect.x() + kernelSize, -rect.y() + kernelSize);
&gt; +        cairo_new_path(shadowContext);
&gt; +        cairo_append_path(shadowContext, path);
&gt; +
&gt; +        if (fillShadow)
&gt; +            setPlatformFill(context, shadowContext, gcp);
&gt; +        if (strokeShadow)
&gt; +            setPlatformStroke(context, shadowContext, gcp);
&gt; +
&gt; +        context-&gt;createPlatformShadow(shadowBuffer.release(), shadowColor, shadowRect, kernelSize);
&gt; +    }

This would be cleaner with an early return.

&gt; -void GraphicsContext::setPlatformShadow(IntSize const&amp;, int, Color const&amp;, ColorSpace)
&gt; +void GraphicsContext::setPlatformShadow(IntSize const&amp; size, int, Color const&amp;, ColorSpace)
&gt;  {
&gt; -    notImplemented();
&gt; +    // Cairo doesn&apos;t support shadows natively, they are drawn manually in the draw*
&gt; +    // functions
&gt; +
&gt; +    if (m_common-&gt;state.shadowsIgnoreTransforms) {
&gt; +        // Meaning that this graphics context is associated with a CanvasRenderingContext

For now, but what if this changes? We may decide that shadows ignore CSS transforms at some point.

&gt; Index: WebCore/platform/graphics/cairo/ImageCairo.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/cairo/ImageCairo.cpp	(revision 50863)
&gt; +++ WebCore/platform/graphics/cairo/ImageCairo.cpp	(working copy)
&gt; @@ -132,6 +132,30 @@ void BitmapImage::draw(GraphicsContext* 
&gt;      cairo_matrix_t matrix = { scaleX, 0, 0, scaleY, srcRect.x(), srcRect.y() };
&gt;      cairo_pattern_set_matrix(pattern, &amp;matrix);
&gt;  
&gt; +    // Draw the shadow
&gt; +#if ENABLE(FILTERS)
&gt; +    IntSize shadowSize;
&gt; +    int shadowBlur;
&gt; +    Color shadowColor;
&gt; +    if (context-&gt;getShadow(shadowSize, shadowBlur, shadowColor)) {
&gt; +        IntSize shadowBufferSize;
&gt; +        FloatRect shadowRect;
&gt; +        float kernelSize (0.0);
&gt; +        GraphicsContext::calculateShadowBufferDimensions(shadowBufferSize, shadowRect, kernelSize, dstRect, shadowSize, shadowBlur);
&gt; +        shadowColor = colorWithOverrideAlpha(shadowColor.rgb(), (shadowColor.alpha() *  context-&gt;getAlpha()) / 255.f);
&gt; +
&gt; +        //draw shadow into a new ImageBuffer
&gt; +        OwnPtr&lt;ImageBuffer&gt; shadowBuffer = ImageBuffer::create(shadowBufferSize);
&gt; +        cairo_t* shadowContext = shadowBuffer-&gt;context()-&gt;platformContext();
&gt; +        cairo_set_source(shadowContext, pattern);
&gt; +        cairo_translate(shadowContext, -dstRect.x(), -dstRect.y());
&gt; +        cairo_rectangle(shadowContext, 0, 0, dstRect.width(), dstRect.height());
&gt; +        cairo_fill(shadowContext);
&gt; +
&gt; +        context-&gt;createPlatformShadow(shadowBuffer.release(), shadowColor, shadowRect, kernelSize);
&gt; +    }
&gt; +#endif
&gt; +
&gt;      // Draw the image.
&gt;      cairo_translate(cr, dstRect.x(), dstRect.y());
&gt;      cairo_set_source(cr, pattern);
&gt; Index: WebCore/platform/graphics/filters/Filter.h
&gt; ===================================================================

&gt;          // SVG specific
&gt; +        virtual void calculateEffectSubRegion(FilterEffect*) const = 0;

It&apos;s not clear why this can be const. Does it change state in |this|, or the filter effect?

&gt; +        virtual bool effectBoundingBoxMode() const = 0;

I can&apos;t figure out what this means from the signature. Bool return? Not your fault, but it seems like this needs an enum for the return value.

&gt; Index: WebCore/platform/graphics/filters/ImageBufferFilter.h
&gt; ===================================================================

&gt; +namespace WebCore {
&gt; +
&gt; +    class ImageBufferFilter : public Filter {

We don&apos;t generally indent for namespaces.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163080</commentid>
    <comment_count>10</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-12 15:40:20 -0800</bug_when>
    <thetext>Since Simon r+&apos;d the change, I&apos;m landing with his minor corrections, and will provide a second patch to address the points you raise.

Thanks for taking a look at it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163085</commentid>
    <comment_count>11</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-12 15:48:07 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 43089 [details])
&gt; &gt; Index: WebCore/GNUmakefile.am
&gt; &gt; +	WebCore/platform/graphics/filters/GraphicsContextFilter.cpp \
&gt; &gt; +	WebCore/platform/graphics/filters/GraphicsContextFilter.h \
&gt; 
&gt; Stale file names.

Corrected.  Good catch!

&gt; Should you add ImageBufferFilter to the xcode project as well? It seems
&gt; generally useful.

Will do in a separate patch.
 
&gt; &gt; +        if (strokeShadow)
&gt; &gt; +            setPlatformStroke(context, shadowContext, gcp);
&gt; &gt; +
&gt; &gt; +        context-&gt;createPlatformShadow(shadowBuffer.release(), shadowColor, shadowRect, kernelSize);
&gt; &gt; +    }
&gt; 
&gt; This would be cleaner with an early return.

done.

&gt; &gt; Index: WebCore/platform/graphics/filters/Filter.h
&gt; &gt; ===================================================================
&gt; 
&gt; &gt;          // SVG specific
&gt; &gt; +        virtual void calculateEffectSubRegion(FilterEffect*) const = 0;
&gt; 
&gt; It&apos;s not clear why this can be const. Does it change state in |this|, or the
&gt; filter effect?

This function (in the only concrete implementation) modifies the FilterEffect argument, not the internal state of the filter.

&gt; &gt; Index: WebCore/platform/graphics/filters/ImageBufferFilter.h
&gt; &gt; ===================================================================
&gt; 
&gt; &gt; +namespace WebCore {
&gt; &gt; +
&gt; &gt; +    class ImageBufferFilter : public Filter {
&gt; 
&gt; We don&apos;t generally indent for namespaces.

Fixed.

Thanks for reviewing this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163143</commentid>
    <comment_count>12</comment_count>
      <attachid>43089</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-11-12 18:25:25 -0800</bug_when>
    <thetext>Comment on attachment 43089
Update patch for Simon Fraser and Eric Seidel&apos;s comments.

Brent to land this manually.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163212</commentid>
    <comment_count>13</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-12 21:37:26 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (From update of attachment 43089 [details])
&gt; Brent to land this manually.

Landed in http://trac.webkit.org/changeset/50920</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163213</commentid>
    <comment_count>14</comment_count>
      <attachid>43089</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-12 21:39:22 -0800</bug_when>
    <thetext>Comment on attachment 43089
Update patch for Simon Fraser and Eric Seidel&apos;s comments.

Will be providing one last patch to clear up some loose ends.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163244</commentid>
    <comment_count>15</comment_count>
    <who name="Benjamin Otte">otte</who>
    <bug_when>2009-11-12 23:40:54 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; +static inline void copyContextProperties(cairo_t* srcCr, cairo_t* dstCr)
&gt; &gt; +{
&gt; &gt; +    cairo_set_antialias(dstCr, cairo_get_antialias(srcCr));
&gt; &gt; +    double dashes, offset;
&gt; &gt; +    cairo_get_dash(srcCr, &amp;dashes, &amp;offset);
&gt; &gt; +    cairo_set_dash(dstCr, &amp;dashes, cairo_get_dash_count(srcCr), offset);
&gt; &gt;
&gt; This is wrong. cairo_get_dash() expects to be passed an array that has at least
&gt; cairo_get_dash_count(srcCr) members. This will write random memory if dash
&gt; count is &gt; 1.
&gt; 
I hope not fixing this (likely remote remote hole) was just an oversight and not related to ignoring comments from non-reviewers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163256</commentid>
    <comment_count>16</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-11-13 00:35:05 -0800</bug_when>
    <thetext>(In reply to comment #15)

&gt; I hope not fixing this (likely remote remote hole) was just an oversight and
&gt; not related to ignoring comments from non-reviewers.

Yes, (In reply to comment #15)
&gt; (In reply to comment #8)
&gt; &gt; &gt; +static inline void copyContextProperties(cairo_t* srcCr, cairo_t* dstCr)
&gt; &gt; &gt; +{
&gt; &gt; &gt; +    cairo_set_antialias(dstCr, cairo_get_antialias(srcCr));
&gt; &gt; &gt; +    double dashes, offset;
&gt; &gt; &gt; +    cairo_get_dash(srcCr, &amp;dashes, &amp;offset);
&gt; &gt; &gt; +    cairo_set_dash(dstCr, &amp;dashes, cairo_get_dash_count(srcCr), offset);
&gt; &gt; &gt;
&gt; &gt; This is wrong. cairo_get_dash() expects to be passed an array that has at least
&gt; &gt; cairo_get_dash_count(srcCr) members. This will write random memory if dash
&gt; &gt; count is &gt; 1.
&gt; &gt; 
&gt; I hope not fixing this (likely remote remote hole) was just an oversight and
&gt; not related to ignoring comments from non-reviewers.

Yes this should be fixed. But Brent said that there will be a follow-up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163271</commentid>
    <comment_count>17</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-11-13 02:18:24 -0800</bug_when>
    <thetext>Hey, this change seems to have caused 2 regressions in GTK+, and the test introduced by it also fails:

fast/canvas/canvas-composite-alpha.html
fast/canvas/canvas-shadow.html
fast/canvas/gradient-with-clip.html

Is enabling something what is missing? If we need more time to figure it out, I believe we should revert, and reland when the tests pass.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163304</commentid>
    <comment_count>18</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-11-13 07:17:03 -0800</bug_when>
    <thetext>For the record, krit has found one of the problems introduced, and patched it in http://trac.webkit.org/changeset/50939. We still need to figure out the fast/canvas/canvas-composite-alpha.html regression.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163360</commentid>
    <comment_count>19</comment_count>
      <attachid>43167</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-13 10:20:25 -0800</bug_when>
    <thetext>Created attachment 43167
Update to improve performance, correct security hole.

This update attempts to address Benjamin Otte&apos;s comments regarding performance and security in regards to interactions with the Cairo library.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163365</commentid>
    <comment_count>20</comment_count>
      <attachid>43167</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-13 10:43:07 -0800</bug_when>
    <thetext>Comment on attachment 43167
Update to improve performance, correct security hole.

&gt; +    cairo_get_dash(srcCr, reinterpret_cast&lt;double*&gt;(dashes.data()), &amp;offset);
&gt; +    cairo_set_dash(dstCr, reinterpret_cast&lt;double*&gt;(dashes.data()), dashCount, offset);

Please remove the unneeded reinterpret_cast.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163369</commentid>
    <comment_count>21</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-11-13 10:50:49 -0800</bug_when>
    <thetext>Can you please try to fix the LayoutTest before landing the next patch. Brent? I also try to catch the bug, but would be better to have a green bot first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163379</commentid>
    <comment_count>22</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-13 11:31:36 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/50956.

Dirk to follow up with final patch to correct the alpha blending regression.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163460</commentid>
    <comment_count>23</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-11-13 13:06:43 -0800</bug_when>
    <thetext>Landed last fix to pass LayoutTests r50963.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163526</commentid>
    <comment_count>24</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2009-11-13 14:30:50 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; +        cairo_stroke_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
&gt; &gt;
&gt; This is a nitpick, but I guess it wouldn&apos;t hurt to do it like this:
&gt; if (strokeShadow)
&gt;     cairo_stroke_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
&gt; else
&gt;     cairo_fill_extents(cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
&gt; Fill extents are smaller and faster to compute, though I guess this gets lost
&gt; in the noise of actually doing the blur.

I&apos;m concerned that this change was bad.  If I use cairo_stroke_extents, then the &quot;Off Screen&quot; example on http://philip.html5.org/demos/canvas/shadows/various.html shows faint lines around the edges.  If I switch to the above code (which I landed earlier today), the &quot;Off Screen&quot; example is blank.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163648</commentid>
    <comment_count>25</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2009-11-13 23:12:45 -0800</bug_when>
    <thetext>The offset example should be blank. It&apos;s just ff that uses stroke_extends at the wrong place.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42227</attachid>
            <date>2009-10-30 12:56:02 -0700</date>
            <delta_ts>2009-11-12 12:14:45 -0800</delta_ts>
            <desc>shadow support for Cairo</desc>
            <filename>shadow12.patch</filename>
            <type>text/plain</type>
            <size>22484</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDM0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMDktMTAtMzAgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbQ0FJ
Uk9dIHNoYWRvdyBzdXBwb3J0IGZvciBDYW52YXMgYW5kIFNWRworICAgICAgICBbaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwOTYwXQorCisgICAgICAgIEltcGxlbWVu
dCBDYW52YXMvU1ZHIHNoYWRvdyBzdXBwb3J0IGZvciBDYWlyby4gVGhpcyBwYXRjaAorICAgICAg
ICB1c2VzIHRoZSBmaWx0ZXIgY29kZSBmcm9tIFNWRyBGaWx0ZXJzLiBUaGF0IG1lYW5zIGl0IGlz
CisgICAgICAgIG5lY2Nlc3NhcnkgdG8gYWN0aXZhdGUgZmlsdGVycyB0byBzZWUgdGhlIHNoYWRv
d3MuCisKKyAgICAgICAgVGVzdDogZmFzdC9jYW52YXMvY2FudmFzLXNoYWRvdy5odG1sCisKKyAg
ICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0NvbnRleHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGlj
c0NvbnRleHRDYWlyby5jcHA6CisgICAgICAgIChXZWJDb3JlOjpzZXRQbGF0Zm9ybUZpbGwpOgor
ICAgICAgICAoV2ViQ29yZTo6c2V0UGxhdGZvcm1TdHJva2UpOgorICAgICAgICAoV2ViQ29yZTo6
Y29weUNvbnRleHRQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdQYXRoU2hhZG93
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQ6OmNyZWF0ZVBsYXRmb3JtU2hhZG93KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jYWlyby9JbWFnZUNhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdl
OjpkcmF3KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0dyYXBoaWNzQ29u
dGV4dEZpbHRlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
RmlsdGVyOjpHcmFwaGljc0NvbnRleHRGaWx0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0RmlsdGVyOjpjcmVhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Zp
bHRlcnMvR3JhcGhpY3NDb250ZXh0RmlsdGVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0RmlsdGVyOjplZmZlY3RCb3VuZGluZ0JveE1vZGUpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0RmlsdGVyOjpjYWxjdWxhdGVFZmZlY3RTdWJSZWdpb24p
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0RmlsdGVyOjpmaWx0ZXJSZWdpb24p
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0RmlsdGVyOjpzb3VyY2VJbWFnZVJl
Y3QpOgorCiAyMDA5LTEwLTMwICBEbWl0cnkgVGl0b3YgIDxkaW1pY2hAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYkNvcmUvR05V
bWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkocmV2aXNp
b24gNTAwNDQpCisrKyBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkpCkBAIC0y
NjA1LDYgKzI2MDUsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZmlsdGVycy9GaWx0ZXIuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9m
aWx0ZXJzL0ZpbHRlckVmZmVjdC5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmls
dGVycy9GaWx0ZXJFZmZlY3QuaCBcCisJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJz
L0dyYXBoaWNzQ29udGV4dEZpbHRlci5jcHAgXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
ZmlsdGVycy9HcmFwaGljc0NvbnRleHRGaWx0ZXIuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9maWx0ZXJzL1NvdXJjZUFscGhhLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9maWx0ZXJzL1NvdXJjZUFscGhhLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmls
dGVycy9Tb3VyY2VHcmFwaGljLmNwcCBcCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzQ29udGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvR3JhcGhpY3NDb250ZXh0LmgJKHJldmlzaW9uIDUwMDQ0KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMjg5LDYgKzI4
OSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdm9pZCBzZXRBbHBoYShmbG9hdCk7
CiAjaWYgUExBVEZPUk0oQ0FJUk8pCiAgICAgICAgIGZsb2F0IGdldEFscGhhKCk7CisgICAgICAg
IHZvaWQgY3JlYXRlUGxhdGZvcm1TaGFkb3coUGFzc093blB0cjxJbWFnZUJ1ZmZlcj4gYnVmZmVy
LCBDb2xvciBzaGFkb3dDb2xvciwgRmxvYXRSZWN0IHNoYWRvd1JlY3QsIGZsb2F0IGtlcm5lbFNp
emUpOwogI2VuZGlmCiAKICAgICAgICAgdm9pZCBzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9z
aXRlT3BlcmF0b3IpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFw
aGljc0NvbnRleHRDYWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5jcHAJKHJldmlzaW9uIDUwMDQ0KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2
IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0
IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIw
MDggRGlyayBTY2h1bHplIDx2YnM4NUBnbXguZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIw
MDkgRGlyayBTY2h1bHplIDxrcml0QHdlYmtpdC5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgg
TnVhbnRpIEx0ZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMyLDE0ICszMiwxNyBAQAogI2lmIFBM
QVRGT1JNKENBSVJPKQogCiAjaW5jbHVkZSAiQ2Fpcm9QYXRoLmgiCisjaW5jbHVkZSAiRkVHYXVz
c2lhbkJsdXIuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJGb250LmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0RmlsdGVyLmgiCiAjaW5jbHVkZSAiSW1hZ2VCdWZmZXIu
aCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNp
bmNsdWRlICJQYXRoLmgiCiAjaW5jbHVkZSAiUGF0dGVybi5oIgogI2luY2x1ZGUgIlNpbXBsZUZv
bnREYXRhLmgiCisjaW5jbHVkZSAiU291cmNlR3JhcGhpYy5oIgogI2luY2x1ZGUgIlRyYW5zZm9y
bWF0aW9uTWF0cml4LmgiCiAKICNpbmNsdWRlIDxjYWlyby5oPgpAQCAtNjksNiArNzIsNTUgQEAg
c3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJvX3QqIGNyLAogICAgIGNhaXJvX3NldF9z
b3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogfQogCitzdGF0aWMgaW5s
aW5lIHZvaWQgc2V0UGxhdGZvcm1GaWxsKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY2Fpcm9f
dCogY3IsIEdyYXBoaWNzQ29udGV4dFByaXZhdGUqIGdjcCkKK3sKKyAgICBzd2l0Y2ggKGdjcC0+
c3RhdGUuZmlsbENvbG9yU3BhY2UpIHsKKyAgICBjYXNlIFNvbGlkQ29sb3JTcGFjZTogeworICAg
ICAgICBDb2xvciBmaWxsQ29sb3IgPSBjb2xvcldpdGhPdmVycmlkZUFscGhhKGNvbnRleHQtPmZp
bGxDb2xvcigpLnJnYigpLCBjb250ZXh0LT5maWxsQ29sb3IoKS5hbHBoYSgpIC8gMjU1LmYgKiBn
Y3AtPnN0YXRlLmdsb2JhbEFscGhhKTsKKyAgICAgICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xvcik7
CisgICAgICAgIGNhaXJvX2ZpbGxfcHJlc2VydmUoY3IpOworICAgICAgICBicmVhazsKKyAgICB9
CisgICAgY2FzZSBQYXR0ZXJuQ29sb3JTcGFjZTogeworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCBhZmZpbmU7CisgICAgICAgIGNhaXJvX3NldF9zb3VyY2UoY3IsIGdjcC0+c3RhdGUuZmls
bFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUpKTsKKyAgICAgICAgY2Fpcm9f
Y2xpcF9wcmVzZXJ2ZShjcik7CisgICAgICAgIGNhaXJvX3BhaW50X3dpdGhfYWxwaGEoY3IsIGdj
cC0+c3RhdGUuZ2xvYmFsQWxwaGEpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBH
cmFkaWVudENvbG9yU3BhY2U6CisgICAgICAgIGNhaXJvX3NldF9zb3VyY2UoY3IsIGdjcC0+c3Rh
dGUuZmlsbEdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCkpOworICAgICAgICBjYWlyb19jbGlw
X3ByZXNlcnZlKGNyKTsKKyAgICAgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgZ2NwLT5z
dGF0ZS5nbG9iYWxBbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGlu
bGluZSB2b2lkIHNldFBsYXRmb3JtU3Ryb2tlKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY2Fp
cm9fdCogY3IsIEdyYXBoaWNzQ29udGV4dFByaXZhdGUqIGdjcCkKK3sKKyAgICBzd2l0Y2ggKGdj
cC0+c3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSkgeworICAgIGNhc2UgU29saWRDb2xvclNwYWNlOiB7
CisgICAgICAgIENvbG9yIHN0cm9rZUNvbG9yID0gY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShjb250
ZXh0LT5zdHJva2VDb2xvcigpLnJnYigpLCBjb250ZXh0LT5zdHJva2VDb2xvcigpLmFscGhhKCkg
LyAyNTUuZiAqIGdjcC0+c3RhdGUuZ2xvYmFsQWxwaGEpOworICAgICAgICBzZXRDb2xvcihjciwg
c3Ryb2tlQ29sb3IpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQYXR0ZXJuQ29s
b3JTcGFjZTogeworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBhZmZpbmU7CisgICAgICAg
IGNhaXJvX3NldF9zb3VyY2UoY3IsIGdjcC0+c3RhdGUuc3Ryb2tlUGF0dGVybi0+Y3JlYXRlUGxh
dGZvcm1QYXR0ZXJuKGFmZmluZSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBH
cmFkaWVudENvbG9yU3BhY2U6CisgICAgICAgIGNhaXJvX3NldF9zb3VyY2UoY3IsIGdjcC0+c3Rh
dGUuc3Ryb2tlR3JhZGllbnQtPnBsYXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgICBpZiAoZ2NwLT5zdGF0ZS5nbG9iYWxBbHBoYSA8IDEuMGYgJiYgZ2NwLT5zdGF0
ZS5zdHJva2VDb2xvclNwYWNlICE9IFNvbGlkQ29sb3JTcGFjZSkgeworICAgICAgICBjYWlyb19w
dXNoX2dyb3VwKGNyKTsKKyAgICAgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgZ2NwLT5z
dGF0ZS5nbG9iYWxBbHBoYSk7CisgICAgICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3Ip
OworICAgIH0KKyAgICBjYWlyb19zdHJva2VfcHJlc2VydmUoY3IpOworfQorCiAvLyBBIGZpbGxS
ZWN0IGhlbHBlcgogc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYWlyb190
KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sKQogewpAQCAtNzgs
NiArMTMwLDU4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNvdXJjZU92ZXIoY2EKICAg
ICBjYWlyb19maWxsKGNyKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNvcHlDb250ZXh0UHJv
cGVydGllcyhjYWlyb190KiBzcmNDciwgY2Fpcm9fdCogZHN0Q3IpCit7CisgICAgY2Fpcm9fc2V0
X2FudGlhbGlhcyhkc3RDciwgY2Fpcm9fZ2V0X2FudGlhbGlhcyhzcmNDcikpOworICAgIGRvdWJs
ZSBkYXNoZXMsIG9mZnNldDsKKyAgICBjYWlyb19nZXRfZGFzaChzcmNDciwgJmRhc2hlcywgJm9m
ZnNldCk7CisgICAgY2Fpcm9fc2V0X2Rhc2goZHN0Q3IsICZkYXNoZXMsIGNhaXJvX2dldF9kYXNo
X2NvdW50KHNyY0NyKSwgb2Zmc2V0KTsKKyAgICBjYWlyb19zZXRfbGluZV9jYXAoZHN0Q3IsIGNh
aXJvX2dldF9saW5lX2NhcChzcmNDcikpOworICAgIGNhaXJvX3NldF9saW5lX2pvaW4oZHN0Q3Is
IGNhaXJvX2dldF9saW5lX2pvaW4oc3JjQ3IpKTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChk
c3RDciwgY2Fpcm9fZ2V0X2xpbmVfd2lkdGgoc3JjQ3IpKTsKKyAgICBjYWlyb19zZXRfbWl0ZXJf
bGltaXQoZHN0Q3IsIGNhaXJvX2dldF9taXRlcl9saW1pdChzcmNDcikpOworICAgIGNhaXJvX3Nl
dF9maWxsX3J1bGUoZHN0Q3IsIGNhaXJvX2dldF9maWxsX3J1bGUoc3JjQ3IpKTsKK30KKworc3Rh
dGljIGlubGluZSB2b2lkIGRyYXdQYXRoU2hhZG93KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
R3JhcGhpY3NDb250ZXh0UHJpdmF0ZSogZ2NwLCBib29sIGZpbGxTaGFkb3csIGJvb2wgc3Ryb2tl
U2hhZG93KQoreworI2lmIEVOQUJMRShGSUxURVJTKQorICAgIEludFNpemUgc2hhZG93U2l6ZTsK
KyAgICBpbnQgc2hhZG93Qmx1cjsKKyAgICBDb2xvciBzaGFkb3dDb2xvcjsKKyAgICBpZiAoY29u
dGV4dC0+Z2V0U2hhZG93KHNoYWRvd1NpemUsIHNoYWRvd0JsdXIsIHNoYWRvd0NvbG9yKSkgewor
ICAgICAgICAvL2NhbGN1bGF0ZSBmaWx0ZXIgdmFsdWVzCisgICAgICAgIGNhaXJvX3QqIGNyID0g
Y29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgICAgIGNhaXJvX3BhdGhfdCogcGF0aCA9
IGNhaXJvX2NvcHlfcGF0aChjcik7CisgICAgICAgIGRvdWJsZSB4MCwgeDEsIHkwLCB5MTsKKyAg
ICAgICAgY2Fpcm9fc3Ryb2tlX2V4dGVudHMoY3IsICZ4MCwgJnkwLCAmeDEsICZ5MSk7CisgICAg
ICAgIEZsb2F0UmVjdCByZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7CisKKyAgICAgICAg
Ly8gY2FsY3VsYXRlIHRoZSBrZXJuZWwgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEhUTUw1IHNwZWNp
ZmljYXRpb24KKyAgICAgICAgZmxvYXQga2VybmVsU2l6ZSA9IChzaGFkb3dCbHVyIDwgOCA/IHNo
YWRvd0JsdXIgLyAyLmYgOiBzcXJ0KHNoYWRvd0JsdXIgKiAyLmYpKTsKKyAgICAgICAgaW50IGJs
dXJSYWRpdXMgPSBjZWlsKGtlcm5lbFNpemUpOworICAgICAgICBJbnRTaXplIHNoYWRvd0J1ZmZl
clNpemUocmVjdC53aWR0aCgpICsgYmx1clJhZGl1cyAqIDIsIHJlY3QuaGVpZ2h0KCkgKyBibHVy
UmFkaXVzICogMik7CisgICAgICAgIEZsb2F0UmVjdCBzaGFkb3dSZWN0ID0gRmxvYXRSZWN0KHJl
Y3QubG9jYXRpb24oKSwgc2hhZG93QnVmZmVyU2l6ZSk7CisgICAgICAgIHNoYWRvd1JlY3QubW92
ZShzaGFkb3dTaXplLndpZHRoKCkgLSBrZXJuZWxTaXplLCBzaGFkb3dTaXplLmhlaWdodCgpIC0g
a2VybmVsU2l6ZSk7CisKKyAgICAgICAgLy9kcmF3IHNoYWRvdyBpbnRvIGEgbmV3IEltYWdlQnVm
ZmVyCisgICAgICAgIE93blB0cjxJbWFnZUJ1ZmZlcj4gc2hhZG93QnVmZmVyID0gSW1hZ2VCdWZm
ZXI6OmNyZWF0ZShzaGFkb3dCdWZmZXJTaXplKTsKKyAgICAgICAgY2Fpcm9fdCogc2hhZG93Q29u
dGV4dCA9IHNoYWRvd0J1ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICAg
ICAgY29weUNvbnRleHRQcm9wZXJ0aWVzKGNyLCBzaGFkb3dDb250ZXh0KTsKKyAgICAgICAgY2Fp
cm9fdHJhbnNsYXRlKHNoYWRvd0NvbnRleHQsIC1yZWN0LngoKSArIGtlcm5lbFNpemUsIC1yZWN0
LnkoKSArIGtlcm5lbFNpemUpOworICAgICAgICBjYWlyb19uZXdfcGF0aChzaGFkb3dDb250ZXh0
KTsKKyAgICAgICAgY2Fpcm9fYXBwZW5kX3BhdGgoc2hhZG93Q29udGV4dCwgcGF0aCk7CisKKyAg
ICAgICAgaWYgKGZpbGxTaGFkb3cpCisgICAgICAgICAgICBzZXRQbGF0Zm9ybUZpbGwoY29udGV4
dCwgc2hhZG93Q29udGV4dCwgZ2NwKTsKKyAgICAgICAgaWYgKHN0cm9rZVNoYWRvdykKKyAgICAg
ICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlKGNvbnRleHQsIHNoYWRvd0NvbnRleHQsIGdjcCk7CisK
KyAgICAgICAgY29udGV4dC0+Y3JlYXRlUGxhdGZvcm1TaGFkb3coc2hhZG93QnVmZmVyLnJlbGVh
c2UoKSwgc2hhZG93Q29sb3IsIHNoYWRvd1JlY3QsIGtlcm5lbFNpemUpOworICAgIH0KKyNlbmRp
ZgorfQorCiBHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNz
Q29udGV4dCogY3IpCiAgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRl
KCkpCiAgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKQEAg
LTM4NywzMCArNDkxLDEyIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aCgpCiAgICAg
ICAgIHJldHVybjsKIAogICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19z
YXZlKGNyKTsKIAogICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIGZpbGxSdWxlKCkgPT0gUlVM
RV9FVkVOT0REID8gQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REIDogQ0FJUk9fRklMTF9SVUxFX1dJ
TkRJTkcpOwotICAgIHN3aXRjaCAobV9jb21tb24tPnN0YXRlLmZpbGxDb2xvclNwYWNlKSB7Ci0g
ICAgY2FzZSBTb2xpZENvbG9yU3BhY2U6Ci0gICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3Io
KSk7Ci0gICAgICAgIGNhaXJvX2NsaXAoY3IpOwotICAgICAgICBjYWlyb19wYWludF93aXRoX2Fs
cGhhKGNyLCBtX2NvbW1vbi0+c3RhdGUuZ2xvYmFsQWxwaGEpOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFBhdHRlcm5Db2xvclNwYWNlOiB7Ci0gICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IGFmZmluZTsKLSAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZShjciwgbV9jb21tb24tPnN0YXRlLmZp
bGxQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4oYWZmaW5lKSk7Ci0gICAgICAgIGNhaXJv
X2NsaXAoY3IpOwotICAgICAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBtX2NvbW1vbi0+
c3RhdGUuZ2xvYmFsQWxwaGEpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBHcmFk
aWVudENvbG9yU3BhY2U6Ci0gICAgICAgIGNhaXJvX3BhdHRlcm5fdCogcGF0dGVybiA9IG1fY29t
bW9uLT5zdGF0ZS5maWxsR3JhZGllbnQtPnBsYXRmb3JtR3JhZGllbnQoKTsKLSAgICAgICAgY2Fp
cm9fc2V0X3NvdXJjZShjciwgcGF0dGVybik7Ci0gICAgICAgIGNhaXJvX2NsaXAoY3IpOwotICAg
ICAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBtX2NvbW1vbi0+c3RhdGUuZ2xvYmFsQWxw
aGEpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7CisgICAg
ZHJhd1BhdGhTaGFkb3codGhpcywgbV9jb21tb24sIHRydWUsIGZhbHNlKTsKKworICAgIHNldFBs
YXRmb3JtRmlsbCh0aGlzLCBjciwgbV9jb21tb24pOworICAgIGNhaXJvX25ld19wYXRoKGNyKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoKQpAQCAtNDE5LDQ1ICs1MDUs
MjUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoKQogICAgICAgICByZXR1cm47
CiAKICAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0g
ICAgc3dpdGNoIChtX2NvbW1vbi0+c3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSkgewotICAgIGNhc2Ug
U29saWRDb2xvclNwYWNlOgotICAgICAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsK
LSAgICAgICAgc3Ryb2tlQ29sb3IoKS5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LSAgICAgICAgaWYgKG1fY29tbW9uLT5zdGF0ZS5nbG9iYWxBbHBoYSA8IDEuMGYpCi0gICAgICAg
ICAgICBhbHBoYSAqPSBtX2NvbW1vbi0+c3RhdGUuZ2xvYmFsQWxwaGE7Ci0gICAgICAgIGNhaXJv
X3NldF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICBj
YWlyb19zdHJva2UoY3IpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBhdHRlcm5Db2xvclNw
YWNlOiB7Ci0gICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGFmZmluZTsKLSAgICAgICAgY2Fp
cm9fc2V0X3NvdXJjZShjciwgbV9jb21tb24tPnN0YXRlLnN0cm9rZVBhdHRlcm4tPmNyZWF0ZVBs
YXRmb3JtUGF0dGVybihhZmZpbmUpKTsKLSAgICAgICAgaWYgKG1fY29tbW9uLT5zdGF0ZS5nbG9i
YWxBbHBoYSA8IDEuMGYpIHsKLSAgICAgICAgICAgIGNhaXJvX3B1c2hfZ3JvdXAoY3IpOwotICAg
ICAgICAgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9jb21tb24tPnN0YXRlLmdsb2Jh
bEFscGhhKTsKLSAgICAgICAgICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3IpOwotICAg
ICAgICB9Ci0gICAgICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0K
LSAgICBjYXNlIEdyYWRpZW50Q29sb3JTcGFjZToKLSAgICAgICAgY2Fpcm9fcGF0dGVybl90KiBw
YXR0ZXJuID0gbV9jb21tb24tPnN0YXRlLnN0cm9rZUdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50
KCk7Ci0gICAgICAgIGNhaXJvX3NldF9zb3VyY2UoY3IsIHBhdHRlcm4pOwotICAgICAgICBpZiAo
bV9jb21tb24tPnN0YXRlLmdsb2JhbEFscGhhIDwgMS4wZikgewotICAgICAgICAgICAgY2Fpcm9f
cHVzaF9ncm91cChjcik7Ci0gICAgICAgICAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBt
X2NvbW1vbi0+c3RhdGUuZ2xvYmFsQWxwaGEpOwotICAgICAgICAgICAgY2Fpcm9fcG9wX2dyb3Vw
X3RvX3NvdXJjZShjcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworICAgIGRyYXdQYXRo
U2hhZG93KHRoaXMsIG1fY29tbW9uLCBmYWxzZSwgdHJ1ZSk7CisKKyAgICBzZXRQbGF0Zm9ybVN0
cm9rZSh0aGlzLCBjciwgbV9jb21tb24pOworICAgIGNhaXJvX25ld19wYXRoKGNyKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdQYXRoKCkKIHsKLSAgICBmaWxsUGF0aCgpOwotICAg
IHN0cm9rZVBhdGgoKTsKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBjYWlyb19zZXRfZmls
bF9ydWxlKGNyLCBmaWxsUnVsZSgpID09IFJVTEVfRVZFTk9ERCA/IENBSVJPX0ZJTExfUlVMRV9F
VkVOX09ERCA6IENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsKKyAgICBkcmF3UGF0aFNoYWRvdyh0
aGlzLCBtX2NvbW1vbiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBzZXRQbGF0Zm9ybUZpbGwodGhpcywg
Y3IsIG1fY29tbW9uKTsKKyAgICBzZXRQbGF0Zm9ybVN0cm9rZSh0aGlzLCBjciwgbV9jb21tb24p
OworICAgIGNhaXJvX25ld19wYXRoKGNyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZp
bGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKQEAgLTcyNiw5ICs3OTIsNDggQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmNsaXBUb0ltYWdlQnVmZmVyKAogICAgIG5vdEltcGxlbWVudGVkKCk7
CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyhJbnRTaXplIGNv
bnN0JiwgaW50LCBDb2xvciBjb25zdCYpCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZv
cm1TaGFkb3coSW50U2l6ZSBjb25zdCYgc2l6ZSwgaW50LCBDb2xvciBjb25zdCYpCiB7Ci0gICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICAvLyBDYWlybyBkb2Vzbid0IHN1cHBvcnQgc2hhZG93cyBu
YXRpdmVseSwgdGhleSBhcmUgZHJhd24gbWFudWFsbHkgaW4gdGhlIGRyYXcqCisgICAgLy8gZnVu
Y3Rpb25zCisKKyAgICBpZiAobV9jb21tb24tPnN0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1z
KSB7CisgICAgICAgIC8vIE1lYW5pbmcgdGhhdCB0aGlzIGdyYXBoaWNzIGNvbnRleHQgaXMgYXNz
b2NpYXRlZCB3aXRoIGEgQ2FudmFzUmVuZGVyaW5nQ29udGV4dAorICAgICAgICAvLyBXZSBmbGlw
IHRoZSBoZWlnaHQgc2luY2UgQ0cgYW5kIEhUTUw1IENhbnZhcyBoYXZlIG9wcG9zaXRlIFkgYXhp
cworICAgICAgICBtX2NvbW1vbi0+c3RhdGUuc2hhZG93U2l6ZSA9IEludFNpemUoc2l6ZS53aWR0
aCgpLCAtc2l6ZS5oZWlnaHQoKSk7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
Y3JlYXRlUGxhdGZvcm1TaGFkb3coUGFzc093blB0cjxJbWFnZUJ1ZmZlcj4gYnVmZmVyLCBDb2xv
ciBzaGFkb3dDb2xvciwgRmxvYXRSZWN0IHNoYWRvd1JlY3QsIGZsb2F0IGtlcm5lbFNpemUpCit7
CisjaWYgRU5BQkxFKEZJTFRFUlMpCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworCisg
ICAgLy8gZHJhdyB0aGUgc2hhZG93IHdpdGhvdXQgYmx1cnJpbmcsIGlmIGtlcm5lbFNpemUgaXMg
emVybworICAgIGlmICgha2VybmVsU2l6ZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc2hhZG93
Q29sb3IpOworICAgICAgICBjYWlyb19tYXNrX3N1cmZhY2UoY3IsIGJ1ZmZlci0+aW1hZ2UoKS0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKSwgc2hhZG93UmVjdC54KCksIHNoYWRvd1JlY3Qu
eSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGxpbWl0IGtlcm5lbCBzaXpl
IHRvIDEwMDAsIHRoaXMgaXMgd2hhdCBDRyBpcyBkb2luZy4KKyAgICBrZXJuZWxTaXplID0gc3Rk
OjptaW4oMTAwMC5mLCBrZXJuZWxTaXplKTsKKworICAgIC8vIGNyZWF0ZSBmaWx0ZXIKKyAgICBS
ZWZQdHI8RmlsdGVyPiBmaWx0ZXIgPSBHcmFwaGljc0NvbnRleHRGaWx0ZXI6OmNyZWF0ZSgpOwor
ICAgIGZpbHRlci0+c2V0U291cmNlSW1hZ2UoYnVmZmVyLnJlbGVhc2UoKSk7CisgICAgUmVmUHRy
PEZpbHRlckVmZmVjdD4gc291cmNlID0gU291cmNlR3JhcGhpYzo6Y3JlYXRlKCk7CisgICAgc291
cmNlLT5zZXRTdWJSZWdpb24oRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgc2hhZG93UmVjdC5zaXpl
KCkpKTsKKyAgICBzb3VyY2UtPnNldElzQWxwaGFJbWFnZSh0cnVlKTsKKyAgICBSZWZQdHI8Rmls
dGVyRWZmZWN0PiBibHVyID0gRkVHYXVzc2lhbkJsdXI6OmNyZWF0ZShzb3VyY2UuZ2V0KCksIGtl
cm5lbFNpemUsIGtlcm5lbFNpemUpOworICAgIGJsdXItPnNldFN1YlJlZ2lvbihGbG9hdFJlY3Qo
RmxvYXRQb2ludCgpLCBzaGFkb3dSZWN0LnNpemUoKSkpOworICAgIGJsdXItPmFwcGx5KGZpbHRl
ci5nZXQoKSk7CisKKyAgICAvLyBNYXNrIHRoZSBmaWx0ZXIgd2l0aCB0aGUgc2hhZG93IGNvbG9y
IGFuZCBkcmF3IGl0IHRvIHRoZSBjb250ZXh0LgorICAgIC8vIE1hc2tpbmcgbWFrZXMgaXQgcG9z
c2libGUgdG8ganVzdCBibHVyIHRoZSBhbHBoYSBjaGFubmVsLgorICAgIHNldENvbG9yKGNyLCBz
aGFkb3dDb2xvcik7CisgICAgY2Fpcm9fbWFza19zdXJmYWNlKGNyLCBibHVyLT5yZXN1bHRJbWFn
ZSgpLT5pbWFnZSgpLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpLCBzaGFkb3dSZWN0Lngo
KSwgc2hhZG93UmVjdC55KCkpOworI2VuZGlmCiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGVhclBsYXRmb3JtU2hhZG93KCkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vSW1hZ2VDYWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jYWlyby9JbWFnZUNhaXJvLmNwcAkocmV2aXNpb24gNTAwNDQpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQ2Fpcm8uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzYs
NiArMTM2LDMyIEBAIHZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiAKICAg
ICBjYWlyb19tYXRyaXhfdCBtYXRyaXggPSB7IHNjYWxlWCwgMCwgMCwgc2NhbGVZLCBzcmNSZWN0
LngoKSwgc3JjUmVjdC55KCkgfTsKICAgICBjYWlyb19wYXR0ZXJuX3NldF9tYXRyaXgocGF0dGVy
biwgJm1hdHJpeCk7CiAKKyAgICAvLyBEcmF3IHRoZSBzaGFkb3cKKyNpZiBFTkFCTEUoRklMVEVS
UykKKyAgICBJbnRTaXplIHNoYWRvd1NpemU7CisgICAgaW50IHNoYWRvd0JsdXI7CisgICAgQ29s
b3Igc2hhZG93Q29sb3I7CisgICAgaWYgKGNvbnRleHQtPmdldFNoYWRvdyhzaGFkb3dTaXplLCBz
aGFkb3dCbHVyLCBzaGFkb3dDb2xvcikpIHsKKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBrZXJu
ZWwgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEhUTUw1IHNwZWNpZmljYXRpb24KKyAgICAgICAgZmxv
YXQga2VybmVsU2l6ZSA9IChzaGFkb3dCbHVyIDwgOCA/IHNoYWRvd0JsdXIgLyAyLmYgOiBzcXJ0
KHNoYWRvd0JsdXIgKiAyLmYpKTsKKyAgICAgICAgaW50IGJsdXJSYWRpdXMgPSBjZWlsKGtlcm5l
bFNpemUpOworICAgICAgICBJbnRTaXplIHNoYWRvd0J1ZmZlclNpemUoZHN0UmVjdC53aWR0aCgp
ICsgYmx1clJhZGl1cyAqIDIsIGRzdFJlY3QuaGVpZ2h0KCkgKyBibHVyUmFkaXVzICogMik7Cisg
ICAgICAgIEZsb2F0UmVjdCBzaGFkb3dSZWN0ID0gRmxvYXRSZWN0KGRzdFJlY3QubG9jYXRpb24o
KSwgc2hhZG93QnVmZmVyU2l6ZSk7CisgICAgICAgIHNoYWRvd1JlY3QubW92ZShzaGFkb3dTaXpl
LndpZHRoKCkgLSBrZXJuZWxTaXplLCBzaGFkb3dTaXplLmhlaWdodCgpIC0ga2VybmVsU2l6ZSk7
CisgICAgICAgIHNoYWRvd0NvbG9yID0gY29sb3JXaXRoT3ZlcnJpZGVBbHBoYShzaGFkb3dDb2xv
ci5yZ2IoKSwgKHNoYWRvd0NvbG9yLmFscGhhKCkgKiAgY29udGV4dC0+Z2V0QWxwaGEoKSkgLyAy
NTUuZik7CisKKyAgICAgICAgLy9kcmF3IHNoYWRvdyBpbnRvIGEgbmV3IEltYWdlQnVmZmVyCisg
ICAgICAgIE93blB0cjxJbWFnZUJ1ZmZlcj4gc2hhZG93QnVmZmVyID0gSW1hZ2VCdWZmZXI6OmNy
ZWF0ZShzaGFkb3dCdWZmZXJTaXplKTsKKyAgICAgICAgY2Fpcm9fdCogc2hhZG93Q29udGV4dCA9
IHNoYWRvd0J1ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICAgICAgY2Fp
cm9fc2V0X3NvdXJjZShzaGFkb3dDb250ZXh0LCBwYXR0ZXJuKTsKKyAgICAgICAgY2Fpcm9fdHJh
bnNsYXRlKHNoYWRvd0NvbnRleHQsIC1kc3RSZWN0LngoKSwgLWRzdFJlY3QueSgpKTsKKyAgICAg
ICAgY2Fpcm9fcmVjdGFuZ2xlKHNoYWRvd0NvbnRleHQsIDAsIDAsIGRzdFJlY3Qud2lkdGgoKSwg
ZHN0UmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGNhaXJvX2ZpbGwoc2hhZG93Q29udGV4dCk7CisK
KyAgICAgICAgY29udGV4dC0+Y3JlYXRlUGxhdGZvcm1TaGFkb3coc2hhZG93QnVmZmVyLnJlbGVh
c2UoKSwgc2hhZG93Q29sb3IsIHNoYWRvd1JlY3QsIGtlcm5lbFNpemUpOworICAgIH0KKyNlbmRp
ZgorCiAgICAgLy8gRHJhdyB0aGUgaW1hZ2UuCiAgICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCBkc3RS
ZWN0LngoKSwgZHN0UmVjdC55KCkpOwogICAgIGNhaXJvX3NldF9zb3VyY2UoY3IsIHBhdHRlcm4p
OwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0dyYXBoaWNzQ29udGV4
dEZpbHRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0
ZXJzL0dyYXBoaWNzQ29udGV4dEZpbHRlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvR3JhcGhpY3NDb250ZXh0RmlsdGVyLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgRGlyayBT
Y2h1bHplIDxrcml0QHdlYmtpdC5vcmc+CisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
ICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFpbnQgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2lmIEVOQUJMRShGSUxURVJTKQorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dEZpbHRlci5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0dyYXBoaWNzQ29udGV4dEZpbHRlcjo6R3JhcGhp
Y3NDb250ZXh0RmlsdGVyKCkKKyAgICA6IEZpbHRlcigpCit7Cit9CisKK1Bhc3NSZWZQdHI8R3Jh
cGhpY3NDb250ZXh0RmlsdGVyPiBHcmFwaGljc0NvbnRleHRGaWx0ZXI6OmNyZWF0ZSgpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBHcmFwaGljc0NvbnRleHRGaWx0ZXIoKSk7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShGSUxURVJTKQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0dyYXBoaWNzQ29udGV4dEZpbHRlci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9HcmFwaGlj
c0NvbnRleHRGaWx0ZXIuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZmlsdGVycy9HcmFwaGljc0NvbnRleHRGaWx0ZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw1MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgRGlyayBTY2h1bHplIDxrcml0QHdl
YmtpdC5vcmc+CisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFpbnQgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgR3JhcGhpY3NDb250ZXh0RmlsdGVyX2gKKyNk
ZWZpbmUgR3JhcGhpY3NDb250ZXh0RmlsdGVyX2gKKworI2lmIEVOQUJMRShGSUxURVJTKQorI2lu
Y2x1ZGUgIkZpbHRlci5oIgorI2luY2x1ZGUgIkZpbHRlckVmZmVjdC5oIgorI2luY2x1ZGUgIkZs
b2F0UmVjdC5oIgorCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYv
UmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0RmlsdGVyIDogcHVibGljIEZpbHRlciB7
CisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxHcmFwaGljc0NvbnRleHRG
aWx0ZXI+IGNyZWF0ZSgpOworCisgICAgICAgIGJvb2wgZWZmZWN0Qm91bmRpbmdCb3hNb2RlKCkg
eyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdm9pZCBjYWxjdWxhdGVFZmZlY3RTdWJSZWdpb24o
RmlsdGVyRWZmZWN0KikgeyB9CisgICAgICAgIEZsb2F0UmVjdCBmaWx0ZXJSZWdpb24oKSB7IHJl
dHVybiBGbG9hdFJlY3QoKTsgfQorICAgICAgICBGbG9hdFJlY3Qgc291cmNlSW1hZ2VSZWN0KCkg
eyByZXR1cm4gRmxvYXRSZWN0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEdyYXBoaWNz
Q29udGV4dEZpbHRlcigpOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShGSUxURVJTKQorCisjZW5kaWYgLy8gR3JhcGhpY3NDb250ZXh0RmlsdGVy
X2gKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDUwMzQ3KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMDktMTAtMzAgIERpcmsgU2NodWx6ZSAg
PGtyaXRAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBTb21lIHRlc3RzIGZvciBjYW52YXMgc2hhZG93LgorCisgICAgICAgICogZmFz
dC9jYW52YXMvY2FudmFzLXNoYWRvdy1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGZh
c3QvY2FudmFzL2NhbnZhcy1zaGFkb3cuaHRtbDogQWRkZWQuCisgICAgICAgICogZmFzdC9jYW52
YXMvc2NyaXB0LXRlc3RzL2NhbnZhcy1zaGFkb3cuanM6IEFkZGVkLgorCiAyMDA5LTEwLTMwICBT
aGluaWNoaXJvIEhhbWFqaSAgPGhhbWFqaUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy9jYW52YXMt
c2hhZG93LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZh
cy9jYW52YXMtc2hhZG93LWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2Zhc3QvY2FudmFzL2NhbnZhcy1zaGFkb3ctZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDE1IEBACitTb21lIHRlc3RzIGZvciBDYW52YXMgc2hhZG93cworCitPbiBzdWNjZXNz
LCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAi
VEVTVCBDT01QTEVURSIuCisKKworUEFTUyBpbWdkYXRhWzRdIGlzIDAKK1BBU1MgaW1nZGF0YVs1
XSBpcyAxMjgKK1BBU1MgaW1nZGF0YVs2XSBpcyAwCitQQVNTIGltZ2RhdGFbNF0gaXMgMAorUEFT
UyBpbWdkYXRhWzVdIGlzIDEyOAorUEFTUyBpbWdkYXRhWzZdIGlzIDAKK1BBU1Mgc3VjY2Vzc2Z1
bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9m
YXN0L2NhbnZhcy9jYW52YXMtc2hhZG93Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC9jYW52YXMvY2FudmFzLXNoYWRvdy5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVz
dHMvZmFzdC9jYW52YXMvY2FudmFzLXNoYWRvdy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDEzIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8
aHRtbD4KKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9qcy9yZXNvdXJj
ZXMvanMtdGVzdC1zdHlsZS5jc3MiPgorPHNjcmlwdCBzcmM9Ii4uL2pzL3Jlc291cmNlcy9qcy10
ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIGlkPSJkZXNjcmlwdGlv
biI+PC9wPgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRl
c3RzL2NhbnZhcy1zaGFkb3cuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uL2pzL3Jlc291
cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDog
TGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvc2NyaXB0LXRlc3RzL2NhbnZhcy1zaGFkb3cuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvc2NyaXB0LXRlc3RzL2NhbnZhcy1z
aGFkb3cuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy9zY3JpcHQt
dGVzdHMvY2FudmFzLXNoYWRvdy5qcwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNCBAQAorZGVz
Y3JpcHRpb24oIlNvbWUgdGVzdHMgZm9yIENhbnZhcyBzaGFkb3dzIik7Cit2YXIgY3R4ID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTsKKworY3R4LmZp
bGxTdHlsZSA9ICJncmVlbiI7CitjdHguZmlsbFJlY3QoMCwwLDEwMCwxMDApOworCitjdHguc2hh
ZG93Q29sb3IgPSAiZ3JlZW4iOworY3R4LnNoYWRvd09mZnNldFggPSAwOworY3R4LnNoYWRvd09m
ZnNldFkgPSAwOworY3R4LnNoYWRvd0JsdXIgPSAwOworCit2YXIgaW1hZ2VEYXRhID0gY3R4Lmdl
dEltYWdlRGF0YSgwLCAwLCAyMDAsIDUwKTsKK3ZhciBpbWdkYXRhID0gaW1hZ2VEYXRhLmRhdGE7
CitzaG91bGRCZSgiaW1nZGF0YVs0XSIsICIwIik7CitzaG91bGRCZSgiaW1nZGF0YVs1XSIsICIx
MjgiKTsKK3Nob3VsZEJlKCJpbWdkYXRhWzZdIiwgIjAiKTsKKworY3R4LmNsZWFyUmVjdCgwLDAs
MjAwLDUwKTsKKworY3R4LnNoYWRvd0NvbG9yID0gImdyZWVuIjsKK2N0eC5zaGFkb3dPZmZzZXRY
ID0gMTAwOworY3R4LnNoYWRvd09mZnNldFkgPSAwOworY3R4LnNoYWRvd0JsdXIgPSAyOworCitj
dHguZmlsbFN0eWxlID0gImdyZWVuIjsKK2N0eC5maWxsUmVjdCgwLDAsMTAwLDUwKTsKKworaW1h
Z2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgxMTAsIDEwLCA4MCwgMzApOworaW1nZGF0YSA9IGlt
YWdlRGF0YS5kYXRhOworc2hvdWxkQmUoImltZ2RhdGFbNF0iLCAiMCIpOworc2hvdWxkQmUoImlt
Z2RhdGFbNV0iLCAiMTI4Iik7CitzaG91bGRCZSgiaW1nZGF0YVs2XSIsICIwIik7CisKK3ZhciBz
dWNjZXNzZnVsbHlQYXJzZWQgPSB0cnVlOwo=
</data>
<flag name="review"
          id="23732"
          type_id="1"
          status="-"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42260</attachid>
            <date>2009-10-31 14:35:44 -0700</date>
            <delta_ts>2009-11-12 12:14:45 -0800</delta_ts>
            <desc>add GCFilter to the win build system</desc>
            <filename>shadows-win.patch</filename>
            <type>text/plain</type>
            <size>1266</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDM4MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMDktMTAtMzEgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbQ0FJ
Uk9dIHNoYWRvdyBzdXBwb3J0IGZvciBDYW52YXMgYW5kIFNWRworICAgICAgICBbaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwOTYwXQorCisgICAgICAgIEFkZHMgR3Jh
cGhpY3NDb250ZXh0RmlsdGVyIHRvIHRoZSBidWlsZCBzeXN0ZW0gb2Ygd2luZG93cy4KKyAgICAg
ICAgVGhpcyBpcyBuZWNjZXNzYXJ5IGZvciBhY3RpdmF0ZWQgc2hhZG93IHN1cHBvcnQgb24gV2lu
Q2Fpcm8uCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKwogMjAw
OS0xMC0zMCAgWm9sdGFuIEhvcnZhdGggIDx6b2x0YW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2Vi
Q29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3Jl
LnZjcHJvagkocmV2aXNpb24gNTAzODApCisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNv
cmUudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0yMzkzNyw2ICsyMzkzNywxNCBAQAogCQkJCQkJ
Pg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXGZpbHRlcnNcR3JhcGhpY3NDb250ZXh0RmlsdGVyLmNwcCINCisJCQkJ
CQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KKwkJCQkJCVJlbGF0aXZlUGF0aD0iLi5c
cGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xHcmFwaGljc0NvbnRleHRGaWx0ZXIuaCINCisJCQkJ
CQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5c
cGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xTb3VyY2VBbHBoYS5jcHAiDQogCQkJCQkJPg0KIAkJ
CQkJPC9GaWxlPg0K
</data>
<flag name="review"
          id="23771"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43089</attachid>
            <date>2009-11-12 12:14:45 -0800</date>
            <delta_ts>2009-11-12 21:39:22 -0800</delta_ts>
            <desc>Update patch for Simon Fraser and Eric Seidel&apos;s comments.</desc>
            <filename>shadow13.patch</filename>
            <type>text/plain</type>
            <size>26416</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDg4OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzggQEAKKzIwMDktMTEtMTIgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUB3ZWJr
aXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtDQUlST10gc2hhZG93IHN1cHBvcnQgZm9yIENhbnZhcyBhbmQgU1ZHLgorICAgICAgICBbaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwOTYwXQorCisgICAgICAgIElt
cGxlbWVudCBDYW52YXMvU1ZHIHNoYWRvdyBzdXBwb3J0IGZvciBDYWlyby4gIFRoaXMgcGF0Y2gK
KyAgICAgICAgdXNlcyB0aGUgZmlsdGVyIGNvZGUgZnJvbSBTVkcgRmlsdGVycy4gIFRoYXQgbWVh
bnMgdGhhdCBpdCBpcworICAgICAgICBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgZmlsdGVycyB0byBz
ZWUgdGhlIHNoYWRvd3MuCisKKyAgICAgICAgVGVzdDogZmFzdC9jYW52YXMvY2FudmFzLXNoYWRv
dy5odG1sCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBXZWJDb3JlLnZj
cHJvai9XZWJDb3JlLnZjcHJvajogQWRkIG5ldyBJbWFnZUJ1ZmZlckZpbHRlciBmaWxlcy4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5jcHA6CisgICAgICAg
IChHcmFwaGljc0NvbnRleHQ6OmNhbGN1bGF0ZVNoYWRvd0J1ZmZlckRpbWVuc2lvbnMpOiBOZXcg
aGVscGVyIHJvdXRpbmUuCisgICAgICAgIChXZWJDb3JlOjpzZXRQbGF0Zm9ybUZpbGwpOgorICAg
ICAgICAoV2ViQ29yZTo6c2V0UGxhdGZvcm1TdHJva2UpOgorICAgICAgICAoV2ViQ29yZTo6Y29w
eUNvbnRleHRQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmRyYXdQYXRoU2hhZG93KToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDo6ZHJhd1BhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OmNyZWF0ZVBsYXRmb3JtU2hhZG93KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jYWlyby9JbWFnZUNhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpk
cmF3KTogQWRkIGZpbHRlciBlZmZlY3QuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZmls
dGVycy9GaWx0ZXIuaDogQ29ycmVjdCAnY29uc3QnIHNpZ25hdHVyZXMuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9JbWFnZUJ1ZmZlckZpbHRlci5jcHA6IEFkZGVkLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvSW1hZ2VCdWZmZXJGaWx0ZXIuaDogQWRk
ZWQuCisgICAgICAgICogc3ZnL2dyYXBoaWNzL2ZpbHRlcnMvU1ZHRmlsdGVyLmNwcDogQ29ycmVj
dCAnY29uc3QnIHNpZ25hdHVyZXMuCisgICAgICAgICogc3ZnL2dyYXBoaWNzL2ZpbHRlcnMvU1ZH
RmlsdGVyLmg6IENvcnJlY3QgJ2NvbnN0JyBzaWduYXR1cmVzLgorCiAyMDA5LTExLTEyICBEYW5p
ZWwgQmF0ZXMgIDxkYmF0ZXNAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJp
biBBZGxlci4KSW5kZXg6IFdlYkNvcmUvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbQkocmV2aXNpb24gNTA4NjMpCisrKyBXZWJDb3JlL0dOVW1ha2Vm
aWxlLmFtCSh3b3JraW5nIGNvcHkpCkBAIC0yNjI1LDYgKzI2MjUsOCBAQCB3ZWJjb3JlX3NvdXJj
ZXMgKz0gXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0ZXIuaCBcCiAJ
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZpbHRlckVmZmVjdC5jcHAgXAogCVdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0ZXJFZmZlY3QuaCBcCisJV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0dyYXBoaWNzQ29udGV4dEZpbHRlci5jcHAgXAor
CVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9HcmFwaGljc0NvbnRleHRGaWx0ZXIu
aCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL1NvdXJjZUFscGhhLmNwcCBc
CiAJV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL1NvdXJjZUFscGhhLmggXAogCVdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9Tb3VyY2VHcmFwaGljLmNwcCBcCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDUwODYzKQorKysg
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAt
MjM5NDEsNiArMjM5NDEsMTQgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxl
DQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xmaWx0ZXJzXEltYWdl
QnVmZmVyRmlsdGVyLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0K
KwkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xJbWFnZUJ1
ZmZlckZpbHRlci5oIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJ
CQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xmaWx0ZXJzXFNvdXJjZUFscGhh
LmNwcCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCShyZXZpc2lvbiA1MDg2MykKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI4
Miw2ICsyODIsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIHZvaWQgc2V0QWxwaGEo
ZmxvYXQpOwogI2lmIFBMQVRGT1JNKENBSVJPKQogICAgICAgICBmbG9hdCBnZXRBbHBoYSgpOwor
ICAgICAgICB2b2lkIGNyZWF0ZVBsYXRmb3JtU2hhZG93KFBhc3NPd25QdHI8SW1hZ2VCdWZmZXI+
IGJ1ZmZlciwgY29uc3QgQ29sb3ImIHNoYWRvd0NvbG9yLCBjb25zdCBGbG9hdFJlY3QmIHNoYWRv
d1JlY3QsIGZsb2F0IGtlcm5lbFNpemUpOworICAgICAgICBzdGF0aWMgdm9pZCBjYWxjdWxhdGVT
aGFkb3dCdWZmZXJEaW1lbnNpb25zKEludFNpemUmIHNoYWRvd0J1ZmZlclNpemUsIEZsb2F0UmVj
dCYgc2hhZG93UmVjdCwgZmxvYXQmIGtlcm5lbFNpemUsIGNvbnN0IEZsb2F0UmVjdCYgc291cmNl
UmVjdCwgY29uc3QgSW50U2l6ZSYgc2hhZG93U2l6ZSwgaW50IHNoYWRvd0JsdXIpOwogI2VuZGlm
CiAKICAgICAgICAgdm9pZCBzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3Ip
OwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRD
YWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9H
cmFwaGljc0NvbnRleHRDYWlyby5jcHAJKHJldmlzaW9uIDUwODYzKQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEsOCArMSw5IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1
dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA3IEFs
cCBUb2tlciA8YWxwQGF0b2tlci5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggRGlyayBTY2h1
bHplIDx2YnM4NUBnbXguZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgRGlyayBTY2h1
bHplIDxrcml0QHdlYmtpdC5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggTnVhbnRpIEx0ZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtIDxiZnVsZ2hhbUB3ZWJraXQub3Jn
PgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMiwxNCArMzMsMTcgQEAKICNp
ZiBQTEFURk9STShDQUlSTykKIAogI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgorI2luY2x1ZGUgIkZF
R2F1c3NpYW5CbHVyLmgiCiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5jbHVkZSAiRm9udC5o
IgogI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXJGaWx0ZXIu
aCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNp
bmNsdWRlICJQYXRoLmgiCiAjaW5jbHVkZSAiUGF0dGVybi5oIgogI2luY2x1ZGUgIlNpbXBsZUZv
bnREYXRhLmgiCisjaW5jbHVkZSAiU291cmNlR3JhcGhpYy5oIgogI2luY2x1ZGUgIlRyYW5zZm9y
bWF0aW9uTWF0cml4LmgiCiAKICNpbmNsdWRlIDxjYWlyby5oPgpAQCAtNjksNiArNzMsNTUgQEAg
c3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJvX3QqIGNyLAogICAgIGNhaXJvX3NldF9z
b3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogfQogCitzdGF0aWMgaW5s
aW5lIHZvaWQgc2V0UGxhdGZvcm1GaWxsKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY2Fpcm9f
dCogY3IsIEdyYXBoaWNzQ29udGV4dFByaXZhdGUqIGdjcCkKK3sKKyAgICBzd2l0Y2ggKGdjcC0+
c3RhdGUuZmlsbFR5cGUpIHsKKyAgICBjYXNlIFNvbGlkQ29sb3JUeXBlOiB7CisgICAgICAgIENv
bG9yIGZpbGxDb2xvciA9IGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoY29udGV4dC0+ZmlsbENvbG9y
KCkucmdiKCksIGNvbnRleHQtPmZpbGxDb2xvcigpLmFscGhhKCkgLyAyNTUuZiAqIGdjcC0+c3Rh
dGUuZ2xvYmFsQWxwaGEpOworICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKTsKKyAgICAg
ICAgY2Fpcm9fZmlsbF9wcmVzZXJ2ZShjcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBj
YXNlIFBhdHRlcm5UeXBlOiB7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGFmZmluZTsK
KyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZShjciwgZ2NwLT5zdGF0ZS5maWxsUGF0dGVybi0+Y3Jl
YXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpOworICAgICAgICBjYWlyb19jbGlwX3ByZXNlcnZl
KGNyKTsKKyAgICAgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgZ2NwLT5zdGF0ZS5nbG9i
YWxBbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdyYWRpZW50VHlwZToK
KyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZShjciwgZ2NwLT5zdGF0ZS5maWxsR3JhZGllbnQtPnBs
YXRmb3JtR3JhZGllbnQoKSk7CisgICAgICAgIGNhaXJvX2NsaXBfcHJlc2VydmUoY3IpOworICAg
ICAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBnY3AtPnN0YXRlLmdsb2JhbEFscGhhKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0UGxhdGZv
cm1TdHJva2UoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjYWlyb190KiBjciwgR3JhcGhpY3ND
b250ZXh0UHJpdmF0ZSogZ2NwKQoreworICAgIHN3aXRjaCAoZ2NwLT5zdGF0ZS5zdHJva2VUeXBl
KSB7CisgICAgY2FzZSBTb2xpZENvbG9yVHlwZTogeworICAgICAgICBDb2xvciBzdHJva2VDb2xv
ciA9IGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoY29udGV4dC0+c3Ryb2tlQ29sb3IoKS5yZ2IoKSwg
Y29udGV4dC0+c3Ryb2tlQ29sb3IoKS5hbHBoYSgpIC8gMjU1LmYgKiBnY3AtPnN0YXRlLmdsb2Jh
bEFscGhhKTsKKyAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIGNhc2UgUGF0dGVyblR5cGU6IHsKKyAgICAgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggYWZmaW5lOworICAgICAgICBjYWlyb19zZXRfc291cmNlKGNyLCBnY3AtPnN0YXRl
LnN0cm9rZVBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZpbmUpKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICAgIGNhc2UgR3JhZGllbnRUeXBlOgorICAgICAgICBjYWlyb19zZXRf
c291cmNlKGNyLCBnY3AtPnN0YXRlLnN0cm9rZUdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCkp
OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGdjcC0+c3RhdGUuZ2xvYmFsQWxwaGEg
PCAxLjBmICYmIGdjcC0+c3RhdGUuc3Ryb2tlVHlwZSAhPSBTb2xpZENvbG9yVHlwZSkgeworICAg
ICAgICBjYWlyb19wdXNoX2dyb3VwKGNyKTsKKyAgICAgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBo
YShjciwgZ2NwLT5zdGF0ZS5nbG9iYWxBbHBoYSk7CisgICAgICAgIGNhaXJvX3BvcF9ncm91cF90
b19zb3VyY2UoY3IpOworICAgIH0KKyAgICBjYWlyb19zdHJva2VfcHJlc2VydmUoY3IpOworfQor
CiAvLyBBIGZpbGxSZWN0IGhlbHBlcgogc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNl
T3ZlcihjYWlyb190KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29s
KQogewpAQCAtNzgsNiArMTMxLDczIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNvdXJj
ZU92ZXIoY2EKICAgICBjYWlyb19maWxsKGNyKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNv
cHlDb250ZXh0UHJvcGVydGllcyhjYWlyb190KiBzcmNDciwgY2Fpcm9fdCogZHN0Q3IpCit7Cisg
ICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhkc3RDciwgY2Fpcm9fZ2V0X2FudGlhbGlhcyhzcmNDcikp
OworICAgIGRvdWJsZSBkYXNoZXMsIG9mZnNldDsKKyAgICBjYWlyb19nZXRfZGFzaChzcmNDciwg
JmRhc2hlcywgJm9mZnNldCk7CisgICAgY2Fpcm9fc2V0X2Rhc2goZHN0Q3IsICZkYXNoZXMsIGNh
aXJvX2dldF9kYXNoX2NvdW50KHNyY0NyKSwgb2Zmc2V0KTsKKyAgICBjYWlyb19zZXRfbGluZV9j
YXAoZHN0Q3IsIGNhaXJvX2dldF9saW5lX2NhcChzcmNDcikpOworICAgIGNhaXJvX3NldF9saW5l
X2pvaW4oZHN0Q3IsIGNhaXJvX2dldF9saW5lX2pvaW4oc3JjQ3IpKTsKKyAgICBjYWlyb19zZXRf
bGluZV93aWR0aChkc3RDciwgY2Fpcm9fZ2V0X2xpbmVfd2lkdGgoc3JjQ3IpKTsKKyAgICBjYWly
b19zZXRfbWl0ZXJfbGltaXQoZHN0Q3IsIGNhaXJvX2dldF9taXRlcl9saW1pdChzcmNDcikpOwor
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoZHN0Q3IsIGNhaXJvX2dldF9maWxsX3J1bGUoc3JjQ3Ip
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNhbGN1bGF0ZVNoYWRvd0J1ZmZlckRpbWVu
c2lvbnMoSW50U2l6ZSYgc2hhZG93QnVmZmVyU2l6ZSwgRmxvYXRSZWN0JiBzaGFkb3dSZWN0LCBm
bG9hdCYga2VybmVsU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRT
aXplJiBzaGFkb3dTaXplLCBpbnQgc2hhZG93Qmx1cikKK3sKKyNpZiBFTkFCTEUoRklMVEVSUykK
KyAgICAvLyBjYWxjdWxhdGUgdGhlIGtlcm5lbCBzaXplIGFjY29yZGluZyB0byB0aGUgSFRNTDUg
Y2FudmFzIHNoYWRvdyBzcGVjaWZpY2F0aW9uCisgICAga2VybmVsU2l6ZSA9IChzaGFkb3dCbHVy
IDwgOCA/IHNoYWRvd0JsdXIgLyAyLmYgOiBzcXJ0KHNoYWRvd0JsdXIgKiAyLmYpKTsKKyAgICBp
bnQgYmx1clJhZGl1cyA9IGNlaWwoa2VybmVsU2l6ZSk7CisKKyAgICBzaGFkb3dCdWZmZXJTaXpl
ID0gSW50U2l6ZShzb3VyY2VSZWN0LndpZHRoKCkgKyBibHVyUmFkaXVzICogMiwgc291cmNlUmVj
dC5oZWlnaHQoKSArIGJsdXJSYWRpdXMgKiAyKTsKKworICAgIC8vIGRldGVybWluZSBkaW1lbnNp
b25zIG9mIHNoYWRvdyByZWN0CisgICAgc2hhZG93UmVjdCA9IEZsb2F0UmVjdChzb3VyY2VSZWN0
LmxvY2F0aW9uKCksIHNoYWRvd0J1ZmZlclNpemUpOworICAgIHNoYWRvd1JlY3QubW92ZShzaGFk
b3dTaXplLndpZHRoKCkgLSBrZXJuZWxTaXplLCBzaGFkb3dTaXplLmhlaWdodCgpIC0ga2VybmVs
U2l6ZSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRyYXdQYXRoU2hhZG93KEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwgR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSogZ2NwLCBib29s
IGZpbGxTaGFkb3csIGJvb2wgc3Ryb2tlU2hhZG93KQoreworI2lmIEVOQUJMRShGSUxURVJTKQor
ICAgIEludFNpemUgc2hhZG93U2l6ZTsKKyAgICBpbnQgc2hhZG93Qmx1cjsKKyAgICBDb2xvciBz
aGFkb3dDb2xvcjsKKyAgICBpZiAoY29udGV4dC0+Z2V0U2hhZG93KHNoYWRvd1NpemUsIHNoYWRv
d0JsdXIsIHNoYWRvd0NvbG9yKSkgeworICAgICAgICAvL2NhbGN1bGF0ZSBmaWx0ZXIgdmFsdWVz
CisgICAgICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAg
ICAgIGNhaXJvX3BhdGhfdCogcGF0aCA9IGNhaXJvX2NvcHlfcGF0aChjcik7CisgICAgICAgIGRv
dWJsZSB4MCwgeDEsIHkwLCB5MTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tlX2V4dGVudHMoY3IsICZ4
MCwgJnkwLCAmeDEsICZ5MSk7CisgICAgICAgIEZsb2F0UmVjdCByZWN0KHgwLCB5MCwgeDEgLSB4
MCwgeTEgLSB5MCk7CisKKyAgICAgICAgSW50U2l6ZSBzaGFkb3dCdWZmZXJTaXplOworICAgICAg
ICBGbG9hdFJlY3Qgc2hhZG93UmVjdDsKKyAgICAgICAgZmxvYXQga2VybmVsU2l6ZSAoMC4wKTsK
KyAgICAgICAgR3JhcGhpY3NDb250ZXh0OjpjYWxjdWxhdGVTaGFkb3dCdWZmZXJEaW1lbnNpb25z
KHNoYWRvd0J1ZmZlclNpemUsIHNoYWRvd1JlY3QsIGtlcm5lbFNpemUsIHJlY3QsIHNoYWRvd1Np
emUsIHNoYWRvd0JsdXIpOworCisgICAgICAgIC8vIGNyZWF0ZSBzdWl0YWJseS1zaXplZCBJbWFn
ZUJ1ZmZlciB0byBob2xkIHRoZSBzaGFkb3cKKyAgICAgICAgT3duUHRyPEltYWdlQnVmZmVyPiBz
aGFkb3dCdWZmZXIgPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKHNoYWRvd0J1ZmZlclNpemUpOworCisg
ICAgICAgIC8vZHJhdyBzaGFkb3cgaW50byBhIG5ldyBJbWFnZUJ1ZmZlcgorICAgICAgICBjYWly
b190KiBzaGFkb3dDb250ZXh0ID0gc2hhZG93QnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29u
dGV4dCgpOworICAgICAgICBjb3B5Q29udGV4dFByb3BlcnRpZXMoY3IsIHNoYWRvd0NvbnRleHQp
OworICAgICAgICBjYWlyb190cmFuc2xhdGUoc2hhZG93Q29udGV4dCwgLXJlY3QueCgpICsga2Vy
bmVsU2l6ZSwgLXJlY3QueSgpICsga2VybmVsU2l6ZSk7CisgICAgICAgIGNhaXJvX25ld19wYXRo
KHNoYWRvd0NvbnRleHQpOworICAgICAgICBjYWlyb19hcHBlbmRfcGF0aChzaGFkb3dDb250ZXh0
LCBwYXRoKTsKKworICAgICAgICBpZiAoZmlsbFNoYWRvdykKKyAgICAgICAgICAgIHNldFBsYXRm
b3JtRmlsbChjb250ZXh0LCBzaGFkb3dDb250ZXh0LCBnY3ApOworICAgICAgICBpZiAoc3Ryb2tl
U2hhZG93KQorICAgICAgICAgICAgc2V0UGxhdGZvcm1TdHJva2UoY29udGV4dCwgc2hhZG93Q29u
dGV4dCwgZ2NwKTsKKworICAgICAgICBjb250ZXh0LT5jcmVhdGVQbGF0Zm9ybVNoYWRvdyhzaGFk
b3dCdWZmZXIucmVsZWFzZSgpLCBzaGFkb3dDb2xvciwgc2hhZG93UmVjdCwga2VybmVsU2l6ZSk7
CisgICAgfQorI2VuZGlmCit9CisKIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBs
YXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjcikKICAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNz
Q29udGV4dFByaXZhdGUoKSkKICAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlKQpAQCAtMzg3LDMwICs1MDcsMTIgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZp
bGxQYXRoKCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OwotICAgIGNhaXJvX3NhdmUoY3IpOwogCiAgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgZmls
bFJ1bGUoKSA9PSBSVUxFX0VWRU5PREQgPyBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQgOiBDQUlS
T19GSUxMX1JVTEVfV0lORElORyk7Ci0gICAgc3dpdGNoIChtX2NvbW1vbi0+c3RhdGUuZmlsbFR5
cGUpIHsKLSAgICBjYXNlIFNvbGlkQ29sb3JUeXBlOgotICAgICAgICBzZXRDb2xvcihjciwgZmls
bENvbG9yKCkpOwotICAgICAgICBjYWlyb19jbGlwKGNyKTsKLSAgICAgICAgY2Fpcm9fcGFpbnRf
d2l0aF9hbHBoYShjciwgbV9jb21tb24tPnN0YXRlLmdsb2JhbEFscGhhKTsKLSAgICAgICAgYnJl
YWs7Ci0gICAgY2FzZSBQYXR0ZXJuVHlwZTogewotICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBhZmZpbmU7Ci0gICAgICAgIGNhaXJvX3NldF9zb3VyY2UoY3IsIG1fY29tbW9uLT5zdGF0ZS5m
aWxsUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGFmZmluZSkpOwotICAgICAgICBjYWly
b19jbGlwKGNyKTsKLSAgICAgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9jb21tb24t
PnN0YXRlLmdsb2JhbEFscGhhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgR3Jh
ZGllbnRUeXBlOgotICAgICAgICBjYWlyb19wYXR0ZXJuX3QqIHBhdHRlcm4gPSBtX2NvbW1vbi0+
c3RhdGUuZmlsbEdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCk7Ci0gICAgICAgIGNhaXJvX3Nl
dF9zb3VyY2UoY3IsIHBhdHRlcm4pOwotICAgICAgICBjYWlyb19jbGlwKGNyKTsKLSAgICAgICAg
Y2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9jb21tb24tPnN0YXRlLmdsb2JhbEFscGhhKTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworICAgIGRyYXdQ
YXRoU2hhZG93KHRoaXMsIG1fY29tbW9uLCB0cnVlLCBmYWxzZSk7CisKKyAgICBzZXRQbGF0Zm9y
bUZpbGwodGhpcywgY3IsIG1fY29tbW9uKTsKKyAgICBjYWlyb19uZXdfcGF0aChjcik7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKCkKQEAgLTQxOSw0NSArNTIxLDI2IEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKCkKICAgICAgICAgcmV0dXJuOwogCiAg
ICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIHN3
aXRjaCAobV9jb21tb24tPnN0YXRlLnN0cm9rZVR5cGUpIHsKLSAgICBjYXNlIFNvbGlkQ29sb3JU
eXBlOgotICAgICAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICAgICAgc3Ry
b2tlQ29sb3IoKS5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgaWYg
KG1fY29tbW9uLT5zdGF0ZS5nbG9iYWxBbHBoYSA8IDEuMGYpCi0gICAgICAgICAgICBhbHBoYSAq
PSBtX2NvbW1vbi0+c3RhdGUuZ2xvYmFsQWxwaGE7Ci0gICAgICAgIGNhaXJvX3NldF9zb3VyY2Vf
cmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICBjYWlyb19zdHJva2Uo
Y3IpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBhdHRlcm5UeXBlOiB7Ci0gICAgICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IGFmZmluZTsKLSAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZShjciwg
bV9jb21tb24tPnN0YXRlLnN0cm9rZVBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihhZmZp
bmUpKTsKLSAgICAgICAgaWYgKG1fY29tbW9uLT5zdGF0ZS5nbG9iYWxBbHBoYSA8IDEuMGYpIHsK
LSAgICAgICAgICAgIGNhaXJvX3B1c2hfZ3JvdXAoY3IpOwotICAgICAgICAgICAgY2Fpcm9fcGFp
bnRfd2l0aF9hbHBoYShjciwgbV9jb21tb24tPnN0YXRlLmdsb2JhbEFscGhhKTsKLSAgICAgICAg
ICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3IpOwotICAgICAgICB9Ci0gICAgICAgIGNh
aXJvX3N0cm9rZShjcik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEdyYWRpZW50
VHlwZToKLSAgICAgICAgY2Fpcm9fcGF0dGVybl90KiBwYXR0ZXJuID0gbV9jb21tb24tPnN0YXRl
LnN0cm9rZUdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCk7Ci0gICAgICAgIGNhaXJvX3NldF9z
b3VyY2UoY3IsIHBhdHRlcm4pOwotICAgICAgICBpZiAobV9jb21tb24tPnN0YXRlLmdsb2JhbEFs
cGhhIDwgMS4wZikgewotICAgICAgICAgICAgY2Fpcm9fcHVzaF9ncm91cChjcik7Ci0gICAgICAg
ICAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBtX2NvbW1vbi0+c3RhdGUuZ2xvYmFsQWxw
aGEpOwotICAgICAgICAgICAgY2Fpcm9fcG9wX2dyb3VwX3RvX3NvdXJjZShjcik7Ci0gICAgICAg
IH0KLSAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAg
IGNhaXJvX3Jlc3RvcmUoY3IpOworICAgIGRyYXdQYXRoU2hhZG93KHRoaXMsIG1fY29tbW9uLCBm
YWxzZSwgdHJ1ZSk7CisKKyAgICBzZXRQbGF0Zm9ybVN0cm9rZSh0aGlzLCBjciwgbV9jb21tb24p
OworICAgIGNhaXJvX25ld19wYXRoKGNyKTsKKwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZHJhd1BhdGgoKQogewotICAgIGZpbGxQYXRoKCk7Ci0gICAgc3Ryb2tlUGF0aCgpOworICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNy
ID0gbV9kYXRhLT5jcjsKKworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIGZpbGxSdWxlKCkg
PT0gUlVMRV9FVkVOT0REID8gQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REIDogQ0FJUk9fRklMTF9S
VUxFX1dJTkRJTkcpOworICAgIGRyYXdQYXRoU2hhZG93KHRoaXMsIG1fY29tbW9uLCB0cnVlLCB0
cnVlKTsKKworICAgIHNldFBsYXRmb3JtRmlsbCh0aGlzLCBjciwgbV9jb21tb24pOworICAgIHNl
dFBsYXRmb3JtU3Ryb2tlKHRoaXMsIGNyLCBtX2NvbW1vbik7CisgICAgY2Fpcm9fbmV3X3BhdGgo
Y3IpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0
JiByZWN0KQpAQCAtNzI2LDkgKzgwOSw0OCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFRv
SW1hZ2VCdWZmZXIoCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldFBsYXRmb3JtU2hhZG93KEludFNpemUgY29uc3QmLCBpbnQsIENvbG9yIGNvbnN0
JiwgQ29sb3JTcGFjZSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyhJ
bnRTaXplIGNvbnN0JiBzaXplLCBpbnQsIENvbG9yIGNvbnN0JiwgQ29sb3JTcGFjZSkKIHsKLSAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIC8vIENhaXJvIGRvZXNuJ3Qgc3VwcG9ydCBzaGFkb3dz
IG5hdGl2ZWx5LCB0aGV5IGFyZSBkcmF3biBtYW51YWxseSBpbiB0aGUgZHJhdyoKKyAgICAvLyBm
dW5jdGlvbnMKKworICAgIGlmIChtX2NvbW1vbi0+c3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9y
bXMpIHsKKyAgICAgICAgLy8gTWVhbmluZyB0aGF0IHRoaXMgZ3JhcGhpY3MgY29udGV4dCBpcyBh
c3NvY2lhdGVkIHdpdGggYSBDYW52YXNSZW5kZXJpbmdDb250ZXh0CisgICAgICAgIC8vIFdlIGZs
aXAgdGhlIGhlaWdodCBzaW5jZSBDRyBhbmQgSFRNTDUgQ2FudmFzIGhhdmUgb3Bwb3NpdGUgWSBh
eGlzCisgICAgICAgIG1fY29tbW9uLT5zdGF0ZS5zaGFkb3dTaXplID0gSW50U2l6ZShzaXplLndp
ZHRoKCksIC1zaXplLmhlaWdodCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpjcmVhdGVQbGF0Zm9ybVNoYWRvdyhQYXNzT3duUHRyPEltYWdlQnVmZmVyPiBidWZmZXIsIGNv
bnN0IENvbG9yJiBzaGFkb3dDb2xvciwgY29uc3QgRmxvYXRSZWN0JiBzaGFkb3dSZWN0LCBmbG9h
dCBrZXJuZWxTaXplKQoreworI2lmIEVOQUJMRShGSUxURVJTKQorICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKKworICAgIC8vIGRyYXcgdGhlIHNoYWRvdyB3aXRob3V0IGJsdXJyaW5nLCBp
ZiBrZXJuZWxTaXplIGlzIHplcm8KKyAgICBpZiAoIWtlcm5lbFNpemUpIHsKKyAgICAgICAgc2V0
Q29sb3IoY3IsIHNoYWRvd0NvbG9yKTsKKyAgICAgICAgY2Fpcm9fbWFza19zdXJmYWNlKGNyLCBi
dWZmZXItPmltYWdlKCktPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCksIHNoYWRvd1JlY3Qu
eCgpLCBzaGFkb3dSZWN0LnkoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBs
aW1pdCBrZXJuZWwgc2l6ZSB0byAxMDAwLCB0aGlzIGlzIHdoYXQgQ0cgaXMgZG9pbmcuCisgICAg
a2VybmVsU2l6ZSA9IHN0ZDo6bWluKDEwMDAuZiwga2VybmVsU2l6ZSk7CisKKyAgICAvLyBjcmVh
dGUgZmlsdGVyCisgICAgUmVmUHRyPEZpbHRlcj4gZmlsdGVyID0gSW1hZ2VCdWZmZXJGaWx0ZXI6
OmNyZWF0ZSgpOworICAgIGZpbHRlci0+c2V0U291cmNlSW1hZ2UoYnVmZmVyLnJlbGVhc2UoKSk7
CisgICAgUmVmUHRyPEZpbHRlckVmZmVjdD4gc291cmNlID0gU291cmNlR3JhcGhpYzo6Y3JlYXRl
KCk7CisgICAgc291cmNlLT5zZXRTdWJSZWdpb24oRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgc2hh
ZG93UmVjdC5zaXplKCkpKTsKKyAgICBzb3VyY2UtPnNldElzQWxwaGFJbWFnZSh0cnVlKTsKKyAg
ICBSZWZQdHI8RmlsdGVyRWZmZWN0PiBibHVyID0gRkVHYXVzc2lhbkJsdXI6OmNyZWF0ZShzb3Vy
Y2UuZ2V0KCksIGtlcm5lbFNpemUsIGtlcm5lbFNpemUpOworICAgIGJsdXItPnNldFN1YlJlZ2lv
bihGbG9hdFJlY3QoRmxvYXRQb2ludCgpLCBzaGFkb3dSZWN0LnNpemUoKSkpOworICAgIGJsdXIt
PmFwcGx5KGZpbHRlci5nZXQoKSk7CisKKyAgICAvLyBNYXNrIHRoZSBmaWx0ZXIgd2l0aCB0aGUg
c2hhZG93IGNvbG9yIGFuZCBkcmF3IGl0IHRvIHRoZSBjb250ZXh0LgorICAgIC8vIE1hc2tpbmcg
bWFrZXMgaXQgcG9zc2libGUgdG8ganVzdCBibHVyIHRoZSBhbHBoYSBjaGFubmVsLgorICAgIHNl
dENvbG9yKGNyLCBzaGFkb3dDb2xvcik7CisgICAgY2Fpcm9fbWFza19zdXJmYWNlKGNyLCBibHVy
LT5yZXN1bHRJbWFnZSgpLT5pbWFnZSgpLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpLCBz
aGFkb3dSZWN0LngoKSwgc2hhZG93UmVjdC55KCkpOworI2VuZGlmCiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpjbGVhclBsYXRmb3JtU2hhZG93KCkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2Fpcm8vSW1hZ2VDYWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jYWlyby9JbWFnZUNhaXJvLmNwcAkocmV2aXNpb24gNTA4NjMpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0ltYWdlQ2Fpcm8uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzIsNiArMTMyLDMwIEBAIHZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3ND
b250ZXh0KiAKICAgICBjYWlyb19tYXRyaXhfdCBtYXRyaXggPSB7IHNjYWxlWCwgMCwgMCwgc2Nh
bGVZLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCkgfTsKICAgICBjYWlyb19wYXR0ZXJuX3NldF9t
YXRyaXgocGF0dGVybiwgJm1hdHJpeCk7CiAKKyAgICAvLyBEcmF3IHRoZSBzaGFkb3cKKyNpZiBF
TkFCTEUoRklMVEVSUykKKyAgICBJbnRTaXplIHNoYWRvd1NpemU7CisgICAgaW50IHNoYWRvd0Js
dXI7CisgICAgQ29sb3Igc2hhZG93Q29sb3I7CisgICAgaWYgKGNvbnRleHQtPmdldFNoYWRvdyhz
aGFkb3dTaXplLCBzaGFkb3dCbHVyLCBzaGFkb3dDb2xvcikpIHsKKyAgICAgICAgSW50U2l6ZSBz
aGFkb3dCdWZmZXJTaXplOworICAgICAgICBGbG9hdFJlY3Qgc2hhZG93UmVjdDsKKyAgICAgICAg
ZmxvYXQga2VybmVsU2l6ZSAoMC4wKTsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0OjpjYWxjdWxh
dGVTaGFkb3dCdWZmZXJEaW1lbnNpb25zKHNoYWRvd0J1ZmZlclNpemUsIHNoYWRvd1JlY3QsIGtl
cm5lbFNpemUsIGRzdFJlY3QsIHNoYWRvd1NpemUsIHNoYWRvd0JsdXIpOworICAgICAgICBzaGFk
b3dDb2xvciA9IGNvbG9yV2l0aE92ZXJyaWRlQWxwaGEoc2hhZG93Q29sb3IucmdiKCksIChzaGFk
b3dDb2xvci5hbHBoYSgpICogIGNvbnRleHQtPmdldEFscGhhKCkpIC8gMjU1LmYpOworCisgICAg
ICAgIC8vZHJhdyBzaGFkb3cgaW50byBhIG5ldyBJbWFnZUJ1ZmZlcgorICAgICAgICBPd25QdHI8
SW1hZ2VCdWZmZXI+IHNoYWRvd0J1ZmZlciA9IEltYWdlQnVmZmVyOjpjcmVhdGUoc2hhZG93QnVm
ZmVyU2l6ZSk7CisgICAgICAgIGNhaXJvX3QqIHNoYWRvd0NvbnRleHQgPSBzaGFkb3dCdWZmZXIt
PmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgICAgIGNhaXJvX3NldF9zb3VyY2Uo
c2hhZG93Q29udGV4dCwgcGF0dGVybik7CisgICAgICAgIGNhaXJvX3RyYW5zbGF0ZShzaGFkb3dD
b250ZXh0LCAtZHN0UmVjdC54KCksIC1kc3RSZWN0LnkoKSk7CisgICAgICAgIGNhaXJvX3JlY3Rh
bmdsZShzaGFkb3dDb250ZXh0LCAwLCAwLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0
KCkpOworICAgICAgICBjYWlyb19maWxsKHNoYWRvd0NvbnRleHQpOworCisgICAgICAgIGNvbnRl
eHQtPmNyZWF0ZVBsYXRmb3JtU2hhZG93KHNoYWRvd0J1ZmZlci5yZWxlYXNlKCksIHNoYWRvd0Nv
bG9yLCBzaGFkb3dSZWN0LCBrZXJuZWxTaXplKTsKKyAgICB9CisjZW5kaWYKKwogICAgIC8vIERy
YXcgdGhlIGltYWdlLgogICAgIGNhaXJvX3RyYW5zbGF0ZShjciwgZHN0UmVjdC54KCksIGRzdFJl
Y3QueSgpKTsKICAgICBjYWlyb19zZXRfc291cmNlKGNyLCBwYXR0ZXJuKTsKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0ZXIuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRmlsdGVyLmgJKHJldmlzaW9uIDUwODYzKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZpbHRlci5oCSh3b3JraW5nIGNv
cHkpCkBAIC00MCwxMiArNDAsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lk
IHNldFNvdXJjZUltYWdlKFBhc3NPd25QdHI8SW1hZ2VCdWZmZXI+IHNvdXJjZUltYWdlKSB7IG1f
c291cmNlSW1hZ2UgPSBzb3VyY2VJbWFnZTsgfQogICAgICAgICBJbWFnZUJ1ZmZlciogc291cmNl
SW1hZ2UoKSB7IHJldHVybiBtX3NvdXJjZUltYWdlLmdldCgpOyB9CiAKLSAgICAgICAgdmlydHVh
bCBGbG9hdFJlY3Qgc291cmNlSW1hZ2VSZWN0KCkgPSAwOwotICAgICAgICB2aXJ0dWFsIEZsb2F0
UmVjdCBmaWx0ZXJSZWdpb24oKSA9IDA7CisgICAgICAgIHZpcnR1YWwgRmxvYXRSZWN0IHNvdXJj
ZUltYWdlUmVjdCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBGbG9hdFJlY3QgZmlsdGVy
UmVnaW9uKCkgY29uc3QgPSAwOwogCiAgICAgICAgIC8vIFNWRyBzcGVjaWZpYwotICAgICAgICB2
aXJ0dWFsIHZvaWQgY2FsY3VsYXRlRWZmZWN0U3ViUmVnaW9uKEZpbHRlckVmZmVjdCopID0gMDsK
LSAgICAgICAgdmlydHVhbCBib29sIGVmZmVjdEJvdW5kaW5nQm94TW9kZSgpID0gMDsKKyAgICAg
ICAgdmlydHVhbCB2b2lkIGNhbGN1bGF0ZUVmZmVjdFN1YlJlZ2lvbihGaWx0ZXJFZmZlY3QqKSBj
b25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBlZmZlY3RCb3VuZGluZ0JveE1vZGUoKSBj
b25zdCA9IDA7CiAKICAgICBwcml2YXRlOgogICAgICAgICBPd25QdHI8SW1hZ2VCdWZmZXI+IG1f
c291cmNlSW1hZ2U7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvSW1h
Z2VCdWZmZXJGaWx0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZmlsdGVycy9JbWFnZUJ1ZmZlckZpbHRlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvSW1hZ2VCdWZmZXJGaWx0ZXIuY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOSBEaXJrIFNj
aHVsemUgPGtyaXRAd2Via2l0Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgQnJlbnQgRnVs
Z2hhbSA8YmZ1bGdoYW1Ad2Via2l0Lm9yZz4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWludCB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorCisjaWYgRU5BQkxFKEZJTFRFUlMpCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXJGaWx0ZXIuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbWFnZUJ1ZmZlckZpbHRlcjo6SW1hZ2VCdWZmZXJG
aWx0ZXIoKQorICAgIDogRmlsdGVyKCkKK3sKK30KKworUGFzc1JlZlB0cjxJbWFnZUJ1ZmZlckZp
bHRlcj4gSW1hZ2VCdWZmZXJGaWx0ZXI6OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBJbWFnZUJ1ZmZlckZpbHRlcigpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gRU5BQkxFKEZJTFRFUlMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2ZpbHRlcnMvSW1hZ2VCdWZmZXJGaWx0ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvSW1hZ2VCdWZmZXJGaWx0ZXIuaAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9JbWFnZUJ1ZmZlckZpbHRlci5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAw
OSBEaXJrIFNjaHVsemUgPGtyaXRAd2Via2l0Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkg
QnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1Ad2Via2l0Lm9yZz4KKyAqCisgKiAgIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWludCB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBJ
bWFnZUJ1ZmZlckZpbHRlcl9oCisjZGVmaW5lIEltYWdlQnVmZmVyRmlsdGVyX2gKKworI2lmIEVO
QUJMRShGSUxURVJTKQorI2luY2x1ZGUgIkZpbHRlci5oIgorI2luY2x1ZGUgIkZpbHRlckVmZmVj
dC5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgSW1hZ2VCdWZmZXJGaWx0ZXIgOiBw
dWJsaWMgRmlsdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPElt
YWdlQnVmZmVyRmlsdGVyPiBjcmVhdGUoKTsKKworICAgICAgICB2aXJ0dWFsIEZsb2F0UmVjdCBm
aWx0ZXJSZWdpb24oKSBjb25zdCB7IHJldHVybiBGbG9hdFJlY3QoKTsgfQorICAgICAgICB2aXJ0
dWFsIEZsb2F0UmVjdCBzb3VyY2VJbWFnZVJlY3QoKSBjb25zdCB7IHJldHVybiBGbG9hdFJlY3Qo
KTsgfQorCisgICAgICAgIC8vIFNWRyBzcGVjaWZpYworICAgICAgICB2aXJ0dWFsIGJvb2wgZWZm
ZWN0Qm91bmRpbmdCb3hNb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmly
dHVhbCB2b2lkIGNhbGN1bGF0ZUVmZmVjdFN1YlJlZ2lvbihGaWx0ZXJFZmZlY3QqKSBjb25zdCB7
IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEltYWdlQnVmZmVyRmlsdGVyKCk7CisgICAgfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKEZJTFRFUlMpCisK
KyNlbmRpZiAvLyBJbWFnZUJ1ZmZlckZpbHRlcl9oCkluZGV4OiBXZWJDb3JlL3N2Zy9ncmFwaGlj
cy9maWx0ZXJzL1NWR0ZpbHRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdmcvZ3JhcGhp
Y3MvZmlsdGVycy9TVkdGaWx0ZXIuY3BwCShyZXZpc2lvbiA1MDg2MykKKysrIFdlYkNvcmUvc3Zn
L2dyYXBoaWNzL2ZpbHRlcnMvU1ZHRmlsdGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNyAr
MzIsNyBAQCBTVkdGaWx0ZXI6OlNWR0ZpbHRlcihjb25zdCBGbG9hdFJlY3QmIGl0CiB7CiB9CiAK
LXZvaWQgU1ZHRmlsdGVyOjpjYWxjdWxhdGVFZmZlY3RTdWJSZWdpb24oRmlsdGVyRWZmZWN0KiBl
ZmZlY3QpCit2b2lkIFNWR0ZpbHRlcjo6Y2FsY3VsYXRlRWZmZWN0U3ViUmVnaW9uKEZpbHRlckVm
ZmVjdCogZWZmZWN0KSBjb25zdAogewogICAgIEZsb2F0UmVjdCBzdWJSZWdpb25CQm94ID0gZWZm
ZWN0LT5zdWJSZWdpb24oKTsKICAgICBGbG9hdFJlY3QgdXNlQkJveCA9IGVmZmVjdC0+dW5pb25P
ZkNoaWxkRWZmZWN0U3VicmVnaW9ucygpOwpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvZmls
dGVycy9TVkdGaWx0ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9maWx0
ZXJzL1NWR0ZpbHRlci5oCShyZXZpc2lvbiA1MDg2MykKKysrIFdlYkNvcmUvc3ZnL2dyYXBoaWNz
L2ZpbHRlcnMvU1ZHRmlsdGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDExICszNSwxMSBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgcHVibGljOgogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0
cjxTVkdGaWx0ZXI+IGNyZWF0ZShjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFJlY3QmLCBi
b29sKTsKIAotICAgICAgICBib29sIGVmZmVjdEJvdW5kaW5nQm94TW9kZSgpIHsgcmV0dXJuIG1f
ZWZmZWN0QkJveE1vZGU7IH0KKyAgICAgICAgYm9vbCBlZmZlY3RCb3VuZGluZ0JveE1vZGUoKSBj
b25zdCB7IHJldHVybiBtX2VmZmVjdEJCb3hNb2RlOyB9CiAKLSAgICAgICAgRmxvYXRSZWN0IGZp
bHRlclJlZ2lvbigpIHsgcmV0dXJuIG1fZmlsdGVyUmVjdDsgfQotICAgICAgICBGbG9hdFJlY3Qg
c291cmNlSW1hZ2VSZWN0KCkgeyByZXR1cm4gbV9pdGVtQm94OyB9Ci0gICAgICAgIHZvaWQgY2Fs
Y3VsYXRlRWZmZWN0U3ViUmVnaW9uKEZpbHRlckVmZmVjdCopOworICAgICAgICBGbG9hdFJlY3Qg
ZmlsdGVyUmVnaW9uKCkgY29uc3QgeyByZXR1cm4gbV9maWx0ZXJSZWN0OyB9CisgICAgICAgIEZs
b2F0UmVjdCBzb3VyY2VJbWFnZVJlY3QoKSBjb25zdCB7IHJldHVybiBtX2l0ZW1Cb3g7IH0KKyAg
ICAgICAgdm9pZCBjYWxjdWxhdGVFZmZlY3RTdWJSZWdpb24oRmlsdGVyRWZmZWN0KikgY29uc3Q7
CiAKICAgICBwcml2YXRlOgogICAgICAgICBTVkdGaWx0ZXIoY29uc3QgRmxvYXRSZWN0JiBpdGVt
Qm94LCBjb25zdCBGbG9hdFJlY3QmIGZpbHRlclJlY3QsIGJvb2wgZWZmZWN0QkJveE1vZGUpOwpJ
bmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0No
YW5nZUxvZwkocmV2aXNpb24gNTA4NjMpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtp
bmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0xMS0xMSAgRGlyayBTY2h1bHplICA8a3Jp
dEB3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFNvbWUgdGVzdHMgZm9yIGNhbnZhcyBzaGFkb3cuCisKKyAgICAgICAgKiBmYXN0L2Nh
bnZhcy9jYW52YXMtc2hhZG93LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogZmFzdC9j
YW52YXMvY2FudmFzLXNoYWRvdy5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L2NhbnZhcy9z
Y3JpcHQtdGVzdHMvY2FudmFzLXNoYWRvdy5qczogQWRkZWQuCisKIDIwMDktMTEtMTEgIEZ1bWl0
b3NoaSBVa2FpICA8dWthaUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWxl
eGV5IFByb3NrdXJ5YWtvdi4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL2NhbnZhcy1z
aGFkb3ctZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFz
L2NhbnZhcy1zaGFkb3ctZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMv
ZmFzdC9jYW52YXMvY2FudmFzLXNoYWRvdy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTUgQEAKK1NvbWUgdGVzdHMgZm9yIENhbnZhcyBzaGFkb3dzCisKK09uIHN1Y2Nlc3Ms
IHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJU
RVNUIENPTVBMRVRFIi4KKworCitQQVNTIGltZ2RhdGFbNF0gaXMgMAorUEFTUyBpbWdkYXRhWzVd
IGlzIDEyOAorUEFTUyBpbWdkYXRhWzZdIGlzIDAKK1BBU1MgaW1nZGF0YVs0XSBpcyAwCitQQVNT
IGltZ2RhdGFbNV0gaXMgMTI4CitQQVNTIGltZ2RhdGFbNl0gaXMgMAorUEFTUyBzdWNjZXNzZnVs
bHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2Zh
c3QvY2FudmFzL2NhbnZhcy1zaGFkb3cuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9m
YXN0L2NhbnZhcy9jYW52YXMtc2hhZG93Lmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0
cy9mYXN0L2NhbnZhcy9jYW52YXMtc2hhZG93Lmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxo
dG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2pzL3Jlc291cmNl
cy9qcy10ZXN0LXN0eWxlLmNzcyI+Cis8c2NyaXB0IHNyYz0iLi4vanMvcmVzb3VyY2VzL2pzLXRl
c3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHAgaWQ9ImRlc2NyaXB0aW9u
Ij48L3A+Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVz
dHMvY2FudmFzLXNoYWRvdy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vanMvcmVzb3Vy
Y2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L2NhbnZhcy9zY3JpcHQtdGVzdHMvY2FudmFzLXNoYWRvdy5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy9zY3JpcHQtdGVzdHMvY2FudmFzLXNo
YWRvdy5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3NjcmlwdC10
ZXN0cy9jYW52YXMtc2hhZG93LmpzCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDM0IEBACitkZXNj
cmlwdGlvbigiU29tZSB0ZXN0cyBmb3IgQ2FudmFzIHNoYWRvd3MiKTsKK3ZhciBjdHggPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpOworCitjdHguZmls
bFN0eWxlID0gImdyZWVuIjsKK2N0eC5maWxsUmVjdCgwLDAsMTAwLDEwMCk7CisKK2N0eC5zaGFk
b3dDb2xvciA9ICJncmVlbiI7CitjdHguc2hhZG93T2Zmc2V0WCA9IDA7CitjdHguc2hhZG93T2Zm
c2V0WSA9IDA7CitjdHguc2hhZG93Qmx1ciA9IDA7CisKK3ZhciBpbWFnZURhdGEgPSBjdHguZ2V0
SW1hZ2VEYXRhKDAsIDAsIDIwMCwgNTApOwordmFyIGltZ2RhdGEgPSBpbWFnZURhdGEuZGF0YTsK
K3Nob3VsZEJlKCJpbWdkYXRhWzRdIiwgIjAiKTsKK3Nob3VsZEJlKCJpbWdkYXRhWzVdIiwgIjEy
OCIpOworc2hvdWxkQmUoImltZ2RhdGFbNl0iLCAiMCIpOworCitjdHguY2xlYXJSZWN0KDAsMCwy
MDAsNTApOworCitjdHguc2hhZG93Q29sb3IgPSAiZ3JlZW4iOworY3R4LnNoYWRvd09mZnNldFgg
PSAxMDA7CitjdHguc2hhZG93T2Zmc2V0WSA9IDA7CitjdHguc2hhZG93Qmx1ciA9IDI7CisKK2N0
eC5maWxsU3R5bGUgPSAiZ3JlZW4iOworY3R4LmZpbGxSZWN0KDAsMCwxMDAsNTApOworCitpbWFn
ZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDExMCwgMTAsIDgwLCAzMCk7CitpbWdkYXRhID0gaW1h
Z2VEYXRhLmRhdGE7CitzaG91bGRCZSgiaW1nZGF0YVs0XSIsICIwIik7CitzaG91bGRCZSgiaW1n
ZGF0YVs1XSIsICIxMjgiKTsKK3Nob3VsZEJlKCJpbWdkYXRhWzZdIiwgIjAiKTsKKwordmFyIHN1
Y2Nlc3NmdWxseVBhcnNlZCA9IHRydWU7Cg==
</data>
<flag name="review"
          id="24746"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
    <flag name="commit-queue"
          id="24793"
          type_id="3"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43167</attachid>
            <date>2009-11-13 10:20:25 -0800</date>
            <delta_ts>2009-11-13 11:30:28 -0800</delta_ts>
            <desc>Update to improve performance, correct security hole.</desc>
            <filename>shadow14.patch</filename>
            <type>text/plain</type>
            <size>2482</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDk1MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTEtMTMgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUB3ZWJr
aXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtDQUlST10gc2hhZG93IHN1cHBvcnQgZm9yIENhbnZhcyBhbmQgU1ZHLgorICAgICAgICBbaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwOTYwXQorCisgICAgICAgIElu
Y29ycG9yYXRlIEJlbmphbWluIE90dGUncyByZWNvbW1lbmRhdGlvbnMgdG8gYXZvaWQKKyAgICAg
ICAgYSBidWZmZXIgb3ZlcnJ1biwgYW5kIHNtYWxsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50Lgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Y29weUNvbnRleHRQcm9wZXJ0aWVzKTogQ29ycmVjdGx5
IHNpemUgb3V0cHV0CisgICAgICAgICBzdG9yYWdlIGZvciBjYWlyb19nZXRfZGFzaCB0byBhdm9p
ZCBidWZmZXIgb3ZlcnJ1bi4KKyAgICAgICAgKFdlYkNvcmU6OmRyYXdQYXRoU2hhZG93KTogUHJl
ZmVyIGNhaXJvX2ZpbGxfZXh0ZW50cworICAgICAgICAgdG8gc2xvd2VyIGNhaXJvX3N0cm9rZV9l
eHRlbnRzIHdoZW4gbm90IGRyYXdpbmcgc2hhZG93cy4KKwogMjAwOS0xMS0xMiAgUGF2ZWwgRmVs
ZG1hbiAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBUaW1v
dGh5IEhhdGNoZXIuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBo
aWNzQ29udGV4dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkocmV2aXNpb24gNTA5NDkpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTM4LDkgKzEzOCwxMyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZmls
bFJlY3RTb3VyY2VPdmVyKGNhCiBzdGF0aWMgaW5saW5lIHZvaWQgY29weUNvbnRleHRQcm9wZXJ0
aWVzKGNhaXJvX3QqIHNyY0NyLCBjYWlyb190KiBkc3RDcikKIHsKICAgICBjYWlyb19zZXRfYW50
aWFsaWFzKGRzdENyLCBjYWlyb19nZXRfYW50aWFsaWFzKHNyY0NyKSk7Ci0gICAgZG91YmxlIGRh
c2hlcywgb2Zmc2V0OwotICAgIGNhaXJvX2dldF9kYXNoKHNyY0NyLCAmZGFzaGVzLCAmb2Zmc2V0
KTsKLSAgICBjYWlyb19zZXRfZGFzaChkc3RDciwgJmRhc2hlcywgY2Fpcm9fZ2V0X2Rhc2hfY291
bnQoc3JjQ3IpLCBvZmZzZXQpOworCisgICAgc2l6ZV90IGRhc2hDb3VudCA9IGNhaXJvX2dldF9k
YXNoX2NvdW50KHNyY0NyKTsKKyAgICBWZWN0b3I8ZG91YmxlPiBkYXNoZXMoZGFzaENvdW50KTsK
KworICAgIGRvdWJsZSBvZmZzZXQ7CisgICAgY2Fpcm9fZ2V0X2Rhc2goc3JjQ3IsIHJlaW50ZXJw
cmV0X2Nhc3Q8ZG91YmxlKj4oZGFzaGVzLmRhdGEoKSksICZvZmZzZXQpOworICAgIGNhaXJvX3Nl
dF9kYXNoKGRzdENyLCByZWludGVycHJldF9jYXN0PGRvdWJsZSo+KGRhc2hlcy5kYXRhKCkpLCBk
YXNoQ291bnQsIG9mZnNldCk7CiAgICAgY2Fpcm9fc2V0X2xpbmVfY2FwKGRzdENyLCBjYWlyb19n
ZXRfbGluZV9jYXAoc3JjQ3IpKTsKICAgICBjYWlyb19zZXRfbGluZV9qb2luKGRzdENyLCBjYWly
b19nZXRfbGluZV9qb2luKHNyY0NyKSk7CiAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoZHN0Q3Is
IGNhaXJvX2dldF9saW5lX3dpZHRoKHNyY0NyKSk7CkBAIC0xNzYsNyArMTgwLDEwIEBAIHN0YXRp
YyBpbmxpbmUgdm9pZCBkcmF3UGF0aFNoYWRvdyhHcmFwaGkKICAgICBjYWlyb190KiBjciA9IGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwogICAgIGNhaXJvX3BhdGhfdCogcGF0aCA9IGNhaXJv
X2NvcHlfcGF0aChjcik7CiAgICAgZG91YmxlIHgwLCB4MSwgeTAsIHkxOwotICAgIGNhaXJvX3N0
cm9rZV9leHRlbnRzKGNyLCAmeDAsICZ5MCwgJngxLCAmeTEpOworICAgIGlmIChzdHJva2VTaGFk
b3cpCisgICAgICAgIGNhaXJvX3N0cm9rZV9leHRlbnRzKGNyLCAmeDAsICZ5MCwgJngxLCAmeTEp
OworICAgIGVsc2UKKyAgICAgICAgY2Fpcm9fZmlsbF9leHRlbnRzKGNyLCAmeDAsICZ5MCwgJngx
LCAmeTEpOwogICAgIEZsb2F0UmVjdCByZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7CiAK
ICAgICBJbnRTaXplIHNoYWRvd0J1ZmZlclNpemU7Cg==
</data>
<flag name="review"
          id="24861"
          type_id="1"
          status="+"
          setter="ap"
    />
    <flag name="commit-queue"
          id="24863"
          type_id="3"
          status="-"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>