<?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>83494</bug_id>
          
          <creation_ts>2012-04-09 11:58:21 -0700</creation_ts>
          <short_desc>[chromium] Make culling work with clipped rects</short_desc>
          <delta_ts>2012-04-09 15:52:49 -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>New Bugs</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>
          
          <blocked>81227</blocked>
    
    <blocked>83217</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dana Jansens">danakj</reporter>
          <assigned_to name="Dana Jansens">danakj</assigned_to>
          <cc>backer</cc>
    
    <cc>cc-bugs</cc>
    
    <cc>enne</cc>
    
    <cc>jamesr</cc>
    
    <cc>piman</cc>
    
    <cc>shawnsingh</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>598487</commentid>
    <comment_count>0</comment_count>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-04-09 11:58:21 -0700</bug_when>
    <thetext>Reattmpting to land this with fixed unit tests.

- CCQuadCuller tests were violating asserts by not setting the targetRenderSurface on all the layers.
- CCOcclusionTracker tests were failing randomly due to uninitialied &quot;clipped&quot; value if you called CCMathUtil::mapQuad() with an identity or translation matrix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598492</commentid>
    <comment_count>1</comment_count>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-04-09 12:00:12 -0700</bug_when>
    <thetext>here&apos;s the diff: 

diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp b/Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp
index f26e7c3..aa90e47 100644
--- a/Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp
+++ b/Source/WebCore/platform/graphics/chromium/cc/CCMathUtil.cpp
@@ -221,6 +221,7 @@ FloatQuad CCMathUtil::mapQuad(const TransformationMatrix&amp; transform, const Float
     if (transform.isIdentityOrTranslation()) {
         FloatQuad mappedQuad(q);
         mappedQuad.move(static_cast&lt;float&gt;(transform.m41()), static_cast&lt;float&gt;(transform.m42()));
+        clipped = false;
         return mappedQuad;
     }
 
diff --git a/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp b/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp
index 51cbc8b..aca196f 100644
--- a/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp
+++ b/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp
@@ -44,9 +44,6 @@ public:
         : CCOcclusionTrackerImpl(scissorRectInScreen, recordMetricsForFrame)
         , m_scissorRectInScreen(scissorRectInScreen)
     {
-        // Pretend we have visited the root render surface.
-        m_stack.append(StackObject());
-        m_stack.last().surface = new CCRenderSurface(0);
     }
 
 protected:
@@ -56,7 +53,7 @@ private:
     IntRect m_scissorRectInScreen;
 };
 
-static PassOwnPtr&lt;CCTiledLayerImpl&gt; makeLayer(const TransformationMatrix&amp; drawTransform, const IntRect&amp; layerRect, float opacity, bool opaque, const IntRect&amp; layerOpaqueRect)
+static PassOwnPtr&lt;CCTiledLayerImpl&gt; makeLayer(CCTiledLayerImpl* parent, const TransformationMatrix&amp; drawTransform, const IntRect&amp; layerRect, float opacity, bool opaque, const IntRect&amp; layerOpaqueRect)
 {
     OwnPtr&lt;CCTiledLayerImpl&gt; layer = CCTiledLayerImpl::create(0);
     OwnPtr&lt;CCLayerTilingData&gt; tiler = CCLayerTilingData::create(IntSize(100, 100), CCLayerTilingData::NoBorderTexels);
@@ -76,6 +73,12 @@ static PassOwnPtr&lt;CCTiledLayerImpl&gt; makeLayer(const TransformationMatrix&amp; drawTr
             layer-&gt;pushTileProperties(i, j, static_cast&lt;Platform3DObject&gt;(textureId++), tileOpaqueRect);
         }
 
+    if (!parent) {
+        layer-&gt;createRenderSurface();
+        layer-&gt;setTargetRenderSurface(layer-&gt;renderSurface());
+    } else
+        layer-&gt;setTargetRenderSurface(parent-&gt;targetRenderSurface());
+
     return layer.release();
 }
 
@@ -102,9 +105,10 @@ TEST(CCQuadCullerTest, verifyNoCulling)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     appendQuads(quadList, sharedStateList, rootLayer.get(), occlusionTracker);
@@ -118,9 +122,10 @@ TEST(CCQuadCullerTest, verifyCullChildLinesUpTopLeft)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -135,9 +140,10 @@ TEST(CCQuadCullerTest, verifyCullWhenChildOpacityNotOne)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 0.9, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 0.9, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -152,9 +158,10 @@ TEST(CCQuadCullerTest, verifyCullWhenChildOpaqueFlagFalse)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, false, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, false, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -171,9 +178,10 @@ TEST(CCQuadCullerTest, verifyCullCenterTileOnly)
 
     childTransform.translate(50, 50);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -214,9 +222,10 @@ TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize1)
 
     rootRect = childRect = IntRect(0, 0, 100, 100);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(rootTransform, rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, rootTransform, rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -242,9 +251,10 @@ TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize2)
 
     rootRect = childRect = IntRect(0, 0, 100, 100);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(rootTransform, rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, rootTransform, rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -262,9 +272,10 @@ TEST(CCQuadCullerTest, verifyCullChildLinesUpBottomRight)
 
     childTransform.translate(100, 100);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -281,10 +292,11 @@ TEST(CCQuadCullerTest, verifyCullSubRegion)
 
     childTransform.translate(50, 50);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
     IntRect childOpaqueRect(childRect.x() + childRect.width() / 4, childRect.y() + childRect.height() / 4, childRect.width() / 2, childRect.height() / 2);
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, false, childOpaqueRect);
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, false, childOpaqueRect);
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -301,10 +313,11 @@ TEST(CCQuadCullerTest, verifyCullSubRegion2)
 
     childTransform.translate(50, 10);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
     IntRect childOpaqueRect(childRect.x() + childRect.width() / 4, childRect.y() + childRect.height() / 4, childRect.width() / 2, childRect.height() * 3 / 4);
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, false, childOpaqueRect);
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, false, childOpaqueRect);
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -321,10 +334,11 @@ TEST(CCQuadCullerTest, verifyCullSubRegionCheckOvercull)
 
     childTransform.translate(50, 49);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
     IntRect childOpaqueRect(childRect.x() + childRect.width() / 4, childRect.y() + childRect.height() / 4, childRect.width() / 2, childRect.height() / 2);
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, false, childOpaqueRect);
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, false, childOpaqueRect);
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -342,9 +356,10 @@ TEST(CCQuadCullerTest, verifyNonAxisAlignedQuadsDontOcclude)
     // Use a small rotation so as to not disturb the geometry significantly.
     childTransform.rotate(1);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(childTransform, childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), childTransform, childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -368,9 +383,10 @@ TEST(CCQuadCullerTest, verifyNonAxisAlignedQuadsSafelyCulled)
     TransformationMatrix parentTransform;
     parentTransform.rotate(1);
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(parentTransform, rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, parentTransform, rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -385,9 +401,10 @@ TEST(CCQuadCullerTest, verifyCullOutsideScissorOverTile)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(200, 100, 100, 100));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -402,9 +419,10 @@ TEST(CCQuadCullerTest, verifyCullOutsideScissorOverCulledTile)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(100, 100, 100, 100));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -419,9 +437,10 @@ TEST(CCQuadCullerTest, verifyCullOutsideScissorOverPartialTiles)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(50, 50, 200, 200));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -436,9 +455,10 @@ TEST(CCQuadCullerTest, verifyCullOutsideScissorOverNoTiles)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(500, 500, 100, 100));
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());
@@ -453,9 +473,10 @@ TEST(CCQuadCullerTest, verifyWithoutMetrics)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
-    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(TransformationMatrix(), rootRect, 1.0, true, IntRect());
-    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(TransformationMatrix(), childRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; rootLayer = makeLayer(0, TransformationMatrix(), rootRect, 1.0, true, IntRect());
+    OwnPtr&lt;CCTiledLayerImpl&gt; childLayer = makeLayer(rootLayer.get(), TransformationMatrix(), childRect, 1.0, true, IntRect());
     TestCCOcclusionTrackerImpl occlusionTracker(IntRect(50, 50, 200, 200), false);
+    occlusionTracker.enterTargetRenderSurface(rootLayer-&gt;renderSurface());
 
     appendQuads(quadList, sharedStateList, childLayer.get(), occlusionTracker);
     occlusionTracker.markOccludedBehindLayer(childLayer.get());</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598494</commentid>
    <comment_count>2</comment_count>
      <attachid>136280</attachid>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-04-09 12:03:36 -0700</bug_when>
    <thetext>Created attachment 136280
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598514</commentid>
    <comment_count>3</comment_count>
      <attachid>136280</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2012-04-09 12:27:58 -0700</bug_when>
    <thetext>Comment on attachment 136280
Patch

Attachment 136280 did not pass mac-ews (mac):
Output: http://queues.webkit.org/results/12368316</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598521</commentid>
    <comment_count>4</comment_count>
      <attachid>136280</attachid>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-04-09 12:31:22 -0700</bug_when>
    <thetext>Comment on attachment 136280
Patch

The mac bot segfaulted in make

make: *** [DOMCSSValueList.h] Segmentation fault: 11

I can reupload if you like?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598535</commentid>
    <comment_count>5</comment_count>
      <attachid>136280</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-04-09 12:40:45 -0700</bug_when>
    <thetext>Comment on attachment 136280
Patch

R=me. Thanks for the diff.  I like that this makes the tests a little bit more real, too.

No need to reupload, the CQ will yell, and there aren&apos;t changes that affect mac here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598702</commentid>
    <comment_count>6</comment_count>
      <attachid>136280</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-09 15:52:44 -0700</bug_when>
    <thetext>Comment on attachment 136280
Patch

Clearing flags on attachment: 136280

Committed r113637: &lt;http://trac.webkit.org/changeset/113637&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>598703</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-04-09 15:52:49 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>136280</attachid>
            <date>2012-04-09 12:03:36 -0700</date>
            <delta_ts>2012-04-09 15:52:43 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-83494-20120409150334.patch</filename>
            <type>text/plain</type>
            <size>32552</size>
            <attacher name="Dana Jansens">danakj</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEzNTk3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGNlZDg3NzIxZDlmZmFl
NTRlNDg1OTlhNjRlZjc5Nzk5YmM1M2Q1OS4uNzkzNjNkNzJhZmUyZmU5NzdkODkxNjQxODc5NThh
Y2YwYTEyY2UxNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM2IEBACisyMDEyLTA0LTA5ICBEYW5h
IEphbnNlbnMgIDxkYW5ha2pAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gTWFr
ZSBjdWxsaW5nIHdvcmsgd2l0aCBjbGlwcGVkIHJlY3RzCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MzQ5NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFVzZSBuZXcgQ0NNYXRoVXRpbCB0cmFuc2Zvcm1hdGlv
biBtZXRob2RzIHRvIGRlYWwgd2l0aCByZWN0cyB0aGF0IGNsaXAKKyAgICAgICAgdGhlIGNhbWVy
YSBwbGFuZS4gVGhpcyBmaXhlcyB0aHJlZSB0aGluZ3M6CisKKyAgICAgICAgMS4gQSBsYXllciBj
b21wbGV0ZWx5IGJlaGluZCB0aGUgY2FtZXJhIGlzIG5vdCB2aXNpYmxlIGFuZCBzaG91bGQgbm90
CisgICAgICAgIG9jY2x1ZGUuCisgICAgICAgIDIuIEEgbGF5ZXIgdGhhdCBpcyBjbGlwcGVkIGJ5
IHRoZSBjYW1lcmEgaXMgdHJlYXRlZCBsaWtlIGEKKyAgICAgICAgbm9uLWF4aXMtYWxpZ25lZCB0
cmFuc2Zvcm0sIGFzIHRoZSByZXN1bHQgb2YgYSBtYXBDbGlwcGVkUmVjdCgpIGlzIGEKKyAgICAg
ICAgYm91bmRpbmcgYm94IGFuZCBtYXkgY29udGFpbiBwaXhlbHMgbm90IGluIHRoZSBvcmlnaW5h
bCByZWN0LiBUaGlzIGd1YXJkcworICAgICAgICBvdXIgdXNlIG9mIG1hcFJlY3QoKSB3aGVuIHRy
YW5zZm9ybWluZyBvY2NsdWRlZCByZWdpb25zLgorICAgICAgICAzLiBBIGxheWVyJ3Mgb2NjbHVz
aW9uIG11c3QgYmUgY2xpcHBlZCBieSBpdHMgc2Npc3NvciByZWN0LiBUaGlzIHNjaXNzb3IKKyAg
ICAgICAgcmVjdCBleGlzdHMgaW4gaXRzIHRhcmdldCBzcGFjZSwgc28gb2NjbHVzaW9uIGluIHNj
cmVlbiBzcGFjZSBpcyBvbmx5CisgICAgICAgIHBvc3NpYmxlIGlmIGl0cyB0YXJnZXQgYWxzbyBp
cyBheGlzIGFsaWduZWQgaW4gdGhlIHNjcmVlbiwgc3VjaCB0aGF0CisgICAgICAgIHRoZSBsYXll
cidzIHNjaXNzb3IgcmVjdCByZW1haW5zIGEgcmVjdCBpbiBzY3JlZW4gc3BhY2UuCisKKyAgICAg
ICAgVW5pdCB0ZXN0czogQ0NPY2NsdXNpb25UcmFja2VyVGVzdExheWVyQmVoaW5kQ2FtZXJhRG9l
c05vdE9jY2x1ZGUKKyAgICAgICAgICAgICAgICAgICAgQ0NPY2NsdXNpb25UcmFja2VyVGVzdExh
cmdlUGl4ZWxzT2NjbHVkZUluc2lkZUNsaXBSZWN0CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ01hdGhVdGlsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTWF0
aFV0aWw6Om1hcFF1YWQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDT2NjbHVzaW9uVHJhY2tlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjp0cmFuc2Zvcm1TdXJm
YWNlT3BhcXVlUmVnaW9uKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1dGVPY2NsdXNpb25CZWhp
bmRMYXllcik6CisgICAgICAgIChXZWJDb3JlOjo6Om1hcmtPY2NsdWRlZEJlaGluZExheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OnRlc3RDb250ZW50UmVjdE9jY2x1ZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OmNvbXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QpOgorCiAyMDEyLTA0LTA5ICBBYmhp
c2hlayBBcnlhICA8aW5mZXJub0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgQ3Jhc2ggZHVlIHRv
IGZsb2F0cyBub3QgY2xlYXJlZCBiZWZvcmUgc3RhcnRpbmcgU1ZHIDx0ZXh0PiBsYXlvdXQuCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4IGUzZDgzOThhY2E3ODExOTIwMmQ4ZjJmNTRjZGQw
YWU4OTExM2ZiMjUuLjQ3YTg0ZmRjYjNiNWU4MDVkNjJkMjM0YjY3M2JmYmVhZjlhMmEyZmMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTItMDQtMDkgIERh
bmEgSmFuc2VucyAgPGRhbmFrakBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBN
YWtlIGN1bGxpbmcgd29yayB3aXRoIGNsaXBwZWQgcmVjdHMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgzNDk0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiB0ZXN0cy9DQ09jY2x1c2lvblRyYWNrZXJUZXN0
LmNwcDoKKyAgICAgICAgKENDT2NjbHVzaW9uVHJhY2tlclRlc3RMYXllckJlaGluZENhbWVyYURv
ZXNOb3RPY2NsdWRlKToKKyAgICAgICAgKFdlYktpdFRlc3RzOjpDQ09jY2x1c2lvblRyYWNrZXJU
ZXN0TGF5ZXJCZWhpbmRDYW1lcmFEb2VzTm90T2NjbHVkZTo6cnVuTXlUZXN0KToKKyAgICAgICAg
KFdlYktpdFRlc3RzKToKKyAgICAgICAgKENDT2NjbHVzaW9uVHJhY2tlclRlc3RMYXJnZVBpeGVs
c09jY2x1ZGVJbnNpZGVDbGlwUmVjdCk6CisgICAgICAgIChXZWJLaXRUZXN0czo6Q0NPY2NsdXNp
b25UcmFja2VyVGVzdExhcmdlUGl4ZWxzT2NjbHVkZUluc2lkZUNsaXBSZWN0OjpydW5NeVRlc3Qp
OgorICAgICAgICAqIHRlc3RzL0NDUXVhZEN1bGxlclRlc3QuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6VGVzdENDT2NjbHVzaW9uVHJhY2tlckltcGw6OlRlc3RDQ09jY2x1c2lvblRyYWNrZXJJbXBs
KToKKyAgICAgICAgKFdlYkNvcmU6Om1ha2VMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpURVNU
KToKKwogMjAxMi0wNC0wOSAgU2hlcmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJvdEBnbWFpbC5j
b20+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGluZyBvdXQgcjExMzU2MS4KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTWF0aFV0
aWwuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NN
YXRoVXRpbC5jcHAKaW5kZXggZjI2ZTdjMzI4MjhiZjU0Njg3NDlmZjA0ZGZiMGU3NjU4Y2EwY2Jm
Zi4uYWE5MGU0NzBjM2E3NzE3ZGNhYzQ3NTA2MDVkOTViYTNhZDVkZDQ2MSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NNYXRoVXRpbC5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NN
YXRoVXRpbC5jcHAKQEAgLTIyMSw2ICsyMjEsNyBAQCBGbG9hdFF1YWQgQ0NNYXRoVXRpbDo6bWFw
UXVhZChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdAog
ICAgIGlmICh0cmFuc2Zvcm0uaXNJZGVudGl0eU9yVHJhbnNsYXRpb24oKSkgewogICAgICAgICBG
bG9hdFF1YWQgbWFwcGVkUXVhZChxKTsKICAgICAgICAgbWFwcGVkUXVhZC5tb3ZlKHN0YXRpY19j
YXN0PGZsb2F0Pih0cmFuc2Zvcm0ubTQxKCkpLCBzdGF0aWNfY2FzdDxmbG9hdD4odHJhbnNmb3Jt
Lm00MigpKSk7CisgICAgICAgIGNsaXBwZWQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIG1hcHBl
ZFF1YWQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NPY2NsdXNpb25UcmFja2VyLmNwcAppbmRl
eCBlMDRhZGZhMzEzNmE0ZjA5ZWVhMjhkOGIyMDUxYTNmYjQ2YzY3NzNlLi5jZjc2YmRmNjNiY2Zj
MmI4M2E5NTRkN2VmN2JiYjk2ZjdkMmM5YzE0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ09jY2x1c2lvblRyYWNrZXIuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDT2NjbHVzaW9u
VHJhY2tlci5jcHAKQEAgLTExNSwxMyArMTE1LDE2IEBAIHN0YXRpYyBpbmxpbmUgUmVnaW9uIHRy
YW5zZm9ybVN1cmZhY2VPcGFxdWVSZWdpb24oY29uc3QgUmVuZGVyU3VyZmFjZVR5cGUqIHN1cmZh
CiAgICAgLy8gVmVyaWZ5IHRoYXQgcmVjdHMgd2l0aGluIHRoZSB8c3VyZmFjZXwgd2lsbCByZW1h
aW4gcmVjdHMgaW4gaXRzIHRhcmdldCBzdXJmYWNlIGFmdGVyIGFwcGx5aW5nIHx0cmFuc2Zvcm18
LiBJZiB0aGlzIGlzIHRydWUsIHRoZW4KICAgICAvLyBhcHBseSB8dHJhbnNmb3JtfCB0byBlYWNo
IHJlY3Qgd2l0aGluIHxyZWdpb258IGluIG9yZGVyIHRvIHRyYW5zZm9ybSB0aGUgZW50aXJlIFJl
Z2lvbi4KIAotICAgIEZsb2F0UXVhZCB0cmFuc2Zvcm1lZEJvdW5kc1F1YWQgPSB0cmFuc2Zvcm0u
bWFwUXVhZChGbG9hdFF1YWQocmVnaW9uLmJvdW5kcygpKSk7Ci0gICAgaWYgKCF0cmFuc2Zvcm1l
ZEJvdW5kc1F1YWQuaXNSZWN0aWxpbmVhcigpKQorICAgIGJvb2wgY2xpcHBlZDsKKyAgICBGbG9h
dFF1YWQgdHJhbnNmb3JtZWRCb3VuZHNRdWFkID0gQ0NNYXRoVXRpbDo6bWFwUXVhZCh0cmFuc2Zv
cm0sIEZsb2F0UXVhZChyZWdpb24uYm91bmRzKCkpLCBjbGlwcGVkKTsKKyAgICAvLyBGSVhNRTog
RmluZCBhIHJlY3QgaW50ZXJpb3IgdG8gZWFjaCB0cmFuc2Zvcm1lZCBxdWFkLgorICAgIGlmIChj
bGlwcGVkIHx8ICF0cmFuc2Zvcm1lZEJvdW5kc1F1YWQuaXNSZWN0aWxpbmVhcigpKQogICAgICAg
ICByZXR1cm4gUmVnaW9uKCk7CiAKICAgICBSZWdpb24gdHJhbnNmb3JtZWRSZWdpb247CiAKICAg
ICBWZWN0b3I8SW50UmVjdD4gcmVjdHMgPSByZWdpb24ucmVjdHMoKTsKKyAgICAvLyBDbGlwcGlu
ZyBoYXMgYmVlbiB2ZXJpZmllZCBhYm92ZSwgc28gbWFwUmVjdCB3aWxsIGdpdmUgY29ycmVjdCBy
ZXN1bHRzLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyArK2kpCiAg
ICAgICAgIHRyYW5zZm9ybWVkUmVnaW9uLnVuaXRlKGVuY2xvc2VkSW50UmVjdCh0cmFuc2Zvcm0u
bWFwUmVjdChGbG9hdFJlY3QocmVjdHNbaV0pKSkpOwogICAgIHJldHVybiB0cmFuc2Zvcm1lZFJl
Z2lvbjsKQEAgLTE5NSwxMyArMTk4LDE1IEBAIHN0YXRpYyBpbmxpbmUgVHJhbnNmb3JtYXRpb25N
YXRyaXggY29udGVudFRvVGFyZ2V0U3VyZmFjZVRyYW5zZm9ybShjb25zdCBMYXllclR5CiAKIC8v
IEZJWE1FOiBSZW1vdmUgdXNlUGFpbnRUcmFja2luZyB3aGVuIHBhaW50IHRyYWNraW5nIGlzIG9u
IGZvciBwYWludCBjdWxsaW5nLgogdGVtcGxhdGU8dHlwZW5hbWUgTGF5ZXJUeXBlPgotc3RhdGlj
IGlubGluZSBSZWdpb24gY29tcHV0ZU9jY2x1c2lvbkJlaGluZExheWVyKGNvbnN0IExheWVyVHlw
ZSogbGF5ZXIsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0sIGJvb2wgdXNl
UGFpbnRUcmFja2luZykKK3N0YXRpYyBpbmxpbmUgUmVnaW9uIGNvbXB1dGVPY2NsdXNpb25CZWhp
bmRMYXllcihjb25zdCBMYXllclR5cGUqIGxheWVyLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgdHJhbnNmb3JtLCBjb25zdCBJbnRSZWN0JiBzY2lzc29yUmVjdCwgYm9vbCB1c2VQYWludFRy
YWNraW5nKQogewogICAgIFJlZ2lvbiBvcGFxdWVSZWdpb247CiAKLSAgICBGbG9hdFF1YWQgdW5v
Y2NsdWRlZFF1YWQgPSB0cmFuc2Zvcm0ubWFwUXVhZChGbG9hdFF1YWQobGF5ZXItPnZpc2libGVM
YXllclJlY3QoKSkpOworICAgIGJvb2wgY2xpcHBlZDsKKyAgICBGbG9hdFF1YWQgdW5vY2NsdWRl
ZFF1YWQgPSBDQ01hdGhVdGlsOjptYXBRdWFkKHRyYW5zZm9ybSwgRmxvYXRRdWFkKGxheWVyLT52
aXNpYmxlTGF5ZXJSZWN0KCkpLCBjbGlwcGVkKTsKICAgICBib29sIGlzUGFpbnRlZEF4aXNBbGln
bmVkID0gdW5vY2NsdWRlZFF1YWQuaXNSZWN0aWxpbmVhcigpOwotICAgIGlmICghaXNQYWludGVk
QXhpc0FsaWduZWQpCisgICAgLy8gRklYTUU6IEZpbmQgYSByZWN0IGludGVyaW9yIHRvIGVhY2gg
dHJhbnNmb3JtZWQgcXVhZC4KKyAgICBpZiAoY2xpcHBlZCB8fCAhaXNQYWludGVkQXhpc0FsaWdu
ZWQpCiAgICAgICAgIHJldHVybiBvcGFxdWVSZWdpb247CiAKICAgICBpZiAobGF5ZXItPm9wYXF1
ZSgpKQpAQCAtMjExLDkgKzIxNiwxMSBAQCBzdGF0aWMgaW5saW5lIFJlZ2lvbiBjb21wdXRlT2Nj
bHVzaW9uQmVoaW5kTGF5ZXIoY29uc3QgTGF5ZXJUeXBlKiBsYXllciwgY29uc3QgVAogICAgIGVs
c2UgaWYgKHVzZVBhaW50VHJhY2tpbmcpIHsKICAgICAgICAgUmVnaW9uIGNvbnRlbnRSZWdpb24g
PSBsYXllci0+dmlzaWJsZUNvbnRlbnRPcGFxdWVSZWdpb24oKTsKICAgICAgICAgVmVjdG9yPElu
dFJlY3Q+IGNvbnRlbnRSZWN0cyA9IGNvbnRlbnRSZWdpb24ucmVjdHMoKTsKKyAgICAgICAgLy8g
V2UgdmVyaWZ5IHRoYXQgdGhlIHBvc3NpYmxlIGJvdW5kcyBvZiB0aGlzIHJlZ2lvbiBhcmUgbm90
IGNsaXBwZWQgYWJvdmUsIHNvIHdlIGNhbiB1c2UgbWFwUmVjdCgpIHNhZmVseSBoZXJlLgogICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnRlbnRSZWN0cy5zaXplKCk7ICsraSkKICAg
ICAgICAgICAgIG9wYXF1ZVJlZ2lvbi51bml0ZShlbmNsb3NlZEludFJlY3QodHJhbnNmb3JtLm1h
cFJlY3QoRmxvYXRSZWN0KGNvbnRlbnRSZWN0c1tpXSkpKSk7CiAgICAgfQorICAgIG9wYXF1ZVJl
Z2lvbi5pbnRlcnNlY3Qoc2Npc3NvclJlY3QpOwogICAgIHJldHVybiBvcGFxdWVSZWdpb247CiB9
CiAKQEAgLTIyOCwxNiArMjM1LDI2IEBAIHZvaWQgQ0NPY2NsdXNpb25UcmFja2VyQmFzZTxMYXll
clR5cGUsIFJlbmRlclN1cmZhY2VUeXBlPjo6bWFya09jY2x1ZGVkQmVoaW5kTGF5CiAgICAgaWYg
KCFsYXllck9wYWNpdHlLbm93bihsYXllcikgfHwgbGF5ZXItPmRyYXdPcGFjaXR5KCkgPCAxKQog
ICAgICAgICByZXR1cm47CiAKLSAgICAvLyBGSVhNRTogUmVtb3ZlIG1fdXNlUGFpbnRUcmFja2lu
ZyB3aGVuIHBhaW50IHRyYWNraW5nIGlzIG9uIGZvciBwYWludCBjdWxsaW5nLgotICAgIGlmIChs
YXllclRyYW5zZm9ybXNUb1NjcmVlbktub3duKGxheWVyKSkKLSAgICAgICAgbV9zdGFjay5sYXN0
KCkub2NjbHVzaW9uSW5TY3JlZW4udW5pdGUoY29tcHV0ZU9jY2x1c2lvbkJlaGluZExheWVyPExh
eWVyVHlwZT4obGF5ZXIsIGNvbnRlbnRUb1NjcmVlblNwYWNlVHJhbnNmb3JtPExheWVyVHlwZT4o
bGF5ZXIpLCBtX3VzZVBhaW50VHJhY2tpbmcpKTsKKyAgICBJbnRSZWN0IHNjaXNzb3JJblRhcmdl
dCA9IGxheWVyU2Npc3NvclJlY3RJblRhcmdldFN1cmZhY2UobGF5ZXIpOwogICAgIGlmIChsYXll
clRyYW5zZm9ybXNUb1RhcmdldEtub3duKGxheWVyKSkKLSAgICAgICAgbV9zdGFjay5sYXN0KCku
b2NjbHVzaW9uSW5UYXJnZXQudW5pdGUoY29tcHV0ZU9jY2x1c2lvbkJlaGluZExheWVyPExheWVy
VHlwZT4obGF5ZXIsIGNvbnRlbnRUb1RhcmdldFN1cmZhY2VUcmFuc2Zvcm08TGF5ZXJUeXBlPihs
YXllciksIG1fdXNlUGFpbnRUcmFja2luZykpOworICAgICAgICBtX3N0YWNrLmxhc3QoKS5vY2Ns
dXNpb25JblRhcmdldC51bml0ZShjb21wdXRlT2NjbHVzaW9uQmVoaW5kTGF5ZXI8TGF5ZXJUeXBl
PihsYXllciwgY29udGVudFRvVGFyZ2V0U3VyZmFjZVRyYW5zZm9ybTxMYXllclR5cGU+KGxheWVy
KSwgc2Npc3NvckluVGFyZ2V0LCBtX3VzZVBhaW50VHJhY2tpbmcpKTsKKworICAgIC8vIFdlIG11
c3QgY2xpcCB0aGUgb2NjbHVzaW9uIHdpdGhpbiB0aGUgbGF5ZXIncyBzY2lzc29ySW5UYXJnZXQg
d2l0aGluIHNjcmVlbiBzcGFjZSBhcyB3ZWxsLiBJZiB0aGUgc2Npc3NvciByZWN0IGNhbid0IGJl
IG1vdmVkIHRvIHNjcmVlbiBzcGFjZSBhbmQKKyAgICAvLyByZW1haW4gcmVjdGlsaW5lYXIsIHRo
ZW4gd2UgZG9uJ3QgYWRkIGFueSBvY2NsdXNpb24gaW4gc2NyZWVuIHNwYWNlLgorCisgICAgaWYg
KGxheWVyVHJhbnNmb3Jtc1RvU2NyZWVuS25vd24obGF5ZXIpKSB7CisgICAgICAgIFRyYW5zZm9y
bWF0aW9uTWF0cml4IHRhcmdldFRvU2NyZWVuVHJhbnNmb3JtID0gbV9zdGFjay5sYXN0KCkuc3Vy
ZmFjZS0+c2NyZWVuU3BhY2VUcmFuc2Zvcm0oKTsKKyAgICAgICAgRmxvYXRRdWFkIHNjaXNzb3JJ
blNjcmVlblF1YWQgPSB0YXJnZXRUb1NjcmVlblRyYW5zZm9ybS5tYXBRdWFkKEZsb2F0UXVhZChG
bG9hdFJlY3Qoc2Npc3NvckluVGFyZ2V0KSkpOworICAgICAgICBpZiAoIXNjaXNzb3JJblNjcmVl
blF1YWQuaXNSZWN0aWxpbmVhcigpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBJbnRS
ZWN0IHNjaXNzb3JJblNjcmVlblJlY3QgPSBpbnRlcnNlY3Rpb24obV9zY2lzc29yUmVjdEluU2Ny
ZWVuU3BhY2UsIGVuY2xvc2VkSW50UmVjdChDQ01hdGhVdGlsOjptYXBDbGlwcGVkUmVjdCh0YXJn
ZXRUb1NjcmVlblRyYW5zZm9ybSwgRmxvYXRSZWN0KHNjaXNzb3JJblRhcmdldCkpKSk7CisgICAg
ICAgIG1fc3RhY2subGFzdCgpLm9jY2x1c2lvbkluU2NyZWVuLnVuaXRlKGNvbXB1dGVPY2NsdXNp
b25CZWhpbmRMYXllcjxMYXllclR5cGU+KGxheWVyLCBjb250ZW50VG9TY3JlZW5TcGFjZVRyYW5z
Zm9ybTxMYXllclR5cGU+KGxheWVyKSwgc2Npc3NvckluU2NyZWVuUmVjdCwgbV91c2VQYWludFRy
YWNraW5nKSk7CisgICAgfQogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgdGVzdENvbnRlbnRSZWN0
T2NjbHVkZWQoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QsIGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiBjb250ZW50U3BhY2VUcmFuc2Zvcm0sIGNvbnN0IEludFJlY3QmIHNjaXNzb3JSZWN0
LCBjb25zdCBSZWdpb24mIG9jY2x1c2lvbikKIHsKLSAgICBGbG9hdFJlY3QgdHJhbnNmb3JtZWRS
ZWN0ID0gY29udGVudFNwYWNlVHJhbnNmb3JtLm1hcFJlY3QoRmxvYXRSZWN0KGNvbnRlbnRSZWN0
KSk7CisgICAgRmxvYXRSZWN0IHRyYW5zZm9ybWVkUmVjdCA9IENDTWF0aFV0aWw6Om1hcENsaXBw
ZWRSZWN0KGNvbnRlbnRTcGFjZVRyYW5zZm9ybSwgRmxvYXRSZWN0KGNvbnRlbnRSZWN0KSk7CiAg
ICAgLy8gVGFrZSB0aGUgZW5jbG9zaW5nSW50UmVjdCwgYXMgd2Ugd2FudCB0byBpbmNsdWRlIHBh
cnRpYWwgcGl4ZWxzIGluIHRoZSB0ZXN0LgogICAgIEludFJlY3QgdGFyZ2V0UmVjdCA9IGludGVy
c2VjdGlvbihlbmNsb3NpbmdJbnRSZWN0KHRyYW5zZm9ybWVkUmVjdCksIHNjaXNzb3JSZWN0KTsK
ICAgICByZXR1cm4gdGFyZ2V0UmVjdC5pc0VtcHR5KCkgfHwgb2NjbHVzaW9uLmNvbnRhaW5zKHRh
cmdldFJlY3QpOwpAQCAtMjgxLDEzICsyOTgsMTAgQEAgc3RhdGljIGlubGluZSBJbnRSZWN0IGNv
bXB1dGVVbm9jY2x1ZGVkQ29udGVudFJlY3QoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QsIGMK
ICAgICBpZiAoIWNvbnRlbnRTcGFjZVRyYW5zZm9ybS5pc0ludmVydGlibGUoKSkKICAgICAgICAg
cmV0dXJuIGNvbnRlbnRSZWN0OwogCi0gICAgRmxvYXRSZWN0IHRyYW5zZm9ybWVkUmVjdCA9IGNv
bnRlbnRTcGFjZVRyYW5zZm9ybS5tYXBSZWN0KEZsb2F0UmVjdChjb250ZW50UmVjdCkpOwogICAg
IC8vIFRha2UgdGhlIGVuY2xvc2luZ0ludFJlY3QgYXQgZWFjaCBzdGVwLCBhcyB3ZSB3YW50IHRv
IGNvbnRhaW4gYW55IHVub2NjbHVkZWQgcGFydGlhbCBwaXhlbHMgaW4gdGhlIHJlc3VsdGluZyBJ
bnRSZWN0LgorICAgIEZsb2F0UmVjdCB0cmFuc2Zvcm1lZFJlY3QgPSBDQ01hdGhVdGlsOjptYXBD
bGlwcGVkUmVjdChjb250ZW50U3BhY2VUcmFuc2Zvcm0sIEZsb2F0UmVjdChjb250ZW50UmVjdCkp
OwogICAgIEludFJlY3Qgc2hydW5rUmVjdCA9IHJlY3RTdWJ0cmFjdFJlZ2lvbihpbnRlcnNlY3Rp
b24oZW5jbG9zaW5nSW50UmVjdCh0cmFuc2Zvcm1lZFJlY3QpLCBzY2lzc29yUmVjdCksIG9jY2x1
c2lvbik7Ci0gICAgYm9vbCBjbGlwcGVkOyAvLyBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8g
dXNlIHByb2plY3RDbGlwcGVkUXVhZCBpbnN0ZWFkIG9mIGZvcmNpbmcgZXZlcnl0aGluZyB0byBi
ZSB1bm9jY2x1ZGVkLiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODMy
MTcuCi0gICAgSW50UmVjdCB1bm9jY2x1ZGVkUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoQ0NNYXRo
VXRpbDo6cHJvamVjdFF1YWQoY29udGVudFNwYWNlVHJhbnNmb3JtLmludmVyc2UoKSwgRmxvYXRR
dWFkKEZsb2F0UmVjdChzaHJ1bmtSZWN0KSksIGNsaXBwZWQpLmJvdW5kaW5nQm94KCkpOwotICAg
IGlmIChjbGlwcGVkKQotICAgICAgICByZXR1cm4gY29udGVudFJlY3Q7CisgICAgSW50UmVjdCB1
bm9jY2x1ZGVkUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoQ0NNYXRoVXRpbDo6cHJvamVjdENsaXBw
ZWRSZWN0KGNvbnRlbnRTcGFjZVRyYW5zZm9ybS5pbnZlcnNlKCksIEZsb2F0UmVjdChzaHJ1bmtS
ZWN0KSkpOwogICAgIC8vIFRoZSByZWN0IGJhY2sgaW4gY29udGVudCBzcGFjZSBpcyBhIGJvdW5k
aW5nIGJveCBhbmQgbWF5IGV4dGVuZCBvdXRzaWRlIG9mIHRoZSBvcmlnaW5hbCBjb250ZW50UmVj
dCwgc28gY2xhbXAgaXQgdG8gdGhlIGNvbnRlbnRSZWN0Qm91bmRzLgogICAgIHJldHVybiBpbnRl
cnNlY3Rpb24odW5vY2NsdWRlZFJlY3QsIGNvbnRlbnRSZWN0KTsKIH0KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NPY2NsdXNpb25UcmFja2VyVGVzdC5jcHAgYi9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDT2NjbHVzaW9uVHJhY2tlclRlc3QuY3BwCmlu
ZGV4IGNjYmIwYzJiNzVjZDViZDZlZmUyMjUzYjQwYTI2MzA5NjM2OWFmNDEuLmIxYTZmM2E5ZTNh
NTA1OWNhMWRhYzdjODVmODJlY2NhZGNiN2Y5MjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vdGVzdHMvQ0NPY2NsdXNpb25UcmFja2VyVGVzdC5jcHAKKysrIGIvU291cmNlL1dl
YktpdC9jaHJvbWl1bS90ZXN0cy9DQ09jY2x1c2lvblRyYWNrZXJUZXN0LmNwcApAQCAtMTY3NCw2
ICsxNjc0LDY1IEBAIHByb3RlY3RlZDoKIE1BSU5fVEhSRUFEX1RFU1QoQ0NPY2NsdXNpb25UcmFj
a2VyVGVzdFBlcnNwZWN0aXZlVHJhbnNmb3JtQmVoaW5kQ2FtZXJhKTsKIAogdGVtcGxhdGU8Y2xh
c3MgVHlwZXMsIGJvb2wgb3BhcXVlTGF5ZXJzPgorY2xhc3MgQ0NPY2NsdXNpb25UcmFja2VyVGVz
dExheWVyQmVoaW5kQ2FtZXJhRG9lc05vdE9jY2x1ZGUgOiBwdWJsaWMgQ0NPY2NsdXNpb25UcmFj
a2VyVGVzdDxUeXBlcywgb3BhcXVlTGF5ZXJzPiB7Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBydW5N
eVRlc3QoKQorICAgIHsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtOwor
ICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKDUwLCA1MCk7CisgICAgICAgIHRyYW5zZm9ybS5h
cHBseVBlcnNwZWN0aXZlKDEwMCk7CisgICAgICAgIHRyYW5zZm9ybS50cmFuc2xhdGUzZCgwLCAw
LCAxMTApOworICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKC01MCwgLTUwKTsKKworICAgICAg
ICB0eXBlbmFtZSBUeXBlczo6Q29udGVudExheWVyVHlwZSogcGFyZW50ID0gdGhpcy0+Y3JlYXRl
Um9vdCh0aGlzLT5pZGVudGl0eU1hdHJpeCwgRmxvYXRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAs
IDEwMCkpOworICAgICAgICB0eXBlbmFtZSBUeXBlczo6Q29udGVudExheWVyVHlwZSogbGF5ZXIg
PSB0aGlzLT5jcmVhdGVEcmF3aW5nTGF5ZXIocGFyZW50LCB0cmFuc2Zvcm0sIEZsb2F0UG9pbnQo
MCwgMCksIEludFNpemUoMTAwLCAxMDApLCB0cnVlKTsKKyAgICAgICAgcGFyZW50LT5zZXRQcmVz
ZXJ2ZXMzRCh0cnVlKTsKKyAgICAgICAgdGhpcy0+Y2FsY0RyYXdFdGMocGFyZW50KTsKKworICAg
ICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2VyV2l0aFNjaXNzb3I8dHlwZW5hbWUgVHlwZXM6Okxh
eWVyVHlwZSwgdHlwZW5hbWUgVHlwZXM6OlJlbmRlclN1cmZhY2VUeXBlPiBvY2NsdXNpb24oSW50
UmVjdCgwLCAwLCAxMDAwLCAxMDAwKSk7CisgICAgICAgIG9jY2x1c2lvbi5lbnRlclRhcmdldFJl
bmRlclN1cmZhY2UocGFyZW50LT5yZW5kZXJTdXJmYWNlKCkpOworCisgICAgICAgIC8vIFRoaXMg
bGF5ZXIgaXMgZW50aXJlbHkgYmVoaW5kIHRoZSBjYW1lcmEgYW5kIHNob3VsZCBub3Qgb2NjbHVk
ZS4KKyAgICAgICAgb2NjbHVzaW9uLm1hcmtPY2NsdWRlZEJlaGluZExheWVyKGxheWVyKTsKKyAg
ICAgICAgRVhQRUNUX0VRKDB1LCBvY2NsdXNpb24ub2NjbHVzaW9uSW5UYXJnZXRTdXJmYWNlKCku
cmVjdHMoKS5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIG9jY2x1c2lvbi5vY2NsdXNp
b25JblNjcmVlblNwYWNlKCkucmVjdHMoKS5zaXplKCkpOworICAgIH0KK307CisKK01BSU5fVEhS
RUFEX1RFU1QoQ0NPY2NsdXNpb25UcmFja2VyVGVzdExheWVyQmVoaW5kQ2FtZXJhRG9lc05vdE9j
Y2x1ZGUpOworCit0ZW1wbGF0ZTxjbGFzcyBUeXBlcywgYm9vbCBvcGFxdWVMYXllcnM+CitjbGFz
cyBDQ09jY2x1c2lvblRyYWNrZXJUZXN0TGFyZ2VQaXhlbHNPY2NsdWRlSW5zaWRlQ2xpcFJlY3Qg
OiBwdWJsaWMgQ0NPY2NsdXNpb25UcmFja2VyVGVzdDxUeXBlcywgb3BhcXVlTGF5ZXJzPiB7Citw
cm90ZWN0ZWQ6CisgICAgdm9pZCBydW5NeVRlc3QoKQorICAgIHsKKyAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggdHJhbnNmb3JtOworICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKDUwLCA1
MCk7CisgICAgICAgIHRyYW5zZm9ybS5hcHBseVBlcnNwZWN0aXZlKDEwMCk7CisgICAgICAgIHRy
YW5zZm9ybS50cmFuc2xhdGUzZCgwLCAwLCA5OSk7CisgICAgICAgIHRyYW5zZm9ybS50cmFuc2xh
dGUoLTUwLCAtNTApOworCisgICAgICAgIHR5cGVuYW1lIFR5cGVzOjpDb250ZW50TGF5ZXJUeXBl
KiBwYXJlbnQgPSB0aGlzLT5jcmVhdGVSb290KHRoaXMtPmlkZW50aXR5TWF0cml4LCBGbG9hdFBv
aW50KDAsIDApLCBJbnRTaXplKDEwMCwgMTAwKSk7CisgICAgICAgIHR5cGVuYW1lIFR5cGVzOjpD
b250ZW50TGF5ZXJUeXBlKiBsYXllciA9IHRoaXMtPmNyZWF0ZURyYXdpbmdMYXllcihwYXJlbnQs
IHRyYW5zZm9ybSwgRmxvYXRQb2ludCgwLCAwKSwgSW50U2l6ZSgxMDAsIDEwMCksIHRydWUpOwor
ICAgICAgICBwYXJlbnQtPnNldFByZXNlcnZlczNEKHRydWUpOworICAgICAgICB0aGlzLT5jYWxj
RHJhd0V0YyhwYXJlbnQpOworCisgICAgICAgIFRlc3RDQ09jY2x1c2lvblRyYWNrZXJXaXRoU2Np
c3Nvcjx0eXBlbmFtZSBUeXBlczo6TGF5ZXJUeXBlLCB0eXBlbmFtZSBUeXBlczo6UmVuZGVyU3Vy
ZmFjZVR5cGU+IG9jY2x1c2lvbihJbnRSZWN0KDAsIDAsIDEwMDAsIDEwMDApKTsKKyAgICAgICAg
b2NjbHVzaW9uLmVudGVyVGFyZ2V0UmVuZGVyU3VyZmFjZShwYXJlbnQtPnJlbmRlclN1cmZhY2Uo
KSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBjYW1lcmEsIHNvIHBp
eGVscyBpbiBpdHMgdmlzaWJsZUxheWVyUmVjdCB3aWxsIGFjdHVhbGx5IGdvIG91dHNpZGUgb2Yg
dGhlIGxheWVyJ3MgY2xpcFJlY3QuCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRob3NlIHBpeGVs
cyBkb24ndCBvY2NsdWRlIHRoaW5ncyBvdXRzaWRlIHRoZSBjbGlwUmVjdC4KKyAgICAgICAgb2Nj
bHVzaW9uLm1hcmtPY2NsdWRlZEJlaGluZExheWVyKGxheWVyKTsKKyAgICAgICAgRVhQRUNUX0VR
KEludFJlY3QoMCwgMCwgMTAwLCAxMDApLCBvY2NsdXNpb24ub2NjbHVzaW9uSW5UYXJnZXRTdXJm
YWNlKCkuYm91bmRzKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIG9jY2x1c2lvbi5vY2NsdXNp
b25JblRhcmdldFN1cmZhY2UoKS5yZWN0cygpLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShJ
bnRSZWN0KDAsIDAsIDEwMCwgMTAwKSwgb2NjbHVzaW9uLm9jY2x1c2lvbkluU2NyZWVuU3BhY2Uo
KS5ib3VuZHMoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb2NjbHVzaW9uLm9jY2x1c2lvbklu
U2NyZWVuU3BhY2UoKS5yZWN0cygpLnNpemUoKSk7CisgICAgfQorfTsKKworTUFJTl9USFJFQURf
VEVTVChDQ09jY2x1c2lvblRyYWNrZXJUZXN0TGFyZ2VQaXhlbHNPY2NsdWRlSW5zaWRlQ2xpcFJl
Y3QpOworCit0ZW1wbGF0ZTxjbGFzcyBUeXBlcywgYm9vbCBvcGFxdWVMYXllcnM+CiBjbGFzcyBD
Q09jY2x1c2lvblRyYWNrZXJUZXN0QW5pbWF0aW9uT3BhY2l0eTFPbk1haW5UaHJlYWQgOiBwdWJs
aWMgQ0NPY2NsdXNpb25UcmFja2VyVGVzdDxUeXBlcywgb3BhcXVlTGF5ZXJzPiB7CiBwcm90ZWN0
ZWQ6CiAgICAgdm9pZCBydW5NeVRlc3QoKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJv
bWl1bS90ZXN0cy9DQ1F1YWRDdWxsZXJUZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
dGVzdHMvQ0NRdWFkQ3VsbGVyVGVzdC5jcHAKaW5kZXggNDU2MmEzYTc1YzJjYmI5NTgwOTMzYzMy
M2FiZDA1MGRlNTQxMWQ3My4uYWNhMTk2ZjhiMjEyZjljNjRmZDI5OTAwZDU0NDBhN2MwZmJkNTUx
MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ1F1YWRDdWxsZXJU
ZXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDUXVhZEN1bGxlclRl
c3QuY3BwCkBAIC00NCw4ICs0NCw2IEBAIHB1YmxpYzoKICAgICAgICAgOiBDQ09jY2x1c2lvblRy
YWNrZXJJbXBsKHNjaXNzb3JSZWN0SW5TY3JlZW4sIHJlY29yZE1ldHJpY3NGb3JGcmFtZSkKICAg
ICAgICAgLCBtX3NjaXNzb3JSZWN0SW5TY3JlZW4oc2Npc3NvclJlY3RJblNjcmVlbikKICAgICB7
Ci0gICAgICAgIC8vIFByZXRlbmQgd2UgaGF2ZSB2aXNpdGVkIGEgcmVuZGVyIHN1cmZhY2UuCi0g
ICAgICAgIG1fc3RhY2suYXBwZW5kKFN0YWNrT2JqZWN0KCkpOwogICAgIH0KIAogcHJvdGVjdGVk
OgpAQCAtNTUsNyArNTMsNyBAQCBwcml2YXRlOgogICAgIEludFJlY3QgbV9zY2lzc29yUmVjdElu
U2NyZWVuOwogfTsKIAotc3RhdGljIFBhc3NPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gbWFrZUxh
eWVyKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtLCBjb25zdCBJbnRS
ZWN0JiBsYXllclJlY3QsIGZsb2F0IG9wYWNpdHksIGJvb2wgb3BhcXVlLCBjb25zdCBJbnRSZWN0
JiBsYXllck9wYXF1ZVJlY3QpCitzdGF0aWMgUGFzc093blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBt
YWtlTGF5ZXIoQ0NUaWxlZExheWVySW1wbCogcGFyZW50LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgZHJhd1RyYW5zZm9ybSwgY29uc3QgSW50UmVjdCYgbGF5ZXJSZWN0LCBmbG9hdCBvcGFj
aXR5LCBib29sIG9wYXF1ZSwgY29uc3QgSW50UmVjdCYgbGF5ZXJPcGFxdWVSZWN0KQogewogICAg
IE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBsYXllciA9IENDVGlsZWRMYXllckltcGw6OmNyZWF0
ZSgwKTsKICAgICBPd25QdHI8Q0NMYXllclRpbGluZ0RhdGE+IHRpbGVyID0gQ0NMYXllclRpbGlu
Z0RhdGE6OmNyZWF0ZShJbnRTaXplKDEwMCwgMTAwKSwgQ0NMYXllclRpbGluZ0RhdGE6Ok5vQm9y
ZGVyVGV4ZWxzKTsKQEAgLTc1LDYgKzczLDEyIEBAIHN0YXRpYyBQYXNzT3duUHRyPENDVGlsZWRM
YXllckltcGw+IG1ha2VMYXllcihjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJhd1RyCiAg
ICAgICAgICAgICBsYXllci0+cHVzaFRpbGVQcm9wZXJ0aWVzKGksIGosIHN0YXRpY19jYXN0PFBs
YXRmb3JtM0RPYmplY3Q+KHRleHR1cmVJZCsrKSwgdGlsZU9wYXF1ZVJlY3QpOwogICAgICAgICB9
CiAKKyAgICBpZiAoIXBhcmVudCkgeworICAgICAgICBsYXllci0+Y3JlYXRlUmVuZGVyU3VyZmFj
ZSgpOworICAgICAgICBsYXllci0+c2V0VGFyZ2V0UmVuZGVyU3VyZmFjZShsYXllci0+cmVuZGVy
U3VyZmFjZSgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbGF5ZXItPnNldFRhcmdldFJlbmRlclN1
cmZhY2UocGFyZW50LT50YXJnZXRSZW5kZXJTdXJmYWNlKCkpOworCiAgICAgcmV0dXJuIGxheWVy
LnJlbGVhc2UoKTsKIH0KIApAQCAtMTAxLDkgKzEwNSwxMCBAQCBURVNUKENDUXVhZEN1bGxlclRl
c3QsIHZlcmlmeU5vQ3VsbGluZykKIHsKICAgICBERUNMQVJFX0FORF9JTklUSUFMSVpFX1RFU1Rf
UVVBRFMKIAotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5
ZXIoVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgp
KTsKLSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihU
cmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsK
KyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKDAsIFRy
YW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7Cisg
ICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIocm9vdExh
eWVyLmdldCgpLCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwg
SW50UmVjdCgpKTsKICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2VySW1wbCBvY2NsdXNpb25UcmFj
a2VyKEludFJlY3QoLTEwMCwgLTEwMCwgMTAwMCwgMTAwMCkpOworICAgIG9jY2x1c2lvblRyYWNr
ZXIuZW50ZXJUYXJnZXRSZW5kZXJTdXJmYWNlKHJvb3RMYXllci0+cmVuZGVyU3VyZmFjZSgpKTsK
IAogICAgIGFwcGVuZFF1YWRzKHF1YWRMaXN0LCBzaGFyZWRTdGF0ZUxpc3QsIGNoaWxkTGF5ZXIu
Z2V0KCksIG9jY2x1c2lvblRyYWNrZXIpOwogICAgIGFwcGVuZFF1YWRzKHF1YWRMaXN0LCBzaGFy
ZWRTdGF0ZUxpc3QsIHJvb3RMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tlcik7CkBAIC0xMTcs
OSArMTIyLDEwIEBAIFRFU1QoQ0NRdWFkQ3VsbGVyVGVzdCwgdmVyaWZ5Q3VsbENoaWxkTGluZXNV
cFRvcExlZnQpCiB7CiAgICAgREVDTEFSRV9BTkRfSU5JVElBTElaRV9URVNUX1FVQURTCiAKLSAg
ICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKFRyYW5zZm9y
bWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7Ci0gICAgT3du
UHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIoVHJhbnNmb3JtYXRp
b25NYXRyaXgoKSwgY2hpbGRSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRy
PENDVGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXllcigwLCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOworICAgIE93blB0cjxD
Q1RpbGVkTGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKHJvb3RMYXllci5nZXQoKSwg
VHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgY2hpbGRSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7
CiAgICAgVGVzdENDT2NjbHVzaW9uVHJhY2tlckltcGwgb2NjbHVzaW9uVHJhY2tlcihJbnRSZWN0
KC0xMDAsIC0xMDAsIDEwMDAsIDEwMDApKTsKKyAgICBvY2NsdXNpb25UcmFja2VyLmVudGVyVGFy
Z2V0UmVuZGVyU3VyZmFjZShyb290TGF5ZXItPnJlbmRlclN1cmZhY2UoKSk7CiAKICAgICBhcHBl
bmRRdWFkcyhxdWFkTGlzdCwgc2hhcmVkU3RhdGVMaXN0LCBjaGlsZExheWVyLmdldCgpLCBvY2Ns
dXNpb25UcmFja2VyKTsKICAgICBvY2NsdXNpb25UcmFja2VyLm1hcmtPY2NsdWRlZEJlaGluZExh
eWVyKGNoaWxkTGF5ZXIuZ2V0KCkpOwpAQCAtMTM0LDkgKzE0MCwxMCBAQCBURVNUKENDUXVhZEN1
bGxlclRlc3QsIHZlcmlmeUN1bGxXaGVuQ2hpbGRPcGFjaXR5Tm90T25lKQogewogICAgIERFQ0xB
UkVfQU5EX0lOSVRJQUxJWkVfVEVTVF9RVUFEUwogCi0gICAgT3duUHRyPENDVGlsZWRMYXllcklt
cGw+IHJvb3RMYXllciA9IG1ha2VMYXllcihUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCByb290UmVj
dCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBj
aGlsZExheWVyID0gbWFrZUxheWVyKGNoaWxkVHJhbnNmb3JtLCBjaGlsZFJlY3QsIDAuOSwgdHJ1
ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0g
bWFrZUxheWVyKDAsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUs
IEludFJlY3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBt
YWtlTGF5ZXIocm9vdExheWVyLmdldCgpLCBjaGlsZFRyYW5zZm9ybSwgY2hpbGRSZWN0LCAwLjks
IHRydWUsIEludFJlY3QoKSk7CiAgICAgVGVzdENDT2NjbHVzaW9uVHJhY2tlckltcGwgb2NjbHVz
aW9uVHJhY2tlcihJbnRSZWN0KC0xMDAsIC0xMDAsIDEwMDAsIDEwMDApKTsKKyAgICBvY2NsdXNp
b25UcmFja2VyLmVudGVyVGFyZ2V0UmVuZGVyU3VyZmFjZShyb290TGF5ZXItPnJlbmRlclN1cmZh
Y2UoKSk7CiAKICAgICBhcHBlbmRRdWFkcyhxdWFkTGlzdCwgc2hhcmVkU3RhdGVMaXN0LCBjaGls
ZExheWVyLmdldCgpLCBvY2NsdXNpb25UcmFja2VyKTsKICAgICBvY2NsdXNpb25UcmFja2VyLm1h
cmtPY2NsdWRlZEJlaGluZExheWVyKGNoaWxkTGF5ZXIuZ2V0KCkpOwpAQCAtMTUxLDkgKzE1OCwx
MCBAQCBURVNUKENDUXVhZEN1bGxlclRlc3QsIHZlcmlmeUN1bGxXaGVuQ2hpbGRPcGFxdWVGbGFn
RmFsc2UpCiB7CiAgICAgREVDTEFSRV9BTkRfSU5JVElBTElaRV9URVNUX1FVQURTCiAKLSAgICBP
d25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKFRyYW5zZm9ybWF0
aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7Ci0gICAgT3duUHRy
PENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIoY2hpbGRUcmFuc2Zvcm0s
IGNoaWxkUmVjdCwgMS4wLCBmYWxzZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExh
eWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKDAsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCks
IHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXll
ckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIocm9vdExheWVyLmdldCgpLCBjaGlsZFRyYW5z
Zm9ybSwgY2hpbGRSZWN0LCAxLjAsIGZhbHNlLCBJbnRSZWN0KCkpOwogICAgIFRlc3RDQ09jY2x1
c2lvblRyYWNrZXJJbXBsIG9jY2x1c2lvblRyYWNrZXIoSW50UmVjdCgtMTAwLCAtMTAwLCAxMDAw
LCAxMDAwKSk7CisgICAgb2NjbHVzaW9uVHJhY2tlci5lbnRlclRhcmdldFJlbmRlclN1cmZhY2Uo
cm9vdExheWVyLT5yZW5kZXJTdXJmYWNlKCkpOwogCiAgICAgYXBwZW5kUXVhZHMocXVhZExpc3Qs
IHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tlcik7CiAg
ICAgb2NjbHVzaW9uVHJhY2tlci5tYXJrT2NjbHVkZWRCZWhpbmRMYXllcihjaGlsZExheWVyLmdl
dCgpKTsKQEAgLTE3MCw5ICsxNzgsMTAgQEAgVEVTVChDQ1F1YWRDdWxsZXJUZXN0LCB2ZXJpZnlD
dWxsQ2VudGVyVGlsZU9ubHkpCiAKICAgICBjaGlsZFRyYW5zZm9ybS50cmFuc2xhdGUoNTAsIDUw
KTsKIAotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIo
VHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsK
LSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihjaGls
ZFRyYW5zZm9ybSwgY2hpbGRSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRy
PENDVGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXllcigwLCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOworICAgIE93blB0cjxD
Q1RpbGVkTGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKHJvb3RMYXllci5nZXQoKSwg
Y2hpbGRUcmFuc2Zvcm0sIGNoaWxkUmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwogICAgIFRl
c3RDQ09jY2x1c2lvblRyYWNrZXJJbXBsIG9jY2x1c2lvblRyYWNrZXIoSW50UmVjdCgtMTAwLCAt
MTAwLCAxMDAwLCAxMDAwKSk7CisgICAgb2NjbHVzaW9uVHJhY2tlci5lbnRlclRhcmdldFJlbmRl
clN1cmZhY2Uocm9vdExheWVyLT5yZW5kZXJTdXJmYWNlKCkpOwogCiAgICAgYXBwZW5kUXVhZHMo
cXVhZExpc3QsIHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJh
Y2tlcik7CiAgICAgb2NjbHVzaW9uVHJhY2tlci5tYXJrT2NjbHVkZWRCZWhpbmRMYXllcihjaGls
ZExheWVyLmdldCgpKTsKQEAgLTIxMyw5ICsyMjIsMTAgQEAgVEVTVChDQ1F1YWRDdWxsZXJUZXN0
LCB2ZXJpZnlDdWxsQ2VudGVyVGlsZU5vbkludGVncmFsU2l6ZTEpCiAKICAgICByb290UmVjdCA9
IGNoaWxkUmVjdCA9IEludFJlY3QoMCwgMCwgMTAwLCAxMDApOwogCi0gICAgT3duUHRyPENDVGls
ZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXllcihyb290VHJhbnNmb3JtLCByb290UmVj
dCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBj
aGlsZExheWVyID0gbWFrZUxheWVyKGNoaWxkVHJhbnNmb3JtLCBjaGlsZFJlY3QsIDEuMCwgdHJ1
ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0g
bWFrZUxheWVyKDAsIHJvb3RUcmFuc2Zvcm0sIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3Qo
KSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIo
cm9vdExheWVyLmdldCgpLCBjaGlsZFRyYW5zZm9ybSwgY2hpbGRSZWN0LCAxLjAsIHRydWUsIElu
dFJlY3QoKSk7CiAgICAgVGVzdENDT2NjbHVzaW9uVHJhY2tlckltcGwgb2NjbHVzaW9uVHJhY2tl
cihJbnRSZWN0KC0xMDAsIC0xMDAsIDEwMDAsIDEwMDApKTsKKyAgICBvY2NsdXNpb25UcmFja2Vy
LmVudGVyVGFyZ2V0UmVuZGVyU3VyZmFjZShyb290TGF5ZXItPnJlbmRlclN1cmZhY2UoKSk7CiAK
ICAgICBhcHBlbmRRdWFkcyhxdWFkTGlzdCwgc2hhcmVkU3RhdGVMaXN0LCBjaGlsZExheWVyLmdl
dCgpLCBvY2NsdXNpb25UcmFja2VyKTsKICAgICBvY2NsdXNpb25UcmFja2VyLm1hcmtPY2NsdWRl
ZEJlaGluZExheWVyKGNoaWxkTGF5ZXIuZ2V0KCkpOwpAQCAtMjQxLDkgKzI1MSwxMCBAQCBURVNU
KENDUXVhZEN1bGxlclRlc3QsIHZlcmlmeUN1bGxDZW50ZXJUaWxlTm9uSW50ZWdyYWxTaXplMikK
IAogICAgIHJvb3RSZWN0ID0gY2hpbGRSZWN0ID0gSW50UmVjdCgwLCAwLCAxMDAsIDEwMCk7CiAK
LSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKHJvb3RU
cmFuc2Zvcm0sIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7Ci0gICAgT3duUHRyPEND
VGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIoY2hpbGRUcmFuc2Zvcm0sIGNo
aWxkUmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOworICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJ
bXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIoMCwgcm9vdFRyYW5zZm9ybSwgcm9vdFJlY3QsIDEu
MCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRM
YXllciA9IG1ha2VMYXllcihyb290TGF5ZXIuZ2V0KCksIGNoaWxkVHJhbnNmb3JtLCBjaGlsZFJl
Y3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2VySW1w
bCBvY2NsdXNpb25UcmFja2VyKEludFJlY3QoLTEwMCwgLTEwMCwgMTAwMCwgMTAwMCkpOworICAg
IG9jY2x1c2lvblRyYWNrZXIuZW50ZXJUYXJnZXRSZW5kZXJTdXJmYWNlKHJvb3RMYXllci0+cmVu
ZGVyU3VyZmFjZSgpKTsKIAogICAgIGFwcGVuZFF1YWRzKHF1YWRMaXN0LCBzaGFyZWRTdGF0ZUxp
c3QsIGNoaWxkTGF5ZXIuZ2V0KCksIG9jY2x1c2lvblRyYWNrZXIpOwogICAgIG9jY2x1c2lvblRy
YWNrZXIubWFya09jY2x1ZGVkQmVoaW5kTGF5ZXIoY2hpbGRMYXllci5nZXQoKSk7CkBAIC0yNjEs
OSArMjcyLDEwIEBAIFRFU1QoQ0NRdWFkQ3VsbGVyVGVzdCwgdmVyaWZ5Q3VsbENoaWxkTGluZXNV
cEJvdHRvbVJpZ2h0KQogCiAgICAgY2hpbGRUcmFuc2Zvcm0udHJhbnNsYXRlKDEwMCwgMTAwKTsK
IAotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIoVHJh
bnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKLSAg
ICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihjaGlsZFRy
YW5zZm9ybSwgY2hpbGRSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRyPEND
VGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXllcigwLCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOworICAgIE93blB0cjxDQ1Rp
bGVkTGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKHJvb3RMYXllci5nZXQoKSwgY2hp
bGRUcmFuc2Zvcm0sIGNoaWxkUmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwogICAgIFRlc3RD
Q09jY2x1c2lvblRyYWNrZXJJbXBsIG9jY2x1c2lvblRyYWNrZXIoSW50UmVjdCgtMTAwLCAtMTAw
LCAxMDAwLCAxMDAwKSk7CisgICAgb2NjbHVzaW9uVHJhY2tlci5lbnRlclRhcmdldFJlbmRlclN1
cmZhY2Uocm9vdExheWVyLT5yZW5kZXJTdXJmYWNlKCkpOwogCiAgICAgYXBwZW5kUXVhZHMocXVh
ZExpc3QsIHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tl
cik7CiAgICAgb2NjbHVzaW9uVHJhY2tlci5tYXJrT2NjbHVkZWRCZWhpbmRMYXllcihjaGlsZExh
eWVyLmdldCgpKTsKQEAgLTI4MCwxMCArMjkyLDExIEBAIFRFU1QoQ0NRdWFkQ3VsbGVyVGVzdCwg
dmVyaWZ5Q3VsbFN1YlJlZ2lvbikKIAogICAgIGNoaWxkVHJhbnNmb3JtLnRyYW5zbGF0ZSg1MCwg
NTApOwogCi0gICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXll
cihUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkp
OworICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIoMCwg
VHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsK
ICAgICBJbnRSZWN0IGNoaWxkT3BhcXVlUmVjdChjaGlsZFJlY3QueCgpICsgY2hpbGRSZWN0Lndp
ZHRoKCkgLyA0LCBjaGlsZFJlY3QueSgpICsgY2hpbGRSZWN0LmhlaWdodCgpIC8gNCwgY2hpbGRS
ZWN0LndpZHRoKCkgLyAyLCBjaGlsZFJlY3QuaGVpZ2h0KCkgLyAyKTsKLSAgICBPd25QdHI8Q0NU
aWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihjaGlsZFRyYW5zZm9ybSwgY2hp
bGRSZWN0LCAxLjAsIGZhbHNlLCBjaGlsZE9wYXF1ZVJlY3QpOworICAgIE93blB0cjxDQ1RpbGVk
TGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKHJvb3RMYXllci5nZXQoKSwgY2hpbGRU
cmFuc2Zvcm0sIGNoaWxkUmVjdCwgMS4wLCBmYWxzZSwgY2hpbGRPcGFxdWVSZWN0KTsKICAgICBU
ZXN0Q0NPY2NsdXNpb25UcmFja2VySW1wbCBvY2NsdXNpb25UcmFja2VyKEludFJlY3QoLTEwMCwg
LTEwMCwgMTAwMCwgMTAwMCkpOworICAgIG9jY2x1c2lvblRyYWNrZXIuZW50ZXJUYXJnZXRSZW5k
ZXJTdXJmYWNlKHJvb3RMYXllci0+cmVuZGVyU3VyZmFjZSgpKTsKIAogICAgIGFwcGVuZFF1YWRz
KHF1YWRMaXN0LCBzaGFyZWRTdGF0ZUxpc3QsIGNoaWxkTGF5ZXIuZ2V0KCksIG9jY2x1c2lvblRy
YWNrZXIpOwogICAgIG9jY2x1c2lvblRyYWNrZXIubWFya09jY2x1ZGVkQmVoaW5kTGF5ZXIoY2hp
bGRMYXllci5nZXQoKSk7CkBAIC0zMDAsMTAgKzMxMywxMSBAQCBURVNUKENDUXVhZEN1bGxlclRl
c3QsIHZlcmlmeUN1bGxTdWJSZWdpb24yKQogCiAgICAgY2hpbGRUcmFuc2Zvcm0udHJhbnNsYXRl
KDUwLCAxMCk7CiAKLSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFr
ZUxheWVyKFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJl
Y3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXll
cigwLCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0
KCkpOwogICAgIEludFJlY3QgY2hpbGRPcGFxdWVSZWN0KGNoaWxkUmVjdC54KCkgKyBjaGlsZFJl
Y3Qud2lkdGgoKSAvIDQsIGNoaWxkUmVjdC55KCkgKyBjaGlsZFJlY3QuaGVpZ2h0KCkgLyA0LCBj
aGlsZFJlY3Qud2lkdGgoKSAvIDIsIGNoaWxkUmVjdC5oZWlnaHQoKSAqIDMgLyA0KTsKLSAgICBP
d25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihjaGlsZFRyYW5z
Zm9ybSwgY2hpbGRSZWN0LCAxLjAsIGZhbHNlLCBjaGlsZE9wYXF1ZVJlY3QpOworICAgIE93blB0
cjxDQ1RpbGVkTGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKHJvb3RMYXllci5nZXQo
KSwgY2hpbGRUcmFuc2Zvcm0sIGNoaWxkUmVjdCwgMS4wLCBmYWxzZSwgY2hpbGRPcGFxdWVSZWN0
KTsKICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2VySW1wbCBvY2NsdXNpb25UcmFja2VyKEludFJl
Y3QoLTEwMCwgLTEwMCwgMTAwMCwgMTAwMCkpOworICAgIG9jY2x1c2lvblRyYWNrZXIuZW50ZXJU
YXJnZXRSZW5kZXJTdXJmYWNlKHJvb3RMYXllci0+cmVuZGVyU3VyZmFjZSgpKTsKIAogICAgIGFw
cGVuZFF1YWRzKHF1YWRMaXN0LCBzaGFyZWRTdGF0ZUxpc3QsIGNoaWxkTGF5ZXIuZ2V0KCksIG9j
Y2x1c2lvblRyYWNrZXIpOwogICAgIG9jY2x1c2lvblRyYWNrZXIubWFya09jY2x1ZGVkQmVoaW5k
TGF5ZXIoY2hpbGRMYXllci5nZXQoKSk7CkBAIC0zMjAsMTAgKzMzNCwxMSBAQCBURVNUKENDUXVh
ZEN1bGxlclRlc3QsIHZlcmlmeUN1bGxTdWJSZWdpb25DaGVja092ZXJjdWxsKQogCiAgICAgY2hp
bGRUcmFuc2Zvcm0udHJhbnNsYXRlKDUwLCA0OSk7CiAKLSAgICBPd25QdHI8Q0NUaWxlZExheWVy
SW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RS
ZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+
IHJvb3RMYXllciA9IG1ha2VMYXllcigwLCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCByb290UmVj
dCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwogICAgIEludFJlY3QgY2hpbGRPcGFxdWVSZWN0KGNo
aWxkUmVjdC54KCkgKyBjaGlsZFJlY3Qud2lkdGgoKSAvIDQsIGNoaWxkUmVjdC55KCkgKyBjaGls
ZFJlY3QuaGVpZ2h0KCkgLyA0LCBjaGlsZFJlY3Qud2lkdGgoKSAvIDIsIGNoaWxkUmVjdC5oZWln
aHQoKSAvIDIpOwotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFr
ZUxheWVyKGNoaWxkVHJhbnNmb3JtLCBjaGlsZFJlY3QsIDEuMCwgZmFsc2UsIGNoaWxkT3BhcXVl
UmVjdCk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5
ZXIocm9vdExheWVyLmdldCgpLCBjaGlsZFRyYW5zZm9ybSwgY2hpbGRSZWN0LCAxLjAsIGZhbHNl
LCBjaGlsZE9wYXF1ZVJlY3QpOwogICAgIFRlc3RDQ09jY2x1c2lvblRyYWNrZXJJbXBsIG9jY2x1
c2lvblRyYWNrZXIoSW50UmVjdCgtMTAwLCAtMTAwLCAxMDAwLCAxMDAwKSk7CisgICAgb2NjbHVz
aW9uVHJhY2tlci5lbnRlclRhcmdldFJlbmRlclN1cmZhY2Uocm9vdExheWVyLT5yZW5kZXJTdXJm
YWNlKCkpOwogCiAgICAgYXBwZW5kUXVhZHMocXVhZExpc3QsIHNoYXJlZFN0YXRlTGlzdCwgY2hp
bGRMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tlcik7CiAgICAgb2NjbHVzaW9uVHJhY2tlci5t
YXJrT2NjbHVkZWRCZWhpbmRMYXllcihjaGlsZExheWVyLmdldCgpKTsKQEAgLTM0MSw5ICszNTYs
MTAgQEAgVEVTVChDQ1F1YWRDdWxsZXJUZXN0LCB2ZXJpZnlOb25BeGlzQWxpZ25lZFF1YWRzRG9u
dE9jY2x1ZGUpCiAgICAgLy8gVXNlIGEgc21hbGwgcm90YXRpb24gc28gYXMgdG8gbm90IGRpc3R1
cmIgdGhlIGdlb21ldHJ5IHNpZ25pZmljYW50bHkuCiAgICAgY2hpbGRUcmFuc2Zvcm0ucm90YXRl
KDEpOwogCi0gICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXll
cihUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkp
OwotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKGNo
aWxkVHJhbnNmb3JtLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25Q
dHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKDAsIFRyYW5zZm9ybWF0
aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRy
PENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIocm9vdExheWVyLmdldCgp
LCBjaGlsZFRyYW5zZm9ybSwgY2hpbGRSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CiAgICAg
VGVzdENDT2NjbHVzaW9uVHJhY2tlckltcGwgb2NjbHVzaW9uVHJhY2tlcihJbnRSZWN0KC0xMDAs
IC0xMDAsIDEwMDAsIDEwMDApKTsKKyAgICBvY2NsdXNpb25UcmFja2VyLmVudGVyVGFyZ2V0UmVu
ZGVyU3VyZmFjZShyb290TGF5ZXItPnJlbmRlclN1cmZhY2UoKSk7CiAKICAgICBhcHBlbmRRdWFk
cyhxdWFkTGlzdCwgc2hhcmVkU3RhdGVMaXN0LCBjaGlsZExheWVyLmdldCgpLCBvY2NsdXNpb25U
cmFja2VyKTsKICAgICBvY2NsdXNpb25UcmFja2VyLm1hcmtPY2NsdWRlZEJlaGluZExheWVyKGNo
aWxkTGF5ZXIuZ2V0KCkpOwpAQCAtMzY3LDkgKzM4MywxMCBAQCBURVNUKENDUXVhZEN1bGxlclRl
c3QsIHZlcmlmeU5vbkF4aXNBbGlnbmVkUXVhZHNTYWZlbHlDdWxsZWQpCiAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggcGFyZW50VHJhbnNmb3JtOwogICAgIHBhcmVudFRyYW5zZm9ybS5yb3RhdGUo
MSk7CiAKLSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVy
KHBhcmVudFRyYW5zZm9ybSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKLSAgICBP
d25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihUcmFuc2Zvcm1h
dGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25Q
dHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKDAsIHBhcmVudFRyYW5z
Zm9ybSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxl
ZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihyb290TGF5ZXIuZ2V0KCksIFRyYW5z
Zm9ybWF0aW9uTWF0cml4KCksIGNoaWxkUmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwogICAg
IFRlc3RDQ09jY2x1c2lvblRyYWNrZXJJbXBsIG9jY2x1c2lvblRyYWNrZXIoSW50UmVjdCgtMTAw
LCAtMTAwLCAxMDAwLCAxMDAwKSk7CisgICAgb2NjbHVzaW9uVHJhY2tlci5lbnRlclRhcmdldFJl
bmRlclN1cmZhY2Uocm9vdExheWVyLT5yZW5kZXJTdXJmYWNlKCkpOwogCiAgICAgYXBwZW5kUXVh
ZHMocXVhZExpc3QsIHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRMYXllci5nZXQoKSwgb2NjbHVzaW9u
VHJhY2tlcik7CiAgICAgb2NjbHVzaW9uVHJhY2tlci5tYXJrT2NjbHVkZWRCZWhpbmRMYXllcihj
aGlsZExheWVyLmdldCgpKTsKQEAgLTM4NCw5ICs0MDEsMTAgQEAgVEVTVChDQ1F1YWRDdWxsZXJU
ZXN0LCB2ZXJpZnlDdWxsT3V0c2lkZVNjaXNzb3JPdmVyVGlsZSkKIHsKICAgICBERUNMQVJFX0FO
RF9JTklUSUFMSVpFX1RFU1RfUVVBRFMKIAotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiBy
b290TGF5ZXIgPSBtYWtlTGF5ZXIoVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEu
MCwgdHJ1ZSwgSW50UmVjdCgpKTsKLSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRM
YXllciA9IG1ha2VMYXllcihUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwg
dHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVy
ID0gbWFrZUxheWVyKDAsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRy
dWUsIEludFJlY3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIg
PSBtYWtlTGF5ZXIocm9vdExheWVyLmdldCgpLCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGls
ZFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2Vy
SW1wbCBvY2NsdXNpb25UcmFja2VyKEludFJlY3QoMjAwLCAxMDAsIDEwMCwgMTAwKSk7CisgICAg
b2NjbHVzaW9uVHJhY2tlci5lbnRlclRhcmdldFJlbmRlclN1cmZhY2Uocm9vdExheWVyLT5yZW5k
ZXJTdXJmYWNlKCkpOwogCiAgICAgYXBwZW5kUXVhZHMocXVhZExpc3QsIHNoYXJlZFN0YXRlTGlz
dCwgY2hpbGRMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tlcik7CiAgICAgb2NjbHVzaW9uVHJh
Y2tlci5tYXJrT2NjbHVkZWRCZWhpbmRMYXllcihjaGlsZExheWVyLmdldCgpKTsKQEAgLTQwMSw5
ICs0MTksMTAgQEAgVEVTVChDQ1F1YWRDdWxsZXJUZXN0LCB2ZXJpZnlDdWxsT3V0c2lkZVNjaXNz
b3JPdmVyQ3VsbGVkVGlsZSkKIHsKICAgICBERUNMQVJFX0FORF9JTklUSUFMSVpFX1RFU1RfUVVB
RFMKIAotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIo
VHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsK
LSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihUcmFu
c2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAg
ICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxheWVyKDAsIFRyYW5z
Zm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAg
T3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5ZXIocm9vdExheWVy
LmdldCgpLCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50
UmVjdCgpKTsKICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2VySW1wbCBvY2NsdXNpb25UcmFja2Vy
KEludFJlY3QoMTAwLCAxMDAsIDEwMCwgMTAwKSk7CisgICAgb2NjbHVzaW9uVHJhY2tlci5lbnRl
clRhcmdldFJlbmRlclN1cmZhY2Uocm9vdExheWVyLT5yZW5kZXJTdXJmYWNlKCkpOwogCiAgICAg
YXBwZW5kUXVhZHMocXVhZExpc3QsIHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRMYXllci5nZXQoKSwg
b2NjbHVzaW9uVHJhY2tlcik7CiAgICAgb2NjbHVzaW9uVHJhY2tlci5tYXJrT2NjbHVkZWRCZWhp
bmRMYXllcihjaGlsZExheWVyLmdldCgpKTsKQEAgLTQxOCw5ICs0MzcsMTAgQEAgVEVTVChDQ1F1
YWRDdWxsZXJUZXN0LCB2ZXJpZnlDdWxsT3V0c2lkZVNjaXNzb3JPdmVyUGFydGlhbFRpbGVzKQog
ewogICAgIERFQ0xBUkVfQU5EX0lOSVRJQUxJWkVfVEVTVF9RVUFEUwogCi0gICAgT3duUHRyPEND
VGlsZWRMYXllckltcGw+IHJvb3RMYXllciA9IG1ha2VMYXllcihUcmFuc2Zvcm1hdGlvbk1hdHJp
eCgpLCByb290UmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwotICAgIE93blB0cjxDQ1RpbGVk
TGF5ZXJJbXBsPiBjaGlsZExheWVyID0gbWFrZUxheWVyKFRyYW5zZm9ybWF0aW9uTWF0cml4KCks
IGNoaWxkUmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOworICAgIE93blB0cjxDQ1RpbGVkTGF5
ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIoMCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwg
cm9vdFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVy
SW1wbD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihyb290TGF5ZXIuZ2V0KCksIFRyYW5zZm9ybWF0
aW9uTWF0cml4KCksIGNoaWxkUmVjdCwgMS4wLCB0cnVlLCBJbnRSZWN0KCkpOwogICAgIFRlc3RD
Q09jY2x1c2lvblRyYWNrZXJJbXBsIG9jY2x1c2lvblRyYWNrZXIoSW50UmVjdCg1MCwgNTAsIDIw
MCwgMjAwKSk7CisgICAgb2NjbHVzaW9uVHJhY2tlci5lbnRlclRhcmdldFJlbmRlclN1cmZhY2Uo
cm9vdExheWVyLT5yZW5kZXJTdXJmYWNlKCkpOwogCiAgICAgYXBwZW5kUXVhZHMocXVhZExpc3Qs
IHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRMYXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tlcik7CiAg
ICAgb2NjbHVzaW9uVHJhY2tlci5tYXJrT2NjbHVkZWRCZWhpbmRMYXllcihjaGlsZExheWVyLmdl
dCgpKTsKQEAgLTQzNSw5ICs0NTUsMTAgQEAgVEVTVChDQ1F1YWRDdWxsZXJUZXN0LCB2ZXJpZnlD
dWxsT3V0c2lkZVNjaXNzb3JPdmVyTm9UaWxlcykKIHsKICAgICBERUNMQVJFX0FORF9JTklUSUFM
SVpFX1RFU1RfUVVBRFMKIAotICAgIE93blB0cjxDQ1RpbGVkTGF5ZXJJbXBsPiByb290TGF5ZXIg
PSBtYWtlTGF5ZXIoVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9vdFJlY3QsIDEuMCwgdHJ1ZSwg
SW50UmVjdCgpKTsKLSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gY2hpbGRMYXllciA9IG1h
a2VMYXllcihUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50
UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4gcm9vdExheWVyID0gbWFrZUxh
eWVyKDAsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0LCAxLjAsIHRydWUsIEludFJl
Y3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNoaWxkTGF5ZXIgPSBtYWtlTGF5
ZXIocm9vdExheWVyLmdldCgpLCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJlY3QsIDEu
MCwgdHJ1ZSwgSW50UmVjdCgpKTsKICAgICBUZXN0Q0NPY2NsdXNpb25UcmFja2VySW1wbCBvY2Ns
dXNpb25UcmFja2VyKEludFJlY3QoNTAwLCA1MDAsIDEwMCwgMTAwKSk7CisgICAgb2NjbHVzaW9u
VHJhY2tlci5lbnRlclRhcmdldFJlbmRlclN1cmZhY2Uocm9vdExheWVyLT5yZW5kZXJTdXJmYWNl
KCkpOwogCiAgICAgYXBwZW5kUXVhZHMocXVhZExpc3QsIHNoYXJlZFN0YXRlTGlzdCwgY2hpbGRM
YXllci5nZXQoKSwgb2NjbHVzaW9uVHJhY2tlcik7CiAgICAgb2NjbHVzaW9uVHJhY2tlci5tYXJr
T2NjbHVkZWRCZWhpbmRMYXllcihjaGlsZExheWVyLmdldCgpKTsKQEAgLTQ1Miw5ICs0NzMsMTAg
QEAgVEVTVChDQ1F1YWRDdWxsZXJUZXN0LCB2ZXJpZnlXaXRob3V0TWV0cmljcykKIHsKICAgICBE
RUNMQVJFX0FORF9JTklUSUFMSVpFX1RFU1RfUVVBRFMKIAotICAgIE93blB0cjxDQ1RpbGVkTGF5
ZXJJbXBsPiByb290TGF5ZXIgPSBtYWtlTGF5ZXIoVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgcm9v
dFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKLSAgICBPd25QdHI8Q0NUaWxlZExheWVySW1w
bD4gY2hpbGRMYXllciA9IG1ha2VMYXllcihUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBjaGlsZFJl
Y3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKKyAgICBPd25QdHI8Q0NUaWxlZExheWVySW1wbD4g
cm9vdExheWVyID0gbWFrZUxheWVyKDAsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHJvb3RSZWN0
LCAxLjAsIHRydWUsIEludFJlY3QoKSk7CisgICAgT3duUHRyPENDVGlsZWRMYXllckltcGw+IGNo
aWxkTGF5ZXIgPSBtYWtlTGF5ZXIocm9vdExheWVyLmdldCgpLCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCgpLCBjaGlsZFJlY3QsIDEuMCwgdHJ1ZSwgSW50UmVjdCgpKTsKICAgICBUZXN0Q0NPY2NsdXNp
b25UcmFja2VySW1wbCBvY2NsdXNpb25UcmFja2VyKEludFJlY3QoNTAsIDUwLCAyMDAsIDIwMCks
IGZhbHNlKTsKKyAgICBvY2NsdXNpb25UcmFja2VyLmVudGVyVGFyZ2V0UmVuZGVyU3VyZmFjZShy
b290TGF5ZXItPnJlbmRlclN1cmZhY2UoKSk7CiAKICAgICBhcHBlbmRRdWFkcyhxdWFkTGlzdCwg
c2hhcmVkU3RhdGVMaXN0LCBjaGlsZExheWVyLmdldCgpLCBvY2NsdXNpb25UcmFja2VyKTsKICAg
ICBvY2NsdXNpb25UcmFja2VyLm1hcmtPY2NsdWRlZEJlaGluZExheWVyKGNoaWxkTGF5ZXIuZ2V0
KCkpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>