<?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>23147</bug_id>
          
          <creation_ts>2009-01-06 13:17:26 -0800</creation_ts>
          <short_desc>Introduce Skia to WebKit</short_desc>
          <delta_ts>2009-02-09 01:29:49 -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>WebKit Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>23200</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>23200</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dimitri Glazkov (Google)">dglazkov</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>brettw</cc>
    
    <cc>eric</cc>
    
    <cc>feng</cc>
    
    <cc>mike</cc>
    
    <cc>ojan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>104614</commentid>
    <comment_count>0</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-06 13:17:26 -0800</bug_when>
    <thetext>Adding Skia to WebCore/platform/graphics</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104616</commentid>
    <comment_count>1</comment_count>
      <attachid>26470</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-06 13:44:01 -0800</bug_when>
    <thetext>Created attachment 26470
Add WebCore/platform/graphics/skia files

If this is a bit too large, please let me know and I will split up. I didn&apos;t write this code, but will coordinate any style-related, etc. changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104623</commentid>
    <comment_count>2</comment_count>
      <attachid>26472</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-06 14:02:00 -0800</bug_when>
    <thetext>Created attachment 26472
Add WebCore/svg/graphics/skia files

Here are the SVG-related bits.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104630</commentid>
    <comment_count>3</comment_count>
      <attachid>26472</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-06 14:18:26 -0800</bug_when>
    <thetext>Comment on attachment 26472
Add WebCore/svg/graphics/skia files

We don&apos;t use SVGPaintServerGradientSkia anymore.  GradientSkia.cpp should be taking care of this.  There is a x-platform implementation of SVGPaintServerGradient which uses Gradient from platform instead.

SVGPaintServerPatternSkia is slated to die (the same death as SVGPaintServerGradient*, but it looks like that patch hasn&apos;t landed yet).

I&apos;m surprised we don&apos;t have a nicer way than this:
+        IntRect textBoundary = const_cast&lt;RenderObject*&gt;(object)-&gt;absoluteBoundingBoxRect();
+        targetRect = object-&gt;absoluteTransform().inverse().mapRect(textBoundary);
it seems CG does the same thing though. :(

We use 0 instead of NULL for c++ code according to the style guidelines:
+    context-&gt;platformContext()-&gt;setGradient(NULL);

We don&apos;t generally commit ifdef&apos;d out code, so this should be removed:
+  // TODO(jhaas): implement me
+#if 0
+    cairo_t* cr = context-&gt;platformContext();
+    cairo_surface_t* surface = mask()-&gt;surface();
+    if (!surface)
+        return;
+    cairo_pattern_t* mask = cairo_pattern_create_for_surface(surface);
+    cairo_mask(cr, mask);
+    cairo_pattern_destroy(mask);
+#endif

Otherwise it looks fine.  I think you can delete the SVGPaintServerGradientSkia* files from the build and it should still work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104632</commentid>
    <comment_count>4</comment_count>
      <attachid>26470</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-01-06 14:19:55 -0800</bug_when>
    <thetext>Comment on attachment 26470
Add WebCore/platform/graphics/skia files

I have only reviewed up to GradientSkia.  I am not sure what GdkSkia is for, and therefore, it could use explanation in the ChangeLog.


&gt; +static const double deg2rad = 0.017453292519943295769; // pi/180

This should already be defined in WTF/MathExtras.h

&gt; +AffineTransform::AffineTransform(const SkMatrix&amp; matrix) : m_transform(matrix)

The : m_transform(matrix) should be on the next line.

&gt; +
&gt; +void AffineTransform::map(double x, double y, double *x2, double *y2) const

* on the wrong side.

&gt; +IntRect AffineTransform::mapRect(const IntRect&amp; src) const
&gt; +{
&gt; +    SkRect  dst;

Extra space.

&gt; +
&gt; +AffineTransform &amp;AffineTransform::scale(double sx, double sy)

&amp; on the wrong side.

&gt; +AffineTransform &amp;AffineTransform::translate(double tx, double ty)

&amp; on the wrong side.

&gt; +AffineTransform &amp;AffineTransform::shear(double sx, double sy)

&amp; on the wrong side.

&gt; +AffineTransform &amp;AffineTransform::operator*=(const AffineTransform&amp; m2)

&amp; on the wrong side.

&gt; +
&gt; +double AffineTransform::a() const
&gt; +{
&gt; +    return SkScalarToDouble(m_transform.getScaleX());
&gt; +}
&gt; +void AffineTransform::setA(double a)

Missing newline.

&gt; +double AffineTransform::b() const
&gt; +{
&gt; +    return SkScalarToDouble(m_transform.getSkewY());
&gt; +}
&gt; +void AffineTransform::setB(double b)

Missing newline.

&gt; +double AffineTransform::c() const
&gt; +{
&gt; +    return SkScalarToDouble(m_transform.getSkewX());
&gt; +}
&gt; +void AffineTransform::setC(double c)

Missing newline.

&gt; +double AffineTransform::d() const
&gt; +{
&gt; +    return SkScalarToDouble(m_transform.getScaleY());
&gt; +}
&gt; +void AffineTransform::setD(double d)

Missing newline.

&gt; +double AffineTransform::e() const
&gt; +{
&gt; +    return SkScalarToDouble(m_transform.getTranslateX());
&gt; +}
&gt; +void AffineTransform::setE(double e)

Missing newline.

&gt; +double AffineTransform::f() const
&gt; +{
&gt; +    return SkScalarToDouble(m_transform.getTranslateY());
&gt; +}
&gt; +void AffineTransform::setF(double f)

Missing newline.

&gt; +
&gt; +// Determine the total number of stops needed, including pseudo-stops at the
&gt; +// ends as necessary.
&gt; +static size_t total_stops_needed(const Gradient::ColorStop* stopData, size_t count)

Please use camelCase.

&gt; +{
&gt; +    const Gradient::ColorStop* stop = stopData;
&gt; +    size_t count_used = count;
&gt; +    if (count &lt; 1 || stop-&gt;stop &gt; 0.0)
&gt; +      count_used++;
&gt; +    stop += count - 1;
&gt; +    if (count &lt; 2 || stop-&gt;stop &lt; 1.0)
&gt; +      count_used++;
&gt; +    return count_used;

Indentation seems wrong here.

&gt; +}
&gt; +
&gt; +// Collect sorted stop position and color information into the pos and colors 
&gt; +// buffers, ensuring stops at both 0.0 and 1.0.  The buffers must be large
&gt; +// enough to hold information for all stops, including the new endpoints if
&gt; +// stops at 0.0 and 1.0 aren&apos;t already included.
&gt; +static void fill_stops(const Gradient::ColorStop* stopData,
&gt; +                       size_t count, SkScalar* pos, SkColor* colors)

Please use camelCase.

&gt; +SkShader* Gradient::platformGradient()
&gt; +{
&gt; +    if (m_gradient)
&gt; +        return m_gradient;
&gt; +
&gt; +    // TODO: This and compareStops() are also in Gradient.cpp and

This should be a FIXME.

&gt; +    // CSSGradientValue.cpp; probably should refactor in WebKit.
&gt; +    if (!m_stopsSorted) {
&gt; +        if (m_stops.size())
&gt; +            std::stable_sort(m_stops.begin(), m_stops.end(), compareStops);
&gt; +        m_stopsSorted = true;
&gt; +    }
&gt; +    size_t count_used = total_stops_needed(m_stops.data(), m_stops.size());

Please use camelCase.

&gt; +    ASSERT(count_used &gt;= 2);
&gt; +    ASSERT(count_used &gt;= m_stops.size());
&gt; +
&gt; +    // FIXME: Why is all this manual pointer math needed?!
&gt; +    SkAutoMalloc storage(count_used * (sizeof(SkColor) + sizeof(SkScalar)));
&gt; +    SkColor* colors = (SkColor*)storage.get();
&gt; +    SkScalar* pos = (SkScalar*)(colors + count_used);

We prefer c++ style casts.

&gt; +
&gt; +    fill_stops(m_stops.data(), m_stops.size(), pos, colors);
&gt; +
&gt; +    if (m_radial) {
&gt; +        // TODO(mmoss) CSS radial Gradients allow an offset focal point (the

This should be a FIXME, preferably with a bug #.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104636</commentid>
    <comment_count>5</comment_count>
      <attachid>26470</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-06 14:27:41 -0800</bug_when>
    <thetext>Comment on attachment 26470
Add WebCore/platform/graphics/skia files

AffineTransformSkia.cpp needs to be renamed to TransformationMatrixSkia.cpp (and the class too) to match recent renames upstream.

I don&apos;t understand what GdkSkia.cpp is for.  Seems it should be in its own separate patch.

WebKit style would use coundUsed instead of count_used

We don&apos;t use c-style casts in C++ code:
+    SkColor* colors = (SkColor*)storage.get();

GraphicsContextSkia needs its own patch.  It&apos;s too big to grok as part of this one.

Image buffer probably too.

== stopped reading ==</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104645</commentid>
    <comment_count>6</comment_count>
      <attachid>26476</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-06 14:59:57 -0800</bug_when>
    <thetext>Created attachment 26476
Add WebCore/svg/graphics/skia files v2

Comments addressed on the svg side of things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104649</commentid>
    <comment_count>7</comment_count>
      <attachid>26476</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-06 15:08:09 -0800</bug_when>
    <thetext>Comment on attachment 26476
Add WebCore/svg/graphics/skia files v2

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104665</commentid>
    <comment_count>8</comment_count>
      <attachid>26479</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-06 16:16:39 -0800</bug_when>
    <thetext>Created attachment 26479
Add WebCore/platform/graphics/skia files v2

Comments addressed. I also truncated the patch at the point where you stopped. Will add the rest as multiple separate patches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104666</commentid>
    <comment_count>9</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-06 16:17:35 -0800</bug_when>
    <thetext>BTW, deg2rad wasn&apos;t used by anything, so just removed it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104723</commentid>
    <comment_count>10</comment_count>
      <attachid>26493</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-07 09:54:19 -0800</bug_when>
    <thetext>Created attachment 26493
Added WebCore/platform/graphics/skia/GraphicsContext* files

Adding Skia GraphicsContext impl. Geoffrey, I am spreading the love, so that Sam doesn&apos;t feel too lonely :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104724</commentid>
    <comment_count>11</comment_count>
      <attachid>26494</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-07 10:33:08 -0800</bug_when>
    <thetext>Created attachment 26494
Add platform/graphics/skia/Image* files

Adding another batch, this time the skia/Image* files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104733</commentid>
    <comment_count>12</comment_count>
      <attachid>26497</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-07 11:21:27 -0800</bug_when>
    <thetext>Created attachment 26497
Add a few IntPoint/IntRect, NativeImage, Path, Pattern skia files

A few more files in this batch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104746</commentid>
    <comment_count>13</comment_count>
      <attachid>26497</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-07 12:14:11 -0800</bug_when>
    <thetext>Comment on attachment 26497
Add a few IntPoint/IntRect, NativeImage, Path, Pattern skia files

I&apos;m not sure why SkIntToScalar is needed here:
+    SkPoint p = { SkIntToScalar(m_x), SkIntToScalar(m_y) };

Then again, I think I wrote that code, so maybe I should remember better. :(  IIRC the conversion functions are used for sanity checking to keep skia from barfing on itself?  Either way, if the code works for the Chromium port I shouldn&apos;t complain much.  It looks sane either way.

Style:
+    if (m_lastRequestSize.width() == w &amp;&amp; m_lastRequestSize.height() == h) {
+        m_resizeRequests++;
+    } else {

m_resizeRequests is a bad name for what that variable seems to do.  Also, it seems that resizedBitmap called w/o first calling hasResizedBitmap never increments the m_resizeRequests which may or may not be intentional.

Style:
+    if (m_resizedImage.width() != w || m_resizedImage.height() != h) {
+        m_resizedImage = skia::ImageOperations::Resize(*this,
+            skia::ImageOperations::RESIZE_LANCZOS3, w, h);
+    }

Style:
+bool NativeImageSkia::shouldCacheResampling(int dest_width,
+                                            int dest_height,
+                                            int dest_subset_width,
+                                            int dest_subset_height) const
+{

Spacing:
+int NativeImageSkia::decodedSize() const
+{
+  return getSize() + m_resizedImage.getSize();
+}

It seems like these should possibly change to IntSize instead of a width/height pair:
bool hasResizedBitmap(int width, int height) const;

Same here:
+    bool shouldCacheResampling(int dest_width,
+                               int dest_height,
+                               int dest_subset_width,
+                               int dest_subset_height) const;

Is NativeImageSkia intentionally outside of the WebCore namespace?  That seems odd.

I wonder why m_path can&apos;t be a OwnPtr.  Probably due to using &quot;PlatformPath&quot; as the storage type.  We may consider adding a OwnedPalformPath or some such typedef later, to allow CG to use RetainPtr&lt;PlatformPath&gt; and us to use OwnPtr&lt;PlatformPath&gt;, etc.

Spacing:
+    return SkPathContainsPoint(
+      m_path,
+      point, 
+      rule == RULE_NONZERO ? SkPath::kWinding_FillType : SkPath::kEvenOdd_FillType);
I&apos;d probably have written that as:
SkFillRule fillRule = rule == RULE_NONZERO ? SkPath::kWinding_FillType : SkPath::kEvenOdd_FillType;
return SkPathContainsPoint(m_path, point, fillRule);
if I were writing it (I know you didn&apos;t write it).

Extra spaces?
+    return FloatRect(   SkScalarToFloat(r.fLeft),
+                        SkScalarToFloat(r.fTop),
+                        SkScalarToFloat(r.width()),
+                        SkScalarToFloat(r.height()));

Also, we don&apos;t need to do manual conversion to FloatRect there.  Just returning &quot;r&quot; should convert transparently due to FloatRectSkia.

If Skia has SkPoint versions of these functions:
+    m_path-&gt;moveTo(WebCoreFloatToSkScalar(point.x()), WebCoreFloatToSkScalar(point.y()));
+    m_path-&gt;lineTo(WebCoreFloatToSkScalar(p.x()), WebCoreFloatToSkScalar(p.y()));

Then no manual conversion is needed there either.

Extra spaces?
+    SkScalar    cx = WebCoreFloatToSkScalar(p.x());
+    SkScalar    cy = WebCoreFloatToSkScalar(p.y());
+    SkScalar    radius = WebCoreFloatToSkScalar(r);

Style:
+    if (sweep &gt;= 2*gPI || sweep &lt;= -2*gPI) {
+        m_path-&gt;addOval(oval);
+    } else {

Style:
+        if (anticlockwise &amp;&amp; sweepDegrees &gt; 0) {
+            sweepDegrees -= SkIntToScalar(360);
+        } else if (!anticlockwise &amp;&amp; sweepDegrees &lt; 0) {
+            sweepDegrees += SkIntToScalar(360);
+        }

We don&apos;t generally commit commented out code:
+//        SkDebugf(&quot;addArc sa=%g ea=%g cw=%d start=%g sweep=%g\n&quot;, sa, ea, clockwise,
+//                 SkScalarToFloat(startDegrees), SkScalarToFloat(sweepDegrees));
+

Style:
+    for (int i = 0; i &lt; count; i++)
+    {
+        dst[i].setX(SkScalarToFloat(src[i].fX));

Could use a clearer name:
+static FloatPoint* setfpts(FloatPoint dst[], const SkPoint src[], int count)

We should probably use something other than String for result in debugString().  StringBuilder or Vector&lt;UChar&gt; would be fine.  I&apos;m not sure we really care about perf of debugString, but in general String has awful append perf.

In general this patch looks great.  It could just use a little cleanup before landing.  I don&apos;t need to see it again.  Marking r+ assuming you&apos;re going to land it yourself after cleanup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104761</commentid>
    <comment_count>14</comment_count>
      <attachid>26479</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-07 13:08:46 -0800</bug_when>
    <thetext>Comment on attachment 26479
Add WebCore/platform/graphics/skia files v2

We only name arguments when the name adds clarity:
+    static PassRefPtr&lt;BitmapImageSingleFrameSkia&gt; create(
+        const SkBitmap&amp; bitmap);
This one doesn&apos;t need a name, per the style guidelines.

I&apos;m surprised there isn&apos;t just a m_nativeImage.size() accessor:
+        return IntSize(m_nativeImage.width(), m_nativeImage.height());

Also, there is no reason for these virtual functions to be in the headers.  They should just move to the .cpp file IMO (they&apos;re virtual, so won&apos;t be inlined).

+    virtual void draw(GraphicsContext* ctxt, const FloatRect&amp; dstRect,
+                      const FloatRect&amp; srcRect, CompositeOperator compositeOp);
compositeOp and ctxt don&apos;t need to be there.

Where&apos;s BitmapImageSingleFrameSkia.cpp?  :)  Looks fine.  Needs the above changes and can be landed.  Marking r+ assuming you&apos;ll change before landing.  If you&apos;re still sans commit-bit, then please post a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104768</commentid>
    <comment_count>15</comment_count>
      <attachid>26494</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-07 13:30:09 -0800</bug_when>
    <thetext>Comment on attachment 26494
Add platform/graphics/skia/Image* files

0 is the WebKit way:
+    , m_platformContext(NULL)  // Canvas is set in ImageBuffer constructor.

Not needed in Webkit Style:
+    : m_canvas()

Wow, strange to have a success parameter on a constructor.

Best line ever:
+    unsigned char* data = result-&gt;data()-&gt;data().data();

I think WebKit style would have these be true camelCase instead of lowercase:
+    int originx = rect.x();
+    int destx = 0;
originX, destX

Style:
+    if (srcWidth == destIWidth &amp;&amp; srcHeight == destIHeight) {
+        // We don&apos;t need to resample if the source and destination are the same.
+        return RESAMPLE_NONE;
+    }

Style:
+                         float src_width,
+                         float src_height,
+                         float* dest_width,
+                         float* dest_height) {

I thought gfx:: was off-limits from WebCore code?
+        gfx::Rect destBitmapSubset(destBitmapSubsetSkI.fLeft,

Style:
+    else {
+      resampling = computeResamplingMode(*bitmap,
+                                         srcRect.width(), srcRect.height(),
+                                         dest_bitmap_width, dest_bitmap_height);
+    }

We should probably write out &quot;bitmap&quot; or &quot;skImage&quot; here:
+    const NativeImageSkia* bm = nativeImageForCurrentFrame();
+    if (!bm)
+        return;  // It&apos;s too early and we don&apos;t have an image yet.

Spacing:
+ImageSource::ImageSource()
+  : m_decoder(0)
+{}

Nope:
+#define private protected
+#include &quot;ImageSource.h&quot;
That needs to be fixed before landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104773</commentid>
    <comment_count>16</comment_count>
      <attachid>26493</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-07 13:47:05 -0800</bug_when>
    <thetext>Comment on attachment 26493
Added WebCore/platform/graphics/skia/GraphicsContext* files

3 #include &quot;wtf/MathExtras.h&quot;
should be &lt;wtf/MathExtras.h&gt;

I hate these:
+#ifdef CHECK_REASONABLE
Sigh.  I know they&apos;re necessary for now.

+    if (fillColor().rgb() &amp; 0xFF000000) {:
I prefer somthing like fillColor().hasAlpha() personally.  Or in this case I think it&apos;s making sure it&apos;s non-transparent.  There is more than one of these.

Style:
+    SkRegion exterior_region;
+    const SkScalar exterior_offset = WebCoreFloatToSkScalar(0.5);

Style:
+    static SkBitmap* misspell_bitmap = 0;

(several in that function)

This is not needed:
+    paint.setColor(this-&gt;strokeColor().rgb());</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104775</commentid>
    <comment_count>17</comment_count>
      <attachid>26507</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-07 13:51:41 -0800</bug_when>
    <thetext>Created attachment 26507
Add remaining bits of platform/graphics/skia

This is the remainder of the platform/graphics/skia directory:</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104780</commentid>
    <comment_count>18</comment_count>
      <attachid>26507</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-01-07 14:05:52 -0800</bug_when>
    <thetext>Comment on attachment 26507
Add remaining bits of platform/graphics/skia

I&apos;d like this patch split up somewhat more.  Ideally basic graphic context stuff separate from the font stuff, for that reaosn r- (Font stuff is sufficiently complex for me to want someone else to review it, i don&apos;t know whether it should just be r+&apos;d as a platform component for instance, or whether there are real rules that are necessary)


But other issues
WebCoreRectToSkiaRect, etc -&gt; these should not be in SkieUtils, they should be in IntRectSkia, etc as with the other ports
i&apos;m not sure i like WebCoreCompositeToSkiaComposite, but i feel GraphicsContextSkia would be best
I don&apos;t have a clue what the hell SkColor SkPMColorToColor(SkPMColor pm) things are :D

In general *Utils files are bad, functions should be placed in the files of appropriate relevance, eg. IntRectSkia, and so on and so forth.

Didn&apos;t look at style at all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104785</commentid>
    <comment_count>19</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-07 14:21:06 -0800</bug_when>
    <thetext>I am not sure what the right approach is here. I am very hesitant to make any non-style-related changes to already working code, yet I can not really test the changes unless I first make them downstream, then copy upstream, because the port migration is obviously incomplete and I can&apos;t test the changes upstream. And that would take double or more amount of time.

I realize that I might have been overly optimistic when I signed up to do this :) but I think we should figure out some sort of an approach that allows us to do this more efficiently.

In my idealistic view, I imagined that we would break this up into phases:

a) get the port upstream, fixing minor 
b) make it build
c) continue improving testable, working code

Attempting to refactor in-flight just doesn&apos;t seem like a very prudent thing to do. Though I am pretty sure our port doesn&apos;t represent &quot;perfect code&apos;, it is a working port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104786</commentid>
    <comment_count>20</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-07 14:22:30 -0800</bug_when>
    <thetext>&quot;fixing minor&quot; =&gt; &quot;fixing major stylistic faux pas&quot;. Sorry, rapid typing syndrome strikes again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104788</commentid>
    <comment_count>21</comment_count>
      <attachid>26493</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-07 14:25:06 -0800</bug_when>
    <thetext>Comment on attachment 26493
Added WebCore/platform/graphics/skia/GraphicsContext* files

Bah, hit the &lt;submit&gt; button by accident, and now I&apos;ve lost my place. :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104800</commentid>
    <comment_count>22</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-01-07 15:51:59 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; WebCoreRectToSkiaRect, etc -&gt; these should not be in SkieUtils, they should be
&gt; in IntRectSkia, etc as with the other ports

These are extra and can be deleted (they have no entry in the header file, and whoever deleted it forgot to delete it from the .cpp).


&gt; i&apos;m not sure i like WebCoreCompositeToSkiaComposite, but i feel
&gt; GraphicsContextSkia would be best

I don&apos;t know what you&apos;re saying here. This function is used from both GraphicsContextSkia and from ImageSkia (anywhere we&apos;re converting composite types). Where would you like it to live?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104987</commentid>
    <comment_count>23</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-08 20:45:53 -0800</bug_when>
    <thetext>Closing this bug, because 23200 is where it really went down. Or up? :)

*** This bug has been marked as a duplicate of 23200 ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105083</commentid>
    <comment_count>24</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-09 15:39:00 -0800</bug_when>
    <thetext>*** Bug 23217 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105084</commentid>
    <comment_count>25</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-09 15:43:20 -0800</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	A	WebCore/svg/graphics/skia/RenderPathSkia.cpp
	A	WebCore/svg/graphics/skia/SVGPaintServerPatternSkia.cpp
	A	WebCore/svg/graphics/skia/SVGPaintServerSkia.cpp
	A	WebCore/svg/graphics/skia/SVGResourceFilterSkia.cpp
	A	WebCore/svg/graphics/skia/SVGResourceMaskerSkia.cpp
Committed r39768
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>108512</commentid>
    <comment_count>26</comment_count>
      <attachid>26493</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-05 14:25:24 -0800</bug_when>
    <thetext>Comment on attachment 26493
Added WebCore/platform/graphics/skia/GraphicsContext* files

Clearing review flag so it&apos;s out of the queue.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26470</attachid>
            <date>2009-01-06 13:44:01 -0800</date>
            <delta_ts>2009-01-06 16:16:39 -0800</delta_ts>
            <desc>Add WebCore/platform/graphics/skia files</desc>
            <filename>skia.patch</filename>
            <type>text/plain</type>
            <size>215788</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGI1NzM1Ny4uM2NhMmVkMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMDUgQEAKKzIwMDktMDEtMDYgIERpbWl0cmkgR2xh
emtvdiAgPGRnbGF6a292QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjMxNDcKKyAgICAgICAgQWRkIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEgZmlsZXMuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0FmZmluZVRyYW5zZm9ybVNraWEuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6QWZmaW5lVHJhbnNm
b3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6c2V0TWF0cml4KToKKyAg
ICAgICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6bWFwKToKKyAgICAgICAgKFdlYkNvcmU6
OkFmZmluZVRyYW5zZm9ybTo6bWFwUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpBZmZpbmVUcmFu
c2Zvcm06OmlzSWRlbnRpdHkpOgorICAgICAgICAoV2ViQ29yZTo6QWZmaW5lVHJhbnNmb3JtOjpy
ZXNldCk6CisgICAgICAgIChXZWJDb3JlOjpBZmZpbmVUcmFuc2Zvcm06OnNjYWxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6cm90YXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkFmZmluZVRyYW5zZm9ybTo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkFmZmluZVRy
YW5zZm9ybTo6c2hlYXIpOgorICAgICAgICAoV2ViQ29yZTo6QWZmaW5lVHJhbnNmb3JtOjpkZXQp
OgorICAgICAgICAoV2ViQ29yZTo6QWZmaW5lVHJhbnNmb3JtOjppbnZlcnNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6b3BlcmF0b3IgU2tNYXRyaXgpOgorICAgICAgICAo
V2ViQ29yZTo6QWZmaW5lVHJhbnNmb3JtOjpvcGVyYXRvcj09KToKKyAgICAgICAgKFdlYkNvcmU6
OkFmZmluZVRyYW5zZm9ybTo6b3BlcmF0b3IqPSk6CisgICAgICAgIChXZWJDb3JlOjpBZmZpbmVU
cmFuc2Zvcm06Om9wZXJhdG9yKik6CisgICAgICAgIChXZWJDb3JlOjpBZmZpbmVUcmFuc2Zvcm06
OmEpOgorICAgICAgICAoV2ViQ29yZTo6QWZmaW5lVHJhbnNmb3JtOjpzZXRBKToKKyAgICAgICAg
KFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6Yik6CisgICAgICAgIChXZWJDb3JlOjpBZmZpbmVU
cmFuc2Zvcm06OnNldEIpOgorICAgICAgICAoV2ViQ29yZTo6QWZmaW5lVHJhbnNmb3JtOjpjKToK
KyAgICAgICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6c2V0Qyk6CisgICAgICAgIChXZWJD
b3JlOjpBZmZpbmVUcmFuc2Zvcm06OmQpOgorICAgICAgICAoV2ViQ29yZTo6QWZmaW5lVHJhbnNm
b3JtOjpzZXREKToKKyAgICAgICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBZmZpbmVUcmFuc2Zvcm06OnNldEUpOgorICAgICAgICAoV2ViQ29yZTo6
QWZmaW5lVHJhbnNmb3JtOjpmKToKKyAgICAgICAgKFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybTo6
c2V0Rik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9CaXRtYXBJbWFnZVNpbmds
ZUZyYW1lU2tpYS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlU2luZ2xl
RnJhbWVTa2lhOjppc0JpdG1hcEltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdl
U2luZ2xlRnJhbWVTa2lhOjpzaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlU2lu
Z2xlRnJhbWVTa2lhOjpkZXN0cm95RGVjb2RlZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Qml0
bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE6OmRlY29kZWRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6
OkJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhOjpuYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSk6
CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYTo6Qml0bWFwSW1h
Z2VTaW5nbGVGcmFtZVNraWEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvQ29s
b3JTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpmb2N1c1JpbmdDb2xvcik6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9GbG9hdFBvaW50U2tpYS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6RmxvYXRQb2ludDo6RmxvYXRQb2ludCk6CisgICAgICAgIChX
ZWJDb3JlOjpGbG9hdFBvaW50OjpvcGVyYXRvciBTa1BvaW50KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0Zsb2F0UmVjdFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkZsb2F0UmVjdDo6RmxvYXRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZsb2F0UmVjdDo6
b3BlcmF0b3IgU2tSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dka1Nr
aWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKGdka19za2lhX2luaXQpOgorICAgICAgICAoZ2RrX3Nr
aWFfY2xhc3NfaW5pdCk6CisgICAgICAgIChnZGtfc2tpYV9maW5hbGl6ZSk6CisgICAgICAgIChn
ZGtfc2tpYV9jcmVhdGVfZ2MpOgorICAgICAgICAoZ2Nfc2V0X3BhaW50KToKKyAgICAgICAgKGdk
a19za2lhX2RyYXdfcmVjdGFuZ2xlKToKKyAgICAgICAgKGdka19za2lhX2RyYXdfYXJjKToKKyAg
ICAgICAgKGdka19za2lhX2RyYXdfcG9seWdvbik6CisgICAgICAgIChnZGtfc2tpYV9kcmF3X3Rl
eHQpOgorICAgICAgICAoZ2RrX3NraWFfZHJhd190ZXh0X3djKToKKyAgICAgICAgKGdka19za2lh
X2RyYXdfZHJhd2FibGUpOgorICAgICAgICAoZ2RrX3NraWFfZHJhd19wb2ludHMpOgorICAgICAg
ICAoZ2RrX3NraWFfZHJhd19zZWdtZW50cyk6CisgICAgICAgIChnZGtfc2tpYV9kcmF3X2xpbmVz
KToKKyAgICAgICAgKGdka19za2lhX2RyYXdfZ2x5cGhzKToKKyAgICAgICAgKGdka19za2lhX2Ry
YXdfZ2x5cGhzX3RyYW5zZm9ybWVkKToKKyAgICAgICAgKGdka19za2lhX2RyYXdfaW1hZ2UpOgor
ICAgICAgICAoZ2RrX3NraWFfZHJhd19waXhidWYpOgorICAgICAgICAoZ2RrX3NraWFfZHJhd190
cmFwZXpvaWRzKToKKyAgICAgICAgKGdka19za2lhX3JlYWxfZ2V0X3NpemUpOgorICAgICAgICAo
Z2RrX3NraWFfY29weV90b19pbWFnZSk6CisgICAgICAgIChnZGtfc2tpYV9yZWZfY2Fpcm9fc3Vy
ZmFjZSk6CisgICAgICAgIChnZGtfc2tpYV9yZWFsX2dldF92aXN1YWwpOgorICAgICAgICAoZ2Rr
X3NraWFfcmVhbF9nZXRfZGVwdGgpOgorICAgICAgICAoZ2RrX3NraWFfcmVhbF9zZXRfY29sb3Jt
YXApOgorICAgICAgICAoZ2RrX3NraWFfcmVhbF9nZXRfY29sb3JtYXApOgorICAgICAgICAoZ2Rr
X3NraWFfcmVhbF9nZXRfc2NyZWVuKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0dka1NraWEuaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFk
aWVudFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkdyYWRpZW50OjpwbGF0Zm9y
bURlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6RjJCKToKKyAgICAgICAgKFdlYkNvcmU6Om1h
a2VTa0NvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OnRvdGFsX3N0b3BzX25lZWRlZCk6CisgICAg
ICAgIChXZWJDb3JlOjpmaWxsX3N0b3BzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXBhcmVTdG9w
cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFkaWVudDo6cGxhdGZvcm1HcmFkaWVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFkaWVudDo6ZmlsbCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmNvbnRleHQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEv
R3JhcGhpY3NDb250ZXh0U2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcCk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0OjpjbGVhclBsYXRmb3JtU2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6Y2xpcCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNsaXBP
dXQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0RWxsaXBzZUlu
UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRoKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y2xpcFRvSW1hZ2VCdWZmZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0pOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3Q29udmV4UG9seWdvbik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQ6OmRyYXdMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6
ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OmRyYXdSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZmlsbFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVj
dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmZpbGxSb3VuZGVkUmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldENUTSk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzY2FsZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnNldEFscGhhKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6c2V0SW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXApOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpzZXRMaW5lRGFzaCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6
OnNldExpbmVKb2luKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0TWl0
ZXJMaW1pdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
RmlsbENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZv
cm1TaGFkb3cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9y
bVN0cm9rZUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxh
dGZvcm1TdHJva2VTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNl
dFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6c2V0UGxhdGZvcm1UZXh0RHJhd2luZ01vZGUpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6c2V0VXNlQW50aWFsaWFzaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6c3Ryb2tlQXJjKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6
c3Ryb2tlUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJl
Y3QpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VC
dWZmZXI6On5JbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Y29u
dGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6aW1hZ2UpOgorICAgICAgICAo
V2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmdldEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJ
bWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVy
Ojp0b0RhdGFVUkwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lh
LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6RnJh
bWVEYXRhOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZTo6bG9hZFBsYXRmb3JtUmVz
b3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2U6OmRyYXdQYXR0ZXJuKToKKyAgICAgICAg
KFdlYkNvcmU6OkJpdG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6OkJpdG1hcEltYWdlOjppbnZhbGlkYXRlUGxhdGZvcm1EYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6OkJpdG1hcEltYWdlOjpjaGVja0ZvclNvbGlkQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
Qml0bWFwSW1hZ2U6OmRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2VTaW5nbGVG
cmFtZVNraWE6OmRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2VTaW5nbGVGcmFt
ZVNraWE6OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNv
dXJjZVNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURlY29kZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OkltYWdlU291cmNlKToKKyAgICAgICAgKFdl
YkNvcmU6OkltYWdlU291cmNlOjp+SW1hZ2VTb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6SW1h
Z2VTb3VyY2U6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjppbml0aWFs
aXplZCk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6c2V0RGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6aXNTaXplQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkltYWdlU291cmNlOjpzaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjpm
cmFtZVNpemVBdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjpyZXBldGl0
aW9uQ291bnQpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmZyYW1lQ291bnQpOgor
ICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmNyZWF0ZUZyYW1lQXRJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6ZnJhbWVJc0NvbXBsZXRlQXRJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgpOgorICAgICAg
ICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmZyYW1lSGFzQWxwaGFBdEluZGV4KToKKyAgICAgICAg
KFdlYkNvcmU6OkltYWdlU291cmNlU2tpYTo6c2V0RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJ
bWFnZVNvdXJjZTo6ZmlsZW5hbWVFeHRlbnNpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpJ
bnRQb2ludDo6SW50UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6SW50UG9pbnQ6Om9wZXJhdG9y
IFNrSVBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkludFBvaW50OjpvcGVyYXRvciBTa1BvaW50
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ludFJlY3RTa2lhLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpJbnRSZWN0OjpvcGVyYXRvciBTa0lSZWN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkludFJlY3Q6Om9wZXJhdG9yIFNrUmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbnRSZWN0OjpJbnRSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL05h
dGl2ZUltYWdlU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAoTmF0aXZlSW1hZ2VTa2lhOjpOYXRp
dmVJbWFnZVNraWEpOgorICAgICAgICAoTmF0aXZlSW1hZ2VTa2lhOjpkZWNvZGVkU2l6ZSk6Cisg
ICAgICAgIChOYXRpdmVJbWFnZVNraWE6Omhhc1Jlc2l6ZWRCaXRtYXApOgorICAgICAgICAoTmF0
aXZlSW1hZ2VTa2lhOjpyZXNpemVkQml0bWFwKToKKyAgICAgICAgKE5hdGl2ZUltYWdlU2tpYTo6
c2hvdWxkQ2FjaGVSZXNhbXBsaW5nKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lh
L05hdGl2ZUltYWdlU2tpYS5oOiBBZGRlZC4KKyAgICAgICAgKE5hdGl2ZUltYWdlU2tpYTo6c2V0
RGF0YUNvbXBsZXRlKToKKyAgICAgICAgKE5hdGl2ZUltYWdlU2tpYTo6aXNEYXRhQ29tcGxldGUp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGF0aFNraWEuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OlBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6
flBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6b3BlcmF0b3I9KToKKyAgICAgICAgKFdl
YkNvcmU6OlBhdGg6OmlzRW1wdHkpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Y29udGFpbnMp
OgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OlBhdGg6OmJvdW5kaW5nUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjptb3ZlVG8pOgor
ICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkTGluZVRvKToKKyAgICAgICAgKFdlYkNvcmU6OlBh
dGg6OmFkZFF1YWRDdXJ2ZVRvKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEJlemllckN1
cnZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkQXJjVG8pOgorICAgICAgICAoV2Vi
Q29yZTo6UGF0aDo6Y2xvc2VTdWJwYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEFy
Yyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjphZGRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OlBhdGg6OmFkZEVsbGlwc2UpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Y2xlYXIpOgorICAg
ICAgICAoV2ViQ29yZTo6c2V0ZnB0cyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjphcHBseSk6
CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjp0cmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6
UGF0aDo6ZGVidWdTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Ym91bmRpbmdCb3hGb3JDdXJy
ZW50U3Ryb2tlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QYXR0ZXJuU2tpYS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6c2hhZGVyUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpQYXR0
ZXJuOjpjcmVhdGVQbGF0Zm9ybVBhdHRlcm4pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3NraWEvUGxhdGZvcm1Db250ZXh0U2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAoUGxhdGZvcm1D
b250ZXh0U2tpYTo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6
OlN0YXRlOjp+U3RhdGUpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6U3RhdGU6OmFw
cGx5QWxwaGEpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6UGxhdGZvcm1Db250ZXh0
U2tpYSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjp+UGxhdGZvcm1Db250ZXh0U2tp
YSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRDYW52YXMpOgorICAgICAgICAo
UGxhdGZvcm1Db250ZXh0U2tpYTo6c2F2ZSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lh
OjpyZXN0b3JlKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OmRyYXdSZWN0KToKKyAg
ICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldHVwUGFpbnRDb21tb24pOgorICAgICAgICAo
UGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0dXBQYWludEZvckZpbGxpbmcpOgorICAgICAgICAoUGxh
dGZvcm1Db250ZXh0U2tpYTo6c2V0dXBQYWludEZvclN0cm9raW5nKToKKyAgICAgICAgKFBsYXRm
b3JtQ29udGV4dFNraWE6OnNldERyYXdMb29wZXIpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0
U2tpYTo6c2V0TWl0ZXJMaW1pdCk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRB
bHBoYSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRMaW5lQ2FwKToKKyAgICAg
ICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldExpbmVKb2luKToKKyAgICAgICAgKFBsYXRmb3Jt
Q29udGV4dFNraWE6OnNldFBvcnRlckR1ZmZNb2RlKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4
dFNraWE6OnNldEZpbGxDb2xvcik6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpnZXRE
cmF3TG9vcGVyKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OmdldFN0cm9rZVN0eWxl
KToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldFN0cm9rZVN0eWxlKToKKyAgICAg
ICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldFN0cm9rZUNvbG9yKToKKyAgICAgICAgKFBsYXRm
b3JtQ29udGV4dFNraWE6OmdldFN0cm9rZVRoaWNrbmVzcyk6CisgICAgICAgIChQbGF0Zm9ybUNv
bnRleHRTa2lhOjpzZXRTdHJva2VUaGlja25lc3MpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0
U2tpYTo6Z2V0VGV4dERyYXdpbmdNb2RlKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6
OnNldFRleHREcmF3aW5nTW9kZSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRV
c2VBbnRpYWxpYXNpbmcpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6ZmlsbENvbG9y
KToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OmJlZ2luUGF0aCk6CisgICAgICAgIChQ
bGF0Zm9ybUNvbnRleHRTa2lhOjphZGRQYXRoKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNr
aWE6OnNldEZpbGxSdWxlKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldEdyYWRp
ZW50KToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldFBhdHRlcm4pOgorICAgICAg
ICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0RGFzaFBhdGhFZmZlY3QpOgorICAgICAgICAoUGxh
dGZvcm1Db250ZXh0U2tpYTo6cGFpbnRTa1BhaW50KToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4
dFNraWE6OmJpdG1hcCk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpJc1ByaW50aW5n
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3JtQ29udGV4dFNraWEu
aDogQWRkZWQuCisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpjdXJyZW50UGF0aCk6Cisg
ICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpjYW52YXMpOgorICAgICAgICAoUGxhdGZvcm1D
b250ZXh0U2tpYTo6Z2RrX3NraWEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEv
UGxhdGZvcm1HcmFwaGljcy5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL1NraWFGb250V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAg
ICAoV2ViQ29yZTo6Q2FjaGVkT3V0bGluZUtleTo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJD
b3JlOjpDYWNoZWRPdXRsaW5lS2V5OjpDYWNoZWRPdXRsaW5lS2V5SGFzaDo6aGFzaCk6CisgICAg
ICAgIChXZWJDb3JlOjpDYWNoZWRPdXRsaW5lS2V5OjpDYWNoZWRPdXRsaW5lS2V5SGFzaDo6ZXF1
YWwpOgorICAgICAgICAoV2ViQ29yZTo6Q2FjaGVkT3V0bGluZUtleTo6U2tTY2FsYXJUb0ZJWEVE
KToKKyAgICAgICAgKFdlYkNvcmU6OkNhY2hlZE91dGxpbmVLZXk6OkZJWEVEVG9Ta1NjYWxhcik6
CisgICAgICAgIChXZWJDb3JlOjpDYWNoZWRPdXRsaW5lS2V5OjpEZWxldGVPdXRsaW5lKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNhY2hlZE91dGxpbmVLZXk6OkFkZFBvbHlDdXJ2ZVRvUGF0aCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDYWNoZWRPdXRsaW5lS2V5OjpHZXRQYXRoRm9yR2x5cGgpOgorICAg
ICAgICAoV2ViQ29yZTo6Q2FjaGVkT3V0bGluZUtleTo6R2V0Q2FjaGVkUGF0aEZvckdseXBoKToK
KyAgICAgICAgKFdlYkNvcmU6OlNraWFEcmF3VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW1v
dmVGb250RnJvbVNraWFGb250V2luQ2FjaGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3NraWEvU2tpYUZvbnRXaW4uaDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9Ta2lhVXRpbHMuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVQb2lu
dFRvU2tpYVBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVSZWN0VG9Ta2lhUmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6V2ViQ29yZUNvbXBvc2l0
ZVRvU2tpYUNvbXBvc2l0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbnZTY2FsZUJ5dGUpOgorICAg
ICAgICAoV2ViQ29yZTo6U2tQTUNvbG9yVG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpTa1BN
Q29sb3JUb1dlYkNvcmVDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpJbnRlcnNlY3RSZWN0QW5k
UmVnaW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBSZWN0VG9DYW52YXMpOgorICAgICAgICAo
V2ViQ29yZTo6U2tQYXRoQ29udGFpbnNQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpzY3JhdGNo
Q29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuaDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKToKKyAgICAg
ICAgKFdlYkNvcmU6OldlYkNvcmVEb3VibGVUb1NrU2NhbGFyKToKKwogMjAwOS0wMS0wNiAgRXJp
YyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAgQnVpbGQgZml4IG9ubHksIG5v
IHJldmlldy4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9BZmZp
bmVUcmFuc2Zvcm1Ta2lhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9BZmZp
bmVUcmFuc2Zvcm1Ta2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42
ZmM3YjcyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0FmZmluZVRyYW5zZm9ybVNraWEuY3BwCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJp
Z2h0IChjKSAyMDA2LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKworI2luY2x1ZGUgIkZsb2F0
UmVjdC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKworI2luY2x1ZGUgIlNraWFVdGlscy5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBkb3VibGUgZGVnMnJhZCA9IDAu
MDE3NDUzMjkyNTE5OTQzMjk1NzY5OyAvLyBwaS8xODAKKworQWZmaW5lVHJhbnNmb3JtOjpBZmZp
bmVUcmFuc2Zvcm0oKQoreworICAgIG1fdHJhbnNmb3JtLnJlc2V0KCk7Cit9CisKK0FmZmluZVRy
YW5zZm9ybTo6QWZmaW5lVHJhbnNmb3JtKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRv
dWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsIGRvdWJs
ZSBmKQoreworICAgIHNldE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKTsKK30KKworQWZmaW5lVHJh
bnNmb3JtOjpBZmZpbmVUcmFuc2Zvcm0oY29uc3QgU2tNYXRyaXgmIG1hdHJpeCkgOiBtX3RyYW5z
Zm9ybShtYXRyaXgpCit7Cit9CisKK3ZvaWQgQWZmaW5lVHJhbnNmb3JtOjpzZXRNYXRyaXgoZG91
YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRvdWJsZSBlLCBkb3VibGUgZikKK3sKKyAgICBtX3RyYW5zZm9ybS5yZXNl
dCgpOworCisgICAgbV90cmFuc2Zvcm0uc2V0U2NhbGVYKFdlYkNvcmVEb3VibGVUb1NrU2NhbGFy
KGEpKTsKKyAgICBtX3RyYW5zZm9ybS5zZXRTa2V3WChXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihj
KSk7CisgICAgbV90cmFuc2Zvcm0uc2V0VHJhbnNsYXRlWChXZWJDb3JlRG91YmxlVG9Ta1NjYWxh
cihlKSk7CisKKyAgICBtX3RyYW5zZm9ybS5zZXRTY2FsZVkoV2ViQ29yZURvdWJsZVRvU2tTY2Fs
YXIoZCkpOworICAgIG1fdHJhbnNmb3JtLnNldFNrZXdZKFdlYkNvcmVEb3VibGVUb1NrU2NhbGFy
KGIpKTsKKyAgICBtX3RyYW5zZm9ybS5zZXRUcmFuc2xhdGVZKFdlYkNvcmVEb3VibGVUb1NrU2Nh
bGFyKGYpKTsKK30KKwordm9pZCBBZmZpbmVUcmFuc2Zvcm06Om1hcChkb3VibGUgeCwgZG91Ymxl
IHksIGRvdWJsZSAqeDIsIGRvdWJsZSAqeTIpIGNvbnN0Cit7CisgICAgU2tQb2ludCBzcmMsIGRz
dDsKKyAgICBzcmMuc2V0KFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKHgpLCBXZWJDb3JlRG91Ymxl
VG9Ta1NjYWxhcih5KSk7CisgICAgbV90cmFuc2Zvcm0ubWFwUG9pbnRzKCZkc3QsICZzcmMsIDEp
OworCisgICAgKngyID0gU2tTY2FsYXJUb0RvdWJsZShkc3QuZlgpOworICAgICp5MiA9IFNrU2Nh
bGFyVG9Eb3VibGUoZHN0LmZZKTsKK30KKworSW50UmVjdCBBZmZpbmVUcmFuc2Zvcm06Om1hcFJl
Y3QoY29uc3QgSW50UmVjdCYgc3JjKSBjb25zdAoreworICAgIFNrUmVjdCAgZHN0OworICAgIG1f
dHJhbnNmb3JtLm1hcFJlY3QoJmRzdCwgc3JjKTsKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVj
dChkc3QpOworfQorCitGbG9hdFJlY3QgQWZmaW5lVHJhbnNmb3JtOjptYXBSZWN0KGNvbnN0IEZs
b2F0UmVjdCYgc3JjKSBjb25zdAoreworICAgIFNrUmVjdCBkc3Q7CisgICAgbV90cmFuc2Zvcm0u
bWFwUmVjdCgmZHN0LCBzcmMpOworICAgIHJldHVybiBkc3Q7Cit9CisKK2Jvb2wgQWZmaW5lVHJh
bnNmb3JtOjppc0lkZW50aXR5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm0uaXNJ
ZGVudGl0eSgpOworfQorCit2b2lkIEFmZmluZVRyYW5zZm9ybTo6cmVzZXQoKQoreworICAgIG1f
dHJhbnNmb3JtLnJlc2V0KCk7Cit9CisKK0FmZmluZVRyYW5zZm9ybSAmQWZmaW5lVHJhbnNmb3Jt
OjpzY2FsZShkb3VibGUgc3gsIGRvdWJsZSBzeSkKK3sKKyAgICBtX3RyYW5zZm9ybS5wcmVTY2Fs
ZShXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihzeCksIFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKHN5
KSwgMCwgMCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitBZmZpbmVUcmFuc2Zvcm0gJkFmZmlu
ZVRyYW5zZm9ybTo6cm90YXRlKGRvdWJsZSBkKQoreworICAgIG1fdHJhbnNmb3JtLnByZVJvdGF0
ZShXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihkKSwgMCwgMCk7CisgICAgcmV0dXJuICp0aGlzOwor
fQorCitBZmZpbmVUcmFuc2Zvcm0gJkFmZmluZVRyYW5zZm9ybTo6dHJhbnNsYXRlKGRvdWJsZSB0
eCwgZG91YmxlIHR5KQoreworICAgIG1fdHJhbnNmb3JtLnByZVRyYW5zbGF0ZShXZWJDb3JlRG91
YmxlVG9Ta1NjYWxhcih0eCksIFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKHR5KSk7CisgICAgcmV0
dXJuICp0aGlzOworfQorCitBZmZpbmVUcmFuc2Zvcm0gJkFmZmluZVRyYW5zZm9ybTo6c2hlYXIo
ZG91YmxlIHN4LCBkb3VibGUgc3kpCit7CisgICAgbV90cmFuc2Zvcm0ucHJlU2tldyhXZWJDb3Jl
RG91YmxlVG9Ta1NjYWxhcihzeCksIFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKHN5KSwgMCwgMCk7
CisgICAgcmV0dXJuICp0aGlzOworfQorCitkb3VibGUgQWZmaW5lVHJhbnNmb3JtOjpkZXQoKSBj
b25zdAoreworICAgIHJldHVybiBTa1NjYWxhclRvRG91YmxlKG1fdHJhbnNmb3JtLmdldFNjYWxl
WCgpKSAqIFNrU2NhbGFyVG9Eb3VibGUobV90cmFuc2Zvcm0uZ2V0U2NhbGVZKCkpIC0KKyAgICAg
ICAgICAgU2tTY2FsYXJUb0RvdWJsZShtX3RyYW5zZm9ybS5nZXRTa2V3WSgpKSAgKiBTa1NjYWxh
clRvRG91YmxlKG1fdHJhbnNmb3JtLmdldFNrZXdYKCkpOworfQorCitBZmZpbmVUcmFuc2Zvcm0g
QWZmaW5lVHJhbnNmb3JtOjppbnZlcnNlKCkgY29uc3QKK3sKKyAgICBBZmZpbmVUcmFuc2Zvcm0g
aW52ZXJzZTsKKyAgICBtX3RyYW5zZm9ybS5pbnZlcnQoJmludmVyc2UubV90cmFuc2Zvcm0pOwor
ICAgIHJldHVybiBpbnZlcnNlOworfQorCitBZmZpbmVUcmFuc2Zvcm06Om9wZXJhdG9yIFNrTWF0
cml4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm07Cit9CisKK2Jvb2wgQWZmaW5l
VHJhbnNmb3JtOjpvcGVyYXRvcj09KGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgbTIpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fdHJhbnNmb3JtID09IG0yLm1fdHJhbnNmb3JtOworfQorCitBZmZpbmVU
cmFuc2Zvcm0gJkFmZmluZVRyYW5zZm9ybTo6b3BlcmF0b3IqPShjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mIG0yKQoreworICAgIG1fdHJhbnNmb3JtLnNldENvbmNhdChtMi5tX3RyYW5zZm9ybSwgbV90
cmFuc2Zvcm0pOworICAgIHJldHVybiAqdGhpczsKK30KKworQWZmaW5lVHJhbnNmb3JtIEFmZmlu
ZVRyYW5zZm9ybTo6b3BlcmF0b3IqKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgbTIpCit7CisgICAg
QWZmaW5lVHJhbnNmb3JtIGNhdDsKKyAgICAKKyAgICBjYXQubV90cmFuc2Zvcm0uc2V0Q29uY2F0
KG0yLm1fdHJhbnNmb3JtLCBtX3RyYW5zZm9ybSk7CisgICAgcmV0dXJuIGNhdDsKK30KKworZG91
YmxlIEFmZmluZVRyYW5zZm9ybTo6YSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFNrU2NhbGFyVG9E
b3VibGUobV90cmFuc2Zvcm0uZ2V0U2NhbGVYKCkpOworfQordm9pZCBBZmZpbmVUcmFuc2Zvcm06
OnNldEEoZG91YmxlIGEpCit7CisgICAgbV90cmFuc2Zvcm0uc2V0U2NhbGVYKFdlYkNvcmVEb3Vi
bGVUb1NrU2NhbGFyKGEpKTsKK30KKworZG91YmxlIEFmZmluZVRyYW5zZm9ybTo6YigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIFNrU2NhbGFyVG9Eb3VibGUobV90cmFuc2Zvcm0uZ2V0U2tld1koKSk7
Cit9Cit2b2lkIEFmZmluZVRyYW5zZm9ybTo6c2V0Qihkb3VibGUgYikKK3sKKyAgICBtX3RyYW5z
Zm9ybS5zZXRTa2V3WShXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihiKSk7Cit9CisKK2RvdWJsZSBB
ZmZpbmVUcmFuc2Zvcm06OmMoKSBjb25zdAoreworICAgIHJldHVybiBTa1NjYWxhclRvRG91Ymxl
KG1fdHJhbnNmb3JtLmdldFNrZXdYKCkpOworfQordm9pZCBBZmZpbmVUcmFuc2Zvcm06OnNldEMo
ZG91YmxlIGMpCit7CisgICAgbV90cmFuc2Zvcm0uc2V0U2tld1goV2ViQ29yZURvdWJsZVRvU2tT
Y2FsYXIoYykpOworfQorCitkb3VibGUgQWZmaW5lVHJhbnNmb3JtOjpkKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gU2tTY2FsYXJUb0RvdWJsZShtX3RyYW5zZm9ybS5nZXRTY2FsZVkoKSk7Cit9Cit2
b2lkIEFmZmluZVRyYW5zZm9ybTo6c2V0RChkb3VibGUgZCkKK3sKKyAgICBtX3RyYW5zZm9ybS5z
ZXRTY2FsZVkoV2ViQ29yZURvdWJsZVRvU2tTY2FsYXIoZCkpOworfQorCitkb3VibGUgQWZmaW5l
VHJhbnNmb3JtOjplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gU2tTY2FsYXJUb0RvdWJsZShtX3Ry
YW5zZm9ybS5nZXRUcmFuc2xhdGVYKCkpOworfQordm9pZCBBZmZpbmVUcmFuc2Zvcm06OnNldEUo
ZG91YmxlIGUpCit7CisgICAgbV90cmFuc2Zvcm0uc2V0VHJhbnNsYXRlWChXZWJDb3JlRG91Ymxl
VG9Ta1NjYWxhcihlKSk7Cit9CisKK2RvdWJsZSBBZmZpbmVUcmFuc2Zvcm06OmYoKSBjb25zdAor
eworICAgIHJldHVybiBTa1NjYWxhclRvRG91YmxlKG1fdHJhbnNmb3JtLmdldFRyYW5zbGF0ZVko
KSk7Cit9Cit2b2lkIEFmZmluZVRyYW5zZm9ybTo6c2V0Rihkb3VibGUgZikKK3sKKyAgICBtX3Ry
YW5zZm9ybS5zZXRUcmFuc2xhdGVZKFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKGYpKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0JpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhLmggYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWEuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ3MzI3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0JpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhLmgKQEAg
LTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhX2gKKyNk
ZWZpbmUgQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWFfaAorCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KyNpbmNsdWRlICJOYXRpdmVJbWFnZVNraWEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBUaGlzIGltYWdlIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlcyB3aGljaCBuZWVkIGFuIElt
YWdlLCBidXQgaGF2ZQorLy8gcmF3IHBpeGVsIGRhdGEgcmF0aGVyIHRoYW4gdW5kZWNvZGVkIGlt
YWdlIGRhdGEuCisvLyBUaGUgSW1hZ2UgaXMgc2ltcGxlciB0aGFuIGEgQml0bWFwSW1hZ2UsIGFz
IGl0IGRvZXMgbm90IGhhdmUgaW1hZ2UKKy8vIG9ic2VydmVycywgYW5pbWF0aW9uLCBtdWx0aXBs
ZSBmcmFtZXMsIG9yIG5vbi1kZWNvZGVkIGRhdGEuCisvLyBUaGVyZWZvcmUgdHJpbW1pbmcgdGhl
IGRlY29kZWQgZGF0YSAoZGVzdHJveURlY29kZWREYXRhKCkpIGhhcyBubyBlZmZlY3QuCisvLwor
Ly8gVGhlIGRpZmZpY3VsdHkgd2l0aCBwdXR0aW5nIHRoaXMgaW4gQml0bWFwSW1hZ2U6OmNyZWF0
ZShOYXRpdmVJbWFnZVB0cikKKy8vIGlzIHRoYXQgTmF0aXZlSW1hZ2VQdHIgPSBOYXRpdmVJbWFn
ZVNraWEsIHlldCBjYWxsZXJzIGhhdmUgU2tCaXRtYXAuCitjbGFzcyBCaXRtYXBJbWFnZVNpbmds
ZUZyYW1lU2tpYSA6IHB1YmxpYyBJbWFnZSB7CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlcyBhIG5l
dyBJbWFnZSwgYnkgY29weWluZyB0aGUgcGl4ZWwgdmFsdWVzIG91dCBvZiB8Yml0bWFwfC4KKyAg
ICAvLyBJZiBjcmVhdGlvbiBmYWlsZWQsIHJldHVybnMgbnVsbC4KKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYT4gY3JlYXRlKAorICAgICAgICBjb25zdCBT
a0JpdG1hcCYgYml0bWFwKTsKKworICAgIHZpcnR1YWwgYm9vbCBpc0JpdG1hcEltYWdlKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBJbnRTaXplIHNpemUoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIEludFNpemUobV9uYXRpdmVJbWFnZS53aWR0aCgpLCBtX25h
dGl2ZUltYWdlLmhlaWdodCgpKTsKKyAgICB9CisKKyAgICAvLyBEbyBub3RoaW5nLCBhcyB3ZSBv
bmx5IGhhdmUgdGhlIG9uZSByZXByZXNlbnRhdGlvbiBvZiBkYXRhIChkZWNvZGVkKS4KKyAgICB2
aXJ0dWFsIHZvaWQgZGVzdHJveURlY29kZWREYXRhKGJvb2wgZGVzdHJveUFsbCA9IHRydWUpIHsg
fQorCisgICAgdmlydHVhbCB1bnNpZ25lZCBkZWNvZGVkU2l6ZSgpIGNvbnN0CisgICAgeworICAg
ICAgICByZXR1cm4gbV9uYXRpdmVJbWFnZS5kZWNvZGVkU2l6ZSgpOworICAgIH0KKworICAgIC8v
IFdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBmcmFtZS4KKyAgICB2aXJ0dWFsIE5hdGl2ZUltYWdlUHRy
IG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiAmbV9u
YXRpdmVJbWFnZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhH
cmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9y
IGNvbXBvc2l0ZU9wKTsKKworcHJpdmF0ZToKKyAgICBOYXRpdmVJbWFnZVNraWEgbV9uYXRpdmVJ
bWFnZTsKKworICAgIC8vIFVzZSBjcmVhdGUoKS4KKyAgICBCaXRtYXBJbWFnZVNpbmdsZUZyYW1l
U2tpYSgpIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEJp
dG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvc2tpYS9Db2xvclNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL0NvbG9yU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4
MGE1NgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9D
b2xvclNraWEuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYs
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkNvbG9yLmgiCisKKyNpbmNsdWRlICJTa0NvbG9yLmgiCisKKyNpbmNsdWRlIDx3dGYv
QXNzZXJ0aW9ucy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NPTVBJTEVfQVNTRVJUKFNL
X0NvbG9yQkxBQ0sgPT0gQ29sb3I6OmJsYWNrLCBTa0NvbG9yQW5kQ29sb3JBcmVMYWlkT3V0VGhl
U2FtZSk7CisKK0NvbG9yIGZvY3VzUmluZ0NvbG9yKCkKK3sKKyAgICBzdGF0aWMgQ29sb3IgZm9j
dXNSaW5nQ29sb3IoMjI5LCAxNTEsIDAsIDI1NSk7CisgICAgcmV0dXJuIGZvY3VzUmluZ0NvbG9y
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvRmxvYXRQb2ludFNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9za2lhL0Zsb2F0UG9pbnRTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5hNGFjZTZkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9za2lhL0Zsb2F0UG9pbnRTa2lhLmNwcApAQCAtMCwwICsxLDUyIEBACisvKg0KKyAq
IENvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisg
KiANCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorICogbWV0Og0KKyAqIA0KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0DQorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQ0KKyAqIGRpc3RyaWJ1dGlvbi4NCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAq
IA0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMNCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUDQorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LA0KKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQ0KKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJjb25maWcuaCINCisjaW5jbHVkZSAi
RmxvYXRQb2ludC5oIg0KKw0KKyNpbmNsdWRlICJTa1BvaW50LmgiDQorI2luY2x1ZGUgIlNraWFV
dGlscy5oIg0KKw0KK25hbWVzcGFjZSBXZWJDb3JlIHsNCisNCitGbG9hdFBvaW50OjpGbG9hdFBv
aW50KGNvbnN0IFNrUG9pbnQmIHApDQorICAgIDogbV94KHAuZlgpDQorICAgICwgbV95KHAuZlkp
DQorew0KK30NCisNCitGbG9hdFBvaW50OjpvcGVyYXRvciBTa1BvaW50KCkgY29uc3QNCit7DQor
ICAgIFNrUG9pbnQgcCA9IHsgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihtX3gpLCBXZWJDb3JlRmxv
YXRUb1NrU2NhbGFyKG1feSkgfTsNCisgICAgcmV0dXJuIHA7DQorfQ0KKw0KK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUNCisNCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvRmxvYXRSZWN0U2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxv
YXRSZWN0U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5NWY4
NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9GbG9h
dFJlY3RTa2lhLmNwcApAQCAtMCwwICsxLDUxIEBACisvKg0KKyAqIENvcHlyaWdodCAoYykgMjAw
OCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiANCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQN
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlDQorICogbWV0Og0KKyAqIA0KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLg0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUNCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1
dGlvbi4NCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzDQorICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqIA0KKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMN
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsDQorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQ0KKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAq
Lw0KKw0KKyNpbmNsdWRlICJjb25maWcuaCINCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiDQorDQor
I2luY2x1ZGUgIlNrUmVjdC5oIg0KKw0KK25hbWVzcGFjZSBXZWJDb3JlIHsNCisNCitGbG9hdFJl
Y3Q6OkZsb2F0UmVjdChjb25zdCBTa1JlY3QmIHIpDQorICAgIDogbV9sb2NhdGlvbihyLmZMZWZ0
LCByLmZUb3ApDQorICAgICwgbV9zaXplKHIud2lkdGgoKSwgci5oZWlnaHQoKSkNCit7DQorfQ0K
Kw0KK0Zsb2F0UmVjdDo6b3BlcmF0b3IgU2tSZWN0KCkgY29uc3QNCit7DQorICAgIFNrUmVjdCBy
ZWN0ID0geyB4KCksIHkoKSwgcmlnaHQoKSwgYm90dG9tKCkgfTsNCisgICAgcmV0dXJuIHJlY3Q7
DQorfQ0KKw0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUNCisNCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR2RrU2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvR2RrU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uYjRjOGNlNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9HZGtTa2lhLmNwcApAQCAtMCwwICsxLDUxNiBAQAorLyogQmFzZWQgb24gR1RLIGNvZGUg
YnkgdGhlIENocm9taXVtIEF1dGhvcnMuIFRoZSBvcmlnaW5hbCBoZWFkZXIgZm9yIHRoYXQgY29k
ZQorICogY29udGludWVzIGJlbG93ICovCisKKy8qIEdESyAtIFRoZSBHSU1QIERyYXdpbmcgS2l0
CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBQZXRlciBNYXR0aXMsIFNwZW5jZXIgS2ltYmFs
bCBhbmQgSm9zaCBNYWNEb25hbGQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICog
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAz
MzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorICogTW9kaWZp
ZWQgYnkgdGhlIEdUSysgVGVhbSBhbmQgb3RoZXJzIDE5OTctMjAwMC4gIFNlZSB0aGUgQVVUSE9S
UworICogZmlsZSBmb3IgYSBsaXN0IG9mIHBlb3BsZSBvbiB0aGUgR1RLKyBUZWFtLiAgU2VlIHRo
ZSBDaGFuZ2VMb2cKKyAqIGZpbGVzIGZvciBhIGxpc3Qgb2YgY2hhbmdlcy4gIFRoZXNlIGZpbGVz
IGFyZSBkaXN0cmlidXRlZCB3aXRoCisgKiBHVEsrIGF0IGZ0cDovL2Z0cC5ndGsub3JnL3B1Yi9n
dGsvLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z2RrL2dkay5oPgor
I2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxT
a0RldmljZS5oPgorCisjaW5jbHVkZSAiR2RrU2tpYS5oIgorCitzdGF0aWMgR2RrR0MgKmdka19z
a2lhX2NyZWF0ZV9nYyAgICAgIChHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RrR0NWYWx1ZXMgICAgICp2YWx1ZXMsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZGtHQ1ZhbHVlc01hc2sgIG1h
c2spOworc3RhdGljIHZvaWQgICBnZGtfc2tpYV9kcmF3X3JlY3RhbmdsZSAoR2RrRHJhd2FibGUg
ICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdk
a0dDICAgICAgICAgICAqZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBnYm9vbGVhbiAgICAgICAgIGZpbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGdpbnQgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIGhlaWdodCk7CitzdGF0aWMg
dm9pZCAgIGdka19za2lhX2RyYXdfYXJjICAgICAgIChHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RrR0MgICAgICAgICAg
ICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuICAg
ICAgICAgZmlsbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lu
dCAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Z2ludCAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZ2ludCAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGdpbnQgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBhbmdsZTEsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIGFuZ2xlMik7CitzdGF0
aWMgdm9pZCAgIGdka19za2lhX2RyYXdfcG9seWdvbiAgIChHZGtEcmF3YWJsZSAgICAgKmRyYXdh
YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RrR0MgICAgICAg
ICAgICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFu
ICAgICAgICAgZmlsbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
R2RrUG9pbnQgICAgICAgICpwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBnaW50ICAgICAgICAgICAgIG5wb2ludHMpOworc3RhdGljIHZvaWQgICBnZGtfc2tp
YV9kcmF3X3RleHQgICAgICAoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdka0ZvbnQgICAgICAgICAqZm9udCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdka0dDICAgICAgICAgICAqZ2MsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHgs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAg
IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAg
ICAgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAg
ICAgICAgICAgIHRleHRfbGVuZ3RoKTsKK3N0YXRpYyB2b2lkICAgZ2RrX3NraWFfZHJhd190ZXh0
X3djICAgKEdka0RyYXdhYmxlICAgICAqZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBHZGtGb250ICAgICAgICAgKmZvbnQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBHZGtHQyAgICAgICAgICAgKmdjLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB4LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB5LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2RrV0NoYXIgICp0ZXh0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB0
ZXh0X2xlbmd0aCk7CitzdGF0aWMgdm9pZCAgIGdka19za2lhX2RyYXdfZHJhd2FibGUgIChHZGtE
cmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgR2RrR0MgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEdka1BpeG1hcCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB4c3JjLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB5c3JjLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB4ZGVzdCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgeWRlc3Qs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAg
IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAg
ICAgICAgICBoZWlnaHQpOworc3RhdGljIHZvaWQgICBnZGtfc2tpYV9kcmF3X3BvaW50cyAgICAo
R2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEdka0dDICAgICAgICAgICAqZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBHZGtQb2ludCAgICAgICAgKnBvaW50cywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgbnBvaW50cyk7CitzdGF0aWMg
dm9pZCAgIGdka19za2lhX2RyYXdfc2VnbWVudHMgIChHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RrR0MgICAgICAgICAg
ICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdka1NlZ21lbnQg
ICAgICAqc2VncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQg
ICAgICAgICAgICAgbnNlZ3MpOworc3RhdGljIHZvaWQgICBnZGtfc2tpYV9kcmF3X2xpbmVzICAg
ICAoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEdka0dDICAgICAgICAgICAqZ2MsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBHZGtQb2ludCAgICAgICAgKnBvaW50cywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgbnBvaW50cyk7CisKK3N0
YXRpYyB2b2lkIGdka19za2lhX2RyYXdfZ2x5cGhzICAgICAgICAgICAgIChHZGtEcmF3YWJsZSAg
ICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBHZGtHQyAgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBQYW5nb0ZvbnQgICAgICAgICpmb250LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgIHgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAg
ICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5n
b0dseXBoU3RyaW5nICpnbHlwaHMpOworc3RhdGljIHZvaWQgZ2RrX3NraWFfZHJhd19nbHlwaHNf
dHJhbnNmb3JtZWQgKEdka0RyYXdhYmxlICAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdka0dDICAgICAgICAgICAgKmdjLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmdvTWF0cml4ICAg
ICAgKm1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBQYW5nb0ZvbnQgICAgICAgICpmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICAgeSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5nb0dseXBoU3RyaW5nICpn
bHlwaHMpOworCitzdGF0aWMgdm9pZCAgIGdka19za2lhX2RyYXdfaW1hZ2UgICAgIChHZGtEcmF3
YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgR2RrR0MgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEdka0ltYWdlICAgICAgICAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHhzcmMsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHlzcmMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHhkZXN0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB5ZGVzdCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAg
d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAg
ICAgICAgIGhlaWdodCk7CitzdGF0aWMgdm9pZCAgIGdka19za2lhX2RyYXdfcGl4YnVmICAgIChH
ZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgR2RrR0MgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEdka1BpeGJ1ZiAgICAgICAqcGl4YnVmLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBzcmNfeCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgc3JjX3ksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIGRlc3Rf
eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAg
ICAgZGVzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAg
ICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGdpbnQgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgR2RrUmdiRGl0aGVyICAgICBkaXRoZXIsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHhfZGl0aGVyLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB5X2RpdGhlcik7Citz
dGF0aWMgdm9pZCAgZ2RrX3NraWFfZHJhd190cmFwZXpvaWRzIChHZGtEcmF3YWJsZSAgICAgKmRy
YXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RrR0MJICAg
ICAgICAgKmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RrVHJh
cGV6b2lkICAgICp0cmFwZXpvaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZ2ludCAgICAgICAgICAgICBuX3RyYXBlem9pZHMpOworCitzdGF0aWMgdm9pZCAgIGdk
a19za2lhX3JlYWxfZ2V0X3NpemUgIChHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICp3aWR0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAq
aGVpZ2h0KTsKKworc3RhdGljIEdka0ltYWdlKiBnZGtfc2tpYV9jb3B5X3RvX2ltYWdlIChHZGtE
cmF3YWJsZSAqZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEdka0ltYWdlICAgICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZ2ludCAgICAgICAgIHNyY194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBnaW50ICAgICAgICAgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICBkZXN0X3gsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICBkZXN0X3ksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICB3aWR0aCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgIGhlaWdodCk7
CisKK3N0YXRpYyBjYWlyb19zdXJmYWNlX3QgKmdka19za2lhX3JlZl9jYWlyb19zdXJmYWNlIChH
ZGtEcmF3YWJsZSAqZHJhd2FibGUpOworCitzdGF0aWMgR2RrVmlzdWFsKiAgIGdka19za2lhX3Jl
YWxfZ2V0X3Zpc3VhbCAgIChHZGtEcmF3YWJsZSAqZHJhd2FibGUpOworc3RhdGljIGdpbnQgICAg
ICAgICBnZGtfc2tpYV9yZWFsX2dldF9kZXB0aCAgICAoR2RrRHJhd2FibGUgKmRyYXdhYmxlKTsK
K3N0YXRpYyB2b2lkICAgICAgICAgZ2RrX3NraWFfcmVhbF9zZXRfY29sb3JtYXAgKEdka0RyYXdh
YmxlICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgR2RrQ29sb3JtYXAgKmNtYXApOworc3RhdGljIEdka0NvbG9ybWFwKiBnZGtfc2tp
YV9yZWFsX2dldF9jb2xvcm1hcCAoR2RrRHJhd2FibGUgKmRyYXdhYmxlKTsKK3N0YXRpYyBHZGtT
Y3JlZW4qICAgZ2RrX3NraWFfcmVhbF9nZXRfc2NyZWVuICAgKEdka0RyYXdhYmxlICpkcmF3YWJs
ZSk7CitzdGF0aWMgdm9pZCBnZGtfc2tpYV9pbml0ICAgICAgIChHZGtTa2lhT2JqZWN0ICAgICAg
KnNraWEpOworc3RhdGljIHZvaWQgZ2RrX3NraWFfY2xhc3NfaW5pdCAoR2RrU2tpYU9iamVjdENs
YXNzICprbGFzcyk7CitzdGF0aWMgdm9pZCBnZGtfc2tpYV9maW5hbGl6ZSAgIChHT2JqZWN0ICAg
ICAgICAgICAgICAqb2JqZWN0KTsKKworc3RhdGljIGdwb2ludGVyIHBhcmVudF9jbGFzcyA9IE5V
TEw7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc3VhbGx5IEdESyBjb2RlIGlzIEMg
Y29kZS4gSG93ZXZlciwgc2luY2Ugd2UgYXJlIGludGVyZmFjaW5nIHRvIGEgQysrCisvLyBsaWJy
YXJ5LCB3ZSBtdXN0IGNvbXBpbGUgaW4gQysrIG1vZGUgdG8gcGFyc2UgaXRzIGhlYWRlcnMgZXRj
LiBUaGFua2Z1bGx5LAorLy8gdGhlc2UgYXJlIHRoZSBvbmx5IG5vbi1zdGF0aWMgc3ltYm9sIGlu
IHRoZSBmaWxlIHNvIHdlIGNhbiBqdXN0IHdyYXAgdGhlbSBpbgorLy8gYW4gZXh0ZXJuIGRlY2wg
dG8gZGlzYWJsZSBuYW1lIG1hbmdsaW5nIGFuZCBldmVyeXRoaW5nIHNob3VsZCBiZSBoYXBweS4K
Ky8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitleHRlcm4gIkMiIHsKK0dUeXBlCitnZGtfc2tpYV9n
ZXRfdHlwZSAodm9pZCkKK3sKKyAgc3RhdGljIEdUeXBlIG9iamVjdF90eXBlID0gMDsKKworICBp
ZiAoIW9iamVjdF90eXBlKQorICAgIG9iamVjdF90eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRp
Y19zaW1wbGUgKEdES19UWVBFX0RSQVdBQkxFLAorCQkJCQkJICJHZGtTa2lhIiwKKwkJCQkJCSBz
aXplb2YgKEdka1NraWFPYmplY3RDbGFzcyksCisJCQkJCQkgKEdDbGFzc0luaXRGdW5jKSBnZGtf
c2tpYV9jbGFzc19pbml0LAorCQkJCQkJIHNpemVvZiAoR2RrU2tpYU9iamVjdCksCisJCQkJCQkg
KEdJbnN0YW5jZUluaXRGdW5jKSBnZGtfc2tpYV9pbml0LAorCQkJCQkJIChHVHlwZUZsYWdzKSAw
KTsKKyAgCisgIHJldHVybiBvYmplY3RfdHlwZTsKK30KKworR2RrU2tpYSoKK2dka19za2lhX25l
dyhTa0NhbnZhcyAqY2FudmFzKQoreworICBHZGtTa2lhICpza2lhID0gR0RLX1NLSUEoZ19vYmpl
Y3RfbmV3IChHREtfVFlQRV9TS0lBLCBOVUxMKSk7CisgIHJlaW50ZXJwcmV0X2Nhc3Q8R2RrU2tp
YU9iamVjdCo+KHNraWEpLT5jYW52YXMgPSBjYW52YXM7CisgIHJldHVybiBza2lhOworfQorCit9
ICAvLyBleHRlcm4gIkMiCisKK3N0YXRpYyB2b2lkCitnZGtfc2tpYV9pbml0IChHZGtTa2lhT2Jq
ZWN0ICpza2lhKQoreworICAvKiAwIGluaXRpYWxpemF0aW9uIGlzIGZpbmUgZm9yIHVzICovCit9
CisKK3N0YXRpYyB2b2lkCitnZGtfc2tpYV9jbGFzc19pbml0IChHZGtTa2lhT2JqZWN0Q2xhc3Mg
KmtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNT
IChrbGFzcyk7CisgIEdka0RyYXdhYmxlQ2xhc3MgKmRyYXdhYmxlX2NsYXNzID0gR0RLX0RSQVdB
QkxFX0NMQVNTIChrbGFzcyk7CisgIAorICBwYXJlbnRfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVl
a19wYXJlbnQgKGtsYXNzKTsKKworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gZ2RrX3NraWFf
ZmluYWxpemU7CisKKyAgZHJhd2FibGVfY2xhc3MtPmNyZWF0ZV9nYyA9IGdka19za2lhX2NyZWF0
ZV9nYzsKKyAgZHJhd2FibGVfY2xhc3MtPmRyYXdfcmVjdGFuZ2xlID0gZ2RrX3NraWFfZHJhd19y
ZWN0YW5nbGU7CisgIGRyYXdhYmxlX2NsYXNzLT5kcmF3X2FyYyA9IGdka19za2lhX2RyYXdfYXJj
OworICBkcmF3YWJsZV9jbGFzcy0+ZHJhd19wb2x5Z29uID0gZ2RrX3NraWFfZHJhd19wb2x5Z29u
OworICBkcmF3YWJsZV9jbGFzcy0+ZHJhd190ZXh0ID0gZ2RrX3NraWFfZHJhd190ZXh0OworICBk
cmF3YWJsZV9jbGFzcy0+ZHJhd190ZXh0X3djID0gZ2RrX3NraWFfZHJhd190ZXh0X3djOworICBk
cmF3YWJsZV9jbGFzcy0+ZHJhd19kcmF3YWJsZSA9IGdka19za2lhX2RyYXdfZHJhd2FibGU7Cisg
IGRyYXdhYmxlX2NsYXNzLT5kcmF3X3BvaW50cyA9IGdka19za2lhX2RyYXdfcG9pbnRzOworICBk
cmF3YWJsZV9jbGFzcy0+ZHJhd19zZWdtZW50cyA9IGdka19za2lhX2RyYXdfc2VnbWVudHM7Cisg
IGRyYXdhYmxlX2NsYXNzLT5kcmF3X2xpbmVzID0gZ2RrX3NraWFfZHJhd19saW5lczsKKyAgZHJh
d2FibGVfY2xhc3MtPmRyYXdfZ2x5cGhzID0gZ2RrX3NraWFfZHJhd19nbHlwaHM7CisgIGRyYXdh
YmxlX2NsYXNzLT5kcmF3X2dseXBoc190cmFuc2Zvcm1lZCA9IGdka19za2lhX2RyYXdfZ2x5cGhz
X3RyYW5zZm9ybWVkOworICBkcmF3YWJsZV9jbGFzcy0+ZHJhd19pbWFnZSA9IGdka19za2lhX2Ry
YXdfaW1hZ2U7CisgIGRyYXdhYmxlX2NsYXNzLT5kcmF3X3BpeGJ1ZiA9IGdka19za2lhX2RyYXdf
cGl4YnVmOworICBkcmF3YWJsZV9jbGFzcy0+ZHJhd190cmFwZXpvaWRzID0gZ2RrX3NraWFfZHJh
d190cmFwZXpvaWRzOworICBkcmF3YWJsZV9jbGFzcy0+Z2V0X2RlcHRoID0gZ2RrX3NraWFfcmVh
bF9nZXRfZGVwdGg7CisgIGRyYXdhYmxlX2NsYXNzLT5nZXRfc2NyZWVuID0gZ2RrX3NraWFfcmVh
bF9nZXRfc2NyZWVuOworICBkcmF3YWJsZV9jbGFzcy0+Z2V0X3NpemUgPSBnZGtfc2tpYV9yZWFs
X2dldF9zaXplOworICBkcmF3YWJsZV9jbGFzcy0+c2V0X2NvbG9ybWFwID0gZ2RrX3NraWFfcmVh
bF9zZXRfY29sb3JtYXA7CisgIGRyYXdhYmxlX2NsYXNzLT5nZXRfY29sb3JtYXAgPSBnZGtfc2tp
YV9yZWFsX2dldF9jb2xvcm1hcDsKKyAgZHJhd2FibGVfY2xhc3MtPmdldF92aXN1YWwgPSBnZGtf
c2tpYV9yZWFsX2dldF92aXN1YWw7CisgIGRyYXdhYmxlX2NsYXNzLT5fY29weV90b19pbWFnZSA9
IGdka19za2lhX2NvcHlfdG9faW1hZ2U7CisgIGRyYXdhYmxlX2NsYXNzLT5yZWZfY2Fpcm9fc3Vy
ZmFjZSA9IGdka19za2lhX3JlZl9jYWlyb19zdXJmYWNlOworfQorCitzdGF0aWMgdm9pZAorZ2Rr
X3NraWFfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgR2RrU2tpYU9iamVjdCAqY29u
c3Qgc2tpYSA9IChHZGtTa2lhT2JqZWN0ICopIG9iamVjdDsKKyAgaWYgKHNraWEtPnN1cmZhY2Up
CisgICAgY2Fpcm9fc3VyZmFjZV9kZXN0cm95KHNraWEtPnN1cmZhY2UpOworICBHX09CSkVDVF9D
TEFTUyAocGFyZW50X2NsYXNzKS0+ZmluYWxpemUob2JqZWN0KTsKK30KKworI2RlZmluZSBOT1RJ
TVBMRU1FTlRFRCBmcHJpbnRmKHN0ZGVyciwgIkdESyBTa2lhIG5vdCBpbXBsZW1lbnRlZDogJXNc
biIsIF9fUFJFVFRZX0ZVTkNUSU9OX18pCisKK3N0YXRpYyBHZGtHQyAqCitnZGtfc2tpYV9jcmVh
dGVfZ2MoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICBHZGtH
Q1ZhbHVlcyAgICAgKnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICBHZGtHQ1ZhbHVlc01hc2sg
IG1hc2spIHsKKyAgTk9USU1QTEVNRU5URUQ7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMg
dm9pZAorZ2Nfc2V0X3BhaW50KEdka0dDICpnYywgU2tQYWludCAqcGFpbnQpIHsKKyAgR2RrR0NW
YWx1ZXMgdmFsdWVzOworICBnZGtfZ2NfZ2V0X3ZhbHVlcyhnYywgJnZhbHVlcyk7CisKKyAgcGFp
bnQtPnNldEFSR0IoMjU1LAorICAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yZWdyb3VuZC5waXhl
bCA+PiAxNiwKKyAgICAgICAgICAgICAgICAgdmFsdWVzLmZvcmVncm91bmQucGl4ZWwgPj4gOCwK
KyAgICAgICAgICAgICAgICAgdmFsdWVzLmZvcmVncm91bmQucGl4ZWwpOworICBwYWludC0+c2V0
U3Ryb2tlV2lkdGgodmFsdWVzLmxpbmVfd2lkdGgpOworfQorCitzdGF0aWMgdm9pZAorZ2RrX3Nr
aWFfZHJhd19yZWN0YW5nbGUoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIEdka0dDICAgICAgICAgICAqZ2MsCisgICAgICAgICAgICAgICAgICAgICAg
ICBnYm9vbGVhbiAgICAgICAgIGZpbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQg
ICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAg
eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgd2lkdGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIGhlaWdodCkgeworICBHZGtTa2lh
T2JqZWN0ICpza2lhID0gKEdka1NraWFPYmplY3QgKikgZHJhd2FibGU7CisgIFNrUGFpbnQgcGFp
bnQ7CisgIGdjX3NldF9wYWludChnYywgJnBhaW50KTsKKworICBpZiAoZmlsbGVkKSB7CisgICAg
cGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOworICB9IGVsc2UgeworICAgIHBh
aW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOworICB9CisKKyAgU2tSZWN0IHJl
Y3Q7CisgIHJlY3Quc2V0KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCk7CisKKyAgc2tpYS0+
Y2FudmFzLT5kcmF3UmVjdChyZWN0LCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkCitnZGtfc2tp
YV9kcmF3X2FyYyhHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAg
R2RrR0MgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAgICAgIGdib29sZWFuICAgICAgICAg
ZmlsbGVkLAorICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICB4LAorICAgICAgICAg
ICAgICAgICAgZ2ludCAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgZ2ludCAgICAg
ICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgaGVpZ2h0
LAorICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBhbmdsZTEsCisgICAgICAgICAg
ICAgICAgICBnaW50ICAgICAgICAgICAgIGFuZ2xlMikgeworICBOT1RJTVBMRU1FTlRFRDsgICAg
ICAgICAgICAgICAgICAgCit9CisKK3N0YXRpYyB2b2lkCitnZGtfc2tpYV9kcmF3X3BvbHlnb24o
R2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBHZGtHQyAg
ICAgICAgICAgKmdjLAorICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuICAgICAgICAgZmls
bGVkLAorICAgICAgICAgICAgICAgICAgICAgIEdka1BvaW50ICAgICAgICAqcG9pbnRzLAorICAg
ICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgbnBvaW50cykgeworICBOT1RJTVBM
RU1FTlRFRDsKK30KKworc3RhdGljIHZvaWQKK2dka19za2lhX2RyYXdfdGV4dChHZGtEcmF3YWJs
ZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgIEdka0ZvbnQgICAgICAgICAqZm9u
dCwKKyAgICAgICAgICAgICAgICAgICBHZGtHQyAgICAgICAgICAgKmdjLAorICAgICAgICAgICAg
ICAgICAgIGdpbnQgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICBnaW50ICAgICAg
ICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICp0ZXh0LAorICAg
ICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgdGV4dF9sZW5ndGgpIHsKKyAgTk9USU1Q
TEVNRU5URUQ7Cit9CisKK3N0YXRpYyB2b2lkCitnZGtfc2tpYV9kcmF3X3RleHRfd2MoR2RrRHJh
d2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBHZGtGb250ICAgICAg
ICAgKmZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgR2RrR0MgICAgICAgICAgICpnYywKKyAg
ICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAg
ICAgICAgZ2ludCAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdk
a1dDaGFyICAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHRl
eHRfbGVuZ3RoKSB7CisgIE5PVElNUExFTUVOVEVEOworfQorCitzdGF0aWMgdm9pZAorZ2RrX3Nr
aWFfZHJhd19kcmF3YWJsZShHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAg
ICAgICAgICAgICBHZGtHQyAgICAgICAgICAgKmdjLAorICAgICAgICAgICAgICAgICAgICAgICBH
ZGtQaXhtYXAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAg
ICAgICB4c3JjLAorICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHlzcmMs
CisgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgeGRlc3QsCisgICAgICAg
ICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgeWRlc3QsCisgICAgICAgICAgICAgICAg
ICAgICAgIGdpbnQgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGdp
bnQgICAgICAgICAgICAgaGVpZ2h0KSB7CisgIE5PVElNUExFTUVOVEVEOworfQorCitzdGF0aWMg
dm9pZAorZ2RrX3NraWFfZHJhd19wb2ludHMoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAg
ICAgICAgICAgICAgICAgICAgIEdka0dDICAgICAgICAgICAqZ2MsCisgICAgICAgICAgICAgICAg
ICAgICBHZGtQb2ludCAgICAgICAgKnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgIGdpbnQg
ICAgICAgICAgICAgbnBvaW50cykgeworICBOT1RJTVBMRU1FTlRFRDsKK30KKworc3RhdGljIHZv
aWQKK2dka19za2lhX2RyYXdfc2VnbWVudHMoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgR2RrR0MgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAg
ICAgICAgICAgR2RrU2VnbWVudCAgICAgICpzZWdzLAorICAgICAgICAgICAgICAgICAgICAgICBn
aW50ICAgICAgICAgICAgIG5zZWdzKSB7CisgIE5PVElNUExFTUVOVEVEOworfQorCitzdGF0aWMg
dm9pZAorZ2RrX3NraWFfZHJhd19saW5lcyhHZGtEcmF3YWJsZSAgICAgKmRyYXdhYmxlLAorICAg
ICAgICAgICAgICAgICAgICBHZGtHQyAgICAgICAgICAgKmdjLAorICAgICAgICAgICAgICAgICAg
ICBHZGtQb2ludCAgICAgICAgKnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAg
ICAgICAgICBucG9pbnRzKSB7CisgIE5PVElNUExFTUVOVEVEOworfQorCitzdGF0aWMgdm9pZAor
Z2RrX3NraWFfZHJhd19nbHlwaHMoR2RrRHJhd2FibGUgICAgICAqZHJhd2FibGUsCisgICAgICAg
ICAgICAgICAgICAgICBHZGtHQyAgICAgICAgICAgICpnYywKKyAgICAgICAgICAgICAgICAgICAg
IFBhbmdvRm9udCAgICAgICAgKmZvbnQsCisgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAg
ICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICAgeSwKKyAg
ICAgICAgICAgICAgICAgICAgIFBhbmdvR2x5cGhTdHJpbmcgKmdseXBocykgeworICBOT1RJTVBM
RU1FTlRFRDsKK30KKworc3RhdGljIHZvaWQKK2dka19za2lhX2RyYXdfZ2x5cGhzX3RyYW5zZm9y
bWVkKEdka0RyYXdhYmxlICAgICAgKmRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgR2RrR0MgICAgICAgICAgICAqZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBQYW5nb01hdHJpeCAgICAgICptYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBQYW5nb0ZvbnQgICAgICAgICpmb250LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGdpbnQgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBQYW5nb0dseXBoU3RyaW5nICpnbHlwaHMpIHsKKyAgTk9USU1QTEVNRU5URUQ7Cit9
CisKK3N0YXRpYyB2b2lkCitnZGtfc2tpYV9kcmF3X2ltYWdlKEdka0RyYXdhYmxlICAgICAqZHJh
d2FibGUsCisgICAgICAgICAgICAgICAgICAgIEdka0dDICAgICAgICAgICAqZ2MsCisgICAgICAg
ICAgICAgICAgICAgIEdka0ltYWdlICAgICAgICAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAg
IGdpbnQgICAgICAgICAgICAgeHNyYywKKyAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAg
ICAgICB5c3JjLAorICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHhkZXN0LAor
ICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHlkZXN0LAorICAgICAgICAgICAg
ICAgICAgICBnaW50ICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBnaW50
ICAgICAgICAgICAgIGhlaWdodCkgeworICBOT1RJTVBMRU1FTlRFRDsKK30KKworc3RhdGljIHZv
aWQKK2dka19za2lhX2RyYXdfcGl4YnVmKEdka0RyYXdhYmxlICAgICAqZHJhd2FibGUsCisgICAg
ICAgICAgICAgICAgICAgICBHZGtHQyAgICAgICAgICAgKmdjLAorICAgICAgICAgICAgICAgICAg
ICAgR2RrUGl4YnVmICAgICAgICpwaXhidWYsCisgICAgICAgICAgICAgICAgICAgICBnaW50ICAg
ICAgICAgICAgIHNyY194LAorICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBz
cmNfeSwKKyAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgZGVzdF94LAorICAg
ICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICBkZXN0X3ksCisgICAgICAgICAgICAg
ICAgICAgICBnaW50ICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgZ2lu
dCAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBHZGtSZ2JEaXRoZXIg
ICAgIGRpdGhlciwKKyAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICAgICAgeF9kaXRo
ZXIsCisgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgICAgIHlfZGl0aGVyKSB7Cisg
IE5PVElNUExFTUVOVEVEOworfQorCitzdGF0aWMgdm9pZAorZ2RrX3NraWFfZHJhd190cmFwZXpv
aWRzKEdka0RyYXdhYmxlICAgICAqZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
R2RrR0MJICAgICAgICAgKmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdka1RyYXBlem9p
ZCAgICAqdHJhcGV6b2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAg
ICAgIG5fdHJhcGV6b2lkcykgeworICBOT1RJTVBMRU1FTlRFRDsKK30KKworc3RhdGljIHZvaWQK
K2dka19za2lhX3JlYWxfZ2V0X3NpemUoR2RrRHJhd2FibGUgICAgICpkcmF3YWJsZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgZ2ludCAgICAgICAgICAgICp3aWR0aCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgZ2ludCAgICAgICAgICAgICpoZWlnaHQpIHsKKyAgR2RrU2tpYU9iamVjdCAqY29u
c3Qgc2tpYSA9IChHZGtTa2lhT2JqZWN0ICopIGRyYXdhYmxlOworICBTa0RldmljZSAqY29uc3Qg
ZGV2ID0gc2tpYS0+Y2FudmFzLT5nZXREZXZpY2UoKTsKKyAgKndpZHRoID0gZGV2LT53aWR0aCgp
OworICAqaGVpZ2h0ID0gZGV2LT5oZWlnaHQoKTsKK30KKworc3RhdGljIEdka0ltYWdlKgorZ2Rr
X3NraWFfY29weV90b19pbWFnZShHZGtEcmF3YWJsZSAqZHJhd2FibGUsCisgICAgICAgICAgICAg
ICAgICAgICAgIEdka0ltYWdlICAgICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2lu
dCAgICAgICAgIHNyY194LAorICAgICAgICAgICAgICAgICAgICAgICBnaW50ICAgICAgICAgc3Jj
X3ksCisgICAgICAgICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICBkZXN0X3gsCisgICAgICAg
ICAgICAgICAgICAgICAgIGdpbnQgICAgICAgICBkZXN0X3ksCisgICAgICAgICAgICAgICAgICAg
ICAgIGdpbnQgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2ludCAgICAg
ICAgIGhlaWdodCkgeworICBOT1RJTVBMRU1FTlRFRDsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0
YXRpYyBjYWlyb19zdXJmYWNlX3QgKgorZ2RrX3NraWFfcmVmX2NhaXJvX3N1cmZhY2UoR2RrRHJh
d2FibGUgKmRyYXdhYmxlKSB7CisgIEdka1NraWFPYmplY3QgKmNvbnN0IHNraWEgPSAoR2RrU2tp
YU9iamVjdCAqKSBkcmF3YWJsZTsKKworICBpZiAoIXNraWEtPnN1cmZhY2UpIHsKKyAgICBTa0Rl
dmljZSAqY29uc3QgZGV2ID0gc2tpYS0+Y2FudmFzLT5nZXREZXZpY2UoKTsKKyAgICBjb25zdCBT
a0JpdG1hcCAqY29uc3QgYm0gPSAmZGV2LT5hY2Nlc3NCaXRtYXAodHJ1ZSk7CisKKyAgICBza2lh
LT5zdXJmYWNlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVhdGVfZm9yX2RhdGEKKyAgICAgICgo
dW5zaWduZWQgY2hhciAqKSBibS0+Z2V0UGl4ZWxzKCksCisgICAgICAgQ0FJUk9fRk9STUFUX0FS
R0IzMiwgZGV2LT53aWR0aCgpLCBkZXYtPmhlaWdodCgpLCBibS0+cm93Qnl0ZXMoKSk7CisgIH0K
KworICBTa01hdHJpeCBtYXRyaXggPSBza2lhLT5jYW52YXMtPmdldFRvdGFsTWF0cml4KCk7Cisg
IGludCB4X3NoaWZ0ID0gU2tTY2FsYXJSb3VuZChtYXRyaXguZ2V0VHJhbnNsYXRlWCgpKTsKKyAg
aW50IHlfc2hpZnQgPSBTa1NjYWxhclJvdW5kKG1hdHJpeC5nZXRUcmFuc2xhdGVZKCkpOworICBj
YWlyb19zdXJmYWNlX3NldF9kZXZpY2Vfb2Zmc2V0KHNraWEtPnN1cmZhY2UsIHhfc2hpZnQsIHlf
c2hpZnQpOworCisgIHJldHVybiBjYWlyb19zdXJmYWNlX3JlZmVyZW5jZShza2lhLT5zdXJmYWNl
KTsKK30KKworc3RhdGljIEdka1Zpc3VhbCoKK2dka19za2lhX3JlYWxfZ2V0X3Zpc3VhbChHZGtE
cmF3YWJsZSAqZHJhd2FibGUpIHsKKyAgTk9USU1QTEVNRU5URUQ7CisgIHJldHVybiBOVUxMOwor
fQorCitzdGF0aWMgZ2ludAorZ2RrX3NraWFfcmVhbF9nZXRfZGVwdGgoR2RrRHJhd2FibGUgKmRy
YXdhYmxlKSB7CisgIEdka1NraWFPYmplY3QgKnNraWEgPSAoR2RrU2tpYU9iamVjdCAqKSBkcmF3
YWJsZTsKKyAgY29uc3QgU2tCaXRtYXA6OkNvbmZpZyBjb25maWcgPSBza2lhLT5jYW52YXMtPmdl
dERldmljZSgpLT5jb25maWcoKTsKKworICBzd2l0Y2ggKGNvbmZpZykgeworICAgIGNhc2UgU2tC
aXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnOgorICAgICAgcmV0dXJuIDI0OworICAgIGRlZmF1bHQ6
CisgICAgICAvLyBOT1RSRUFDSEVECisgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oTlVM
TCkgPSAwOworICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIHZvaWQKK2dka19za2lh
X3JlYWxfc2V0X2NvbG9ybWFwKEdka0RyYXdhYmxlICpkcmF3YWJsZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEdka0NvbG9ybWFwICpjbWFwKSB7CisgIE5PVElNUExFTUVOVEVEOworfQor
CitzdGF0aWMgR2RrQ29sb3JtYXAqCitnZGtfc2tpYV9yZWFsX2dldF9jb2xvcm1hcChHZGtEcmF3
YWJsZSAqZHJhd2FibGUpIHsKKyAgTk9USU1QTEVNRU5URUQ7CisgIHJldHVybiBOVUxMOworfQor
CitzdGF0aWMgR2RrU2NyZWVuKiAgIAorZ2RrX3NraWFfcmVhbF9nZXRfc2NyZWVuKEdka0RyYXdh
YmxlICpkcmF3YWJsZSkgeworICBOT1RJTVBMRU1FTlRFRDsKKyAgcmV0dXJuIE5VTEw7Cit9CmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR2RrU2tpYS5oIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dka1NraWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi42ZTZiNzZhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9za2lhL0dka1NraWEuaApAQCAtMCwwICsxLDc0IEBACisvKiBCYXNlZCBv
biBHVEsgY29kZSBieSB0aGUgQ2hyb21pdW0gQXV0aG9ycy4gVGhlIG9yaWdpbmFsIGhlYWRlciBm
b3IgdGhhdCBjb2RlCisgKiBjb250aW51ZXMgYmVsb3cgKi8KKworLyogR0RLIC0gVGhlIEdJTVAg
RHJhd2luZyBLaXQKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IFBldGVyIE1hdHRpcywgU3Bl
bmNlciBLaW1iYWxsIGFuZCBKb3NoIE1hY0RvbmFsZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUg
dG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFj
ZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8q
CisgKiBNb2RpZmllZCBieSB0aGUgR1RLKyBUZWFtIGFuZCBvdGhlcnMgMTk5Ny0yMDAwLiAgU2Vl
IHRoZSBBVVRIT1JTCisgKiBmaWxlIGZvciBhIGxpc3Qgb2YgcGVvcGxlIG9uIHRoZSBHVEsrIFRl
YW0uICBTZWUgdGhlIENoYW5nZUxvZworICogZmlsZXMgZm9yIGEgbGlzdCBvZiBjaGFuZ2VzLiAg
VGhlc2UgZmlsZXMgYXJlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqIEdUSysgYXQgZnRwOi8vZnRwLmd0
ay5vcmcvcHViL2d0ay8uCisgKi8KKworI2lmbmRlZiBfX0dES19TS0lBX0hfXworI2RlZmluZSBf
X0dES19TS0lBX0hfXworCisjaW5jbHVkZSA8Z2RrL2dkay5oPgorI2luY2x1ZGUgPGNhaXJvL2Nh
aXJvLmg+CisKK2NsYXNzIFNrQ2FudmFzOworCitHX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgc3Ry
dWN0IF9HZGtTa2lhT2JqZWN0IEdka1NraWFPYmplY3Q7Cit0eXBlZGVmIHN0cnVjdCBfR2RrU2tp
YU9iamVjdENsYXNzIEdka1NraWFPYmplY3RDbGFzczsKKwordHlwZWRlZiBzdHJ1Y3QgX0dka0Ry
YXdhYmxlIEdka1NraWE7CisKKyNkZWZpbmUgR0RLX1RZUEVfU0tJQSAgICAgICAgICAgICAgKGdk
a19za2lhX2dldF90eXBlICgpKQorI2RlZmluZSBHREtfU0tJQShvYmplY3QpICAgICAgICAgICAo
R19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmplY3QpLCBHREtfVFlQRV9TS0lBLCBHZGtT
a2lhKSkKKyNkZWZpbmUgR0RLX1NLSUFfQ0xBU1Moa2xhc3MpICAgICAgKEdfVFlQRV9DSEVDS19D
TEFTU19DQVNUICgoa2xhc3MpLCBHREtfVFlQRV9TS0lBLCBHZGtTa2lhT2JqZWN0Q2xhc3MpKQor
I2RlZmluZSBHREtfSVNfU0tJQShvYmplY3QpICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNF
X1RZUEUgKChvYmplY3QpLCBHREtfVFlQRV9TS0lBKSkKKyNkZWZpbmUgR0RLX0lTX1NLSUFfQ0xB
U1Moa2xhc3MpICAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoa2xhc3MpLCBHREtfVFlQRV9T
S0lBKSkKKyNkZWZpbmUgR0RLX1NLSUFfR0VUX0NMQVNTKG9iaikgICAgKEdfVFlQRV9JTlNUQU5D
RV9HRVRfQ0xBU1MgKChvYmopLCBHREtfVFlQRV9TS0lBLCBHZGtTa2lhT2JqZWN0Q2xhc3MpKQor
I2RlZmluZSBHREtfU0tJQV9PQkpFQ1Qob2JqZWN0KSAgICAoKEdka1NraWFPYmplY3QgKikgR0RL
X1NLSUEgKG9iamVjdCkpCisKK3N0cnVjdCBfR2RrU2tpYU9iamVjdAoreworICBHZGtEcmF3YWJs
ZSBwYXJlbnRfaW5zdGFuY2U7CisgIFNrQ2FudmFzICpjYW52YXM7CisgIGNhaXJvX3N1cmZhY2Vf
dCAqc3VyZmFjZTsKK307CisKK3N0cnVjdCBfR2RrU2tpYU9iamVjdENsYXNzCit7CisgIEdka0Ry
YXdhYmxlQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworR1R5cGUgZ2RrX3NraWFfZ2V0X3R5cGUo
KTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldHVybiBhIG5ldyBHZGtTa2lhIGZv
ciB0aGUgZ2l2ZW4gY2FudmFzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dka1NraWEqIGdk
a19za2lhX25ldyhTa0NhbnZhcyogY2FudmFzKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8q
IF9fR0RLX1NLSUFfSF9fICovCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3NraWEvR3JhZGllbnRTa2lhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9H
cmFkaWVudFNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzg5
YzMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
ZGllbnRTa2lhLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKGMpIDIw
MDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICogDQorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisgKiANCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4NCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlDQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisgKiBkaXN0cmli
dXRpb24uDQorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cw0KKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKiANCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
DQorICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLA0KKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkNCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUDQorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisg
Ki8NCisNCisjaW5jbHVkZSAiY29uZmlnLmgiDQorI2luY2x1ZGUgIkdyYWRpZW50LmgiDQorDQor
I2luY2x1ZGUgIkNTU1BhcnNlci5oIg0KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCINCisN
CisjaW5jbHVkZSAiU2tHcmFkaWVudFNoYWRlci5oIg0KKyNpbmNsdWRlICJTa2lhVXRpbHMuaCIN
CisNCituYW1lc3BhY2UgV2ViQ29yZSB7DQorDQordm9pZCBHcmFkaWVudDo6cGxhdGZvcm1EZXN0
cm95KCkNCit7DQorICAgIGlmIChtX2dyYWRpZW50KQ0KKyAgICAgICAgbV9ncmFkaWVudC0+c2Fm
ZVVucmVmKCk7DQorICAgIG1fZ3JhZGllbnQgPSAwOw0KK30NCisNCitzdGF0aWMgaW5saW5lIFU4
Q1BVIEYyQihmbG9hdCB4KQ0KK3sNCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oeCAqIDI1
NSk7DQorfQ0KKw0KK3N0YXRpYyBTa0NvbG9yIG1ha2VTa0NvbG9yKGZsb2F0IGEsIGZsb2F0IHIs
IGZsb2F0IGcsIGZsb2F0IGIpDQorew0KKyAgICByZXR1cm4gU2tDb2xvclNldEFSR0IoRjJCKGEp
LCBGMkIociksIEYyQihnKSwgRjJCKGIpKTsNCit9DQorDQorLy8gRGV0ZXJtaW5lIHRoZSB0b3Rh
bCBudW1iZXIgb2Ygc3RvcHMgbmVlZGVkLCBpbmNsdWRpbmcgcHNldWRvLXN0b3BzIGF0IHRoZQ0K
Ky8vIGVuZHMgYXMgbmVjZXNzYXJ5Lg0KK3N0YXRpYyBzaXplX3QgdG90YWxfc3RvcHNfbmVlZGVk
KGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AqIHN0b3BEYXRhLCBzaXplX3QgY291bnQpDQorew0K
KyAgICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wKiBzdG9wID0gc3RvcERhdGE7DQorICAgIHNp
emVfdCBjb3VudF91c2VkID0gY291bnQ7DQorICAgIGlmIChjb3VudCA8IDEgfHwgc3RvcC0+c3Rv
cCA+IDAuMCkNCisgICAgICBjb3VudF91c2VkKys7DQorICAgIHN0b3AgKz0gY291bnQgLSAxOw0K
KyAgICBpZiAoY291bnQgPCAyIHx8IHN0b3AtPnN0b3AgPCAxLjApDQorICAgICAgY291bnRfdXNl
ZCsrOw0KKyAgICByZXR1cm4gY291bnRfdXNlZDsNCit9DQorDQorLy8gQ29sbGVjdCBzb3J0ZWQg
c3RvcCBwb3NpdGlvbiBhbmQgY29sb3IgaW5mb3JtYXRpb24gaW50byB0aGUgcG9zIGFuZCBjb2xv
cnMgDQorLy8gYnVmZmVycywgZW5zdXJpbmcgc3RvcHMgYXQgYm90aCAwLjAgYW5kIDEuMC4gIFRo
ZSBidWZmZXJzIG11c3QgYmUgbGFyZ2UNCisvLyBlbm91Z2ggdG8gaG9sZCBpbmZvcm1hdGlvbiBm
b3IgYWxsIHN0b3BzLCBpbmNsdWRpbmcgdGhlIG5ldyBlbmRwb2ludHMgaWYNCisvLyBzdG9wcyBh
dCAwLjAgYW5kIDEuMCBhcmVuJ3QgYWxyZWFkeSBpbmNsdWRlZC4NCitzdGF0aWMgdm9pZCBmaWxs
X3N0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AqIHN0b3BEYXRhLA0KKyAgICAgICAgICAg
ICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBTa1NjYWxhciogcG9zLCBTa0NvbG9yKiBjb2xvcnMp
DQoreyANCisgICAgY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCogc3RvcCA9IHN0b3BEYXRhOw0K
KyAgICBzaXplX3Qgc3RhcnQgPSAwOw0KKyAgICBpZiAoY291bnQgPCAxKSB7DQorICAgICAgICAv
LyBBIGdyYWRpZW50IHdpdGggbm8gc3RvcHMgbXVzdCBiZSB0cmFuc3BhcmVudCBibGFjay4NCisg
ICAgICAgIHBvc1swXSA9IFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoMC4wKTsNCisgICAgICAgIGNv
bG9yc1swXSA9IG1ha2VTa0NvbG9yKDAuMCwgMC4wLCAwLjAsIDAuMCk7DQorICAgICAgICBzdGFy
dCA9IDE7DQorICAgIH0gZWxzZSBpZiAoc3RvcC0+c3RvcCA+IDAuMCkgew0KKyAgICAgICAgLy8g
Q29weSB0aGUgZmlyc3Qgc3RvcCB0byAwLjAuIFRoZSBmaXJzdCBzdG9wIHBvc2l0aW9uIG1heSBo
YXZlIGEgc2xpZ2h0DQorICAgICAgICAvLyByb3VuZGluZyBlcnJvciwgYnV0IHdlIGRvbid0IGNh
cmUgaW4gdGhpcyBmbG9hdCBjb21wYXJpc29uLCBzaW5jZQ0KKyAgICAgICAgLy8gMC4wIGNvbWVz
IHRocm91Z2ggY2xlYW5seSBhbmQgcGVvcGxlIGFyZW4ndCBsaWtlbHkgdG8gd2FudCBhIGdyYWRp
ZW50DQorICAgICAgICAvLyB3aXRoIGEgc3RvcCBhdCAoMCArIGVwc2lsb24pLg0KKyAgICAgICAg
cG9zWzBdID0gV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcigwLjApOw0KKyAgICAgICAgY29sb3JzWzBd
ID0gbWFrZVNrQ29sb3Ioc3RvcC0+YWxwaGEsIHN0b3AtPnJlZCwgc3RvcC0+Z3JlZW4sIHN0b3At
PmJsdWUpOw0KKyAgICAgICAgc3RhcnQgPSAxOw0KKyAgICB9DQorDQorICAgIGZvciAoc2l6ZV90
IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykgew0KKyAgICAgICAgcG9zW2ldID0g
V2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzdG9wLT5zdG9wKTsNCisgICAgICAgIGNvbG9yc1tpXSA9
IG1ha2VTa0NvbG9yKHN0b3AtPmFscGhhLCBzdG9wLT5yZWQsIHN0b3AtPmdyZWVuLCBzdG9wLT5i
bHVlKTsNCisgICAgICAgICsrc3RvcDsNCisgICAgfQ0KKw0KKyAgICAvLyBDb3B5IHRoZSBsYXN0
IHN0b3AgdG8gMS4wIGlmIG5lZWRlZC4gIFNlZSBjb21tZW50IGFib3ZlIGFib3V0IHRoaXMgZmxv
YXQNCisgICAgLy8gY29tcGFyaXNvbi4NCisgICAgaWYgKGNvdW50IDwgMSB8fCAoLS1zdG9wKS0+
c3RvcCA8IDEuMCkgew0KKyAgICAgICAgcG9zW3N0YXJ0ICsgY291bnRdID0gV2ViQ29yZUZsb2F0
VG9Ta1NjYWxhcigxLjApOw0KKyAgICAgICAgY29sb3JzW3N0YXJ0ICsgY291bnRdID0gY29sb3Jz
W3N0YXJ0ICsgY291bnQgLSAxXTsNCisgICAgfQ0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wg
Y29tcGFyZVN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGEsIGNvbnN0IEdyYWRpZW50
OjpDb2xvclN0b3AmIGIpDQorew0KKyAgICByZXR1cm4gYS5zdG9wIDwgYi5zdG9wOw0KK30NCisN
CitTa1NoYWRlciogR3JhZGllbnQ6OnBsYXRmb3JtR3JhZGllbnQoKQ0KK3sNCisgICAgaWYgKG1f
Z3JhZGllbnQpDQorICAgICAgICByZXR1cm4gbV9ncmFkaWVudDsNCisNCisgICAgLy8gVE9ETzog
VGhpcyBhbmQgY29tcGFyZVN0b3BzKCkgYXJlIGFsc28gaW4gR3JhZGllbnQuY3BwIGFuZA0KKyAg
ICAvLyBDU1NHcmFkaWVudFZhbHVlLmNwcDsgcHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGluIFdl
YktpdC4NCisgICAgaWYgKCFtX3N0b3BzU29ydGVkKSB7DQorICAgICAgICBpZiAobV9zdG9wcy5z
aXplKCkpDQorICAgICAgICAgICAgc3RkOjpzdGFibGVfc29ydChtX3N0b3BzLmJlZ2luKCksIG1f
c3RvcHMuZW5kKCksIGNvbXBhcmVTdG9wcyk7DQorICAgICAgICBtX3N0b3BzU29ydGVkID0gdHJ1
ZTsNCisgICAgfQ0KKyAgICBzaXplX3QgY291bnRfdXNlZCA9IHRvdGFsX3N0b3BzX25lZWRlZCht
X3N0b3BzLmRhdGEoKSwgbV9zdG9wcy5zaXplKCkpOw0KKyAgICBBU1NFUlQoY291bnRfdXNlZCA+
PSAyKTsNCisgICAgQVNTRVJUKGNvdW50X3VzZWQgPj0gbV9zdG9wcy5zaXplKCkpOw0KKw0KKyAg
ICAvLyBGSVhNRTogV2h5IGlzIGFsbCB0aGlzIG1hbnVhbCBwb2ludGVyIG1hdGggbmVlZGVkPyEN
CisgICAgU2tBdXRvTWFsbG9jIHN0b3JhZ2UoY291bnRfdXNlZCAqIChzaXplb2YoU2tDb2xvcikg
KyBzaXplb2YoU2tTY2FsYXIpKSk7DQorICAgIFNrQ29sb3IqIGNvbG9ycyA9IChTa0NvbG9yKilz
dG9yYWdlLmdldCgpOw0KKyAgICBTa1NjYWxhciogcG9zID0gKFNrU2NhbGFyKikoY29sb3JzICsg
Y291bnRfdXNlZCk7DQorDQorICAgIGZpbGxfc3RvcHMobV9zdG9wcy5kYXRhKCksIG1fc3RvcHMu
c2l6ZSgpLCBwb3MsIGNvbG9ycyk7DQorDQorICAgIGlmIChtX3JhZGlhbCkgew0KKyAgICAgICAg
Ly8gVE9ETyhtbW9zcykgQ1NTIHJhZGlhbCBHcmFkaWVudHMgYWxsb3cgYW4gb2Zmc2V0IGZvY2Fs
IHBvaW50ICh0aGUNCisgICAgICAgIC8vICJzdGFydCBjaXJjbGUiKSwgYnV0IHNraWEgZG9lc24n
dCBzZWVtIHRvIHN1cHBvcnQgdGhhdCwgc28gdGhpcyBqdXN0DQorICAgICAgICAvLyBpZ25vcmVz
IG1fcDAvbV9yMCBhbmQgZHJhd3MgdGhlIGdyYWRpZW50IGNlbnRlcmVkIGluIHRoZSAiZW5kDQor
ICAgICAgICAvLyBjaXJjbGUiIChtX3AxL21fcjEpLg0KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly93
ZWJraXQub3JnL2Jsb2cvMTc1L2ludHJvZHVjaW5nLWNzcy1ncmFkaWVudHMvIGZvciBhDQorICAg
ICAgICAvLyBkZXNjcmlwdGlvbiBvZiB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IuDQorICAgICAgICBt
X2dyYWRpZW50ID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlUmFkaWFsKG1fcDEsDQorICAgICAg
ICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihtX3IxKSwgY29sb3JzLCBwb3MsDQorICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8aW50Pihjb3VudF91c2VkKSwgU2tTaGFkZXI6OmtDbGFtcF9UaWxl
TW9kZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBTa1BvaW50IHB0c1syXSA9IHsgbV9wMCwg
bV9wMSB9Ow0KKyAgICAgICAgbV9ncmFkaWVudCA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxp
bmVhcihwdHMsIGNvbG9ycywgcG9zLA0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oY291
bnRfdXNlZCksIFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUpOw0KKyAgICB9DQorDQorICAgIHJl
dHVybiBtX2dyYWRpZW50Ow0KK30NCisNCit2b2lkIEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29u
dGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0KQ0KK3sNCisgICAgY29udGV4dC0+
c2V0RmlsbEdyYWRpZW50KHRoaXMpOw0KKyAgICBjb250ZXh0LT5maWxsUmVjdChyZWN0KTsNCit9
DQorDQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQ0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmU0NTAwCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIw
MDYsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGVfaAorI2RlZmluZSBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGVfaAorCitjbGFzcyBQbGF0Zm9ybUNvbnRleHRTa2lhOworCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKy8vIFRoaXMgY2xhc3MganVzdCBob2xkcyBvbnRvIGEgUGxhdGZvcm1Db250ZXh0U2tpYSBm
b3IgR3JhcGhpY3NDb250ZXh0LgorY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
IHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1D
b250ZXh0U2tpYSogcGxhdGZvcm1Db250ZXh0KQorICAgICAgICA6IG1fY29udGV4dChwbGF0Zm9y
bUNvbnRleHQpIHsgfQorCisgICAgUGxhdGZvcm1Db250ZXh0U2tpYSogY29udGV4dCgpIHsgcmV0
dXJuIG1fY29udGV4dDsgfQorCitwcml2YXRlOgorICAgIC8vIE5vbi1vd25pbmcgcG9pbnRlciB0
byB0aGUgUGxhdGZvcm1Db250ZXh0LgorICAgIFBsYXRmb3JtQ29udGV4dFNraWEqIG1fY29udGV4
dDsKKworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgY29weSBvciBhc3NpZ24uCisgICAgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKGNvbnN0IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZSYgb3RoZXIpOworICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSYgb3BlcmF0
b3I9KAorICAgICAgICBjb25zdCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUmIG90aGVy
KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi45Yjc2ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFNraWEuY3BwCkBAIC0wLDAgKzEsMTEyMyBA
QAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UHJpdmF0ZS5oIgorCisjaW5jbHVkZSAi
QXNzZXJ0aW9ucy5oIgorI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkNv
bG9yLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKyNp
bmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVk
ZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisj
aW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICJTa0JsdXJEcmF3TG9vcGVyLmgiCisjaW5j
bHVkZSAiU2tDb3JuZXJQYXRoRWZmZWN0LmgiCisjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1f
Y2FudmFzLmgiCisjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisjaW5jbHVkZSAiU2tTaGFkZXIuaCIK
KyNpbmNsdWRlICJ3dGYvTWF0aEV4dHJhcy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSB7CisKKy8vICJSZWFzb25hYmxlIiBmdW5j
dGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIGNoZWNrIGNlcnRhaW4gZ3JhcGhpY3MgcHJpbWl0
aXZlcyBmb3IgYmVpbmcgInJlYXNvbmFibGUiLgorLy8gV2UgZG9uJ3QgbGlrZSB0byBzZW5kIGNy
YXp5IGRhdGEgdG8gdGhlIGdyYXBoaWNzIGxheWVyIHRoYXQgbWlnaHQgb3ZlcmZsb3csCisvLyBh
bmQgdGhpcyBoZWxwcyB1cyBhdm9pZCBzb21lIG9mIHRob3NlIGNhc2VzLgorLy8KKy8vIFRIRVNF
IEFSRSBOT1QgUEVSRkVDVC4gV2UgY2FuJ3QgZ3VhcmFudGVlIHdoYXQgdGhlIGdyYXBoaWNzIGxh
eWVyIGlzIGRvaW5nLgorLy8gSWRlYWxseSwgYWxsIG9mIHRoZXNlIHdvdWxkIGJlIGZpeGVkIGlu
IHRoZSBncmFwaGljcyBsYXllciBhbmQgd2Ugd291bGQgbm90CisvLyBoYXZlIHRvIGRvIGFueSBj
aGVja2luZy4gWW91IGNhbiB1bmNvbW1lbnQgdGhlIENIRUNLX1JFQVNPTkFCTEUgZmxhZyB0bwor
Ly8gY2hlY2sgdGhlIGdyYXBoaWNzIGxheWVyLgorI2RlZmluZSBDSEVDS19SRUFTT05BQkxFCisK
K3N0YXRpYyBib29sIElzQ29vcmRpbmF0ZVJlYXNvbmFibGUoZmxvYXQgY29vcmQpCit7CisjaWZk
ZWYgQ0hFQ0tfUkVBU09OQUJMRQorICAgIC8vIEZpcnN0IGNoZWNrIGZvciB2YWxpZCBmbG9hdHMu
CisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBpZiAoIV9maW5pdGUoY29vcmQpKQorI2Vsc2UK
KyAgICBpZiAoIWZpbml0ZShjb29yZCkpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgLy8gU2tpYSB1c2VzIDE2LjE2IGZpeGVkIHBvaW50IGFuZCAyNi42IGZpeGVkIHBvaW50
IGluIHZhcmlvdXMgcGxhY2VzLiBJZgorICAgIC8vIHRoZSB0cmFuc2Zvcm1lZCBwb2ludCBleGNl
ZWRzIDE1IGJpdHMsIHdlIGp1c3QgZGVjbGFyZSB0aGF0IGl0J3MKKyAgICAvLyB1bnJlYXNvbmFi
bGUgdG8gY2F0Y2ggYm90aCBvZiB0aGVzZSBjYXNlcy4KKyAgICBzdGF0aWMgY29uc3QgaW50IG1h
eFBvaW50TWFnbml0dWRlID0gMzI3Njc7CisgICAgaWYgKGNvb3JkID4gbWF4UG9pbnRNYWduaXR1
ZGUgfHwgY29vcmQgPCAtbWF4UG9pbnRNYWduaXR1ZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQor
CitzdGF0aWMgYm9vbCBJc1BvaW50UmVhc29uYWJsZShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3Jt
LCBjb25zdCBTa1BvaW50JiBwdCkKK3sKKyNpZmRlZiBDSEVDS19SRUFTT05BQkxFCisgICAgLy8g
Tm93IGNoZWNrIGZvciBwb2ludHMgdGhhdCB3aWxsIG92ZXJmbG93LiBXZSBjaGVjayB0aGUgKnRy
YW5zZm9ybWVkKgorICAgIC8vIHBvaW50cyBzaW5jZSB0aGlzIGlzIHdoYXQgd2lsbCBiZSByYXN0
ZXJpemVkLgorICAgIFNrUG9pbnQgeFB0OworICAgIHRyYW5zZm9ybS5tYXBQb2ludHMoJnhQdCwg
JnB0LCAxKTsKKyAgICByZXR1cm4gSXNDb29yZGluYXRlUmVhc29uYWJsZSh4UHQuZlgpICYmIElz
Q29vcmRpbmF0ZVJlYXNvbmFibGUoeFB0LmZZKTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7Cisj
ZW5kaWYKK30KKworc3RhdGljIGJvb2wgSXNSZWN0UmVhc29uYWJsZShjb25zdCBTa01hdHJpeCYg
dHJhbnNmb3JtLCBjb25zdCBTa1JlY3QmIHJjKQoreworI2lmZGVmIENIRUNLX1JFQVNPTkFCTEUK
KyAgICBTa1BvaW50IHRvcGxlZnQgPSB7cmMuZkxlZnQsIHJjLmZUb3B9OworICAgIFNrUG9pbnQg
Ym90dG9tcmlnaHQgPSB7cmMuZlJpZ2h0LCByYy5mQm90dG9tfTsKKyAgICByZXR1cm4gSXNQb2lu
dFJlYXNvbmFibGUodHJhbnNmb3JtLCB0b3BsZWZ0KSAmJgorICAgICAgICAgICBJc1BvaW50UmVh
c29uYWJsZSh0cmFuc2Zvcm0sIGJvdHRvbXJpZ2h0KTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7
CisjZW5kaWYKK30KKworYm9vbCBJc1BhdGhSZWFzb25hYmxlKGNvbnN0IFNrTWF0cml4JiB0cmFu
c2Zvcm0sIGNvbnN0IFNrUGF0aCYgcGF0aCkKK3sKKyNpZmRlZiBDSEVDS19SRUFTT05BQkxFCisg
ICAgU2tQb2ludCBjdXJyZW50X3BvaW50c1s0XTsKKyAgICBTa1BhdGg6Okl0ZXIgaXRlcihwYXRo
LCBmYWxzZSk7CisgICAgZm9yIChTa1BhdGg6OlZlcmIgdmVyYiA9IGl0ZXIubmV4dChjdXJyZW50
X3BvaW50cyk7CisgICAgICAgICB2ZXJiICE9IFNrUGF0aDo6a0RvbmVfVmVyYjsKKyAgICAgICAg
IHZlcmIgPSBpdGVyLm5leHQoY3VycmVudF9wb2ludHMpKSB7CisgICAgICAgIHN3aXRjaCAodmVy
YikgeworICAgICAgICBjYXNlIFNrUGF0aDo6a01vdmVfVmVyYjoKKyAgICAgICAgICAgIC8vIFRo
aXMgbW92ZSB3aWxsIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIG5leHQgdmVyYiwgc28gd2UgY2FuIGln
bm9yZS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNrUGF0aDo6a0xpbmVfVmVy
YjoKKyAgICAgICAgICAgIC8vIGl0ZXIubmV4dCByZXR1cm5zIDIgcG9pbnRzLgorICAgICAgICAg
ICAgaWYgKCFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzBdKSB8
fAorICAgICAgICAgICAgICAgICFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRf
cG9pbnRzWzFdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtRdWFkX1ZlcmI6CisgICAgICAgICAgICAvLyBp
dGVyLm5leHQgcmV0dXJucyAzIHBvaW50cy4KKyAgICAgICAgICAgIGlmICghSXNQb2ludFJlYXNv
bmFibGUodHJhbnNmb3JtLCBjdXJyZW50X3BvaW50c1swXSkgfHwKKyAgICAgICAgICAgICAgICAh
SXNQb2ludFJlYXNvbmFibGUodHJhbnNmb3JtLCBjdXJyZW50X3BvaW50c1sxXSkgfHwKKyAgICAg
ICAgICAgICAgICAhSXNQb2ludFJlYXNvbmFibGUodHJhbnNmb3JtLCBjdXJyZW50X3BvaW50c1sy
XSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgU2tQYXRoOjprQ3ViaWNfVmVyYjoKKyAgICAgICAgICAgIC8vIGl0ZXIubmV4
dCByZXR1cm5zIDQgcG9pbnRzLgorICAgICAgICAgICAgaWYgKCFJc1BvaW50UmVhc29uYWJsZSh0
cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzBdKSB8fAorICAgICAgICAgICAgICAgICFJc1BvaW50
UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzFdKSB8fAorICAgICAgICAgICAg
ICAgICFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzJdKSB8fAor
ICAgICAgICAgICAgICAgICFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9p
bnRzWzNdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDbG9zZV9WZXJiOgorICAgICAgICBjYXNlIFNrUGF0
aDo6a0RvbmVfVmVyYjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsK
KyNlbmRpZgorfQorCisvLyBMb2NhbCBoZWxwZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGFkZENvcm5lckFy
YyhTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICBjb25zdCBTa1JlY3QmIHJlY3QsCisg
ICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBzaXplLAorICAgICAgICAgICAgICAgICAg
aW50IHN0YXJ0QW5nbGUpCit7CisgICAgU2tJUmVjdCBpcjsKKyAgICBpbnQgcnggPSBTa01pbjMy
KFNrU2NhbGFyUm91bmQocmVjdC53aWR0aCgpKSwgc2l6ZS53aWR0aCgpKTsKKyAgICBpbnQgcnkg
PSBTa01pbjMyKFNrU2NhbGFyUm91bmQocmVjdC5oZWlnaHQoKSksIHNpemUuaGVpZ2h0KCkpOwor
CisgICAgaXIuc2V0KC1yeCwgLXJ5LCByeCwgcnkpOworICAgIHN3aXRjaCAoc3RhcnRBbmdsZSkg
eworICAgIGNhc2UgMDoKKyAgICAgICAgaXIub2Zmc2V0KHJlY3QuZlJpZ2h0IC0gaXIuZlJpZ2h0
LCByZWN0LmZCb3R0b20gLSBpci5mQm90dG9tKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5
MDoKKyAgICAgICAgaXIub2Zmc2V0KHJlY3QuZkxlZnQgLSBpci5mTGVmdCwgcmVjdC5mQm90dG9t
IC0gaXIuZkJvdHRvbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTgwOgorICAgICAgICBp
ci5vZmZzZXQocmVjdC5mTGVmdCAtIGlyLmZMZWZ0LCByZWN0LmZUb3AgLSBpci5mVG9wKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzA6CisgICAgICAgIGlyLm9mZnNldChyZWN0LmZSaWdo
dCAtIGlyLmZSaWdodCwgcmVjdC5mVG9wIC0gaXIuZlRvcCk7CisgICAgICAgIGJyZWFrOworICAg
IGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVCgwKTsKKyAgICB9CisKKyAgICBTa1JlY3QgcjsKKyAg
ICByLnNldChpcik7CisgICAgcGF0aC0+YXJjVG8ociwgU2tJbnRUb1NjYWxhcihzdGFydEFuZ2xl
KSwgU2tJbnRUb1NjYWxhcig5MCksIGZhbHNlKTsKK30KKworaW5saW5lIGludCBmYXN0TW9kKGlu
dCB2YWx1ZSwgaW50IG1heCkKK3sKKyAgICBpbnQgc2lnbiA9IFNrRXh0cmFjdFNpZ24odmFsdWUp
OworCisgICAgdmFsdWUgPSBTa0FwcGx5U2lnbih2YWx1ZSwgc2lnbik7CisgICAgaWYgKHZhbHVl
ID49IG1heCkKKyAgICAgICAgdmFsdWUgJT0gbWF4OworICAgIHJldHVybiBTa0FwcGx5U2lnbih2
YWx1ZSwgc2lnbik7Cit9CisKK2lubGluZSBmbG9hdCBzcXVhcmUoZmxvYXQgbikKK3sKKyAgICBy
ZXR1cm4gbiAqIG47Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorCisvLyBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCBhIE5VTEwgcG9pbnRlciB0byBjcmVh
dGUgYSBncmFwaGljcyBjb250ZXh0IHRoYXQgaGFzCisvLyBubyBwYWludGluZy4KK0dyYXBoaWNz
Q29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0ICpnYykKKyAg
ICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0
YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKGdjKSkKK3sKKyAgICBzZXRQYWlu
dGluZ0Rpc2FibGVkKCFnYyB8fCAhcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpKTsKK30KKwor
R3JhcGhpY3NDb250ZXh0Ojp+R3JhcGhpY3NDb250ZXh0KCkKK3sKKyAgICBkZWxldGUgbV9kYXRh
OworICAgIHRoaXMtPmRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKK30K
KworUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250
ZXh0KCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIXBhaW50aW5nRGlzYWJsZWQoKSk7CisgICAgcmV0
dXJuIG1fZGF0YS0+Y29udGV4dCgpOworfQorCisvLyBTdGF0ZSBzYXZpbmcgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFNhdmUgb3VyIHByaXZh
dGUgU3RhdGUuCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNhdmUoKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBSZXN0b3JlIG91ciBwcml2YXRl
IFN0YXRlLgorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2Ug
bmVlZCB0aGUgImFscGhhIiBsYXllciBmbGFnIGhlcmUgYmVjYXVzZSB0aGUgYmFzZSBsYXllciBp
cyBvcGFxdWUKKyAgICAvLyAodGhlIHN1cmZhY2Ugb2YgdGhlIHBhZ2UpIGJ1dCBsYXllcnMgb24g
dG9wIG1heSBoYXZlIHRyYW5zcGFyZW50IHBhcnRzLgorICAgIC8vIFdpdGhvdXQgZXhwbGljaXRs
eSBzZXR0aW5nIHRoZSBhbHBoYSBmbGFnLCB0aGUgbGF5ZXIgd2lsbCBpbmhlcml0IHRoZQorICAg
IC8vIG9wYXF1ZSBzZXR0aW5nIG9mIHRoZSBiYXNlIGFuZCBzb21lIHRoaW5ncyB3b24ndCB3b3Jr
IHByb3Blcmx5LgorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+c2F2ZUxheWVyQWxw
aGEoCisgICAgICAgIDAsCisgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KG9wYWNp
dHkgKiAyNTUpLAorICAgICAgICBzdGF0aWNfY2FzdDxTa0NhbnZhczo6U2F2ZUZsYWdzPihTa0Nh
bnZhczo6a0hhc0FscGhhTGF5ZXJfU2F2ZUZsYWcgfAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBTa0NhbnZhczo6a0Z1bGxDb2xvckxheWVyX1NhdmVGbGFnKSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3BhcmVuY3lMYXllcigpCit7CisgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgUExBVEZPUk0o
V0lOX09TKQorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+Z2V0VG9wUGxhdGZvcm1E
ZXZpY2UoKS4KKyAgICAgICAgZml4dXBBbHBoYUJlZm9yZUNvbXBvc2l0aW5nKCk7CisjZW5kaWYK
KyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPnJlc3RvcmUoKTsKK30KKworLy8gR3Jh
cGhpY3MgcHJpbWl0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZElubmVyUm91bmRl
ZFJlY3RDbGlwKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlja25lc3MpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tSZWN0IHIocmVj
dCk7CisgICAgaWYgKCFJc1JlY3RSZWFzb25hYmxlKGdldENUTSgpLCByKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgU2tQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRPdmFsKHIsIFNrUGF0aDo6a0NX
X0RpcmVjdGlvbik7CisgICAgLy8gb25seSBwZXJmb3JtIHRoZSBpbnNldCBpZiB3ZSB3b24ndCBp
bnZlcnQgcgorICAgIGlmICgyICogdGhpY2tuZXNzIDwgcmVjdC53aWR0aCgpICYmIDIgKiB0aGlj
a25lc3MgPCByZWN0LmhlaWdodCgpKSB7CisgICAgICAgIHIuaW5zZXQoU2tJbnRUb1NjYWxhcih0
aGlja25lc3MpICxTa0ludFRvU2NhbGFyKHRoaWNrbmVzcykpOworICAgICAgICBwYXRoLmFkZE92
YWwociwgU2tQYXRoOjprQ0NXX0RpcmVjdGlvbik7CisgICAgfQorICAgIHBsYXRmb3JtQ29udGV4
dCgpLT5jYW52YXMoKS0+Y2xpcFBhdGgocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5hZGRQYXRoKCpwYXRo
LnBsYXRmb3JtUGF0aCgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luUGF0aCgp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBs
YXRmb3JtQ29udGV4dCgpLT5iZWdpblBhdGgoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmNsZWFyUGxhdGZvcm1TaGFkb3coKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0RHJhd0xvb3BlcigwKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmIHJl
Y3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgU2tSZWN0IHIgPSByZWN0OworICAgIGlmICghSXNSZWN0UmVhc29uYWJsZShnZXRDVE0oKSwg
cikpCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMo
KSwgciwgJnIpOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0dXBQYWludEZvckZpbGxpbmcoJnBhaW50KTsKKyAgICBwYWludC5zZXRQb3J0ZXJEdWZmWGZl
cm1vZGUoU2tQb3J0ZXJEdWZmOjprQ2xlYXJfTW9kZSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCkt
PmNhbnZhcygpLT5kcmF3UmVjdChyLCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxl
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1JlY3QgcihyZWN0KTsKKyAgICBpZiAoIUlz
UmVjdFJlYXNvbmFibGUoZ2V0Q1RNKCksIHIpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0
Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmNsaXBSZWN0KHIpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFNrUGF0aCYgcCA9ICpwYXRoLnBs
YXRmb3JtUGF0aCgpOworICAgIGlmICghSXNQYXRoUmVhc29uYWJsZShnZXRDVE0oKSwgcCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+Y2xpcFBh
dGgocCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgU2tSZWN0IHIocmVjdCk7CisgICAgaWYgKCFJc1JlY3RSZWFzb25hYmxlKGdldENUTSgp
LCByKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygp
LT5jbGlwUmVjdChyLCBTa1JlZ2lvbjo6a0RpZmZlcmVuY2VfT3ApOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwKQoreworICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFNrUGF0aCYgcGF0aCA9ICpw
LnBsYXRmb3JtUGF0aCgpOworICAgIGlmICghSXNQYXRoUmVhc29uYWJsZShnZXRDVE0oKSwgcGF0
aCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+
Y2xpcFBhdGgocGF0aCwgU2tSZWdpb246OmtEaWZmZXJlbmNlX09wKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmNsaXBPdXRFbGxpcHNlSW5SZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tS
ZWN0IG92YWwocmVjdCk7CisgICAgaWYgKCFJc1JlY3RSZWFzb25hYmxlKGdldENUTSgpLCBvdmFs
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRPdmFs
KG92YWwsIFNrUGF0aDo6a0NDV19EaXJlY3Rpb24pOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5j
YW52YXMoKS0+Y2xpcFBhdGgocGF0aCwgU2tSZWdpb246OmtEaWZmZXJlbmNlX09wKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRoKFdpbmRSdWxlIGNsaXBSdWxlKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFNr
UGF0aCogb2xkUGF0aCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jdXJyZW50UGF0aCgpOworICAgIFNr
UGF0aCBwYXRoKCpvbGRQYXRoKTsKKyAgICBwYXRoLnNldEZpbGxUeXBlKGNsaXBSdWxlID09IFJV
TEVfRVZFTk9ERCA/IFNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUgOiBTa1BhdGg6OmtXaW5kaW5n
X0ZpbGxUeXBlKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmNsaXBQYXRoKHBh
dGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFRvSW1hZ2VCdWZmZXIoY29uc3Qg
RmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEltYWdlQnVmZmVyKiBpbWFnZUJ1ZmZlcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUT0RPKGVzZWlkZWwpOiBUaGlzIGlz
IG5lZWRlZCBmb3IgaW1hZ2UgbWFza2luZyBhbmQgY29tcGxleCB0ZXh0IGZpbGxzLgorICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0oY29u
c3QgQWZmaW5lVHJhbnNmb3JtJiB4Zm9ybSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5jb25j
YXQoeGZvcm0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0NvbnZleFBvbHlnb24o
c2l6ZV90IG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGbG9hdFBvaW50KiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBzaG91bGRBbnRpYWxpYXMpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG51bVBvaW50cyA8PSAxKQorICAg
ICAgICByZXR1cm47CisKKyAgICBTa1BhdGggcGF0aDsKKworICAgIHBhdGguaW5jUmVzZXJ2ZShu
dW1Qb2ludHMpOworICAgIHBhdGgubW92ZVRvKFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocG9pbnRz
WzBdLngoKSksCisgICAgICAgICAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwb2ludHNb
MF0ueSgpKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1Qb2ludHM7IGkrKykgewor
ICAgICAgICBwYXRoLmxpbmVUbyhXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHBvaW50c1tpXS54KCkp
LAorICAgICAgICAgICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHBvaW50c1tpXS55
KCkpKTsKKyAgICB9CisKKyAgICBpZiAoIUlzUGF0aFJlYXNvbmFibGUoZ2V0Q1RNKCksIHBhdGgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIGlmIChmaWxsQ29s
b3IoKS5yZ2IoKSAmIDB4RkYwMDAwMDApIHsKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNl
dHVwUGFpbnRGb3JGaWxsaW5nKCZwYWludCk7CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5j
YW52YXMoKS0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworICAgIH0KKworICAgIGlmIChzdHJva2VT
dHlsZSgpICE9IE5vU3Ryb2tlKSB7CisgICAgICAgIHBhaW50LnJlc2V0KCk7CisgICAgICAgIHBs
YXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yU3Ryb2tpbmcoJnBhaW50LCAwLCAwKTsKKyAg
ICAgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UGF0aChwYXRoLCBwYWludCk7
CisgICAgfQorfQorCisvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgdG8gZHJhdyB0aGUgbGl0
dGxlIGNpcmNsZXMgdXNlZCBpbiBsaXN0cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxs
aXBzZShjb25zdCBJbnRSZWN0JiBlbGlwc2VSZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUmVjdCByZWN0ID0gZWxpcHNlUmVjdDsK
KyAgICBpZiAoIUlzUmVjdFJlYXNvbmFibGUoZ2V0Q1RNKCksIHJlY3QpKQorICAgICAgICByZXR1
cm47CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIGlmIChmaWxsQ29sb3IoKS5yZ2IoKSAmIDB4
RkYwMDAwMDApIHsKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRGb3JGaWxs
aW5nKCZwYWludCk7CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd092
YWwocmVjdCwgcGFpbnQpOworICAgIH0KKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9r
ZSkgeworICAgICAgICBwYWludC5yZXNldCgpOworICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0dXBQYWludEZvclN0cm9raW5nKCZwYWludCwgJnJlY3QsIDApOworICAgICAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdPdmFsKHJlY3QsIHBhaW50KTsKKyAgICB9Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikK
K3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgY29u
c3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7CisgICAgdW5zaWdu
ZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIGlmICgwID09IHJlY3RDb3VudCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU2tSZWdpb24gZXh0ZXJpb3JfcmVnaW9uOworICAgIGNvbnN0
IFNrU2NhbGFyIGV4dGVyaW9yX29mZnNldCA9IFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoMC41KTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAgICAgICAg
U2tJUmVjdCByID0gcmVjdHNbaV07CisgICAgICAgIHIuaW5zZXQoLWV4dGVyaW9yX29mZnNldCwg
LWV4dGVyaW9yX29mZnNldCk7CisgICAgICAgIGV4dGVyaW9yX3JlZ2lvbi5vcChyLCBTa1JlZ2lv
bjo6a1VuaW9uX09wKTsKKyAgICB9CisKKyAgICBTa1BhdGggcGF0aDsKKyAgICBTa1BhaW50IHBh
aW50OworICAgIHBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICBwYWludC5zZXRTdHlsZShT
a1BhaW50OjprU3Ryb2tlX1N0eWxlKTsKKworICAgIHBhaW50LnNldENvbG9yKGZvY3VzUmluZ0Nv
bG9yKCkucmdiKCkpOworICAgIHBhaW50LnNldFN0cm9rZVdpZHRoKGV4dGVyaW9yX29mZnNldCAq
IDIpOworICAgIHBhaW50LnNldFBhdGhFZmZlY3QobmV3IFNrQ29ybmVyUGF0aEVmZmVjdChleHRl
cmlvcl9vZmZzZXQgKiAyKSktPnVucmVmKCk7CisgICAgZXh0ZXJpb3JfcmVnaW9uLmdldEJvdW5k
YXJ5UGF0aCgmcGF0aCk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UGF0
aChwYXRoLCBwYWludCk7Cit9CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVy
cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQx
LCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIFN0cm9rZVN0eWxlIHBlblN0eWxlID0gc3Ryb2tlU3R5
bGUoKTsKKyAgICBpZiAocGVuU3R5bGUgPT0gTm9TdHJva2UpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgU2tQb2ludCBwdHNbMl0gPSB7IChTa1BvaW50KXBvaW50
MSwgKFNrUG9pbnQpcG9pbnQyIH07CisgICAgaWYgKCFJc1BvaW50UmVhc29uYWJsZShnZXRDVE0o
KSwgcHRzWzBdKSB8fAorICAgICAgICAhSXNQb2ludFJlYXNvbmFibGUoZ2V0Q1RNKCksIHB0c1sx
XSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGtub3cgdGhlc2UgYXJlIHZlcnRpY2Fs
IG9yIGhvcml6b250YWwgbGluZXMsIHNvIHRoZSBsZW5ndGggd2lsbCBqdXN0CisgICAgLy8gYmUg
dGhlIHN1bSBvZiB0aGUgZGlzcGxhY2VtZW50IGNvbXBvbmVudCB2ZWN0b3JzIGdpdmUgb3IgdGFr
ZSAxIC0KKyAgICAvLyBwcm9iYWJseSB3b3J0aCB0aGUgc3BlZWQgdXAgb2Ygbm8gc3F1YXJlIHJv
b3QsIHdoaWNoIGFsc28gd29uJ3QgYmUgZXhhY3QuCisgICAgU2tQb2ludCBkaXNwID0gcHRzWzFd
IC0gcHRzWzBdOworICAgIGludCBsZW5ndGggPSBTa1NjYWxhclJvdW5kKGRpc3AuZlggKyBkaXNw
LmZZKTsKKyAgICBpbnQgd2lkdGggPSByb3VuZGYoCisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5zZXR1cFBhaW50Rm9yU3Ryb2tpbmcoJnBhaW50LCAwLCBsZW5ndGgpKTsKKworICAgIC8vICJC
b3Jyb3dlZCIgdGhpcyBjb21tZW50IGFuZCBpZGVhIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cuY3Bw
CisgICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJpYXRl
IHgveSBzbyB0aGF0IHRoZSBmbG9hdAorICAgIC8vIGFyaXRobWV0aWMgd29ya3Mgb3V0LiAgRm9y
IGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbAorICAgIC8vIHBh
c3MgdXMgKHkxK3kyKS8yLCBlLmcuLCAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ugd2Fu
dCA1MS41LiAgSXQgaXMKKyAgICAvLyBhbHdheXMgdHJ1ZSB0aGF0IGFuIGV2ZW4gd2lkdGggZ2F2
ZSB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQKKyAgICAvLyB3aWR0aCBnYXZlIHVz
IGEgcG9zaXRpb24gdGhhdCBpcyBvZmYgYnkgZXhhY3RseSAwLjUuCisgICAgYm9vbCBpc1ZlcnRp
Y2FsTGluZSA9IHB0c1swXS5mWCA9PSBwdHNbMV0uZlg7CisKKyAgICBpZiAod2lkdGggJiAxKSB7
ICAvLyBPZGQuCisgICAgICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgeworICAgICAgICAgICAgcHRz
WzBdLmZYID0gcHRzWzBdLmZYICsgU0tfU2NhbGFySGFsZjsKKyAgICAgICAgICAgIHB0c1sxXS5m
WCA9IHB0c1swXS5mWDsKKyAgICAgICAgfSBlbHNlIHsgIC8vIEhvcml6b250YWwgbGluZQorICAg
ICAgICAgICAgcHRzWzBdLmZZID0gcHRzWzBdLmZZICsgU0tfU2NhbGFySGFsZjsKKyAgICAgICAg
ICAgIHB0c1sxXS5mWSA9IHB0c1swXS5mWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdQb2ludHMoCisgICAgICAgIFNrQ2FudmFzOjprTGlu
ZXNfUG9pbnRNb2RlLCAyLCBwdHMsIHBhaW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHB0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBncmFtbWFyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIENyZWF0ZSB0aGUgcGF0dGVybiB3ZSdsbCB1c2Ug
dG8gZHJhdyB0aGUgdW5kZXJsaW5lLgorICAgIHN0YXRpYyBTa0JpdG1hcCogbWlzc3BlbGxfYml0
bWFwID0gMDsKKyAgICBpZiAoIW1pc3NwZWxsX2JpdG1hcCkgeworICAgICAgICAvLyBXZSB1c2Ug
YSAyLXBpeGVsLWhpZ2ggbWlzc3BlbGxpbmcgaW5kaWNhdG9yIGJlY2F1c2UgdGhhdCBzZWVtcyB0
byBiZQorICAgICAgICAvLyB3aGF0IFdlYktpdCBpcyBkZXNpZ25lZCBmb3IsIGFuZCBob3cgbXVj
aCByb29tIHRoZXJlIGlzIGluIGEgdHlwaWNhbAorICAgICAgICAvLyBwYWdlIGZvciBpdC4KKyAg
ICAgICAgY29uc3QgaW50IHJvd19waXhlbHMgPSAzMjsgIC8vIE11c3QgYmUgbXVsdGlwbGUgb2Yg
NCBmb3IgcGF0dGVybiBiZWxvdy4KKyAgICAgICAgY29uc3QgaW50IGNvbF9waXhlbHMgPSAyOwor
ICAgICAgICBtaXNzcGVsbF9iaXRtYXAgPSBuZXcgU2tCaXRtYXA7CisgICAgICAgIG1pc3NwZWxs
X2JpdG1hcC0+c2V0Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93X3BpeGVscywgY29sX3BpeGVscyk7CisgICAg
ICAgIG1pc3NwZWxsX2JpdG1hcC0+YWxsb2NQaXhlbHMoKTsKKworICAgICAgICBtaXNzcGVsbF9i
aXRtYXAtPmVyYXNlQVJHQigwLCAwLCAwLCAwKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbGlu
ZV9jb2xvciA9IDB4RkZGRjAwMDA7ICAvLyBPcGFxdWUgcmVkLgorICAgICAgICBjb25zdCB1aW50
MzJfdCBhbnRpX2NvbG9yID0gMHg2MDYwMDAwMDsgIC8vIFNlbWl0cmFuc3BhcmVudCByZWQuCisK
KyAgICAgICAgLy8gUGF0dGVybjogIFggbyAgIG8gWCBvICAgbyBYCisgICAgICAgIC8vICAgICAg
ICAgICAgIG8gWCBvICAgbyBYIG8KKyAgICAgICAgdWludDMyX3QqIHJvdzEgPSBtaXNzcGVsbF9i
aXRtYXAtPmdldEFkZHIzMigwLCAwKTsKKyAgICAgICAgdWludDMyX3QqIHJvdzIgPSBtaXNzcGVs
bF9iaXRtYXAtPmdldEFkZHIzMigwLCAxKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBy
b3dfcGl4ZWxzOyB4ICsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHggJSA0KSB7CisgICAgICAg
ICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcm93MVt4XSA9IGxpbmVfY29sb3I7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAg
cm93MVt4XSA9IGFudGlfY29sb3I7CisgICAgICAgICAgICAgICAgcm93Mlt4XSA9IGFudGlfY29s
b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAg
ICAgICAgICAgcm93Mlt4XSA9IGxpbmVfY29sb3I7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcm93MVt4XSA9IGFudGlfY29sb3I7
CisgICAgICAgICAgICAgICAgcm93Mlt4XSA9IGFudGlfY29sb3I7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPZmZzZXQg
aXQgdmVydGljYWxseSBieSAxIHNvIHRoYXQgdGhlcmUncyBzb21lIHNwYWNlIHVuZGVyIHRoZSB0
ZXh0LgorICAgIFNrU2NhbGFyIG9yaWdpbl94ID0gU2tJbnRUb1NjYWxhcihwdC54KCkpOworICAg
IFNrU2NhbGFyIG9yaWdpbl95ID0gU2tJbnRUb1NjYWxhcihwdC55KCkpICsgMTsKKworICAgIC8v
IE1ha2UgYSBzaGFkZXIgZm9yIHRoZSBiaXRtYXAgd2l0aCBhbiBvcmlnaW4gb2YgdGhlIGJveCB3
ZSdsbCBkcmF3LiBUaGlzCisgICAgLy8gc2hhZGVyIGlzIHJlZmNvdW50ZWQgYW5kIHdpbGwgaGF2
ZSBhbiBpbml0aWFsIHJlZmNvdW50IG9mIDEuCisgICAgU2tTaGFkZXIqIHNoYWRlciA9IFNrU2hh
ZGVyOjpDcmVhdGVCaXRtYXBTaGFkZXIoCisgICAgICAgICptaXNzcGVsbF9iaXRtYXAsIFNrU2hh
ZGVyOjprUmVwZWF0X1RpbGVNb2RlLAorICAgICAgICBTa1NoYWRlcjo6a1JlcGVhdF9UaWxlTW9k
ZSk7CisgICAgU2tNYXRyaXggbWF0cml4OworICAgIG1hdHJpeC5yZXNldCgpOworICAgIG1hdHJp
eC5wb3N0VHJhbnNsYXRlKG9yaWdpbl94LCBvcmlnaW5feSk7CisgICAgc2hhZGVyLT5zZXRMb2Nh
bE1hdHJpeChtYXRyaXgpOworCisgICAgLy8gQXNzaWduIHRoZSBzaGFkZXIgdG8gdGhlIHBhaW50
ICYgcmVsZWFzZSBvdXIgcmVmZXJlbmNlLiBUaGUgcGFpbnQgd2lsbAorICAgIC8vIG5vdyBvd24g
dGhlIHNoYWRlciBhbmQgdGhlIHNoYWRlciB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBwYWlu
dCBnb2VzCisgICAgLy8gb3V0IG9mIHNjb3BlLgorICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFp
bnQuc2V0U2hhZGVyKHNoYWRlcik7CisgICAgc2hhZGVyLT51bnJlZigpOworCisgICAgU2tSZWN0
IHJlY3Q7CisgICAgcmVjdC5zZXQob3JpZ2luX3gsCisgICAgICAgICAgICAgb3JpZ2luX3ksCisg
ICAgICAgICAgICAgb3JpZ2luX3ggKyBTa0ludFRvU2NhbGFyKHdpZHRoKSwKKyAgICAgICAgICAg
ICBvcmlnaW5feSArIFNrSW50VG9TY2FsYXIobWlzc3BlbGxfYml0bWFwLT5oZWlnaHQoKSkpOwor
ICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1JlY3QocmVjdCwgcGFpbnQpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNvbnN0IEludFBvaW50
JiBwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByaW50aW5nKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCB0
aGlja25lc3MgPSBTa01heDMyKHN0YXRpY19jYXN0PGludD4oc3Ryb2tlVGhpY2tuZXNzKCkpLCAx
KTsKKyAgICBTa1JlY3QgcjsKKyAgICByLmZMZWZ0ID0gU2tJbnRUb1NjYWxhcihwdC54KCkpOwor
ICAgIHIuZlRvcCA9IFNrSW50VG9TY2FsYXIocHQueSgpKTsKKyAgICByLmZSaWdodCA9IHIuZkxl
ZnQgKyBTa0ludFRvU2NhbGFyKHdpZHRoKTsKKyAgICByLmZCb3R0b20gPSByLmZUb3AgKyBTa0lu
dFRvU2NhbGFyKHRoaWNrbmVzcyk7CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIHBhaW50LnNl
dENvbG9yKHRoaXMtPnN0cm9rZUNvbG9yKCkucmdiKCkpOworICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5jYW52YXMoKS0+ZHJhd1JlY3QociwgcGFpbnQpOworfQorCisvLyBEcmF3cyBhIGZpbGxlZCBy
ZWN0YW5nbGUgd2l0aCBhIHN0cm9rZWQgYm9yZGVyLgordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tSZWN0IHIgPSByZWN0OworICAgIGlmICghSXNS
ZWN0UmVhc29uYWJsZShnZXRDVE0oKSwgcikpIHsKKyAgICAgICAgLy8gU2VlIHRoZSBmaWxsUmVj
dCBiZWxvdy4KKyAgICAgICAgQ2xpcFJlY3RUb0NhbnZhcygqcGxhdGZvcm1Db250ZXh0KCktPmNh
bnZhcygpLCByLCAmcik7CisgICAgfQorCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmRyYXdSZWN0
KHIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBjb25zdCBTa1BhdGgmIHBh
dGggPSAqcGxhdGZvcm1Db250ZXh0KCktPmN1cnJlbnRQYXRoKCk7CisgICAgaWYgKCFJc1BhdGhS
ZWFzb25hYmxlKGdldENUTSgpLCBwYXRoKSkKKyAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEdy
YXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAgICBDb2xvclNw
YWNlIGNvbG9yU3BhY2UgPSBzdGF0ZS5maWxsQ29sb3JTcGFjZTsKKworICAgIGlmIChjb2xvclNw
YWNlID09IFNvbGlkQ29sb3JTcGFjZSAmJiAhZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldEZpbGxSdWxlKHN0YXRlLmZpbGxS
dWxlID09IFJVTEVfRVZFTk9ERCA/CisgICAgICAgIFNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUg
OiBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlKTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAg
cGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRGb3JGaWxsaW5nKCZwYWludCk7CisKKyAgICBp
ZiAoY29sb3JTcGFjZSA9PSBQYXR0ZXJuQ29sb3JTcGFjZSkgeworICAgICAgICBTa1NoYWRlciog
cGF0ID0gc3RhdGUuZmlsbFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihnZXRDVE0oKSk7
CisgICAgICAgIHBhaW50LnNldFNoYWRlcihwYXQpOworICAgICAgICBwYXQtPnVucmVmKCk7Cisg
ICAgfSBlbHNlIGlmIChjb2xvclNwYWNlID09IEdyYWRpZW50Q29sb3JTcGFjZSkKKyAgICAgICAg
cGFpbnQuc2V0U2hhZGVyKHN0YXRlLmZpbGxHcmFkaWVudC0+cGxhdGZvcm1HcmFkaWVudCgpKTsK
KworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1BhdGgocGF0aCwgcGFpbnQp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFNrUmVjdCByID0gcmVjdDsKKyAgICBpZiAoIUlzUmVjdFJlYXNvbmFibGUoZ2V0Q1RNKCks
IHIpKSB7CisgICAgICAgIC8vIFNlZSB0aGUgb3RoZXIgdmVyc2lvbiBvZiBmaWxsUmVjdCBiZWxv
dy4KKyAgICAgICAgQ2xpcFJlY3RUb0NhbnZhcygqcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygp
LCByLCAmcik7CisgICAgfQorCisgICAgY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRl
ID0gbV9jb21tb24tPnN0YXRlOworICAgIENvbG9yU3BhY2UgY29sb3JTcGFjZSA9IHN0YXRlLmZp
bGxDb2xvclNwYWNlOworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gU29saWRDb2xvclNwYWNlICYm
ICFmaWxsQ29sb3IoKS5hbHBoYSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHBh
aW50OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQp
OworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gUGF0dGVybkNvbG9yU3BhY2UpIHsKKyAgICAgICAg
U2tTaGFkZXIqIHBhdCA9IHN0YXRlLmZpbGxQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4o
Z2V0Q1RNKCkpOworICAgICAgICBwYWludC5zZXRTaGFkZXIocGF0KTsKKyAgICAgICAgcGF0LT51
bnJlZigpOworICAgIH0gZWxzZSBpZiAoY29sb3JTcGFjZSA9PSBHcmFkaWVudENvbG9yU3BhY2Up
CisgICAgICAgIHBhaW50LnNldFNoYWRlcihzdGF0ZS5maWxsR3JhZGllbnQtPnBsYXRmb3JtR3Jh
ZGllbnQoKSk7CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdSZWN0KHIs
IHBhaW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjb2xvci5yZ2IoKSAmIDB4RkYwMDAw
MDApIHsKKyAgICAgICAgU2tSZWN0IHIgPSByZWN0OworICAgICAgICBpZiAoIUlzUmVjdFJlYXNv
bmFibGUoZ2V0Q1RNKCksIHIpKSB7CisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlbiB0
aGUgcmVjdGFuZ2xlIG92ZXJmbG93cyBmaXhlZCBwb2ludC4gVGhpcyBpcyBhCisgICAgICAgICAg
ICAvLyB3b3JrYXJvdW5kIHRvIGZpeCBidWcgMTIxMjg0NC4gV2hlbiB0aGUgaW5wdXQgcmVjdGFu
Z2xlIGlzIHZlcnkKKyAgICAgICAgICAgIC8vIGxhcmdlLCBpdCBjYW4gb3ZlcmZsb3cgU2tpYSdz
IGludGVybmFsIGZpeGVkIHBvaW50IHJlY3QuIFRoaXMKKyAgICAgICAgICAgIC8vIHNob3VsZCBi
ZSBmaXhhYmxlIGluIFNraWEgKHNpbmNlIHRoZSBvdXRwdXQgYml0bWFwIGlzbid0IHRoYXQKKyAg
ICAgICAgICAgIC8vIGxhcmdlKSwgYnV0IHVudGlsIHRoYXQgaXMgZml4ZWQsIHdlIHRyeSB0byBo
YW5kbGUgaXQgb3Vyc2VsdmVzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIG1h
bnVhbGx5IGNsaXAgdGhlIHJlY3RhbmdsZSB0byB0aGUgY3VycmVudCBjbGlwIHJlY3QuIFRoaXMK
KyAgICAgICAgICAgIC8vIHdpbGwgcHJldmVudCBvdmVyZmxvdy4gVGhlIHJlY3RhbmdsZSB3aWxs
IGJlIHRyYW5zZm9ybWVkIHRvIHRoZQorICAgICAgICAgICAgLy8gY2FudmFzJyBjb29yZGluYXRl
IHNwYWNlIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgdG8gZml4ZWQgcG9pbnQKKyAgICAgICAgICAg
IC8vIHNvIHdlIGFyZSBndWFyYW50ZWVkIG5vdCB0byBvdmVyZmxvdyBhZnRlciBkb2luZyB0aGlz
LgorICAgICAgICAgICAgQ2xpcFJlY3RUb0NhbnZhcygqcGxhdGZvcm1Db250ZXh0KCktPmNhbnZh
cygpLCByLCAmcik7CisgICAgICAgIH0KKworICAgICAgICBTa1BhaW50IHBhaW50OworICAgICAg
ICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludENvbW1vbigmcGFpbnQpOworICAgICAgICBw
YWludC5zZXRDb2xvcihjb2xvci5yZ2IoKSk7CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5j
YW52YXMoKS0+ZHJhd1JlY3QociwgcGFpbnQpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmZpbGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiB0b3BMZWZ0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50U2l6ZSYgYm90
dG9tTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50
U2l6ZSYgYm90dG9tUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBTa1JlY3QgciA9IHJlY3Q7CisgICAgaWYgKCFJc1JlY3RSZWFz
b25hYmxlKGdldENUTSgpLCByKSkgeworICAgICAgICAvLyBTZWUgZmlsbFJlY3QoKS4KKyAgICAg
ICAgQ2xpcFJlY3RUb0NhbnZhcygqcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLCByLCAmcik7
CisgICAgfQorCisgICAgU2tQYXRoIHBhdGg7CisgICAgYWRkQ29ybmVyQXJjKCZwYXRoLCByLCB0
b3BSaWdodCwgMjcwKTsKKyAgICBhZGRDb3JuZXJBcmMoJnBhdGgsIHIsIGJvdHRvbVJpZ2h0LCAw
KTsKKyAgICBhZGRDb3JuZXJBcmMoJnBhdGgsIHIsIGJvdHRvbUxlZnQsIDkwKTsKKyAgICBhZGRD
b3JuZXJBcmMoJnBhdGgsIHIsIHRvcExlZnQsIDE4MCk7CisKKyAgICBTa1BhaW50IHBhaW50Owor
ICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQpOworICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworICAg
IHJldHVybiBmaWxsUmVjdChyZWN0LCBjb2xvcik7Cit9CisKK0FmZmluZVRyYW5zZm9ybSBHcmFw
aGljc0NvbnRleHQ6OmdldENUTSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBsYXRmb3JtQ29udGV4
dCgpLT5jYW52YXMoKS0+Z2V0VG90YWxNYXRyaXgoKTsKK30KKworRmxvYXRSZWN0IEdyYXBoaWNz
Q29udGV4dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7Cisg
ICAgLy8gVGhpcyBsb2dpYyBpcyBjb3BpZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRywgZXNlaWRl
bCA1LzA1LzA4CisKKyAgICAvLyBJdCBpcyBub3QgZW5vdWdoIGp1c3QgdG8gcm91bmQgdG8gcGl4
ZWxzIGluIGRldmljZSBzcGFjZS4gVGhlIHJvdGF0aW9uCisgICAgLy8gcGFydCBvZiB0aGUgYWZm
aW5lIHRyYW5zZm9ybSBtYXRyaXggdG8gZGV2aWNlIHNwYWNlIGNhbiBtZXNzIHdpdGggdGhpcwor
ICAgIC8vIGNvbnZlcnNpb24gaWYgd2UgaGF2ZSBhIHJvdGF0aW5nIGltYWdlIGxpa2UgdGhlIGhh
bmRzIG9mIHRoZSB3b3JsZCBjbG9jaworICAgIC8vIHdpZGdldC4gV2UganVzdCBuZWVkIHRoZSBz
Y2FsZSwgc28gd2UgZ2V0IHRoZSBhZmZpbmUgdHJhbnNmb3JtIG1hdHJpeCBhbmQKKyAgICAvLyBl
eHRyYWN0IHRoZSBzY2FsZS4KKworICAgIGNvbnN0IFNrTWF0cml4JiBkZXZpY2VNYXRyaXggPQor
ICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmdldFRvdGFsTWF0cml4KCk7Cisg
ICAgaWYgKGRldmljZU1hdHJpeC5pc0lkZW50aXR5KCkpCisgICAgICAgIHJldHVybiByZWN0Owor
CisgICAgZmxvYXQgZGV2aWNlU2NhbGVYID0gc3FydGYoc3F1YXJlKGRldmljZU1hdHJpeC5nZXRT
Y2FsZVgoKSkKKyAgICAgICAgKyBzcXVhcmUoZGV2aWNlTWF0cml4LmdldFNrZXdZKCkpKTsKKyAg
ICBmbG9hdCBkZXZpY2VTY2FsZVkgPSBzcXJ0ZihzcXVhcmUoZGV2aWNlTWF0cml4LmdldFNrZXdY
KCkpCisgICAgICAgICsgc3F1YXJlKGRldmljZU1hdHJpeC5nZXRTY2FsZVkoKSkpOworCisgICAg
RmxvYXRQb2ludCBkZXZpY2VPcmlnaW4ocmVjdC54KCkgKiBkZXZpY2VTY2FsZVgsIHJlY3QueSgp
ICogZGV2aWNlU2NhbGVZKTsKKyAgICBGbG9hdFBvaW50IGRldmljZUxvd2VyUmlnaHQoKHJlY3Qu
eCgpICsgcmVjdC53aWR0aCgpKSAqIGRldmljZVNjYWxlWCwKKyAgICAgICAgKHJlY3QueSgpICsg
cmVjdC5oZWlnaHQoKSkgKiBkZXZpY2VTY2FsZVkpOworCisgICAgZGV2aWNlT3JpZ2luLnNldFgo
cm91bmRmKGRldmljZU9yaWdpbi54KCkpKTsKKyAgICBkZXZpY2VPcmlnaW4uc2V0WShyb3VuZGYo
ZGV2aWNlT3JpZ2luLnkoKSkpOworICAgIGRldmljZUxvd2VyUmlnaHQuc2V0WChyb3VuZGYoZGV2
aWNlTG93ZXJSaWdodC54KCkpKTsKKyAgICBkZXZpY2VMb3dlclJpZ2h0LnNldFkocm91bmRmKGRl
dmljZUxvd2VyUmlnaHQueSgpKSk7CisKKyAgICAvLyBEb24ndCBsZXQgdGhlIGhlaWdodCBvciB3
aWR0aCByb3VuZCB0byAwIHVubGVzcyBlaXRoZXIgd2FzIG9yaWdpbmFsbHkgMAorICAgIGlmIChk
ZXZpY2VPcmlnaW4ueSgpID09IGRldmljZUxvd2VyUmlnaHQueSgpICYmIHJlY3QuaGVpZ2h0KCkg
IT0gMCkKKyAgICAgICAgZGV2aWNlTG93ZXJSaWdodC5tb3ZlKDAsIDEpOworICAgIGlmIChkZXZp
Y2VPcmlnaW4ueCgpID09IGRldmljZUxvd2VyUmlnaHQueCgpICYmIHJlY3Qud2lkdGgoKSAhPSAw
KQorICAgICAgICBkZXZpY2VMb3dlclJpZ2h0Lm1vdmUoMSwgMCk7CisKKyAgICBGbG9hdFBvaW50
IHJvdW5kZWRPcmlnaW4oZGV2aWNlT3JpZ2luLngoKSAvIGRldmljZVNjYWxlWCwKKyAgICAgICAg
ZGV2aWNlT3JpZ2luLnkoKSAvIGRldmljZVNjYWxlWSk7CisgICAgRmxvYXRQb2ludCByb3VuZGVk
TG93ZXJSaWdodChkZXZpY2VMb3dlclJpZ2h0LngoKSAvIGRldmljZVNjYWxlWCwKKyAgICAgICAg
ZGV2aWNlTG93ZXJSaWdodC55KCkgLyBkZXZpY2VTY2FsZVkpOworICAgIHJldHVybiBGbG9hdFJl
Y3Qocm91bmRlZE9yaWdpbiwgcm91bmRlZExvd2VyUmlnaHQgLSByb3VuZGVkT3JpZ2luKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZv
cm1Db250ZXh0KCktPmNhbnZhcygpLT5zY2FsZShXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNpemUu
d2lkdGgoKSksCisgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc2l6ZS5oZWlnaHQoKSkp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0QWxwaGEoZmxvYXQgYWxwaGEpCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5zZXRBbHBoYShhbHBoYSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5zZXRQb3J0ZXJEdWZmTW9kZShXZWJDb3JlQ29tcG9zaXRlVG9Ta2lhQ29tcG9zaXRlKG9wKSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRJbWFnZUludGVycG9sYXRpb25RdWFsaXR5
KEludGVycG9sYXRpb25RdWFsaXR5KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2FwKExpbmVDYXAgY2FwKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBzd2l0Y2ggKGNhcCkgewor
ICAgIGNhc2UgQnV0dENhcDoKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldExpbmVDYXAo
U2tQYWludDo6a0J1dHRfQ2FwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSb3VuZENhcDoK
KyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldExpbmVDYXAoU2tQYWludDo6a1JvdW5kX0Nh
cCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3F1YXJlQ2FwOgorICAgICAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+c2V0TGluZUNhcChTa1BhaW50OjprU3F1YXJlX0NhcCk7CisgICAgICAgIGJy
ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVCgwKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFy
cmF5JiBkYXNoZXMsIGZsb2F0IGRhc2hPZmZzZXQpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIFRPRE8oZGdsYXprb3YpOiBUaGlzIGlzIGxp
ZnRlZCBkaXJlY3RseSBvZmYgU2tpYVN1cHBvcnQsIGxpbmVzIDQ5LTc0CisgICAgLy8gc28gaXQg
aXMgbm90IGd1YXJhbnRlZWQgdG8gd29yayBjb3JyZWN0bHkuIEkgbWFkZSBzb21lIG1pbm9yIGNv
c21ldGljCisgICAgLy8gcmVmYWN0b3JpbmcsIGJ1dCBub3QgbXVjaCBlbHNlLiBQbGVhc2UgZml4
IHRoaXM/CisgICAgc2l6ZV90IGRhc2hMZW5ndGggPSBkYXNoZXMuc2l6ZSgpOworICAgIGlmICgh
ZGFzaExlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2l6ZV90IGNvdW50ID0gKGRhc2hM
ZW5ndGggJSAyKSA9PSAwID8gZGFzaExlbmd0aCA6IGRhc2hMZW5ndGggKiAyOworICAgIFNrU2Nh
bGFyKiBpbnRlcnZhbHMgPSBuZXcgU2tTY2FsYXJbY291bnRdOworCisgICAgZm9yICh1bnNpZ25l
ZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBpbnRlcnZhbHNbaV0gPSBkYXNo
ZXNbaSAlIGRhc2hMZW5ndGhdOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldERhc2hQYXRo
RWZmZWN0KG5ldyBTa0Rhc2hQYXRoRWZmZWN0KGludGVydmFscywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBkYXNoT2Zmc2V0KSk7CisK
KyAgICBkZWxldGVbXSBpbnRlcnZhbHM7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRM
aW5lSm9pbihMaW5lSm9pbiBqb2luKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICBzd2l0Y2ggKGpvaW4pIHsKKyAgICBjYXNlIE1pdGVySm9pbjoK
KyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldExpbmVKb2luKFNrUGFpbnQ6OmtNaXRlcl9K
b2luKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSb3VuZEpvaW46CisgICAgICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXRMaW5lSm9pbihTa1BhaW50OjprUm91bmRfSm9pbik7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQmV2ZWxKb2luOgorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0TGluZUpvaW4oU2tQYWludDo6a0JldmVsX0pvaW4pOworICAgICAgICBicmVhazsKKyAgICBk
ZWZhdWx0OgorICAgICAgICBBU1NFUlQoMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbGltaXQpCit7CisgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29u
dGV4dCgpLT5zZXRNaXRlckxpbWl0KGxpbWl0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCkt
PnNldEZpbGxDb2xvcihjb2xvci5yZ2IoKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRQbGF0Zm9ybVNoYWRvdyhjb25zdCBJbnRTaXplJiBzaXplLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGludCBibHVyX2ludCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZG91YmxlIHdpZHRoID0gc2l6
ZS53aWR0aCgpOworICAgIGRvdWJsZSBoZWlnaHQgPSBzaXplLmhlaWdodCgpOworICAgIGRvdWJs
ZSBibHVyID0gYmx1cl9pbnQ7CisKKyAgICBpZiAoIW1fY29tbW9uLT5zdGF0ZS5zaGFkb3dzSWdu
b3JlVHJhbnNmb3JtcykgIHsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IGdl
dENUTSgpOworICAgICAgICB0cmFuc2Zvcm0ubWFwKHdpZHRoLCBoZWlnaHQsICZ3aWR0aCwgJmhl
aWdodCk7CisKKyAgICAgICAgLy8gVHJhbnNmb3JtIGZvciB0aGUgYmx1cgorICAgICAgICBkb3Vi
bGUgYSA9IHRyYW5zZm9ybS5hKCkgKiB0cmFuc2Zvcm0uYSgpICsgdHJhbnNmb3JtLmIoKSAqIHRy
YW5zZm9ybS5iKCk7CisgICAgICAgIGRvdWJsZSBiID0gdHJhbnNmb3JtLmEoKSAqIHRyYW5zZm9y
bS5jKCkgKyB0cmFuc2Zvcm0uYigpICogdHJhbnNmb3JtLmQoKTsKKyAgICAgICAgZG91YmxlIGMg
PSBiOworICAgICAgICBkb3VibGUgZCA9IHRyYW5zZm9ybS5jKCkgKiB0cmFuc2Zvcm0uYygpICsg
dHJhbnNmb3JtLmQoKSAqIHRyYW5zZm9ybS5kKCk7CisgICAgICAgIGRvdWJsZSBlaWdlbnZhbHVl
ID0gc3FydCgwLjUgKiAoKGEgKyBkKSAtIHNxcnQoNCAqIGIgKiBjICsgKGEgLSBkKSAqIChhIC0g
ZCkpKSk7CisgICAgICAgIGJsdXIgKj0gZWlnZW52YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAg
ICAvLyBUaGlzIGlzIHdlaXJkLCBidXQgc2hhZG93cyBnZXQgZHJvcHBlZCBpbiB0aGUgd3Jvbmcg
ZGlyZWN0aW9uIGZvcgorICAgICAgICAvLyBjYW52YXMgZWxlbWVudHMgd2l0aG91dCB0aGlzLgor
ICAgICAgICBoZWlnaHQgPSAtaGVpZ2h0OworICAgIH0KKworICAgIFNrQ29sb3IgYzsKKyAgICBp
ZiAoY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBjID0gY29sb3IucmdiKCk7CisgICAgZWxzZQor
ICAgICAgICBjID0gU2tDb2xvclNldEFSR0IoMHhGRi8zLCAwLCAwLCAwKTsgICAgLy8gInN0ZCIg
YXBwbGUgc2hhZG93IGNvbG9yLgorCisgICAgLy8gVE9ETyh0Yyk6IFNob3VsZCB3ZSBoYXZlIGEg
bWF4IHZhbHVlIGZvciB0aGUgYmx1cj8gIENHIGNsYW1wcyBhdCAxMDAwLjAKKyAgICAvLyBmb3Ig
cGVyZiByZWFzb25zLgorICAgIFNrRHJhd0xvb3BlciogZGwgPSBuZXcgU2tCbHVyRHJhd0xvb3Bl
cihibHVyIC8gMiwgd2lkdGgsIGhlaWdodCwgYyk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNl
dERyYXdMb29wZXIoZGwpOworICAgIGRsLT51bnJlZigpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0UGxhdGZvcm1TdHJva2VDb2xvcihjb25zdCBDb2xvciYgc3Ryb2tlY29sb3IpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXRTdHJva2VDb2xvcihzdHJva2Vjb2xvci5yZ2IoKSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVN0eWxlKGNvbnN0IFN0cm9rZVN0
eWxlJiBzdHJva2UpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRTdHJva2VTdHlsZShzdHJva2UpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQg
dGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0U3Ryb2tlVGhpY2tuZXNzKHRoaWNrbmVzcyk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVRleHREcmF3aW5nTW9kZShp
bnQgbW9kZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldFRleHREcmF3aW5nTW9kZShtb2RlKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29uc3QgS1VSTCYgbGluaywgY29u
c3QgSW50UmVjdCYgZGVzdFJlY3QpCit7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRV
c2VBbnRpYWxpYXNpbmcoYm9vbCBlbmFibGUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRVc2VBbnRpYWxp
YXNpbmcoZW5hYmxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhjb25z
dCBJbnRSZWN0JiByLCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50
OworICAgIFNrUmVjdCBvdmFsID0gcjsKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9r
ZSkgeworICAgICAgICAvLyBTdHJva2UgdXNpbmcgdGhlIGZpbGwgY29sb3IuCisgICAgICAgIC8v
IFRPRE8oYnJldHR3KSBpcyB0aGlzIHJlYWxseSBjb3JyZWN0PyBJdCBzZWVtcyB1bnJlYXNvbmFi
bGUuCisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFp
bnQpOworICAgICAgICBwYWludC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlX1N0eWxlKTsKKyAg
ICAgICAgcGFpbnQuc2V0U3Ryb2tlV2lkdGgoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzdHJva2VU
aGlja25lc3MoKSkpOworICAgIH0gZWxzZQorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0
dXBQYWludEZvclN0cm9raW5nKCZwYWludCwgMCwgMCk7CisKKyAgICAvLyBXZSBkbyB0aGlzIGJl
Zm9yZSBjb252ZXJ0aW5nIHRvIHNjYWxhciwgc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgU2tGaXhlZC4K
KyAgICBzdGFydEFuZ2xlID0gZmFzdE1vZChzdGFydEFuZ2xlLCAzNjApOworICAgIGFuZ2xlU3Bh
biA9IGZhc3RNb2QoYW5nbGVTcGFuLCAzNjApOworCisgICAgU2tQYXRoIHBhdGg7CisgICAgcGF0
aC5hZGRBcmMob3ZhbCwgU2tJbnRUb1NjYWxhcigtc3RhcnRBbmdsZSksIFNrSW50VG9TY2FsYXIo
LWFuZ2xlU3BhbikpOworICAgIGlmICghSXNQYXRoUmVhc29uYWJsZShnZXRDVE0oKSwgcGF0aCkp
CisgICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdQ
YXRoKHBhdGgsIHBhaW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgo
KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBj
b25zdCBTa1BhdGgmIHBhdGggPSAqcGxhdGZvcm1Db250ZXh0KCktPmN1cnJlbnRQYXRoKCk7Cisg
ICAgaWYgKCFJc1BhdGhSZWFzb25hYmxlKGdldENUTSgpLCBwYXRoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmIHN0YXRlID0gbV9jb21tb24tPnN0
YXRlOworICAgIENvbG9yU3BhY2UgY29sb3JTcGFjZSA9IHN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7
CisKKyAgICBpZiAoY29sb3JTcGFjZSA9PSBTb2xpZENvbG9yU3BhY2UgJiYgIXN0cm9rZUNvbG9y
KCkuYWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvclN0cm9raW5nKCZwYWludCwgMCwgMCk7CisK
KyAgICBpZiAoY29sb3JTcGFjZSA9PSBQYXR0ZXJuQ29sb3JTcGFjZSkgeworICAgICAgICBTa1No
YWRlciogcGF0ID0gc3RhdGUuc3Ryb2tlUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGdl
dENUTSgpKTsKKyAgICAgICAgcGFpbnQuc2V0U2hhZGVyKHBhdCk7CisgICAgICAgIHBhdC0+dW5y
ZWYoKTsKKyAgICB9IGVsc2UgaWYgKGNvbG9yU3BhY2UgPT0gR3JhZGllbnRDb2xvclNwYWNlKQor
ICAgICAgICBwYWludC5zZXRTaGFkZXIoc3RhdGUuc3Ryb2tlR3JhZGllbnQtPnBsYXRmb3JtR3Jh
ZGllbnQoKSk7CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdQYXRoKHBh
dGgsIHBhaW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3Qg
RmxvYXRSZWN0JiByZWN0LCBmbG9hdCBsaW5lV2lkdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghSXNSZWN0UmVhc29uYWJsZShnZXRD
VE0oKSwgcmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEdyYXBoaWNzQ29udGV4
dFN0YXRlJiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAgICBDb2xvclNwYWNlIGNvbG9yU3Bh
Y2UgPSBzdGF0ZS5zdHJva2VDb2xvclNwYWNlOworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gU29s
aWRDb2xvclNwYWNlICYmICFzdHJva2VDb2xvcigpLmFscGhhKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRG
b3JTdHJva2luZygmcGFpbnQsIDAsIDApOworICAgIHBhaW50LnNldFN0cm9rZVdpZHRoKFdlYkNv
cmVGbG9hdFRvU2tTY2FsYXIobGluZVdpZHRoKSk7CisKKyAgICBpZiAoY29sb3JTcGFjZSA9PSBQ
YXR0ZXJuQ29sb3JTcGFjZSkgeworICAgICAgICBTa1NoYWRlciogcGF0ID0gc3RhdGUuc3Ryb2tl
UGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGdldENUTSgpKTsKKyAgICAgICAgcGFpbnQu
c2V0U2hhZGVyKHBhdCk7CisgICAgICAgIHBhdC0+dW5yZWYoKTsKKyAgICB9IGVsc2UgaWYgKGNv
bG9yU3BhY2UgPT0gR3JhZGllbnRDb2xvclNwYWNlKQorICAgICAgICBwYWludC5zZXRTaGFkZXIo
c3RhdGUuc3Ryb2tlR3JhZGllbnQtPnBsYXRmb3JtR3JhZGllbnQoKSk7CisKKyAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdSZWN0KHJlY3QsIHBhaW50KTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnJvdGF0ZShmbG9hdCBhbmdsZUluUmFkaWFucykKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0
KCktPmNhbnZhcygpLT5yb3RhdGUoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcigKKyAgICAgICAgYW5n
bGVJblJhZGlhbnMgKiAoMTgwLjBmIC8gMy4xNDE1OTI2NWYpKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgdywgZmxvYXQgaCkKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNh
bnZhcygpLT50cmFuc2xhdGUoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcih3KSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGgp
KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0ltYWdlQnVmZmVyU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uYzYwZWZhZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwCkBAIC0wLDAgKzEsMjEyIEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorCisjaW5jbHVk
ZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYS5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlRGF0YS5oIgor
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tp
YS5oIgorI2luY2x1ZGUgIlNraWFVdGlscy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFdlIHBhc3MgYSB0ZWNobmljYWxseS11bmluaXRpYWxp
emVkIGNhbnZhcyB0byB0aGUgcGxhdGZvcm0gY29udGV4dCBoZXJlIHNpbmNlCisvLyB0aGUgY2Fu
dmFzIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlcyBpbiBJbWFnZUJ1ZmZlcjo6SW1hZ2VCdWZmZXIu
IEJ1dAorLy8gUGxhdGZvcm1Db250ZXh0IGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCB0byB1c2UgdGhl
IG9iamVjdCwgYW5kIHRoaXMgbWFrZXMgYWxsCisvLyB0aGUgb3duZXJzaGlwIGVhc2llciB0byBt
YW5hZ2UuCitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVmZmVyRGF0YShjb25zdCBJbnRTaXplJiBz
aXplKQorICAgIDogbV9jYW52YXMoKQorICAgICwgbV9wbGF0Zm9ybUNvbnRleHQoTlVMTCkgIC8v
IENhbnZhcyBpcyBzZXQgaW4gSW1hZ2VCdWZmZXIgY29uc3RydWN0b3IuCit7Cit9CisKK0ltYWdl
QnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGdyYXlTY2FsZSwg
Ym9vbCYgc3VjY2VzcykKKyAgICA6IG1fZGF0YShzaXplKQorICAgICwgbV9zaXplKHNpemUpCit7
CisgICAgaWYgKCFtX2RhdGEubV9jYW52YXMuaW5pdGlhbGl6ZShzaXplLndpZHRoKCksIHNpemUu
aGVpZ2h0KCksIGZhbHNlKSkgeworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBtX2RhdGEubV9wbGF0Zm9ybUNvbnRleHQuc2V0Q2FudmFzKCZt
X2RhdGEubV9jYW52YXMpOworICAgIG1fY29udGV4dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dCgm
bV9kYXRhLm1fcGxhdGZvcm1Db250ZXh0KSk7CisKKyAgICAvLyBNYWtlIHRoZSBiYWNrZ3JvdW5k
IHRyYW5zcGFyZW50LiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoaXMgd2Fzbid0CisgICAgLy8gcmVx
dWlyZWQsIGJ1dCB0aGUgY2FudmFzIGlzIGN1cnJlbnRseSBmaWxsZWQgd2l0aCB0aGUgbWFnaWMg
dHJhbnNwYXJlbmN5CisgICAgLy8gY29sb3IuIENhbiB3ZSBoYXZlIGFub3RoZXIgd2F5IHRvIG1h
bmFnZSB0aGlzPworICAgIG1fZGF0YS5tX2NhbnZhcy5kcmF3QVJHQigwLCAwLCAwLCAwLCBTa1Bv
cnRlckR1ZmY6OmtDbGVhcl9Nb2RlKTsKKyAgICBzdWNjZXNzID0gdHJ1ZTsKK30KKworSW1hZ2VC
dWZmZXI6On5JbWFnZUJ1ZmZlcigpCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dCogSW1hZ2VCdWZm
ZXI6OmNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7Cit9CisK
K0ltYWdlKiBJbWFnZUJ1ZmZlcjo6aW1hZ2UoKSBjb25zdAoreworICAgIGlmICghbV9pbWFnZSkg
eworICAgICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBDT1BZIG9mIHRoZSBpbWFnZSBhbmQgd2lsbCBj
YWNoZSB0aGF0IGNvcHkuIFRoaXMgbWVhbnMKKyAgICAgICAgLy8gdGhhdCBpZiBzdWJzZXF1ZW50
IG9wZXJhdGlvbnMgdGFrZSBwbGFjZSBvbiB0aGUgY29udGV4dCwgbmVpdGhlciB0aGUKKyAgICAg
ICAgLy8gY3VycmVudGx5LXJldHVybmVkIGltYWdlLCBub3IgdGhlIHJlc3VsdHMgb2YgZnV0dXJl
IGltYWdlKCkgY2FsbHMsCisgICAgICAgIC8vIHdpbGwgY29udGFpbiB0aGF0IG9wZXJhdGlvbi4K
KyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBzZWVtcyBzaWxseSwgYnV0IGlzIHRoZSB3YXkg
dGhlIENHIHBvcnQgd29ya3M6IGltYWdlKCkgaXMKKyAgICAgICAgLy8gaW50ZW5kZWQgdG8gYmUg
dXNlZCBvbmx5IHdoZW4gcmVuZGVyaW5nIGlzICJjb21wbGV0ZS4iCisgICAgICAgIG1faW1hZ2Ug
PSBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYTo6Y3JlYXRlKAorICAgICAgICAgICAgKm1fZGF0
YS5tX3BsYXRmb3JtQ29udGV4dC5iaXRtYXAoKSk7CisgICAgfQorICAgIHJldHVybiBtX2ltYWdl
LmdldCgpOworfQorCitQYXNzUmVmUHRyPEltYWdlRGF0YT4gSW1hZ2VCdWZmZXI6OmdldEltYWdl
RGF0YShjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIEFTU0VSVChjb250ZXh0KCkp
OworCisgICAgUmVmUHRyPEltYWdlRGF0YT4gcmVzdWx0ID0gSW1hZ2VEYXRhOjpjcmVhdGUocmVj
dC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBkYXRhID0gcmVz
dWx0LT5kYXRhKCktPmRhdGEoKS5kYXRhKCk7CisKKyAgICBpZiAocmVjdC54KCkgPCAwIHx8IHJl
Y3QueSgpIDwgMCB8fAorICAgICAgICAocmVjdC54KCkgKyByZWN0LndpZHRoKCkpID4gbV9zaXpl
LndpZHRoKCkgfHwKKyAgICAgICAgKHJlY3QueSgpICsgcmVjdC5oZWlnaHQoKSkgPiBtX3NpemUu
aGVpZ2h0KCkpCisgICAgICAgIG1lbXNldChkYXRhLCAwLCByZXN1bHQtPmRhdGEoKS0+bGVuZ3Ro
KCkpOworCisgICAgaW50IG9yaWdpbnggPSByZWN0LngoKTsKKyAgICBpbnQgZGVzdHggPSAwOwor
ICAgIGlmIChvcmlnaW54IDwgMCkgeworICAgICAgICBkZXN0eCA9IC1vcmlnaW54OworICAgICAg
ICBvcmlnaW54ID0gMDsKKyAgICB9CisgICAgaW50IGVuZHggPSByZWN0LngoKSArIHJlY3Qud2lk
dGgoKTsKKyAgICBpZiAoZW5keCA+IG1fc2l6ZS53aWR0aCgpKQorICAgICAgICBlbmR4ID0gbV9z
aXplLndpZHRoKCk7CisgICAgaW50IG51bUNvbHVtbnMgPSBlbmR4IC0gb3JpZ2lueDsKKworICAg
IGludCBvcmlnaW55ID0gcmVjdC55KCk7CisgICAgaW50IGRlc3R5ID0gMDsKKyAgICBpZiAob3Jp
Z2lueSA8IDApIHsKKyAgICAgICAgZGVzdHkgPSAtb3JpZ2lueTsKKyAgICAgICAgb3JpZ2lueSA9
IDA7CisgICAgfQorICAgIGludCBlbmR5ID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAg
IGlmIChlbmR5ID4gbV9zaXplLmhlaWdodCgpKQorICAgICAgICBlbmR5ID0gbV9zaXplLmhlaWdo
dCgpOworICAgIGludCBudW1Sb3dzID0gZW5keSAtIG9yaWdpbnk7CisKKyAgICBjb25zdCBTa0Jp
dG1hcCYgYml0bWFwID0gKmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCktPmJpdG1hcCgpOwor
ICAgIEFTU0VSVChiaXRtYXAuY29uZmlnKCkgPT0gU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmln
KTsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGJpdG1hcExvY2soYml0bWFwKTsKKworICAgIHVuc2ln
bmVkIGRlc3RCeXRlc1BlclJvdyA9IDQgKiByZWN0LndpZHRoKCk7CisgICAgdW5zaWduZWQgY2hh
ciogZGVzdFJvdyA9IGRhdGEgKyBkZXN0eSAqIGRlc3RCeXRlc1BlclJvdyArIGRlc3R4ICogNDsK
KworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CisgICAgICAgIHVpbnQz
Ml90KiBzcmNSb3cgPSBiaXRtYXAuZ2V0QWRkcjMyKG9yaWdpbngsIG9yaWdpbnkgKyB5KTsKKyAg
ICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1Db2x1bW5zOyArK3gpIHsKKyAgICAgICAgICAg
IFNrQ29sb3IgY29sb3IgPSBTa1BNQ29sb3JUb0NvbG9yKHNyY1Jvd1t4XSk7CisgICAgICAgICAg
ICB1bnNpZ25lZCBjaGFyKiBkZXN0UGl4ZWwgPSAmZGVzdFJvd1t4ICogNF07CisgICAgICAgICAg
ICBkZXN0UGl4ZWxbMF0gPSBTa0NvbG9yR2V0Uihjb2xvcik7CisgICAgICAgICAgICBkZXN0UGl4
ZWxbMV0gPSBTa0NvbG9yR2V0Ryhjb2xvcik7CisgICAgICAgICAgICBkZXN0UGl4ZWxbMl0gPSBT
a0NvbG9yR2V0Qihjb2xvcik7CisgICAgICAgICAgICBkZXN0UGl4ZWxbM10gPSBTa0NvbG9yR2V0
QShjb2xvcik7CisgICAgICAgIH0KKyAgICAgICAgZGVzdFJvdyArPSBkZXN0Qnl0ZXNQZXJSb3c7
CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBJbWFnZUJ1ZmZlcjo6cHV0
SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFBvaW50JiBkZXN0UG9pbnQp
Cit7CisgICAgQVNTRVJUKHNvdXJjZVJlY3Qud2lkdGgoKSA+IDApOworICAgIEFTU0VSVChzb3Vy
Y2VSZWN0LmhlaWdodCgpID4gMCk7CisKKyAgICBpbnQgb3JpZ2lueCA9IHNvdXJjZVJlY3QueCgp
OworICAgIGludCBkZXN0eCA9IGRlc3RQb2ludC54KCkgKyBzb3VyY2VSZWN0LngoKTsKKyAgICBB
U1NFUlQoZGVzdHggPj0gMCk7CisgICAgQVNTRVJUKGRlc3R4IDwgbV9zaXplLndpZHRoKCkpOwor
ICAgIEFTU0VSVChvcmlnaW54ID49IDApOworICAgIEFTU0VSVChvcmlnaW54IDwgc291cmNlUmVj
dC5yaWdodCgpKTsKKworICAgIGludCBlbmR4ID0gZGVzdFBvaW50LngoKSArIHNvdXJjZVJlY3Qu
cmlnaHQoKTsKKyAgICBBU1NFUlQoZW5keCA8PSBtX3NpemUud2lkdGgoKSk7CisKKyAgICBpbnQg
bnVtQ29sdW1ucyA9IGVuZHggLSBkZXN0eDsKKworICAgIGludCBvcmlnaW55ID0gc291cmNlUmVj
dC55KCk7CisgICAgaW50IGRlc3R5ID0gZGVzdFBvaW50LnkoKSArIHNvdXJjZVJlY3QueSgpOwor
ICAgIEFTU0VSVChkZXN0eSA+PSAwKTsKKyAgICBBU1NFUlQoZGVzdHkgPCBtX3NpemUuaGVpZ2h0
KCkpOworICAgIEFTU0VSVChvcmlnaW55ID49IDApOworICAgIEFTU0VSVChvcmlnaW55IDwgc291
cmNlUmVjdC5ib3R0b20oKSk7CisKKyAgICBpbnQgZW5keSA9IGRlc3RQb2ludC55KCkgKyBzb3Vy
Y2VSZWN0LmJvdHRvbSgpOworICAgIEFTU0VSVChlbmR5IDw9IG1fc2l6ZS5oZWlnaHQoKSk7Cisg
ICAgaW50IG51bVJvd3MgPSBlbmR5IC0gZGVzdHk7CisKKyAgICBjb25zdCBTa0JpdG1hcCYgYml0
bWFwID0gKmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCktPmJpdG1hcCgpOworICAgIEFTU0VS
VChiaXRtYXAuY29uZmlnKCkgPT0gU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnKTsKKyAgICBT
a0F1dG9Mb2NrUGl4ZWxzIGJpdG1hcExvY2soYml0bWFwKTsKKworICAgIHVuc2lnbmVkIHNyY0J5
dGVzUGVyUm93ID0gNCAqIHNvdXJjZS0+d2lkdGgoKTsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNo
YXIqIHNyY1JvdyA9IHNvdXJjZS0+ZGF0YSgpLT5kYXRhKCkuZGF0YSgpICsKKyAgICAgICAgb3Jp
Z2lueSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2lueCAqIDQ7CisKKyAgICBmb3IgKGludCB5ID0g
MDsgeSA8IG51bVJvd3M7ICsreSkgeworICAgICAgICB1aW50MzJfdCogZGVzdFJvdyA9IGJpdG1h
cC5nZXRBZGRyMzIoZGVzdHgsIGRlc3R5ICsgeSk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4
IDwgbnVtQ29sdW1uczsgKyt4KSB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBz
cmNQaXhlbCA9ICZzcmNSb3dbeCAqIDRdOworICAgICAgICAgICAgZGVzdFJvd1t4XSA9IFNrUHJl
TXVsdGlwbHlBUkdCKHNyY1BpeGVsWzNdLCBzcmNQaXhlbFswXSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXhlbFsxXSwgc3JjUGl4ZWxbMl0pOworICAg
ICAgICB9CisgICAgICAgIHNyY1JvdyArPSBzcmNCeXRlc1BlclJvdzsKKyAgICB9Cit9CisKK1N0
cmluZyBJbWFnZUJ1ZmZlcjo6dG9EYXRhVVJMKGNvbnN0IFN0cmluZyYpIGNvbnN0Cit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9J
bWFnZVNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5ZWE4YgotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwCkBA
IC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkFmZmlu
ZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFw
SW1hZ2VTaW5nbGVGcmFtZVNraWEuaCIKKyNpbmNsdWRlICJDaHJvbWl1bUJyaWRnZS5oIgorI2lu
Y2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJO
YXRpdmVJbWFnZVNraWEuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2lu
Y2x1ZGUgIlNraWFVdGlscy5oIgorI2luY2x1ZGUgIlNrU2hhZGVyLmgiCisKKyNpbmNsdWRlICJz
a2lhL2V4dC9pbWFnZV9vcGVyYXRpb25zLmgiCisjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1f
Y2FudmFzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIHsKKworLy8gVXNl
ZCBieSBjb21wdXRlUmVzYW1wbGluZ01vZGUgdG8gdGVsbCBob3cgYml0bWFwcyBzaG91bGQgYmUg
cmVzYW1wbGVkLgorZW51bSBSZXNhbXBsaW5nTW9kZSB7CisgICAgLy8gTmVhcmVzdCBuZWlnaGJv
ciByZXNhbXBsaW5nLiBVc2VkIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIHBhZ2UgaXMKKyAgICAv
LyB0cnlpbmcgdG8gbWFrZSBhIHBhdHRlcm4gYnkgc3RyZXRjaGluZyBhIHNtYWxsIGJpdG1hcCB2
ZXJ5IGxhcmdlLgorICAgIFJFU0FNUExFX05PTkUsCisKKyAgICAvLyBEZWZhdWx0IHNraWEgcmVz
YW1wbGluZy4gVXNlZCBmb3IgbGFyZ2UgZ3Jvd2luZyBvZiBpbWFnZXMgd2hlcmUgaGlnaAorICAg
IC8vIHF1YWxpdHkgcmVzYW1wbGluZyBkb2Vzbid0IGdldCB1cyB2ZXJ5IG11Y2ggZXhjZXB0IGEg
c2xvd2Rvd24uCisgICAgUkVTQU1QTEVfTElORUFSLAorCisgICAgLy8gSGlnaCBxdWFsaXR5IHJl
c2FtcGxpbmcuCisgICAgUkVTQU1QTEVfQVdFU09NRSwKK307CisKKy8vIHN0YXRpYworUmVzYW1w
bGluZ01vZGUgY29tcHV0ZVJlc2FtcGxpbmdNb2RlKGNvbnN0IE5hdGl2ZUltYWdlU2tpYSYgYml0
bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNXaWR0aCwg
aW50IHNyY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9h
dCBkZXN0V2lkdGgsIGZsb2F0IGRlc3RIZWlnaHQpCit7CisgICAgaW50IGRlc3RJV2lkdGggPSBz
dGF0aWNfY2FzdDxpbnQ+KGRlc3RXaWR0aCk7CisgICAgaW50IGRlc3RJSGVpZ2h0ID0gc3RhdGlj
X2Nhc3Q8aW50PihkZXN0SGVpZ2h0KTsKKworICAgIC8vIFRoZSBwZXJjZW50IGNoYW5nZSBiZWxv
dyB3aGljaCB3ZSB3aWxsIG5vdCByZXNhbXBsZS4gVGhpcyB1c3VhbGx5IG1lYW5zCisgICAgLy8g
YW4gb2ZmLWJ5LW9uZSBlcnJvciBvbiB0aGUgd2ViIHBhZ2UsIGFuZCBqdXN0IGRvaW5nIG5lYXJl
c3QgbmVpZ2hib3IKKyAgICAvLyBzYW1wbGluZyBpcyB1c3VhbGx5IGdvb2QgZW5vdWdoLgorICAg
IGNvbnN0IGZsb2F0IGtGcmFjdGlvbmFsQ2hhbmdlVGhyZXNob2xkID0gMC4wMjVmOworCisgICAg
Ly8gSW1hZ2VzIHNtYWxsZXIgdGhhbiB0aGlzIGluIGVpdGhlciBkaXJlY3Rpb24gYXJlIGNvbnNp
ZGVyZWQgInNtYWxsIiBhbmQKKyAgICAvLyBhcmUgbm90IHJlc2FtcGxlZCBldmVyIChzZWUgYmVs
b3cpLgorICAgIGNvbnN0IGludCBrU21hbGxJbWFnZVNpemVUaHJlc2hvbGQgPSA4OworCisgICAg
Ly8gVGhlIGFtb3VudCBhbiBpbWFnZSBjYW4gYmUgc3RyZXRjaGVkIGluIGEgc2luZ2xlIGRpcmVj
dGlvbiBiZWZvcmUgd2UKKyAgICAvLyBzYXkgdGhhdCBpdCBpcyBiZWluZyBzdHJldGNoZWQgc28g
bXVjaCB0aGF0IGl0IG11c3QgYmUgYSBsaW5lIG9yCisgICAgLy8gYmFja2dyb3VuZCB0aGF0IGRv
ZXNuJ3QgbmVlZCByZXNhbXBsaW5nLgorICAgIGNvbnN0IGZsb2F0IGtMYXJnZVN0cmV0Y2ggPSAz
LjBmOworCisgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgcmVzYW1wbGUgdGhpcyBpbWFn
ZS4gV2UgdHJ5IHRvIHBydW5lIG91dCBzb21lCisgICAgLy8gY29tbW9uIGNhc2VzIHdoZXJlIHJl
c2FtcGxpbmcgd29uJ3QgZ2l2ZSB1cyBhbnl0aGluZywgc2luY2UgaXQgaXMgbXVjaAorICAgIC8v
IHNsb3dlciB0aGFuIGRyYXdpbmcgc3RyZXRjaGVkLgorICAgIGlmIChzcmNXaWR0aCA9PSBkZXN0
SVdpZHRoICYmIHNyY0hlaWdodCA9PSBkZXN0SUhlaWdodCkgeworICAgICAgICAvLyBXZSBkb24n
dCBuZWVkIHRvIHJlc2FtcGxlIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUg
c2FtZS4KKyAgICAgICAgcmV0dXJuIFJFU0FNUExFX05PTkU7CisgICAgfQorCisgICAgaWYgKHNy
Y1dpZHRoIDw9IGtTbWFsbEltYWdlU2l6ZVRocmVzaG9sZCB8fAorICAgICAgICBzcmNIZWlnaHQg
PD0ga1NtYWxsSW1hZ2VTaXplVGhyZXNob2xkIHx8CisgICAgICAgIGRlc3RXaWR0aCA8PSBrU21h
bGxJbWFnZVNpemVUaHJlc2hvbGQgfHwKKyAgICAgICAgZGVzdEhlaWdodCA8PSBrU21hbGxJbWFn
ZVNpemVUaHJlc2hvbGQpIHsKKyAgICAgICAgLy8gTmV2ZXIgcmVzYW1wbGUgc21hbGwgaW1hZ2Vz
LiBUaGVzZSBhcmUgb2Z0ZW4gdXNlZCBmb3IgYm9yZGVycyBhbmQKKyAgICAgICAgLy8gcnVsZXMg
KHRoaW5rIDF4MSBpbWFnZXMgdXNlZCB0byBtYWtlIGxpbmVzKS4KKyAgICAgICAgcmV0dXJuIFJF
U0FNUExFX05PTkU7CisgICAgfQorCisgICAgaWYgKHNyY0hlaWdodCAqIGtMYXJnZVN0cmV0Y2gg
PD0gZGVzdEhlaWdodCB8fAorICAgICAgICBzcmNXaWR0aCAqIGtMYXJnZVN0cmV0Y2ggPD0gZGVz
dFdpZHRoKSB7CisgICAgICAgIC8vIExhcmdlIGltYWdlIGRldGVjdGVkLgorCisgICAgICAgIC8v
IERvbid0IHJlc2FtcGxlIGlmIGl0IGlzIGJlaW5nIHN0cmV0Y2hlZCBhIGxvdCBpbiBvbmx5IG9u
ZSBkaXJlY3Rpb24uCisgICAgICAgIC8vIFRoaXMgaXMgdHJ5aW5nIHRvIGNhdGNoIGNhc2VzIHdo
ZXJlIHNvbWVib2R5IGhhcyBjcmVhdGVkIGEgYm9yZGVyCisgICAgICAgIC8vICh3aGljaCBtaWdo
dCBiZSBsYXJnZSkgYW5kIHRoZW4gaXMgc3RyZXRjaGluZyBpdCB0byBmaWxsIHNvbWUgcGFydAor
ICAgICAgICAvLyBvZiB0aGUgcGFnZS4KKyAgICAgICAgaWYgKHNyY1dpZHRoID09IGRlc3RXaWR0
aCB8fCBzcmNIZWlnaHQgPT0gZGVzdEhlaWdodCkKKyAgICAgICAgICAgIHJldHVybiBSRVNBTVBM
RV9OT05FOworCisgICAgICAgIC8vIFRoZSBpbWFnZSBpcyBncm93aW5nIGEgbG90IGFuZCBpbiBt
b3JlIHRoYW4gb25lIGRpcmVjdGlvbi4gUmVzYW1wbGluZworICAgICAgICAvLyBpcyBzbG93IGFu
ZCBkb2Vzbid0IGdpdmUgdXMgdmVyeSBtdWNoIHdoZW4gZ3Jvd2luZyBhIGxvdC4KKyAgICAgICAg
cmV0dXJuIFJFU0FNUExFX0xJTkVBUjsKKyAgICB9CisKKyAgICBpZiAoKGZhYnMoZGVzdFdpZHRo
IC0gc3JjV2lkdGgpIC8gc3JjV2lkdGggPAorICAgICAgICAga0ZyYWN0aW9uYWxDaGFuZ2VUaHJl
c2hvbGQpICYmCisgICAgICAgKGZhYnMoZGVzdEhlaWdodCAtIHNyY0hlaWdodCkgLyBzcmNIZWln
aHQgPAorICAgICAgICBrRnJhY3Rpb25hbENoYW5nZVRocmVzaG9sZCkpIHsKKyAgICAgICAgLy8g
SXQgaXMgZGlzYXBwb2ludGluZ2x5IGNvbW1vbiBvbiB0aGUgd2ViIGZvciBpbWFnZSBzaXplcyB0
byBiZSBvZmYgYnkKKyAgICAgICAgLy8gb25lIG9yIHR3byBwaXhlbHMuIFdlIGRvbid0IGJvdGhl
ciByZXNhbXBsaW5nIGlmIHRoZSBzaXplIGRpZmZlcmVuY2UKKyAgICAgICAgLy8gaXMgYSBzbWFs
bCBmcmFjdGlvbiBvZiB0aGUgb3JpZ2luYWwgc2l6ZS4KKyAgICAgICAgcmV0dXJuIFJFU0FNUExF
X05PTkU7CisgICAgfQorCisgICAgLy8gV2hlbiB0aGUgaW1hZ2UgaXMgbm90IHlldCBkb25lIGxv
YWRpbmcsIHVzZSBsaW5lYXIuIFdlIGRvbid0IGNhY2hlIHRoZQorICAgIC8vIHBhcnRpYWxseSBy
ZXNhbXBsZWQgaW1hZ2VzLCBhbmQgYXMgdGhleSBjb21lIGluIGluY3JlbWVudGFsbHksIGl0IGNh
dXNlcworICAgIC8vIHVzIHRvIGhhdmUgdG8gcmVzYW1wbGUgdGhlIHdob2xlIHRoaW5nIGV2ZXJ5
IHRpbWUuCisgICAgaWYgKCFiaXRtYXAuaXNEYXRhQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJu
IFJFU0FNUExFX0xJTkVBUjsKKworICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBnZXRzIHJlc2FtcGxl
ZC4KKyAgICByZXR1cm4gUkVTQU1QTEVfQVdFU09NRTsKK30KKworLy8gRHJhd3MgdGhlIGdpdmVu
IGJpdG1hcCB0byB0aGUgZ2l2ZW4gY2FudmFzLiBUaGUgc3Vic2V0IG9mIHRoZSBzb3VyY2UgYml0
bWFwCisvLyBpZGVudGlmaWVkIGJ5IHNyY19yZWN0IGlzIGRyYXduIHRvIHRoZSBnaXZlbiBkZXN0
aW5hdGlvbiByZWN0LiBUaGUgYml0bWFwCisvLyB3aWxsIGJlIHJlc2FtcGxlZCB0byByZXNhbXBs
ZV93aWR0aCAqIHJlc2FtcGxlX2hlaWdodCAodGhpcyBpcyB0aGUgc2l6ZSBvZgorLy8gdGhlIHdo
b2xlIGltYWdlLCBub3QgdGhlIHN1YnNldCkuIFNlZSBzaG91bGRSZXNhbXBsZUJpdG1hcCBmb3Ig
bW9yZS4KKy8vCisvLyBUaGlzIGRvZXMgYSBsb3Qgb2YgY29tcHV0YXRpb24gdG8gcmVzYW1wbGUg
b25seSB0aGUgcG9ydGlvbiBvZiB0aGUgYml0bWFwCisvLyB0aGF0IHdpbGwgb25seSBiZSBkcmF3
bi4gVGhpcyBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2Ugc2luY2Ugd2hlbiB3ZSBhcmUKKy8v
IHNjcm9sbGluZywgZm9yIGV4YW1wbGUsIHdlIGFyZSBvbmx5IGRyYXdpbmcgYSBzbWFsbCBzdHJp
cCBvZiB0aGUgaW1hZ2UuCisvLyBSZXNhbXBsaW5nIHRoZSB3aG9sZSBpbWFnZSBldmVyeSB0aW1l
IGlzIHZlcnkgc2xvdywgc28gdGhpcyBzcGVlZHMgdXAgdGhpbmdzCisvLyBkcmFtYXRpY2FsbHku
Cit2b2lkIGRyYXdSZXNhbXBsZWRCaXRtYXAoU2tDYW52YXMmIGNhbnZhcywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICBTa1BhaW50JiBwYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBOYXRpdmVJbWFnZVNraWEmIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBTa0lSZWN0JiBzcmNJUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBT
a1JlY3QmIGRlc3RSZWN0KQoreworICAgIC8vIEZpcnN0IGdldCB0aGUgc3Vic2V0IHdlIG5lZWQu
IFRoaXMgaXMgZWZmaWNpZW50IGFuZCBkb2VzIG5vdCBjb3B5IHBpeGVscy4KKyAgICBTa0JpdG1h
cCBzdWJzZXQ7CisgICAgYml0bWFwLmV4dHJhY3RTdWJzZXQoJnN1YnNldCwgc3JjSVJlY3QpOwor
ICAgIFNrUmVjdCBzcmNSZWN0OworICAgIHNyY1JlY3Quc2V0KHNyY0lSZWN0KTsKKworICAgIC8v
IFdoZXRoZXIgd2UncmUgZG9pbmcgYSBzdWJzZXQgb3IgdXNpbmcgdGhlIGZ1bGwgc291cmNlIGlt
YWdlLgorICAgIGJvb2wgc3JjSXNGdWxsID0gc3JjSVJlY3QuZkxlZnQgPT0gMCAmJiBzcmNJUmVj
dC5mVG9wID09IDAgJiYKKyAgICAgICAgc3JjSVJlY3Qud2lkdGgoKSA9PSBiaXRtYXAud2lkdGgo
KSAmJgorICAgICAgICBzcmNJUmVjdC5oZWlnaHQoKSA9PSBiaXRtYXAuaGVpZ2h0KCk7CisKKyAg
ICAvLyBXZSB3aWxsIGFsd2F5cyBkcmF3IGluIGludGVnZXIgc2l6ZXMsIHNvIHJvdW5kIHRoZSBk
ZXN0aW5hdGlvbiByZWN0LgorICAgIFNrSVJlY3QgZGVzdFJlY3RSb3VuZGVkOworICAgIGRlc3RS
ZWN0LnJvdW5kKCZkZXN0UmVjdFJvdW5kZWQpOworICAgIFNrSVJlY3QgcmVzaXplZEltYWdlUmVj
dDsgIC8vIFJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlIHJlc2l6ZWQgaW1hZ2UuCisgICAgcmVz
aXplZEltYWdlUmVjdC5zZXQoMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UmVj
dFJvdW5kZWQud2lkdGgoKSwgZGVzdFJlY3RSb3VuZGVkLmhlaWdodCgpKTsKKworICAgIGlmIChz
cmNJc0Z1bGwgJiYKKyAgICAgICAgYml0bWFwLmhhc1Jlc2l6ZWRCaXRtYXAoZGVzdFJlY3RSb3Vu
ZGVkLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RSZWN0Um91
bmRlZC5oZWlnaHQoKSkpIHsKKyAgICAgICAgLy8gWWF5LCB0aGlzIGJpdG1hcCBmcmFtZSBhbHJl
YWR5IGhhcyBhIHJlc2l6ZWQgdmVyc2lvbi4KKyAgICAgICAgU2tCaXRtYXAgcmVzYW1wbGVkID0g
Yml0bWFwLnJlc2l6ZWRCaXRtYXAoZGVzdFJlY3RSb3VuZGVkLndpZHRoKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RSZWN0Um91bmRlZC5o
ZWlnaHQoKSk7CisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwUmVjdChyZXNhbXBsZWQsIDAsIGRl
c3RSZWN0LCAmcGFpbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ29tcHV0
ZSB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIG91ciByZWN0LgorICAgIFNrUmVjdCBkZXN0Qml0bWFw
U3Vic2V0U2s7CisgICAgQ2xpcFJlY3RUb0NhbnZhcyhjYW52YXMsIGRlc3RSZWN0LCAmZGVzdEJp
dG1hcFN1YnNldFNrKTsKKyAgICBkZXN0Qml0bWFwU3Vic2V0U2sub2Zmc2V0KC1kZXN0UmVjdC5m
TGVmdCwgLWRlc3RSZWN0LmZUb3ApOworCisgICAgLy8gVGhlIG1hdHJpeCBpbnZlcnRpbmcsIGV0
Yy4gY291bGQgaGF2ZSBpbnRyb2R1Y2VkIHJvdW5kaW5nIGVycm9yIHdoaWNoCisgICAgLy8gY2F1
c2VzIHRoZSBib3VuZHMgdG8gYmUgb3V0c2lkZSBvZiB0aGUgcmVzaXplZCBiaXRtYXAuIFdlIHJv
dW5kIG91dHdhcmQKKyAgICAvLyBzbyB3ZSBhbHdheXMgbGVhbiB0b3dhcmQgaXQgYmVpbmcgbGFy
Z2VyIHJhdGhlciB0aGFuIHNtYWxsZXIgdGhhbiB3ZQorICAgIC8vIG5lZWQsIGFuZCB0aGVuIGNs
YW1wIHRvIHRoZSBiaXRtYXAgYm91bmRzIHNvIHdlIGRvbid0IGdldCBhbnkgaW52YWxpZAorICAg
IC8vIGRhdGEuCisgICAgU2tJUmVjdCBkZXN0Qml0bWFwU3Vic2V0U2tJOworICAgIGRlc3RCaXRt
YXBTdWJzZXRTay5yb3VuZE91dCgmZGVzdEJpdG1hcFN1YnNldFNrSSk7CisgICAgaWYgKCFkZXN0
Qml0bWFwU3Vic2V0U2tJLmludGVyc2VjdChyZXNpemVkSW1hZ2VSZWN0KSkKKyAgICAgICAgcmV0
dXJuOyAgLy8gUmVzaXplZCBpbWFnZSBkb2VzIG5vdCBpbnRlcnNlY3QuCisKKyAgICBpZiAoc3Jj
SXNGdWxsICYmIGJpdG1hcC5zaG91bGRDYWNoZVJlc2FtcGxpbmcoCisgICAgICAgICAgICByZXNp
emVkSW1hZ2VSZWN0LndpZHRoKCksCisgICAgICAgICAgICByZXNpemVkSW1hZ2VSZWN0LmhlaWdo
dCgpLAorICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldFNrSS53aWR0aCgpLAorICAgICAgICAg
ICAgZGVzdEJpdG1hcFN1YnNldFNrSS5oZWlnaHQoKSkpIHsKKyAgICAgICAgLy8gV2UncmUgc3Vw
cG9zZWQgdG8gcmVzaXplIHRoZSBlbnRpcmUgaW1hZ2UgYW5kIGNhY2hlIGl0LCBldmVuIHRob3Vn
aAorICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIGFsbCBvZiBpdC4KKyAgICAgICAgU2tCaXRtYXAg
cmVzYW1wbGVkID0gYml0bWFwLnJlc2l6ZWRCaXRtYXAoZGVzdFJlY3RSb3VuZGVkLndpZHRoKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RS
ZWN0Um91bmRlZC5oZWlnaHQoKSk7CisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwUmVjdChyZXNh
bXBsZWQsIDAsIGRlc3RSZWN0LCAmcGFpbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdl
IHNob3VsZCBvbmx5IHJlc2l6ZSB0aGUgZXhwb3NlZCBwYXJ0IG9mIHRoZSBiaXRtYXAgdG8gZG8g
dGhlCisgICAgICAgIC8vIG1pbmltYWwgcG9zc2libGUgd29yay4KKyAgICAgICAgZ2Z4OjpSZWN0
IGRlc3RCaXRtYXBTdWJzZXQoZGVzdEJpdG1hcFN1YnNldFNrSS5mTGVmdCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldFNrSS5mVG9wLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Qml0bWFwU3Vic2V0U2tJLndpZHRoKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXRTa0ku
aGVpZ2h0KCkpOworCisgICAgICAgIC8vIFJlc2FtcGxlIHRoZSBuZWVkZWQgcGFydCBvZiB0aGUg
aW1hZ2UuCisgICAgICAgIFNrQml0bWFwIHJlc2FtcGxlZCA9IHNraWE6OkltYWdlT3BlcmF0aW9u
czo6UmVzaXplKHN1YnNldCwKKyAgICAgICAgICAgIHNraWE6OkltYWdlT3BlcmF0aW9uczo6UkVT
SVpFX0xBTkNaT1MzLAorICAgICAgICAgICAgZGVzdFJlY3RSb3VuZGVkLndpZHRoKCksIGRlc3RS
ZWN0Um91bmRlZC5oZWlnaHQoKSwKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQpOworCisg
ICAgICAgIC8vIENvbXB1dGUgd2hlcmUgdGhlIG5ldyBiaXRtYXAgc2hvdWxkIGJlIGRyYXduLiBT
aW5jZSBvdXIgbmV3IGJpdG1hcAorICAgICAgICAvLyBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBv
cmlnaW5hbCwgd2UgaGF2ZSB0byBzaGlmdCBpdCBvdmVyIGJ5IHRoZQorICAgICAgICAvLyBzYW1l
IGFtb3VudCB0aGF0IHdlIGN1dCBvZmYgdGhlIHRvcCBhbmQgbGVmdC4KKyAgICAgICAgU2tSZWN0
IG9mZnNldERlc3RSZWN0ID0geworICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldC54KCkgKyBk
ZXN0UmVjdC5mTGVmdCwKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQueSgpICsgZGVzdFJl
Y3QuZlRvcCwKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQucmlnaHQoKSArIGRlc3RSZWN0
LmZMZWZ0LAorICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldC5ib3R0b20oKSArIGRlc3RSZWN0
LmZUb3AgfTsKKworICAgICAgICBjYW52YXMuZHJhd0JpdG1hcFJlY3QocmVzYW1wbGVkLCAwLCBv
ZmZzZXREZXN0UmVjdCwgJnBhaW50KTsKKyAgICB9Cit9CisKK3ZvaWQgcGFpbnRTa0JpdG1hcChQ
bGF0Zm9ybUNvbnRleHRTa2lhKiBwbGF0Zm9ybUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAg
Y29uc3QgTmF0aXZlSW1hZ2VTa2lhJiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgY29uc3Qg
U2tJUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTa1JlY3QmIGRlc3RS
ZWN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUG9ydGVyRHVmZjo6TW9kZSYgY29tcE9w
KQoreworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFpbnQuc2V0UG9ydGVyRHVmZlhmZXJtb2Rl
KGNvbXBPcCk7CisKKyAgICBza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzID0gcGxhdGZvcm1D
b250ZXh0LT5jYW52YXMoKTsKKworICAgIFJlc2FtcGxpbmdNb2RlIHJlc2FtcGxpbmcgPSBwbGF0
Zm9ybUNvbnRleHQtPklzUHJpbnRpbmcoKSA/IFJFU0FNUExFX05PTkUgOgorICAgICAgICBjb21w
dXRlUmVzYW1wbGluZ01vZGUoYml0bWFwLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NjYWxhclRvRmxvYXQoZGVzdFJl
Y3Qud2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NjYWxhclRvRmxv
YXQoZGVzdFJlY3QuaGVpZ2h0KCkpKTsKKyAgICBpZiAocmVzYW1wbGluZyA9PSBSRVNBTVBMRV9B
V0VTT01FKSB7CisgICAgICAgIHBhaW50LnNldEZpbHRlckJpdG1hcChmYWxzZSk7CisgICAgICAg
IGRyYXdSZXNhbXBsZWRCaXRtYXAoKmNhbnZhcywgcGFpbnQsIGJpdG1hcCwgc3JjUmVjdCwgZGVz
dFJlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vIHJlc2FtcGxpbmcgbmVjZXNzYXJ5
LCB3ZSBjYW4ganVzdCBkcmF3IHRoZSBiaXRtYXAuIFdlIHdhbnQgdG8KKyAgICAgICAgLy8gZmls
dGVyIGl0IGlmIHdlIGRlY2lkZWQgdG8gZG8gbGluZWFyIGludGVycG9sYXRpb24gYWJvdmUsIG9y
IGlmIHRoZXJlCisgICAgICAgIC8vIGlzIHNvbWV0aGluZyBpbnRlcmVzdGluZyBnb2luZyBvbiB3
aXRoIHRoZSBtYXRyaXggKGxpa2UgYSByb3RhdGlvbikuCisgICAgICAgIC8vIE5vdGU6IGZvciBz
ZXJpYWxpemF0aW9uLCB3ZSB3aWxsIHdhbnQgdG8gc3Vic2V0IHRoZSBiaXRtYXAgZmlyc3Qgc28K
KyAgICAgICAgLy8gd2UgZG9uJ3Qgc2VuZCBleHRyYSBwaXhlbHMuCisgICAgICAgIHBhaW50LnNl
dEZpbHRlckJpdG1hcChyZXNhbXBsaW5nID09IFJFU0FNUExFX0xJTkVBUik7CisgICAgICAgIGNh
bnZhcy0+ZHJhd0JpdG1hcFJlY3QoYml0bWFwLCAmc3JjUmVjdCwgZGVzdFJlY3QsICZwYWludCk7
CisgICAgfQorfQorCisvLyBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBkaW1lbnNpb25zIHdpdGggdGhl
IGdpdmVuIG1hdHJpeC4gVXNlZCB0byBzZWUgaG93IGJpZworLy8gaW1hZ2VzIHdpbGwgYmUgb25j
ZSB0cmFuc2Zvcm1lZC4KK3ZvaWQgVHJhbnNmb3JtRGltZW5zaW9ucyhjb25zdCBTa01hdHJpeCYg
bWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNyY193aWR0aCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgIGZsb2F0KiBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0
KiBkZXN0X2hlaWdodCkgeworICAgIC8vIFRyYW5zZm9ybSAzIHBvaW50cyB0byBzZWUgaG93IGxv
bmcgZWFjaCBzaWRlIG9mIHRoZSBiaXRtYXAgd2lsbCBiZS4KKyAgICBTa1BvaW50IHNyY19wb2lu
dHNbM107ICAvLyAoMCwgMCksICh3aWR0aCwgMCksICgwLCBoZWlnaHQpLgorICAgIHNyY19wb2lu
dHNbMF0uc2V0KDAsIDApOworICAgIHNyY19wb2ludHNbMV0uc2V0KFNrRmxvYXRUb1NjYWxhcihz
cmNfd2lkdGgpLCAwKTsKKyAgICBzcmNfcG9pbnRzWzJdLnNldCgwLCBTa0Zsb2F0VG9TY2FsYXIo
c3JjX2hlaWdodCkpOworCisgICAgLy8gTm93IG1lYXN1cmUgdGhlIGxlbmd0aCBvZiB0aGUgdHdv
IHRyYW5zZm9ybWVkIHZlY3RvcnMgcmVsYXRpdmUgdG8gdGhlCisgICAgLy8gdHJhbnNmb3JtZWQg
b3JpZ2luIHRvIHNlZSBob3cgYmlnIHRoZSBiaXRtYXAgd2lsbCBiZS4gTm90ZTogZm9yIHNrZXdz
LAorICAgIC8vIHRoaXMgaXNuJ3QgdGhlIGJlc3QgdGhpbmcsIGJ1dCB3ZSBkb24ndCBoYXZlIHNr
ZXdzLgorICAgIFNrUG9pbnQgZGVzdF9wb2ludHNbM107CisgICAgbWF0cml4Lm1hcFBvaW50cyhk
ZXN0X3BvaW50cywgc3JjX3BvaW50cywgMyk7CisgICAgKmRlc3Rfd2lkdGggPSBTa1NjYWxhclRv
RmxvYXQoKGRlc3RfcG9pbnRzWzFdIC0gZGVzdF9wb2ludHNbMF0pLmxlbmd0aCgpKTsKKyAgICAq
ZGVzdF9oZWlnaHQgPSBTa1NjYWxhclRvRmxvYXQoKGRlc3RfcG9pbnRzWzJdIC0gZGVzdF9wb2lu
dHNbMF0pLmxlbmd0aCgpKTsKK30KKworLy8gQSBoZWxwZXIgbWV0aG9kIGZvciB0cmFuc2xhdGlu
ZyBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcy4KK0Zsb2F0UmVjdCBub3JtYWxpemVS
ZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBGbG9hdFJlY3Qgbm9ybSA9IHJlY3Q7
CisgICAgaWYgKG5vcm0ud2lkdGgoKSA8IDApIHsKKyAgICAgICAgbm9ybS5zZXRYKG5vcm0ueCgp
ICsgbm9ybS53aWR0aCgpKTsKKyAgICAgICAgbm9ybS5zZXRXaWR0aCgtbm9ybS53aWR0aCgpKTsK
KyAgICB9CisgICAgaWYgKG5vcm0uaGVpZ2h0KCkgPCAwKSB7CisgICAgICAgIG5vcm0uc2V0WShu
b3JtLnkoKSArIG5vcm0uaGVpZ2h0KCkpOworICAgICAgICBub3JtLnNldEhlaWdodCgtbm9ybS5o
ZWlnaHQoKSk7CisgICAgfQorICAgIHJldHVybiBub3JtOworfQorCit9ICAvLyBuYW1lc3BhY2UK
Kwordm9pZCBGcmFtZURhdGE6OmNsZWFyKCkKK3sKKyAgICAvLyBJbWFnZVNvdXJjZTo6Y3JlYXRl
RnJhbWVBdEluZGV4KCkgYWxsb2NhdGVkIHxtX2ZyYW1lfCBhbmQgcGFzc2VkCisgICAgLy8gb3du
ZXJzaGlwIHRvIEJpdG1hcEltYWdlOyB3ZSBtdXN0IGRlbGV0ZSBpdCBoZXJlLgorICAgIGRlbGV0
ZSBtX2ZyYW1lOworICAgIG1fZnJhbWUgPSAwOworICAgIC8vIE5PVEU6IFdlIHB1cnBvc2VmdWxs
eSBkb24ndCByZXNldCBtZXRhZGF0YSBoZXJlLCBzbyB0aGF0IGV2ZW4gaWYgd2UKKyAgICAvLyB0
aHJvdyBhd2F5IHByZXZpb3VzbHktZGVjb2RlZCBkYXRhLCBhbmltYXRpb24gbG9vcHMgY2FuIHN0
aWxsIGFjY2VzcworICAgIC8vIHByb3BlcnRpZXMgbGlrZSBmcmFtZSBkdXJhdGlvbnMgd2l0aG91
dCByZS1kZWNvZGluZy4KK30KKworUGFzc1JlZlB0cjxJbWFnZT4gSW1hZ2U6OmxvYWRQbGF0Zm9y
bVJlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgcmV0dXJuIENocm9taXVtQnJpZGdl
Ojpsb2FkUGxhdGZvcm1JbWFnZVJlc291cmNlKG5hbWUpOworfQorCit2b2lkIEltYWdlOjpkcmF3
UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGbG9hdFJlY3QmIGZsb2F0U3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLAorICAgICAgICAgICAgICAgICAgICAg
ICAgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3AsCisgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIGlmIChkZXN0UmVjdC5pc0VtcHR5
KCkgfHwgZmxvYXRTcmNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOyAgLy8gbm90aGlu
ZyB0byBkcmF3CisKKyAgICBOYXRpdmVJbWFnZVNraWEqIGJpdG1hcCA9IG5hdGl2ZUltYWdlRm9y
Q3VycmVudEZyYW1lKCk7CisgICAgaWYgKCFiaXRtYXApCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIFRoaXMgaXMgYSB2ZXJ5IGluZXhwZW5zaXZlIG9wZXJhdGlvbi4gSXQgd2lsbCBnZW5lcmF0
ZSBhIG5ldyBiaXRtYXAgYnV0CisgICAgLy8gaXQgd2lsbCBpbnRlcm5hbGx5IHJlZmVyZW5jZSB0
aGUgb2xkIGJpdG1hcCdzIHBpeGVscywgYWRqdXN0aW5nIHRoZSByb3cKKyAgICAvLyBzdHJpZGUg
c28gdGhlIGV4dHJhIHBpeGVscyBhcHBlYXIgYXMgcGFkZGluZyB0byB0aGUgc3Vic2V0dGVkIGJp
dG1hcC4KKyAgICBTa0JpdG1hcCBzcmNfc3Vic2V0OworICAgIFNrSVJlY3Qgc3JjUmVjdCA9IGVu
Y2xvc2luZ0ludFJlY3QoZmxvYXRTcmNSZWN0KTsKKyAgICBiaXRtYXAtPmV4dHJhY3RTdWJzZXQo
JnNyY19zdWJzZXQsIHNyY1JlY3QpOworCisgICAgU2tCaXRtYXAgcmVzYW1wbGVkOworICAgIFNr
U2hhZGVyKiBzaGFkZXI7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoYXQgc2l6ZSB0aGUgYml0bWFw
IHdpbGwgYmUgaW4gdGhlIGRlc3RpbmF0aW9uLiBUaGUKKyAgICAvLyBkZXN0aW5hdGlvbiByZWN0
IGlzIHRoZSBib3VuZHMgb2YgdGhlIHBhdHRlcm4sIHdlIG5lZWQgdG8gdXNlIHRoZQorICAgIC8v
IG1hdHJpeCB0byBzZWUgaG93IGJpdCBpdCB3aWxsIGJlLgorICAgIGZsb2F0IGRlc3RfYml0bWFw
X3dpZHRoLCBkZXN0X2JpdG1hcF9oZWlnaHQ7CisgICAgVHJhbnNmb3JtRGltZW5zaW9ucyhwYXR0
ZXJuVHJhbnNmb3JtLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAmZGVzdF9iaXRtYXBfd2lkdGgsICZkZXN0X2JpdG1hcF9oZWlnaHQp
OworCisgICAgLy8gQ29tcHV0ZSB0aGUgcmVzYW1wbGluZyBtb2RlLgorICAgIFJlc2FtcGxpbmdN
b2RlIHJlc2FtcGxpbmc7CisgICAgaWYgKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5Jc1By
aW50aW5nKCkpCisgICAgICByZXNhbXBsaW5nID0gUkVTQU1QTEVfTElORUFSOworICAgIGVsc2Ug
eworICAgICAgcmVzYW1wbGluZyA9IGNvbXB1dGVSZXNhbXBsaW5nTW9kZSgqYml0bWFwLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LndpZHRoKCksIHNy
Y1JlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlc3RfYml0bWFwX3dpZHRoLCBkZXN0X2JpdG1hcF9oZWlnaHQpOworICAgIH0KKworICAgIC8v
IExvYWQgdGhlIHRyYW5zZm9ybSBXZWJLaXQgcmVxdWVzdGVkLgorICAgIFNrTWF0cml4IG1hdHJp
eChwYXR0ZXJuVHJhbnNmb3JtKTsKKworICAgIGlmIChyZXNhbXBsaW5nID09IFJFU0FNUExFX0FX
RVNPTUUpIHsKKyAgICAgICAgLy8gRG8gbmljZSByZXNhbXBsaW5nLgorICAgICAgICBTa0JpdG1h
cCByZXNhbXBsZWQgPSBza2lhOjpJbWFnZU9wZXJhdGlvbnM6OlJlc2l6ZShzcmNfc3Vic2V0LAor
ICAgICAgICAgICAgc2tpYTo6SW1hZ2VPcGVyYXRpb25zOjpSRVNJWkVfTEFOQ1pPUzMsCisgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGRlc3RfYml0bWFwX3dpZHRoKSwKKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PGludD4oZGVzdF9iaXRtYXBfaGVpZ2h0KSk7CisgICAgICAgIHNoYWRlciA9
IFNrU2hhZGVyOjpDcmVhdGVCaXRtYXBTaGFkZXIoCisgICAgICAgICAgICByZXNhbXBsZWQsIFNr
U2hhZGVyOjprUmVwZWF0X1RpbGVNb2RlLCBTa1NoYWRlcjo6a1JlcGVhdF9UaWxlTW9kZSk7CisK
KyAgICAgICAgLy8gU2luY2Ugd2UganVzdCByZXNpemVkIHRoZSBiaXRtYXAsIHdlIG5lZWQgdG8g
dW5kbyB0aGUgc2NhbGUgc2V0IGluCisgICAgICAgIC8vIHRoZSBpbWFnZSB0cmFuc2Zvcm0uCisg
ICAgICAgIG1hdHJpeC5zZXRTY2FsZVgoU2tJbnRUb1NjYWxhcigxKSk7CisgICAgICAgIG1hdHJp
eC5zZXRTY2FsZVkoU2tJbnRUb1NjYWxhcigxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8g
Tm8gbmVlZCB0byBkbyBuaWNlIHJlc2FtcGxpbmcuCisgICAgICAgIHNoYWRlciA9IFNrU2hhZGVy
OjpDcmVhdGVCaXRtYXBTaGFkZXIoCisgICAgICAgICAgICBzcmNfc3Vic2V0LCBTa1NoYWRlcjo6
a1JlcGVhdF9UaWxlTW9kZSwgU2tTaGFkZXI6OmtSZXBlYXRfVGlsZU1vZGUpOworICAgIH0KKwor
ICAgIC8vIFdlIGFsc28gbmVlZCB0byB0cmFuc2xhdGUgaXQgc3VjaCB0aGF0IHRoZSBvcmlnaW4g
b2YgdGhlIHBhdHRlcm4gaXMgdGhlCisgICAgLy8gb3JpZ2luIG9mIHRoZSBkZXN0aW5hdGlvbiBy
ZWN0LCB3aGljaCBpcyB3aGF0IFdlYktpdCBleHBlY3RzLiBTa2lhIHVzZXMKKyAgICAvLyB0aGUg
Y29vcmRpbmF0ZSBzeXN0ZW0gb3JpZ2luIGFzIHRoZSBiYXNlIGZvciB0aGUgcGF0dGVyLiBJZiBX
ZWJLaXQgd2FudHMKKyAgICAvLyBhIHNoaWZ0ZWQgaW1hZ2UsIGl0IHdpbGwgc2hpZnQgaXQgZnJv
bSB0aGVyZSB1c2luZyB0aGUgcGF0dGVyblRyYW5zZm9ybS4KKyAgICBmbG9hdCBhZGp1c3RlZFgg
PSBwaGFzZS54KCkgKyBmbG9hdFNyY1JlY3QueCgpICoKKyAgICAgICAgICAgICAgICAgICAgICBu
YXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHBhdHRlcm5UcmFuc2Zvcm0uYSgpKTsKKyAgICBmbG9hdCBh
ZGp1c3RlZFkgPSBwaGFzZS55KCkgKyBmbG9hdFNyY1JlY3QueSgpICoKKyAgICAgICAgICAgICAg
ICAgICAgICBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHBhdHRlcm5UcmFuc2Zvcm0uZCgpKTsKKyAg
ICBtYXRyaXgucG9zdFRyYW5zbGF0ZShTa0Zsb2F0VG9TY2FsYXIoYWRqdXN0ZWRYKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoYWRqdXN0ZWRZKSk7CisgICAgc2hh
ZGVyLT5zZXRMb2NhbE1hdHJpeChtYXRyaXgpOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBw
YWludC5zZXRTaGFkZXIoc2hhZGVyKS0+dW5yZWYoKTsKKyAgICBwYWludC5zZXRQb3J0ZXJEdWZm
WGZlcm1vZGUoV2ViQ29yZUNvbXBvc2l0ZVRvU2tpYUNvbXBvc2l0ZShjb21wb3NpdGVPcCkpOwor
ICAgIHBhaW50LnNldEZpbHRlckJpdG1hcChyZXNhbXBsaW5nID09IFJFU0FNUExFX0xJTkVBUik7
CisKKyAgICBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+cGFpbnRTa1BhaW50KGRlc3RSZWN0
LCBwYWludCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQorLy8gQml0bWFwSW1hZ2UgQ2xhc3MKKy8vID09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIEJpdG1hcEltYWdlOjppbml0UGxh
dGZvcm1EYXRhKCkKK3sKKyAgICAvLyBUaGlzIGlzIG5vdCB1c2VkLiBPbiBNYWMsIHRoZSAicGxh
dGZvcm0iIGRhdGEgaXMgYSBjYWNoZSBvZiBzb21lIE9TCisgICAgLy8gc3BlY2lmaWMgdmVyc2lv
bnMgb2YgdGhlIGltYWdlIHRoYXQgYXJlIGNyZWF0ZWQgaXMgc29tZSBjYXNlcy4gVGhlc2UKKyAg
ICAvLyBhcmVuJ3Qgbm9ybWFsbHkgdXNlZCwgaXQgaXMgZXF1aXZhbGVudCB0byBnZXRIQklUTUFQ
IG9uIFdpbmRvd3MsIGFuZAorICAgIC8vIHRoZSBwbGF0Zm9ybSBkYXRhIGlzIHRoZSBjYWNoZS4K
K30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCit7CisgICAg
Ly8gU2VlIGluaXRQbGF0Zm9ybURhdGEgYWJvdmUuCit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmNo
ZWNrRm9yU29saWRDb2xvcigpCit7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhp
Y3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29t
cG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3NvdXJjZS5pbml0aWFsaXplZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBTcGluIHRoZSBhbmltYXRpb24gdG8gdGhlIGNvcnJlY3QgZnJhbWUg
YmVmb3JlIHdlIHRyeSB0byBkcmF3IGl0LCBzbyB3ZQorICAgIC8vIGRvbid0IGRyYXcgYW4gb2xk
IGZyYW1lIGFuZCB0aGVuIGltbWVkaWF0ZWx5IG5lZWQgdG8gZHJhdyBhIG5ld2VyIG9uZSwKKyAg
ICAvLyBjYXVzaW5nIGZsaWNrZXIgYW5kIHdhc3RpbmcgQ1BVLgorICAgIHN0YXJ0QW5pbWF0aW9u
KCk7CisKKyAgICBjb25zdCBOYXRpdmVJbWFnZVNraWEqIGJtID0gbmF0aXZlSW1hZ2VGb3JDdXJy
ZW50RnJhbWUoKTsKKyAgICBpZiAoIWJtKQorICAgICAgICByZXR1cm47ICAvLyBJdCdzIHRvbyBl
YXJseSBhbmQgd2UgZG9uJ3QgaGF2ZSBhbiBpbWFnZSB5ZXQuCisKKyAgICBGbG9hdFJlY3Qgbm9y
bURzdFJlY3QgPSBub3JtYWxpemVSZWN0KGRzdFJlY3QpOworICAgIEZsb2F0UmVjdCBub3JtU3Jj
UmVjdCA9IG5vcm1hbGl6ZVJlY3Qoc3JjUmVjdCk7CisKKyAgICBpZiAobm9ybVNyY1JlY3QuaXNF
bXB0eSgpIHx8IG5vcm1Ec3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOyAgLy8gTm90
aGluZyB0byBkcmF3LgorCisgICAgcGFpbnRTa0JpdG1hcChjdHh0LT5wbGF0Zm9ybUNvbnRleHQo
KSwKKyAgICAgICAgICAgICAgICAgICpibSwKKyAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ0lu
dFJlY3Qobm9ybVNyY1JlY3QpLAorICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nSW50UmVjdChu
b3JtRHN0UmVjdCksCisgICAgICAgICAgICAgICAgICBXZWJDb3JlQ29tcG9zaXRlVG9Ta2lhQ29t
cG9zaXRlKGNvbXBvc2l0ZU9wKSk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNr
aWE6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRl
T3ApCit7CisgICAgRmxvYXRSZWN0IG5vcm1Ec3RSZWN0ID0gbm9ybWFsaXplUmVjdChkc3RSZWN0
KTsKKyAgICBGbG9hdFJlY3Qgbm9ybVNyY1JlY3QgPSBub3JtYWxpemVSZWN0KHNyY1JlY3QpOwor
CisgICAgaWYgKG5vcm1TcmNSZWN0LmlzRW1wdHkoKSB8fCBub3JtRHN0UmVjdC5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gZHJhdy4KKworICAgIHBhaW50U2tCaXRt
YXAoY3R4dC0+cGxhdGZvcm1Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICBtX25hdGl2ZUlt
YWdlLAorICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nSW50UmVjdChub3JtU3JjUmVjdCksCisg
ICAgICAgICAgICAgICAgICBlbmNsb3NpbmdJbnRSZWN0KG5vcm1Ec3RSZWN0KSwKKyAgICAgICAg
ICAgICAgICAgIFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3NpdGUoY29tcG9zaXRlT3ApKTsK
K30KKworUGFzc1JlZlB0cjxCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYT4gQml0bWFwSW1hZ2VT
aW5nbGVGcmFtZVNraWE6OmNyZWF0ZSgKKyAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwKQorewor
ICAgIFJlZlB0cjxCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYT4gaW1hZ2UoYWRvcHRSZWYobmV3
IEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhKCkpKTsKKyAgICBpZiAoIWJpdG1hcC5jb3B5VG8o
JmltYWdlLT5tX25hdGl2ZUltYWdlLCBiaXRtYXAuY29uZmlnKCkpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU291
cmNlU2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VT
a2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk3NjNkCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU291cmNl
U2tpYS5jcHAKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkltYWdlU291cmNlU2tpYS5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorCisjaW5j
bHVkZSAiR0lGSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiSlBFR0ltYWdlRGVjb2Rlci5oIgor
I2luY2x1ZGUgIlBOR0ltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIkJNUEltYWdlRGVjb2Rlci5o
IgorI2luY2x1ZGUgIlhCTUltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIklDT0ltYWdlRGVjb2Rl
ci5oIgorCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJ
bWFnZURlY29kZXIqIGNyZWF0ZURlY29kZXIoY29uc3QgVmVjdG9yPGNoYXI+JiBkYXRhLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFNpemUmIHByZWZlcnJlZEljb25TaXpl
KQoreworICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgNCBieXRlcyB0byBmaWd1cmUgb3V0IHdoYXQg
a2luZCBvZiBpbWFnZSB3ZSdyZSBkZWFsaW5nIHdpdGguCisgICAgaW50IGxlbmd0aCA9IGRhdGEu
c2l6ZSgpOworICAgIGlmIChsZW5ndGggPCA0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIqIHVDb250ZW50cyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilkYXRh
LmRhdGEoKTsKKyAgICBjb25zdCBjaGFyKiBjb250ZW50cyA9IGRhdGEuZGF0YSgpOworCisgICAg
Ly8gR0lGcyBiZWdpbiB3aXRoIEdJRjgoNyBvciA5KS4KKyAgICBpZiAoc3RybmNtcChjb250ZW50
cywgIkdJRjgiLCA0KSA9PSAwKQorICAgICAgICByZXR1cm4gbmV3IEdJRkltYWdlRGVjb2Rlcigp
OworCisgICAgLy8gVGVzdCBmb3IgUE5HLgorICAgIGlmICh1Q29udGVudHNbMF09PTB4ODkgJiYK
KyAgICAgICAgdUNvbnRlbnRzWzFdPT0weDUwICYmCisgICAgICAgIHVDb250ZW50c1syXT09MHg0
RSAmJgorICAgICAgICB1Q29udGVudHNbM109PTB4NDcpCisgICAgICAgIHJldHVybiBuZXcgUE5H
SW1hZ2VEZWNvZGVyKCk7CisKKyAgICAvLyBKUEVHCisgICAgaWYgKHVDb250ZW50c1swXT09MHhG
RiAmJgorICAgICAgICB1Q29udGVudHNbMV09PTB4RDggJiYKKyAgICAgICAgdUNvbnRlbnRzWzJd
PT0weEZGKQorICAgICAgICByZXR1cm4gbmV3IEpQRUdJbWFnZURlY29kZXIoKTsKKworICAgIC8v
IEJNUAorICAgIGlmIChzdHJuY21wKGNvbnRlbnRzLCAiQk0iLCAyKSA9PSAwKQorICAgICAgICBy
ZXR1cm4gbmV3IEJNUEltYWdlRGVjb2RlcigpOworCisgICAgLy8gSUNPcyBhbHdheXMgYmVnaW4g
d2l0aCBhIDItYnl0ZSAwIGZvbGxvd2VkIGJ5IGEgMi1ieXRlIDEuCisgICAgLy8gQ1VScyBiZWdp
biB3aXRoIDItYnl0ZSAwIGZvbGxvd2VkIGJ5IDItYnl0ZSAyLgorICAgIGlmICghbWVtY21wKGNv
bnRlbnRzLCAiXDAwMFwwMDBcMDAxXDAwMCIsIDQpIHx8CisgICAgICAgICFtZW1jbXAoY29udGVu
dHMsICJcMDAwXDAwMFwwMDJcMDAwIiwgNCkpCisgICAgICAgIHJldHVybiBuZXcgSUNPSW1hZ2VE
ZWNvZGVyKHByZWZlcnJlZEljb25TaXplKTsKKyAgIAorICAgIC8vIFhCTXMgcmVxdWlyZSA4IGJ5
dGVzIG9mIGluZm8uCisgICAgaWYgKGxlbmd0aCA+PSA4ICYmIHN0cm5jbXAoY29udGVudHMsICIj
ZGVmaW5lICIsIDgpID09IDApCisgICAgICAgIHJldHVybiBuZXcgWEJNSW1hZ2VEZWNvZGVyKCk7
CisKKyAgICAvLyBHaXZlIHVwLiBXZSBkb24ndCBrbm93IHdoYXQgdGhlIGhlY2sgdGhpcyBpcy4K
KyAgICByZXR1cm4gMDsKK30KKworSW1hZ2VTb3VyY2U6OkltYWdlU291cmNlKCkKKyAgOiBtX2Rl
Y29kZXIoMCkKK3t9CisKK0ltYWdlU291cmNlOjp+SW1hZ2VTb3VyY2UoKQoreworICAgIGNsZWFy
KHRydWUpOworfQorCit2b2lkIEltYWdlU291cmNlOjpjbGVhcihib29sIGRlc3Ryb3lBbGwsIHNp
emVfdCBjbGVhckJlZm9yZUZyYW1lKQoreworICAgIGlmIChkZXN0cm95QWxsKSB7CisgICAgICAg
IGRlbGV0ZSBtX2RlY29kZXI7CisgICAgICAgIG1fZGVjb2RlciA9IDA7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAobV9kZWNvZGVyKQorICAgICAgICBtX2RlY29kZXItPmNsZWFy
RnJhbWVCdWZmZXJDYWNoZShjbGVhckJlZm9yZUZyYW1lKTsKK30KKworYm9vbCBJbWFnZVNvdXJj
ZTo6aW5pdGlhbGl6ZWQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RlY29kZXI7Cit9CisKK3Zv
aWQgSW1hZ2VTb3VyY2U6OnNldERhdGEoU2hhcmVkQnVmZmVyKiBkYXRhLCBib29sIGFsbERhdGFS
ZWNlaXZlZCkKK3sKKyAgICAvLyBNYWtlIHRoZSBkZWNvZGVyIGJ5IHNuaWZmaW5nIHRoZSBieXRl
cy4KKyAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGV4YW1pbmUgdGhlIGRhdGEgYW5kIGluc3RhbnRp
YXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBkZWNvZGVyIHBsdWdpbi4KKyAgICAv
LyBJZiBpbnN1ZmZpY2llbnQgYnl0ZXMgYXJlIGF2YWlsYWJsZSB0byBkZXRlcm1pbmUgdGhlIGlt
YWdlIHR5cGUsIG5vIGRlY29kZXIgcGx1Z2luIHdpbGwgYmUKKyAgICAvLyBtYWRlLgorICAgIGlm
ICghbV9kZWNvZGVyKQorICAgICAgICBtX2RlY29kZXIgPSBjcmVhdGVEZWNvZGVyKGRhdGEtPmJ1
ZmZlcigpLCBJbnRTaXplKCkpOworCisgICAgLy8gQ3JlYXRlRGVjb2RlciB3aWxsIHJldHVybiBO
VUxMIGlmIHRoZSBkZWNvZGVyIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBQbHVzLAorICAgIC8vIHdl
IHNob3VsZCBub3Qgc2VuZCBtb3JlIGRhdGEgdG8gYSBkZWNvZGVyIHdoaWNoIGhhcyBhbHJlYWR5
IGRlY2lkZWQgaXQKKyAgICAvLyBoYXMgZmFpbGVkLgorICAgIGlmICghbV9kZWNvZGVyIHx8IG1f
ZGVjb2Rlci0+ZmFpbGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBtX2RlY29kZXItPnNldERh
dGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKK30KKworYm9vbCBJbWFnZVNvdXJjZTo6aXNTaXpl
QXZhaWxhYmxlKCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+aXNTaXplQXZhaWxhYmxlKCk7Cit9CisKK0ludFNp
emUgSW1hZ2VTb3VyY2U6OnNpemUoKSBjb25zdAoreworICAgIGlmICghbV9kZWNvZGVyKQorICAg
ICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgcmV0dXJuIG1fZGVjb2Rlci0+c2l6ZSgpOwor
fQorCitJbnRTaXplIEltYWdlU291cmNlOjpmcmFtZVNpemVBdEluZGV4KHNpemVfdCkgY29uc3QK
K3sKKyAgICAvLyBUT0RPKGJyZXR0dykgZG8gd2UgbmVlZCBhbnl0aGluZyBoZXJlPworICAgIHJl
dHVybiBzaXplKCk7Cit9CisKK2ludCBJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNvdW50KCkKK3sK
KyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIGNBbmltYXRpb25Ob25lOworCisg
ICAgcmV0dXJuIG1fZGVjb2Rlci0+cmVwZXRpdGlvbkNvdW50KCk7Cit9CisKK3NpemVfdCBJbWFn
ZVNvdXJjZTo6ZnJhbWVDb3VudCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAg
ICAgIHJldHVybiAwOworICAgIHJldHVybiBtX2RlY29kZXItPmZhaWxlZCgpID8gMCA6IG1fZGVj
b2Rlci0+ZnJhbWVDb3VudCgpOworfQorCitOYXRpdmVJbWFnZVB0ciBJbWFnZVNvdXJjZTo6Y3Jl
YXRlRnJhbWVBdEluZGV4KHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gaGF2ZSBO
VUxMIGJ5dGVzIGV2ZW4gd2hlbiBpdCBpcyBtYXJrZWQgYXMKKyAgICAvLyBub24tZW1wdHkuIEl0
IHNlZW1zICJGcmFtZUVtcHR5IiBpcyBvbmx5IHNldCBiZWZvcmUgdGhlIGZyYW1lIGhhcyBiZWVu
CisgICAgLy8gaW5pdGlhbGl6ZWQuIElmIGl0IGlzIGRlY29kZWQgYW5kIGl0IGhhcHBlbnMgdG8g
YmUgZW1wdHksIGl0IHdpbGwgYmUKKyAgICAvLyBtYXJrZWQgYXMgIkZyYW1lQ29tcGxldGUiIGJ1
dCB3aWxsIHN0aWxsIGhhdmUgTlVMTCBieXRlcy4KKyAgICBSR0JBMzJCdWZmZXIqIGJ1ZmZlciA9
IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICBpZiAoIWJ1ZmZlciB8
fCBidWZmZXItPnN0YXR1cygpID09IFJHQkEzMkJ1ZmZlcjo6RnJhbWVFbXB0eSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAvLyBDb3B5IHRoZSBiaXRtYXAuICBUaGUgcGl4ZWwgZGF0YSBpcyBy
ZWZjb3VudGVkIGludGVybmFsbHkgYnkgU2tCaXRtYXAsIHNvCisgICAgLy8gdGhpcyBkb2Vzbid0
IGNvc3QgbXVjaC4gIFRoaXMgcG9pbnRlciB3aWxsIGJlIG93bmVkIGJ5IHRoZSBCaXRtYXBJbWFn
ZQorICAgIC8vIGFuZCBmcmVlZCBpbiBGcmFtZURhdGE6OmNsZWFyKCkuCisgICAgcmV0dXJuIG5l
dyBOYXRpdmVJbWFnZVNraWEoYnVmZmVyLT5iaXRtYXAoKSk7Cit9CisKK2Jvb2wgSW1hZ2VTb3Vy
Y2U6OmZyYW1lSXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQoreworICAgIGlmICghbV9k
ZWNvZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBSR0JBMzJCdWZmZXIqIGJ1ZmZl
ciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGluZGV4KTsKKyAgICByZXR1cm4gYnVm
ZmVyICYmIGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFtZUNvbXBsZXRlOwor
fQorCitmbG9hdCBJbWFnZVNvdXJjZTo6ZnJhbWVEdXJhdGlvbkF0SW5kZXgoc2l6ZV90IGluZGV4
KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJHQkEz
MkJ1ZmZlciogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5kZXgoaW5kZXgpOwor
ICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMyQnVmZmVyOjpGcmFt
ZUVtcHR5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIE1hbnkgYW5ub3lpbmcgYWRzIHNw
ZWNpZnkgYSAwIGR1cmF0aW9uIHRvIG1ha2UgYW4gaW1hZ2UgZmxhc2ggYXMgcXVpY2tseQorICAg
IC8vIGFzIHBvc3NpYmxlLiAgV2UgZm9sbG93IFdpbklFJ3MgYmVoYXZpb3IgYW5kIHVzZSBhIGR1
cmF0aW9uIG9mIDEwMCBtcworICAgIC8vIGZvciBhbnkgZnJhbWVzIHRoYXQgc3BlY2lmeSBhIGR1
cmF0aW9uIG9mIDw9IDUwIG1zLiAgU2VlCisgICAgLy8gPGh0dHA6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE0NDEzPiBvciBSYWRhciA0MDUxMzg5IGZvcgorICAgIC8vIG1vcmUu
CisgICAgY29uc3QgZmxvYXQgZHVyYXRpb24gPSBidWZmZXItPmR1cmF0aW9uKCkgLyAxMDAwLjBm
OworICAgIHJldHVybiAoZHVyYXRpb24gPCAwLjA1MWYpID8gMC4xMDBmIDogZHVyYXRpb247CisK
K30KKworYm9vbCBJbWFnZVNvdXJjZTo6ZnJhbWVIYXNBbHBoYUF0SW5kZXgoc2l6ZV90IGluZGV4
KQoreworICAgIGlmICghbV9kZWNvZGVyIHx8ICFtX2RlY29kZXItPnN1cHBvcnRzQWxwaGEoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUkdCQTMyQnVmZmVyKiBidWZmZXIgPSBtX2Rl
Y29kZXItPmZyYW1lQnVmZmVyQXRJbmRleChpbmRleCk7CisgICAgaWYgKCFidWZmZXIgfHwgYnVm
ZmVyLT5zdGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lRW1wdHkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiBidWZmZXItPmhhc0FscGhhKCk7Cit9CisKK3ZvaWQgSW1h
Z2VTb3VyY2VTa2lhOjpzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJvb2wgYWxsRGF0YVJlY2VpdmVkLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgSW50U2l6ZSYgcHJlZmVycmVkSWNvblNpemUpCit7CisgICAgaWYg
KCFtX2RlY29kZXIpCisgICAgICAgIG1fZGVjb2RlciA9IGNyZWF0ZURlY29kZXIoZGF0YS0+YnVm
ZmVyKCksIHByZWZlcnJlZEljb25TaXplKTsKKworICAgIEltYWdlU291cmNlOjpzZXREYXRhKGRh
dGEsIGFsbERhdGFSZWNlaXZlZCk7Cit9CisKK1N0cmluZyBJbWFnZVNvdXJjZTo6ZmlsZW5hbWVF
eHRlbnNpb24oKSBjb25zdAoreworICAgIC8vIFRPRE8ocGthc3RpbmcpOiBJbXBsZW1lbnQgbWUh
CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uMjhlOTFmMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29w
eXJpZ2h0IChjKSAyMDA2LTIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorCisvLyBXZSBuZWVkIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBtZW1i
ZXIgb2YgSW1hZ2VTb3VyY2UuICBIYWNrIGl0IGxvY2FsbHkKKyNpbmNsdWRlIDx3dGYvTm9uY29w
eWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjZGVmaW5lIHByaXZhdGUgcHJvdGVj
dGVkCisjaW5jbHVkZSAiSW1hZ2VTb3VyY2UuaCIKKyN1bmRlZiBwcml2YXRlCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgSW1hZ2VTb3VyY2VTa2lhIDogcHVibGljIEltYWdlU291cmNl
IHsKK3B1YmxpYzoKKyAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbC1wdXJwb3NlIHJvdXRpbmUgZm9y
IHRoZSBmYXZpY29uIGRlY29kZXIsIHdoaWNoIGlzIHVzZWQKKyAgICAvLyB0byBzcGVjaWZ5IGEg
cGFydGljdWxhciBpY29uIHNpemUgZm9yIHRoZSBJQ09JbWFnZURlY29kZXIgdG8gcHJlZmVyCisg
ICAgLy8gZGVjb2RpbmcuICBOb3RlIHRoYXQgbm90IGFsbCBmYXZpY29ucyBhcmUgSUNPcywgc28g
dGhpcyB3b24ndAorICAgIC8vIG5lY2Vzc2FyaWx5IGRvIGFueXRoaW5nIGRpZmZlcmVudGx5IHRo
YW4gSW1hZ2VTb3VyY2U6OnNldERhdGEoKS4KKyAgICAvLworICAgIC8vIFBhc3NpbmcgYW4gZW1w
dHkgSW50U2l6ZSBmb3IgfHByZWZlcnJlZEljb25TaXplfCBoZXJlIGlzIGV4YWN0bHkKKyAgICAv
LyBlcXVpdmFsZW50IHRvIGp1c3QgY2FsbGluZyBJbWFnZVNvdXJjZTo6c2V0RGF0YSgpLiAgU2Vl
IGFsc28gY29tbWVudHMgaW4KKyAgICAvLyBJQ09JbWFnZURlY29kZXIuY3BwLgorICAgIHZvaWQg
c2V0RGF0YShTaGFyZWRCdWZmZXIqIGRhdGEsCisgICAgICAgICAgICAgICAgIGJvb2wgYWxsRGF0
YVJlY2VpdmVkLAorICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBwcmVmZXJyZWRJY29u
U2l6ZSk7Cit9OworCit9CisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9JbnRQb2ludFNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0lu
dFBvaW50U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllMmQ4
YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRQ
b2ludFNraWEuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgs
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkludFBvaW50LmgiCisjaW5jbHVkZSAiU2tQb2ludC5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK0ludFBvaW50OjpJbnRQb2ludChjb25zdCBTa0lQb2ludCYgcCkKKyAgICA6IG1f
eChwLmZYKQorICAgICwgbV95KHAuZlkpCit7Cit9CisKK0ludFBvaW50OjpvcGVyYXRvciBTa0lQ
b2ludCgpIGNvbnN0Cit7CisgICAgU2tJUG9pbnQgcCA9IHsgbV94LCBtX3kgfTsKKyAgICByZXR1
cm4gcDsKK30KKworSW50UG9pbnQ6Om9wZXJhdG9yIFNrUG9pbnQoKSBjb25zdAoreworICAgIFNr
UG9pbnQgcCA9IHsgU2tJbnRUb1NjYWxhcihtX3gpLCBTa0ludFRvU2NhbGFyKG1feSkgfTsKKyAg
ICByZXR1cm4gcDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ludFJlY3RTa2lhLmNwcCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uYjkzNjYzMAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoNCisg
KiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQor
ICogDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQ0KKyAqIG1ldDoNCisgKiANCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcg0KKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUNCisgKiBkaXN0cmlidXRpb24uDQorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisg
KiANCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTDQorICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVA0KKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QNCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwNCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkNCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4NCisgKi8NCisNCisjaW5jbHVkZSAiY29uZmlnLmgiDQorI2luY2x1ZGUg
IkludFJlY3QuaCINCisNCisjaW5jbHVkZSAiU2tSZWN0LmgiDQorDQorbmFtZXNwYWNlIFdlYkNv
cmUgew0KKw0KK0ludFJlY3Q6Om9wZXJhdG9yIFNrSVJlY3QoKSBjb25zdA0KK3sNCisgICAgU2tJ
UmVjdCByZWN0ID0geyB4KCksIHkoKSwgcmlnaHQoKSwgYm90dG9tKCkgfTsNCisgICAgcmV0dXJu
IHJlY3Q7DQorfQ0KKw0KK0ludFJlY3Q6Om9wZXJhdG9yIFNrUmVjdCgpIGNvbnN0DQorew0KKyAg
ICBTa1JlY3QgcmVjdDsNCisgICAgcmVjdC5zZXQoU2tJbnRUb1NjYWxhcih4KCkpLCBTa0ludFRv
U2NhbGFyKHkoKSksDQorICAgICAgICAgICAgIFNrSW50VG9TY2FsYXIocmlnaHQoKSksIFNrSW50
VG9TY2FsYXIoYm90dG9tKCkpKTsNCisgICAgcmV0dXJuIHJlY3Q7DQorfQ0KKw0KK0ludFJlY3Q6
OkludFJlY3QoY29uc3QgU2tJUmVjdCYgcikNCisgICAgOiBtX2xvY2F0aW9uKHIuZkxlZnQsIHIu
ZlRvcCkNCisgICAgLCBtX3NpemUoci53aWR0aCgpLCByLmhlaWdodCgpKQ0KK3sNCit9DQorDQor
fQ0KKw0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJ
bWFnZVNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL05hdGl2ZUltYWdl
U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiOTQ2YwotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFn
ZVNraWEuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAq
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lu
Y2x1ZGUgInNraWEvZXh0L2ltYWdlX29wZXJhdGlvbnMuaCIKKworI2luY2x1ZGUgIk5hdGl2ZUlt
YWdlU2tpYS5oIgorI2luY2x1ZGUgIlNraWFVdGlscy5oIgorCitOYXRpdmVJbWFnZVNraWE6Ok5h
dGl2ZUltYWdlU2tpYSgpCisgICAgOiBTa0JpdG1hcCgpLAorICAgICAgbV9pc0RhdGFDb21wbGV0
ZShmYWxzZSksCisgICAgICBtX3Jlc2l6ZWRJbWFnZSgpLAorICAgICAgbV9sYXN0UmVxdWVzdFNp
emUoMCwgMCksCisgICAgICBtX3Jlc2l6ZVJlcXVlc3RzKDApIHsKK30KKworaW50IE5hdGl2ZUlt
YWdlU2tpYTo6ZGVjb2RlZFNpemUoKSBjb25zdCB7CisgIHJldHVybiBnZXRTaXplKCkgKyBtX3Jl
c2l6ZWRJbWFnZS5nZXRTaXplKCk7Cit9CisKK2Jvb2wgTmF0aXZlSW1hZ2VTa2lhOjpoYXNSZXNp
emVkQml0bWFwKGludCB3LCBpbnQgaCkgY29uc3QgeworICAgIGlmIChtX2xhc3RSZXF1ZXN0U2l6
ZS53aWR0aCgpID09IHcgJiYgbV9sYXN0UmVxdWVzdFNpemUuaGVpZ2h0KCkgPT0gaCkgeworICAg
ICAgICBtX3Jlc2l6ZVJlcXVlc3RzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9sYXN0UmVx
dWVzdFNpemUgPSBXZWJDb3JlOjpJbnRTaXplKHcsIGgpOworICAgICAgICBtX3Jlc2l6ZVJlcXVl
c3RzID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbV9yZXNpemVkSW1hZ2Uud2lkdGgoKSA9PSB3
ICYmIG1fcmVzaXplZEltYWdlLmhlaWdodCgpID09IGg7Cit9CisKKy8vIEZJWE1FKGJyZXR0dykg
ZG9uJ3QgY2FjaGUgd2hlbiBpbWFnZSBpcyBpbi1wcm9ncmVzcy4KKworU2tCaXRtYXAgTmF0aXZl
SW1hZ2VTa2lhOjpyZXNpemVkQml0bWFwKGludCB3LCBpbnQgaCkgY29uc3QgeworICAgIGlmICht
X3Jlc2l6ZWRJbWFnZS53aWR0aCgpICE9IHcgfHwgbV9yZXNpemVkSW1hZ2UuaGVpZ2h0KCkgIT0g
aCkgeworICAgICAgICBtX3Jlc2l6ZWRJbWFnZSA9IHNraWE6OkltYWdlT3BlcmF0aW9uczo6UmVz
aXplKCp0aGlzLAorICAgICAgICAgICAgc2tpYTo6SW1hZ2VPcGVyYXRpb25zOjpSRVNJWkVfTEFO
Q1pPUzMsIHcsIGgpOworICAgIH0KKyAgICByZXR1cm4gbV9yZXNpemVkSW1hZ2U7Cit9CisKKy8v
IHN0YXRpYworYm9vbCBOYXRpdmVJbWFnZVNraWE6OnNob3VsZENhY2hlUmVzYW1wbGluZyhpbnQg
ZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQgZGVzdF9zdWJzZXRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBkZXN0X3N1YnNldF9oZWlnaHQpIGNvbnN0IHsKKyAgICAvLyBX
ZSBjYW4gbm90IGNhY2hlIGluY29tcGxldGUgZnJhbWVzLiBUaGlzIG1pZ2h0IGJlIGEgZ29vZCBv
cHRpbWl6YXRpb24gaW4KKyAgICAvLyB0aGUgZnV0dXJlLCB3ZXJlIHdlIGtub3cgaG93IG11Y2gg
b2YgdGhlIGZyYW1lIGhhcyBiZWVuIGRlY29kZWQsIHNvIHdoZW4KKyAgICAvLyB3ZSBpbmNyZW1l
bnRhbGx5IGRyYXcgbW9yZSBvZiB0aGUgaW1hZ2UsIHdlIG9ubHkgaGF2ZSB0byByZXNhbXBsZSB0
aGUKKyAgICAvLyBwYXJ0cyB0aGF0IGFyZSBjaGFuZ2VkLgorICAgIGlmICghbV9pc0RhdGFDb21w
bGV0ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9u
IGJpdG1hcCBpcyBzbWFsbCwgd2UnbGwgYWx3YXlzIGFsbG93IGNhY2hpbmcsIHNpbmNlCisgICAg
Ly8gdGhlcmUgaXMgbm90IHZlcnkgbXVjaCBwZW5hbHR5IGZvciBjb21wdXRpbmcgaXQgYW5kIGl0
IG1heSBjb21lIGluIGhhbmR5LgorICAgIHN0YXRpYyBjb25zdCBpbnQga1NtYWxsQml0bWFwU2l6
ZSA9IDQwOTY7CisgICAgaWYgKGRlc3Rfd2lkdGggKiBkZXN0X2hlaWdodCA8PSBrU21hbGxCaXRt
YXBTaXplKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIElmICJ0b28gbWFueSIgcmVx
dWVzdHMgaGF2ZSBiZWVuIG1hZGUgZm9yIHRoaXMgYml0bWFwLCB3ZSBhc3N1bWUgdGhhdAorICAg
IC8vIG1hbnkgbW9yZSB3aWxsIGJlIG1hZGUgYXMgd2VsbCwgYW5kIHdlJ2xsIGdvIGFoZWFkIGFu
ZCBjYWNoZSBpdC4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYW55UmVxdWVzdFRocmVzaG9sZCA9
IDQ7CisgICAgaWYgKG1fbGFzdFJlcXVlc3RTaXplLndpZHRoKCkgPT0gZGVzdF93aWR0aCAmJgor
ICAgICAgICBtX2xhc3RSZXF1ZXN0U2l6ZS5oZWlnaHQoKSA9PSBkZXN0X2hlaWdodCkgeworICAg
ICAgICBpZiAobV9yZXNpemVSZXF1ZXN0cyA+PSBrTWFueVJlcXVlc3RUaHJlc2hvbGQpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGVuIGEgZGlm
ZmVyZW50IHNpemUgaXMgYmVpbmcgcmVxdWVzdGVkLCBjb3VudCB0aGlzIGFzIGEgcXVlcnkKKyAg
ICAgICAgLy8gKGhhc1Jlc2l6ZWRCaXRtYXApIGFuZCByZXNldCB0aGUgY291bnRlci4KKyAgICAg
ICAgbV9sYXN0UmVxdWVzdFNpemUgPSBXZWJDb3JlOjpJbnRTaXplKGRlc3Rfd2lkdGgsIGRlc3Rf
aGVpZ2h0KTsKKyAgICAgICAgbV9yZXNpemVSZXF1ZXN0cyA9IDA7CisgICAgfQorCisgICAgLy8g
T3RoZXJ3aXNlLCB1c2UgdGhlIGhldXJpc3RpYyB0aGF0IGlmIG1vcmUgdGhhbiAxLzQgb2YgdGhl
IGltYWdlIGlzCisgICAgLy8gcmVxdWVzdGVkLCBpdCdzIHdvcnRoIGNhY2hpbmcuCisgICAgaW50
IGRlc3Rfc2l6ZSA9IGRlc3Rfd2lkdGggKiBkZXN0X2hlaWdodDsKKyAgICBpbnQgZGVzdF9zdWJz
ZXRfc2l6ZSA9IGRlc3Rfc3Vic2V0X3dpZHRoICogZGVzdF9zdWJzZXRfaGVpZ2h0OworICAgIHJl
dHVybiBkZXN0X3NpemUgLyA0IDwgZGVzdF9zdWJzZXRfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuaCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi42Y2MyZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9za2lhL05hdGl2ZUltYWdlU2tpYS5oCkBAIC0wLDAgKzEsMTA0IEBA
CisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBOYXRpdmVJbWFnZVNraWFfaAorI2RlZmluZSBOYXRpdmVJbWFnZVNr
aWFfaAorCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICJJbnRTaXplLmgiCisKKy8v
IFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgdGhlICJuYXRpdmUgaW1hZ2UiIGluIG91ciBwb3J0LiBX
aGVuIFdlYktpdCB1c2VzCisvLyAiTmF0aXZlSW1hZ2VQdHIiLCBpdCBpcyBhIHBvaW50ZXIgdG8g
dGhpcyB0eXBlLiBJdCBpcyBhbiBTa0JpdG1hcCwgYnV0IGFsc28KKy8vIHN0b3JlcyBhIGNhY2hl
ZCByZXNpemVkIGltYWdlLgorY2xhc3MgTmF0aXZlSW1hZ2VTa2lhIDogcHVibGljIFNrQml0bWFw
IHsKK3B1YmxpYzoKKyAgICBOYXRpdmVJbWFnZVNraWEoKTsKKworICAgIC8vIFJldHVybnMgdGhl
IG51bWJlciBvZiBieXRlcyBvZiBpbWFnZSBkYXRhLiBUaGlzIGluY2x1ZGVzIHRoZSBjYWNoZWQK
KyAgICAvLyByZXNpemVkIHZlcnNpb24gaWYgdGhlcmUgaXMgb25lLgorICAgIGludCBkZWNvZGVk
U2l6ZSgpIGNvbnN0OworCisgICAgLy8gU2V0cyB0aGUgZGF0YSBjb21wbGV0ZSBmbGFnLiBUaGlz
IGlzIGNhbGxlZCBieSB0aGUgaW1hZ2UgZGVjb2RlciB3aGVuCisgICAgLy8gYWxsIGRhdGEgaXMg
Y29tcGxldGUsIGFuZCB1c2VkIGJ5IHVzIHRvIGtub3cgd2hldGhlciB3ZSBjYW4gY2FjaGUKKyAg
ICAvLyByZXNpemVkIGltYWdlcy4KKyAgICB2b2lkIHNldERhdGFDb21wbGV0ZSgpIHsgbV9pc0Rh
dGFDb21wbGV0ZSA9IHRydWU7IH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW50aXJl
IGltYWdlIGhhcyBiZWVuIGRlY29kZWQuCisgICAgYm9vbCBpc0RhdGFDb21wbGV0ZSgpIGNvbnN0
IHsgcmV0dXJuIG1faXNEYXRhQ29tcGxldGU7IH0KKworICAgIC8vIFdlIGNhbiBrZWVwIGEgcmVz
aXplZCB2ZXJzaW9uIG9mIHRoZSBiaXRtYXAgY2FjaGVkIG9uIHRoaXMgb2JqZWN0LgorICAgIC8v
IFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIGNhY2hlZCB2ZXJz
aW9uIG9mIHRoZQorICAgIC8vIGdpdmVuIGltYWdlIHN1YnNldCB3aXRoIHRoZSBnaXZlbiBkaW1l
bnNpb25zLgorICAgIGJvb2wgaGFzUmVzaXplZEJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQp
IGNvbnN0OworCisgICAgLy8gVGhpcyB3aWxsIHJldHVybiBhbiBleGlzdGluZyByZXNpemVkIGlt
YWdlLCBvciBnZW5lcmF0ZSBhIG5ldyBvbmUgb2YKKyAgICAvLyB0aGUgc3BlY2lmaWVkIHNpemUg
YW5kIHN0b3JlIGl0IGluIHRoZSBjYWNoZS4gU3Vic2V0dGVkIGltYWdlcyBjYW4gbm90CisgICAg
Ly8gYmUgY2FjaGVkIHVubGVzcyB0aGUgc3Vic2V0IGlzIHRoZSBlbnRpcmUgYml0bWFwLgorICAg
IFNrQml0bWFwIHJlc2l6ZWRCaXRtYXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdDsKKwor
ICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzaXplIG9wZXJhdGlvbiBzaG91bGQg
ZWl0aGVyIHJlc2l6ZSB0aGUgd2hvbGUKKyAgICAvLyBpbWFnZSBhbmQgY2FjaGUgaXQsIG9yIHJl
c2l6ZSBqdXN0IHRoZSBwYXJ0IGl0IG5lZWRzIGFuZCB0aHJvdyB0aGUgcmVzdWx0CisgICAgLy8g
YXdheS4KKyAgICAvLworICAgIC8vIE9uIHRoZSBvbmUgaGFuZCwgaWYgb25seSBhIHNtYWxsIHN1
YnNldCBpcyBkZXNpcmVkLCB0aGVuIHdlIHdpbGwgd2FzdGUgYQorICAgIC8vIGxvdCBvZiB0aW1l
IHJlc2FtcGxpbmcgdGhlIGVudGlyZSB0aGluZywgc28gd2Ugb25seSB3YW50IHRvIGRvIGV4YWN0
bHkKKyAgICAvLyB3aGF0J3MgcmVxdWlyZWQuIE9uIHRoZSBvdGhlciBoYW5kLCByZXNhbXBsaW5n
IHRoZSBlbnRpcmUgYml0bWFwIGlzCisgICAgLy8gYmV0dGVyIGlmIHdlJ3JlIGdvaW5nIHRvIGJl
IHVzaW5nIGl0IG1vcmUgdGhhbiBvbmNlIChsaWtlIGEgYml0bWFwCisgICAgLy8gc2Nyb2xsaW5n
IG9uIGFuZCBvZmYgdGhlIHNjcmVlbi4gU2luY2Ugd2Ugb25seSBjYWNoZSB3aGVuIGRvaW5nIHRo
ZQorICAgIC8vIGVudGlyZSB0aGluZywgaXQncyBiZXN0IHRvIGp1c3QgZG8gaXQgdXAgZnJvbnQu
CisgICAgYm9vbCBzaG91bGRDYWNoZVJlc2FtcGxpbmcoaW50IGRlc3Rfd2lkdGgsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBkZXN0X3N1YnNldF93aWR0aCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbnQgZGVzdF9zdWJzZXRfaGVpZ2h0KSBjb25zdDsKKworcHJpdmF0ZToK
KyAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBkYXRhIGlzIGNvbXBsZXRlLiBCZWZvcmUgdGhl
IGVudGlyZSBpbWFnZSBoYXMKKyAgICAvLyBsb2FkZWQsIHdlIGRvIG5vdCB3YW50IHRvIGNhY2hl
IGEgcmVzaXplLgorICAgIGJvb2wgbV9pc0RhdGFDb21wbGV0ZTsKKworICAgIC8vIFRoZSBjYWNo
ZWQgYml0bWFwLiBUaGlzIHdpbGwgYmUgZW1wdHkoKSBpZiB0aGVyZSBpcyBubyBjYWNoZWQgaW1h
Z2UuCisgICAgbXV0YWJsZSBTa0JpdG1hcCBtX3Jlc2l6ZWRJbWFnZTsKKworICAgIC8vIFJlZmVy
ZW5jZXMgaG93IG1hbnkgdGltZXMgdGhhdCB0aGUgaW1hZ2Ugc2l6ZSBoYXMgYmVlbiByZXF1ZXN0
ZWQgZm9yCisgICAgLy8gdGhlIGxhc3Qgc2l6ZS4KKyAgICAvLworICAgIC8vIEV2ZXJ5IHRpbWUg
d2UgZ2V0IGEgcmVxdWVzdCwgaWYgaXQgbWF0Y2hlcyB0aGUgbV9sYXN0UmVxdWVzdFNpemUsIHdl
J2xsCisgICAgLy8gaW5jcmVtZW50IHRoZSBjb3VudGVyLCBhbmQgaWYgbm90LCB3ZSdsbCByZXNl
dCB0aGUgY291bnRlciBhbmQgc2F2ZSB0aGUKKyAgICAvLyBzaXplLgorICAgIC8vCisgICAgLy8g
VGhpcyBhbGxvd3MgdXMgdG8gc2VlIGlmIG1hbnkgcmVxdWVzdHMgaGF2ZSBiZWVuIG1hZGUgZm9y
IHRoZSBzYW1lCisgICAgLy8gcmVzaXplZCBpbWFnZSwgd2Uga25vdyB0aGF0IHdlIHNob3VsZCBw
cm9iYWJseSBjYWNoZSBpdCwgZXZlbiBpZiBhbGwgb2YKKyAgICAvLyB0aG9zZSByZXF1ZXN0cyBp
bmRpdmlkdWFsbHkgYXJlIHNtYWxsIGFuZCB3b3VsZCBub3Qgb3RoZXJ3aXNlIGJlIGNhY2hlZC4K
KyAgICBtdXRhYmxlIFdlYkNvcmU6OkludFNpemUgbV9sYXN0UmVxdWVzdFNpemU7CisgICAgbXV0
YWJsZSBpbnQgbV9yZXNpemVSZXF1ZXN0czsKK307CisKKyNlbmRpZiAgLy8gTmF0aXZlSW1hZ2VT
a2lhX2gKKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhT
a2lhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QYXRoU2tpYS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiMjIyZgotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QYXRoU2tpYS5jcHAKQEAgLTAsMCAr
MSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNs
dWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlN0
cm9rZVN0eWxlQXBwbGllci5oIgorCisjaW5jbHVkZSAiU2tQYXRoLmgiCisjaW5jbHVkZSAiU2tS
ZWdpb24uaCIKKworI2luY2x1ZGUgIlNraWFVdGlscy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK1BhdGg6OlBhdGgoKQoreworICAgIG1fcGF0aCA9IG5ldyBTa1BhdGg7Cit9CisKK1BhdGg6
OlBhdGgoY29uc3QgUGF0aCYgb3RoZXIpCit7CisgICAgbV9wYXRoID0gbmV3IFNrUGF0aCgqb3Ro
ZXIubV9wYXRoKTsKK30KKworUGF0aDo6flBhdGgoKQoreworICAgIGRlbGV0ZSBtX3BhdGg7Cit9
CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICAqbV9w
YXRoID0gKm90aGVyLm1fcGF0aDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgUGF0aDo6
aXNFbXB0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+aXNFbXB0eSgpOworfQorCiti
b29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxl
KSBjb25zdAoreworICAgIHJldHVybiBTa1BhdGhDb250YWluc1BvaW50KAorICAgICAgbV9wYXRo
LAorICAgICAgcG9pbnQsIAorICAgICAgcnVsZSA9PSBSVUxFX05PTlpFUk8gPyBTa1BhdGg6OmtX
aW5kaW5nX0ZpbGxUeXBlIDogU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZSk7Cit9CisKK3ZvaWQg
UGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX3BhdGgtPm9m
ZnNldChXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNpemUud2lkdGgoKSksIFdlYkNvcmVGbG9hdFRv
U2tTY2FsYXIoc2l6ZS5oZWlnaHQoKSkpOworfQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdS
ZWN0KCkgY29uc3QKK3sKKyAgICBTa1JlY3QgIHI7CisgICAgCisgICAgbV9wYXRoLT5jb21wdXRl
Qm91bmRzKCZyLCBTa1BhdGg6OmtFeGFjdF9Cb3VuZHNUeXBlKTsKKyAgICByZXR1cm4gRmxvYXRS
ZWN0KCAgIFNrU2NhbGFyVG9GbG9hdChyLmZMZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IFNrU2NhbGFyVG9GbG9hdChyLmZUb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgU2tTY2Fs
YXJUb0Zsb2F0KHIud2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBTa1NjYWxhclRv
RmxvYXQoci5oZWlnaHQoKSkpOworfQorCit2b2lkIFBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkKK3sKKyAgICBtX3BhdGgtPm1vdmVUbyhXZWJDb3JlRmxvYXRUb1NrU2NhbGFy
KHBvaW50LngoKSksIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocG9pbnQueSgpKSk7Cit9CisKK3Zv
aWQgUGF0aDo6YWRkTGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5s
aW5lVG8oV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwLngoKSksIFdlYkNvcmVGbG9hdFRvU2tTY2Fs
YXIocC55KCkpKTsKK30KKwordm9pZCBQYXRoOjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBv
aW50JiBjcCwgY29uc3QgRmxvYXRQb2ludCYgZXApCit7CisgICAgbV9wYXRoLT5xdWFkVG8oV2Vi
Q29yZUZsb2F0VG9Ta1NjYWxhcihjcC54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGNwLnko
KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihl
cC54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGVwLnkoKSkpOworfQorCit2b2lkIFBhdGg6
OmFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQm
IHAyLCBjb25zdCBGbG9hdFBvaW50JiBlcCkKK3sKKyAgICBtX3BhdGgtPmN1YmljVG8oV2ViQ29y
ZUZsb2F0VG9Ta1NjYWxhcihwMS54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHAxLnkoKSks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocDIu
eCgpKSwgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwMi55KCkpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGVwLngoKSksIFdlYkNvcmVGbG9hdFRv
U2tTY2FsYXIoZXAueSgpKSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQXJjVG8oY29uc3QgRmxvYXRQ
b2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyLCBmbG9hdCByYWRpdXMpCit7CisgICAgbV9w
YXRoLT5hcmNUbyhXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHAxLngoKSksIFdlYkNvcmVGbG9hdFRv
U2tTY2FsYXIocDEueSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9h
dFRvU2tTY2FsYXIocDIueCgpKSwgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwMi55KCkpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihyYWRpdXMpKTsK
K30KKwordm9pZCBQYXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIG1fcGF0aC0+Y2xvc2UoKTsK
K30KKworc3RhdGljIGNvbnN0IGZsb2F0IGdQSSA9IDMuMTQxNTkyNmY7CisKK3ZvaWQgUGF0aDo6
YWRkQXJjKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhLCBmbG9hdCBlYSwK
KyAgICAgICAgICAgICAgICAgIGJvb2wgYW50aWNsb2Nrd2lzZSkgeworICAgIFNrU2NhbGFyICAg
IGN4ID0gV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwLngoKSk7CisgICAgU2tTY2FsYXIgICAgY3kg
PSBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHAueSgpKTsKKyAgICBTa1NjYWxhciAgICByYWRpdXMg
PSBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHIpOworCisgICAgU2tSZWN0ICBvdmFsOworICAgIG92
YWwuc2V0KGN4IC0gcmFkaXVzLCBjeSAtIHJhZGl1cywgY3ggKyByYWRpdXMsIGN5ICsgcmFkaXVz
KTsKKyAgICAKKyAgICBmbG9hdCBzd2VlcCA9IGVhIC0gc2E7CisgICAgLy8gY2hlY2sgZm9yIGEg
Y2lyY2xlCisgICAgaWYgKHN3ZWVwID49IDIqZ1BJIHx8IHN3ZWVwIDw9IC0yKmdQSSkgeworICAg
ICAgICBtX3BhdGgtPmFkZE92YWwob3ZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tTY2Fs
YXIgc3RhcnREZWdyZWVzID0gV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzYSAqIDE4MCAvIGdQSSk7
CisgICAgICAgIFNrU2NhbGFyIHN3ZWVwRGVncmVlcyA9IFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIo
c3dlZXAgKiAxODAgLyBnUEkpOworCisgICAgICAgIC8vIENvdW50ZXJjbG9ja3dpc2UgYXJjcyBz
aG91bGQgYmUgZHJhd24gd2l0aCBuZWdhdGl2ZSBzd2VlcHMsIHdoaWxlCisgICAgICAgIC8vIGNs
b2Nrd2lzZSBhcmNzIHNob3VsZCBiZSBkcmF3biB3aXRoIHBvc2l0aXZlIHN3ZWVwcy4gQ2hlY2sg
dG8gc2VlCisgICAgICAgIC8vIGlmIHRoZSBzaXR1YXRpb24gaXMgcmV2ZXJzZWQgYW5kIGNvcnJl
Y3QgaXQgYnkgYWRkaW5nIG9yIHN1YnRyYWN0aW5nCisgICAgICAgIC8vIGEgZnVsbCBjaXJjbGUK
KyAgICAgICAgaWYgKGFudGljbG9ja3dpc2UgJiYgc3dlZXBEZWdyZWVzID4gMCkgeworICAgICAg
ICAgICAgc3dlZXBEZWdyZWVzIC09IFNrSW50VG9TY2FsYXIoMzYwKTsKKyAgICAgICAgfSBlbHNl
IGlmICghYW50aWNsb2Nrd2lzZSAmJiBzd2VlcERlZ3JlZXMgPCAwKSB7CisgICAgICAgICAgICBz
d2VlcERlZ3JlZXMgKz0gU2tJbnRUb1NjYWxhcigzNjApOworICAgICAgICB9CisKKy8vICAgICAg
ICBTa0RlYnVnZigiYWRkQXJjIHNhPSVnIGVhPSVnIGN3PSVkIHN0YXJ0PSVnIHN3ZWVwPSVnXG4i
LCBzYSwgZWEsIGNsb2Nrd2lzZSwKKy8vICAgICAgICAgICAgICAgICBTa1NjYWxhclRvRmxvYXQo
c3RhcnREZWdyZWVzKSwgU2tTY2FsYXJUb0Zsb2F0KHN3ZWVwRGVncmVlcykpOworCisgICAgICAg
IG1fcGF0aC0+YXJjVG8ob3ZhbCwgc3RhcnREZWdyZWVzLCBzd2VlcERlZ3JlZXMsIGZhbHNlKTsK
KyAgICB9Cit9CisKK3ZvaWQgUGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7
CisgICAgbV9wYXRoLT5hZGRSZWN0KHJlY3QpOworfQorCit2b2lkIFBhdGg6OmFkZEVsbGlwc2Uo
Y29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIG1fcGF0aC0+YWRkT3ZhbChyZWN0KTsKK30K
Kwordm9pZCBQYXRoOjpjbGVhcigpCit7CisgICAgbV9wYXRoLT5yZXNldCgpOworfQorCitzdGF0
aWMgRmxvYXRQb2ludCogc2V0ZnB0cyhGbG9hdFBvaW50IGRzdFtdLCBjb25zdCBTa1BvaW50IHNy
Y1tdLCBpbnQgY291bnQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQor
ICAgIHsKKyAgICAgICAgZHN0W2ldLnNldFgoU2tTY2FsYXJUb0Zsb2F0KHNyY1tpXS5mWCkpOwor
ICAgICAgICBkc3RbaV0uc2V0WShTa1NjYWxhclRvRmxvYXQoc3JjW2ldLmZZKSk7CisgICAgfQor
ICAgIHJldHVybiBkc3Q7Cit9CisKK3ZvaWQgUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0aEFw
cGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sKKyAgICBTa1BhdGg6Okl0ZXIgICAgaXRl
cigqbV9wYXRoLCBmYWxzZSk7CisgICAgU2tQb2ludCAgICAgICAgIHB0c1s0XTsKKyAgICAKKyAg
ICBQYXRoRWxlbWVudCAgICAgZWxlbTsKKyAgICBGbG9hdFBvaW50ICAgICAgZnB0c1szXTsKKwor
ICAgIGZvciAoOzspCisgICAgeworICAgICAgICBzd2l0Y2ggKGl0ZXIubmV4dChwdHMpKSB7Cisg
ICAgICAgIGNhc2UgU2tQYXRoOjprTW92ZV9WZXJiOgorICAgICAgICAgICAgZWxlbS50eXBlID0g
UGF0aEVsZW1lbnRNb3ZlVG9Qb2ludDsKKyAgICAgICAgICAgIGVsZW0ucG9pbnRzID0gc2V0ZnB0
cyhmcHRzLCAmcHRzWzBdLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNr
UGF0aDo6a0xpbmVfVmVyYjoKKyAgICAgICAgICAgIGVsZW0udHlwZSA9IFBhdGhFbGVtZW50QWRk
TGluZVRvUG9pbnQ7CisgICAgICAgICAgICBlbGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgJnB0
c1sxXSwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtRdWFk
X1ZlcmI6CisgICAgICAgICAgICBlbGVtLnR5cGUgPSBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRv
UG9pbnQ7CisgICAgICAgICAgICBlbGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgJnB0c1sxXSwg
Mik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDdWJpY19WZXJi
OgorICAgICAgICAgICAgZWxlbS50eXBlID0gUGF0aEVsZW1lbnRBZGRDdXJ2ZVRvUG9pbnQ7Cisg
ICAgICAgICAgICBlbGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgJnB0c1sxXSwgMyk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDbG9zZV9WZXJiOgorICAgICAg
ICAgICAgZWxlbS50eXBlID0gUGF0aEVsZW1lbnRDbG9zZVN1YnBhdGg7CisgICAgICAgICAgICBl
bGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgTlVMTCwgMCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBTa1BhdGg6OmtEb25lX1ZlcmI6CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICAgICAgZnVuY3Rpb24oaW5mbywgJmVsZW0pOworICAgIH0KK30KKwordm9p
ZCBQYXRoOjp0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB4Zm9ybSkKK3sKKyAgICBt
X3BhdGgtPnRyYW5zZm9ybSh4Zm9ybSk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0cmluZygp
IGNvbnN0Cit7CisgICAgU3RyaW5nIHJlc3VsdDsKKworICAgIFNrUGF0aDo6SXRlciAgICBpdGVy
KCptX3BhdGgsIGZhbHNlKTsKKyAgICBTa1BvaW50ICAgICAgICAgcHRzWzRdOworCisgICAgaW50
ICAgICAgICAgICAgIG51bVBvaW50cyA9IG1fcGF0aC0+Z2V0UG9pbnRzKE5VTEwsIDApOworICAg
IFNrUGF0aDo6VmVyYiAgICB2ZXJiOworCisgICAgZG8geworICAgICAgICB2ZXJiID0gaXRlci5u
ZXh0KHB0cyk7CisgICAgICAgIHN3aXRjaCAodmVyYikgeworICAgICAgICBjYXNlIFNrUGF0aDo6
a01vdmVfVmVyYjoKKyAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmc6OmZvcm1hdCgiTSUuMmYs
JS4yZiAiLCBwdHNbMF0uZlgsIHB0c1swXS5mWSk7CisgICAgICAgICAgICBudW1Qb2ludHMgLT0g
MTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNrUGF0aDo6a0xpbmVfVmVyYjoK
KyAgICAgICAgICBpZiAoIWl0ZXIuaXNDbG9zZUxpbmUoKSkgeworICAgICAgICAgICAgICAgIHJl
c3VsdCArPSBTdHJpbmc6OmZvcm1hdCgiTCUuMmYsJS4yZiAiLCBwdHNbMV0uZlgsIHB0c1sxXS5m
WSk7IAorICAgICAgICAgICAgICAgIG51bVBvaW50cyAtPSAxOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYXRoOjprUXVhZF9WZXJiOgorICAgICAg
ICAgICAgcmVzdWx0ICs9IFN0cmluZzo6Zm9ybWF0KCJRJS4yZiwlLjJmLCUuMmYsJS4yZiAiLAor
ICAgICAgICAgICAgICAgIHB0c1sxXS5mWCwgcHRzWzFdLmZZLAorICAgICAgICAgICAgICAgIHB0
c1syXS5mWCwgcHRzWzJdLmZZKTsKKyAgICAgICAgICAgIG51bVBvaW50cyAtPSAyOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYXRoOjprQ3ViaWNfVmVyYjoKKyAgICAgICAg
ICAgIHJlc3VsdCArPSBTdHJpbmc6OmZvcm1hdCgiQyUuMmYsJS4yZiwlLjJmLCUuMmYsJS4yZiwl
LjJmICIsCisgICAgICAgICAgICAgICAgcHRzWzFdLmZYLCBwdHNbMV0uZlksCisgICAgICAgICAg
ICAgICAgcHRzWzJdLmZYLCBwdHNbMl0uZlksCisgICAgICAgICAgICAgICAgcHRzWzNdLmZYLCBw
dHNbM10uZlkpOworICAgICAgICAgICAgbnVtUG9pbnRzIC09IDM7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDbG9zZV9WZXJiOgorICAgICAgICAgICAgcmVzdWx0
ICs9ICJaICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtEb25l
X1ZlcmI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHZlcmIg
IT0gU2tQYXRoOjprRG9uZV9WZXJiKTsKKworICAgIC8vIElmIHlvdSBoYXZlIGEgcGF0aCB0aGF0
IGVuZHMgd2l0aCBhbiBNLCBTa2lhIHdpbGwgbm90IGl0ZXJhdGUgdGhlCisgICAgLy8gdHJhaWxp
bmcgTS4gVGhhdCdzIG5pY2Ugb2YgaXQsIGJ1dCBBcHBsZSdzIHBhdGhzIG91dHB1dCB0aGUgdHJh
aWxpbmcgTQorICAgIC8vIGFuZCB3ZSB3YW50IG91dCBsYXlvdXQgZHVtcHMgdG8gbG9vayBsaWtl
IHRoZWlycworICAgIGlmIChudW1Qb2ludHMpIHsKKyAgICAgICAgQVNTRVJUKG51bVBvaW50cz09
MSk7CisgICAgICAgIG1fcGF0aC0+Z2V0TGFzdFB0KHB0cyk7CisgICAgICAgIHJlc3VsdCArPSBT
dHJpbmc6OmZvcm1hdCgiTSUuMmYsJS4yZiAiLCBwdHNbMF0uZlgsIHB0c1swXS5mWSk7CisgICAg
fQorCisgICAgcmV0dXJuIHJlc3VsdC5zdHJpcFdoaXRlU3BhY2UoKTsKK30KKworLy8gQ29tcHV0
ZXMgdGhlIGJvdW5kaW5nIGJveCBmb3IgdGhlIHN0cm9rZSBhbmQgc3R5bGUgY3VycmVudGx5IHNl
bGVjdGVkIGludG8KKy8vIHRoZSBnaXZlbiBib3VuZGluZyBib3guIFRoaXMgYWxzbyB0YWtlcyBp
bnRvIGFjY291bnQgdGhlIHN0cm9rZSB3aWR0aC4KK3N0YXRpYyBGbG9hdFJlY3QgYm91bmRpbmdC
b3hGb3JDdXJyZW50U3Ryb2tlKGNvbnN0IEdyYXBoaWNzQ29udGV4dCogY29udGV4dCkKK3sKKyAg
ICBTa1BhaW50IHBhaW50OworICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBh
aW50Rm9yU3Ryb2tpbmcoJnBhaW50LCAwLCAwKTsKKyAgICBTa1BhdGggYm91bmRpbmdQYXRoOwor
ICAgIHBhaW50LmdldEZpbGxQYXRoKCpjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3VycmVu
dFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAmYm91bmRpbmdQYXRoKTsKKyAgICBTa1Jl
Y3QgcjsKKyAgICBib3VuZGluZ1BhdGguY29tcHV0ZUJvdW5kcygmciwgU2tQYXRoOjprRXhhY3Rf
Qm91bmRzVHlwZSk7CisgICAgcmV0dXJuIHI7Cit9CisKK0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VC
b3VuZGluZ1JlY3QoU3Ryb2tlU3R5bGVBcHBsaWVyKiBhcHBsaWVyKQoreworICAgIEdyYXBoaWNz
Q29udGV4dCogc2NyYXRjaCA9IHNjcmF0Y2hDb250ZXh0KCk7CisgICAgc2NyYXRjaC0+c2F2ZSgp
OworICAgIHNjcmF0Y2gtPmJlZ2luUGF0aCgpOworICAgIHNjcmF0Y2gtPmFkZFBhdGgoKnRoaXMp
OworCisgICAgaWYgKGFwcGxpZXIpCisgICAgICAgIGFwcGxpZXItPnN0cm9rZVN0eWxlKHNjcmF0
Y2gpOworCisgICAgRmxvYXRSZWN0IHIgPSBib3VuZGluZ0JveEZvckN1cnJlbnRTdHJva2Uoc2Ny
YXRjaCk7CisgICAgc2NyYXRjaC0+cmVzdG9yZSgpOworICAgIHJldHVybiByOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3NraWEvUGF0dGVyblNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1Bh
dHRlcm5Ta2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBiZjFh
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdHRl
cm5Ta2lhLmNwcApAQCAtMCwwICsxLDU5IEBACisvKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiANCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlDQorICogbWV0Og0KKyAqIA0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
Lg0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUNCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyDQorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1dGlv
bi4NCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzDQorICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqIA0KKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsDQorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0K
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0K
Kw0KKyNpbmNsdWRlICJjb25maWcuaCINCisjaW5jbHVkZSAiUGF0dGVybi5oIg0KKw0KKyNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCINCisjaW5jbHVkZSAiSW1hZ2UuaCINCisjaW5jbHVkZSAi
TmF0aXZlSW1hZ2VTa2lhLmgiDQorDQorI2luY2x1ZGUgIlNrU2hhZGVyLmgiDQorDQorbmFtZXNw
YWNlIFdlYkNvcmUgew0KKw0KK3N0YXRpYyBpbmxpbmUgU2tTaGFkZXI6OlRpbGVNb2RlIHNoYWRl
clJ1bGUoYm9vbCBzaG91bGRSZXBlYXQpDQorew0KKyAgICAvLyBGSVhNRTogU2tpYSBkb2VzIG5v
dCBoYXZlIGEgImRyYXcgdGhlIHRpbGUgb25seSBvbmNlIiBvcHRpb24NCisgICAgLy8gQ2xhbXAg
ZHJhd3MgdGhlIGxhc3QgbGluZSBvZiB0aGUgaW1hZ2UgYWZ0ZXIgc3RvcHBpbmcgcmVwZWF0aW5n
DQorICAgIHJldHVybiBzaG91bGRSZXBlYXQgPyBTa1NoYWRlcjo6a1JlcGVhdF9UaWxlTW9kZSA6
IFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGU7DQorfQ0KKw0KK1BsYXRmb3JtUGF0dGVyblB0ciBQ
YXR0ZXJuOjpjcmVhdGVQbGF0Zm9ybVBhdHRlcm4oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0
ZXJuVHJhbnNmb3JtKSBjb25zdA0KK3sNCisgICAgU2tCaXRtYXAqIGJtID0gbV90aWxlSW1hZ2Ut
Pm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7DQorICAgIFNrU2hhZGVyKiBzaGFkZXIgPSBT
a1NoYWRlcjo6Q3JlYXRlQml0bWFwU2hhZGVyKCpibSwNCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyUnVsZShtX3JlcGVhdFgpLA0KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJS
dWxlKG1fcmVwZWF0WSkpOw0KKyAgICBzaGFkZXItPnNldExvY2FsTWF0cml4KHBhdHRlcm5UcmFu
c2Zvcm0pOw0KKyAgICByZXR1cm4gc2hhZGVyOw0KK30NCisNCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlDQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3Jt
Q29udGV4dFNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3Jt
Q29udGV4dFNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOGYx
YTQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxh
dGZvcm1Db250ZXh0U2tpYS5jcHAKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIk5hdGl2ZUltYWdl
U2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyN1bmRlZiBMT0cKKyNp
bmNsdWRlICJTa2lhVXRpbHMuaCIKKyNpbmNsdWRlICJ3dGYvTWF0aEV4dHJhcy5oIgorCisjaW5j
bHVkZSAic2tpYS9leHQvaW1hZ2Vfb3BlcmF0aW9ucy5oIgorI2luY2x1ZGUgInNraWEvZXh0L3Bs
YXRmb3JtX2NhbnZhcy5oIgorCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICJTa0Nv
bG9yUHJpdi5oIgorI2luY2x1ZGUgIlNrU2hhZGVyLmgiCisjaW5jbHVkZSAiU2tEYXNoUGF0aEVm
ZmVjdC5oIgorCisjaWYgZGVmaW5lZChPU19MSU5VWCkKKyNpbmNsdWRlICJHZGtTa2lhLmgiCisj
ZW5kaWYKKworLy8gU3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRW5jYXBzdWxhdGVzIHRoZSBh
ZGRpdGlvbmFsIHBhaW50aW5nIHN0YXRlIGluZm9ybWF0aW9uIHdlIHN0b3JlIGZvciBlYWNoCisv
LyBwdXNoZWQgZ3JhcGhpY3Mgc3RhdGUuCitzdHJ1Y3QgUGxhdGZvcm1Db250ZXh0U2tpYTo6U3Rh
dGUgeworICAgIFN0YXRlKCk7CisgICAgU3RhdGUoY29uc3QgU3RhdGUmKTsKKyAgICB+U3RhdGUo
KTsKKworICAgIC8vIENvbW1vbiBzaGFkZXIgc3RhdGUuCisgICAgZmxvYXQgbV9hbHBoYTsKKyAg
ICBTa1BvcnRlckR1ZmY6Ok1vZGUgbV9wb3J0ZXJEdWZmTW9kZTsKKyAgICBTa1NoYWRlciogbV9n
cmFkaWVudDsKKyAgICBTa1NoYWRlciogbV9wYXR0ZXJuOworICAgIGJvb2wgbV91c2VBbnRpYWxp
YXNpbmc7CisgICAgU2tEcmF3TG9vcGVyKiBtX2xvb3BlcjsKKworICAgIC8vIEZpbGwuCisgICAg
U2tDb2xvciBtX2ZpbGxDb2xvcjsKKworICAgIC8vIFN0cm9rZS4KKyAgICBXZWJDb3JlOjpTdHJv
a2VTdHlsZSBtX3N0cm9rZVN0eWxlOworICAgIFNrQ29sb3IgbV9zdHJva2VDb2xvcjsKKyAgICBm
bG9hdCBtX3N0cm9rZVRoaWNrbmVzczsKKyAgICBpbnQgbV9kYXNoUmF0aW87ICAvLyBSYXRpbyBv
ZiB0aGUgbGVuZ3RoIG9mIGEgZGFzaCB0byBpdHMgd2lkdGguCisgICAgZmxvYXQgbV9taXRlckxp
bWl0OworICAgIFNrUGFpbnQ6OkNhcCBtX2xpbmVDYXA7CisgICAgU2tQYWludDo6Sm9pbiBtX2xp
bmVKb2luOworICAgIFNrRGFzaFBhdGhFZmZlY3QqIG1fZGFzaDsKKworICAgIC8vIFRleHQuIChT
ZWUgY1RleHRGaWxsICYgZnJpZW5kcyBpbiBHcmFwaGljc0NvbnRleHQuaC4pCisgICAgaW50IG1f
dGV4dERyYXdpbmdNb2RlOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBhcHBseWluZyB0
aGUgc3RhdGUncyBhbHBoYSB2YWx1ZSB0byB0aGUgZ2l2ZW4gaW5wdXQKKyAgICAvLyBjb2xvciB0
byBwcm9kdWNlIGEgbmV3IG91dHB1dCBjb2xvci4KKyAgICBTa0NvbG9yIGFwcGx5QWxwaGEoU2tD
b2xvciBjKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBOb3Qgc3VwcG9ydGVkLgorICAgIHZv
aWQgb3BlcmF0b3I9KGNvbnN0IFN0YXRlJik7Cit9OworCisvLyBOb3RlOiBLZWVwIHRoZXNlcyBk
ZWZhdWx0IHZhbHVlcyBpbiBzeW5jIHdpdGggR3JhcGhpY3NDb250ZXh0U3RhdGUuCitQbGF0Zm9y
bUNvbnRleHRTa2lhOjpTdGF0ZTo6U3RhdGUoKQorICAgIDogbV9hbHBoYSgxKQorICAgICwgbV9w
b3J0ZXJEdWZmTW9kZShTa1BvcnRlckR1ZmY6OmtTcmNPdmVyX01vZGUpCisgICAgLCBtX2dyYWRp
ZW50KDApCisgICAgLCBtX3BhdHRlcm4oMCkKKyAgICAsIG1fdXNlQW50aWFsaWFzaW5nKHRydWUp
CisgICAgLCBtX2xvb3BlcigwKQorICAgICwgbV9maWxsQ29sb3IoMHhGRjAwMDAwMCkKKyAgICAs
IG1fc3Ryb2tlU3R5bGUoV2ViQ29yZTo6U29saWRTdHJva2UpCisgICAgLCBtX3N0cm9rZUNvbG9y
KDB4MEZGMDAwMDAwKQorICAgICwgbV9zdHJva2VUaGlja25lc3MoMCkKKyAgICAsIG1fZGFzaFJh
dGlvKDMpCisgICAgLCBtX21pdGVyTGltaXQoNCkKKyAgICAsIG1fbGluZUNhcChTa1BhaW50Ojpr
RGVmYXVsdF9DYXApCisgICAgLCBtX2xpbmVKb2luKFNrUGFpbnQ6OmtEZWZhdWx0X0pvaW4pCisg
ICAgLCBtX2Rhc2goMCkKKyAgICAsIG1fdGV4dERyYXdpbmdNb2RlKFdlYkNvcmU6OmNUZXh0Rmls
bCkKK3sKK30KKworUGxhdGZvcm1Db250ZXh0U2tpYTo6U3RhdGU6OlN0YXRlKGNvbnN0IFN0YXRl
JiBvdGhlcikKK3sKKyAgICBtZW1jcHkodGhpcywgJm90aGVyLCBzaXplb2YoU3RhdGUpKTsKKwor
ICAgIG1fbG9vcGVyLT5zYWZlUmVmKCk7CisgICAgbV9kYXNoLT5zYWZlUmVmKCk7CisgICAgbV9n
cmFkaWVudC0+c2FmZVJlZigpOworICAgIG1fcGF0dGVybi0+c2FmZVJlZigpOworfQorCitQbGF0
Zm9ybUNvbnRleHRTa2lhOjpTdGF0ZTo6flN0YXRlKCkKK3sKKyAgICBtX2xvb3Blci0+c2FmZVVu
cmVmKCk7CisgICAgbV9kYXNoLT5zYWZlVW5yZWYoKTsKKyAgICBtX2dyYWRpZW50LT5zYWZlVW5y
ZWYoKTsKKyAgICBtX3BhdHRlcm4tPnNhZmVVbnJlZigpOworfQorCitTa0NvbG9yIFBsYXRmb3Jt
Q29udGV4dFNraWE6OlN0YXRlOjphcHBseUFscGhhKFNrQ29sb3IgYykgY29uc3QKK3sKKyAgICBp
bnQgcyA9IHJvdW5kZihtX2FscGhhICogMjU2KTsKKyAgICBpZiAocyA+PSAyNTYpCisgICAgICAg
IHJldHVybiBjOworICAgIGlmIChzIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQg
YSA9IFNrQWxwaGFNdWwoU2tDb2xvckdldEEoYyksIHMpOworICAgIHJldHVybiAoYyAmIDB4MDBG
RkZGRkYpIHwgKGEgPDwgMjQpOworfQorCisvLyBQbGF0Zm9ybUNvbnRleHRTa2lhIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBE
YW5nZXI6IGNhbnZhcyBjYW4gYmUgTlVMTC4KK1BsYXRmb3JtQ29udGV4dFNraWE6OlBsYXRmb3Jt
Q29udGV4dFNraWEoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcykKKyAgICA6IG1fY2FudmFz
KGNhbnZhcykKKyAgICAsIG1fc3RhdGVTdGFjayhzaXplb2YoU3RhdGUpKQoreworICAgIG1fc3Rh
dGVTdGFjay5hcHBlbmQoU3RhdGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3RhY2subGFz
dCgpOworI2lmIGRlZmluZWQoT1NfTElOVVgpCisgICAgbV9nZGtza2lhID0gbV9jYW52YXMgPyBn
ZGtfc2tpYV9uZXcobV9jYW52YXMpIDogTlVMTDsKKyNlbmRpZgorfQorCitQbGF0Zm9ybUNvbnRl
eHRTa2lhOjp+UGxhdGZvcm1Db250ZXh0U2tpYSgpCit7CisjaWYgZGVmaW5lZChPU19MSU5VWCkK
KyAgICBpZiAobV9nZGtza2lhKSB7CisgICAgICAgIGdfb2JqZWN0X3VucmVmKG1fZ2Rrc2tpYSk7
CisgICAgICAgIG1fZ2Rrc2tpYSA9IE5VTEw7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgUGxh
dGZvcm1Db250ZXh0U2tpYTo6c2V0Q2FudmFzKHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMp
Cit7CisgICAgbV9jYW52YXMgPSBjYW52YXM7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tp
YTo6c2F2ZSgpCit7CisgICAgbV9zdGF0ZVN0YWNrLmFwcGVuZCgqbV9zdGF0ZSk7CisgICAgbV9z
dGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworCisgICAgLy8gU2F2ZSBvdXIgbmF0aXZlIGNh
bnZhcy4KKyAgICBjYW52YXMoKS0+c2F2ZSgpOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNr
aWE6OnJlc3RvcmUoKQoreworICAgIG1fc3RhdGVTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgbV9z
dGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworCisgICAgLy8gUmVzdG9yZSBvdXIgbmF0aXZl
IGNhbnZhcy4KKyAgICBjYW52YXMoKS0+cmVzdG9yZSgpOworfQorCit2b2lkIFBsYXRmb3JtQ29u
dGV4dFNraWE6OmRyYXdSZWN0KFNrUmVjdCByZWN0KQoreworICAgIFNrUGFpbnQgcGFpbnQ7Cisg
ICAgaW50IGZpbGxjb2xvck5vdFRyYW5zcGFyZW50ID0gbV9zdGF0ZS0+bV9maWxsQ29sb3IgJiAw
eEZGMDAwMDAwOworICAgIGlmIChmaWxsY29sb3JOb3RUcmFuc3BhcmVudCkgeworICAgICAgICBz
ZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQpOworICAgICAgICBjYW52YXMoKS0+ZHJhd1JlY3Qo
cmVjdCwgcGFpbnQpOworICAgIH0KKworICAgIGlmIChtX3N0YXRlLT5tX3N0cm9rZVN0eWxlICE9
IFdlYkNvcmU6Ok5vU3Ryb2tlICYmCisgICAgICAgIChtX3N0YXRlLT5tX3N0cm9rZUNvbG9yICYg
MHhGRjAwMDAwMCkpIHsKKyAgICAgICAgaWYgKGZpbGxjb2xvck5vdFRyYW5zcGFyZW50KSB7Cisg
ICAgICAgICAgICAvLyBUaGlzIGNhbGwgaXMgZXhwZW5zaXZlIHNvIGRvbid0IGNhbGwgaXQgdW5u
ZWNlc3NhcmlseS4KKyAgICAgICAgICAgIHBhaW50LnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAg
ICAgc2V0dXBQYWludEZvclN0cm9raW5nKCZwYWludCwgJnJlY3QsIDApOworICAgICAgICBjYW52
YXMoKS0+ZHJhd1JlY3QocmVjdCwgcGFpbnQpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybUNv
bnRleHRTa2lhOjpzZXR1cFBhaW50Q29tbW9uKFNrUGFpbnQqIHBhaW50KSBjb25zdAoreworI2lm
ZGVmIFNLX0RFQlVHeAorICAgIHsKKyAgICAgICAgU2tQYWludCBkZWZhdWx0UGFpbnQ7CisgICAg
ICAgIFNrQVNTRVJUKCpwYWludCA9PSBkZWZhdWx0UGFpbnQpOworICAgIH0KKyNlbmRpZgorCisg
ICAgcGFpbnQtPnNldEFudGlBbGlhcyhtX3N0YXRlLT5tX3VzZUFudGlhbGlhc2luZyk7CisgICAg
cGFpbnQtPnNldFBvcnRlckR1ZmZYZmVybW9kZShtX3N0YXRlLT5tX3BvcnRlckR1ZmZNb2RlKTsK
KyAgICBwYWludC0+c2V0TG9vcGVyKG1fc3RhdGUtPm1fbG9vcGVyKTsKKworICAgIGlmIChtX3N0
YXRlLT5tX2dyYWRpZW50KQorICAgICAgICBwYWludC0+c2V0U2hhZGVyKG1fc3RhdGUtPm1fZ3Jh
ZGllbnQpOworICAgIGVsc2UgaWYgKG1fc3RhdGUtPm1fcGF0dGVybikKKyAgICAgICAgcGFpbnQt
PnNldFNoYWRlcihtX3N0YXRlLT5tX3BhdHRlcm4pOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4
dFNraWE6OnNldHVwUGFpbnRGb3JGaWxsaW5nKFNrUGFpbnQqIHBhaW50KSBjb25zdAoreworICAg
IHNldHVwUGFpbnRDb21tb24ocGFpbnQpOworICAgIHBhaW50LT5zZXRDb2xvcihtX3N0YXRlLT5h
cHBseUFscGhhKG1fc3RhdGUtPm1fZmlsbENvbG9yKSk7Cit9CisKK2Zsb2F0IFBsYXRmb3JtQ29u
dGV4dFNraWE6OnNldHVwUGFpbnRGb3JTdHJva2luZyhTa1BhaW50KiBwYWludCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1JlY3QqIHJlY3QsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0
aCkgY29uc3QKK3sKKyAgICBzZXR1cFBhaW50Q29tbW9uKHBhaW50KTsKKyAgICBmbG9hdCB3aWR0
aCA9IG1fc3RhdGUtPm1fc3Ryb2tlVGhpY2tuZXNzOworCisgICAgLy8gVGhpcyBhbGxvd3MgZGFz
aGluZyBhbmQgZG90dGluZyB0byB3b3JrIHByb3Blcmx5IGZvciBoYWlybGluZSBzdHJva2VzLgor
ICAgIGlmICh3aWR0aCA9PSAwKQorICAgICAgICB3aWR0aCA9IDE7CisKKyAgICBwYWludC0+c2V0
Q29sb3IobV9zdGF0ZS0+YXBwbHlBbHBoYShtX3N0YXRlLT5tX3N0cm9rZUNvbG9yKSk7CisgICAg
cGFpbnQtPnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOworICAgIHBhaW50LT5zZXRT
dHJva2VXaWR0aChTa0Zsb2F0VG9TY2FsYXIod2lkdGgpKTsKKyAgICBwYWludC0+c2V0U3Ryb2tl
Q2FwKG1fc3RhdGUtPm1fbGluZUNhcCk7CisgICAgcGFpbnQtPnNldFN0cm9rZUpvaW4obV9zdGF0
ZS0+bV9saW5lSm9pbik7CisgICAgcGFpbnQtPnNldFN0cm9rZU1pdGVyKFNrRmxvYXRUb1NjYWxh
cihtX3N0YXRlLT5tX21pdGVyTGltaXQpKTsKKworICAgIGlmIChyZWN0ICE9IDAgJiYgKHN0YXRp
Y19jYXN0PGludD4ocm91bmRmKHdpZHRoKSkgJiAxKSkKKyAgICAgICAgcmVjdC0+aW5zZXQoLVNL
X1NjYWxhckhhbGYsIC1TS19TY2FsYXJIYWxmKTsKKworICAgIGlmIChtX3N0YXRlLT5tX2Rhc2gp
IHsKKyAgICAgICAgcGFpbnQtPnNldFBhdGhFZmZlY3QobV9zdGF0ZS0+bV9kYXNoKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG1fc3RhdGUtPm1fc3Ryb2tlU3R5bGUpIHsKKyAgICAg
ICAgY2FzZSBXZWJDb3JlOjpOb1N0cm9rZToKKyAgICAgICAgY2FzZSBXZWJDb3JlOjpTb2xpZFN0
cm9rZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdlYkNvcmU6OkRhc2hlZFN0
cm9rZToKKyAgICAgICAgICAgIHdpZHRoID0gbV9zdGF0ZS0+bV9kYXNoUmF0aW8gKiB3aWR0aDsK
KyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaC4KKyAgICAgICAgY2FzZSBXZWJDb3JlOjpEb3R0
ZWRTdHJva2U6CisgICAgICAgICAgICBTa1NjYWxhciBkYXNoTGVuZ3RoOworICAgICAgICAgICAg
aWYgKGxlbmd0aCkgeworICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBhYm91dCBob3cgbWFu
eSBkYXNoZXMgb3IgZG90cyB3ZSBzaG91bGQgaGF2ZS4KKyAgICAgICAgICAgICAgICBpbnQgbnVt
RGFzaGVzID0gbGVuZ3RoIC8gcm91bmRmKHdpZHRoKTsKKyAgICAgICAgICAgICAgICBpZiAoIShu
dW1EYXNoZXMgJiAxKSkKKyAgICAgICAgICAgICAgICAgICAgbnVtRGFzaGVzKys7ICAgIC8vIE1h
a2UgaXQgb2RkIHNvIHdlIGVuZCBvbiBhIGRhc2gvZG90LgorICAgICAgICAgICAgICAgIC8vIFVz
ZSB0aGUgbnVtYmVyIG9mIGRhc2hlcyB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiBhCisgICAg
ICAgICAgICAgICAgLy8gZGFzaC9kb3QsIHdoaWNoIHdpbGwgYmUgYXBwcm94aW1hdGVseSB3aWR0
aAorICAgICAgICAgICAgICAgIGRhc2hMZW5ndGggPSBTa1NjYWxhckRpdihTa0ludFRvU2NhbGFy
KGxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrSW50
VG9TY2FsYXIobnVtRGFzaGVzKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGRhc2hMZW5ndGggPSBTa0Zsb2F0VG9TY2FsYXIod2lkdGgpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgU2tTY2FsYXIgaW50ZXJ2YWxzWzJdID0geyBkYXNoTGVuZ3RoLCBkYXNoTGVu
Z3RoIH07CisgICAgICAgICAgICBwYWludC0+c2V0UGF0aEVmZmVjdCgKKyAgICAgICAgICAgICAg
ICBuZXcgU2tEYXNoUGF0aEVmZmVjdChpbnRlcnZhbHMsIDIsIDApKS0+dW5yZWYoKTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0
U2tpYTo6c2V0RHJhd0xvb3BlcihTa0RyYXdMb29wZXIqIGRsKQoreworICAgIFNrUmVmQ250X1Nh
ZmVBc3NpZ24obV9zdGF0ZS0+bV9sb29wZXIsIGRsKTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRl
eHRTa2lhOjpzZXRNaXRlckxpbWl0KGZsb2F0IG1sKQoreworICAgIG1fc3RhdGUtPm1fbWl0ZXJM
aW1pdCA9IG1sOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldEFscGhhKGZsb2F0
IGFscGhhKQoreworICAgIG1fc3RhdGUtPm1fYWxwaGEgPSBhbHBoYTsKK30KKwordm9pZCBQbGF0
Zm9ybUNvbnRleHRTa2lhOjpzZXRMaW5lQ2FwKFNrUGFpbnQ6OkNhcCBsYykKK3sKKyAgICBtX3N0
YXRlLT5tX2xpbmVDYXAgPSBsYzsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRM
aW5lSm9pbihTa1BhaW50OjpKb2luIGxqKQoreworICAgIG1fc3RhdGUtPm1fbGluZUpvaW4gPSBs
ajsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRQb3J0ZXJEdWZmTW9kZShTa1Bv
cnRlckR1ZmY6Ok1vZGUgcGRtKQoreworICAgIG1fc3RhdGUtPm1fcG9ydGVyRHVmZk1vZGUgPSBw
ZG07Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0RmlsbENvbG9yKFNrQ29sb3Ig
Y29sb3IpCit7CisgICAgbV9zdGF0ZS0+bV9maWxsQ29sb3IgPSBjb2xvcjsKK30KKworU2tEcmF3
TG9vcGVyKiBQbGF0Zm9ybUNvbnRleHRTa2lhOjpnZXREcmF3TG9vcGVyKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV9zdGF0ZS0+bV9sb29wZXI7Cit9CisKK1dlYkNvcmU6OlN0cm9rZVN0eWxlIFBs
YXRmb3JtQ29udGV4dFNraWE6OmdldFN0cm9rZVN0eWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9zdGF0ZS0+bV9zdHJva2VTdHlsZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpz
ZXRTdHJva2VTdHlsZShXZWJDb3JlOjpTdHJva2VTdHlsZSBzdHJva2VzdHlsZSkKK3sKKyAgICBt
X3N0YXRlLT5tX3N0cm9rZVN0eWxlID0gc3Ryb2tlc3R5bGU7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
b250ZXh0U2tpYTo6c2V0U3Ryb2tlQ29sb3IoU2tDb2xvciBzdHJva2Vjb2xvcikKK3sKKyAgICBt
X3N0YXRlLT5tX3N0cm9rZUNvbG9yID0gc3Ryb2tlY29sb3I7Cit9CisKK2Zsb2F0IFBsYXRmb3Jt
Q29udGV4dFNraWE6OmdldFN0cm9rZVRoaWNrbmVzcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
c3RhdGUtPm1fc3Ryb2tlVGhpY2tuZXNzOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6
OnNldFN0cm9rZVRoaWNrbmVzcyhmbG9hdCB0aGlja25lc3MpCit7CisgICAgbV9zdGF0ZS0+bV9z
dHJva2VUaGlja25lc3MgPSB0aGlja25lc3M7Cit9CisKK2ludCBQbGF0Zm9ybUNvbnRleHRTa2lh
OjpnZXRUZXh0RHJhd2luZ01vZGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0YXRlLT5tX3Rl
eHREcmF3aW5nTW9kZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRUZXh0RHJh
d2luZ01vZGUoaW50IG1vZGUpCit7CisgIC8vIGNUZXh0Q2xpcCBpcyBuZXZlciB1c2VkLCBzbyB3
ZSBhc3NlcnQgdGhhdCBpdCBpc24ndCBzZXQ6CisgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0yMTg5OAorICBBU1NFUlQoKG1vZGUgJiBXZWJDb3JlOjpjVGV4dENs
aXApID09IDApOworICBtX3N0YXRlLT5tX3RleHREcmF3aW5nTW9kZSA9IG1vZGU7Cit9CisKK3Zv
aWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0VXNlQW50aWFsaWFzaW5nKGJvb2wgZW5hYmxlKQor
eworICAgIG1fc3RhdGUtPm1fdXNlQW50aWFsaWFzaW5nID0gZW5hYmxlOworfQorCitTa0NvbG9y
IFBsYXRmb3JtQ29udGV4dFNraWE6OmZpbGxDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
c3RhdGUtPm1fZmlsbENvbG9yOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OmJlZ2lu
UGF0aCgpCit7CisgICAgbV9wYXRoLnJlc2V0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0
U2tpYTo6YWRkUGF0aChjb25zdCBTa1BhdGgmIHBhdGgpCit7CisgICAgbV9wYXRoLmFkZFBhdGgo
cGF0aCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0RmlsbFJ1bGUoU2tQYXRo
OjpGaWxsVHlwZSBmcikKK3sKKyAgICBtX3BhdGguc2V0RmlsbFR5cGUoZnIpOworfQorCit2b2lk
IFBsYXRmb3JtQ29udGV4dFNraWE6OnNldEdyYWRpZW50KFNrU2hhZGVyKiBncmFkaWVudCkKK3sK
KyAgICBpZiAoZ3JhZGllbnQgIT0gbV9zdGF0ZS0+bV9ncmFkaWVudCkgeworICAgICAgICBtX3N0
YXRlLT5tX2dyYWRpZW50LT5zYWZlVW5yZWYoKTsKKyAgICAgICAgbV9zdGF0ZS0+bV9ncmFkaWVu
dCA9IGdyYWRpZW50OworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRQ
YXR0ZXJuKFNrU2hhZGVyKiBwYXR0ZXJuKQoreworICAgIGlmIChwYXR0ZXJuICE9IG1fc3RhdGUt
Pm1fcGF0dGVybikgeworICAgICAgICBtX3N0YXRlLT5tX3BhdHRlcm4tPnNhZmVVbnJlZigpOwor
ICAgICAgICBtX3N0YXRlLT5tX3BhdHRlcm4gPSBwYXR0ZXJuOworICAgIH0KK30KKwordm9pZCBQ
bGF0Zm9ybUNvbnRleHRTa2lhOjpzZXREYXNoUGF0aEVmZmVjdChTa0Rhc2hQYXRoRWZmZWN0KiBk
YXNoKQoreworICAgIGlmIChkYXNoICE9IG1fc3RhdGUtPm1fZGFzaCkgeworICAgICAgICBtX3N0
YXRlLT5tX2Rhc2gtPnNhZmVVbnJlZigpOworICAgICAgICBtX3N0YXRlLT5tX2Rhc2ggPSBkYXNo
OworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpwYWludFNrUGFpbnQoY29u
c3QgU2tSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgU2tQYWludCYgcGFpbnQpCit7CisgICAgbV9jYW52YXMtPmRyYXdSZWN0KHJlY3QsIHBh
aW50KTsKK30KKworY29uc3QgU2tCaXRtYXAqIFBsYXRmb3JtQ29udGV4dFNraWE6OmJpdG1hcCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICZtX2NhbnZhcy0+Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1h
cChmYWxzZSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1Db250ZXh0U2tpYTo6SXNQcmludGluZygpCit7
CisgICAgcmV0dXJuIG1fY2FudmFzLT5nZXRUb3BQbGF0Zm9ybURldmljZSgpLklzVmVjdG9yaWFs
KCk7Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZv
cm1Db250ZXh0U2tpYS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3Jt
Q29udGV4dFNraWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTllM2Fk
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRm
b3JtQ29udGV4dFNraWEuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtQ29u
dGV4dFNraWFfaAorI2RlZmluZSBQbGF0Zm9ybUNvbnRleHRTa2lhX2gKKworCisjaW5jbHVkZSAi
U2tEYXNoUGF0aEVmZmVjdC5oIgorI2luY2x1ZGUgIlNrRHJhd0xvb3Blci5oIgorI2luY2x1ZGUg
IlNrRGVxdWUuaCIKKyNpbmNsdWRlICJza2lhL2V4dC9wbGF0Zm9ybV9jYW52YXMuaCIKKyNpbmNs
dWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAiU2tQYXRoLmgiCisKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlICJ3dGYvVmVjdG9yLmgiCisKK3R5cGVkZWYgc3RydWN0IF9H
ZGtEcmF3YWJsZSBHZGtTa2lhOworCisvLyBUaGlzIGNsYXNzIGhvbGRzIHRoZSBwbGF0Zm9ybS1z
cGVjaWZpYyBzdGF0ZSBmb3IgR3JhcGhpY3NDb250ZXh0LiBXZSBwdXQKKy8vIG1vc3Qgb2Ygb3Vy
IFNraWEgd3JhcHBlcnMgb24gdGhpcyBjbGFzcy4gSW4gdGhlb3J5LCBhIGxvdCBvZiB0aGlzIHN0
dWZmIGNvdWxkCisvLyBiZSBtb3ZlZCB0byBHcmFwaGljc0NvbnRleHQgZGlyZWN0bHksIGV4Y2Vw
dCB0aGF0IHNvbWUgY29kZSBleHRlcm5hbCB0byB0aGlzCisvLyB3b3VsZCBsaWtlIHRvIHBva2Ug
YXQgb3VyIGdyYXBoaWNzIGxheWVyIGFzIHdlbGwgKGxpa2UgdGhlIEltYWdlIGFuZCBGb250Cisv
LyBzdHVmZiwgd2hpY2ggbmVlZHMgc29tZSBhbW91bnQgb2Ygb3VyIHdyYXBwZXJzIGFuZCBzdGF0
ZSBhcm91bmQgU2tDYW52YXMpLgorLy8KKy8vIFNvIGluIGdlbmVyYWwsIHRoaXMgY2xhc3MgdXNl
cyBqdXN0IFNraWEgdHlwZXMgZXhjZXB0IHdoZW4gdGhlcmUncyBubyBlYXN5CisvLyBjb252ZXJz
aW9uLiBHcmFwaGljc0NvbnRleHQgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlIFdl
YktpdCB0eXBlcyB0bworLy8gU2tpYSB0eXBlcyBhbmQgc2V0dGluZyB1cCB0aGUgZXZlbnR1YWwg
Y2FsbCB0byB0aGUgU2tpYSBmdW5jdGlvbnMuCisvLworLy8gVGhpcyBjbGFzcyB0aGVuIGtlZXBz
IHRyYWNrIG9mIGFsbCB0aGUgY3VycmVudCBTa2lhIHN0YXRlLiBXZWJLaXQgZXhwZWN0cworLy8g
dGhhdCB0aGUgZ3JhcGhpY3Mgc3RhdGUgdGhhdCBpcyBwdXNoZWQgYW5kIHBvcHBlZCBieSBzYXZl
KCkgYW5kIHJlc3RvcmUoKQorLy8gaW5jbHVkZXMgdGhpbmdzIGxpa2UgY29sb3JzIGFuZCBwZW4g
c3R5bGVzLiBTa2lhIGRvZXMgdGhpcyBkaWZmZXJlbnRseSwgd2hlcmUKKy8vIHB1c2ggYW5kIHBv
cCBvbmx5IGluY2x1ZGVzIHRyYW5zZm9ybXMgYW5kIGJpdG1hcHMsIGFuZCB0aGUgYXBwbGljYXRp
b24gaXMKKy8vIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgcGFpbnRpbmcgc3RhdGUgd2hp
Y2ggaXMgc3RvcmUgaW4gc2VwYXJhdGUKKy8vIFNrUGFpbnQgb2JqZWN0cy4gVGhpcyBjbGFzcyBw
cm92aWRlcyB0aGUgYWRhcHRvciB0aGF0IGFsbG93cyB0aGUgcGFpbnRpbmcKKy8vIHN0YXRlIHRv
IGJlIHB1c2hlZCBhbmQgcG9wcGVkIGFsb25nIHdpdGggdGhlIGJpdG1hcC4KK2NsYXNzIFBsYXRm
b3JtQ29udGV4dFNraWEgeworcHVibGljOgorICAgIC8vIEZvciBwcmludGluZywgdGhlcmUgc2hv
dWxkbid0IGJlIGFueSBjYW52YXMuIGNhbnZhcyBjYW4gYmUgTlVMTC4gSWYgeW91CisgICAgLy8g
c3VwcGx5IGEgTlVMTCBjYW52YXMsIHlvdSBjYW4gYWxzbyBjYWxsIHNldENhbnZhcyBsYXRlci4K
KyAgICBQbGF0Zm9ybUNvbnRleHRTa2lhKHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMpOwor
ICAgIH5QbGF0Zm9ybUNvbnRleHRTa2lhKCk7CisKKyAgICAvLyBTZXRzIHRoZSBjYW52YXMgYXNz
b2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dC4gVXNlIHdoZW4gc3VwcGx5aW5nIE5VTEwKKyAgICAv
LyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgdm9pZCBzZXRDYW52YXMoc2tpYTo6UGxhdGZvcm1D
YW52YXMqIGNhbnZhcyk7CisKKyAgICB2b2lkIHNhdmUoKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsK
KworICAgIC8vIFNldHMgdXAgdGhlIGNvbW1vbiBmbGFncyBvbiBhIHBhaW50IGZvciBhbnRpYWxp
YXNpbmcsIGVmZmVjdHMsIGV0Yy4KKyAgICAvLyBUaGlzIGlzIGltcGxpY2l0bHkgY2FsbGVkIGJ5
IHNldHVwUGFpbnRGaWxsIGFuZCBzZXR1cFBhaW50U3Ryb2tlLCBidXQKKyAgICAvLyB5b3UgbWF5
IHdpc2ggdG8gY2FsbCBpdCBkaXJlY3RseSBzb21ldGltZXMgaWYgeW91IGRvbid0IHdhbnQgdGhh
dCBvdGhlcgorICAgIC8vIGJlaGF2aW9yLgorICAgIHZvaWQgc2V0dXBQYWludENvbW1vbihTa1Bh
aW50KiBwYWludCkgY29uc3Q7CisKKyAgICAvLyBTZXRzIHVwIHRoZSBwYWludCBmb3IgdGhlIGN1
cnJlbnQgZmlsbCBzdHlsZS4KKyAgICB2b2lkIHNldHVwUGFpbnRGb3JGaWxsaW5nKFNrUGFpbnQq
IHBhaW50KSBjb25zdDsKKworICAgIC8vIFNldHMgdXAgdGhlIHBhaW50IGZvciBzdHJva2luZy4g
UmV0dXJucyBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSB3aWR0aCBvZgorICAgIC8vIHRoZSBwZW4s
IG9yIDEgaWYgdGhlIHBlbidzIHdpZHRoIGlzIDAgaWYgYSBub24temVybyBsZW5ndGggaXMgcHJv
dmlkZWQsCisgICAgLy8gdGhlIG51bWJlciBvZiBkYXNoZXMvZG90cyBvbiBhIGRhc2hlZC9kb3R0
ZWQgbGluZSB3aWxsIGJlIGFkanVzdGVkIHRvCisgICAgLy8gc3RhcnQgYW5kIGVuZCB0aGF0IGxl
bmd0aCB3aXRoIGEgZGFzaC9kb3QuCisgICAgZmxvYXQgc2V0dXBQYWludEZvclN0cm9raW5nKFNr
UGFpbnQqIHBhaW50LCBTa1JlY3QqIHJlY3QsIGludCBsZW5ndGgpIGNvbnN0OworCisgICAgLy8g
U3RhdGUgc2V0dGluZyBmdW5jdGlvbnMuCisgICAgdm9pZCBzZXREcmF3TG9vcGVyKFNrRHJhd0xv
b3BlciogZGwpOyAgLy8gTm90ZTogdGFrZXMgYW4gYWRkaXRpb25hbCByZWYuCisgICAgdm9pZCBz
ZXRNaXRlckxpbWl0KGZsb2F0IG1sKTsKKyAgICB2b2lkIHNldEFscGhhKGZsb2F0IGFscGhhKTsK
KyAgICB2b2lkIHNldExpbmVDYXAoU2tQYWludDo6Q2FwIGxjKTsKKyAgICB2b2lkIHNldExpbmVK
b2luKFNrUGFpbnQ6OkpvaW4gbGopOworICAgIHZvaWQgc2V0RmlsbFJ1bGUoU2tQYXRoOjpGaWxs
VHlwZSBmcik7CisgICAgdm9pZCBzZXRQb3J0ZXJEdWZmTW9kZShTa1BvcnRlckR1ZmY6Ok1vZGUg
cGRtKTsKKyAgICB2b2lkIHNldEZpbGxDb2xvcihTa0NvbG9yIGNvbG9yKTsKKyAgICB2b2lkIHNl
dFN0cm9rZVN0eWxlKFdlYkNvcmU6OlN0cm9rZVN0eWxlIHN0cm9rZXN0eWxlKTsKKyAgICB2b2lk
IHNldFN0cm9rZUNvbG9yKFNrQ29sb3Igc3Ryb2tlY29sb3IpOworICAgIHZvaWQgc2V0U3Ryb2tl
VGhpY2tuZXNzKGZsb2F0IHRoaWNrbmVzcyk7CisgICAgdm9pZCBzZXRUZXh0RHJhd2luZ01vZGUo
aW50IG1vZGUpOworICAgIHZvaWQgc2V0VXNlQW50aWFsaWFzaW5nKGJvb2wgZW5hYmxlKTsKKyAg
ICB2b2lkIHNldEdyYWRpZW50KFNrU2hhZGVyKik7CisgICAgdm9pZCBzZXRQYXR0ZXJuKFNrU2hh
ZGVyKik7CisgICAgdm9pZCBzZXREYXNoUGF0aEVmZmVjdChTa0Rhc2hQYXRoRWZmZWN0Kik7CisK
KyAgICBTa0RyYXdMb29wZXIqIGdldERyYXdMb29wZXIoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpT
dHJva2VTdHlsZSBnZXRTdHJva2VTdHlsZSgpIGNvbnN0OworICAgIGZsb2F0IGdldFN0cm9rZVRo
aWNrbmVzcygpIGNvbnN0OworICAgIGludCBnZXRUZXh0RHJhd2luZ01vZGUoKSBjb25zdDsKKwor
ICAgIC8vIFBhdGhzLgorICAgIHZvaWQgYmVnaW5QYXRoKCk7CisgICAgdm9pZCBhZGRQYXRoKGNv
bnN0IFNrUGF0aCYgcGF0aCk7CisgICAgY29uc3QgU2tQYXRoKiBjdXJyZW50UGF0aCgpIGNvbnN0
IHsgcmV0dXJuICZtX3BhdGg7IH0KKworICAgIFNrQ29sb3IgZmlsbENvbG9yKCkgY29uc3Q7CisK
KyAgICBza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzKCkgeyByZXR1cm4gbV9jYW52YXM7IH0K
KworICAgIC8vIFRPRE8oYnJldHR3KSB3aHkgaXMgdGhpcyBpbiB0aGlzIGNsYXNzPworICAgIHZv
aWQgZHJhd1JlY3QoU2tSZWN0IHJlY3QpOworCisgICAgLy8gVE9ETyhtYXJ1ZWwpOiBJJ20gc3Rp
bGwgdW5zdXJlIGhvdyBJIHdpbGwgc2VyaWFsaXplIHRoaXMgY2FsbC4KKyAgICB2b2lkIHBhaW50
U2tQYWludChjb25zdCBTa1JlY3QmIHJlY3QsIGNvbnN0IFNrUGFpbnQmIHBhaW50KTsKKworICAg
IGNvbnN0IFNrQml0bWFwKiBiaXRtYXAoKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIGNh
bnZhcyB1c2VkIGZvciBwYWludGluZywgTk9UIGd1YXJhbnRlZWQgdG8gYmUgbm9uLU5VTEwuCisg
ICAgLy8KKyAgICAvLyBXYXJuaW5nOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgc28gdGhl
IHVzZXJzIGFyZSByZW1pbmRlZCB0aGF0IHRoZXkKKyAgICAvLyBzaG91bGQgdXNlIHRoaXMgbGF5
ZXIgb2YgaW5kaXJlY3Rpb24gaW5zdGVhZCBvZiB1c2luZyB0aGUgY2FudmFzCisgICAgLy8gZGly
ZWN0bHkuIFRoaXMgaXMgdG8gaGVscCB3aXRoIHRoZSBldmVudHVhbCBzZXJpYWxpemF0aW9uLgor
ICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMoKSBjb25zdDsKKworICAgIC8vIFJldHVy
bnMgaWYgdGhlIGNvbnRleHQgaXMgYSBwcmludGluZyBjb250ZXh0IGluc3RlYWQgb2YgYSBkaXNw
bGF5CisgICAgLy8gY29udGV4dC4gQml0bWFwIHNob3VsZG4ndCBiZSByZXNhbXBsZWQgd2hlbiBw
cmludGluZyB0byBrZWVwIHRoZSBiZXN0CisgICAgLy8gcG9zc2libGUgcXVhbGl0eS4KKyAgICBi
b29sIElzUHJpbnRpbmcoKTsKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAgIEdka1NraWEq
IGdka19za2lhKCkgY29uc3QgeyByZXR1cm4gbV9nZGtza2lhOyB9CisjZW5kaWYKKworcHJpdmF0
ZToKKyAgICAvLyBEZWZpbmVzIGRyYXdpbmcgc3R5bGUuCisgICAgc3RydWN0IFN0YXRlOworCisg
ICAgLy8gTlVMTCBpbmRpY2F0ZXMgcGFpbnRpbmcgaXMgZGlzYWJsZWQuIE5ldmVyIGRlbGV0ZSB0
aGlzIG9iamVjdC4KKyAgICBza2lhOjpQbGF0Zm9ybUNhbnZhcyogbV9jYW52YXM7CisKKyAgICAv
LyBTdGF0ZXMgc3RhY2suIEVuYWJsZXMgbG9jYWwgZHJhd2luZyBzdGF0ZSBjaGFuZ2Ugd2l0aCBz
YXZlKCkvcmVzdG9yZSgpCisgICAgLy8gY2FsbHMuCisgICAgV1RGOjpWZWN0b3I8U3RhdGU+IG1f
c3RhdGVTdGFjazsKKyAgICAvLyBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGRyYXdpbmcgc3RhdGUu
IFRoaXMgaXMgYSBjYWNoZWQgdmFsdWUgb2YKKyAgICAvLyBtU3RhdGVTdGFjay5iYWNrKCkuCisg
ICAgU3RhdGUqIG1fc3RhdGU7CisKKyAgICAvLyBDdXJyZW50IHBhdGguCisgICAgU2tQYXRoIG1f
cGF0aDsKKworICAgIC8vIERpc2FsbG93IHRoZXNlLgorICAgIFBsYXRmb3JtQ29udGV4dFNraWEo
Y29uc3QgUGxhdGZvcm1Db250ZXh0U2tpYSYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFBs
YXRmb3JtQ29udGV4dFNraWEmKTsKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAgIC8vIEEg
cG9pbnRlciB0byBhIEdESyBEcmF3YWJsZSB3cmFwcGluZyBvZiB0aGlzIFNraWEgY2FudmFzCisg
ICAgR2RrU2tpYSogbV9nZGtza2lhOworI2VuZGlmCit9OworCisjZW5kaWYgIC8vIFBsYXRmb3Jt
Q29udGV4dFNraWFfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L1BsYXRmb3JtR3JhcGhpY3MuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QbGF0
Zm9ybUdyYXBoaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxZDdi
YgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QbGF0
Zm9ybUdyYXBoaWNzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAw
Ni0yMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGxhdGZvcm1H
cmFwaGljc19kCisjZGVmaW5lIFBsYXRmb3JtR3JhcGhpY3NfZAorCit0eXBlZGVmIGNsYXNzIFNr
U2hhZGVyKiBQbGF0Zm9ybUdyYWRpZW50OwordHlwZWRlZiBjbGFzcyBTa1NoYWRlciogUGxhdGZv
cm1QYXR0ZXJuOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvU2tpYUZvbnRXaW4uY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL1NraWFGb250V2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44
ZTJiYjVkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L1NraWFGb250V2luLmNwcApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAwNi0yMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDx3aW5k
b3dzLmg+CisKKyNpbmNsdWRlICJXVEYvTGlzdEhhc2hTZXQuaCIKKyNpbmNsdWRlICJXVEYvVmVj
dG9yLmgiCisKKyNpbmNsdWRlICJTa2lhRm9udFdpbi5oIgorCisjaW5jbHVkZSAiU2tDYW52YXMu
aCIKKyNpbmNsdWRlICJTa1BhaW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNw
YWNlIHsKKworc3RydWN0IENhY2hlZE91dGxpbmVLZXkgeworICAgIENhY2hlZE91dGxpbmVLZXko
KSA6IGZvbnQoTlVMTCksIGdseXBoKDApLCBwYXRoKE5VTEwpIHt9CisgICAgQ2FjaGVkT3V0bGlu
ZUtleShIRk9OVCBmLCBXT1JEIGcpIDogZm9udChmKSwgZ2x5cGgoZyksIHBhdGgoTlVMTCkge30K
KworICAgIEhGT05UIGZvbnQ7CisgICAgV09SRCBnbHlwaDsKKworICAgIC8vIFRoZSBsaWZldGlt
ZSBvZiB0aGlzIHBvaW50ZXIgaXMgbWFuYWdlZCBleHRlcm5hbGx5IHRvIHRoaXMgY2xhc3MuIEJl
IHN1cmUKKyAgICAvLyB0byBjYWxsIERlbGV0ZU91dGxpbmUgdG8gcmVtb3ZlIGl0ZW1zLgorICAg
IFNrUGF0aCogcGF0aDsKK307CisKK2NvbnN0IGJvb2wgb3BlcmF0b3I9PShjb25zdCBDYWNoZWRP
dXRsaW5lS2V5JiBhLCBjb25zdCBDYWNoZWRPdXRsaW5lS2V5JiBiKQoreworICAgIHJldHVybiBh
LmZvbnQgPT0gYi5mb250ICYmIGEuZ2x5cGggPT0gYi5nbHlwaDsKK30KKworc3RydWN0IENhY2hl
ZE91dGxpbmVLZXlIYXNoIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBDYWNoZWRP
dXRsaW5lS2V5JiBrZXkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBrZXlCeXRlczsKKyAgICAg
ICAgbWVtY3B5KCZrZXlCeXRlcywgJmtleS5mb250LCBzaXplb2YodW5zaWduZWQpKTsKKyAgICAg
ICAgcmV0dXJuIGtleUJ5dGVzICsga2V5LmdseXBoOworICAgIH0KKworICAgIHN0YXRpYyB1bnNp
Z25lZCBlcXVhbChjb25zdCBDYWNoZWRPdXRsaW5lS2V5JiBhLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBDYWNoZWRPdXRsaW5lS2V5JiBiKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGEuZm9udCA9PSBiLmZvbnQgJiYgYS5nbHlwaCA9PSBiLmdseXBoOworICAgIH0KKworICAgIHN0
YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1ZTsKK307
CisKK3R5cGVkZWYgTGlzdEhhc2hTZXQ8Q2FjaGVkT3V0bGluZUtleSwgQ2FjaGVkT3V0bGluZUtl
eUhhc2g+IE91dGxpbmVDYWNoZTsKK091dGxpbmVDYWNoZSBvdXRsaW5lQ2FjaGU7CisKKy8vIFRo
ZSBnbG9iYWwgbnVtYmVyIG9mIGdseXBoIG91dGxpbmVzIHdlJ2xsIGNhY2hlLgorY29uc3QgaW50
IG91dGxpbmVDYWNoZVNpemUgPSAyNTY7CisKK2lubGluZSBGSVhFRCBTa1NjYWxhclRvRklYRUQo
U2tTY2FsYXIgeCkKK3sKKyAgICBGSVhFRCBmaXhlZDsKKyAgICBTa0ZpeGVkIHNrRml4ZWQgPSBT
a1NjYWxhclRvRml4ZWQoeCk7CisgICAgbWVtY3B5KCZmaXhlZCwgJnNrRml4ZWQsIHNpemVvZihG
SVhFRCkpOworICAgIHJldHVybiBmaXhlZDsKK30KKworaW5saW5lIFNrU2NhbGFyIEZJWEVEVG9T
a1NjYWxhcihGSVhFRCBmaXhlZCkKK3sKKyAgICBTa0ZpeGVkIHNrRml4ZWQ7CisgICAgbWVtY3B5
KCZza0ZpeGVkLCAmZml4ZWQsIHNpemVvZihTa0ZpeGVkKSk7CisgICAgcmV0dXJuIFNrRml4ZWRU
b1NjYWxhcihza0ZpeGVkKTsKK30KKworLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhl
IGNhY2hlZCBvdXRsaW5lcywgYWxzbyBkZWxldGluZyB0aGUgcGF0aC4KK3ZvaWQgRGVsZXRlT3V0
bGluZShPdXRsaW5lQ2FjaGU6Oml0ZXJhdG9yIGRlbGV0ZU1lKQoreworICAgIGRlbGV0ZSBkZWxl
dGVNZS0+cGF0aDsKKyAgICBvdXRsaW5lQ2FjaGUucmVtb3ZlKGRlbGV0ZU1lKTsKK30KKwordm9p
ZCBBZGRQb2x5Q3VydmVUb1BhdGgoY29uc3QgVFRQT0xZQ1VSVkUqIHBvbHlDdXJ2ZSwgU2tQYXRo
KiBwYXRoKQoreworICAgIHN3aXRjaCAocG9seUN1cnZlLT53VHlwZSkgeworICAgIGNhc2UgVFRf
UFJJTV9MSU5FOgorICAgICAgICBmb3IgKFdPUkQgaSA9IDA7IGkgPCBwb2x5Q3VydmUtPmNwZng7
IGkrKykgeworICAgICAgICAgIHBhdGgtPmxpbmVUbyhGSVhFRFRvU2tTY2FsYXIocG9seUN1cnZl
LT5hcGZ4W2ldLngpLAorICAgICAgICAgICAgICAgICAgICAgICAtRklYRURUb1NrU2NhbGFyKHBv
bHlDdXJ2ZS0+YXBmeFtpXS55KSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBj
YXNlIFRUX1BSSU1fUVNQTElORToKKyAgICAgICAgLy8gRklYTUUoYnJldHR3KSBkb2Vzbid0IHRo
aXMgZHVwbGljYXRlIHBvaW50cyBpZiB3ZSBkbyB0aGUgbG9vcCA+IG9uY2U/CisgICAgICAgIGZv
ciAoV09SRCBpID0gMDsgaSA8IHBvbHlDdXJ2ZS0+Y3BmeCAtIDE7IGkrKykgeworICAgICAgICAg
ICAgU2tTY2FsYXIgYnggPSBGSVhFRFRvU2tTY2FsYXIocG9seUN1cnZlLT5hcGZ4W2ldLngpOwor
ICAgICAgICAgICAgU2tTY2FsYXIgYnkgPSBGSVhFRFRvU2tTY2FsYXIocG9seUN1cnZlLT5hcGZ4
W2ldLnkpOworCisgICAgICAgICAgICBTa1NjYWxhciBjeCA9IEZJWEVEVG9Ta1NjYWxhcihwb2x5
Q3VydmUtPmFwZnhbaSArIDFdLngpOworICAgICAgICAgICAgU2tTY2FsYXIgY3kgPSBGSVhFRFRv
U2tTY2FsYXIocG9seUN1cnZlLT5hcGZ4W2kgKyAxXS55KTsKKyAgICAgICAgICAgIGlmIChpIDwg
cG9seUN1cnZlLT5jcGZ4IC0gMikgeworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCB0aGUg
bGFzdCBwb2ludCwgY29tcHV0ZSBDLgorICAgICAgICAgICAgICAgIGN4ID0gU2tTY2FsYXJBdmUo
YngsIGN4KTsKKyAgICAgICAgICAgICAgICBjeSA9IFNrU2NhbGFyQXZlKGJ5LCBjeSk7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gZmxpcCB0aGUgeSBjb29yZGluYXRl
cyBzaW5jZSB0aGUgZm9udCdzIGNvb3JkaW5hdGUgc3lzdGVtIGlzCisgICAgICAgICAgICAvLyBm
bGlwcGVkIGZyb20gb3VycyB2ZXJ0aWNhbGx5LgorICAgICAgICAgICAgcGF0aC0+cXVhZFRvKGJ4
LCAtYnksIGN4LCAtY3kpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBU
VF9QUklNX0NTUExJTkU6CisgICAgICAgIC8vIEZJWE1FCisgICAgICAgIGJyZWFrOworICAgIH0K
K30KKworLy8gVGhlIHNpemUgb2YgdGhlIGdseXBoIG91dGxpbmUgYnVmZmVyLgorY29uc3QgaW50
IGdseXBoUGF0aEJ1ZmZlclNpemUgPSA0MDk2OworCisvLyBGaWxscyB0aGUgZ2l2ZW4gU2tQYXRo
IHdpdGggdGhlIG91dGxpbmUgZm9yIHRoZSBnaXZlbiBnbHlwaCBpbmRleC4gVGhlIGZvbnQKKy8v
IGN1cnJlbnRseSBzZWxlY3RlZCBpbnRvIHRoZSBnaXZlbiBEQyBpcyB1c2VkLiBSZXR1cm5zIHRy
dWUgb24gc3VjY2Vzcy4KK2Jvb2wgR2V0UGF0aEZvckdseXBoKEhEQyBkYywgV09SRCBnbHlwaCwg
U2tQYXRoKiBwYXRoKQoreworICAgIGNoYXIgYnVmZmVyW2dseXBoUGF0aEJ1ZmZlclNpemVdOwor
ICAgIEdMWVBITUVUUklDUyBnbTsKKyAgICBNQVQyIG1hdCA9IHt7MCwgMX0sIHswLCAwfSwgezAs
IDB9LCB7MCwgMX19OyAgLy8gRWFjaCBvbmUgaXMgKGZyYWN0LHZhbHVlKS4KKworICAgIERXT1JE
IHRvdGFsU2l6ZSA9IEdldEdseXBoT3V0bGluZVcoZGMsIGdseXBoLCBHR09fR0xZUEhfSU5ERVgg
fCBHR09fTkFUSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdt
LCBnbHlwaFBhdGhCdWZmZXJTaXplLCBidWZmZXIsICZtYXQpOworICAgIGlmICh0b3RhbFNpemUg
PT0gR0RJX0VSUk9SKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBjaGFyKiBj
dXJHbHlwaCA9IGJ1ZmZlcjsKKyAgICBjb25zdCBjaGFyKiBlbmRHbHlwaCA9ICZidWZmZXJbdG90
YWxTaXplXTsKKyAgICB3aGlsZSAoY3VyR2x5cGggPCBlbmRHbHlwaCkgeworICAgICAgICBjb25z
dCBUVFBPTFlHT05IRUFERVIqIHBvbHlIZWFkZXIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBUVFBPTFlHT05IRUFERVIqPihjdXJHbHlwaCk7CisgICAgICAgIHBhdGgtPm1v
dmVUbyhGSVhFRFRvU2tTY2FsYXIocG9seUhlYWRlci0+cGZ4U3RhcnQueCksCisgICAgICAgICAg
ICAgICAgICAgICAtRklYRURUb1NrU2NhbGFyKHBvbHlIZWFkZXItPnBmeFN0YXJ0LnkpKTsKKwor
ICAgICAgICBjb25zdCBjaGFyKiBjdXJQb2x5ID0gY3VyR2x5cGggKyBzaXplb2YoVFRQT0xZR09O
SEVBREVSKTsKKyAgICAgICAgY29uc3QgY2hhciogZW5kUG9seSA9IGN1ckdseXBoICsgcG9seUhl
YWRlci0+Y2I7CisgICAgICAgIHdoaWxlIChjdXJQb2x5IDwgZW5kUG9seSkgeworICAgICAgICAg
ICAgY29uc3QgVFRQT0xZQ1VSVkUqIHBvbHlDdXJ2ZSA9CisgICAgICAgICAgICAgICAgcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBUVFBPTFlDVVJWRSo+KGN1clBvbHkpOworICAgICAgICAgICAgQWRk
UG9seUN1cnZlVG9QYXRoKHBvbHlDdXJ2ZSwgcGF0aCk7CisgICAgICAgICAgICBjdXJQb2x5ICs9
IHNpemVvZihXT1JEKSAqIDIgKyBzaXplb2YoUE9JTlRGWCkgKiBwb2x5Q3VydmUtPmNwZng7Cisg
ICAgICAgIH0KKyAgICAgICAgY3VyR2x5cGggKz0gcG9seUhlYWRlci0+Y2I7CisgICAgfQorCisg
ICAgcGF0aC0+Y2xvc2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyBhIFNr
UGF0aCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlIGdseXBoIGluIHRoZSBnaXZlbiBmb250LiBU
aGUgZm9udAorLy8gc2hvdWxkIGJlIHNlbGVjdGVkIGludG8gdGhlIGdpdmVuIERDLiBUaGUgcmV0
dXJuZWQgcGF0aCBpcyBvd25lZCBieSB0aGUKKy8vIGhhc2h0YWJsZS4gUmV0dXJucyBOVUxMIG9u
IGVycm9yLgorY29uc3QgU2tQYXRoKiBHZXRDYWNoZWRQYXRoRm9yR2x5cGgoSERDIGhkYywgSEZP
TlQgZm9udCwgV09SRCBnbHlwaCkKK3sKKyAgICBDYWNoZWRPdXRsaW5lS2V5IGtleShmb250LCBn
bHlwaCk7CisgICAgT3V0bGluZUNhY2hlOjppdGVyYXRvciBmb3VuZCA9IG91dGxpbmVDYWNoZS5m
aW5kKGtleSk7CisgICAgaWYgKGZvdW5kICE9IG91dGxpbmVDYWNoZS5lbmQoKSkgeworICAgICAg
ICAvLyBLZWVwIGluIE1SVSBvcmRlciBieSByZW1vdmluZyAmIHJlaW5zZXJ0aW5nIHRoZSB2YWx1
ZS4KKyAgICAgICAga2V5ID0gKmZvdW5kOworICAgICAgICBvdXRsaW5lQ2FjaGUucmVtb3ZlKGZv
dW5kKTsKKyAgICAgICAgb3V0bGluZUNhY2hlLmFkZChrZXkpOworICAgICAgICByZXR1cm4ga2V5
LnBhdGg7CisgICAgfQorCisgICAga2V5LnBhdGggPSBuZXcgU2tQYXRoOworICAgIGlmICghR2V0
UGF0aEZvckdseXBoKGhkYywgZ2x5cGgsIGtleS5wYXRoKSkKKyAgICAgIHJldHVybiBOVUxMOwor
CisgICAgaWYgKG91dGxpbmVDYWNoZS5zaXplKCkgPiBvdXRsaW5lQ2FjaGVTaXplKSB7CisgICAg
ICAgIC8vIFRoZSBjYWNoZSBpcyB0b28gYmlnLCBmaW5kIHRoZSBvbGRlc3QgdmFsdWUgKGZpcnN0
IGluIHRoZSBsaXN0KS4KKyAgICAgICAgRGVsZXRlT3V0bGluZShvdXRsaW5lQ2FjaGUuYmVnaW4o
KSk7CisgICAgfQorCisgICAgb3V0bGluZUNhY2hlLmFkZChrZXkpOworICAgIHJldHVybiBrZXku
cGF0aDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgU2tpYURyYXdUZXh0KEhGT05UIGhm
b250LAorICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywKKyAgICAgICAgICAgICAg
ICAgIGNvbnN0IFNrUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgU2tQYWludCogcGFp
bnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBXT1JEKiBnbHlwaHMsCisgICAgICAgICAgICAg
ICAgICBjb25zdCBpbnQqIGFkdmFuY2VzLAorICAgICAgICAgICAgICAgICAgaW50IG51bV9nbHlw
aHMpCit7CisgICAgSERDIGRjID0gR2V0REMoMCk7CisgICAgSEdESU9CSiBvbGRfZm9udCA9IFNl
bGVjdE9iamVjdChkYywgaGZvbnQpOworCisgICAgY2FudmFzLT5zYXZlKCk7CisgICAgY2FudmFz
LT50cmFuc2xhdGUocG9pbnQuZlgsIHBvaW50LmZZKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbnVtX2dseXBoczsgaSsrKSB7CisgICAgICAgIGNvbnN0IFNrUGF0aCogcGF0aCA9IEdldENh
Y2hlZFBhdGhGb3JHbHlwaChkYywgaGZvbnQsIGdseXBoc1tpXSk7CisgICAgICAgIGlmICghcGF0
aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FudmFzLT5kcmF3UGF0aCgq
cGF0aCwgKnBhaW50KTsKKyAgICAgICAgY2FudmFzLT50cmFuc2xhdGUoYWR2YW5jZXNbaV0sIDAp
OworICAgIH0KKworICAgIGNhbnZhcy0+cmVzdG9yZSgpOworCisgICAgU2VsZWN0T2JqZWN0KGRj
LCBvbGRfZm9udCk7CisgICAgUmVsZWFzZURDKDAsIGRjKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworLyogVE9ETyhicmV0dHcpIGZpbmlzaCB0aGlzIGltcGxlbWVudGF0aW9uCitib29sIFNraWFE
cmF3Q29tcGxleFRleHQoSEZPTlQgZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTa0Nh
bnZhcyogY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUG9pbnQmIHBv
aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50CisgICAgICAgICAg
ICAgICAgICAgICAgICAgVUlOVCBmdU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgU0NSSVBUX0FOQUxZU0lTKiBwc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgV09SRCogcHdHbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNHbHlwaHMs
CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBhZHZhbmNlcywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGp1c3RpZmllcywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBHT0ZGU0VUKiBnbHlwaF9vZmZzZXRzKQoreworICAgIEhEQyBkYyA9IEdl
dERDKDApOworICAgIEhHRElPQkogb2xkX2ZvbnQgPSBTZWxlY3RPYmplY3QoZGMsIGhmb250KTsK
KworICAgIGNhbnZhcy0+c2F2ZSgpOworICAgIGNhbnZhcy0+dHJhbnNsYXRlKHBvaW50LmZYLCBw
b2ludC5mWSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNHbHlwaHM7IGkrKykgeworICAg
ICAgICBjYW52YXMtPnRyYW5zbGF0ZShnbHlwaF9vZmZzZXRzW2ldLmR1LCBnbHlwaF9vZmZzZXRz
W2ldLmR2KTsKKworCisgICAgICAgIAorCisgICAgICAgIC8vIFVuZG8gdGhlIG9mZnNldCBmb3Ig
dGhpcyBnbHlwaC4KKyAgICAgICAgY2FudmFzLT50cmFuc2xhdGUoLWdseXBoX29mZnNldHNbaV0u
ZHUsIC1nbHlwaF9vZmZzZXRzW2ldLmR2KTsKKworICAgICAgICAvLyBBbmQgYWR2YW5jZSB0byB3
aGVyZSB3ZSdyZSBkcmF3aW5nIHRoZSBuZXh0IG9uZS4gV2UgdXNlIHRoZSBqdXN0aWZpZXMKKyAg
ICAgICAgLy8gcnVuIHNpbmNlIHRoYXQgaXMgdGhlIGp1c3RpZmllZCBhZHZhbmNlcyBmb3IgZWFj
aCBjaGFyYWN0ZXIsIHJhdGhlciB0aGFuCisgICAgICAgIC8vIHRoZSBhZG52YWNlcyBvbmUuCisg
ICAgICAgIGNhbnZhcy0+dHJhbnNsYXRlKGp1c3RpZmllc1tpXSwgMCk7CisgICAgfQorCisgICAg
Y2FudmFzLT5yZXN0b3JlKCk7CisKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZF9mb250KTsKKyAg
ICBSZWxlYXNlREMoMCwgZGMpOworfSovCisKK3ZvaWQgUmVtb3ZlRm9udEZyb21Ta2lhRm9udFdp
bkNhY2hlKEhGT05UIGhmb250KQoreworICAgIC8vIExpc3RIYXNoU2V0IGlzbid0IHRoZSBncmVh
dGVzdCBzdHJ1Y3R1cmUgZm9yIGRlbGV0aW5nIHN0dWZmIG91dCBvZiwgYnV0CisgICAgLy8gcmVt
b3ZpbmcgZW50cmllcyB3aWxsIGJlIHJlbGF0aXZlbHkgcmFyZSAod2UgZG9uJ3QgcmVtb3ZlIGZv
bnRzIG11Y2gsIG5vcgorICAgIC8vIGRvIHdlIGRyYXcgb3V0IG93biBnbHlwaHMgdXNpbmcgdGhl
c2Ugcm91dGluZXMgbXVjaCBlaXRoZXIpLgorICAgIC8vCisgICAgLy8gV2Uga2VlcCBhIGxpc3Qg
b2YgYWxsIGdseXBocyB3ZSdyZSByZW1vdmluZyB3aGljaCB3ZSBkbyBpbiBhIHNlcGFyYXRlCisg
ICAgLy8gcGFzcy4KKyAgICBWZWN0b3I8Q2FjaGVkT3V0bGluZUtleT4gb3V0bGluZXNUb0RlbGV0
ZTsKKyAgICBmb3IgKE91dGxpbmVDYWNoZTo6aXRlcmF0b3IgaSA9IG91dGxpbmVDYWNoZS5iZWdp
bigpOworICAgICAgICAgaSAhPSBvdXRsaW5lQ2FjaGUuZW5kKCk7ICsraSkKKyAgICAgICAgb3V0
bGluZXNUb0RlbGV0ZS5hcHBlbmQoKmkpOworCisgICAgZm9yIChWZWN0b3I8Q2FjaGVkT3V0bGlu
ZUtleT46Oml0ZXJhdG9yIGkgPSBvdXRsaW5lc1RvRGVsZXRlLmJlZ2luKCk7CisgICAgICAgICBp
ICE9IG91dGxpbmVzVG9EZWxldGUuZW5kKCk7ICsraSkKKyAgICAgICAgRGVsZXRlT3V0bGluZShv
dXRsaW5lQ2FjaGUuZmluZCgqaSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFGb250V2luLmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYUZvbnRXaW4uaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc5ZWViCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFGb250V2luLmgKQEAgLTAsMCArMSw4OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
IAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpZm5kZWYgU2tpYUZvbnRfV2luX2gKKyNkZWZpbmUgU2tpYUZvbnRfV2luX2gKKwor
I2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx1c3AxMC5oPgorCitjbGFzcyBTa0NhbnZh
czsKK2NsYXNzIFNrUGFpbnQ7CitzdHJ1Y3QgU2tQb2ludDsKKworLy8gVGhpcyBmaWxlIHByb3Zp
Y2VzIFNraWEgZXF1aXZhbGVudHMgdG8gV2luZG93cyB0ZXh0IGRyYXdpbmcgZnVuY3Rpb25zLiBU
aGV5CisvLyB3aWxsIGdldCB0aGUgb3V0bGluZXMgZnJvbSBXaW5kb3dzIGFuZCBkcmF3IHRoZW4g
dXNpbmcgU2tpYSB1c2luZyB0aGUgZ2l2ZW4KKy8vIHBhcmFtZXRlcnMgaW4gdGhlIHBhaW50IGFy
Z3VtZW50cy4gVGhpcyBhbGxvd3MgbW9yZSBjb21wbGV4IGVmZmVjdHMgYW5kCisvLyB0cmFuc2Zv
cm1zIHRvIGJlIGRyYXduIHRoYW4gV2luZG93cyBhbGxvd3MuCisvLworLy8gVGhlc2UgZnVuY3Rp
b25zIHdpbGwgYmUgc2lnbmlmaWNhbnRseSBzbG93ZXIgdGhhbiBXaW5kb3dzIEdESSwgYW5kIHRo
ZSB0ZXh0CisvLyB3aWxsIGxvb2sgZGlmZmVyZW50IChubyBDbGVhclR5cGUpLCBzbyB1c2Ugb25s
eSB3aGVuIG5lY2Vzc2FyeS4KKy8vCisvLyBXaGVuIHlvdSBjYWxsIGEgU2tpYSogdGV4dCBkcmF3
aW5nIGZ1bmN0aW9uLCB2YXJpb3VzIGdseXBoIG91dGxpbmVzIHdpbGwgYmUKKy8vIGNhY2hlZC4g
QXMgYSByZXN1bHQsIHlvdSBzaG91bGQgY2FsbCBSZW1vdmVGb250RnJvbVNraWFGb250V2luQ2Fj
aGUgd2hlbgorLy8gdGhlIGZvbnQgaXMgZGVzdHJveWVkIHNvIHRoYXQgdGhlIGNhY2hlIGRvZXMg
bm90IG91dGxpdmUgdGhlIGZvbnQgKHNpbmNlIHRoZQorLy8gSEZPTlRzIGFyZSByZWN5Y2xlZCku
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEFuYWxvZyBvZiB0aGUgV2luZG93cyBHREkgZnVu
Y3Rpb24gRHJhd1RleHQsIGV4Y2VwdCB1c2luZyB0aGUgZ2l2ZW4gU2tQYWludAorLy8gYXR0cmli
dXRlcyBmb3IgdGhlIHRleHQuIFNlZSBhYm92ZSBmb3IgbW9yZS4KKy8vCisvLyBSZXR1cm5zIHRy
dWUgb2YgdGhlIHRleHQgd2FzIGRyYXduIHN1Y2Nlc3NmdWxseS4gRmFsc2UgaW5kaWNhdGVzIGFu
IGVycm9yCisvLyBmcm9tIFdpbmRvd3MuCitib29sIFNraWFEcmF3VGV4dChIRk9OVCBoZm9udCwK
KyAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsCisgICAgICAgICAgICAgICAgICBj
b25zdCBTa1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50LAor
ICAgICAgICAgICAgICAgICAgY29uc3QgV09SRCogZ2x5cGhzLAorICAgICAgICAgICAgICAgICAg
Y29uc3QgaW50KiBhZHZhbmNlcywKKyAgICAgICAgICAgICAgICAgIGludCBudW1fZ2x5cGhzKTsK
KworLy8gVGhpcyBtaXJyb3JzIHRoZSBmZWF0dXJlcyBvZiBTY3JpcHRUZXh0T3V0LgorLyogVE9E
TyhicmV0dHcpIGZpbmlzaCB0aGlzIGltcGxlbWVudGF0aW9uLgorYm9vbCBTa2lhRHJhd0NvbXBs
ZXhUZXh0KEhGT05UIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNh
bnZhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1BvaW50JiBwb2ludCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBVSU5UIGZ1T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBT
Q1JJUFRfQU5BTFlTSVMqIHBzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXT1JE
KiBwd0dseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY0dseXBocywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGFkdmFuY2VzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IGludCoganVzdGlmaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEdPRkZTRVQqIGdseXBoX29mZnNldHMpOworKi8KKworLy8gUmVtb3ZlcyBhbnkgY2Fj
aGVkIGdseXBocyBmcm9tIHRoZSBvdXRsaW5lIGNhY2hlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdp
dmVuCisvLyBmb250IGhhbmRsZS4KK3ZvaWQgUmVtb3ZlRm9udEZyb21Ta2lhRm9udFdpbkNhY2hl
KEhGT05UIGhmb250KTsKKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBT
a2lhRm9udF9XaW5faApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L1NraWFVdGlscy5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxz
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWU4MmEyCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFVdGlscy5jcHAK
QEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiU2tp
YVV0aWxzLmgiCisKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1
ZmZlci5oIgorI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tDb2xvclByaXYuaCIK
KyNpbmNsdWRlICJTa01hdHJpeC5oIgorI2luY2x1ZGUgIlNrUmVnaW9uLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBXZWJDb3JlUG9pbnRUb1NraWFQb2ludChjb25zdCBXZWJDb3Jl
OjpGbG9hdFBvaW50JiBzcmMsIFNrUG9pbnQqIGRzdCkKK3sKKyAgICBkc3QtPnNldChXZWJDb3Jl
RmxvYXRUb1NrU2NhbGFyKHNyYy54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkp
KTsKK30KKwordm9pZCBXZWJDb3JlUmVjdFRvU2tpYVJlY3QoY29uc3QgV2ViQ29yZTo6SW50UmVj
dCYgc3JjLCBTa1JlY3QqIGRzdCkKK3sKKyAgICBkc3QtPnNldChTa0ludFRvU2NhbGFyKHNyYy54
KCkpLAorICAgICAgICAgICAgIFNrSW50VG9TY2FsYXIoc3JjLnkoKSksCisgICAgICAgICAgICAg
U2tJbnRUb1NjYWxhcihzcmMueCgpICsgc3JjLndpZHRoKCkpLAorICAgICAgICAgICAgIFNrSW50
VG9TY2FsYXIoc3JjLnkoKSArIHNyYy5oZWlnaHQoKSkpOworfQorCit2b2lkIFdlYkNvcmVSZWN0
VG9Ta2lhUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBzcmMsIFNrSVJlY3QqIGRzdCkKK3sK
KyAgICBkc3QtPnNldChzcmMueCgpLAorICAgICAgICAgICAgIHNyYy55KCksCisgICAgICAgICAg
ICAgc3JjLngoKSArIHNyYy53aWR0aCgpLAorICAgICAgICAgICAgIHNyYy55KCkgKyBzcmMuaGVp
Z2h0KCkpOworfQorCit2b2lkIFdlYkNvcmVSZWN0VG9Ta2lhUmVjdChjb25zdCBXZWJDb3JlOjpG
bG9hdFJlY3QmIHNyYywgU2tSZWN0KiBkc3QpCit7CisgICAgZHN0LT5zZXQoV2ViQ29yZUZsb2F0
VG9Ta1NjYWxhcihzcmMueCgpKSwKKyAgICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFy
KHNyYy55KCkpLAorICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc3JjLngoKSAr
IHNyYy53aWR0aCgpKSwKKyAgICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55
KCkgKyBzcmMuaGVpZ2h0KCkpKTsKK30KKwordm9pZCBXZWJDb3JlUmVjdFRvU2tpYVJlY3QoY29u
c3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBzcmMsIFNrSVJlY3QqIGRzdCkKK3sKKyAgICBkc3QtPnNl
dChTa1NjYWxhclJvdW5kKFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc3JjLngoKSkpLAorICAgICAg
ICAgICAgIFNrU2NhbGFyUm91bmQoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzcmMueSgpKSksCisg
ICAgICAgICAgICAgU2tTY2FsYXJSb3VuZChXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy54KCkg
KyBzcmMud2lkdGgoKSkpLAorICAgICAgICAgICAgIFNrU2NhbGFyUm91bmQoV2ViQ29yZUZsb2F0
VG9Ta1NjYWxhcihzcmMueSgpICsgc3JjLmhlaWdodCgpKSkpOworfQorCitzdGF0aWMgY29uc3Qg
c3RydWN0IENvbXBvc2l0T3BUb1BvcnRlckR1ZmZNb2RlIHsKKyAgICB1aW50OF90IG1Db21wb3Np
dE9wOworICAgIHVpbnQ4X3QgbVBvcnRlckR1ZmZNb2RlOworfSBnTWFwQ29tcG9zaXRPcHNUb1Bv
cnRlckR1ZmZNb2Rlc1tdID0geworICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlQ2xlYXIsICAgICAg
ICAgICBTa1BvcnRlckR1ZmY6OmtDbGVhcl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3Np
dGVDb3B5LCAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6a1NyY092ZXJfTW9kZSB9LCAgLy8gVE9E
TworICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlU291cmNlT3ZlciwgICAgICBTa1BvcnRlckR1ZmY6
OmtTcmNPdmVyX01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBvc2l0ZVNvdXJjZUluLCAgICAg
ICAgU2tQb3J0ZXJEdWZmOjprU3JjSW5fTW9kZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRl
U291cmNlT3V0LCAgICAgICBTa1BvcnRlckR1ZmY6OmtTcmNPdXRfTW9kZSB9LAorICAgIHsgV2Vi
Q29yZTo6Q29tcG9zaXRlU291cmNlQXRvcCwgICAgICBTa1BvcnRlckR1ZmY6OmtTcmNBVG9wX01v
ZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBvc2l0ZURlc3RpbmF0aW9uT3ZlciwgU2tQb3J0ZXJE
dWZmOjprRHN0T3Zlcl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVEZXN0aW5hdGlv
bkluLCAgIFNrUG9ydGVyRHVmZjo6a0RzdEluX01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBv
c2l0ZURlc3RpbmF0aW9uT3V0LCAgU2tQb3J0ZXJEdWZmOjprRHN0T3V0X01vZGUgfSwKKyAgICB7
IFdlYkNvcmU6OkNvbXBvc2l0ZURlc3RpbmF0aW9uQXRvcCwgU2tQb3J0ZXJEdWZmOjprRHN0QVRv
cF9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVYT1IsICAgICAgICAgICAgIFNrUG9y
dGVyRHVmZjo6a1hvcl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVQbHVzRGFya2Vy
LCAgICAgIFNrUG9ydGVyRHVmZjo6a0Rhcmtlbl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21w
b3NpdGVIaWdobGlnaHQsICAgICAgIFNrUG9ydGVyRHVmZjo6a1NyY092ZXJfTW9kZSB9LCAgLy8g
VE9ETworICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlUGx1c0xpZ2h0ZXIsICAgICBTa1BvcnRlckR1
ZmY6OmtMaWdodGVuX01vZGUgfQorfTsKKworU2tQb3J0ZXJEdWZmOjpNb2RlIFdlYkNvcmVDb21w
b3NpdGVUb1NraWFDb21wb3NpdGUoV2ViQ29yZTo6Q29tcG9zaXRlT3BlcmF0b3Igb3ApCit7Cisg
ICAgY29uc3QgQ29tcG9zaXRPcFRvUG9ydGVyRHVmZk1vZGUqIHRhYmxlID0gZ01hcENvbXBvc2l0
T3BzVG9Qb3J0ZXJEdWZmTW9kZXM7CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IFNLX0FSUkFZX0NPVU5UKGdNYXBDb21wb3NpdE9wc1RvUG9ydGVyRHVmZk1vZGVzKTsgaSsrKSB7
CisgICAgICAgIGlmICh0YWJsZVtpXS5tQ29tcG9zaXRPcCA9PSBvcCkgeworICAgICAgICAgICAg
cmV0dXJuIChTa1BvcnRlckR1ZmY6Ok1vZGUpdGFibGVbaV0ubVBvcnRlckR1ZmZNb2RlOworICAg
ICAgICB9CisgICAgfQorCisgICAgU2tERUJVR0YoKCJHcmFwaGljc0NvbnRleHQ6OnNldENvbXBv
c2l0ZU9wZXJhdGlvbiB1a25vd24gQ29tcG9zaXRPcGVyYXRvciAlZFxuIiwgb3ApKTsKKyAgICBy
ZXR1cm4gU2tQb3J0ZXJEdWZmOjprU3JjT3Zlcl9Nb2RlOyAvLyBmYWxsLWJhY2sKK30KKworc3Rh
dGljIFU4Q1BVIEludlNjYWxlQnl0ZShVOENQVSBjb21wb25lbnQsIHVpbnQzMl90IHNjYWxlKQor
eworICAgIFNrQVNTRVJUKGNvbXBvbmVudCA9PSAodWludDhfdCljb21wb25lbnQpOworICAgIHJl
dHVybiAoY29tcG9uZW50ICogc2NhbGUgKyAweDgwMDApID4+IDE2OworfQorCitTa0NvbG9yIFNr
UE1Db2xvclRvQ29sb3IoU2tQTUNvbG9yIHBtKQoreworICAgIGlmICgwID09IHBtKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICAKKyAgICB1bnNpZ25lZCBhID0gU2tHZXRQYWNrZWRBMzIocG0pOwor
ICAgIHVpbnQzMl90IHNjYWxlID0gKDI1NSA8PCAxNikgLyBhOworICAgIAorICAgIHJldHVybiBT
a0NvbG9yU2V0QVJHQihhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZTY2FsZUJ5dGUo
U2tHZXRQYWNrZWRSMzIocG0pLCBzY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIElu
dlNjYWxlQnl0ZShTa0dldFBhY2tlZEczMihwbSksIHNjYWxlKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgSW52U2NhbGVCeXRlKFNrR2V0UGFja2VkQjMyKHBtKSwgc2NhbGUpKTsKK30KKwor
V2ViQ29yZTo6Q29sb3IgU2tQTUNvbG9yVG9XZWJDb3JlQ29sb3IoU2tQTUNvbG9yIHBtKQorewor
ICAgIHJldHVybiBTa1BNQ29sb3JUb0NvbG9yKHBtKTsKK30KKwordm9pZCBJbnRlcnNlY3RSZWN0
QW5kUmVnaW9uKGNvbnN0IFNrUmVnaW9uJiByZWdpb24sIGNvbnN0IFNrUmVjdCYgc3JjX3JlY3Qs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tSZWN0KiBkZXN0X3JlY3QpIHsKKyAgICAv
LyBUaGUgY2xpcGVyYXRvciByZXF1aXJlcyBhbiBpbnQgcmVjdCwgc28gd2Ugcm91bmQgb3V0Lgor
ICAgIFNrSVJlY3Qgc3JjX3JlY3Rfcm91bmRlZDsKKyAgICBzcmNfcmVjdC5yb3VuZE91dCgmc3Jj
X3JlY3Rfcm91bmRlZCk7CisKKyAgICAvLyBUaGUgQ2xpcGVyYXRvciB3aWxsIGl0ZXJhdGUgb3Zl
ciBhIGJ1bmNoIG9mIHJlY3RzIHdoZXJlIG91ciB0cmFuc2Zvcm1lZAorICAgIC8vIHJlY3QgYW5k
IHRoZSBjbGlwcGluZyByZWdpb24gKHdoaWNoIG1heSBiZSBub24tc3F1YXJlKSBvdmVybGFwLgor
ICAgIFNrUmVnaW9uOjpDbGlwZXJhdG9yIGNsaXBlcmF0b3IocmVnaW9uLCBzcmNfcmVjdF9yb3Vu
ZGVkKTsKKyAgICBpZiAoY2xpcGVyYXRvci5kb25lKCkpIHsKKyAgICAgICAgZGVzdF9yZWN0LT5z
ZXRFbXB0eSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IHRoZSB1bmlv
biBvZiBhbGwgdmlzaWJsZSByZWN0cyBpbiB0aGUgY2xpcCB0aGF0IG92ZXJsYXAgb3VyIGJpdG1h
cC4KKyAgICBTa0lSZWN0IGN1cl92aXNpYmxlX3JlY3QgPSBjbGlwZXJhdG9yLnJlY3QoKTsKKyAg
ICBjbGlwZXJhdG9yLm5leHQoKTsKKyAgICB3aGlsZSAoIWNsaXBlcmF0b3IuZG9uZSgpKSB7Cisg
ICAgICAgIGN1cl92aXNpYmxlX3JlY3Quam9pbihjbGlwZXJhdG9yLnJlY3QoKSk7CisgICAgICAg
IGNsaXBlcmF0b3IubmV4dCgpOworICAgIH0KKworICAgIGRlc3RfcmVjdC0+c2V0KGN1cl92aXNp
YmxlX3JlY3QpOworfQorCit2b2lkIENsaXBSZWN0VG9DYW52YXMoY29uc3QgU2tDYW52YXMmIGNh
bnZhcywgY29uc3QgU2tSZWN0JiBzcmNfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBTa1Jl
Y3QqIGRlc3RfcmVjdCkgeworICAgIC8vIFRyYW5zbGF0ZSBpbnRvIHRoZSBjYW52YXMnIGNvb3Jk
aW5hdGUgc3BhY2UuIFRoaXMgaXMgd2hlcmUgdGhlIGNsaXBwaW5nCisgICAgLy8gcmVnaW9uIGFw
cGxpZXMuCisgICAgU2tSZWN0IHRyYW5zZm9ybWVkX3NyYzsKKyAgICBjYW52YXMuZ2V0VG90YWxN
YXRyaXgoKS5tYXBSZWN0KCZ0cmFuc2Zvcm1lZF9zcmMsIHNyY19yZWN0KTsKKworICAgIC8vIERv
IHRoZSBpbnRlcnNlY3Rpb24uCisgICAgU2tSZWN0IHRyYW5zZm9ybWVkX2Rlc3Q7CisgICAgSW50
ZXJzZWN0UmVjdEFuZFJlZ2lvbihjYW52YXMuZ2V0VG90YWxDbGlwKCksIHRyYW5zZm9ybWVkX3Ny
YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm1lZF9kZXN0KTsKKworICAg
IC8vIE5vdyB0cmFuc2Zvcm0gaXQgYmFjayBpbnRvIHdvcmxkIHNwYWNlLgorICAgIFNrTWF0cml4
IGludmVyc2VfdHJhbnNmb3JtOworICAgIGNhbnZhcy5nZXRUb3RhbE1hdHJpeCgpLmludmVydCgm
aW52ZXJzZV90cmFuc2Zvcm0pOworICAgIGludmVyc2VfdHJhbnNmb3JtLm1hcFJlY3QoZGVzdF9y
ZWN0LCB0cmFuc2Zvcm1lZF9kZXN0KTsKK30KKworYm9vbCBTa1BhdGhDb250YWluc1BvaW50KFNr
UGF0aCogb3JpZ19wYXRoLCBXZWJDb3JlOjpGbG9hdFBvaW50IHBvaW50LCBTa1BhdGg6OkZpbGxU
eXBlIGZ0KQoreworICAgIFNrUmVnaW9uICAgIHJnbiwgY2xpcDsKKworICAgIFNrUGF0aDo6Rmls
bFR5cGUgb3JpZ19mdCA9IG9yaWdfcGF0aC0+Z2V0RmlsbFR5cGUoKTsgICAgLy8gc2F2ZQorCisg
ICAgY29uc3QgU2tQYXRoKiBwYXRoID0gb3JpZ19wYXRoOworICAgIFNrUGF0aCBzY2FsZWRfcGF0
aDsKKyAgICBpbnQgc2NhbGUgPSAxOworCisgICAgU2tSZWN0IGJvdW5kczsKKyAgICBvcmlnX3Bh
dGgtPmNvbXB1dGVCb3VuZHMoJmJvdW5kcywgU2tQYXRoOjprRmFzdF9Cb3VuZHNUeXBlKTsKKwor
ICAgIC8vIFdlIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gZmFsc2UgaWYgdGhlIHBvaW50IGlzIG91
dHNpZGUgdGhlIGJvdW5kaW5nIHJlY3QKKyAgICBpZiAoIWJvdW5kcy5jb250YWlucyhTa0Zsb2F0
VG9TY2FsYXIocG9pbnQueCgpKSwgU2tGbG9hdFRvU2NhbGFyKHBvaW50LnkoKSkpKQorICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgb3JpZ19wYXRoLT5zZXRGaWxsVHlwZShmdCk7CisKKyAgICAv
LyBTa2lhIGhhcyB0cm91YmxlIHdpdGggY29vcmRpbmF0ZXMgY2xvc2UgdG8gdGhlIG1heCBzaWdu
ZWQgMTYtYml0IHZhbHVlcworICAgIC8vIElmIHdlIGhhdmUgdGhvc2UsIHdlIG5lZWQgdG8gc2Nh
bGUuIAorICAgIC8vCisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY29kZSBvbmNlIFNraWEgaXMg
cGF0Y2hlZCB0byB3b3JrIHByb3Blcmx5IHdpdGggbGFyZ2UKKyAgICAvLyB2YWx1ZXMKKyAgICBj
b25zdCBTa1NjYWxhciBrTWF4Q29vcmRpbmF0ZSA9IFNrSW50VG9TY2FsYXIoMTw8MTUpOworICAg
IFNrU2NhbGFyIGJpZ2dlc3RfY29vcmQgPSBzdGQ6Om1heChzdGQ6Om1heChzdGQ6Om1heCgKKyAg
ICAgIGJvdW5kcy5mUmlnaHQsIGJvdW5kcy5mQm90dG9tKSwgLWJvdW5kcy5mTGVmdCksIC1ib3Vu
ZHMuZlRvcCk7CisKKyAgICBpZiAoYmlnZ2VzdF9jb29yZCA+IGtNYXhDb29yZGluYXRlKSB7Cisg
ICAgICBzY2FsZSA9IFNrU2NhbGFyQ2VpbChTa1NjYWxhckRpdihiaWdnZXN0X2Nvb3JkLCBrTWF4
Q29vcmRpbmF0ZSkpOworCisgICAgICBTa01hdHJpeCBtOworICAgICAgbS5zZXRTY2FsZShTa1Nj
YWxhckludmVydChTa0ludFRvU2NhbGFyKHNjYWxlKSksIAorICAgICAgICAgICAgICAgICBTa1Nj
YWxhckludmVydChTa0ludFRvU2NhbGFyKHNjYWxlKSkpOworICAgICAgb3JpZ19wYXRoLT50cmFu
c2Zvcm0obSwgJnNjYWxlZF9wYXRoKTsKKyAgICAgIHBhdGggPSAmc2NhbGVkX3BhdGg7CisgICAg
fQorCisgICAgaW50IHggPSAoaW50KWZsb29yZihwb2ludC54KCkgLyBzY2FsZSk7CisgICAgaW50
IHkgPSAoaW50KWZsb29yZihwb2ludC55KCkgLyBzY2FsZSk7CisgICAgY2xpcC5zZXRSZWN0KHgs
IHksIHggKyAxLCB5ICsgMSk7CisKKyAgICBib29sIGNvbnRhaW5zID0gcmduLnNldFBhdGgoKnBh
dGgsIGNsaXApOworCisgICAgb3JpZ19wYXRoLT5zZXRGaWxsVHlwZShvcmlnX2Z0KTsgICAgLy8g
cmVzdG9yZQorICAgIHJldHVybiBjb250YWluczsKK30KKworR3JhcGhpY3NDb250ZXh0KiBzY3Jh
dGNoQ29udGV4dCgpCit7CisgICAgc3RhdGljIEltYWdlQnVmZmVyKiBzY3JhdGNoID0gTlVMTDsK
KyAgICBpZiAoIXNjcmF0Y2gpCisgICAgICAgIHNjcmF0Y2ggPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRl
KEludFNpemUoMSwgMSksIGZhbHNlKS5yZWxlYXNlKCk7CisgICAgLy8gV2UgZG9uJ3QgYm90aGVy
IGNoZWNraW5nIGZvciBmYWlsdXJlIGNyZWF0aW5nIHRoZSBJbWFnZUJ1ZmZlciwgc2luY2Ugb3Vy
CisgICAgLy8gSW1hZ2VCdWZmZXIgaW5pdGlhbGl6ZXIgd29uJ3QgZmFpbC4KKyAgICByZXR1cm4g
c2NyYXRjaC0+Y29udGV4dCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFVdGlscy5oIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmQ4ZDkwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxzLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoYykgMjAwNi0yMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8v
IFRoaXMgZmlsZSBkZWNsYXJlcyBoZWxwZXIgcm91dGluZXMgZm9yIHVzaW5nIFNraWEgaW4gV2Vi
S2l0LgorCisjaWZuZGVmIFNraWFVdGlsc19oCisjZGVmaW5lIFNraWFVdGlsc19oCisKKyNpbmNs
dWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIlNrUGF0aC5oIgorI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgorCitjbGFzcyBTa0Nh
bnZhczsKK2NsYXNzIFNrUmVnaW9uOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIENvbnZl
cnRzIGEgV2ViQ29yZSBjb21wb3NpdCBvcGVyYXRpb24gKFdlYkNvcmU6OkNvbXBvc2l0ZSopIHRv
IHRoZQorLy8gY29ycmVzcG9uZGluZyBTa2lhIHR5cGUuCitTa1BvcnRlckR1ZmY6Ok1vZGUgV2Vi
Q29yZUNvbXBvc2l0ZVRvU2tpYUNvbXBvc2l0ZShXZWJDb3JlOjpDb21wb3NpdGVPcGVyYXRvcik7
CisKKy8vIG1vdmUgdGhpcyBndXkgaW50byBTa0NvbG9yLmgKK1NrQ29sb3IgU2tQTUNvbG9yVG9D
b2xvcihTa1BNQ29sb3IgcG0pOworCisvLyBDb252ZXJ0cyBBbmRyb2lkIGNvbG9ycyB0byBXZWJL
aXQgb25lcy4KK1dlYkNvcmU6OkNvbG9yIFNrUE1Db2xvclRvV2ViQ29yZUNvbG9yKFNrUE1Db2xv
ciBwbSk7CisKKy8vIFNraWEgaGFzIHByb2JsZW1zIHdoZW4gcGFzc2VkIGluZmluaXRlLCBldGMg
ZmxvYXRzLCBmaWx0ZXIgdGhlbSB0byAwLgoraW5saW5lIFNrU2NhbGFyIFdlYkNvcmVGbG9hdFRv
U2tTY2FsYXIoY29uc3QgZmxvYXQmIGYpIHsKKyAgcmV0dXJuIFNrRmxvYXRUb1NjYWxhcihpc2Zp
bml0ZShmKSA/IGYgOiAwKTsKK30KKworaW5saW5lIFNrU2NhbGFyIFdlYkNvcmVEb3VibGVUb1Nr
U2NhbGFyKGNvbnN0IGRvdWJsZSYgZCkgeworICByZXR1cm4gU2tEb3VibGVUb1NjYWxhcihpc2Zp
bml0ZShkKSA/IGQgOiAwKTsKK30KKworLy8gSW50ZXJzZWN0cyB0aGUgZ2l2ZW4gc291cmNlIHJl
Y3Qgd2l0aCB0aGUgcmVnaW9uLCByZXR1cm5pbmcgdGhlIHNtYWxsZXN0CisvLyByZWN0YW5ndWxh
ciByZWdpb24gdGhhdCBlbmNvbXBhc2VzIHRoZSByZXN1bHQuCisvLworLy8gc3JjX3JlY3QgYW5k
IGRlc3RfcmVjdCBjYW4gYmUgdGhlIHNhbWUuCit2b2lkIEludGVyc2VjdFJlY3RBbmRSZWdpb24o
Y29uc3QgU2tSZWdpb24mIHJlZ2lvbiwgY29uc3QgU2tSZWN0JiBzcmNfcmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBTa1JlY3QqIGRlc3RfcmVjdCk7CisKKy8vIENvbXB1dGVzIHRo
ZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCwgd2hpY2ggd2hlbiBkcmF3biB0byB0aGUgZ2l2ZW4g
Y2FudmFzLAorLy8gd2lsbCBjb3ZlciB0aGUgc2FtZSBhcmVhIGFzIHRoZSBzb3VyY2UgcmVjdGFu
Z2xlLiBJdCB3aWxsIGNsaXAgdG8gdGhlIGNhbnZhcycKKy8vIGNsaXAsIGRvaW5nIHRoZSBuZWNl
c3NhcnkgY29vcmRpbmF0ZSB0cmFuc2Zvcm1zLgorLy8KKy8vIHNyY19yZWN0IGFuZCBkZXN0X3Jl
Y3QgY2FuIGJlIHRoZSBzYW1lLgordm9pZCBDbGlwUmVjdFRvQ2FudmFzKGNvbnN0IFNrQ2FudmFz
JiBjYW52YXMsIGNvbnN0IFNrUmVjdCYgc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAg
U2tSZWN0KiBkZXN0X3JlY3QpOworCisvLyBEZXRlcm1pbmUgaWYgYSBnaXZlbiBXZWJLaXQgcG9p
bnQgaXMgY29udGFpbmVkIGluIGEgcGF0aAorYm9vbCBTa1BhdGhDb250YWluc1BvaW50KFNrUGF0
aCogb3JpZ19wYXRoLCBXZWJDb3JlOjpGbG9hdFBvaW50IHBvaW50LCBTa1BhdGg6OkZpbGxUeXBl
IGZ0KTsKKworLy8gUmV0dXJucyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIDF4MSBHcmFwaGljc0Nv
bnRleHQgaW50ZW5kZWQgZm9yIHRlbXBvcmFyeQorLy8gb3BlcmF0aW9ucy4gUGxlYXNlIHNhdmUo
KSB0aGUgc3RhdGUgYW5kIHJlc3RvcmUoKSBpdCB3aGVuIHlvdSdyZSBkb25lIHdpdGgKKy8vIHRo
ZSBjb250ZXh0LgorR3JhcGhpY3NDb250ZXh0KiBzY3JhdGNoQ29udGV4dCgpOworCit9ICAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIFNraWFVdGlsc19oCg==
</data>
<flag name="review"
          id="12557"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26472</attachid>
            <date>2009-01-06 14:02:00 -0800</date>
            <delta_ts>2009-01-06 14:59:57 -0800</delta_ts>
            <desc>Add WebCore/svg/graphics/skia files</desc>
            <filename>skia-svg.patch</filename>
            <type>text/plain</type>
            <size>23902</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGI1NzM1Ny4uZWVhOGVlZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMiBAQAorMjAwOS0wMS0wNiAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMzE0NworICAgICAgICBBZGQgc3ZnL2dyYXBoaWNzL3NraWEgZmlsZXMuCisKKyAgICAg
ICAgKiBzdmcvZ3JhcGhpY3Mvc2tpYS9SZW5kZXJQYXRoU2tpYS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMpOgorICAgICAgICAqIHN2Zy9n
cmFwaGljcy9za2lhL1NWR1BhaW50U2VydmVyR3JhZGllbnRTa2lhLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpTa2lhR3JhZGllbnRCdWlsZGVyOjpTa2lhR3JhZGllbnRCdWlsZGVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlNraWFHcmFkaWVudEJ1aWxkZXI6On5Ta2lhR3JhZGllbnRCdWls
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlNraWFHcmFkaWVudEJ1aWxkZXI6OmNvbG9ycyk6Cisg
ICAgICAgIChXZWJDb3JlOjpTa2lhR3JhZGllbnRCdWlsZGVyOjpwb3MpOgorICAgICAgICAoV2Vi
Q29yZTo6U2tpYUdyYWRpZW50QnVpbGRlcjo6Y291bnQpOgorICAgICAgICAoV2ViQ29yZTo6U1ZH
UGFpbnRTZXJ2ZXJHcmFkaWVudDo6c2V0dXApOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9za2lh
L1NWR1BhaW50U2VydmVyUGF0dGVyblNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlNWR1BhaW50U2VydmVyUGF0dGVybjo6c2V0dXApOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9z
a2lhL1NWR1BhaW50U2VydmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U1ZH
UGFpbnRTZXJ2ZXI6OmRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUGFpbnRTZXJ2ZXI6OnRl
YXJkb3duKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyOjpyZW5kZXJQYXRoKToK
KyAgICAgICAgKiBzdmcvZ3JhcGhpY3Mvc2tpYS9TVkdSZXNvdXJjZUZpbHRlclNraWEuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jlc291cmNlRmlsdGVyOjpjcmVhdGVQbGF0Zm9y
bURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUmVzb3VyY2VGaWx0ZXI6OnByZXBhcmVGaWx0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUmVzb3VyY2VGaWx0ZXI6OmFwcGx5RmlsdGVyKToK
KyAgICAgICAgKiBzdmcvZ3JhcGhpY3Mvc2tpYS9TVkdSZXNvdXJjZU1hc2tlclNraWEuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jlc291cmNlTWFza2VyOjphcHBseU1hc2spOgor
CiAyMDA5LTAxLTA2ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBC
dWlsZCBmaXggb25seSwgbm8gcmV2aWV3LgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9zdmcvZ3JhcGhp
Y3Mvc2tpYS9SZW5kZXJQYXRoU2tpYS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1Jl
bmRlclBhdGhTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI1
NmUzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9zdmcvZ3JhcGhpY3Mvc2tpYS9SZW5kZXJQ
YXRoU2tpYS5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisg
KiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5o
IgorI2luY2x1ZGUgIlJlbmRlclBhdGguaCIKKyNpbmNsdWRlICJTa2lhVXRpbHMuaCIKKyNpbmNs
dWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAiU2tQYXRoLmgiCisjaW5jbHVkZSAiU1ZHUGFpbnRT
ZXJ2ZXIuaCIKKworI2lmIEVOQUJMRShTVkcpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworYm9v
bCBSZW5kZXJQYXRoOjpzdHJva2VDb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgYm9v
bCByZXF1aXJlc1N0cm9rZSkgY29uc3QKK3sKKyAgICBpZiAocGF0aCgpLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHJlcXVpcmVzU3Ryb2tlICYmICFTVkdQYWlu
dFNlcnZlcjo6c3Ryb2tlUGFpbnRTZXJ2ZXIoc3R5bGUoKSwgdGhpcykpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIEdyYXBoaWNzQ29udGV4dCogc2NyYXRjaCA9IHNjcmF0Y2hDb250ZXh0
KCk7CisgICAgc2NyYXRjaC0+c2F2ZSgpOworICAgIGFwcGx5U3Ryb2tlU3R5bGVUb0NvbnRleHQo
c2NyYXRjaCwgc3R5bGUoKSwgdGhpcyk7CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIHNjcmF0
Y2gtPnBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yU3Ryb2tpbmcoJnBhaW50LCAwLCAw
KTsKKyAgICBTa1BhdGggc3Ryb2tlUGF0aDsKKyAgICBwYWludC5nZXRGaWxsUGF0aCgqcGF0aCgp
LnBsYXRmb3JtUGF0aCgpLCAmc3Ryb2tlUGF0aCk7CisgICAgYm9vbCBjb250YWlucyA9IFNrUGF0
aENvbnRhaW5zUG9pbnQoJnN0cm9rZVBhdGgsIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGUpOworCisgICAgc2Ny
YXRjaC0+cmVzdG9yZSgpOworICAgIHJldHVybiBjb250YWluczsKK30KKworfQorCisjZW5kaWYg
Ly8gRU5BQkxFKFNWRykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZH
UGFpbnRTZXJ2ZXJHcmFkaWVudFNraWEuY3BwIGIvV2ViQ29yZS9zdmcvZ3JhcGhpY3Mvc2tpYS9T
VkdQYWludFNlcnZlckdyYWRpZW50U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uNjI3MGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvc3ZnL2dyYXBoaWNz
L3NraWEvU1ZHUGFpbnRTZXJ2ZXJHcmFkaWVudFNraWEuY3BwCkBAIC0wLDAgKzEsMjM4IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiU1ZHUGFp
bnRTZXJ2ZXJHcmFkaWVudC5oIgorI2luY2x1ZGUgIlNWR1BhaW50U2VydmVyTGluZWFyR3JhZGll
bnQuaCIKKyNpbmNsdWRlICJTVkdQYWludFNlcnZlclJhZGlhbEdyYWRpZW50LmgiCisKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUg
IlJlbmRlclBhdGguaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlNWR0dy
YWRpZW50RWxlbWVudC5oIgorCisjaW5jbHVkZSAiU2tHcmFkaWVudFNoYWRlci5oIgorI2luY2x1
ZGUgIlNrUGF0aC5oIgorI2luY2x1ZGUgIlNrTWF0cml4LmgiCisjaW5jbHVkZSAiU2tpYVV0aWxz
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgYnkgbGlu
ZWFyICYgcmFkaWFsIGdyYWRpZW50CitjbGFzcyBTa2lhR3JhZGllbnRCdWlsZGVyCit7CitwdWJs
aWM6CisgICAgU2tpYUdyYWRpZW50QnVpbGRlcihjb25zdCBWZWN0b3I8U1ZHR3JhZGllbnRTdG9w
PiYgc3RvcHMsIGZsb2F0IG9wYWNpdHkpIHsKKyAgICAgICAgY291bnRfID0gc3RvcHMuc2l6ZSgp
OworICAgICAgICB1bnNpZ25lZCBjdXIgPSAwOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhl
IGdyYWRpZW50IGRvZXNuJ3Qgc3BhbiB0aGUgZnVsbCB3aWR0aCwgYWRkIHBzZXVkby1zdG9wcwor
ICAgICAgICAvLyBhdCB0aGUgZW5kcG9pbnRzCisgICAgICAgIGlmIChzdG9wc1swXS5maXJzdCA+
IDApIHsKKyAgICAgICAgICAgIGNvdW50XysrOworICAgICAgICAgICAgY3VyKys7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoc3RvcHNbc3RvcHMuc2l6ZSgpLTFdLmZpcnN0IDwgMSkgCisgICAg
ICAgICAgICBjb3VudF8rKzsKKworICAgICAgICBjb2xvcnNfID0gbmV3IFNrQ29sb3JbY291bnRf
XTsKKyAgICAgICAgcG9zXyA9IG5ldyBTa1NjYWxhcltjb3VudF9dOworICAgICAgICBmbG9hdCBs
YXN0ID0gMC4wOworCisgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgV2ViS2l0LXByb3ZpZGVk
IGFycmF5IG9mIFNWRyBncmFkaWVudCBzdG9wcyBhbmQKKyAgICAgICAgLy8gcHV0IGl0IGluIGEg
Zm9ybWF0IHN1aXRhYmxlIGZvciBwcm92aWRpbmcgdG8gU2tpYQorICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgc3RvcHMuc2l6ZSgpOyArK2ksICsrY3VyKSB7CisgICAgICAgICAgICBm
bG9hdCBvZmZzZXQgPSBzdG9wc1tpXS5maXJzdDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yID0g
c3RvcHNbaV0uc2Vjb25kOworCisgICAgICAgICAgICBjb2xvcnNfW2N1cl09U2tDb2xvclNldEFS
R0Ioc3RhdGljX2Nhc3Q8aW50PihvcGFjaXR5KmNvbG9yLmFscGhhKCkpLAorICAgICAgICAgICAg
ICBjb2xvci5yZWQoKSwKKyAgICAgICAgICAgICAgY29sb3IuZ3JlZW4oKSwKKyAgICAgICAgICAg
ICAgY29sb3IuYmx1ZSgpKTsKKyAgICAgICAgICAgIGxhc3Q9cG9zX1tjdXJdPXN0ZDo6bWF4KGxh
c3QsIG9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RvcHNbMF0uZmlyc3QgPiAw
KSB7CisgICAgICAgICAgICBjb2xvcnNfWzBdID0gY29sb3JzX1sxXTsKKyAgICAgICAgICAgIHBv
c19bMF0gPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdG9wc1tzdG9wcy5zaXplKCktMV0u
Zmlyc3QgPCAxKSB7CisgICAgICAgICAgICBjb2xvcnNfW2NvdW50Xy0xXSA9IGNvbG9yc19bY291
bnRfLTJdOworICAgICAgICAgICAgcG9zX1tjb3VudF8tMV0gPSAxOworICAgICAgICB9CisgICAg
fQorCisgICAgflNraWFHcmFkaWVudEJ1aWxkZXIoKSB7CisgICAgICAgIGRlbGV0ZVtdIGNvbG9y
c187CisgICAgICAgIGRlbGV0ZVtdIHBvc187CisgICAgfQorCisgICAgY29uc3QgU2tDb2xvciog
Y29sb3JzKCkgY29uc3QgeyByZXR1cm4gY29sb3JzXzsgfQorICAgIGNvbnN0IFNrU2NhbGFyKiBw
b3MoKSBjb25zdCB7IHJldHVybiBwb3NfOyB9CisgICAgdW5zaWduZWQgY291bnQoKSBjb25zdCB7
IHJldHVybiBjb3VudF87IH0KKworcHJpdmF0ZToKKyAgICBTa0NvbG9yKiBjb2xvcnNfOworICAg
IFNrU2NhbGFyKiBwb3NfOworICAgIHVuc2lnbmVkIGNvdW50XzsKK307CisKKy8vIFRPRE8oYnJl
dHR3KTogRmlndXJlIG91dCB3aGV0aGVyIHdlIHN0aWxsIG5lZWQgdGhpcyBtZXRob2QKKy8vIFRo
aXMgbWV0aG9kIGlzIGFsd2F5cyBjb21waWxlZCBvdXQsIHdoZW4gbGlua2VyIHBpY2tzIGl0cyBj
b3VudGVycGFydCBmcm9tCisvLyBTVkdQYWludFNlcnZlckdyYWRpZW50LmNwcCwgc28gd2UncmUg
Y29tbWVudGluZyBpdCBvdXQgZm9yIG5vdyB0byBhdm9pZAorLy8gbGluayB3YXJuaW5ncy4KKy8v
IGh0dHA6Ly9jcmJ1Zy5jb20vNTgwNAorI2lmIDAgCisKK2Jvb2wgU1ZHUGFpbnRTZXJ2ZXJHcmFk
aWVudDo6c2V0dXAoR3JhcGhpY3NDb250ZXh0KiYgY29udGV4dCwgCisgICAgY29uc3QgUmVuZGVy
T2JqZWN0KiBvYmplY3QsIAorICAgIFNWR1BhaW50VGFyZ2V0VHlwZSB0eXBlLCAKKyAgICBib29s
IGlzUGFpbnRpbmdUZXh0KSBjb25zdAoreworICAgIG1fb3duZXJFbGVtZW50LT5idWlsZEdyYWRp
ZW50KCk7CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBvYmplY3QtPnN0eWxlKCk7CisgICAg
Ym9vbCBpc0ZpbGxlZCA9IAorICAgICAgICAodHlwZSAmIEFwcGx5VG9GaWxsVGFyZ2V0VHlwZSkg
JiYgCisgICAgICAgICBzdHlsZS0+c3ZnU3R5bGUoKS0+aGFzRmlsbCgpOworICAgIGJvb2wgaXNT
dHJva2VkID0gCisgICAgICAgICh0eXBlICYgQXBwbHlUb1N0cm9rZVRhcmdldFR5cGUpICYmIAor
ICAgICAgICAgc3R5bGUtPnN2Z1N0eWxlKCktPmhhc1N0cm9rZSgpOworCisgICAgaWYoIWdyYWRp
ZW50U3RvcHMoKS5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmKGdyYWRp
ZW50U3RvcHMoKS5zaXplKCk9PTEpIHsKKyAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKGdy
YWRpZW50U3RvcHMoKVswXS5zZWNvbmQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICAvLyBDcmVhdGUgYSBncmFkaWVudCBidWlsZGVyIGhlbHBlciB0byBnZW5lcmF0ZSB0aGUg
ZGF0YSAKKyAgICAvLyB3ZSdsbCBuZWVkIHRvIHByb3ZpZGUgU2tpYQorICAgIFNraWFHcmFkaWVu
dEJ1aWxkZXIgYnVpbGRlcihncmFkaWVudFN0b3BzKCksIAorICAgICAgICBpc0ZpbGxlZCA/IHN0
eWxlLT5zdmdTdHlsZSgpLT5maWxsT3BhY2l0eSgpIDogCisgICAgICAgICAgICAgICAgICAgc3R5
bGUtPnN2Z1N0eWxlKCktPnN0cm9rZU9wYWNpdHkoKSk7CisKKyAgICBTa1NoYWRlcjo6VGlsZU1v
ZGUgdGlsZV9tb2RlOworCisgICAgLy8gQ29udmVydCBTVkcgc3ByZWFkIG1vZGVzIHRvIFNraWEg
dGlsZSBtb2RlcworICAgIHN3aXRjaChzcHJlYWRNZXRob2QoKSkKKyAgICB7CisgICAgZGVmYXVs
dDoKKyAgICBjYXNlIFNwcmVhZE1ldGhvZFBhZDoKKyAgICAgICAgdGlsZV9tb2RlID0gU2tTaGFk
ZXI6OmtDbGFtcF9UaWxlTW9kZTsgYnJlYWs7CisgICAgY2FzZSBTcHJlYWRNZXRob2RSZWZsZWN0
OgorICAgICAgICB0aWxlX21vZGUgPSBTa1NoYWRlcjo6a01pcnJvcl9UaWxlTW9kZTsgYnJlYWs7
CisgICAgY2FzZSBTcHJlYWRNZXRob2RSZXBlYXQ6CisgICAgICAgIHRpbGVfbW9kZSA9IFNrU2hh
ZGVyOjprUmVwZWF0X1RpbGVNb2RlOyBicmVhazsKKyAgICB9CisKKyAgICBTa1NoYWRlciogc2hh
ZGVyID0gTlVMTDsKKworICAgIFNrTWF0cml4IG1hdHJpeDsKKworICAgIC8vIENhbGN1bGF0ZSBh
IG1hdHJpeCB0byB0cmFuc2Zvcm0gYSBncmFkaWVudCB0byBmaXQgdGhlIGJvdW5kaW5nIGJveAor
ICAgIGlmIChib3VuZGluZ0JveE1vZGUoKSkgeworICAgICAgICBtYXRyaXgucmVzZXQoKTsKKyAg
ICAgICAgU2tSZWN0IHJjID0gYm91bmRpbmdCb3hGb3JDdXJyZW50U3Ryb2tlKGNvbnRleHQpOwor
CisgICAgICAgIG1hdHJpeC5wcmVUcmFuc2xhdGUocmMuZkxlZnQsIHJjLmZUb3ApOworICAgICAg
ICBtYXRyaXgucHJlU2NhbGUocmMud2lkdGgoKSwgcmMuaGVpZ2h0KCkpOworICAgICAgICBtYXRy
aXgucHJlQ29uY2F0KGdyYWRpZW50VHJhbnNmb3JtKCkpOworICAgIH0gZWxzZQorICAgICAgICBt
YXRyaXggPSBncmFkaWVudFRyYW5zZm9ybSgpOworCisgICAgaWYgKHRoaXMtPnR5cGUoKSA9PSBM
aW5lYXJHcmFkaWVudFBhaW50U2VydmVyKSB7CisgICAgICAgIGNvbnN0IFNWR1BhaW50U2VydmVy
TGluZWFyR3JhZGllbnQqIGxpbmVhciA9IAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qg
U1ZHUGFpbnRTZXJ2ZXJMaW5lYXJHcmFkaWVudCo+KHRoaXMpOworCisgICAgICAgIFNrUG9pbnQg
cHRzWzJdOworCisgICAgICAgIHB0c1swXS5mWCA9IGxpbmVhci0+Z3JhZGllbnRTdGFydCgpLngo
KTsKKyAgICAgICAgcHRzWzBdLmZZID0gbGluZWFyLT5ncmFkaWVudFN0YXJ0KCkueSgpOworICAg
ICAgICBwdHNbMV0uZlggPSBsaW5lYXItPmdyYWRpZW50RW5kKCkueCgpOworICAgICAgICBwdHNb
MV0uZlkgPSBsaW5lYXItPmdyYWRpZW50RW5kKCkueSgpOworCisgICAgICAgIHNoYWRlciA9IFNr
R3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsIAorICAgICAgICAgICAgYnVpbGRlci5j
b2xvcnMoKSwgYnVpbGRlci5wb3MoKSwgYnVpbGRlci5jb3VudCgpLCB0aWxlX21vZGUpOworICAg
IH0gZWxzZSBpZiAodGhpcy0+dHlwZSgpID09IFJhZGlhbEdyYWRpZW50UGFpbnRTZXJ2ZXIpIHsK
KyAgICAgICAgY29uc3QgU1ZHUGFpbnRTZXJ2ZXJSYWRpYWxHcmFkaWVudCogcmFkaWFsID0gCisg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBTVkdQYWludFNlcnZlclJhZGlhbEdyYWRpZW50
Kj4odGhpcyk7CisKKyAgICAgICAgU2tQb2ludCBjZW50ZXI7CisgICAgICAgIFNrU2NhbGFyIHJh
ZGl1czsKKworICAgICAgICBjZW50ZXIuZlggPSByYWRpYWwtPmdyYWRpZW50Q2VudGVyKCkueCgp
OworICAgICAgICBjZW50ZXIuZlkgPSByYWRpYWwtPmdyYWRpZW50Q2VudGVyKCkueSgpOworICAg
ICAgICByYWRpdXMgPSByYWRpYWwtPmdyYWRpZW50UmFkaXVzKCk7CisKKyAgICAgICAgc2hhZGVy
ID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlUmFkaWFsKAorICAgICAgICAgICAgY2VudGVyLCBy
YWRpdXMsIGJ1aWxkZXIuY29sb3JzKCksIGJ1aWxkZXIucG9zKCksIAorICAgICAgICAgICAgYnVp
bGRlci5jb3VudCgpLCB0aWxlX21vZGUpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BhaW50aW5nVGV4dCkgeworICAgICAgICBpZiAo
aXNGaWxsZWQpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnNldFRleHREcmF3aW5nTW9kZShjVGV4
dEZpbGwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3Ryb2tlZCkgeworICAgICAgICAg
ICAgY29udGV4dC0+c2V0VGV4dERyYXdpbmdNb2RlKGNUZXh0U3Ryb2tlKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGlmIChpc1N0cm9rZWQpIHsKKyAgICAgICAgYXBwbHlTdHJva2VTdHlsZVRv
Q29udGV4dChjb250ZXh0LCBzdHlsZSwgb2JqZWN0KTsKKyAgICB9CisKKyAgICBpZiAoc2hhZGVy
KSB7CisgICAgICAgIHNoYWRlci0+c2V0TG9jYWxNYXRyaXgobWF0cml4KTsKKyAgICAgICAgY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPnNldEdyYWRpZW50KHNoYWRlcik7CisKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisjZW5kaWYKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvc3Zn
L2dyYXBoaWNzL3NraWEvU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuU2tpYS5jcHAgYi9XZWJDb3JlL3N2
Zy9ncmFwaGljcy9za2lhL1NWR1BhaW50U2VydmVyUGF0dGVyblNraWEuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWNkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3N2Zy9ncmFwaGljcy9za2lhL1NWR1BhaW50U2VydmVyUGF0dGVyblNraWEuY3BwCkBAIC0w
LDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFt
ZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAq
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
CisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFNWRykKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2lu
Y2x1ZGUgIlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlBhdHRlcm4uaCIKKyNpbmNsdWRlICJT
VkdQYXR0ZXJuRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR1BhaW50U2VydmVyUGF0dGVybi5oIgor
CisjaW5jbHVkZSAiU2tTaGFkZXIuaCIKKyNpbmNsdWRlICJTa2lhVXRpbHMuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitib29sIFNWR1BhaW50U2VydmVyUGF0dGVybjo6c2V0dXAoR3JhcGhp
Y3NDb250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvYmplY3QsIFNWR1BhaW50
VGFyZ2V0VHlwZSB0eXBlLCBib29sIGlzUGFpbnRpbmdUZXh0KSBjb25zdAoreworICAgIFJlbmRl
clN0eWxlKiBzdHlsZSA9IG9iamVjdC0+c3R5bGUoKTsKKworICAgIC8vIEJ1aWxkIHBhdHRlcm4g
dGlsZSwgcGFzc2luZyBkZXN0aW5hdGlvbiBvYmplY3QgYm91bmRpbmcgYm94CisgICAgRmxvYXRS
ZWN0IHRhcmdldFJlY3Q7CisgICAgaWYgKGlzUGFpbnRpbmdUZXh0KSB7CisgICAgICAgIEludFJl
Y3QgdGV4dEJvdW5kYXJ5ID0gY29uc3RfY2FzdDxSZW5kZXJPYmplY3QqPihvYmplY3QpLT5hYnNv
bHV0ZUJvdW5kaW5nQm94UmVjdCgpOworICAgICAgICB0YXJnZXRSZWN0ID0gb2JqZWN0LT5hYnNv
bHV0ZVRyYW5zZm9ybSgpLmludmVyc2UoKS5tYXBSZWN0KHRleHRCb3VuZGFyeSk7CisgICAgfSBl
bHNlCisgICAgICAgIHRhcmdldFJlY3QgPSBvYmplY3QtPnJlbGF0aXZlQkJveChmYWxzZSk7CisK
KyAgICBtX293bmVyRWxlbWVudC0+YnVpbGRQYXR0ZXJuKHRhcmdldFJlY3QpOworCisgICAgaWYg
KCF0aWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFmZmluZVRyYW5zZm9ybSB0
cmFuc2Zvcm0gPSBwYXR0ZXJuVHJhbnNmb3JtKCk7CisgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZShw
YXR0ZXJuQm91bmRhcmllcygpLngoKSwgcGF0dGVybkJvdW5kYXJpZXMoKS55KCkpOworCisgICAg
UmVmUHRyPFBhdHRlcm4+IHBhdHRlcm4oUGF0dGVybjo6Y3JlYXRlKHRpbGUoKS0+aW1hZ2UoKSwg
dHJ1ZSwgdHJ1ZSkpOworCisgICAgaWYgKCh0eXBlICYgQXBwbHlUb0ZpbGxUYXJnZXRUeXBlKSAm
JiBzdHlsZS0+c3ZnU3R5bGUoKS0+aGFzRmlsbCgpKSB7CisgICAgICAgIGNvbnRleHQtPnNldEZp
bGxQYXR0ZXJuKHBhdHRlcm4pOworICAgICAgICBpZiAoaXNQYWludGluZ1RleHQpIAorICAgICAg
ICAgICAgY29udGV4dC0+c2V0VGV4dERyYXdpbmdNb2RlKGNUZXh0RmlsbCk7CisgICAgfQorCisg
ICAgaWYgKCh0eXBlICYgQXBwbHlUb1N0cm9rZVRhcmdldFR5cGUpICYmIHN0eWxlLT5zdmdTdHls
ZSgpLT5oYXNTdHJva2UoKSkgeworICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VQYXR0ZXJuKHBh
dHRlcm4pOworICAgICAgICBhcHBseVN0cm9rZVN0eWxlVG9Db250ZXh0KGNvbnRleHQsIHN0eWxl
LCBvYmplY3QpOworICAgICAgICBpZiAoaXNQYWludGluZ1RleHQpIAorICAgICAgICAgICAgY29u
dGV4dC0+c2V0VGV4dERyYXdpbmdNb2RlKGNUZXh0U3Ryb2tlKTsKKyAgICB9CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZHUGFpbnRTZXJ2ZXJTa2lhLmNwcCBiL1dl
YkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZHUGFpbnRTZXJ2ZXJTa2lhLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFmODc3Ci0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9zdmcvZ3JhcGhpY3Mvc2tpYS9TVkdQYWludFNlcnZlclNraWEuY3BwCkBAIC0wLDAgKzEs
NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRl
ICJTVkdQYWludFNlcnZlci5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiUmVuZGVyUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNp
bmNsdWRlICJTa2lhVXRpbHMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFNWR1Bh
aW50U2VydmVyOjpkcmF3KEdyYXBoaWNzQ29udGV4dComIGNvbnRleHQsIGNvbnN0IFJlbmRlck9i
amVjdCogb2JqZWN0LCBTVkdQYWludFRhcmdldFR5cGUgdHlwZSkgY29uc3QKK3sKKyAgICBpZiAo
IXNldHVwKGNvbnRleHQsIG9iamVjdCwgdHlwZSkpCisgICAgICAgIHJldHVybjsKKworICAgIHJl
bmRlclBhdGgoY29udGV4dCwgb2JqZWN0LCB0eXBlKTsKKyAgICB0ZWFyZG93bihjb250ZXh0LCBv
YmplY3QsIHR5cGUpOworfQorCit2b2lkIFNWR1BhaW50U2VydmVyOjp0ZWFyZG93bihHcmFwaGlj
c0NvbnRleHQqJiBjb250ZXh0LCBjb25zdCBSZW5kZXJPYmplY3QqLCBTVkdQYWludFRhcmdldFR5
cGUsIGJvb2wgaXNQYWludGluZ1RleHQpIGNvbnN0Cit7CisgICAgLy8gV2ViS2l0IGltcGxpY2l0
bHkgZXhwZWN0cyB1cyB0byByZXNldCB0aGUgcGF0aC4KKyAgICAvLyBGb3IgZXhhbXBsZSBpbiBm
aWxsQW5kU3Ryb2tlUGF0aCgpIG9mIFJlbmRlclBhdGguY3BwIHRoZSBwYXRoIGlzIAorICAgIC8v
IGFkZGVkIGJhY2sgdG8gdGhlIGNvbnRleHQgYWZ0ZXIgZmlsbGluZy4gVGhpcyBpcyBiZWNhdXNl
IGludGVybmFsbHkgaXQKKyAgICAvLyBjYWxscyBDR0NvbnRleHRGaWxsUGF0aCgpIHdoaWNoIGNs
b3NlcyB0aGUgcGF0aC4KKyAgICBjb250ZXh0LT5iZWdpblBhdGgoKTsKKyAgICBjb250ZXh0LT5w
bGF0Zm9ybUNvbnRleHQoKS0+c2V0R3JhZGllbnQoTlVMTCk7CisgICAgY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCktPnNldFBhdHRlcm4oTlVMTCk7Cit9CisKK3ZvaWQgU1ZHUGFpbnRTZXJ2ZXI6
OnJlbmRlclBhdGgoR3JhcGhpY3NDb250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyT2JqZWN0
KiBvYmplY3QsIFNWR1BhaW50VGFyZ2V0VHlwZSB0eXBlKSBjb25zdAoreworICAgIFJlbmRlclN0
eWxlKiByZW5kZXJTdHlsZSA9IG9iamVjdCA/IG9iamVjdC0+c3R5bGUoKSA6IE5VTEw7CisKKyAg
ICBpZiAoKHR5cGUgJiBBcHBseVRvRmlsbFRhcmdldFR5cGUpICYmICghcmVuZGVyU3R5bGUgfHwg
cmVuZGVyU3R5bGUtPnN2Z1N0eWxlKCktPmhhc0ZpbGwoKSkpCisgICAgICAgIGNvbnRleHQtPmZp
bGxQYXRoKCk7CisKKyAgICBpZiAoKHR5cGUgJiBBcHBseVRvU3Ryb2tlVGFyZ2V0VHlwZSkgJiYg
KCFyZW5kZXJTdHlsZSB8fCByZW5kZXJTdHlsZS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpKQor
ICAgICAgICBjb250ZXh0LT5zdHJva2VQYXRoKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1NWR1Jl
c291cmNlRmlsdGVyU2tpYS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1NWR1Jlc291
cmNlRmlsdGVyU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0
ZWI0YgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZHUmVz
b3VyY2VGaWx0ZXJTa2lhLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpZiBFTkFCTEUoU1ZHKSAmJiBFTkFCTEUoU1ZHX0ZJTFRFUlMpCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJTVkdSZXNvdXJjZUZpbHRlci5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK1NWR1Jlc291cmNlRmlsdGVyUGxhdGZvcm1EYXRhKiBTVkdSZXNvdXJj
ZUZpbHRlcjo6Y3JlYXRlUGxhdGZvcm1EYXRhKCkKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9p
ZCBTVkdSZXNvdXJjZUZpbHRlcjo6cHJlcGFyZUZpbHRlcihHcmFwaGljc0NvbnRleHQqJiwgY29u
c3QgRmxvYXRSZWN0JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNWR1Jl
c291cmNlRmlsdGVyOjphcHBseUZpbHRlcihHcmFwaGljc0NvbnRleHQqJiwgY29uc3QgRmxvYXRS
ZWN0JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFC
TEUoU1ZHKSAmJiBFTkFCTEUoU1ZHX0ZJTFRFUlMpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3N2Zy9n
cmFwaGljcy9za2lhL1NWR1Jlc291cmNlTWFza2VyU2tpYS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFw
aGljcy9za2lhL1NWR1Jlc291cmNlTWFza2VyU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uMDBhYTQ5MwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvc3ZnL2dy
YXBoaWNzL3NraWEvU1ZHUmVzb3VyY2VNYXNrZXJTa2lhLmNwcApAQCAtMCwwICsxLDU5IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiU1ZHUmVz
b3VyY2VNYXNrZXIuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCit2b2lkIFNWR1Jlc291cmNlTWFza2VyOjphcHBseU1hc2soR3JhcGhpY3ND
b250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ0JveCkKK3sKKyAgLy8gVE9ETyhqaGFh
cyk6IGltcGxlbWVudCBtZQorI2lmIDAKKyAgICBjYWlyb190KiBjciA9IGNvbnRleHQtPnBsYXRm
b3JtQ29udGV4dCgpOworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IG1hc2soKS0+c3Vy
ZmFjZSgpOworICAgIGlmICghc3VyZmFjZSkKKyAgICAgICAgcmV0dXJuOworICAgIGNhaXJvX3Bh
dHRlcm5fdCogbWFzayA9IGNhaXJvX3BhdHRlcm5fY3JlYXRlX2Zvcl9zdXJmYWNlKHN1cmZhY2Up
OworICAgIGNhaXJvX21hc2soY3IsIG1hc2spOworICAgIGNhaXJvX3BhdHRlcm5fZGVzdHJveSht
YXNrKTsKKyNlbmRpZgorICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmCg==
</data>
<flag name="review"
          id="12558"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26476</attachid>
            <date>2009-01-06 14:59:57 -0800</date>
            <delta_ts>2009-01-06 15:08:09 -0800</delta_ts>
            <desc>Add WebCore/svg/graphics/skia files v2</desc>
            <filename>skia-svg.patch</filename>
            <type>text/plain</type>
            <size>15422</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGI1NzM1Ny4uNTU4YWY1YSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNSBAQAorMjAwOS0wMS0wNiAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMzE0NworICAgICAgICBBZGQgc3ZnL2dyYXBoaWNzL3NraWEgZmlsZXMuCisKKyAgICAg
ICAgKiBzdmcvZ3JhcGhpY3Mvc2tpYS9SZW5kZXJQYXRoU2tpYS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMpOgorICAgICAgICAqIHN2Zy9n
cmFwaGljcy9za2lhL1NWR1BhaW50U2VydmVyUGF0dGVyblNraWEuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyUGF0dGVybjo6c2V0dXApOgorICAgICAgICAqIHN2
Zy9ncmFwaGljcy9za2lhL1NWR1BhaW50U2VydmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6U1ZHUGFpbnRTZXJ2ZXI6OmRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUGFp
bnRTZXJ2ZXI6OnRlYXJkb3duKToKKyAgICAgICAgKFdlYkNvcmU6OlNWR1BhaW50U2VydmVyOjpy
ZW5kZXJQYXRoKToKKyAgICAgICAgKiBzdmcvZ3JhcGhpY3Mvc2tpYS9TVkdSZXNvdXJjZUZpbHRl
clNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jlc291cmNlRmlsdGVyOjpj
cmVhdGVQbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUmVzb3VyY2VGaWx0ZXI6
OnByZXBhcmVGaWx0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHUmVzb3VyY2VGaWx0ZXI6OmFw
cGx5RmlsdGVyKToKKyAgICAgICAgKiBzdmcvZ3JhcGhpY3Mvc2tpYS9TVkdSZXNvdXJjZU1hc2tl
clNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNWR1Jlc291cmNlTWFza2VyOjph
cHBseU1hc2spOgorCiAyMDA5LTAxLTA2ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4K
IAogICAgICAgICBCdWlsZCBmaXggb25seSwgbm8gcmV2aWV3LgpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9zdmcvZ3JhcGhpY3Mvc2tpYS9SZW5kZXJQYXRoU2tpYS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFw
aGljcy9za2lhL1JlbmRlclBhdGhTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi44NGI1NmUzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9zdmcvZ3JhcGhpY3Mv
c2tpYS9SZW5kZXJQYXRoU2tpYS5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1D
b250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlJlbmRlclBhdGguaCIKKyNpbmNsdWRlICJTa2lhVXRp
bHMuaCIKKyNpbmNsdWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAiU2tQYXRoLmgiCisjaW5jbHVk
ZSAiU1ZHUGFpbnRTZXJ2ZXIuaCIKKworI2lmIEVOQUJMRShTVkcpCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworYm9vbCBSZW5kZXJQYXRoOjpzdHJva2VDb250YWlucyhjb25zdCBGbG9hdFBvaW50
JiBwb2ludCwgYm9vbCByZXF1aXJlc1N0cm9rZSkgY29uc3QKK3sKKyAgICBpZiAocGF0aCgpLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHJlcXVpcmVzU3Ryb2tl
ICYmICFTVkdQYWludFNlcnZlcjo6c3Ryb2tlUGFpbnRTZXJ2ZXIoc3R5bGUoKSwgdGhpcykpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEdyYXBoaWNzQ29udGV4dCogc2NyYXRjaCA9IHNj
cmF0Y2hDb250ZXh0KCk7CisgICAgc2NyYXRjaC0+c2F2ZSgpOworICAgIGFwcGx5U3Ryb2tlU3R5
bGVUb0NvbnRleHQoc2NyYXRjaCwgc3R5bGUoKSwgdGhpcyk7CisKKyAgICBTa1BhaW50IHBhaW50
OworICAgIHNjcmF0Y2gtPnBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yU3Ryb2tpbmco
JnBhaW50LCAwLCAwKTsKKyAgICBTa1BhdGggc3Ryb2tlUGF0aDsKKyAgICBwYWludC5nZXRGaWxs
UGF0aCgqcGF0aCgpLnBsYXRmb3JtUGF0aCgpLCAmc3Ryb2tlUGF0aCk7CisgICAgYm9vbCBjb250
YWlucyA9IFNrUGF0aENvbnRhaW5zUG9pbnQoJnN0cm9rZVBhdGgsIHBvaW50LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGUp
OworCisgICAgc2NyYXRjaC0+cmVzdG9yZSgpOworICAgIHJldHVybiBjb250YWluczsKK30KKwor
fQorCisjZW5kaWYgLy8gRU5BQkxFKFNWRykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvc3ZnL2dyYXBo
aWNzL3NraWEvU1ZHUGFpbnRTZXJ2ZXJQYXR0ZXJuU2tpYS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFw
aGljcy9za2lhL1NWR1BhaW50U2VydmVyUGF0dGVyblNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjA4OWNkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3N2
Zy9ncmFwaGljcy9za2lhL1NWR1BhaW50U2VydmVyUGF0dGVyblNraWEuY3BwCkBAIC0wLDAgKzEs
ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUg
IlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlBhdHRlcm4uaCIKKyNpbmNsdWRlICJTVkdQYXR0
ZXJuRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR1BhaW50U2VydmVyUGF0dGVybi5oIgorCisjaW5j
bHVkZSAiU2tTaGFkZXIuaCIKKyNpbmNsdWRlICJTa2lhVXRpbHMuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitib29sIFNWR1BhaW50U2VydmVyUGF0dGVybjo6c2V0dXAoR3JhcGhpY3NDb250
ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvYmplY3QsIFNWR1BhaW50VGFyZ2V0
VHlwZSB0eXBlLCBib29sIGlzUGFpbnRpbmdUZXh0KSBjb25zdAoreworICAgIFJlbmRlclN0eWxl
KiBzdHlsZSA9IG9iamVjdC0+c3R5bGUoKTsKKworICAgIC8vIEJ1aWxkIHBhdHRlcm4gdGlsZSwg
cGFzc2luZyBkZXN0aW5hdGlvbiBvYmplY3QgYm91bmRpbmcgYm94CisgICAgRmxvYXRSZWN0IHRh
cmdldFJlY3Q7CisgICAgaWYgKGlzUGFpbnRpbmdUZXh0KSB7CisgICAgICAgIEludFJlY3QgdGV4
dEJvdW5kYXJ5ID0gY29uc3RfY2FzdDxSZW5kZXJPYmplY3QqPihvYmplY3QpLT5hYnNvbHV0ZUJv
dW5kaW5nQm94UmVjdCgpOworICAgICAgICB0YXJnZXRSZWN0ID0gb2JqZWN0LT5hYnNvbHV0ZVRy
YW5zZm9ybSgpLmludmVyc2UoKS5tYXBSZWN0KHRleHRCb3VuZGFyeSk7CisgICAgfSBlbHNlCisg
ICAgICAgIHRhcmdldFJlY3QgPSBvYmplY3QtPnJlbGF0aXZlQkJveChmYWxzZSk7CisKKyAgICBt
X293bmVyRWxlbWVudC0+YnVpbGRQYXR0ZXJuKHRhcmdldFJlY3QpOworCisgICAgaWYgKCF0aWxl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zv
cm0gPSBwYXR0ZXJuVHJhbnNmb3JtKCk7CisgICAgdHJhbnNmb3JtLnRyYW5zbGF0ZShwYXR0ZXJu
Qm91bmRhcmllcygpLngoKSwgcGF0dGVybkJvdW5kYXJpZXMoKS55KCkpOworCisgICAgUmVmUHRy
PFBhdHRlcm4+IHBhdHRlcm4oUGF0dGVybjo6Y3JlYXRlKHRpbGUoKS0+aW1hZ2UoKSwgdHJ1ZSwg
dHJ1ZSkpOworCisgICAgaWYgKCh0eXBlICYgQXBwbHlUb0ZpbGxUYXJnZXRUeXBlKSAmJiBzdHls
ZS0+c3ZnU3R5bGUoKS0+aGFzRmlsbCgpKSB7CisgICAgICAgIGNvbnRleHQtPnNldEZpbGxQYXR0
ZXJuKHBhdHRlcm4pOworICAgICAgICBpZiAoaXNQYWludGluZ1RleHQpIAorICAgICAgICAgICAg
Y29udGV4dC0+c2V0VGV4dERyYXdpbmdNb2RlKGNUZXh0RmlsbCk7CisgICAgfQorCisgICAgaWYg
KCh0eXBlICYgQXBwbHlUb1N0cm9rZVRhcmdldFR5cGUpICYmIHN0eWxlLT5zdmdTdHlsZSgpLT5o
YXNTdHJva2UoKSkgeworICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VQYXR0ZXJuKHBhdHRlcm4p
OworICAgICAgICBhcHBseVN0cm9rZVN0eWxlVG9Db250ZXh0KGNvbnRleHQsIHN0eWxlLCBvYmpl
Y3QpOworICAgICAgICBpZiAoaXNQYWludGluZ1RleHQpIAorICAgICAgICAgICAgY29udGV4dC0+
c2V0VGV4dERyYXdpbmdNb2RlKGNUZXh0U3Ryb2tlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZHUGFpbnRTZXJ2ZXJTa2lhLmNwcCBiL1dlYkNvcmUv
c3ZnL2dyYXBoaWNzL3NraWEvU1ZHUGFpbnRTZXJ2ZXJTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi4wNDM1YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9z
dmcvZ3JhcGhpY3Mvc2tpYS9TVkdQYWludFNlcnZlclNraWEuY3BwCkBAIC0wLDAgKzEsNzYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJTVkdQ
YWludFNlcnZlci5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAi
UmVuZGVyUGF0aC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRl
ICJTa2lhVXRpbHMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFNWR1BhaW50U2Vy
dmVyOjpkcmF3KEdyYXBoaWNzQ29udGV4dComIGNvbnRleHQsIGNvbnN0IFJlbmRlck9iamVjdCog
b2JqZWN0LCBTVkdQYWludFRhcmdldFR5cGUgdHlwZSkgY29uc3QKK3sKKyAgICBpZiAoIXNldHVw
KGNvbnRleHQsIG9iamVjdCwgdHlwZSkpCisgICAgICAgIHJldHVybjsKKworICAgIHJlbmRlclBh
dGgoY29udGV4dCwgb2JqZWN0LCB0eXBlKTsKKyAgICB0ZWFyZG93bihjb250ZXh0LCBvYmplY3Qs
IHR5cGUpOworfQorCit2b2lkIFNWR1BhaW50U2VydmVyOjp0ZWFyZG93bihHcmFwaGljc0NvbnRl
eHQqJiBjb250ZXh0LCBjb25zdCBSZW5kZXJPYmplY3QqLCBTVkdQYWludFRhcmdldFR5cGUsIGJv
b2wgaXNQYWludGluZ1RleHQpIGNvbnN0Cit7CisgICAgLy8gV2ViS2l0IGltcGxpY2l0bHkgZXhw
ZWN0cyB1cyB0byByZXNldCB0aGUgcGF0aC4KKyAgICAvLyBGb3IgZXhhbXBsZSBpbiBmaWxsQW5k
U3Ryb2tlUGF0aCgpIG9mIFJlbmRlclBhdGguY3BwIHRoZSBwYXRoIGlzIAorICAgIC8vIGFkZGVk
IGJhY2sgdG8gdGhlIGNvbnRleHQgYWZ0ZXIgZmlsbGluZy4gVGhpcyBpcyBiZWNhdXNlIGludGVy
bmFsbHkgaXQKKyAgICAvLyBjYWxscyBDR0NvbnRleHRGaWxsUGF0aCgpIHdoaWNoIGNsb3NlcyB0
aGUgcGF0aC4KKyAgICBjb250ZXh0LT5iZWdpblBhdGgoKTsKKyAgICBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKS0+c2V0R3JhZGllbnQoMCk7CisgICAgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCktPnNldFBhdHRlcm4oMCk7Cit9CisKK3ZvaWQgU1ZHUGFpbnRTZXJ2ZXI6OnJlbmRlclBhdGgo
R3JhcGhpY3NDb250ZXh0KiYgY29udGV4dCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvYmplY3QsIFNW
R1BhaW50VGFyZ2V0VHlwZSB0eXBlKSBjb25zdAoreworICAgIFJlbmRlclN0eWxlKiByZW5kZXJT
dHlsZSA9IG9iamVjdCA/IG9iamVjdC0+c3R5bGUoKSA6IDA7CisKKyAgICBpZiAoKHR5cGUgJiBB
cHBseVRvRmlsbFRhcmdldFR5cGUpICYmICghcmVuZGVyU3R5bGUgfHwgcmVuZGVyU3R5bGUtPnN2
Z1N0eWxlKCktPmhhc0ZpbGwoKSkpCisgICAgICAgIGNvbnRleHQtPmZpbGxQYXRoKCk7CisKKyAg
ICBpZiAoKHR5cGUgJiBBcHBseVRvU3Ryb2tlVGFyZ2V0VHlwZSkgJiYgKCFyZW5kZXJTdHlsZSB8
fCByZW5kZXJTdHlsZS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpKQorICAgICAgICBjb250ZXh0
LT5zdHJva2VQYXRoKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1NWR1Jlc291cmNlRmlsdGVyU2tp
YS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1NWR1Jlc291cmNlRmlsdGVyU2tpYS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0ZWI0YgotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZHUmVzb3VyY2VGaWx0ZXJTa2lh
LmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZ
UklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBFTkFCTEUo
U1ZHKSAmJiBFTkFCTEUoU1ZHX0ZJTFRFUlMpCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIK
KyNpbmNsdWRlICJTVkdSZXNvdXJjZUZpbHRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K1NWR1Jlc291cmNlRmlsdGVyUGxhdGZvcm1EYXRhKiBTVkdSZXNvdXJjZUZpbHRlcjo6Y3JlYXRl
UGxhdGZvcm1EYXRhKCkKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTVkdSZXNvdXJjZUZp
bHRlcjo6cHJlcGFyZUZpbHRlcihHcmFwaGljc0NvbnRleHQqJiwgY29uc3QgRmxvYXRSZWN0JikK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNWR1Jlc291cmNlRmlsdGVyOjph
cHBseUZpbHRlcihHcmFwaGljc0NvbnRleHQqJiwgY29uc3QgRmxvYXRSZWN0JikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoU1ZHKSAmJiBFTkFC
TEUoU1ZHX0ZJTFRFUlMpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1NW
R1Jlc291cmNlTWFza2VyU2tpYS5jcHAgYi9XZWJDb3JlL3N2Zy9ncmFwaGljcy9za2lhL1NWR1Jl
c291cmNlTWFza2VyU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MDZlNjgzMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvc3ZnL2dyYXBoaWNzL3NraWEvU1ZH
UmVzb3VyY2VNYXNrZXJTa2lhLmNwcApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0
IChjKSAyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiU1ZHUmVzb3VyY2VNYXNrZXIuaCIK
KyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgor
CisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2
b2lkIFNWR1Jlc291cmNlTWFza2VyOjphcHBseU1hc2soR3JhcGhpY3NDb250ZXh0KiwgY29uc3Qg
RmxvYXRSZWN0JiBib3VuZGluZ0JveCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="12562"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26479</attachid>
            <date>2009-01-06 16:16:39 -0800</date>
            <delta_ts>2009-01-07 13:08:46 -0800</delta_ts>
            <desc>Add WebCore/platform/graphics/skia files v2</desc>
            <filename>skia.patch</filename>
            <type>text/plain</type>
            <size>28845</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OGI1NzM1Ny4uMjQxMmFiOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2NiBAQAorMjAwOS0wMS0wNiAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMzE0NworICAgICAgICBBZGQgc29tZSBwbGF0Zm9ybS9ncmFwaGljcy9za2lhIGZpbGVz
LgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9UcmFuc2Zvcm1hdGlvbk1hdHJp
eFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4
OjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc2Zvcm1hdGlv
bk1hdHJpeDo6c2V0TWF0cml4KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0
cml4OjptYXApOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6Om1hcFJl
Y3QpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OmlzSWRlbnRpdHkp
OgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OnJlc2V0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4OjpzY2FsZSk6CisgICAgICAgIChXZWJD
b3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6cm90YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlRy
YW5zZm9ybWF0aW9uTWF0cml4Ojp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNm
b3JtYXRpb25NYXRyaXg6OnNoZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9u
TWF0cml4OjpkZXQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6Omlu
dmVyc2UpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6Om9wZXJhdG9y
IFNrTWF0cml4KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4OjpvcGVy
YXRvcj09KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4OjpvcGVyYXRv
cio9KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4OjpvcGVyYXRvciop
OgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OmEpOgorICAgICAgICAo
V2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OnNldEEpOgorICAgICAgICAoV2ViQ29yZTo6
VHJhbnNmb3JtYXRpb25NYXRyaXg6OmIpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRp
b25NYXRyaXg6OnNldEIpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6
OmMpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OnNldEMpOgorICAg
ICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OmQpOgorICAgICAgICAoV2ViQ29y
ZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OnNldEQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNm
b3JtYXRpb25NYXRyaXg6OmUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRy
aXg6OnNldEUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OmYpOgor
ICAgICAgICAoV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg6OnNldEYpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWEuaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYTo6aXNCaXRt
YXBJbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYTo6
c2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYTo6ZGVz
dHJveURlY29kZWREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlU2luZ2xlRnJh
bWVTa2lhOjpkZWNvZGVkU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZVNpbmds
ZUZyYW1lU2tpYTo6bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE6OkJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lh
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0NvbG9yU2tpYS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6Zm9jdXNSaW5nQ29sb3IpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvRmxvYXRQb2ludFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkZsb2F0UG9pbnQ6OkZsb2F0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6RmxvYXRQb2lu
dDo6b3BlcmF0b3IgU2tQb2ludCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9G
bG9hdFJlY3RTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGbG9hdFJlY3Q6OkZs
b2F0UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpGbG9hdFJlY3Q6Om9wZXJhdG9yIFNrUmVjdCk6
CisgICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhZGllbnRTa2lhLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpHcmFkaWVudDo6cGxhdGZvcm1EZXN0cm95KToKKyAgICAg
ICAgKFdlYkNvcmU6OkYyQik6CisgICAgICAgIChXZWJDb3JlOjptYWtlU2tDb2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjp0b3RhbF9zdG9wc19uZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Zmls
bF9zdG9wcyk6CisgICAgICAgIChXZWJDb3JlOjpjb21wYXJlU3RvcHMpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhZGllbnQ6OnBsYXRmb3JtR3JhZGllbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
ZGllbnQ6OmZpbGwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZvcm1H
cmFwaGljcy5oOiBBZGRlZC4KKworCiAyMDA5LTAxLTA2ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Vi
a2l0Lm9yZz4KIAogICAgICAgICBCdWlsZCBmaXggb25seSwgbm8gcmV2aWV3LgpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0JpdG1hcEltYWdlU2luZ2xlRnJhbWVT
a2lhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvQml0bWFwSW1hZ2VTaW5nbGVG
cmFtZVNraWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ3MzI3Ci0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0JpdG1hcElt
YWdlU2luZ2xlRnJhbWVTa2lhLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
YykgMjAwNiwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEJpdG1hcElt
YWdlU2luZ2xlRnJhbWVTa2lhX2gKKyNkZWZpbmUgQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWFf
aAorCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOYXRpdmVJbWFnZVNraWEuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBUaGlzIGltYWdlIGNsYXNzIGNhbiBiZSB1c2VkIGlu
IHBsYWNlcyB3aGljaCBuZWVkIGFuIEltYWdlLCBidXQgaGF2ZQorLy8gcmF3IHBpeGVsIGRhdGEg
cmF0aGVyIHRoYW4gdW5kZWNvZGVkIGltYWdlIGRhdGEuCisvLyBUaGUgSW1hZ2UgaXMgc2ltcGxl
ciB0aGFuIGEgQml0bWFwSW1hZ2UsIGFzIGl0IGRvZXMgbm90IGhhdmUgaW1hZ2UKKy8vIG9ic2Vy
dmVycywgYW5pbWF0aW9uLCBtdWx0aXBsZSBmcmFtZXMsIG9yIG5vbi1kZWNvZGVkIGRhdGEuCisv
LyBUaGVyZWZvcmUgdHJpbW1pbmcgdGhlIGRlY29kZWQgZGF0YSAoZGVzdHJveURlY29kZWREYXRh
KCkpIGhhcyBubyBlZmZlY3QuCisvLworLy8gVGhlIGRpZmZpY3VsdHkgd2l0aCBwdXR0aW5nIHRo
aXMgaW4gQml0bWFwSW1hZ2U6OmNyZWF0ZShOYXRpdmVJbWFnZVB0cikKKy8vIGlzIHRoYXQgTmF0
aXZlSW1hZ2VQdHIgPSBOYXRpdmVJbWFnZVNraWEsIHlldCBjYWxsZXJzIGhhdmUgU2tCaXRtYXAu
CitjbGFzcyBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYSA6IHB1YmxpYyBJbWFnZSB7CitwdWJs
aWM6CisgICAgLy8gQ3JlYXRlcyBhIG5ldyBJbWFnZSwgYnkgY29weWluZyB0aGUgcGl4ZWwgdmFs
dWVzIG91dCBvZiB8Yml0bWFwfC4KKyAgICAvLyBJZiBjcmVhdGlvbiBmYWlsZWQsIHJldHVybnMg
bnVsbC4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYT4g
Y3JlYXRlKAorICAgICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwKTsKKworICAgIHZpcnR1YWwg
Ym9vbCBpc0JpdG1hcEltYWdlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVh
bCBJbnRTaXplIHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEludFNpemUobV9u
YXRpdmVJbWFnZS53aWR0aCgpLCBtX25hdGl2ZUltYWdlLmhlaWdodCgpKTsKKyAgICB9CisKKyAg
ICAvLyBEbyBub3RoaW5nLCBhcyB3ZSBvbmx5IGhhdmUgdGhlIG9uZSByZXByZXNlbnRhdGlvbiBv
ZiBkYXRhIChkZWNvZGVkKS4KKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveURlY29kZWREYXRhKGJv
b2wgZGVzdHJveUFsbCA9IHRydWUpIHsgfQorCisgICAgdmlydHVhbCB1bnNpZ25lZCBkZWNvZGVk
U2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9uYXRpdmVJbWFnZS5kZWNvZGVk
U2l6ZSgpOworICAgIH0KKworICAgIC8vIFdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBmcmFtZS4KKyAg
ICB2aXJ0dWFsIE5hdGl2ZUltYWdlUHRyIG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiAmbV9uYXRpdmVJbWFnZTsKKyAgICB9CisKK3Byb3RlY3RlZDoK
KyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0
UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKworcHJpdmF0ZToKKyAgICBO
YXRpdmVJbWFnZVNraWEgbV9uYXRpdmVJbWFnZTsKKworICAgIC8vIFVzZSBjcmVhdGUoKS4KKyAg
ICBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYSgpIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgIC8vIEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhX2gKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Db2xvclNraWEuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0NvbG9yU2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4MGE1NgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Db2xvclNraWEuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisKKyNpbmNsdWRlICJTa0Nv
bG9yLmgiCisKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK0NPTVBJTEVfQVNTRVJUKFNLX0NvbG9yQkxBQ0sgPT0gQ29sb3I6OmJsYWNrLCBTa0Nv
bG9yQW5kQ29sb3JBcmVMYWlkT3V0VGhlU2FtZSk7CisKK0NvbG9yIGZvY3VzUmluZ0NvbG9yKCkK
K3sKKyAgICBzdGF0aWMgQ29sb3IgZm9jdXNSaW5nQ29sb3IoMjI5LCAxNTEsIDAsIDI1NSk7Cisg
ICAgcmV0dXJuIGZvY3VzUmluZ0NvbG9yOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRQb2ludFNraWEu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0Zsb2F0UG9pbnRTa2lhLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjZTZkCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0Zsb2F0UG9pbnRTa2lhLmNwcApA
QCAtMCwwICsxLDUyIEBACisvKg0KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKiANCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlDQorICogbWV0Og0KKyAqIA0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUN
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyDQorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1dGlvbi4NCisgKiAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20NCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqIA0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0K
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUg0KKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQNCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UNCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KKyNpbmNsdWRl
ICJjb25maWcuaCINCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIg0KKw0KKyNpbmNsdWRlICJTa1Bv
aW50LmgiDQorI2luY2x1ZGUgIlNraWFVdGlscy5oIg0KKw0KK25hbWVzcGFjZSBXZWJDb3JlIHsN
CisNCitGbG9hdFBvaW50OjpGbG9hdFBvaW50KGNvbnN0IFNrUG9pbnQmIHApDQorICAgIDogbV94
KHAuZlgpDQorICAgICwgbV95KHAuZlkpDQorew0KK30NCisNCitGbG9hdFBvaW50OjpvcGVyYXRv
ciBTa1BvaW50KCkgY29uc3QNCit7DQorICAgIFNrUG9pbnQgcCA9IHsgV2ViQ29yZUZsb2F0VG9T
a1NjYWxhcihtX3gpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKG1feSkgfTsNCisgICAgcmV0dXJu
IHA7DQorfQ0KKw0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUNCisNCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRSZWN0U2tpYS5jcHAgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRSZWN0U2tpYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uOTk5NWY4NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9GbG9hdFJlY3RTa2lhLmNwcApAQCAtMCwwICsxLDUxIEBACisv
Kg0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4NCisgKiANCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorICogbWV0Og0KKyAq
IA0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0DQorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
DQorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQ0KKyAqIGRpc3RyaWJ1dGlvbi4NCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzDQorICogY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
Lg0KKyAqIA0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMNCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0K
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUDQorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLA0KKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UNCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJjb25maWcuaCINCisjaW5j
bHVkZSAiRmxvYXRSZWN0LmgiDQorDQorI2luY2x1ZGUgIlNrUmVjdC5oIg0KKw0KK25hbWVzcGFj
ZSBXZWJDb3JlIHsNCisNCitGbG9hdFJlY3Q6OkZsb2F0UmVjdChjb25zdCBTa1JlY3QmIHIpDQor
ICAgIDogbV9sb2NhdGlvbihyLmZMZWZ0LCByLmZUb3ApDQorICAgICwgbV9zaXplKHIud2lkdGgo
KSwgci5oZWlnaHQoKSkNCit7DQorfQ0KKw0KK0Zsb2F0UmVjdDo6b3BlcmF0b3IgU2tSZWN0KCkg
Y29uc3QNCit7DQorICAgIFNrUmVjdCByZWN0ID0geyB4KCksIHkoKSwgcmlnaHQoKSwgYm90dG9t
KCkgfTsNCisgICAgcmV0dXJuIHJlY3Q7DQorfQ0KKw0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUN
CisNCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhZGllbnRT
a2lhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFkaWVudFNraWEuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDRjYmQKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhZGllbnRTa2lhLmNwcApA
QCAtMCwwICsxLDE2NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICogDQorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQ0KKyAqIG1ldDoNCisgKiANCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
DQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcg0KKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisgKiBkaXN0cmlidXRpb24uDQorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0K
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tDQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKiANCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QN
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1INCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QNCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUDQorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisgKi8NCisNCisjaW5jbHVk
ZSAiY29uZmlnLmgiDQorI2luY2x1ZGUgIkdyYWRpZW50LmgiDQorDQorI2luY2x1ZGUgIkNTU1Bh
cnNlci5oIg0KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCINCisNCisjaW5jbHVkZSAiU2tH
cmFkaWVudFNoYWRlci5oIg0KKyNpbmNsdWRlICJTa2lhVXRpbHMuaCINCisNCituYW1lc3BhY2Ug
V2ViQ29yZSB7DQorDQordm9pZCBHcmFkaWVudDo6cGxhdGZvcm1EZXN0cm95KCkNCit7DQorICAg
IGlmIChtX2dyYWRpZW50KQ0KKyAgICAgICAgbV9ncmFkaWVudC0+c2FmZVVucmVmKCk7DQorICAg
IG1fZ3JhZGllbnQgPSAwOw0KK30NCisNCitzdGF0aWMgaW5saW5lIFU4Q1BVIEYyQihmbG9hdCB4
KQ0KK3sNCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oeCAqIDI1NSk7DQorfQ0KKw0KK3N0
YXRpYyBTa0NvbG9yIG1ha2VTa0NvbG9yKGZsb2F0IGEsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0
IGIpDQorew0KKyAgICByZXR1cm4gU2tDb2xvclNldEFSR0IoRjJCKGEpLCBGMkIociksIEYyQihn
KSwgRjJCKGIpKTsNCit9DQorDQorLy8gRGV0ZXJtaW5lIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3Rv
cHMgbmVlZGVkLCBpbmNsdWRpbmcgcHNldWRvLXN0b3BzIGF0IHRoZQ0KKy8vIGVuZHMgYXMgbmVj
ZXNzYXJ5Lg0KK3N0YXRpYyBzaXplX3QgdG90YWxTdG9wc05lZWRlZChjb25zdCBHcmFkaWVudDo6
Q29sb3JTdG9wKiBzdG9wRGF0YSwgc2l6ZV90IGNvdW50KQ0KK3sNCisgICAgY29uc3QgR3JhZGll
bnQ6OkNvbG9yU3RvcCogc3RvcCA9IHN0b3BEYXRhOw0KKyAgICBzaXplX3QgY291bnRVc2VkID0g
Y291bnQ7DQorICAgIGlmIChjb3VudCA8IDEgfHwgc3RvcC0+c3RvcCA+IDAuMCkNCisgICAgICAg
IGNvdW50VXNlZCsrOw0KKyAgICBzdG9wICs9IGNvdW50IC0gMTsNCisgICAgaWYgKGNvdW50IDwg
MiB8fCBzdG9wLT5zdG9wIDwgMS4wKQ0KKyAgICAgICAgY291bnRVc2VkKys7DQorICAgIHJldHVy
biBjb3VudFVzZWQ7DQorfQ0KKw0KKy8vIENvbGxlY3Qgc29ydGVkIHN0b3AgcG9zaXRpb24gYW5k
IGNvbG9yIGluZm9ybWF0aW9uIGludG8gdGhlIHBvcyBhbmQgY29sb3JzIA0KKy8vIGJ1ZmZlcnMs
IGVuc3VyaW5nIHN0b3BzIGF0IGJvdGggMC4wIGFuZCAxLjAuICBUaGUgYnVmZmVycyBtdXN0IGJl
IGxhcmdlDQorLy8gZW5vdWdoIHRvIGhvbGQgaW5mb3JtYXRpb24gZm9yIGFsbCBzdG9wcywgaW5j
bHVkaW5nIHRoZSBuZXcgZW5kcG9pbnRzIGlmDQorLy8gc3RvcHMgYXQgMC4wIGFuZCAxLjAgYXJl
bid0IGFscmVhZHkgaW5jbHVkZWQuDQorc3RhdGljIHZvaWQgZmlsbFN0b3BzKGNvbnN0IEdyYWRp
ZW50OjpDb2xvclN0b3AqIHN0b3BEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90
IGNvdW50LCBTa1NjYWxhciogcG9zLCBTa0NvbG9yKiBjb2xvcnMpDQoreyANCisgICAgY29uc3Qg
R3JhZGllbnQ6OkNvbG9yU3RvcCogc3RvcCA9IHN0b3BEYXRhOw0KKyAgICBzaXplX3Qgc3RhcnQg
PSAwOw0KKyAgICBpZiAoY291bnQgPCAxKSB7DQorICAgICAgICAvLyBBIGdyYWRpZW50IHdpdGgg
bm8gc3RvcHMgbXVzdCBiZSB0cmFuc3BhcmVudCBibGFjay4NCisgICAgICAgIHBvc1swXSA9IFdl
YkNvcmVGbG9hdFRvU2tTY2FsYXIoMC4wKTsNCisgICAgICAgIGNvbG9yc1swXSA9IG1ha2VTa0Nv
bG9yKDAuMCwgMC4wLCAwLjAsIDAuMCk7DQorICAgICAgICBzdGFydCA9IDE7DQorICAgIH0gZWxz
ZSBpZiAoc3RvcC0+c3RvcCA+IDAuMCkgew0KKyAgICAgICAgLy8gQ29weSB0aGUgZmlyc3Qgc3Rv
cCB0byAwLjAuIFRoZSBmaXJzdCBzdG9wIHBvc2l0aW9uIG1heSBoYXZlIGEgc2xpZ2h0DQorICAg
ICAgICAvLyByb3VuZGluZyBlcnJvciwgYnV0IHdlIGRvbid0IGNhcmUgaW4gdGhpcyBmbG9hdCBj
b21wYXJpc29uLCBzaW5jZQ0KKyAgICAgICAgLy8gMC4wIGNvbWVzIHRocm91Z2ggY2xlYW5seSBh
bmQgcGVvcGxlIGFyZW4ndCBsaWtlbHkgdG8gd2FudCBhIGdyYWRpZW50DQorICAgICAgICAvLyB3
aXRoIGEgc3RvcCBhdCAoMCArIGVwc2lsb24pLg0KKyAgICAgICAgcG9zWzBdID0gV2ViQ29yZUZs
b2F0VG9Ta1NjYWxhcigwLjApOw0KKyAgICAgICAgY29sb3JzWzBdID0gbWFrZVNrQ29sb3Ioc3Rv
cC0+YWxwaGEsIHN0b3AtPnJlZCwgc3RvcC0+Z3JlZW4sIHN0b3AtPmJsdWUpOw0KKyAgICAgICAg
c3RhcnQgPSAxOw0KKyAgICB9DQorDQorICAgIGZvciAoc2l6ZV90IGkgPSBzdGFydDsgaSA8IHN0
YXJ0ICsgY291bnQ7IGkrKykgew0KKyAgICAgICAgcG9zW2ldID0gV2ViQ29yZUZsb2F0VG9Ta1Nj
YWxhcihzdG9wLT5zdG9wKTsNCisgICAgICAgIGNvbG9yc1tpXSA9IG1ha2VTa0NvbG9yKHN0b3At
PmFscGhhLCBzdG9wLT5yZWQsIHN0b3AtPmdyZWVuLCBzdG9wLT5ibHVlKTsNCisgICAgICAgICsr
c3RvcDsNCisgICAgfQ0KKw0KKyAgICAvLyBDb3B5IHRoZSBsYXN0IHN0b3AgdG8gMS4wIGlmIG5l
ZWRlZC4gIFNlZSBjb21tZW50IGFib3ZlIGFib3V0IHRoaXMgZmxvYXQNCisgICAgLy8gY29tcGFy
aXNvbi4NCisgICAgaWYgKGNvdW50IDwgMSB8fCAoLS1zdG9wKS0+c3RvcCA8IDEuMCkgew0KKyAg
ICAgICAgcG9zW3N0YXJ0ICsgY291bnRdID0gV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcigxLjApOw0K
KyAgICAgICAgY29sb3JzW3N0YXJ0ICsgY291bnRdID0gY29sb3JzW3N0YXJ0ICsgY291bnQgLSAx
XTsNCisgICAgfQ0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVN0b3BzKGNvbnN0
IEdyYWRpZW50OjpDb2xvclN0b3AmIGEsIGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGIpDQor
ew0KKyAgICByZXR1cm4gYS5zdG9wIDwgYi5zdG9wOw0KK30NCisNCitTa1NoYWRlciogR3JhZGll
bnQ6OnBsYXRmb3JtR3JhZGllbnQoKQ0KK3sNCisgICAgaWYgKG1fZ3JhZGllbnQpDQorICAgICAg
ICByZXR1cm4gbV9ncmFkaWVudDsNCisNCisgICAgLy8gRklYTUU6IFRoaXMgYW5kIGNvbXBhcmVT
dG9wcygpIGFyZSBhbHNvIGluIEdyYWRpZW50LmNwcCBhbmQNCisgICAgLy8gQ1NTR3JhZGllbnRW
YWx1ZS5jcHA7IHByb2JhYmx5IHNob3VsZCByZWZhY3RvciBpbiBXZWJLaXQuDQorICAgIGlmICgh
bV9zdG9wc1NvcnRlZCkgew0KKyAgICAgICAgaWYgKG1fc3RvcHMuc2l6ZSgpKQ0KKyAgICAgICAg
ICAgIHN0ZDo6c3RhYmxlX3NvcnQobV9zdG9wcy5iZWdpbigpLCBtX3N0b3BzLmVuZCgpLCBjb21w
YXJlU3RvcHMpOw0KKyAgICAgICAgbV9zdG9wc1NvcnRlZCA9IHRydWU7DQorICAgIH0NCisgICAg
c2l6ZV90IGNvdW50VXNlZCA9IHRvdGFsU3RvcHNOZWVkZWQobV9zdG9wcy5kYXRhKCksIG1fc3Rv
cHMuc2l6ZSgpKTsNCisgICAgQVNTRVJUKGNvdW50VXNlZCA+PSAyKTsNCisgICAgQVNTRVJUKGNv
dW50VXNlZCA+PSBtX3N0b3BzLnNpemUoKSk7DQorDQorICAgIC8vIEZJWE1FOiBXaHkgaXMgYWxs
IHRoaXMgbWFudWFsIHBvaW50ZXIgbWF0aCBuZWVkZWQ/IQ0KKyAgICBTa0F1dG9NYWxsb2Mgc3Rv
cmFnZShjb3VudFVzZWQgKiAoc2l6ZW9mKFNrQ29sb3IpICsgc2l6ZW9mKFNrU2NhbGFyKSkpOw0K
KyAgICBTa0NvbG9yKiBjb2xvcnMgPSBzdGF0aWNfY2FzdDxTa0NvbG9yKj4oc3RvcmFnZS5nZXQo
KSk7DQorICAgIFNrU2NhbGFyKiBwb3MgPSBzdGF0aWNfY2FzdDxTa1NjYWxhcio+KGNvbG9ycyAr
IGNvdW50VXNlZCk7DQorDQorICAgIGZpbGxTdG9wcyhtX3N0b3BzLmRhdGEoKSwgbV9zdG9wcy5z
aXplKCksIHBvcywgY29sb3JzKTsNCisNCisgICAgaWYgKG1fcmFkaWFsKSB7DQorICAgICAgICAv
LyBGSVhNRTogQ1NTIHJhZGlhbCBHcmFkaWVudHMgYWxsb3cgYW4gb2Zmc2V0IGZvY2FsIHBvaW50
ICh0aGUNCisgICAgICAgIC8vICJzdGFydCBjaXJjbGUiKSwgYnV0IHNraWEgZG9lc24ndCBzZWVt
IHRvIHN1cHBvcnQgdGhhdCwgc28gdGhpcyBqdXN0DQorICAgICAgICAvLyBpZ25vcmVzIG1fcDAv
bV9yMCBhbmQgZHJhd3MgdGhlIGdyYWRpZW50IGNlbnRlcmVkIGluIHRoZSAiZW5kDQorICAgICAg
ICAvLyBjaXJjbGUiIChtX3AxL21fcjEpLg0KKyAgICAgICAgLy8gU2VlIGh0dHA6Ly93ZWJraXQu
b3JnL2Jsb2cvMTc1L2ludHJvZHVjaW5nLWNzcy1ncmFkaWVudHMvIGZvciBhDQorICAgICAgICAv
LyBkZXNjcmlwdGlvbiBvZiB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IuDQorICAgICAgICBtX2dyYWRp
ZW50ID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlUmFkaWFsKG1fcDEsDQorICAgICAgICAgICAg
V2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihtX3IxKSwgY29sb3JzLCBwb3MsDQorICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8aW50Pihjb3VudFVzZWQpLCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlKTsN
CisgICAgfSBlbHNlIHsNCisgICAgICAgIFNrUG9pbnQgcHRzWzJdID0geyBtX3AwLCBtX3AxIH07
DQorICAgICAgICBtX2dyYWRpZW50ID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0
cywgY29sb3JzLCBwb3MsDQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihjb3VudFVzZWQp
LCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbV9n
cmFkaWVudDsNCit9DQorDQordm9pZCBHcmFkaWVudDo6ZmlsbChHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkNCit7DQorICAgIGNvbnRleHQtPnNldEZpbGxH
cmFkaWVudCh0aGlzKTsNCisgICAgY29udGV4dC0+ZmlsbFJlY3QocmVjdCk7DQorfQ0KKw0KK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUNCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3NraWEvUGxhdGZvcm1HcmFwaGljcy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL1BsYXRmb3JtR3JhcGhpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li41NzMyYWQwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL1BsYXRmb3JtR3JhcGhpY3MuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0
IChjKSAyMDA2LTIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBQ
bGF0Zm9ybUdyYXBoaWNzX2gKKyNkZWZpbmUgUGxhdGZvcm1HcmFwaGljc19oCisKK3R5cGVkZWYg
Y2xhc3MgU2tTaGFkZXIqIFBsYXRmb3JtR3JhZGllbnQ7Cit0eXBlZGVmIGNsYXNzIFNrU2hhZGVy
KiBQbGF0Zm9ybVBhdHRlcm47CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL1RyYW5zZm9ybWF0aW9uTWF0cml4U2tpYS5jcHAgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvVHJhbnNmb3JtYXRpb25NYXRyaXhTa2lhLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGUyYmFlCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1RyYW5zZm9ybWF0aW9uTWF0cml4U2tpYS5j
cHAKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRy
YW5zZm9ybWF0aW9uTWF0cml4LmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRl
ICJJbnRSZWN0LmgiCisKKyNpbmNsdWRlICJTa2lhVXRpbHMuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6VHJhbnNmb3JtYXRpb25NYXRyaXgoKQorewor
ICAgIG1fdHJhbnNmb3JtLnJlc2V0KCk7Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4OjpUcmFu
c2Zvcm1hdGlvbk1hdHJpeChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwg
ZG91YmxlIGUsIGRvdWJsZSBmKQoreworICAgIHNldE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKTsK
K30KKworVHJhbnNmb3JtYXRpb25NYXRyaXg6OlRyYW5zZm9ybWF0aW9uTWF0cml4KGNvbnN0IFNr
TWF0cml4JiBtYXRyaXgpCisgICAgOiBtX3RyYW5zZm9ybShtYXRyaXgpCit7Cit9CisKK3ZvaWQg
VHJhbnNmb3JtYXRpb25NYXRyaXg6OnNldE1hdHJpeChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJs
ZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQoreworICAgIG1fdHJhbnNmb3JtLnJl
c2V0KCk7CisKKyAgICBtX3RyYW5zZm9ybS5zZXRTY2FsZVgoV2ViQ29yZURvdWJsZVRvU2tTY2Fs
YXIoYSkpOworICAgIG1fdHJhbnNmb3JtLnNldFNrZXdYKFdlYkNvcmVEb3VibGVUb1NrU2NhbGFy
KGMpKTsKKyAgICBtX3RyYW5zZm9ybS5zZXRUcmFuc2xhdGVYKFdlYkNvcmVEb3VibGVUb1NrU2Nh
bGFyKGUpKTsKKworICAgIG1fdHJhbnNmb3JtLnNldFNjYWxlWShXZWJDb3JlRG91YmxlVG9Ta1Nj
YWxhcihkKSk7CisgICAgbV90cmFuc2Zvcm0uc2V0U2tld1koV2ViQ29yZURvdWJsZVRvU2tTY2Fs
YXIoYikpOworICAgIG1fdHJhbnNmb3JtLnNldFRyYW5zbGF0ZVkoV2ViQ29yZURvdWJsZVRvU2tT
Y2FsYXIoZikpOworfQorCit2b2lkIFRyYW5zZm9ybWF0aW9uTWF0cml4OjptYXAoZG91YmxlIHgs
IGRvdWJsZSB5LCBkb3VibGUqIHgyLCBkb3VibGUqIHkyKSBjb25zdAoreworICAgIFNrUG9pbnQg
c3JjLCBkc3Q7CisgICAgc3JjLnNldChXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcih4KSwgV2ViQ29y
ZURvdWJsZVRvU2tTY2FsYXIoeSkpOworICAgIG1fdHJhbnNmb3JtLm1hcFBvaW50cygmZHN0LCAm
c3JjLCAxKTsKKworICAgICp4MiA9IFNrU2NhbGFyVG9Eb3VibGUoZHN0LmZYKTsKKyAgICAqeTIg
PSBTa1NjYWxhclRvRG91YmxlKGRzdC5mWSk7Cit9CisKK0ludFJlY3QgVHJhbnNmb3JtYXRpb25N
YXRyaXg6Om1hcFJlY3QoY29uc3QgSW50UmVjdCYgc3JjKSBjb25zdAoreworICAgIFNrUmVjdCBk
c3Q7CisgICAgbV90cmFuc2Zvcm0ubWFwUmVjdCgmZHN0LCBzcmMpOworICAgIHJldHVybiBlbmNs
b3NpbmdJbnRSZWN0KGRzdCk7Cit9CisKK0Zsb2F0UmVjdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6
bWFwUmVjdChjb25zdCBGbG9hdFJlY3QmIHNyYykgY29uc3QKK3sKKyAgICBTa1JlY3QgZHN0Owor
ICAgIG1fdHJhbnNmb3JtLm1hcFJlY3QoJmRzdCwgc3JjKTsKKyAgICByZXR1cm4gZHN0OworfQor
Citib29sIFRyYW5zZm9ybWF0aW9uTWF0cml4Ojppc0lkZW50aXR5KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV90cmFuc2Zvcm0uaXNJZGVudGl0eSgpOworfQorCit2b2lkIFRyYW5zZm9ybWF0aW9u
TWF0cml4OjpyZXNldCgpCit7CisgICAgbV90cmFuc2Zvcm0ucmVzZXQoKTsKK30KKworVHJhbnNm
b3JtYXRpb25NYXRyaXgmIFRyYW5zZm9ybWF0aW9uTWF0cml4OjpzY2FsZShkb3VibGUgc3gsIGRv
dWJsZSBzeSkKK3sKKyAgICBtX3RyYW5zZm9ybS5wcmVTY2FsZShXZWJDb3JlRG91YmxlVG9Ta1Nj
YWxhcihzeCksIFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKHN5KSwgMCwgMCk7CisgICAgcmV0dXJu
ICp0aGlzOworfQorCitUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgVHJhbnNmb3JtYXRpb25NYXRyaXg6
OnJvdGF0ZShkb3VibGUgZCkKK3sKKyAgICBtX3RyYW5zZm9ybS5wcmVSb3RhdGUoV2ViQ29yZURv
dWJsZVRvU2tTY2FsYXIoZCksIDAsIDApOworICAgIHJldHVybiAqdGhpczsKK30KKworVHJhbnNm
b3JtYXRpb25NYXRyaXgmIFRyYW5zZm9ybWF0aW9uTWF0cml4Ojp0cmFuc2xhdGUoZG91YmxlIHR4
LCBkb3VibGUgdHkpCit7CisgICAgbV90cmFuc2Zvcm0ucHJlVHJhbnNsYXRlKFdlYkNvcmVEb3Vi
bGVUb1NrU2NhbGFyKHR4KSwgV2ViQ29yZURvdWJsZVRvU2tTY2FsYXIodHkpKTsKKyAgICByZXR1
cm4gKnRoaXM7Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4JiBUcmFuc2Zvcm1hdGlvbk1hdHJp
eDo6c2hlYXIoZG91YmxlIHN4LCBkb3VibGUgc3kpCit7CisgICAgbV90cmFuc2Zvcm0ucHJlU2tl
dyhXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihzeCksIFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKHN5
KSwgMCwgMCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitkb3VibGUgVHJhbnNmb3JtYXRpb25N
YXRyaXg6OmRldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFNrU2NhbGFyVG9Eb3VibGUobV90cmFu
c2Zvcm0uZ2V0U2NhbGVYKCkpICogU2tTY2FsYXJUb0RvdWJsZShtX3RyYW5zZm9ybS5nZXRTY2Fs
ZVkoKSkgLQorICAgICAgICAgICBTa1NjYWxhclRvRG91YmxlKG1fdHJhbnNmb3JtLmdldFNrZXdZ
KCkpICAqIFNrU2NhbGFyVG9Eb3VibGUobV90cmFuc2Zvcm0uZ2V0U2tld1goKSk7Cit9CisKK1Ry
YW5zZm9ybWF0aW9uTWF0cml4IFRyYW5zZm9ybWF0aW9uTWF0cml4OjppbnZlcnNlKCkgY29uc3QK
K3sKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBpbnZlcnNlOworICAgIG1fdHJhbnNmb3JtLmlu
dmVydCgmaW52ZXJzZS5tX3RyYW5zZm9ybSk7CisgICAgcmV0dXJuIGludmVyc2U7Cit9CisKK1Ry
YW5zZm9ybWF0aW9uTWF0cml4OjpvcGVyYXRvciBTa01hdHJpeCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fdHJhbnNmb3JtOworfQorCitib29sIFRyYW5zZm9ybWF0aW9uTWF0cml4OjpvcGVyYXRv
cj09KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtMikgY29uc3QKK3sKKyAgICByZXR1cm4g
bV90cmFuc2Zvcm0gPT0gbTIubV90cmFuc2Zvcm07Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4
ICZUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6b3BlcmF0b3IqPShjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgbTIpCit7CisgICAgbV90cmFuc2Zvcm0uc2V0Q29uY2F0KG0yLm1fdHJhbnNmb3JtLCBt
X3RyYW5zZm9ybSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6b3BlcmF0b3IqKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiBtMikKK3sKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjYXQ7CisgICAgCisgICAgY2F0
Lm1fdHJhbnNmb3JtLnNldENvbmNhdChtMi5tX3RyYW5zZm9ybSwgbV90cmFuc2Zvcm0pOworICAg
IHJldHVybiBjYXQ7Cit9CisKK2RvdWJsZSBUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6YSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIFNrU2NhbGFyVG9Eb3VibGUobV90cmFuc2Zvcm0uZ2V0U2NhbGVYKCkp
OworfQorCit2b2lkIFRyYW5zZm9ybWF0aW9uTWF0cml4OjpzZXRBKGRvdWJsZSBhKQoreworICAg
IG1fdHJhbnNmb3JtLnNldFNjYWxlWChXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihhKSk7Cit9CisK
K2RvdWJsZSBUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6YigpIGNvbnN0Cit7CisgICAgcmV0dXJuIFNr
U2NhbGFyVG9Eb3VibGUobV90cmFuc2Zvcm0uZ2V0U2tld1koKSk7Cit9CisKK3ZvaWQgVHJhbnNm
b3JtYXRpb25NYXRyaXg6OnNldEIoZG91YmxlIGIpCit7CisgICAgbV90cmFuc2Zvcm0uc2V0U2tl
d1koV2ViQ29yZURvdWJsZVRvU2tTY2FsYXIoYikpOworfQorCitkb3VibGUgVHJhbnNmb3JtYXRp
b25NYXRyaXg6OmMoKSBjb25zdAoreworICAgIHJldHVybiBTa1NjYWxhclRvRG91YmxlKG1fdHJh
bnNmb3JtLmdldFNrZXdYKCkpOworfQorCit2b2lkIFRyYW5zZm9ybWF0aW9uTWF0cml4OjpzZXRD
KGRvdWJsZSBjKQoreworICAgIG1fdHJhbnNmb3JtLnNldFNrZXdYKFdlYkNvcmVEb3VibGVUb1Nr
U2NhbGFyKGMpKTsKK30KKworZG91YmxlIFRyYW5zZm9ybWF0aW9uTWF0cml4OjpkKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gU2tTY2FsYXJUb0RvdWJsZShtX3RyYW5zZm9ybS5nZXRTY2FsZVkoKSk7
Cit9CisKK3ZvaWQgVHJhbnNmb3JtYXRpb25NYXRyaXg6OnNldEQoZG91YmxlIGQpCit7CisgICAg
bV90cmFuc2Zvcm0uc2V0U2NhbGVZKFdlYkNvcmVEb3VibGVUb1NrU2NhbGFyKGQpKTsKK30KKwor
ZG91YmxlIFRyYW5zZm9ybWF0aW9uTWF0cml4OjplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gU2tT
Y2FsYXJUb0RvdWJsZShtX3RyYW5zZm9ybS5nZXRUcmFuc2xhdGVYKCkpOworfQorCit2b2lkIFRy
YW5zZm9ybWF0aW9uTWF0cml4OjpzZXRFKGRvdWJsZSBlKQoreworICAgIG1fdHJhbnNmb3JtLnNl
dFRyYW5zbGF0ZVgoV2ViQ29yZURvdWJsZVRvU2tTY2FsYXIoZSkpOworfQorCitkb3VibGUgVHJh
bnNmb3JtYXRpb25NYXRyaXg6OmYoKSBjb25zdAoreworICAgIHJldHVybiBTa1NjYWxhclRvRG91
YmxlKG1fdHJhbnNmb3JtLmdldFRyYW5zbGF0ZVkoKSk7Cit9CisKK3ZvaWQgVHJhbnNmb3JtYXRp
b25NYXRyaXg6OnNldEYoZG91YmxlIGYpCit7CisgICAgbV90cmFuc2Zvcm0uc2V0VHJhbnNsYXRl
WShXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihmKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUK
</data>
<flag name="review"
          id="12565"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26493</attachid>
            <date>2009-01-07 09:54:19 -0800</date>
            <delta_ts>2009-02-05 14:25:24 -0800</delta_ts>
            <desc>Added WebCore/platform/graphics/skia/GraphicsContext* files</desc>
            <filename>gcskia.patch</filename>
            <type>text/plain</type>
            <size>42235</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MjlkMTBjNS4uZDQxYjZiMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2OSBAQAorMjAwOS0wMS0wNyAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hB
TkdFRAorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
MzE0NworICAgICAgICBBZGQgcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRT
a2lhIGZpbGVzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbnRl
eHQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tp
YS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpiZWdpblBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpj
bGVhclBsYXRmb3JtU2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6
Y2xlYXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y2xpcCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0RWxsaXBzZUluUmVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDo6Y2xpcFRvSW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0Ojpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0OjpkcmF3Q29udmV4UG9seWdvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OmRyYXdFbGxpcHNlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJh
d0ZvY3VzUmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5l
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVs
bGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRy
YXdMaW5lRm9yVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdS
ZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdCk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQ6OmZpbGxSb3VuZGVkUmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OmdldENUTSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpzY2FsZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldEFs
cGhhKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0Q29tcG9zaXRlT3Bl
cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0SW1hZ2VJbnRl
cnBvbGF0aW9uUXVhbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNl
dExpbmVDYXApOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFz
aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0TWl0ZXJMaW1pdCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaGFkb3cpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhp
Y2tuZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1U
ZXh0RHJhd2luZ01vZGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRV
UkxGb3JSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0VXNlQW50
aWFsaWFzaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlQXJj
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUGF0aCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0Ojp0cmFuc2xhdGUpOgorCiAyMDA5LTAxLTA3ICBEYXJpbiBBZGxlciAgPGRhcmlu
QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVudC4KZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5h
NmU0NTAwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKGMpIDIwMDYsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVfaAorI2RlZmluZSBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGVfaAorCitjbGFzcyBQbGF0Zm9ybUNvbnRleHRTa2lhOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRoaXMgY2xhc3MganVzdCBob2xkcyBvbnRvIGEgUGxh
dGZvcm1Db250ZXh0U2tpYSBmb3IgR3JhcGhpY3NDb250ZXh0LgorY2xhc3MgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUoUGxhdGZvcm1Db250ZXh0U2tpYSogcGxhdGZvcm1Db250ZXh0KQorICAgICAgICA6
IG1fY29udGV4dChwbGF0Zm9ybUNvbnRleHQpIHsgfQorCisgICAgUGxhdGZvcm1Db250ZXh0U2tp
YSogY29udGV4dCgpIHsgcmV0dXJuIG1fY29udGV4dDsgfQorCitwcml2YXRlOgorICAgIC8vIE5v
bi1vd25pbmcgcG9pbnRlciB0byB0aGUgUGxhdGZvcm1Db250ZXh0LgorICAgIFBsYXRmb3JtQ29u
dGV4dFNraWEqIG1fY29udGV4dDsKKworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgY29weSBvciBh
c3NpZ24uCisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKGNvbnN0IEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSYgb3RoZXIpOworICAgIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZSYgb3BlcmF0b3I9KAorICAgICAgICBjb25zdCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUmIG90aGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAgLy8gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlX2gKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFjYjRlCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFNraWEuY3Bw
CkBAIC0wLDAgKzEsMTEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8bWF0
aC5oPgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UHJpdmF0
ZS5oIgorCisjaW5jbHVkZSAiQXNzZXJ0aW9ucy5oIgorI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9y
bS5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVk
ZSAiR3JhZGllbnQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTmF0aXZlSW1h
Z2VTa2lhLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICJTa0JsdXJE
cmF3TG9vcGVyLmgiCisjaW5jbHVkZSAiU2tDb3JuZXJQYXRoRWZmZWN0LmgiCisjaW5jbHVkZSAi
c2tpYS9leHQvcGxhdGZvcm1fY2FudmFzLmgiCisjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisjaW5j
bHVkZSAiU2tTaGFkZXIuaCIKKyNpbmNsdWRlICJ3dGYvTWF0aEV4dHJhcy5oIgorCit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSB7CisKKy8v
ICJSZWFzb25hYmxlIiBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIGNoZWNrIGNlcnRh
aW4gZ3JhcGhpY3MgcHJpbWl0aXZlcyBmb3IgYmVpbmcgInJlYXNvbmFibGUiLgorLy8gV2UgZG9u
J3QgbGlrZSB0byBzZW5kIGNyYXp5IGRhdGEgdG8gdGhlIGdyYXBoaWNzIGxheWVyIHRoYXQgbWln
aHQgb3ZlcmZsb3csCisvLyBhbmQgdGhpcyBoZWxwcyB1cyBhdm9pZCBzb21lIG9mIHRob3NlIGNh
c2VzLgorLy8KKy8vIFRIRVNFIEFSRSBOT1QgUEVSRkVDVC4gV2UgY2FuJ3QgZ3VhcmFudGVlIHdo
YXQgdGhlIGdyYXBoaWNzIGxheWVyIGlzIGRvaW5nLgorLy8gSWRlYWxseSwgYWxsIG9mIHRoZXNl
IHdvdWxkIGJlIGZpeGVkIGluIHRoZSBncmFwaGljcyBsYXllciBhbmQgd2Ugd291bGQgbm90Cisv
LyBoYXZlIHRvIGRvIGFueSBjaGVja2luZy4gWW91IGNhbiB1bmNvbW1lbnQgdGhlIENIRUNLX1JF
QVNPTkFCTEUgZmxhZyB0bworLy8gY2hlY2sgdGhlIGdyYXBoaWNzIGxheWVyLgorI2RlZmluZSBD
SEVDS19SRUFTT05BQkxFCisKK3N0YXRpYyBib29sIElzQ29vcmRpbmF0ZVJlYXNvbmFibGUoZmxv
YXQgY29vcmQpCit7CisjaWZkZWYgQ0hFQ0tfUkVBU09OQUJMRQorICAgIC8vIEZpcnN0IGNoZWNr
IGZvciB2YWxpZCBmbG9hdHMuCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICBpZiAoIV9maW5p
dGUoY29vcmQpKQorI2Vsc2UKKyAgICBpZiAoIWZpbml0ZShjb29yZCkpCisjZW5kaWYKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gU2tpYSB1c2VzIDE2LjE2IGZpeGVkIHBvaW50IGFu
ZCAyNi42IGZpeGVkIHBvaW50IGluIHZhcmlvdXMgcGxhY2VzLiBJZgorICAgIC8vIHRoZSB0cmFu
c2Zvcm1lZCBwb2ludCBleGNlZWRzIDE1IGJpdHMsIHdlIGp1c3QgZGVjbGFyZSB0aGF0IGl0J3MK
KyAgICAvLyB1bnJlYXNvbmFibGUgdG8gY2F0Y2ggYm90aCBvZiB0aGVzZSBjYXNlcy4KKyAgICBz
dGF0aWMgY29uc3QgaW50IG1heFBvaW50TWFnbml0dWRlID0gMzI3Njc7CisgICAgaWYgKGNvb3Jk
ID4gbWF4UG9pbnRNYWduaXR1ZGUgfHwgY29vcmQgPCAtbWF4UG9pbnRNYWduaXR1ZGUpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICByZXR1cm4g
dHJ1ZTsKKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbCBJc1BvaW50UmVhc29uYWJsZShjb25zdCBT
a01hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBTa1BvaW50JiBwdCkKK3sKKyNpZmRlZiBDSEVDS19S
RUFTT05BQkxFCisgICAgLy8gTm93IGNoZWNrIGZvciBwb2ludHMgdGhhdCB3aWxsIG92ZXJmbG93
LiBXZSBjaGVjayB0aGUgKnRyYW5zZm9ybWVkKgorICAgIC8vIHBvaW50cyBzaW5jZSB0aGlzIGlz
IHdoYXQgd2lsbCBiZSByYXN0ZXJpemVkLgorICAgIFNrUG9pbnQgeFB0OworICAgIHRyYW5zZm9y
bS5tYXBQb2ludHMoJnhQdCwgJnB0LCAxKTsKKyAgICByZXR1cm4gSXNDb29yZGluYXRlUmVhc29u
YWJsZSh4UHQuZlgpICYmIElzQ29vcmRpbmF0ZVJlYXNvbmFibGUoeFB0LmZZKTsKKyNlbHNlCisg
ICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworc3RhdGljIGJvb2wgSXNSZWN0UmVhc29uYWJs
ZShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBTa1JlY3QmIHJjKQoreworI2lmZGVm
IENIRUNLX1JFQVNPTkFCTEUKKyAgICBTa1BvaW50IHRvcGxlZnQgPSB7cmMuZkxlZnQsIHJjLmZU
b3B9OworICAgIFNrUG9pbnQgYm90dG9tcmlnaHQgPSB7cmMuZlJpZ2h0LCByYy5mQm90dG9tfTsK
KyAgICByZXR1cm4gSXNQb2ludFJlYXNvbmFibGUodHJhbnNmb3JtLCB0b3BsZWZ0KSAmJgorICAg
ICAgICAgICBJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGJvdHRvbXJpZ2h0KTsKKyNlbHNl
CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworYm9vbCBJc1BhdGhSZWFzb25hYmxlKGNv
bnN0IFNrTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IFNrUGF0aCYgcGF0aCkKK3sKKyNpZmRlZiBD
SEVDS19SRUFTT05BQkxFCisgICAgU2tQb2ludCBjdXJyZW50X3BvaW50c1s0XTsKKyAgICBTa1Bh
dGg6Okl0ZXIgaXRlcihwYXRoLCBmYWxzZSk7CisgICAgZm9yIChTa1BhdGg6OlZlcmIgdmVyYiA9
IGl0ZXIubmV4dChjdXJyZW50X3BvaW50cyk7CisgICAgICAgICB2ZXJiICE9IFNrUGF0aDo6a0Rv
bmVfVmVyYjsKKyAgICAgICAgIHZlcmIgPSBpdGVyLm5leHQoY3VycmVudF9wb2ludHMpKSB7Cisg
ICAgICAgIHN3aXRjaCAodmVyYikgeworICAgICAgICBjYXNlIFNrUGF0aDo6a01vdmVfVmVyYjoK
KyAgICAgICAgICAgIC8vIFRoaXMgbW92ZSB3aWxsIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIG5leHQg
dmVyYiwgc28gd2UgY2FuIGlnbm9yZS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFNrUGF0aDo6a0xpbmVfVmVyYjoKKyAgICAgICAgICAgIC8vIGl0ZXIubmV4dCByZXR1cm5zIDIg
cG9pbnRzLgorICAgICAgICAgICAgaWYgKCFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1
cnJlbnRfcG9pbnRzWzBdKSB8fAorICAgICAgICAgICAgICAgICFJc1BvaW50UmVhc29uYWJsZSh0
cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzFdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtRdWFkX1ZlcmI6
CisgICAgICAgICAgICAvLyBpdGVyLm5leHQgcmV0dXJucyAzIHBvaW50cy4KKyAgICAgICAgICAg
IGlmICghSXNQb2ludFJlYXNvbmFibGUodHJhbnNmb3JtLCBjdXJyZW50X3BvaW50c1swXSkgfHwK
KyAgICAgICAgICAgICAgICAhSXNQb2ludFJlYXNvbmFibGUodHJhbnNmb3JtLCBjdXJyZW50X3Bv
aW50c1sxXSkgfHwKKyAgICAgICAgICAgICAgICAhSXNQb2ludFJlYXNvbmFibGUodHJhbnNmb3Jt
LCBjdXJyZW50X3BvaW50c1syXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYXRoOjprQ3ViaWNfVmVyYjoKKyAgICAg
ICAgICAgIC8vIGl0ZXIubmV4dCByZXR1cm5zIDQgcG9pbnRzLgorICAgICAgICAgICAgaWYgKCFJ
c1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzBdKSB8fAorICAgICAg
ICAgICAgICAgICFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzFd
KSB8fAorICAgICAgICAgICAgICAgICFJc1BvaW50UmVhc29uYWJsZSh0cmFuc2Zvcm0sIGN1cnJl
bnRfcG9pbnRzWzJdKSB8fAorICAgICAgICAgICAgICAgICFJc1BvaW50UmVhc29uYWJsZSh0cmFu
c2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzNdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDbG9zZV9WZXJiOgor
ICAgICAgICBjYXNlIFNrUGF0aDo6a0RvbmVfVmVyYjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworI2Vsc2UK
KyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisvLyBMb2NhbCBoZWxwZXIgZnVuY3Rpb25z
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor
Cit2b2lkIGFkZENvcm5lckFyYyhTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICBjb25z
dCBTa1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBzaXplLAor
ICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0QW5nbGUpCit7CisgICAgU2tJUmVjdCBpcjsKKyAg
ICBpbnQgcnggPSBTa01pbjMyKFNrU2NhbGFyUm91bmQocmVjdC53aWR0aCgpKSwgc2l6ZS53aWR0
aCgpKTsKKyAgICBpbnQgcnkgPSBTa01pbjMyKFNrU2NhbGFyUm91bmQocmVjdC5oZWlnaHQoKSks
IHNpemUuaGVpZ2h0KCkpOworCisgICAgaXIuc2V0KC1yeCwgLXJ5LCByeCwgcnkpOworICAgIHN3
aXRjaCAoc3RhcnRBbmdsZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaXIub2Zmc2V0KHJlY3Qu
ZlJpZ2h0IC0gaXIuZlJpZ2h0LCByZWN0LmZCb3R0b20gLSBpci5mQm90dG9tKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSA5MDoKKyAgICAgICAgaXIub2Zmc2V0KHJlY3QuZkxlZnQgLSBpci5m
TGVmdCwgcmVjdC5mQm90dG9tIC0gaXIuZkJvdHRvbSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgMTgwOgorICAgICAgICBpci5vZmZzZXQocmVjdC5mTGVmdCAtIGlyLmZMZWZ0LCByZWN0LmZU
b3AgLSBpci5mVG9wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzA6CisgICAgICAgIGly
Lm9mZnNldChyZWN0LmZSaWdodCAtIGlyLmZSaWdodCwgcmVjdC5mVG9wIC0gaXIuZlRvcCk7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVCgwKTsKKyAgICB9CisK
KyAgICBTa1JlY3QgcjsKKyAgICByLnNldChpcik7CisgICAgcGF0aC0+YXJjVG8ociwgU2tJbnRU
b1NjYWxhcihzdGFydEFuZ2xlKSwgU2tJbnRUb1NjYWxhcig5MCksIGZhbHNlKTsKK30KKworaW5s
aW5lIGludCBmYXN0TW9kKGludCB2YWx1ZSwgaW50IG1heCkKK3sKKyAgICBpbnQgc2lnbiA9IFNr
RXh0cmFjdFNpZ24odmFsdWUpOworCisgICAgdmFsdWUgPSBTa0FwcGx5U2lnbih2YWx1ZSwgc2ln
bik7CisgICAgaWYgKHZhbHVlID49IG1heCkKKyAgICAgICAgdmFsdWUgJT0gbWF4OworICAgIHJl
dHVybiBTa0FwcGx5U2lnbih2YWx1ZSwgc2lnbik7Cit9CisKK2lubGluZSBmbG9hdCBzcXVhcmUo
ZmxvYXQgbikKK3sKKyAgICByZXR1cm4gbiAqIG47Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCBhIE5V
TEwgcG9pbnRlciB0byBjcmVhdGUgYSBncmFwaGljcyBjb250ZXh0IHRoYXQgaGFzCisvLyBubyBw
YWludGluZy4KK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0KiBnYykKKyAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZh
dGUoKSkKKyAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKGdj
KSkKK3sKKyAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFnYyB8fCAhcGxhdGZvcm1Db250ZXh0KCkt
PmNhbnZhcygpKTsKK30KKworR3JhcGhpY3NDb250ZXh0Ojp+R3JhcGhpY3NDb250ZXh0KCkKK3sK
KyAgICBkZWxldGUgbV9kYXRhOworICAgIHRoaXMtPmRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2
YXRlKG1fY29tbW9uKTsKK30KKworUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIEdyYXBoaWNzQ29u
dGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIXBhaW50aW5nRGlz
YWJsZWQoKSk7CisgICAgcmV0dXJuIG1fZGF0YS0+Y29udGV4dCgpOworfQorCisvLyBTdGF0ZSBz
YXZpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUo
KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIFNhdmUgb3VyIHByaXZhdGUgU3RhdGUuCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNhdmUo
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBS
ZXN0b3JlIG91ciBwcml2YXRlIFN0YXRlLgorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5yZXN0b3Jl
KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZs
b2F0IG9wYWNpdHkpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gV2UgbmVlZCB0aGUgImFscGhhIiBsYXllciBmbGFnIGhlcmUgYmVjYXVz
ZSB0aGUgYmFzZSBsYXllciBpcyBvcGFxdWUKKyAgICAvLyAodGhlIHN1cmZhY2Ugb2YgdGhlIHBh
Z2UpIGJ1dCBsYXllcnMgb24gdG9wIG1heSBoYXZlIHRyYW5zcGFyZW50IHBhcnRzLgorICAgIC8v
IFdpdGhvdXQgZXhwbGljaXRseSBzZXR0aW5nIHRoZSBhbHBoYSBmbGFnLCB0aGUgbGF5ZXIgd2ls
bCBpbmhlcml0IHRoZQorICAgIC8vIG9wYXF1ZSBzZXR0aW5nIG9mIHRoZSBiYXNlIGFuZCBzb21l
IHRoaW5ncyB3b24ndCB3b3JrIHByb3Blcmx5LgorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52
YXMoKS0+c2F2ZUxheWVyQWxwaGEoCisgICAgICAgIDAsCisgICAgICAgIHN0YXRpY19jYXN0PHVu
c2lnbmVkIGNoYXI+KG9wYWNpdHkgKiAyNTUpLAorICAgICAgICBzdGF0aWNfY2FzdDxTa0NhbnZh
czo6U2F2ZUZsYWdzPihTa0NhbnZhczo6a0hhc0FscGhhTGF5ZXJfU2F2ZUZsYWcgfAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhczo6a0Z1bGxDb2xvckxh
eWVyX1NhdmVGbGFnKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3BhcmVu
Y3lMYXllcigpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisjaWYgUExBVEZPUk0oV0lOX09TKQorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMo
KS0+Z2V0VG9wUGxhdGZvcm1EZXZpY2UoKS4KKyAgICAgICAgZml4dXBBbHBoYUJlZm9yZUNvbXBv
c2l0aW5nKCk7CisjZW5kaWYKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPnJlc3Rv
cmUoKTsKK30KKworLy8gR3JhcGhpY3MgcHJpbWl0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmFkZElubmVyUm91bmRlZFJlY3RDbGlwKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlj
a25lc3MpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgU2tSZWN0IHIocmVjdCk7CisgICAgaWYgKCFJc1JlY3RSZWFzb25hYmxlKGdldENUTSgp
LCByKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRP
dmFsKHIsIFNrUGF0aDo6a0NXX0RpcmVjdGlvbik7CisgICAgLy8gb25seSBwZXJmb3JtIHRoZSBp
bnNldCBpZiB3ZSB3b24ndCBpbnZlcnQgcgorICAgIGlmICgyICogdGhpY2tuZXNzIDwgcmVjdC53
aWR0aCgpICYmIDIgKiB0aGlja25lc3MgPCByZWN0LmhlaWdodCgpKSB7CisgICAgICAgIHIuaW5z
ZXQoU2tJbnRUb1NjYWxhcih0aGlja25lc3MpICxTa0ludFRvU2NhbGFyKHRoaWNrbmVzcykpOwor
ICAgICAgICBwYXRoLmFkZE92YWwociwgU2tQYXRoOjprQ0NXX0RpcmVjdGlvbik7CisgICAgfQor
ICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+Y2xpcFBhdGgocGF0aCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4
dCgpLT5hZGRQYXRoKCpwYXRoLnBsYXRmb3JtUGF0aCgpKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmJlZ2luUGF0aCgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5iZWdpblBhdGgoKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUGxhdGZvcm1TaGFkb3coKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0RHJhd0xvb3BlcigwKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChj
b25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU2tSZWN0IHIgPSByZWN0OworICAgIGlmICghSXNSZWN0UmVh
c29uYWJsZShnZXRDVE0oKSwgcikpCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3Jt
Q29udGV4dCgpLT5jYW52YXMoKSwgciwgJnIpOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvckZpbGxpbmcoJnBhaW50KTsKKyAgICBwYWlu
dC5zZXRQb3J0ZXJEdWZmWGZlcm1vZGUoU2tQb3J0ZXJEdWZmOjprQ2xlYXJfTW9kZSk7CisgICAg
cGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UmVjdChyLCBwYWludCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1JlY3Qgcihy
ZWN0KTsKKyAgICBpZiAoIUlzUmVjdFJlYXNvbmFibGUoZ2V0Q1RNKCksIHIpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmNsaXBSZWN0KHIpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFNr
UGF0aCYgcCA9ICpwYXRoLnBsYXRmb3JtUGF0aCgpOworICAgIGlmICghSXNQYXRoUmVhc29uYWJs
ZShnZXRDVE0oKSwgcCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5jYW52YXMoKS0+Y2xpcFBhdGgocCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlw
T3V0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU2tSZWN0IHIocmVjdCk7CisgICAgaWYgKCFJc1JlY3RS
ZWFzb25hYmxlKGdldENUTSgpLCByKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1D
b250ZXh0KCktPmNhbnZhcygpLT5jbGlwUmVjdChyLCBTa1JlZ2lvbjo6a0RpZmZlcmVuY2VfT3Ap
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0
IFNrUGF0aCYgcGF0aCA9ICpwLnBsYXRmb3JtUGF0aCgpOworICAgIGlmICghSXNQYXRoUmVhc29u
YWJsZShnZXRDVE0oKSwgcGF0aCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29u
dGV4dCgpLT5jYW52YXMoKS0+Y2xpcFBhdGgocGF0aCwgU2tSZWdpb246OmtEaWZmZXJlbmNlX09w
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXRFbGxpcHNlSW5SZWN0KGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgU2tSZWN0IG92YWwocmVjdCk7CisgICAgaWYgKCFJc1JlY3RSZWFzb25h
YmxlKGdldENUTSgpLCBvdmFsKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYXRoIHBhdGg7
CisgICAgcGF0aC5hZGRPdmFsKG92YWwsIFNrUGF0aDo6a0NDV19EaXJlY3Rpb24pOworICAgIHBs
YXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+Y2xpcFBhdGgocGF0aCwgU2tSZWdpb246OmtEaWZm
ZXJlbmNlX09wKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRoKFdpbmRSdWxl
IGNsaXBSdWxlKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGNvbnN0IFNrUGF0aCogb2xkUGF0aCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jdXJy
ZW50UGF0aCgpOworICAgIFNrUGF0aCBwYXRoKCpvbGRQYXRoKTsKKyAgICBwYXRoLnNldEZpbGxU
eXBlKGNsaXBSdWxlID09IFJVTEVfRVZFTk9ERCA/IFNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUg
OiBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2Fu
dmFzKCktPmNsaXBQYXRoKHBhdGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFRv
SW1hZ2VCdWZmZXIoY29uc3QgRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IEltYWdlQnVmZmVyKiBpbWFnZUJ1ZmZlcikKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhN
RTogVGhpcyBpcyBuZWVkZWQgZm9yIGltYWdlIG1hc2tpbmcgYW5kIGNvbXBsZXggdGV4dCBmaWxs
cy4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29u
Y2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgeGZvcm0pCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52
YXMoKS0+Y29uY2F0KHhmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdDb252
ZXhQb2x5Z29uKHNpemVfdCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCogcG9pbnRzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkQW50aWFsaWFzKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChudW1Qb2ludHMg
PD0gMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYXRoIHBhdGg7CisKKyAgICBwYXRoLmlu
Y1Jlc2VydmUobnVtUG9pbnRzKTsKKyAgICBwYXRoLm1vdmVUbyhXZWJDb3JlRmxvYXRUb1NrU2Nh
bGFyKHBvaW50c1swXS54KCkpLAorICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2Fs
YXIocG9pbnRzWzBdLnkoKSkpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtUG9pbnRz
OyBpKyspIHsKKyAgICAgICAgcGF0aC5saW5lVG8oV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwb2lu
dHNbaV0ueCgpKSwKKyAgICAgICAgICAgICAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihw
b2ludHNbaV0ueSgpKSk7CisgICAgfQorCisgICAgaWYgKCFJc1BhdGhSZWFzb25hYmxlKGdldENU
TSgpLCBwYXRoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBp
ZiAoZmlsbENvbG9yKCkucmdiKCkgJiAweEZGMDAwMDAwKSB7CisgICAgICAgIHBsYXRmb3JtQ29u
dGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQpOworICAgICAgICBwbGF0Zm9ybUNv
bnRleHQoKS0+Y2FudmFzKCktPmRyYXdQYXRoKHBhdGgsIHBhaW50KTsKKyAgICB9CisKKyAgICBp
ZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgeworICAgICAgICBwYWludC5yZXNldCgpOwor
ICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvclN0cm9raW5nKCZwYWludCwg
MCwgMCk7CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1BhdGgocGF0
aCwgcGFpbnQpOworICAgIH0KK30KKworLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGRy
YXcgdGhlIGxpdHRsZSBjaXJjbGVzIHVzZWQgaW4gbGlzdHMuCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZHJhd0VsbGlwc2UoY29uc3QgSW50UmVjdCYgZWxpcHNlUmVjdCkKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1JlY3QgcmVjdCA9IGVs
aXBzZVJlY3Q7CisgICAgaWYgKCFJc1JlY3RSZWFzb25hYmxlKGdldENUTSgpLCByZWN0KSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBpZiAoZmlsbENvbG9yKCku
cmdiKCkgJiAweEZGMDAwMDAwKSB7CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBh
aW50Rm9yRmlsbGluZygmcGFpbnQpOworICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFz
KCktPmRyYXdPdmFsKHJlY3QsIHBhaW50KTsKKyAgICB9CisgICAgaWYgKHN0cm9rZVN0eWxlKCkg
IT0gTm9TdHJva2UpIHsKKyAgICAgICAgcGFpbnQucmVzZXQoKTsKKyAgICAgICAgcGxhdGZvcm1D
b250ZXh0KCktPnNldHVwUGFpbnRGb3JTdHJva2luZygmcGFpbnQsICZyZWN0LCAwKTsKKyAgICAg
ICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3T3ZhbChyZWN0LCBwYWludCk7Cisg
ICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBDb2xv
ciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOwor
ICAgIHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKKyAgICBpZiAoMCA9PSByZWN0
Q291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUmVnaW9uIGV4dGVyaW9yX3JlZ2lvbjsK
KyAgICBjb25zdCBTa1NjYWxhciBleHRlcmlvcl9vZmZzZXQgPSBXZWJDb3JlRmxvYXRUb1NrU2Nh
bGFyKDAuNSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7
CisgICAgICAgIFNrSVJlY3QgciA9IHJlY3RzW2ldOworICAgICAgICByLmluc2V0KC1leHRlcmlv
cl9vZmZzZXQsIC1leHRlcmlvcl9vZmZzZXQpOworICAgICAgICBleHRlcmlvcl9yZWdpb24ub3Ao
ciwgU2tSZWdpb246OmtVbmlvbl9PcCk7CisgICAgfQorCisgICAgU2tQYXRoIHBhdGg7CisgICAg
U2tQYWludCBwYWludDsKKyAgICBwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgcGFpbnQu
c2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7CisKKyAgICBwYWludC5zZXRDb2xvcihm
b2N1c1JpbmdDb2xvcigpLnJnYigpKTsKKyAgICBwYWludC5zZXRTdHJva2VXaWR0aChleHRlcmlv
cl9vZmZzZXQgKiAyKTsKKyAgICBwYWludC5zZXRQYXRoRWZmZWN0KG5ldyBTa0Nvcm5lclBhdGhF
ZmZlY3QoZXh0ZXJpb3Jfb2Zmc2V0ICogMikpLT51bnJlZigpOworICAgIGV4dGVyaW9yX3JlZ2lv
bi5nZXRCb3VuZGFyeVBhdGgoJnBhdGgpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMo
KS0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCisvLyBUaGlzIGlzIG9ubHkgdXNlZCB0byBk
cmF3IGJvcmRlcnMuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmUoY29uc3QgSW50UG9p
bnQmIHBvaW50MSwgY29uc3QgSW50UG9pbnQmIHBvaW50MikKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJva2VTdHlsZSBwZW5TdHlsZSA9
IHN0cm9rZVN0eWxlKCk7CisgICAgaWYgKHBlblN0eWxlID09IE5vU3Ryb2tlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIFNrUG9pbnQgcHRzWzJdID0geyAoU2tQ
b2ludClwb2ludDEsIChTa1BvaW50KXBvaW50MiB9OworICAgIGlmICghSXNQb2ludFJlYXNvbmFi
bGUoZ2V0Q1RNKCksIHB0c1swXSkgfHwKKyAgICAgICAgIUlzUG9pbnRSZWFzb25hYmxlKGdldENU
TSgpLCBwdHNbMV0pKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBrbm93IHRoZXNlIGFy
ZSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGxpbmVzLCBzbyB0aGUgbGVuZ3RoIHdpbGwganVzdAor
ICAgIC8vIGJlIHRoZSBzdW0gb2YgdGhlIGRpc3BsYWNlbWVudCBjb21wb25lbnQgdmVjdG9ycyBn
aXZlIG9yIHRha2UgMSAtCisgICAgLy8gcHJvYmFibHkgd29ydGggdGhlIHNwZWVkIHVwIG9mIG5v
IHNxdWFyZSByb290LCB3aGljaCBhbHNvIHdvbid0IGJlIGV4YWN0LgorICAgIFNrUG9pbnQgZGlz
cCA9IHB0c1sxXSAtIHB0c1swXTsKKyAgICBpbnQgbGVuZ3RoID0gU2tTY2FsYXJSb3VuZChkaXNw
LmZYICsgZGlzcC5mWSk7CisgICAgaW50IHdpZHRoID0gcm91bmRmKAorICAgICAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+c2V0dXBQYWludEZvclN0cm9raW5nKCZwYWludCwgMCwgbGVuZ3RoKSk7CisK
KyAgICAvLyAiQm9ycm93ZWQiIHRoaXMgY29tbWVudCBhbmQgaWRlYSBmcm9tIEdyYXBoaWNzQ29u
dGV4dENHLmNwcAorICAgIC8vIEZvciBvZGQgd2lkdGhzLCB3ZSBhZGQgaW4gMC41IHRvIHRoZSBh
cHByb3ByaWF0ZSB4L3kgc28gdGhhdCB0aGUgZmxvYXQKKyAgICAvLyBhcml0aG1ldGljIHdvcmtz
IG91dC4gIEZvciBleGFtcGxlLCB3aXRoIGEgYm9yZGVyIHdpZHRoIG9mIDMsIEtIVE1MIHdpbGwK
KyAgICAvLyBwYXNzIHVzICh5MSt5MikvMiwgZS5nLiwgKDUwKzUzKS8yID0gMTAzLzIgPSA1MSB3
aGVuIHdlIHdhbnQgNTEuNS4gIEl0IGlzCisgICAgLy8gYWx3YXlzIHRydWUgdGhhdCBhbiBldmVu
IHdpZHRoIGdhdmUgdXMgYSBwZXJmZWN0IHBvc2l0aW9uLCBidXQgYW4gb2RkCisgICAgLy8gd2lk
dGggZ2F2ZSB1cyBhIHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgorICAgIGJv
b2wgaXNWZXJ0aWNhbExpbmUgPSBwdHNbMF0uZlggPT0gcHRzWzFdLmZYOworCisgICAgaWYgKHdp
ZHRoICYgMSkgeyAgLy8gT2RkLgorICAgICAgICBpZiAoaXNWZXJ0aWNhbExpbmUpIHsKKyAgICAg
ICAgICAgIHB0c1swXS5mWCA9IHB0c1swXS5mWCArIFNLX1NjYWxhckhhbGY7CisgICAgICAgICAg
ICBwdHNbMV0uZlggPSBwdHNbMF0uZlg7CisgICAgICAgIH0gZWxzZSB7ICAvLyBIb3Jpem9udGFs
IGxpbmUKKyAgICAgICAgICAgIHB0c1swXS5mWSA9IHB0c1swXS5mWSArIFNLX1NjYWxhckhhbGY7
CisgICAgICAgICAgICBwdHNbMV0uZlkgPSBwdHNbMF0uZlk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UG9pbnRzKAorICAgICAgICBTa0Nh
bnZhczo6a0xpbmVzX1BvaW50TW9kZSwgMiwgcHRzLCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBv
aW50JiBwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ3JhbW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDcmVhdGUgdGhlIHBhdHRlcm4g
d2UnbGwgdXNlIHRvIGRyYXcgdGhlIHVuZGVybGluZS4KKyAgICBzdGF0aWMgU2tCaXRtYXAqIG1p
c3NwZWxsX2JpdG1hcCA9IDA7CisgICAgaWYgKCFtaXNzcGVsbF9iaXRtYXApIHsKKyAgICAgICAg
Ly8gV2UgdXNlIGEgMi1waXhlbC1oaWdoIG1pc3NwZWxsaW5nIGluZGljYXRvciBiZWNhdXNlIHRo
YXQgc2VlbXMgdG8gYmUKKyAgICAgICAgLy8gd2hhdCBXZWJLaXQgaXMgZGVzaWduZWQgZm9yLCBh
bmQgaG93IG11Y2ggcm9vbSB0aGVyZSBpcyBpbiBhIHR5cGljYWwKKyAgICAgICAgLy8gcGFnZSBm
b3IgaXQuCisgICAgICAgIGNvbnN0IGludCByb3dfcGl4ZWxzID0gMzI7ICAvLyBNdXN0IGJlIG11
bHRpcGxlIG9mIDQgZm9yIHBhdHRlcm4gYmVsb3cuCisgICAgICAgIGNvbnN0IGludCBjb2xfcGl4
ZWxzID0gMjsKKyAgICAgICAgbWlzc3BlbGxfYml0bWFwID0gbmV3IFNrQml0bWFwOworICAgICAg
ICBtaXNzcGVsbF9iaXRtYXAtPnNldENvbmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19waXhlbHMsIGNvbF9waXhl
bHMpOworICAgICAgICBtaXNzcGVsbF9iaXRtYXAtPmFsbG9jUGl4ZWxzKCk7CisKKyAgICAgICAg
bWlzc3BlbGxfYml0bWFwLT5lcmFzZUFSR0IoMCwgMCwgMCwgMCk7CisgICAgICAgIGNvbnN0IHVp
bnQzMl90IGxpbmVfY29sb3IgPSAweEZGRkYwMDAwOyAgLy8gT3BhcXVlIHJlZC4KKyAgICAgICAg
Y29uc3QgdWludDMyX3QgYW50aV9jb2xvciA9IDB4NjA2MDAwMDA7ICAvLyBTZW1pdHJhbnNwYXJl
bnQgcmVkLgorCisgICAgICAgIC8vIFBhdHRlcm46ICBYIG8gICBvIFggbyAgIG8gWAorICAgICAg
ICAvLyAgICAgICAgICAgICBvIFggbyAgIG8gWCBvCisgICAgICAgIHVpbnQzMl90KiByb3cxID0g
bWlzc3BlbGxfYml0bWFwLT5nZXRBZGRyMzIoMCwgMCk7CisgICAgICAgIHVpbnQzMl90KiByb3cy
ID0gbWlzc3BlbGxfYml0bWFwLT5nZXRBZGRyMzIoMCwgMSk7CisgICAgICAgIGZvciAoaW50IHgg
PSAwOyB4IDwgcm93X3BpeGVsczsgeCArKykgeworICAgICAgICAgICAgc3dpdGNoICh4ICUgNCkg
eworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJvdzFbeF0gPSBsaW5lX2Nv
bG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAg
ICAgICAgICAgIHJvdzFbeF0gPSBhbnRpX2NvbG9yOworICAgICAgICAgICAgICAgIHJvdzJbeF0g
PSBhbnRpX2NvbG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAy
OgorICAgICAgICAgICAgICAgIHJvdzJbeF0gPSBsaW5lX2NvbG9yOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHJvdzFbeF0gPSBh
bnRpX2NvbG9yOworICAgICAgICAgICAgICAgIHJvdzJbeF0gPSBhbnRpX2NvbG9yOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gT2Zmc2V0IGl0IHZlcnRpY2FsbHkgYnkgMSBzbyB0aGF0IHRoZXJlJ3Mgc29tZSBzcGFjZSB1
bmRlciB0aGUgdGV4dC4KKyAgICBTa1NjYWxhciBvcmlnaW5feCA9IFNrSW50VG9TY2FsYXIocHQu
eCgpKTsKKyAgICBTa1NjYWxhciBvcmlnaW5feSA9IFNrSW50VG9TY2FsYXIocHQueSgpKSArIDE7
CisKKyAgICAvLyBNYWtlIGEgc2hhZGVyIGZvciB0aGUgYml0bWFwIHdpdGggYW4gb3JpZ2luIG9m
IHRoZSBib3ggd2UnbGwgZHJhdy4gVGhpcworICAgIC8vIHNoYWRlciBpcyByZWZjb3VudGVkIGFu
ZCB3aWxsIGhhdmUgYW4gaW5pdGlhbCByZWZjb3VudCBvZiAxLgorICAgIFNrU2hhZGVyKiBzaGFk
ZXIgPSBTa1NoYWRlcjo6Q3JlYXRlQml0bWFwU2hhZGVyKAorICAgICAgICAqbWlzc3BlbGxfYml0
bWFwLCBTa1NoYWRlcjo6a1JlcGVhdF9UaWxlTW9kZSwKKyAgICAgICAgU2tTaGFkZXI6OmtSZXBl
YXRfVGlsZU1vZGUpOworICAgIFNrTWF0cml4IG1hdHJpeDsKKyAgICBtYXRyaXgucmVzZXQoKTsK
KyAgICBtYXRyaXgucG9zdFRyYW5zbGF0ZShvcmlnaW5feCwgb3JpZ2luX3kpOworICAgIHNoYWRl
ci0+c2V0TG9jYWxNYXRyaXgobWF0cml4KTsKKworICAgIC8vIEFzc2lnbiB0aGUgc2hhZGVyIHRv
IHRoZSBwYWludCAmIHJlbGVhc2Ugb3VyIHJlZmVyZW5jZS4gVGhlIHBhaW50IHdpbGwKKyAgICAv
LyBub3cgb3duIHRoZSBzaGFkZXIgYW5kIHRoZSBzaGFkZXIgd2lsbCBiZSBkZXN0cm95ZWQgd2hl
biB0aGUgcGFpbnQgZ29lcworICAgIC8vIG91dCBvZiBzY29wZS4KKyAgICBTa1BhaW50IHBhaW50
OworICAgIHBhaW50LnNldFNoYWRlcihzaGFkZXIpOworICAgIHNoYWRlci0+dW5yZWYoKTsKKwor
ICAgIFNrUmVjdCByZWN0OworICAgIHJlY3Quc2V0KG9yaWdpbl94LAorICAgICAgICAgICAgIG9y
aWdpbl95LAorICAgICAgICAgICAgIG9yaWdpbl94ICsgU2tJbnRUb1NjYWxhcih3aWR0aCksCisg
ICAgICAgICAgICAgb3JpZ2luX3kgKyBTa0ludFRvU2NhbGFyKG1pc3NwZWxsX2JpdG1hcC0+aGVp
Z2h0KCkpKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdSZWN0KHJlY3Qs
IHBhaW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25z
dCBJbnRQb2ludCYgcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmlu
dGluZykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBpbnQgdGhpY2tuZXNzID0gU2tNYXgzMihzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVRoaWNr
bmVzcygpKSwgMSk7CisgICAgU2tSZWN0IHI7CisgICAgci5mTGVmdCA9IFNrSW50VG9TY2FsYXIo
cHQueCgpKTsKKyAgICByLmZUb3AgPSBTa0ludFRvU2NhbGFyKHB0LnkoKSk7CisgICAgci5mUmln
aHQgPSByLmZMZWZ0ICsgU2tJbnRUb1NjYWxhcih3aWR0aCk7CisgICAgci5mQm90dG9tID0gci5m
VG9wICsgU2tJbnRUb1NjYWxhcih0aGlja25lc3MpOworCisgICAgU2tQYWludCBwYWludDsKKyAg
ICBwYWludC5zZXRDb2xvcih0aGlzLT5zdHJva2VDb2xvcigpLnJnYigpKTsKKyAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdSZWN0KHIsIHBhaW50KTsKK30KKworLy8gRHJhd3Mg
YSBmaWxsZWQgcmVjdGFuZ2xlIHdpdGggYSBzdHJva2VkIGJvcmRlci4KK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUmVjdCByID0gcmVjdDsKKyAg
ICBpZiAoIUlzUmVjdFJlYXNvbmFibGUoZ2V0Q1RNKCksIHIpKSB7CisgICAgICAgIC8vIFNlZSB0
aGUgZmlsbFJlY3QgYmVsb3cuCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29u
dGV4dCgpLT5jYW52YXMoKSwgciwgJnIpOworICAgIH0KKworICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5kcmF3UmVjdChyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKCkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgY29uc3Qg
U2tQYXRoJiBwYXRoID0gKnBsYXRmb3JtQ29udGV4dCgpLT5jdXJyZW50UGF0aCgpOworICAgIGlm
ICghSXNQYXRoUmVhc29uYWJsZShnZXRDVE0oKSwgcGF0aCkpCisgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUgPSBtX2NvbW1vbi0+c3RhdGU7Cisg
ICAgQ29sb3JTcGFjZSBjb2xvclNwYWNlID0gc3RhdGUuZmlsbENvbG9yU3BhY2U7CisKKyAgICBp
ZiAoY29sb3JTcGFjZSA9PSBTb2xpZENvbG9yU3BhY2UgJiYgIWZpbGxDb2xvcigpLmFscGhhKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRGaWxsUnVsZShz
dGF0ZS5maWxsUnVsZSA9PSBSVUxFX0VWRU5PREQgPworICAgICAgICBTa1BhdGg6OmtFdmVuT2Rk
X0ZpbGxUeXBlIDogU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZSk7CisKKyAgICBTa1BhaW50IHBh
aW50OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQp
OworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gUGF0dGVybkNvbG9yU3BhY2UpIHsKKyAgICAgICAg
U2tTaGFkZXIqIHBhdCA9IHN0YXRlLmZpbGxQYXR0ZXJuLT5jcmVhdGVQbGF0Zm9ybVBhdHRlcm4o
Z2V0Q1RNKCkpOworICAgICAgICBwYWludC5zZXRTaGFkZXIocGF0KTsKKyAgICAgICAgcGF0LT51
bnJlZigpOworICAgIH0gZWxzZSBpZiAoY29sb3JTcGFjZSA9PSBHcmFkaWVudENvbG9yU3BhY2Up
CisgICAgICAgIHBhaW50LnNldFNoYWRlcihzdGF0ZS5maWxsR3JhZGllbnQtPnBsYXRmb3JtR3Jh
ZGllbnQoKSk7CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdQYXRoKHBh
dGgsIHBhaW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTa1JlY3QgciA9IHJlY3Q7CisgICAgaWYgKCFJc1JlY3RSZWFzb25hYmxl
KGdldENUTSgpLCByKSkgeworICAgICAgICAvLyBTZWUgdGhlIG90aGVyIHZlcnNpb24gb2YgZmls
bFJlY3QgYmVsb3cuCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29udGV4dCgp
LT5jYW52YXMoKSwgciwgJnIpOworICAgIH0KKworICAgIGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0
YXRlJiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAgICBDb2xvclNwYWNlIGNvbG9yU3BhY2Ug
PSBzdGF0ZS5maWxsQ29sb3JTcGFjZTsKKworICAgIGlmIChjb2xvclNwYWNlID09IFNvbGlkQ29s
b3JTcGFjZSAmJiAhZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
U2tQYWludCBwYWludDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvckZpbGxp
bmcoJnBhaW50KTsKKworICAgIGlmIChjb2xvclNwYWNlID09IFBhdHRlcm5Db2xvclNwYWNlKSB7
CisgICAgICAgIFNrU2hhZGVyKiBwYXQgPSBzdGF0ZS5maWxsUGF0dGVybi0+Y3JlYXRlUGxhdGZv
cm1QYXR0ZXJuKGdldENUTSgpKTsKKyAgICAgICAgcGFpbnQuc2V0U2hhZGVyKHBhdCk7CisgICAg
ICAgIHBhdC0+dW5yZWYoKTsKKyAgICB9IGVsc2UgaWYgKGNvbG9yU3BhY2UgPT0gR3JhZGllbnRD
b2xvclNwYWNlKQorICAgICAgICBwYWludC5zZXRTaGFkZXIoc3RhdGUuZmlsbEdyYWRpZW50LT5w
bGF0Zm9ybUdyYWRpZW50KCkpOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5k
cmF3UmVjdChyLCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChj
b25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY29sb3IucmdiKCkg
JiAweEZGMDAwMDAwKSB7CisgICAgICAgIFNrUmVjdCByID0gcmVjdDsKKyAgICAgICAgaWYgKCFJ
c1JlY3RSZWFzb25hYmxlKGdldENUTSgpLCByKSkgeworICAgICAgICAgICAgLy8gU3BlY2lhbCBj
YXNlIHdoZW4gdGhlIHJlY3RhbmdsZSBvdmVyZmxvd3MgZml4ZWQgcG9pbnQuIFRoaXMgaXMgYQor
ICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCB0byBmaXggYnVnIDEyMTI4NDQuIFdoZW4gdGhlIGlu
cHV0IHJlY3RhbmdsZSBpcyB2ZXJ5CisgICAgICAgICAgICAvLyBsYXJnZSwgaXQgY2FuIG92ZXJm
bG93IFNraWEncyBpbnRlcm5hbCBmaXhlZCBwb2ludCByZWN0LiBUaGlzCisgICAgICAgICAgICAv
LyBzaG91bGQgYmUgZml4YWJsZSBpbiBTa2lhIChzaW5jZSB0aGUgb3V0cHV0IGJpdG1hcCBpc24n
dCB0aGF0CisgICAgICAgICAgICAvLyBsYXJnZSksIGJ1dCB1bnRpbCB0aGF0IGlzIGZpeGVkLCB3
ZSB0cnkgdG8gaGFuZGxlIGl0IG91cnNlbHZlcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAg
ICAvLyBXZSBtYW51YWxseSBjbGlwIHRoZSByZWN0YW5nbGUgdG8gdGhlIGN1cnJlbnQgY2xpcCBy
ZWN0LiBUaGlzCisgICAgICAgICAgICAvLyB3aWxsIHByZXZlbnQgb3ZlcmZsb3cuIFRoZSByZWN0
YW5nbGUgd2lsbCBiZSB0cmFuc2Zvcm1lZCB0byB0aGUKKyAgICAgICAgICAgIC8vIGNhbnZhcycg
Y29vcmRpbmF0ZSBzcGFjZSBiZWZvcmUgaXQgaXMgY29udmVydGVkIHRvIGZpeGVkIHBvaW50Cisg
ICAgICAgICAgICAvLyBzbyB3ZSBhcmUgZ3VhcmFudGVlZCBub3QgdG8gb3ZlcmZsb3cgYWZ0ZXIg
ZG9pbmcgdGhpcy4KKyAgICAgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29udGV4
dCgpLT5jYW52YXMoKSwgciwgJnIpOworICAgICAgICB9CisKKyAgICAgICAgU2tQYWludCBwYWlu
dDsKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRDb21tb24oJnBhaW50KTsK
KyAgICAgICAgcGFpbnQuc2V0Q29sb3IoY29sb3IucmdiKCkpOworICAgICAgICBwbGF0Zm9ybUNv
bnRleHQoKS0+Y2FudmFzKCktPmRyYXdSZWN0KHIsIHBhaW50KTsKKyAgICB9Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50U2l6ZSYgdG9wTGVm
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50U2l6ZSYg
dG9wUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElu
dFNpemUmIGJvdHRvbUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEludFNpemUmIGJvdHRvbVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tSZWN0IHIgPSByZWN0OworICAgIGlmICgh
SXNSZWN0UmVhc29uYWJsZShnZXRDVE0oKSwgcikpIHsKKyAgICAgICAgLy8gU2VlIGZpbGxSZWN0
KCkuCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMo
KSwgciwgJnIpOworICAgIH0KKworICAgIFNrUGF0aCBwYXRoOworICAgIGFkZENvcm5lckFyYygm
cGF0aCwgciwgdG9wUmlnaHQsIDI3MCk7CisgICAgYWRkQ29ybmVyQXJjKCZwYXRoLCByLCBib3R0
b21SaWdodCwgMCk7CisgICAgYWRkQ29ybmVyQXJjKCZwYXRoLCByLCBib3R0b21MZWZ0LCA5MCk7
CisgICAgYWRkQ29ybmVyQXJjKCZwYXRoLCByLCB0b3BMZWZ0LCAxODApOworCisgICAgU2tQYWlu
dCBwYWludDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvckZpbGxpbmcoJnBh
aW50KTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdQYXRoKHBhdGgsIHBh
aW50KTsKKyAgICByZXR1cm4gZmlsbFJlY3QocmVjdCwgY29sb3IpOworfQorCitBZmZpbmVUcmFu
c2Zvcm0gR3JhcGhpY3NDb250ZXh0OjpnZXRDVE0oKSBjb25zdAoreworICAgIHJldHVybiBwbGF0
Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmdldFRvdGFsTWF0cml4KCk7Cit9CisKK0Zsb2F0UmVj
dCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQoreworICAgIC8vIFRoaXMgbG9naWMgaXMgY29waWVkIGZyb20gR3JhcGhpY3NDb250ZXh0
Q0csIGVzZWlkZWwgNS8wNS8wOAorCisgICAgLy8gSXQgaXMgbm90IGVub3VnaCBqdXN0IHRvIHJv
dW5kIHRvIHBpeGVscyBpbiBkZXZpY2Ugc3BhY2UuIFRoZSByb3RhdGlvbgorICAgIC8vIHBhcnQg
b2YgdGhlIGFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHRvIGRldmljZSBzcGFjZSBjYW4gbWVzcyB3
aXRoIHRoaXMKKyAgICAvLyBjb252ZXJzaW9uIGlmIHdlIGhhdmUgYSByb3RhdGluZyBpbWFnZSBs
aWtlIHRoZSBoYW5kcyBvZiB0aGUgd29ybGQgY2xvY2sKKyAgICAvLyB3aWRnZXQuIFdlIGp1c3Qg
bmVlZCB0aGUgc2NhbGUsIHNvIHdlIGdldCB0aGUgYWZmaW5lIHRyYW5zZm9ybSBtYXRyaXggYW5k
CisgICAgLy8gZXh0cmFjdCB0aGUgc2NhbGUuCisKKyAgICBjb25zdCBTa01hdHJpeCYgZGV2aWNl
TWF0cml4ID0KKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5nZXRUb3RhbE1h
dHJpeCgpOworICAgIGlmIChkZXZpY2VNYXRyaXguaXNJZGVudGl0eSgpKQorICAgICAgICByZXR1
cm4gcmVjdDsKKworICAgIGZsb2F0IGRldmljZVNjYWxlWCA9IHNxcnRmKHNxdWFyZShkZXZpY2VN
YXRyaXguZ2V0U2NhbGVYKCkpCisgICAgICAgICsgc3F1YXJlKGRldmljZU1hdHJpeC5nZXRTa2V3
WSgpKSk7CisgICAgZmxvYXQgZGV2aWNlU2NhbGVZID0gc3FydGYoc3F1YXJlKGRldmljZU1hdHJp
eC5nZXRTa2V3WCgpKQorICAgICAgICArIHNxdWFyZShkZXZpY2VNYXRyaXguZ2V0U2NhbGVZKCkp
KTsKKworICAgIEZsb2F0UG9pbnQgZGV2aWNlT3JpZ2luKHJlY3QueCgpICogZGV2aWNlU2NhbGVY
LCByZWN0LnkoKSAqIGRldmljZVNjYWxlWSk7CisgICAgRmxvYXRQb2ludCBkZXZpY2VMb3dlclJp
Z2h0KChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSkgKiBkZXZpY2VTY2FsZVgsCisgICAgICAgIChy
ZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkpICogZGV2aWNlU2NhbGVZKTsKKworICAgIGRldmljZU9y
aWdpbi5zZXRYKHJvdW5kZihkZXZpY2VPcmlnaW4ueCgpKSk7CisgICAgZGV2aWNlT3JpZ2luLnNl
dFkocm91bmRmKGRldmljZU9yaWdpbi55KCkpKTsKKyAgICBkZXZpY2VMb3dlclJpZ2h0LnNldFgo
cm91bmRmKGRldmljZUxvd2VyUmlnaHQueCgpKSk7CisgICAgZGV2aWNlTG93ZXJSaWdodC5zZXRZ
KHJvdW5kZihkZXZpY2VMb3dlclJpZ2h0LnkoKSkpOworCisgICAgLy8gRG9uJ3QgbGV0IHRoZSBo
ZWlnaHQgb3Igd2lkdGggcm91bmQgdG8gMCB1bmxlc3MgZWl0aGVyIHdhcyBvcmlnaW5hbGx5IDAK
KyAgICBpZiAoZGV2aWNlT3JpZ2luLnkoKSA9PSBkZXZpY2VMb3dlclJpZ2h0LnkoKSAmJiByZWN0
LmhlaWdodCgpICE9IDApCisgICAgICAgIGRldmljZUxvd2VyUmlnaHQubW92ZSgwLCAxKTsKKyAg
ICBpZiAoZGV2aWNlT3JpZ2luLngoKSA9PSBkZXZpY2VMb3dlclJpZ2h0LngoKSAmJiByZWN0Lndp
ZHRoKCkgIT0gMCkKKyAgICAgICAgZGV2aWNlTG93ZXJSaWdodC5tb3ZlKDEsIDApOworCisgICAg
RmxvYXRQb2ludCByb3VuZGVkT3JpZ2luKGRldmljZU9yaWdpbi54KCkgLyBkZXZpY2VTY2FsZVgs
CisgICAgICAgIGRldmljZU9yaWdpbi55KCkgLyBkZXZpY2VTY2FsZVkpOworICAgIEZsb2F0UG9p
bnQgcm91bmRlZExvd2VyUmlnaHQoZGV2aWNlTG93ZXJSaWdodC54KCkgLyBkZXZpY2VTY2FsZVgs
CisgICAgICAgIGRldmljZUxvd2VyUmlnaHQueSgpIC8gZGV2aWNlU2NhbGVZKTsKKyAgICByZXR1
cm4gRmxvYXRSZWN0KHJvdW5kZWRPcmlnaW4sIHJvdW5kZWRMb3dlclJpZ2h0IC0gcm91bmRlZE9y
aWdpbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzY2FsZShjb25zdCBGbG9hdFNpemUm
IHNpemUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+c2NhbGUoV2ViQ29yZUZsb2F0VG9Ta1Nj
YWxhcihzaXplLndpZHRoKCkpLAorICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNpemUu
aGVpZ2h0KCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEFscGhhKGZsb2F0IGFs
cGhhKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAg
ICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0QWxwaGEoYWxwaGEpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+c2V0UG9ydGVyRHVmZk1vZGUoV2ViQ29yZUNvbXBvc2l0ZVRvU2tpYUNvbXBv
c2l0ZShvcCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0SW1hZ2VJbnRlcnBvbGF0
aW9uUXVhbGl0eShJbnRlcnBvbGF0aW9uUXVhbGl0eSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGNhcCkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgc3dpdGNo
IChjYXApIHsKKyAgICBjYXNlIEJ1dHRDYXA6CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5z
ZXRMaW5lQ2FwKFNrUGFpbnQ6OmtCdXR0X0NhcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Um91bmRDYXA6CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRMaW5lQ2FwKFNrUGFpbnQ6
OmtSb3VuZF9DYXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNxdWFyZUNhcDoKKyAgICAg
ICAgcGxhdGZvcm1Db250ZXh0KCktPnNldExpbmVDYXAoU2tQYWludDo6a1NxdWFyZV9DYXApOwor
ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlQoMCk7CisgICAgICAg
IGJyZWFrOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVEYXNoKGNv
bnN0IERhc2hBcnJheSYgZGFzaGVzLCBmbG9hdCBkYXNoT2Zmc2V0KQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBs
aWZ0ZWQgZGlyZWN0bHkgb2ZmIFNraWFTdXBwb3J0LCBsaW5lcyA0OS03NAorICAgIC8vIHNvIGl0
IGlzIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5LgorICAgIHNpemVfdCBkYXNoTGVu
Z3RoID0gZGFzaGVzLnNpemUoKTsKKyAgICBpZiAoIWRhc2hMZW5ndGgpCisgICAgICAgIHJldHVy
bjsKKworICAgIHNpemVfdCBjb3VudCA9IChkYXNoTGVuZ3RoICUgMikgPT0gMCA/IGRhc2hMZW5n
dGggOiBkYXNoTGVuZ3RoICogMjsKKyAgICBTa1NjYWxhciogaW50ZXJ2YWxzID0gbmV3IFNrU2Nh
bGFyW2NvdW50XTsKKworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkr
KykKKyAgICAgICAgaW50ZXJ2YWxzW2ldID0gZGFzaGVzW2kgJSBkYXNoTGVuZ3RoXTsKKworICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5zZXREYXNoUGF0aEVmZmVjdChuZXcgU2tEYXNoUGF0aEVmZmVj
dChpbnRlcnZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb3VudCwgZGFzaE9mZnNldCkpOworCisgICAgZGVsZXRlW10gaW50ZXJ2YWxzOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvaW4gam9pbikKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgc3dpdGNo
IChqb2luKSB7CisgICAgY2FzZSBNaXRlckpvaW46CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5zZXRMaW5lSm9pbihTa1BhaW50OjprTWl0ZXJfSm9pbik7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgUm91bmRKb2luOgorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0TGluZUpvaW4o
U2tQYWludDo6a1JvdW5kX0pvaW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJldmVsSm9p
bjoKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldExpbmVKb2luKFNrUGFpbnQ6OmtCZXZl
bF9Kb2luKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKDAp
OworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRN
aXRlckxpbWl0KGZsb2F0IGxpbWl0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0TWl0ZXJMaW1pdChsaW1p
dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUZpbGxDb2xvcihjb25z
dCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRGaWxsQ29sb3IoY29sb3IucmdiKCkp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaGFkb3coY29uc3QgSW50
U2l6ZSYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg
Ymx1cl9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
Q29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGRvdWJsZSB3aWR0aCA9IHNpemUud2lkdGgoKTsKKyAgICBkb3VibGUgaGVp
Z2h0ID0gc2l6ZS5oZWlnaHQoKTsKKyAgICBkb3VibGUgYmx1ciA9IGJsdXJfaW50OworCisgICAg
aWYgKCFtX2NvbW1vbi0+c3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpICB7CisgICAgICAg
IEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBnZXRDVE0oKTsKKyAgICAgICAgdHJhbnNmb3Jt
Lm1hcCh3aWR0aCwgaGVpZ2h0LCAmd2lkdGgsICZoZWlnaHQpOworCisgICAgICAgIC8vIFRyYW5z
Zm9ybSBmb3IgdGhlIGJsdXIKKyAgICAgICAgZG91YmxlIGEgPSB0cmFuc2Zvcm0uYSgpICogdHJh
bnNmb3JtLmEoKSArIHRyYW5zZm9ybS5iKCkgKiB0cmFuc2Zvcm0uYigpOworICAgICAgICBkb3Vi
bGUgYiA9IHRyYW5zZm9ybS5hKCkgKiB0cmFuc2Zvcm0uYygpICsgdHJhbnNmb3JtLmIoKSAqIHRy
YW5zZm9ybS5kKCk7CisgICAgICAgIGRvdWJsZSBjID0gYjsKKyAgICAgICAgZG91YmxlIGQgPSB0
cmFuc2Zvcm0uYygpICogdHJhbnNmb3JtLmMoKSArIHRyYW5zZm9ybS5kKCkgKiB0cmFuc2Zvcm0u
ZCgpOworICAgICAgICBkb3VibGUgZWlnZW52YWx1ZSA9IHNxcnQoMC41ICogKChhICsgZCkgLSBz
cXJ0KDQgKiBiICogYyArIChhIC0gZCkgKiAoYSAtIGQpKSkpOworICAgICAgICBibHVyICo9IGVp
Z2VudmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBpcyB3ZWlyZCwgYnV0IHNo
YWRvd3MgZ2V0IGRyb3BwZWQgaW4gdGhlIHdyb25nIGRpcmVjdGlvbiBmb3IKKyAgICAgICAgLy8g
Y2FudmFzIGVsZW1lbnRzIHdpdGhvdXQgdGhpcy4KKyAgICAgICAgaGVpZ2h0ID0gLWhlaWdodDsK
KyAgICB9CisKKyAgICBTa0NvbG9yIGM7CisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkKKyAgICAg
ICAgYyA9IGNvbG9yLnJnYigpOworICAgIGVsc2UKKyAgICAgICAgYyA9IFNrQ29sb3JTZXRBUkdC
KDB4RkYvMywgMCwgMCwgMCk7ICAgIC8vICJzdGQiIGFwcGxlIHNoYWRvdyBjb2xvci4KKworICAg
IC8vIEZJWE1FOiBTaG91bGQgd2UgaGF2ZSBhIG1heCB2YWx1ZSBmb3IgdGhlIGJsdXI/ICBDRyBj
bGFtcHMgYXQgMTAwMC4wCisgICAgLy8gZm9yIHBlcmYgcmVhc29ucy4KKyAgICBTa0RyYXdMb29w
ZXIqIGRsID0gbmV3IFNrQmx1ckRyYXdMb29wZXIoYmx1ciAvIDIsIHdpZHRoLCBoZWlnaHQsIGMp
OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXREcmF3TG9vcGVyKGRsKTsKKyAgICBkbC0+dW5y
ZWYoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3Io
Y29uc3QgQ29sb3ImIHN0cm9rZWNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0U3Ryb2tlQ29sb3Io
c3Ryb2tlY29sb3IucmdiKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZv
cm1TdHJva2VTdHlsZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0U3Ryb2tlU3R5bGUoc3Ryb2tlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBs
YXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHRoaWNrbmVzcykKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNl
dFN0cm9rZVRoaWNrbmVzcyh0aGlja25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1UZXh0RHJhd2luZ01vZGUoaW50IG1vZGUpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRU
ZXh0RHJhd2luZ01vZGUobW9kZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVUkxG
b3JSZWN0KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0KQoreworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VXNlQW50aWFsaWFzaW5nKGJvb2wgZW5hYmxlKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwbGF0
Zm9ybUNvbnRleHQoKS0+c2V0VXNlQW50aWFsaWFzaW5nKGVuYWJsZSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzdHJva2VBcmMoY29uc3QgSW50UmVjdCYgciwgaW50IHN0YXJ0QW5nbGUs
IGludCBhbmdsZVNwYW4pCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBTa1JlY3Qgb3ZhbCA9IHI7CisgICAg
aWYgKHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UpIHsKKyAgICAgICAgLy8gU3Ryb2tlIHVzaW5n
IHRoZSBmaWxsIGNvbG9yLgorICAgICAgICAvLyBGSVhNRTogaXMgdGhpcyByZWFsbHkgY29ycmVj
dD8gSXQgc2VlbXMgdW5yZWFzb25hYmxlLgorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0
dXBQYWludEZvckZpbGxpbmcoJnBhaW50KTsKKyAgICAgICAgcGFpbnQuc2V0U3R5bGUoU2tQYWlu
dDo6a1N0cm9rZV9TdHlsZSk7CisgICAgICAgIHBhaW50LnNldFN0cm9rZVdpZHRoKFdlYkNvcmVG
bG9hdFRvU2tTY2FsYXIoc3Ryb2tlVGhpY2tuZXNzKCkpKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
cGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRGb3JTdHJva2luZygmcGFpbnQsIDAsIDApOwor
CisgICAgLy8gV2UgZG8gdGhpcyBiZWZvcmUgY29udmVydGluZyB0byBzY2FsYXIsIHNvIHdlIGRv
bid0IG92ZXJmbG93IFNrRml4ZWQuCisgICAgc3RhcnRBbmdsZSA9IGZhc3RNb2Qoc3RhcnRBbmds
ZSwgMzYwKTsKKyAgICBhbmdsZVNwYW4gPSBmYXN0TW9kKGFuZ2xlU3BhbiwgMzYwKTsKKworICAg
IFNrUGF0aCBwYXRoOworICAgIHBhdGguYWRkQXJjKG92YWwsIFNrSW50VG9TY2FsYXIoLXN0YXJ0
QW5nbGUpLCBTa0ludFRvU2NhbGFyKC1hbmdsZVNwYW4pKTsKKyAgICBpZiAoIUlzUGF0aFJlYXNv
bmFibGUoZ2V0Q1RNKCksIHBhdGgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250
ZXh0KCktPmNhbnZhcygpLT5kcmF3UGF0aChwYXRoLCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzdHJva2VQYXRoKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisgICAgY29uc3QgU2tQYXRoJiBwYXRoID0gKnBsYXRmb3JtQ29udGV4
dCgpLT5jdXJyZW50UGF0aCgpOworICAgIGlmICghSXNQYXRoUmVhc29uYWJsZShnZXRDVE0oKSwg
cGF0aCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRl
JiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAgICBDb2xvclNwYWNlIGNvbG9yU3BhY2UgPSBz
dGF0ZS5zdHJva2VDb2xvclNwYWNlOworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gU29saWRDb2xv
clNwYWNlICYmICFzdHJva2VDb2xvcigpLmFscGhhKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IFNrUGFpbnQgcGFpbnQ7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRGb3JTdHJv
a2luZygmcGFpbnQsIDAsIDApOworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gUGF0dGVybkNvbG9y
U3BhY2UpIHsKKyAgICAgICAgU2tTaGFkZXIqIHBhdCA9IHN0YXRlLnN0cm9rZVBhdHRlcm4tPmNy
ZWF0ZVBsYXRmb3JtUGF0dGVybihnZXRDVE0oKSk7CisgICAgICAgIHBhaW50LnNldFNoYWRlcihw
YXQpOworICAgICAgICBwYXQtPnVucmVmKCk7CisgICAgfSBlbHNlIGlmIChjb2xvclNwYWNlID09
IEdyYWRpZW50Q29sb3JTcGFjZSkKKyAgICAgICAgcGFpbnQuc2V0U2hhZGVyKHN0YXRlLnN0cm9r
ZUdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCkpOworCisgICAgcGxhdGZvcm1Db250ZXh0KCkt
PmNhbnZhcygpLT5kcmF3UGF0aChwYXRoLCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgZmxvYXQgbGluZVdpZHRoKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAo
IUlzUmVjdFJlYXNvbmFibGUoZ2V0Q1RNKCksIHJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUgPSBtX2NvbW1vbi0+c3RhdGU7Cisg
ICAgQ29sb3JTcGFjZSBjb2xvclNwYWNlID0gc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTsKKworICAg
IGlmIChjb2xvclNwYWNlID09IFNvbGlkQ29sb3JTcGFjZSAmJiAhc3Ryb2tlQ29sb3IoKS5hbHBo
YSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5zZXR1cFBhaW50Rm9yU3Ryb2tpbmcoJnBhaW50LCAwLCAwKTsKKyAgICBwYWlu
dC5zZXRTdHJva2VXaWR0aChXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGxpbmVXaWR0aCkpOworCisg
ICAgaWYgKGNvbG9yU3BhY2UgPT0gUGF0dGVybkNvbG9yU3BhY2UpIHsKKyAgICAgICAgU2tTaGFk
ZXIqIHBhdCA9IHN0YXRlLnN0cm9rZVBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihnZXRD
VE0oKSk7CisgICAgICAgIHBhaW50LnNldFNoYWRlcihwYXQpOworICAgICAgICBwYXQtPnVucmVm
KCk7CisgICAgfSBlbHNlIGlmIChjb2xvclNwYWNlID09IEdyYWRpZW50Q29sb3JTcGFjZSkKKyAg
ICAgICAgcGFpbnQuc2V0U2hhZGVyKHN0YXRlLnN0cm9rZUdyYWRpZW50LT5wbGF0Zm9ybUdyYWRp
ZW50KCkpOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UmVjdChyZWN0
LCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxvYXQgYW5nbGVJ
blJhZGlhbnMpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+cm90YXRlKFdlYkNvcmVGbG9hdFRv
U2tTY2FsYXIoCisgICAgICAgIGFuZ2xlSW5SYWRpYW5zICogKDE4MC4wZiAvIDMuMTQxNTkyNjVm
KSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6dHJhbnNsYXRlKGZsb2F0IHcsIGZsb2F0
IGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+dHJhbnNsYXRlKFdlYkNvcmVGbG9hdFRvU2tT
Y2FsYXIodyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Vi
Q29yZUZsb2F0VG9Ta1NjYWxhcihoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26494</attachid>
            <date>2009-01-07 10:33:08 -0800</date>
            <delta_ts>2009-01-07 13:30:09 -0800</delta_ts>
            <desc>Add platform/graphics/skia/Image* files</desc>
            <filename>skiaimg.patch</filename>
            <type>text/plain</type>
            <size>40970</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MjlkMTBjNS4uNDgxOGYyNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MCBAQAorMjAwOS0wMS0wNyAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMzE0NworICAgICAgICBBZGQgcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZSogZmls
ZXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlQnVmZmVyU2tpYS5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXJEYXRhOjpJbWFnZUJ1ZmZl
ckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjp+SW1hZ2VCdWZmZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6SW1hZ2VCdWZmZXI6OmNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZm
ZXI6OmltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6dG9EYXRhVVJMKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToK
KyAgICAgICAgKFdlYkNvcmU6OkZyYW1lRGF0YTo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6
SW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlOjpk
cmF3UGF0dGVybik6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3Jt
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3Jt
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZTo6Y2hlY2tGb3JTb2xpZENvbG9y
KToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3KToKKyAgICAgICAgKFdlYkNv
cmU6OkJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhOjpkcmF3KToKKyAgICAgICAgKFdlYkNvcmU6
OkJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhOjpjcmVhdGUpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvSW1hZ2VTb3VyY2VTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpjcmVhdGVEZWNvZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjpJbWFn
ZVNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6fkltYWdlU291cmNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjpjbGVhcik6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZVNvdXJjZTo6aW5pdGlhbGl6ZWQpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3Vy
Y2U6OnNldERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmlzU2l6ZUF2YWls
YWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZTo6c2l6ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJbWFnZVNvdXJjZTo6ZnJhbWVTaXplQXRJbmRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZVNvdXJjZTo6cmVwZXRpdGlvbkNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdl
U291cmNlOjpmcmFtZUNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjpjcmVh
dGVGcmFtZUF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmZyYW1lSXND
b21wbGV0ZUF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmZyYW1lRHVy
YXRpb25BdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlU291cmNlOjpmcmFtZUhhc0Fs
cGhhQXRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZVNvdXJjZVNraWE6OnNldERhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VTb3VyY2U6OmZpbGVuYW1lRXh0ZW5zaW9uKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU291cmNlU2tpYS5oOiBBZGRlZC4K
KwogMjAwOS0wMS0wNyAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmM2MGVmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENv
cHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKworI2luY2x1ZGUgIkJpdG1h
cEltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWEuaCIKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZURhdGEuaCIKKyNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNp
bmNsdWRlICJTa2lhVXRpbHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCisvLyBXZSBwYXNzIGEgdGVjaG5pY2FsbHktdW5pbml0aWFsaXplZCBjYW52
YXMgdG8gdGhlIHBsYXRmb3JtIGNvbnRleHQgaGVyZSBzaW5jZQorLy8gdGhlIGNhbnZhcyBpbml0
aWFsaXphdGlvbiBjb21wbGV0ZXMgaW4gSW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyLiBCdXQKKy8v
IFBsYXRmb3JtQ29udGV4dCBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgdG8gdXNlIHRoZSBvYmplY3Qs
IGFuZCB0aGlzIG1ha2VzIGFsbAorLy8gdGhlIG93bmVyc2hpcCBlYXNpZXIgdG8gbWFuYWdlLgor
SW1hZ2VCdWZmZXJEYXRhOjpJbWFnZUJ1ZmZlckRhdGEoY29uc3QgSW50U2l6ZSYgc2l6ZSkKKyAg
ICA6IG1fY2FudmFzKCkKKyAgICAsIG1fcGxhdGZvcm1Db250ZXh0KE5VTEwpICAvLyBDYW52YXMg
aXMgc2V0IGluIEltYWdlQnVmZmVyIGNvbnN0cnVjdG9yLgoreworfQorCitJbWFnZUJ1ZmZlcjo6
SW1hZ2VCdWZmZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSwgYm9vbCBncmF5U2NhbGUsIGJvb2wmIHN1
Y2Nlc3MpCisgICAgOiBtX2RhdGEoc2l6ZSkKKyAgICAsIG1fc2l6ZShzaXplKQoreworICAgIGlm
ICghbV9kYXRhLm1fY2FudmFzLmluaXRpYWxpemUoc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgp
LCBmYWxzZSkpIHsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgbV9kYXRhLm1fcGxhdGZvcm1Db250ZXh0LnNldENhbnZhcygmbV9kYXRhLm1f
Y2FudmFzKTsKKyAgICBtX2NvbnRleHQuc2V0KG5ldyBHcmFwaGljc0NvbnRleHQoJm1fZGF0YS5t
X3BsYXRmb3JtQ29udGV4dCkpOworCisgICAgLy8gTWFrZSB0aGUgYmFja2dyb3VuZCB0cmFuc3Bh
cmVudC4gSXQgd291bGQgYmUgbmljZSBpZiB0aGlzIHdhc24ndAorICAgIC8vIHJlcXVpcmVkLCBi
dXQgdGhlIGNhbnZhcyBpcyBjdXJyZW50bHkgZmlsbGVkIHdpdGggdGhlIG1hZ2ljIHRyYW5zcGFy
ZW5jeQorICAgIC8vIGNvbG9yLiBDYW4gd2UgaGF2ZSBhbm90aGVyIHdheSB0byBtYW5hZ2UgdGhp
cz8KKyAgICBtX2RhdGEubV9jYW52YXMuZHJhd0FSR0IoMCwgMCwgMCwgMCwgU2tQb3J0ZXJEdWZm
OjprQ2xlYXJfTW9kZSk7CisgICAgc3VjY2VzcyA9IHRydWU7Cit9CisKK0ltYWdlQnVmZmVyOjp+
SW1hZ2VCdWZmZXIoKQoreworfQorCitHcmFwaGljc0NvbnRleHQqIEltYWdlQnVmZmVyOjpjb250
ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jb250ZXh0LmdldCgpOworfQorCitJbWFnZSog
SW1hZ2VCdWZmZXI6OmltYWdlKCkgY29uc3QKK3sKKyAgICBpZiAoIW1faW1hZ2UpIHsKKyAgICAg
ICAgLy8gVGhpcyBjcmVhdGVzIGEgQ09QWSBvZiB0aGUgaW1hZ2UgYW5kIHdpbGwgY2FjaGUgdGhh
dCBjb3B5LiBUaGlzIG1lYW5zCisgICAgICAgIC8vIHRoYXQgaWYgc3Vic2VxdWVudCBvcGVyYXRp
b25zIHRha2UgcGxhY2Ugb24gdGhlIGNvbnRleHQsIG5laXRoZXIgdGhlCisgICAgICAgIC8vIGN1
cnJlbnRseS1yZXR1cm5lZCBpbWFnZSwgbm9yIHRoZSByZXN1bHRzIG9mIGZ1dHVyZSBpbWFnZSgp
IGNhbGxzLAorICAgICAgICAvLyB3aWxsIGNvbnRhaW4gdGhhdCBvcGVyYXRpb24uCisgICAgICAg
IC8vCisgICAgICAgIC8vIFRoaXMgc2VlbXMgc2lsbHksIGJ1dCBpcyB0aGUgd2F5IHRoZSBDRyBw
b3J0IHdvcmtzOiBpbWFnZSgpIGlzCisgICAgICAgIC8vIGludGVuZGVkIHRvIGJlIHVzZWQgb25s
eSB3aGVuIHJlbmRlcmluZyBpcyAiY29tcGxldGUuIgorICAgICAgICBtX2ltYWdlID0gQml0bWFw
SW1hZ2VTaW5nbGVGcmFtZVNraWE6OmNyZWF0ZSgKKyAgICAgICAgICAgICptX2RhdGEubV9wbGF0
Zm9ybUNvbnRleHQuYml0bWFwKCkpOworICAgIH0KKyAgICByZXR1cm4gbV9pbWFnZS5nZXQoKTsK
K30KKworUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRJbWFnZURhdGEoY29u
c3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICBBU1NFUlQoY29udGV4dCgpKTsKKworICAg
IFJlZlB0cjxJbWFnZURhdGE+IHJlc3VsdCA9IEltYWdlRGF0YTo6Y3JlYXRlKHJlY3Qud2lkdGgo
KSwgcmVjdC5oZWlnaHQoKSk7CisgICAgdW5zaWduZWQgY2hhciogZGF0YSA9IHJlc3VsdC0+ZGF0
YSgpLT5kYXRhKCkuZGF0YSgpOworCisgICAgaWYgKHJlY3QueCgpIDwgMCB8fCByZWN0LnkoKSA8
IDAgfHwKKyAgICAgICAgKHJlY3QueCgpICsgcmVjdC53aWR0aCgpKSA+IG1fc2l6ZS53aWR0aCgp
IHx8CisgICAgICAgIChyZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkpID4gbV9zaXplLmhlaWdodCgp
KQorICAgICAgICBtZW1zZXQoZGF0YSwgMCwgcmVzdWx0LT5kYXRhKCktPmxlbmd0aCgpKTsKKwor
ICAgIGludCBvcmlnaW54ID0gcmVjdC54KCk7CisgICAgaW50IGRlc3R4ID0gMDsKKyAgICBpZiAo
b3JpZ2lueCA8IDApIHsKKyAgICAgICAgZGVzdHggPSAtb3JpZ2lueDsKKyAgICAgICAgb3JpZ2lu
eCA9IDA7CisgICAgfQorICAgIGludCBlbmR4ID0gcmVjdC54KCkgKyByZWN0LndpZHRoKCk7Cisg
ICAgaWYgKGVuZHggPiBtX3NpemUud2lkdGgoKSkKKyAgICAgICAgZW5keCA9IG1fc2l6ZS53aWR0
aCgpOworICAgIGludCBudW1Db2x1bW5zID0gZW5keCAtIG9yaWdpbng7CisKKyAgICBpbnQgb3Jp
Z2lueSA9IHJlY3QueSgpOworICAgIGludCBkZXN0eSA9IDA7CisgICAgaWYgKG9yaWdpbnkgPCAw
KSB7CisgICAgICAgIGRlc3R5ID0gLW9yaWdpbnk7CisgICAgICAgIG9yaWdpbnkgPSAwOworICAg
IH0KKyAgICBpbnQgZW5keSA9IHJlY3QueSgpICsgcmVjdC5oZWlnaHQoKTsKKyAgICBpZiAoZW5k
eSA+IG1fc2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgZW5keSA9IG1fc2l6ZS5oZWlnaHQoKTsKKyAg
ICBpbnQgbnVtUm93cyA9IGVuZHkgLSBvcmlnaW55OworCisgICAgY29uc3QgU2tCaXRtYXAmIGJp
dG1hcCA9ICpjb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLT5iaXRtYXAoKTsKKyAgICBBU1NF
UlQoYml0bWFwLmNvbmZpZygpID09IFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZyk7CisgICAg
U2tBdXRvTG9ja1BpeGVscyBiaXRtYXBMb2NrKGJpdG1hcCk7CisKKyAgICB1bnNpZ25lZCBkZXN0
Qnl0ZXNQZXJSb3cgPSA0ICogcmVjdC53aWR0aCgpOworICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RS
b3cgPSBkYXRhICsgZGVzdHkgKiBkZXN0Qnl0ZXNQZXJSb3cgKyBkZXN0eCAqIDQ7CisKKyAgICBm
b3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7ICsreSkgeworICAgICAgICB1aW50MzJfdCogc3Jj
Um93ID0gYml0bWFwLmdldEFkZHIzMihvcmlnaW54LCBvcmlnaW55ICsgeSk7CisgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgKyt4KSB7CisgICAgICAgICAgICBTa0NvbG9y
IGNvbG9yID0gU2tQTUNvbG9yVG9Db2xvcihzcmNSb3dbeF0pOworICAgICAgICAgICAgdW5zaWdu
ZWQgY2hhciogZGVzdFBpeGVsID0gJmRlc3RSb3dbeCAqIDRdOworICAgICAgICAgICAgZGVzdFBp
eGVsWzBdID0gU2tDb2xvckdldFIoY29sb3IpOworICAgICAgICAgICAgZGVzdFBpeGVsWzFdID0g
U2tDb2xvckdldEcoY29sb3IpOworICAgICAgICAgICAgZGVzdFBpeGVsWzJdID0gU2tDb2xvckdl
dEIoY29sb3IpOworICAgICAgICAgICAgZGVzdFBpeGVsWzNdID0gU2tDb2xvckdldEEoY29sb3Ip
OworICAgICAgICB9CisgICAgICAgIGRlc3RSb3cgKz0gZGVzdEJ5dGVzUGVyUm93OworICAgIH0K
KworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0
YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQoreworICAg
IEFTU0VSVChzb3VyY2VSZWN0LndpZHRoKCkgPiAwKTsKKyAgICBBU1NFUlQoc291cmNlUmVjdC5o
ZWlnaHQoKSA+IDApOworCisgICAgaW50IG9yaWdpbnggPSBzb3VyY2VSZWN0LngoKTsKKyAgICBp
bnQgZGVzdHggPSBkZXN0UG9pbnQueCgpICsgc291cmNlUmVjdC54KCk7CisgICAgQVNTRVJUKGRl
c3R4ID49IDApOworICAgIEFTU0VSVChkZXN0eCA8IG1fc2l6ZS53aWR0aCgpKTsKKyAgICBBU1NF
UlQob3JpZ2lueCA+PSAwKTsKKyAgICBBU1NFUlQob3JpZ2lueCA8IHNvdXJjZVJlY3QucmlnaHQo
KSk7CisKKyAgICBpbnQgZW5keCA9IGRlc3RQb2ludC54KCkgKyBzb3VyY2VSZWN0LnJpZ2h0KCk7
CisgICAgQVNTRVJUKGVuZHggPD0gbV9zaXplLndpZHRoKCkpOworCisgICAgaW50IG51bUNvbHVt
bnMgPSBlbmR4IC0gZGVzdHg7CisKKyAgICBpbnQgb3JpZ2lueSA9IHNvdXJjZVJlY3QueSgpOwor
ICAgIGludCBkZXN0eSA9IGRlc3RQb2ludC55KCkgKyBzb3VyY2VSZWN0LnkoKTsKKyAgICBBU1NF
UlQoZGVzdHkgPj0gMCk7CisgICAgQVNTRVJUKGRlc3R5IDwgbV9zaXplLmhlaWdodCgpKTsKKyAg
ICBBU1NFUlQob3JpZ2lueSA+PSAwKTsKKyAgICBBU1NFUlQob3JpZ2lueSA8IHNvdXJjZVJlY3Qu
Ym90dG9tKCkpOworCisgICAgaW50IGVuZHkgPSBkZXN0UG9pbnQueSgpICsgc291cmNlUmVjdC5i
b3R0b20oKTsKKyAgICBBU1NFUlQoZW5keSA8PSBtX3NpemUuaGVpZ2h0KCkpOworICAgIGludCBu
dW1Sb3dzID0gZW5keSAtIGRlc3R5OworCisgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCA9ICpj
b250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLT5iaXRtYXAoKTsKKyAgICBBU1NFUlQoYml0bWFw
LmNvbmZpZygpID09IFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZyk7CisgICAgU2tBdXRvTG9j
a1BpeGVscyBiaXRtYXBMb2NrKGJpdG1hcCk7CisKKyAgICB1bnNpZ25lZCBzcmNCeXRlc1BlclJv
dyA9IDQgKiBzb3VyY2UtPndpZHRoKCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNS
b3cgPSBzb3VyY2UtPmRhdGEoKS0+ZGF0YSgpLmRhdGEoKSArCisgICAgICAgIG9yaWdpbnkgKiBz
cmNCeXRlc1BlclJvdyArIG9yaWdpbnggKiA0OworCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBu
dW1Sb3dzOyArK3kpIHsKKyAgICAgICAgdWludDMyX3QqIGRlc3RSb3cgPSBiaXRtYXAuZ2V0QWRk
cjMyKGRlc3R4LCBkZXN0eSArIHkpOworICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG51bUNv
bHVtbnM7ICsreCkgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjUGl4ZWwg
PSAmc3JjUm93W3ggKiA0XTsKKyAgICAgICAgICAgIGRlc3RSb3dbeF0gPSBTa1ByZU11bHRpcGx5
QVJHQihzcmNQaXhlbFszXSwgc3JjUGl4ZWxbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3JjUGl4ZWxbMV0sIHNyY1BpeGVsWzJdKTsKKyAgICAgICAgfQor
ICAgICAgICBzcmNSb3cgKz0gc3JjQnl0ZXNQZXJSb3c7CisgICAgfQorfQorCitTdHJpbmcgSW1h
Z2VCdWZmZXI6OnRvRGF0YVVSTChjb25zdCBTdHJpbmcmKSBjb25zdAoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lh
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWVhOGIKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lhLmNwcApAQCAtMCwwICsx
LDQ4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
IAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zv
cm0uaCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlU2lu
Z2xlRnJhbWVTa2lhLmgiCisjaW5jbHVkZSAiQ2hyb21pdW1CcmlkZ2UuaCIKKyNpbmNsdWRlICJG
bG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJMb2dnaW5nLmgiCisjaW5jbHVkZSAiTmF0aXZlSW1h
Z2VTa2lhLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJT
a2lhVXRpbHMuaCIKKyNpbmNsdWRlICJTa1NoYWRlci5oIgorCisjaW5jbHVkZSAic2tpYS9leHQv
aW1hZ2Vfb3BlcmF0aW9ucy5oIgorI2luY2x1ZGUgInNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSB7CisKKy8vIFVzZWQgYnkgY29t
cHV0ZVJlc2FtcGxpbmdNb2RlIHRvIHRlbGwgaG93IGJpdG1hcHMgc2hvdWxkIGJlIHJlc2FtcGxl
ZC4KK2VudW0gUmVzYW1wbGluZ01vZGUgeworICAgIC8vIE5lYXJlc3QgbmVpZ2hib3IgcmVzYW1w
bGluZy4gVXNlZCB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBwYWdlIGlzCisgICAgLy8gdHJ5aW5n
IHRvIG1ha2UgYSBwYXR0ZXJuIGJ5IHN0cmV0Y2hpbmcgYSBzbWFsbCBiaXRtYXAgdmVyeSBsYXJn
ZS4KKyAgICBSRVNBTVBMRV9OT05FLAorCisgICAgLy8gRGVmYXVsdCBza2lhIHJlc2FtcGxpbmcu
IFVzZWQgZm9yIGxhcmdlIGdyb3dpbmcgb2YgaW1hZ2VzIHdoZXJlIGhpZ2gKKyAgICAvLyBxdWFs
aXR5IHJlc2FtcGxpbmcgZG9lc24ndCBnZXQgdXMgdmVyeSBtdWNoIGV4Y2VwdCBhIHNsb3dkb3du
LgorICAgIFJFU0FNUExFX0xJTkVBUiwKKworICAgIC8vIEhpZ2ggcXVhbGl0eSByZXNhbXBsaW5n
LgorICAgIFJFU0FNUExFX0FXRVNPTUUsCit9OworCisvLyBzdGF0aWMKK1Jlc2FtcGxpbmdNb2Rl
IGNvbXB1dGVSZXNhbXBsaW5nTW9kZShjb25zdCBOYXRpdmVJbWFnZVNraWEmIGJpdG1hcCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNI
ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVzdFdp
ZHRoLCBmbG9hdCBkZXN0SGVpZ2h0KQoreworICAgIGludCBkZXN0SVdpZHRoID0gc3RhdGljX2Nh
c3Q8aW50PihkZXN0V2lkdGgpOworICAgIGludCBkZXN0SUhlaWdodCA9IHN0YXRpY19jYXN0PGlu
dD4oZGVzdEhlaWdodCk7CisKKyAgICAvLyBUaGUgcGVyY2VudCBjaGFuZ2UgYmVsb3cgd2hpY2gg
d2Ugd2lsbCBub3QgcmVzYW1wbGUuIFRoaXMgdXN1YWxseSBtZWFucworICAgIC8vIGFuIG9mZi1i
eS1vbmUgZXJyb3Igb24gdGhlIHdlYiBwYWdlLCBhbmQganVzdCBkb2luZyBuZWFyZXN0IG5laWdo
Ym9yCisgICAgLy8gc2FtcGxpbmcgaXMgdXN1YWxseSBnb29kIGVub3VnaC4KKyAgICBjb25zdCBm
bG9hdCBrRnJhY3Rpb25hbENoYW5nZVRocmVzaG9sZCA9IDAuMDI1ZjsKKworICAgIC8vIEltYWdl
cyBzbWFsbGVyIHRoYW4gdGhpcyBpbiBlaXRoZXIgZGlyZWN0aW9uIGFyZSBjb25zaWRlcmVkICJz
bWFsbCIgYW5kCisgICAgLy8gYXJlIG5vdCByZXNhbXBsZWQgZXZlciAoc2VlIGJlbG93KS4KKyAg
ICBjb25zdCBpbnQga1NtYWxsSW1hZ2VTaXplVGhyZXNob2xkID0gODsKKworICAgIC8vIFRoZSBh
bW91bnQgYW4gaW1hZ2UgY2FuIGJlIHN0cmV0Y2hlZCBpbiBhIHNpbmdsZSBkaXJlY3Rpb24gYmVm
b3JlIHdlCisgICAgLy8gc2F5IHRoYXQgaXQgaXMgYmVpbmcgc3RyZXRjaGVkIHNvIG11Y2ggdGhh
dCBpdCBtdXN0IGJlIGEgbGluZSBvcgorICAgIC8vIGJhY2tncm91bmQgdGhhdCBkb2Vzbid0IG5l
ZWQgcmVzYW1wbGluZy4KKyAgICBjb25zdCBmbG9hdCBrTGFyZ2VTdHJldGNoID0gMy4wZjsKKwor
ICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIHJlc2FtcGxlIHRoaXMgaW1hZ2UuIFdlIHRy
eSB0byBwcnVuZSBvdXQgc29tZQorICAgIC8vIGNvbW1vbiBjYXNlcyB3aGVyZSByZXNhbXBsaW5n
IHdvbid0IGdpdmUgdXMgYW55dGhpbmcsIHNpbmNlIGl0IGlzIG11Y2gKKyAgICAvLyBzbG93ZXIg
dGhhbiBkcmF3aW5nIHN0cmV0Y2hlZC4KKyAgICBpZiAoc3JjV2lkdGggPT0gZGVzdElXaWR0aCAm
JiBzcmNIZWlnaHQgPT0gZGVzdElIZWlnaHQpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0
byByZXNhbXBsZSBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUuCisg
ICAgICAgIHJldHVybiBSRVNBTVBMRV9OT05FOworICAgIH0KKworICAgIGlmIChzcmNXaWR0aCA8
PSBrU21hbGxJbWFnZVNpemVUaHJlc2hvbGQgfHwKKyAgICAgICAgc3JjSGVpZ2h0IDw9IGtTbWFs
bEltYWdlU2l6ZVRocmVzaG9sZCB8fAorICAgICAgICBkZXN0V2lkdGggPD0ga1NtYWxsSW1hZ2VT
aXplVGhyZXNob2xkIHx8CisgICAgICAgIGRlc3RIZWlnaHQgPD0ga1NtYWxsSW1hZ2VTaXplVGhy
ZXNob2xkKSB7CisgICAgICAgIC8vIE5ldmVyIHJlc2FtcGxlIHNtYWxsIGltYWdlcy4gVGhlc2Ug
YXJlIG9mdGVuIHVzZWQgZm9yIGJvcmRlcnMgYW5kCisgICAgICAgIC8vIHJ1bGVzICh0aGluayAx
eDEgaW1hZ2VzIHVzZWQgdG8gbWFrZSBsaW5lcykuCisgICAgICAgIHJldHVybiBSRVNBTVBMRV9O
T05FOworICAgIH0KKworICAgIGlmIChzcmNIZWlnaHQgKiBrTGFyZ2VTdHJldGNoIDw9IGRlc3RI
ZWlnaHQgfHwKKyAgICAgICAgc3JjV2lkdGggKiBrTGFyZ2VTdHJldGNoIDw9IGRlc3RXaWR0aCkg
eworICAgICAgICAvLyBMYXJnZSBpbWFnZSBkZXRlY3RlZC4KKworICAgICAgICAvLyBEb24ndCBy
ZXNhbXBsZSBpZiBpdCBpcyBiZWluZyBzdHJldGNoZWQgYSBsb3QgaW4gb25seSBvbmUgZGlyZWN0
aW9uLgorICAgICAgICAvLyBUaGlzIGlzIHRyeWluZyB0byBjYXRjaCBjYXNlcyB3aGVyZSBzb21l
Ym9keSBoYXMgY3JlYXRlZCBhIGJvcmRlcgorICAgICAgICAvLyAod2hpY2ggbWlnaHQgYmUgbGFy
Z2UpIGFuZCB0aGVuIGlzIHN0cmV0Y2hpbmcgaXQgdG8gZmlsbCBzb21lIHBhcnQKKyAgICAgICAg
Ly8gb2YgdGhlIHBhZ2UuCisgICAgICAgIGlmIChzcmNXaWR0aCA9PSBkZXN0V2lkdGggfHwgc3Jj
SGVpZ2h0ID09IGRlc3RIZWlnaHQpCisgICAgICAgICAgICByZXR1cm4gUkVTQU1QTEVfTk9ORTsK
KworICAgICAgICAvLyBUaGUgaW1hZ2UgaXMgZ3Jvd2luZyBhIGxvdCBhbmQgaW4gbW9yZSB0aGFu
IG9uZSBkaXJlY3Rpb24uIFJlc2FtcGxpbmcKKyAgICAgICAgLy8gaXMgc2xvdyBhbmQgZG9lc24n
dCBnaXZlIHVzIHZlcnkgbXVjaCB3aGVuIGdyb3dpbmcgYSBsb3QuCisgICAgICAgIHJldHVybiBS
RVNBTVBMRV9MSU5FQVI7CisgICAgfQorCisgICAgaWYgKChmYWJzKGRlc3RXaWR0aCAtIHNyY1dp
ZHRoKSAvIHNyY1dpZHRoIDwKKyAgICAgICAgIGtGcmFjdGlvbmFsQ2hhbmdlVGhyZXNob2xkKSAm
JgorICAgICAgIChmYWJzKGRlc3RIZWlnaHQgLSBzcmNIZWlnaHQpIC8gc3JjSGVpZ2h0IDwKKyAg
ICAgICAga0ZyYWN0aW9uYWxDaGFuZ2VUaHJlc2hvbGQpKSB7CisgICAgICAgIC8vIEl0IGlzIGRp
c2FwcG9pbnRpbmdseSBjb21tb24gb24gdGhlIHdlYiBmb3IgaW1hZ2Ugc2l6ZXMgdG8gYmUgb2Zm
IGJ5CisgICAgICAgIC8vIG9uZSBvciB0d28gcGl4ZWxzLiBXZSBkb24ndCBib3RoZXIgcmVzYW1w
bGluZyBpZiB0aGUgc2l6ZSBkaWZmZXJlbmNlCisgICAgICAgIC8vIGlzIGEgc21hbGwgZnJhY3Rp
b24gb2YgdGhlIG9yaWdpbmFsIHNpemUuCisgICAgICAgIHJldHVybiBSRVNBTVBMRV9OT05FOwor
ICAgIH0KKworICAgIC8vIFdoZW4gdGhlIGltYWdlIGlzIG5vdCB5ZXQgZG9uZSBsb2FkaW5nLCB1
c2UgbGluZWFyLiBXZSBkb24ndCBjYWNoZSB0aGUKKyAgICAvLyBwYXJ0aWFsbHkgcmVzYW1wbGVk
IGltYWdlcywgYW5kIGFzIHRoZXkgY29tZSBpbiBpbmNyZW1lbnRhbGx5LCBpdCBjYXVzZXMKKyAg
ICAvLyB1cyB0byBoYXZlIHRvIHJlc2FtcGxlIHRoZSB3aG9sZSB0aGluZyBldmVyeSB0aW1lLgor
ICAgIGlmICghYml0bWFwLmlzRGF0YUNvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBSRVNBTVBM
RV9MSU5FQVI7CisKKyAgICAvLyBFdmVyeXRoaW5nIGVsc2UgZ2V0cyByZXNhbXBsZWQuCisgICAg
cmV0dXJuIFJFU0FNUExFX0FXRVNPTUU7Cit9CisKKy8vIERyYXdzIHRoZSBnaXZlbiBiaXRtYXAg
dG8gdGhlIGdpdmVuIGNhbnZhcy4gVGhlIHN1YnNldCBvZiB0aGUgc291cmNlIGJpdG1hcAorLy8g
aWRlbnRpZmllZCBieSBzcmNfcmVjdCBpcyBkcmF3biB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24g
cmVjdC4gVGhlIGJpdG1hcAorLy8gd2lsbCBiZSByZXNhbXBsZWQgdG8gcmVzYW1wbGVfd2lkdGgg
KiByZXNhbXBsZV9oZWlnaHQgKHRoaXMgaXMgdGhlIHNpemUgb2YKKy8vIHRoZSB3aG9sZSBpbWFn
ZSwgbm90IHRoZSBzdWJzZXQpLiBTZWUgc2hvdWxkUmVzYW1wbGVCaXRtYXAgZm9yIG1vcmUuCisv
LworLy8gVGhpcyBkb2VzIGEgbG90IG9mIGNvbXB1dGF0aW9uIHRvIHJlc2FtcGxlIG9ubHkgdGhl
IHBvcnRpb24gb2YgdGhlIGJpdG1hcAorLy8gdGhhdCB3aWxsIG9ubHkgYmUgZHJhd24uIFRoaXMg
aXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHNpbmNlIHdoZW4gd2UgYXJlCisvLyBzY3JvbGxp
bmcsIGZvciBleGFtcGxlLCB3ZSBhcmUgb25seSBkcmF3aW5nIGEgc21hbGwgc3RyaXAgb2YgdGhl
IGltYWdlLgorLy8gUmVzYW1wbGluZyB0aGUgd2hvbGUgaW1hZ2UgZXZlcnkgdGltZSBpcyB2ZXJ5
IHNsb3csIHNvIHRoaXMgc3BlZWRzIHVwIHRoaW5ncworLy8gZHJhbWF0aWNhbGx5Lgordm9pZCBk
cmF3UmVzYW1wbGVkQml0bWFwKFNrQ2FudmFzJiBjYW52YXMsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgU2tQYWludCYgcGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmF0
aXZlSW1hZ2VTa2lhJiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tJ
UmVjdCYgc3JjSVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSZWN0JiBk
ZXN0UmVjdCkKK3sKKyAgICAvLyBGaXJzdCBnZXQgdGhlIHN1YnNldCB3ZSBuZWVkLiBUaGlzIGlz
IGVmZmljaWVudCBhbmQgZG9lcyBub3QgY29weSBwaXhlbHMuCisgICAgU2tCaXRtYXAgc3Vic2V0
OworICAgIGJpdG1hcC5leHRyYWN0U3Vic2V0KCZzdWJzZXQsIHNyY0lSZWN0KTsKKyAgICBTa1Jl
Y3Qgc3JjUmVjdDsKKyAgICBzcmNSZWN0LnNldChzcmNJUmVjdCk7CisKKyAgICAvLyBXaGV0aGVy
IHdlJ3JlIGRvaW5nIGEgc3Vic2V0IG9yIHVzaW5nIHRoZSBmdWxsIHNvdXJjZSBpbWFnZS4KKyAg
ICBib29sIHNyY0lzRnVsbCA9IHNyY0lSZWN0LmZMZWZ0ID09IDAgJiYgc3JjSVJlY3QuZlRvcCA9
PSAwICYmCisgICAgICAgIHNyY0lSZWN0LndpZHRoKCkgPT0gYml0bWFwLndpZHRoKCkgJiYKKyAg
ICAgICAgc3JjSVJlY3QuaGVpZ2h0KCkgPT0gYml0bWFwLmhlaWdodCgpOworCisgICAgLy8gV2Ug
d2lsbCBhbHdheXMgZHJhdyBpbiBpbnRlZ2VyIHNpemVzLCBzbyByb3VuZCB0aGUgZGVzdGluYXRp
b24gcmVjdC4KKyAgICBTa0lSZWN0IGRlc3RSZWN0Um91bmRlZDsKKyAgICBkZXN0UmVjdC5yb3Vu
ZCgmZGVzdFJlY3RSb3VuZGVkKTsKKyAgICBTa0lSZWN0IHJlc2l6ZWRJbWFnZVJlY3Q7ICAvLyBS
ZXByZXNlbnRzIHRoZSBzaXplIG9mIHRoZSByZXNpemVkIGltYWdlLgorICAgIHJlc2l6ZWRJbWFn
ZVJlY3Quc2V0KDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFJlY3RSb3VuZGVk
LndpZHRoKCksIGRlc3RSZWN0Um91bmRlZC5oZWlnaHQoKSk7CisKKyAgICBpZiAoc3JjSXNGdWxs
ICYmCisgICAgICAgIGJpdG1hcC5oYXNSZXNpemVkQml0bWFwKGRlc3RSZWN0Um91bmRlZC53aWR0
aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UmVjdFJvdW5kZWQuaGVp
Z2h0KCkpKSB7CisgICAgICAgIC8vIFlheSwgdGhpcyBiaXRtYXAgZnJhbWUgYWxyZWFkeSBoYXMg
YSByZXNpemVkIHZlcnNpb24uCisgICAgICAgIFNrQml0bWFwIHJlc2FtcGxlZCA9IGJpdG1hcC5y
ZXNpemVkQml0bWFwKGRlc3RSZWN0Um91bmRlZC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UmVjdFJvdW5kZWQuaGVpZ2h0KCkp
OworICAgICAgICBjYW52YXMuZHJhd0JpdG1hcFJlY3QocmVzYW1wbGVkLCAwLCBkZXN0UmVjdCwg
JnBhaW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIHZp
c2libGUgcG9ydGlvbiBvZiBvdXIgcmVjdC4KKyAgICBTa1JlY3QgZGVzdEJpdG1hcFN1YnNldFNr
OworICAgIENsaXBSZWN0VG9DYW52YXMoY2FudmFzLCBkZXN0UmVjdCwgJmRlc3RCaXRtYXBTdWJz
ZXRTayk7CisgICAgZGVzdEJpdG1hcFN1YnNldFNrLm9mZnNldCgtZGVzdFJlY3QuZkxlZnQsIC1k
ZXN0UmVjdC5mVG9wKTsKKworICAgIC8vIFRoZSBtYXRyaXggaW52ZXJ0aW5nLCBldGMuIGNvdWxk
IGhhdmUgaW50cm9kdWNlZCByb3VuZGluZyBlcnJvciB3aGljaAorICAgIC8vIGNhdXNlcyB0aGUg
Ym91bmRzIHRvIGJlIG91dHNpZGUgb2YgdGhlIHJlc2l6ZWQgYml0bWFwLiBXZSByb3VuZCBvdXR3
YXJkCisgICAgLy8gc28gd2UgYWx3YXlzIGxlYW4gdG93YXJkIGl0IGJlaW5nIGxhcmdlciByYXRo
ZXIgdGhhbiBzbWFsbGVyIHRoYW4gd2UKKyAgICAvLyBuZWVkLCBhbmQgdGhlbiBjbGFtcCB0byB0
aGUgYml0bWFwIGJvdW5kcyBzbyB3ZSBkb24ndCBnZXQgYW55IGludmFsaWQKKyAgICAvLyBkYXRh
LgorICAgIFNrSVJlY3QgZGVzdEJpdG1hcFN1YnNldFNrSTsKKyAgICBkZXN0Qml0bWFwU3Vic2V0
U2sucm91bmRPdXQoJmRlc3RCaXRtYXBTdWJzZXRTa0kpOworICAgIGlmICghZGVzdEJpdG1hcFN1
YnNldFNrSS5pbnRlcnNlY3QocmVzaXplZEltYWdlUmVjdCkpCisgICAgICAgIHJldHVybjsgIC8v
IFJlc2l6ZWQgaW1hZ2UgZG9lcyBub3QgaW50ZXJzZWN0LgorCisgICAgaWYgKHNyY0lzRnVsbCAm
JiBiaXRtYXAuc2hvdWxkQ2FjaGVSZXNhbXBsaW5nKAorICAgICAgICAgICAgcmVzaXplZEltYWdl
UmVjdC53aWR0aCgpLAorICAgICAgICAgICAgcmVzaXplZEltYWdlUmVjdC5oZWlnaHQoKSwKKyAg
ICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXRTa0kud2lkdGgoKSwKKyAgICAgICAgICAgIGRlc3RC
aXRtYXBTdWJzZXRTa0kuaGVpZ2h0KCkpKSB7CisgICAgICAgIC8vIFdlJ3JlIHN1cHBvc2VkIHRv
IHJlc2l6ZSB0aGUgZW50aXJlIGltYWdlIGFuZCBjYWNoZSBpdCwgZXZlbiB0aG91Z2gKKyAgICAg
ICAgLy8gd2UgZG9uJ3QgbmVlZCBhbGwgb2YgaXQuCisgICAgICAgIFNrQml0bWFwIHJlc2FtcGxl
ZCA9IGJpdG1hcC5yZXNpemVkQml0bWFwKGRlc3RSZWN0Um91bmRlZC53aWR0aCgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UmVjdFJvdW5k
ZWQuaGVpZ2h0KCkpOworICAgICAgICBjYW52YXMuZHJhd0JpdG1hcFJlY3QocmVzYW1wbGVkLCAw
LCBkZXN0UmVjdCwgJnBhaW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBzaG91bGQg
b25seSByZXNpemUgdGhlIGV4cG9zZWQgcGFydCBvZiB0aGUgYml0bWFwIHRvIGRvIHRoZQorICAg
ICAgICAvLyBtaW5pbWFsIHBvc3NpYmxlIHdvcmsuCisgICAgICAgIGdmeDo6UmVjdCBkZXN0Qml0
bWFwU3Vic2V0KGRlc3RCaXRtYXBTdWJzZXRTa0kuZkxlZnQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXRTa0kuZlRvcCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldFNrSS53aWR0aCgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Qml0bWFwU3Vic2V0U2tJLmhlaWdodCgp
KTsKKworICAgICAgICAvLyBSZXNhbXBsZSB0aGUgbmVlZGVkIHBhcnQgb2YgdGhlIGltYWdlLgor
ICAgICAgICBTa0JpdG1hcCByZXNhbXBsZWQgPSBza2lhOjpJbWFnZU9wZXJhdGlvbnM6OlJlc2l6
ZShzdWJzZXQsCisgICAgICAgICAgICBza2lhOjpJbWFnZU9wZXJhdGlvbnM6OlJFU0laRV9MQU5D
Wk9TMywKKyAgICAgICAgICAgIGRlc3RSZWN0Um91bmRlZC53aWR0aCgpLCBkZXN0UmVjdFJvdW5k
ZWQuaGVpZ2h0KCksCisgICAgICAgICAgICBkZXN0Qml0bWFwU3Vic2V0KTsKKworICAgICAgICAv
LyBDb21wdXRlIHdoZXJlIHRoZSBuZXcgYml0bWFwIHNob3VsZCBiZSBkcmF3bi4gU2luY2Ugb3Vy
IG5ldyBiaXRtYXAKKyAgICAgICAgLy8gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgb3JpZ2luYWws
IHdlIGhhdmUgdG8gc2hpZnQgaXQgb3ZlciBieSB0aGUKKyAgICAgICAgLy8gc2FtZSBhbW91bnQg
dGhhdCB3ZSBjdXQgb2ZmIHRoZSB0b3AgYW5kIGxlZnQuCisgICAgICAgIFNrUmVjdCBvZmZzZXRE
ZXN0UmVjdCA9IHsKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQueCgpICsgZGVzdFJlY3Qu
ZkxlZnQsCisgICAgICAgICAgICBkZXN0Qml0bWFwU3Vic2V0LnkoKSArIGRlc3RSZWN0LmZUb3As
CisgICAgICAgICAgICBkZXN0Qml0bWFwU3Vic2V0LnJpZ2h0KCkgKyBkZXN0UmVjdC5mTGVmdCwK
KyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQuYm90dG9tKCkgKyBkZXN0UmVjdC5mVG9wIH07
CisKKyAgICAgICAgY2FudmFzLmRyYXdCaXRtYXBSZWN0KHJlc2FtcGxlZCwgMCwgb2Zmc2V0RGVz
dFJlY3QsICZwYWludCk7CisgICAgfQorfQorCit2b2lkIHBhaW50U2tCaXRtYXAoUGxhdGZvcm1D
b250ZXh0U2tpYSogcGxhdGZvcm1Db250ZXh0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE5h
dGl2ZUltYWdlU2tpYSYgYml0bWFwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrSVJlY3Qm
IHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSZWN0JiBkZXN0UmVjdCwKKyAg
ICAgICAgICAgICAgICAgICBjb25zdCBTa1BvcnRlckR1ZmY6Ok1vZGUmIGNvbXBPcCkKK3sKKyAg
ICBTa1BhaW50IHBhaW50OworICAgIHBhaW50LnNldFBvcnRlckR1ZmZYZmVybW9kZShjb21wT3Ap
OworCisgICAgc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcyA9IHBsYXRmb3JtQ29udGV4dC0+
Y2FudmFzKCk7CisKKyAgICBSZXNhbXBsaW5nTW9kZSByZXNhbXBsaW5nID0gcGxhdGZvcm1Db250
ZXh0LT5Jc1ByaW50aW5nKCkgPyBSRVNBTVBMRV9OT05FIDoKKyAgICAgICAgY29tcHV0ZVJlc2Ft
cGxpbmdNb2RlKGJpdG1hcCwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTY2FsYXJUb0Zsb2F0KGRlc3RSZWN0LndpZHRo
KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTY2FsYXJUb0Zsb2F0KGRlc3RS
ZWN0LmhlaWdodCgpKSk7CisgICAgaWYgKHJlc2FtcGxpbmcgPT0gUkVTQU1QTEVfQVdFU09NRSkg
eworICAgICAgICBwYWludC5zZXRGaWx0ZXJCaXRtYXAoZmFsc2UpOworICAgICAgICBkcmF3UmVz
YW1wbGVkQml0bWFwKCpjYW52YXMsIHBhaW50LCBiaXRtYXAsIHNyY1JlY3QsIGRlc3RSZWN0KTsK
KyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyByZXNhbXBsaW5nIG5lY2Vzc2FyeSwgd2UgY2Fu
IGp1c3QgZHJhdyB0aGUgYml0bWFwLiBXZSB3YW50IHRvCisgICAgICAgIC8vIGZpbHRlciBpdCBp
ZiB3ZSBkZWNpZGVkIHRvIGRvIGxpbmVhciBpbnRlcnBvbGF0aW9uIGFib3ZlLCBvciBpZiB0aGVy
ZQorICAgICAgICAvLyBpcyBzb21ldGhpbmcgaW50ZXJlc3RpbmcgZ29pbmcgb24gd2l0aCB0aGUg
bWF0cml4IChsaWtlIGEgcm90YXRpb24pLgorICAgICAgICAvLyBOb3RlOiBmb3Igc2VyaWFsaXph
dGlvbiwgd2Ugd2lsbCB3YW50IHRvIHN1YnNldCB0aGUgYml0bWFwIGZpcnN0IHNvCisgICAgICAg
IC8vIHdlIGRvbid0IHNlbmQgZXh0cmEgcGl4ZWxzLgorICAgICAgICBwYWludC5zZXRGaWx0ZXJC
aXRtYXAocmVzYW1wbGluZyA9PSBSRVNBTVBMRV9MSU5FQVIpOworICAgICAgICBjYW52YXMtPmRy
YXdCaXRtYXBSZWN0KGJpdG1hcCwgJnNyY1JlY3QsIGRlc3RSZWN0LCAmcGFpbnQpOworICAgIH0K
K30KKworLy8gVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gZGltZW5zaW9ucyB3aXRoIHRoZSBnaXZlbiBt
YXRyaXguIFVzZWQgdG8gc2VlIGhvdyBiaWcKKy8vIGltYWdlcyB3aWxsIGJlIG9uY2UgdHJhbnNm
b3JtZWQuCit2b2lkIFRyYW5zZm9ybURpbWVuc2lvbnMoY29uc3QgU2tNYXRyaXgmIG1hdHJpeCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcmNfd2lkdGgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgZmxvYXQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBm
bG9hdCogZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGVzdF9o
ZWlnaHQpIHsKKyAgICAvLyBUcmFuc2Zvcm0gMyBwb2ludHMgdG8gc2VlIGhvdyBsb25nIGVhY2gg
c2lkZSBvZiB0aGUgYml0bWFwIHdpbGwgYmUuCisgICAgU2tQb2ludCBzcmNfcG9pbnRzWzNdOyAg
Ly8gKDAsIDApLCAod2lkdGgsIDApLCAoMCwgaGVpZ2h0KS4KKyAgICBzcmNfcG9pbnRzWzBdLnNl
dCgwLCAwKTsKKyAgICBzcmNfcG9pbnRzWzFdLnNldChTa0Zsb2F0VG9TY2FsYXIoc3JjX3dpZHRo
KSwgMCk7CisgICAgc3JjX3BvaW50c1syXS5zZXQoMCwgU2tGbG9hdFRvU2NhbGFyKHNyY19oZWln
aHQpKTsKKworICAgIC8vIE5vdyBtZWFzdXJlIHRoZSBsZW5ndGggb2YgdGhlIHR3byB0cmFuc2Zv
cm1lZCB2ZWN0b3JzIHJlbGF0aXZlIHRvIHRoZQorICAgIC8vIHRyYW5zZm9ybWVkIG9yaWdpbiB0
byBzZWUgaG93IGJpZyB0aGUgYml0bWFwIHdpbGwgYmUuIE5vdGU6IGZvciBza2V3cywKKyAgICAv
LyB0aGlzIGlzbid0IHRoZSBiZXN0IHRoaW5nLCBidXQgd2UgZG9uJ3QgaGF2ZSBza2V3cy4KKyAg
ICBTa1BvaW50IGRlc3RfcG9pbnRzWzNdOworICAgIG1hdHJpeC5tYXBQb2ludHMoZGVzdF9wb2lu
dHMsIHNyY19wb2ludHMsIDMpOworICAgICpkZXN0X3dpZHRoID0gU2tTY2FsYXJUb0Zsb2F0KChk
ZXN0X3BvaW50c1sxXSAtIGRlc3RfcG9pbnRzWzBdKS5sZW5ndGgoKSk7CisgICAgKmRlc3RfaGVp
Z2h0ID0gU2tTY2FsYXJUb0Zsb2F0KChkZXN0X3BvaW50c1syXSAtIGRlc3RfcG9pbnRzWzBdKS5s
ZW5ndGgoKSk7Cit9CisKKy8vIEEgaGVscGVyIG1ldGhvZCBmb3IgdHJhbnNsYXRpbmcgbmVnYXRp
dmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMuCitGbG9hdFJlY3Qgbm9ybWFsaXplUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgRmxvYXRSZWN0IG5vcm0gPSByZWN0OworICAgIGlm
IChub3JtLndpZHRoKCkgPCAwKSB7CisgICAgICAgIG5vcm0uc2V0WChub3JtLngoKSArIG5vcm0u
d2lkdGgoKSk7CisgICAgICAgIG5vcm0uc2V0V2lkdGgoLW5vcm0ud2lkdGgoKSk7CisgICAgfQor
ICAgIGlmIChub3JtLmhlaWdodCgpIDwgMCkgeworICAgICAgICBub3JtLnNldFkobm9ybS55KCkg
KyBub3JtLmhlaWdodCgpKTsKKyAgICAgICAgbm9ybS5zZXRIZWlnaHQoLW5vcm0uaGVpZ2h0KCkp
OworICAgIH0KKyAgICByZXR1cm4gbm9ybTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQg
RnJhbWVEYXRhOjpjbGVhcigpCit7CisgICAgLy8gSW1hZ2VTb3VyY2U6OmNyZWF0ZUZyYW1lQXRJ
bmRleCgpIGFsbG9jYXRlZCB8bV9mcmFtZXwgYW5kIHBhc3NlZAorICAgIC8vIG93bmVyc2hpcCB0
byBCaXRtYXBJbWFnZTsgd2UgbXVzdCBkZWxldGUgaXQgaGVyZS4KKyAgICBkZWxldGUgbV9mcmFt
ZTsKKyAgICBtX2ZyYW1lID0gMDsKKyAgICAvLyBOT1RFOiBXZSBwdXJwb3NlZnVsbHkgZG9uJ3Qg
cmVzZXQgbWV0YWRhdGEgaGVyZSwgc28gdGhhdCBldmVuIGlmIHdlCisgICAgLy8gdGhyb3cgYXdh
eSBwcmV2aW91c2x5LWRlY29kZWQgZGF0YSwgYW5pbWF0aW9uIGxvb3BzIGNhbiBzdGlsbCBhY2Nl
c3MKKyAgICAvLyBwcm9wZXJ0aWVzIGxpa2UgZnJhbWUgZHVyYXRpb25zIHdpdGhvdXQgcmUtZGVj
b2RpbmcuCit9CisKK1Bhc3NSZWZQdHI8SW1hZ2U+IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJj
ZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBDaHJvbWl1bUJyaWRnZTo6bG9hZFBs
YXRmb3JtSW1hZ2VSZXNvdXJjZShuYW1lKTsKK30KKwordm9pZCBJbWFnZTo6ZHJhd1BhdHRlcm4o
R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
RmxvYXRSZWN0JiBmbG9hdFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBv
c2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
RmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBpZiAoZGVzdFJlY3QuaXNFbXB0eSgpIHx8IGZs
b2F0U3JjUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsgIC8vIG5vdGhpbmcgdG8gZHJh
dworCisgICAgTmF0aXZlSW1hZ2VTa2lhKiBiaXRtYXAgPSBuYXRpdmVJbWFnZUZvckN1cnJlbnRG
cmFtZSgpOworICAgIGlmICghYml0bWFwKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlz
IGlzIGEgdmVyeSBpbmV4cGVuc2l2ZSBvcGVyYXRpb24uIEl0IHdpbGwgZ2VuZXJhdGUgYSBuZXcg
Yml0bWFwIGJ1dAorICAgIC8vIGl0IHdpbGwgaW50ZXJuYWxseSByZWZlcmVuY2UgdGhlIG9sZCBi
aXRtYXAncyBwaXhlbHMsIGFkanVzdGluZyB0aGUgcm93CisgICAgLy8gc3RyaWRlIHNvIHRoZSBl
eHRyYSBwaXhlbHMgYXBwZWFyIGFzIHBhZGRpbmcgdG8gdGhlIHN1YnNldHRlZCBiaXRtYXAuCisg
ICAgU2tCaXRtYXAgc3JjX3N1YnNldDsKKyAgICBTa0lSZWN0IHNyY1JlY3QgPSBlbmNsb3NpbmdJ
bnRSZWN0KGZsb2F0U3JjUmVjdCk7CisgICAgYml0bWFwLT5leHRyYWN0U3Vic2V0KCZzcmNfc3Vi
c2V0LCBzcmNSZWN0KTsKKworICAgIFNrQml0bWFwIHJlc2FtcGxlZDsKKyAgICBTa1NoYWRlciog
c2hhZGVyOworCisgICAgLy8gRmlndXJlIG91dCB3aGF0IHNpemUgdGhlIGJpdG1hcCB3aWxsIGJl
IGluIHRoZSBkZXN0aW5hdGlvbi4gVGhlCisgICAgLy8gZGVzdGluYXRpb24gcmVjdCBpcyB0aGUg
Ym91bmRzIG9mIHRoZSBwYXR0ZXJuLCB3ZSBuZWVkIHRvIHVzZSB0aGUKKyAgICAvLyBtYXRyaXgg
dG8gc2VlIGhvdyBiaXQgaXQgd2lsbCBiZS4KKyAgICBmbG9hdCBkZXN0X2JpdG1hcF93aWR0aCwg
ZGVzdF9iaXRtYXBfaGVpZ2h0OworICAgIFRyYW5zZm9ybURpbWVuc2lvbnMocGF0dGVyblRyYW5z
Zm9ybSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgJmRlc3RfYml0bWFwX3dpZHRoLCAmZGVzdF9iaXRtYXBfaGVpZ2h0KTsKKworICAg
IC8vIENvbXB1dGUgdGhlIHJlc2FtcGxpbmcgbW9kZS4KKyAgICBSZXNhbXBsaW5nTW9kZSByZXNh
bXBsaW5nOworICAgIGlmIChjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+SXNQcmludGluZygp
KQorICAgICAgcmVzYW1wbGluZyA9IFJFU0FNUExFX0xJTkVBUjsKKyAgICBlbHNlIHsKKyAgICAg
IHJlc2FtcGxpbmcgPSBjb21wdXRlUmVzYW1wbGluZ01vZGUoKmJpdG1hcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0Lmhl
aWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2Jp
dG1hcF93aWR0aCwgZGVzdF9iaXRtYXBfaGVpZ2h0KTsKKyAgICB9CisKKyAgICAvLyBMb2FkIHRo
ZSB0cmFuc2Zvcm0gV2ViS2l0IHJlcXVlc3RlZC4KKyAgICBTa01hdHJpeCBtYXRyaXgocGF0dGVy
blRyYW5zZm9ybSk7CisKKyAgICBpZiAocmVzYW1wbGluZyA9PSBSRVNBTVBMRV9BV0VTT01FKSB7
CisgICAgICAgIC8vIERvIG5pY2UgcmVzYW1wbGluZy4KKyAgICAgICAgU2tCaXRtYXAgcmVzYW1w
bGVkID0gc2tpYTo6SW1hZ2VPcGVyYXRpb25zOjpSZXNpemUoc3JjX3N1YnNldCwKKyAgICAgICAg
ICAgIHNraWE6OkltYWdlT3BlcmF0aW9uczo6UkVTSVpFX0xBTkNaT1MzLAorICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8aW50PihkZXN0X2JpdG1hcF93aWR0aCksCisgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxpbnQ+KGRlc3RfYml0bWFwX2hlaWdodCkpOworICAgICAgICBzaGFkZXIgPSBTa1NoYWRl
cjo6Q3JlYXRlQml0bWFwU2hhZGVyKAorICAgICAgICAgICAgcmVzYW1wbGVkLCBTa1NoYWRlcjo6
a1JlcGVhdF9UaWxlTW9kZSwgU2tTaGFkZXI6OmtSZXBlYXRfVGlsZU1vZGUpOworCisgICAgICAg
IC8vIFNpbmNlIHdlIGp1c3QgcmVzaXplZCB0aGUgYml0bWFwLCB3ZSBuZWVkIHRvIHVuZG8gdGhl
IHNjYWxlIHNldCBpbgorICAgICAgICAvLyB0aGUgaW1hZ2UgdHJhbnNmb3JtLgorICAgICAgICBt
YXRyaXguc2V0U2NhbGVYKFNrSW50VG9TY2FsYXIoMSkpOworICAgICAgICBtYXRyaXguc2V0U2Nh
bGVZKFNrSW50VG9TY2FsYXIoMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vIG5lZWQg
dG8gZG8gbmljZSByZXNhbXBsaW5nLgorICAgICAgICBzaGFkZXIgPSBTa1NoYWRlcjo6Q3JlYXRl
Qml0bWFwU2hhZGVyKAorICAgICAgICAgICAgc3JjX3N1YnNldCwgU2tTaGFkZXI6OmtSZXBlYXRf
VGlsZU1vZGUsIFNrU2hhZGVyOjprUmVwZWF0X1RpbGVNb2RlKTsKKyAgICB9CisKKyAgICAvLyBX
ZSBhbHNvIG5lZWQgdG8gdHJhbnNsYXRlIGl0IHN1Y2ggdGhhdCB0aGUgb3JpZ2luIG9mIHRoZSBw
YXR0ZXJuIGlzIHRoZQorICAgIC8vIG9yaWdpbiBvZiB0aGUgZGVzdGluYXRpb24gcmVjdCwgd2hp
Y2ggaXMgd2hhdCBXZWJLaXQgZXhwZWN0cy4gU2tpYSB1c2VzCisgICAgLy8gdGhlIGNvb3JkaW5h
dGUgc3lzdGVtIG9yaWdpbiBhcyB0aGUgYmFzZSBmb3IgdGhlIHBhdHRlci4gSWYgV2ViS2l0IHdh
bnRzCisgICAgLy8gYSBzaGlmdGVkIGltYWdlLCBpdCB3aWxsIHNoaWZ0IGl0IGZyb20gdGhlcmUg
dXNpbmcgdGhlIHBhdHRlcm5UcmFuc2Zvcm0uCisgICAgZmxvYXQgYWRqdXN0ZWRYID0gcGhhc2Uu
eCgpICsgZmxvYXRTcmNSZWN0LngoKSAqCisgICAgICAgICAgICAgICAgICAgICAgbmFycm93UHJl
Y2lzaW9uVG9GbG9hdChwYXR0ZXJuVHJhbnNmb3JtLmEoKSk7CisgICAgZmxvYXQgYWRqdXN0ZWRZ
ID0gcGhhc2UueSgpICsgZmxvYXRTcmNSZWN0LnkoKSAqCisgICAgICAgICAgICAgICAgICAgICAg
bmFycm93UHJlY2lzaW9uVG9GbG9hdChwYXR0ZXJuVHJhbnNmb3JtLmQoKSk7CisgICAgbWF0cml4
LnBvc3RUcmFuc2xhdGUoU2tGbG9hdFRvU2NhbGFyKGFkanVzdGVkWCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgU2tGbG9hdFRvU2NhbGFyKGFkanVzdGVkWSkpOworICAgIHNoYWRlci0+c2V0
TG9jYWxNYXRyaXgobWF0cml4KTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFpbnQuc2V0
U2hhZGVyKHNoYWRlciktPnVucmVmKCk7CisgICAgcGFpbnQuc2V0UG9ydGVyRHVmZlhmZXJtb2Rl
KFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3NpdGUoY29tcG9zaXRlT3ApKTsKKyAgICBwYWlu
dC5zZXRGaWx0ZXJCaXRtYXAocmVzYW1wbGluZyA9PSBSRVNBTVBMRV9MSU5FQVIpOworCisgICAg
Y29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPnBhaW50U2tQYWludChkZXN0UmVjdCwgcGFpbnQp
OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KKy8vIEJpdG1hcEltYWdlIENsYXNzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0
YSgpCit7CisgICAgLy8gVGhpcyBpcyBub3QgdXNlZC4gT24gTWFjLCB0aGUgInBsYXRmb3JtIiBk
YXRhIGlzIGEgY2FjaGUgb2Ygc29tZSBPUworICAgIC8vIHNwZWNpZmljIHZlcnNpb25zIG9mIHRo
ZSBpbWFnZSB0aGF0IGFyZSBjcmVhdGVkIGlzIHNvbWUgY2FzZXMuIFRoZXNlCisgICAgLy8gYXJl
bid0IG5vcm1hbGx5IHVzZWQsIGl0IGlzIGVxdWl2YWxlbnQgdG8gZ2V0SEJJVE1BUCBvbiBXaW5k
b3dzLCBhbmQKKyAgICAvLyB0aGUgcGxhdGZvcm0gZGF0YSBpcyB0aGUgY2FjaGUuCit9CisKK3Zv
aWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQoreworICAgIC8vIFNlZSBp
bml0UGxhdGZvcm1EYXRhIGFib3ZlLgorfQorCit2b2lkIEJpdG1hcEltYWdlOjpjaGVja0ZvclNv
bGlkQ29sb3IoKQoreworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3KEdyYXBoaWNzQ29udGV4
dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9w
KQoreworICAgIGlmICghbV9zb3VyY2UuaW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gU3BpbiB0aGUgYW5pbWF0aW9uIHRvIHRoZSBjb3JyZWN0IGZyYW1lIGJlZm9yZSB3
ZSB0cnkgdG8gZHJhdyBpdCwgc28gd2UKKyAgICAvLyBkb24ndCBkcmF3IGFuIG9sZCBmcmFtZSBh
bmQgdGhlbiBpbW1lZGlhdGVseSBuZWVkIHRvIGRyYXcgYSBuZXdlciBvbmUsCisgICAgLy8gY2F1
c2luZyBmbGlja2VyIGFuZCB3YXN0aW5nIENQVS4KKyAgICBzdGFydEFuaW1hdGlvbigpOworCisg
ICAgY29uc3QgTmF0aXZlSW1hZ2VTa2lhKiBibSA9IG5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1l
KCk7CisgICAgaWYgKCFibSkKKyAgICAgICAgcmV0dXJuOyAgLy8gSXQncyB0b28gZWFybHkgYW5k
IHdlIGRvbid0IGhhdmUgYW4gaW1hZ2UgeWV0LgorCisgICAgRmxvYXRSZWN0IG5vcm1Ec3RSZWN0
ID0gbm9ybWFsaXplUmVjdChkc3RSZWN0KTsKKyAgICBGbG9hdFJlY3Qgbm9ybVNyY1JlY3QgPSBu
b3JtYWxpemVSZWN0KHNyY1JlY3QpOworCisgICAgaWYgKG5vcm1TcmNSZWN0LmlzRW1wdHkoKSB8
fCBub3JtRHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8g
ZHJhdy4KKworICAgIHBhaW50U2tCaXRtYXAoY3R4dC0+cGxhdGZvcm1Db250ZXh0KCksCisgICAg
ICAgICAgICAgICAgICAqYm0sCisgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdJbnRSZWN0KG5v
cm1TcmNSZWN0KSwKKyAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ0ludFJlY3Qobm9ybURzdFJl
Y3QpLAorICAgICAgICAgICAgICAgICAgV2ViQ29yZUNvbXBvc2l0ZVRvU2tpYUNvbXBvc2l0ZShj
b21wb3NpdGVPcCkpOworfQorCit2b2lkIEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhOjpkcmF3
KEdyYXBoaWNzQ29udGV4dCogY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQorewor
ICAgIEZsb2F0UmVjdCBub3JtRHN0UmVjdCA9IG5vcm1hbGl6ZVJlY3QoZHN0UmVjdCk7CisgICAg
RmxvYXRSZWN0IG5vcm1TcmNSZWN0ID0gbm9ybWFsaXplUmVjdChzcmNSZWN0KTsKKworICAgIGlm
IChub3JtU3JjUmVjdC5pc0VtcHR5KCkgfHwgbm9ybURzdFJlY3QuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47ICAvLyBOb3RoaW5nIHRvIGRyYXcuCisKKyAgICBwYWludFNrQml0bWFwKGN0eHQt
PnBsYXRmb3JtQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgbV9uYXRpdmVJbWFnZSwKKyAg
ICAgICAgICAgICAgICAgIGVuY2xvc2luZ0ludFJlY3Qobm9ybVNyY1JlY3QpLAorICAgICAgICAg
ICAgICAgICAgZW5jbG9zaW5nSW50UmVjdChub3JtRHN0UmVjdCksCisgICAgICAgICAgICAgICAg
ICBXZWJDb3JlQ29tcG9zaXRlVG9Ta2lhQ29tcG9zaXRlKGNvbXBvc2l0ZU9wKSk7Cit9CisKK1Bh
c3NSZWZQdHI8Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE+IEJpdG1hcEltYWdlU2luZ2xlRnJh
bWVTa2lhOjpjcmVhdGUoCisgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCkKK3sKKyAgICBSZWZQ
dHI8Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE+IGltYWdlKGFkb3B0UmVmKG5ldyBCaXRtYXBJ
bWFnZVNpbmdsZUZyYW1lU2tpYSgpKSk7CisgICAgaWYgKCFiaXRtYXAuY29weVRvKCZpbWFnZS0+
bV9uYXRpdmVJbWFnZSwgYml0bWFwLmNvbmZpZygpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU291cmNlU2tpYS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxMDk0NwotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuY3Bw
CkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDYgR29vZ2xlIEluYy4gQWxs
IFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDYgQXBw
bGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZVNraWEuaCIKKyNpbmNsdWRlICJTaGFy
ZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgIkdJRkltYWdlRGVjb2Rlci5oIgorI2luY2x1ZGUgIkpQ
RUdJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJQTkdJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRl
ICJCTVBJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJYQk1JbWFnZURlY29kZXIuaCIKKyNpbmNs
dWRlICJJQ09JbWFnZURlY29kZXIuaCIKKworI2luY2x1ZGUgIlNrQml0bWFwLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworSW1hZ2VEZWNvZGVyKiBjcmVhdGVEZWNvZGVyKGNvbnN0IFZlY3Rv
cjxjaGFyPiYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXpl
JiBwcmVmZXJyZWRJY29uU2l6ZSkKK3sKKyAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IDQgYnl0ZXMg
dG8gZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgaW1hZ2Ugd2UncmUgZGVhbGluZyB3aXRoLgorICAg
IGludCBsZW5ndGggPSBkYXRhLnNpemUoKTsKKyAgICBpZiAobGVuZ3RoIDwgNCkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiB1Q29udGVudHMgPSAoY29uc3Qg
dW5zaWduZWQgY2hhciopZGF0YS5kYXRhKCk7CisgICAgY29uc3QgY2hhciogY29udGVudHMgPSBk
YXRhLmRhdGEoKTsKKworICAgIC8vIEdJRnMgYmVnaW4gd2l0aCBHSUY4KDcgb3IgOSkuCisgICAg
aWYgKHN0cm5jbXAoY29udGVudHMsICJHSUY4IiwgNCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIG5l
dyBHSUZJbWFnZURlY29kZXIoKTsKKworICAgIC8vIFRlc3QgZm9yIFBORy4KKyAgICBpZiAodUNv
bnRlbnRzWzBdPT0weDg5ICYmCisgICAgICAgIHVDb250ZW50c1sxXT09MHg1MCAmJgorICAgICAg
ICB1Q29udGVudHNbMl09PTB4NEUgJiYKKyAgICAgICAgdUNvbnRlbnRzWzNdPT0weDQ3KQorICAg
ICAgICByZXR1cm4gbmV3IFBOR0ltYWdlRGVjb2RlcigpOworCisgICAgLy8gSlBFRworICAgIGlm
ICh1Q29udGVudHNbMF09PTB4RkYgJiYKKyAgICAgICAgdUNvbnRlbnRzWzFdPT0weEQ4ICYmCisg
ICAgICAgIHVDb250ZW50c1syXT09MHhGRikKKyAgICAgICAgcmV0dXJuIG5ldyBKUEVHSW1hZ2VE
ZWNvZGVyKCk7CisKKyAgICAvLyBCTVAKKyAgICBpZiAoc3RybmNtcChjb250ZW50cywgIkJNIiwg
MikgPT0gMCkKKyAgICAgICAgcmV0dXJuIG5ldyBCTVBJbWFnZURlY29kZXIoKTsKKworICAgIC8v
IElDT3MgYWx3YXlzIGJlZ2luIHdpdGggYSAyLWJ5dGUgMCBmb2xsb3dlZCBieSBhIDItYnl0ZSAx
LgorICAgIC8vIENVUnMgYmVnaW4gd2l0aCAyLWJ5dGUgMCBmb2xsb3dlZCBieSAyLWJ5dGUgMi4K
KyAgICBpZiAoIW1lbWNtcChjb250ZW50cywgIlwwMDBcMDAwXDAwMVwwMDAiLCA0KSB8fAorICAg
ICAgICAhbWVtY21wKGNvbnRlbnRzLCAiXDAwMFwwMDBcMDAyXDAwMCIsIDQpKQorICAgICAgICBy
ZXR1cm4gbmV3IElDT0ltYWdlRGVjb2RlcihwcmVmZXJyZWRJY29uU2l6ZSk7CisgICAKKyAgICAv
LyBYQk1zIHJlcXVpcmUgOCBieXRlcyBvZiBpbmZvLgorICAgIGlmIChsZW5ndGggPj0gOCAmJiBz
dHJuY21wKGNvbnRlbnRzLCAiI2RlZmluZSAiLCA4KSA9PSAwKQorICAgICAgICByZXR1cm4gbmV3
IFhCTUltYWdlRGVjb2RlcigpOworCisgICAgLy8gR2l2ZSB1cC4gV2UgZG9uJ3Qga25vdyB3aGF0
IHRoZSBoZWNrIHRoaXMgaXMuCisgICAgcmV0dXJuIDA7Cit9CisKK0ltYWdlU291cmNlOjpJbWFn
ZVNvdXJjZSgpCisgIDogbV9kZWNvZGVyKDApCit7fQorCitJbWFnZVNvdXJjZTo6fkltYWdlU291
cmNlKCkKK3sKKyAgICBjbGVhcih0cnVlKTsKK30KKwordm9pZCBJbWFnZVNvdXJjZTo6Y2xlYXIo
Ym9vbCBkZXN0cm95QWxsLCBzaXplX3QgY2xlYXJCZWZvcmVGcmFtZSkKK3sKKyAgICBpZiAoZGVz
dHJveUFsbCkgeworICAgICAgICBkZWxldGUgbV9kZWNvZGVyOworICAgICAgICBtX2RlY29kZXIg
PSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fZGVjb2RlcikKKyAgICAg
ICAgbV9kZWNvZGVyLT5jbGVhckZyYW1lQnVmZmVyQ2FjaGUoY2xlYXJCZWZvcmVGcmFtZSk7Cit9
CisKK2Jvb2wgSW1hZ2VTb3VyY2U6OmluaXRpYWxpemVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9kZWNvZGVyOworfQorCit2b2lkIEltYWdlU291cmNlOjpzZXREYXRhKFNoYXJlZEJ1ZmZlciog
ZGF0YSwgYm9vbCBhbGxEYXRhUmVjZWl2ZWQpCit7CisgICAgLy8gTWFrZSB0aGUgZGVjb2RlciBi
eSBzbmlmZmluZyB0aGUgYnl0ZXMuCisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBleGFtaW5lIHRo
ZSBkYXRhIGFuZCBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgZGVj
b2RlciBwbHVnaW4uCisgICAgLy8gSWYgaW5zdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUg
dG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSB0eXBlLCBubyBkZWNvZGVyIHBsdWdpbiB3aWxsIGJlCisg
ICAgLy8gbWFkZS4KKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNvZGVyID0gY3Jl
YXRlRGVjb2RlcihkYXRhLT5idWZmZXIoKSwgSW50U2l6ZSgpKTsKKworICAgIC8vIENyZWF0ZURl
Y29kZXIgd2lsbCByZXR1cm4gTlVMTCBpZiB0aGUgZGVjb2RlciBjb3VsZCBub3QgYmUgY3JlYXRl
ZC4gUGx1cywKKyAgICAvLyB3ZSBzaG91bGQgbm90IHNlbmQgbW9yZSBkYXRhIHRvIGEgZGVjb2Rl
ciB3aGljaCBoYXMgYWxyZWFkeSBkZWNpZGVkIGl0CisgICAgLy8gaGFzIGZhaWxlZC4KKyAgICBp
ZiAoIW1fZGVjb2RlciB8fCBtX2RlY29kZXItPmZhaWxlZCgpKQorICAgICAgICByZXR1cm47Cisg
ICAgbV9kZWNvZGVyLT5zZXREYXRhKGRhdGEsIGFsbERhdGFSZWNlaXZlZCk7Cit9CisKK2Jvb2wg
SW1hZ2VTb3VyY2U6OmlzU2l6ZUF2YWlsYWJsZSgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBtX2RlY29kZXItPmlzU2l6ZUF2YWls
YWJsZSgpOworfQorCitJbnRTaXplIEltYWdlU291cmNlOjpzaXplKCkgY29uc3QKK3sKKyAgICBp
ZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIEludFNpemUoKTsKKworICAgIHJldHVybiBt
X2RlY29kZXItPnNpemUoKTsKK30KKworSW50U2l6ZSBJbWFnZVNvdXJjZTo6ZnJhbWVTaXplQXRJ
bmRleChzaXplX3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNpemUoKTsKK30KKworaW50IEltYWdl
U291cmNlOjpyZXBldGl0aW9uQ291bnQoKQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAg
ICByZXR1cm4gY0FuaW1hdGlvbk5vbmU7CisKKyAgICByZXR1cm4gbV9kZWNvZGVyLT5yZXBldGl0
aW9uQ291bnQoKTsKK30KKworc2l6ZV90IEltYWdlU291cmNlOjpmcmFtZUNvdW50KCkgY29uc3QK
K3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG1f
ZGVjb2Rlci0+ZmFpbGVkKCkgPyAwIDogbV9kZWNvZGVyLT5mcmFtZUNvdW50KCk7Cit9CisKK05h
dGl2ZUltYWdlUHRyIEltYWdlU291cmNlOjpjcmVhdGVGcmFtZUF0SW5kZXgoc2l6ZV90IGluZGV4
KQoreworICAgIGlmICghbV9kZWNvZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIE5v
dGUgdGhhdCB0aGUgYnVmZmVyIGNhbiBoYXZlIE5VTEwgYnl0ZXMgZXZlbiB3aGVuIGl0IGlzIG1h
cmtlZCBhcworICAgIC8vIG5vbi1lbXB0eS4gSXQgc2VlbXMgIkZyYW1lRW1wdHkiIGlzIG9ubHkg
c2V0IGJlZm9yZSB0aGUgZnJhbWUgaGFzIGJlZW4KKyAgICAvLyBpbml0aWFsaXplZC4gSWYgaXQg
aXMgZGVjb2RlZCBhbmQgaXQgaGFwcGVucyB0byBiZSBlbXB0eSwgaXQgd2lsbCBiZQorICAgIC8v
IG1hcmtlZCBhcyAiRnJhbWVDb21wbGV0ZSIgYnV0IHdpbGwgc3RpbGwgaGF2ZSBOVUxMIGJ5dGVz
LgorICAgIFJHQkEzMkJ1ZmZlciogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0SW5k
ZXgoaW5kZXgpOworICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+c3RhdHVzKCkgPT0gUkdCQTMy
QnVmZmVyOjpGcmFtZUVtcHR5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIENvcHkgdGhl
IGJpdG1hcC4gIFRoZSBwaXhlbCBkYXRhIGlzIHJlZmNvdW50ZWQgaW50ZXJuYWxseSBieSBTa0Jp
dG1hcCwgc28KKyAgICAvLyB0aGlzIGRvZXNuJ3QgY29zdCBtdWNoLiAgVGhpcyBwb2ludGVyIHdp
bGwgYmUgb3duZWQgYnkgdGhlIEJpdG1hcEltYWdlCisgICAgLy8gYW5kIGZyZWVkIGluIEZyYW1l
RGF0YTo6Y2xlYXIoKS4KKyAgICByZXR1cm4gbmV3IE5hdGl2ZUltYWdlU2tpYShidWZmZXItPmJp
dG1hcCgpKTsKK30KKworYm9vbCBJbWFnZVNvdXJjZTo6ZnJhbWVJc0NvbXBsZXRlQXRJbmRleChz
aXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIFJHQkEzMkJ1ZmZlciogYnVmZmVyID0gbV9kZWNvZGVyLT5mcmFtZUJ1ZmZlckF0
SW5kZXgoaW5kZXgpOworICAgIHJldHVybiBidWZmZXIgJiYgYnVmZmVyLT5zdGF0dXMoKSA9PSBS
R0JBMzJCdWZmZXI6OkZyYW1lQ29tcGxldGU7Cit9CisKK2Zsb2F0IEltYWdlU291cmNlOjpmcmFt
ZUR1cmF0aW9uQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgUkdCQTMyQnVmZmVyKiBidWZmZXIgPSBtX2RlY29kZXIt
PmZyYW1lQnVmZmVyQXRJbmRleChpbmRleCk7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5z
dGF0dXMoKSA9PSBSR0JBMzJCdWZmZXI6OkZyYW1lRW1wdHkpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgLy8gTWFueSBhbm5veWluZyBhZHMgc3BlY2lmeSBhIDAgZHVyYXRpb24gdG8gbWFrZSBh
biBpbWFnZSBmbGFzaCBhcyBxdWlja2x5CisgICAgLy8gYXMgcG9zc2libGUuICBXZSBmb2xsb3cg
V2luSUUncyBiZWhhdmlvciBhbmQgdXNlIGEgZHVyYXRpb24gb2YgMTAwIG1zCisgICAgLy8gZm9y
IGFueSBmcmFtZXMgdGhhdCBzcGVjaWZ5IGEgZHVyYXRpb24gb2YgPD0gNTAgbXMuICBTZWUKKyAg
ICAvLyA8aHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0MTM+IG9yIFJh
ZGFyIDQwNTEzODkgZm9yCisgICAgLy8gbW9yZS4KKyAgICBjb25zdCBmbG9hdCBkdXJhdGlvbiA9
IGJ1ZmZlci0+ZHVyYXRpb24oKSAvIDEwMDAuMGY7CisgICAgcmV0dXJuIChkdXJhdGlvbiA8IDAu
MDUxZikgPyAwLjEwMGYgOiBkdXJhdGlvbjsKKworfQorCitib29sIEltYWdlU291cmNlOjpmcmFt
ZUhhc0FscGhhQXRJbmRleChzaXplX3QgaW5kZXgpCit7CisgICAgaWYgKCFtX2RlY29kZXIgfHwg
IW1fZGVjb2Rlci0+c3VwcG9ydHNBbHBoYSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBSR0JBMzJCdWZmZXIqIGJ1ZmZlciA9IG1fZGVjb2Rlci0+ZnJhbWVCdWZmZXJBdEluZGV4KGlu
ZGV4KTsKKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPnN0YXR1cygpID09IFJHQkEzMkJ1ZmZl
cjo6RnJhbWVFbXB0eSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGJ1ZmZl
ci0+aGFzQWxwaGEoKTsKK30KKwordm9pZCBJbWFnZVNvdXJjZVNraWE6OnNldERhdGEoU2hhcmVk
QnVmZmVyKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxEYXRh
UmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBw
cmVmZXJyZWRJY29uU2l6ZSkKK3sKKyAgICBpZiAoIW1fZGVjb2RlcikKKyAgICAgICAgbV9kZWNv
ZGVyID0gY3JlYXRlRGVjb2RlcihkYXRhLT5idWZmZXIoKSwgcHJlZmVycmVkSWNvblNpemUpOwor
CisgICAgSW1hZ2VTb3VyY2U6OnNldERhdGEoZGF0YSwgYWxsRGF0YVJlY2VpdmVkKTsKK30KKwor
U3RyaW5nIEltYWdlU291cmNlOjpmaWxlbmFtZUV4dGVuc2lvbigpIGNvbnN0Cit7CisgICAgLy8g
RklYTUU6IEltcGxlbWVudCBtZSEKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK30KZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuaCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNvdXJjZVNraWEuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjlhOTlmCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU291cmNlU2tpYS5oCkBAIC0wLDAg
KzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNywyMDA4LCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworLy8gV2UgbmVlZCBh
Y2Nlc3MgdG8gdGhlIHByaXZhdGUgbWVtYmVyIG9mIEltYWdlU291cmNlLiAgSGFjayBpdCBsb2Nh
bGx5LgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KKyNkZWZpbmUgcHJpdmF0ZSBwcm90ZWN0ZWQKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgor
I3VuZGVmIHByaXZhdGUKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJbWFnZVNvdXJj
ZVNraWEgOiBwdWJsaWMgSW1hZ2VTb3VyY2UgeworcHVibGljOgorICAgIC8vIFRoaXMgaXMgYSBz
cGVjaWFsLXB1cnBvc2Ugcm91dGluZSBmb3IgdGhlIGZhdmljb24gZGVjb2Rlciwgd2hpY2ggaXMg
dXNlZAorICAgIC8vIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIGljb24gc2l6ZSBmb3IgdGhlIElD
T0ltYWdlRGVjb2RlciB0byBwcmVmZXIKKyAgICAvLyBkZWNvZGluZy4gIE5vdGUgdGhhdCBub3Qg
YWxsIGZhdmljb25zIGFyZSBJQ09zLCBzbyB0aGlzIHdvbid0CisgICAgLy8gbmVjZXNzYXJpbHkg
ZG8gYW55dGhpbmcgZGlmZmVyZW50bHkgdGhhbiBJbWFnZVNvdXJjZTo6c2V0RGF0YSgpLgorICAg
IC8vCisgICAgLy8gUGFzc2luZyBhbiBlbXB0eSBJbnRTaXplIGZvciB8cHJlZmVycmVkSWNvblNp
emV8IGhlcmUgaXMgZXhhY3RseQorICAgIC8vIGVxdWl2YWxlbnQgdG8ganVzdCBjYWxsaW5nIElt
YWdlU291cmNlOjpzZXREYXRhKCkuICBTZWUgYWxzbyBjb21tZW50cyBpbgorICAgIC8vIElDT0lt
YWdlRGVjb2Rlci5jcHAuCisgICAgdm9pZCBzZXREYXRhKFNoYXJlZEJ1ZmZlciogZGF0YSwKKyAg
ICAgICAgICAgICAgICAgYm9vbCBhbGxEYXRhUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgIGNv
bnN0IEludFNpemUmIHByZWZlcnJlZEljb25TaXplKTsKK307CisKK30KKwo=
</data>
<flag name="review"
          id="12578"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26497</attachid>
            <date>2009-01-07 11:21:27 -0800</date>
            <delta_ts>2009-01-07 12:14:11 -0800</delta_ts>
            <desc>Add a few IntPoint/IntRect, NativeImage, Path, Pattern skia files</desc>
            <filename>skia5.patch</filename>
            <type>text/plain</type>
            <size>29747</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MjlkMTBjNS4uNzNiM2YxMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1NSBAQAorMjAwOS0wMS0wNyAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMzE0NworICAgICAgICBBZGQgYSBmZXcgbW9yZSBwbGF0Zm9ybS9ncmFwaGljcy9za2lh
IGZpbGVzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRQb2ludFNraWEu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkludFBvaW50OjpJbnRQb2ludCk6CisgICAg
ICAgIChXZWJDb3JlOjpJbnRQb2ludDo6b3BlcmF0b3IgU2tJUG9pbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6SW50UG9pbnQ6Om9wZXJhdG9yIFNrUG9pbnQpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3NraWEvSW50UmVjdFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oklu
dFJlY3Q6Om9wZXJhdG9yIFNrSVJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6SW50UmVjdDo6b3Bl
cmF0b3IgU2tSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkludFJlY3Q6OkludFJlY3QpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTmF0aXZlSW1hZ2VTa2lhLmNwcDogQWRkZWQu
CisgICAgICAgIChOYXRpdmVJbWFnZVNraWE6Ok5hdGl2ZUltYWdlU2tpYSk6CisgICAgICAgIChO
YXRpdmVJbWFnZVNraWE6OmRlY29kZWRTaXplKToKKyAgICAgICAgKE5hdGl2ZUltYWdlU2tpYTo6
aGFzUmVzaXplZEJpdG1hcCk6CisgICAgICAgIChOYXRpdmVJbWFnZVNraWE6OnJlc2l6ZWRCaXRt
YXApOgorICAgICAgICAoTmF0aXZlSW1hZ2VTa2lhOjpzaG91bGRDYWNoZVJlc2FtcGxpbmcpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTmF0aXZlSW1hZ2VTa2lhLmg6IEFkZGVk
LgorICAgICAgICAoTmF0aXZlSW1hZ2VTa2lhOjpzZXREYXRhQ29tcGxldGUpOgorICAgICAgICAo
TmF0aXZlSW1hZ2VTa2lhOjppc0RhdGFDb21wbGV0ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9QYXRoU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6
UGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjp+UGF0aCk6CisgICAgICAgIChXZWJDb3Jl
OjpQYXRoOjpvcGVyYXRvcj0pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6aXNFbXB0eSk6Cisg
ICAgICAgIChXZWJDb3JlOjpQYXRoOjpjb250YWlucyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRo
Ojp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Ym91bmRpbmdSZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6Om1vdmVUbyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjph
ZGRMaW5lVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkUXVhZEN1cnZlVG8pOgorICAg
ICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkQmV6aWVyQ3VydmVUbyk6CisgICAgICAgIChXZWJDb3Jl
OjpQYXRoOjphZGRBcmNUbyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpjbG9zZVN1YnBhdGgp
OgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkQXJjKToKKyAgICAgICAgKFdlYkNvcmU6OlBh
dGg6OmFkZFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkRWxsaXBzZSk6CisgICAg
ICAgIChXZWJDb3JlOjpQYXRoOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRmcHRzKToK
KyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFwcGx5KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6
OnRyYW5zZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpkZWJ1Z1N0cmluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpib3VuZGluZ0JveEZvckN1cnJlbnRTdHJva2UpOgorICAgICAgICAoV2Vi
Q29yZTo6UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9za2lhL1BhdHRlcm5Ta2lhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpzaGFk
ZXJSdWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdHRlcm46OmNyZWF0ZVBsYXRmb3JtUGF0dGVy
bik6CisKIDIwMDktMDEtMDcgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IE9saXZlciBIdW50LgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0ludFBvaW50U2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi5mZDlhNmZkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9za2lhL0ludFBvaW50U2tpYS5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSW50UG9pbnQuaCIKKworI2luY2x1ZGUgIlNrUG9pbnQuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitJbnRQb2ludDo6SW50UG9pbnQoY29uc3QgU2tJUG9pbnQm
IHApCisgICAgOiBtX3gocC5mWCkKKyAgICAsIG1feShwLmZZKQoreworfQorCitJbnRQb2ludDo6
b3BlcmF0b3IgU2tJUG9pbnQoKSBjb25zdAoreworICAgIFNrSVBvaW50IHAgPSB7IG1feCwgbV95
IH07CisgICAgcmV0dXJuIHA7Cit9CisKK0ludFBvaW50OjpvcGVyYXRvciBTa1BvaW50KCkgY29u
c3QKK3sKKyAgICBTa1BvaW50IHAgPSB7IFNrSW50VG9TY2FsYXIobV94KSwgU2tJbnRUb1NjYWxh
cihtX3kpIH07CisgICAgcmV0dXJuIHA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UmVjdFNraWEuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTA0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UmVjdFNraWEuY3BwCkBAIC0wLDAgKzEs
NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICogCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKworI2lu
Y2x1ZGUgIlNrUmVjdC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ludFJlY3Q6Om9wZXJh
dG9yIFNrSVJlY3QoKSBjb25zdAoreworICAgIFNrSVJlY3QgcmVjdCA9IHsgeCgpLCB5KCksIHJp
Z2h0KCksIGJvdHRvbSgpIH07CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK0ludFJlY3Q6Om9wZXJh
dG9yIFNrUmVjdCgpIGNvbnN0Cit7CisgICAgU2tSZWN0IHJlY3Q7CisgICAgcmVjdC5zZXQoU2tJ
bnRUb1NjYWxhcih4KCkpLCBTa0ludFRvU2NhbGFyKHkoKSksCisgICAgICAgICAgICAgU2tJbnRU
b1NjYWxhcihyaWdodCgpKSwgU2tJbnRUb1NjYWxhcihib3R0b20oKSkpOworICAgIHJldHVybiBy
ZWN0OworfQorCitJbnRSZWN0OjpJbnRSZWN0KGNvbnN0IFNrSVJlY3QmIHIpCisgICAgOiBtX2xv
Y2F0aW9uKHIuZkxlZnQsIHIuZlRvcCkKKyAgICAsIG1fc2l6ZShyLndpZHRoKCksIHIuaGVpZ2h0
KCkpCit7Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL05hdGl2ZUltYWdlU2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
TmF0aXZlSW1hZ2VTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5h
YzEwY2YyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L05hdGl2ZUltYWdlU2tpYS5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorCisjaW5jbHVkZSAic2tpYS9leHQvaW1hZ2Vfb3BlcmF0aW9ucy5oIgorCisjaW5jbHVk
ZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisKK05hdGl2ZUlt
YWdlU2tpYTo6TmF0aXZlSW1hZ2VTa2lhKCkKKyAgICA6IFNrQml0bWFwKCksCisgICAgICBtX2lz
RGF0YUNvbXBsZXRlKGZhbHNlKSwKKyAgICAgIG1fcmVzaXplZEltYWdlKCksCisgICAgICBtX2xh
c3RSZXF1ZXN0U2l6ZSgwLCAwKSwKKyAgICAgIG1fcmVzaXplUmVxdWVzdHMoMCkKK3sKK30KKwor
aW50IE5hdGl2ZUltYWdlU2tpYTo6ZGVjb2RlZFNpemUoKSBjb25zdAoreworICByZXR1cm4gZ2V0
U2l6ZSgpICsgbV9yZXNpemVkSW1hZ2UuZ2V0U2l6ZSgpOworfQorCitib29sIE5hdGl2ZUltYWdl
U2tpYTo6aGFzUmVzaXplZEJpdG1hcChpbnQgdywgaW50IGgpIGNvbnN0Cit7CisgICAgaWYgKG1f
bGFzdFJlcXVlc3RTaXplLndpZHRoKCkgPT0gdyAmJiBtX2xhc3RSZXF1ZXN0U2l6ZS5oZWlnaHQo
KSA9PSBoKSB7CisgICAgICAgIG1fcmVzaXplUmVxdWVzdHMrKzsKKyAgICB9IGVsc2UgeworICAg
ICAgICBtX2xhc3RSZXF1ZXN0U2l6ZSA9IFdlYkNvcmU6OkludFNpemUodywgaCk7CisgICAgICAg
IG1fcmVzaXplUmVxdWVzdHMgPSAwOworICAgIH0KKworICAgIHJldHVybiBtX3Jlc2l6ZWRJbWFn
ZS53aWR0aCgpID09IHcgJiYgbV9yZXNpemVkSW1hZ2UuaGVpZ2h0KCkgPT0gaDsKK30KKworLy8g
RklYTUU6IGRvbid0IGNhY2hlIHdoZW4gaW1hZ2UgaXMgaW4tcHJvZ3Jlc3MuCisKK1NrQml0bWFw
IE5hdGl2ZUltYWdlU2tpYTo6cmVzaXplZEJpdG1hcChpbnQgdywgaW50IGgpIGNvbnN0Cit7Cisg
ICAgaWYgKG1fcmVzaXplZEltYWdlLndpZHRoKCkgIT0gdyB8fCBtX3Jlc2l6ZWRJbWFnZS5oZWln
aHQoKSAhPSBoKSB7CisgICAgICAgIG1fcmVzaXplZEltYWdlID0gc2tpYTo6SW1hZ2VPcGVyYXRp
b25zOjpSZXNpemUoKnRoaXMsCisgICAgICAgICAgICBza2lhOjpJbWFnZU9wZXJhdGlvbnM6OlJF
U0laRV9MQU5DWk9TMywgdywgaCk7CisgICAgfQorICAgIHJldHVybiBtX3Jlc2l6ZWRJbWFnZTsK
K30KKworYm9vbCBOYXRpdmVJbWFnZVNraWE6OnNob3VsZENhY2hlUmVzYW1wbGluZyhpbnQgZGVz
dF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50
IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgZGVzdF9zdWJzZXRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGludCBkZXN0X3N1YnNldF9oZWlnaHQpIGNvbnN0Cit7CisgICAgLy8gV2Ug
Y2FuIG5vdCBjYWNoZSBpbmNvbXBsZXRlIGZyYW1lcy4gVGhpcyBtaWdodCBiZSBhIGdvb2Qgb3B0
aW1pemF0aW9uIGluCisgICAgLy8gdGhlIGZ1dHVyZSwgd2VyZSB3ZSBrbm93IGhvdyBtdWNoIG9m
IHRoZSBmcmFtZSBoYXMgYmVlbiBkZWNvZGVkLCBzbyB3aGVuCisgICAgLy8gd2UgaW5jcmVtZW50
YWxseSBkcmF3IG1vcmUgb2YgdGhlIGltYWdlLCB3ZSBvbmx5IGhhdmUgdG8gcmVzYW1wbGUgdGhl
CisgICAgLy8gcGFydHMgdGhhdCBhcmUgY2hhbmdlZC4KKyAgICBpZiAoIW1faXNEYXRhQ29tcGxl
dGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBi
aXRtYXAgaXMgc21hbGwsIHdlJ2xsIGFsd2F5cyBhbGxvdyBjYWNoaW5nLCBzaW5jZQorICAgIC8v
IHRoZXJlIGlzIG5vdCB2ZXJ5IG11Y2ggcGVuYWx0eSBmb3IgY29tcHV0aW5nIGl0IGFuZCBpdCBt
YXkgY29tZSBpbiBoYW5keS4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTbWFsbEJpdG1hcFNpemUg
PSA0MDk2OworICAgIGlmIChkZXN0X3dpZHRoICogZGVzdF9oZWlnaHQgPD0ga1NtYWxsQml0bWFw
U2l6ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBJZiAidG9vIG1hbnkiIHJlcXVl
c3RzIGhhdmUgYmVlbiBtYWRlIGZvciB0aGlzIGJpdG1hcCwgd2UgYXNzdW1lIHRoYXQKKyAgICAv
LyBtYW55IG1vcmUgd2lsbCBiZSBtYWRlIGFzIHdlbGwsIGFuZCB3ZSdsbCBnbyBhaGVhZCBhbmQg
Y2FjaGUgaXQuCisgICAgc3RhdGljIGNvbnN0IGludCBrTWFueVJlcXVlc3RUaHJlc2hvbGQgPSA0
OworICAgIGlmIChtX2xhc3RSZXF1ZXN0U2l6ZS53aWR0aCgpID09IGRlc3Rfd2lkdGggJiYKKyAg
ICAgICAgbV9sYXN0UmVxdWVzdFNpemUuaGVpZ2h0KCkgPT0gZGVzdF9oZWlnaHQpIHsKKyAgICAg
ICAgaWYgKG1fcmVzaXplUmVxdWVzdHMgPj0ga01hbnlSZXF1ZXN0VGhyZXNob2xkKQorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hlbiBhIGRpZmZl
cmVudCBzaXplIGlzIGJlaW5nIHJlcXVlc3RlZCwgY291bnQgdGhpcyBhcyBhIHF1ZXJ5CisgICAg
ICAgIC8vIChoYXNSZXNpemVkQml0bWFwKSBhbmQgcmVzZXQgdGhlIGNvdW50ZXIuCisgICAgICAg
IG1fbGFzdFJlcXVlc3RTaXplID0gV2ViQ29yZTo6SW50U2l6ZShkZXN0X3dpZHRoLCBkZXN0X2hl
aWdodCk7CisgICAgICAgIG1fcmVzaXplUmVxdWVzdHMgPSAwOworICAgIH0KKworICAgIC8vIE90
aGVyd2lzZSwgdXNlIHRoZSBoZXVyaXN0aWMgdGhhdCBpZiBtb3JlIHRoYW4gMS80IG9mIHRoZSBp
bWFnZSBpcworICAgIC8vIHJlcXVlc3RlZCwgaXQncyB3b3J0aCBjYWNoaW5nLgorICAgIGludCBk
ZXN0X3NpemUgPSBkZXN0X3dpZHRoICogZGVzdF9oZWlnaHQ7CisgICAgaW50IGRlc3Rfc3Vic2V0
X3NpemUgPSBkZXN0X3N1YnNldF93aWR0aCAqIGRlc3Rfc3Vic2V0X2hlaWdodDsKKyAgICByZXR1
cm4gZGVzdF9zaXplIC8gNCA8IGRlc3Rfc3Vic2V0X3NpemU7Cit9CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTmF0aXZlSW1hZ2VTa2lhLmggYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvTmF0aXZlSW1hZ2VTa2lhLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMjAwZTM3MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuaApAQCAtMCwwICsxLDEwNCBAQAor
LyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIE5hdGl2ZUltYWdlU2tpYV9oCisjZGVmaW5lIE5hdGl2ZUltYWdlU2tpYV9oCisK
KyNpbmNsdWRlICJTa0JpdG1hcC5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKworLy8gVGhpcyBv
YmplY3QgaXMgdXNlZCBhcyB0aGUgIm5hdGl2ZSBpbWFnZSIgaW4gb3VyIHBvcnQuIFdoZW4gV2Vi
S2l0IHVzZXMKKy8vICJOYXRpdmVJbWFnZVB0ciIsIGl0IGlzIGEgcG9pbnRlciB0byB0aGlzIHR5
cGUuIEl0IGlzIGFuIFNrQml0bWFwLCBidXQgYWxzbworLy8gc3RvcmVzIGEgY2FjaGVkIHJlc2l6
ZWQgaW1hZ2UuCitjbGFzcyBOYXRpdmVJbWFnZVNraWEgOiBwdWJsaWMgU2tCaXRtYXAgeworcHVi
bGljOgorICAgIE5hdGl2ZUltYWdlU2tpYSgpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVy
IG9mIGJ5dGVzIG9mIGltYWdlIGRhdGEuIFRoaXMgaW5jbHVkZXMgdGhlIGNhY2hlZAorICAgIC8v
IHJlc2l6ZWQgdmVyc2lvbiBpZiB0aGVyZSBpcyBvbmUuCisgICAgaW50IGRlY29kZWRTaXplKCkg
Y29uc3Q7CisKKyAgICAvLyBTZXRzIHRoZSBkYXRhIGNvbXBsZXRlIGZsYWcuIFRoaXMgaXMgY2Fs
bGVkIGJ5IHRoZSBpbWFnZSBkZWNvZGVyIHdoZW4KKyAgICAvLyBhbGwgZGF0YSBpcyBjb21wbGV0
ZSwgYW5kIHVzZWQgYnkgdXMgdG8ga25vdyB3aGV0aGVyIHdlIGNhbiBjYWNoZQorICAgIC8vIHJl
c2l6ZWQgaW1hZ2VzLgorICAgIHZvaWQgc2V0RGF0YUNvbXBsZXRlKCkgeyBtX2lzRGF0YUNvbXBs
ZXRlID0gdHJ1ZTsgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpcmUgaW1hZ2Ug
aGFzIGJlZW4gZGVjb2RlZC4KKyAgICBib29sIGlzRGF0YUNvbXBsZXRlKCkgY29uc3QgeyByZXR1
cm4gbV9pc0RhdGFDb21wbGV0ZTsgfQorCisgICAgLy8gV2UgY2FuIGtlZXAgYSByZXNpemVkIHZl
cnNpb24gb2YgdGhlIGJpdG1hcCBjYWNoZWQgb24gdGhpcyBvYmplY3QuCisgICAgLy8gVGhpcyBm
dW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgY2FjaGVkIHZlcnNpb24gb2Yg
dGhlCisgICAgLy8gZ2l2ZW4gaW1hZ2Ugc3Vic2V0IHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMu
CisgICAgYm9vbCBoYXNSZXNpemVkQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3Q7
CisKKyAgICAvLyBUaGlzIHdpbGwgcmV0dXJuIGFuIGV4aXN0aW5nIHJlc2l6ZWQgaW1hZ2UsIG9y
IGdlbmVyYXRlIGEgbmV3IG9uZSBvZgorICAgIC8vIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgc3Rv
cmUgaXQgaW4gdGhlIGNhY2hlLiBTdWJzZXR0ZWQgaW1hZ2VzIGNhbiBub3QKKyAgICAvLyBiZSBj
YWNoZWQgdW5sZXNzIHRoZSBzdWJzZXQgaXMgdGhlIGVudGlyZSBiaXRtYXAuCisgICAgU2tCaXRt
YXAgcmVzaXplZEJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0OworCisgICAgLy8g
UmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiByZXNpemUgb3BlcmF0aW9uIHNob3VsZCBlaXRoZXIg
cmVzaXplIHRoZSB3aG9sZQorICAgIC8vIGltYWdlIGFuZCBjYWNoZSBpdCwgb3IgcmVzaXplIGp1
c3QgdGhlIHBhcnQgaXQgbmVlZHMgYW5kIHRocm93IHRoZSByZXN1bHQKKyAgICAvLyBhd2F5Lgor
ICAgIC8vCisgICAgLy8gT24gdGhlIG9uZSBoYW5kLCBpZiBvbmx5IGEgc21hbGwgc3Vic2V0IGlz
IGRlc2lyZWQsIHRoZW4gd2Ugd2lsbCB3YXN0ZSBhCisgICAgLy8gbG90IG9mIHRpbWUgcmVzYW1w
bGluZyB0aGUgZW50aXJlIHRoaW5nLCBzbyB3ZSBvbmx5IHdhbnQgdG8gZG8gZXhhY3RseQorICAg
IC8vIHdoYXQncyByZXF1aXJlZC4gT24gdGhlIG90aGVyIGhhbmQsIHJlc2FtcGxpbmcgdGhlIGVu
dGlyZSBiaXRtYXAgaXMKKyAgICAvLyBiZXR0ZXIgaWYgd2UncmUgZ29pbmcgdG8gYmUgdXNpbmcg
aXQgbW9yZSB0aGFuIG9uY2UgKGxpa2UgYSBiaXRtYXAKKyAgICAvLyBzY3JvbGxpbmcgb24gYW5k
IG9mZiB0aGUgc2NyZWVuLiBTaW5jZSB3ZSBvbmx5IGNhY2hlIHdoZW4gZG9pbmcgdGhlCisgICAg
Ly8gZW50aXJlIHRoaW5nLCBpdCdzIGJlc3QgdG8ganVzdCBkbyBpdCB1cCBmcm9udC4KKyAgICBi
b29sIHNob3VsZENhY2hlUmVzYW1wbGluZyhpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW50IGRlc3Rfc3Vic2V0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBkZXN0X3N1YnNldF9oZWlnaHQpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8v
IFNldCB0byB0cnVlIHdoZW4gdGhlIGRhdGEgaXMgY29tcGxldGUuIEJlZm9yZSB0aGUgZW50aXJl
IGltYWdlIGhhcworICAgIC8vIGxvYWRlZCwgd2UgZG8gbm90IHdhbnQgdG8gY2FjaGUgYSByZXNp
emUuCisgICAgYm9vbCBtX2lzRGF0YUNvbXBsZXRlOworCisgICAgLy8gVGhlIGNhY2hlZCBiaXRt
YXAuIFRoaXMgd2lsbCBiZSBlbXB0eSgpIGlmIHRoZXJlIGlzIG5vIGNhY2hlZCBpbWFnZS4KKyAg
ICBtdXRhYmxlIFNrQml0bWFwIG1fcmVzaXplZEltYWdlOworCisgICAgLy8gUmVmZXJlbmNlcyBo
b3cgbWFueSB0aW1lcyB0aGF0IHRoZSBpbWFnZSBzaXplIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IK
KyAgICAvLyB0aGUgbGFzdCBzaXplLgorICAgIC8vCisgICAgLy8gRXZlcnkgdGltZSB3ZSBnZXQg
YSByZXF1ZXN0LCBpZiBpdCBtYXRjaGVzIHRoZSBtX2xhc3RSZXF1ZXN0U2l6ZSwgd2UnbGwKKyAg
ICAvLyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIsIGFuZCBpZiBub3QsIHdlJ2xsIHJlc2V0IHRoZSBj
b3VudGVyIGFuZCBzYXZlIHRoZQorICAgIC8vIHNpemUuCisgICAgLy8KKyAgICAvLyBUaGlzIGFs
bG93cyB1cyB0byBzZWUgaWYgbWFueSByZXF1ZXN0cyBoYXZlIGJlZW4gbWFkZSBmb3IgdGhlIHNh
bWUKKyAgICAvLyByZXNpemVkIGltYWdlLCB3ZSBrbm93IHRoYXQgd2Ugc2hvdWxkIHByb2JhYmx5
IGNhY2hlIGl0LCBldmVuIGlmIGFsbCBvZgorICAgIC8vIHRob3NlIHJlcXVlc3RzIGluZGl2aWR1
YWxseSBhcmUgc21hbGwgYW5kIHdvdWxkIG5vdCBvdGhlcndpc2UgYmUgY2FjaGVkLgorICAgIG11
dGFibGUgV2ViQ29yZTo6SW50U2l6ZSBtX2xhc3RSZXF1ZXN0U2l6ZTsKKyAgICBtdXRhYmxlIGlu
dCBtX3Jlc2l6ZVJlcXVlc3RzOworfTsKKworI2VuZGlmICAvLyBOYXRpdmVJbWFnZVNraWFfaAor
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGF0aFNraWEuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhTa2lhLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWI5MGUyCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhTa2lhLmNwcApAQCAtMCwwICsxLDMxNyBA
QAorLy8gQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKy8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLyAK
Ky8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vIAorLy8g
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
Ky8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlN0cm9rZVN0eWxlQXBw
bGllci5oIgorCisjaW5jbHVkZSAiU2tQYXRoLmgiCisjaW5jbHVkZSAiU2tSZWdpb24uaCIKKwor
I2luY2x1ZGUgIlNraWFVdGlscy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhdGg6OlBh
dGgoKQoreworICAgIG1fcGF0aCA9IG5ldyBTa1BhdGg7Cit9CisKK1BhdGg6OlBhdGgoY29uc3Qg
UGF0aCYgb3RoZXIpCit7CisgICAgbV9wYXRoID0gbmV3IFNrUGF0aCgqb3RoZXIubV9wYXRoKTsK
K30KKworUGF0aDo6flBhdGgoKQoreworICAgIGRlbGV0ZSBtX3BhdGg7Cit9CisKK1BhdGgmIFBh
dGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICAqbV9wYXRoID0gKm90aGVy
Lm1fcGF0aDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgUGF0aDo6aXNFbXB0eSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+aXNFbXB0eSgpOworfQorCitib29sIFBhdGg6OmNv
bnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAorewor
ICAgIHJldHVybiBTa1BhdGhDb250YWluc1BvaW50KAorICAgICAgbV9wYXRoLAorICAgICAgcG9p
bnQsIAorICAgICAgcnVsZSA9PSBSVUxFX05PTlpFUk8gPyBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxU
eXBlIDogU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZSk7Cit9CisKK3ZvaWQgUGF0aDo6dHJhbnNs
YXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX3BhdGgtPm9mZnNldChXZWJDb3Jl
RmxvYXRUb1NrU2NhbGFyKHNpemUud2lkdGgoKSksIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc2l6
ZS5oZWlnaHQoKSkpOworfQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QK
K3sKKyAgICBTa1JlY3QgIHI7CisgICAgCisgICAgbV9wYXRoLT5jb21wdXRlQm91bmRzKCZyLCBT
a1BhdGg6OmtFeGFjdF9Cb3VuZHNUeXBlKTsKKyAgICByZXR1cm4gRmxvYXRSZWN0KCAgIFNrU2Nh
bGFyVG9GbG9hdChyLmZMZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNrU2NhbGFyVG9G
bG9hdChyLmZUb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgU2tTY2FsYXJUb0Zsb2F0KHIu
d2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBTa1NjYWxhclRvRmxvYXQoci5oZWln
aHQoKSkpOworfQorCit2b2lkIFBhdGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkK
K3sKKyAgICBtX3BhdGgtPm1vdmVUbyhXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHBvaW50LngoKSks
IFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocG9pbnQueSgpKSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRk
TGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5saW5lVG8oV2ViQ29y
ZUZsb2F0VG9Ta1NjYWxhcihwLngoKSksIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocC55KCkpKTsK
K30KKwordm9pZCBQYXRoOjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcCwgY29u
c3QgRmxvYXRQb2ludCYgZXApCit7CisgICAgbV9wYXRoLT5xdWFkVG8oV2ViQ29yZUZsb2F0VG9T
a1NjYWxhcihjcC54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGNwLnkoKSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihlcC54KCkpLCBXZWJD
b3JlRmxvYXRUb1NrU2NhbGFyKGVwLnkoKSkpOworfQorCit2b2lkIFBhdGg6OmFkZEJlemllckN1
cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyLCBjb25zdCBG
bG9hdFBvaW50JiBlcCkKK3sKKyAgICBtX3BhdGgtPmN1YmljVG8oV2ViQ29yZUZsb2F0VG9Ta1Nj
YWxhcihwMS54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHAxLnkoKSksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocDIueCgpKSwgV2ViQ29y
ZUZsb2F0VG9Ta1NjYWxhcihwMi55KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBX
ZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGVwLngoKSksIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoZXAu
eSgpKSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQXJjVG8oY29uc3QgRmxvYXRQb2ludCYgcDEsIGNv
bnN0IEZsb2F0UG9pbnQmIHAyLCBmbG9hdCByYWRpdXMpCit7CisgICAgbV9wYXRoLT5hcmNUbyhX
ZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHAxLngoKSksIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIocDEu
eSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIo
cDIueCgpKSwgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihwMi55KCkpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihyYWRpdXMpKTsKK30KKwordm9pZCBQ
YXRoOjpjbG9zZVN1YnBhdGgoKQoreworICAgIG1fcGF0aC0+Y2xvc2UoKTsKK30KKworc3RhdGlj
IGNvbnN0IGZsb2F0IGdQSSA9IDMuMTQxNTkyNmY7CisKK3ZvaWQgUGF0aDo6YWRkQXJjKGNvbnN0
IEZsb2F0UG9pbnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhLCBmbG9hdCBlYSwKKyAgICAgICAgICAg
ICAgICAgIGJvb2wgYW50aWNsb2Nrd2lzZSkgeworICAgIFNrU2NhbGFyICAgIGN4ID0gV2ViQ29y
ZUZsb2F0VG9Ta1NjYWxhcihwLngoKSk7CisgICAgU2tTY2FsYXIgICAgY3kgPSBXZWJDb3JlRmxv
YXRUb1NrU2NhbGFyKHAueSgpKTsKKyAgICBTa1NjYWxhciAgICByYWRpdXMgPSBXZWJDb3JlRmxv
YXRUb1NrU2NhbGFyKHIpOworCisgICAgU2tSZWN0ICBvdmFsOworICAgIG92YWwuc2V0KGN4IC0g
cmFkaXVzLCBjeSAtIHJhZGl1cywgY3ggKyByYWRpdXMsIGN5ICsgcmFkaXVzKTsKKyAgICAKKyAg
ICBmbG9hdCBzd2VlcCA9IGVhIC0gc2E7CisgICAgLy8gY2hlY2sgZm9yIGEgY2lyY2xlCisgICAg
aWYgKHN3ZWVwID49IDIqZ1BJIHx8IHN3ZWVwIDw9IC0yKmdQSSkgeworICAgICAgICBtX3BhdGgt
PmFkZE92YWwob3ZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tTY2FsYXIgc3RhcnREZWdy
ZWVzID0gV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzYSAqIDE4MCAvIGdQSSk7CisgICAgICAgIFNr
U2NhbGFyIHN3ZWVwRGVncmVlcyA9IFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc3dlZXAgKiAxODAg
LyBnUEkpOworCisgICAgICAgIC8vIENvdW50ZXJjbG9ja3dpc2UgYXJjcyBzaG91bGQgYmUgZHJh
d24gd2l0aCBuZWdhdGl2ZSBzd2VlcHMsIHdoaWxlCisgICAgICAgIC8vIGNsb2Nrd2lzZSBhcmNz
IHNob3VsZCBiZSBkcmF3biB3aXRoIHBvc2l0aXZlIHN3ZWVwcy4gQ2hlY2sgdG8gc2VlCisgICAg
ICAgIC8vIGlmIHRoZSBzaXR1YXRpb24gaXMgcmV2ZXJzZWQgYW5kIGNvcnJlY3QgaXQgYnkgYWRk
aW5nIG9yIHN1YnRyYWN0aW5nCisgICAgICAgIC8vIGEgZnVsbCBjaXJjbGUKKyAgICAgICAgaWYg
KGFudGljbG9ja3dpc2UgJiYgc3dlZXBEZWdyZWVzID4gMCkgeworICAgICAgICAgICAgc3dlZXBE
ZWdyZWVzIC09IFNrSW50VG9TY2FsYXIoMzYwKTsKKyAgICAgICAgfSBlbHNlIGlmICghYW50aWNs
b2Nrd2lzZSAmJiBzd2VlcERlZ3JlZXMgPCAwKSB7CisgICAgICAgICAgICBzd2VlcERlZ3JlZXMg
Kz0gU2tJbnRUb1NjYWxhcigzNjApOworICAgICAgICB9CisKKy8vICAgICAgICBTa0RlYnVnZigi
YWRkQXJjIHNhPSVnIGVhPSVnIGN3PSVkIHN0YXJ0PSVnIHN3ZWVwPSVnXG4iLCBzYSwgZWEsIGNs
b2Nrd2lzZSwKKy8vICAgICAgICAgICAgICAgICBTa1NjYWxhclRvRmxvYXQoc3RhcnREZWdyZWVz
KSwgU2tTY2FsYXJUb0Zsb2F0KHN3ZWVwRGVncmVlcykpOworCisgICAgICAgIG1fcGF0aC0+YXJj
VG8ob3ZhbCwgc3RhcnREZWdyZWVzLCBzd2VlcERlZ3JlZXMsIGZhbHNlKTsKKyAgICB9Cit9CisK
K3ZvaWQgUGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgbV9wYXRo
LT5hZGRSZWN0KHJlY3QpOworfQorCit2b2lkIFBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRS
ZWN0JiByZWN0KQoreworICAgIG1fcGF0aC0+YWRkT3ZhbChyZWN0KTsKK30KKwordm9pZCBQYXRo
OjpjbGVhcigpCit7CisgICAgbV9wYXRoLT5yZXNldCgpOworfQorCitzdGF0aWMgRmxvYXRQb2lu
dCogc2V0ZnB0cyhGbG9hdFBvaW50IGRzdFtdLCBjb25zdCBTa1BvaW50IHNyY1tdLCBpbnQgY291
bnQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAg
ICAgZHN0W2ldLnNldFgoU2tTY2FsYXJUb0Zsb2F0KHNyY1tpXS5mWCkpOworICAgICAgICBkc3Rb
aV0uc2V0WShTa1NjYWxhclRvRmxvYXQoc3JjW2ldLmZZKSk7CisgICAgfQorICAgIHJldHVybiBk
c3Q7Cit9CisKK3ZvaWQgUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0aEFwcGxpZXJGdW5jdGlv
biBmdW5jdGlvbikgY29uc3QKK3sKKyAgICBTa1BhdGg6Okl0ZXIgICAgaXRlcigqbV9wYXRoLCBm
YWxzZSk7CisgICAgU2tQb2ludCAgICAgICAgIHB0c1s0XTsKKyAgICAKKyAgICBQYXRoRWxlbWVu
dCAgICAgZWxlbTsKKyAgICBGbG9hdFBvaW50ICAgICAgZnB0c1szXTsKKworICAgIGZvciAoOzsp
CisgICAgeworICAgICAgICBzd2l0Y2ggKGl0ZXIubmV4dChwdHMpKSB7CisgICAgICAgIGNhc2Ug
U2tQYXRoOjprTW92ZV9WZXJiOgorICAgICAgICAgICAgZWxlbS50eXBlID0gUGF0aEVsZW1lbnRN
b3ZlVG9Qb2ludDsKKyAgICAgICAgICAgIGVsZW0ucG9pbnRzID0gc2V0ZnB0cyhmcHRzLCAmcHRz
WzBdLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNrUGF0aDo6a0xpbmVf
VmVyYjoKKyAgICAgICAgICAgIGVsZW0udHlwZSA9IFBhdGhFbGVtZW50QWRkTGluZVRvUG9pbnQ7
CisgICAgICAgICAgICBlbGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgJnB0c1sxXSwgMSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtRdWFkX1ZlcmI6CisgICAg
ICAgICAgICBlbGVtLnR5cGUgPSBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7CisgICAg
ICAgICAgICBlbGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgJnB0c1sxXSwgMik7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDdWJpY19WZXJiOgorICAgICAgICAg
ICAgZWxlbS50eXBlID0gUGF0aEVsZW1lbnRBZGRDdXJ2ZVRvUG9pbnQ7CisgICAgICAgICAgICBl
bGVtLnBvaW50cyA9IHNldGZwdHMoZnB0cywgJnB0c1sxXSwgMyk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDbG9zZV9WZXJiOgorICAgICAgICAgICAgZWxlbS50
eXBlID0gUGF0aEVsZW1lbnRDbG9zZVN1YnBhdGg7CisgICAgICAgICAgICBlbGVtLnBvaW50cyA9
IHNldGZwdHMoZnB0cywgTlVMTCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBTa1BhdGg6OmtEb25lX1ZlcmI6CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgZnVuY3Rpb24oaW5mbywgJmVsZW0pOworICAgIH0KK30KKwordm9pZCBQYXRoOjp0cmFu
c2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB4Zm9ybSkKK3sKKyAgICBtX3BhdGgtPnRyYW5z
Zm9ybSh4Zm9ybSk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7Cisg
ICAgU3RyaW5nIHJlc3VsdDsKKworICAgIFNrUGF0aDo6SXRlciAgICBpdGVyKCptX3BhdGgsIGZh
bHNlKTsKKyAgICBTa1BvaW50ICAgICAgICAgcHRzWzRdOworCisgICAgaW50ICAgICAgICAgICAg
IG51bVBvaW50cyA9IG1fcGF0aC0+Z2V0UG9pbnRzKE5VTEwsIDApOworICAgIFNrUGF0aDo6VmVy
YiAgICB2ZXJiOworCisgICAgZG8geworICAgICAgICB2ZXJiID0gaXRlci5uZXh0KHB0cyk7Cisg
ICAgICAgIHN3aXRjaCAodmVyYikgeworICAgICAgICBjYXNlIFNrUGF0aDo6a01vdmVfVmVyYjoK
KyAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmc6OmZvcm1hdCgiTSUuMmYsJS4yZiAiLCBwdHNb
MF0uZlgsIHB0c1swXS5mWSk7CisgICAgICAgICAgICBudW1Qb2ludHMgLT0gMTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIFNrUGF0aDo6a0xpbmVfVmVyYjoKKyAgICAgICAgICBp
ZiAoIWl0ZXIuaXNDbG9zZUxpbmUoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJp
bmc6OmZvcm1hdCgiTCUuMmYsJS4yZiAiLCBwdHNbMV0uZlgsIHB0c1sxXS5mWSk7IAorICAgICAg
ICAgICAgICAgIG51bVBvaW50cyAtPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgU2tQYXRoOjprUXVhZF9WZXJiOgorICAgICAgICAgICAgcmVzdWx0
ICs9IFN0cmluZzo6Zm9ybWF0KCJRJS4yZiwlLjJmLCUuMmYsJS4yZiAiLAorICAgICAgICAgICAg
ICAgIHB0c1sxXS5mWCwgcHRzWzFdLmZZLAorICAgICAgICAgICAgICAgIHB0c1syXS5mWCwgcHRz
WzJdLmZZKTsKKyAgICAgICAgICAgIG51bVBvaW50cyAtPSAyOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgU2tQYXRoOjprQ3ViaWNfVmVyYjoKKyAgICAgICAgICAgIHJlc3VsdCAr
PSBTdHJpbmc6OmZvcm1hdCgiQyUuMmYsJS4yZiwlLjJmLCUuMmYsJS4yZiwlLjJmICIsCisgICAg
ICAgICAgICAgICAgcHRzWzFdLmZYLCBwdHNbMV0uZlksCisgICAgICAgICAgICAgICAgcHRzWzJd
LmZYLCBwdHNbMl0uZlksCisgICAgICAgICAgICAgICAgcHRzWzNdLmZYLCBwdHNbM10uZlkpOwor
ICAgICAgICAgICAgbnVtUG9pbnRzIC09IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBTa1BhdGg6OmtDbG9zZV9WZXJiOgorICAgICAgICAgICAgcmVzdWx0ICs9ICJaICI7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtEb25lX1ZlcmI6CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHZlcmIgIT0gU2tQYXRoOjpr
RG9uZV9WZXJiKTsKKworICAgIC8vIElmIHlvdSBoYXZlIGEgcGF0aCB0aGF0IGVuZHMgd2l0aCBh
biBNLCBTa2lhIHdpbGwgbm90IGl0ZXJhdGUgdGhlCisgICAgLy8gdHJhaWxpbmcgTS4gVGhhdCdz
IG5pY2Ugb2YgaXQsIGJ1dCBBcHBsZSdzIHBhdGhzIG91dHB1dCB0aGUgdHJhaWxpbmcgTQorICAg
IC8vIGFuZCB3ZSB3YW50IG91dCBsYXlvdXQgZHVtcHMgdG8gbG9vayBsaWtlIHRoZWlycworICAg
IGlmIChudW1Qb2ludHMpIHsKKyAgICAgICAgQVNTRVJUKG51bVBvaW50cz09MSk7CisgICAgICAg
IG1fcGF0aC0+Z2V0TGFzdFB0KHB0cyk7CisgICAgICAgIHJlc3VsdCArPSBTdHJpbmc6OmZvcm1h
dCgiTSUuMmYsJS4yZiAiLCBwdHNbMF0uZlgsIHB0c1swXS5mWSk7CisgICAgfQorCisgICAgcmV0
dXJuIHJlc3VsdC5zdHJpcFdoaXRlU3BhY2UoKTsKK30KKworLy8gQ29tcHV0ZXMgdGhlIGJvdW5k
aW5nIGJveCBmb3IgdGhlIHN0cm9rZSBhbmQgc3R5bGUgY3VycmVudGx5IHNlbGVjdGVkIGludG8K
Ky8vIHRoZSBnaXZlbiBib3VuZGluZyBib3guIFRoaXMgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQg
dGhlIHN0cm9rZSB3aWR0aC4KK3N0YXRpYyBGbG9hdFJlY3QgYm91bmRpbmdCb3hGb3JDdXJyZW50
U3Ryb2tlKGNvbnN0IEdyYXBoaWNzQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBTa1BhaW50IHBh
aW50OworICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yU3Ryb2tp
bmcoJnBhaW50LCAwLCAwKTsKKyAgICBTa1BhdGggYm91bmRpbmdQYXRoOworICAgIHBhaW50Lmdl
dEZpbGxQYXRoKCpjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y3VycmVudFBhdGgoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAmYm91bmRpbmdQYXRoKTsKKyAgICBTa1JlY3QgcjsKKyAgICBi
b3VuZGluZ1BhdGguY29tcHV0ZUJvdW5kcygmciwgU2tQYXRoOjprRXhhY3RfQm91bmRzVHlwZSk7
CisgICAgcmV0dXJuIHI7Cit9CisKK0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3Qo
U3Ryb2tlU3R5bGVBcHBsaWVyKiBhcHBsaWVyKQoreworICAgIEdyYXBoaWNzQ29udGV4dCogc2Ny
YXRjaCA9IHNjcmF0Y2hDb250ZXh0KCk7CisgICAgc2NyYXRjaC0+c2F2ZSgpOworICAgIHNjcmF0
Y2gtPmJlZ2luUGF0aCgpOworICAgIHNjcmF0Y2gtPmFkZFBhdGgoKnRoaXMpOworCisgICAgaWYg
KGFwcGxpZXIpCisgICAgICAgIGFwcGxpZXItPnN0cm9rZVN0eWxlKHNjcmF0Y2gpOworCisgICAg
RmxvYXRSZWN0IHIgPSBib3VuZGluZ0JveEZvckN1cnJlbnRTdHJva2Uoc2NyYXRjaCk7CisgICAg
c2NyYXRjaC0+cmVzdG9yZSgpOworICAgIHJldHVybiByOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGF0dGVy
blNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdHRlcm5Ta2lhLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBhMTJmCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdHRlcm5Ta2lhLmNwcApA
QCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9m
CisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhdHRl
cm4uaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkltYWdlLmgi
CisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisKKyNpbmNsdWRlICJTa1NoYWRlci5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBpbmxpbmUgU2tTaGFkZXI6OlRpbGVNb2Rl
IHNoYWRlclJ1bGUoYm9vbCBzaG91bGRSZXBlYXQpCit7CisgICAgLy8gRklYTUU6IFNraWEgZG9l
cyBub3QgaGF2ZSBhICJkcmF3IHRoZSB0aWxlIG9ubHkgb25jZSIgb3B0aW9uCisgICAgLy8gQ2xh
bXAgZHJhd3MgdGhlIGxhc3QgbGluZSBvZiB0aGUgaW1hZ2UgYWZ0ZXIgc3RvcHBpbmcgcmVwZWF0
aW5nCisgICAgcmV0dXJuIHNob3VsZFJlcGVhdCA/IFNrU2hhZGVyOjprUmVwZWF0X1RpbGVNb2Rl
IDogU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZTsKK30KKworUGxhdGZvcm1QYXR0ZXJuUHRyIFBh
dHRlcm46OmNyZWF0ZVBsYXRmb3JtUGF0dGVybihjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRl
cm5UcmFuc2Zvcm0pIGNvbnN0Cit7CisgICAgU2tCaXRtYXAqIGJtID0gbV90aWxlSW1hZ2UtPm5h
dGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgU2tTaGFkZXIqIHNoYWRlciA9IFNrU2hh
ZGVyOjpDcmVhdGVCaXRtYXBTaGFkZXIoKmJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclJ1bGUobV9yZXBlYXRYKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJSdWxlKG1f
cmVwZWF0WSkpOworICAgIHNoYWRlci0+c2V0TG9jYWxNYXRyaXgocGF0dGVyblRyYW5zZm9ybSk7
CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="review"
          id="12580"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26507</attachid>
            <date>2009-01-07 13:51:41 -0800</date>
            <delta_ts>2009-01-07 14:05:52 -0800</delta_ts>
            <desc>Add remaining bits of platform/graphics/skia</desc>
            <filename>skia6.patch</filename>
            <type>text/plain</type>
            <size>48282</size>
            <attacher name="Dimitri Glazkov (Google)">dglazkov</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MjlkMTBjNS4uZDdhOGU0MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw4MyBAQAorMjAwOS0wMS0wNyAgRGltaXRyaSBHbGF6
a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMzE0NworICAgICAgICBBZGQgcmVtYWluaW5nIGJpdHMgb2YgcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS8uCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3JtQ29u
dGV4dFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OlN0YXRl
OjpTdGF0ZSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpTdGF0ZTo6flN0YXRlKToK
KyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OlN0YXRlOjphcHBseUFscGhhKToKKyAgICAg
ICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OlBsYXRmb3JtQ29udGV4dFNraWEpOgorICAgICAgICAo
UGxhdGZvcm1Db250ZXh0U2tpYTo6flBsYXRmb3JtQ29udGV4dFNraWEpOgorICAgICAgICAoUGxh
dGZvcm1Db250ZXh0U2tpYTo6c2V0Q2FudmFzKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNr
aWE6OnNhdmUpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6cmVzdG9yZSk6CisgICAg
ICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpkcmF3UmVjdCk6CisgICAgICAgIChQbGF0Zm9ybUNv
bnRleHRTa2lhOjpzZXR1cFBhaW50Q29tbW9uKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNr
aWE6OnNldHVwUGFpbnRGb3JGaWxsaW5nKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6
OnNldHVwUGFpbnRGb3JTdHJva2luZyk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpz
ZXREcmF3TG9vcGVyKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OnNldE1pdGVyTGlt
aXQpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0QWxwaGEpOgorICAgICAgICAo
UGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0TGluZUNhcCk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRl
eHRTa2lhOjpzZXRMaW5lSm9pbik6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRQ
b3J0ZXJEdWZmTW9kZSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRGaWxsQ29s
b3IpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6Z2V0RHJhd0xvb3Blcik6CisgICAg
ICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpnZXRTdHJva2VTdHlsZSk6CisgICAgICAgIChQbGF0
Zm9ybUNvbnRleHRTa2lhOjpzZXRTdHJva2VTdHlsZSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRl
eHRTa2lhOjpzZXRTdHJva2VDb2xvcik6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpn
ZXRTdHJva2VUaGlja25lc3MpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0U3Ry
b2tlVGhpY2tuZXNzKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OmdldFRleHREcmF3
aW5nTW9kZSk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRUZXh0RHJhd2luZ01v
ZGUpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0VXNlQW50aWFsaWFzaW5nKToK
KyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6OmZpbGxDb2xvcik6CisgICAgICAgIChQbGF0
Zm9ybUNvbnRleHRTa2lhOjpiZWdpblBhdGgpOgorICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tp
YTo6YWRkUGF0aCk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRGaWxsUnVsZSk6
CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRHcmFkaWVudCk6CisgICAgICAgIChQ
bGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRQYXR0ZXJuKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4
dFNraWE6OnNldERhc2hQYXRoRWZmZWN0KToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6
OnBhaW50U2tQYWludCk6CisgICAgICAgIChQbGF0Zm9ybUNvbnRleHRTa2lhOjpiaXRtYXApOgor
ICAgICAgICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6SXNQcmludGluZyk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9QbGF0Zm9ybUNvbnRleHRTa2lhLmg6IEFkZGVkLgorICAgICAg
ICAoUGxhdGZvcm1Db250ZXh0U2tpYTo6Y3VycmVudFBhdGgpOgorICAgICAgICAoUGxhdGZvcm1D
b250ZXh0U2tpYTo6Y2FudmFzKToKKyAgICAgICAgKFBsYXRmb3JtQ29udGV4dFNraWE6Omdka19z
a2lhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFGb250V2luLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6Q2FjaGVkT3V0
bGluZUtleTo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3JlOjpDYWNoZWRPdXRsaW5lS2V5
OjpDYWNoZWRPdXRsaW5lS2V5SGFzaDo6aGFzaCk6CisgICAgICAgIChXZWJDb3JlOjpDYWNoZWRP
dXRsaW5lS2V5OjpDYWNoZWRPdXRsaW5lS2V5SGFzaDo6ZXF1YWwpOgorICAgICAgICAoV2ViQ29y
ZTo6Q2FjaGVkT3V0bGluZUtleTo6U2tTY2FsYXJUb0ZJWEVEKToKKyAgICAgICAgKFdlYkNvcmU6
OkNhY2hlZE91dGxpbmVLZXk6OkZJWEVEVG9Ta1NjYWxhcik6CisgICAgICAgIChXZWJDb3JlOjpD
YWNoZWRPdXRsaW5lS2V5OjpEZWxldGVPdXRsaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkNhY2hl
ZE91dGxpbmVLZXk6OkFkZFBvbHlDdXJ2ZVRvUGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpDYWNo
ZWRPdXRsaW5lS2V5OjpHZXRQYXRoRm9yR2x5cGgpOgorICAgICAgICAoV2ViQ29yZTo6Q2FjaGVk
T3V0bGluZUtleTo6R2V0Q2FjaGVkUGF0aEZvckdseXBoKToKKyAgICAgICAgKFdlYkNvcmU6OlNr
aWFEcmF3VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW1vdmVGb250RnJvbVNraWFGb250V2lu
Q2FjaGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYUZvbnRXaW4uaDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVQb2ludFRvU2tpYVBvaW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OldlYkNvcmVSZWN0VG9Ta2lhUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjop
OgorICAgICAgICAoV2ViQ29yZTo6V2ViQ29yZUNvbXBvc2l0ZVRvU2tpYUNvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnZTY2FsZUJ5dGUpOgorICAgICAgICAoV2ViQ29yZTo6U2tQTUNv
bG9yVG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpTa1BNQ29sb3JUb1dlYkNvcmVDb2xvcik6
CisgICAgICAgIChXZWJDb3JlOjpJbnRlcnNlY3RSZWN0QW5kUmVnaW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkNsaXBSZWN0VG9DYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6U2tQYXRoQ29udGFp
bnNQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpzY3JhdGNoQ29udGV4dCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVE
b3VibGVUb1NrU2NhbGFyKToKKwogMjAwOS0wMS0wNyAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZvcm1Db250ZXh0U2tpYS5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZvcm1Db250ZXh0U2tpYS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYTU0MwotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QbGF0Zm9ybUNvbnRleHRTa2lhLmNw
cApAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI3VuZGVmIExPRworI2luY2x1ZGUgIlNraWFVdGlscy5o
IgorI2luY2x1ZGUgInd0Zi9NYXRoRXh0cmFzLmgiCisKKyNpbmNsdWRlICJza2lhL2V4dC9pbWFn
ZV9vcGVyYXRpb25zLmgiCisjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1fY2FudmFzLmgiCisK
KyNpbmNsdWRlICJTa0JpdG1hcC5oIgorI2luY2x1ZGUgIlNrQ29sb3JQcml2LmgiCisjaW5jbHVk
ZSAiU2tTaGFkZXIuaCIKKyNpbmNsdWRlICJTa0Rhc2hQYXRoRWZmZWN0LmgiCisKKyNpZiBkZWZp
bmVkKE9TX0xJTlVYKQorI2luY2x1ZGUgIkdka1NraWEuaCIKKyNlbmRpZgorCisvLyBTdGF0ZSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorCisvLyBFbmNhcHN1bGF0ZXMgdGhlIGFkZGl0aW9uYWwgcGFpbnRpbmcg
c3RhdGUgaW5mb3JtYXRpb24gd2Ugc3RvcmUgZm9yIGVhY2gKKy8vIHB1c2hlZCBncmFwaGljcyBz
dGF0ZS4KK3N0cnVjdCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpTdGF0ZSB7CisgICAgU3RhdGUoKTsK
KyAgICBTdGF0ZShjb25zdCBTdGF0ZSYpOworICAgIH5TdGF0ZSgpOworCisgICAgLy8gQ29tbW9u
IHNoYWRlciBzdGF0ZS4KKyAgICBmbG9hdCBtX2FscGhhOworICAgIFNrUG9ydGVyRHVmZjo6TW9k
ZSBtX3BvcnRlckR1ZmZNb2RlOworICAgIFNrU2hhZGVyKiBtX2dyYWRpZW50OworICAgIFNrU2hh
ZGVyKiBtX3BhdHRlcm47CisgICAgYm9vbCBtX3VzZUFudGlhbGlhc2luZzsKKyAgICBTa0RyYXdM
b29wZXIqIG1fbG9vcGVyOworCisgICAgLy8gRmlsbC4KKyAgICBTa0NvbG9yIG1fZmlsbENvbG9y
OworCisgICAgLy8gU3Ryb2tlLgorICAgIFdlYkNvcmU6OlN0cm9rZVN0eWxlIG1fc3Ryb2tlU3R5
bGU7CisgICAgU2tDb2xvciBtX3N0cm9rZUNvbG9yOworICAgIGZsb2F0IG1fc3Ryb2tlVGhpY2tu
ZXNzOworICAgIGludCBtX2Rhc2hSYXRpbzsgIC8vIFJhdGlvIG9mIHRoZSBsZW5ndGggb2YgYSBk
YXNoIHRvIGl0cyB3aWR0aC4KKyAgICBmbG9hdCBtX21pdGVyTGltaXQ7CisgICAgU2tQYWludDo6
Q2FwIG1fbGluZUNhcDsKKyAgICBTa1BhaW50OjpKb2luIG1fbGluZUpvaW47CisgICAgU2tEYXNo
UGF0aEVmZmVjdCogbV9kYXNoOworCisgICAgLy8gVGV4dC4gKFNlZSBjVGV4dEZpbGwgJiBmcmll
bmRzIGluIEdyYXBoaWNzQ29udGV4dC5oLikKKyAgICBpbnQgbV90ZXh0RHJhd2luZ01vZGU7CisK
KyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGFwcGx5aW5nIHRoZSBzdGF0ZSdzIGFscGhhIHZh
bHVlIHRvIHRoZSBnaXZlbiBpbnB1dAorICAgIC8vIGNvbG9yIHRvIHByb2R1Y2UgYSBuZXcgb3V0
cHV0IGNvbG9yLgorICAgIFNrQ29sb3IgYXBwbHlBbHBoYShTa0NvbG9yIGMpIGNvbnN0OworCitw
cml2YXRlOgorICAgIC8vIE5vdCBzdXBwb3J0ZWQuCisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3Qg
U3RhdGUmKTsKK307CisKKy8vIE5vdGU6IEtlZXAgdGhlc2VzIGRlZmF1bHQgdmFsdWVzIGluIHN5
bmMgd2l0aCBHcmFwaGljc0NvbnRleHRTdGF0ZS4KK1BsYXRmb3JtQ29udGV4dFNraWE6OlN0YXRl
OjpTdGF0ZSgpCisgICAgOiBtX2FscGhhKDEpCisgICAgLCBtX3BvcnRlckR1ZmZNb2RlKFNrUG9y
dGVyRHVmZjo6a1NyY092ZXJfTW9kZSkKKyAgICAsIG1fZ3JhZGllbnQoMCkKKyAgICAsIG1fcGF0
dGVybigwKQorICAgICwgbV91c2VBbnRpYWxpYXNpbmcodHJ1ZSkKKyAgICAsIG1fbG9vcGVyKDAp
CisgICAgLCBtX2ZpbGxDb2xvcigweEZGMDAwMDAwKQorICAgICwgbV9zdHJva2VTdHlsZShXZWJD
b3JlOjpTb2xpZFN0cm9rZSkKKyAgICAsIG1fc3Ryb2tlQ29sb3IoMHgwRkYwMDAwMDApCisgICAg
LCBtX3N0cm9rZVRoaWNrbmVzcygwKQorICAgICwgbV9kYXNoUmF0aW8oMykKKyAgICAsIG1fbWl0
ZXJMaW1pdCg0KQorICAgICwgbV9saW5lQ2FwKFNrUGFpbnQ6OmtEZWZhdWx0X0NhcCkKKyAgICAs
IG1fbGluZUpvaW4oU2tQYWludDo6a0RlZmF1bHRfSm9pbikKKyAgICAsIG1fZGFzaCgwKQorICAg
ICwgbV90ZXh0RHJhd2luZ01vZGUoV2ViQ29yZTo6Y1RleHRGaWxsKQoreworfQorCitQbGF0Zm9y
bUNvbnRleHRTa2lhOjpTdGF0ZTo6U3RhdGUoY29uc3QgU3RhdGUmIG90aGVyKQoreworICAgIG1l
bWNweSh0aGlzLCAmb3RoZXIsIHNpemVvZihTdGF0ZSkpOworCisgICAgbV9sb29wZXItPnNhZmVS
ZWYoKTsKKyAgICBtX2Rhc2gtPnNhZmVSZWYoKTsKKyAgICBtX2dyYWRpZW50LT5zYWZlUmVmKCk7
CisgICAgbV9wYXR0ZXJuLT5zYWZlUmVmKCk7Cit9CisKK1BsYXRmb3JtQ29udGV4dFNraWE6OlN0
YXRlOjp+U3RhdGUoKQoreworICAgIG1fbG9vcGVyLT5zYWZlVW5yZWYoKTsKKyAgICBtX2Rhc2gt
PnNhZmVVbnJlZigpOworICAgIG1fZ3JhZGllbnQtPnNhZmVVbnJlZigpOworICAgIG1fcGF0dGVy
bi0+c2FmZVVucmVmKCk7Cit9CisKK1NrQ29sb3IgUGxhdGZvcm1Db250ZXh0U2tpYTo6U3RhdGU6
OmFwcGx5QWxwaGEoU2tDb2xvciBjKSBjb25zdAoreworICAgIGludCBzID0gcm91bmRmKG1fYWxw
aGEgKiAyNTYpOworICAgIGlmIChzID49IDI1NikKKyAgICAgICAgcmV0dXJuIGM7CisgICAgaWYg
KHMgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGludCBhID0gU2tBbHBoYU11bChTa0Nv
bG9yR2V0QShjKSwgcyk7CisgICAgcmV0dXJuIChjICYgMHgwMEZGRkZGRikgfCAoYSA8PCAyNCk7
Cit9CisKKy8vIFBsYXRmb3JtQ29udGV4dFNraWEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERhbmdlcjogY2FudmFzIGNhbiBi
ZSBOVUxMLgorUGxhdGZvcm1Db250ZXh0U2tpYTo6UGxhdGZvcm1Db250ZXh0U2tpYShza2lhOjpQ
bGF0Zm9ybUNhbnZhcyogY2FudmFzKQorICAgIDogbV9jYW52YXMoY2FudmFzKQorICAgICwgbV9z
dGF0ZVN0YWNrKHNpemVvZihTdGF0ZSkpCit7CisgICAgbV9zdGF0ZVN0YWNrLmFwcGVuZChTdGF0
ZSgpKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7CisjaWYgZGVmaW5lZChP
U19MSU5VWCkKKyAgICBtX2dka3NraWEgPSBtX2NhbnZhcyA/IGdka19za2lhX25ldyhtX2NhbnZh
cykgOiAwOworI2VuZGlmCit9CisKK1BsYXRmb3JtQ29udGV4dFNraWE6On5QbGF0Zm9ybUNvbnRl
eHRTa2lhKCkKK3sKKyNpZiBkZWZpbmVkKE9TX0xJTlVYKQorICAgIGlmIChtX2dka3NraWEpIHsK
KyAgICAgICAgZ19vYmplY3RfdW5yZWYobV9nZGtza2lhKTsKKyAgICAgICAgbV9nZGtza2lhID0g
MDsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRDYW52
YXMoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcykKK3sKKyAgICBtX2NhbnZhcyA9IGNhbnZh
czsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzYXZlKCkKK3sKKyAgICBtX3N0YXRl
U3RhY2suYXBwZW5kKCptX3N0YXRlKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0
KCk7CisKKyAgICAvLyBTYXZlIG91ciBuYXRpdmUgY2FudmFzLgorICAgIGNhbnZhcygpLT5zYXZl
KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6cmVzdG9yZSgpCit7CisgICAgbV9z
dGF0ZVN0YWNrLnJlbW92ZUxhc3QoKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0
KCk7CisKKyAgICAvLyBSZXN0b3JlIG91ciBuYXRpdmUgY2FudmFzLgorICAgIGNhbnZhcygpLT5y
ZXN0b3JlKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6ZHJhd1JlY3QoU2tSZWN0
IHJlY3QpCit7CisgICAgU2tQYWludCBwYWludDsKKyAgICBpbnQgZmlsbGNvbG9yTm90VHJhbnNw
YXJlbnQgPSBtX3N0YXRlLT5tX2ZpbGxDb2xvciAmIDB4RkYwMDAwMDA7CisgICAgaWYgKGZpbGxj
b2xvck5vdFRyYW5zcGFyZW50KSB7CisgICAgICAgIHNldHVwUGFpbnRGb3JGaWxsaW5nKCZwYWlu
dCk7CisgICAgICAgIGNhbnZhcygpLT5kcmF3UmVjdChyZWN0LCBwYWludCk7CisgICAgfQorCisg
ICAgaWYgKG1fc3RhdGUtPm1fc3Ryb2tlU3R5bGUgIT0gV2ViQ29yZTo6Tm9TdHJva2UgJiYKKyAg
ICAgICAgKG1fc3RhdGUtPm1fc3Ryb2tlQ29sb3IgJiAweEZGMDAwMDAwKSkgeworICAgICAgICBp
ZiAoZmlsbGNvbG9yTm90VHJhbnNwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBp
cyBleHBlbnNpdmUgc28gZG9uJ3QgY2FsbCBpdCB1bm5lY2Vzc2FyaWx5LgorICAgICAgICAgICAg
cGFpbnQucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBzZXR1cFBhaW50Rm9yU3Ryb2tpbmco
JnBhaW50LCAmcmVjdCwgMCk7CisgICAgICAgIGNhbnZhcygpLT5kcmF3UmVjdChyZWN0LCBwYWlu
dCk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldHVwUGFpbnRDb21t
b24oU2tQYWludCogcGFpbnQpIGNvbnN0Cit7CisjaWZkZWYgU0tfREVCVUd4CisgICAgeworICAg
ICAgICBTa1BhaW50IGRlZmF1bHRQYWludDsKKyAgICAgICAgU2tBU1NFUlQoKnBhaW50ID09IGRl
ZmF1bHRQYWludCk7CisgICAgfQorI2VuZGlmCisKKyAgICBwYWludC0+c2V0QW50aUFsaWFzKG1f
c3RhdGUtPm1fdXNlQW50aWFsaWFzaW5nKTsKKyAgICBwYWludC0+c2V0UG9ydGVyRHVmZlhmZXJt
b2RlKG1fc3RhdGUtPm1fcG9ydGVyRHVmZk1vZGUpOworICAgIHBhaW50LT5zZXRMb29wZXIobV9z
dGF0ZS0+bV9sb29wZXIpOworCisgICAgaWYgKG1fc3RhdGUtPm1fZ3JhZGllbnQpCisgICAgICAg
IHBhaW50LT5zZXRTaGFkZXIobV9zdGF0ZS0+bV9ncmFkaWVudCk7CisgICAgZWxzZSBpZiAobV9z
dGF0ZS0+bV9wYXR0ZXJuKQorICAgICAgICBwYWludC0+c2V0U2hhZGVyKG1fc3RhdGUtPm1fcGF0
dGVybik7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0dXBQYWludEZvckZpbGxp
bmcoU2tQYWludCogcGFpbnQpIGNvbnN0Cit7CisgICAgc2V0dXBQYWludENvbW1vbihwYWludCk7
CisgICAgcGFpbnQtPnNldENvbG9yKG1fc3RhdGUtPmFwcGx5QWxwaGEobV9zdGF0ZS0+bV9maWxs
Q29sb3IpKTsKK30KKworZmxvYXQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0dXBQYWludEZvclN0
cm9raW5nKFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFNrUmVjdCogcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIHNldHVwUGFp
bnRDb21tb24ocGFpbnQpOworICAgIGZsb2F0IHdpZHRoID0gbV9zdGF0ZS0+bV9zdHJva2VUaGlj
a25lc3M7CisKKyAgICAvLyBUaGlzIGFsbG93cyBkYXNoaW5nIGFuZCBkb3R0aW5nIHRvIHdvcmsg
cHJvcGVybHkgZm9yIGhhaXJsaW5lIHN0cm9rZXMuCisgICAgaWYgKHdpZHRoID09IDApCisgICAg
ICAgIHdpZHRoID0gMTsKKworICAgIHBhaW50LT5zZXRDb2xvcihtX3N0YXRlLT5hcHBseUFscGhh
KG1fc3RhdGUtPm1fc3Ryb2tlQ29sb3IpKTsKKyAgICBwYWludC0+c2V0U3R5bGUoU2tQYWludDo6
a1N0cm9rZV9TdHlsZSk7CisgICAgcGFpbnQtPnNldFN0cm9rZVdpZHRoKFNrRmxvYXRUb1NjYWxh
cih3aWR0aCkpOworICAgIHBhaW50LT5zZXRTdHJva2VDYXAobV9zdGF0ZS0+bV9saW5lQ2FwKTsK
KyAgICBwYWludC0+c2V0U3Ryb2tlSm9pbihtX3N0YXRlLT5tX2xpbmVKb2luKTsKKyAgICBwYWlu
dC0+c2V0U3Ryb2tlTWl0ZXIoU2tGbG9hdFRvU2NhbGFyKG1fc3RhdGUtPm1fbWl0ZXJMaW1pdCkp
OworCisgICAgaWYgKHJlY3QgIT0gMCAmJiAoc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYod2lkdGgp
KSAmIDEpKQorICAgICAgICByZWN0LT5pbnNldCgtU0tfU2NhbGFySGFsZiwgLVNLX1NjYWxhckhh
bGYpOworCisgICAgaWYgKG1fc3RhdGUtPm1fZGFzaCkgeworICAgICAgICBwYWludC0+c2V0UGF0
aEVmZmVjdChtX3N0YXRlLT5tX2Rhc2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAo
bV9zdGF0ZS0+bV9zdHJva2VTdHlsZSkgeworICAgICAgICBjYXNlIFdlYkNvcmU6Ok5vU3Ryb2tl
OgorICAgICAgICBjYXNlIFdlYkNvcmU6OlNvbGlkU3Ryb2tlOgorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgV2ViQ29yZTo6RGFzaGVkU3Ryb2tlOgorICAgICAgICAgICAgd2lkdGgg
PSBtX3N0YXRlLT5tX2Rhc2hSYXRpbyAqIHdpZHRoOworICAgICAgICAgICAgLy8gRmFsbCB0aHJv
dWdoLgorICAgICAgICBjYXNlIFdlYkNvcmU6OkRvdHRlZFN0cm9rZToKKyAgICAgICAgICAgIFNr
U2NhbGFyIGRhc2hMZW5ndGg7CisgICAgICAgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgICAg
ICAgICAgLy8gRGV0ZXJtaW5lIGFib3V0IGhvdyBtYW55IGRhc2hlcyBvciBkb3RzIHdlIHNob3Vs
ZCBoYXZlLgorICAgICAgICAgICAgICAgIGludCBudW1EYXNoZXMgPSBsZW5ndGggLyByb3VuZGYo
d2lkdGgpOworICAgICAgICAgICAgICAgIGlmICghKG51bURhc2hlcyAmIDEpKQorICAgICAgICAg
ICAgICAgICAgICBudW1EYXNoZXMrKzsgICAgLy8gTWFrZSBpdCBvZGQgc28gd2UgZW5kIG9uIGEg
ZGFzaC9kb3QuCisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBudW1iZXIgb2YgZGFzaGVzIHRv
IGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIGEKKyAgICAgICAgICAgICAgICAvLyBkYXNoL2RvdCwg
d2hpY2ggd2lsbCBiZSBhcHByb3hpbWF0ZWx5IHdpZHRoCisgICAgICAgICAgICAgICAgZGFzaExl
bmd0aCA9IFNrU2NhbGFyRGl2KFNrSW50VG9TY2FsYXIobGVuZ3RoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tJbnRUb1NjYWxhcihudW1EYXNoZXMpKTsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGFzaExlbmd0aCA9IFNrRmxvYXRU
b1NjYWxhcih3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTa1NjYWxhciBpbnRl
cnZhbHNbMl0gPSB7IGRhc2hMZW5ndGgsIGRhc2hMZW5ndGggfTsKKyAgICAgICAgICAgIHBhaW50
LT5zZXRQYXRoRWZmZWN0KAorICAgICAgICAgICAgICAgIG5ldyBTa0Rhc2hQYXRoRWZmZWN0KGlu
dGVydmFscywgMiwgMCkpLT51bnJlZigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB3
aWR0aDsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXREcmF3TG9vcGVyKFNrRHJh
d0xvb3BlciogZGwpCit7CisgICAgU2tSZWZDbnRfU2FmZUFzc2lnbihtX3N0YXRlLT5tX2xvb3Bl
ciwgZGwpOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldE1pdGVyTGltaXQoZmxv
YXQgbWwpCit7CisgICAgbV9zdGF0ZS0+bV9taXRlckxpbWl0ID0gbWw7Cit9CisKK3ZvaWQgUGxh
dGZvcm1Db250ZXh0U2tpYTo6c2V0QWxwaGEoZmxvYXQgYWxwaGEpCit7CisgICAgbV9zdGF0ZS0+
bV9hbHBoYSA9IGFscGhhOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldExpbmVD
YXAoU2tQYWludDo6Q2FwIGxjKQoreworICAgIG1fc3RhdGUtPm1fbGluZUNhcCA9IGxjOworfQor
Cit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldExpbmVKb2luKFNrUGFpbnQ6OkpvaW4gbGop
Cit7CisgICAgbV9zdGF0ZS0+bV9saW5lSm9pbiA9IGxqOworfQorCit2b2lkIFBsYXRmb3JtQ29u
dGV4dFNraWE6OnNldFBvcnRlckR1ZmZNb2RlKFNrUG9ydGVyRHVmZjo6TW9kZSBwZG0pCit7Cisg
ICAgbV9zdGF0ZS0+bV9wb3J0ZXJEdWZmTW9kZSA9IHBkbTsKK30KKwordm9pZCBQbGF0Zm9ybUNv
bnRleHRTa2lhOjpzZXRGaWxsQ29sb3IoU2tDb2xvciBjb2xvcikKK3sKKyAgICBtX3N0YXRlLT5t
X2ZpbGxDb2xvciA9IGNvbG9yOworfQorCitTa0RyYXdMb29wZXIqIFBsYXRmb3JtQ29udGV4dFNr
aWE6OmdldERyYXdMb29wZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0YXRlLT5tX2xvb3Bl
cjsKK30KKworV2ViQ29yZTo6U3Ryb2tlU3R5bGUgUGxhdGZvcm1Db250ZXh0U2tpYTo6Z2V0U3Ry
b2tlU3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3N0YXRlLT5tX3N0cm9rZVN0eWxlOwor
fQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldFN0cm9rZVN0eWxlKFdlYkNvcmU6OlN0
cm9rZVN0eWxlIHN0cm9rZXN0eWxlKQoreworICAgIG1fc3RhdGUtPm1fc3Ryb2tlU3R5bGUgPSBz
dHJva2VzdHlsZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRTdHJva2VDb2xv
cihTa0NvbG9yIHN0cm9rZWNvbG9yKQoreworICAgIG1fc3RhdGUtPm1fc3Ryb2tlQ29sb3IgPSBz
dHJva2Vjb2xvcjsKK30KKworZmxvYXQgUGxhdGZvcm1Db250ZXh0U2tpYTo6Z2V0U3Ryb2tlVGhp
Y2tuZXNzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdGF0ZS0+bV9zdHJva2VUaGlja25lc3M7
Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0U3Ryb2tlVGhpY2tuZXNzKGZsb2F0
IHRoaWNrbmVzcykKK3sKKyAgICBtX3N0YXRlLT5tX3N0cm9rZVRoaWNrbmVzcyA9IHRoaWNrbmVz
czsKK30KKworaW50IFBsYXRmb3JtQ29udGV4dFNraWE6OmdldFRleHREcmF3aW5nTW9kZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fc3RhdGUtPm1fdGV4dERyYXdpbmdNb2RlOworfQorCit2b2lk
IFBsYXRmb3JtQ29udGV4dFNraWE6OnNldFRleHREcmF3aW5nTW9kZShpbnQgbW9kZSkKK3sKKyAg
Ly8gY1RleHRDbGlwIGlzIG5ldmVyIHVzZWQsIHNvIHdlIGFzc2VydCB0aGF0IGl0IGlzbid0IHNl
dDoKKyAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxODk4Cisg
IEFTU0VSVCgobW9kZSAmIFdlYkNvcmU6OmNUZXh0Q2xpcCkgPT0gMCk7CisgIG1fc3RhdGUtPm1f
dGV4dERyYXdpbmdNb2RlID0gbW9kZTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpz
ZXRVc2VBbnRpYWxpYXNpbmcoYm9vbCBlbmFibGUpCit7CisgICAgbV9zdGF0ZS0+bV91c2VBbnRp
YWxpYXNpbmcgPSBlbmFibGU7Cit9CisKK1NrQ29sb3IgUGxhdGZvcm1Db250ZXh0U2tpYTo6Zmls
bENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdGF0ZS0+bV9maWxsQ29sb3I7Cit9CisK
K3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6YmVnaW5QYXRoKCkKK3sKKyAgICBtX3BhdGgucmVz
ZXQoKTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjphZGRQYXRoKGNvbnN0IFNrUGF0
aCYgcGF0aCkKK3sKKyAgICBtX3BhdGguYWRkUGF0aChwYXRoKTsKK30KKwordm9pZCBQbGF0Zm9y
bUNvbnRleHRTa2lhOjpzZXRGaWxsUnVsZShTa1BhdGg6OkZpbGxUeXBlIGZyKQoreworICAgIG1f
cGF0aC5zZXRGaWxsVHlwZShmcik7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0U2tpYTo6c2V0
R3JhZGllbnQoU2tTaGFkZXIqIGdyYWRpZW50KQoreworICAgIGlmIChncmFkaWVudCAhPSBtX3N0
YXRlLT5tX2dyYWRpZW50KSB7CisgICAgICAgIG1fc3RhdGUtPm1fZ3JhZGllbnQtPnNhZmVVbnJl
ZigpOworICAgICAgICBtX3N0YXRlLT5tX2dyYWRpZW50ID0gZ3JhZGllbnQ7CisgICAgfQorfQor
Cit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldFBhdHRlcm4oU2tTaGFkZXIqIHBhdHRlcm4p
Cit7CisgICAgaWYgKHBhdHRlcm4gIT0gbV9zdGF0ZS0+bV9wYXR0ZXJuKSB7CisgICAgICAgIG1f
c3RhdGUtPm1fcGF0dGVybi0+c2FmZVVucmVmKCk7CisgICAgICAgIG1fc3RhdGUtPm1fcGF0dGVy
biA9IHBhdHRlcm47CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFNraWE6OnNldERh
c2hQYXRoRWZmZWN0KFNrRGFzaFBhdGhFZmZlY3QqIGRhc2gpCit7CisgICAgaWYgKGRhc2ggIT0g
bV9zdGF0ZS0+bV9kYXNoKSB7CisgICAgICAgIG1fc3RhdGUtPm1fZGFzaC0+c2FmZVVucmVmKCk7
CisgICAgICAgIG1fc3RhdGUtPm1fZGFzaCA9IGRhc2g7CisgICAgfQorfQorCit2b2lkIFBsYXRm
b3JtQ29udGV4dFNraWE6OnBhaW50U2tQYWludChjb25zdCBTa1JlY3QmIHJlY3QsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1BhaW50JiBwYWludCkKK3sK
KyAgICBtX2NhbnZhcy0+ZHJhd1JlY3QocmVjdCwgcGFpbnQpOworfQorCitjb25zdCBTa0JpdG1h
cCogUGxhdGZvcm1Db250ZXh0U2tpYTo6Yml0bWFwKCkgY29uc3QKK3sKKyAgICByZXR1cm4gJm1f
Y2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKTsKK30KKworYm9vbCBQbGF0
Zm9ybUNvbnRleHRTa2lhOjpJc1ByaW50aW5nKCkKK3sKKyAgICByZXR1cm4gbV9jYW52YXMtPmdl
dFRvcFBsYXRmb3JtRGV2aWNlKCkuSXNWZWN0b3JpYWwoKTsKK30KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QbGF0Zm9ybUNvbnRleHRTa2lhLmggYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZvcm1Db250ZXh0U2tpYS5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmJhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZvcm1Db250ZXh0U2tpYS5oCkBAIC0wLDAg
KzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgUGxhdGZvcm1Db250ZXh0U2tpYV9oCisjZGVmaW5lIFBsYXRm
b3JtQ29udGV4dFNraWFfaAorCisjaW5jbHVkZSAiU2tEYXNoUGF0aEVmZmVjdC5oIgorI2luY2x1
ZGUgIlNrRHJhd0xvb3Blci5oIgorI2luY2x1ZGUgIlNrRGVxdWUuaCIKKyNpbmNsdWRlICJza2lh
L2V4dC9wbGF0Zm9ybV9jYW52YXMuaCIKKyNpbmNsdWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAi
U2tQYXRoLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJ3dGYv
VmVjdG9yLmgiCisKK3R5cGVkZWYgc3RydWN0IF9HZGtEcmF3YWJsZSBHZGtTa2lhOworCisvLyBU
aGlzIGNsYXNzIGhvbGRzIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBzdGF0ZSBmb3IgR3JhcGhpY3ND
b250ZXh0LiBXZSBwdXQKKy8vIG1vc3Qgb2Ygb3VyIFNraWEgd3JhcHBlcnMgb24gdGhpcyBjbGFz
cy4gSW4gdGhlb3J5LCBhIGxvdCBvZiB0aGlzIHN0dWZmIGNvdWxkCisvLyBiZSBtb3ZlZCB0byBH
cmFwaGljc0NvbnRleHQgZGlyZWN0bHksIGV4Y2VwdCB0aGF0IHNvbWUgY29kZSBleHRlcm5hbCB0
byB0aGlzCisvLyB3b3VsZCBsaWtlIHRvIHBva2UgYXQgb3VyIGdyYXBoaWNzIGxheWVyIGFzIHdl
bGwgKGxpa2UgdGhlIEltYWdlIGFuZCBGb250CisvLyBzdHVmZiwgd2hpY2ggbmVlZHMgc29tZSBh
bW91bnQgb2Ygb3VyIHdyYXBwZXJzIGFuZCBzdGF0ZSBhcm91bmQgU2tDYW52YXMpLgorLy8KKy8v
IFNvIGluIGdlbmVyYWwsIHRoaXMgY2xhc3MgdXNlcyBqdXN0IFNraWEgdHlwZXMgZXhjZXB0IHdo
ZW4gdGhlcmUncyBubyBlYXN5CisvLyBjb252ZXJzaW9uLiBHcmFwaGljc0NvbnRleHQgaXMgcmVz
cG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlIFdlYktpdCB0eXBlcyB0bworLy8gU2tpYSB0eXBl
cyBhbmQgc2V0dGluZyB1cCB0aGUgZXZlbnR1YWwgY2FsbCB0byB0aGUgU2tpYSBmdW5jdGlvbnMu
CisvLworLy8gVGhpcyBjbGFzcyB0aGVuIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgY3VycmVudCBT
a2lhIHN0YXRlLiBXZWJLaXQgZXhwZWN0cworLy8gdGhhdCB0aGUgZ3JhcGhpY3Mgc3RhdGUgdGhh
dCBpcyBwdXNoZWQgYW5kIHBvcHBlZCBieSBzYXZlKCkgYW5kIHJlc3RvcmUoKQorLy8gaW5jbHVk
ZXMgdGhpbmdzIGxpa2UgY29sb3JzIGFuZCBwZW4gc3R5bGVzLiBTa2lhIGRvZXMgdGhpcyBkaWZm
ZXJlbnRseSwgd2hlcmUKKy8vIHB1c2ggYW5kIHBvcCBvbmx5IGluY2x1ZGVzIHRyYW5zZm9ybXMg
YW5kIGJpdG1hcHMsIGFuZCB0aGUgYXBwbGljYXRpb24gaXMKKy8vIHJlc3BvbnNpYmxlIGZvciBt
YW5hZ2luZyB0aGUgcGFpbnRpbmcgc3RhdGUgd2hpY2ggaXMgc3RvcmUgaW4gc2VwYXJhdGUKKy8v
IFNrUGFpbnQgb2JqZWN0cy4gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgYWRhcHRvciB0aGF0IGFs
bG93cyB0aGUgcGFpbnRpbmcKKy8vIHN0YXRlIHRvIGJlIHB1c2hlZCBhbmQgcG9wcGVkIGFsb25n
IHdpdGggdGhlIGJpdG1hcC4KK2NsYXNzIFBsYXRmb3JtQ29udGV4dFNraWEgeworcHVibGljOgor
ICAgIC8vIEZvciBwcmludGluZywgdGhlcmUgc2hvdWxkbid0IGJlIGFueSBjYW52YXMuIGNhbnZh
cyBjYW4gYmUgTlVMTC4gSWYgeW91CisgICAgLy8gc3VwcGx5IGEgTlVMTCBjYW52YXMsIHlvdSBj
YW4gYWxzbyBjYWxsIHNldENhbnZhcyBsYXRlci4KKyAgICBQbGF0Zm9ybUNvbnRleHRTa2lhKHNr
aWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMpOworICAgIH5QbGF0Zm9ybUNvbnRleHRTa2lhKCk7
CisKKyAgICAvLyBTZXRzIHRoZSBjYW52YXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dC4g
VXNlIHdoZW4gc3VwcGx5aW5nIE5VTEwKKyAgICAvLyB0byB0aGUgY29uc3RydWN0b3IuCisgICAg
dm9pZCBzZXRDYW52YXMoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcyk7CisKKyAgICB2b2lk
IHNhdmUoKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsKKworICAgIC8vIFNldHMgdXAgdGhlIGNvbW1v
biBmbGFncyBvbiBhIHBhaW50IGZvciBhbnRpYWxpYXNpbmcsIGVmZmVjdHMsIGV0Yy4KKyAgICAv
LyBUaGlzIGlzIGltcGxpY2l0bHkgY2FsbGVkIGJ5IHNldHVwUGFpbnRGaWxsIGFuZCBzZXR1cFBh
aW50U3Ryb2tlLCBidXQKKyAgICAvLyB5b3UgbWF5IHdpc2ggdG8gY2FsbCBpdCBkaXJlY3RseSBz
b21ldGltZXMgaWYgeW91IGRvbid0IHdhbnQgdGhhdCBvdGhlcgorICAgIC8vIGJlaGF2aW9yLgor
ICAgIHZvaWQgc2V0dXBQYWludENvbW1vbihTa1BhaW50KiBwYWludCkgY29uc3Q7CisKKyAgICAv
LyBTZXRzIHVwIHRoZSBwYWludCBmb3IgdGhlIGN1cnJlbnQgZmlsbCBzdHlsZS4KKyAgICB2b2lk
IHNldHVwUGFpbnRGb3JGaWxsaW5nKFNrUGFpbnQqIHBhaW50KSBjb25zdDsKKworICAgIC8vIFNl
dHMgdXAgdGhlIHBhaW50IGZvciBzdHJva2luZy4gUmV0dXJucyBhbiBpbnQgcmVwcmVzZW50aW5n
IHRoZSB3aWR0aCBvZgorICAgIC8vIHRoZSBwZW4sIG9yIDEgaWYgdGhlIHBlbidzIHdpZHRoIGlz
IDAgaWYgYSBub24temVybyBsZW5ndGggaXMgcHJvdmlkZWQsCisgICAgLy8gdGhlIG51bWJlciBv
ZiBkYXNoZXMvZG90cyBvbiBhIGRhc2hlZC9kb3R0ZWQgbGluZSB3aWxsIGJlIGFkanVzdGVkIHRv
CisgICAgLy8gc3RhcnQgYW5kIGVuZCB0aGF0IGxlbmd0aCB3aXRoIGEgZGFzaC9kb3QuCisgICAg
ZmxvYXQgc2V0dXBQYWludEZvclN0cm9raW5nKFNrUGFpbnQqIHBhaW50LCBTa1JlY3QqIHJlY3Qs
IGludCBsZW5ndGgpIGNvbnN0OworCisgICAgLy8gU3RhdGUgc2V0dGluZyBmdW5jdGlvbnMuCisg
ICAgdm9pZCBzZXREcmF3TG9vcGVyKFNrRHJhd0xvb3BlciogZGwpOyAgLy8gTm90ZTogdGFrZXMg
YW4gYWRkaXRpb25hbCByZWYuCisgICAgdm9pZCBzZXRNaXRlckxpbWl0KGZsb2F0IG1sKTsKKyAg
ICB2b2lkIHNldEFscGhhKGZsb2F0IGFscGhhKTsKKyAgICB2b2lkIHNldExpbmVDYXAoU2tQYWlu
dDo6Q2FwIGxjKTsKKyAgICB2b2lkIHNldExpbmVKb2luKFNrUGFpbnQ6OkpvaW4gbGopOworICAg
IHZvaWQgc2V0RmlsbFJ1bGUoU2tQYXRoOjpGaWxsVHlwZSBmcik7CisgICAgdm9pZCBzZXRQb3J0
ZXJEdWZmTW9kZShTa1BvcnRlckR1ZmY6Ok1vZGUgcGRtKTsKKyAgICB2b2lkIHNldEZpbGxDb2xv
cihTa0NvbG9yIGNvbG9yKTsKKyAgICB2b2lkIHNldFN0cm9rZVN0eWxlKFdlYkNvcmU6OlN0cm9r
ZVN0eWxlIHN0cm9rZXN0eWxlKTsKKyAgICB2b2lkIHNldFN0cm9rZUNvbG9yKFNrQ29sb3Igc3Ry
b2tlY29sb3IpOworICAgIHZvaWQgc2V0U3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHRoaWNrbmVzcyk7
CisgICAgdm9pZCBzZXRUZXh0RHJhd2luZ01vZGUoaW50IG1vZGUpOworICAgIHZvaWQgc2V0VXNl
QW50aWFsaWFzaW5nKGJvb2wgZW5hYmxlKTsKKyAgICB2b2lkIHNldEdyYWRpZW50KFNrU2hhZGVy
Kik7CisgICAgdm9pZCBzZXRQYXR0ZXJuKFNrU2hhZGVyKik7CisgICAgdm9pZCBzZXREYXNoUGF0
aEVmZmVjdChTa0Rhc2hQYXRoRWZmZWN0Kik7CisKKyAgICBTa0RyYXdMb29wZXIqIGdldERyYXdM
b29wZXIoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpTdHJva2VTdHlsZSBnZXRTdHJva2VTdHlsZSgp
IGNvbnN0OworICAgIGZsb2F0IGdldFN0cm9rZVRoaWNrbmVzcygpIGNvbnN0OworICAgIGludCBn
ZXRUZXh0RHJhd2luZ01vZGUoKSBjb25zdDsKKworICAgIC8vIFBhdGhzLgorICAgIHZvaWQgYmVn
aW5QYXRoKCk7CisgICAgdm9pZCBhZGRQYXRoKGNvbnN0IFNrUGF0aCYgcGF0aCk7CisgICAgY29u
c3QgU2tQYXRoKiBjdXJyZW50UGF0aCgpIGNvbnN0IHsgcmV0dXJuICZtX3BhdGg7IH0KKworICAg
IFNrQ29sb3IgZmlsbENvbG9yKCkgY29uc3Q7CisKKyAgICBza2lhOjpQbGF0Zm9ybUNhbnZhcyog
Y2FudmFzKCkgeyByZXR1cm4gbV9jYW52YXM7IH0KKworICAgIC8vIFRPRE8oYnJldHR3KSB3aHkg
aXMgdGhpcyBpbiB0aGlzIGNsYXNzPworICAgIHZvaWQgZHJhd1JlY3QoU2tSZWN0IHJlY3QpOwor
CisgICAgLy8gVE9ETyhtYXJ1ZWwpOiBJJ20gc3RpbGwgdW5zdXJlIGhvdyBJIHdpbGwgc2VyaWFs
aXplIHRoaXMgY2FsbC4KKyAgICB2b2lkIHBhaW50U2tQYWludChjb25zdCBTa1JlY3QmIHJlY3Qs
IGNvbnN0IFNrUGFpbnQmIHBhaW50KTsKKworICAgIGNvbnN0IFNrQml0bWFwKiBiaXRtYXAoKSBj
b25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIGNhbnZhcyB1c2VkIGZvciBwYWludGluZywgTk9U
IGd1YXJhbnRlZWQgdG8gYmUgbm9uLU5VTEwuCisgICAgLy8KKyAgICAvLyBXYXJuaW5nOiBUaGlz
IGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgc28gdGhlIHVzZXJzIGFyZSByZW1pbmRlZCB0aGF0IHRo
ZXkKKyAgICAvLyBzaG91bGQgdXNlIHRoaXMgbGF5ZXIgb2YgaW5kaXJlY3Rpb24gaW5zdGVhZCBv
ZiB1c2luZyB0aGUgY2FudmFzCisgICAgLy8gZGlyZWN0bHkuIFRoaXMgaXMgdG8gaGVscCB3aXRo
IHRoZSBldmVudHVhbCBzZXJpYWxpemF0aW9uLgorICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBj
YW52YXMoKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgaWYgdGhlIGNvbnRleHQgaXMgYSBwcmlu
dGluZyBjb250ZXh0IGluc3RlYWQgb2YgYSBkaXNwbGF5CisgICAgLy8gY29udGV4dC4gQml0bWFw
IHNob3VsZG4ndCBiZSByZXNhbXBsZWQgd2hlbiBwcmludGluZyB0byBrZWVwIHRoZSBiZXN0Cisg
ICAgLy8gcG9zc2libGUgcXVhbGl0eS4KKyAgICBib29sIElzUHJpbnRpbmcoKTsKKworI2lmIGRl
ZmluZWQoX19saW51eF9fKQorICAgIEdka1NraWEqIGdka19za2lhKCkgY29uc3QgeyByZXR1cm4g
bV9nZGtza2lhOyB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICAvLyBEZWZpbmVzIGRyYXdpbmcg
c3R5bGUuCisgICAgc3RydWN0IFN0YXRlOworCisgICAgLy8gTlVMTCBpbmRpY2F0ZXMgcGFpbnRp
bmcgaXMgZGlzYWJsZWQuIE5ldmVyIGRlbGV0ZSB0aGlzIG9iamVjdC4KKyAgICBza2lhOjpQbGF0
Zm9ybUNhbnZhcyogbV9jYW52YXM7CisKKyAgICAvLyBTdGF0ZXMgc3RhY2suIEVuYWJsZXMgbG9j
YWwgZHJhd2luZyBzdGF0ZSBjaGFuZ2Ugd2l0aCBzYXZlKCkvcmVzdG9yZSgpCisgICAgLy8gY2Fs
bHMuCisgICAgV1RGOjpWZWN0b3I8U3RhdGU+IG1fc3RhdGVTdGFjazsKKyAgICAvLyBQb2ludGVy
IHRvIHRoZSBjdXJyZW50IGRyYXdpbmcgc3RhdGUuIFRoaXMgaXMgYSBjYWNoZWQgdmFsdWUgb2YK
KyAgICAvLyBtU3RhdGVTdGFjay5iYWNrKCkuCisgICAgU3RhdGUqIG1fc3RhdGU7CisKKyAgICAv
LyBDdXJyZW50IHBhdGguCisgICAgU2tQYXRoIG1fcGF0aDsKKworICAgIC8vIERpc2FsbG93IHRo
ZXNlLgorICAgIFBsYXRmb3JtQ29udGV4dFNraWEoY29uc3QgUGxhdGZvcm1Db250ZXh0U2tpYSYp
OworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFBsYXRmb3JtQ29udGV4dFNraWEmKTsKKworI2lm
IGRlZmluZWQoX19saW51eF9fKQorICAgIC8vIEEgcG9pbnRlciB0byBhIEdESyBEcmF3YWJsZSB3
cmFwcGluZyBvZiB0aGlzIFNraWEgY2FudmFzCisgICAgR2RrU2tpYSogbV9nZGtza2lhOworI2Vu
ZGlmCit9OworCisjZW5kaWYgIC8vIFBsYXRmb3JtQ29udGV4dFNraWFfaApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFGb250V2luLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhRm9udFdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uODE3MzVhNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhRm9udFdpbi5jcHAKQEAgLTAsMCArMSwyNTkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIldURi9MaXN0SGFzaFNldC5oIgorI2lu
Y2x1ZGUgIldURi9WZWN0b3IuaCIKKworI2luY2x1ZGUgIlNraWFGb250V2luLmgiCisKKyNpbmNs
dWRlICJTa0NhbnZhcy5oIgorI2luY2x1ZGUgIlNrUGFpbnQuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQ2FjaGVkT3V0bGluZUtleSB7CisgICAgQ2Fj
aGVkT3V0bGluZUtleSgpIDogZm9udCgwKSwgZ2x5cGgoMCksIHBhdGgoMCkge30KKyAgICBDYWNo
ZWRPdXRsaW5lS2V5KEhGT05UIGYsIFdPUkQgZykgOiBmb250KGYpLCBnbHlwaChnKSwgcGF0aCgw
KSB7fQorCisgICAgSEZPTlQgZm9udDsKKyAgICBXT1JEIGdseXBoOworCisgICAgLy8gVGhlIGxp
ZmV0aW1lIG9mIHRoaXMgcG9pbnRlciBpcyBtYW5hZ2VkIGV4dGVybmFsbHkgdG8gdGhpcyBjbGFz
cy4gQmUgc3VyZQorICAgIC8vIHRvIGNhbGwgRGVsZXRlT3V0bGluZSB0byByZW1vdmUgaXRlbXMu
CisgICAgU2tQYXRoKiBwYXRoOworfTsKKworY29uc3QgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENh
Y2hlZE91dGxpbmVLZXkmIGEsIGNvbnN0IENhY2hlZE91dGxpbmVLZXkmIGIpCit7CisgICAgcmV0
dXJuIGEuZm9udCA9PSBiLmZvbnQgJiYgYS5nbHlwaCA9PSBiLmdseXBoOworfQorCitzdHJ1Y3Qg
Q2FjaGVkT3V0bGluZUtleUhhc2ggeworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IENh
Y2hlZE91dGxpbmVLZXkmIGtleSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGtleUJ5dGVzOwor
ICAgICAgICBtZW1jcHkoJmtleUJ5dGVzLCAma2V5LmZvbnQsIHNpemVvZih1bnNpZ25lZCkpOwor
ICAgICAgICByZXR1cm4ga2V5Qnl0ZXMgKyBrZXkuZ2x5cGg7CisgICAgfQorCisgICAgc3RhdGlj
IHVuc2lnbmVkIGVxdWFsKGNvbnN0IENhY2hlZE91dGxpbmVLZXkmIGEsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IENhY2hlZE91dGxpbmVLZXkmIGIpCisgICAgeworICAgICAgICBy
ZXR1cm4gYS5mb250ID09IGIuZm9udCAmJiBhLmdseXBoID09IGIuZ2x5cGg7CisgICAgfQorCisg
ICAgc3RhdGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVl
OworfTsKKwordHlwZWRlZiBMaXN0SGFzaFNldDxDYWNoZWRPdXRsaW5lS2V5LCBDYWNoZWRPdXRs
aW5lS2V5SGFzaD4gT3V0bGluZUNhY2hlOworT3V0bGluZUNhY2hlIG91dGxpbmVDYWNoZTsKKwor
Ly8gVGhlIGdsb2JhbCBudW1iZXIgb2YgZ2x5cGggb3V0bGluZXMgd2UnbGwgY2FjaGUuCitjb25z
dCBpbnQgb3V0bGluZUNhY2hlU2l6ZSA9IDI1NjsKKworaW5saW5lIEZJWEVEIFNrU2NhbGFyVG9G
SVhFRChTa1NjYWxhciB4KQoreworICAgIEZJWEVEIGZpeGVkOworICAgIFNrRml4ZWQgc2tGaXhl
ZCA9IFNrU2NhbGFyVG9GaXhlZCh4KTsKKyAgICBtZW1jcHkoJmZpeGVkLCAmc2tGaXhlZCwgc2l6
ZW9mKEZJWEVEKSk7CisgICAgcmV0dXJuIGZpeGVkOworfQorCitpbmxpbmUgU2tTY2FsYXIgRklY
RURUb1NrU2NhbGFyKEZJWEVEIGZpeGVkKQoreworICAgIFNrRml4ZWQgc2tGaXhlZDsKKyAgICBt
ZW1jcHkoJnNrRml4ZWQsICZmaXhlZCwgc2l6ZW9mKFNrRml4ZWQpKTsKKyAgICByZXR1cm4gU2tG
aXhlZFRvU2NhbGFyKHNrRml4ZWQpOworfQorCisvLyBSZW1vdmVzIHRoZSBnaXZlbiBrZXkgZnJv
bSB0aGUgY2FjaGVkIG91dGxpbmVzLCBhbHNvIGRlbGV0aW5nIHRoZSBwYXRoLgordm9pZCBEZWxl
dGVPdXRsaW5lKE91dGxpbmVDYWNoZTo6aXRlcmF0b3IgZGVsZXRlTWUpCit7CisgICAgZGVsZXRl
IGRlbGV0ZU1lLT5wYXRoOworICAgIG91dGxpbmVDYWNoZS5yZW1vdmUoZGVsZXRlTWUpOworfQor
Cit2b2lkIEFkZFBvbHlDdXJ2ZVRvUGF0aChjb25zdCBUVFBPTFlDVVJWRSogcG9seUN1cnZlLCBT
a1BhdGgqIHBhdGgpCit7CisgICAgc3dpdGNoIChwb2x5Q3VydmUtPndUeXBlKSB7CisgICAgY2Fz
ZSBUVF9QUklNX0xJTkU6CisgICAgICAgIGZvciAoV09SRCBpID0gMDsgaSA8IHBvbHlDdXJ2ZS0+
Y3BmeDsgaSsrKSB7CisgICAgICAgICAgcGF0aC0+bGluZVRvKEZJWEVEVG9Ta1NjYWxhcihwb2x5
Q3VydmUtPmFwZnhbaV0ueCksCisgICAgICAgICAgICAgICAgICAgICAgIC1GSVhFRFRvU2tTY2Fs
YXIocG9seUN1cnZlLT5hcGZ4W2ldLnkpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKwor
ICAgIGNhc2UgVFRfUFJJTV9RU1BMSU5FOgorICAgICAgICAvLyBGSVhNRTogZG9lc24ndCB0aGlz
IGR1cGxpY2F0ZSBwb2ludHMgaWYgd2UgZG8gdGhlIGxvb3AgPiBvbmNlPworICAgICAgICBmb3Ig
KFdPUkQgaSA9IDA7IGkgPCBwb2x5Q3VydmUtPmNwZnggLSAxOyBpKyspIHsKKyAgICAgICAgICAg
IFNrU2NhbGFyIGJ4ID0gRklYRURUb1NrU2NhbGFyKHBvbHlDdXJ2ZS0+YXBmeFtpXS54KTsKKyAg
ICAgICAgICAgIFNrU2NhbGFyIGJ5ID0gRklYRURUb1NrU2NhbGFyKHBvbHlDdXJ2ZS0+YXBmeFtp
XS55KTsKKworICAgICAgICAgICAgU2tTY2FsYXIgY3ggPSBGSVhFRFRvU2tTY2FsYXIocG9seUN1
cnZlLT5hcGZ4W2kgKyAxXS54KTsKKyAgICAgICAgICAgIFNrU2NhbGFyIGN5ID0gRklYRURUb1Nr
U2NhbGFyKHBvbHlDdXJ2ZS0+YXBmeFtpICsgMV0ueSk7CisgICAgICAgICAgICBpZiAoaSA8IHBv
bHlDdXJ2ZS0+Y3BmeCAtIDIpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgdGhlIGxh
c3QgcG9pbnQsIGNvbXB1dGUgQy4KKyAgICAgICAgICAgICAgICBjeCA9IFNrU2NhbGFyQXZlKGJ4
LCBjeCk7CisgICAgICAgICAgICAgICAgY3kgPSBTa1NjYWxhckF2ZShieSwgY3kpOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAvLyBOZWVkIHRvIGZsaXAgdGhlIHkgY29vcmRpbmF0ZXMg
c2luY2UgdGhlIGZvbnQncyBjb29yZGluYXRlIHN5c3RlbSBpcworICAgICAgICAgICAgLy8gZmxp
cHBlZCBmcm9tIG91cnMgdmVydGljYWxseS4KKyAgICAgICAgICAgIHBhdGgtPnF1YWRUbyhieCwg
LWJ5LCBjeCwgLWN5KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgVFRf
UFJJTV9DU1BMSU5FOgorICAgICAgICAvLyBGSVhNRTogSW1wbGVtZW50IHRoaXMKKyAgICAgICAg
YnJlYWs7CisgICAgfQorfQorCisvLyBUaGUgc2l6ZSBvZiB0aGUgZ2x5cGggb3V0bGluZSBidWZm
ZXIuCitjb25zdCBpbnQgZ2x5cGhQYXRoQnVmZmVyU2l6ZSA9IDQwOTY7CisKKy8vIEZpbGxzIHRo
ZSBnaXZlbiBTa1BhdGggd2l0aCB0aGUgb3V0bGluZSBmb3IgdGhlIGdpdmVuIGdseXBoIGluZGV4
LiBUaGUgZm9udAorLy8gY3VycmVudGx5IHNlbGVjdGVkIGludG8gdGhlIGdpdmVuIERDIGlzIHVz
ZWQuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorYm9vbCBHZXRQYXRoRm9yR2x5cGgoSERDIGRj
LCBXT1JEIGdseXBoLCBTa1BhdGgqIHBhdGgpCit7CisgICAgY2hhciBidWZmZXJbZ2x5cGhQYXRo
QnVmZmVyU2l6ZV07CisgICAgR0xZUEhNRVRSSUNTIGdtOworICAgIE1BVDIgbWF0ID0ge3swLCAx
fSwgezAsIDB9LCB7MCwgMH0sIHswLCAxfX07ICAvLyBFYWNoIG9uZSBpcyAoZnJhY3QsdmFsdWUp
LgorCisgICAgRFdPUkQgdG90YWxTaXplID0gR2V0R2x5cGhPdXRsaW5lVyhkYywgZ2x5cGgsIEdH
T19HTFlQSF9JTkRFWCB8IEdHT19OQVRJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAmZ20sIGdseXBoUGF0aEJ1ZmZlclNpemUsIGJ1ZmZlciwgJm1hdCk7CisgICAg
aWYgKHRvdGFsU2l6ZSA9PSBHRElfRVJST1IpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGNvbnN0IGNoYXIqIGN1ckdseXBoID0gYnVmZmVyOworICAgIGNvbnN0IGNoYXIqIGVuZEdseXBo
ID0gJmJ1ZmZlclt0b3RhbFNpemVdOworICAgIHdoaWxlIChjdXJHbHlwaCA8IGVuZEdseXBoKSB7
CisgICAgICAgIGNvbnN0IFRUUE9MWUdPTkhFQURFUiogcG9seUhlYWRlciA9CisgICAgICAgICAg
ICByZWludGVycHJldF9jYXN0PGNvbnN0IFRUUE9MWUdPTkhFQURFUio+KGN1ckdseXBoKTsKKyAg
ICAgICAgcGF0aC0+bW92ZVRvKEZJWEVEVG9Ta1NjYWxhcihwb2x5SGVhZGVyLT5wZnhTdGFydC54
KSwKKyAgICAgICAgICAgICAgICAgICAgIC1GSVhFRFRvU2tTY2FsYXIocG9seUhlYWRlci0+cGZ4
U3RhcnQueSkpOworCisgICAgICAgIGNvbnN0IGNoYXIqIGN1clBvbHkgPSBjdXJHbHlwaCArIHNp
emVvZihUVFBPTFlHT05IRUFERVIpOworICAgICAgICBjb25zdCBjaGFyKiBlbmRQb2x5ID0gY3Vy
R2x5cGggKyBwb2x5SGVhZGVyLT5jYjsKKyAgICAgICAgd2hpbGUgKGN1clBvbHkgPCBlbmRQb2x5
KSB7CisgICAgICAgICAgICBjb25zdCBUVFBPTFlDVVJWRSogcG9seUN1cnZlID0KKyAgICAgICAg
ICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRUUE9MWUNVUlZFKj4oY3VyUG9seSk7Cisg
ICAgICAgICAgICBBZGRQb2x5Q3VydmVUb1BhdGgocG9seUN1cnZlLCBwYXRoKTsKKyAgICAgICAg
ICAgIGN1clBvbHkgKz0gc2l6ZW9mKFdPUkQpICogMiArIHNpemVvZihQT0lOVEZYKSAqIHBvbHlD
dXJ2ZS0+Y3BmeDsKKyAgICAgICAgfQorICAgICAgICBjdXJHbHlwaCArPSBwb2x5SGVhZGVyLT5j
YjsKKyAgICB9CisKKyAgICBwYXRoLT5jbG9zZSgpOworICAgIHJldHVybiB0cnVlOworfQorCisv
LyBSZXR1cm5zIGEgU2tQYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmUgZ2x5cGggaW4gdGhl
IGdpdmVuIGZvbnQuIFRoZSBmb250CisvLyBzaG91bGQgYmUgc2VsZWN0ZWQgaW50byB0aGUgZ2l2
ZW4gREMuIFRoZSByZXR1cm5lZCBwYXRoIGlzIG93bmVkIGJ5IHRoZQorLy8gaGFzaHRhYmxlLiBS
ZXR1cm5zIE5VTEwgb24gZXJyb3IuCitjb25zdCBTa1BhdGgqIEdldENhY2hlZFBhdGhGb3JHbHlw
aChIREMgaGRjLCBIRk9OVCBmb250LCBXT1JEIGdseXBoKQoreworICAgIENhY2hlZE91dGxpbmVL
ZXkga2V5KGZvbnQsIGdseXBoKTsKKyAgICBPdXRsaW5lQ2FjaGU6Oml0ZXJhdG9yIGZvdW5kID0g
b3V0bGluZUNhY2hlLmZpbmQoa2V5KTsKKyAgICBpZiAoZm91bmQgIT0gb3V0bGluZUNhY2hlLmVu
ZCgpKSB7CisgICAgICAgIC8vIEtlZXAgaW4gTVJVIG9yZGVyIGJ5IHJlbW92aW5nICYgcmVpbnNl
cnRpbmcgdGhlIHZhbHVlLgorICAgICAgICBrZXkgPSAqZm91bmQ7CisgICAgICAgIG91dGxpbmVD
YWNoZS5yZW1vdmUoZm91bmQpOworICAgICAgICBvdXRsaW5lQ2FjaGUuYWRkKGtleSk7CisgICAg
ICAgIHJldHVybiBrZXkucGF0aDsKKyAgICB9CisKKyAgICBrZXkucGF0aCA9IG5ldyBTa1BhdGg7
CisgICAgaWYgKCFHZXRQYXRoRm9yR2x5cGgoaGRjLCBnbHlwaCwga2V5LnBhdGgpKQorICAgICAg
cmV0dXJuIDA7CisKKyAgICBpZiAob3V0bGluZUNhY2hlLnNpemUoKSA+IG91dGxpbmVDYWNoZVNp
emUpIHsKKyAgICAgICAgLy8gVGhlIGNhY2hlIGlzIHRvbyBiaWcsIGZpbmQgdGhlIG9sZGVzdCB2
YWx1ZSAoZmlyc3QgaW4gdGhlIGxpc3QpLgorICAgICAgICBEZWxldGVPdXRsaW5lKG91dGxpbmVD
YWNoZS5iZWdpbigpKTsKKyAgICB9CisKKyAgICBvdXRsaW5lQ2FjaGUuYWRkKGtleSk7CisgICAg
cmV0dXJuIGtleS5wYXRoOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBTa2lhRHJhd1Rl
eHQoSEZPTlQgaGZvbnQsCisgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLAorICAg
ICAgICAgICAgICAgICAgY29uc3QgU2tQb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICBT
a1BhaW50KiBwYWludCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdPUkQqIGdseXBocywKKyAg
ICAgICAgICAgICAgICAgIGNvbnN0IGludCogYWR2YW5jZXMsCisgICAgICAgICAgICAgICAgICBp
bnQgbnVtX2dseXBocykKK3sKKyAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICBIR0RJT0JKIG9s
ZF9mb250ID0gU2VsZWN0T2JqZWN0KGRjLCBoZm9udCk7CisKKyAgICBjYW52YXMtPnNhdmUoKTsK
KyAgICBjYW52YXMtPnRyYW5zbGF0ZShwb2ludC5mWCwgcG9pbnQuZlkpOworCisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1fZ2x5cGhzOyBpKyspIHsKKyAgICAgICAgY29uc3QgU2tQYXRoKiBw
YXRoID0gR2V0Q2FjaGVkUGF0aEZvckdseXBoKGRjLCBoZm9udCwgZ2x5cGhzW2ldKTsKKyAgICAg
ICAgaWYgKCFwYXRoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYW52YXMt
PmRyYXdQYXRoKCpwYXRoLCAqcGFpbnQpOworICAgICAgICBjYW52YXMtPnRyYW5zbGF0ZShhZHZh
bmNlc1tpXSwgMCk7CisgICAgfQorCisgICAgY2FudmFzLT5yZXN0b3JlKCk7CisKKyAgICBTZWxl
Y3RPYmplY3QoZGMsIG9sZF9mb250KTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIFJlbW92ZUZvbnRGcm9tU2tpYUZvbnRXaW5DYWNoZShIRk9OVCBo
Zm9udCkKK3sKKyAgICAvLyBMaXN0SGFzaFNldCBpc24ndCB0aGUgZ3JlYXRlc3Qgc3RydWN0dXJl
IGZvciBkZWxldGluZyBzdHVmZiBvdXQgb2YsIGJ1dAorICAgIC8vIHJlbW92aW5nIGVudHJpZXMg
d2lsbCBiZSByZWxhdGl2ZWx5IHJhcmUgKHdlIGRvbid0IHJlbW92ZSBmb250cyBtdWNoLCBub3IK
KyAgICAvLyBkbyB3ZSBkcmF3IG91dCBvd24gZ2x5cGhzIHVzaW5nIHRoZXNlIHJvdXRpbmVzIG11
Y2ggZWl0aGVyKS4KKworICAgIC8vIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCBnbHlwaHMgd2UncmUg
cmVtb3Zpbmcgd2hpY2ggd2UgZG8gaW4gYSBzZXBhcmF0ZQorICAgIC8vIHBhc3MuCisgICAgVmVj
dG9yPENhY2hlZE91dGxpbmVLZXk+IG91dGxpbmVzVG9EZWxldGU7CisgICAgZm9yIChPdXRsaW5l
Q2FjaGU6Oml0ZXJhdG9yIGkgPSBvdXRsaW5lQ2FjaGUuYmVnaW4oKTsKKyAgICAgICAgIGkgIT0g
b3V0bGluZUNhY2hlLmVuZCgpOyArK2kpCisgICAgICAgIG91dGxpbmVzVG9EZWxldGUuYXBwZW5k
KCppKTsKKworICAgIGZvciAoVmVjdG9yPENhY2hlZE91dGxpbmVLZXk+OjppdGVyYXRvciBpID0g
b3V0bGluZXNUb0RlbGV0ZS5iZWdpbigpOworICAgICAgICAgaSAhPSBvdXRsaW5lc1RvRGVsZXRl
LmVuZCgpOyArK2kpCisgICAgICAgIERlbGV0ZU91dGxpbmUob3V0bGluZUNhY2hlLmZpbmQoKmkp
KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhRm9udFdpbi5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL1NraWFGb250V2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uYjViNjYzMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9Ta2lhRm9udFdpbi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMp
IDIwMDYsMjAwNywyMDA4LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
U2tpYUZvbnRfV2luX2gKKyNkZWZpbmUgU2tpYUZvbnRfV2luX2gKKworI2luY2x1ZGUgPHdpbmRv
d3MuaD4KKyNpbmNsdWRlIDx1c3AxMC5oPgorCitjbGFzcyBTa0NhbnZhczsKK2NsYXNzIFNrUGFp
bnQ7CitzdHJ1Y3QgU2tQb2ludDsKKworLy8gVGhpcyBmaWxlIHByb3ZpY2VzIFNraWEgZXF1aXZh
bGVudHMgdG8gV2luZG93cyB0ZXh0IGRyYXdpbmcgZnVuY3Rpb25zLiBUaGV5CisvLyB3aWxsIGdl
dCB0aGUgb3V0bGluZXMgZnJvbSBXaW5kb3dzIGFuZCBkcmF3IHRoZW4gdXNpbmcgU2tpYSB1c2lu
ZyB0aGUgZ2l2ZW4KKy8vIHBhcmFtZXRlcnMgaW4gdGhlIHBhaW50IGFyZ3VtZW50cy4gVGhpcyBh
bGxvd3MgbW9yZSBjb21wbGV4IGVmZmVjdHMgYW5kCisvLyB0cmFuc2Zvcm1zIHRvIGJlIGRyYXdu
IHRoYW4gV2luZG93cyBhbGxvd3MuCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgc2ln
bmlmaWNhbnRseSBzbG93ZXIgdGhhbiBXaW5kb3dzIEdESSwgYW5kIHRoZSB0ZXh0CisvLyB3aWxs
IGxvb2sgZGlmZmVyZW50IChubyBDbGVhclR5cGUpLCBzbyB1c2Ugb25seSB3aGVuIG5lY2Vzc2Fy
eS4KKy8vCisvLyBXaGVuIHlvdSBjYWxsIGEgU2tpYSogdGV4dCBkcmF3aW5nIGZ1bmN0aW9uLCB2
YXJpb3VzIGdseXBoIG91dGxpbmVzIHdpbGwgYmUKKy8vIGNhY2hlZC4gQXMgYSByZXN1bHQsIHlv
dSBzaG91bGQgY2FsbCBSZW1vdmVGb250RnJvbVNraWFGb250V2luQ2FjaGUgd2hlbgorLy8gdGhl
IGZvbnQgaXMgZGVzdHJveWVkIHNvIHRoYXQgdGhlIGNhY2hlIGRvZXMgbm90IG91dGxpdmUgdGhl
IGZvbnQgKHNpbmNlIHRoZQorLy8gSEZPTlRzIGFyZSByZWN5Y2xlZCkuCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKy8vIEFuYWxvZyBvZiB0aGUgV2luZG93cyBHREkgZnVuY3Rpb24gRHJhd1RleHQs
IGV4Y2VwdCB1c2luZyB0aGUgZ2l2ZW4gU2tQYWludAorLy8gYXR0cmlidXRlcyBmb3IgdGhlIHRl
eHQuIFNlZSBhYm92ZSBmb3IgbW9yZS4KKy8vCisvLyBSZXR1cm5zIHRydWUgb2YgdGhlIHRleHQg
d2FzIGRyYXduIHN1Y2Nlc3NmdWxseS4gRmFsc2UgaW5kaWNhdGVzIGFuIGVycm9yCisvLyBmcm9t
IFdpbmRvd3MuCitib29sIFNraWFEcmF3VGV4dChIRk9OVCBoZm9udCwKKyAgICAgICAgICAgICAg
ICAgIFNrQ2FudmFzKiBjYW52YXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBTa1BvaW50JiBw
b2ludCwKKyAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAgICAg
ICAgY29uc3QgV09SRCogZ2x5cGhzLAorICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBhZHZh
bmNlcywKKyAgICAgICAgICAgICAgICAgIGludCBudW1fZ2x5cGhzKTsKKworLy8gVGhpcyBtaXJy
b3JzIHRoZSBmZWF0dXJlcyBvZiBTY3JpcHRUZXh0T3V0LgorLyogVE9ETyhicmV0dHcpIGZpbmlz
aCB0aGlzIGltcGxlbWVudGF0aW9uLgorYm9vbCBTa2lhRHJhd0NvbXBsZXhUZXh0KEhGT05UIGZv
bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBTa1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIGZ1
T3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ1JJUFRfQU5BTFlTSVMq
IHBzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXT1JEKiBwd0dseXBocywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgY0dseXBocywKKyAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBpbnQqIGFkdmFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IGludCoganVzdGlmaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdPRkZTRVQq
IGdseXBoX29mZnNldHMpOworKi8KKworLy8gUmVtb3ZlcyBhbnkgY2FjaGVkIGdseXBocyBmcm9t
IHRoZSBvdXRsaW5lIGNhY2hlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisvLyBmb250IGhh
bmRsZS4KK3ZvaWQgUmVtb3ZlRm9udEZyb21Ta2lhRm9udFdpbkNhY2hlKEhGT05UIGhmb250KTsK
KworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmICAvLyBTa2lhRm9udF9XaW5faApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFVdGlscy5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxzLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2NlNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFVdGlscy5jcHAKQEAgLTAsMCArMSwyNDEg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICog
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisKKyNp
bmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1
ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tDb2xvclByaXYuaCIKKyNpbmNsdWRlICJTa01h
dHJpeC5oIgorI2luY2x1ZGUgIlNrUmVnaW9uLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
dm9pZCBXZWJDb3JlUG9pbnRUb1NraWFQb2ludChjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JiBz
cmMsIFNrUG9pbnQqIGRzdCkKK3sKKyAgICBkc3QtPnNldChXZWJDb3JlRmxvYXRUb1NrU2NhbGFy
KHNyYy54KCkpLCBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkpKTsKK30KKwordm9pZCBX
ZWJDb3JlUmVjdFRvU2tpYVJlY3QoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgc3JjLCBTa1JlY3Qq
IGRzdCkKK3sKKyAgICBkc3QtPnNldChTa0ludFRvU2NhbGFyKHNyYy54KCkpLAorICAgICAgICAg
ICAgIFNrSW50VG9TY2FsYXIoc3JjLnkoKSksCisgICAgICAgICAgICAgU2tJbnRUb1NjYWxhcihz
cmMueCgpICsgc3JjLndpZHRoKCkpLAorICAgICAgICAgICAgIFNrSW50VG9TY2FsYXIoc3JjLnko
KSArIHNyYy5oZWlnaHQoKSkpOworfQorCit2b2lkIFdlYkNvcmVSZWN0VG9Ta2lhUmVjdChjb25z
dCBXZWJDb3JlOjpJbnRSZWN0JiBzcmMsIFNrSVJlY3QqIGRzdCkKK3sKKyAgICBkc3QtPnNldChz
cmMueCgpLAorICAgICAgICAgICAgIHNyYy55KCksCisgICAgICAgICAgICAgc3JjLngoKSArIHNy
Yy53aWR0aCgpLAorICAgICAgICAgICAgIHNyYy55KCkgKyBzcmMuaGVpZ2h0KCkpOworfQorCit2
b2lkIFdlYkNvcmVSZWN0VG9Ta2lhUmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIHNyYywg
U2tSZWN0KiBkc3QpCit7CisgICAgZHN0LT5zZXQoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzcmMu
eCgpKSwKKyAgICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkpLAorICAg
ICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc3JjLngoKSArIHNyYy53aWR0aCgpKSwK
KyAgICAgICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkgKyBzcmMuaGVpZ2h0
KCkpKTsKK30KKwordm9pZCBXZWJDb3JlUmVjdFRvU2tpYVJlY3QoY29uc3QgV2ViQ29yZTo6Rmxv
YXRSZWN0JiBzcmMsIFNrSVJlY3QqIGRzdCkKK3sKKyAgICBkc3QtPnNldChTa1NjYWxhclJvdW5k
KFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc3JjLngoKSkpLAorICAgICAgICAgICAgIFNrU2NhbGFy
Um91bmQoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzcmMueSgpKSksCisgICAgICAgICAgICAgU2tT
Y2FsYXJSb3VuZChXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy54KCkgKyBzcmMud2lkdGgoKSkp
LAorICAgICAgICAgICAgIFNrU2NhbGFyUm91bmQoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzcmMu
eSgpICsgc3JjLmhlaWdodCgpKSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IENvbXBvc2l0
T3BUb1BvcnRlckR1ZmZNb2RlIHsKKyAgICB1aW50OF90IG1Db21wb3NpdE9wOworICAgIHVpbnQ4
X3QgbVBvcnRlckR1ZmZNb2RlOworfSBnTWFwQ29tcG9zaXRPcHNUb1BvcnRlckR1ZmZNb2Rlc1td
ID0geworICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlQ2xlYXIsICAgICAgICAgICBTa1BvcnRlckR1
ZmY6OmtDbGVhcl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVDb3B5LCAgICAgICAg
ICAgIFNrUG9ydGVyRHVmZjo6a1NyY092ZXJfTW9kZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9z
aXRlU291cmNlT3ZlciwgICAgICBTa1BvcnRlckR1ZmY6OmtTcmNPdmVyX01vZGUgfSwKKyAgICB7
IFdlYkNvcmU6OkNvbXBvc2l0ZVNvdXJjZUluLCAgICAgICAgU2tQb3J0ZXJEdWZmOjprU3JjSW5f
TW9kZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlU291cmNlT3V0LCAgICAgICBTa1BvcnRl
ckR1ZmY6OmtTcmNPdXRfTW9kZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlU291cmNlQXRv
cCwgICAgICBTa1BvcnRlckR1ZmY6OmtTcmNBVG9wX01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNv
bXBvc2l0ZURlc3RpbmF0aW9uT3ZlciwgU2tQb3J0ZXJEdWZmOjprRHN0T3Zlcl9Nb2RlIH0sCisg
ICAgeyBXZWJDb3JlOjpDb21wb3NpdGVEZXN0aW5hdGlvbkluLCAgIFNrUG9ydGVyRHVmZjo6a0Rz
dEluX01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBvc2l0ZURlc3RpbmF0aW9uT3V0LCAgU2tQ
b3J0ZXJEdWZmOjprRHN0T3V0X01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBvc2l0ZURlc3Rp
bmF0aW9uQXRvcCwgU2tQb3J0ZXJEdWZmOjprRHN0QVRvcF9Nb2RlIH0sCisgICAgeyBXZWJDb3Jl
OjpDb21wb3NpdGVYT1IsICAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6a1hvcl9Nb2RlIH0sCisg
ICAgeyBXZWJDb3JlOjpDb21wb3NpdGVQbHVzRGFya2VyLCAgICAgIFNrUG9ydGVyRHVmZjo6a0Rh
cmtlbl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVIaWdobGlnaHQsICAgICAgIFNr
UG9ydGVyRHVmZjo6a1NyY092ZXJfTW9kZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlUGx1
c0xpZ2h0ZXIsICAgICBTa1BvcnRlckR1ZmY6OmtMaWdodGVuX01vZGUgfQorfTsKKworU2tQb3J0
ZXJEdWZmOjpNb2RlIFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3NpdGUoV2ViQ29yZTo6Q29t
cG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgY29uc3QgQ29tcG9zaXRPcFRvUG9ydGVyRHVmZk1v
ZGUqIHRhYmxlID0gZ01hcENvbXBvc2l0T3BzVG9Qb3J0ZXJEdWZmTW9kZXM7CisgICAgCisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFNLX0FSUkFZX0NPVU5UKGdNYXBDb21wb3NpdE9wc1Rv
UG9ydGVyRHVmZk1vZGVzKTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS5tQ29tcG9zaXRP
cCA9PSBvcCkgeworICAgICAgICAgICAgcmV0dXJuIChTa1BvcnRlckR1ZmY6Ok1vZGUpdGFibGVb
aV0ubVBvcnRlckR1ZmZNb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgU2tERUJVR0YoKCJH
cmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbiB1a25vd24gQ29tcG9zaXRPcGVy
YXRvciAlZFxuIiwgb3ApKTsKKyAgICByZXR1cm4gU2tQb3J0ZXJEdWZmOjprU3JjT3Zlcl9Nb2Rl
OyAvLyBmYWxsLWJhY2sKK30KKworc3RhdGljIFU4Q1BVIEludlNjYWxlQnl0ZShVOENQVSBjb21w
b25lbnQsIHVpbnQzMl90IHNjYWxlKQoreworICAgIFNrQVNTRVJUKGNvbXBvbmVudCA9PSAodWlu
dDhfdCljb21wb25lbnQpOworICAgIHJldHVybiAoY29tcG9uZW50ICogc2NhbGUgKyAweDgwMDAp
ID4+IDE2OworfQorCitTa0NvbG9yIFNrUE1Db2xvclRvQ29sb3IoU2tQTUNvbG9yIHBtKQorewor
ICAgIGlmICgwID09IHBtKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICB1bnNpZ25lZCBh
ID0gU2tHZXRQYWNrZWRBMzIocG0pOworICAgIHVpbnQzMl90IHNjYWxlID0gKDI1NSA8PCAxNikg
LyBhOworICAgIAorICAgIHJldHVybiBTa0NvbG9yU2V0QVJHQihhLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICBJbnZTY2FsZUJ5dGUoU2tHZXRQYWNrZWRSMzIocG0pLCBzY2FsZSksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgIEludlNjYWxlQnl0ZShTa0dldFBhY2tlZEczMihwbSksIHNj
YWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW52U2NhbGVCeXRlKFNrR2V0UGFja2Vk
QjMyKHBtKSwgc2NhbGUpKTsKK30KKworV2ViQ29yZTo6Q29sb3IgU2tQTUNvbG9yVG9XZWJDb3Jl
Q29sb3IoU2tQTUNvbG9yIHBtKQoreworICAgIHJldHVybiBTa1BNQ29sb3JUb0NvbG9yKHBtKTsK
K30KKwordm9pZCBJbnRlcnNlY3RSZWN0QW5kUmVnaW9uKGNvbnN0IFNrUmVnaW9uJiByZWdpb24s
IGNvbnN0IFNrUmVjdCYgc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tS
ZWN0KiBkZXN0X3JlY3QpIHsKKyAgICAvLyBUaGUgY2xpcGVyYXRvciByZXF1aXJlcyBhbiBpbnQg
cmVjdCwgc28gd2Ugcm91bmQgb3V0LgorICAgIFNrSVJlY3Qgc3JjX3JlY3Rfcm91bmRlZDsKKyAg
ICBzcmNfcmVjdC5yb3VuZE91dCgmc3JjX3JlY3Rfcm91bmRlZCk7CisKKyAgICAvLyBUaGUgQ2xp
cGVyYXRvciB3aWxsIGl0ZXJhdGUgb3ZlciBhIGJ1bmNoIG9mIHJlY3RzIHdoZXJlIG91ciB0cmFu
c2Zvcm1lZAorICAgIC8vIHJlY3QgYW5kIHRoZSBjbGlwcGluZyByZWdpb24gKHdoaWNoIG1heSBi
ZSBub24tc3F1YXJlKSBvdmVybGFwLgorICAgIFNrUmVnaW9uOjpDbGlwZXJhdG9yIGNsaXBlcmF0
b3IocmVnaW9uLCBzcmNfcmVjdF9yb3VuZGVkKTsKKyAgICBpZiAoY2xpcGVyYXRvci5kb25lKCkp
IHsKKyAgICAgICAgZGVzdF9yZWN0LT5zZXRFbXB0eSgpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gR2V0IHRoZSB1bmlvbiBvZiBhbGwgdmlzaWJsZSByZWN0cyBpbiB0aGUgY2xp
cCB0aGF0IG92ZXJsYXAgb3VyIGJpdG1hcC4KKyAgICBTa0lSZWN0IGN1cl92aXNpYmxlX3JlY3Qg
PSBjbGlwZXJhdG9yLnJlY3QoKTsKKyAgICBjbGlwZXJhdG9yLm5leHQoKTsKKyAgICB3aGlsZSAo
IWNsaXBlcmF0b3IuZG9uZSgpKSB7CisgICAgICAgIGN1cl92aXNpYmxlX3JlY3Quam9pbihjbGlw
ZXJhdG9yLnJlY3QoKSk7CisgICAgICAgIGNsaXBlcmF0b3IubmV4dCgpOworICAgIH0KKworICAg
IGRlc3RfcmVjdC0+c2V0KGN1cl92aXNpYmxlX3JlY3QpOworfQorCit2b2lkIENsaXBSZWN0VG9D
YW52YXMoY29uc3QgU2tDYW52YXMmIGNhbnZhcywgY29uc3QgU2tSZWN0JiBzcmNfcmVjdCwKKyAg
ICAgICAgICAgICAgICAgICAgICBTa1JlY3QqIGRlc3RfcmVjdCkgeworICAgIC8vIFRyYW5zbGF0
ZSBpbnRvIHRoZSBjYW52YXMnIGNvb3JkaW5hdGUgc3BhY2UuIFRoaXMgaXMgd2hlcmUgdGhlIGNs
aXBwaW5nCisgICAgLy8gcmVnaW9uIGFwcGxpZXMuCisgICAgU2tSZWN0IHRyYW5zZm9ybWVkX3Ny
YzsKKyAgICBjYW52YXMuZ2V0VG90YWxNYXRyaXgoKS5tYXBSZWN0KCZ0cmFuc2Zvcm1lZF9zcmMs
IHNyY19yZWN0KTsKKworICAgIC8vIERvIHRoZSBpbnRlcnNlY3Rpb24uCisgICAgU2tSZWN0IHRy
YW5zZm9ybWVkX2Rlc3Q7CisgICAgSW50ZXJzZWN0UmVjdEFuZFJlZ2lvbihjYW52YXMuZ2V0VG90
YWxDbGlwKCksIHRyYW5zZm9ybWVkX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0
cmFuc2Zvcm1lZF9kZXN0KTsKKworICAgIC8vIE5vdyB0cmFuc2Zvcm0gaXQgYmFjayBpbnRvIHdv
cmxkIHNwYWNlLgorICAgIFNrTWF0cml4IGludmVyc2VfdHJhbnNmb3JtOworICAgIGNhbnZhcy5n
ZXRUb3RhbE1hdHJpeCgpLmludmVydCgmaW52ZXJzZV90cmFuc2Zvcm0pOworICAgIGludmVyc2Vf
dHJhbnNmb3JtLm1hcFJlY3QoZGVzdF9yZWN0LCB0cmFuc2Zvcm1lZF9kZXN0KTsKK30KKworYm9v
bCBTa1BhdGhDb250YWluc1BvaW50KFNrUGF0aCogb3JpZ19wYXRoLCBXZWJDb3JlOjpGbG9hdFBv
aW50IHBvaW50LCBTa1BhdGg6OkZpbGxUeXBlIGZ0KQoreworICAgIFNrUmVnaW9uICAgIHJnbiwg
Y2xpcDsKKworICAgIFNrUGF0aDo6RmlsbFR5cGUgb3JpZ19mdCA9IG9yaWdfcGF0aC0+Z2V0Rmls
bFR5cGUoKTsgICAgLy8gc2F2ZQorCisgICAgY29uc3QgU2tQYXRoKiBwYXRoID0gb3JpZ19wYXRo
OworICAgIFNrUGF0aCBzY2FsZWRfcGF0aDsKKyAgICBpbnQgc2NhbGUgPSAxOworCisgICAgU2tS
ZWN0IGJvdW5kczsKKyAgICBvcmlnX3BhdGgtPmNvbXB1dGVCb3VuZHMoJmJvdW5kcywgU2tQYXRo
OjprRmFzdF9Cb3VuZHNUeXBlKTsKKworICAgIC8vIFdlIGNhbiBpbW1lZGlhdGVseSByZXR1cm4g
ZmFsc2UgaWYgdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIHJlY3QKKyAgICBpZiAo
IWJvdW5kcy5jb250YWlucyhTa0Zsb2F0VG9TY2FsYXIocG9pbnQueCgpKSwgU2tGbG9hdFRvU2Nh
bGFyKHBvaW50LnkoKSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgb3JpZ19wYXRoLT5z
ZXRGaWxsVHlwZShmdCk7CisKKyAgICAvLyBTa2lhIGhhcyB0cm91YmxlIHdpdGggY29vcmRpbmF0
ZXMgY2xvc2UgdG8gdGhlIG1heCBzaWduZWQgMTYtYml0IHZhbHVlcworICAgIC8vIElmIHdlIGhh
dmUgdGhvc2UsIHdlIG5lZWQgdG8gc2NhbGUuIAorCisgICAgLy8gRklYTUU6IHJlbW92ZSB0aGlz
IGNvZGUgb25jZSBTa2lhIGlzIHBhdGNoZWQgdG8gd29yayBwcm9wZXJseSB3aXRoIGxhcmdlCisg
ICAgLy8gdmFsdWVzCisgICAgY29uc3QgU2tTY2FsYXIga01heENvb3JkaW5hdGUgPSBTa0ludFRv
U2NhbGFyKDE8PDE1KTsKKyAgICBTa1NjYWxhciBiaWdnZXN0X2Nvb3JkID0gc3RkOjptYXgoc3Rk
OjptYXgoc3RkOjptYXgoCisgICAgICBib3VuZHMuZlJpZ2h0LCBib3VuZHMuZkJvdHRvbSksIC1i
b3VuZHMuZkxlZnQpLCAtYm91bmRzLmZUb3ApOworCisgICAgaWYgKGJpZ2dlc3RfY29vcmQgPiBr
TWF4Q29vcmRpbmF0ZSkgeworICAgICAgc2NhbGUgPSBTa1NjYWxhckNlaWwoU2tTY2FsYXJEaXYo
YmlnZ2VzdF9jb29yZCwga01heENvb3JkaW5hdGUpKTsKKworICAgICAgU2tNYXRyaXggbTsKKyAg
ICAgIG0uc2V0U2NhbGUoU2tTY2FsYXJJbnZlcnQoU2tJbnRUb1NjYWxhcihzY2FsZSkpLCAKKyAg
ICAgICAgICAgICAgICAgU2tTY2FsYXJJbnZlcnQoU2tJbnRUb1NjYWxhcihzY2FsZSkpKTsKKyAg
ICAgIG9yaWdfcGF0aC0+dHJhbnNmb3JtKG0sICZzY2FsZWRfcGF0aCk7CisgICAgICBwYXRoID0g
JnNjYWxlZF9wYXRoOworICAgIH0KKworICAgIGludCB4ID0gKGludClmbG9vcmYocG9pbnQueCgp
IC8gc2NhbGUpOworICAgIGludCB5ID0gKGludClmbG9vcmYocG9pbnQueSgpIC8gc2NhbGUpOwor
ICAgIGNsaXAuc2V0UmVjdCh4LCB5LCB4ICsgMSwgeSArIDEpOworCisgICAgYm9vbCBjb250YWlu
cyA9IHJnbi5zZXRQYXRoKCpwYXRoLCBjbGlwKTsKKworICAgIG9yaWdfcGF0aC0+c2V0RmlsbFR5
cGUob3JpZ19mdCk7ICAgIC8vIHJlc3RvcmUKKyAgICByZXR1cm4gY29udGFpbnM7Cit9CisKK0dy
YXBoaWNzQ29udGV4dCogc2NyYXRjaENvbnRleHQoKQoreworICAgIHN0YXRpYyBJbWFnZUJ1ZmZl
ciogc2NyYXRjaCA9IDA7CisgICAgaWYgKCFzY3JhdGNoKQorICAgICAgICBzY3JhdGNoID0gSW1h
Z2VCdWZmZXI6OmNyZWF0ZShJbnRTaXplKDEsIDEpLCBmYWxzZSkucmVsZWFzZSgpOworICAgIC8v
IFdlIGRvbid0IGJvdGhlciBjaGVja2luZyBmb3IgZmFpbHVyZSBjcmVhdGluZyB0aGUgSW1hZ2VC
dWZmZXIsIHNpbmNlIG91cgorICAgIC8vIEltYWdlQnVmZmVyIGluaXRpYWxpemVyIHdvbid0IGZh
aWwuCisgICAgcmV0dXJuIHNjcmF0Y2gtPmNvbnRleHQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNl
IFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lh
VXRpbHMuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA0MTkzCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1NraWFVdGlscy5oCkBAIC0wLDAgKzEs
NjQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJu
ZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJ
Q0VOU0UgZmlsZS4KKworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGhlbHBlciByb3V0aW5lcyBmb3Ig
dXNpbmcgU2tpYSBpbiBXZWJLaXQuCisKKyNpZm5kZWYgU2tpYVV0aWxzX2gKKyNkZWZpbmUgU2tp
YVV0aWxzX2gKKworI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSAiU2tQYXRoLmgiCisjaW5jbHVkZSAiU2tQb3J0ZXJEdWZm
LmgiCisKK2NsYXNzIFNrQ2FudmFzOworY2xhc3MgU2tSZWdpb247CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworLy8gQ29udmVydHMgYSBXZWJDb3JlIGNvbXBvc2l0IG9wZXJhdGlvbiAoV2ViQ29y
ZTo6Q29tcG9zaXRlKikgdG8gdGhlCisvLyBjb3JyZXNwb25kaW5nIFNraWEgdHlwZS4KK1NrUG9y
dGVyRHVmZjo6TW9kZSBXZWJDb3JlQ29tcG9zaXRlVG9Ta2lhQ29tcG9zaXRlKFdlYkNvcmU6OkNv
bXBvc2l0ZU9wZXJhdG9yKTsKKworLy8gbW92ZSB0aGlzIGd1eSBpbnRvIFNrQ29sb3IuaAorU2tD
b2xvciBTa1BNQ29sb3JUb0NvbG9yKFNrUE1Db2xvciBwbSk7CisKKy8vIENvbnZlcnRzIEFuZHJv
aWQgY29sb3JzIHRvIFdlYktpdCBvbmVzLgorV2ViQ29yZTo6Q29sb3IgU2tQTUNvbG9yVG9XZWJD
b3JlQ29sb3IoU2tQTUNvbG9yIHBtKTsKKworLy8gU2tpYSBoYXMgcHJvYmxlbXMgd2hlbiBwYXNz
ZWQgaW5maW5pdGUsIGV0YyBmbG9hdHMsIGZpbHRlciB0aGVtIHRvIDAuCitpbmxpbmUgU2tTY2Fs
YXIgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihjb25zdCBmbG9hdCYgZikgeworICByZXR1cm4gU2tG
bG9hdFRvU2NhbGFyKGlzZmluaXRlKGYpID8gZiA6IDApOworfQorCitpbmxpbmUgU2tTY2FsYXIg
V2ViQ29yZURvdWJsZVRvU2tTY2FsYXIoY29uc3QgZG91YmxlJiBkKSB7CisgIHJldHVybiBTa0Rv
dWJsZVRvU2NhbGFyKGlzZmluaXRlKGQpID8gZCA6IDApOworfQorCisvLyBJbnRlcnNlY3RzIHRo
ZSBnaXZlbiBzb3VyY2UgcmVjdCB3aXRoIHRoZSByZWdpb24sIHJldHVybmluZyB0aGUgc21hbGxl
c3QKKy8vIHJlY3Rhbmd1bGFyIHJlZ2lvbiB0aGF0IGVuY29tcGFzZXMgdGhlIHJlc3VsdC4KKy8v
CisvLyBzcmNfcmVjdCBhbmQgZGVzdF9yZWN0IGNhbiBiZSB0aGUgc2FtZS4KK3ZvaWQgSW50ZXJz
ZWN0UmVjdEFuZFJlZ2lvbihjb25zdCBTa1JlZ2lvbiYgcmVnaW9uLCBjb25zdCBTa1JlY3QmIHNy
Y19yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUmVjdCogZGVzdF9yZWN0KTsK
KworLy8gQ29tcHV0ZXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0LCB3aGljaCB3aGVuIGRy
YXduIHRvIHRoZSBnaXZlbiBjYW52YXMsCisvLyB3aWxsIGNvdmVyIHRoZSBzYW1lIGFyZWEgYXMg
dGhlIHNvdXJjZSByZWN0YW5nbGUuIEl0IHdpbGwgY2xpcCB0byB0aGUgY2FudmFzJworLy8gY2xp
cCwgZG9pbmcgdGhlIG5lY2Vzc2FyeSBjb29yZGluYXRlIHRyYW5zZm9ybXMuCisvLworLy8gc3Jj
X3JlY3QgYW5kIGRlc3RfcmVjdCBjYW4gYmUgdGhlIHNhbWUuCit2b2lkIENsaXBSZWN0VG9DYW52
YXMoY29uc3QgU2tDYW52YXMmIGNhbnZhcywgY29uc3QgU2tSZWN0JiBzcmNfcmVjdCwKKyAgICAg
ICAgICAgICAgICAgICAgICBTa1JlY3QqIGRlc3RfcmVjdCk7CisKKy8vIERldGVybWluZSBpZiBh
IGdpdmVuIFdlYktpdCBwb2ludCBpcyBjb250YWluZWQgaW4gYSBwYXRoCitib29sIFNrUGF0aENv
bnRhaW5zUG9pbnQoU2tQYXRoKiBvcmlnX3BhdGgsIFdlYkNvcmU6OkZsb2F0UG9pbnQgcG9pbnQs
IFNrUGF0aDo6RmlsbFR5cGUgZnQpOworCisvLyBSZXR1cm5zIGEgc3RhdGljYWxseSBhbGxvY2F0
ZWQgMXgxIEdyYXBoaWNzQ29udGV4dCBpbnRlbmRlZCBmb3IgdGVtcG9yYXJ5CisvLyBvcGVyYXRp
b25zLiBQbGVhc2Ugc2F2ZSgpIHRoZSBzdGF0ZSBhbmQgcmVzdG9yZSgpIGl0IHdoZW4geW91J3Jl
IGRvbmUgd2l0aAorLy8gdGhlIGNvbnRleHQuCitHcmFwaGljc0NvbnRleHQqIHNjcmF0Y2hDb250
ZXh0KCk7CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gU2tpYVV0aWxz
X2gK
</data>
<flag name="review"
          id="12587"
          type_id="1"
          status="-"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>