<?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>80806</bug_id>
          
          <creation_ts>2012-03-11 20:47:25 -0700</creation_ts>
          <short_desc>[chromium] Need to clip to homogeneous w=0 plane when applying transforms.</short_desc>
          <delta_ts>2012-04-05 13:14:40 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>83299</dependson>
          <blocked>74147</blocked>
    
    <blocked>79136</blocked>
    
    <blocked>83082</blocked>
    
    <blocked>83217</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Shawn Singh">shawnsingh</reporter>
          <assigned_to name="Shawn Singh">shawnsingh</assigned_to>
          <cc>cc-bugs</cc>
    
    <cc>danakj</cc>
    
    <cc>dglazkov</cc>
    
    <cc>enne</cc>
    
    <cc>jamesr</cc>
    
    <cc>reveman</cc>
    
    <cc>shawnsingh</cc>
    
    <cc>vangelis</cc>
    
    <cc>vrobison</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>575912</commentid>
    <comment_count>0</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-03-11 20:47:25 -0700</bug_when>
    <thetext>WebCore TransformationMatrix does not properly handle un-projecting from a perspective transform, for surfaces where at least one of its vertices is behind the camera.

But it is not as simple as &quot;handling this case properly&quot; because there really isn&apos;t a good way to handle it.  (refer to http://dl.acm.org/citation.cfm?id=807398 to understand why)  The real need is to clip geometry that goes behind the camera so that we never try to un-project vertices that are behind the camera.  However, this can create triangles, pentagons, or other general polygons depending on what we need to clip.

This patch will first implement clipping in chromium, to get some rendering bugs fixed (for example, http://code.google.com/p/chromium/issues/detail?id=105100 among others).  Later we will try to migrate the correct clipping to WebCore to fix problems for hit testing bugs (for example, https://bugs.webkit.org/show_bug.cgi?id=79136 among others).

One question that might come up is &quot;why doesn&apos;t this affect rendering for Safari?&quot; -- the answer is that Safari, as far as I know, doesn&apos;t use projectQuad in its compositor.  But the hit testing bugs do indeed affect both Safari and Chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592733</commentid>
    <comment_count>1</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-03-30 19:04:07 -0700</bug_when>
    <thetext>Correction to above comment: The bug can occur on any usage of mapRect, mapQuad, or projectQuad, if the transform has a perspective component and layers go behind the projection plane.  My earlier thought about it going wrong only when un-projecting is actually just subset of the entire bug.

The clipping solution is still necessary and that explanation given in the previous comment still applies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592914</commentid>
    <comment_count>2</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-03-31 12:43:19 -0700</bug_when>
    <thetext>I just want to be crystal clear about the problem statement before posting another complicated update.

Some matrices with perspective projection component may cause homogeneous coordinate w to become negative.  According to the math, when this happens the point may appear to project validly to the visible portion of the screen in cartesian coordinates, but it actually should not be visible to the screen.

The correct way to handle this is to clip the geometry after applying the transform in homogeneous coordinates, but before divide-by-w is applied.  Specifically, we should be clipping to the w=0 plane (w = epsilon is fine to avoid divide-by-zero).

Note:

1. Any usage of mapRect / mapQuad / projectQuad / mapPoint will suffer from this problem.

2. Clipping like this will cause polygons other than quads, too.  In most cases we can tolerate it because we only care about the rect enclosing the vertices, but of course we can&apos;t do this when drawing the clipped geometry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592916</commentid>
    <comment_count>3</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-03-31 12:50:27 -0700</bug_when>
    <thetext>David and Enne: this needs your attention and feedback.  I tried to give clear context of the bug in comment #2 above.  Thanks in advance!

Status:
I have a fix for this bug which works nicely - but only when bypassing the antialiasing code path (i.e. forcing CCTileDrawQuad to return false for all the AA booleans).

Of course we need to fix the anti-aliasing code path, too - in LRC::drawTileQuad().  As I understand, that code maps the quad to device space to determine correct AA inflation in pixel units, and then it maps back so that it can issue a drawTexturedQuad call.  There are a few issues that come up:

(a) why do we flatten the deviceTransform to 2d?   For layers that have perspective, won&apos;t that actually be incorrect when we try to inflate the edges for AA and then transform back?  (i.e. the amount we inflate the near part of the edge and far part of the edge should indeed be different, but in 2d they won&apos;t be)

(b) was there a reason we used mapQuad on the inverse (when transforming back to local quad space)?  I&apos;m pretty sure it should be projectQuad.  Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad, but when there is perspective, the unprojection is correct.

(c) even better: why couldn&apos;t we just issue a drawTexturedQuad call using the identity transform and the device-space quad?  We could avoid computing an inverse and another transform mapping anyway.

(d) and finally, the act of transforming to device coordinates in the first place is where this clipping bug shows up.  So even if we address the first 3 points, we still have to implement proper clipping here.

I can think of 2 possible solutions.  Please let me know what you think:

Solution 1: if there is perspective component in the quadTransform, we could skip the antialiasing code path, at least until we have a better fix.

Solution 2: I think we can simultaneously get correct clipping and AA by transforming each edge separately, clipping the edges first, then doing the AA inflation, and finally reconstructing a new device-space CCTileDrawQuad from the clipped edges (or, if it was clipped to be a pentagon, construct two quads).  Then we would use the identityTransform in drawTexturedQuad.  Would this work?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592933</commentid>
    <comment_count>4</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-03-31 13:55:13 -0700</bug_when>
    <thetext>Solution 3:  if there is any possible way to determine the AA inflation without transforming the quad (or, without drawing the transformed-and-then-inverse-transformed quad), we could do that too.  The GPU does properly clip w&lt;0 items.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593645</commentid>
    <comment_count>5</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-02 11:49:47 -0700</bug_when>
    <thetext>(In reply to comment #3)

&gt; Of course we need to fix the anti-aliasing code path, too - in LRC::drawTileQuad().  As I understand, that code maps the quad to device space to determine correct AA inflation in pixel units, and then it maps back so that it can issue a drawTexturedQuad call.  There are a few issues that come up:
&gt; 
&gt; (a) why do we flatten the deviceTransform to 2d?   For layers that have perspective, won&apos;t that actually be incorrect when we try to inflate the edges for AA and then transform back?  (i.e. the amount we inflate the near part of the edge and far part of the edge should indeed be different, but in 2d they won&apos;t be)

We are inflating the bounds in 2d device space so that we can guarantee that particular pixels in this post-projection space get coverage from this quad.  In this space, the amount we inflate the edges should be identical since pixels are distributed evenly in device space.  When you do the inverse projection, the inflation for points further away will end up being larger.

&gt; (b) was there a reason we used mapQuad on the inverse (when transforming back to local quad space)?  I&apos;m pretty sure it should be projectQuad.  Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad, but when there is perspective, the unprojection is correct.

It&apos;s cheaper and just as correct in this case.

&gt; I can think of 2 possible solutions.  Please let me know what you think:
&gt; 
&gt; Solution 1: if there is perspective component in the quadTransform, we could skip the antialiasing code path, at least until we have a better fix.

This seems like a heavy-handed solution.  Can&apos;t you detect this particular issue in a more fine-grained way? I think these sorts of transforms are not the common case.

&gt; Solution 2: I think we can simultaneously get correct clipping and AA by transforming each edge separately, clipping the edges first, then doing the AA inflation, and finally reconstructing a new device-space CCTileDrawQuad from the clipped edges (or, if it was clipped to be a pentagon, construct two quads).  Then we would use the identityTransform in drawTexturedQuad.  Would this work?

No.  This would result in non-perspective correct texture coordinates when interpolating in the fragment shader.  In other words, texture coordinates cannot be linearly interpolated in post-projection space and the fragment shader would use the wrong values.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593680</commentid>
    <comment_count>6</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-02 12:23:46 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #3)
&gt; 
&gt; &gt; Of course we need to fix the anti-aliasing code path, too - in LRC::drawTileQuad().  As I understand, that code maps the quad to device space to determine correct AA inflation in pixel units, and then it maps back so that it can issue a drawTexturedQuad call.  There are a few issues that come up:
&gt; &gt; 
&gt; &gt; (a) why do we flatten the deviceTransform to 2d?   For layers that have perspective, won&apos;t that actually be incorrect when we try to inflate the edges for AA and then transform back?  (i.e. the amount we inflate the near part of the edge and far part of the edge should indeed be different, but in 2d they won&apos;t be)
&gt; 
&gt; We are inflating the bounds in 2d device space so that we can guarantee that particular pixels in this post-projection space get coverage from this quad.  In this space, the amount we inflate the edges should be identical since pixels are distributed evenly in device space.  When you do the inverse projection, the inflation for points further away will end up being larger.
&gt; 

I think I already understood that we have to inflate for AA in device space.  That wasn&apos;t my question... I was asking why we remove 3-d portions of the transform itself.  Even if there are 3d portions of the transform, mapRect / mapQuad will correclty project it down to 2d.

&gt; &gt; (b) was there a reason we used mapQuad on the inverse (when transforming back to local quad space)?  I&apos;m pretty sure it should be projectQuad.  Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad, but when there is perspective, the unprojection is correct.
&gt; 
&gt; It&apos;s cheaper and just as correct in this case.
&gt; 


I&apos;m not convinced of that... are you suggesting that inverse.projectQuad and inverse.mapRect are the same?


&gt; &gt; I can think of 2 possible solutions.  Please let me know what you think:
&gt; &gt; 
&gt; &gt; Solution 1: if there is perspective component in the quadTransform, we could skip the antialiasing code path, at least until we have a better fix.
&gt; 
&gt; This seems like a heavy-handed solution.  Can&apos;t you detect this particular issue in a more fine-grained way? I think these sorts of transforms are not the common case.

I agree this isn&apos;t the correct solution.  detecting this issue in a more fine-grained way could be possible, but if we go that far, we might as well consider doing proper AA in those fine-grained cases, too.  I think getting correct AA in all cases should still be possible.

&gt; 
&gt; &gt; Solution 2: I think we can simultaneously get correct clipping and AA by transforming each edge separately, clipping the edges first, then doing the AA inflation, and finally reconstructing a new device-space CCTileDrawQuad from the clipped edges (or, if it was clipped to be a pentagon, construct two quads).  Then we would use the identityTransform in drawTexturedQuad.  Would this work?
&gt; 
&gt; No.  This would result in non-perspective correct texture coordinates when interpolating in the fragment shader.  In other words, texture coordinates cannot be linearly interpolated in post-projection space and the fragment shader would use the wrong values.

yeah, good catch.  I&apos;ll come back with some better proposed solutions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593730</commentid>
    <comment_count>7</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-02 13:04:15 -0700</bug_when>
    <thetext>(In reply to comment #6)

&gt; I think I already understood that we have to inflate for AA in device space.  That wasn&apos;t my question... I was asking why we remove 3-d portions of the transform itself.  Even if there are 3d portions of the transform, mapRect / mapQuad will correclty project it down to 2d.

That&apos;s exactly it.  You&apos;ve projected into 2d and modified the quad, and now you want to figure out what quad in the original space transformed with the draw transform will result in that modified quad.

My understanding here is that if you use the inverse of the 3d transform, you will end up with an incorrect result because you&apos;re transforming (x, y, 0), and z=0 is not actually correct for this point.
 
&gt; &gt; &gt; (b) was there a reason we used mapQuad on the inverse (when transforming back to local quad space)?  I&apos;m pretty sure it should be projectQuad.  Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad, but when there is perspective, the unprojection is correct.
&gt; &gt; 
&gt; &gt; It&apos;s cheaper and just as correct in this case.
&gt;
&gt; I&apos;m not convinced of that... are you suggesting that inverse.projectQuad and inverse.mapRect are the same?

Quoting from yourself: &quot;Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593767</commentid>
    <comment_count>8</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-02 13:32:06 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; 
&gt; &gt; I think I already understood that we have to inflate for AA in device space.  That wasn&apos;t my question... I was asking why we remove 3-d portions of the transform itself.  Even if there are 3d portions of the transform, mapRect / mapQuad will correclty project it down to 2d.
&gt; 
&gt; That&apos;s exactly it.  You&apos;ve projected into 2d and modified the quad, and now you want to figure out what quad in the original space transformed with the draw transform will result in that modified quad.

I&apos;m referring to http://trac.webkit.org/browser/trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp#L656

This removes the 3d stuff from the transform before we even figure out what the quad would look like in device space.  So for example, if there was a perspective transform, it wouldn&apos;t be considered when transforming to device space...


&gt; 
&gt; My understanding here is that if you use the inverse of the 3d transform, you will end up with an incorrect result because you&apos;re transforming (x, y, 0), and z=0 is not actually correct for this point.
&gt; 
&gt; &gt; &gt; &gt; (b) was there a reason we used mapQuad on the inverse (when transforming back to local quad space)?  I&apos;m pretty sure it should be projectQuad.  Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad, but when there is perspective, the unprojection is correct.
&gt; &gt; &gt; 
&gt; &gt; &gt; It&apos;s cheaper and just as correct in this case.
&gt; &gt;
&gt; &gt; I&apos;m not convinced of that... are you suggesting that inverse.projectQuad and inverse.mapRect are the same?
&gt; 
&gt; Quoting from yourself: &quot;Inverse + projectQuad is an unprojection; when there is no perspective component in the original matrix, it behaves equivalent to inverse + mapQuad&quot;

Yes, when there is no perspective, inverse.projectQuad behaves equivalently to inverse.mapRect.

When there is perspective, I don&apos;t think mapRect is correct.  I think we should be using projectQuad so that both non-perspective and perspective cases are covered.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593825</commentid>
    <comment_count>9</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-02 14:11:09 -0700</bug_when>
    <thetext>(In reply to comment #8)

&gt; I&apos;m referring to http://trac.webkit.org/browser/trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp#L656
&gt; 
&gt; This removes the 3d stuff from the transform before we even figure out what the quad would look like in device space.  So for example, if there was a perspective transform, it wouldn&apos;t be considered when transforming to device space...

I don&apos;t understand why this is a problem. The &quot;3d part&quot; of the transform doesn&apos;t affect the final x and y components of the quad in device space, only the z component.  In other words, for all values of quad:

transform.to2dTransform().mapQuad(quad) == transform.mapQuad(quad)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>593927</commentid>
    <comment_count>10</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-02 15:33:26 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; 
&gt; &gt; I&apos;m referring to http://trac.webkit.org/browser/trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp#L656
&gt; &gt; 
&gt; &gt; This removes the 3d stuff from the transform before we even figure out what the quad would look like in device space.  So for example, if there was a perspective transform, it wouldn&apos;t be considered when transforming to device space...
&gt; 
&gt; I don&apos;t understand why this is a problem. The &quot;3d part&quot; of the transform doesn&apos;t affect the final x and y components of the quad in device space, only the z component.  In other words, for all values of quad:
&gt; 
&gt; transform.to2dTransform().mapQuad(quad) == transform.mapQuad(quad)

OK, I see the problem.  I created https://bugs.webkit.org/show_bug.cgi?id=82956 to discuss it further.  This bug can stay focused on the clipping+AA problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594159</commentid>
    <comment_count>11</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-02 20:08:21 -0700</bug_when>
    <thetext>I have a patch ready for review, coming in just one moment.  Some notes:

(1) Tested on unit tests and compositing/ subset of layout tests.  Also tested manually on apple&apos;s VR demo, the css space cube demo, and reduce test case (all can be found from http://code.google.com/p/chromium/issues/detail?id=105100)

I will run all layout tests before submitting next version of patch, but this patch is working correctly and ready for review.


(2) please feel free to ask me for details about the math.


(3) I added unit tests for calculateVisibleRect, but I did not add unit testing for CCMathUtil.  The code is covered by existing unit tests, in particular the new tests for calculateVisibleLayerRect.  Please let me know if you still prefer that we add unit tests here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594161</commentid>
    <comment_count>12</comment_count>
      <attachid>135264</attachid>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-02 20:11:39 -0700</bug_when>
    <thetext>Created attachment 135264
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594178</commentid>
    <comment_count>13</comment_count>
      <attachid>135264</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-02 21:03:28 -0700</bug_when>
    <thetext>Comment on attachment 135264
Patch

Attachment 135264 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/12317046</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594534</commentid>
    <comment_count>14</comment_count>
    <who name="Victor Robison">vrobison</who>
    <bug_when>2012-04-03 08:55:42 -0700</bug_when>
    <thetext>Build failed.  Looks like either FloatPoint3d.h (and possibly other files) are missing or you are missing the include path.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594612</commentid>
    <comment_count>15</comment_count>
      <attachid>135357</attachid>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-03 10:31:49 -0700</bug_when>
    <thetext>Created attachment 135357
Should compile on linux now</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594628</commentid>
    <comment_count>16</comment_count>
      <attachid>135357</attachid>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-04-03 10:41:01 -0700</bug_when>
    <thetext>Comment on attachment 135357
Should compile on linux now

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

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.h:50
&gt; +    static FloatRect projectClippedRect(const TransformationMatrix&amp;, const FloatQuad&amp;);

projectRect() should take a rect as input. The function should be projectQuad, or the input should be a rect, IMO.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594638</commentid>
    <comment_count>17</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-03 10:50:10 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 135357 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=135357&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.h:50
&gt; &gt; +    static FloatRect projectClippedRect(const TransformationMatrix&amp;, const FloatQuad&amp;);
&gt; 
&gt; projectRect() should take a rect as input. The function should be projectQuad, or the input should be a rect, IMO.

OK, good idea.  I&apos;ll make the input arg a FloatRect.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594794</commentid>
    <comment_count>18</comment_count>
      <attachid>135357</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-04-03 13:15:57 -0700</bug_when>
    <thetext>Comment on attachment 135357
Should compile on linux now

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

Nice! I would like at some point to move this inside TransformationMatrix but it can be done in a separate patch.  I agree with other reviewers that turning off multisampling for clipped layers is a bit heavy-handed.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:155
&gt; +    // This function omputes the 2d FloatRect that encloses the clipped quad. Note that

typo: computes

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:190
&gt; +    // Step 2: Collect the list of vertices that represent the clipped quad.

Since the common case will require no clipping, maybe check if any of the points need to be clipped before calling computeClippedVerticesForTransformedQuad which creates a &lt;vector&gt; etc. ?  Also, adding the identityOrTranslation() test at the top should help a lot.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:208
&gt; +    Vector&lt;HomogeneousCoordinate&gt; verticesOfClippedQuad;

Same comments as above.  We should try to not regress the performance of the common case.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:218
&gt; +    // FIXME: this version of mapQuad is missing a useful optimization, isIdentityOrTranslation(), that is available only in TransformationMatrix.cpp

isIdentityOrTranslation() is a public method of TransformationMatrix</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594848</commentid>
    <comment_count>19</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-03 13:49:41 -0700</bug_when>
    <thetext>Thanks for the reviews!  I&apos;ll submit a new patch soon

(In reply to comment #18)
&gt; (From update of attachment 135357 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=135357&amp;action=review
&gt; 
&gt; Nice! I would like at some point to move this inside TransformationMatrix but it can be done in a separate patch.  I agree with other reviewers that turning off multisampling for clipped layers is a bit heavy-handed.
&gt; 

I should have mentioned that Enne and I decided it was OK to skip AA for clipped layers.  It is still less heavy-handed than skipping AA for all layers that have perspective.

Just let me know either way. I&apos;m willing to put more time into getting AA to work, but if we can&apos;t figure out how to cleanly convert the AA inflation to local quad space, so that we can modify the original un-clipped quad, then we may need to resort to tesselation of the clipped polygon which will get ugly. =)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>594908</commentid>
    <comment_count>20</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-04-03 14:37:44 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; Thanks for the reviews!  I&apos;ll submit a new patch soon
&gt; 
&gt; (In reply to comment #18)
&gt; &gt; (From update of attachment 135357 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=135357&amp;action=review
&gt; &gt; 
&gt; &gt; Nice! I would like at some point to move this inside TransformationMatrix but it can be done in a separate patch.  I agree with other reviewers that turning off multisampling for clipped layers is a bit heavy-handed.
&gt; &gt; 
&gt; 
&gt; I should have mentioned that Enne and I decided it was OK to skip AA for clipped layers.  It is still less heavy-handed than skipping AA for all layers that have perspective.
&gt; 
&gt; Just let me know either way. I&apos;m willing to put more time into getting AA to work, but if we can&apos;t figure out how to cleanly convert the AA inflation to local quad space, so that we can modify the original un-clipped quad, then we may need to resort to tesselation of the clipped polygon which will get ugly. =)

Ah, ok.  David may be able the help fixing up the AA shader for that case, possibly in a followup patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>595065</commentid>
    <comment_count>21</comment_count>
      <attachid>135468</attachid>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-03 17:38:55 -0700</bug_when>
    <thetext>Created attachment 135468
Addressed reviewers comments

IAlso rearranged some code so that there is less redundancy and fluff.  Ran all unit tests and layout tests on osx, no obvious regressions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>595968</commentid>
    <comment_count>22</comment_count>
      <attachid>135468</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-04 14:47:20 -0700</bug_when>
    <thetext>Comment on attachment 135468
Addressed reviewers comments

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

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:62
&gt; +    double x, y, z, w;

One line per declaration, please.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:184
&gt; +    Vector&lt;HomogeneousCoordinate&gt; verticesOfClippedQuad;
&gt; +    computeClippedVerticesForTransformedQuad(h1, h2, h3, h4, verticesOfClippedQuad);

Perhaps this is premature optimization, but can we not hit the allocator during mapClippedRect? Could computeClippedVerticesForTransformedQuad just return the enclosing rect instead of the list of vertices?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp:1148
&gt; +    layerToSurfaceTransform.translate3d(-161.111111111111, 0, 0);
&gt; +    expected = IntRect(IntPoint(50, -50), IntSize(100, 200)); // The right half of the layer&apos;s bounding rect.
&gt; +    actual = CCLayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerContentRect, layerToSurfaceTransform);
&gt; +    EXPECT_INT_RECT_EQ(expected, actual);

This seems a little flimsy, since you&apos;re using approximate floating point math and then going back to int.  Can you pick better numbers here that come out more evenly? Or, am I missing something that makes it more reliable than it looks at first blush?

&gt; Source/WebKit/chromium/tests/CCLayerTreeHostCommonTest.cpp:1181
&gt; +    // but actually they are not. The visibleRect needs to be properly clipped by the
&gt; +    // w = 0 plane in homogeneous coordinates before converting to cartesian coordinates.

Can you assert that this happening in this test by calling a CCMath function?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596000</commentid>
    <comment_count>23</comment_count>
      <attachid>135468</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-04-04 15:09:57 -0700</bug_when>
    <thetext>Comment on attachment 135468
Addressed reviewers comments

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:184
&gt;&gt; +    computeClippedVerticesForTransformedQuad(h1, h2, h3, h4, verticesOfClippedQuad);
&gt; 
&gt; Perhaps this is premature optimization, but can we not hit the allocator during mapClippedRect? Could computeClippedVerticesForTransformedQuad just return the enclosing rect instead of the list of vertices?

Enne makes a good point here. By combining computeClippedVerticesForTransformedQuad with computeEnclosingRectOfClippedQuad into a single function you can also easily replace the &lt;vector&gt; by a straight static array (since there is an upper limit on the number of points that result from this operation).

&gt; Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp:288
&gt; +    IntRect unoccludedRect = enclosingIntRect(CCMathUtil::projectQuad(contentSpaceTransform.inverse(), FloatQuad(FloatRect(shrunkRect)), clamped).boundingBox());

Is there a reason for not using projectClippedRect() here ?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp:289
&gt;      if (clamped)

nit:  clamped -&gt; clipped (for consistency) ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596016</commentid>
    <comment_count>24</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-04 15:18:59 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp:288
&gt; &gt; +    IntRect unoccludedRect = enclosingIntRect(CCMathUtil::projectQuad(contentSpaceTransform.inverse(), FloatQuad(FloatRect(shrunkRect)), clamped).boundingBox());
&gt; 
&gt; Is there a reason for not using projectClippedRect() here ?

No reason except that I preferred to do it in a separate step.  It will help isolate regressions and get things debugged more easily if something goes wrong.  We had already filed https://bugs.webkit.org/show_bug.cgi?id=83217 for this.  Does that sound OK?

But I will make all the other changes that you and Enne suggested.  It should compact things nicely.  Later, if we really need to compute the clipped quad, we can salvage it from this old patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596076</commentid>
    <comment_count>25</comment_count>
      <attachid>135711</attachid>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-04 16:26:14 -0700</bug_when>
    <thetext>Created attachment 135711
Addressed second round of comments

also added Enne&apos;s requested assert to the un-projection case, too; still passes tests with no obvious regressions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596108</commentid>
    <comment_count>26</comment_count>
      <attachid>135711</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-04 16:58:37 -0700</bug_when>
    <thetext>Comment on attachment 135711
Addressed second round of comments

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

A few more math questions.  It&apos;s been a while since I&apos;ve looked at this sort of thing, so maybe having a little bit more explanation would help me feel more comfortable.  :)

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:105
&gt; +    //   p.w = 0 = (1-t) * h1.w + (t) * h2.w

Forgive my misunderstanding, but shouldn&apos;t you be solving for p.w = epsilon?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:119
&gt; +    double w = 0.00001; // or any positive non-zero small epsilon

Given that you multiply x,y,z by 1/w, doesn&apos;t the choice of w here greatly affect the cartesian coordinates you get?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596151</commentid>
    <comment_count>27</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-04 17:57:53 -0700</bug_when>
    <thetext>(In reply to comment #26)
&gt; (From update of attachment 135711 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=135711&amp;action=review
&gt; 
&gt; A few more math questions.  It&apos;s been a while since I&apos;ve looked at this sort of thing, so maybe having a little bit more explanation would help me feel more comfortable.  :)
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:105
&gt; &gt; +    //   p.w = 0 = (1-t) * h1.w + (t) * h2.w
&gt; 
&gt; Forgive my misunderstanding, but shouldn&apos;t you be solving for p.w = epsilon?

For all intents and purposes, epsilon == 0.  So where we can use 0 without divide-by-zero risks, its probably best to use it.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:119
&gt; &gt; +    double w = 0.00001; // or any positive non-zero small epsilon
&gt; 
&gt; Given that you multiply x,y,z by 1/w, doesn&apos;t the choice of w here greatly affect the cartesian coordinates you get?

short answer:

Its a choice between the two evil solutions.  I feel epsilon is the lesser evil approach.  The other approach has much higher risk of overflow.

long answer:

The other solution is to set w=0, and implement a special case that forces x/w to be signed infinity when w==0.  If you prefer that, I&apos;m OK with it.  Personally I think that&apos;s worse evil than epsilon.  The problem is that its a little too easy to accidentally cause overflow in those cases.  It is so natural to use the code assuming it maintains valid values, and as soon as something is clipped and set to INT_MAX, the next operation is very risky to cause overflow and suddenly everything goes kaput.

For the epsilon approach, the tradeoff favors incorrect results to reduce the risk of overflow.  We can think of the &quot;normal case&quot; and &quot;pathological case&quot;:

normal case:  x/epsilon will cause extremely large values for the projected 2d value of x.  This is exactly what we want; we want to emulate x/w approaching infinity (or negative infinity), without having to deal with NaN or inf IEEE floating point idiosyncrasies.  This means that the x-coordinate is far offscreen somewhere, and that is what we want, but the risk of overflow is far less.

pathological case:  if x is very small, or if the viewport is extremely large, then perhaps x/w does not actually go offscreen like it should.  The net result of this is that we will still see some incorrect clipping.  I believe this should only occur in rare cases where the content itself has specified very large or very small units for their scene.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596154</commentid>
    <comment_count>28</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-04 18:01:08 -0700</bug_when>
    <thetext>correction about viewport.  it should say &quot;if the viewport encompasses a large region of the projection plane&quot;.  not referring to large number of pixels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596172</commentid>
    <comment_count>29</comment_count>
      <attachid>135711</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-04 18:11:05 -0700</bug_when>
    <thetext>Comment on attachment 135711
Addressed second round of comments

Gotcha.  I understand what&apos;s going on here, now; that sounds totally reasonable.  Thanks for the explanation.  :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596190</commentid>
    <comment_count>30</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-04 18:22:40 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; (From update of attachment 135711 [details])
&gt; Gotcha.  I understand what&apos;s going on here, now; that sounds totally reasonable.  Thanks for the explanation.  :)

Sure - thanks a bunch for reviewing.   I&apos;ll land it tomorrow morning.

Just for interest, I quickly tried the clamp-to-infinity method, and it seems like we are already easily reaching overflow problems already, and the patch breaks.  I had to use &quot;int_max / 100&quot; before it stopped showing artifacts.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596301</commentid>
    <comment_count>31</comment_count>
      <attachid>135711</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-04-04 22:16:36 -0700</bug_when>
    <thetext>Comment on attachment 135711
Addressed second round of comments

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp:119
&gt;&gt;&gt; +    double w = 0.00001; // or any positive non-zero small epsilon
&gt;&gt; 
&gt;&gt; Given that you multiply x,y,z by 1/w, doesn&apos;t the choice of w here greatly affect the cartesian coordinates you get?
&gt; 
&gt; short answer:
&gt; 
&gt; Its a choice between the two evil solutions.  I feel epsilon is the lesser evil approach.  The other approach has much higher risk of overflow.
&gt; 
&gt; long answer:
&gt; 
&gt; The other solution is to set w=0, and implement a special case that forces x/w to be signed infinity when w==0.  If you prefer that, I&apos;m OK with it.  Personally I think that&apos;s worse evil than epsilon.  The problem is that its a little too easy to accidentally cause overflow in those cases.  It is so natural to use the code assuming it maintains valid values, and as soon as something is clipped and set to INT_MAX, the next operation is very risky to cause overflow and suddenly everything goes kaput.
&gt; 
&gt; For the epsilon approach, the tradeoff favors incorrect results to reduce the risk of overflow.  We can think of the &quot;normal case&quot; and &quot;pathological case&quot;:
&gt; 
&gt; normal case:  x/epsilon will cause extremely large values for the projected 2d value of x.  This is exactly what we want; we want to emulate x/w approaching infinity (or negative infinity), without having to deal with NaN or inf IEEE floating point idiosyncrasies.  This means that the x-coordinate is far offscreen somewhere, and that is what we want, but the risk of overflow is far less.
&gt; 
&gt; pathological case:  if x is very small, or if the viewport is extremely large, then perhaps x/w does not actually go offscreen like it should.  The net result of this is that we will still see some incorrect clipping.  I believe this should only occur in rare cases where the content itself has specified very large or very small units for their scene.

Would it be more correct to solve for w = epsilon so that x,y,z and w are all consistent? This would mean finding a point that&apos;s within epsilon of the image plane.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596642</commentid>
    <comment_count>32</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-05 09:44:19 -0700</bug_when>
    <thetext>OK, Enne was suggesting that, too, so I&apos;ll go ahead and land it with that change (after re-testing of course).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596653</commentid>
    <comment_count>33</comment_count>
      <attachid>135844</attachid>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-05 10:03:11 -0700</bug_when>
    <thetext>Created attachment 135844
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596735</commentid>
    <comment_count>34</comment_count>
      <attachid>135844</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-05 11:24:34 -0700</bug_when>
    <thetext>Comment on attachment 135844
Patch for landing

Clearing flags on attachment: 135844

Committed r113341: &lt;http://trac.webkit.org/changeset/113341&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596736</commentid>
    <comment_count>35</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-05 11:24:41 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>596842</commentid>
    <comment_count>36</comment_count>
    <who name="Shawn Singh">shawnsingh</who>
    <bug_when>2012-04-05 13:14:40 -0700</bug_when>
    <thetext>Committed r113364: &lt;http://trac.webkit.org/changeset/113364&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135264</attachid>
            <date>2012-04-02 20:11:39 -0700</date>
            <delta_ts>2012-04-03 10:31:44 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-80806-20120402201138.patch</filename>
            <type>text/plain</type>
            <size>42142</size>
            <attacher name="Shawn Singh">shawnsingh</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEyOTc1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTJiMTVlZmIyMGFmM2Jh
MWUyOTk2ZDI5OWMwN2Y4N2UxMzRjOGNhNS4uZWEyZmQxOTYwNzBiODIzMjJlZmUzZDZjMGEwMzQy
YTViOWQ0NjlkYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYyIEBACisyMDEyLTA0LTAyICBTaGF3
biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
TmVlZCB0byBjbGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFwcGx5aW5nIHRyYW5z
Zm9ybXMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
MDgwNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVu
aXQgdGVzdHMgYWRkZWQgdG8gQ0NMYXllclRyZWVIb3N0Q29tbW9uLiBUaGlzIGNoYW5nZSBpcyBh
bHNvCisgICAgICAgIGNvdmVyZWQgYnkgb3RoZXIgZXhpc3RpbmcgdW5pdCB0ZXN0cyBhbmQgbGF5
b3V0IHRlc3RzLgorCisgICAgICAgIFdlYkNvcmUgVHJhbnNmb3JtYXRpb25NYXRyaXggbWFwUmVj
dCAvIG1hcFF1YWQgLyBwcm9qZWN0UXVhZCBkbworICAgICAgICBub3QgcHJvcGVybHkgaGFuZGxl
IHRoZSBjYXNlIHdoZXJlIGEgc3VyZmFjZSBpcyBvcmllbnRlZCBwYXJ0aWFsbHkKKyAgICAgICAg
YmVoaW5kIHRoZSBjYW1lcmEsIHdpdGggYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLiBJbiB0aGlz
IGNhc2UsCisgICAgICAgIHByb2plY3RlZCBwb2ludHMgbWF5IGFwcGVhciB0byBiZSB2YWxpZCBp
biBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMsCisgICAgICAgIGJ1dCB0aGV5IGFyZSBpbmRlZWQgbm90
IHZhbGlkLCBhbmQgdGhleSBjYW4gb25seSBiZSBkZXRlY3RlZCBpbgorICAgICAgICBob21vZ2Vu
ZW91cyBjb29yZGluYXRlcyBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3JtLCBiZWZvcmUgdGhl
CisgICAgICAgIGRpdmlkZS1ieS13IHN0ZXAuCisKKyAgICAgICAgVGhlIGNvcnJlY3Qgc29sdXRp
b24gaXMgdG8gY2xpcCBnZW9tZXRyeSB3aGVyZSB3IDwgMC4gVGhpcyBwYXRjaAorICAgICAgICBt
YWtlcyB0aGlzIGNoYW5nZSBsb2NhbCB0byBjaHJvbWl1bSBvbmx5LCB0byBmaXggcmVuZGVyaW5n
IGJ1Z3MKKyAgICAgICAgdGhhdCBhcmlzZSBmcm9tIHRoaXMgcHJvYmxlbTsgU2FmYXJpIGRvZXMg
bm90IGhhdmUgdGhlc2UgYnVncworICAgICAgICBiZWNhdXNlIGl0IGRvZXMgbm90IHVzZSB0aGUg
dHJhbnNmb3JtcyBvdXRzaWRlIG9mIHRoZSBHUFUgKHdoaWNoCisgICAgICAgIGRvZXMgY29ycmVj
dGx5IGhhbmRsZSB0aGlzIGNhc2UpLiBUaGUgcHJpbWFyeSBmaXggaXMgdG8gY29ycmVjdAorICAg
ICAgICBjYWxjdWxhdGVWaXNpYmxlTGF5ZXJSZWN0KCksIGJ1dCBvdGhlciBhbmNpbGxhcnkgbG9j
YXRpb25zIGFyZQorICAgICAgICBhbHNvIGZpeGVkLCBpbiBwYXJ0aWN1bGFyLCB0aGUgYW50aWFs
aWFzaW5nIGNvZGUgcGF0aCBpcyBzaW1wbHkKKyAgICAgICAgc2tpcHBlZCB3aGVuIHRoaXMgY2Fz
ZSBhcmlzZXMuCisKKyAgICAgICAgRXZlbnR1YWxseSB0aGlzIG1hdGggbmVlZHMgdG8gYmUgbWVy
Z2VkIGludG8gVHJhbnNmb3JtYXRpb25NYXRyaXgsCisgICAgICAgIHRvIGZpeCBoaXQtdGVzdGlu
ZyBidWdzIHRoYXQgb2NjdXIgaW4gYm90aCBDaHJvbWl1bSBhbmQgU2FmYXJpLgorCisgICAgICAg
ICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpmaW5kVGlsZVByb2dy
YW1Vbmlmb3Jtcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRy
YXdUaWxlUXVhZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NM
YXllclRyZWVIb3N0Q29tbW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9z
dENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6aXNTY2Fs
ZU9yVHJhbnNsYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6Y2FsY3VsYXRlRHJhd1RyYW5zZm9y
bXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoSG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhvbW9nZW5l
b3VzQ29vcmRpbmF0ZTo6SG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6c2hvdWxkQmVDbGlwcGVkKToKKyAgICAgICAgKFdlYkNv
cmU6OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6Y2FydGVzaWFuUG9pbnQyZCk6CisgICAgICAgIChX
ZWJDb3JlOjpwcm9qZWN0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6bWFwUG9pbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6Y29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UpOgorICAgICAgICAoV2Vi
Q29yZTo6Y29tcHV0ZUNsaXBwZWRWZXJ0aWNlc0ZvclRyYW5zZm9ybWVkUXVhZCk6CisgICAgICAg
IChXZWJDb3JlOjpjb21wdXRlRW5jbG9zaW5nUmVjdE9mQ2xpcHBlZFF1YWQpOgorICAgICAgICAo
V2ViQ29yZTo6Q0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6
Q0NNYXRoVXRpbDo6cHJvamVjdENsaXBwZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNDTWF0
aFV0aWw6Om1hcFF1YWQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NNYXRoVXRpbDo6cHJvamVjdFF1
YWQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKENDTWF0aFV0aWwpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlVW5vY2NsdWRlZENvbnRlbnRSZWN0KToKKwog
MjAxMi0wNC0wMiAgQWJoaXNoZWsgQXJ5YSAgPGluZmVybm9AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIDxzZWxlY3Q+IHNob3VsZG4ndCBpbnRydWRlIGFzIGEgcnVuLWluLgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwppbmRleCA1ZWJmN2U2YzM0YjBmMzVmY2RiMGQwNzA4YmFmZDVkNTY4M2QyNTgx
Li4yZDI1ZGVlZjMzYzA2ZmM4YTA1OWUwYTkyOThlMThkYmY0NzYxMGI5IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9t
aXVtL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDEyLTA0LTAyICBTaGF3biBTaW5naCAg
PHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gTmVlZCB0byBj
bGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFwcGx5aW5nIHRyYW5zZm9ybXMuCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MDgwNgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogdGVzdHMvQ0NM
YXllclRyZWVIb3N0Q29tbW9uVGVzdC5jcHA6CisgICAgICAgIChXZWJLaXRUZXN0czo6VEVTVCk6
CisgICAgICAgIChXZWJLaXRUZXN0cyk6CisKIDIwMTItMDQtMDIgIE1hcmsgUGlsZ3JpbSAgPHBp
bGdyaW1AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIENhbGwgZGVjcmVtZW50U3RhdHNDb3VudGVy
IGRpcmVjdGx5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggY2E0YTIwOWI1YmFlNjdlMjE2Nzg0NWNmOTg0
MGIzNjNlZjk2NTQ4YS4uZDZhOGYzYzA3Mzg5YTMwZjIzMzBiMGU3MjVkZDdlMzVmY2MyMWNiZiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUuZ3lwaQpAQCAtMzYyMSw2ICszNjIxLDggQEAKICAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1w
bC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5
ZXJUcmVlSG9zdEltcGwuaCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vY2MvQ0NNYXRoVXRpbC5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTWF0aFV0aWwuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2VyLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2VyLmgnLAogICAgICAgICAg
ICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT3ZlcmRyYXdNZXRyaWNzLmNwcCcs
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9M
YXllclJlbmRlcmVyQ2hyb21pdW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAppbmRleCBjY2IxZGQ4ZDBiMjlj
MzcyMjEzM2ZhYjZkZDgzNWE5YjQ4MjhiYjEwLi5kMmE4OTUzMTQ0MWY2OWMyZTNkZDI1NzcxMzJl
YmJiNmJlNDkzZGYxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKQEAg
LTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlICJjYy9DQ0RlYnVnQm9yZGVyRHJhd1F1YWQuaCIKICNp
bmNsdWRlICJjYy9DQ0xheWVySW1wbC5oIgogI2luY2x1ZGUgImNjL0NDTGF5ZXJUcmVlSG9zdENv
bW1vbi5oIgorI2luY2x1ZGUgImNjL0NDTWF0aFV0aWwuaCIKICNpbmNsdWRlICJjYy9DQ1Byb3h5
LmgiCiAjaW5jbHVkZSAiY2MvQ0NSZW5kZXJQYXNzLmgiCiAjaW5jbHVkZSAiY2MvQ0NSZW5kZXJT
dXJmYWNlRHJhd1F1YWQuaCIKQEAgLTU3Niw5ICs1NzcsMTEgQEAgc3RhdGljIHZvaWQgdGlsZVVu
aWZvcm1Mb2NhdGlvbihUIHByb2dyYW0sIFRpbGVQcm9ncmFtVW5pZm9ybXMmIHVuaWZvcm1zKQog
ICAgIHVuaWZvcm1zLmVkZ2VMb2NhdGlvbiA9IHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkuZWRn
ZUxvY2F0aW9uKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbmRUaWxlUHJvZ3JhbVVuaWZvcm1zKExh
eWVyUmVuZGVyZXJDaHJvbWl1bSogbGF5ZXJSZW5kZXJlciwgY29uc3QgQ0NUaWxlRHJhd1F1YWQq
IHF1YWQsIFRpbGVQcm9ncmFtVW5pZm9ybXMmIHVuaWZvcm1zKQorc3RhdGljIHZvaWQgZmluZFRp
bGVQcm9ncmFtVW5pZm9ybXMoTGF5ZXJSZW5kZXJlckNocm9taXVtKiBsYXllclJlbmRlcmVyLCBj
b25zdCBDQ1RpbGVEcmF3UXVhZCogcXVhZCwgVGlsZVByb2dyYW1Vbmlmb3JtcyYgdW5pZm9ybXMs
IGJvb2wgcXVhZElzQ2xpcHBlZCkKIHsKLSAgICBpZiAocXVhZC0+aXNBbnRpYWxpYXNlZCgpKSB7
CisgICAgLy8gRm9yIG5vdywgd2Ugc2ltcGx5IHNraXAgYW50aS1hbGlhc2luZyB3aXRoIHRoZSBx
dWFkIGlzIGNsaXBwZWQuIFRoaXMgb25seSBoYXBwZW5zCisgICAgLy8gb24gcGVyc3BlY3RpdmUg
dHJhbnNmb3JtZWQgbGF5ZXJzIHRoYXQgZ28gcGFydGlhbGx5IGJlaGluZCB0aGUgY2FtZXJhLgor
ICAgIGlmIChxdWFkLT5pc0FudGlhbGlhc2VkKCkgJiYgIXF1YWRJc0NsaXBwZWQpIHsKICAgICAg
ICAgaWYgKHF1YWQtPnN3aXp6bGVDb250ZW50cygpKSB7CiAgICAgICAgICAgICBjb25zdCBDQ1Rp
bGVkTGF5ZXJJbXBsOjpQcm9ncmFtU3dpenpsZUFBKiBwcm9ncmFtID0gbGF5ZXJSZW5kZXJlci0+
dGlsZXJQcm9ncmFtU3dpenpsZUFBKCk7CiAgICAgICAgICAgICB0aWxlVW5pZm9ybUxvY2F0aW9u
KHByb2dyYW0sIHVuaWZvcm1zKTsKQEAgLTY0MSw4ICs2NDQsMTcgQEAgdm9pZCBMYXllclJlbmRl
cmVyQ2hyb21pdW06OmRyYXdUaWxlUXVhZChjb25zdCBDQ1RpbGVEcmF3UXVhZCogcXVhZCkKICAg
ICBmbG9hdCBmcmFnbWVudFRleFNjYWxlWCA9IGNsYW1wUmVjdC53aWR0aCgpIC8gdGV4dHVyZVNp
emUud2lkdGgoKTsKICAgICBmbG9hdCBmcmFnbWVudFRleFNjYWxlWSA9IGNsYW1wUmVjdC5oZWln
aHQoKSAvIHRleHR1cmVTaXplLmhlaWdodCgpOwogCisKKyAgICBGbG9hdFF1YWQgbG9jYWxRdWFk
OworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGRldmljZVRyYW5zZm9ybSA9IFRyYW5zZm9ybWF0
aW9uTWF0cml4KHdpbmRvd01hdHJpeCgpICogcHJvamVjdGlvbk1hdHJpeCgpICogcXVhZC0+cXVh
ZFRyYW5zZm9ybSgpKS50bzJkVHJhbnNmb3JtKCk7CisgICAgaWYgKCFkZXZpY2VUcmFuc2Zvcm0u
aXNJbnZlcnRpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgY2xpcHBlZCA9IGZh
bHNlOworICAgIEZsb2F0UXVhZCBkZXZpY2VMYXllclF1YWQgPSBDQ01hdGhVdGlsOjptYXBRdWFk
KGRldmljZVRyYW5zZm9ybSwgRmxvYXRRdWFkKHF1YWQtPmxheWVyUmVjdCgpKSwgY2xpcHBlZCk7
CisKICAgICBUaWxlUHJvZ3JhbVVuaWZvcm1zIHVuaWZvcm1zOwotICAgIGZpbmRUaWxlUHJvZ3Jh
bVVuaWZvcm1zKHRoaXMsIHF1YWQsIHVuaWZvcm1zKTsKKyAgICBmaW5kVGlsZVByb2dyYW1Vbmlm
b3Jtcyh0aGlzLCBxdWFkLCB1bmlmb3JtcywgY2xpcHBlZCk7CiAKICAgICBHTEMoY29udGV4dCgp
LCBjb250ZXh0KCktPnVzZVByb2dyYW0odW5pZm9ybXMucHJvZ3JhbSkpOwogICAgIEdMQyhjb250
ZXh0KCksIGNvbnRleHQoKS0+dW5pZm9ybTFpKHVuaWZvcm1zLnNhbXBsZXJMb2NhdGlvbiwgMCkp
OwpAQCAtNjUxLDEzICs2NjMsOCBAQCB2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd1Rp
bGVRdWFkKGNvbnN0IENDVGlsZURyYXdRdWFkKiBxdWFkKQogICAgIEdMQyhjb250ZXh0KCksIGNv
bnRleHQoKS0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3Jh
cGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfTUlOX0ZJTFRFUiwgcXVhZC0+dGV4dHVyZUZpbHRlcigp
KSk7CiAgICAgR0xDKGNvbnRleHQoKSwgY29udGV4dCgpLT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNz
Q29udGV4dDNEOjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NQUdfRklM
VEVSLCBxdWFkLT50ZXh0dXJlRmlsdGVyKCkpKTsKIAotICAgIEZsb2F0UXVhZCBsb2NhbFF1YWQ7
Ci0gICAgaWYgKHF1YWQtPmlzQW50aWFsaWFzZWQoKSkgewotICAgICAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBkZXZpY2VUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1hdGlvbk1hdHJpeCh3aW5kb3dNYXRy
aXgoKSAqIHByb2plY3Rpb25NYXRyaXgoKSAqIHF1YWQtPnF1YWRUcmFuc2Zvcm0oKSkudG8yZFRy
YW5zZm9ybSgpOwotICAgICAgICBpZiAoIWRldmljZVRyYW5zZm9ybS5pc0ludmVydGlibGUoKSkK
LSAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBGbG9hdFF1YWQgZGV2aWNlTGF5ZXJRdWFk
ID0gZGV2aWNlVHJhbnNmb3JtLm1hcFF1YWQoRmxvYXRRdWFkKHF1YWQtPmxheWVyUmVjdCgpKSk7
CisgICAgaWYgKCFjbGlwcGVkICYmIHF1YWQtPmlzQW50aWFsaWFzZWQoKSkgewogCiAgICAgICAg
IENDTGF5ZXJRdWFkIGRldmljZUxheWVyQm91bmRzID0gQ0NMYXllclF1YWQoRmxvYXRRdWFkKGRl
dmljZUxheWVyUXVhZC5ib3VuZGluZ0JveCgpKSk7CiAgICAgICAgIGRldmljZUxheWVyQm91bmRz
LmluZmxhdGVBbnRpQWxpYXNpbmdEaXN0YW5jZSgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJU
cmVlSG9zdENvbW1vbi5jcHAKaW5kZXggNDE4ZGNhMTkwYjNlYmU2NDRhMjRhYzNlZTI4MmJiNWY1
YzkyOTYyZC4uNDM3NTljM2EwMzViMWY0YjhhNTEwNmRmZGE3OThiMTNlYmE1ZWM0ZiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXll
clRyZWVIb3N0Q29tbW9uLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwCkBAIC0zNyw2ICszNyw3IEBA
CiAjaW5jbHVkZSAiY2MvQ0NMYXllckltcGwuaCIKICNpbmNsdWRlICJjYy9DQ0xheWVySXRlcmF0
b3IuaCIKICNpbmNsdWRlICJjYy9DQ0xheWVyU29ydGVyLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRo
VXRpbC5oIgogI2luY2x1ZGUgImNjL0NDUmVuZGVyU3VyZmFjZS5oIgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CkBAIC00NCw3ICs0NSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIEludFJlY3QgQ0NM
YXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdChjb25zdCBJbnRSZWN0JiB0
YXJnZXRTdXJmYWNlUmVjdCwgY29uc3QgSW50UmVjdCYgbGF5ZXJCb3VuZFJlY3QsIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0pCiB7CiAgICAgLy8gSXMgdGhpcyBsYXllciBm
dWxseSBjb250YWluZWQgd2l0aGluIHRoZSB0YXJnZXQgc3VyZmFjZT8KLSAgICBJbnRSZWN0IGxh
eWVySW5TdXJmYWNlU3BhY2UgPSB0cmFuc2Zvcm0ubWFwUmVjdChsYXllckJvdW5kUmVjdCk7Cisg
ICAgSW50UmVjdCBsYXllckluU3VyZmFjZVNwYWNlID0gQ0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJl
Y3QodHJhbnNmb3JtLCBsYXllckJvdW5kUmVjdCk7CiAgICAgaWYgKHRhcmdldFN1cmZhY2VSZWN0
LmNvbnRhaW5zKGxheWVySW5TdXJmYWNlU3BhY2UpKQogICAgICAgICByZXR1cm4gbGF5ZXJCb3Vu
ZFJlY3Q7CiAKQEAgLTU5LDcgKzYwLDcgQEAgSW50UmVjdCBDQ0xheWVyVHJlZUhvc3RDb21tb246
OmNhbGN1bGF0ZVZpc2libGVSZWN0KGNvbnN0IEludFJlY3QmIHRhcmdldFN1cmZhY2UKICAgICAv
LyBheGlzLWFsaWduZWQpLCBidXQgaXMgYSByZWFzb25hYmxlIGZpbHRlciBvbiB0aGUgc3BhY2Ug
dG8gY29uc2lkZXIuCiAgICAgLy8gTm9uLWludmVydGlibGUgdHJhbnNmb3JtcyB3aWxsIGNyZWF0
ZSBhbiBlbXB0eSByZWN0IGhlcmUuCiAgICAgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXggc3Vy
ZmFjZVRvTGF5ZXIgPSB0cmFuc2Zvcm0uaW52ZXJzZSgpOwotICAgIEludFJlY3QgbGF5ZXJSZWN0
ID0gc3VyZmFjZVRvTGF5ZXIucHJvamVjdFF1YWQoRmxvYXRRdWFkKEZsb2F0UmVjdChtaW5pbWFs
U3VyZmFjZVJlY3QpKSkuZW5jbG9zaW5nQm91bmRpbmdCb3goKTsKKyAgICBJbnRSZWN0IGxheWVy
UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoQ0NNYXRoVXRpbDo6cHJvamVjdENsaXBwZWRSZWN0KHN1
cmZhY2VUb0xheWVyLCBGbG9hdFF1YWQoRmxvYXRSZWN0KG1pbmltYWxTdXJmYWNlUmVjdCkpKSk7
CiAgICAgbGF5ZXJSZWN0LmludGVyc2VjdChsYXllckJvdW5kUmVjdCk7CiAgICAgcmV0dXJuIGxh
eWVyUmVjdDsKIH0KQEAgLTcwLDcgKzcxLDYgQEAgc3RhdGljIGJvb2wgaXNTY2FsZU9yVHJhbnNs
YXRpb24oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG0pCiAgICAgICAgICAgICYmICFtLm0y
MSgpICYmICFtLm0yMygpICYmICFtLm0yNCgpCiAgICAgICAgICAgICYmICFtLm0zMSgpICYmICFt
Lm0zMigpICYmICFtLm00MygpCiAgICAgICAgICAgICYmIG0ubTQ0KCk7Ci0KIH0KIAogdGVtcGxh
dGU8dHlwZW5hbWUgTGF5ZXJUeXBlPgpAQCAtNDA5LDcgKzQwOSw3IEBAIHN0YXRpYyBib29sIGNh
bGN1bGF0ZURyYXdUcmFuc2Zvcm1zQW5kVmlzaWJpbGl0eUludGVybmFsKExheWVyVHlwZSogbGF5
ZXIsIExheWVyCiAgICAgICAgIGxheWVyLT5zZXREcmF3VHJhbnNmb3JtKGNvbWJpbmVkVHJhbnNm
b3JtKTsKICAgICAgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zvcm1Jc0FuaW1hdGluZyhhbmltYXRp
bmdUcmFuc2Zvcm1Ub1RhcmdldCk7CiAgICAgICAgIGxheWVyLT5zZXRTY3JlZW5TcGFjZVRyYW5z
Zm9ybUlzQW5pbWF0aW5nKGFuaW1hdGluZ1RyYW5zZm9ybVRvU2NyZWVuKTsKLSAgICAgICAgdHJh
bnNmb3JtZWRMYXllclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGxheWVyLT5kcmF3VHJhbnNmb3Jt
KCkubWFwUmVjdChsYXllclJlY3QpKTsKKyAgICAgICAgdHJhbnNmb3JtZWRMYXllclJlY3QgPSBl
bmNsb3NpbmdJbnRSZWN0KENDTWF0aFV0aWw6Om1hcENsaXBwZWRSZWN0KGxheWVyLT5kcmF3VHJh
bnNmb3JtKCksIGxheWVyUmVjdCkpOwogCiAgICAgICAgIGxheWVyLT5zZXREcmF3T3BhY2l0eShk
cmF3T3BhY2l0eSk7CiAgICAgICAgIGxheWVyLT5zZXREcmF3T3BhY2l0eUlzQW5pbWF0aW5nKGRy
YXdPcGFjaXR5SXNBbmltYXRpbmcpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRpbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5h
NjNiNGY2OGJkOTNiNmMxMzUwOGQyNDQyMGE3MDMwNzYxMDNhMmFhCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRp
bC5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKworI2luY2x1ZGUgImNjL0NDTWF0aFV0aWwuaCIKKworI2luY2x1ZGUgIkZsb2F0UG9pbnQz
ZC5oIgorI2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNs
dWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
cnVjdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgeworCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRl
KGRvdWJsZSBuZXdYLCBkb3VibGUgbmV3WSwgZG91YmxlIG5ld1osIGRvdWJsZSBuZXdXKQorICAg
ICAgICA6IHgobmV3WCkKKyAgICAgICAgLCB5KG5ld1kpCisgICAgICAgICwgeihuZXdaKQorICAg
ICAgICAsIHcobmV3VykKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBzaG91bGRCZUNsaXBwZWQo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHcgPD0gMDsKKyAgICB9CisKKyAgICBGbG9h
dFBvaW50IGNhcnRlc2lhblBvaW50MmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHcgPT0g
MSkKKyAgICAgICAgICAgIHJldHVybiBGbG9hdFBvaW50KHgsIHkpOworCisgICAgICAgIC8vIEZv
ciBub3csIGJlY2F1c2UgdGhpcyBjb2RlIGlzIHVzZWQgcHJpdmF0ZWx5IG9ubHkgYnkgQ0NNYXRo
VXRpbCwgaXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHcgPT0gMCwgYW5kIHdlIGRvIG5v
dCB5ZXQgbmVlZCB0byBoYW5kbGUgdGhhdCBjYXNlLgorICAgICAgICBBU1NFUlQodyk7CisgICAg
ICAgIGRvdWJsZSBpbnZXID0gMS4wIC8gdzsKKyAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnQoeCAq
IGludlcsIHkgKiBpbnZXKTsKKyAgICB9CisKKyAgICBkb3VibGUgeCwgeSwgeiwgdzsKK307CisK
K3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgcHJvamVjdFBvaW50KGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgZG91
YmxlIHggPSBwLngoKTsKKyAgICBkb3VibGUgeSA9IHAueSgpOworICAgIGRvdWJsZSB6ID0gLSh0
cmFuc2Zvcm0ubTEzKCkgKiB4ICsgdHJhbnNmb3JtLm0yMygpICogeSArIHRyYW5zZm9ybS5tNDMo
KSkgLyB0cmFuc2Zvcm0ubTMzKCk7CisgICAgLy8gaW1wbGljaXQgZGVmaW5pdGlvbiBvZiB3ID0g
MTsKKworICAgIGRvdWJsZSBvdXRYID0geCAqIHRyYW5zZm9ybS5tMTEoKSArIHkgKiB0cmFuc2Zv
cm0ubTIxKCkgKyB6ICogdHJhbnNmb3JtLm0zMSgpICsgdHJhbnNmb3JtLm00MSgpOworICAgIGRv
dWJsZSBvdXRZID0geCAqIHRyYW5zZm9ybS5tMTIoKSArIHkgKiB0cmFuc2Zvcm0ubTIyKCkgKyB6
ICogdHJhbnNmb3JtLm0zMigpICsgdHJhbnNmb3JtLm00MigpOworICAgIGRvdWJsZSBvdXRaID0g
eCAqIHRyYW5zZm9ybS5tMTMoKSArIHkgKiB0cmFuc2Zvcm0ubTIzKCkgKyB6ICogdHJhbnNmb3Jt
Lm0zMygpICsgdHJhbnNmb3JtLm00MygpOworICAgIGRvdWJsZSBvdXRXID0geCAqIHRyYW5zZm9y
bS5tMTQoKSArIHkgKiB0cmFuc2Zvcm0ubTI0KCkgKyB6ICogdHJhbnNmb3JtLm0zNCgpICsgdHJh
bnNmb3JtLm00NCgpOworCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIHVuY2xpcHBlZFByb2pl
Y3Rpb24ob3V0WCwgb3V0WSwgb3V0Wiwgb3V0Vyk7CisgICAgcmV0dXJuIHVuY2xpcHBlZFByb2pl
Y3Rpb247Cit9CisKK3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgbWFwUG9pbnQoY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sK
KyAgICBkb3VibGUgeCA9IHAueCgpOworICAgIGRvdWJsZSB5ID0gcC55KCk7CisgICAgLy8gaW1w
bGljaXQgZGVmaW5pdGlvbiBvZiB6ID0gMDsKKyAgICAvLyBpbXBsaWNpdCBkZWZpbml0aW9uIG9m
IHcgPSAxOworCisgICAgZG91YmxlIG91dFggPSB4ICogdHJhbnNmb3JtLm0xMSgpICsgeSAqIHRy
YW5zZm9ybS5tMjEoKSArIHRyYW5zZm9ybS5tNDEoKTsKKyAgICBkb3VibGUgb3V0WSA9IHggKiB0
cmFuc2Zvcm0ubTEyKCkgKyB5ICogdHJhbnNmb3JtLm0yMigpICsgdHJhbnNmb3JtLm00MigpOwor
ICAgIGRvdWJsZSBvdXRaID0geCAqIHRyYW5zZm9ybS5tMTMoKSArIHkgKiB0cmFuc2Zvcm0ubTIz
KCkgKyB0cmFuc2Zvcm0ubTQzKCk7CisgICAgZG91YmxlIG91dFcgPSB4ICogdHJhbnNmb3JtLm0x
NCgpICsgeSAqIHRyYW5zZm9ybS5tMjQoKSArIHRyYW5zZm9ybS5tNDQoKTsKKworICAgIEhvbW9n
ZW5lb3VzQ29vcmRpbmF0ZSBtYXBwZWRQb2ludChvdXRYLCBvdXRZLCBvdXRaLCBvdXRXKTsKKyAg
ICByZXR1cm4gbWFwcGVkUG9pbnQ7Cit9CisKK3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUg
Y29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UoY29uc3QgSG9tb2dlbmVvdXNDb29yZGluYXRlJiBo
MSwgY29uc3QgSG9tb2dlbmVvdXNDb29yZGluYXRlJiBoMikKK3sKKyAgICAvLyBQb2ludHMgaDEg
YW5kIGgyIGZvcm0gYSBsaW5lIGluIDRkLCBhbmQgYW55IHBvaW50IG9uIHRoYXQgbGluZSBjYW4g
YmUgcmVwcmVzZW50ZWQKKyAgICAvLyBhcyBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaDEgYW5k
IGgyOgorICAgIC8vICAgIHAgPSAoMS10KSBoMSArICh0KSBoMgorICAgIC8vCisgICAgLy8gV2Ug
d2FudCB0byBjb21wdXRlIHBvaW50IHAgc3VjaCB0aGF0IHAudyA9PSAwLiBUbyBkbyB0aGlzLCB3
ZSBzb2x2ZSBmb3IgdCBpbiB0aGUKKyAgICAvLyBmb2xsb3dpbmcgZXF1YXRpb246CisgICAgLy8g
ICBwLncgPSAwID0gKDEtdCkgKiBoMS53ICsgKHQpICogaDIudworICAgIC8vCisgICAgLy8gT25j
ZSBwYXJhbXRlciB0IGlzIGtub3duLCB0aGUgcmVzdCBvZiBwIGNhbiBiZSBjb21wdXRlZCB2aWEg
cCA9ICgxLXQpIGgxICsgKHQpIGgyLgorCisgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBpcyBhIHNw
ZWNpYWwgY2FzZSBvZiB0aGUgZm9sbG93aW5nIGFzc2VydGlvbiwgYnV0IGl0cyBhIGdvb2QgaWRl
YSB0byBrZWVwIGl0IGFuIGV4cGxpY2l0IHNhbml0eSBjaGVjayBoZXJlLgorICAgIEFTU0VSVCho
Mi53ICE9IGgxLncpOworICAgIC8vIEV4YWN0bHkgb25lIG9mIGgxIG9yIGgyIChidXQgbm90IGJv
dGgpIG11c3QgYmUgb24gdGhlIG5lZ2F0aXZlIHNpZGUgb2YgdGhlIHcgcGxhbmUgd2hlbiB0aGlz
IGlzIGNhbGxlZC4KKyAgICBBU1NFUlQoaDEuc2hvdWxkQmVDbGlwcGVkKCkgXiBoMi5zaG91bGRC
ZUNsaXBwZWQoKSk7CisKKyAgICBkb3VibGUgdCA9ICgtaDEudykgLyAoaDIudyAtIGgxLncpOwor
CisgICAgZG91YmxlIHggPSAoMS10KSAqIGgxLnggKyB0ICogaDIueDsKKyAgICBkb3VibGUgeSA9
ICgxLXQpICogaDEueSArIHQgKiBoMi55OworICAgIGRvdWJsZSB6ID0gKDEtdCkgKiBoMS56ICsg
dCAqIGgyLno7CisgICAgZG91YmxlIHcgPSAwLjAwMDAxOyAvLyBvciBhbnkgcG9zaXRpdmUgbm9u
LXplcm8gc21hbGwgZXBzaWxvbgorCisgICAgcmV0dXJuIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSh4
LCB5LCB6LCB3KTsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZUNsaXBwZWRWZXJ0aWNlc0ZvclRy
YW5zZm9ybWVkUXVhZChjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21v
Z2VuZW91c0Nvb3JkaW5hdGUmIGgyLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgzLCBj
b25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGg0LCBWZWN0b3I8SG9tb2dlbmVvdXNDb29yZGlu
YXRlPiYgdmVydGljZXNPZkNsaXBwZWRRdWFkKQoreworICAgIC8vIFBlcmZvcm0gY2xpcHBpbmcg
aW4gdGhpcyBzcGVjaWZpYyBvcmRlciBzbyB0aGF0IHZlcnRpY2VzIHdpbGwgcmV0YWluIHRoZWly
IENXIC8gQ0NXIHByb3BlcnR5LgorCisgICAgaWYgKCFoMS5zaG91bGRCZUNsaXBwZWQoKSkKKyAg
ICAgICAgdmVydGljZXNPZkNsaXBwZWRRdWFkLmFwcGVuZChoMSk7CisKKyAgICBpZiAoaDEuc2hv
dWxkQmVDbGlwcGVkKCkgXiBoMi5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgdmVydGljZXNP
ZkNsaXBwZWRRdWFkLmFwcGVuZChjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRnZShoMSwgaDIpKTsK
KworICAgIGlmICghaDIuc2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIHZlcnRpY2VzT2ZDbGlw
cGVkUXVhZC5hcHBlbmQoaDIpOworCisgICAgaWYgKGgyLnNob3VsZEJlQ2xpcHBlZCgpIF4gaDMu
c2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZC5hcHBlbmQo
Y29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UoaDIsIGgzKSk7CisKKyAgICBpZiAoIWgzLnNob3Vs
ZEJlQ2xpcHBlZCgpKQorICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQuYXBwZW5kKGgzKTsK
KworICAgIGlmIChoMy5zaG91bGRCZUNsaXBwZWQoKSBeIGg0LnNob3VsZEJlQ2xpcHBlZCgpKQor
ICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQuYXBwZW5kKGNvbXB1dGVDbGlwcGVkUG9pbnRG
b3JFZGdlKGgzLCBoNCkpOworCisgICAgaWYgKCFoNC5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAg
ICAgdmVydGljZXNPZkNsaXBwZWRRdWFkLmFwcGVuZChoNCk7CisKKyAgICBpZiAoaDQuc2hvdWxk
QmVDbGlwcGVkKCkgXiBoMS5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgdmVydGljZXNPZkNs
aXBwZWRRdWFkLmFwcGVuZChjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRnZShoNCwgaDEpKTsKK30K
Kworc3RhdGljIEZsb2F0UmVjdCBjb21wdXRlRW5jbG9zaW5nUmVjdE9mQ2xpcHBlZFF1YWQoY29u
c3QgVmVjdG9yPEhvbW9nZW5lb3VzQ29vcmRpbmF0ZT4mIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCkK
K3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIG9tcHV0ZXMgdGhlIDJkIEZsb2F0UmVjdCB0aGF0IGVu
Y2xvc2VzIHRoZSBjbGlwcGVkIHF1YWQuIE5vdGUgdGhhdAorICAgIC8vIGhlcmUgd2UgZmluYWxs
eSBjb252ZXJ0IGZyb20gaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuIGNvb3Jk
aW5hdGVzCisgICAgLy8gKGkuZS4gZGl2aWRlLWJ5LXcgaWYgbmVlZGVkKS4KKworICAgIGZsb2F0
IHhtaW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCk7CisgICAgZmxvYXQgeG1h
eCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptaW4oKTsKKyAgICBmbG9hdCB5bWluID0g
c3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpOworICAgIGZsb2F0IHltYXggPSBzdGQ6
Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHZlcnRpY2VzT2ZDbGlwcGVkUXVhZC5zaXplKCk7ICsraSkgeworICAgICAgICBGbG9hdFBv
aW50IGNsaXBwZWRQb2ludCA9IHZlcnRpY2VzT2ZDbGlwcGVkUXVhZFtpXS5jYXJ0ZXNpYW5Qb2lu
dDJkKCk7CisgICAgICAgIHhtaW4gPSBzdGQ6Om1pbihjbGlwcGVkUG9pbnQueCgpLCB4bWluKTsK
KyAgICAgICAgeG1heCA9IHN0ZDo6bWF4KGNsaXBwZWRQb2ludC54KCksIHhtYXgpOworICAgICAg
ICB5bWluID0gc3RkOjptaW4oY2xpcHBlZFBvaW50LnkoKSwgeW1pbik7CisgICAgICAgIHltYXgg
PSBzdGQ6Om1heChjbGlwcGVkUG9pbnQueSgpLCB5bWF4KTsKKyAgICB9CisKKyAgICBGbG9hdFJl
Y3QgcmVjdCA9IEZsb2F0UmVjdChGbG9hdFBvaW50KHhtaW4sIHltaW4pLCBGbG9hdFNpemUoeG1h
eCAtIHhtaW4sIHltYXggLSB5bWluKSk7CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK0ludFJlY3Qg
Q0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRy
YW5zZm9ybSwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCkKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5n
SW50UmVjdChtYXBDbGlwcGVkUmVjdCh0cmFuc2Zvcm0sIEZsb2F0UmVjdChzcmNSZWN0KSkpOwor
fQorCitGbG9hdFJlY3QgQ0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QoY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0KQoreworICAg
IC8vIFN0ZXAgMTogQXBwbHkgdGhlIHRyYW5zZm9ybSwgYnV0IHJldGFpbiB0aGUgcmVzdWx0IGlu
IGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVhZCBxID0gRmxvYXRRdWFkKEZs
b2F0UmVjdChzcmNSZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9p
bnQodHJhbnNmb3JtLCBxLnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1h
cFBvaW50KHRyYW5zZm9ybSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMg
PSBtYXBQb2ludCh0cmFuc2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRl
IGg0ID0gbWFwUG9pbnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgLy8gU3RlcCAyOiBDb2xs
ZWN0IHRoZSBsaXN0IG9mIHZlcnRpY2VzIHRoYXQgcmVwcmVzZW50IHRoZSBjbGlwcGVkIHF1YWQu
CisgICAgVmVjdG9yPEhvbW9nZW5lb3VzQ29vcmRpbmF0ZT4gdmVydGljZXNPZkNsaXBwZWRRdWFk
OworICAgIGNvbXB1dGVDbGlwcGVkVmVydGljZXNGb3JUcmFuc2Zvcm1lZFF1YWQoaDEsIGgyLCBo
MywgaDQsIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisKKyAgICAvLyBTdGVwIDM6IEFmdGVyIGhh
dmluZyBjbGlwcGVkLCBub3cgd2UgY2FuIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVz
IGFuZCBjb21wdXRlIHRoZSAyZCBlbmNsb3NpbmcgcmVjdCBvZiB0aGUgY2xpcHBlZCBwb2ludHMu
CisgICAgRmxvYXRSZWN0IGVuY2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkID0gY29tcHV0ZUVuY2xv
c2luZ1JlY3RPZkNsaXBwZWRRdWFkKHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisgICAgcmV0dXJu
IGVuY2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkOworfQorCitGbG9hdFJlY3QgQ0NNYXRoVXRpbDo6
cHJvamVjdENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0s
IGNvbnN0IEZsb2F0UXVhZCYgcSkKK3sKKyAgICAvLyBTdGVwIDE6IFBlcmZvcm0gdGhlIHByb2pl
Y3Rpb24sIGJ1dCByZXRhaW4gdGhlIHJlc3VsdCBpbiBob21vZ2VuZW91cyBjb29yZGluYXRlcy4K
KyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDEgPSBwcm9qZWN0UG9pbnQodHJhbnNmb3JtLCBx
LnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IHByb2plY3RQb2ludCh0cmFu
c2Zvcm0sIHEucDIoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgzID0gcHJvamVjdFBv
aW50KHRyYW5zZm9ybSwgcS5wMygpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDQgPSBw
cm9qZWN0UG9pbnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgLy8gU3RlcCAyOiBDb2xsZWN0
IHRoZSBsaXN0IG9mIHZlcnRpY2VzIHRoYXQgcmVwcmVzZW50IHRoZSBjbGlwcGVkIHF1YWQuCisg
ICAgVmVjdG9yPEhvbW9nZW5lb3VzQ29vcmRpbmF0ZT4gdmVydGljZXNPZkNsaXBwZWRRdWFkOwor
ICAgIGNvbXB1dGVDbGlwcGVkVmVydGljZXNGb3JUcmFuc2Zvcm1lZFF1YWQoaDEsIGgyLCBoMywg
aDQsIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisKKyAgICAvLyBTdGVwIDM6IEFmdGVyIGhhdmlu
ZyBjbGlwcGVkLCBub3cgd2UgY2FuIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzIGFu
ZCBjb21wdXRlIHRoZSAyZCBlbmNsb3NpbmcgcmVjdCBvZiB0aGUgY2xpcHBlZCBwb2ludHMuCisg
ICAgRmxvYXRSZWN0IGVuY2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkID0gY29tcHV0ZUVuY2xvc2lu
Z1JlY3RPZkNsaXBwZWRRdWFkKHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisgICAgcmV0dXJuIGVu
Y2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkOworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6bWFw
UXVhZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFF1
YWQmIHEsIGJvb2wmIGNsYW1wZWQpCit7CisgICAgLy8gRklYTUU6IHRoaXMgdmVyc2lvbiBvZiBt
YXBRdWFkIGlzIG1pc3NpbmcgYSB1c2VmdWwgb3B0aW1pemF0aW9uLCBpc0lkZW50aXR5T3JUcmFu
c2xhdGlvbigpLCB0aGF0IGlzIGF2YWlsYWJsZSBvbmx5IGluIFRyYW5zZm9ybWF0aW9uTWF0cml4
LmNwcAorCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9pbnQodHJhbnNmb3Jt
LCBxLnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1hcFBvaW50KHRyYW5z
Zm9ybSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMgPSBtYXBQb2ludCh0
cmFuc2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gbWFwUG9p
bnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgY2xhbXBlZCA9IGgxLnNob3VsZEJlQ2xpcHBl
ZCgpIHx8IGgyLnNob3VsZEJlQ2xpcHBlZCgpIHx8IGgzLnNob3VsZEJlQ2xpcHBlZCgpIHx8IGg0
LnNob3VsZEJlQ2xpcHBlZCgpOworCisgICAgLy8gUmVzdWx0IHdpbGwgYmUgaW52YWxpZCBpZiBj
bGFtcGVkID0gdHJ1ZS4gQnV0LCBjb21wdXRlIGl0IGFueXdheSBqdXN0IGluIGNhc2UsIHRvIGVt
dWxhdGUgZXhpc3RpbmcgYmVoYXZpb3IuCisgICAgRmxvYXRRdWFkIHJlc3VsdDsKKyAgICByZXN1
bHQuc2V0UDEoaDEuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICByZXN1bHQuc2V0UDIoaDIuY2Fy
dGVzaWFuUG9pbnQyZCgpKTsKKyAgICByZXN1bHQuc2V0UDMoaDMuY2FydGVzaWFuUG9pbnQyZCgp
KTsKKyAgICByZXN1bHQuc2V0UDQoaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICByZXR1cm4g
cmVzdWx0OworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6cHJvamVjdFF1YWQoY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRRdWFkJiBxLCBib29sJiBj
bGFtcGVkKQoreworICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOworICAgIGJvb2wgY2xhbXBl
ZFBvaW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3JtLnByb2plY3RQb2ludChx
LnAxKCksICZjbGFtcGVkUG9pbnQpKTsKKyAgICBjbGFtcGVkID0gY2xhbXBlZFBvaW50OworICAg
IHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAyKCksICZjbGFt
cGVkUG9pbnQpKTsKKyAgICBjbGFtcGVkIHw9IGNsYW1wZWRQb2ludDsKKyAgICBwcm9qZWN0ZWRR
dWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAmY2xhbXBlZFBvaW50KSk7
CisgICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7CisgICAgcHJvamVjdGVkUXVhZC5zZXRQNCh0
cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsYW1wZWRQb2ludCkpOworICAgIGNsYW1w
ZWQgfD0gY2xhbXBlZFBvaW50OworCisgICAgcmV0dXJuIHByb2plY3RlZFF1YWQ7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yM2U5NzE2
MGQxZjQwZTI1OWEyNTczNWQxYTZlNWRhZmMyNTEyMzBmCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRpbC5oCkBA
IC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ0NNYXRoVXRpbF9oCisjZGVm
aW5lIENDTWF0aFV0aWxfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFJlY3Q7
CitjbGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBGbG9hdFF1YWQ7CitjbGFzcyBUcmFuc2Zvcm1hdGlv
bk1hdHJpeDsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBtYXRoIGhlbHBlciBmdW5jdGlvbmFs
aXR5IHRoYXQgZG9lcyBub3QgYmVsb25nIGluIFdlYkNvcmUuCisvLyBJdCBpcyBwb3NzaWJsZSB0
aGF0IHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgbWlncmF0ZWQgdG8gV2ViQ29yZSBldmVu
dHVhbGx5LgorY2xhc3MgQ0NNYXRoVXRpbCB7CitwdWJsaWM6CisKKyAgICAvLyBCYWNrZ3JvdW5k
OiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjb2RlIGluIFdlYkNvcmUgZG9lcyBub3QgZG8gdGhlIHJp
Z2h0IHRoaW5nIGluCisgICAgLy8gbWFwUmVjdCAvIG1hcFF1YWQgLyBwcm9qZWN0UXVhZCB3aGVu
IHRoZXJlIGlzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiB0aGF0IGNhdXNlcworICAgIC8vIG9u
ZSBvZiB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgdG8gZ28gdG8gdyA8IDAuIEluIHRob3NlIGNh
c2VzLCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAvLyBwZXJmb3JtIGNsaXBwaW5nIGluIGhvbW9n
ZW5lb3VzIGNvb3JkaW5hdGVzLCBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3JtLCBiZWZvcmUK
KyAgICAvLyBkaXZpZGluZy1ieS13IHRvIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVz
LgorICAgIC8vCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgYXhpcy1hbGlnbmVk
IHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY29ycmVjdGx5IGNsaXBwZWQsCisgICAgLy8gdHJhbnNm
b3JtZWQgcG9seWdvbi4KKyAgICBzdGF0aWMgSW50UmVjdCBtYXBDbGlwcGVkUmVjdChjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEludFJlY3QmKTsKKyAgICBzdGF0aWMgRmxvYXRS
ZWN0IG1hcENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxv
YXRSZWN0Jik7CisgICAgc3RhdGljIEZsb2F0UmVjdCBwcm9qZWN0Q2xpcHBlZFJlY3QoY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFF1YWQmKTsKKworICAgIC8vIE5PVEU6
IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZG8gY29ycmVjdCBjbGlwcGluZyBhZ2FpbnN0IHcgPSAw
IHBsYW5lLCBidXQgaXQKKyAgICAvLyBjb3JyZWN0bHkgZGV0ZWN0cyB0aGUgY2xpcHBlZCBjb25k
aXRpb24gdmlhIHRoZSBib29sZWFuIGNsYW1wZWQuCisgICAgc3RhdGljIEZsb2F0UXVhZCBtYXBR
dWFkKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRRdWFkJiwgYm9vbCYg
Y2xhbXBlZCk7CisgICAgc3RhdGljIEZsb2F0UXVhZCBwcm9qZWN0UXVhZChjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UXVhZCYsIGJvb2wmIGNsYW1wZWQpOworfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gI2RlZmluZSBDQ01hdGhVdGlsX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDT2NjbHVzaW9uVHJhY2tlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwCmluZGV4IGE1NDExZWNjZjc2MTUx
ZWEzYmYwMDM1Y2Y5OThkMGJjYmRiMzI3YmIuLjY5ZmExMmNjZWU4MzA4N2EyMzAzMDFmYzkxZjU2
MTkyZDg1MTJhNDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2VyLmNwcApAQCAt
MzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgogI2luY2x1ZGUgImNj
L0NDTGF5ZXJJbXBsLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgogCiAjaW5jbHVkZSA8
YWxnb3JpdGhtPgogCkBAIC0yNzUsMjIgKzI3Niw2IEBAIHN0YXRpYyBpbmxpbmUgSW50UmVjdCBy
ZWN0U3VidHJhY3RSZWdpb24oY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgUmVnaW9uJiByZWdp
CiAgICAgcmV0dXJuIGJvdW5kc1JlY3Q7CiB9CiAKLXN0YXRpYyBGbG9hdFF1YWQgcHJvamVjdFF1
YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRRdWFk
JiBxLCBib29sJiBjbGFtcGVkKQotewotICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOwotICAg
IGJvb2wgY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3JtLnBy
b2plY3RQb2ludChxLnAxKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkID0gY2xhbXBl
ZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2ludChx
LnAyKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkIHw9IGNsYW1wZWRQb2ludDsKLSAg
ICBwcm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAmY2xh
bXBlZFBvaW50KSk7Ci0gICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7Ci0gICAgcHJvamVjdGVk
UXVhZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsYW1wZWRQb2ludCkp
OwotICAgIGNsYW1wZWQgfD0gY2xhbXBlZFBvaW50OwotCi0gICAgcmV0dXJuIHByb2plY3RlZFF1
YWQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgSW50UmVjdCBjb21wdXRlVW5vY2NsdWRlZENvbnRlbnRS
ZWN0KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgY29udGVudFNwYWNlVHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzY2lzc29yUmVjdCwgY29u
c3QgUmVnaW9uJiBvY2NsdXNpb24pCiB7CiAgICAgaWYgKCFjb250ZW50U3BhY2VUcmFuc2Zvcm0u
aXNJbnZlcnRpYmxlKCkpCkBAIC0zMDAsNyArMjg1LDcgQEAgc3RhdGljIGlubGluZSBJbnRSZWN0
IGNvbXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3Qs
IGMKICAgICAvLyBUYWtlIHRoZSBlbmNsb3NpbmdJbnRSZWN0IGF0IGVhY2ggc3RlcCwgYXMgd2Ug
d2FudCB0byBjb250YWluIGFueSB1bm9jY2x1ZGVkIHBhcnRpYWwgcGl4ZWxzIGluIHRoZSByZXN1
bHRpbmcgSW50UmVjdC4KICAgICBJbnRSZWN0IHNocnVua1JlY3QgPSByZWN0U3VidHJhY3RSZWdp
b24oaW50ZXJzZWN0aW9uKGVuY2xvc2luZ0ludFJlY3QodHJhbnNmb3JtZWRSZWN0KSwgc2Npc3Nv
clJlY3QpLCBvY2NsdXNpb24pOwogICAgIGJvb2wgY2xhbXBlZDsgLy8gRklYTUU6IHByb2plY3RR
dWFkIHJldHVybnMgaW52YWxpZCByZXN1bHRzIHdoZW4gYSBwb2ludCBnZXRzIGNsYW1wZWQuIFRv
IGJlIGZpeGVkIGluIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
ODA4MDYuCi0gICAgSW50UmVjdCB1bm9jY2x1ZGVkUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QocHJv
amVjdFF1YWQoY29udGVudFNwYWNlVHJhbnNmb3JtLmludmVyc2UoKSwgRmxvYXRRdWFkKEZsb2F0
UmVjdChzaHJ1bmtSZWN0KSksIGNsYW1wZWQpLmJvdW5kaW5nQm94KCkpOworICAgIEludFJlY3Qg
dW5vY2NsdWRlZFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KENDTWF0aFV0aWw6OnByb2plY3RRdWFk
KGNvbnRlbnRTcGFjZVRyYW5zZm9ybS5pbnZlcnNlKCksIEZsb2F0UXVhZChGbG9hdFJlY3Qoc2hy
dW5rUmVjdCkpLCBjbGFtcGVkKS5ib3VuZGluZ0JveCgpKTsKICAgICBpZiAoY2xhbXBlZCkKICAg
ICAgICAgcmV0dXJuIGNvbnRlbnRSZWN0OwogICAgIC8vIFRoZSByZWN0IGJhY2sgaW4gY29udGVu
dCBzcGFjZSBpcyBhIGJvdW5kaW5nIGJveCBhbmQgbWF5IGV4dGVuZCBvdXRzaWRlIG9mIHRoZSBv
cmlnaW5hbCBjb250ZW50UmVjdCwgc28gY2xhbXAgaXQgdG8gdGhlIGNvbnRlbnRSZWN0Qm91bmRz
LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhv
c3RDb21tb25UZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRy
ZWVIb3N0Q29tbW9uVGVzdC5jcHAKaW5kZXggNGE5NjU5ZGRkMTUzZWZmNmU2NzUyZWEyMDcwNmUy
M2M3ZTEyNGI2NC4uNzVhYzVlODNiYmM4MDhlNTNlYWIzMTllZTA4ZWRmMTg0YWM5Y2E1YSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhvc3RDb21t
b25UZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVl
SG9zdENvbW1vblRlc3QuY3BwCkBAIC05NzksNiArOTc5LDI1MiBAQCBURVNUKENDTGF5ZXJUcmVl
SG9zdENvbW1vblRlc3QsIHZlcmlmeUFuaW1hdGlvbnNGb3JSZW5kZXJTdXJmYWNlSGllcmFyY2h5
KQogICAgIEVYUEVDVF9GTE9BVF9FUSg1LjAsIGdyYW5kQ2hpbGRPZlJTMi0+c2NyZWVuU3BhY2VU
cmFuc2Zvcm0oKS5tNDIoKSk7CiB9CiAKK1RFU1QoQ0NMYXllclRyZWVIb3N0Q29tbW9uVGVzdCwg
dmVyaWZ5VmlzaWJsZVJlY3RGb3JJZGVudGl0eVRyYW5zZm9ybSkKK3sKKyAgICAvLyBUZXN0IHRo
ZSBjYWxjdWxhdGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSBmb3IgaWRl
bnRpdHkgdHJhbnNmb3Jtcy4KKworICAgIEludFJlY3QgdGFyZ2V0U3VyZmFjZVJlY3QgPSBJbnRS
ZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBDYXNlIDE6IExheWVy
IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cmZhY2UuCisgICAgSW50UmVjdCBsYXllckNvbnRl
bnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgxMCwgMTApLCBJbnRTaXplKDMwLCAzMCkpOworICAg
IEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDEwLCAxMCksIEludFNpemUoMzAs
IDMwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1
bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBh
Y3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBMYXllciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJl
Y3QuCisgICAgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMTIwLCAxMjApLCBJ
bnRTaXplKDMwLCAzMCkpOworICAgIGFjdHVhbCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2Fs
Y3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfVFJVRShhY3R1YWwuaXNFbXB0eSgp
KTsKKworICAgIC8vIENhc2UgMzogTGF5ZXIgaXMgcGFydGlhbGx5IG92ZXJsYXBwaW5nIHRoZSBz
dXJmYWNlIHJlY3QuCisgICAgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoODAs
IDgwKSwgSW50U2l6ZSgzMCwgMzApKTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQo
ODAsIDgwKSwgSW50U2l6ZSgyMCwgMjApKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RD
b21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRl
bnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VR
KGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3Qs
IHZlcmlmeVZpc2libGVSZWN0Rm9yVHJhbnNsYXRpb25zKQoreworICAgIC8vIFRlc3QgdGhlIGNh
bGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5IGZvciBzY2FsaW5n
IHRyYW5zZm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJ
bnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIEludFJlY3QgbGF5ZXJDb250
ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBD
YXNlIDE6IExheWVyIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cmZhY2UuCisgICAgbGF5ZXJU
b1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0udHJhbnNsYXRlKDEwLCAxMCk7CisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3Qo
SW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBD
Q0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VS
ZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQ
RUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBMYXll
ciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRl
KDEyMCwgMTIwKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0
ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRv
U3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisK
KyAgICAvLyBDYXNlIDM6IExheWVyIGlzIHBhcnRpYWxseSBvdmVybGFwcGluZyB0aGUgc3VyZmFj
ZSByZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAg
IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg4MCwgODApOworICAgIGV4cGVjdGVk
ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgyMCwgMjApKTsKKyAgICBhY3R1YWwg
PSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZh
Y2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAg
RVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJU
cmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yMkRSb3RhdGlvbnMpCit7Cisg
ICAgLy8gVGVzdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3b3JrcyBjb3Jy
ZWN0bHkgZm9yIHJvdGF0aW9ucyBhYm91dCB6LWF4aXMgKGkuZS4gMkQgcm90YXRpb25zKS4KKyAg
ICAvLyBSZW1lbWJlciB0aGF0IGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgc2hvdWxkIHJldHVybiB0
aGUgdmlzaWJsZSByZWN0IGluIHRoZSBsYXllcidzIHNwYWNlLgorCisgICAgSW50UmVjdCB0YXJn
ZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMTAwLCAxMDAp
KTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDAp
LCBJbnRTaXplKDMwLCAzMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJm
YWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBMYXllciBpcyBjb250YWluZWQgd2l0aGlu
IHRoZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgp
OworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgNTApOworICAgIGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAgSW50UmVjdCBleHBlY3RlZCA9
IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgSW50UmVjdCBh
Y3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdl
dFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7
CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2Fz
ZSAyOiBMYXllciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5ZXJUb1N1cmZh
Y2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
dHJhbnNsYXRlKC01MCwgMCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlKDQ1
KTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVS
ZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRy
YW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisKKyAgICAvLyBD
YXNlIDM6IFRoZSBsYXllciBpcyByb3RhdGVkIGFib3V0IGl0cyB0b3AtbGVmdCBjb3JuZXIuIElu
IHN1cmZhY2Ugc3BhY2UsIHRoZSBsYXllcgorICAgIC8vICAgICAgICAgaXMgb3JpZW50ZWQgZGlh
Z29uYWxseSwgd2l0aCB0aGUgbGVmdCBoYWxmIG91dHNpZGUgb2YgdGhlIHJlbmRlclN1cmZhY2Uu
IEluCisgICAgLy8gICAgICAgICB0aGlzIGNhc2UsIHRoZSB2aXNpYmxlIHJlY3Qgc2hvdWxkIHN0
aWxsIGJlIHRoZSBlbnRpcmUgbGF5ZXIgKHJlbWVtYmVyIHRoZQorICAgIC8vICAgICAgICAgdmlz
aWJsZSByZWN0IGlzIGNvbXB1dGVkIGluIGxheWVyIHNwYWNlKTsgYm90aCB0aGUgdG9wLWxlZnQg
YW5kCisgICAgLy8gICAgICAgICBib3R0b20tcmlnaHQgY29ybmVycyBvZiB0aGUgbGF5ZXIgYXJl
IHN0aWxsIHZpc2libGUuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5
KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlKDQ1KTsKKyAgICBleHBlY3Rl
ZCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgYWN0dWFs
ID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJm
YWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAg
IEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgNDog
VGhlIGxheWVyIGlzIHJvdGF0ZWQgYWJvdXQgaXRzIHRvcC1sZWZ0IGNvcm5lciwgYW5kIHRyYW5z
bGF0ZWQgdXB3YXJkcy4gSW4KKyAgICAvLyAgICAgICAgIHN1cmZhY2Ugc3BhY2UsIHRoZSBsYXll
ciBpcyBvcmllbnRlZCBkaWFnb25hbGx5LCB3aXRoIG9ubHkgdGhlIHRvcCBjb3JuZXIKKyAgICAv
LyAgICAgICAgIG9mIHRoZSBzdXJmYWNlIG92ZXJsYXBwaW5nIHRoZSBsYXllci4gSW4gbGF5ZXIg
c3BhY2UsIHRoZSByZW5kZXIgc3VyZmFjZQorICAgIC8vICAgICAgICAgb3ZlcmxhcHMgdGhlIHJp
Z2h0IHNpZGUgb2YgdGhlIGxheWVyLiBUaGUgdmlzaWJsZSByZWN0IHNob3VsZCBiZSB0aGUKKyAg
ICAvLyAgICAgICAgIGxheWVyJ3MgcmlnaHQgaGFsZi4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5z
Zm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xh
dGUoMCwgLXNxcnQoMikgKiAxNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRl
KDQ1KTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoMTUsIDApLCBJbnRTaXplKDE1
LCAzMCkpOyAvLyByaWdodCBoYWxmIG9mIGxheWVyIGJvdW5kcy4KKyAgICBhY3R1YWwgPSBDQ0xh
eWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0
LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNU
X0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9z
dENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yM2RPcnRob2dyYXBoaWNUcmFuc2Zvcm0p
Cit7CisgICAgLy8gVGVzdCB0aGF0IHRoZSBjYWxjdWxhdGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9u
IHdvcmtzIGNvcnJlY3RseSBmb3IgM2QgdHJhbnNmb3Jtcy4KKworICAgIEludFJlY3QgdGFyZ2V0
U3VyZmFjZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7
CisgICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwg
SW50U2l6ZSgxMDAsIDEwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJm
YWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBPcnRob2dyYXBoaWMgcHJvamVjdGlvbiBv
ZiBhIGxheWVyIHJvdGF0ZWQgYWJvdXQgeS1heGlzIGJ5IDQ1IGRlZ3JlZXMsIHNob3VsZCBiZSBm
dWxseSBjb250YWluZWQgaW4gdGhlIHJlbmRlclN1cmZhY2UuCisgICAgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90
YXRlM2QoMCwgNDUsIDApOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50
KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVy
VHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBs
YXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lO
VF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBPcnRob2dyYXBo
aWMgcHJvamVjdGlvbiBvZiBhIGxheWVyIHJvdGF0ZWQgYWJvdXQgeS1heGlzIGJ5IDQ1IGRlZ3Jl
ZXMsIGJ1dAorICAgIC8vICAgICAgICAgc2hpZnRlZCB0byB0aGUgc2lkZSBzbyBvbmx5IHRoZSBy
aWdodC1oYWxmIHRoZSBsYXllciB3b3VsZCBiZSB2aXNpYmxlIG9uCisgICAgLy8gICAgICAgICB0
aGUgc3VyZmFjZS4KKyAgICBkb3VibGUgaGFsZldpZHRoT2ZSb3RhdGVkTGF5ZXIgPSAoMTAwLjAg
LyBzcXJ0KDIpKSAqIDAuNTsgLy8gMTAwLjAgaXMgdGhlIHVuLXJvdGF0ZWQgbGF5ZXIgd2lkdGg7
IGRpdmlkZWQgYnkgc3FydCgyKSBpcyB0aGUgcm90YXRlZCB3aWR0aC4KKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bS50cmFuc2xhdGUoLWhhbGZXaWR0aE9mUm90YXRlZExheWVyLCAwKTsKKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7IC8vIHJvdGF0ZXMgYWJvdXQgdGhlIGxl
ZnQgZWRnZSBvZiB0aGUgbGF5ZXIKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoNTAs
IDApLCBJbnRTaXplKDUwLCAxMDApKTsgLy8gcmlnaHQgaGFsZiBvZiB0aGUgbGF5ZXIuCisgICAg
YWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJn
ZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0p
OworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChD
Q0xheWVyVHJlZUhvc3RDb21tb25UZXN0LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjNkUGVyc3BlY3Rp
dmVUcmFuc2Zvcm0pCit7CisgICAgLy8gVGVzdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBm
dW5jdGlvbiB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgbGF5ZXIgaGFzIGEKKyAgICAvLyBwZXJz
cGVjdGl2ZSBwcm9qZWN0aW9uIG9udG8gdGhlIHRhcmdldCBzdXJmYWNlLgorCisgICAgSW50UmVj
dCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMTAw
LCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50
KC01MCwgLTUwKSwgSW50U2l6ZSgyMDAsIDIwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBFdmVuIHRob3VnaCB0
aGUgbGF5ZXIgaXMgdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIHN1cmZhY2UsIGR1ZSB0byBwZXJzcGVj
dGl2ZQorICAgIC8vICAgICAgICAgZm9yZXNob3J0ZW5pbmcsIHRoZSBsYXllciB3aWxsIGZpdCBm
dWxseSBpbiB0aGUgc3VyZmFjZSB3aGVuIGl0cyB0cmFuc2xhdGVkCisgICAgLy8gICAgICAgICBt
b3JlIHRoYW4gdGhlIHBlcnNwZWN0aXZlIGFtb3VudC4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5z
Zm9ybS5tYWtlSWRlbnRpdHkoKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2Yg
dHJhbnNmb3JtcyBhcHBsaWVzIHRoZSBwZXJzcGVjdGl2ZSBhYm91dCB0aGUgY2VudGVyIG9mIHRo
ZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgNTAp
OworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLmFwcGx5UGVyc3BlY3RpdmUoOSk7CisgICAg
bGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgLTUwKTsKKworICAgIC8vIFRo
aXMgdHJhbnNsYXRlIHBsYWNlcyB0aGUgbGF5ZXIgaW4gZnJvbnQgb2YgdGhlIHN1cmZhY2UncyBw
cm9qZWN0aW9uIHBsYW5lLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZTNk
KDAsIDAsIC0yMCk7CisKKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgt
NTAsIC01MCksIEludFNpemUoMjAwLCAyMDApKTsKKyAgICBJbnRSZWN0IGFjdHVhbCA9IENDTGF5
ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3Qs
IGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1Rf
SU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7CisKKyAgICAvLyBDYXNlIDI6IHNhbWUgcHJv
amVjdGlvbiBhcyBiZWZvcmUsIGV4Y2VwdCB0aGF0IHRoZSBsYXllciBpcyBhbHNvIHRyYW5zbGF0
ZWQgdG8gdGhlCisgICAgLy8gICAgICAgICBzaWRlLCBzbyB0aGF0IG9ubHkgdGhlIHJpZ2h0IGhh
bGYgb2YgdGhlIGxheWVyIHNob3VsZCBiZSB2aXNpYmxlLgorICAgIC8vCisgICAgLy8gRXhwbGFu
YXRpb24gb2YgZXhwZWN0ZWQgcmVzdWx0OgorICAgIC8vIFRoZSBwZXJzcGVjdGl2ZSByYXRpbyBp
cyAoeiBkaXN0YW5jZSBiZXR3ZWVuIGxheWVyIGFuZCBjYW1lcmEgb3JpZ2luKSAvICh6IGRpc3Rh
bmNlIGJldHdlZW4gcHJvamVjdGlvbiBwbGFuZSBhbmQgY2FtZXJhIG9yaWdpbikgPT0gKC0yOSAv
IDkpCisgICAgLy8gVGhlbiwgYnkgc2ltaWxhciB0cmlhbmdsZXMsIGlmIHdlIHdhbnQgdG8gbW92
ZSBhIGxheWVyIGJ5IHRyYW5zbGF0aW5nIC01MCB1bml0cyBpbiBwcm9qZWN0ZWQgc3VyZmFjZSB1
bml0cyAoc28gdGhhdCBvbmx5IGhhbGYgb2YgaXQgaXMKKyAgICAvLyB2aXNpYmxlKSwgdGhlbiB3
ZSB3b3VsZCBuZWVkIHRvIHRyYW5zbGF0ZSBieSAoLTI5IC8gOSkgKiAtNTAgPT0gLTE2MS4xMTEx
IGluIHRoZSBsYXllcidzIHVuaXRzLgorICAgIC8vCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0udHJhbnNsYXRlM2QoLTE2MS4xMTExMTExMTExMTEsIDAsIDApOworICAgIGV4cGVjdGVkID0g
SW50UmVjdChJbnRQb2ludCg1MCwgLTUwKSwgSW50U2l6ZSgxMDAsIDIwMCkpOyAvLyBUaGUgcmln
aHQgaGFsZiBvZiB0aGUgbGF5ZXIncyBib3VuZGluZyByZWN0LgorICAgIGFjdHVhbCA9IENDTGF5
ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3Qs
IGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1Rf
SU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXllclRyZWVIb3N0
Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZE9ydGhvZ3JhcGhpY0lzTm90Q2xpcHBl
ZEJlaGluZFN1cmZhY2UpCit7CisgICAgLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIGV4cGxpY2l0
IGNvbmNlcHQgb2YgYW4gb3J0aG9ncmFwaGljIHByb2plY3Rpb24gcGxhbmUgaW4gb3VyCisgICAg
Ly8gY29kZSAobm9yIGluIHRoZSBDU1Mgc3BlYyB0byBteSBrbm93bGVkZ2UpLiBUaGVyZWZvcmUs
IGxheWVycyB0aGF0IGFyZSB0ZWNobmljYWxseQorICAgIC8vIGJlaGluZCB0aGUgc3VyZmFjZSBp
biBhbiBvcnRob2dyYXBoaWMgd29ybGQgc2hvdWxkIG5vdCBiZSBjbGlwcGVkIHdoZW4gdGhleSBh
cmUKKyAgICAvLyBmbGF0dGVuZWQgdG8gdGhlIHN1cmZhY2UuCisKKyAgICBJbnRSZWN0IHRhcmdl
dFN1cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkp
OworICAgIEludFJlY3QgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCks
IEludFNpemUoMTAwLCAxMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybTsKKworICAgIC8vIFRoaXMgc2VxdWVuY2Ugb2YgdHJhbnNmb3JtcyBlZmZl
Y3RpdmVseSByb3RhdGVzIHRoZSBsYXllciBhYm91dCB0aGUgeS1heGlzIGF0IHRoZQorICAgIC8v
IGNlbnRlciBvZiB0aGUgbGF5ZXIuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlk
ZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKDUwLCAwKTsK
KyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7CisgICAgbGF5
ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgMCk7CisKKyAgICBJbnRSZWN0IGV4
cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAg
IEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxl
UmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30K
KworCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9y
M2RQZXJzcGVjdGl2ZUlzQ2xpcHBlZCkKK3sKKyAgICAvLyBUZXN0IHRoZSBjYWxjdWxhdGVWaXNp
YmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIHByb2plY3RpbmcgYSBzdXJm
YWNlCisgICAgLy8gb250byBhIGxheWVyLCBidXQgdGhlIGxheWVyIGlzIHBhcnRpYWxseSBiZWhp
bmQgdGhlIGNhbWVyYSAobm90IGp1c3QgYmVoaW5kIHRoZQorICAgIC8vIHByb2plY3Rpb24gcGxh
bmUpLiBJbiB0aGlzIGNhc2UsIHRoZSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgbWF5IHNlZW0gdG8g
YmUgdmFsaWQsCisgICAgLy8gYnV0IGFjdHVhbGx5IHRoZXkgYXJlIG5vdC4gVGhlIHZpc2libGVS
ZWN0IG5lZWRzIHRvIGJlIHByb3Blcmx5IGNsaXBwZWQgYnkgdGhlCisgICAgLy8gdyA9IDAgcGxh
bmUgaW4gaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMgYmVmb3JlIGNvbnZlcnRpbmcgdG8gY2FydGVz
aWFuIGNvb3JkaW5hdGVzLgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJl
Y3QoSW50UG9pbnQoLTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBs
YXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xKSwgSW50U2l6ZSgyMCwg
MikpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOwor
CisgICAgLy8gVGhlIGxheWVyIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgcmlnaHQgaGFsZiBv
ZiB0aGUgbGF5ZXIgc2hvdWxkIGJlIGluIGZyb250IG9mCisgICAgLy8gdGhlIGNhbWVyYSwgd2hp
bGUgdGhlIG90aGVyIGhhbGYgaXMgYmVoaW5kIHRoZSBzdXJmYWNlJ3MgcHJvamVjdGlvbiBwbGFu
ZS4gVGhlCisgICAgLy8gZm9sbG93aW5nIHNlcXVlbmNlIG9mIHRyYW5zZm9ybXMgYXBwbGllcyB0
aGUgcGVyc3BlY3RpdmUgYW5kIHJvdGF0aW9uIGFib3V0IHRoZQorICAgIC8vIGNlbnRlciBvZiB0
aGUgbGF5ZXIuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7Cisg
ICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCAxKTsKKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7CisKKyAgICBpbnQgZXhwZWN0ZWRYUG9z
aXRpb24gPSAtMTA7CisgICAgaW50IGV4cGVjdGVkV2lkdGggPSAxMDsKKyAgICBJbnRSZWN0IGFj
dHVhbCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0
U3VyZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsK
KyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRYUG9zaXRpb24sIGFjdHVhbC54KCkpOworICAgIEVYUEVD
VF9FUShleHBlY3RlZFdpZHRoLCBhY3R1YWwud2lkdGgoKSk7Cit9CisKK1RFU1QoQ0NMYXllclRy
ZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3JQZXJzcGVjdGl2ZVVucHJvamVj
dGlvbikKK3sKKyAgICAvLyBUbyBkZXRlcm1pbmUgdmlzaWJsZVJlY3QgaW4gbGF5ZXIgc3BhY2Us
IHRoZXJlIG5lZWRzIHRvIGJlIGFuIHVuLXByb2plY3Rpb24gZnJvbQorICAgIC8vIHN1cmZhY2Ug
c3BhY2UgdG8gbGF5ZXIgc3BhY2UuIFdoZW4gdGhlIG9yaWdpbmFsIHRyYW5zZm9ybSB3YXMgYSBw
ZXJzcGVjdGl2ZQorICAgIC8vIHByb2plY3Rpb24gdGhhdCB3YXMgY2xpcHBlZCwgaXQgcmV0dXJu
cyBhIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY2xpcHBlZCBib3VuZHMuCisgICAgLy8gVW4tcHJv
amVjdGluZyB0aGlzIG5ldyByZWN0IG1heSByZXF1aXJlIGNsaXBwaW5nIGFnYWluLgorCisgICAg
Ly8gVGhpcyBzZXF1ZW5jZSBvZiB0cmFuc2Zvcm1zIGNhdXNlcyBvbmUgY29ybmVyIG9mIHRoZSBs
YXllciB0byBwcm90cnVkZSBhY3Jvc3MgdGhlIHcgPSAwIHBsYW5lLCBhbmQgc2hvdWxkIGJlIGNs
aXBwZWQuCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQo
LTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBsYXllckNvbnRlbnRS
ZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIwKSk7CisgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisgICAgbGF5ZXJU
b1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50
cmFuc2xhdGUzZCgwLCAwLCAtNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRl
M2QoMCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZTNkKDgwLCAw
LCAwKTsKKworICAgIC8vIE9ubHkgdGhlIGNvcm5lciBvZiB0aGUgbGF5ZXIgaXMgbm90IHZpc2li
bGUgb24gdGhlIHN1cmZhY2UgYmVjYXVzZSBvZiBiZWluZworICAgIC8vIGNsaXBwZWQuIEJ1dCwg
dGhlIG5ldCByZXN1bHQgb2Ygcm91bmRpbmcgdmlzaWJsZSByZWdpb24gdG8gYW4gYXhpcy1hbGln
bmVkIHJlY3QgaXMKKyAgICAvLyB0aGF0IHRoZSBlbnRpcmUgbGF5ZXIgc2hvdWxkIHN0aWxsIGJl
IGNvbnNpZGVyZWQgdmlzaWJsZS4KKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQ
b2ludCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBD
Q0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VS
ZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQ
RUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCiAvLyBGSVhNRToKIC8vIGNv
bnRpbnVlIHdvcmtpbmcgb24gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTY4OTQyCiAvLyAgLSBhZGQgYSB0ZXN0IHRvIHZlcmlmeSBjbGlwcGluZyB0aGF0IGNoYW5nZXMg
dGhlICJjZW50ZXIgcG9pbnQiCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135357</attachid>
            <date>2012-04-03 10:31:49 -0700</date>
            <delta_ts>2012-04-03 17:38:51 -0700</delta_ts>
            <desc>Should compile on linux now</desc>
            <filename>bug-80806-20120403103148.patch</filename>
            <type>text/plain</type>
            <size>42196</size>
            <attacher name="Shawn Singh">shawnsingh</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzMDQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGIxZWU2MjVkOTgxZjll
N2Q0NDY5YzkzYzI0MWJhYjYwOGExYjk3My4uZjAwYWVjZGQzMTM1MzYwMDJlNDI0ZDkxYjdjYTZi
ODYxZjMxODk1YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYyIEBACisyMDEyLTA0LTAyICBTaGF3
biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
TmVlZCB0byBjbGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFwcGx5aW5nIHRyYW5z
Zm9ybXMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
MDgwNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVu
aXQgdGVzdHMgYWRkZWQgdG8gQ0NMYXllclRyZWVIb3N0Q29tbW9uLiBUaGlzIGNoYW5nZSBpcyBh
bHNvCisgICAgICAgIGNvdmVyZWQgYnkgb3RoZXIgZXhpc3RpbmcgdW5pdCB0ZXN0cyBhbmQgbGF5
b3V0IHRlc3RzLgorCisgICAgICAgIFdlYkNvcmUgVHJhbnNmb3JtYXRpb25NYXRyaXggbWFwUmVj
dCAvIG1hcFF1YWQgLyBwcm9qZWN0UXVhZCBkbworICAgICAgICBub3QgcHJvcGVybHkgaGFuZGxl
IHRoZSBjYXNlIHdoZXJlIGEgc3VyZmFjZSBpcyBvcmllbnRlZCBwYXJ0aWFsbHkKKyAgICAgICAg
YmVoaW5kIHRoZSBjYW1lcmEsIHdpdGggYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLiBJbiB0aGlz
IGNhc2UsCisgICAgICAgIHByb2plY3RlZCBwb2ludHMgbWF5IGFwcGVhciB0byBiZSB2YWxpZCBp
biBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMsCisgICAgICAgIGJ1dCB0aGV5IGFyZSBpbmRlZWQgbm90
IHZhbGlkLCBhbmQgdGhleSBjYW4gb25seSBiZSBkZXRlY3RlZCBpbgorICAgICAgICBob21vZ2Vu
ZW91cyBjb29yZGluYXRlcyBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3JtLCBiZWZvcmUgdGhl
CisgICAgICAgIGRpdmlkZS1ieS13IHN0ZXAuCisKKyAgICAgICAgVGhlIGNvcnJlY3Qgc29sdXRp
b24gaXMgdG8gY2xpcCBnZW9tZXRyeSB3aGVyZSB3IDwgMC4gVGhpcyBwYXRjaAorICAgICAgICBt
YWtlcyB0aGlzIGNoYW5nZSBsb2NhbCB0byBjaHJvbWl1bSBvbmx5LCB0byBmaXggcmVuZGVyaW5n
IGJ1Z3MKKyAgICAgICAgdGhhdCBhcmlzZSBmcm9tIHRoaXMgcHJvYmxlbTsgU2FmYXJpIGRvZXMg
bm90IGhhdmUgdGhlc2UgYnVncworICAgICAgICBiZWNhdXNlIGl0IGRvZXMgbm90IHVzZSB0aGUg
dHJhbnNmb3JtcyBvdXRzaWRlIG9mIHRoZSBHUFUgKHdoaWNoCisgICAgICAgIGRvZXMgY29ycmVj
dGx5IGhhbmRsZSB0aGlzIGNhc2UpLiBUaGUgcHJpbWFyeSBmaXggaXMgdG8gY29ycmVjdAorICAg
ICAgICBjYWxjdWxhdGVWaXNpYmxlTGF5ZXJSZWN0KCksIGJ1dCBvdGhlciBhbmNpbGxhcnkgbG9j
YXRpb25zIGFyZQorICAgICAgICBhbHNvIGZpeGVkLCBpbiBwYXJ0aWN1bGFyLCB0aGUgYW50aWFs
aWFzaW5nIGNvZGUgcGF0aCBpcyBzaW1wbHkKKyAgICAgICAgc2tpcHBlZCB3aGVuIHRoaXMgY2Fz
ZSBhcmlzZXMuCisKKyAgICAgICAgRXZlbnR1YWxseSB0aGlzIG1hdGggbmVlZHMgdG8gYmUgbWVy
Z2VkIGludG8gVHJhbnNmb3JtYXRpb25NYXRyaXgsCisgICAgICAgIHRvIGZpeCBoaXQtdGVzdGlu
ZyBidWdzIHRoYXQgb2NjdXIgaW4gYm90aCBDaHJvbWl1bSBhbmQgU2FmYXJpLgorCisgICAgICAg
ICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpmaW5kVGlsZVByb2dy
YW1Vbmlmb3Jtcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRy
YXdUaWxlUXVhZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NM
YXllclRyZWVIb3N0Q29tbW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9z
dENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6aXNTY2Fs
ZU9yVHJhbnNsYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6Y2FsY3VsYXRlRHJhd1RyYW5zZm9y
bXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoSG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhvbW9nZW5l
b3VzQ29vcmRpbmF0ZTo6SG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6c2hvdWxkQmVDbGlwcGVkKToKKyAgICAgICAgKFdlYkNv
cmU6OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6Y2FydGVzaWFuUG9pbnQyZCk6CisgICAgICAgIChX
ZWJDb3JlOjpwcm9qZWN0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6bWFwUG9pbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6Y29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UpOgorICAgICAgICAoV2Vi
Q29yZTo6Y29tcHV0ZUNsaXBwZWRWZXJ0aWNlc0ZvclRyYW5zZm9ybWVkUXVhZCk6CisgICAgICAg
IChXZWJDb3JlOjpjb21wdXRlRW5jbG9zaW5nUmVjdE9mQ2xpcHBlZFF1YWQpOgorICAgICAgICAo
V2ViQ29yZTo6Q0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6
Q0NNYXRoVXRpbDo6cHJvamVjdENsaXBwZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNDTWF0
aFV0aWw6Om1hcFF1YWQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NNYXRoVXRpbDo6cHJvamVjdFF1
YWQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKENDTWF0aFV0aWwpOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlVW5vY2NsdWRlZENvbnRlbnRSZWN0KToKKwog
MjAxMi0wNC0wMyAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBS
RUdSRVNTSU9OKHI4MDQzOSk6IENyYXNoIGluIFN0eWxlUHJvcGVydHlTZXQ6OmJvcmRlclNwYWNp
bmdWYWx1ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cgYi9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRleCBhYzFlYTBmODkwNDQzYjAxODc0
YWM3NTA0NDVkNDU2YTA0OThhYWMyLi5hYTg3MGIzZTY0OGRmN2MzYjY1NmMwNmUwZGVkMDYwNDZi
MThiOGIzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZworKysg
Yi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDEy
LTA0LTAyICBTaGF3biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAg
IFtjaHJvbWl1bV0gTmVlZCB0byBjbGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFw
cGx5aW5nIHRyYW5zZm9ybXMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD04MDgwNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogdGVzdHMvQ0NMYXllclRyZWVIb3N0Q29tbW9uVGVzdC5jcHA6CisgICAgICAg
IChXZWJLaXRUZXN0czo6VEVTVCk6CisgICAgICAgIChXZWJLaXRUZXN0cyk6CisKIDIwMTItMDQt
MDMgIEJvbGluIEhzdSAgPGJoc3VAZ29vZ2xlLmNvbT4KIAogICAgICAgICBbQ2hyb21pdW1dIEFk
ZCBjbGljayBjb3VudCBhbmQgbW9kaWZpZXJzIHRvIHRoZSBmYWN0b3J5IG1ldGhvZCBvZiBtb3Vz
ZSBldmVudC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCBiYTQ2MzBkYjllZDdmYTY0ZjRmMmNhNzJkMTdh
NGYwMWFmNTcxMGNiLi41ZTRkYTlkZGVkZGE3NzBlMWUzYmI3MTk2NjU5OWVkZGE0MTg5ZGM2IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCkBAIC0zNjIyLDYgKzM2MjIsOCBAQAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5oJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RJbXBs
LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXll
clRyZWVIb3N0SW1wbC5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ01hdGhVdGlsLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vY2MvQ0NNYXRoVXRpbC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuaCcsCiAgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPdmVyZHJhd01ldHJpY3MuY3BwJywK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCmluZGV4IGNjYjFkZDhkMGIyOWMz
NzIyMTMzZmFiNmRkODM1YTliNDgyOGJiMTAuLmQyYTg5NTMxNDQxZjY5YzJlM2RkMjU3NzEzMmVi
YmI2YmU0OTNkZjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcApAQCAt
NTUsNiArNTUsNyBAQAogI2luY2x1ZGUgImNjL0NDRGVidWdCb3JkZXJEcmF3UXVhZC5oIgogI2lu
Y2x1ZGUgImNjL0NDTGF5ZXJJbXBsLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllclRyZWVIb3N0Q29t
bW9uLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgogI2luY2x1ZGUgImNjL0NDUHJveHku
aCIKICNpbmNsdWRlICJjYy9DQ1JlbmRlclBhc3MuaCIKICNpbmNsdWRlICJjYy9DQ1JlbmRlclN1
cmZhY2VEcmF3UXVhZC5oIgpAQCAtNTc2LDkgKzU3NywxMSBAQCBzdGF0aWMgdm9pZCB0aWxlVW5p
Zm9ybUxvY2F0aW9uKFQgcHJvZ3JhbSwgVGlsZVByb2dyYW1Vbmlmb3JtcyYgdW5pZm9ybXMpCiAg
ICAgdW5pZm9ybXMuZWRnZUxvY2F0aW9uID0gcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5lZGdl
TG9jYXRpb24oKTsKIH0KIAotc3RhdGljIHZvaWQgZmluZFRpbGVQcm9ncmFtVW5pZm9ybXMoTGF5
ZXJSZW5kZXJlckNocm9taXVtKiBsYXllclJlbmRlcmVyLCBjb25zdCBDQ1RpbGVEcmF3UXVhZCog
cXVhZCwgVGlsZVByb2dyYW1Vbmlmb3JtcyYgdW5pZm9ybXMpCitzdGF0aWMgdm9pZCBmaW5kVGls
ZVByb2dyYW1Vbmlmb3JtcyhMYXllclJlbmRlcmVyQ2hyb21pdW0qIGxheWVyUmVuZGVyZXIsIGNv
bnN0IENDVGlsZURyYXdRdWFkKiBxdWFkLCBUaWxlUHJvZ3JhbVVuaWZvcm1zJiB1bmlmb3Jtcywg
Ym9vbCBxdWFkSXNDbGlwcGVkKQogewotICAgIGlmIChxdWFkLT5pc0FudGlhbGlhc2VkKCkpIHsK
KyAgICAvLyBGb3Igbm93LCB3ZSBzaW1wbHkgc2tpcCBhbnRpLWFsaWFzaW5nIHdpdGggdGhlIHF1
YWQgaXMgY2xpcHBlZC4gVGhpcyBvbmx5IGhhcHBlbnMKKyAgICAvLyBvbiBwZXJzcGVjdGl2ZSB0
cmFuc2Zvcm1lZCBsYXllcnMgdGhhdCBnbyBwYXJ0aWFsbHkgYmVoaW5kIHRoZSBjYW1lcmEuCisg
ICAgaWYgKHF1YWQtPmlzQW50aWFsaWFzZWQoKSAmJiAhcXVhZElzQ2xpcHBlZCkgewogICAgICAg
ICBpZiAocXVhZC0+c3dpenpsZUNvbnRlbnRzKCkpIHsKICAgICAgICAgICAgIGNvbnN0IENDVGls
ZWRMYXllckltcGw6OlByb2dyYW1Td2l6emxlQUEqIHByb2dyYW0gPSBsYXllclJlbmRlcmVyLT50
aWxlclByb2dyYW1Td2l6emxlQUEoKTsKICAgICAgICAgICAgIHRpbGVVbmlmb3JtTG9jYXRpb24o
cHJvZ3JhbSwgdW5pZm9ybXMpOwpAQCAtNjQxLDggKzY0NCwxNyBAQCB2b2lkIExheWVyUmVuZGVy
ZXJDaHJvbWl1bTo6ZHJhd1RpbGVRdWFkKGNvbnN0IENDVGlsZURyYXdRdWFkKiBxdWFkKQogICAg
IGZsb2F0IGZyYWdtZW50VGV4U2NhbGVYID0gY2xhbXBSZWN0LndpZHRoKCkgLyB0ZXh0dXJlU2l6
ZS53aWR0aCgpOwogICAgIGZsb2F0IGZyYWdtZW50VGV4U2NhbGVZID0gY2xhbXBSZWN0LmhlaWdo
dCgpIC8gdGV4dHVyZVNpemUuaGVpZ2h0KCk7CiAKKworICAgIEZsb2F0UXVhZCBsb2NhbFF1YWQ7
CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggZGV2aWNlVHJhbnNmb3JtID0gVHJhbnNmb3JtYXRp
b25NYXRyaXgod2luZG93TWF0cml4KCkgKiBwcm9qZWN0aW9uTWF0cml4KCkgKiBxdWFkLT5xdWFk
VHJhbnNmb3JtKCkpLnRvMmRUcmFuc2Zvcm0oKTsKKyAgICBpZiAoIWRldmljZVRyYW5zZm9ybS5p
c0ludmVydGlibGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCBjbGlwcGVkID0gZmFs
c2U7CisgICAgRmxvYXRRdWFkIGRldmljZUxheWVyUXVhZCA9IENDTWF0aFV0aWw6Om1hcFF1YWQo
ZGV2aWNlVHJhbnNmb3JtLCBGbG9hdFF1YWQocXVhZC0+bGF5ZXJSZWN0KCkpLCBjbGlwcGVkKTsK
KwogICAgIFRpbGVQcm9ncmFtVW5pZm9ybXMgdW5pZm9ybXM7Ci0gICAgZmluZFRpbGVQcm9ncmFt
VW5pZm9ybXModGhpcywgcXVhZCwgdW5pZm9ybXMpOworICAgIGZpbmRUaWxlUHJvZ3JhbVVuaWZv
cm1zKHRoaXMsIHF1YWQsIHVuaWZvcm1zLCBjbGlwcGVkKTsKIAogICAgIEdMQyhjb250ZXh0KCks
IGNvbnRleHQoKS0+dXNlUHJvZ3JhbSh1bmlmb3Jtcy5wcm9ncmFtKSk7CiAgICAgR0xDKGNvbnRl
eHQoKSwgY29udGV4dCgpLT51bmlmb3JtMWkodW5pZm9ybXMuc2FtcGxlckxvY2F0aW9uLCAwKSk7
CkBAIC02NTEsMTMgKzY2Myw4IEBAIHZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3VGls
ZVF1YWQoY29uc3QgQ0NUaWxlRHJhd1F1YWQqIHF1YWQpCiAgICAgR0xDKGNvbnRleHQoKSwgY29u
dGV4dCgpLT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJELCBHcmFw
aGljc0NvbnRleHQzRDo6VEVYVFVSRV9NSU5fRklMVEVSLCBxdWFkLT50ZXh0dXJlRmlsdGVyKCkp
KTsKICAgICBHTEMoY29udGV4dCgpLCBjb250ZXh0KCktPnRleFBhcmFtZXRlcmkoR3JhcGhpY3ND
b250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX01BR19GSUxU
RVIsIHF1YWQtPnRleHR1cmVGaWx0ZXIoKSkpOwogCi0gICAgRmxvYXRRdWFkIGxvY2FsUXVhZDsK
LSAgICBpZiAocXVhZC0+aXNBbnRpYWxpYXNlZCgpKSB7Ci0gICAgICAgIFRyYW5zZm9ybWF0aW9u
TWF0cml4IGRldmljZVRyYW5zZm9ybSA9IFRyYW5zZm9ybWF0aW9uTWF0cml4KHdpbmRvd01hdHJp
eCgpICogcHJvamVjdGlvbk1hdHJpeCgpICogcXVhZC0+cXVhZFRyYW5zZm9ybSgpKS50bzJkVHJh
bnNmb3JtKCk7Ci0gICAgICAgIGlmICghZGV2aWNlVHJhbnNmb3JtLmlzSW52ZXJ0aWJsZSgpKQot
ICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIEZsb2F0UXVhZCBkZXZpY2VMYXllclF1YWQg
PSBkZXZpY2VUcmFuc2Zvcm0ubWFwUXVhZChGbG9hdFF1YWQocXVhZC0+bGF5ZXJSZWN0KCkpKTsK
KyAgICBpZiAoIWNsaXBwZWQgJiYgcXVhZC0+aXNBbnRpYWxpYXNlZCgpKSB7CiAKICAgICAgICAg
Q0NMYXllclF1YWQgZGV2aWNlTGF5ZXJCb3VuZHMgPSBDQ0xheWVyUXVhZChGbG9hdFF1YWQoZGV2
aWNlTGF5ZXJRdWFkLmJvdW5kaW5nQm94KCkpKTsKICAgICAgICAgZGV2aWNlTGF5ZXJCb3VuZHMu
aW5mbGF0ZUFudGlBbGlhc2luZ0Rpc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0Q29tbW9uLmNwcAppbmRleCA0MThkY2ExOTBiM2ViZTY0NGEyNGFjM2VlMjgyYmI1ZjVj
OTI5NjJkLi40Mzc1OWMzYTAzNWIxZjRiOGE1MTA2ZGZkYTc5OGIxM2ViYTVlYzRmIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVy
VHJlZUhvc3RDb21tb24uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAKQEAgLTM3LDYgKzM3LDcgQEAK
ICNpbmNsdWRlICJjYy9DQ0xheWVySW1wbC5oIgogI2luY2x1ZGUgImNjL0NDTGF5ZXJJdGVyYXRv
ci5oIgogI2luY2x1ZGUgImNjL0NDTGF5ZXJTb3J0ZXIuaCIKKyNpbmNsdWRlICJjYy9DQ01hdGhV
dGlsLmgiCiAjaW5jbHVkZSAiY2MvQ0NSZW5kZXJTdXJmYWNlLmgiCiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKQEAgLTQ0LDcgKzQ1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogSW50UmVjdCBDQ0xh
eWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KGNvbnN0IEludFJlY3QmIHRh
cmdldFN1cmZhY2VSZWN0LCBjb25zdCBJbnRSZWN0JiBsYXllckJvdW5kUmVjdCwgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSkKIHsKICAgICAvLyBJcyB0aGlzIGxheWVyIGZ1
bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIHRhcmdldCBzdXJmYWNlPwotICAgIEludFJlY3QgbGF5
ZXJJblN1cmZhY2VTcGFjZSA9IHRyYW5zZm9ybS5tYXBSZWN0KGxheWVyQm91bmRSZWN0KTsKKyAg
ICBJbnRSZWN0IGxheWVySW5TdXJmYWNlU3BhY2UgPSBDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVj
dCh0cmFuc2Zvcm0sIGxheWVyQm91bmRSZWN0KTsKICAgICBpZiAodGFyZ2V0U3VyZmFjZVJlY3Qu
Y29udGFpbnMobGF5ZXJJblN1cmZhY2VTcGFjZSkpCiAgICAgICAgIHJldHVybiBsYXllckJvdW5k
UmVjdDsKIApAQCAtNTksNyArNjAsNyBAQCBJbnRSZWN0IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6
Y2FsY3VsYXRlVmlzaWJsZVJlY3QoY29uc3QgSW50UmVjdCYgdGFyZ2V0U3VyZmFjZQogICAgIC8v
IGF4aXMtYWxpZ25lZCksIGJ1dCBpcyBhIHJlYXNvbmFibGUgZmlsdGVyIG9uIHRoZSBzcGFjZSB0
byBjb25zaWRlci4KICAgICAvLyBOb24taW52ZXJ0aWJsZSB0cmFuc2Zvcm1zIHdpbGwgY3JlYXRl
IGFuIGVtcHR5IHJlY3QgaGVyZS4KICAgICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzdXJm
YWNlVG9MYXllciA9IHRyYW5zZm9ybS5pbnZlcnNlKCk7Ci0gICAgSW50UmVjdCBsYXllclJlY3Qg
PSBzdXJmYWNlVG9MYXllci5wcm9qZWN0UXVhZChGbG9hdFF1YWQoRmxvYXRSZWN0KG1pbmltYWxT
dXJmYWNlUmVjdCkpKS5lbmNsb3NpbmdCb3VuZGluZ0JveCgpOworICAgIEludFJlY3QgbGF5ZXJS
ZWN0ID0gZW5jbG9zaW5nSW50UmVjdChDQ01hdGhVdGlsOjpwcm9qZWN0Q2xpcHBlZFJlY3Qoc3Vy
ZmFjZVRvTGF5ZXIsIEZsb2F0UXVhZChGbG9hdFJlY3QobWluaW1hbFN1cmZhY2VSZWN0KSkpKTsK
ICAgICBsYXllclJlY3QuaW50ZXJzZWN0KGxheWVyQm91bmRSZWN0KTsKICAgICByZXR1cm4gbGF5
ZXJSZWN0OwogfQpAQCAtNzAsNyArNzEsNiBAQCBzdGF0aWMgYm9vbCBpc1NjYWxlT3JUcmFuc2xh
dGlvbihjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbSkKICAgICAgICAgICAgJiYgIW0ubTIx
KCkgJiYgIW0ubTIzKCkgJiYgIW0ubTI0KCkKICAgICAgICAgICAgJiYgIW0ubTMxKCkgJiYgIW0u
bTMyKCkgJiYgIW0ubTQzKCkKICAgICAgICAgICAgJiYgbS5tNDQoKTsKLQogfQogCiB0ZW1wbGF0
ZTx0eXBlbmFtZSBMYXllclR5cGU+CkBAIC00MDksNyArNDA5LDcgQEAgc3RhdGljIGJvb2wgY2Fs
Y3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwoTGF5ZXJUeXBlKiBsYXll
ciwgTGF5ZXIKICAgICAgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zvcm0oY29tYmluZWRUcmFuc2Zv
cm0pOwogICAgICAgICBsYXllci0+c2V0RHJhd1RyYW5zZm9ybUlzQW5pbWF0aW5nKGFuaW1hdGlu
Z1RyYW5zZm9ybVRvVGFyZ2V0KTsKICAgICAgICAgbGF5ZXItPnNldFNjcmVlblNwYWNlVHJhbnNm
b3JtSXNBbmltYXRpbmcoYW5pbWF0aW5nVHJhbnNmb3JtVG9TY3JlZW4pOwotICAgICAgICB0cmFu
c2Zvcm1lZExheWVyUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QobGF5ZXItPmRyYXdUcmFuc2Zvcm0o
KS5tYXBSZWN0KGxheWVyUmVjdCkpOworICAgICAgICB0cmFuc2Zvcm1lZExheWVyUmVjdCA9IGVu
Y2xvc2luZ0ludFJlY3QoQ0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QobGF5ZXItPmRyYXdUcmFu
c2Zvcm0oKSwgbGF5ZXJSZWN0KSk7CiAKICAgICAgICAgbGF5ZXItPnNldERyYXdPcGFjaXR5KGRy
YXdPcGFjaXR5KTsKICAgICAgICAgbGF5ZXItPnNldERyYXdPcGFjaXR5SXNBbmltYXRpbmcoZHJh
d09wYWNpdHlJc0FuaW1hdGluZyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjEz
ODAxNjY4MzhkZTBlNWU1NzA0YTUzMzA3NWFjNDA2ZGU2NzE0MzUKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGls
LmNwcApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgorCisjaW5jbHVkZSAiRmxvYXRQb2ludC5o
IgorI2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRl
ICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVj
dCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgeworCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlKGRv
dWJsZSBuZXdYLCBkb3VibGUgbmV3WSwgZG91YmxlIG5ld1osIGRvdWJsZSBuZXdXKQorICAgICAg
ICA6IHgobmV3WCkKKyAgICAgICAgLCB5KG5ld1kpCisgICAgICAgICwgeihuZXdaKQorICAgICAg
ICAsIHcobmV3VykKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBzaG91bGRCZUNsaXBwZWQoKSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHcgPD0gMDsKKyAgICB9CisKKyAgICBGbG9hdFBv
aW50IGNhcnRlc2lhblBvaW50MmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHcgPT0gMSkK
KyAgICAgICAgICAgIHJldHVybiBGbG9hdFBvaW50KHgsIHkpOworCisgICAgICAgIC8vIEZvciBu
b3csIGJlY2F1c2UgdGhpcyBjb2RlIGlzIHVzZWQgcHJpdmF0ZWx5IG9ubHkgYnkgQ0NNYXRoVXRp
bCwgaXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHcgPT0gMCwgYW5kIHdlIGRvIG5vdCB5
ZXQgbmVlZCB0byBoYW5kbGUgdGhhdCBjYXNlLgorICAgICAgICBBU1NFUlQodyk7CisgICAgICAg
IGRvdWJsZSBpbnZXID0gMS4wIC8gdzsKKyAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnQoeCAqIGlu
dlcsIHkgKiBpbnZXKTsKKyAgICB9CisKKyAgICBkb3VibGUgeCwgeSwgeiwgdzsKK307CisKK3N0
YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgcHJvamVjdFBvaW50KGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgZG91Ymxl
IHggPSBwLngoKTsKKyAgICBkb3VibGUgeSA9IHAueSgpOworICAgIGRvdWJsZSB6ID0gLSh0cmFu
c2Zvcm0ubTEzKCkgKiB4ICsgdHJhbnNmb3JtLm0yMygpICogeSArIHRyYW5zZm9ybS5tNDMoKSkg
LyB0cmFuc2Zvcm0ubTMzKCk7CisgICAgLy8gaW1wbGljaXQgZGVmaW5pdGlvbiBvZiB3ID0gMTsK
KworICAgIGRvdWJsZSBvdXRYID0geCAqIHRyYW5zZm9ybS5tMTEoKSArIHkgKiB0cmFuc2Zvcm0u
bTIxKCkgKyB6ICogdHJhbnNmb3JtLm0zMSgpICsgdHJhbnNmb3JtLm00MSgpOworICAgIGRvdWJs
ZSBvdXRZID0geCAqIHRyYW5zZm9ybS5tMTIoKSArIHkgKiB0cmFuc2Zvcm0ubTIyKCkgKyB6ICog
dHJhbnNmb3JtLm0zMigpICsgdHJhbnNmb3JtLm00MigpOworICAgIGRvdWJsZSBvdXRaID0geCAq
IHRyYW5zZm9ybS5tMTMoKSArIHkgKiB0cmFuc2Zvcm0ubTIzKCkgKyB6ICogdHJhbnNmb3JtLm0z
MygpICsgdHJhbnNmb3JtLm00MygpOworICAgIGRvdWJsZSBvdXRXID0geCAqIHRyYW5zZm9ybS5t
MTQoKSArIHkgKiB0cmFuc2Zvcm0ubTI0KCkgKyB6ICogdHJhbnNmb3JtLm0zNCgpICsgdHJhbnNm
b3JtLm00NCgpOworCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIHVuY2xpcHBlZFByb2plY3Rp
b24ob3V0WCwgb3V0WSwgb3V0Wiwgb3V0Vyk7CisgICAgcmV0dXJuIHVuY2xpcHBlZFByb2plY3Rp
b247Cit9CisKK3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgbWFwUG9pbnQoY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAg
ICBkb3VibGUgeCA9IHAueCgpOworICAgIGRvdWJsZSB5ID0gcC55KCk7CisgICAgLy8gaW1wbGlj
aXQgZGVmaW5pdGlvbiBvZiB6ID0gMDsKKyAgICAvLyBpbXBsaWNpdCBkZWZpbml0aW9uIG9mIHcg
PSAxOworCisgICAgZG91YmxlIG91dFggPSB4ICogdHJhbnNmb3JtLm0xMSgpICsgeSAqIHRyYW5z
Zm9ybS5tMjEoKSArIHRyYW5zZm9ybS5tNDEoKTsKKyAgICBkb3VibGUgb3V0WSA9IHggKiB0cmFu
c2Zvcm0ubTEyKCkgKyB5ICogdHJhbnNmb3JtLm0yMigpICsgdHJhbnNmb3JtLm00MigpOworICAg
IGRvdWJsZSBvdXRaID0geCAqIHRyYW5zZm9ybS5tMTMoKSArIHkgKiB0cmFuc2Zvcm0ubTIzKCkg
KyB0cmFuc2Zvcm0ubTQzKCk7CisgICAgZG91YmxlIG91dFcgPSB4ICogdHJhbnNmb3JtLm0xNCgp
ICsgeSAqIHRyYW5zZm9ybS5tMjQoKSArIHRyYW5zZm9ybS5tNDQoKTsKKworICAgIEhvbW9nZW5l
b3VzQ29vcmRpbmF0ZSBtYXBwZWRQb2ludChvdXRYLCBvdXRZLCBvdXRaLCBvdXRXKTsKKyAgICBy
ZXR1cm4gbWFwcGVkUG9pbnQ7Cit9CisKK3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgY29t
cHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UoY29uc3QgSG9tb2dlbmVvdXNDb29yZGluYXRlJiBoMSwg
Y29uc3QgSG9tb2dlbmVvdXNDb29yZGluYXRlJiBoMikKK3sKKyAgICAvLyBQb2ludHMgaDEgYW5k
IGgyIGZvcm0gYSBsaW5lIGluIDRkLCBhbmQgYW55IHBvaW50IG9uIHRoYXQgbGluZSBjYW4gYmUg
cmVwcmVzZW50ZWQKKyAgICAvLyBhcyBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaDEgYW5kIGgy
OgorICAgIC8vICAgIHAgPSAoMS10KSBoMSArICh0KSBoMgorICAgIC8vCisgICAgLy8gV2Ugd2Fu
dCB0byBjb21wdXRlIHBvaW50IHAgc3VjaCB0aGF0IHAudyA9PSAwLiBUbyBkbyB0aGlzLCB3ZSBz
b2x2ZSBmb3IgdCBpbiB0aGUKKyAgICAvLyBmb2xsb3dpbmcgZXF1YXRpb246CisgICAgLy8gICBw
LncgPSAwID0gKDEtdCkgKiBoMS53ICsgKHQpICogaDIudworICAgIC8vCisgICAgLy8gT25jZSBw
YXJhbXRlciB0IGlzIGtub3duLCB0aGUgcmVzdCBvZiBwIGNhbiBiZSBjb21wdXRlZCB2aWEgcCA9
ICgxLXQpIGgxICsgKHQpIGgyLgorCisgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBpcyBhIHNwZWNp
YWwgY2FzZSBvZiB0aGUgZm9sbG93aW5nIGFzc2VydGlvbiwgYnV0IGl0cyBhIGdvb2QgaWRlYSB0
byBrZWVwIGl0IGFuIGV4cGxpY2l0IHNhbml0eSBjaGVjayBoZXJlLgorICAgIEFTU0VSVChoMi53
ICE9IGgxLncpOworICAgIC8vIEV4YWN0bHkgb25lIG9mIGgxIG9yIGgyIChidXQgbm90IGJvdGgp
IG11c3QgYmUgb24gdGhlIG5lZ2F0aXZlIHNpZGUgb2YgdGhlIHcgcGxhbmUgd2hlbiB0aGlzIGlz
IGNhbGxlZC4KKyAgICBBU1NFUlQoaDEuc2hvdWxkQmVDbGlwcGVkKCkgXiBoMi5zaG91bGRCZUNs
aXBwZWQoKSk7CisKKyAgICBkb3VibGUgdCA9ICgtaDEudykgLyAoaDIudyAtIGgxLncpOworCisg
ICAgZG91YmxlIHggPSAoMS10KSAqIGgxLnggKyB0ICogaDIueDsKKyAgICBkb3VibGUgeSA9ICgx
LXQpICogaDEueSArIHQgKiBoMi55OworICAgIGRvdWJsZSB6ID0gKDEtdCkgKiBoMS56ICsgdCAq
IGgyLno7CisgICAgZG91YmxlIHcgPSAwLjAwMDAxOyAvLyBvciBhbnkgcG9zaXRpdmUgbm9uLXpl
cm8gc21hbGwgZXBzaWxvbgorCisgICAgcmV0dXJuIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSh4LCB5
LCB6LCB3KTsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZUNsaXBwZWRWZXJ0aWNlc0ZvclRyYW5z
Zm9ybWVkUXVhZChjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21vZ2Vu
ZW91c0Nvb3JkaW5hdGUmIGgyLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgzLCBjb25z
dCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGg0LCBWZWN0b3I8SG9tb2dlbmVvdXNDb29yZGluYXRl
PiYgdmVydGljZXNPZkNsaXBwZWRRdWFkKQoreworICAgIC8vIFBlcmZvcm0gY2xpcHBpbmcgaW4g
dGhpcyBzcGVjaWZpYyBvcmRlciBzbyB0aGF0IHZlcnRpY2VzIHdpbGwgcmV0YWluIHRoZWlyIENX
IC8gQ0NXIHByb3BlcnR5LgorCisgICAgaWYgKCFoMS5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAg
ICAgdmVydGljZXNPZkNsaXBwZWRRdWFkLmFwcGVuZChoMSk7CisKKyAgICBpZiAoaDEuc2hvdWxk
QmVDbGlwcGVkKCkgXiBoMi5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgdmVydGljZXNPZkNs
aXBwZWRRdWFkLmFwcGVuZChjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRnZShoMSwgaDIpKTsKKwor
ICAgIGlmICghaDIuc2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIHZlcnRpY2VzT2ZDbGlwcGVk
UXVhZC5hcHBlbmQoaDIpOworCisgICAgaWYgKGgyLnNob3VsZEJlQ2xpcHBlZCgpIF4gaDMuc2hv
dWxkQmVDbGlwcGVkKCkpCisgICAgICAgIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZC5hcHBlbmQoY29t
cHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UoaDIsIGgzKSk7CisKKyAgICBpZiAoIWgzLnNob3VsZEJl
Q2xpcHBlZCgpKQorICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQuYXBwZW5kKGgzKTsKKwor
ICAgIGlmIChoMy5zaG91bGRCZUNsaXBwZWQoKSBeIGg0LnNob3VsZEJlQ2xpcHBlZCgpKQorICAg
ICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQuYXBwZW5kKGNvbXB1dGVDbGlwcGVkUG9pbnRGb3JF
ZGdlKGgzLCBoNCkpOworCisgICAgaWYgKCFoNC5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAg
dmVydGljZXNPZkNsaXBwZWRRdWFkLmFwcGVuZChoNCk7CisKKyAgICBpZiAoaDQuc2hvdWxkQmVD
bGlwcGVkKCkgXiBoMS5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgdmVydGljZXNPZkNsaXBw
ZWRRdWFkLmFwcGVuZChjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRnZShoNCwgaDEpKTsKK30KKwor
c3RhdGljIEZsb2F0UmVjdCBjb21wdXRlRW5jbG9zaW5nUmVjdE9mQ2xpcHBlZFF1YWQoY29uc3Qg
VmVjdG9yPEhvbW9nZW5lb3VzQ29vcmRpbmF0ZT4mIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCkKK3sK
KyAgICAvLyBUaGlzIGZ1bmN0aW9uIG9tcHV0ZXMgdGhlIDJkIEZsb2F0UmVjdCB0aGF0IGVuY2xv
c2VzIHRoZSBjbGlwcGVkIHF1YWQuIE5vdGUgdGhhdAorICAgIC8vIGhlcmUgd2UgZmluYWxseSBj
b252ZXJ0IGZyb20gaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuIGNvb3JkaW5h
dGVzCisgICAgLy8gKGkuZS4gZGl2aWRlLWJ5LXcgaWYgbmVlZGVkKS4KKworICAgIGZsb2F0IHht
aW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWF4KCk7CisgICAgZmxvYXQgeG1heCA9
IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjptaW4oKTsKKyAgICBmbG9hdCB5bWluID0gc3Rk
OjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpOworICAgIGZsb2F0IHltYXggPSBzdGQ6Om51
bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHZlcnRpY2VzT2ZDbGlwcGVkUXVhZC5zaXplKCk7ICsraSkgeworICAgICAgICBGbG9hdFBvaW50
IGNsaXBwZWRQb2ludCA9IHZlcnRpY2VzT2ZDbGlwcGVkUXVhZFtpXS5jYXJ0ZXNpYW5Qb2ludDJk
KCk7CisgICAgICAgIHhtaW4gPSBzdGQ6Om1pbihjbGlwcGVkUG9pbnQueCgpLCB4bWluKTsKKyAg
ICAgICAgeG1heCA9IHN0ZDo6bWF4KGNsaXBwZWRQb2ludC54KCksIHhtYXgpOworICAgICAgICB5
bWluID0gc3RkOjptaW4oY2xpcHBlZFBvaW50LnkoKSwgeW1pbik7CisgICAgICAgIHltYXggPSBz
dGQ6Om1heChjbGlwcGVkUG9pbnQueSgpLCB5bWF4KTsKKyAgICB9CisKKyAgICBGbG9hdFJlY3Qg
cmVjdCA9IEZsb2F0UmVjdChGbG9hdFBvaW50KHhtaW4sIHltaW4pLCBGbG9hdFNpemUoeG1heCAt
IHhtaW4sIHltYXggLSB5bWluKSk7CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK0ludFJlY3QgQ0NN
YXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5z
Zm9ybSwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCkKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50
UmVjdChtYXBDbGlwcGVkUmVjdCh0cmFuc2Zvcm0sIEZsb2F0UmVjdChzcmNSZWN0KSkpOworfQor
CitGbG9hdFJlY3QgQ0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QoY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0KQoreworICAgIC8v
IFN0ZXAgMTogQXBwbHkgdGhlIHRyYW5zZm9ybSwgYnV0IHJldGFpbiB0aGUgcmVzdWx0IGluIGhv
bW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVhZCBxID0gRmxvYXRRdWFkKEZsb2F0
UmVjdChzcmNSZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9pbnQo
dHJhbnNmb3JtLCBxLnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1hcFBv
aW50KHRyYW5zZm9ybSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMgPSBt
YXBQb2ludCh0cmFuc2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0
ID0gbWFwUG9pbnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgLy8gU3RlcCAyOiBDb2xsZWN0
IHRoZSBsaXN0IG9mIHZlcnRpY2VzIHRoYXQgcmVwcmVzZW50IHRoZSBjbGlwcGVkIHF1YWQuCisg
ICAgVmVjdG9yPEhvbW9nZW5lb3VzQ29vcmRpbmF0ZT4gdmVydGljZXNPZkNsaXBwZWRRdWFkOwor
ICAgIGNvbXB1dGVDbGlwcGVkVmVydGljZXNGb3JUcmFuc2Zvcm1lZFF1YWQoaDEsIGgyLCBoMywg
aDQsIHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisKKyAgICAvLyBTdGVwIDM6IEFmdGVyIGhhdmlu
ZyBjbGlwcGVkLCBub3cgd2UgY2FuIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzIGFu
ZCBjb21wdXRlIHRoZSAyZCBlbmNsb3NpbmcgcmVjdCBvZiB0aGUgY2xpcHBlZCBwb2ludHMuCisg
ICAgRmxvYXRSZWN0IGVuY2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkID0gY29tcHV0ZUVuY2xvc2lu
Z1JlY3RPZkNsaXBwZWRRdWFkKHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisgICAgcmV0dXJuIGVu
Y2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkOworfQorCitGbG9hdFJlY3QgQ0NNYXRoVXRpbDo6cHJv
amVjdENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNv
bnN0IEZsb2F0UXVhZCYgcSkKK3sKKyAgICAvLyBTdGVwIDE6IFBlcmZvcm0gdGhlIHByb2plY3Rp
b24sIGJ1dCByZXRhaW4gdGhlIHJlc3VsdCBpbiBob21vZ2VuZW91cyBjb29yZGluYXRlcy4KKyAg
ICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDEgPSBwcm9qZWN0UG9pbnQodHJhbnNmb3JtLCBxLnAx
KCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IHByb2plY3RQb2ludCh0cmFuc2Zv
cm0sIHEucDIoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgzID0gcHJvamVjdFBvaW50
KHRyYW5zZm9ybSwgcS5wMygpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDQgPSBwcm9q
ZWN0UG9pbnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgLy8gU3RlcCAyOiBDb2xsZWN0IHRo
ZSBsaXN0IG9mIHZlcnRpY2VzIHRoYXQgcmVwcmVzZW50IHRoZSBjbGlwcGVkIHF1YWQuCisgICAg
VmVjdG9yPEhvbW9nZW5lb3VzQ29vcmRpbmF0ZT4gdmVydGljZXNPZkNsaXBwZWRRdWFkOworICAg
IGNvbXB1dGVDbGlwcGVkVmVydGljZXNGb3JUcmFuc2Zvcm1lZFF1YWQoaDEsIGgyLCBoMywgaDQs
IHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisKKyAgICAvLyBTdGVwIDM6IEFmdGVyIGhhdmluZyBj
bGlwcGVkLCBub3cgd2UgY2FuIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzIGFuZCBj
b21wdXRlIHRoZSAyZCBlbmNsb3NpbmcgcmVjdCBvZiB0aGUgY2xpcHBlZCBwb2ludHMuCisgICAg
RmxvYXRSZWN0IGVuY2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkID0gY29tcHV0ZUVuY2xvc2luZ1Jl
Y3RPZkNsaXBwZWRRdWFkKHZlcnRpY2VzT2ZDbGlwcGVkUXVhZCk7CisgICAgcmV0dXJuIGVuY2xv
c2luZ1JlY3RPZkNsaXBwZWRRdWFkOworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6bWFwUXVh
ZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFF1YWQm
IHEsIGJvb2wmIGNsYW1wZWQpCit7CisgICAgLy8gRklYTUU6IHRoaXMgdmVyc2lvbiBvZiBtYXBR
dWFkIGlzIG1pc3NpbmcgYSB1c2VmdWwgb3B0aW1pemF0aW9uLCBpc0lkZW50aXR5T3JUcmFuc2xh
dGlvbigpLCB0aGF0IGlzIGF2YWlsYWJsZSBvbmx5IGluIFRyYW5zZm9ybWF0aW9uTWF0cml4LmNw
cAorCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9pbnQodHJhbnNmb3JtLCBx
LnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1hcFBvaW50KHRyYW5zZm9y
bSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMgPSBtYXBQb2ludCh0cmFu
c2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gbWFwUG9pbnQo
dHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgY2xhbXBlZCA9IGgxLnNob3VsZEJlQ2xpcHBlZCgp
IHx8IGgyLnNob3VsZEJlQ2xpcHBlZCgpIHx8IGgzLnNob3VsZEJlQ2xpcHBlZCgpIHx8IGg0LnNo
b3VsZEJlQ2xpcHBlZCgpOworCisgICAgLy8gUmVzdWx0IHdpbGwgYmUgaW52YWxpZCBpZiBjbGFt
cGVkID0gdHJ1ZS4gQnV0LCBjb21wdXRlIGl0IGFueXdheSBqdXN0IGluIGNhc2UsIHRvIGVtdWxh
dGUgZXhpc3RpbmcgYmVoYXZpb3IuCisgICAgRmxvYXRRdWFkIHJlc3VsdDsKKyAgICByZXN1bHQu
c2V0UDEoaDEuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICByZXN1bHQuc2V0UDIoaDIuY2FydGVz
aWFuUG9pbnQyZCgpKTsKKyAgICByZXN1bHQuc2V0UDMoaDMuY2FydGVzaWFuUG9pbnQyZCgpKTsK
KyAgICByZXN1bHQuc2V0UDQoaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6cHJvamVjdFF1YWQoY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRRdWFkJiBxLCBib29sJiBjbGFt
cGVkKQoreworICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOworICAgIGJvb2wgY2xhbXBlZFBv
aW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAx
KCksICZjbGFtcGVkUG9pbnQpKTsKKyAgICBjbGFtcGVkID0gY2xhbXBlZFBvaW50OworICAgIHBy
b2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAyKCksICZjbGFtcGVk
UG9pbnQpKTsKKyAgICBjbGFtcGVkIHw9IGNsYW1wZWRQb2ludDsKKyAgICBwcm9qZWN0ZWRRdWFk
LnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAmY2xhbXBlZFBvaW50KSk7Cisg
ICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7CisgICAgcHJvamVjdGVkUXVhZC5zZXRQNCh0cmFu
c2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsYW1wZWRQb2ludCkpOworICAgIGNsYW1wZWQg
fD0gY2xhbXBlZFBvaW50OworCisgICAgcmV0dXJuIHByb2plY3RlZFF1YWQ7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yM2U5NzE2MGQx
ZjQwZTI1OWEyNTczNWQxYTZlNWRhZmMyNTEyMzBmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRpbC5oCkBAIC0w
LDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ0NNYXRoVXRpbF9oCisjZGVmaW5l
IENDTWF0aFV0aWxfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFJlY3Q7Citj
bGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBGbG9hdFF1YWQ7CitjbGFzcyBUcmFuc2Zvcm1hdGlvbk1h
dHJpeDsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBtYXRoIGhlbHBlciBmdW5jdGlvbmFsaXR5
IHRoYXQgZG9lcyBub3QgYmVsb25nIGluIFdlYkNvcmUuCisvLyBJdCBpcyBwb3NzaWJsZSB0aGF0
IHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgbWlncmF0ZWQgdG8gV2ViQ29yZSBldmVudHVh
bGx5LgorY2xhc3MgQ0NNYXRoVXRpbCB7CitwdWJsaWM6CisKKyAgICAvLyBCYWNrZ3JvdW5kOiBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCBjb2RlIGluIFdlYkNvcmUgZG9lcyBub3QgZG8gdGhlIHJpZ2h0
IHRoaW5nIGluCisgICAgLy8gbWFwUmVjdCAvIG1hcFF1YWQgLyBwcm9qZWN0UXVhZCB3aGVuIHRo
ZXJlIGlzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiB0aGF0IGNhdXNlcworICAgIC8vIG9uZSBv
ZiB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgdG8gZ28gdG8gdyA8IDAuIEluIHRob3NlIGNhc2Vz
LCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAvLyBwZXJmb3JtIGNsaXBwaW5nIGluIGhvbW9nZW5l
b3VzIGNvb3JkaW5hdGVzLCBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3JtLCBiZWZvcmUKKyAg
ICAvLyBkaXZpZGluZy1ieS13IHRvIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzLgor
ICAgIC8vCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgYXhpcy1hbGlnbmVkIHJl
Y3QgdGhhdCBlbmNsb3NlcyB0aGUgY29ycmVjdGx5IGNsaXBwZWQsCisgICAgLy8gdHJhbnNmb3Jt
ZWQgcG9seWdvbi4KKyAgICBzdGF0aWMgSW50UmVjdCBtYXBDbGlwcGVkUmVjdChjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEludFJlY3QmKTsKKyAgICBzdGF0aWMgRmxvYXRSZWN0
IG1hcENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRS
ZWN0Jik7CisgICAgc3RhdGljIEZsb2F0UmVjdCBwcm9qZWN0Q2xpcHBlZFJlY3QoY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFF1YWQmKTsKKworICAgIC8vIE5PVEU6IFRo
aXMgZnVuY3Rpb24gZG9lcyBub3QgZG8gY29ycmVjdCBjbGlwcGluZyBhZ2FpbnN0IHcgPSAwIHBs
YW5lLCBidXQgaXQKKyAgICAvLyBjb3JyZWN0bHkgZGV0ZWN0cyB0aGUgY2xpcHBlZCBjb25kaXRp
b24gdmlhIHRoZSBib29sZWFuIGNsYW1wZWQuCisgICAgc3RhdGljIEZsb2F0UXVhZCBtYXBRdWFk
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRRdWFkJiwgYm9vbCYgY2xh
bXBlZCk7CisgICAgc3RhdGljIEZsb2F0UXVhZCBwcm9qZWN0UXVhZChjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UXVhZCYsIGJvb2wmIGNsYW1wZWQpOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gI2RlZmluZSBDQ01hdGhVdGlsX2gKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
T2NjbHVzaW9uVHJhY2tlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwCmluZGV4IGE1NDExZWNjZjc2MTUxZWEz
YmYwMDM1Y2Y5OThkMGJjYmRiMzI3YmIuLjY5ZmExMmNjZWU4MzA4N2EyMzAzMDFmYzkxZjU2MTky
ZDg1MTJhNDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2VyLmNwcApAQCAtMzEs
NiArMzEsNyBAQAogCiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgogI2luY2x1ZGUgImNjL0ND
TGF5ZXJJbXBsLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgogCiAjaW5jbHVkZSA8YWxn
b3JpdGhtPgogCkBAIC0yNzUsMjIgKzI3Niw2IEBAIHN0YXRpYyBpbmxpbmUgSW50UmVjdCByZWN0
U3VidHJhY3RSZWdpb24oY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgUmVnaW9uJiByZWdpCiAg
ICAgcmV0dXJuIGJvdW5kc1JlY3Q7CiB9CiAKLXN0YXRpYyBGbG9hdFF1YWQgcHJvamVjdFF1YWQo
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRRdWFkJiBx
LCBib29sJiBjbGFtcGVkKQotewotICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOwotICAgIGJv
b2wgY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3JtLnByb2pl
Y3RQb2ludChxLnAxKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkID0gY2xhbXBlZFBv
aW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAy
KCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkIHw9IGNsYW1wZWRQb2ludDsKLSAgICBw
cm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAmY2xhbXBl
ZFBvaW50KSk7Ci0gICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7Ci0gICAgcHJvamVjdGVkUXVh
ZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsYW1wZWRQb2ludCkpOwot
ICAgIGNsYW1wZWQgfD0gY2xhbXBlZFBvaW50OwotCi0gICAgcmV0dXJuIHByb2plY3RlZFF1YWQ7
Ci19Ci0KIHN0YXRpYyBpbmxpbmUgSW50UmVjdCBjb21wdXRlVW5vY2NsdWRlZENvbnRlbnRSZWN0
KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
Y29udGVudFNwYWNlVHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzY2lzc29yUmVjdCwgY29uc3Qg
UmVnaW9uJiBvY2NsdXNpb24pCiB7CiAgICAgaWYgKCFjb250ZW50U3BhY2VUcmFuc2Zvcm0uaXNJ
bnZlcnRpYmxlKCkpCkBAIC0zMDAsNyArMjg1LDcgQEAgc3RhdGljIGlubGluZSBJbnRSZWN0IGNv
bXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QsIGMK
ICAgICAvLyBUYWtlIHRoZSBlbmNsb3NpbmdJbnRSZWN0IGF0IGVhY2ggc3RlcCwgYXMgd2Ugd2Fu
dCB0byBjb250YWluIGFueSB1bm9jY2x1ZGVkIHBhcnRpYWwgcGl4ZWxzIGluIHRoZSByZXN1bHRp
bmcgSW50UmVjdC4KICAgICBJbnRSZWN0IHNocnVua1JlY3QgPSByZWN0U3VidHJhY3RSZWdpb24o
aW50ZXJzZWN0aW9uKGVuY2xvc2luZ0ludFJlY3QodHJhbnNmb3JtZWRSZWN0KSwgc2Npc3NvclJl
Y3QpLCBvY2NsdXNpb24pOwogICAgIGJvb2wgY2xhbXBlZDsgLy8gRklYTUU6IHByb2plY3RRdWFk
IHJldHVybnMgaW52YWxpZCByZXN1bHRzIHdoZW4gYSBwb2ludCBnZXRzIGNsYW1wZWQuIFRvIGJl
IGZpeGVkIGluIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODA4
MDYuCi0gICAgSW50UmVjdCB1bm9jY2x1ZGVkUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QocHJvamVj
dFF1YWQoY29udGVudFNwYWNlVHJhbnNmb3JtLmludmVyc2UoKSwgRmxvYXRRdWFkKEZsb2F0UmVj
dChzaHJ1bmtSZWN0KSksIGNsYW1wZWQpLmJvdW5kaW5nQm94KCkpOworICAgIEludFJlY3QgdW5v
Y2NsdWRlZFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KENDTWF0aFV0aWw6OnByb2plY3RRdWFkKGNv
bnRlbnRTcGFjZVRyYW5zZm9ybS5pbnZlcnNlKCksIEZsb2F0UXVhZChGbG9hdFJlY3Qoc2hydW5r
UmVjdCkpLCBjbGFtcGVkKS5ib3VuZGluZ0JveCgpKTsKICAgICBpZiAoY2xhbXBlZCkKICAgICAg
ICAgcmV0dXJuIGNvbnRlbnRSZWN0OwogICAgIC8vIFRoZSByZWN0IGJhY2sgaW4gY29udGVudCBz
cGFjZSBpcyBhIGJvdW5kaW5nIGJveCBhbmQgbWF5IGV4dGVuZCBvdXRzaWRlIG9mIHRoZSBvcmln
aW5hbCBjb250ZW50UmVjdCwgc28gY2xhbXAgaXQgdG8gdGhlIGNvbnRlbnRSZWN0Qm91bmRzLgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhvc3RD
b21tb25UZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRyZWVI
b3N0Q29tbW9uVGVzdC5jcHAKaW5kZXggNGE5NjU5ZGRkMTUzZWZmNmU2NzUyZWEyMDcwNmUyM2M3
ZTEyNGI2NC4uNzVhYzVlODNiYmM4MDhlNTNlYWIzMTllZTA4ZWRmMTg0YWM5Y2E1YSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhvc3RDb21tb25U
ZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9z
dENvbW1vblRlc3QuY3BwCkBAIC05NzksNiArOTc5LDI1MiBAQCBURVNUKENDTGF5ZXJUcmVlSG9z
dENvbW1vblRlc3QsIHZlcmlmeUFuaW1hdGlvbnNGb3JSZW5kZXJTdXJmYWNlSGllcmFyY2h5KQog
ICAgIEVYUEVDVF9GTE9BVF9FUSg1LjAsIGdyYW5kQ2hpbGRPZlJTMi0+c2NyZWVuU3BhY2VUcmFu
c2Zvcm0oKS5tNDIoKSk7CiB9CiAKK1RFU1QoQ0NMYXllclRyZWVIb3N0Q29tbW9uVGVzdCwgdmVy
aWZ5VmlzaWJsZVJlY3RGb3JJZGVudGl0eVRyYW5zZm9ybSkKK3sKKyAgICAvLyBUZXN0IHRoZSBj
YWxjdWxhdGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSBmb3IgaWRlbnRp
dHkgdHJhbnNmb3Jtcy4KKworICAgIEludFJlY3QgdGFyZ2V0U3VyZmFjZVJlY3QgPSBJbnRSZWN0
KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBDYXNlIDE6IExheWVyIGlz
IGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cmZhY2UuCisgICAgSW50UmVjdCBsYXllckNvbnRlbnRS
ZWN0ID0gSW50UmVjdChJbnRQb2ludCgxMCwgMTApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIElu
dFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDEwLCAxMCksIEludFNpemUoMzAsIDMw
KSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0
ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRv
U3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1
YWwpOworCisgICAgLy8gQ2FzZSAyOiBMYXllciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3Qu
CisgICAgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMTIwLCAxMjApLCBJbnRT
aXplKDMwLCAzMCkpOworICAgIGFjdHVhbCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3Vs
YXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVy
VG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfVFJVRShhY3R1YWwuaXNFbXB0eSgpKTsK
KworICAgIC8vIENhc2UgMzogTGF5ZXIgaXMgcGFydGlhbGx5IG92ZXJsYXBwaW5nIHRoZSBzdXJm
YWNlIHJlY3QuCisgICAgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoODAsIDgw
KSwgSW50U2l6ZSgzMCwgMzApKTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoODAs
IDgwKSwgSW50U2l6ZSgyMCwgMjApKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21t
b246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRS
ZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4
cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZl
cmlmeVZpc2libGVSZWN0Rm9yVHJhbnNsYXRpb25zKQoreworICAgIC8vIFRlc3QgdGhlIGNhbGN1
bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5IGZvciBzY2FsaW5nIHRy
YW5zZm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQ
b2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIEludFJlY3QgbGF5ZXJDb250ZW50
UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBDYXNl
IDE6IExheWVyIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cmZhY2UuCisgICAgbGF5ZXJUb1N1
cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0udHJhbnNsYXRlKDEwLCAxMCk7CisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3QoSW50
UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xh
eWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0
LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNU
X0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBMYXllciBp
cyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
bWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKDEy
MCwgMTIwKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZp
c2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisKKyAg
ICAvLyBDYXNlIDM6IExheWVyIGlzIHBhcnRpYWxseSBvdmVybGFwcGluZyB0aGUgc3VyZmFjZSBy
ZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg4MCwgODApOworICAgIGV4cGVjdGVkID0g
SW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgyMCwgMjApKTsKKyAgICBhY3R1YWwgPSBD
Q0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VS
ZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQ
RUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVl
SG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yMkRSb3RhdGlvbnMpCit7CisgICAg
Ly8gVGVzdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3b3JrcyBjb3JyZWN0
bHkgZm9yIHJvdGF0aW9ucyBhYm91dCB6LWF4aXMgKGkuZS4gMkQgcm90YXRpb25zKS4KKyAgICAv
LyBSZW1lbWJlciB0aGF0IGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgc2hvdWxkIHJldHVybiB0aGUg
dmlzaWJsZSByZWN0IGluIHRoZSBsYXllcidzIHNwYWNlLgorCisgICAgSW50UmVjdCB0YXJnZXRT
dXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsK
KyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJ
bnRTaXplKDMwLCAzMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJmYWNl
VHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBMYXllciBpcyBjb250YWluZWQgd2l0aGluIHRo
ZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOwor
ICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgNTApOworICAgIGxheWVy
VG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAgSW50UmVjdCBleHBlY3RlZCA9IElu
dFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgSW50UmVjdCBhY3R1
YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1
cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7Cisg
ICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAy
OiBMYXllciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJh
bnNsYXRlKC01MCwgMCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlKDQ1KTsK
KyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0
KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5z
Zm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisKKyAgICAvLyBDYXNl
IDM6IFRoZSBsYXllciBpcyByb3RhdGVkIGFib3V0IGl0cyB0b3AtbGVmdCBjb3JuZXIuIEluIHN1
cmZhY2Ugc3BhY2UsIHRoZSBsYXllcgorICAgIC8vICAgICAgICAgaXMgb3JpZW50ZWQgZGlhZ29u
YWxseSwgd2l0aCB0aGUgbGVmdCBoYWxmIG91dHNpZGUgb2YgdGhlIHJlbmRlclN1cmZhY2UuIElu
CisgICAgLy8gICAgICAgICB0aGlzIGNhc2UsIHRoZSB2aXNpYmxlIHJlY3Qgc2hvdWxkIHN0aWxs
IGJlIHRoZSBlbnRpcmUgbGF5ZXIgKHJlbWVtYmVyIHRoZQorICAgIC8vICAgICAgICAgdmlzaWJs
ZSByZWN0IGlzIGNvbXB1dGVkIGluIGxheWVyIHNwYWNlKTsgYm90aCB0aGUgdG9wLWxlZnQgYW5k
CisgICAgLy8gICAgICAgICBib3R0b20tcmlnaHQgY29ybmVycyBvZiB0aGUgbGF5ZXIgYXJlIHN0
aWxsIHZpc2libGUuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7
CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlKDQ1KTsKKyAgICBleHBlY3RlZCA9
IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgYWN0dWFsID0g
Q0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNl
UmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVY
UEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgNDogVGhl
IGxheWVyIGlzIHJvdGF0ZWQgYWJvdXQgaXRzIHRvcC1sZWZ0IGNvcm5lciwgYW5kIHRyYW5zbGF0
ZWQgdXB3YXJkcy4gSW4KKyAgICAvLyAgICAgICAgIHN1cmZhY2Ugc3BhY2UsIHRoZSBsYXllciBp
cyBvcmllbnRlZCBkaWFnb25hbGx5LCB3aXRoIG9ubHkgdGhlIHRvcCBjb3JuZXIKKyAgICAvLyAg
ICAgICAgIG9mIHRoZSBzdXJmYWNlIG92ZXJsYXBwaW5nIHRoZSBsYXllci4gSW4gbGF5ZXIgc3Bh
Y2UsIHRoZSByZW5kZXIgc3VyZmFjZQorICAgIC8vICAgICAgICAgb3ZlcmxhcHMgdGhlIHJpZ2h0
IHNpZGUgb2YgdGhlIGxheWVyLiBUaGUgdmlzaWJsZSByZWN0IHNob3VsZCBiZSB0aGUKKyAgICAv
LyAgICAgICAgIGxheWVyJ3MgcmlnaHQgaGFsZi4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUo
MCwgLXNxcnQoMikgKiAxNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlKDQ1
KTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoMTUsIDApLCBJbnRTaXplKDE1LCAz
MCkpOyAvLyByaWdodCBoYWxmIG9mIGxheWVyIGJvdW5kcy4KKyAgICBhY3R1YWwgPSBDQ0xheWVy
VHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBs
YXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lO
VF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9zdENv
bW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yM2RPcnRob2dyYXBoaWNUcmFuc2Zvcm0pCit7
CisgICAgLy8gVGVzdCB0aGF0IHRoZSBjYWxjdWxhdGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9uIHdv
cmtzIGNvcnJlY3RseSBmb3IgM2QgdHJhbnNmb3Jtcy4KKworICAgIEludFJlY3QgdGFyZ2V0U3Vy
ZmFjZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7Cisg
ICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50
U2l6ZSgxMDAsIDEwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJmYWNl
VHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBPcnRob2dyYXBoaWMgcHJvamVjdGlvbiBvZiBh
IGxheWVyIHJvdGF0ZWQgYWJvdXQgeS1heGlzIGJ5IDQ1IGRlZ3JlZXMsIHNob3VsZCBiZSBmdWxs
eSBjb250YWluZWQgaW4gdGhlIHJlbmRlclN1cmZhY2UuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRl
M2QoMCwgNDUsIDApOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDAs
IDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJl
ZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXll
ckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9S
RUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBPcnRob2dyYXBoaWMg
cHJvamVjdGlvbiBvZiBhIGxheWVyIHJvdGF0ZWQgYWJvdXQgeS1heGlzIGJ5IDQ1IGRlZ3JlZXMs
IGJ1dAorICAgIC8vICAgICAgICAgc2hpZnRlZCB0byB0aGUgc2lkZSBzbyBvbmx5IHRoZSByaWdo
dC1oYWxmIHRoZSBsYXllciB3b3VsZCBiZSB2aXNpYmxlIG9uCisgICAgLy8gICAgICAgICB0aGUg
c3VyZmFjZS4KKyAgICBkb3VibGUgaGFsZldpZHRoT2ZSb3RhdGVkTGF5ZXIgPSAoMTAwLjAgLyBz
cXJ0KDIpKSAqIDAuNTsgLy8gMTAwLjAgaXMgdGhlIHVuLXJvdGF0ZWQgbGF5ZXIgd2lkdGg7IGRp
dmlkZWQgYnkgc3FydCgyKSBpcyB0aGUgcm90YXRlZCB3aWR0aC4KKyAgICBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50
cmFuc2xhdGUoLWhhbGZXaWR0aE9mUm90YXRlZExheWVyLCAwKTsKKyAgICBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7IC8vIHJvdGF0ZXMgYWJvdXQgdGhlIGxlZnQg
ZWRnZSBvZiB0aGUgbGF5ZXIKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoNTAsIDAp
LCBJbnRTaXplKDUwLCAxMDApKTsgLy8gcmlnaHQgaGFsZiBvZiB0aGUgbGF5ZXIuCisgICAgYWN0
dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRT
dXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOwor
ICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChDQ0xh
eWVyVHJlZUhvc3RDb21tb25UZXN0LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjNkUGVyc3BlY3RpdmVU
cmFuc2Zvcm0pCit7CisgICAgLy8gVGVzdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5j
dGlvbiB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgbGF5ZXIgaGFzIGEKKyAgICAvLyBwZXJzcGVj
dGl2ZSBwcm9qZWN0aW9uIG9udG8gdGhlIHRhcmdldCBzdXJmYWNlLgorCisgICAgSW50UmVjdCB0
YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMTAwLCAx
MDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KC01
MCwgLTUwKSwgSW50U2l6ZSgyMDAsIDIwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBFdmVuIHRob3VnaCB0aGUg
bGF5ZXIgaXMgdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIHN1cmZhY2UsIGR1ZSB0byBwZXJzcGVjdGl2
ZQorICAgIC8vICAgICAgICAgZm9yZXNob3J0ZW5pbmcsIHRoZSBsYXllciB3aWxsIGZpdCBmdWxs
eSBpbiB0aGUgc3VyZmFjZSB3aGVuIGl0cyB0cmFuc2xhdGVkCisgICAgLy8gICAgICAgICBtb3Jl
IHRoYW4gdGhlIHBlcnNwZWN0aXZlIGFtb3VudC4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bS5tYWtlSWRlbnRpdHkoKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgdHJh
bnNmb3JtcyBhcHBsaWVzIHRoZSBwZXJzcGVjdGl2ZSBhYm91dCB0aGUgY2VudGVyIG9mIHRoZSBz
dXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgNTApOwor
ICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLmFwcGx5UGVyc3BlY3RpdmUoOSk7CisgICAgbGF5
ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgLTUwKTsKKworICAgIC8vIFRoaXMg
dHJhbnNsYXRlIHBsYWNlcyB0aGUgbGF5ZXIgaW4gZnJvbnQgb2YgdGhlIHN1cmZhY2UncyBwcm9q
ZWN0aW9uIHBsYW5lLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZTNkKDAs
IDAsIC0yMCk7CisKKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgtNTAs
IC01MCksIEludFNpemUoMjAwLCAyMDApKTsKKyAgICBJbnRSZWN0IGFjdHVhbCA9IENDTGF5ZXJU
cmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxh
eWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfSU5U
X1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7CisKKyAgICAvLyBDYXNlIDI6IHNhbWUgcHJvamVj
dGlvbiBhcyBiZWZvcmUsIGV4Y2VwdCB0aGF0IHRoZSBsYXllciBpcyBhbHNvIHRyYW5zbGF0ZWQg
dG8gdGhlCisgICAgLy8gICAgICAgICBzaWRlLCBzbyB0aGF0IG9ubHkgdGhlIHJpZ2h0IGhhbGYg
b2YgdGhlIGxheWVyIHNob3VsZCBiZSB2aXNpYmxlLgorICAgIC8vCisgICAgLy8gRXhwbGFuYXRp
b24gb2YgZXhwZWN0ZWQgcmVzdWx0OgorICAgIC8vIFRoZSBwZXJzcGVjdGl2ZSByYXRpbyBpcyAo
eiBkaXN0YW5jZSBiZXR3ZWVuIGxheWVyIGFuZCBjYW1lcmEgb3JpZ2luKSAvICh6IGRpc3RhbmNl
IGJldHdlZW4gcHJvamVjdGlvbiBwbGFuZSBhbmQgY2FtZXJhIG9yaWdpbikgPT0gKC0yOSAvIDkp
CisgICAgLy8gVGhlbiwgYnkgc2ltaWxhciB0cmlhbmdsZXMsIGlmIHdlIHdhbnQgdG8gbW92ZSBh
IGxheWVyIGJ5IHRyYW5zbGF0aW5nIC01MCB1bml0cyBpbiBwcm9qZWN0ZWQgc3VyZmFjZSB1bml0
cyAoc28gdGhhdCBvbmx5IGhhbGYgb2YgaXQgaXMKKyAgICAvLyB2aXNpYmxlKSwgdGhlbiB3ZSB3
b3VsZCBuZWVkIHRvIHRyYW5zbGF0ZSBieSAoLTI5IC8gOSkgKiAtNTAgPT0gLTE2MS4xMTExIGlu
IHRoZSBsYXllcidzIHVuaXRzLgorICAgIC8vCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
dHJhbnNsYXRlM2QoLTE2MS4xMTExMTExMTExMTEsIDAsIDApOworICAgIGV4cGVjdGVkID0gSW50
UmVjdChJbnRQb2ludCg1MCwgLTUwKSwgSW50U2l6ZSgxMDAsIDIwMCkpOyAvLyBUaGUgcmlnaHQg
aGFsZiBvZiB0aGUgbGF5ZXIncyBib3VuZGluZyByZWN0LgorICAgIGFjdHVhbCA9IENDTGF5ZXJU
cmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxh
eWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfSU5U
X1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXllclRyZWVIb3N0Q29t
bW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZE9ydGhvZ3JhcGhpY0lzTm90Q2xpcHBlZEJl
aGluZFN1cmZhY2UpCit7CisgICAgLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIGV4cGxpY2l0IGNv
bmNlcHQgb2YgYW4gb3J0aG9ncmFwaGljIHByb2plY3Rpb24gcGxhbmUgaW4gb3VyCisgICAgLy8g
Y29kZSAobm9yIGluIHRoZSBDU1Mgc3BlYyB0byBteSBrbm93bGVkZ2UpLiBUaGVyZWZvcmUsIGxh
eWVycyB0aGF0IGFyZSB0ZWNobmljYWxseQorICAgIC8vIGJlaGluZCB0aGUgc3VyZmFjZSBpbiBh
biBvcnRob2dyYXBoaWMgd29ybGQgc2hvdWxkIG5vdCBiZSBjbGlwcGVkIHdoZW4gdGhleSBhcmUK
KyAgICAvLyBmbGF0dGVuZWQgdG8gdGhlIHN1cmZhY2UuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1
cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOwor
ICAgIEludFJlY3QgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIElu
dFNpemUoMTAwLCAxMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybTsKKworICAgIC8vIFRoaXMgc2VxdWVuY2Ugb2YgdHJhbnNmb3JtcyBlZmZlY3Rp
dmVseSByb3RhdGVzIHRoZSBsYXllciBhYm91dCB0aGUgeS1heGlzIGF0IHRoZQorICAgIC8vIGNl
bnRlciBvZiB0aGUgbGF5ZXIuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50
aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKDUwLCAwKTsKKyAg
ICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7CisgICAgbGF5ZXJU
b1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgMCk7CisKKyAgICBJbnRSZWN0IGV4cGVj
dGVkID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIElu
dFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVj
dCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKwor
CitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yM2RQ
ZXJzcGVjdGl2ZUlzQ2xpcHBlZCkKK3sKKyAgICAvLyBUZXN0IHRoZSBjYWxjdWxhdGVWaXNpYmxl
UmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIHByb2plY3RpbmcgYSBzdXJmYWNl
CisgICAgLy8gb250byBhIGxheWVyLCBidXQgdGhlIGxheWVyIGlzIHBhcnRpYWxseSBiZWhpbmQg
dGhlIGNhbWVyYSAobm90IGp1c3QgYmVoaW5kIHRoZQorICAgIC8vIHByb2plY3Rpb24gcGxhbmUp
LiBJbiB0aGlzIGNhc2UsIHRoZSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgbWF5IHNlZW0gdG8gYmUg
dmFsaWQsCisgICAgLy8gYnV0IGFjdHVhbGx5IHRoZXkgYXJlIG5vdC4gVGhlIHZpc2libGVSZWN0
IG5lZWRzIHRvIGJlIHByb3Blcmx5IGNsaXBwZWQgYnkgdGhlCisgICAgLy8gdyA9IDAgcGxhbmUg
aW4gaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMgYmVmb3JlIGNvbnZlcnRpbmcgdG8gY2FydGVzaWFu
IGNvb3JkaW5hdGVzLgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3Qo
SW50UG9pbnQoLTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBsYXll
ckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xKSwgSW50U2l6ZSgyMCwgMikp
OworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisg
ICAgLy8gVGhlIGxheWVyIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgcmlnaHQgaGFsZiBvZiB0
aGUgbGF5ZXIgc2hvdWxkIGJlIGluIGZyb250IG9mCisgICAgLy8gdGhlIGNhbWVyYSwgd2hpbGUg
dGhlIG90aGVyIGhhbGYgaXMgYmVoaW5kIHRoZSBzdXJmYWNlJ3MgcHJvamVjdGlvbiBwbGFuZS4g
VGhlCisgICAgLy8gZm9sbG93aW5nIHNlcXVlbmNlIG9mIHRyYW5zZm9ybXMgYXBwbGllcyB0aGUg
cGVyc3BlY3RpdmUgYW5kIHJvdGF0aW9uIGFib3V0IHRoZQorICAgIC8vIGNlbnRlciBvZiB0aGUg
bGF5ZXIuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAg
bGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXllclRv
U3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCAxKTsKKyAgICBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7CisKKyAgICBpbnQgZXhwZWN0ZWRYUG9zaXRp
b24gPSAtMTA7CisgICAgaW50IGV4cGVjdGVkV2lkdGggPSAxMDsKKyAgICBJbnRSZWN0IGFjdHVh
bCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3Vy
ZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAg
ICBFWFBFQ1RfRVEoZXhwZWN0ZWRYUG9zaXRpb24sIGFjdHVhbC54KCkpOworICAgIEVYUEVDVF9F
UShleHBlY3RlZFdpZHRoLCBhY3R1YWwud2lkdGgoKSk7Cit9CisKK1RFU1QoQ0NMYXllclRyZWVI
b3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3JQZXJzcGVjdGl2ZVVucHJvamVjdGlv
bikKK3sKKyAgICAvLyBUbyBkZXRlcm1pbmUgdmlzaWJsZVJlY3QgaW4gbGF5ZXIgc3BhY2UsIHRo
ZXJlIG5lZWRzIHRvIGJlIGFuIHVuLXByb2plY3Rpb24gZnJvbQorICAgIC8vIHN1cmZhY2Ugc3Bh
Y2UgdG8gbGF5ZXIgc3BhY2UuIFdoZW4gdGhlIG9yaWdpbmFsIHRyYW5zZm9ybSB3YXMgYSBwZXJz
cGVjdGl2ZQorICAgIC8vIHByb2plY3Rpb24gdGhhdCB3YXMgY2xpcHBlZCwgaXQgcmV0dXJucyBh
IHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY2xpcHBlZCBib3VuZHMuCisgICAgLy8gVW4tcHJvamVj
dGluZyB0aGlzIG5ldyByZWN0IG1heSByZXF1aXJlIGNsaXBwaW5nIGFnYWluLgorCisgICAgLy8g
VGhpcyBzZXF1ZW5jZSBvZiB0cmFuc2Zvcm1zIGNhdXNlcyBvbmUgY29ybmVyIG9mIHRoZSBsYXll
ciB0byBwcm90cnVkZSBhY3Jvc3MgdGhlIHcgPSAwIHBsYW5lLCBhbmQgc2hvdWxkIGJlIGNsaXBw
ZWQuCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoLTUw
LCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0
ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIwKSk7CisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisgICAgbGF5ZXJUb1N1
cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFu
c2xhdGUzZCgwLCAwLCAtNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlM2Qo
MCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZTNkKDgwLCAwLCAw
KTsKKworICAgIC8vIE9ubHkgdGhlIGNvcm5lciBvZiB0aGUgbGF5ZXIgaXMgbm90IHZpc2libGUg
b24gdGhlIHN1cmZhY2UgYmVjYXVzZSBvZiBiZWluZworICAgIC8vIGNsaXBwZWQuIEJ1dCwgdGhl
IG5ldCByZXN1bHQgb2Ygcm91bmRpbmcgdmlzaWJsZSByZWdpb24gdG8gYW4gYXhpcy1hbGlnbmVk
IHJlY3QgaXMKKyAgICAvLyB0aGF0IHRoZSBlbnRpcmUgbGF5ZXIgc2hvdWxkIHN0aWxsIGJlIGNv
bnNpZGVyZWQgdmlzaWJsZS4KKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2lu
dCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xh
eWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0
LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNU
X0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCiAvLyBGSVhNRToKIC8vIGNvbnRp
bnVlIHdvcmtpbmcgb24gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY4
OTQyCiAvLyAgLSBhZGQgYSB0ZXN0IHRvIHZlcmlmeSBjbGlwcGluZyB0aGF0IGNoYW5nZXMgdGhl
ICJjZW50ZXIgcG9pbnQiCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135468</attachid>
            <date>2012-04-03 17:38:55 -0700</date>
            <delta_ts>2012-04-04 16:26:09 -0700</delta_ts>
            <desc>Addressed reviewers comments</desc>
            <filename>bug-80806-20120403173854.patch</filename>
            <type>text/plain</type>
            <size>42493</size>
            <attacher name="Shawn Singh">shawnsingh</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzMDU5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWYyZDg0NWQ0NjQwNDI4
ZDU3MGE3Yjk3YTE3MmJkNmI4MzVmYmQxOS4uMDM4NjY5OGI5YzAwZmY3YmM0MDZiZGM2NmI4Mzkx
NmRkMzU5NzNjOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYzIEBACisyMDEyLTA0LTAzICBTaGF3
biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
TmVlZCB0byBjbGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFwcGx5aW5nIHRyYW5z
Zm9ybXMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
MDgwNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVu
aXQgdGVzdHMgYWRkZWQgdG8gQ0NMYXllclRyZWVIb3N0Q29tbW9uLiBUaGlzIGNoYW5nZSBpcyBh
bHNvCisgICAgICAgIGNvdmVyZWQgYnkgb3RoZXIgZXhpc3RpbmcgdW5pdCB0ZXN0cyBhbmQgbGF5
b3V0IHRlc3RzLgorCisgICAgICAgIFdlYkNvcmUgVHJhbnNmb3JtYXRpb25NYXRyaXggbWFwUmVj
dCAvIG1hcFF1YWQgLyBwcm9qZWN0UXVhZCBkbworICAgICAgICBub3QgcHJvcGVybHkgaGFuZGxl
IHRoZSBjYXNlIHdoZXJlIGEgc3VyZmFjZSBpcyBvcmllbnRlZCBwYXJ0aWFsbHkKKyAgICAgICAg
YmVoaW5kIHRoZSBjYW1lcmEsIHdpdGggYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLiBJbiB0aGlz
IGNhc2UsCisgICAgICAgIHByb2plY3RlZCBwb2ludHMgbWF5IGFwcGVhciB0byBiZSB2YWxpZCBp
biBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMsCisgICAgICAgIGJ1dCB0aGV5IGFyZSBpbmRlZWQgbm90
IHZhbGlkLCBhbmQgdGhleSBjYW4gb25seSBiZSBkZXRlY3RlZCBpbgorICAgICAgICBob21vZ2Vu
ZW91cyBjb29yZGluYXRlcyBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3JtLCBiZWZvcmUgdGhl
CisgICAgICAgIGRpdmlkZS1ieS13IHN0ZXAuCisKKyAgICAgICAgVGhlIGNvcnJlY3Qgc29sdXRp
b24gaXMgdG8gY2xpcCBnZW9tZXRyeSB3aGVyZSB3IDwgMC4gVGhpcyBwYXRjaAorICAgICAgICBt
YWtlcyB0aGlzIGNoYW5nZSBsb2NhbCB0byBjaHJvbWl1bSBvbmx5LCB0byBmaXggcmVuZGVyaW5n
IGJ1Z3MKKyAgICAgICAgdGhhdCBhcmlzZSBmcm9tIHRoaXMgcHJvYmxlbTsgU2FmYXJpIGRvZXMg
bm90IGhhdmUgdGhlc2UgYnVncworICAgICAgICBiZWNhdXNlIGl0IGRvZXMgbm90IHVzZSB0aGUg
dHJhbnNmb3JtcyBvdXRzaWRlIG9mIHRoZSBHUFUgKHdoaWNoCisgICAgICAgIGRvZXMgY29ycmVj
dGx5IGhhbmRsZSB0aGlzIGNhc2UpLiBUaGUgcHJpbWFyeSBmaXggaXMgdG8gY29ycmVjdAorICAg
ICAgICBjYWxjdWxhdGVWaXNpYmxlTGF5ZXJSZWN0KCksIGJ1dCBvdGhlciBhbmNpbGxhcnkgbG9j
YXRpb25zIGFyZQorICAgICAgICBhbHNvIGZpeGVkLCBpbiBwYXJ0aWN1bGFyLCB0aGUgYW50aWFs
aWFzaW5nIGNvZGUgcGF0aCBpcyBzaW1wbHkKKyAgICAgICAgc2tpcHBlZCB3aGVuIHRoaXMgY2Fz
ZSBhcmlzZXMuCisKKyAgICAgICAgRXZlbnR1YWxseSB0aGlzIG1hdGggbmVlZHMgdG8gYmUgbWVy
Z2VkIGludG8gVHJhbnNmb3JtYXRpb25NYXRyaXgsCisgICAgICAgIHRvIGZpeCBoaXQtdGVzdGlu
ZyBidWdzIHRoYXQgb2NjdXIgaW4gYm90aCBDaHJvbWl1bSBhbmQgU2FmYXJpLgorCisgICAgICAg
ICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpmaW5kVGlsZVByb2dy
YW1Vbmlmb3Jtcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRy
YXdUaWxlUXVhZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NM
YXllclRyZWVIb3N0Q29tbW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9z
dENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6aXNTY2Fs
ZU9yVHJhbnNsYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6Y2FsY3VsYXRlRHJhd1RyYW5zZm9y
bXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoSG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhvbW9nZW5l
b3VzQ29vcmRpbmF0ZTo6SG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6c2hvdWxkQmVDbGlwcGVkKToKKyAgICAgICAgKFdlYkNv
cmU6OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6Y2FydGVzaWFuUG9pbnQyZCk6CisgICAgICAgIChX
ZWJDb3JlOjpwcm9qZWN0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6bWFwUG9pbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6Y29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UpOgorICAgICAgICAoV2Vi
Q29yZTo6Y29tcHV0ZUNsaXBwZWRWZXJ0aWNlc0ZvclRyYW5zZm9ybWVkUXVhZCk6CisgICAgICAg
IChXZWJDb3JlOjpjb21wdXRlRW5jbG9zaW5nUmVjdE9mQ2xpcHBlZFF1YWQpOgorICAgICAgICAo
V2ViQ29yZTo6Y29tcHV0ZUVuY2xvc2luZ1JlY3QpOgorICAgICAgICAoV2ViQ29yZTo6Q0NNYXRo
VXRpbDo6bWFwQ2xpcHBlZFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6Q0NNYXRoVXRpbDo6cHJv
amVjdENsaXBwZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNDTWF0aFV0aWw6Om1hcFF1YWQp
OgorICAgICAgICAoV2ViQ29yZTo6Q0NNYXRoVXRpbDo6cHJvamVjdFF1YWQpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKENDTWF0aFV0aWwpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpjb21wdXRlVW5vY2NsdWRlZENvbnRlbnRSZWN0KToKKwogMjAxMi0wNC0wMyAgSmlh
IFB1ICA8anB1QGFwcGxlLmNvbT4KIAogICAgICAgICBSZW5hbWUgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3TGluZUZvclRleHRDaGVja2luZygpIHRvIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JE
b2N1bWVudE1hcmtlcigpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4IGFjMWVhMGY4OTA0
NDNiMDE4NzRhYzc1MDQ0NWQ0NTZhMDQ5OGFhYzIuLmJhZTU2Zjg5MmYzMzAzZGRiYjljZDk3MThm
NDU0NzQxNjcyM2Y0OTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQg
QEAKKzIwMTItMDQtMDMgIFNoYXduIFNpbmdoICA8c2hhd25zaW5naEBjaHJvbWl1bS5vcmc+CisK
KyAgICAgICAgW2Nocm9taXVtXSBOZWVkIHRvIGNsaXAgdG8gaG9tb2dlbmVvdXMgdz0wIHBsYW5l
IHdoZW4gYXBwbHlpbmcgdHJhbnNmb3Jtcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTgwODA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgKiB0ZXN0cy9DQ0xheWVyVHJlZUhvc3RDb21tb25UZXN0LmNwcDoK
KyAgICAgICAgKFdlYktpdFRlc3RzOjpURVNUKToKKyAgICAgICAgKFdlYktpdFRlc3RzKToKKwog
MjAxMi0wNC0wMyAgQm9saW4gSHN1ICA8YmhzdUBnb29nbGUuY29tPgogCiAgICAgICAgIFtDaHJv
bWl1bV0gQWRkIGNsaWNrIGNvdW50IGFuZCBtb2RpZmllcnMgdG8gdGhlIGZhY3RvcnkgbWV0aG9k
IG9mIG1vdXNlIGV2ZW50LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBp
IGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCmluZGV4IGJhNDYzMGRiOWVkN2ZhNjRmNGYy
Y2E3MmQxN2E0ZjAxYWY1NzEwY2IuLjVlNGRhOWRkZWRkYTc3MGUxZTNiYjcxOTY2NTk5ZWRkYTQx
ODlkYzYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTM2MjIsNiArMzYyMiw4IEBACiAgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmgn
LAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVl
SG9zdEltcGwuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9j
Yy9DQ0xheWVyVHJlZUhvc3RJbXBsLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAnLAogICAgICAgICAgICAg
J3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5oJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ092ZXJkcmF3TWV0cmlj
cy5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKaW5kZXggY2NiMWRk
OGQwYjI5YzM3MjIxMzNmYWI2ZGQ4MzVhOWI0ODI4YmIxMC4uZDJhODk1MzE0NDFmNjljMmUzZGQy
NTc3MTMyZWJiYjZiZTQ5M2RmMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0u
Y3BwCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSAiY2MvQ0NEZWJ1Z0JvcmRlckRyYXdRdWFk
LmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllckltcGwuaCIKICNpbmNsdWRlICJjYy9DQ0xheWVyVHJl
ZUhvc3RDb21tb24uaCIKKyNpbmNsdWRlICJjYy9DQ01hdGhVdGlsLmgiCiAjaW5jbHVkZSAiY2Mv
Q0NQcm94eS5oIgogI2luY2x1ZGUgImNjL0NDUmVuZGVyUGFzcy5oIgogI2luY2x1ZGUgImNjL0ND
UmVuZGVyU3VyZmFjZURyYXdRdWFkLmgiCkBAIC01NzYsOSArNTc3LDExIEBAIHN0YXRpYyB2b2lk
IHRpbGVVbmlmb3JtTG9jYXRpb24oVCBwcm9ncmFtLCBUaWxlUHJvZ3JhbVVuaWZvcm1zJiB1bmlm
b3JtcykKICAgICB1bmlmb3Jtcy5lZGdlTG9jYXRpb24gPSBwcm9ncmFtLT5mcmFnbWVudFNoYWRl
cigpLmVkZ2VMb2NhdGlvbigpOwogfQogCi1zdGF0aWMgdm9pZCBmaW5kVGlsZVByb2dyYW1Vbmlm
b3JtcyhMYXllclJlbmRlcmVyQ2hyb21pdW0qIGxheWVyUmVuZGVyZXIsIGNvbnN0IENDVGlsZURy
YXdRdWFkKiBxdWFkLCBUaWxlUHJvZ3JhbVVuaWZvcm1zJiB1bmlmb3JtcykKK3N0YXRpYyB2b2lk
IGZpbmRUaWxlUHJvZ3JhbVVuaWZvcm1zKExheWVyUmVuZGVyZXJDaHJvbWl1bSogbGF5ZXJSZW5k
ZXJlciwgY29uc3QgQ0NUaWxlRHJhd1F1YWQqIHF1YWQsIFRpbGVQcm9ncmFtVW5pZm9ybXMmIHVu
aWZvcm1zLCBib29sIHF1YWRJc0NsaXBwZWQpCiB7Ci0gICAgaWYgKHF1YWQtPmlzQW50aWFsaWFz
ZWQoKSkgeworICAgIC8vIEZvciBub3csIHdlIHNpbXBseSBza2lwIGFudGktYWxpYXNpbmcgd2l0
aCB0aGUgcXVhZCBpcyBjbGlwcGVkLiBUaGlzIG9ubHkgaGFwcGVucworICAgIC8vIG9uIHBlcnNw
ZWN0aXZlIHRyYW5zZm9ybWVkIGxheWVycyB0aGF0IGdvIHBhcnRpYWxseSBiZWhpbmQgdGhlIGNh
bWVyYS4KKyAgICBpZiAocXVhZC0+aXNBbnRpYWxpYXNlZCgpICYmICFxdWFkSXNDbGlwcGVkKSB7
CiAgICAgICAgIGlmIChxdWFkLT5zd2l6emxlQ29udGVudHMoKSkgewogICAgICAgICAgICAgY29u
c3QgQ0NUaWxlZExheWVySW1wbDo6UHJvZ3JhbVN3aXp6bGVBQSogcHJvZ3JhbSA9IGxheWVyUmVu
ZGVyZXItPnRpbGVyUHJvZ3JhbVN3aXp6bGVBQSgpOwogICAgICAgICAgICAgdGlsZVVuaWZvcm1M
b2NhdGlvbihwcm9ncmFtLCB1bmlmb3Jtcyk7CkBAIC02NDEsOCArNjQ0LDE3IEBAIHZvaWQgTGF5
ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3VGlsZVF1YWQoY29uc3QgQ0NUaWxlRHJhd1F1YWQqIHF1
YWQpCiAgICAgZmxvYXQgZnJhZ21lbnRUZXhTY2FsZVggPSBjbGFtcFJlY3Qud2lkdGgoKSAvIHRl
eHR1cmVTaXplLndpZHRoKCk7CiAgICAgZmxvYXQgZnJhZ21lbnRUZXhTY2FsZVkgPSBjbGFtcFJl
Y3QuaGVpZ2h0KCkgLyB0ZXh0dXJlU2l6ZS5oZWlnaHQoKTsKIAorCisgICAgRmxvYXRRdWFkIGxv
Y2FsUXVhZDsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBkZXZpY2VUcmFuc2Zvcm0gPSBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCh3aW5kb3dNYXRyaXgoKSAqIHByb2plY3Rpb25NYXRyaXgoKSAqIHF1
YWQtPnF1YWRUcmFuc2Zvcm0oKSkudG8yZFRyYW5zZm9ybSgpOworICAgIGlmICghZGV2aWNlVHJh
bnNmb3JtLmlzSW52ZXJ0aWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIGNsaXBw
ZWQgPSBmYWxzZTsKKyAgICBGbG9hdFF1YWQgZGV2aWNlTGF5ZXJRdWFkID0gQ0NNYXRoVXRpbDo6
bWFwUXVhZChkZXZpY2VUcmFuc2Zvcm0sIEZsb2F0UXVhZChxdWFkLT5sYXllclJlY3QoKSksIGNs
aXBwZWQpOworCiAgICAgVGlsZVByb2dyYW1Vbmlmb3JtcyB1bmlmb3JtczsKLSAgICBmaW5kVGls
ZVByb2dyYW1Vbmlmb3Jtcyh0aGlzLCBxdWFkLCB1bmlmb3Jtcyk7CisgICAgZmluZFRpbGVQcm9n
cmFtVW5pZm9ybXModGhpcywgcXVhZCwgdW5pZm9ybXMsIGNsaXBwZWQpOwogCiAgICAgR0xDKGNv
bnRleHQoKSwgY29udGV4dCgpLT51c2VQcm9ncmFtKHVuaWZvcm1zLnByb2dyYW0pKTsKICAgICBH
TEMoY29udGV4dCgpLCBjb250ZXh0KCktPnVuaWZvcm0xaSh1bmlmb3Jtcy5zYW1wbGVyTG9jYXRp
b24sIDApKTsKQEAgLTY1MSwxMyArNjYzLDggQEAgdm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06
OmRyYXdUaWxlUXVhZChjb25zdCBDQ1RpbGVEcmF3UXVhZCogcXVhZCkKICAgICBHTEMoY29udGV4
dCgpLCBjb250ZXh0KCktPnRleFBhcmFtZXRlcmkoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVf
MkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX01JTl9GSUxURVIsIHF1YWQtPnRleHR1cmVG
aWx0ZXIoKSkpOwogICAgIEdMQyhjb250ZXh0KCksIGNvbnRleHQoKS0+dGV4UGFyYW1ldGVyaShH
cmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVf
TUFHX0ZJTFRFUiwgcXVhZC0+dGV4dHVyZUZpbHRlcigpKSk7CiAKLSAgICBGbG9hdFF1YWQgbG9j
YWxRdWFkOwotICAgIGlmIChxdWFkLT5pc0FudGlhbGlhc2VkKCkpIHsKLSAgICAgICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggZGV2aWNlVHJhbnNmb3JtID0gVHJhbnNmb3JtYXRpb25NYXRyaXgod2lu
ZG93TWF0cml4KCkgKiBwcm9qZWN0aW9uTWF0cml4KCkgKiBxdWFkLT5xdWFkVHJhbnNmb3JtKCkp
LnRvMmRUcmFuc2Zvcm0oKTsKLSAgICAgICAgaWYgKCFkZXZpY2VUcmFuc2Zvcm0uaXNJbnZlcnRp
YmxlKCkpCi0gICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgRmxvYXRRdWFkIGRldmljZUxh
eWVyUXVhZCA9IGRldmljZVRyYW5zZm9ybS5tYXBRdWFkKEZsb2F0UXVhZChxdWFkLT5sYXllclJl
Y3QoKSkpOworICAgIGlmICghY2xpcHBlZCAmJiBxdWFkLT5pc0FudGlhbGlhc2VkKCkpIHsKIAog
ICAgICAgICBDQ0xheWVyUXVhZCBkZXZpY2VMYXllckJvdW5kcyA9IENDTGF5ZXJRdWFkKEZsb2F0
UXVhZChkZXZpY2VMYXllclF1YWQuYm91bmRpbmdCb3goKSkpOwogICAgICAgICBkZXZpY2VMYXll
ckJvdW5kcy5pbmZsYXRlQW50aUFsaWFzaW5nRGlzdGFuY2UoKTsKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENv
bW1vbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q0xheWVyVHJlZUhvc3RDb21tb24uY3BwCmluZGV4IDQxOGRjYTE5MGIzZWJlNjQ0YTI0YWMzZWUy
ODJiYjVmNWM5Mjk2MmQuLjk1MTdlN2QyNzUwYmYwZTRiYWU5Nzc3NDEzMDg1NzU4Mzc1NDVjN2Qg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmNwcApAQCAtMzcsNiAr
MzcsNyBAQAogI2luY2x1ZGUgImNjL0NDTGF5ZXJJbXBsLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXll
ckl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllclNvcnRlci5oIgorI2luY2x1ZGUgImNj
L0NDTWF0aFV0aWwuaCIKICNpbmNsdWRlICJjYy9DQ1JlbmRlclN1cmZhY2UuaCIKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewpAQCAtNDQsNyArNDUsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBJbnRS
ZWN0IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QoY29uc3QgSW50
UmVjdCYgdGFyZ2V0U3VyZmFjZVJlY3QsIGNvbnN0IEludFJlY3QmIGxheWVyQm91bmRSZWN0LCBj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKQogewogICAgIC8vIElzIHRoaXMg
bGF5ZXIgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgdGFyZ2V0IHN1cmZhY2U/Ci0gICAgSW50
UmVjdCBsYXllckluU3VyZmFjZVNwYWNlID0gdHJhbnNmb3JtLm1hcFJlY3QobGF5ZXJCb3VuZFJl
Y3QpOworICAgIEludFJlY3QgbGF5ZXJJblN1cmZhY2VTcGFjZSA9IENDTWF0aFV0aWw6Om1hcENs
aXBwZWRSZWN0KHRyYW5zZm9ybSwgbGF5ZXJCb3VuZFJlY3QpOwogICAgIGlmICh0YXJnZXRTdXJm
YWNlUmVjdC5jb250YWlucyhsYXllckluU3VyZmFjZVNwYWNlKSkKICAgICAgICAgcmV0dXJuIGxh
eWVyQm91bmRSZWN0OwogCkBAIC01OSw3ICs2MCw3IEBAIEludFJlY3QgQ0NMYXllclRyZWVIb3N0
Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdChjb25zdCBJbnRSZWN0JiB0YXJnZXRTdXJmYWNl
CiAgICAgLy8gYXhpcy1hbGlnbmVkKSwgYnV0IGlzIGEgcmVhc29uYWJsZSBmaWx0ZXIgb24gdGhl
IHNwYWNlIHRvIGNvbnNpZGVyLgogICAgIC8vIE5vbi1pbnZlcnRpYmxlIHRyYW5zZm9ybXMgd2ls
bCBjcmVhdGUgYW4gZW1wdHkgcmVjdCBoZXJlLgogICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4IHN1cmZhY2VUb0xheWVyID0gdHJhbnNmb3JtLmludmVyc2UoKTsKLSAgICBJbnRSZWN0IGxh
eWVyUmVjdCA9IHN1cmZhY2VUb0xheWVyLnByb2plY3RRdWFkKEZsb2F0UXVhZChGbG9hdFJlY3Qo
bWluaW1hbFN1cmZhY2VSZWN0KSkpLmVuY2xvc2luZ0JvdW5kaW5nQm94KCk7CisgICAgSW50UmVj
dCBsYXllclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KENDTWF0aFV0aWw6OnByb2plY3RDbGlwcGVk
UmVjdChzdXJmYWNlVG9MYXllciwgRmxvYXRSZWN0KG1pbmltYWxTdXJmYWNlUmVjdCkpKTsKICAg
ICBsYXllclJlY3QuaW50ZXJzZWN0KGxheWVyQm91bmRSZWN0KTsKICAgICByZXR1cm4gbGF5ZXJS
ZWN0OwogfQpAQCAtNzAsNyArNzEsNiBAQCBzdGF0aWMgYm9vbCBpc1NjYWxlT3JUcmFuc2xhdGlv
bihjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbSkKICAgICAgICAgICAgJiYgIW0ubTIxKCkg
JiYgIW0ubTIzKCkgJiYgIW0ubTI0KCkKICAgICAgICAgICAgJiYgIW0ubTMxKCkgJiYgIW0ubTMy
KCkgJiYgIW0ubTQzKCkKICAgICAgICAgICAgJiYgbS5tNDQoKTsKLQogfQogCiB0ZW1wbGF0ZTx0
eXBlbmFtZSBMYXllclR5cGU+CkBAIC00MDksNyArNDA5LDcgQEAgc3RhdGljIGJvb2wgY2FsY3Vs
YXRlRHJhd1RyYW5zZm9ybXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwoTGF5ZXJUeXBlKiBsYXllciwg
TGF5ZXIKICAgICAgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zvcm0oY29tYmluZWRUcmFuc2Zvcm0p
OwogICAgICAgICBsYXllci0+c2V0RHJhd1RyYW5zZm9ybUlzQW5pbWF0aW5nKGFuaW1hdGluZ1Ry
YW5zZm9ybVRvVGFyZ2V0KTsKICAgICAgICAgbGF5ZXItPnNldFNjcmVlblNwYWNlVHJhbnNmb3Jt
SXNBbmltYXRpbmcoYW5pbWF0aW5nVHJhbnNmb3JtVG9TY3JlZW4pOwotICAgICAgICB0cmFuc2Zv
cm1lZExheWVyUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QobGF5ZXItPmRyYXdUcmFuc2Zvcm0oKS5t
YXBSZWN0KGxheWVyUmVjdCkpOworICAgICAgICB0cmFuc2Zvcm1lZExheWVyUmVjdCA9IGVuY2xv
c2luZ0ludFJlY3QoQ0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3QobGF5ZXItPmRyYXdUcmFuc2Zv
cm0oKSwgbGF5ZXJSZWN0KSk7CiAKICAgICAgICAgbGF5ZXItPnNldERyYXdPcGFjaXR5KGRyYXdP
cGFjaXR5KTsKICAgICAgICAgbGF5ZXItPnNldERyYXdPcGFjaXR5SXNBbmltYXRpbmcoZHJhd09w
YWNpdHlJc0FuaW1hdGluZyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBiZDRk
NmQ0MTZmZTNlYTkxZjA0ZTk5MDRhY2E1NDM3Y2FmNzI5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNw
cApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
CisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgorCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgor
I2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJU
cmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBI
b21vZ2VuZW91c0Nvb3JkaW5hdGUgeworCisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlKGRvdWJs
ZSBuZXdYLCBkb3VibGUgbmV3WSwgZG91YmxlIG5ld1osIGRvdWJsZSBuZXdXKQorICAgICAgICA6
IHgobmV3WCkKKyAgICAgICAgLCB5KG5ld1kpCisgICAgICAgICwgeihuZXdaKQorICAgICAgICAs
IHcobmV3VykKKyAgICB7CisgICAgfQorCisgICAgYm9vbCBzaG91bGRCZUNsaXBwZWQoKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIHcgPD0gMDsKKyAgICB9CisKKyAgICBGbG9hdFBvaW50
IGNhcnRlc2lhblBvaW50MmQoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHcgPT0gMSkKKyAg
ICAgICAgICAgIHJldHVybiBGbG9hdFBvaW50KHgsIHkpOworCisgICAgICAgIC8vIEZvciBub3cs
IGJlY2F1c2UgdGhpcyBjb2RlIGlzIHVzZWQgcHJpdmF0ZWx5IG9ubHkgYnkgQ0NNYXRoVXRpbCwg
aXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHcgPT0gMCwgYW5kIHdlIGRvIG5vdCB5ZXQg
bmVlZCB0byBoYW5kbGUgdGhhdCBjYXNlLgorICAgICAgICBBU1NFUlQodyk7CisgICAgICAgIGRv
dWJsZSBpbnZXID0gMS4wIC8gdzsKKyAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnQoeCAqIGludlcs
IHkgKiBpbnZXKTsKKyAgICB9CisKKyAgICBkb3VibGUgeCwgeSwgeiwgdzsKK307CisKK3N0YXRp
YyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgcHJvamVjdFBvaW50KGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgZG91YmxlIHgg
PSBwLngoKTsKKyAgICBkb3VibGUgeSA9IHAueSgpOworICAgIGRvdWJsZSB6ID0gLSh0cmFuc2Zv
cm0ubTEzKCkgKiB4ICsgdHJhbnNmb3JtLm0yMygpICogeSArIHRyYW5zZm9ybS5tNDMoKSkgLyB0
cmFuc2Zvcm0ubTMzKCk7CisgICAgLy8gaW1wbGljaXQgZGVmaW5pdGlvbiBvZiB3ID0gMTsKKwor
ICAgIGRvdWJsZSBvdXRYID0geCAqIHRyYW5zZm9ybS5tMTEoKSArIHkgKiB0cmFuc2Zvcm0ubTIx
KCkgKyB6ICogdHJhbnNmb3JtLm0zMSgpICsgdHJhbnNmb3JtLm00MSgpOworICAgIGRvdWJsZSBv
dXRZID0geCAqIHRyYW5zZm9ybS5tMTIoKSArIHkgKiB0cmFuc2Zvcm0ubTIyKCkgKyB6ICogdHJh
bnNmb3JtLm0zMigpICsgdHJhbnNmb3JtLm00MigpOworICAgIGRvdWJsZSBvdXRaID0geCAqIHRy
YW5zZm9ybS5tMTMoKSArIHkgKiB0cmFuc2Zvcm0ubTIzKCkgKyB6ICogdHJhbnNmb3JtLm0zMygp
ICsgdHJhbnNmb3JtLm00MygpOworICAgIGRvdWJsZSBvdXRXID0geCAqIHRyYW5zZm9ybS5tMTQo
KSArIHkgKiB0cmFuc2Zvcm0ubTI0KCkgKyB6ICogdHJhbnNmb3JtLm0zNCgpICsgdHJhbnNmb3Jt
Lm00NCgpOworCisgICAgcmV0dXJuIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZShvdXRYLCBvdXRZLCBv
dXRaLCBvdXRXKTsKK30KKworc3RhdGljIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBtYXBQb2ludChj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFBvaW50JiBw
KQoreworICAgIGRvdWJsZSB4ID0gcC54KCk7CisgICAgZG91YmxlIHkgPSBwLnkoKTsKKyAgICAv
LyBpbXBsaWNpdCBkZWZpbml0aW9uIG9mIHogPSAwOworICAgIC8vIGltcGxpY2l0IGRlZmluaXRp
b24gb2YgdyA9IDE7CisKKyAgICBkb3VibGUgb3V0WCA9IHggKiB0cmFuc2Zvcm0ubTExKCkgKyB5
ICogdHJhbnNmb3JtLm0yMSgpICsgdHJhbnNmb3JtLm00MSgpOworICAgIGRvdWJsZSBvdXRZID0g
eCAqIHRyYW5zZm9ybS5tMTIoKSArIHkgKiB0cmFuc2Zvcm0ubTIyKCkgKyB0cmFuc2Zvcm0ubTQy
KCk7CisgICAgZG91YmxlIG91dFogPSB4ICogdHJhbnNmb3JtLm0xMygpICsgeSAqIHRyYW5zZm9y
bS5tMjMoKSArIHRyYW5zZm9ybS5tNDMoKTsKKyAgICBkb3VibGUgb3V0VyA9IHggKiB0cmFuc2Zv
cm0ubTE0KCkgKyB5ICogdHJhbnNmb3JtLm0yNCgpICsgdHJhbnNmb3JtLm00NCgpOworCisgICAg
cmV0dXJuIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZShvdXRYLCBvdXRZLCBvdXRaLCBvdXRXKTsKK30K
Kworc3RhdGljIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRn
ZShjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21vZ2VuZW91c0Nvb3Jk
aW5hdGUmIGgyKQoreworICAgIC8vIFBvaW50cyBoMSBhbmQgaDIgZm9ybSBhIGxpbmUgaW4gNGQs
IGFuZCBhbnkgcG9pbnQgb24gdGhhdCBsaW5lIGNhbiBiZSByZXByZXNlbnRlZAorICAgIC8vIGFz
IGFuIGludGVycG9sYXRpb24gYmV0d2VlbiBoMSBhbmQgaDI6CisgICAgLy8gICAgcCA9ICgxLXQp
IGgxICsgKHQpIGgyCisgICAgLy8KKyAgICAvLyBXZSB3YW50IHRvIGNvbXB1dGUgcG9pbnQgcCBz
dWNoIHRoYXQgcC53ID09IDAuIFRvIGRvIHRoaXMsIHdlIHNvbHZlIGZvciB0IGluIHRoZQorICAg
IC8vIGZvbGxvd2luZyBlcXVhdGlvbjoKKyAgICAvLyAgIHAudyA9IDAgPSAoMS10KSAqIGgxLncg
KyAodCkgKiBoMi53CisgICAgLy8KKyAgICAvLyBPbmNlIHBhcmFtdGVyIHQgaXMga25vd24sIHRo
ZSByZXN0IG9mIHAgY2FuIGJlIGNvbXB1dGVkIHZpYSBwID0gKDEtdCkgaDEgKyAodCkgaDIuCisK
KyAgICAvLyBUZWNobmljYWxseSB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBmb2xsb3dp
bmcgYXNzZXJ0aW9uLCBidXQgaXRzIGEgZ29vZCBpZGVhIHRvIGtlZXAgaXQgYW4gZXhwbGljaXQg
c2FuaXR5IGNoZWNrIGhlcmUuCisgICAgQVNTRVJUKGgyLncgIT0gaDEudyk7CisgICAgLy8gRXhh
Y3RseSBvbmUgb2YgaDEgb3IgaDIgKGJ1dCBub3QgYm90aCkgbXVzdCBiZSBvbiB0aGUgbmVnYXRp
dmUgc2lkZSBvZiB0aGUgdyBwbGFuZSB3aGVuIHRoaXMgaXMgY2FsbGVkLgorICAgIEFTU0VSVCho
MS5zaG91bGRCZUNsaXBwZWQoKSBeIGgyLnNob3VsZEJlQ2xpcHBlZCgpKTsKKworICAgIGRvdWJs
ZSB0ID0gKC1oMS53KSAvIChoMi53IC0gaDEudyk7CisKKyAgICBkb3VibGUgeCA9ICgxLXQpICog
aDEueCArIHQgKiBoMi54OworICAgIGRvdWJsZSB5ID0gKDEtdCkgKiBoMS55ICsgdCAqIGgyLnk7
CisgICAgZG91YmxlIHogPSAoMS10KSAqIGgxLnogKyB0ICogaDIuejsKKyAgICBkb3VibGUgdyA9
IDAuMDAwMDE7IC8vIG9yIGFueSBwb3NpdGl2ZSBub24temVybyBzbWFsbCBlcHNpbG9uCisKKyAg
ICByZXR1cm4gSG9tb2dlbmVvdXNDb29yZGluYXRlKHgsIHksIHosIHcpOworfQorCitzdGF0aWMg
dm9pZCBjb21wdXRlQ2xpcHBlZFZlcnRpY2VzRm9yVHJhbnNmb3JtZWRRdWFkKGNvbnN0IEhvbW9n
ZW5lb3VzQ29vcmRpbmF0ZSYgaDEsIGNvbnN0IEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSYgaDIsIGNv
bnN0IEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSYgaDMsIGNvbnN0IEhvbW9nZW5lb3VzQ29vcmRpbmF0
ZSYgaDQsIFZlY3RvcjxIb21vZ2VuZW91c0Nvb3JkaW5hdGU+JiB2ZXJ0aWNlc09mQ2xpcHBlZFF1
YWQpCit7CisgICAgLy8gUGVyZm9ybSBjbGlwcGluZyBpbiB0aGlzIHNwZWNpZmljIG9yZGVyIHNv
IHRoYXQgdmVydGljZXMgd2lsbCByZXRhaW4gdGhlaXIgQ1cgLyBDQ1cgcHJvcGVydHkuCisKKyAg
ICBpZiAoIWgxLnNob3VsZEJlQ2xpcHBlZCgpKQorICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1
YWQuYXBwZW5kKGgxKTsKKworICAgIGlmIChoMS5zaG91bGRCZUNsaXBwZWQoKSBeIGgyLnNob3Vs
ZEJlQ2xpcHBlZCgpKQorICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQuYXBwZW5kKGNvbXB1
dGVDbGlwcGVkUG9pbnRGb3JFZGdlKGgxLCBoMikpOworCisgICAgaWYgKCFoMi5zaG91bGRCZUNs
aXBwZWQoKSkKKyAgICAgICAgdmVydGljZXNPZkNsaXBwZWRRdWFkLmFwcGVuZChoMik7CisKKyAg
ICBpZiAoaDIuc2hvdWxkQmVDbGlwcGVkKCkgXiBoMy5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAg
ICAgdmVydGljZXNPZkNsaXBwZWRRdWFkLmFwcGVuZChjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRn
ZShoMiwgaDMpKTsKKworICAgIGlmICghaDMuc2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIHZl
cnRpY2VzT2ZDbGlwcGVkUXVhZC5hcHBlbmQoaDMpOworCisgICAgaWYgKGgzLnNob3VsZEJlQ2xp
cHBlZCgpIF4gaDQuc2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIHZlcnRpY2VzT2ZDbGlwcGVk
UXVhZC5hcHBlbmQoY29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UoaDMsIGg0KSk7CisKKyAgICBp
ZiAoIWg0LnNob3VsZEJlQ2xpcHBlZCgpKQorICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQu
YXBwZW5kKGg0KTsKKworICAgIGlmIChoNC5zaG91bGRCZUNsaXBwZWQoKSBeIGgxLnNob3VsZEJl
Q2xpcHBlZCgpKQorICAgICAgICB2ZXJ0aWNlc09mQ2xpcHBlZFF1YWQuYXBwZW5kKGNvbXB1dGVD
bGlwcGVkUG9pbnRGb3JFZGdlKGg0LCBoMSkpOworfQorCitzdGF0aWMgRmxvYXRSZWN0IGNvbXB1
dGVFbmNsb3NpbmdSZWN0T2ZDbGlwcGVkUXVhZChjb25zdCBWZWN0b3I8SG9tb2dlbmVvdXNDb29y
ZGluYXRlPiYgdmVydGljZXNPZkNsaXBwZWRRdWFkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24g
Y29tcHV0ZXMgdGhlIDJkIEZsb2F0UmVjdCB0aGF0IGVuY2xvc2VzIHRoZSBjbGlwcGVkIHF1YWQu
IE5vdGUgdGhhdAorICAgIC8vIGhlcmUgd2UgZmluYWxseSBjb252ZXJ0IGZyb20gaG9tb2dlbmVv
dXMgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzCisgICAgLy8gKGkuZS4gZGl2
aWRlLWJ5LXcgaWYgbmVlZGVkKS4KKworICAgIGZsb2F0IHhtaW4gPSBzdGQ6Om51bWVyaWNfbGlt
aXRzPGZsb2F0Pjo6bWF4KCk7CisgICAgZmxvYXQgeG1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8
ZmxvYXQ+OjptaW4oKTsKKyAgICBmbG9hdCB5bWluID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9h
dD46Om1heCgpOworICAgIGZsb2F0IHltYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6
bWluKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlcnRpY2VzT2ZDbGlwcGVkUXVh
ZC5zaXplKCk7ICsraSkgeworICAgICAgICBGbG9hdFBvaW50IGNsaXBwZWRQb2ludCA9IHZlcnRp
Y2VzT2ZDbGlwcGVkUXVhZFtpXS5jYXJ0ZXNpYW5Qb2ludDJkKCk7CisgICAgICAgIHhtaW4gPSBz
dGQ6Om1pbihjbGlwcGVkUG9pbnQueCgpLCB4bWluKTsKKyAgICAgICAgeG1heCA9IHN0ZDo6bWF4
KGNsaXBwZWRQb2ludC54KCksIHhtYXgpOworICAgICAgICB5bWluID0gc3RkOjptaW4oY2xpcHBl
ZFBvaW50LnkoKSwgeW1pbik7CisgICAgICAgIHltYXggPSBzdGQ6Om1heChjbGlwcGVkUG9pbnQu
eSgpLCB5bWF4KTsKKyAgICB9CisKKyAgICByZXR1cm4gRmxvYXRSZWN0KEZsb2F0UG9pbnQoeG1p
biwgeW1pbiksIEZsb2F0U2l6ZSh4bWF4IC0geG1pbiwgeW1heCAtIHltaW4pKTsKK30KKworc3Rh
dGljIEZsb2F0UmVjdCBjb21wdXRlRW5jbG9zaW5nUmVjdChjb25zdCBIb21vZ2VuZW91c0Nvb3Jk
aW5hdGUmIGgxLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgyLCBjb25zdCBIb21vZ2Vu
ZW91c0Nvb3JkaW5hdGUmIGgzLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGg0KQorewor
ICAgIC8vIElmIG5vIHZlcnRpY2VzIG9uIHRoZSBxdWFkIGFyZSBjbGlwcGVkLCB0aGVuIHdlIGNh
biBzaW1wbHkgcmV0dXJuIHRoZSBlbmNsb3NpbmcgcmVjdCBkaXJlY3RseS4KKyAgICBib29sIGNs
aXBwZWQgPSBoMS5zaG91bGRCZUNsaXBwZWQoKSB8fCBoMi5zaG91bGRCZUNsaXBwZWQoKSB8fCBo
My5zaG91bGRCZUNsaXBwZWQoKSB8fCBoNC5zaG91bGRCZUNsaXBwZWQoKTsKKyAgICBpZiAoIWNs
aXBwZWQpIHsKKyAgICAgICAgRmxvYXRRdWFkIG1hcHBlZFF1YWQgPSBGbG9hdFF1YWQoaDEuY2Fy
dGVzaWFuUG9pbnQyZCgpLCBoMi5jYXJ0ZXNpYW5Qb2ludDJkKCksIGgzLmNhcnRlc2lhblBvaW50
MmQoKSwgaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlZFF1YWQu
Ym91bmRpbmdCb3goKTsKKyAgICB9CisKKyAgICAvLyBDb2xsZWN0IHRoZSBsaXN0IG9mIHZlcnRp
Y2VzIHRoYXQgcmVwcmVzZW50IHRoZSBjbGlwcGVkIHF1YWQuCisgICAgVmVjdG9yPEhvbW9nZW5l
b3VzQ29vcmRpbmF0ZT4gdmVydGljZXNPZkNsaXBwZWRRdWFkOworICAgIGNvbXB1dGVDbGlwcGVk
VmVydGljZXNGb3JUcmFuc2Zvcm1lZFF1YWQoaDEsIGgyLCBoMywgaDQsIHZlcnRpY2VzT2ZDbGlw
cGVkUXVhZCk7CisKKyAgICAvLyBBZnRlciBoYXZpbmcgY2xpcHBlZCwgbm93IHdlIGNhbiBjb252
ZXJ0IHRvIGNhcnRlc2lhbiBjb29yZGluYXRlcyBhbmQgY29tcHV0ZSB0aGUgMmQgZW5jbG9zaW5n
IHJlY3Qgb2YgdGhlIGNsaXBwZWQgcG9pbnRzLgorICAgIHJldHVybiBjb21wdXRlRW5jbG9zaW5n
UmVjdE9mQ2xpcHBlZFF1YWQodmVydGljZXNPZkNsaXBwZWRRdWFkKTsKK30KKworSW50UmVjdCBD
Q01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJh
bnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0KQoreworICAgIHJldHVybiBlbmNsb3NpbmdJ
bnRSZWN0KG1hcENsaXBwZWRSZWN0KHRyYW5zZm9ybSwgRmxvYXRSZWN0KHNyY1JlY3QpKSk7Cit9
CisKK0Zsb2F0UmVjdCBDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdChjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QpCit7CisgICAg
aWYgKHRyYW5zZm9ybS5pc0lkZW50aXR5T3JUcmFuc2xhdGlvbigpKSB7CisgICAgICAgIEZsb2F0
UmVjdCBtYXBwZWRSZWN0KHNyY1JlY3QpOworICAgICAgICBtYXBwZWRSZWN0Lm1vdmUoc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHRyYW5zZm9ybS5tNDEoKSksIHN0YXRpY19jYXN0PGZsb2F0Pih0cmFuc2Zv
cm0ubTQyKCkpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlZFJlY3Q7CisgICAgfQorCisgICAgLy8g
QXBwbHkgdGhlIHRyYW5zZm9ybSwgYnV0IHJldGFpbiB0aGUgcmVzdWx0IGluIGhvbW9nZW5lb3Vz
IGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVhZCBxID0gRmxvYXRRdWFkKEZsb2F0UmVjdChzcmNS
ZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9pbnQodHJhbnNmb3Jt
LCBxLnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1hcFBvaW50KHRyYW5z
Zm9ybSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMgPSBtYXBQb2ludCh0
cmFuc2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gbWFwUG9p
bnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgcmV0dXJuIGNvbXB1dGVFbmNsb3NpbmdSZWN0
KGgxLCBoMiwgaDMsIGg0KTsKK30KKworRmxvYXRSZWN0IENDTWF0aFV0aWw6OnByb2plY3RDbGlw
cGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9h
dFJlY3QmIHNyY1JlY3QpCit7CisgICAgLy8gUGVyZm9ybSB0aGUgcHJvamVjdGlvbiwgYnV0IHJl
dGFpbiB0aGUgcmVzdWx0IGluIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVh
ZCBxID0gRmxvYXRRdWFkKEZsb2F0UmVjdChzcmNSZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29y
ZGluYXRlIGgxID0gcHJvamVjdFBvaW50KHRyYW5zZm9ybSwgcS5wMSgpKTsKKyAgICBIb21vZ2Vu
ZW91c0Nvb3JkaW5hdGUgaDIgPSBwcm9qZWN0UG9pbnQodHJhbnNmb3JtLCBxLnAyKCkpOworICAg
IEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMyA9IHByb2plY3RQb2ludCh0cmFuc2Zvcm0sIHEucDMo
KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gcHJvamVjdFBvaW50KHRyYW5zZm9y
bSwgcS5wNCgpKTsKKworICAgIHJldHVybiBjb21wdXRlRW5jbG9zaW5nUmVjdChoMSwgaDIsIGgz
LCBoNCk7Cit9CisKK0Zsb2F0UXVhZCBDQ01hdGhVdGlsOjptYXBRdWFkKGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UXVhZCYgcSwgYm9vbCYgY2xpcHBl
ZCkKK3sKKyAgICBpZiAodHJhbnNmb3JtLmlzSWRlbnRpdHlPclRyYW5zbGF0aW9uKCkpIHsKKyAg
ICAgICAgRmxvYXRRdWFkIG1hcHBlZFF1YWQocSk7CisgICAgICAgIG1hcHBlZFF1YWQubW92ZShz
dGF0aWNfY2FzdDxmbG9hdD4odHJhbnNmb3JtLm00MSgpKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRy
YW5zZm9ybS5tNDIoKSkpOworICAgICAgICByZXR1cm4gbWFwcGVkUXVhZDsKKyAgICB9CisKKyAg
ICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDEgPSBtYXBQb2ludCh0cmFuc2Zvcm0sIHEucDEoKSk7
CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgyID0gbWFwUG9pbnQodHJhbnNmb3JtLCBxLnAy
KCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMyA9IG1hcFBvaW50KHRyYW5zZm9ybSwg
cS5wMygpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDQgPSBtYXBQb2ludCh0cmFuc2Zv
cm0sIHEucDQoKSk7CisKKyAgICBjbGlwcGVkID0gaDEuc2hvdWxkQmVDbGlwcGVkKCkgfHwgaDIu
c2hvdWxkQmVDbGlwcGVkKCkgfHwgaDMuc2hvdWxkQmVDbGlwcGVkKCkgfHwgaDQuc2hvdWxkQmVD
bGlwcGVkKCk7CisKKyAgICAvLyBSZXN1bHQgd2lsbCBiZSBpbnZhbGlkIGlmIGNsaXBwZWQgPT0g
dHJ1ZS4gQnV0LCBjb21wdXRlIGl0IGFueXdheSBqdXN0IGluIGNhc2UsIHRvIGVtdWxhdGUgZXhp
c3RpbmcgYmVoYXZpb3IuCisgICAgcmV0dXJuIEZsb2F0UXVhZChoMS5jYXJ0ZXNpYW5Qb2ludDJk
KCksIGgyLmNhcnRlc2lhblBvaW50MmQoKSwgaDMuY2FydGVzaWFuUG9pbnQyZCgpLCBoNC5jYXJ0
ZXNpYW5Qb2ludDJkKCkpOworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6cHJvamVjdFF1YWQo
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRRdWFkJiBx
LCBib29sJiBjbGlwcGVkKQoreworICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOworICAgIGJv
b2wgY2xpcHBlZFBvaW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3JtLnByb2pl
Y3RQb2ludChxLnAxKCksICZjbGlwcGVkUG9pbnQpKTsKKyAgICBjbGlwcGVkID0gY2xpcHBlZFBv
aW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAy
KCksICZjbGlwcGVkUG9pbnQpKTsKKyAgICBjbGlwcGVkIHw9IGNsaXBwZWRQb2ludDsKKyAgICBw
cm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAmY2xpcHBl
ZFBvaW50KSk7CisgICAgY2xpcHBlZCB8PSBjbGlwcGVkUG9pbnQ7CisgICAgcHJvamVjdGVkUXVh
ZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsaXBwZWRQb2ludCkpOwor
ICAgIGNsaXBwZWQgfD0gY2xpcHBlZFBvaW50OworCisgICAgcmV0dXJuIHByb2plY3RlZFF1YWQ7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li5kOWQwMzllODYwNjc3Nzc3YmUyNzYxMWNjNGVmM2MzZTg5NzczNjJlCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRo
VXRpbC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ0NNYXRoVXRp
bF9oCisjZGVmaW5lIENDTWF0aFV0aWxfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEludFJlY3Q7CitjbGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBGbG9hdFF1YWQ7CitjbGFzcyBUcmFu
c2Zvcm1hdGlvbk1hdHJpeDsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBtYXRoIGhlbHBlciBm
dW5jdGlvbmFsaXR5IHRoYXQgZG9lcyBub3QgYmVsb25nIGluIFdlYkNvcmUuCisvLyBJdCBpcyBw
b3NzaWJsZSB0aGF0IHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgbWlncmF0ZWQgdG8gV2Vi
Q29yZSBldmVudHVhbGx5LgorY2xhc3MgQ0NNYXRoVXRpbCB7CitwdWJsaWM6CisKKyAgICAvLyBC
YWNrZ3JvdW5kOiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjb2RlIGluIFdlYkNvcmUgZG9lcyBub3Qg
ZG8gdGhlIHJpZ2h0IHRoaW5nIGluCisgICAgLy8gbWFwUmVjdCAvIG1hcFF1YWQgLyBwcm9qZWN0
UXVhZCB3aGVuIHRoZXJlIGlzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiB0aGF0IGNhdXNlcwor
ICAgIC8vIG9uZSBvZiB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgdG8gZ28gdG8gdyA8IDAuIElu
IHRob3NlIGNhc2VzLCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAvLyBwZXJmb3JtIGNsaXBwaW5n
IGluIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLCBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3Jt
LCBiZWZvcmUKKyAgICAvLyBkaXZpZGluZy1ieS13IHRvIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNv
b3JkaW5hdGVzLgorICAgIC8vCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgYXhp
cy1hbGlnbmVkIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY29ycmVjdGx5IGNsaXBwZWQsCisgICAg
Ly8gdHJhbnNmb3JtZWQgcG9seWdvbi4KKyAgICBzdGF0aWMgSW50UmVjdCBtYXBDbGlwcGVkUmVj
dChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEludFJlY3QmKTsKKyAgICBzdGF0
aWMgRmxvYXRSZWN0IG1hcENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jiwg
Y29uc3QgRmxvYXRSZWN0Jik7CisgICAgc3RhdGljIEZsb2F0UmVjdCBwcm9qZWN0Q2xpcHBlZFJl
Y3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFJlY3QmKTsKKworICAg
IC8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZG8gY29ycmVjdCBjbGlwcGluZyBhZ2Fp
bnN0IHcgPSAwIHBsYW5lLCBidXQgaXQKKyAgICAvLyBjb3JyZWN0bHkgZGV0ZWN0cyB0aGUgY2xp
cHBlZCBjb25kaXRpb24gdmlhIHRoZSBib29sZWFuIGNsaXBwZWQuCisgICAgc3RhdGljIEZsb2F0
UXVhZCBtYXBRdWFkKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRRdWFk
JiwgYm9vbCYgY2xpcHBlZCk7CisgICAgc3RhdGljIEZsb2F0UXVhZCBwcm9qZWN0UXVhZChjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UXVhZCYsIGJvb2wmIGNsaXBwZWQp
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gI2RlZmluZSBDQ01h
dGhVdGlsX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwCmluZGV4IGE1NDEx
ZWNjZjc2MTUxZWEzYmYwMDM1Y2Y5OThkMGJjYmRiMzI3YmIuLjY5ZmExMmNjZWU4MzA4N2EyMzAz
MDFmYzkxZjU2MTkyZDg1MTJhNDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2Vy
LmNwcApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgogI2lu
Y2x1ZGUgImNjL0NDTGF5ZXJJbXBsLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgogCiAj
aW5jbHVkZSA8YWxnb3JpdGhtPgogCkBAIC0yNzUsMjIgKzI3Niw2IEBAIHN0YXRpYyBpbmxpbmUg
SW50UmVjdCByZWN0U3VidHJhY3RSZWdpb24oY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgUmVn
aW9uJiByZWdpCiAgICAgcmV0dXJuIGJvdW5kc1JlY3Q7CiB9CiAKLXN0YXRpYyBGbG9hdFF1YWQg
cHJvamVjdFF1YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3Qg
RmxvYXRRdWFkJiBxLCBib29sJiBjbGFtcGVkKQotewotICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRR
dWFkOwotICAgIGJvb2wgY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJh
bnNmb3JtLnByb2plY3RQb2ludChxLnAxKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVk
ID0gY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2pl
Y3RQb2ludChxLnAyKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkIHw9IGNsYW1wZWRQ
b2ludDsKLSAgICBwcm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5w
MygpLCAmY2xhbXBlZFBvaW50KSk7Ci0gICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7Ci0gICAg
cHJvamVjdGVkUXVhZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsYW1w
ZWRQb2ludCkpOwotICAgIGNsYW1wZWQgfD0gY2xhbXBlZFBvaW50OwotCi0gICAgcmV0dXJuIHBy
b2plY3RlZFF1YWQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgSW50UmVjdCBjb21wdXRlVW5vY2NsdWRl
ZENvbnRlbnRSZWN0KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgY29udGVudFNwYWNlVHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzY2lzc29y
UmVjdCwgY29uc3QgUmVnaW9uJiBvY2NsdXNpb24pCiB7CiAgICAgaWYgKCFjb250ZW50U3BhY2VU
cmFuc2Zvcm0uaXNJbnZlcnRpYmxlKCkpCkBAIC0zMDAsNyArMjg1LDcgQEAgc3RhdGljIGlubGlu
ZSBJbnRSZWN0IGNvbXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QoY29uc3QgSW50UmVjdCYgY29u
dGVudFJlY3QsIGMKICAgICAvLyBUYWtlIHRoZSBlbmNsb3NpbmdJbnRSZWN0IGF0IGVhY2ggc3Rl
cCwgYXMgd2Ugd2FudCB0byBjb250YWluIGFueSB1bm9jY2x1ZGVkIHBhcnRpYWwgcGl4ZWxzIGlu
IHRoZSByZXN1bHRpbmcgSW50UmVjdC4KICAgICBJbnRSZWN0IHNocnVua1JlY3QgPSByZWN0U3Vi
dHJhY3RSZWdpb24oaW50ZXJzZWN0aW9uKGVuY2xvc2luZ0ludFJlY3QodHJhbnNmb3JtZWRSZWN0
KSwgc2Npc3NvclJlY3QpLCBvY2NsdXNpb24pOwogICAgIGJvb2wgY2xhbXBlZDsgLy8gRklYTUU6
IHByb2plY3RRdWFkIHJldHVybnMgaW52YWxpZCByZXN1bHRzIHdoZW4gYSBwb2ludCBnZXRzIGNs
YW1wZWQuIFRvIGJlIGZpeGVkIGluIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9ODA4MDYuCi0gICAgSW50UmVjdCB1bm9jY2x1ZGVkUmVjdCA9IGVuY2xvc2luZ0lu
dFJlY3QocHJvamVjdFF1YWQoY29udGVudFNwYWNlVHJhbnNmb3JtLmludmVyc2UoKSwgRmxvYXRR
dWFkKEZsb2F0UmVjdChzaHJ1bmtSZWN0KSksIGNsYW1wZWQpLmJvdW5kaW5nQm94KCkpOworICAg
IEludFJlY3QgdW5vY2NsdWRlZFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KENDTWF0aFV0aWw6OnBy
b2plY3RRdWFkKGNvbnRlbnRTcGFjZVRyYW5zZm9ybS5pbnZlcnNlKCksIEZsb2F0UXVhZChGbG9h
dFJlY3Qoc2hydW5rUmVjdCkpLCBjbGFtcGVkKS5ib3VuZGluZ0JveCgpKTsKICAgICBpZiAoY2xh
bXBlZCkKICAgICAgICAgcmV0dXJuIGNvbnRlbnRSZWN0OwogICAgIC8vIFRoZSByZWN0IGJhY2sg
aW4gY29udGVudCBzcGFjZSBpcyBhIGJvdW5kaW5nIGJveCBhbmQgbWF5IGV4dGVuZCBvdXRzaWRl
IG9mIHRoZSBvcmlnaW5hbCBjb250ZW50UmVjdCwgc28gY2xhbXAgaXQgdG8gdGhlIGNvbnRlbnRS
ZWN0Qm91bmRzLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xh
eWVyVHJlZUhvc3RDb21tb25UZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMv
Q0NMYXllclRyZWVIb3N0Q29tbW9uVGVzdC5jcHAKaW5kZXggNGE5NjU5ZGRkMTUzZWZmNmU2NzUy
ZWEyMDcwNmUyM2M3ZTEyNGI2NC4uNzVhYzVlODNiYmM4MDhlNTNlYWIzMTllZTA4ZWRmMTg0YWM5
Y2E1YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJl
ZUhvc3RDb21tb25UZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0ND
TGF5ZXJUcmVlSG9zdENvbW1vblRlc3QuY3BwCkBAIC05NzksNiArOTc5LDI1MiBAQCBURVNUKEND
TGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeUFuaW1hdGlvbnNGb3JSZW5kZXJTdXJmYWNl
SGllcmFyY2h5KQogICAgIEVYUEVDVF9GTE9BVF9FUSg1LjAsIGdyYW5kQ2hpbGRPZlJTMi0+c2Ny
ZWVuU3BhY2VUcmFuc2Zvcm0oKS5tNDIoKSk7CiB9CiAKK1RFU1QoQ0NMYXllclRyZWVIb3N0Q29t
bW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3JJZGVudGl0eVRyYW5zZm9ybSkKK3sKKyAgICAv
LyBUZXN0IHRoZSBjYWxjdWxhdGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3Rs
eSBmb3IgaWRlbnRpdHkgdHJhbnNmb3Jtcy4KKworICAgIEludFJlY3QgdGFyZ2V0U3VyZmFjZVJl
Y3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBDYXNl
IDE6IExheWVyIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cmZhY2UuCisgICAgSW50UmVjdCBs
YXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgxMCwgMTApLCBJbnRTaXplKDMwLCAz
MCkpOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDEwLCAxMCksIElu
dFNpemUoMzAsIDMwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21t
b246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRS
ZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4
cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBMYXllciBpcyBvdXRzaWRlIHRoZSBz
dXJmYWNlIHJlY3QuCisgICAgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMTIw
LCAxMjApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIGFjdHVhbCA9IENDTGF5ZXJUcmVlSG9zdENv
bW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxheWVyQ29udGVu
dFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfVFJVRShhY3R1YWwu
aXNFbXB0eSgpKTsKKworICAgIC8vIENhc2UgMzogTGF5ZXIgaXMgcGFydGlhbGx5IG92ZXJsYXBw
aW5nIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50
UG9pbnQoODAsIDgwKSwgSW50U2l6ZSgzMCwgMzApKTsKKyAgICBleHBlY3RlZCA9IEludFJlY3Qo
SW50UG9pbnQoODAsIDgwKSwgSW50U2l6ZSgyMCwgMjApKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVy
VHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBs
YXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lO
VF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9zdENv
bW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yVHJhbnNsYXRpb25zKQoreworICAgIC8vIFRl
c3QgdGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5IGZv
ciBzY2FsaW5nIHRyYW5zZm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0g
SW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIEludFJlY3Qg
bGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMw
KSk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisK
KyAgICAvLyBDYXNlIDE6IExheWVyIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN1cmZhY2UuCisg
ICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1
cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKDEwLCAxMCk7CisgICAgSW50UmVjdCBleHBlY3RlZCA9
IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAgSW50UmVjdCBh
Y3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdl
dFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7
CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2Fz
ZSAyOiBMYXllciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5ZXJUb1N1cmZh
Y2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
dHJhbnNsYXRlKDEyMCwgMTIwKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246
OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0
LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1w
dHkoKSk7CisKKyAgICAvLyBDYXNlIDM6IExheWVyIGlzIHBhcnRpYWxseSBvdmVybGFwcGluZyB0
aGUgc3VyZmFjZSByZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0
eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg4MCwgODApOworICAg
IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgyMCwgMjApKTsKKyAg
ICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRh
cmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNU
KENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yMkRSb3RhdGlv
bnMpCit7CisgICAgLy8gVGVzdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3
b3JrcyBjb3JyZWN0bHkgZm9yIHJvdGF0aW9ucyBhYm91dCB6LWF4aXMgKGkuZS4gMkQgcm90YXRp
b25zKS4KKyAgICAvLyBSZW1lbWJlciB0aGF0IGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgc2hvdWxk
IHJldHVybiB0aGUgdmlzaWJsZSByZWN0IGluIHRoZSBsYXllcidzIHNwYWNlLgorCisgICAgSW50
UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUo
MTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBv
aW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBMYXllciBpcyBjb250YWlu
ZWQgd2l0aGluIHRoZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJ
ZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgNTAp
OworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAgSW50UmVjdCBl
eHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7CisgICAg
SW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVS
ZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRy
YW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisg
ICAgLy8gQ2FzZSAyOiBMYXllciBpcyBvdXRzaWRlIHRoZSBzdXJmYWNlIHJlY3QuCisgICAgbGF5
ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgMCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
cm90YXRlKDQ1KTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0
ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRv
U3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisK
KyAgICAvLyBDYXNlIDM6IFRoZSBsYXllciBpcyByb3RhdGVkIGFib3V0IGl0cyB0b3AtbGVmdCBj
b3JuZXIuIEluIHN1cmZhY2Ugc3BhY2UsIHRoZSBsYXllcgorICAgIC8vICAgICAgICAgaXMgb3Jp
ZW50ZWQgZGlhZ29uYWxseSwgd2l0aCB0aGUgbGVmdCBoYWxmIG91dHNpZGUgb2YgdGhlIHJlbmRl
clN1cmZhY2UuIEluCisgICAgLy8gICAgICAgICB0aGlzIGNhc2UsIHRoZSB2aXNpYmxlIHJlY3Qg
c2hvdWxkIHN0aWxsIGJlIHRoZSBlbnRpcmUgbGF5ZXIgKHJlbWVtYmVyIHRoZQorICAgIC8vICAg
ICAgICAgdmlzaWJsZSByZWN0IGlzIGNvbXB1dGVkIGluIGxheWVyIHNwYWNlKTsgYm90aCB0aGUg
dG9wLWxlZnQgYW5kCisgICAgLy8gICAgICAgICBib3R0b20tcmlnaHQgY29ybmVycyBvZiB0aGUg
bGF5ZXIgYXJlIHN0aWxsIHZpc2libGUuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFr
ZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ucm90YXRlKDQ1KTsKKyAg
ICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMzAsIDMwKSk7Cisg
ICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0
YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8v
IENhc2UgNDogVGhlIGxheWVyIGlzIHJvdGF0ZWQgYWJvdXQgaXRzIHRvcC1sZWZ0IGNvcm5lciwg
YW5kIHRyYW5zbGF0ZWQgdXB3YXJkcy4gSW4KKyAgICAvLyAgICAgICAgIHN1cmZhY2Ugc3BhY2Us
IHRoZSBsYXllciBpcyBvcmllbnRlZCBkaWFnb25hbGx5LCB3aXRoIG9ubHkgdGhlIHRvcCBjb3Ju
ZXIKKyAgICAvLyAgICAgICAgIG9mIHRoZSBzdXJmYWNlIG92ZXJsYXBwaW5nIHRoZSBsYXllci4g
SW4gbGF5ZXIgc3BhY2UsIHRoZSByZW5kZXIgc3VyZmFjZQorICAgIC8vICAgICAgICAgb3Zlcmxh
cHMgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGxheWVyLiBUaGUgdmlzaWJsZSByZWN0IHNob3VsZCBi
ZSB0aGUKKyAgICAvLyAgICAgICAgIGxheWVyJ3MgcmlnaHQgaGFsZi4KKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bS50cmFuc2xhdGUoMCwgLXNxcnQoMikgKiAxNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0ucm90YXRlKDQ1KTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoMTUsIDApLCBJ
bnRTaXplKDE1LCAzMCkpOyAvLyByaWdodCBoYWxmIG9mIGxheWVyIGJvdW5kcy4KKyAgICBhY3R1
YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1
cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7Cisg
ICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5
ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2libGVSZWN0Rm9yM2RPcnRob2dyYXBoaWNU
cmFuc2Zvcm0pCit7CisgICAgLy8gVGVzdCB0aGF0IHRoZSBjYWxjdWxhdGVWaXNpYmxlUmVjdCgp
IGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSBmb3IgM2QgdHJhbnNmb3Jtcy4KKworICAgIEludFJl
Y3QgdGFyZ2V0U3VyZmFjZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEw
MCwgMTAwKSk7CisgICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2lu
dCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBPcnRob2dyYXBoaWMgcHJv
amVjdGlvbiBvZiBhIGxheWVyIHJvdGF0ZWQgYWJvdXQgeS1heGlzIGJ5IDQ1IGRlZ3JlZXMsIHNo
b3VsZCBiZSBmdWxseSBjb250YWluZWQgaW4gdGhlIHJlbmRlclN1cmZhY2UuCisgICAgbGF5ZXJU
b1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0ucm90YXRlM2QoMCwgNDUsIDApOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0
KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBhY3R1YWwg
PSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZh
Y2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAg
RVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBP
cnRob2dyYXBoaWMgcHJvamVjdGlvbiBvZiBhIGxheWVyIHJvdGF0ZWQgYWJvdXQgeS1heGlzIGJ5
IDQ1IGRlZ3JlZXMsIGJ1dAorICAgIC8vICAgICAgICAgc2hpZnRlZCB0byB0aGUgc2lkZSBzbyBv
bmx5IHRoZSByaWdodC1oYWxmIHRoZSBsYXllciB3b3VsZCBiZSB2aXNpYmxlIG9uCisgICAgLy8g
ICAgICAgICB0aGUgc3VyZmFjZS4KKyAgICBkb3VibGUgaGFsZldpZHRoT2ZSb3RhdGVkTGF5ZXIg
PSAoMTAwLjAgLyBzcXJ0KDIpKSAqIDAuNTsgLy8gMTAwLjAgaXMgdGhlIHVuLXJvdGF0ZWQgbGF5
ZXIgd2lkdGg7IGRpdmlkZWQgYnkgc3FydCgyKSBpcyB0aGUgcm90YXRlZCB3aWR0aC4KKyAgICBs
YXllclRvU3VyZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybS50cmFuc2xhdGUoLWhhbGZXaWR0aE9mUm90YXRlZExheWVyLCAwKTsKKyAgICBs
YXllclRvU3VyZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7IC8vIHJvdGF0ZXMgYWJv
dXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbGF5ZXIKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50
UG9pbnQoNTAsIDApLCBJbnRTaXplKDUwLCAxMDApKTsgLy8gcmlnaHQgaGFsZiBvZiB0aGUgbGF5
ZXIuCisgICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxl
UmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30K
KworVEVTVChDQ0xheWVyVHJlZUhvc3RDb21tb25UZXN0LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjNk
UGVyc3BlY3RpdmVUcmFuc2Zvcm0pCit7CisgICAgLy8gVGVzdCB0aGUgY2FsY3VsYXRlVmlzaWJs
ZVJlY3QoKSBmdW5jdGlvbiB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgbGF5ZXIgaGFzIGEKKyAg
ICAvLyBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG9udG8gdGhlIHRhcmdldCBzdXJmYWNlLgorCisg
ICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIElu
dFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0
KEludFBvaW50KC01MCwgLTUwKSwgSW50U2l6ZSgyMDAsIDIwMCkpOworICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBFdmVu
IHRob3VnaCB0aGUgbGF5ZXIgaXMgdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIHN1cmZhY2UsIGR1ZSB0
byBwZXJzcGVjdGl2ZQorICAgIC8vICAgICAgICAgZm9yZXNob3J0ZW5pbmcsIHRoZSBsYXllciB3
aWxsIGZpdCBmdWxseSBpbiB0aGUgc3VyZmFjZSB3aGVuIGl0cyB0cmFuc2xhdGVkCisgICAgLy8g
ICAgICAgICBtb3JlIHRoYW4gdGhlIHBlcnNwZWN0aXZlIGFtb3VudC4KKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgc2Vx
dWVuY2Ugb2YgdHJhbnNmb3JtcyBhcHBsaWVzIHRoZSBwZXJzcGVjdGl2ZSBhYm91dCB0aGUgY2Vu
dGVyIG9mIHRoZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0
ZSg1MCwgNTApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLmFwcGx5UGVyc3BlY3RpdmUo
OSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgLTUwKTsKKwor
ICAgIC8vIFRoaXMgdHJhbnNsYXRlIHBsYWNlcyB0aGUgbGF5ZXIgaW4gZnJvbnQgb2YgdGhlIHN1
cmZhY2UncyBwcm9qZWN0aW9uIHBsYW5lLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRy
YW5zbGF0ZTNkKDAsIDAsIC0yMCk7CisKKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJ
bnRQb2ludCgtNTAsIC01MCksIEludFNpemUoMjAwLCAyMDApKTsKKyAgICBJbnRSZWN0IGFjdHVh
bCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3Vy
ZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAg
ICBFWFBFQ1RfSU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7CisKKyAgICAvLyBDYXNlIDI6
IHNhbWUgcHJvamVjdGlvbiBhcyBiZWZvcmUsIGV4Y2VwdCB0aGF0IHRoZSBsYXllciBpcyBhbHNv
IHRyYW5zbGF0ZWQgdG8gdGhlCisgICAgLy8gICAgICAgICBzaWRlLCBzbyB0aGF0IG9ubHkgdGhl
IHJpZ2h0IGhhbGYgb2YgdGhlIGxheWVyIHNob3VsZCBiZSB2aXNpYmxlLgorICAgIC8vCisgICAg
Ly8gRXhwbGFuYXRpb24gb2YgZXhwZWN0ZWQgcmVzdWx0OgorICAgIC8vIFRoZSBwZXJzcGVjdGl2
ZSByYXRpbyBpcyAoeiBkaXN0YW5jZSBiZXR3ZWVuIGxheWVyIGFuZCBjYW1lcmEgb3JpZ2luKSAv
ICh6IGRpc3RhbmNlIGJldHdlZW4gcHJvamVjdGlvbiBwbGFuZSBhbmQgY2FtZXJhIG9yaWdpbikg
PT0gKC0yOSAvIDkpCisgICAgLy8gVGhlbiwgYnkgc2ltaWxhciB0cmlhbmdsZXMsIGlmIHdlIHdh
bnQgdG8gbW92ZSBhIGxheWVyIGJ5IHRyYW5zbGF0aW5nIC01MCB1bml0cyBpbiBwcm9qZWN0ZWQg
c3VyZmFjZSB1bml0cyAoc28gdGhhdCBvbmx5IGhhbGYgb2YgaXQgaXMKKyAgICAvLyB2aXNpYmxl
KSwgdGhlbiB3ZSB3b3VsZCBuZWVkIHRvIHRyYW5zbGF0ZSBieSAoLTI5IC8gOSkgKiAtNTAgPT0g
LTE2MS4xMTExIGluIHRoZSBsYXllcidzIHVuaXRzLgorICAgIC8vCisgICAgbGF5ZXJUb1N1cmZh
Y2VUcmFuc2Zvcm0udHJhbnNsYXRlM2QoLTE2MS4xMTExMTExMTExMTEsIDAsIDApOworICAgIGV4
cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCg1MCwgLTUwKSwgSW50U2l6ZSgxMDAsIDIwMCkpOyAv
LyBUaGUgcmlnaHQgaGFsZiBvZiB0aGUgbGF5ZXIncyBib3VuZGluZyByZWN0LgorICAgIGFjdHVh
bCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3Vy
ZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAg
ICBFWFBFQ1RfSU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXll
clRyZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZE9ydGhvZ3JhcGhpY0lz
Tm90Q2xpcHBlZEJlaGluZFN1cmZhY2UpCit7CisgICAgLy8gVGhlcmUgaXMgY3VycmVudGx5IG5v
IGV4cGxpY2l0IGNvbmNlcHQgb2YgYW4gb3J0aG9ncmFwaGljIHByb2plY3Rpb24gcGxhbmUgaW4g
b3VyCisgICAgLy8gY29kZSAobm9yIGluIHRoZSBDU1Mgc3BlYyB0byBteSBrbm93bGVkZ2UpLiBU
aGVyZWZvcmUsIGxheWVycyB0aGF0IGFyZSB0ZWNobmljYWxseQorICAgIC8vIGJlaGluZCB0aGUg
c3VyZmFjZSBpbiBhbiBvcnRob2dyYXBoaWMgd29ybGQgc2hvdWxkIG5vdCBiZSBjbGlwcGVkIHdo
ZW4gdGhleSBhcmUKKyAgICAvLyBmbGF0dGVuZWQgdG8gdGhlIHN1cmZhY2UuCisKKyAgICBJbnRS
ZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgx
MDAsIDEwMCkpOworICAgIEludFJlY3QgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9p
bnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBs
YXllclRvU3VyZmFjZVRyYW5zZm9ybTsKKworICAgIC8vIFRoaXMgc2VxdWVuY2Ugb2YgdHJhbnNm
b3JtcyBlZmZlY3RpdmVseSByb3RhdGVzIHRoZSBsYXllciBhYm91dCB0aGUgeS1heGlzIGF0IHRo
ZQorICAgIC8vIGNlbnRlciBvZiB0aGUgbGF5ZXIuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRl
KDUwLCAwKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7
CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgMCk7CisKKyAgICBJ
bnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEw
MCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxh
dGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJU
b1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0
dWFsKTsKK30KKworCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2li
bGVSZWN0Rm9yM2RQZXJzcGVjdGl2ZUlzQ2xpcHBlZCkKK3sKKyAgICAvLyBUZXN0IHRoZSBjYWxj
dWxhdGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIHByb2plY3Rp
bmcgYSBzdXJmYWNlCisgICAgLy8gb250byBhIGxheWVyLCBidXQgdGhlIGxheWVyIGlzIHBhcnRp
YWxseSBiZWhpbmQgdGhlIGNhbWVyYSAobm90IGp1c3QgYmVoaW5kIHRoZQorICAgIC8vIHByb2pl
Y3Rpb24gcGxhbmUpLiBJbiB0aGlzIGNhc2UsIHRoZSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgbWF5
IHNlZW0gdG8gYmUgdmFsaWQsCisgICAgLy8gYnV0IGFjdHVhbGx5IHRoZXkgYXJlIG5vdC4gVGhl
IHZpc2libGVSZWN0IG5lZWRzIHRvIGJlIHByb3Blcmx5IGNsaXBwZWQgYnkgdGhlCisgICAgLy8g
dyA9IDAgcGxhbmUgaW4gaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMgYmVmb3JlIGNvbnZlcnRpbmcg
dG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzLgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVj
dCA9IEludFJlY3QoSW50UG9pbnQoLTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAg
SW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xKSwgSW50
U2l6ZSgyMCwgMikpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJmYWNlVHJh
bnNmb3JtOworCisgICAgLy8gVGhlIGxheWVyIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgcmln
aHQgaGFsZiBvZiB0aGUgbGF5ZXIgc2hvdWxkIGJlIGluIGZyb250IG9mCisgICAgLy8gdGhlIGNh
bWVyYSwgd2hpbGUgdGhlIG90aGVyIGhhbGYgaXMgYmVoaW5kIHRoZSBzdXJmYWNlJ3MgcHJvamVj
dGlvbiBwbGFuZS4gVGhlCisgICAgLy8gZm9sbG93aW5nIHNlcXVlbmNlIG9mIHRyYW5zZm9ybXMg
YXBwbGllcyB0aGUgcGVyc3BlY3RpdmUgYW5kIHJvdGF0aW9uIGFib3V0IHRoZQorICAgIC8vIGNl
bnRlciBvZiB0aGUgbGF5ZXIuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50
aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsK
KyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCAxKTsKKyAgICBs
YXllclRvU3VyZmFjZVRyYW5zZm9ybS5yb3RhdGUzZCgwLCA0NSwgMCk7CisKKyAgICBpbnQgZXhw
ZWN0ZWRYUG9zaXRpb24gPSAtMTA7CisgICAgaW50IGV4cGVjdGVkV2lkdGggPSAxMDsKKyAgICBJ
bnRSZWN0IGFjdHVhbCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJl
Y3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJh
bnNmb3JtKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRYUG9zaXRpb24sIGFjdHVhbC54KCkpOwor
ICAgIEVYUEVDVF9FUShleHBlY3RlZFdpZHRoLCBhY3R1YWwud2lkdGgoKSk7Cit9CisKK1RFU1Qo
Q0NMYXllclRyZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3JQZXJzcGVjdGl2
ZVVucHJvamVjdGlvbikKK3sKKyAgICAvLyBUbyBkZXRlcm1pbmUgdmlzaWJsZVJlY3QgaW4gbGF5
ZXIgc3BhY2UsIHRoZXJlIG5lZWRzIHRvIGJlIGFuIHVuLXByb2plY3Rpb24gZnJvbQorICAgIC8v
IHN1cmZhY2Ugc3BhY2UgdG8gbGF5ZXIgc3BhY2UuIFdoZW4gdGhlIG9yaWdpbmFsIHRyYW5zZm9y
bSB3YXMgYSBwZXJzcGVjdGl2ZQorICAgIC8vIHByb2plY3Rpb24gdGhhdCB3YXMgY2xpcHBlZCwg
aXQgcmV0dXJucyBhIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY2xpcHBlZCBib3VuZHMuCisgICAg
Ly8gVW4tcHJvamVjdGluZyB0aGlzIG5ldyByZWN0IG1heSByZXF1aXJlIGNsaXBwaW5nIGFnYWlu
LgorCisgICAgLy8gVGhpcyBzZXF1ZW5jZSBvZiB0cmFuc2Zvcm1zIGNhdXNlcyBvbmUgY29ybmVy
IG9mIHRoZSBsYXllciB0byBwcm90cnVkZSBhY3Jvc3MgdGhlIHcgPSAwIHBsYW5lLCBhbmQgc2hv
dWxkIGJlIGNsaXBwZWQuCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3Qo
SW50UG9pbnQoLTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBsYXll
ckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIw
KSk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07Cisg
ICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1
cmZhY2VUcmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXllclRvU3VyZmFjZVRy
YW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCAtNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0ucm90YXRlM2QoMCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0
ZTNkKDgwLCAwLCAwKTsKKworICAgIC8vIE9ubHkgdGhlIGNvcm5lciBvZiB0aGUgbGF5ZXIgaXMg
bm90IHZpc2libGUgb24gdGhlIHN1cmZhY2UgYmVjYXVzZSBvZiBiZWluZworICAgIC8vIGNsaXBw
ZWQuIEJ1dCwgdGhlIG5ldCByZXN1bHQgb2Ygcm91bmRpbmcgdmlzaWJsZSByZWdpb24gdG8gYW4g
YXhpcy1hbGlnbmVkIHJlY3QgaXMKKyAgICAvLyB0aGF0IHRoZSBlbnRpcmUgbGF5ZXIgc2hvdWxk
IHN0aWxsIGJlIGNvbnNpZGVyZWQgdmlzaWJsZS4KKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50
UmVjdChJbnRQb2ludCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIwKSk7CisgICAgSW50UmVjdCBh
Y3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdl
dFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7
CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworfQorCiAvLyBGSVhN
RToKIC8vIGNvbnRpbnVlIHdvcmtpbmcgb24gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTY4OTQyCiAvLyAgLSBhZGQgYSB0ZXN0IHRvIHZlcmlmeSBjbGlwcGluZyB0aGF0
IGNoYW5nZXMgdGhlICJjZW50ZXIgcG9pbnQiCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135711</attachid>
            <date>2012-04-04 16:26:14 -0700</date>
            <delta_ts>2012-04-05 10:03:05 -0700</delta_ts>
            <desc>Addressed second round of comments</desc>
            <filename>bug-80806-20120404162612.patch</filename>
            <type>text/plain</type>
            <size>43217</size>
            <attacher name="Shawn Singh">shawnsingh</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzMjQzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYzgwYzEwMjhmMzVmZDEz
NzQ5NDJhNzcxOTZmNmZjYjU5MzQ3MGVhOC4uZjE3Y2IyYTFhMWNhMmQwNjY2MDY4YzEzY2IxZDRj
OWEzMzYwODM4NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYxIEBACisyMDEyLTA0LTA0ICBTaGF3
biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
TmVlZCB0byBjbGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFwcGx5aW5nIHRyYW5z
Zm9ybXMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
MDgwNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVu
aXQgdGVzdHMgYWRkZWQgdG8gQ0NMYXllclRyZWVIb3N0Q29tbW9uLiBUaGlzIGNoYW5nZSBpcyBh
bHNvCisgICAgICAgIGNvdmVyZWQgYnkgb3RoZXIgZXhpc3RpbmcgdW5pdCB0ZXN0cyBhbmQgbGF5
b3V0IHRlc3RzLgorCisgICAgICAgIFdlYkNvcmUgVHJhbnNmb3JtYXRpb25NYXRyaXggbWFwUmVj
dCAvIG1hcFF1YWQgLyBwcm9qZWN0UXVhZCBkbworICAgICAgICBub3QgcHJvcGVybHkgaGFuZGxl
IHRoZSBjYXNlIHdoZXJlIGEgc3VyZmFjZSBpcyBvcmllbnRlZCBwYXJ0aWFsbHkKKyAgICAgICAg
YmVoaW5kIHRoZSBjYW1lcmEsIHdpdGggYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLiBJbiB0aGlz
IGNhc2UsCisgICAgICAgIHByb2plY3RlZCBwb2ludHMgbWF5IGFwcGVhciB0byBiZSB2YWxpZCBp
biBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMsCisgICAgICAgIGJ1dCB0aGV5IGFyZSBpbmRlZWQgbm90
IHZhbGlkLCBhbmQgdGhpcyBwcm9ibGVtIGNhbiBvbmx5IGJlCisgICAgICAgIGRldGVjdGVkIGlu
IGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzIGFmdGVyIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm0sCisg
ICAgICAgIGJlZm9yZSB0aGUgZGl2aWRlLWJ5LXcgc3RlcC4KKworICAgICAgICBUaGUgY29ycmVj
dCBzb2x1dGlvbiBpcyB0byBjbGlwIGdlb21ldHJ5IHdoZXJlIHcgPCAwLiBUaGlzIHBhdGNoCisg
ICAgICAgIG1ha2VzIHRoaXMgY2hhbmdlIGxvY2FsIHRvIGNocm9taXVtIG9ubHksIHRvIGZpeCBy
ZW5kZXJpbmcgYnVncworICAgICAgICB0aGF0IGFyaXNlIGZyb20gdGhpcyBwcm9ibGVtLiBUaGUg
cHJpbWFyeSBmaXggaXMgdG8gY29ycmVjdAorICAgICAgICBjYWxjdWxhdGVWaXNpYmxlTGF5ZXJS
ZWN0KCksIGJ1dCBvdGhlciBhbmNpbGxhcnkgbG9jYXRpb25zIGFyZQorICAgICAgICBhbHNvIGZp
eGVkLCBpbiBwYXJ0aWN1bGFyLCB0aGUgYW50aWFsaWFzaW5nIGNvZGUgcGF0aCBpcyBzaW1wbHkK
KyAgICAgICAgc2tpcHBlZCB3aGVuIHRoaXMgY2FzZSBhcmlzZXMuCisKKyAgICAgICAgRXZlbnR1
YWxseSB0aGlzIG1hdGggbmVlZHMgdG8gYmUgbWVyZ2VkIGludG8gVHJhbnNmb3JtYXRpb25NYXRy
aXgsCisgICAgICAgIHRvIGZpeCBoaXQtdGVzdGluZyBidWdzIHRoYXQgb2NjdXIgaW4gYm90aCBD
aHJvbWl1bSBhbmQgU2FmYXJpLgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpmaW5kVGlsZVByb2dyYW1Vbmlmb3Jtcyk6CisgICAgICAgIChXZWJD
b3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdUaWxlUXVhZCk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJl
Y3QpOgorICAgICAgICAoV2ViQ29yZTo6aXNTY2FsZU9yVHJhbnNsYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6Y2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SG9tb2dlbmVvdXND
b29yZGluYXRlOjpIb21vZ2VuZW91c0Nvb3JkaW5hdGUpOgorICAgICAgICAoSG9tb2dlbmVvdXND
b29yZGluYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6c2hv
dWxkQmVDbGlwcGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkhvbW9nZW5lb3VzQ29vcmRpbmF0ZTo6
Y2FydGVzaWFuUG9pbnQyZCk6CisgICAgICAgIChXZWJDb3JlOjpwcm9qZWN0UG9pbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6bWFwUG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZUNsaXBw
ZWRQb2ludEZvckVkZ2UpOgorICAgICAgICAoV2ViQ29yZTo6ZXhwYW5kQm91bmRzVG9JbmNsdWRl
UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZUVuY2xvc2luZ1JlY3RPZkNsaXBwZWRR
dWFkKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1dGVFbmNsb3NpbmdSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkNDTWF0aFV0aWw6Om1hcENsaXBwZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OkNDTWF0aFV0aWw6OnByb2plY3RDbGlwcGVkUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpDQ01h
dGhVdGlsOjptYXBRdWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkNDTWF0aFV0aWw6OnByb2plY3RR
dWFkKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGls
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChDQ01hdGhVdGlsKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZVVub2NjbHVkZWRDb250ZW50UmVjdCk6CisK
IDIwMTItMDQtMDQgIE1pbiBRaW4gIDxxaW5taW5AZ29vZ2xlLmNvbT4KIAogICAgICAgICBEaXNh
YmxlIGZhbmN5IHVwc2FtcGxpbmcgYW5kIGRpdGhlcmluZyBmb3IgZGVjb2RpbmcganBlZyBvbiBh
bmRyb2lkCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4IGU2NmM0ZjY2NDUyMWUwZTczMGEy
OGUwNjVlNWIzZjM3ZGJjOTEwMWMuLjQyYTA4MGE2Njg5NDM5Y2M3NjM0OWU2OTczM2Q5NGQyODdl
Y2E5NDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBi
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTIt
MDQtMDQgIFNoYXduIFNpbmdoICA8c2hhd25zaW5naEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAg
W2Nocm9taXVtXSBOZWVkIHRvIGNsaXAgdG8gaG9tb2dlbmVvdXMgdz0wIHBsYW5lIHdoZW4gYXBw
bHlpbmcgdHJhbnNmb3Jtcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTgwODA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgKiB0ZXN0cy9DQ0xheWVyVHJlZUhvc3RDb21tb25UZXN0LmNwcDoKKyAgICAgICAg
KFdlYktpdFRlc3RzOjpURVNUKToKKyAgICAgICAgKFdlYktpdFRlc3RzKToKKwogMjAxMi0wNC0w
NCAgRGFuaWVsIFNpZXZlcnMgIDxzaWV2ZXJzQGNocm9taXVtLm9yZz4KIAogICAgICAgICBbQ2hy
b21pdW1dIEFsd2F5cyBza2lwIGRyYXcgYW5kIHJlYWRiYWNrIGlmIHRoZXJlIGlzIG5vdGhpbmcK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUuZ3lwaQppbmRleCAyNTNiOGVhYmI5OGU0ZTc0ODM3ZWJjYzBmNGZlMDM1MTE2N2Ex
YjY4Li44N2VmZjdhZDYwOTM1ZjQ3OTYxNGNhMWFjY2VkOWFhYmY2MTU5MjJjIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCkBAIC0zNjAxLDYgKzM2MDEsOCBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5oJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RJbXBsLmNwcCcsCiAg
ICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0
SW1wbC5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01h
dGhVdGlsLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NNYXRoVXRpbC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9j
Yy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPdmVyZHJhd01ldHJpY3MuY3BwJywKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVy
ZXJDaHJvbWl1bS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCmluZGV4IGNjYjFkZDhkMGIyOWMzNzIyMTMzZmFi
NmRkODM1YTliNDgyOGJiMTAuLmQyYTg5NTMxNDQxZjY5YzJlM2RkMjU3NzEzMmViYmI2YmU0OTNk
ZjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcApAQCAtNTUsNiArNTUs
NyBAQAogI2luY2x1ZGUgImNjL0NDRGVidWdCb3JkZXJEcmF3UXVhZC5oIgogI2luY2x1ZGUgImNj
L0NDTGF5ZXJJbXBsLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmgiCisj
aW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgogI2luY2x1ZGUgImNjL0NDUHJveHkuaCIKICNpbmNs
dWRlICJjYy9DQ1JlbmRlclBhc3MuaCIKICNpbmNsdWRlICJjYy9DQ1JlbmRlclN1cmZhY2VEcmF3
UXVhZC5oIgpAQCAtNTc2LDkgKzU3NywxMSBAQCBzdGF0aWMgdm9pZCB0aWxlVW5pZm9ybUxvY2F0
aW9uKFQgcHJvZ3JhbSwgVGlsZVByb2dyYW1Vbmlmb3JtcyYgdW5pZm9ybXMpCiAgICAgdW5pZm9y
bXMuZWRnZUxvY2F0aW9uID0gcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5lZGdlTG9jYXRpb24o
KTsKIH0KIAotc3RhdGljIHZvaWQgZmluZFRpbGVQcm9ncmFtVW5pZm9ybXMoTGF5ZXJSZW5kZXJl
ckNocm9taXVtKiBsYXllclJlbmRlcmVyLCBjb25zdCBDQ1RpbGVEcmF3UXVhZCogcXVhZCwgVGls
ZVByb2dyYW1Vbmlmb3JtcyYgdW5pZm9ybXMpCitzdGF0aWMgdm9pZCBmaW5kVGlsZVByb2dyYW1V
bmlmb3JtcyhMYXllclJlbmRlcmVyQ2hyb21pdW0qIGxheWVyUmVuZGVyZXIsIGNvbnN0IENDVGls
ZURyYXdRdWFkKiBxdWFkLCBUaWxlUHJvZ3JhbVVuaWZvcm1zJiB1bmlmb3JtcywgYm9vbCBxdWFk
SXNDbGlwcGVkKQogewotICAgIGlmIChxdWFkLT5pc0FudGlhbGlhc2VkKCkpIHsKKyAgICAvLyBG
b3Igbm93LCB3ZSBzaW1wbHkgc2tpcCBhbnRpLWFsaWFzaW5nIHdpdGggdGhlIHF1YWQgaXMgY2xp
cHBlZC4gVGhpcyBvbmx5IGhhcHBlbnMKKyAgICAvLyBvbiBwZXJzcGVjdGl2ZSB0cmFuc2Zvcm1l
ZCBsYXllcnMgdGhhdCBnbyBwYXJ0aWFsbHkgYmVoaW5kIHRoZSBjYW1lcmEuCisgICAgaWYgKHF1
YWQtPmlzQW50aWFsaWFzZWQoKSAmJiAhcXVhZElzQ2xpcHBlZCkgewogICAgICAgICBpZiAocXVh
ZC0+c3dpenpsZUNvbnRlbnRzKCkpIHsKICAgICAgICAgICAgIGNvbnN0IENDVGlsZWRMYXllcklt
cGw6OlByb2dyYW1Td2l6emxlQUEqIHByb2dyYW0gPSBsYXllclJlbmRlcmVyLT50aWxlclByb2dy
YW1Td2l6emxlQUEoKTsKICAgICAgICAgICAgIHRpbGVVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwg
dW5pZm9ybXMpOwpAQCAtNjQxLDggKzY0NCwxNyBAQCB2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1
bTo6ZHJhd1RpbGVRdWFkKGNvbnN0IENDVGlsZURyYXdRdWFkKiBxdWFkKQogICAgIGZsb2F0IGZy
YWdtZW50VGV4U2NhbGVYID0gY2xhbXBSZWN0LndpZHRoKCkgLyB0ZXh0dXJlU2l6ZS53aWR0aCgp
OwogICAgIGZsb2F0IGZyYWdtZW50VGV4U2NhbGVZID0gY2xhbXBSZWN0LmhlaWdodCgpIC8gdGV4
dHVyZVNpemUuaGVpZ2h0KCk7CiAKKworICAgIEZsb2F0UXVhZCBsb2NhbFF1YWQ7CisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggZGV2aWNlVHJhbnNmb3JtID0gVHJhbnNmb3JtYXRpb25NYXRyaXgo
d2luZG93TWF0cml4KCkgKiBwcm9qZWN0aW9uTWF0cml4KCkgKiBxdWFkLT5xdWFkVHJhbnNmb3Jt
KCkpLnRvMmRUcmFuc2Zvcm0oKTsKKyAgICBpZiAoIWRldmljZVRyYW5zZm9ybS5pc0ludmVydGli
bGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCBjbGlwcGVkID0gZmFsc2U7CisgICAg
RmxvYXRRdWFkIGRldmljZUxheWVyUXVhZCA9IENDTWF0aFV0aWw6Om1hcFF1YWQoZGV2aWNlVHJh
bnNmb3JtLCBGbG9hdFF1YWQocXVhZC0+bGF5ZXJSZWN0KCkpLCBjbGlwcGVkKTsKKwogICAgIFRp
bGVQcm9ncmFtVW5pZm9ybXMgdW5pZm9ybXM7Ci0gICAgZmluZFRpbGVQcm9ncmFtVW5pZm9ybXMo
dGhpcywgcXVhZCwgdW5pZm9ybXMpOworICAgIGZpbmRUaWxlUHJvZ3JhbVVuaWZvcm1zKHRoaXMs
IHF1YWQsIHVuaWZvcm1zLCBjbGlwcGVkKTsKIAogICAgIEdMQyhjb250ZXh0KCksIGNvbnRleHQo
KS0+dXNlUHJvZ3JhbSh1bmlmb3Jtcy5wcm9ncmFtKSk7CiAgICAgR0xDKGNvbnRleHQoKSwgY29u
dGV4dCgpLT51bmlmb3JtMWkodW5pZm9ybXMuc2FtcGxlckxvY2F0aW9uLCAwKSk7CkBAIC02NTEs
MTMgKzY2Myw4IEBAIHZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3VGlsZVF1YWQoY29u
c3QgQ0NUaWxlRHJhd1F1YWQqIHF1YWQpCiAgICAgR0xDKGNvbnRleHQoKSwgY29udGV4dCgpLT50
ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRl
eHQzRDo6VEVYVFVSRV9NSU5fRklMVEVSLCBxdWFkLT50ZXh0dXJlRmlsdGVyKCkpKTsKICAgICBH
TEMoY29udGV4dCgpLCBjb250ZXh0KCktPnRleFBhcmFtZXRlcmkoR3JhcGhpY3NDb250ZXh0M0Q6
OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX01BR19GSUxURVIsIHF1YWQt
PnRleHR1cmVGaWx0ZXIoKSkpOwogCi0gICAgRmxvYXRRdWFkIGxvY2FsUXVhZDsKLSAgICBpZiAo
cXVhZC0+aXNBbnRpYWxpYXNlZCgpKSB7Ci0gICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGRl
dmljZVRyYW5zZm9ybSA9IFRyYW5zZm9ybWF0aW9uTWF0cml4KHdpbmRvd01hdHJpeCgpICogcHJv
amVjdGlvbk1hdHJpeCgpICogcXVhZC0+cXVhZFRyYW5zZm9ybSgpKS50bzJkVHJhbnNmb3JtKCk7
Ci0gICAgICAgIGlmICghZGV2aWNlVHJhbnNmb3JtLmlzSW52ZXJ0aWJsZSgpKQotICAgICAgICAg
ICAgcmV0dXJuOwogCi0gICAgICAgIEZsb2F0UXVhZCBkZXZpY2VMYXllclF1YWQgPSBkZXZpY2VU
cmFuc2Zvcm0ubWFwUXVhZChGbG9hdFF1YWQocXVhZC0+bGF5ZXJSZWN0KCkpKTsKKyAgICBpZiAo
IWNsaXBwZWQgJiYgcXVhZC0+aXNBbnRpYWxpYXNlZCgpKSB7CiAKICAgICAgICAgQ0NMYXllclF1
YWQgZGV2aWNlTGF5ZXJCb3VuZHMgPSBDQ0xheWVyUXVhZChGbG9hdFF1YWQoZGV2aWNlTGF5ZXJR
dWFkLmJvdW5kaW5nQm94KCkpKTsKICAgICAgICAgZGV2aWNlTGF5ZXJCb3VuZHMuaW5mbGF0ZUFu
dGlBbGlhc2luZ0Rpc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29t
bW9uLmNwcAppbmRleCA0MThkY2ExOTBiM2ViZTY0NGEyNGFjM2VlMjgyYmI1ZjVjOTI5NjJkLi45
NTE3ZTdkMjc1MGJmMGU0YmFlOTc3NzQxMzA4NTc1ODM3NTQ1YzdkIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RD
b21tb24uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRl
ICJjYy9DQ0xheWVySW1wbC5oIgogI2luY2x1ZGUgImNjL0NDTGF5ZXJJdGVyYXRvci5oIgogI2lu
Y2x1ZGUgImNjL0NDTGF5ZXJTb3J0ZXIuaCIKKyNpbmNsdWRlICJjYy9DQ01hdGhVdGlsLmgiCiAj
aW5jbHVkZSAiY2MvQ0NSZW5kZXJTdXJmYWNlLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAg
LTQ0LDcgKzQ1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogSW50UmVjdCBDQ0xheWVyVHJlZUhv
c3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KGNvbnN0IEludFJlY3QmIHRhcmdldFN1cmZh
Y2VSZWN0LCBjb25zdCBJbnRSZWN0JiBsYXllckJvdW5kUmVjdCwgY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHRyYW5zZm9ybSkKIHsKICAgICAvLyBJcyB0aGlzIGxheWVyIGZ1bGx5IGNvbnRh
aW5lZCB3aXRoaW4gdGhlIHRhcmdldCBzdXJmYWNlPwotICAgIEludFJlY3QgbGF5ZXJJblN1cmZh
Y2VTcGFjZSA9IHRyYW5zZm9ybS5tYXBSZWN0KGxheWVyQm91bmRSZWN0KTsKKyAgICBJbnRSZWN0
IGxheWVySW5TdXJmYWNlU3BhY2UgPSBDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdCh0cmFuc2Zv
cm0sIGxheWVyQm91bmRSZWN0KTsKICAgICBpZiAodGFyZ2V0U3VyZmFjZVJlY3QuY29udGFpbnMo
bGF5ZXJJblN1cmZhY2VTcGFjZSkpCiAgICAgICAgIHJldHVybiBsYXllckJvdW5kUmVjdDsKIApA
QCAtNTksNyArNjAsNyBAQCBJbnRSZWN0IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRl
VmlzaWJsZVJlY3QoY29uc3QgSW50UmVjdCYgdGFyZ2V0U3VyZmFjZQogICAgIC8vIGF4aXMtYWxp
Z25lZCksIGJ1dCBpcyBhIHJlYXNvbmFibGUgZmlsdGVyIG9uIHRoZSBzcGFjZSB0byBjb25zaWRl
ci4KICAgICAvLyBOb24taW52ZXJ0aWJsZSB0cmFuc2Zvcm1zIHdpbGwgY3JlYXRlIGFuIGVtcHR5
IHJlY3QgaGVyZS4KICAgICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzdXJmYWNlVG9MYXll
ciA9IHRyYW5zZm9ybS5pbnZlcnNlKCk7Ci0gICAgSW50UmVjdCBsYXllclJlY3QgPSBzdXJmYWNl
VG9MYXllci5wcm9qZWN0UXVhZChGbG9hdFF1YWQoRmxvYXRSZWN0KG1pbmltYWxTdXJmYWNlUmVj
dCkpKS5lbmNsb3NpbmdCb3VuZGluZ0JveCgpOworICAgIEludFJlY3QgbGF5ZXJSZWN0ID0gZW5j
bG9zaW5nSW50UmVjdChDQ01hdGhVdGlsOjpwcm9qZWN0Q2xpcHBlZFJlY3Qoc3VyZmFjZVRvTGF5
ZXIsIEZsb2F0UmVjdChtaW5pbWFsU3VyZmFjZVJlY3QpKSk7CiAgICAgbGF5ZXJSZWN0LmludGVy
c2VjdChsYXllckJvdW5kUmVjdCk7CiAgICAgcmV0dXJuIGxheWVyUmVjdDsKIH0KQEAgLTcwLDcg
KzcxLDYgQEAgc3RhdGljIGJvb2wgaXNTY2FsZU9yVHJhbnNsYXRpb24oY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIG0pCiAgICAgICAgICAgICYmICFtLm0yMSgpICYmICFtLm0yMygpICYmICFt
Lm0yNCgpCiAgICAgICAgICAgICYmICFtLm0zMSgpICYmICFtLm0zMigpICYmICFtLm00MygpCiAg
ICAgICAgICAgICYmIG0ubTQ0KCk7Ci0KIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgTGF5ZXJUeXBl
PgpAQCAtNDA5LDcgKzQwOSw3IEBAIHN0YXRpYyBib29sIGNhbGN1bGF0ZURyYXdUcmFuc2Zvcm1z
QW5kVmlzaWJpbGl0eUludGVybmFsKExheWVyVHlwZSogbGF5ZXIsIExheWVyCiAgICAgICAgIGxh
eWVyLT5zZXREcmF3VHJhbnNmb3JtKGNvbWJpbmVkVHJhbnNmb3JtKTsKICAgICAgICAgbGF5ZXIt
PnNldERyYXdUcmFuc2Zvcm1Jc0FuaW1hdGluZyhhbmltYXRpbmdUcmFuc2Zvcm1Ub1RhcmdldCk7
CiAgICAgICAgIGxheWVyLT5zZXRTY3JlZW5TcGFjZVRyYW5zZm9ybUlzQW5pbWF0aW5nKGFuaW1h
dGluZ1RyYW5zZm9ybVRvU2NyZWVuKTsKLSAgICAgICAgdHJhbnNmb3JtZWRMYXllclJlY3QgPSBl
bmNsb3NpbmdJbnRSZWN0KGxheWVyLT5kcmF3VHJhbnNmb3JtKCkubWFwUmVjdChsYXllclJlY3Qp
KTsKKyAgICAgICAgdHJhbnNmb3JtZWRMYXllclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KENDTWF0
aFV0aWw6Om1hcENsaXBwZWRSZWN0KGxheWVyLT5kcmF3VHJhbnNmb3JtKCksIGxheWVyUmVjdCkp
OwogCiAgICAgICAgIGxheWVyLT5zZXREcmF3T3BhY2l0eShkcmF3T3BhY2l0eSk7CiAgICAgICAg
IGxheWVyLT5zZXREcmF3T3BhY2l0eUlzQW5pbWF0aW5nKGRyYXdPcGFjaXR5SXNBbmltYXRpbmcp
OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NNYXRoVXRpbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9jYy9DQ01hdGhVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZDMzYTdlYWRmZmQxYTk3ZWQxMDFm
MmJmODNjMGUxMGY0Mjg4YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRpbC5jcHAKQEAgLTAsMCArMSwyNTIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImNjL0ND
TWF0aFV0aWwuaCIKKworI2luY2x1ZGUgIkZsb2F0UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFF1
YWQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRy
aXguaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgSG9tb2dlbmVvdXNDb29yZGlu
YXRlIHsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUoZG91YmxlIG5ld1gsIGRvdWJsZSBuZXdZ
LCBkb3VibGUgbmV3WiwgZG91YmxlIG5ld1cpCisgICAgICAgIDogeChuZXdYKQorICAgICAgICAs
IHkobmV3WSkKKyAgICAgICAgLCB6KG5ld1opCisgICAgICAgICwgdyhuZXdXKQorICAgIHsKKyAg
ICB9CisKKyAgICBib29sIHNob3VsZEJlQ2xpcHBlZCgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gdyA8PSAwOworICAgIH0KKworICAgIEZsb2F0UG9pbnQgY2FydGVzaWFuUG9pbnQyZCgp
IGNvbnN0CisgICAgeworICAgICAgICBpZiAodyA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIEZs
b2F0UG9pbnQoeCwgeSk7CisKKyAgICAgICAgLy8gRm9yIG5vdywgYmVjYXVzZSB0aGlzIGNvZGUg
aXMgdXNlZCBwcml2YXRlbHkgb25seSBieSBDQ01hdGhVdGlsLCBpdCBzaG91bGQgbmV2ZXIgYmUg
Y2FsbGVkIHdoZW4gdyA9PSAwLCBhbmQgd2UgZG8gbm90IHlldCBuZWVkIHRvIGhhbmRsZSB0aGF0
IGNhc2UuCisgICAgICAgIEFTU0VSVCh3KTsKKyAgICAgICAgZG91YmxlIGludlcgPSAxLjAgLyB3
OworICAgICAgICByZXR1cm4gRmxvYXRQb2ludCh4ICogaW52VywgeSAqIGludlcpOworICAgIH0K
KworICAgIGRvdWJsZSB4OworICAgIGRvdWJsZSB5OworICAgIGRvdWJsZSB6OworICAgIGRvdWJs
ZSB3OworfTsKKworc3RhdGljIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBwcm9qZWN0UG9pbnQoY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2ludCYgcCkK
K3sKKyAgICBkb3VibGUgeCA9IHAueCgpOworICAgIGRvdWJsZSB5ID0gcC55KCk7CisgICAgZG91
YmxlIHogPSAtKHRyYW5zZm9ybS5tMTMoKSAqIHggKyB0cmFuc2Zvcm0ubTIzKCkgKiB5ICsgdHJh
bnNmb3JtLm00MygpKSAvIHRyYW5zZm9ybS5tMzMoKTsKKyAgICAvLyBpbXBsaWNpdCBkZWZpbml0
aW9uIG9mIHcgPSAxOworCisgICAgZG91YmxlIG91dFggPSB4ICogdHJhbnNmb3JtLm0xMSgpICsg
eSAqIHRyYW5zZm9ybS5tMjEoKSArIHogKiB0cmFuc2Zvcm0ubTMxKCkgKyB0cmFuc2Zvcm0ubTQx
KCk7CisgICAgZG91YmxlIG91dFkgPSB4ICogdHJhbnNmb3JtLm0xMigpICsgeSAqIHRyYW5zZm9y
bS5tMjIoKSArIHogKiB0cmFuc2Zvcm0ubTMyKCkgKyB0cmFuc2Zvcm0ubTQyKCk7CisgICAgZG91
YmxlIG91dFogPSB4ICogdHJhbnNmb3JtLm0xMygpICsgeSAqIHRyYW5zZm9ybS5tMjMoKSArIHog
KiB0cmFuc2Zvcm0ubTMzKCkgKyB0cmFuc2Zvcm0ubTQzKCk7CisgICAgZG91YmxlIG91dFcgPSB4
ICogdHJhbnNmb3JtLm0xNCgpICsgeSAqIHRyYW5zZm9ybS5tMjQoKSArIHogKiB0cmFuc2Zvcm0u
bTM0KCkgKyB0cmFuc2Zvcm0ubTQ0KCk7CisKKyAgICByZXR1cm4gSG9tb2dlbmVvdXNDb29yZGlu
YXRlKG91dFgsIG91dFksIG91dFosIG91dFcpOworfQorCitzdGF0aWMgSG9tb2dlbmVvdXNDb29y
ZGluYXRlIG1hcFBvaW50KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNv
bnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgZG91YmxlIHggPSBwLngoKTsKKyAgICBkb3VibGUg
eSA9IHAueSgpOworICAgIC8vIGltcGxpY2l0IGRlZmluaXRpb24gb2YgeiA9IDA7CisgICAgLy8g
aW1wbGljaXQgZGVmaW5pdGlvbiBvZiB3ID0gMTsKKworICAgIGRvdWJsZSBvdXRYID0geCAqIHRy
YW5zZm9ybS5tMTEoKSArIHkgKiB0cmFuc2Zvcm0ubTIxKCkgKyB0cmFuc2Zvcm0ubTQxKCk7Cisg
ICAgZG91YmxlIG91dFkgPSB4ICogdHJhbnNmb3JtLm0xMigpICsgeSAqIHRyYW5zZm9ybS5tMjIo
KSArIHRyYW5zZm9ybS5tNDIoKTsKKyAgICBkb3VibGUgb3V0WiA9IHggKiB0cmFuc2Zvcm0ubTEz
KCkgKyB5ICogdHJhbnNmb3JtLm0yMygpICsgdHJhbnNmb3JtLm00MygpOworICAgIGRvdWJsZSBv
dXRXID0geCAqIHRyYW5zZm9ybS5tMTQoKSArIHkgKiB0cmFuc2Zvcm0ubTI0KCkgKyB0cmFuc2Zv
cm0ubTQ0KCk7CisKKyAgICByZXR1cm4gSG9tb2dlbmVvdXNDb29yZGluYXRlKG91dFgsIG91dFks
IG91dFosIG91dFcpOworfQorCitzdGF0aWMgSG9tb2dlbmVvdXNDb29yZGluYXRlIGNvbXB1dGVD
bGlwcGVkUG9pbnRGb3JFZGdlKGNvbnN0IEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSYgaDEsIGNvbnN0
IEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSYgaDIpCit7CisgICAgLy8gUG9pbnRzIGgxIGFuZCBoMiBm
b3JtIGEgbGluZSBpbiA0ZCwgYW5kIGFueSBwb2ludCBvbiB0aGF0IGxpbmUgY2FuIGJlIHJlcHJl
c2VudGVkCisgICAgLy8gYXMgYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGgxIGFuZCBoMjoKKyAg
ICAvLyAgICBwID0gKDEtdCkgaDEgKyAodCkgaDIKKyAgICAvLworICAgIC8vIFdlIHdhbnQgdG8g
Y29tcHV0ZSBwb2ludCBwIHN1Y2ggdGhhdCBwLncgPT0gMC4gVG8gZG8gdGhpcywgd2Ugc29sdmUg
Zm9yIHQgaW4gdGhlCisgICAgLy8gZm9sbG93aW5nIGVxdWF0aW9uOgorICAgIC8vICAgcC53ID0g
MCA9ICgxLXQpICogaDEudyArICh0KSAqIGgyLncKKyAgICAvLworICAgIC8vIE9uY2UgcGFyYW10
ZXIgdCBpcyBrbm93biwgdGhlIHJlc3Qgb2YgcCBjYW4gYmUgY29tcHV0ZWQgdmlhIHAgPSAoMS10
KSBoMSArICh0KSBoMi4KKworICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgaXMgYSBzcGVjaWFsIGNh
c2Ugb2YgdGhlIGZvbGxvd2luZyBhc3NlcnRpb24sIGJ1dCBpdHMgYSBnb29kIGlkZWEgdG8ga2Vl
cCBpdCBhbiBleHBsaWNpdCBzYW5pdHkgY2hlY2sgaGVyZS4KKyAgICBBU1NFUlQoaDIudyAhPSBo
MS53KTsKKyAgICAvLyBFeGFjdGx5IG9uZSBvZiBoMSBvciBoMiAoYnV0IG5vdCBib3RoKSBtdXN0
IGJlIG9uIHRoZSBuZWdhdGl2ZSBzaWRlIG9mIHRoZSB3IHBsYW5lIHdoZW4gdGhpcyBpcyBjYWxs
ZWQuCisgICAgQVNTRVJUKGgxLnNob3VsZEJlQ2xpcHBlZCgpIF4gaDIuc2hvdWxkQmVDbGlwcGVk
KCkpOworCisgICAgZG91YmxlIHQgPSAoLWgxLncpIC8gKGgyLncgLSBoMS53KTsKKworICAgIGRv
dWJsZSB4ID0gKDEtdCkgKiBoMS54ICsgdCAqIGgyLng7CisgICAgZG91YmxlIHkgPSAoMS10KSAq
IGgxLnkgKyB0ICogaDIueTsKKyAgICBkb3VibGUgeiA9ICgxLXQpICogaDEueiArIHQgKiBoMi56
OworICAgIGRvdWJsZSB3ID0gMC4wMDAwMTsgLy8gb3IgYW55IHBvc2l0aXZlIG5vbi16ZXJvIHNt
YWxsIGVwc2lsb24KKworICAgIHJldHVybiBIb21vZ2VuZW91c0Nvb3JkaW5hdGUoeCwgeSwgeiwg
dyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHBhbmRCb3VuZHNUb0luY2x1ZGVQb2ludChm
bG9hdCYgeG1pbiwgZmxvYXQmIHhtYXgsIGZsb2F0JiB5bWluLCBmbG9hdCYgeW1heCwgY29uc3Qg
RmxvYXRQb2ludCYgcCkKK3sKKyAgICB4bWluID0gc3RkOjptaW4ocC54KCksIHhtaW4pOworICAg
IHhtYXggPSBzdGQ6Om1heChwLngoKSwgeG1heCk7CisgICAgeW1pbiA9IHN0ZDo6bWluKHAueSgp
LCB5bWluKTsKKyAgICB5bWF4ID0gc3RkOjptYXgocC55KCksIHltYXgpOworfQorCitzdGF0aWMg
RmxvYXRSZWN0IGNvbXB1dGVFbmNsb3NpbmdSZWN0T2ZDbGlwcGVkUXVhZChjb25zdCBIb21vZ2Vu
ZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgyLCBjb25z
dCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgzLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUm
IGg0KQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2xpcHBpbmcgYXMgbmVjZXNz
YXJ5IGFuZCBjb21wdXRlcyB0aGUgZW5jbG9zaW5nIDJkCisgICAgLy8gRmxvYXRSZWN0IG9mIHRo
ZSB2ZXJ0aWNlcy4gRG9pbmcgdGhlc2UgdHdvIHN0ZXBzIHNpbXVsdGFuZW91c2x5IGFsbG93cyB1
cyB0byBhdm9pZAorICAgIC8vIHRoZSBvdmVyaGVhZCBvZiBzdG9yaW5nIGFuIHVua25vd24gbnVt
YmVyIG9mIGNsaXBwZWQgdmVydGljZXMuCisKKyAgICBmbG9hdCB4bWluID0gc3RkOjpudW1lcmlj
X2xpbWl0czxmbG9hdD46Om1heCgpOworICAgIGZsb2F0IHhtYXggPSBzdGQ6Om51bWVyaWNfbGlt
aXRzPGZsb2F0Pjo6bWluKCk7CisgICAgZmxvYXQgeW1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8
ZmxvYXQ+OjptYXgoKTsKKyAgICBmbG9hdCB5bWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9h
dD46Om1pbigpOworCisgICAgaWYgKCFoMS5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgZXhw
YW5kQm91bmRzVG9JbmNsdWRlUG9pbnQoeG1pbiwgeG1heCwgeW1pbiwgeW1heCwgaDEuY2FydGVz
aWFuUG9pbnQyZCgpKTsKKworICAgIGlmIChoMS5zaG91bGRCZUNsaXBwZWQoKSBeIGgyLnNob3Vs
ZEJlQ2xpcHBlZCgpKQorICAgICAgICBleHBhbmRCb3VuZHNUb0luY2x1ZGVQb2ludCh4bWluLCB4
bWF4LCB5bWluLCB5bWF4LCBjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRnZShoMSwgaDIpLmNhcnRl
c2lhblBvaW50MmQoKSk7CisKKyAgICBpZiAoIWgyLnNob3VsZEJlQ2xpcHBlZCgpKQorICAgICAg
ICBleHBhbmRCb3VuZHNUb0luY2x1ZGVQb2ludCh4bWluLCB4bWF4LCB5bWluLCB5bWF4LCBoMi5j
YXJ0ZXNpYW5Qb2ludDJkKCkpOworCisgICAgaWYgKGgyLnNob3VsZEJlQ2xpcHBlZCgpIF4gaDMu
c2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIGV4cGFuZEJvdW5kc1RvSW5jbHVkZVBvaW50KHht
aW4sIHhtYXgsIHltaW4sIHltYXgsIGNvbXB1dGVDbGlwcGVkUG9pbnRGb3JFZGdlKGgyLCBoMyku
Y2FydGVzaWFuUG9pbnQyZCgpKTsKKworICAgIGlmICghaDMuc2hvdWxkQmVDbGlwcGVkKCkpCisg
ICAgICAgIGV4cGFuZEJvdW5kc1RvSW5jbHVkZVBvaW50KHhtaW4sIHhtYXgsIHltaW4sIHltYXgs
IGgzLmNhcnRlc2lhblBvaW50MmQoKSk7CisKKyAgICBpZiAoaDMuc2hvdWxkQmVDbGlwcGVkKCkg
XiBoNC5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgZXhwYW5kQm91bmRzVG9JbmNsdWRlUG9p
bnQoeG1pbiwgeG1heCwgeW1pbiwgeW1heCwgY29tcHV0ZUNsaXBwZWRQb2ludEZvckVkZ2UoaDMs
IGg0KS5jYXJ0ZXNpYW5Qb2ludDJkKCkpOworCisgICAgaWYgKCFoNC5zaG91bGRCZUNsaXBwZWQo
KSkKKyAgICAgICAgZXhwYW5kQm91bmRzVG9JbmNsdWRlUG9pbnQoeG1pbiwgeG1heCwgeW1pbiwg
eW1heCwgaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKworICAgIGlmIChoNC5zaG91bGRCZUNsaXBw
ZWQoKSBeIGgxLnNob3VsZEJlQ2xpcHBlZCgpKQorICAgICAgICBleHBhbmRCb3VuZHNUb0luY2x1
ZGVQb2ludCh4bWluLCB4bWF4LCB5bWluLCB5bWF4LCBjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRn
ZShoNCwgaDEpLmNhcnRlc2lhblBvaW50MmQoKSk7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0KEZs
b2F0UG9pbnQoeG1pbiwgeW1pbiksIEZsb2F0U2l6ZSh4bWF4IC0geG1pbiwgeW1heCAtIHltaW4p
KTsKK30KKworc3RhdGljIEZsb2F0UmVjdCBjb21wdXRlRW5jbG9zaW5nUmVjdChjb25zdCBIb21v
Z2VuZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgyLCBj
b25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgzLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5h
dGUmIGg0KQoreworICAgIC8vIElmIG5vIHZlcnRpY2VzIG9uIHRoZSBxdWFkIGFyZSBjbGlwcGVk
LCB0aGVuIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBlbmNsb3NpbmcgcmVjdCBkaXJlY3RseS4K
KyAgICBib29sIGNsaXBwZWQgPSBoMS5zaG91bGRCZUNsaXBwZWQoKSB8fCBoMi5zaG91bGRCZUNs
aXBwZWQoKSB8fCBoMy5zaG91bGRCZUNsaXBwZWQoKSB8fCBoNC5zaG91bGRCZUNsaXBwZWQoKTsK
KyAgICBpZiAoIWNsaXBwZWQpIHsKKyAgICAgICAgRmxvYXRRdWFkIG1hcHBlZFF1YWQgPSBGbG9h
dFF1YWQoaDEuY2FydGVzaWFuUG9pbnQyZCgpLCBoMi5jYXJ0ZXNpYW5Qb2ludDJkKCksIGgzLmNh
cnRlc2lhblBvaW50MmQoKSwgaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICAgICAgcmV0dXJu
IG1hcHBlZFF1YWQuYm91bmRpbmdCb3goKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcHV0ZUVu
Y2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkKGgxLCBoMiwgaDMsIGg0KTsKK30KKworSW50UmVjdCBD
Q01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJh
bnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0KQoreworICAgIHJldHVybiBlbmNsb3NpbmdJ
bnRSZWN0KG1hcENsaXBwZWRSZWN0KHRyYW5zZm9ybSwgRmxvYXRSZWN0KHNyY1JlY3QpKSk7Cit9
CisKK0Zsb2F0UmVjdCBDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdChjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QpCit7CisgICAg
aWYgKHRyYW5zZm9ybS5pc0lkZW50aXR5T3JUcmFuc2xhdGlvbigpKSB7CisgICAgICAgIEZsb2F0
UmVjdCBtYXBwZWRSZWN0KHNyY1JlY3QpOworICAgICAgICBtYXBwZWRSZWN0Lm1vdmUoc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHRyYW5zZm9ybS5tNDEoKSksIHN0YXRpY19jYXN0PGZsb2F0Pih0cmFuc2Zv
cm0ubTQyKCkpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlZFJlY3Q7CisgICAgfQorCisgICAgLy8g
QXBwbHkgdGhlIHRyYW5zZm9ybSwgYnV0IHJldGFpbiB0aGUgcmVzdWx0IGluIGhvbW9nZW5lb3Vz
IGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVhZCBxID0gRmxvYXRRdWFkKEZsb2F0UmVjdChzcmNS
ZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9pbnQodHJhbnNmb3Jt
LCBxLnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1hcFBvaW50KHRyYW5z
Zm9ybSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMgPSBtYXBQb2ludCh0
cmFuc2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gbWFwUG9p
bnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgcmV0dXJuIGNvbXB1dGVFbmNsb3NpbmdSZWN0
KGgxLCBoMiwgaDMsIGg0KTsKK30KKworRmxvYXRSZWN0IENDTWF0aFV0aWw6OnByb2plY3RDbGlw
cGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9h
dFJlY3QmIHNyY1JlY3QpCit7CisgICAgLy8gUGVyZm9ybSB0aGUgcHJvamVjdGlvbiwgYnV0IHJl
dGFpbiB0aGUgcmVzdWx0IGluIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVh
ZCBxID0gRmxvYXRRdWFkKEZsb2F0UmVjdChzcmNSZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29y
ZGluYXRlIGgxID0gcHJvamVjdFBvaW50KHRyYW5zZm9ybSwgcS5wMSgpKTsKKyAgICBIb21vZ2Vu
ZW91c0Nvb3JkaW5hdGUgaDIgPSBwcm9qZWN0UG9pbnQodHJhbnNmb3JtLCBxLnAyKCkpOworICAg
IEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMyA9IHByb2plY3RQb2ludCh0cmFuc2Zvcm0sIHEucDMo
KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gcHJvamVjdFBvaW50KHRyYW5zZm9y
bSwgcS5wNCgpKTsKKworICAgIHJldHVybiBjb21wdXRlRW5jbG9zaW5nUmVjdChoMSwgaDIsIGgz
LCBoNCk7Cit9CisKK0Zsb2F0UXVhZCBDQ01hdGhVdGlsOjptYXBRdWFkKGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UXVhZCYgcSwgYm9vbCYgY2xpcHBl
ZCkKK3sKKyAgICBpZiAodHJhbnNmb3JtLmlzSWRlbnRpdHlPclRyYW5zbGF0aW9uKCkpIHsKKyAg
ICAgICAgRmxvYXRRdWFkIG1hcHBlZFF1YWQocSk7CisgICAgICAgIG1hcHBlZFF1YWQubW92ZShz
dGF0aWNfY2FzdDxmbG9hdD4odHJhbnNmb3JtLm00MSgpKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRy
YW5zZm9ybS5tNDIoKSkpOworICAgICAgICByZXR1cm4gbWFwcGVkUXVhZDsKKyAgICB9CisKKyAg
ICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDEgPSBtYXBQb2ludCh0cmFuc2Zvcm0sIHEucDEoKSk7
CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgyID0gbWFwUG9pbnQodHJhbnNmb3JtLCBxLnAy
KCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMyA9IG1hcFBvaW50KHRyYW5zZm9ybSwg
cS5wMygpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDQgPSBtYXBQb2ludCh0cmFuc2Zv
cm0sIHEucDQoKSk7CisKKyAgICBjbGlwcGVkID0gaDEuc2hvdWxkQmVDbGlwcGVkKCkgfHwgaDIu
c2hvdWxkQmVDbGlwcGVkKCkgfHwgaDMuc2hvdWxkQmVDbGlwcGVkKCkgfHwgaDQuc2hvdWxkQmVD
bGlwcGVkKCk7CisKKyAgICAvLyBSZXN1bHQgd2lsbCBiZSBpbnZhbGlkIGlmIGNsaXBwZWQgPT0g
dHJ1ZS4gQnV0LCBjb21wdXRlIGl0IGFueXdheSBqdXN0IGluIGNhc2UsIHRvIGVtdWxhdGUgZXhp
c3RpbmcgYmVoYXZpb3IuCisgICAgcmV0dXJuIEZsb2F0UXVhZChoMS5jYXJ0ZXNpYW5Qb2ludDJk
KCksIGgyLmNhcnRlc2lhblBvaW50MmQoKSwgaDMuY2FydGVzaWFuUG9pbnQyZCgpLCBoNC5jYXJ0
ZXNpYW5Qb2ludDJkKCkpOworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6cHJvamVjdFF1YWQo
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRRdWFkJiBx
LCBib29sJiBjbGlwcGVkKQoreworICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOworICAgIGJv
b2wgY2xpcHBlZFBvaW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3JtLnByb2pl
Y3RQb2ludChxLnAxKCksICZjbGlwcGVkUG9pbnQpKTsKKyAgICBjbGlwcGVkID0gY2xpcHBlZFBv
aW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAy
KCksICZjbGlwcGVkUG9pbnQpKTsKKyAgICBjbGlwcGVkIHw9IGNsaXBwZWRQb2ludDsKKyAgICBw
cm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAmY2xpcHBl
ZFBvaW50KSk7CisgICAgY2xpcHBlZCB8PSBjbGlwcGVkUG9pbnQ7CisgICAgcHJvamVjdGVkUXVh
ZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsaXBwZWRQb2ludCkpOwor
ICAgIGNsaXBwZWQgfD0gY2xpcHBlZFBvaW50OworCisgICAgcmV0dXJuIHByb2plY3RlZFF1YWQ7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li5kOWQwMzllODYwNjc3Nzc3YmUyNzYxMWNjNGVmM2MzZTg5NzczNjJlCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRo
VXRpbC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ0NNYXRoVXRp
bF9oCisjZGVmaW5lIENDTWF0aFV0aWxfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEludFJlY3Q7CitjbGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBGbG9hdFF1YWQ7CitjbGFzcyBUcmFu
c2Zvcm1hdGlvbk1hdHJpeDsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBtYXRoIGhlbHBlciBm
dW5jdGlvbmFsaXR5IHRoYXQgZG9lcyBub3QgYmVsb25nIGluIFdlYkNvcmUuCisvLyBJdCBpcyBw
b3NzaWJsZSB0aGF0IHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgbWlncmF0ZWQgdG8gV2Vi
Q29yZSBldmVudHVhbGx5LgorY2xhc3MgQ0NNYXRoVXRpbCB7CitwdWJsaWM6CisKKyAgICAvLyBC
YWNrZ3JvdW5kOiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjb2RlIGluIFdlYkNvcmUgZG9lcyBub3Qg
ZG8gdGhlIHJpZ2h0IHRoaW5nIGluCisgICAgLy8gbWFwUmVjdCAvIG1hcFF1YWQgLyBwcm9qZWN0
UXVhZCB3aGVuIHRoZXJlIGlzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiB0aGF0IGNhdXNlcwor
ICAgIC8vIG9uZSBvZiB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgdG8gZ28gdG8gdyA8IDAuIElu
IHRob3NlIGNhc2VzLCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAvLyBwZXJmb3JtIGNsaXBwaW5n
IGluIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLCBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3Jt
LCBiZWZvcmUKKyAgICAvLyBkaXZpZGluZy1ieS13IHRvIGNvbnZlcnQgdG8gY2FydGVzaWFuIGNv
b3JkaW5hdGVzLgorICAgIC8vCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgYXhp
cy1hbGlnbmVkIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY29ycmVjdGx5IGNsaXBwZWQsCisgICAg
Ly8gdHJhbnNmb3JtZWQgcG9seWdvbi4KKyAgICBzdGF0aWMgSW50UmVjdCBtYXBDbGlwcGVkUmVj
dChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEludFJlY3QmKTsKKyAgICBzdGF0
aWMgRmxvYXRSZWN0IG1hcENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jiwg
Y29uc3QgRmxvYXRSZWN0Jik7CisgICAgc3RhdGljIEZsb2F0UmVjdCBwcm9qZWN0Q2xpcHBlZFJl
Y3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFJlY3QmKTsKKworICAg
IC8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZG8gY29ycmVjdCBjbGlwcGluZyBhZ2Fp
bnN0IHcgPSAwIHBsYW5lLCBidXQgaXQKKyAgICAvLyBjb3JyZWN0bHkgZGV0ZWN0cyB0aGUgY2xp
cHBlZCBjb25kaXRpb24gdmlhIHRoZSBib29sZWFuIGNsaXBwZWQuCisgICAgc3RhdGljIEZsb2F0
UXVhZCBtYXBRdWFkKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRRdWFk
JiwgYm9vbCYgY2xpcHBlZCk7CisgICAgc3RhdGljIEZsb2F0UXVhZCBwcm9qZWN0UXVhZChjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UXVhZCYsIGJvb2wmIGNsaXBwZWQp
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gI2RlZmluZSBDQ01h
dGhVdGlsX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwCmluZGV4IGE1NDEx
ZWNjZjc2MTUxZWEzYmYwMDM1Y2Y5OThkMGJjYmRiMzI3YmIuLmUwNGFkZmEzMTM2YTRmMDllZWEy
OGQ4YjIwNTFhM2ZiNDZjNjc3M2UgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2Vy
LmNwcApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgogI2lu
Y2x1ZGUgImNjL0NDTGF5ZXJJbXBsLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgogCiAj
aW5jbHVkZSA8YWxnb3JpdGhtPgogCkBAIC0yNzUsMjIgKzI3Niw2IEBAIHN0YXRpYyBpbmxpbmUg
SW50UmVjdCByZWN0U3VidHJhY3RSZWdpb24oY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgUmVn
aW9uJiByZWdpCiAgICAgcmV0dXJuIGJvdW5kc1JlY3Q7CiB9CiAKLXN0YXRpYyBGbG9hdFF1YWQg
cHJvamVjdFF1YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3Qg
RmxvYXRRdWFkJiBxLCBib29sJiBjbGFtcGVkKQotewotICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRR
dWFkOwotICAgIGJvb2wgY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJh
bnNmb3JtLnByb2plY3RQb2ludChxLnAxKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVk
ID0gY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2pl
Y3RQb2ludChxLnAyKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkIHw9IGNsYW1wZWRQ
b2ludDsKLSAgICBwcm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5w
MygpLCAmY2xhbXBlZFBvaW50KSk7Ci0gICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7Ci0gICAg
cHJvamVjdGVkUXVhZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsYW1w
ZWRQb2ludCkpOwotICAgIGNsYW1wZWQgfD0gY2xhbXBlZFBvaW50OwotCi0gICAgcmV0dXJuIHBy
b2plY3RlZFF1YWQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgSW50UmVjdCBjb21wdXRlVW5vY2NsdWRl
ZENvbnRlbnRSZWN0KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgY29udGVudFNwYWNlVHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzY2lzc29y
UmVjdCwgY29uc3QgUmVnaW9uJiBvY2NsdXNpb24pCiB7CiAgICAgaWYgKCFjb250ZW50U3BhY2VU
cmFuc2Zvcm0uaXNJbnZlcnRpYmxlKCkpCkBAIC0yOTksOSArMjg0LDkgQEAgc3RhdGljIGlubGlu
ZSBJbnRSZWN0IGNvbXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QoY29uc3QgSW50UmVjdCYgY29u
dGVudFJlY3QsIGMKICAgICBGbG9hdFJlY3QgdHJhbnNmb3JtZWRSZWN0ID0gY29udGVudFNwYWNl
VHJhbnNmb3JtLm1hcFJlY3QoRmxvYXRSZWN0KGNvbnRlbnRSZWN0KSk7CiAgICAgLy8gVGFrZSB0
aGUgZW5jbG9zaW5nSW50UmVjdCBhdCBlYWNoIHN0ZXAsIGFzIHdlIHdhbnQgdG8gY29udGFpbiBh
bnkgdW5vY2NsdWRlZCBwYXJ0aWFsIHBpeGVscyBpbiB0aGUgcmVzdWx0aW5nIEludFJlY3QuCiAg
ICAgSW50UmVjdCBzaHJ1bmtSZWN0ID0gcmVjdFN1YnRyYWN0UmVnaW9uKGludGVyc2VjdGlvbihl
bmNsb3NpbmdJbnRSZWN0KHRyYW5zZm9ybWVkUmVjdCksIHNjaXNzb3JSZWN0KSwgb2NjbHVzaW9u
KTsKLSAgICBib29sIGNsYW1wZWQ7IC8vIEZJWE1FOiBwcm9qZWN0UXVhZCByZXR1cm5zIGludmFs
aWQgcmVzdWx0cyB3aGVuIGEgcG9pbnQgZ2V0cyBjbGFtcGVkLiBUbyBiZSBmaXhlZCBpbiBidWcg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwODA2LgotICAgIEludFJl
Y3QgdW5vY2NsdWRlZFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHByb2plY3RRdWFkKGNvbnRlbnRT
cGFjZVRyYW5zZm9ybS5pbnZlcnNlKCksIEZsb2F0UXVhZChGbG9hdFJlY3Qoc2hydW5rUmVjdCkp
LCBjbGFtcGVkKS5ib3VuZGluZ0JveCgpKTsKLSAgICBpZiAoY2xhbXBlZCkKKyAgICBib29sIGNs
aXBwZWQ7IC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgcHJvamVjdENsaXBwZWRR
dWFkIGluc3RlYWQgb2YgZm9yY2luZyBldmVyeXRoaW5nIHRvIGJlIHVub2NjbHVkZWQuIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzIxNy4KKyAgICBJbnRSZWN0IHVu
b2NjbHVkZWRSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChDQ01hdGhVdGlsOjpwcm9qZWN0UXVhZChj
b250ZW50U3BhY2VUcmFuc2Zvcm0uaW52ZXJzZSgpLCBGbG9hdFF1YWQoRmxvYXRSZWN0KHNocnVu
a1JlY3QpKSwgY2xpcHBlZCkuYm91bmRpbmdCb3goKSk7CisgICAgaWYgKGNsaXBwZWQpCiAgICAg
ICAgIHJldHVybiBjb250ZW50UmVjdDsKICAgICAvLyBUaGUgcmVjdCBiYWNrIGluIGNvbnRlbnQg
c3BhY2UgaXMgYSBib3VuZGluZyBib3ggYW5kIG1heSBleHRlbmQgb3V0c2lkZSBvZiB0aGUgb3Jp
Z2luYWwgY29udGVudFJlY3QsIHNvIGNsYW1wIGl0IHRvIHRoZSBjb250ZW50UmVjdEJvdW5kcy4K
ICAgICByZXR1cm4gaW50ZXJzZWN0aW9uKHVub2NjbHVkZWRSZWN0LCBjb250ZW50UmVjdCk7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdENv
bW1vblRlc3QuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhv
c3RDb21tb25UZXN0LmNwcAppbmRleCA0YTk2NTlkZGQxNTNlZmY2ZTY3NTJlYTIwNzA2ZTIzYzdl
MTI0YjY0Li5mNmExY2ViNTBjMmUwMTBjZjVjZjJjZjQ5Njc1ZTI0MDliNDZlYjYyIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdENvbW1vblRl
c3QuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRyZWVIb3N0
Q29tbW9uVGVzdC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJUcmFuc2Zvcm1hdGlv
bk1hdHJpeC5oIgogI2luY2x1ZGUgIlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgogI2lu
Y2x1ZGUgImNjL0NDTGF5ZXJBbmltYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAiY2MvQ0NN
YXRoVXRpbC5oIgogCiAjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KICNpbmNsdWRlIDxndGVzdC9n
dGVzdC5oPgpAQCAtOTc5LDYgKzk4MCwyNjQgQEAgVEVTVChDQ0xheWVyVHJlZUhvc3RDb21tb25U
ZXN0LCB2ZXJpZnlBbmltYXRpb25zRm9yUmVuZGVyU3VyZmFjZUhpZXJhcmNoeSkKICAgICBFWFBF
Q1RfRkxPQVRfRVEoNS4wLCBncmFuZENoaWxkT2ZSUzItPnNjcmVlblNwYWNlVHJhbnNmb3JtKCku
bTQyKCkpOwogfQogCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2li
bGVSZWN0Rm9ySWRlbnRpdHlUcmFuc2Zvcm0pCit7CisgICAgLy8gVGVzdCB0aGUgY2FsY3VsYXRl
VmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3b3JrcyBjb3JyZWN0bHkgZm9yIGlkZW50aXR5IHRyYW5z
Zm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQb2lu
dCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBMYXllciBpcyBjb250YWlu
ZWQgd2l0aGluIHRoZSBzdXJmYWNlLgorICAgIEludFJlY3QgbGF5ZXJDb250ZW50UmVjdCA9IElu
dFJlY3QoSW50UG9pbnQoMTAsIDEwKSwgSW50U2l6ZSgzMCwgMzApKTsKKyAgICBJbnRSZWN0IGV4
cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgxMCwgMTApLCBJbnRTaXplKDMwLCAzMCkpOworICAg
IEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxl
UmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKwor
ICAgIC8vIENhc2UgMjogTGF5ZXIgaXMgb3V0c2lkZSB0aGUgc3VyZmFjZSByZWN0LgorICAgIGxh
eWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDEyMCwgMTIwKSwgSW50U2l6ZSgzMCwg
MzApKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2li
bGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisKKyAgICAv
LyBDYXNlIDM6IExheWVyIGlzIHBhcnRpYWxseSBvdmVybGFwcGluZyB0aGUgc3VyZmFjZSByZWN0
LgorICAgIGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDgwLCA4MCksIEludFNp
emUoMzAsIDMwKSk7CisgICAgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDgwLCA4MCksIElu
dFNpemUoMjAsIDIwKSk7CisgICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxj
dWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5
ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwg
YWN0dWFsKTsKK30KKworVEVTVChDQ0xheWVyVHJlZUhvc3RDb21tb25UZXN0LCB2ZXJpZnlWaXNp
YmxlUmVjdEZvclRyYW5zbGF0aW9ucykKK3sKKyAgICAvLyBUZXN0IHRoZSBjYWxjdWxhdGVWaXNp
YmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSBmb3Igc2NhbGluZyB0cmFuc2Zvcm1z
LgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwg
MCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJ
bnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBMYXll
ciBpcyBjb250YWluZWQgd2l0aGluIHRoZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJh
bnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5z
bGF0ZSgxMCwgMTApOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDAs
IDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVI
b3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJD
b250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVD
VF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgMjogTGF5ZXIgaXMgb3V0c2lk
ZSB0aGUgc3VyZmFjZSByZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVu
dGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSgxMjAsIDEyMCk7
CisgICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVj
dCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0pOworICAgIEVYUEVDVF9UUlVFKGFjdHVhbC5pc0VtcHR5KCkpOworCisgICAgLy8gQ2Fz
ZSAzOiBMYXllciBpcyBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgdGhlIHN1cmZhY2UgcmVjdC4KKyAg
ICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUoODAsIDgwKTsKKyAgICBleHBlY3RlZCA9IEludFJlY3Qo
SW50UG9pbnQoMCwgMCksIEludFNpemUoMjAsIDIwKSk7CisgICAgYWN0dWFsID0gQ0NMYXllclRy
ZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5
ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRf
UkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChDQ0xheWVyVHJlZUhvc3RDb21t
b25UZXN0LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjJEUm90YXRpb25zKQoreworICAgIC8vIFRlc3Qg
dGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5IGZvciBy
b3RhdGlvbnMgYWJvdXQgei1heGlzIChpLmUuIDJEIHJvdGF0aW9ucykuCisgICAgLy8gUmVtZW1i
ZXIgdGhhdCBjYWxjdWxhdGVWaXNpYmxlUmVjdCgpIHNob3VsZCByZXR1cm4gdGhlIHZpc2libGUg
cmVjdCBpbiB0aGUgbGF5ZXIncyBzcGFjZS4KKworICAgIEludFJlY3QgdGFyZ2V0U3VyZmFjZVJl
Y3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50
UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgz
MCwgMzApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bTsKKworICAgIC8vIENhc2UgMTogTGF5ZXIgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3VyZmFj
ZS4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUoNTAsIDUwKTsKKyAgICBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybS5yb3RhdGUoNDUpOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KElu
dFBvaW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NM
YXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVj
dCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVD
VF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgMjogTGF5ZXIg
aXMgb3V0c2lkZSB0aGUgc3VyZmFjZSByZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3Jt
Lm1ha2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSgt
NTAsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAgYWN0
dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRT
dXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOwor
ICAgIEVYUEVDVF9UUlVFKGFjdHVhbC5pc0VtcHR5KCkpOworCisgICAgLy8gQ2FzZSAzOiBUaGUg
bGF5ZXIgaXMgcm90YXRlZCBhYm91dCBpdHMgdG9wLWxlZnQgY29ybmVyLiBJbiBzdXJmYWNlIHNw
YWNlLCB0aGUgbGF5ZXIKKyAgICAvLyAgICAgICAgIGlzIG9yaWVudGVkIGRpYWdvbmFsbHksIHdp
dGggdGhlIGxlZnQgaGFsZiBvdXRzaWRlIG9mIHRoZSByZW5kZXJTdXJmYWNlLiBJbgorICAgIC8v
ICAgICAgICAgdGhpcyBjYXNlLCB0aGUgdmlzaWJsZSByZWN0IHNob3VsZCBzdGlsbCBiZSB0aGUg
ZW50aXJlIGxheWVyIChyZW1lbWJlciB0aGUKKyAgICAvLyAgICAgICAgIHZpc2libGUgcmVjdCBp
cyBjb21wdXRlZCBpbiBsYXllciBzcGFjZSk7IGJvdGggdGhlIHRvcC1sZWZ0IGFuZAorICAgIC8v
ICAgICAgICAgYm90dG9tLXJpZ2h0IGNvcm5lcnMgb2YgdGhlIGxheWVyIGFyZSBzdGlsbCB2aXNp
YmxlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAgZXhwZWN0ZWQgPSBJbnRSZWN0
KEludFBvaW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIGFjdHVhbCA9IENDTGF5ZXJU
cmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxh
eWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfSU5U
X1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7CisKKyAgICAvLyBDYXNlIDQ6IFRoZSBsYXllciBp
cyByb3RhdGVkIGFib3V0IGl0cyB0b3AtbGVmdCBjb3JuZXIsIGFuZCB0cmFuc2xhdGVkIHVwd2Fy
ZHMuIEluCisgICAgLy8gICAgICAgICBzdXJmYWNlIHNwYWNlLCB0aGUgbGF5ZXIgaXMgb3JpZW50
ZWQgZGlhZ29uYWxseSwgd2l0aCBvbmx5IHRoZSB0b3AgY29ybmVyCisgICAgLy8gICAgICAgICBv
ZiB0aGUgc3VyZmFjZSBvdmVybGFwcGluZyB0aGUgbGF5ZXIuIEluIGxheWVyIHNwYWNlLCB0aGUg
cmVuZGVyIHN1cmZhY2UKKyAgICAvLyAgICAgICAgIG92ZXJsYXBzIHRoZSByaWdodCBzaWRlIG9m
IHRoZSBsYXllci4gVGhlIHZpc2libGUgcmVjdCBzaG91bGQgYmUgdGhlCisgICAgLy8gICAgICAg
ICBsYXllcidzIHJpZ2h0IGhhbGYuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlk
ZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKDAsIC1zcXJ0
KDIpICogMTUpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAg
ZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDE1LCAwKSwgSW50U2l6ZSgxNSwgMzApKTsgLy8g
cmlnaHQgaGFsZiBvZiBsYXllciBib3VuZHMuCisgICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0
Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250
ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9F
UShleHBlY3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChDQ0xheWVyVHJlZUhvc3RDb21tb25UZXN0
LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjNkT3J0aG9ncmFwaGljVHJhbnNmb3JtKQoreworICAgIC8v
IFRlc3QgdGhhdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3b3JrcyBjb3Jy
ZWN0bHkgZm9yIDNkIHRyYW5zZm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0
ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIEludFJl
Y3QgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMTAw
LCAxMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bTsKKworICAgIC8vIENhc2UgMTogT3J0aG9ncmFwaGljIHByb2plY3Rpb24gb2YgYSBsYXllciBy
b3RhdGVkIGFib3V0IHktYXhpcyBieSA0NSBkZWdyZWVzLCBzaG91bGQgYmUgZnVsbHkgY29udGFp
bmVkIGluIHRoZSByZW5kZXJTdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1h
a2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZTNkKDAsIDQ1
LCAwKTsKKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50
U2l6ZSgxMDAsIDEwMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29t
bW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50
UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShl
eHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgMjogT3J0aG9ncmFwaGljIHByb2plY3Rp
b24gb2YgYSBsYXllciByb3RhdGVkIGFib3V0IHktYXhpcyBieSA0NSBkZWdyZWVzLCBidXQKKyAg
ICAvLyAgICAgICAgIHNoaWZ0ZWQgdG8gdGhlIHNpZGUgc28gb25seSB0aGUgcmlnaHQtaGFsZiB0
aGUgbGF5ZXIgd291bGQgYmUgdmlzaWJsZSBvbgorICAgIC8vICAgICAgICAgdGhlIHN1cmZhY2Uu
CisgICAgZG91YmxlIGhhbGZXaWR0aE9mUm90YXRlZExheWVyID0gKDEwMC4wIC8gc3FydCgyKSkg
KiAwLjU7IC8vIDEwMC4wIGlzIHRoZSB1bi1yb3RhdGVkIGxheWVyIHdpZHRoOyBkaXZpZGVkIGJ5
IHNxcnQoMikgaXMgdGhlIHJvdGF0ZWQgd2lkdGguCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRl
KC1oYWxmV2lkdGhPZlJvdGF0ZWRMYXllciwgMCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0ucm90YXRlM2QoMCwgNDUsIDApOyAvLyByb3RhdGVzIGFib3V0IHRoZSBsZWZ0IGVkZ2Ugb2Yg
dGhlIGxheWVyCisgICAgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDUwLCAwKSwgSW50U2l6
ZSg1MCwgMTAwKSk7IC8vIHJpZ2h0IGhhbGYgb2YgdGhlIGxheWVyLgorICAgIGFjdHVhbCA9IEND
TGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJl
Y3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBF
Q1RfSU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXllclRyZWVI
b3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZFBlcnNwZWN0aXZlVHJhbnNmb3Jt
KQoreworICAgIC8vIFRlc3QgdGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29y
a3MgY29ycmVjdGx5IHdoZW4gdGhlIGxheWVyIGhhcyBhCisgICAgLy8gcGVyc3BlY3RpdmUgcHJv
amVjdGlvbiBvbnRvIHRoZSB0YXJnZXQgc3VyZmFjZS4KKworICAgIEludFJlY3QgdGFyZ2V0U3Vy
ZmFjZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7Cisg
ICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtNTAsIC01MCks
IEludFNpemUoMjAwLCAyMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybTsKKworICAgIC8vIENhc2UgMTogRXZlbiB0aG91Z2ggdGhlIGxheWVyIGlz
IHR3aWNlIGFzIGxhcmdlIGFzIHRoZSBzdXJmYWNlLCBkdWUgdG8gcGVyc3BlY3RpdmUKKyAgICAv
LyAgICAgICAgIGZvcmVzaG9ydGVuaW5nLCB0aGUgbGF5ZXIgd2lsbCBmaXQgZnVsbHkgaW4gdGhl
IHN1cmZhY2Ugd2hlbiBpdHMgdHJhbnNsYXRlZAorICAgIC8vICAgICAgICAgbW9yZSB0aGFuIHRo
ZSBwZXJzcGVjdGl2ZSBhbW91bnQuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlk
ZW50aXR5KCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mIHRyYW5zZm9ybXMg
YXBwbGllcyB0aGUgcGVyc3BlY3RpdmUgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgc3VyZmFjZS4K
KyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUoNTAsIDUwKTsKKyAgICBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybS5hcHBseVBlcnNwZWN0aXZlKDkpOworICAgIGxheWVyVG9TdXJm
YWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSgtNTAsIC01MCk7CisKKyAgICAvLyBUaGlzIHRyYW5zbGF0
ZSBwbGFjZXMgdGhlIGxheWVyIGluIGZyb250IG9mIHRoZSBzdXJmYWNlJ3MgcHJvamVjdGlvbiBw
bGFuZS4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCAtMjcp
OworCisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoLTUwLCAtNTApLCBJ
bnRTaXplKDIwMCwgMjAwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RD
b21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRl
bnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VR
KGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBzYW1lIHByb2plY3Rpb24gYXMg
YmVmb3JlLCBleGNlcHQgdGhhdCB0aGUgbGF5ZXIgaXMgYWxzbyB0cmFuc2xhdGVkIHRvIHRoZQor
ICAgIC8vICAgICAgICAgc2lkZSwgc28gdGhhdCBvbmx5IHRoZSByaWdodCBoYWxmIG9mIHRoZSBs
YXllciBzaG91bGQgYmUgdmlzaWJsZS4KKyAgICAvLworICAgIC8vIEV4cGxhbmF0aW9uIG9mIGV4
cGVjdGVkIHJlc3VsdDoKKyAgICAvLyBUaGUgcGVyc3BlY3RpdmUgcmF0aW8gaXMgKHogZGlzdGFu
Y2UgYmV0d2VlbiBsYXllciBhbmQgY2FtZXJhIG9yaWdpbikgLyAoeiBkaXN0YW5jZSBiZXR3ZWVu
IHByb2plY3Rpb24gcGxhbmUgYW5kIGNhbWVyYSBvcmlnaW4pID09ICgoLTI3IC0gOSkgLyA5KQor
ICAgIC8vIFRoZW4sIGJ5IHNpbWlsYXIgdHJpYW5nbGVzLCBpZiB3ZSB3YW50IHRvIG1vdmUgYSBs
YXllciBieSB0cmFuc2xhdGluZyAtNTAgdW5pdHMgaW4gcHJvamVjdGVkIHN1cmZhY2UgdW5pdHMg
KHNvIHRoYXQgb25seSBoYWxmIG9mIGl0IGlzCisgICAgLy8gdmlzaWJsZSksIHRoZW4gd2Ugd291
bGQgbmVlZCB0byB0cmFuc2xhdGUgYnkgKC0zNiAvIDkpICogLTUwID09IC0yMDAgaW4gdGhlIGxh
eWVyJ3MgdW5pdHMuCisgICAgLy8KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xh
dGUzZCgtMjAwLCAwLCAwKTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoNTAsIC01
MCksIEludFNpemUoMTAwLCAyMDApKTsgLy8gVGhlIHJpZ2h0IGhhbGYgb2YgdGhlIGxheWVyJ3Mg
Ym91bmRpbmcgcmVjdC4KKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1
bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVjdGVkLCBh
Y3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlmeVZpc2li
bGVSZWN0Rm9yM2RPcnRob2dyYXBoaWNJc05vdENsaXBwZWRCZWhpbmRTdXJmYWNlKQoreworICAg
IC8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyBleHBsaWNpdCBjb25jZXB0IG9mIGFuIG9ydGhvZ3Jh
cGhpYyBwcm9qZWN0aW9uIHBsYW5lIGluIG91cgorICAgIC8vIGNvZGUgKG5vciBpbiB0aGUgQ1NT
IHNwZWMgdG8gbXkga25vd2xlZGdlKS4gVGhlcmVmb3JlLCBsYXllcnMgdGhhdCBhcmUgdGVjaG5p
Y2FsbHkKKyAgICAvLyBiZWhpbmQgdGhlIHN1cmZhY2UgaW4gYW4gb3J0aG9ncmFwaGljIHdvcmxk
IHNob3VsZCBub3QgYmUgY2xpcHBlZCB3aGVuIHRoZXkgYXJlCisgICAgLy8gZmxhdHRlbmVkIHRv
IHRoZSBzdXJmYWNlLgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3Qo
SW50UG9pbnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29u
dGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7Cisg
ICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAv
LyBUaGlzIHNlcXVlbmNlIG9mIHRyYW5zZm9ybXMgZWZmZWN0aXZlbHkgcm90YXRlcyB0aGUgbGF5
ZXIgYWJvdXQgdGhlIHktYXhpcyBhdCB0aGUKKyAgICAvLyBjZW50ZXIgb2YgdGhlIGxheWVyLgor
ICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxheWVyVG9T
dXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgMCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0ucm90YXRlM2QoMCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRy
YW5zbGF0ZSgtNTAsIDApOworCisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3QoSW50UG9p
bnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGFjdHVhbCA9IENDTGF5
ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3Qs
IGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBFQ1Rf
SU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXllclRyZWVIb3N0
Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZFBlcnNwZWN0aXZlSXNDbGlwcGVkKQor
eworICAgIC8vIFRlc3QgdGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29ya3Mg
Y29ycmVjdGx5IHdoZW4gcHJvamVjdGluZyBhIHN1cmZhY2UKKyAgICAvLyBvbnRvIGEgbGF5ZXIs
IGJ1dCB0aGUgbGF5ZXIgaXMgcGFydGlhbGx5IGJlaGluZCB0aGUgY2FtZXJhIChub3QganVzdCBi
ZWhpbmQgdGhlCisgICAgLy8gcHJvamVjdGlvbiBwbGFuZSkuIEluIHRoaXMgY2FzZSwgdGhlIGNh
cnRlc2lhbiBjb29yZGluYXRlcyBtYXkgc2VlbSB0byBiZSB2YWxpZCwKKyAgICAvLyBidXQgYWN0
dWFsbHkgdGhleSBhcmUgbm90LiBUaGUgdmlzaWJsZVJlY3QgbmVlZHMgdG8gYmUgcHJvcGVybHkg
Y2xpcHBlZCBieSB0aGUKKyAgICAvLyB3ID0gMCBwbGFuZSBpbiBob21vZ2VuZW91cyBjb29yZGlu
YXRlcyBiZWZvcmUgY29udmVydGluZyB0byBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuCisKKyAgICBJ
bnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtNTAsIC01MCksIElu
dFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0
KEludFBvaW50KC0xMCwgLTEpLCBJbnRTaXplKDIwLCAyKSk7CisgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBUaGUgbGF5ZXIgaXMgcG9z
aXRpb25lZCBzbyB0aGF0IHRoZSByaWdodCBoYWxmIG9mIHRoZSBsYXllciBzaG91bGQgYmUgaW4g
ZnJvbnQgb2YKKyAgICAvLyB0aGUgY2FtZXJhLCB3aGlsZSB0aGUgb3RoZXIgaGFsZiBpcyBiZWhp
bmQgdGhlIHN1cmZhY2UncyBwcm9qZWN0aW9uIHBsYW5lLiBUaGUKKyAgICAvLyBmb2xsb3dpbmcg
c2VxdWVuY2Ugb2YgdHJhbnNmb3JtcyBhcHBsaWVzIHRoZSBwZXJzcGVjdGl2ZSBhbmQgcm90YXRp
b24gYWJvdXQgdGhlCisgICAgLy8gY2VudGVyIG9mIHRoZSBsYXllci4KKyAgICBsYXllclRvU3Vy
ZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9y
bS5hcHBseVBlcnNwZWN0aXZlKDEpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5z
bGF0ZTNkKDAsIDAsIDEpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZTNkKDAs
IDQ1LCAwKTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHRoaXMgdHJhbnNmb3JtIGRvZXMg
aW5kZWVkIGNhdXNlIHcgPCAwIHdoZW4gYXBwbHlpbmcgdGhlCisgICAgLy8gdHJhbnNmb3JtLCBv
dGhlcndpc2UgdGhpcyBjb2RlIGlzIG5vdCB0ZXN0aW5nIHRoZSBpbnRlbmRlZCBzY2VuYXJpby4K
KyAgICBib29sIGNsaXBwZWQgPSBmYWxzZTsKKyAgICBDQ01hdGhVdGlsOjptYXBRdWFkKGxheWVy
VG9TdXJmYWNlVHJhbnNmb3JtLCBGbG9hdFF1YWQoRmxvYXRSZWN0KGxheWVyQ29udGVudFJlY3Qp
KSwgY2xpcHBlZCk7CisgICAgQVNTRVJUX1RSVUUoY2xpcHBlZCk7CisKKyAgICBpbnQgZXhwZWN0
ZWRYUG9zaXRpb24gPSAtMTA7CisgICAgaW50IGV4cGVjdGVkV2lkdGggPSAxMDsKKyAgICBJbnRS
ZWN0IGFjdHVhbCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3Qo
dGFyZ2V0U3VyZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNm
b3JtKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRYUG9zaXRpb24sIGFjdHVhbC54KCkpOworICAg
IEVYUEVDVF9FUShleHBlY3RlZFdpZHRoLCBhY3R1YWwud2lkdGgoKSk7Cit9CisKK1RFU1QoQ0NM
YXllclRyZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3JQZXJzcGVjdGl2ZVVu
cHJvamVjdGlvbikKK3sKKyAgICAvLyBUbyBkZXRlcm1pbmUgdmlzaWJsZVJlY3QgaW4gbGF5ZXIg
c3BhY2UsIHRoZXJlIG5lZWRzIHRvIGJlIGFuIHVuLXByb2plY3Rpb24gZnJvbQorICAgIC8vIHN1
cmZhY2Ugc3BhY2UgdG8gbGF5ZXIgc3BhY2UuIFdoZW4gdGhlIG9yaWdpbmFsIHRyYW5zZm9ybSB3
YXMgYSBwZXJzcGVjdGl2ZQorICAgIC8vIHByb2plY3Rpb24gdGhhdCB3YXMgY2xpcHBlZCwgaXQg
cmV0dXJucyBhIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY2xpcHBlZCBib3VuZHMuCisgICAgLy8g
VW4tcHJvamVjdGluZyB0aGlzIG5ldyByZWN0IG1heSByZXF1aXJlIGNsaXBwaW5nIGFnYWluLgor
CisgICAgLy8gVGhpcyBzZXF1ZW5jZSBvZiB0cmFuc2Zvcm1zIGNhdXNlcyBvbmUgY29ybmVyIG9m
IHRoZSBsYXllciB0byBwcm90cnVkZSBhY3Jvc3MgdGhlIHcgPSAwIHBsYW5lLCBhbmQgc2hvdWxk
IGJlIGNsaXBwZWQuCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50
UG9pbnQoLTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBsYXllckNv
bnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xMCksIEludFNpemUoMjAsIDIwKSk7
CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisgICAg
bGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZh
Y2VUcmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXllclRvU3VyZmFjZVRyYW5z
Zm9ybS50cmFuc2xhdGUzZCgwLCAwLCAtNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
cm90YXRlM2QoMCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZTNk
KDgwLCAwLCAwKTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHVuLXByb2plY3Rpb24gZG9l
cyBpbmRlZWQgY2F1c2UgdyA8IDAsIG90aGVyd2lzZSB0aGlzIGNvZGUgaXMgbm90CisgICAgLy8g
dGVzdGluZyB0aGUgaW50ZW5kZWQgc2NlbmFyaW8uCisgICAgYm9vbCBjbGlwcGVkID0gZmFsc2U7
CisgICAgRmxvYXRSZWN0IGNsaXBwZWRSZWN0ID0gQ0NNYXRoVXRpbDo6bWFwQ2xpcHBlZFJlY3Qo
bGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0sIGxheWVyQ29udGVudFJlY3QpOworICAgIENDTWF0aFV0
aWw6OnByb2plY3RRdWFkKGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLmludmVyc2UoKSwgRmxvYXRR
dWFkKGNsaXBwZWRSZWN0KSwgY2xpcHBlZCk7CisgICAgQVNTRVJUX1RSVUUoY2xpcHBlZCk7CisK
KyAgICAvLyBPbmx5IHRoZSBjb3JuZXIgb2YgdGhlIGxheWVyIGlzIG5vdCB2aXNpYmxlIG9uIHRo
ZSBzdXJmYWNlIGJlY2F1c2Ugb2YgYmVpbmcKKyAgICAvLyBjbGlwcGVkLiBCdXQsIHRoZSBuZXQg
cmVzdWx0IG9mIHJvdW5kaW5nIHZpc2libGUgcmVnaW9uIHRvIGFuIGF4aXMtYWxpZ25lZCByZWN0
IGlzCisgICAgLy8gdGhhdCB0aGUgZW50aXJlIGxheWVyIHNob3VsZCBzdGlsbCBiZSBjb25zaWRl
cmVkIHZpc2libGUuCisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoLTEw
LCAtMTApLCBJbnRTaXplKDIwLCAyMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRy
ZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5
ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRf
UkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKwogLy8gRklYTUU6CiAvLyBjb250aW51ZSB3
b3JraW5nIG9uIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02ODk0Mgog
Ly8gIC0gYWRkIGEgdGVzdCB0byB2ZXJpZnkgY2xpcHBpbmcgdGhhdCBjaGFuZ2VzIHRoZSAiY2Vu
dGVyIHBvaW50Igo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>135844</attachid>
            <date>2012-04-05 10:03:11 -0700</date>
            <delta_ts>2012-04-05 11:24:34 -0700</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-80806-20120405100310.patch</filename>
            <type>text/plain</type>
            <size>43394</size>
            <attacher name="Shawn Singh">shawnsingh</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzMzI5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTRjODk1ZTA2ZjBhMGEy
MmUxN2M1MGU5YjQwYjQ5NWJmYWI5MzBjMi4uYzFkM2VmYTNjMmQxODM3ZmU5YWM2MmU5NjFlMDA3
MzgyMjQyZDM5OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYxIEBACisyMDEyLTA0LTA0ICBTaGF3
biBTaW5naCAgPHNoYXduc2luZ2hAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
TmVlZCB0byBjbGlwIHRvIGhvbW9nZW5lb3VzIHc9MCBwbGFuZSB3aGVuIGFwcGx5aW5nIHRyYW5z
Zm9ybXMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
MDgwNgorCisgICAgICAgIFJldmlld2VkIGJ5IEFkcmllbm5lIFdhbGtlci4KKworICAgICAgICBV
bml0IHRlc3RzIGFkZGVkIHRvIENDTGF5ZXJUcmVlSG9zdENvbW1vbi4gVGhpcyBjaGFuZ2UgaXMg
YWxzbworICAgICAgICBjb3ZlcmVkIGJ5IG90aGVyIGV4aXN0aW5nIHVuaXQgdGVzdHMgYW5kIGxh
eW91dCB0ZXN0cy4KKworICAgICAgICBXZWJDb3JlIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hcFJl
Y3QgLyBtYXBRdWFkIC8gcHJvamVjdFF1YWQgZG8KKyAgICAgICAgbm90IHByb3Blcmx5IGhhbmRs
ZSB0aGUgY2FzZSB3aGVyZSBhIHN1cmZhY2UgaXMgb3JpZW50ZWQgcGFydGlhbGx5CisgICAgICAg
IGJlaGluZCB0aGUgY2FtZXJhLCB3aXRoIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbi4gSW4gdGhp
cyBjYXNlLAorICAgICAgICBwcm9qZWN0ZWQgcG9pbnRzIG1heSBhcHBlYXIgdG8gYmUgdmFsaWQg
aW4gY2FydGVzaWFuIGNvb3JkaW5hdGVzLAorICAgICAgICBidXQgdGhleSBhcmUgaW5kZWVkIG5v
dCB2YWxpZCwgYW5kIHRoaXMgcHJvYmxlbSBjYW4gb25seSBiZQorICAgICAgICBkZXRlY3RlZCBp
biBob21vZ2VuZW91cyBjb29yZGluYXRlcyBhZnRlciBhcHBseWluZyB0aGUgdHJhbnNmb3JtLAor
ICAgICAgICBiZWZvcmUgdGhlIGRpdmlkZS1ieS13IHN0ZXAuCisKKyAgICAgICAgVGhlIGNvcnJl
Y3Qgc29sdXRpb24gaXMgdG8gY2xpcCBnZW9tZXRyeSB3aGVyZSB3IDwgMC4gVGhpcyBwYXRjaAor
ICAgICAgICBtYWtlcyB0aGlzIGNoYW5nZSBsb2NhbCB0byBjaHJvbWl1bSBvbmx5LCB0byBmaXgg
cmVuZGVyaW5nIGJ1Z3MKKyAgICAgICAgdGhhdCBhcmlzZSBmcm9tIHRoaXMgcHJvYmxlbS4gVGhl
IHByaW1hcnkgZml4IGlzIHRvIGNvcnJlY3QKKyAgICAgICAgY2FsY3VsYXRlVmlzaWJsZUxheWVy
UmVjdCgpLCBidXQgb3RoZXIgYW5jaWxsYXJ5IGxvY2F0aW9ucyBhcmUKKyAgICAgICAgYWxzbyBm
aXhlZCwgaW4gcGFydGljdWxhciwgdGhlIGFudGlhbGlhc2luZyBjb2RlIHBhdGggaXMgc2ltcGx5
CisgICAgICAgIHNraXBwZWQgd2hlbiB0aGlzIGNhc2UgYXJpc2VzLgorCisgICAgICAgIEV2ZW50
dWFsbHkgdGhpcyBtYXRoIG5lZWRzIHRvIGJlIG1lcmdlZCBpbnRvIFRyYW5zZm9ybWF0aW9uTWF0
cml4LAorICAgICAgICB0byBmaXggaGl0LXRlc3RpbmcgYnVncyB0aGF0IG9jY3VyIGluIGJvdGgg
Q2hyb21pdW0gYW5kIFNhZmFyaS4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6ZmluZFRpbGVQcm9ncmFtVW5pZm9ybXMpOgorICAgICAgICAoV2Vi
Q29yZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3VGlsZVF1YWQpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVS
ZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OmlzU2NhbGVPclRyYW5zbGF0aW9uKToKKyAgICAgICAg
KFdlYkNvcmU6OmNhbGN1bGF0ZURyYXdUcmFuc2Zvcm1zQW5kVmlzaWJpbGl0eUludGVybmFsKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkhvbW9nZW5lb3Vz
Q29vcmRpbmF0ZTo6SG9tb2dlbmVvdXNDb29yZGluYXRlKToKKyAgICAgICAgKEhvbW9nZW5lb3Vz
Q29vcmRpbmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpIb21vZ2VuZW91c0Nvb3JkaW5hdGU6OnNo
b3VsZEJlQ2xpcHBlZCk6CisgICAgICAgIChXZWJDb3JlOjpIb21vZ2VuZW91c0Nvb3JkaW5hdGU6
OmNhcnRlc2lhblBvaW50MmQpOgorICAgICAgICAoV2ViQ29yZTo6cHJvamVjdFBvaW50KToKKyAg
ICAgICAgKFdlYkNvcmU6Om1hcFBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1dGVDbGlw
cGVkUG9pbnRGb3JFZGdlKToKKyAgICAgICAgKFdlYkNvcmU6OmV4cGFuZEJvdW5kc1RvSW5jbHVk
ZVBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1dGVFbmNsb3NpbmdSZWN0T2ZDbGlwcGVk
UXVhZCk6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlRW5jbG9zaW5nUmVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpDQ01hdGhVdGlsOjpwcm9qZWN0Q2xpcHBlZFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6Q0NN
YXRoVXRpbDo6bWFwUXVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDQ01hdGhVdGlsOjpwcm9qZWN0
UXVhZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRp
bC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoQ0NNYXRoVXRpbCk6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2Vy
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QpOgor
CiAyMDEyLTAzLTE0ICBBbnRvbmlvIEdvbWVzICA8YWdvbWVzQHJpbS5jb20+CiAKICAgICAgICAg
RXh0ZW5kIEhpdFRlc3RSZXN1bHQgdG8gc3VwcG9ydCBub3QgImRpc2NhcmRpbmciIHNoYWRvdyBj
b250ZW50IGluIGZhdm9yIG9mIGl0cyBET00gYW5jZXN0b3IKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VM
b2cKaW5kZXggNWMyNmQ4YjhjMzlmODlmZGIzMmE5NzgzNmEzNDNhNmFlNmY1OGJlYi4uNTI2NDNl
OTBhMzUwMGQwOTJjYWZkZTliYjI5Mjg4MmI4MDU0ZGZjYSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAxMi0wNC0wNCAgU2hhd24gU2luZ2ggIDxzaGF3bnNp
bmdoQGNocm9taXVtLm9yZz4KKworICAgICAgICBbY2hyb21pdW1dIE5lZWQgdG8gY2xpcCB0byBo
b21vZ2VuZW91cyB3PTAgcGxhbmUgd2hlbiBhcHBseWluZyB0cmFuc2Zvcm1zLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODA4MDYKKworICAgICAgICBS
ZXZpZXdlZCBieSBBZHJpZW5uZSBXYWxrZXIuCisKKyAgICAgICAgKiB0ZXN0cy9DQ0xheWVyVHJl
ZUhvc3RDb21tb25UZXN0LmNwcDoKKyAgICAgICAgKFdlYktpdFRlc3RzOjpURVNUKToKKyAgICAg
ICAgKFdlYktpdFRlc3RzKToKKwogMjAxMi0wNC0wNSAgUGF2ZWwgRmVsZG1hbiAgPHBmZWxkbWFu
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBbY2hyb21pdW1dIGNsZWFu
IHVwIFdEVEZDOjpzYXZlQXMgYWZ0ZXIgbWlncmF0aW9uIHRvIHNhdmUoKQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBp
CmluZGV4IGQ4NWZmYjc2MzI1Y2M2ZGY0YWQ3N2M1MjQ5NGE4NmFkNzZmMzY5Y2YuLjk2MGYyNTA3
YzE3OTk0NTNjNzM0ODUxOTllZTk2MDQwZjMxNmU1MDggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKQEAgLTM2
MDcsNiArMzYwNyw4IEBACiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuY3BwJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RJbXBsLmgnLAorICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuY3BwJywK
KyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmgn
LAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9u
VHJhY2tlci5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDT2NjbHVzaW9uVHJhY2tlci5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ092ZXJkcmF3TWV0cmljcy5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVy
ZXJDaHJvbWl1bS5jcHAKaW5kZXggM2QxN2I4ZWVkYjFiYmQxYjUzNjM2ODZhM2Y5YTFlZjRkNmY0
Zjk5My4uMTE1Mjk0MTEyNzgyZDFhOTZhOWEwODA0NjQ0ZWI0NGU3YWZhNWE0YSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJl
ckNocm9taXVtLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9MYXllclJlbmRlcmVyQ2hyb21pdW0uY3BwCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVk
ZSAiY2MvQ0NEZWJ1Z0JvcmRlckRyYXdRdWFkLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllckltcGwu
aCIKICNpbmNsdWRlICJjYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uaCIKKyNpbmNsdWRlICJjYy9D
Q01hdGhVdGlsLmgiCiAjaW5jbHVkZSAiY2MvQ0NQcm94eS5oIgogI2luY2x1ZGUgImNjL0NDUmVu
ZGVyUGFzcy5oIgogI2luY2x1ZGUgImNjL0NDUmVuZGVyU3VyZmFjZURyYXdRdWFkLmgiCkBAIC01
NjQsOSArNTY1LDExIEBAIHN0YXRpYyB2b2lkIHRpbGVVbmlmb3JtTG9jYXRpb24oVCBwcm9ncmFt
LCBUaWxlUHJvZ3JhbVVuaWZvcm1zJiB1bmlmb3JtcykKICAgICB1bmlmb3Jtcy5lZGdlTG9jYXRp
b24gPSBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLmVkZ2VMb2NhdGlvbigpOwogfQogCi1zdGF0
aWMgdm9pZCBmaW5kVGlsZVByb2dyYW1Vbmlmb3JtcyhMYXllclJlbmRlcmVyQ2hyb21pdW0qIGxh
eWVyUmVuZGVyZXIsIGNvbnN0IENDVGlsZURyYXdRdWFkKiBxdWFkLCBUaWxlUHJvZ3JhbVVuaWZv
cm1zJiB1bmlmb3JtcykKK3N0YXRpYyB2b2lkIGZpbmRUaWxlUHJvZ3JhbVVuaWZvcm1zKExheWVy
UmVuZGVyZXJDaHJvbWl1bSogbGF5ZXJSZW5kZXJlciwgY29uc3QgQ0NUaWxlRHJhd1F1YWQqIHF1
YWQsIFRpbGVQcm9ncmFtVW5pZm9ybXMmIHVuaWZvcm1zLCBib29sIHF1YWRJc0NsaXBwZWQpCiB7
Ci0gICAgaWYgKHF1YWQtPmlzQW50aWFsaWFzZWQoKSkgeworICAgIC8vIEZvciBub3csIHdlIHNp
bXBseSBza2lwIGFudGktYWxpYXNpbmcgd2l0aCB0aGUgcXVhZCBpcyBjbGlwcGVkLiBUaGlzIG9u
bHkgaGFwcGVucworICAgIC8vIG9uIHBlcnNwZWN0aXZlIHRyYW5zZm9ybWVkIGxheWVycyB0aGF0
IGdvIHBhcnRpYWxseSBiZWhpbmQgdGhlIGNhbWVyYS4KKyAgICBpZiAocXVhZC0+aXNBbnRpYWxp
YXNlZCgpICYmICFxdWFkSXNDbGlwcGVkKSB7CiAgICAgICAgIGlmIChxdWFkLT5zd2l6emxlQ29u
dGVudHMoKSkgewogICAgICAgICAgICAgY29uc3QgQ0NUaWxlZExheWVySW1wbDo6UHJvZ3JhbVN3
aXp6bGVBQSogcHJvZ3JhbSA9IGxheWVyUmVuZGVyZXItPnRpbGVyUHJvZ3JhbVN3aXp6bGVBQSgp
OwogICAgICAgICAgICAgdGlsZVVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCB1bmlmb3Jtcyk7CkBA
IC02MjksOCArNjMyLDE3IEBAIHZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3VGlsZVF1
YWQoY29uc3QgQ0NUaWxlRHJhd1F1YWQqIHF1YWQpCiAgICAgZmxvYXQgZnJhZ21lbnRUZXhTY2Fs
ZVggPSBjbGFtcFJlY3Qud2lkdGgoKSAvIHRleHR1cmVTaXplLndpZHRoKCk7CiAgICAgZmxvYXQg
ZnJhZ21lbnRUZXhTY2FsZVkgPSBjbGFtcFJlY3QuaGVpZ2h0KCkgLyB0ZXh0dXJlU2l6ZS5oZWln
aHQoKTsKIAorCisgICAgRmxvYXRRdWFkIGxvY2FsUXVhZDsKKyAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCBkZXZpY2VUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1hdGlvbk1hdHJpeCh3aW5kb3dNYXRyaXgo
KSAqIHByb2plY3Rpb25NYXRyaXgoKSAqIHF1YWQtPnF1YWRUcmFuc2Zvcm0oKSkudG8yZFRyYW5z
Zm9ybSgpOworICAgIGlmICghZGV2aWNlVHJhbnNmb3JtLmlzSW52ZXJ0aWJsZSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBib29sIGNsaXBwZWQgPSBmYWxzZTsKKyAgICBGbG9hdFF1YWQgZGV2
aWNlTGF5ZXJRdWFkID0gQ0NNYXRoVXRpbDo6bWFwUXVhZChkZXZpY2VUcmFuc2Zvcm0sIEZsb2F0
UXVhZChxdWFkLT5sYXllclJlY3QoKSksIGNsaXBwZWQpOworCiAgICAgVGlsZVByb2dyYW1Vbmlm
b3JtcyB1bmlmb3JtczsKLSAgICBmaW5kVGlsZVByb2dyYW1Vbmlmb3Jtcyh0aGlzLCBxdWFkLCB1
bmlmb3Jtcyk7CisgICAgZmluZFRpbGVQcm9ncmFtVW5pZm9ybXModGhpcywgcXVhZCwgdW5pZm9y
bXMsIGNsaXBwZWQpOwogCiAgICAgR0xDKGNvbnRleHQoKSwgY29udGV4dCgpLT51c2VQcm9ncmFt
KHVuaWZvcm1zLnByb2dyYW0pKTsKICAgICBHTEMoY29udGV4dCgpLCBjb250ZXh0KCktPnVuaWZv
cm0xaSh1bmlmb3Jtcy5zYW1wbGVyTG9jYXRpb24sIDApKTsKQEAgLTYzOSwxMyArNjUxLDggQEAg
dm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OmRyYXdUaWxlUXVhZChjb25zdCBDQ1RpbGVEcmF3
UXVhZCogcXVhZCkKICAgICBHTEMoY29udGV4dCgpLCBjb250ZXh0KCktPnRleFBhcmFtZXRlcmko
R3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJF
X01JTl9GSUxURVIsIHF1YWQtPnRleHR1cmVGaWx0ZXIoKSkpOwogICAgIEdMQyhjb250ZXh0KCks
IGNvbnRleHQoKS0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwg
R3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfTUFHX0ZJTFRFUiwgcXVhZC0+dGV4dHVyZUZpbHRl
cigpKSk7CiAKLSAgICBGbG9hdFF1YWQgbG9jYWxRdWFkOwotICAgIGlmIChxdWFkLT5pc0FudGlh
bGlhc2VkKCkpIHsKLSAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggZGV2aWNlVHJhbnNmb3Jt
ID0gVHJhbnNmb3JtYXRpb25NYXRyaXgod2luZG93TWF0cml4KCkgKiBwcm9qZWN0aW9uTWF0cml4
KCkgKiBxdWFkLT5xdWFkVHJhbnNmb3JtKCkpLnRvMmRUcmFuc2Zvcm0oKTsKLSAgICAgICAgaWYg
KCFkZXZpY2VUcmFuc2Zvcm0uaXNJbnZlcnRpYmxlKCkpCi0gICAgICAgICAgICByZXR1cm47CiAK
LSAgICAgICAgRmxvYXRRdWFkIGRldmljZUxheWVyUXVhZCA9IGRldmljZVRyYW5zZm9ybS5tYXBR
dWFkKEZsb2F0UXVhZChxdWFkLT5sYXllclJlY3QoKSkpOworICAgIGlmICghY2xpcHBlZCAmJiBx
dWFkLT5pc0FudGlhbGlhc2VkKCkpIHsKIAogICAgICAgICBDQ0xheWVyUXVhZCBkZXZpY2VMYXll
ckJvdW5kcyA9IENDTGF5ZXJRdWFkKEZsb2F0UXVhZChkZXZpY2VMYXllclF1YWQuYm91bmRpbmdC
b3goKSkpOwogICAgICAgICBkZXZpY2VMYXllckJvdW5kcy5pbmZsYXRlQW50aUFsaWFzaW5nRGlz
dGFuY2UoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwCmluZGV4
IDQxOGRjYTE5MGIzZWJlNjQ0YTI0YWMzZWUyODJiYjVmNWM5Mjk2MmQuLjk1MTdlN2QyNzUwYmYw
ZTRiYWU5Nzc3NDEzMDg1NzU4Mzc1NDVjN2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0Q29tbW9uLmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImNjL0NDTGF5ZXJJ
bXBsLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllckl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiY2MvQ0NM
YXllclNvcnRlci5oIgorI2luY2x1ZGUgImNjL0NDTWF0aFV0aWwuaCIKICNpbmNsdWRlICJjYy9D
Q1JlbmRlclN1cmZhY2UuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNDQsNyArNDUsNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBJbnRSZWN0IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2Fs
Y3VsYXRlVmlzaWJsZVJlY3QoY29uc3QgSW50UmVjdCYgdGFyZ2V0U3VyZmFjZVJlY3QsIGNvbnN0
IEludFJlY3QmIGxheWVyQm91bmRSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJh
bnNmb3JtKQogewogICAgIC8vIElzIHRoaXMgbGF5ZXIgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0
aGUgdGFyZ2V0IHN1cmZhY2U/Ci0gICAgSW50UmVjdCBsYXllckluU3VyZmFjZVNwYWNlID0gdHJh
bnNmb3JtLm1hcFJlY3QobGF5ZXJCb3VuZFJlY3QpOworICAgIEludFJlY3QgbGF5ZXJJblN1cmZh
Y2VTcGFjZSA9IENDTWF0aFV0aWw6Om1hcENsaXBwZWRSZWN0KHRyYW5zZm9ybSwgbGF5ZXJCb3Vu
ZFJlY3QpOwogICAgIGlmICh0YXJnZXRTdXJmYWNlUmVjdC5jb250YWlucyhsYXllckluU3VyZmFj
ZVNwYWNlKSkKICAgICAgICAgcmV0dXJuIGxheWVyQm91bmRSZWN0OwogCkBAIC01OSw3ICs2MCw3
IEBAIEludFJlY3QgQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdChj
b25zdCBJbnRSZWN0JiB0YXJnZXRTdXJmYWNlCiAgICAgLy8gYXhpcy1hbGlnbmVkKSwgYnV0IGlz
IGEgcmVhc29uYWJsZSBmaWx0ZXIgb24gdGhlIHNwYWNlIHRvIGNvbnNpZGVyLgogICAgIC8vIE5v
bi1pbnZlcnRpYmxlIHRyYW5zZm9ybXMgd2lsbCBjcmVhdGUgYW4gZW1wdHkgcmVjdCBoZXJlLgog
ICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4IHN1cmZhY2VUb0xheWVyID0gdHJhbnNmb3Jt
LmludmVyc2UoKTsKLSAgICBJbnRSZWN0IGxheWVyUmVjdCA9IHN1cmZhY2VUb0xheWVyLnByb2pl
Y3RRdWFkKEZsb2F0UXVhZChGbG9hdFJlY3QobWluaW1hbFN1cmZhY2VSZWN0KSkpLmVuY2xvc2lu
Z0JvdW5kaW5nQm94KCk7CisgICAgSW50UmVjdCBsYXllclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0
KENDTWF0aFV0aWw6OnByb2plY3RDbGlwcGVkUmVjdChzdXJmYWNlVG9MYXllciwgRmxvYXRSZWN0
KG1pbmltYWxTdXJmYWNlUmVjdCkpKTsKICAgICBsYXllclJlY3QuaW50ZXJzZWN0KGxheWVyQm91
bmRSZWN0KTsKICAgICByZXR1cm4gbGF5ZXJSZWN0OwogfQpAQCAtNzAsNyArNzEsNiBAQCBzdGF0
aWMgYm9vbCBpc1NjYWxlT3JUcmFuc2xhdGlvbihjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
bSkKICAgICAgICAgICAgJiYgIW0ubTIxKCkgJiYgIW0ubTIzKCkgJiYgIW0ubTI0KCkKICAgICAg
ICAgICAgJiYgIW0ubTMxKCkgJiYgIW0ubTMyKCkgJiYgIW0ubTQzKCkKICAgICAgICAgICAgJiYg
bS5tNDQoKTsKLQogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBMYXllclR5cGU+CkBAIC00MDksNyAr
NDA5LDcgQEAgc3RhdGljIGJvb2wgY2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaXNpYmlsaXR5
SW50ZXJuYWwoTGF5ZXJUeXBlKiBsYXllciwgTGF5ZXIKICAgICAgICAgbGF5ZXItPnNldERyYXdU
cmFuc2Zvcm0oY29tYmluZWRUcmFuc2Zvcm0pOwogICAgICAgICBsYXllci0+c2V0RHJhd1RyYW5z
Zm9ybUlzQW5pbWF0aW5nKGFuaW1hdGluZ1RyYW5zZm9ybVRvVGFyZ2V0KTsKICAgICAgICAgbGF5
ZXItPnNldFNjcmVlblNwYWNlVHJhbnNmb3JtSXNBbmltYXRpbmcoYW5pbWF0aW5nVHJhbnNmb3Jt
VG9TY3JlZW4pOwotICAgICAgICB0cmFuc2Zvcm1lZExheWVyUmVjdCA9IGVuY2xvc2luZ0ludFJl
Y3QobGF5ZXItPmRyYXdUcmFuc2Zvcm0oKS5tYXBSZWN0KGxheWVyUmVjdCkpOworICAgICAgICB0
cmFuc2Zvcm1lZExheWVyUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoQ0NNYXRoVXRpbDo6bWFwQ2xp
cHBlZFJlY3QobGF5ZXItPmRyYXdUcmFuc2Zvcm0oKSwgbGF5ZXJSZWN0KSk7CiAKICAgICAgICAg
bGF5ZXItPnNldERyYXdPcGFjaXR5KGRyYXdPcGFjaXR5KTsKICAgICAgICAgbGF5ZXItPnNldERy
YXdPcGFjaXR5SXNBbmltYXRpbmcoZHJhd09wYWNpdHlJc0FuaW1hdGluZyk7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGls
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0
aFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYyNmU3YzMyODI4YmY1NDY4NzQ5ZmYwNGRmYjBlNzY1OGNh
MGNiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNwcApAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5oIgor
CisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0UXVhZC5oIgorI2luY2x1
ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgeworICAgIEhv
bW9nZW5lb3VzQ29vcmRpbmF0ZShkb3VibGUgbmV3WCwgZG91YmxlIG5ld1ksIGRvdWJsZSBuZXda
LCBkb3VibGUgbmV3VykKKyAgICAgICAgOiB4KG5ld1gpCisgICAgICAgICwgeShuZXdZKQorICAg
ICAgICAsIHoobmV3WikKKyAgICAgICAgLCB3KG5ld1cpCisgICAgeworICAgIH0KKworICAgIGJv
b2wgc2hvdWxkQmVDbGlwcGVkKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB3IDw9IDA7
CisgICAgfQorCisgICAgRmxvYXRQb2ludCBjYXJ0ZXNpYW5Qb2ludDJkKCkgY29uc3QKKyAgICB7
CisgICAgICAgIGlmICh3ID09IDEpCisgICAgICAgICAgICByZXR1cm4gRmxvYXRQb2ludCh4LCB5
KTsKKworICAgICAgICAvLyBGb3Igbm93LCBiZWNhdXNlIHRoaXMgY29kZSBpcyB1c2VkIHByaXZh
dGVseSBvbmx5IGJ5IENDTWF0aFV0aWwsIGl0IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2hlbiB3
ID09IDAsIGFuZCB3ZSBkbyBub3QgeWV0IG5lZWQgdG8gaGFuZGxlIHRoYXQgY2FzZS4KKyAgICAg
ICAgQVNTRVJUKHcpOworICAgICAgICBkb3VibGUgaW52VyA9IDEuMCAvIHc7CisgICAgICAgIHJl
dHVybiBGbG9hdFBvaW50KHggKiBpbnZXLCB5ICogaW52Vyk7CisgICAgfQorCisgICAgZG91Ymxl
IHg7CisgICAgZG91YmxlIHk7CisgICAgZG91YmxlIHo7CisgICAgZG91YmxlIHc7Cit9OworCitz
dGF0aWMgSG9tb2dlbmVvdXNDb29yZGluYXRlIHByb2plY3RQb2ludChjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFBvaW50JiBwKQoreworICAgIGRvdWJs
ZSB4ID0gcC54KCk7CisgICAgZG91YmxlIHkgPSBwLnkoKTsKKyAgICBkb3VibGUgeiA9IC0odHJh
bnNmb3JtLm0xMygpICogeCArIHRyYW5zZm9ybS5tMjMoKSAqIHkgKyB0cmFuc2Zvcm0ubTQzKCkp
IC8gdHJhbnNmb3JtLm0zMygpOworICAgIC8vIGltcGxpY2l0IGRlZmluaXRpb24gb2YgdyA9IDE7
CisKKyAgICBkb3VibGUgb3V0WCA9IHggKiB0cmFuc2Zvcm0ubTExKCkgKyB5ICogdHJhbnNmb3Jt
Lm0yMSgpICsgeiAqIHRyYW5zZm9ybS5tMzEoKSArIHRyYW5zZm9ybS5tNDEoKTsKKyAgICBkb3Vi
bGUgb3V0WSA9IHggKiB0cmFuc2Zvcm0ubTEyKCkgKyB5ICogdHJhbnNmb3JtLm0yMigpICsgeiAq
IHRyYW5zZm9ybS5tMzIoKSArIHRyYW5zZm9ybS5tNDIoKTsKKyAgICBkb3VibGUgb3V0WiA9IHgg
KiB0cmFuc2Zvcm0ubTEzKCkgKyB5ICogdHJhbnNmb3JtLm0yMygpICsgeiAqIHRyYW5zZm9ybS5t
MzMoKSArIHRyYW5zZm9ybS5tNDMoKTsKKyAgICBkb3VibGUgb3V0VyA9IHggKiB0cmFuc2Zvcm0u
bTE0KCkgKyB5ICogdHJhbnNmb3JtLm0yNCgpICsgeiAqIHRyYW5zZm9ybS5tMzQoKSArIHRyYW5z
Zm9ybS5tNDQoKTsKKworICAgIHJldHVybiBIb21vZ2VuZW91c0Nvb3JkaW5hdGUob3V0WCwgb3V0
WSwgb3V0Wiwgb3V0Vyk7Cit9CisKK3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgbWFwUG9p
bnQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRQb2lu
dCYgcCkKK3sKKyAgICBkb3VibGUgeCA9IHAueCgpOworICAgIGRvdWJsZSB5ID0gcC55KCk7Cisg
ICAgLy8gaW1wbGljaXQgZGVmaW5pdGlvbiBvZiB6ID0gMDsKKyAgICAvLyBpbXBsaWNpdCBkZWZp
bml0aW9uIG9mIHcgPSAxOworCisgICAgZG91YmxlIG91dFggPSB4ICogdHJhbnNmb3JtLm0xMSgp
ICsgeSAqIHRyYW5zZm9ybS5tMjEoKSArIHRyYW5zZm9ybS5tNDEoKTsKKyAgICBkb3VibGUgb3V0
WSA9IHggKiB0cmFuc2Zvcm0ubTEyKCkgKyB5ICogdHJhbnNmb3JtLm0yMigpICsgdHJhbnNmb3Jt
Lm00MigpOworICAgIGRvdWJsZSBvdXRaID0geCAqIHRyYW5zZm9ybS5tMTMoKSArIHkgKiB0cmFu
c2Zvcm0ubTIzKCkgKyB0cmFuc2Zvcm0ubTQzKCk7CisgICAgZG91YmxlIG91dFcgPSB4ICogdHJh
bnNmb3JtLm0xNCgpICsgeSAqIHRyYW5zZm9ybS5tMjQoKSArIHRyYW5zZm9ybS5tNDQoKTsKKwor
ICAgIHJldHVybiBIb21vZ2VuZW91c0Nvb3JkaW5hdGUob3V0WCwgb3V0WSwgb3V0Wiwgb3V0Vyk7
Cit9CisKK3N0YXRpYyBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgY29tcHV0ZUNsaXBwZWRQb2ludEZv
ckVkZ2UoY29uc3QgSG9tb2dlbmVvdXNDb29yZGluYXRlJiBoMSwgY29uc3QgSG9tb2dlbmVvdXND
b29yZGluYXRlJiBoMikKK3sKKyAgICAvLyBQb2ludHMgaDEgYW5kIGgyIGZvcm0gYSBsaW5lIGlu
IDRkLCBhbmQgYW55IHBvaW50IG9uIHRoYXQgbGluZSBjYW4gYmUgcmVwcmVzZW50ZWQKKyAgICAv
LyBhcyBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaDEgYW5kIGgyOgorICAgIC8vICAgIHAgPSAo
MS10KSBoMSArICh0KSBoMgorICAgIC8vCisgICAgLy8gV2Ugd2FudCB0byBjb21wdXRlIHBvaW50
IHAgc3VjaCB0aGF0IHAudyA9PSBlcHNpbG9uLCB3aGVyZSBlcHNpbG9uIGlzIGEgc21hbGwKKyAg
ICAvLyBub24temVybyBudW1iZXIuIChidXQgdGhlIHNtYWxsZXIgdGhlIG51bWJlciBpcywgdGhl
IGhpZ2hlciB0aGUgcmlzayBvZiBvdmVyZmxvdykKKyAgICAvLyBUbyBkbyB0aGlzLCB3ZSBzb2x2
ZSBmb3IgdCBpbiB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOgorICAgIC8vICAgIHAudyA9IGVwc2ls
b24gPSAoMS10KSAqIGgxLncgKyAodCkgKiBoMi53CisgICAgLy8KKyAgICAvLyBPbmNlIHBhcmFt
dGVyIHQgaXMga25vd24sIHRoZSByZXN0IG9mIHAgY2FuIGJlIGNvbXB1dGVkIHZpYSBwID0gKDEt
dCkgaDEgKyAodCkgaDIuCisKKyAgICAvLyBUZWNobmljYWxseSB0aGlzIGlzIGEgc3BlY2lhbCBj
YXNlIG9mIHRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uLCBidXQgaXRzIGEgZ29vZCBpZGVhIHRvIGtl
ZXAgaXQgYW4gZXhwbGljaXQgc2FuaXR5IGNoZWNrIGhlcmUuCisgICAgQVNTRVJUKGgyLncgIT0g
aDEudyk7CisgICAgLy8gRXhhY3RseSBvbmUgb2YgaDEgb3IgaDIgKGJ1dCBub3QgYm90aCkgbXVz
dCBiZSBvbiB0aGUgbmVnYXRpdmUgc2lkZSBvZiB0aGUgdyBwbGFuZSB3aGVuIHRoaXMgaXMgY2Fs
bGVkLgorICAgIEFTU0VSVChoMS5zaG91bGRCZUNsaXBwZWQoKSBeIGgyLnNob3VsZEJlQ2xpcHBl
ZCgpKTsKKworICAgIGRvdWJsZSB3ID0gMC4wMDAwMTsgLy8gb3IgYW55IHBvc2l0aXZlIG5vbi16
ZXJvIHNtYWxsIGVwc2lsb24KKworICAgIGRvdWJsZSB0ID0gKHcgLSBoMS53KSAvIChoMi53IC0g
aDEudyk7CisKKyAgICBkb3VibGUgeCA9ICgxLXQpICogaDEueCArIHQgKiBoMi54OworICAgIGRv
dWJsZSB5ID0gKDEtdCkgKiBoMS55ICsgdCAqIGgyLnk7CisgICAgZG91YmxlIHogPSAoMS10KSAq
IGgxLnogKyB0ICogaDIuejsKKworICAgIHJldHVybiBIb21vZ2VuZW91c0Nvb3JkaW5hdGUoeCwg
eSwgeiwgdyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHBhbmRCb3VuZHNUb0luY2x1ZGVQ
b2ludChmbG9hdCYgeG1pbiwgZmxvYXQmIHhtYXgsIGZsb2F0JiB5bWluLCBmbG9hdCYgeW1heCwg
Y29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICB4bWluID0gc3RkOjptaW4ocC54KCksIHhtaW4p
OworICAgIHhtYXggPSBzdGQ6Om1heChwLngoKSwgeG1heCk7CisgICAgeW1pbiA9IHN0ZDo6bWlu
KHAueSgpLCB5bWluKTsKKyAgICB5bWF4ID0gc3RkOjptYXgocC55KCksIHltYXgpOworfQorCitz
dGF0aWMgRmxvYXRSZWN0IGNvbXB1dGVFbmNsb3NpbmdSZWN0T2ZDbGlwcGVkUXVhZChjb25zdCBI
b21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgy
LCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgzLCBjb25zdCBIb21vZ2VuZW91c0Nvb3Jk
aW5hdGUmIGg0KQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2xpcHBpbmcgYXMg
bmVjZXNzYXJ5IGFuZCBjb21wdXRlcyB0aGUgZW5jbG9zaW5nIDJkCisgICAgLy8gRmxvYXRSZWN0
IG9mIHRoZSB2ZXJ0aWNlcy4gRG9pbmcgdGhlc2UgdHdvIHN0ZXBzIHNpbXVsdGFuZW91c2x5IGFs
bG93cyB1cyB0byBhdm9pZAorICAgIC8vIHRoZSBvdmVyaGVhZCBvZiBzdG9yaW5nIGFuIHVua25v
d24gbnVtYmVyIG9mIGNsaXBwZWQgdmVydGljZXMuCisKKyAgICBmbG9hdCB4bWluID0gc3RkOjpu
dW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpOworICAgIGZsb2F0IHhtYXggPSBzdGQ6Om51bWVy
aWNfbGltaXRzPGZsb2F0Pjo6bWluKCk7CisgICAgZmxvYXQgeW1pbiA9IHN0ZDo6bnVtZXJpY19s
aW1pdHM8ZmxvYXQ+OjptYXgoKTsKKyAgICBmbG9hdCB5bWF4ID0gc3RkOjpudW1lcmljX2xpbWl0
czxmbG9hdD46Om1pbigpOworCisgICAgaWYgKCFoMS5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAg
ICAgZXhwYW5kQm91bmRzVG9JbmNsdWRlUG9pbnQoeG1pbiwgeG1heCwgeW1pbiwgeW1heCwgaDEu
Y2FydGVzaWFuUG9pbnQyZCgpKTsKKworICAgIGlmIChoMS5zaG91bGRCZUNsaXBwZWQoKSBeIGgy
LnNob3VsZEJlQ2xpcHBlZCgpKQorICAgICAgICBleHBhbmRCb3VuZHNUb0luY2x1ZGVQb2ludCh4
bWluLCB4bWF4LCB5bWluLCB5bWF4LCBjb21wdXRlQ2xpcHBlZFBvaW50Rm9yRWRnZShoMSwgaDIp
LmNhcnRlc2lhblBvaW50MmQoKSk7CisKKyAgICBpZiAoIWgyLnNob3VsZEJlQ2xpcHBlZCgpKQor
ICAgICAgICBleHBhbmRCb3VuZHNUb0luY2x1ZGVQb2ludCh4bWluLCB4bWF4LCB5bWluLCB5bWF4
LCBoMi5jYXJ0ZXNpYW5Qb2ludDJkKCkpOworCisgICAgaWYgKGgyLnNob3VsZEJlQ2xpcHBlZCgp
IF4gaDMuc2hvdWxkQmVDbGlwcGVkKCkpCisgICAgICAgIGV4cGFuZEJvdW5kc1RvSW5jbHVkZVBv
aW50KHhtaW4sIHhtYXgsIHltaW4sIHltYXgsIGNvbXB1dGVDbGlwcGVkUG9pbnRGb3JFZGdlKGgy
LCBoMykuY2FydGVzaWFuUG9pbnQyZCgpKTsKKworICAgIGlmICghaDMuc2hvdWxkQmVDbGlwcGVk
KCkpCisgICAgICAgIGV4cGFuZEJvdW5kc1RvSW5jbHVkZVBvaW50KHhtaW4sIHhtYXgsIHltaW4s
IHltYXgsIGgzLmNhcnRlc2lhblBvaW50MmQoKSk7CisKKyAgICBpZiAoaDMuc2hvdWxkQmVDbGlw
cGVkKCkgXiBoNC5zaG91bGRCZUNsaXBwZWQoKSkKKyAgICAgICAgZXhwYW5kQm91bmRzVG9JbmNs
dWRlUG9pbnQoeG1pbiwgeG1heCwgeW1pbiwgeW1heCwgY29tcHV0ZUNsaXBwZWRQb2ludEZvckVk
Z2UoaDMsIGg0KS5jYXJ0ZXNpYW5Qb2ludDJkKCkpOworCisgICAgaWYgKCFoNC5zaG91bGRCZUNs
aXBwZWQoKSkKKyAgICAgICAgZXhwYW5kQm91bmRzVG9JbmNsdWRlUG9pbnQoeG1pbiwgeG1heCwg
eW1pbiwgeW1heCwgaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKworICAgIGlmIChoNC5zaG91bGRC
ZUNsaXBwZWQoKSBeIGgxLnNob3VsZEJlQ2xpcHBlZCgpKQorICAgICAgICBleHBhbmRCb3VuZHNU
b0luY2x1ZGVQb2ludCh4bWluLCB4bWF4LCB5bWluLCB5bWF4LCBjb21wdXRlQ2xpcHBlZFBvaW50
Rm9yRWRnZShoNCwgaDEpLmNhcnRlc2lhblBvaW50MmQoKSk7CisKKyAgICByZXR1cm4gRmxvYXRS
ZWN0KEZsb2F0UG9pbnQoeG1pbiwgeW1pbiksIEZsb2F0U2l6ZSh4bWF4IC0geG1pbiwgeW1heCAt
IHltaW4pKTsKK30KKworc3RhdGljIEZsb2F0UmVjdCBjb21wdXRlRW5jbG9zaW5nUmVjdChjb25z
dCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgxLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUm
IGgyLCBjb25zdCBIb21vZ2VuZW91c0Nvb3JkaW5hdGUmIGgzLCBjb25zdCBIb21vZ2VuZW91c0Nv
b3JkaW5hdGUmIGg0KQoreworICAgIC8vIElmIG5vIHZlcnRpY2VzIG9uIHRoZSBxdWFkIGFyZSBj
bGlwcGVkLCB0aGVuIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBlbmNsb3NpbmcgcmVjdCBkaXJl
Y3RseS4KKyAgICBib29sIGNsaXBwZWQgPSBoMS5zaG91bGRCZUNsaXBwZWQoKSB8fCBoMi5zaG91
bGRCZUNsaXBwZWQoKSB8fCBoMy5zaG91bGRCZUNsaXBwZWQoKSB8fCBoNC5zaG91bGRCZUNsaXBw
ZWQoKTsKKyAgICBpZiAoIWNsaXBwZWQpIHsKKyAgICAgICAgRmxvYXRRdWFkIG1hcHBlZFF1YWQg
PSBGbG9hdFF1YWQoaDEuY2FydGVzaWFuUG9pbnQyZCgpLCBoMi5jYXJ0ZXNpYW5Qb2ludDJkKCks
IGgzLmNhcnRlc2lhblBvaW50MmQoKSwgaDQuY2FydGVzaWFuUG9pbnQyZCgpKTsKKyAgICAgICAg
cmV0dXJuIG1hcHBlZFF1YWQuYm91bmRpbmdCb3goKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29t
cHV0ZUVuY2xvc2luZ1JlY3RPZkNsaXBwZWRRdWFkKGgxLCBoMiwgaDMsIGg0KTsKK30KKworSW50
UmVjdCBDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgdHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0KQoreworICAgIHJldHVybiBlbmNs
b3NpbmdJbnRSZWN0KG1hcENsaXBwZWRSZWN0KHRyYW5zZm9ybSwgRmxvYXRSZWN0KHNyY1JlY3Qp
KSk7Cit9CisKK0Zsb2F0UmVjdCBDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdChjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QpCit7
CisgICAgaWYgKHRyYW5zZm9ybS5pc0lkZW50aXR5T3JUcmFuc2xhdGlvbigpKSB7CisgICAgICAg
IEZsb2F0UmVjdCBtYXBwZWRSZWN0KHNyY1JlY3QpOworICAgICAgICBtYXBwZWRSZWN0Lm1vdmUo
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHRyYW5zZm9ybS5tNDEoKSksIHN0YXRpY19jYXN0PGZsb2F0Pih0
cmFuc2Zvcm0ubTQyKCkpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlZFJlY3Q7CisgICAgfQorCisg
ICAgLy8gQXBwbHkgdGhlIHRyYW5zZm9ybSwgYnV0IHJldGFpbiB0aGUgcmVzdWx0IGluIGhvbW9n
ZW5lb3VzIGNvb3JkaW5hdGVzLgorICAgIEZsb2F0UXVhZCBxID0gRmxvYXRRdWFkKEZsb2F0UmVj
dChzcmNSZWN0KSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgxID0gbWFwUG9pbnQodHJh
bnNmb3JtLCBxLnAxKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMiA9IG1hcFBvaW50
KHRyYW5zZm9ybSwgcS5wMigpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDMgPSBtYXBQ
b2ludCh0cmFuc2Zvcm0sIHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0g
bWFwUG9pbnQodHJhbnNmb3JtLCBxLnA0KCkpOworCisgICAgcmV0dXJuIGNvbXB1dGVFbmNsb3Np
bmdSZWN0KGgxLCBoMiwgaDMsIGg0KTsKK30KKworRmxvYXRSZWN0IENDTWF0aFV0aWw6OnByb2pl
Y3RDbGlwcGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25z
dCBGbG9hdFJlY3QmIHNyY1JlY3QpCit7CisgICAgLy8gUGVyZm9ybSB0aGUgcHJvamVjdGlvbiwg
YnV0IHJldGFpbiB0aGUgcmVzdWx0IGluIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLgorICAgIEZs
b2F0UXVhZCBxID0gRmxvYXRRdWFkKEZsb2F0UmVjdChzcmNSZWN0KSk7CisgICAgSG9tb2dlbmVv
dXNDb29yZGluYXRlIGgxID0gcHJvamVjdFBvaW50KHRyYW5zZm9ybSwgcS5wMSgpKTsKKyAgICBI
b21vZ2VuZW91c0Nvb3JkaW5hdGUgaDIgPSBwcm9qZWN0UG9pbnQodHJhbnNmb3JtLCBxLnAyKCkp
OworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMyA9IHByb2plY3RQb2ludCh0cmFuc2Zvcm0s
IHEucDMoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGg0ID0gcHJvamVjdFBvaW50KHRy
YW5zZm9ybSwgcS5wNCgpKTsKKworICAgIHJldHVybiBjb21wdXRlRW5jbG9zaW5nUmVjdChoMSwg
aDIsIGgzLCBoNCk7Cit9CisKK0Zsb2F0UXVhZCBDQ01hdGhVdGlsOjptYXBRdWFkKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UXVhZCYgcSwgYm9vbCYg
Y2xpcHBlZCkKK3sKKyAgICBpZiAodHJhbnNmb3JtLmlzSWRlbnRpdHlPclRyYW5zbGF0aW9uKCkp
IHsKKyAgICAgICAgRmxvYXRRdWFkIG1hcHBlZFF1YWQocSk7CisgICAgICAgIG1hcHBlZFF1YWQu
bW92ZShzdGF0aWNfY2FzdDxmbG9hdD4odHJhbnNmb3JtLm00MSgpKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHRyYW5zZm9ybS5tNDIoKSkpOworICAgICAgICByZXR1cm4gbWFwcGVkUXVhZDsKKyAgICB9
CisKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDEgPSBtYXBQb2ludCh0cmFuc2Zvcm0sIHEu
cDEoKSk7CisgICAgSG9tb2dlbmVvdXNDb29yZGluYXRlIGgyID0gbWFwUG9pbnQodHJhbnNmb3Jt
LCBxLnAyKCkpOworICAgIEhvbW9nZW5lb3VzQ29vcmRpbmF0ZSBoMyA9IG1hcFBvaW50KHRyYW5z
Zm9ybSwgcS5wMygpKTsKKyAgICBIb21vZ2VuZW91c0Nvb3JkaW5hdGUgaDQgPSBtYXBQb2ludCh0
cmFuc2Zvcm0sIHEucDQoKSk7CisKKyAgICBjbGlwcGVkID0gaDEuc2hvdWxkQmVDbGlwcGVkKCkg
fHwgaDIuc2hvdWxkQmVDbGlwcGVkKCkgfHwgaDMuc2hvdWxkQmVDbGlwcGVkKCkgfHwgaDQuc2hv
dWxkQmVDbGlwcGVkKCk7CisKKyAgICAvLyBSZXN1bHQgd2lsbCBiZSBpbnZhbGlkIGlmIGNsaXBw
ZWQgPT0gdHJ1ZS4gQnV0LCBjb21wdXRlIGl0IGFueXdheSBqdXN0IGluIGNhc2UsIHRvIGVtdWxh
dGUgZXhpc3RpbmcgYmVoYXZpb3IuCisgICAgcmV0dXJuIEZsb2F0UXVhZChoMS5jYXJ0ZXNpYW5Q
b2ludDJkKCksIGgyLmNhcnRlc2lhblBvaW50MmQoKSwgaDMuY2FydGVzaWFuUG9pbnQyZCgpLCBo
NC5jYXJ0ZXNpYW5Qb2ludDJkKCkpOworfQorCitGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6cHJvamVj
dFF1YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRR
dWFkJiBxLCBib29sJiBjbGlwcGVkKQoreworICAgIEZsb2F0UXVhZCBwcm9qZWN0ZWRRdWFkOwor
ICAgIGJvb2wgY2xpcHBlZFBvaW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDEodHJhbnNmb3Jt
LnByb2plY3RQb2ludChxLnAxKCksICZjbGlwcGVkUG9pbnQpKTsKKyAgICBjbGlwcGVkID0gY2xp
cHBlZFBvaW50OworICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3JtLnByb2plY3RQb2lu
dChxLnAyKCksICZjbGlwcGVkUG9pbnQpKTsKKyAgICBjbGlwcGVkIHw9IGNsaXBwZWRQb2ludDsK
KyAgICBwcm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9pbnQocS5wMygpLCAm
Y2xpcHBlZFBvaW50KSk7CisgICAgY2xpcHBlZCB8PSBjbGlwcGVkUG9pbnQ7CisgICAgcHJvamVj
dGVkUXVhZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwgJmNsaXBwZWRQb2lu
dCkpOworICAgIGNsaXBwZWQgfD0gY2xpcHBlZFBvaW50OworCisgICAgcmV0dXJuIHByb2plY3Rl
ZFF1YWQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0aWwuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5kOWQwMzllODYwNjc3Nzc3YmUyNzYxMWNjNGVmM2MzZTg5NzczNjJlCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NNYXRoVXRpbC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ0NN
YXRoVXRpbF9oCisjZGVmaW5lIENDTWF0aFV0aWxfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIEludFJlY3Q7CitjbGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBGbG9hdFF1YWQ7CitjbGFz
cyBUcmFuc2Zvcm1hdGlvbk1hdHJpeDsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBtYXRoIGhl
bHBlciBmdW5jdGlvbmFsaXR5IHRoYXQgZG9lcyBub3QgYmVsb25nIGluIFdlYkNvcmUuCisvLyBJ
dCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgbWlncmF0ZWQg
dG8gV2ViQ29yZSBldmVudHVhbGx5LgorY2xhc3MgQ0NNYXRoVXRpbCB7CitwdWJsaWM6CisKKyAg
ICAvLyBCYWNrZ3JvdW5kOiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjb2RlIGluIFdlYkNvcmUgZG9l
cyBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGluCisgICAgLy8gbWFwUmVjdCAvIG1hcFF1YWQgLyBw
cm9qZWN0UXVhZCB3aGVuIHRoZXJlIGlzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiB0aGF0IGNh
dXNlcworICAgIC8vIG9uZSBvZiB0aGUgdHJhbnNmb3JtZWQgdmVydGljZXMgdG8gZ28gdG8gdyA8
IDAuIEluIHRob3NlIGNhc2VzLCBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAvLyBwZXJmb3JtIGNs
aXBwaW5nIGluIGhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzLCBhZnRlciBhcHBseWluZyB0aGUgdHJh
bnNmb3JtLCBiZWZvcmUKKyAgICAvLyBkaXZpZGluZy1ieS13IHRvIGNvbnZlcnQgdG8gY2FydGVz
aWFuIGNvb3JkaW5hdGVzLgorICAgIC8vCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0
aGUgYXhpcy1hbGlnbmVkIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY29ycmVjdGx5IGNsaXBwZWQs
CisgICAgLy8gdHJhbnNmb3JtZWQgcG9seWdvbi4KKyAgICBzdGF0aWMgSW50UmVjdCBtYXBDbGlw
cGVkUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEludFJlY3QmKTsKKyAg
ICBzdGF0aWMgRmxvYXRSZWN0IG1hcENsaXBwZWRSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiwgY29uc3QgRmxvYXRSZWN0Jik7CisgICAgc3RhdGljIEZsb2F0UmVjdCBwcm9qZWN0Q2xp
cHBlZFJlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmLCBjb25zdCBGbG9hdFJlY3QmKTsK
KworICAgIC8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZG8gY29ycmVjdCBjbGlwcGlu
ZyBhZ2FpbnN0IHcgPSAwIHBsYW5lLCBidXQgaXQKKyAgICAvLyBjb3JyZWN0bHkgZGV0ZWN0cyB0
aGUgY2xpcHBlZCBjb25kaXRpb24gdmlhIHRoZSBib29sZWFuIGNsaXBwZWQuCisgICAgc3RhdGlj
IEZsb2F0UXVhZCBtYXBRdWFkKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxv
YXRRdWFkJiwgYm9vbCYgY2xpcHBlZCk7CisgICAgc3RhdGljIEZsb2F0UXVhZCBwcm9qZWN0UXVh
ZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGNvbnN0IEZsb2F0UXVhZCYsIGJvb2wmIGNs
aXBwZWQpOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gI2RlZmlu
ZSBDQ01hdGhVdGlsX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwCmluZGV4
IGE1NDExZWNjZjc2MTUxZWEzYmYwMDM1Y2Y5OThkMGJjYmRiMzI3YmIuLmUwNGFkZmEzMTM2YTRm
MDllZWEyOGQ4YjIwNTFhM2ZiNDZjNjc3M2UgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9uVHJhY2tlci5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25U
cmFja2VyLmNwcApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5o
IgogI2luY2x1ZGUgImNjL0NDTGF5ZXJJbXBsLmgiCisjaW5jbHVkZSAiY2MvQ0NNYXRoVXRpbC5o
IgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCkBAIC0yNzUsMjIgKzI3Niw2IEBAIHN0YXRpYyBp
bmxpbmUgSW50UmVjdCByZWN0U3VidHJhY3RSZWdpb24oY29uc3QgSW50UmVjdCYgcmVjdCwgY29u
c3QgUmVnaW9uJiByZWdpCiAgICAgcmV0dXJuIGJvdW5kc1JlY3Q7CiB9CiAKLXN0YXRpYyBGbG9h
dFF1YWQgcHJvamVjdFF1YWQoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwg
Y29uc3QgRmxvYXRRdWFkJiBxLCBib29sJiBjbGFtcGVkKQotewotICAgIEZsb2F0UXVhZCBwcm9q
ZWN0ZWRRdWFkOwotICAgIGJvb2wgY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0
UDEodHJhbnNmb3JtLnByb2plY3RQb2ludChxLnAxKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBj
bGFtcGVkID0gY2xhbXBlZFBvaW50OwotICAgIHByb2plY3RlZFF1YWQuc2V0UDIodHJhbnNmb3Jt
LnByb2plY3RQb2ludChxLnAyKCksICZjbGFtcGVkUG9pbnQpKTsKLSAgICBjbGFtcGVkIHw9IGNs
YW1wZWRQb2ludDsKLSAgICBwcm9qZWN0ZWRRdWFkLnNldFAzKHRyYW5zZm9ybS5wcm9qZWN0UG9p
bnQocS5wMygpLCAmY2xhbXBlZFBvaW50KSk7Ci0gICAgY2xhbXBlZCB8PSBjbGFtcGVkUG9pbnQ7
Ci0gICAgcHJvamVjdGVkUXVhZC5zZXRQNCh0cmFuc2Zvcm0ucHJvamVjdFBvaW50KHEucDQoKSwg
JmNsYW1wZWRQb2ludCkpOwotICAgIGNsYW1wZWQgfD0gY2xhbXBlZFBvaW50OwotCi0gICAgcmV0
dXJuIHByb2plY3RlZFF1YWQ7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgSW50UmVjdCBjb21wdXRlVW5v
Y2NsdWRlZENvbnRlbnRSZWN0KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgY29udGVudFNwYWNlVHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBz
Y2lzc29yUmVjdCwgY29uc3QgUmVnaW9uJiBvY2NsdXNpb24pCiB7CiAgICAgaWYgKCFjb250ZW50
U3BhY2VUcmFuc2Zvcm0uaXNJbnZlcnRpYmxlKCkpCkBAIC0yOTksOSArMjg0LDkgQEAgc3RhdGlj
IGlubGluZSBJbnRSZWN0IGNvbXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QoY29uc3QgSW50UmVj
dCYgY29udGVudFJlY3QsIGMKICAgICBGbG9hdFJlY3QgdHJhbnNmb3JtZWRSZWN0ID0gY29udGVu
dFNwYWNlVHJhbnNmb3JtLm1hcFJlY3QoRmxvYXRSZWN0KGNvbnRlbnRSZWN0KSk7CiAgICAgLy8g
VGFrZSB0aGUgZW5jbG9zaW5nSW50UmVjdCBhdCBlYWNoIHN0ZXAsIGFzIHdlIHdhbnQgdG8gY29u
dGFpbiBhbnkgdW5vY2NsdWRlZCBwYXJ0aWFsIHBpeGVscyBpbiB0aGUgcmVzdWx0aW5nIEludFJl
Y3QuCiAgICAgSW50UmVjdCBzaHJ1bmtSZWN0ID0gcmVjdFN1YnRyYWN0UmVnaW9uKGludGVyc2Vj
dGlvbihlbmNsb3NpbmdJbnRSZWN0KHRyYW5zZm9ybWVkUmVjdCksIHNjaXNzb3JSZWN0KSwgb2Nj
bHVzaW9uKTsKLSAgICBib29sIGNsYW1wZWQ7IC8vIEZJWE1FOiBwcm9qZWN0UXVhZCByZXR1cm5z
IGludmFsaWQgcmVzdWx0cyB3aGVuIGEgcG9pbnQgZ2V0cyBjbGFtcGVkLiBUbyBiZSBmaXhlZCBp
biBidWcgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgwODA2LgotICAg
IEludFJlY3QgdW5vY2NsdWRlZFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHByb2plY3RRdWFkKGNv
bnRlbnRTcGFjZVRyYW5zZm9ybS5pbnZlcnNlKCksIEZsb2F0UXVhZChGbG9hdFJlY3Qoc2hydW5r
UmVjdCkpLCBjbGFtcGVkKS5ib3VuZGluZ0JveCgpKTsKLSAgICBpZiAoY2xhbXBlZCkKKyAgICBi
b29sIGNsaXBwZWQ7IC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgcHJvamVjdENs
aXBwZWRRdWFkIGluc3RlYWQgb2YgZm9yY2luZyBldmVyeXRoaW5nIHRvIGJlIHVub2NjbHVkZWQu
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzIxNy4KKyAgICBJbnRS
ZWN0IHVub2NjbHVkZWRSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChDQ01hdGhVdGlsOjpwcm9qZWN0
UXVhZChjb250ZW50U3BhY2VUcmFuc2Zvcm0uaW52ZXJzZSgpLCBGbG9hdFF1YWQoRmxvYXRSZWN0
KHNocnVua1JlY3QpKSwgY2xpcHBlZCkuYm91bmRpbmdCb3goKSk7CisgICAgaWYgKGNsaXBwZWQp
CiAgICAgICAgIHJldHVybiBjb250ZW50UmVjdDsKICAgICAvLyBUaGUgcmVjdCBiYWNrIGluIGNv
bnRlbnQgc3BhY2UgaXMgYSBib3VuZGluZyBib3ggYW5kIG1heSBleHRlbmQgb3V0c2lkZSBvZiB0
aGUgb3JpZ2luYWwgY29udGVudFJlY3QsIHNvIGNsYW1wIGl0IHRvIHRoZSBjb250ZW50UmVjdEJv
dW5kcy4KICAgICByZXR1cm4gaW50ZXJzZWN0aW9uKHVub2NjbHVkZWRSZWN0LCBjb250ZW50UmVj
dCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVl
SG9zdENvbW1vblRlc3QuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVy
VHJlZUhvc3RDb21tb25UZXN0LmNwcAppbmRleCA0YTk2NTlkZGQxNTNlZmY2ZTY3NTJlYTIwNzA2
ZTIzYzdlMTI0YjY0Li5mNmExY2ViNTBjMmUwMTBjZjVjZjJjZjQ5Njc1ZTI0MDliNDZlYjYyIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdENv
bW1vblRlc3QuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NMYXllclRy
ZWVIb3N0Q29tbW9uVGVzdC5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJUcmFuc2Zv
cm1hdGlvbk1hdHJpeC5oIgogI2luY2x1ZGUgIlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5o
IgogI2luY2x1ZGUgImNjL0NDTGF5ZXJBbmltYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAi
Y2MvQ0NNYXRoVXRpbC5oIgogCiAjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KICNpbmNsdWRlIDxn
dGVzdC9ndGVzdC5oPgpAQCAtOTc5LDYgKzk4MCwyNjQgQEAgVEVTVChDQ0xheWVyVHJlZUhvc3RD
b21tb25UZXN0LCB2ZXJpZnlBbmltYXRpb25zRm9yUmVuZGVyU3VyZmFjZUhpZXJhcmNoeSkKICAg
ICBFWFBFQ1RfRkxPQVRfRVEoNS4wLCBncmFuZENoaWxkT2ZSUzItPnNjcmVlblNwYWNlVHJhbnNm
b3JtKCkubTQyKCkpOwogfQogCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlm
eVZpc2libGVSZWN0Rm9ySWRlbnRpdHlUcmFuc2Zvcm0pCit7CisgICAgLy8gVGVzdCB0aGUgY2Fs
Y3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3b3JrcyBjb3JyZWN0bHkgZm9yIGlkZW50aXR5
IHRyYW5zZm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJ
bnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAxOiBMYXllciBpcyBj
b250YWluZWQgd2l0aGluIHRoZSBzdXJmYWNlLgorICAgIEludFJlY3QgbGF5ZXJDb250ZW50UmVj
dCA9IEludFJlY3QoSW50UG9pbnQoMTAsIDEwKSwgSW50U2l6ZSgzMCwgMzApKTsKKyAgICBJbnRS
ZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgxMCwgMTApLCBJbnRTaXplKDMwLCAzMCkp
OworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVW
aXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1
cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFs
KTsKKworICAgIC8vIENhc2UgMjogTGF5ZXIgaXMgb3V0c2lkZSB0aGUgc3VyZmFjZSByZWN0Lgor
ICAgIGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDEyMCwgMTIwKSwgSW50U2l6
ZSgzMCwgMzApKTsKKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246OmNhbGN1bGF0
ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0LCBsYXllclRv
U3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsLmlzRW1wdHkoKSk7CisK
KyAgICAvLyBDYXNlIDM6IExheWVyIGlzIHBhcnRpYWxseSBvdmVybGFwcGluZyB0aGUgc3VyZmFj
ZSByZWN0LgorICAgIGxheWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDgwLCA4MCks
IEludFNpemUoMzAsIDMwKSk7CisgICAgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDgwLCA4
MCksIEludFNpemUoMjAsIDIwKSk7CisgICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9u
OjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVj
dCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVDVF9FUShleHBl
Y3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChDQ0xheWVyVHJlZUhvc3RDb21tb25UZXN0LCB2ZXJp
ZnlWaXNpYmxlUmVjdEZvclRyYW5zbGF0aW9ucykKK3sKKyAgICAvLyBUZXN0IHRoZSBjYWxjdWxh
dGVWaXNpYmxlUmVjdCgpIGZ1bmN0aW9uIHdvcmtzIGNvcnJlY3RseSBmb3Igc2NhbGluZyB0cmFu
c2Zvcm1zLgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJlY3QoSW50UG9p
bnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJl
Y3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIFRyYW5z
Zm9ybWF0aW9uTWF0cml4IGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtOworCisgICAgLy8gQ2FzZSAx
OiBMYXllciBpcyBjb250YWluZWQgd2l0aGluIHRoZSBzdXJmYWNlLgorICAgIGxheWVyVG9TdXJm
YWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3Jt
LnRyYW5zbGF0ZSgxMCwgMTApOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBv
aW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXll
clRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwg
bGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9J
TlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgMjogTGF5ZXIgaXMg
b3V0c2lkZSB0aGUgc3VyZmFjZSByZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1h
a2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSgxMjAs
IDEyMCk7CisgICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNp
YmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZh
Y2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9UUlVFKGFjdHVhbC5pc0VtcHR5KCkpOworCisgICAg
Ly8gQ2FzZSAzOiBMYXllciBpcyBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgdGhlIHN1cmZhY2UgcmVj
dC4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUoODAsIDgwKTsKKyAgICBleHBlY3RlZCA9IElu
dFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMjAsIDIwKSk7CisgICAgYWN0dWFsID0gQ0NM
YXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVj
dCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVD
VF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChDQ0xheWVyVHJlZUhv
c3RDb21tb25UZXN0LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjJEUm90YXRpb25zKQoreworICAgIC8v
IFRlc3QgdGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24gd29ya3MgY29ycmVjdGx5
IGZvciByb3RhdGlvbnMgYWJvdXQgei1heGlzIChpLmUuIDJEIHJvdGF0aW9ucykuCisgICAgLy8g
UmVtZW1iZXIgdGhhdCBjYWxjdWxhdGVWaXNpYmxlUmVjdCgpIHNob3VsZCByZXR1cm4gdGhlIHZp
c2libGUgcmVjdCBpbiB0aGUgbGF5ZXIncyBzcGFjZS4KKworICAgIEludFJlY3QgdGFyZ2V0U3Vy
ZmFjZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7Cisg
ICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50
U2l6ZSgzMCwgMzApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3VyZmFjZVRy
YW5zZm9ybTsKKworICAgIC8vIENhc2UgMTogTGF5ZXIgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUg
c3VyZmFjZS4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAg
ICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUoNTAsIDUwKTsKKyAgICBsYXllclRv
U3VyZmFjZVRyYW5zZm9ybS5yb3RhdGUoNDUpOworICAgIEludFJlY3QgZXhwZWN0ZWQgPSBJbnRS
ZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIEludFJlY3QgYWN0dWFs
ID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJm
YWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAg
IEVYUEVDVF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgMjog
TGF5ZXIgaXMgb3V0c2lkZSB0aGUgc3VyZmFjZSByZWN0LgorICAgIGxheWVyVG9TdXJmYWNlVHJh
bnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5z
bGF0ZSgtNTAsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7Cisg
ICAgYWN0dWFsID0gQ0NMYXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0
YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zv
cm0pOworICAgIEVYUEVDVF9UUlVFKGFjdHVhbC5pc0VtcHR5KCkpOworCisgICAgLy8gQ2FzZSAz
OiBUaGUgbGF5ZXIgaXMgcm90YXRlZCBhYm91dCBpdHMgdG9wLWxlZnQgY29ybmVyLiBJbiBzdXJm
YWNlIHNwYWNlLCB0aGUgbGF5ZXIKKyAgICAvLyAgICAgICAgIGlzIG9yaWVudGVkIGRpYWdvbmFs
bHksIHdpdGggdGhlIGxlZnQgaGFsZiBvdXRzaWRlIG9mIHRoZSByZW5kZXJTdXJmYWNlLiBJbgor
ICAgIC8vICAgICAgICAgdGhpcyBjYXNlLCB0aGUgdmlzaWJsZSByZWN0IHNob3VsZCBzdGlsbCBi
ZSB0aGUgZW50aXJlIGxheWVyIChyZW1lbWJlciB0aGUKKyAgICAvLyAgICAgICAgIHZpc2libGUg
cmVjdCBpcyBjb21wdXRlZCBpbiBsYXllciBzcGFjZSk7IGJvdGggdGhlIHRvcC1sZWZ0IGFuZAor
ICAgIC8vICAgICAgICAgYm90dG9tLXJpZ2h0IGNvcm5lcnMgb2YgdGhlIGxheWVyIGFyZSBzdGls
bCB2aXNpYmxlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOwor
ICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7CisgICAgZXhwZWN0ZWQgPSBJ
bnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDMwLCAzMCkpOworICAgIGFjdHVhbCA9IEND
TGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFjZVJl
Y3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBFWFBF
Q1RfSU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7CisKKyAgICAvLyBDYXNlIDQ6IFRoZSBs
YXllciBpcyByb3RhdGVkIGFib3V0IGl0cyB0b3AtbGVmdCBjb3JuZXIsIGFuZCB0cmFuc2xhdGVk
IHVwd2FyZHMuIEluCisgICAgLy8gICAgICAgICBzdXJmYWNlIHNwYWNlLCB0aGUgbGF5ZXIgaXMg
b3JpZW50ZWQgZGlhZ29uYWxseSwgd2l0aCBvbmx5IHRoZSB0b3AgY29ybmVyCisgICAgLy8gICAg
ICAgICBvZiB0aGUgc3VyZmFjZSBvdmVybGFwcGluZyB0aGUgbGF5ZXIuIEluIGxheWVyIHNwYWNl
LCB0aGUgcmVuZGVyIHN1cmZhY2UKKyAgICAvLyAgICAgICAgIG92ZXJsYXBzIHRoZSByaWdodCBz
aWRlIG9mIHRoZSBsYXllci4gVGhlIHZpc2libGUgcmVjdCBzaG91bGQgYmUgdGhlCisgICAgLy8g
ICAgICAgICBsYXllcidzIHJpZ2h0IGhhbGYuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
bWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJhbnNsYXRlKDAs
IC1zcXJ0KDIpICogMTUpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZSg0NSk7
CisgICAgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDE1LCAwKSwgSW50U2l6ZSgxNSwgMzAp
KTsgLy8gcmlnaHQgaGFsZiBvZiBsYXllciBib3VuZHMuCisgICAgYWN0dWFsID0gQ0NMYXllclRy
ZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5
ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRf
UkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKworVEVTVChDQ0xheWVyVHJlZUhvc3RDb21t
b25UZXN0LCB2ZXJpZnlWaXNpYmxlUmVjdEZvcjNkT3J0aG9ncmFwaGljVHJhbnNmb3JtKQorewor
ICAgIC8vIFRlc3QgdGhhdCB0aGUgY2FsY3VsYXRlVmlzaWJsZVJlY3QoKSBmdW5jdGlvbiB3b3Jr
cyBjb3JyZWN0bHkgZm9yIDNkIHRyYW5zZm9ybXMuCisKKyAgICBJbnRSZWN0IHRhcmdldFN1cmZh
Y2VSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAg
IEludFJlY3QgbGF5ZXJDb250ZW50UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNp
emUoMTAwLCAxMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXllclRvU3VyZmFjZVRy
YW5zZm9ybTsKKworICAgIC8vIENhc2UgMTogT3J0aG9ncmFwaGljIHByb2plY3Rpb24gb2YgYSBs
YXllciByb3RhdGVkIGFib3V0IHktYXhpcyBieSA0NSBkZWdyZWVzLCBzaG91bGQgYmUgZnVsbHkg
Y29udGFpbmVkIGluIHRoZSByZW5kZXJTdXJmYWNlLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNm
b3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0ZTNk
KDAsIDQ1LCAwKTsKKyAgICBJbnRSZWN0IGV4cGVjdGVkID0gSW50UmVjdChJbnRQb2ludCgwLCAw
KSwgSW50U2l6ZSgxMDAsIDEwMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NMYXllclRyZWVI
b3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXJD
b250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVDVF9JTlRfUkVD
VF9FUShleHBlY3RlZCwgYWN0dWFsKTsKKworICAgIC8vIENhc2UgMjogT3J0aG9ncmFwaGljIHBy
b2plY3Rpb24gb2YgYSBsYXllciByb3RhdGVkIGFib3V0IHktYXhpcyBieSA0NSBkZWdyZWVzLCBi
dXQKKyAgICAvLyAgICAgICAgIHNoaWZ0ZWQgdG8gdGhlIHNpZGUgc28gb25seSB0aGUgcmlnaHQt
aGFsZiB0aGUgbGF5ZXIgd291bGQgYmUgdmlzaWJsZSBvbgorICAgIC8vICAgICAgICAgdGhlIHN1
cmZhY2UuCisgICAgZG91YmxlIGhhbGZXaWR0aE9mUm90YXRlZExheWVyID0gKDEwMC4wIC8gc3Fy
dCgyKSkgKiAwLjU7IC8vIDEwMC4wIGlzIHRoZSB1bi1yb3RhdGVkIGxheWVyIHdpZHRoOyBkaXZp
ZGVkIGJ5IHNxcnQoMikgaXMgdGhlIHJvdGF0ZWQgd2lkdGguCisgICAgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0udHJh
bnNsYXRlKC1oYWxmV2lkdGhPZlJvdGF0ZWRMYXllciwgMCk7CisgICAgbGF5ZXJUb1N1cmZhY2VU
cmFuc2Zvcm0ucm90YXRlM2QoMCwgNDUsIDApOyAvLyByb3RhdGVzIGFib3V0IHRoZSBsZWZ0IGVk
Z2Ugb2YgdGhlIGxheWVyCisgICAgZXhwZWN0ZWQgPSBJbnRSZWN0KEludFBvaW50KDUwLCAwKSwg
SW50U2l6ZSg1MCwgMTAwKSk7IC8vIHJpZ2h0IGhhbGYgb2YgdGhlIGxheWVyLgorICAgIGFjdHVh
bCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3Vy
ZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAg
ICBFWFBFQ1RfSU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXll
clRyZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZFBlcnNwZWN0aXZlVHJh
bnNmb3JtKQoreworICAgIC8vIFRlc3QgdGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rp
b24gd29ya3MgY29ycmVjdGx5IHdoZW4gdGhlIGxheWVyIGhhcyBhCisgICAgLy8gcGVyc3BlY3Rp
dmUgcHJvamVjdGlvbiBvbnRvIHRoZSB0YXJnZXQgc3VyZmFjZS4KKworICAgIEludFJlY3QgdGFy
Z2V0U3VyZmFjZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAw
KSk7CisgICAgSW50UmVjdCBsYXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtNTAs
IC01MCksIEludFNpemUoMjAwLCAyMDApKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybTsKKworICAgIC8vIENhc2UgMTogRXZlbiB0aG91Z2ggdGhlIGxh
eWVyIGlzIHR3aWNlIGFzIGxhcmdlIGFzIHRoZSBzdXJmYWNlLCBkdWUgdG8gcGVyc3BlY3RpdmUK
KyAgICAvLyAgICAgICAgIGZvcmVzaG9ydGVuaW5nLCB0aGUgbGF5ZXIgd2lsbCBmaXQgZnVsbHkg
aW4gdGhlIHN1cmZhY2Ugd2hlbiBpdHMgdHJhbnNsYXRlZAorICAgIC8vICAgICAgICAgbW9yZSB0
aGFuIHRoZSBwZXJzcGVjdGl2ZSBhbW91bnQuCisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0u
bWFrZUlkZW50aXR5KCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mIHRyYW5z
Zm9ybXMgYXBwbGllcyB0aGUgcGVyc3BlY3RpdmUgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgc3Vy
ZmFjZS4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUoNTAsIDUwKTsKKyAg
ICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS5hcHBseVBlcnNwZWN0aXZlKDkpOworICAgIGxheWVy
VG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSgtNTAsIC01MCk7CisKKyAgICAvLyBUaGlzIHRy
YW5zbGF0ZSBwbGFjZXMgdGhlIGxheWVyIGluIGZyb250IG9mIHRoZSBzdXJmYWNlJ3MgcHJvamVj
dGlvbiBwbGFuZS4KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAw
LCAtMjcpOworCisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQoLTUwLCAt
NTApLCBJbnRTaXplKDIwMCwgMjAwKSk7CisgICAgSW50UmVjdCBhY3R1YWwgPSBDQ0xheWVyVHJl
ZUhvc3RDb21tb246OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXll
ckNvbnRlbnRSZWN0LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9S
RUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOworCisgICAgLy8gQ2FzZSAyOiBzYW1lIHByb2plY3Rp
b24gYXMgYmVmb3JlLCBleGNlcHQgdGhhdCB0aGUgbGF5ZXIgaXMgYWxzbyB0cmFuc2xhdGVkIHRv
IHRoZQorICAgIC8vICAgICAgICAgc2lkZSwgc28gdGhhdCBvbmx5IHRoZSByaWdodCBoYWxmIG9m
IHRoZSBsYXllciBzaG91bGQgYmUgdmlzaWJsZS4KKyAgICAvLworICAgIC8vIEV4cGxhbmF0aW9u
IG9mIGV4cGVjdGVkIHJlc3VsdDoKKyAgICAvLyBUaGUgcGVyc3BlY3RpdmUgcmF0aW8gaXMgKHog
ZGlzdGFuY2UgYmV0d2VlbiBsYXllciBhbmQgY2FtZXJhIG9yaWdpbikgLyAoeiBkaXN0YW5jZSBi
ZXR3ZWVuIHByb2plY3Rpb24gcGxhbmUgYW5kIGNhbWVyYSBvcmlnaW4pID09ICgoLTI3IC0gOSkg
LyA5KQorICAgIC8vIFRoZW4sIGJ5IHNpbWlsYXIgdHJpYW5nbGVzLCBpZiB3ZSB3YW50IHRvIG1v
dmUgYSBsYXllciBieSB0cmFuc2xhdGluZyAtNTAgdW5pdHMgaW4gcHJvamVjdGVkIHN1cmZhY2Ug
dW5pdHMgKHNvIHRoYXQgb25seSBoYWxmIG9mIGl0IGlzCisgICAgLy8gdmlzaWJsZSksIHRoZW4g
d2Ugd291bGQgbmVlZCB0byB0cmFuc2xhdGUgYnkgKC0zNiAvIDkpICogLTUwID09IC0yMDAgaW4g
dGhlIGxheWVyJ3MgdW5pdHMuCisgICAgLy8KKyAgICBsYXllclRvU3VyZmFjZVRyYW5zZm9ybS50
cmFuc2xhdGUzZCgtMjAwLCAwLCAwKTsKKyAgICBleHBlY3RlZCA9IEludFJlY3QoSW50UG9pbnQo
NTAsIC01MCksIEludFNpemUoMTAwLCAyMDApKTsgLy8gVGhlIHJpZ2h0IGhhbGYgb2YgdGhlIGxh
eWVyJ3MgYm91bmRpbmcgcmVjdC4KKyAgICBhY3R1YWwgPSBDQ0xheWVyVHJlZUhvc3RDb21tb246
OmNhbGN1bGF0ZVZpc2libGVSZWN0KHRhcmdldFN1cmZhY2VSZWN0LCBsYXllckNvbnRlbnRSZWN0
LCBsYXllclRvU3VyZmFjZVRyYW5zZm9ybSk7CisgICAgRVhQRUNUX0lOVF9SRUNUX0VRKGV4cGVj
dGVkLCBhY3R1YWwpOworfQorCitURVNUKENDTGF5ZXJUcmVlSG9zdENvbW1vblRlc3QsIHZlcmlm
eVZpc2libGVSZWN0Rm9yM2RPcnRob2dyYXBoaWNJc05vdENsaXBwZWRCZWhpbmRTdXJmYWNlKQor
eworICAgIC8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyBleHBsaWNpdCBjb25jZXB0IG9mIGFuIG9y
dGhvZ3JhcGhpYyBwcm9qZWN0aW9uIHBsYW5lIGluIG91cgorICAgIC8vIGNvZGUgKG5vciBpbiB0
aGUgQ1NTIHNwZWMgdG8gbXkga25vd2xlZGdlKS4gVGhlcmVmb3JlLCBsYXllcnMgdGhhdCBhcmUg
dGVjaG5pY2FsbHkKKyAgICAvLyBiZWhpbmQgdGhlIHN1cmZhY2UgaW4gYW4gb3J0aG9ncmFwaGlj
IHdvcmxkIHNob3VsZCBub3QgYmUgY2xpcHBlZCB3aGVuIHRoZXkgYXJlCisgICAgLy8gZmxhdHRl
bmVkIHRvIHRoZSBzdXJmYWNlLgorCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IElu
dFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxh
eWVyQ29udGVudFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAw
KSk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisK
KyAgICAvLyBUaGlzIHNlcXVlbmNlIG9mIHRyYW5zZm9ybXMgZWZmZWN0aXZlbHkgcm90YXRlcyB0
aGUgbGF5ZXIgYWJvdXQgdGhlIHktYXhpcyBhdCB0aGUKKyAgICAvLyBjZW50ZXIgb2YgdGhlIGxh
eWVyLgorICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLm1ha2VJZGVudGl0eSgpOworICAgIGxh
eWVyVG9TdXJmYWNlVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwgMCk7CisgICAgbGF5ZXJUb1N1cmZh
Y2VUcmFuc2Zvcm0ucm90YXRlM2QoMCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNm
b3JtLnRyYW5zbGF0ZSgtNTAsIDApOworCisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3Qo
SW50UG9pbnQoMCwgMCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGFjdHVhbCA9
IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJsZVJlY3QodGFyZ2V0U3VyZmFj
ZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtKTsKKyAgICBF
WFBFQ1RfSU5UX1JFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7Cit9CisKK1RFU1QoQ0NMYXllclRy
ZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3IzZFBlcnNwZWN0aXZlSXNDbGlw
cGVkKQoreworICAgIC8vIFRlc3QgdGhlIGNhbGN1bGF0ZVZpc2libGVSZWN0KCkgZnVuY3Rpb24g
d29ya3MgY29ycmVjdGx5IHdoZW4gcHJvamVjdGluZyBhIHN1cmZhY2UKKyAgICAvLyBvbnRvIGEg
bGF5ZXIsIGJ1dCB0aGUgbGF5ZXIgaXMgcGFydGlhbGx5IGJlaGluZCB0aGUgY2FtZXJhIChub3Qg
anVzdCBiZWhpbmQgdGhlCisgICAgLy8gcHJvamVjdGlvbiBwbGFuZSkuIEluIHRoaXMgY2FzZSwg
dGhlIGNhcnRlc2lhbiBjb29yZGluYXRlcyBtYXkgc2VlbSB0byBiZSB2YWxpZCwKKyAgICAvLyBi
dXQgYWN0dWFsbHkgdGhleSBhcmUgbm90LiBUaGUgdmlzaWJsZVJlY3QgbmVlZHMgdG8gYmUgcHJv
cGVybHkgY2xpcHBlZCBieSB0aGUKKyAgICAvLyB3ID0gMCBwbGFuZSBpbiBob21vZ2VuZW91cyBj
b29yZGluYXRlcyBiZWZvcmUgY29udmVydGluZyB0byBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuCisK
KyAgICBJbnRSZWN0IHRhcmdldFN1cmZhY2VSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtNTAsIC01
MCksIEludFNpemUoMTAwLCAxMDApKTsKKyAgICBJbnRSZWN0IGxheWVyQ29udGVudFJlY3QgPSBJ
bnRSZWN0KEludFBvaW50KC0xMCwgLTEpLCBJbnRTaXplKDIwLCAyKSk7CisgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07CisKKyAgICAvLyBUaGUgbGF5ZXIg
aXMgcG9zaXRpb25lZCBzbyB0aGF0IHRoZSByaWdodCBoYWxmIG9mIHRoZSBsYXllciBzaG91bGQg
YmUgaW4gZnJvbnQgb2YKKyAgICAvLyB0aGUgY2FtZXJhLCB3aGlsZSB0aGUgb3RoZXIgaGFsZiBp
cyBiZWhpbmQgdGhlIHN1cmZhY2UncyBwcm9qZWN0aW9uIHBsYW5lLiBUaGUKKyAgICAvLyBmb2xs
b3dpbmcgc2VxdWVuY2Ugb2YgdHJhbnNmb3JtcyBhcHBsaWVzIHRoZSBwZXJzcGVjdGl2ZSBhbmQg
cm90YXRpb24gYWJvdXQgdGhlCisgICAgLy8gY2VudGVyIG9mIHRoZSBsYXllci4KKyAgICBsYXll
clRvU3VyZmFjZVRyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsKKyAgICBsYXllclRvU3VyZmFjZVRy
YW5zZm9ybS5hcHBseVBlcnNwZWN0aXZlKDEpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3Jt
LnRyYW5zbGF0ZTNkKDAsIDAsIDEpOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJvdGF0
ZTNkKDAsIDQ1LCAwKTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHRoaXMgdHJhbnNmb3Jt
IGRvZXMgaW5kZWVkIGNhdXNlIHcgPCAwIHdoZW4gYXBwbHlpbmcgdGhlCisgICAgLy8gdHJhbnNm
b3JtLCBvdGhlcndpc2UgdGhpcyBjb2RlIGlzIG5vdCB0ZXN0aW5nIHRoZSBpbnRlbmRlZCBzY2Vu
YXJpby4KKyAgICBib29sIGNsaXBwZWQgPSBmYWxzZTsKKyAgICBDQ01hdGhVdGlsOjptYXBRdWFk
KGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLCBGbG9hdFF1YWQoRmxvYXRSZWN0KGxheWVyQ29udGVu
dFJlY3QpKSwgY2xpcHBlZCk7CisgICAgQVNTRVJUX1RSVUUoY2xpcHBlZCk7CisKKyAgICBpbnQg
ZXhwZWN0ZWRYUG9zaXRpb24gPSAtMTA7CisgICAgaW50IGV4cGVjdGVkV2lkdGggPSAxMDsKKyAg
ICBJbnRSZWN0IGFjdHVhbCA9IENDTGF5ZXJUcmVlSG9zdENvbW1vbjo6Y2FsY3VsYXRlVmlzaWJs
ZVJlY3QodGFyZ2V0U3VyZmFjZVJlY3QsIGxheWVyQ29udGVudFJlY3QsIGxheWVyVG9TdXJmYWNl
VHJhbnNmb3JtKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRYUG9zaXRpb24sIGFjdHVhbC54KCkp
OworICAgIEVYUEVDVF9FUShleHBlY3RlZFdpZHRoLCBhY3R1YWwud2lkdGgoKSk7Cit9CisKK1RF
U1QoQ0NMYXllclRyZWVIb3N0Q29tbW9uVGVzdCwgdmVyaWZ5VmlzaWJsZVJlY3RGb3JQZXJzcGVj
dGl2ZVVucHJvamVjdGlvbikKK3sKKyAgICAvLyBUbyBkZXRlcm1pbmUgdmlzaWJsZVJlY3QgaW4g
bGF5ZXIgc3BhY2UsIHRoZXJlIG5lZWRzIHRvIGJlIGFuIHVuLXByb2plY3Rpb24gZnJvbQorICAg
IC8vIHN1cmZhY2Ugc3BhY2UgdG8gbGF5ZXIgc3BhY2UuIFdoZW4gdGhlIG9yaWdpbmFsIHRyYW5z
Zm9ybSB3YXMgYSBwZXJzcGVjdGl2ZQorICAgIC8vIHByb2plY3Rpb24gdGhhdCB3YXMgY2xpcHBl
ZCwgaXQgcmV0dXJucyBhIHJlY3QgdGhhdCBlbmNsb3NlcyB0aGUgY2xpcHBlZCBib3VuZHMuCisg
ICAgLy8gVW4tcHJvamVjdGluZyB0aGlzIG5ldyByZWN0IG1heSByZXF1aXJlIGNsaXBwaW5nIGFn
YWluLgorCisgICAgLy8gVGhpcyBzZXF1ZW5jZSBvZiB0cmFuc2Zvcm1zIGNhdXNlcyBvbmUgY29y
bmVyIG9mIHRoZSBsYXllciB0byBwcm90cnVkZSBhY3Jvc3MgdGhlIHcgPSAwIHBsYW5lLCBhbmQg
c2hvdWxkIGJlIGNsaXBwZWQuCisgICAgSW50UmVjdCB0YXJnZXRTdXJmYWNlUmVjdCA9IEludFJl
Y3QoSW50UG9pbnQoLTUwLCAtNTApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgSW50UmVjdCBs
YXllckNvbnRlbnRSZWN0ID0gSW50UmVjdChJbnRQb2ludCgtMTAsIC0xMCksIEludFNpemUoMjAs
IDIwKSk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm07
CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7CisgICAgbGF5ZXJU
b1N1cmZhY2VUcmFuc2Zvcm0uYXBwbHlQZXJzcGVjdGl2ZSgxKTsKKyAgICBsYXllclRvU3VyZmFj
ZVRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCAtNSk7CisgICAgbGF5ZXJUb1N1cmZhY2VUcmFu
c2Zvcm0ucm90YXRlM2QoMCwgNDUsIDApOworICAgIGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLnJv
dGF0ZTNkKDgwLCAwLCAwKTsKKworICAgIC8vIFNhbml0eSBjaGVjayB0aGF0IHVuLXByb2plY3Rp
b24gZG9lcyBpbmRlZWQgY2F1c2UgdyA8IDAsIG90aGVyd2lzZSB0aGlzIGNvZGUgaXMgbm90Cisg
ICAgLy8gdGVzdGluZyB0aGUgaW50ZW5kZWQgc2NlbmFyaW8uCisgICAgYm9vbCBjbGlwcGVkID0g
ZmFsc2U7CisgICAgRmxvYXRSZWN0IGNsaXBwZWRSZWN0ID0gQ0NNYXRoVXRpbDo6bWFwQ2xpcHBl
ZFJlY3QobGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0sIGxheWVyQ29udGVudFJlY3QpOworICAgIEND
TWF0aFV0aWw6OnByb2plY3RRdWFkKGxheWVyVG9TdXJmYWNlVHJhbnNmb3JtLmludmVyc2UoKSwg
RmxvYXRRdWFkKGNsaXBwZWRSZWN0KSwgY2xpcHBlZCk7CisgICAgQVNTRVJUX1RSVUUoY2xpcHBl
ZCk7CisKKyAgICAvLyBPbmx5IHRoZSBjb3JuZXIgb2YgdGhlIGxheWVyIGlzIG5vdCB2aXNpYmxl
IG9uIHRoZSBzdXJmYWNlIGJlY2F1c2Ugb2YgYmVpbmcKKyAgICAvLyBjbGlwcGVkLiBCdXQsIHRo
ZSBuZXQgcmVzdWx0IG9mIHJvdW5kaW5nIHZpc2libGUgcmVnaW9uIHRvIGFuIGF4aXMtYWxpZ25l
ZCByZWN0IGlzCisgICAgLy8gdGhhdCB0aGUgZW50aXJlIGxheWVyIHNob3VsZCBzdGlsbCBiZSBj
b25zaWRlcmVkIHZpc2libGUuCisgICAgSW50UmVjdCBleHBlY3RlZCA9IEludFJlY3QoSW50UG9p
bnQoLTEwLCAtMTApLCBJbnRTaXplKDIwLCAyMCkpOworICAgIEludFJlY3QgYWN0dWFsID0gQ0NM
YXllclRyZWVIb3N0Q29tbW9uOjpjYWxjdWxhdGVWaXNpYmxlUmVjdCh0YXJnZXRTdXJmYWNlUmVj
dCwgbGF5ZXJDb250ZW50UmVjdCwgbGF5ZXJUb1N1cmZhY2VUcmFuc2Zvcm0pOworICAgIEVYUEVD
VF9JTlRfUkVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKK30KKwogLy8gRklYTUU6CiAvLyBjb250
aW51ZSB3b3JraW5nIG9uIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02
ODk0MgogLy8gIC0gYWRkIGEgdGVzdCB0byB2ZXJpZnkgY2xpcHBpbmcgdGhhdCBjaGFuZ2VzIHRo
ZSAiY2VudGVyIHBvaW50Igo=
</data>

          </attachment>
      

    </bug>

</bugzilla>