<?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>76336</bug_id>
          
          <creation_ts>2012-01-14 10:25:39 -0800</creation_ts>
          <short_desc>[Texmap] TextureMapper creates two many big intermediate surfaces</short_desc>
          <delta_ts>2012-01-19 17:34:46 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>Qt</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>75918</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Noam Rosenthal">noam</reporter>
          <assigned_to name="Noam Rosenthal">noam</assigned_to>
          <cc>hausmann</cc>
    
    <cc>jturcotte</cc>
    
    <cc>kenneth</cc>
    
    <cc>mrobinson</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>536191</commentid>
    <comment_count>0</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-14 10:25:39 -0800</bug_when>
    <thetext>Currently TextureMapper is very generous in creating intermediate sufraces. The current algorithm always uses the viewport size for an intermediate surface, and it chooses to create a surface for unnecessary layers, such as ones with reflection and no opacity.

Since intermediate surfaces are a performance and memory hog, optimizing this is of high value.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536195</commentid>
    <comment_count>1</comment_count>
      <attachid>122552</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-14 10:56:33 -0800</bug_when>
    <thetext>Created attachment 122552
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536261</commentid>
    <comment_count>2</comment_count>
      <attachid>122564</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-15 08:45:23 -0800</bug_when>
    <thetext>Created attachment 122564
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536262</commentid>
    <comment_count>3</comment_count>
      <attachid>122564</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2012-01-15 08:57:44 -0800</bug_when>
    <thetext>Comment on attachment 122564
Patch

Attachment 122564 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/11242195</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536263</commentid>
    <comment_count>4</comment_count>
      <attachid>122565</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-15 09:05:59 -0800</bug_when>
    <thetext>Created attachment 122565
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536267</commentid>
    <comment_count>5</comment_count>
      <attachid>122566</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-15 09:21:38 -0800</bug_when>
    <thetext>Created attachment 122566
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536453</commentid>
    <comment_count>6</comment_count>
      <attachid>122566</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-01-16 03:16:19 -0800</bug_when>
    <thetext>Comment on attachment 122566
Patch

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

This seems so much more simple

&gt; Source/WebCore/ChangeLog:11
&gt; +        2. Avoid generatig intermediate surface for occasions where they&apos;re not necessary,

generating

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:281
&gt; +    // We apply the transform that is generated to compensate for painting into a surface.

We apply the following transform to compensate for painting into a surface..

Maybe the last part could be described better

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:358
&gt; +    return boundingRect(m_transform.combined().inverse());

will there always be an inverse?

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:361
&gt; +IntRect TextureMapperNode::boundingRect(const TransformationMatrix&amp; matrix)

Maybe we should rename this method?

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:389
&gt; +    // Tested by compositing/reflections/reflection-opacity.html

I love these comments!

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:416
&gt; +        // FIXME: blend the two if both exist.

Any test for that?

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:458
&gt; +    // If we painted the replica, the mask is already baked in so we don&apos;t need to paint it again.

included?

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:463
&gt; +    TransformationMatrix targetTransform = TransformationMatrix().multiply(options.transform).multiply(m_transform.combined()).translate(options.offset.width(), options.offset.height());

Maybe write this on a couple of lines</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536502</commentid>
    <comment_count>7</comment_count>
      <attachid>122566</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-01-16 05:35:05 -0800</bug_when>
    <thetext>Comment on attachment 122566
Patch

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

&gt; Source/WebCore/platform/graphics/texmap/TextureMapper.cpp:34
&gt; +        // If the surface has only one reference, we can safely reuse it.

Please add something like &quot;... only one reference (the reference of m_texturePool), we can...&quot;.

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:285
&gt; +    TransformationMatrix transform =
&gt; +            TransformationMatrix(options.transform)
&gt; +            .multiply(m_transform.combined())
&gt; +            .translate(options.offset.width(), options.offset.height());

Since we now compute the transforms just before painting, it feels wasted to do:
- Compute the transforms for the whole graphic layer tree before we start painting.
- During painting, possibly reverse a whole part of the transformed branch in case we are rendering to an intermediate surface.

So it might be simpler and more efficient to integrate computeTransformsRecursive into paintSelf and decide if we combine with the parent transform or not. I&apos;m not sure how much work that would be so this could be done in another patch.

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:422
&gt; +        replicaOptions.transform
&gt; +                  .multiply(m_state.replicaLayer-&gt;m_transform.combined())
&gt; +                  .multiply(m_transform.combined().inverse());

If I understand well I think that &quot;replicaOptions.transform = TransformationMatrix(m_state.replicaLayer-&gt;m_transform.combined()).multiply(m_transform.combined().inverse())&quot; would be clearer and would avoid an extra TransformationMatrix::multiply call.

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:453
&gt; +    paintOptions.transform = m_transform.combinedForChildren().inverse();

Humm, this is stretching my brain a bit, but I think that this should be m_transform.combined().inverse(), else this would revert the perspective transform in combinedForChildren which needs to act on the Z component, and rendering on the intermediate surface will flatten the Z.

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:464
&gt; +    TransformationMatrix targetTransform = TransformationMatrix().multiply(options.transform).multiply(m_transform.combined()).translate(options.offset.width(), options.offset.height());
&gt; +    options.textureMapper-&gt;drawTexture(*surface.get(), surfaceRect, targetTransform, options.opacity, maskTexture.get());

Same thing here, TransformationMatrix().multiply(options.transform) can be simplified to TransformationMatrix(options.transform).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536505</commentid>
    <comment_count>8</comment_count>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-01-16 05:39:15 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; If I understand well I think that &quot;replicaOptions.transform = TransformationMatrix(m_state.replicaLayer-&gt;m_transform.combined()).multiply(m_transform.combined().inverse())&quot; would be clearer and would avoid an extra TransformationMatrix::multiply call.

Ok sorry, didn&apos;t see that replicaOptions was containing the transform of options, ignore that one please.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536519</commentid>
    <comment_count>9</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-16 06:19:15 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:416
&gt; &gt; +        // FIXME: blend the two if both exist.
&gt; 
&gt; Any test for that?
No test. That&apos;s why I didn&apos;t bother with it at this point. Also, very few sites use reflections at all, or in that way specifically (having a mask on a layer, and then reflecting it with an additional mask).

&gt; Since we now compute the transforms just before painting, it feels wasted to do:
&gt; - Compute the transforms for the whole graphic layer tree before we start painting.
&gt; - During painting, possibly reverse a whole part of the transformed branch in case we are rendering to an intermediate surface.
&gt; 
&gt; So it might be simpler and more efficient to integrate computeTransformsRecursive into paintSelf and decide if we combine with the parent transform or not. I&apos;m not sure how much work that would be so this could be done in another patch.

True, those inverses are kind of yucky. Though in the future I want to allow computing the transform only if needed, as an optimization. Also, the bounding rect for root is still needed for visible-rect calculations.
In short, I&apos;d rather leave this for another patch.

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:453
&gt; &gt; +    paintOptions.transform = m_transform.combinedForChildren().inverse();
&gt; 
&gt; Humm, this is stretching my brain a bit, but I think that this should be m_transform.combined().inverse(), else this would revert the perspective transform in combinedForChildren which needs to act on the Z component, and rendering on the intermediate surface will flatten the Z.

This has to use combinedForChildren(). Otherwise it doesn&apos;t flatten non-preserve-3d surfaces correctly. I&apos;ll add a coment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536569</commentid>
    <comment_count>10</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-16 08:23:38 -0800</bug_when>
    <thetext>&gt; Since we now compute the transforms just before painting, it feels wasted to do:
&gt; - Compute the transforms for the whole graphic layer tree before we start painting.
&gt; - During painting, possibly reverse a whole part of the transformed branch in case we are rendering to an intermediate surface.
I tried to do this, but it makes replica rendering tricky...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536570</commentid>
    <comment_count>11</comment_count>
      <attachid>122642</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-16 08:24:04 -0800</bug_when>
    <thetext>Created attachment 122642
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>536576</commentid>
    <comment_count>12</comment_count>
      <attachid>122644</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-16 08:31:23 -0800</bug_when>
    <thetext>Created attachment 122644
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>538670</commentid>
    <comment_count>13</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-19 06:38:44 -0800</bug_when>
    <thetext>Anything still missing for this? I have several patches that depend on it...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>538736</commentid>
    <comment_count>14</comment_count>
      <attachid>122644</attachid>
    <who name="Jocelyn Turcotte">jturcotte</who>
    <bug_when>2012-01-19 08:37:01 -0800</bug_when>
    <thetext>Comment on attachment 122644
Patch

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

LGTM along with some nitpicks.

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:430
&gt; +void TextureMapperNode::paintRecursive(TextureMapperPaintOptions options)

The implicit copy of this TextureMapperPaintOptions isn&apos;t necessary anymore if no intemediate surface is used.
Would it be possible to use a const reference and do the additional copy to apply the opacity on the intermediate surface only when you know you&apos;ll use it?

&gt; Source/WebCore/platform/graphics/texmap/TextureMapperNode.cpp:455
&gt; +    // We have to use combinedForChildren() and not combined(), otherwise layer 3D doesn&apos;t work.

layer 3D -&gt; preserves 3D?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>538971</commentid>
    <comment_count>15</comment_count>
      <attachid>122644</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-01-19 13:14:23 -0800</bug_when>
    <thetext>Comment on attachment 122644
Patch

Not an easy patch, but I think I get it now :). r=me, but Jocelyn&apos;s comments make sense. Would be good to apply before landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>538972</commentid>
    <comment_count>16</comment_count>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-19 13:17:07 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 122644 [details])
&gt; Not an easy patch, but I think I get it now :). r=me, but Jocelyn&apos;s comments make sense. Would be good to apply before landing.

Thanks Simon, I&apos;m writing some non-easy patches in order to make it easier for others later :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>538989</commentid>
    <comment_count>17</comment_count>
      <attachid>123185</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2012-01-19 13:40:27 -0800</bug_when>
    <thetext>Created attachment 123185
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>539182</commentid>
    <comment_count>18</comment_count>
      <attachid>123185</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-19 17:34:40 -0800</bug_when>
    <thetext>Comment on attachment 123185
Patch

Clearing flags on attachment: 123185

Committed r105467: &lt;http://trac.webkit.org/changeset/105467&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>539183</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-19 17:34:46 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122552</attachid>
            <date>2012-01-14 10:56:33 -0800</date>
            <delta_ts>2012-01-15 08:45:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>24832</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4OThlMTBhLi44NTRmMzZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzcg
QEAKKzIwMTItMDEtMTQgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBbVGV4bWFwXSBUZXh0dXJlTWFwcGVyIGNyZWF0ZXMgdHdvIG1hbnkgYmln
IGludGVybWVkaWF0ZSBzdXJmYWNlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzYzMzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGlzIHBhdGNoIGRvZXMgdGhlIGZvbGxvd2luZyB0byBvcHRpbWl6ZSBz
dXJmYWNlIGFsbG9jYXRpb24gaW4gVGV4dHVyZU1hcHBlcjoKKyAgICAgICAgMS4gSW5zdGVhZCBv
ZiBhbGxvY2F0aW5nIGludGVybWVkaWF0ZSBzdXJmYWNlcyB3aXRoIHRoZSBzaXplIG9mIHRoZSB3
aG9sZSB2aWV3cG9ydCwgd2UKKyAgICAgICAgICAgYWxsb2NhdGUgdGhlbSB3aXRoIHRoZSBzaXpl
IG9mIHRoZSBsYXllcidzIGJvdW5kaW5nIHJlY3QgaW5jbHVkaW5nIGNoaWxkcmVuLgorICAgICAg
ICAgICBUbyBhY2hpZXZlIHRoYXQsIHRoZSBsYXllciBhbmQgaXRzIGNoaWxkcmVuIGFyZSBwYWlu
dGVkIHVzaW5nIHRoZSBsYXllcidzIHRyYW5zZm9ybQorICAgICAgICAgICBpbnN0ZWFkIG9mIHRo
ZSBnbG9iYWwgdHJhbnNmb3JtLgorICAgICAgICAyLiBSZW1vdmVkIHRoZSBjb21wbGljYXRlZCBy
ZXBsaWNhIHBhaW50aW5nIGNvZGUuIEluc3RlYWQsIHdlIGNhbGwgcGFpbnRTZWxmQW5kQ2hpbGRy
ZW4oKQorICAgICAgICAgICB0d2ljZSwgdGhlIGZpcnN0IHRpbWUgYWRqdXN0ZWQgd2l0aCB0aGUg
cmVwbGljYSdzIHRyYW5zZm9ybS4gV2UgdXNlIHN1cmZhY2VzIG9ubHkgZm9yCisgICAgICAgICAg
IG92ZXJsYXBwaW5nIHJlcGxpY2FzIHdpdGggb3BhY2l0eSwgbm90IGZvciByZXBsaWNhcyB3aXRo
IG1hc2suCisgICAgICAgIDMuIE1ha2Ugc3VyZmFjZSBkZWFsbG9jYXRpb24gaW1wbGljaXQsIGJh
c2VkIG9uIGl0cyByZWZlcmVuY2UgY291bnQuCisKKyAgICAgICAgVGhpcyBpcyBjb3ZlcmVkIGJ5
IHRlc3RzIGluIExheW91dFRlc3RzL2NvbXBvc2l0aW5nLgorCisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZU1hcHBlcjo6YWNxdWlyZVRleHR1cmVGcm9tUG9vbCk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZU1hcHBlck5vZGU6OmNvbXB1dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKToKKyAgICAgICAgKFdl
YkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGYpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZkFuZENoaWxkcmVuKToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHR1cmVNYXBwZXJOb2RlOjpjb21iaW5lTWFza3MpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dHVyZU1hcHBlck5vZGU6OmJvdW5kaW5nUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlTWFwcGVyTm9kZTo6cGFpbnRSZWN1cnNpdmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVy
ZU1hcHBlck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlU2VsZik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5nU3RhdGUpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5oOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dHVyZU1hcHBlclBhaW50T3B0aW9uczo6VGV4dHVyZU1hcHBlclBhaW50T3B0aW9u
cyk6CisKIDIwMTItMDEtMTMgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KIAogICAg
ICAgICBJbXBsZW1lbnQgZmxleC1hbGlnbgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuY3BwCmluZGV4IDI2MjJkMjEu
LmQxN2U5NTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Rl
eG1hcC9UZXh0dXJlTWFwcGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5jcHAKQEAgLTI2LDE4ICsyNiwyMCBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIFBhc3NSZWZQdHI8Qml0bWFwVGV4dHVyZT4gVGV4dHVyZU1hcHBlcjo6
YWNxdWlyZVRleHR1cmVGcm9tUG9vbChjb25zdCBJbnRTaXplJiBzaXplKQogewotICAgIGlmICht
X3RleHR1cmVQb29sLmlzRW1wdHkoKSkgewotICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4g
c2VsZWN0ZWRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZSgpOwotICAgICAgICBzZWxlY3RlZFRleHR1
cmUtPnJlc2V0KHNpemUsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0ZWRUZXh0dXJlLT5sb2NrKCk7
Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZFRleHR1cmU7Ci0gICAgfQorICAgIFJlZlB0cjxCaXRt
YXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1cmU7CiAKLSAgICBzaXplX3QgaW5kZXggPSAwOwotICAg
IFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1cmUgPSBtX3RleHR1cmVQb29sWzBd
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV90ZXh0dXJlUG9vbC5zaXplKCk7ICsraSkg
eworICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4mIHRleHR1cmUgPSBtX3RleHR1cmVQb29s
W2ldOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtX3RleHR1cmVQb29sLnNpemUoKTsg
KytpKSB7Ci0gICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiB0ZXh0dXJlID0gbV90ZXh0dXJl
UG9vbFtpXTsKKyAgICAgICAgLy8gSWYgdGhlIHN1cmZhY2UgaGFzIG9ubHkgb25lIHJlZmVyZW5j
ZSwgd2UgY2FuIHNhZmVseSByZXVzZSBpdC4KKyAgICAgICAgaWYgKHRleHR1cmUtPnJlZkNvdW50
KCkgPiAxKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gV2UgZGVmYXVsdCB0
byB0aGUgZmlyc3QgYXZhaWxhYmxlIHRleHR1cmUuCisgICAgICAgIGlmICghc2VsZWN0ZWRUZXh0
dXJlKSB7CisgICAgICAgICAgICBzZWxlY3RlZFRleHR1cmUgPSB0ZXh0dXJlOworICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBJbnRTaXplIHRleHR1cmVTaXplID0g
dGV4dHVyZS0+c2l6ZSgpOwogICAgICAgICBJbnRTaXplIHNlbGVjdGVkVGV4dHVyZVNpemUgPSBz
ZWxlY3RlZFRleHR1cmUtPnNpemUoKTsKQEAgLTU4LDIyICs2MCwxNiBAQCBQYXNzUmVmUHRyPEJp
dG1hcFRleHR1cmU+IFRleHR1cmVNYXBwZXI6OmFjcXVpcmVUZXh0dXJlRnJvbVBvb2woY29uc3Qg
SW50U2l6ZSYgcwogICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgc2VsZWN0ZWRUZXh0
dXJlID0gdGV4dHVyZTsKLSAgICAgICAgaW5kZXggPSBpOwogICAgIH0KIAotICAgIG1fdGV4dHVy
ZVBvb2wucmVtb3ZlKGluZGV4KTsKKyAgICBpZiAoIXNlbGVjdGVkVGV4dHVyZSkgeworICAgICAg
ICBzZWxlY3RlZFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKCk7CisgICAgICAgIG1fdGV4dHVyZVBv
b2wuYXBwZW5kKHNlbGVjdGVkVGV4dHVyZSk7CisgICAgfQorCiAgICAgc2VsZWN0ZWRUZXh0dXJl
LT5yZXNldChzaXplLCBmYWxzZSk7Ci0gICAgc2VsZWN0ZWRUZXh0dXJlLT5sb2NrKCk7CiAgICAg
cmV0dXJuIHNlbGVjdGVkVGV4dHVyZTsKIH0KIAotdm9pZCBUZXh0dXJlTWFwcGVyOjpyZWxlYXNl
VGV4dHVyZVRvUG9vbChCaXRtYXBUZXh0dXJlKiB0ZXh0dXJlKQotewotICAgIGlmICghdGV4dHVy
ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fdGV4dHVyZVBvb2wuYXBwZW5kKHRleHR1cmUpOwot
ICAgIHRleHR1cmUtPnVubG9jaygpOwotfQotCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oCmluZGV4
IGQ4MTMzM2QuLjc2ZTM0NzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaApAQCAtMTI2LDcgKzEyNiw2IEBAIHB1
YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYmVnaW5QYWludGluZygpIHsgfQogICAgIHZpcnR1YWwg
dm9pZCBlbmRQYWludGluZygpIHsgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VUZXh0dXJl
VG9Qb29sKEJpdG1hcFRleHR1cmUqIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxC
aXRtYXBUZXh0dXJlPiBhY3F1aXJlVGV4dHVyZUZyb21Qb29sKGNvbnN0IEludFNpemUmKTsKIAog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4
dHVyZU1hcHBlck5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4
bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcAppbmRleCAzYmZkZmRlLi4zZDg3NjhlIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBl
ck5vZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9U
ZXh0dXJlTWFwcGVyTm9kZS5jcHAKQEAgLTUwLDIyICs1MCw2IEBAIHZvaWQgVGV4dHVyZU1hcHBl
ck5vZGU6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4KQog
ICAgIG1fdHJhbnNmb3JtLnNldExvY2FsVHJhbnNmb3JtKG1hdHJpeCk7CiB9CiAKLWludCBUZXh0
dXJlTWFwcGVyTm9kZTo6Y291bnREZXNjZW5kYW50c1dpdGhDb250ZW50KCkgY29uc3QKLXsKLSAg
ICBpZiAoIW1fc3RhdGUudmlzaWJsZSB8fCAoIW1fc2l6ZS53aWR0aCgpICYmICFtX3NpemUuaGVp
Z2h0KCkgJiYgbV9zdGF0ZS5tYXNrc1RvQm91bmRzKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
aW50IGNvdW50ID0gKG1fc2l6ZS53aWR0aCgpICYmIG1fc2l6ZS5oZWlnaHQoKSAmJiAobV9zdGF0
ZS5kcmF3c0NvbnRlbnQgfHwgbV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSAhPSBIVE1MQ29u
dGVudFR5cGUpKSA/IDEgOiAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jaGlsZHJl
bi5zaXplKCk7ICsraSkKLSAgICAgICAgY291bnQgKz0gbV9jaGlsZHJlbltpXS0+Y291bnREZXNj
ZW5kYW50c1dpdGhDb250ZW50KCk7Ci0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLXZvaWQgVGV4
dHVyZU1hcHBlck5vZGU6OmNvbXB1dGVPdmVybGFwc0lmTmVlZGVkKCkKLXsKLSAgICBtX3N0YXRl
Lm1pZ2h0SGF2ZU92ZXJsYXBzID0gY291bnREZXNjZW5kYW50c1dpdGhDb250ZW50KCkgPiAxOwot
fQotCiB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpjb21wdXRlVHJhbnNmb3Jtc1JlY3Vyc2l2ZSgp
CiB7CiAgICAgaWYgKG1fc2l6ZS5pc0VtcHR5KCkgJiYgbV9zdGF0ZS5tYXNrc1RvQm91bmRzKQpA
QCAtNzMsMTMgKzU3LDE0IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OmNvbXB1dGVUcmFuc2Zv
cm1zUmVjdXJzaXZlKCkKIAogICAgIC8vIENvbXB1dGUgdHJhbnNmb3JtcyByZWN1cnNpdmVseSBv
biB0aGUgd2F5IGRvd24gdG8gbGVhZnMuCiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcGFyZW50
VHJhbnNmb3JtOwotICAgIGlmIChtX3BhcmVudCkKLSAgICAgICAgcGFyZW50VHJhbnNmb3JtID0g
bV9wYXJlbnQtPm1fdHJhbnNmb3JtLmNvbWJpbmVkRm9yQ2hpbGRyZW4oKTsKLSAgICBlbHNlIGlm
IChtX2VmZmVjdFRhcmdldCkKLSAgICAgICAgcGFyZW50VHJhbnNmb3JtID0gbV9lZmZlY3RUYXJn
ZXQtPm1fdHJhbnNmb3JtLmNvbWJpbmVkKCk7CisgICAgVGV4dHVyZU1hcHBlck5vZGUqIHBhcmVu
dCA9IG1fcGFyZW50ID8gbV9wYXJlbnQgOiBtX2VmZmVjdFRhcmdldDsKKyAgICBpZiAocGFyZW50
KQorICAgICAgICBwYXJlbnRUcmFuc2Zvcm0gPSBwYXJlbnQtPm1fdHJhbnNmb3JtLmNvbWJpbmVk
Rm9yQ2hpbGRyZW4oKTsKICAgICBtX3RyYW5zZm9ybS5jb21iaW5lVHJhbnNmb3JtcyhwYXJlbnRU
cmFuc2Zvcm0pOwogCiAgICAgbV9zdGF0ZS52aXNpYmxlID0gbV9zdGF0ZS5iYWNrZmFjZVZpc2li
aWxpdHkgfHwgbV90cmFuc2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkubTMzKCkgPj0gMDsKKyAg
ICBpZiAoIW1fc3RhdGUudmlzaWJsZSAmJiAhbV9zdGF0ZS5wcmVzZXJ2ZXMzRCkKKyAgICAgICAg
cmV0dXJuOwogCiAgICAgaWYgKG1fcGFyZW50ICYmIG1fcGFyZW50LT5tX3N0YXRlLnByZXNlcnZl
czNEKQogICAgICAgICBtX2NlbnRlclogPSBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLm1hcFBvaW50
KEZsb2F0UG9pbnQzRChtX3NpemUud2lkdGgoKSAvIDIsIG1fc2l6ZS5oZWlnaHQoKSAvIDIsIDAp
KS56KCk7CkBAIC0zMTksMTYgKzMwNCwxMyBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWlu
dFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICBpZiAo
bV9zaXplLmlzRW1wdHkoKSB8fCAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYmIG1fY3VycmVudENv
bnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBlKSkKICAgICAgICAgcmV0dXJuOwog
Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAgIFJlZlB0cjxCaXRt
YXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAobV9zdGF0ZS5tYXNrTGF5
ZXIpCi0gICAgICAgIG1hc2tUZXh0dXJlID0gbV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsK
LSAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1f
c3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSBtX3N0YXRlLnJl
cGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsKLQotICAgIGZsb2F0IG9w
YWNpdHkgPSBvcHRpb25zLmlzU3VyZmFjZSA/IDEgOiBvcHRpb25zLm9wYWNpdHk7CisgICAgZmxv
YXQgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eTsKKyAgICBCaXRtYXBUZXh0dXJlKiBtYXNrID0g
b3B0aW9ucy5tYXNrOwogICAgIEZsb2F0UmVjdCB0YXJnZXRSZWN0ID0gdGhpcy0+dGFyZ2V0UmVj
dCgpOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybSA9CisgICAgICAgICAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeChvcHRpb25zLnRyYW5zZm9ybSkKKyAgICAgICAgICAgIC5tdWx0
aXBseShtX3RyYW5zZm9ybS5jb21iaW5lZCgpKQorICAgICAgICAgICAgLnRyYW5zbGF0ZShvcHRp
b25zLm9mZnNldC53aWR0aCgpLCBvcHRpb25zLm9mZnNldC5oZWlnaHQoKSk7CiAKICNpZiBVU0Uo
VElMRURfQkFDS0lOR19TVE9SRSkKICAgICBWZWN0b3I8RXh0ZXJuYWxseU1hbmFnZWRUaWxlPiB0
aWxlc1RvUGFpbnQ7CkBAIC0zNTEsMjAgKzMzMywxMSBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2Rl
OjpwYWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAg
ICAgICAgICAgICAgICB0aWxlcy5wcmVwZW5kKCZpdC0+c2Vjb25kKTsKICAgICAgICAgfQogCi0g
ICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXg7CiAgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgdGlsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEV4dGVybmFs
bHlNYW5hZ2VkVGlsZSYgdGlsZSA9ICp0aWxlc1tpXTsKICAgICAgICAgICAgIEZsb2F0UmVjdCBy
ZWN0ID0gdGlsZS5mcm9udEJ1ZmZlci50YXJnZXRSZWN0OwotCi0gICAgICAgICAgICBmbG9hdCBy
ZXBsaWNhT3BhY2l0eSA9IDEuMDsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXll
cikgewotICAgICAgICAgICAgICAgIHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXll
ci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKS5zY2FsZSgxLjAgLyB0aWxlLnNjYWxlKTsKLSAgICAg
ICAgICAgICAgICByZXBsaWNhT3BhY2l0eSA9IG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXll
ci0+bV9vcGFjaXR5OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQml0bWFwVGV4dHVyZSYg
dGV4dHVyZSA9ICp0aWxlLmZyb250QnVmZmVyLnRleHR1cmU7Ci0gICAgICAgICAgICBpZiAobV9z
dGF0ZS5yZXBsaWNhTGF5ZXIpCi0gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVy
LT5kcmF3VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCByZXBsaWNhTWF0cml4LCByZXBsaWNhT3BhY2l0
eSwgcmVwbGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1Rl
eHR1cmUuZ2V0KCkpOwotICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4
dHVyZSh0ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRp
b25zLmlzU3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgICAgICBvcHRp
b25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKHRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwg
b3BhY2l0eSwgbWFzayk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM3
MywyNSArMzQ2LDEyIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZihjb25zdCBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogICAgIC8vIE5vdyB3ZSBwYWludCBv
d25lZCB0aWxlcywgaWYgd2UncmUgaW4gT3duZWRUaWxlTW9kZS4KICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1fb3duZWRUaWxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBCaXRtYXBUZXh0
dXJlKiB0ZXh0dXJlID0gbV9vd25lZFRpbGVzW2ldLnRleHR1cmUuZ2V0KCk7Ci0gICAgICAgIGlm
IChtX3N0YXRlLnJlcGxpY2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpIHsKLSAgICAgICAg
ICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1cmUsIHRhcmdldFJl
Y3RGb3JUaWxlUmVjdCh0YXJnZXRSZWN0LCBtX293bmVkVGlsZXNbaV0ucmVjdCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3RyYW5zZm9ybS5j
b21iaW5lZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ICogbV9zdGF0
ZS5yZXBsaWNhTGF5ZXItPm1fb3BhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmVwbGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1
cmUuZ2V0KCkpOwotICAgICAgICB9Ci0KICAgICAgICAgY29uc3QgRmxvYXRSZWN0IHJlY3QgPSB0
YXJnZXRSZWN0Rm9yVGlsZVJlY3QodGFyZ2V0UmVjdCwgbV9vd25lZFRpbGVzW2ldLnJlY3QpOwot
ICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCp0ZXh0dXJlLCByZWN0
LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAg
OiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJh
d1RleHR1cmUoKnRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiAgICAg
fQogCi0gICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50
VHlwZSAmJiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKSB7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJl
cGxpY2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpCi0gICAgICAgICAgICBtX2N1cnJlbnRD
b250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIs
IHRhcmdldFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1h
c2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkp
OwotICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihv
cHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCks
IG9wYWNpdHksIG9wdGlvbnMuaXNTdXJmYWNlID8gMCA6IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAg
ICB9CisgICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50
VHlwZSAmJiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKQorICAgICAgICBtX2N1cnJlbnRDb250ZW50
Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdl
dFJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiB9CiAKIGludCBUZXh0dXJlTWFwcGVy
Tm9kZTo6Y29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZv
aWQqIGIpCkBAIC00MDYsOTYgKzM2Niw0NyBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpzb3J0
QnlaT3JkZXIoVmVjdG9yPFRleHR1cmVNYXBwZXJOb2RlKiA+JiBhcnJheSwgaW50IGZpcgogICAg
IHFzb3J0KGFycmF5LmRhdGEoKSwgYXJyYXkuc2l6ZSgpLCBzaXplb2YoVGV4dHVyZU1hcHBlck5v
ZGUqKSwgY29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVlKTsKIH0KIAotdm9pZCBUZXh0dXJlTWFw
cGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0
aW9ucyYgb3B0aW9ucywgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9uc0ZvckRlc2Nl
bmRhbnRzKQordm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29u
c3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKIHsKICAgICBib29sIGhhc0Ns
aXAgPSBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgJiYgIW1fY2hpbGRyZW4uaXNFbXB0eSgpOwogICAg
IGlmIChoYXNDbGlwKQotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJlZ2luQ2xpcCht
X3RyYW5zZm9ybS5jb21iaW5lZCgpLCBGbG9hdFJlY3QoMCwgMCwgbV9zaXplLndpZHRoKCksIG1f
c2l6ZS5oZWlnaHQoKSkpOworICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJlZ2luQ2xp
cChUcmFuc2Zvcm1hdGlvbk1hdHJpeChvcHRpb25zLnRyYW5zZm9ybSkubXVsdGlwbHkobV90cmFu
c2Zvcm0uY29tYmluZWQoKSksIEZsb2F0UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXpl
LmhlaWdodCgpKSk7CiAKICAgICBwYWludFNlbGYob3B0aW9ucyk7CiAKICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyArK2kpCi0gICAgICAgIG1fY2hpbGRyZW5baV0t
PnBhaW50UmVjdXJzaXZlKG9wdGlvbnNGb3JEZXNjZW5kYW50cyk7CisgICAgICAgIG1fY2hpbGRy
ZW5baV0tPnBhaW50UmVjdXJzaXZlKG9wdGlvbnMpOwogCiAgICAgaWYgKGhhc0NsaXApCiAgICAg
ICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZW5kQ2xpcCgpOwogfQogCi1ib29sIFRleHR1cmVN
YXBwZXJOb2RlOjpwYWludFJlZmxlY3Rpb24oY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9u
cyYgb3B0aW9ucywgQml0bWFwVGV4dHVyZSogY29udGVudFN1cmZhY2UpCitQYXNzUmVmUHRyPEJp
dG1hcFRleHR1cmU+IFRleHR1cmVNYXBwZXJOb2RlOjpjb21iaW5lTWFza3MoVGV4dHVyZU1hcHBl
ck5vZGUqIG1hc2sxLCBUZXh0dXJlTWFwcGVyTm9kZSogbWFzazIsIFRleHR1cmVNYXBwZXIqIHRl
eHR1cmVNYXBwZXIpCiB7Ci0gICAgaWYgKCFtX3N0YXRlLnJlcGxpY2FMYXllcikKLSAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmICghbWFzazEgJiYgIW1hc2syKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBpZiAoIW1hc2sxIHx8ICFtYXNrMikKKyAgICAgICAgcmV0dXJuIG1hc2sxID8gbWFz
azEtPnRleHR1cmUoKSA6IG1hc2syLT50ZXh0dXJlKCk7CisgICAgUmVmUHRyPEJpdG1hcFRleHR1
cmU+IGludGVybWVkaWF0ZSA9IHRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wo
SW50U2l6ZShtYXNrMS0+c2l6ZSgpKSk7CisgICAgdGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uo
aW50ZXJtZWRpYXRlLmdldCgpKTsKKyAgICB0ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqbWFz
azEtPnRleHR1cmUoKSwgbWFzazEtPmVudGlyZVJlY3QoKSwgVHJhbnNmb3JtYXRpb25NYXRyaXgo
KSwgMSwgbWFzazItPnRleHR1cmUoKSk7CisgICAgcmV0dXJuIGludGVybWVkaWF0ZTsKK30KIAot
ICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzdXJmYWNlKGNvbnRlbnRTdXJmYWNlKTsKLSAgICBS
ZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1
cmU+IHJlcGxpY2FNYXNrU3VyZmFjZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGlj
YU1hc2tUZXh0dXJlOwotCi0gICAgaWYgKFRleHR1cmVNYXBwZXJOb2RlKiByZXBsaWNhTWFzayA9
IG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3N0YXRlLm1hc2tMYXllcikKLSAgICAgICAgcmVwbGlj
YU1hc2tUZXh0dXJlID0gcmVwbGljYU1hc2stPnRleHR1cmUoKTsKLQotICAgIFJlZlB0cjxCaXRt
YXBUZXh0dXJlPiBtYXNrVGV4dHVyZTsKLSAgICBpZiAoVGV4dHVyZU1hcHBlck5vZGUqIG1hc2sg
PSBtX3N0YXRlLm1hc2tMYXllcikKLSAgICAgICAgbWFza1RleHR1cmUgPSBtYXNrLT50ZXh0dXJl
KCk7Ci0KLSAgICBjb25zdCBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IG9wdGlvbnMudGV4dHVyZU1h
cHBlci0+dmlld3BvcnRTaXplKCk7Ci0gICAgY29uc3QgYm9vbCB1c2VJbnRlcm1lZGlhdGVCdWZm
ZXJGb3JSZXBsaWNhID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgb3B0aW9ucy5vcGFjaXR5IDwg
MC45OTsKLSAgICBjb25zdCBib29sIHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvck1hc2sgPSBtYXNr
VGV4dHVyZSAmJiByZXBsaWNhTWFza1RleHR1cmU7Ci0gICAgY29uc3QgRmxvYXRSZWN0IHZpZXdw
b3J0UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgp
KTsKLSAgICAvLyBSZXZlcnNlIHRoaXMgbGF5ZXIncyB0cmFuc2Zvcm0gb24gdGhlIHJlcGxpY2En
cyB0cmFuc2Zvcm0gYW5kIHVzZSBpdCB3aXRoIHRoZSBjb250ZW50cwotICAgIC8vIGludGVybWVk
aWF0ZSBzdXJmYWNlLCBhcHBsaWVkIGluIHRoZSB2aWV3cG9ydCBjb29yZGluYXRlIHN5c3RlbS4K
LSAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCByZXBsaWNhTWF0cml4ID0gbV9zdGF0ZS5yZXBsaWNh
TGF5ZXItPm1fdHJhbnNmb3JtLmNvbWJpbmVkKCk7Ci0gICAgcmVwbGljYU1hdHJpeC5tdWx0aXBs
eShtX3RyYW5zZm9ybS5jb21iaW5lZCgpLmludmVyc2UoKSk7Ci0KLSAgICAvLyBUaGUgbWFzayBo
YXMgdG8gYmUgYWRqdXN0ZWQgdG8gdGFyZ2V0IGNvb3JkaW5hdGVzLgotICAgIGlmIChtYXNrVGV4
dHVyZSkgewotICAgICAgICBtYXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNx
dWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgp
KTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShtYXNrU3VyZmFj
ZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKm1h
c2tUZXh0dXJlLmdldCgpLCBlbnRpcmVSZWN0KCksIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIDEs
IDApOwotICAgICAgICBtYXNrVGV4dHVyZSA9IG1hc2tTdXJmYWNlOwotICAgIH0KLQotICAgIC8v
IFRoZSByZXBsaWNhJ3MgbWFzayBoYXMgdG8gYmUgYWRqdXN0ZWQgdG8gdGFyZ2V0IGNvb3JkaW5h
dGVzLgotICAgIGlmIChyZXBsaWNhTWFza1RleHR1cmUpIHsKLSAgICAgICAgcmVwbGljYU1hc2tT
dXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKHJlcGxpY2FNYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAg
ICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnJlcGxpY2FNYXNrVGV4dHVy
ZS5nZXQoKSwgZW50aXJlUmVjdCgpLCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCAxLCAwKTsKLSAg
ICAgICAgcmVwbGljYU1hc2tUZXh0dXJlID0gcmVwbGljYU1hc2tTdXJmYWNlOwotICAgIH0KLQot
ICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gYXBwbHkgdGhlIG1hc2sgb2YgdGhlIGNvbnRlbnQgbGF5
ZXIgYmVmb3JlIHdlIGRyYXcgdGhlIHJlZmxlY3Rpb24sIGFzIHRoZXJlIG1pZ2h0IGJlIHlldCBh
bm90aGVyIG1hc2sgZm9yIHRoZSByZWZsZWN0aW9uIGl0c2VsZi4KLSAgICBpZiAodXNlSW50ZXJt
ZWRpYXRlQnVmZmVyRm9yTWFzaykgewotICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFz
a1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wo
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2UuZ2V0KCkpOwotICAgICAgICBv
cHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9y
dFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIDEsIG1hc2tUZXh0dXJlLmdldCgpKTsKLSAg
ICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNl
LmdldCgpKTsKLSAgICAgICAgc3VyZmFjZSA9IG1hc2tTdXJmYWNlOwotICAgICAgICBtYXNrVGV4
dHVyZS5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIFdlIGJsZW5kIHRoZSBsYXllciBhbmQgaXRz
IHJlcGxpY2EgaW4gYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBiZWZvcmUgYmxlbmRpbmcgaW50byB0
aGUgdGFyZ2V0IHN1cmZhY2UuCi0gICAgaWYgKHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvclJlcGxp
Y2EpIHsKLSAgICAgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHJlcGxpY2FTdXJmYWNlID0gb3B0
aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9wdGlvbnMudGV4dHVy
ZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXIt
PmJpbmRTdXJmYWNlKHJlcGxpY2FTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCByZXBs
aWNhTWF0cml4LCBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LCByZXBsaWNhTWFza1Rl
eHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJl
KCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIDEs
IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxl
YXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdldCgpKTsKLSAgICAgICAgc3VyZmFjZSA9IHJlcGxp
Y2FTdXJmYWNlOworSW50UmVjdCBUZXh0dXJlTWFwcGVyTm9kZTo6Ym91bmRpbmdSZWN0KGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgpCit7CisgICAgSW50UmVjdCByZWN0OworICAg
IFRyYW5zZm9ybWF0aW9uTWF0cml4IGxvY2FsVHJhbnNmb3JtID0gVHJhbnNmb3JtYXRpb25NYXRy
aXgobWF0cml4KS5tdWx0aXBseShtX3RyYW5zZm9ybS5jb21iaW5lZCgpKTsKKyAgICByZWN0ID0g
bG9jYWxUcmFuc2Zvcm0ubWFwUmVjdChlbmNsb3NpbmdJbnRSZWN0KGVudGlyZVJlY3QoKSkpOwor
ICAgIGlmICghbV9zdGF0ZS5tYXNrc1RvQm91bmRzICYmICFtX3N0YXRlLm1hc2tMYXllcikgewor
ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyArK2kpCisgICAg
ICAgICAgICByZWN0LnVuaXRlKG1fY2hpbGRyZW5baV0tPmJvdW5kaW5nUmVjdChtYXRyaXgpKTsK
ICAgICB9CiAKLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG9wdGlvbnMu
c3VyZmFjZSk7Ci0KLSAgICAvLyBEcmF3IHRoZSByZWZsZWN0aW9uLgotICAgIGlmICghdXNlSW50
ZXJtZWRpYXRlQnVmZmVyRm9yUmVwbGljYSkKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVy
LT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCByZXBsaWNhTWF0cml4
LCBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LCByZXBsaWNhTWFza1RleHR1cmUuZ2V0
KCkpOwotCi0gICAgLy8gRHJhdyB0aGUgb3JpZ2luYWwuCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCgpLCBvcHRpb25zLm9wYWNpdHksIG1hc2tUZXh0dXJlLmdldCgpKTsKLQotICAg
IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+cmVsZWFzZVRleHR1cmVUb1Bvb2wobWFza1N1cmZhY2Uu
Z2V0KCkpOwotICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+cmVsZWFzZVRleHR1cmVUb1Bvb2wo
cmVwbGljYU1hc2tTdXJmYWNlLmdldCgpKTsKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIp
CisgICAgICAgIHJlY3QudW5pdGUobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPmJvdW5kaW5nUmVjdCht
YXRyaXgpKTsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiByZWN0OwogfQogCiB2b2lk
IFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFJlY3Vyc2l2ZShUZXh0dXJlTWFwcGVyUGFpbnRPcHRp
b25zIG9wdGlvbnMpCkBAIC01MDYsNTAgKzQxNyw1NCBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2Rl
OjpwYWludFJlY3Vyc2l2ZShUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIG9wdGlvbnMpCiAKICAg
ICBvcHRpb25zLm9wYWNpdHkgKj0gbV9vcGFjaXR5OwogICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJl
PiBzdXJmYWNlOwotCi0gICAgYm9vbCBoYXNSZXBsaWNhID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7
Ci0gICAgYm9vbCBoYXNNYXNrID0gbV9zdGF0ZS5tYXNrTGF5ZXI7Ci0gICAgYm9vbCBuZWVkc0Js
ZW5kaW5nID0gbV9vcGFjaXR5IDwgMC45OSB8fCBoYXNNYXNrOwotICAgIGJvb2wgcGFpbnRzTW9y
ZVRoYW5PbmVUZXh0dXJlID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpIHx8IGhhc01vcmVUaGFuT25l
VGlsZSgpIHx8IChoYXNNYXNrICYmIG1fc3RhdGUubWFza0xheWVyLT5oYXNNb3JlVGhhbk9uZVRp
bGUoKSk7Ci0gICAgYm9vbCBoYXNPdmVybGFwcyA9IG1fc3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMg
fHwgaGFzUmVwbGljYTsKLSAgICBjb25zdCBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCk7Ci0gICAgYm9vbCBuZWVkc1R3b1Bhc3MgPSAo
KGhhc1JlcGxpY2EgfHwgaGFzTWFzaykgJiYgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlKSB8fCAo
bmVlZHNCbGVuZGluZyAmJiBoYXNPdmVybGFwcyk7Ci0gICAgb3B0aW9ucy5pc1N1cmZhY2UgPSBm
YWxzZTsKLQotICAgIFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgb3B0aW9uc0ZvckRlc2NlbmRh
bnRzKG9wdGlvbnMpOwotCi0gICAgaWYgKCFuZWVkc1R3b1Bhc3MpIHsKLSAgICAgICAgcGFpbnRT
ZWxmQW5kQ2hpbGRyZW4ob3B0aW9ucywgb3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICBSZWZQ
dHI8Qml0bWFwVGV4dHVyZT4gbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1fc3Rh
dGUubWFza0xheWVyLT50ZXh0dXJlKCkgOiAwOworICAgIFRleHR1cmVNYXBwZXJQYWludE9wdGlv
bnMgcGFpbnRPcHRpb25zKG9wdGlvbnMpOworICAgIHBhaW50T3B0aW9ucy5tYXNrID0gbWFza1Rl
eHR1cmUuZ2V0KCk7CisgICAgSW50UmVjdCBzdXJmYWNlUmVjdDsKKworICAgIGJvb2wgaGFzT3Bh
Y2l0eSA9IG1fb3BhY2l0eSA+IDAuMDEgJiYgbV9vcGFjaXR5IDwgMC45OTsKKyAgICBib29sIGhh
c0NoaWxkcmVuID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpOworICAgIGJvb2wgaGFzUmVwbGljYSA9
ICEhbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7CisgICAgYm9vbCBoYXNNYXNrID0gISFtX3N0YXRlLm1h
c2tMYXllcjsKKyAgICBib29sIGhhc092ZXJsYXBwaW5nUmVwbGljYSA9CisgICAgICAgICAgICBo
YXNSZXBsaWNhCisgICAgICAgICAgICAmJiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zv
cm0uY29tYmluZWQoKS4KKyAgICAgICAgICAgICAgICAgICAgbWFwUmVjdChlbnRpcmVSZWN0KCkp
CisgICAgICAgICAgICAgICAgICAgIC5pbnRlcnNlY3RzKG1fdHJhbnNmb3JtLmNvbWJpbmVkKCku
bWFwUmVjdChlbnRpcmVSZWN0KCkpKTsKKworICAgIGJvb2wgcmVxdWlyZXNUd29QYXNzUGFpbnRp
bmcgPQorICAgICAgICAgICAgIW1fc3RhdGUucHJlc2VydmVzM0QgJiYoKChoYXNPcGFjaXR5IHx8
IGhhc01hc2spICYmIGhhc0NoaWxkcmVuKQorICAgICAgICAgICAgfHwgKGhhc09wYWNpdHkgJiYg
aGFzT3ZlcmxhcHBpbmdSZXBsaWNhKSk7CisKKyAgICBpZiAocmVxdWlyZXNUd29QYXNzUGFpbnRp
bmcpIHsKKyAgICAgICAgc3VyZmFjZVJlY3QgPSBib3VuZGluZ1JlY3QobV90cmFuc2Zvcm0uY29t
YmluZWQoKS5pbnZlcnNlKCkpOworICAgICAgICBzdXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKHN1cmZhY2VSZWN0LnNpemUoKSk7CisgICAgICAg
IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uoc3VyZmFjZS5nZXQoKSk7CisgICAg
ICAgIHBhaW50T3B0aW9ucy50cmFuc2Zvcm0gPSBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLmludmVy
c2UoKTsKKyAgICAgICAgcGFpbnRPcHRpb25zLm9mZnNldCA9IC1JbnRTaXplKHN1cmZhY2VSZWN0
LngoKSwgc3VyZmFjZVJlY3QueSgpKTsKKyAgICAgICAgcGFpbnRPcHRpb25zLm9wYWNpdHkgPSAx
OworICAgICAgICBwYWludE9wdGlvbnMubWFzayA9IDA7CisgICAgICAgIHBhaW50T3B0aW9ucy5z
dXJmYWNlID0gc3VyZmFjZS5nZXQoKTsKKyAgICB9CisKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNh
TGF5ZXIpIHsKKyAgICAgICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyByZXBsaWNhT3B0aW9u
cyhwYWludE9wdGlvbnMpOworICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGljYU1h
c2tUZXh0dXJlID0gY29tYmluZU1hc2tzKG1fc3RhdGUubWFza0xheWVyLCBtX3N0YXRlLnJlcGxp
Y2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXIsIG9wdGlvbnMudGV4dHVyZU1hcHBlcik7CisgICAg
ICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uoc3VyZmFjZS5nZXQoKSk7Cisg
ICAgICAgIHJlcGxpY2FPcHRpb25zLnRyYW5zZm9ybQorICAgICAgICAgICAgICAgICAgLm11bHRp
cGx5KG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5lZCgpKQorICAgICAg
ICAgICAgICAgICAgLm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkuaW52ZXJzZSgpKTsK
KyAgICAgICAgcmVwbGljYU9wdGlvbnMubWFzayA9IHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKTsK
KyAgICAgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW4ocmVwbGljYU9wdGlvbnMpOworICAgIH0KKwor
ICAgIHBhaW50U2VsZkFuZENoaWxkcmVuKHBhaW50T3B0aW9ucyk7CisKKyAgICBpZiAoIXJlcXVp
cmVzVHdvUGFzc1BhaW50aW5nKQogICAgICAgICByZXR1cm47Ci0gICAgfQogCi0gICAgRmxvYXRS
ZWN0IHZpZXdwb3J0UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXpl
LmhlaWdodCgpKTsKLQotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFjZTsKLQot
ICAgIGlmIChtX3N0YXRlLm1hc2tMYXllcikgewotICAgICAgICBtYXNrU3VyZmFjZSA9IG9wdGlv
bnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVN
YXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5i
aW5kU3VyZmFjZShtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIFRleHR1cmVNYXBwZXJQYWlu
dE9wdGlvbnMgb3B0aW9uc0Zvck1hc2sob3B0aW9ucyk7Ci0gICAgICAgIG9wdGlvbnNGb3JNYXNr
LmlzU3VyZmFjZSA9IHRydWU7Ci0gICAgICAgIG1fc3RhdGUubWFza0xheWVyLT5wYWludFNlbGYo
b3B0aW9uc0Zvck1hc2spOwotICAgIH0KLQotICAgIHN1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVN
YXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3
cG9ydFNpemUoKSk7Ci0gICAgb3B0aW9uc0ZvckRlc2NlbmRhbnRzLnN1cmZhY2UgPSBzdXJmYWNl
LmdldCgpOwotICAgIG9wdGlvbnMuaXNTdXJmYWNlID0gdHJ1ZTsKLSAgICBvcHRpb25zRm9yRGVz
Y2VuZGFudHMub3BhY2l0eSA9IDE7Ci0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3Vy
ZmFjZShzdXJmYWNlLmdldCgpKTsKLQotICAgIHBhaW50U2VsZkFuZENoaWxkcmVuKG9wdGlvbnMs
IG9wdGlvbnNGb3JEZXNjZW5kYW50cyk7Ci0KLSAgICBpZiAoIXBhaW50UmVmbGVjdGlvbihvcHRp
b25zLCBzdXJmYWNlLmdldCgpKSkgewotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJp
bmRTdXJmYWNlKG9wdGlvbnMuc3VyZmFjZSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBl
ci0+ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwgVHJhbnNmb3JtYXRp
b25NYXRyaXgoKSwgb3B0aW9ucy5vcGFjaXR5LCBtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgfQot
Ci0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNl
LmdldCgpKTsKLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29s
KG1hc2tTdXJmYWNlLmdldCgpKTsKKyAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJm
YWNlKG9wdGlvbnMuc3VyZmFjZSk7CisgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4
dHVyZSgqc3VyZmFjZS5nZXQoKSwgc3VyZmFjZVJlY3QsIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCks
IG9wdGlvbnMub3BhY2l0eSwgbWFza1RleHR1cmUuZ2V0KCkpOwogfQogCiBUZXh0dXJlTWFwcGVy
Tm9kZTo6flRleHR1cmVNYXBwZXJOb2RlKCkKQEAgLTczMyw2ICs2NDgsNyBAQCB2b2lkIFRleHR1
cmVNYXBwZXJOb2RlOjpzeW5jQ29tcG9zaXRpbmdTdGF0ZVNlbGYoR3JhcGhpY3NMYXllclRleHR1
cmVNYXBwZXIqIGdyYQogICAgIG1fc3RhdGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gZ3JhcGhpY3NM
YXllci0+YmFja2ZhY2VWaXNpYmlsaXR5KCk7CiAgICAgbV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9y
bSA9IGdyYXBoaWNzTGF5ZXItPmNoaWxkcmVuVHJhbnNmb3JtKCk7CiAgICAgbV9zdGF0ZS5vcGFj
aXR5ID0gZ3JhcGhpY3NMYXllci0+b3BhY2l0eSgpOworCiAgICAgbV9jdXJyZW50Q29udGVudC5j
b250ZW50VHlwZSA9IHBlbmRpbmdDb250ZW50LmNvbnRlbnRUeXBlOwogICAgIG1fY3VycmVudENv
bnRlbnQuaW1hZ2UgPSBwZW5kaW5nQ29udGVudC5pbWFnZTsKICAgICBtX2N1cnJlbnRDb250ZW50
Lm1lZGlhID0gcGVuZGluZ0NvbnRlbnQubWVkaWE7CkBAIC05ODQsNyArOTAwLDYgQEAgdm9pZCBU
ZXh0dXJlTWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5nU3RhdGUoR3JhcGhpY3NMYXllclRleHR1
cmVNYXBwZXIqIGdyYXBoaWMKICAgICBzeW5jQW5pbWF0aW9ucyhncmFwaGljc0xheWVyKTsKIAog
ICAgIGNvbXB1dGVUaWxlcygpOwotICAgIGNvbXB1dGVPdmVybGFwc0lmTmVlZGVkKCk7CiAKICAg
ICBpZiAoZ3JhcGhpY3NMYXllcikKICAgICAgICAgcmVuZGVyQ29udGVudCh0ZXh0dXJlTWFwcGVy
LCBncmFwaGljc0xheWVyKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmgKaW5kZXggMzk2NWVlNi4uOGMy
M2Y1NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFw
L1RleHR1cmVNYXBwZXJOb2RlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmgKQEAgLTQ0LDE1ICs0NCwxNiBAQCBjbGFzcyBH
cmFwaGljc0xheWVyVGV4dHVyZU1hcHBlcjsKIGNsYXNzIFRleHR1cmVNYXBwZXJQYWludE9wdGlv
bnMgewogcHVibGljOgogICAgIEJpdG1hcFRleHR1cmUqIHN1cmZhY2U7Ci0gICAgVGV4dHVyZU1h
cHBlciogdGV4dHVyZU1hcHBlcjsKLQorICAgIEJpdG1hcFRleHR1cmUqIG1hc2s7CiAgICAgZmxv
YXQgb3BhY2l0eTsKLSAgICBib29sIGlzU3VyZmFjZTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCB0cmFuc2Zvcm07CisgICAgSW50U2l6ZSBvZmZzZXQ7CisgICAgVGV4dHVyZU1hcHBlciogdGV4
dHVyZU1hcHBlcjsKICAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zKCkKICAgICAgICAgOiBz
dXJmYWNlKDApCi0gICAgICAgICwgdGV4dHVyZU1hcHBlcigwKQorICAgICAgICAsIG1hc2soMCkK
ICAgICAgICAgLCBvcGFjaXR5KDEpCi0gICAgICAgICwgaXNTdXJmYWNlKGZhbHNlKQorICAgICAg
ICAsIHRleHR1cmVNYXBwZXIoMCkKICAgICB7IH0KIH07CiAKQEAgLTE3OSw4ICsxODAsOCBAQCBw
cml2YXRlOgogICAgIHZvaWQgY29tcHV0ZVRyYW5zZm9ybXNSZWN1cnNpdmUoKTsKICAgICB2b2lk
IGNvbXB1dGVPdmVybGFwc0lmTmVlZGVkKCk7CiAgICAgdm9pZCBjb21wdXRlVGlsZXMoKTsKKyAg
ICBJbnRSZWN0IGJvdW5kaW5nUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpOwogICAg
IHZvaWQgc3dhcENvbnRlbnRzQnVmZmVycygpOwotICAgIGludCBjb3VudERlc2NlbmRhbnRzV2l0
aENvbnRlbnQoKSBjb25zdDsKICAgICBGbG9hdFJlY3QgdGFyZ2V0UmVjdEZvclRpbGVSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgdG90YWxUYXJnZXRSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0
KSBjb25zdDsKICAgICB2b2lkIGludmFsaWRhdGVWaWV3cG9ydChjb25zdCBGbG9hdFJlY3QmKTsK
ICAgICB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VNYXNrKTsKQEAgLTE5Miw5ICsxOTMsOCBAQCBw
cml2YXRlOgogICAgIEJpdG1hcFRleHR1cmUqIHRleHR1cmUoKSB7IHJldHVybiBtX293bmVkVGls
ZXMuaXNFbXB0eSgpID8gMCA6IG1fb3duZWRUaWxlc1swXS50ZXh0dXJlLmdldCgpOyB9CiAKICAg
ICB2b2lkIHBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMpOwotICAgIGJv
b2wgcGFpbnRSZWZsZWN0aW9uKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmLCBCaXRt
YXBUZXh0dXJlKiBzdXJmYWNlKTsKICAgICB2b2lkIHBhaW50U2VsZihjb25zdCBUZXh0dXJlTWFw
cGVyUGFpbnRPcHRpb25zJik7Ci0gICAgdm9pZCBwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiwgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0
aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICB2b2lkIHBhaW50U2VsZkFuZENoaWxkcmVuKGNvbnN0
IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmKTsKICAgICB2b2lkIHJlbmRlckNvbnRlbnQoVGV4
dHVyZU1hcHBlciosIEdyYXBoaWNzTGF5ZXIqKTsKIAogICAgIHZvaWQgc3luY0FuaW1hdGlvbnMo
R3JhcGhpY3NMYXllclRleHR1cmVNYXBwZXIqKTsKQEAgLTIwNSw2ICsyMDUsNyBAQCBwcml2YXRl
OgogICAgIGJvb2wgaGFzT3BhY2l0eUFuaW1hdGlvbigpIGNvbnN0OwogICAgIGJvb2wgaGFzVHJh
bnNmb3JtQW5pbWF0aW9uKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNNb3JlVGhhbk9uZVRpbGUoKSBj
b25zdDsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxCaXRtYXBUZXh0dXJlPiBjb21iaW5lTWFza3Mo
VGV4dHVyZU1hcHBlck5vZGUqLCBUZXh0dXJlTWFwcGVyTm9kZSosIFRleHR1cmVNYXBwZXIqKTsK
IAogICAgIExheWVyVHJhbnNmb3JtIG1fdHJhbnNmb3JtOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122564</attachid>
            <date>2012-01-15 08:45:23 -0800</date>
            <delta_ts>2012-01-15 09:05:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>26627</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4OThlMTBhLi5iYmVjMmJmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzgg
QEAKKzIwMTItMDEtMTUgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBbVGV4bWFwXSBUZXh0dXJlTWFwcGVyIGNyZWF0ZXMgdHdvIG1hbnkgYmln
IGludGVybWVkaWF0ZSBzdXJmYWNlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzYzMzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGUgZm9sbG93aW5nIGhhcyBiZWVuIGRvbmUgdG8gb3B0aW1pemUgc3Vy
ZmFjZSBhbGxvY2F0aW9uOgorICAgICAgICAxLiBJbnN0ZWFkIG9mIHVzaW5nIGEgdmlld3BvcnQt
c2l6ZSBzdXJmYWNlLCB1c2UgYSBzdXJmYWNlIGluIHRoZSBzaXplIG9mIHRoZSBsYXllcidzCisg
ICAgICAgICAgIGJvdW5kaW5nIHJlY3QgYW5kIGFwcGx5IHRoZSB0cmFuc2Zvcm0gYWZ0ZXIgdGhl
IGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQgaW50byBpdC4KKyAgICAgICAgMi4gQXZvaWQgZ2Vu
ZXJhdGlnIGludGVybWVkaWF0ZSBzdXJmYWNlIGZvciBvY2Nhc2lvbnMgd2hlcmUgdGhleSdyZSBu
b3QgbmVjZXNzYXJ5LAorICAgICAgICAgICBzdWNoIGFzIG5lc3RlZCByZWZsZWN0aW9ucyB3aXRo
b3V0IG9wYWNpdHkuCisgICAgICAgIDMuIFJlbGVhc2luZyBvZiB0ZXh0dXJlcyBmcm9tIHRoZSBw
b29sIGlzIG5vdyBpbXBsaWNpdCwgYmFzZWQgb24gcmVmQ291bnQuCisgICAgICAgIDQuIERvIG5v
dCB1c2UgaW50ZXJtZWRpYXRlIHN1cmZhY2VzIGZvciBwcmVzZXJ2ZS0zZCBsYXllcnMuIFRoaXMg
aXMgaW4gYWxpZ25tZW50IHdpdGgKKyAgICAgICAgICAgU2FmYXJpLgorCisgICAgICAgIFRlc3Rz
IGluIExheW91dFRlc3RzL2NvbXBvc2l0aW5nL21hc2tzIGFuZCBMYXlvdXRUZXN0cy9jb21wb3Np
dGluZy9yZWZsZWN0aW9uIGNvdmVyIHRoaXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy90ZXhtYXAvVGV4dHVyZU1hcHBlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFw
cGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3Rl
eG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFw
cGVyTm9kZTo6Y29tcHV0ZVRyYW5zZm9ybXNSZWN1cnNpdmUpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJl
TWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dHVyZU1hcHBlck5vZGU6OmJvdW5kaW5nUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJl
TWFwcGVyTm9kZTo6c2hvdWxkUGFpbnRUb0ludGVybWVkaWF0ZVN1cmZhY2UpOgorICAgICAgICAo
V2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OmlzVmlzaWJsZSk6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYSk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRSZWN1cnNpdmUpOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlU2Vs
Zik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5n
U3RhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVy
Tm9kZS5oOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlclBhaW50T3B0aW9uczo6VGV4
dHVyZU1hcHBlclBhaW50T3B0aW9ucyk6CisKIDIwMTItMDEtMTMgIE9qYW4gVmFmYWkgIDxvamFu
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBJbXBsZW1lbnQgZmxleC1hbGlnbgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIu
Y3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBw
ZXIuY3BwCmluZGV4IDI2MjJkMjEuLmQxN2U5NTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5jcHAKQEAgLTI2
LDE4ICsyNiwyMCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFBhc3NSZWZQdHI8Qml0bWFwVGV4
dHVyZT4gVGV4dHVyZU1hcHBlcjo6YWNxdWlyZVRleHR1cmVGcm9tUG9vbChjb25zdCBJbnRTaXpl
JiBzaXplKQogewotICAgIGlmIChtX3RleHR1cmVQb29sLmlzRW1wdHkoKSkgewotICAgICAgICBS
ZWZQdHI8Qml0bWFwVGV4dHVyZT4gc2VsZWN0ZWRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZSgpOwot
ICAgICAgICBzZWxlY3RlZFRleHR1cmUtPnJlc2V0KHNpemUsIGZhbHNlKTsKLSAgICAgICAgc2Vs
ZWN0ZWRUZXh0dXJlLT5sb2NrKCk7Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZFRleHR1cmU7Ci0g
ICAgfQorICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1cmU7CiAKLSAgICBz
aXplX3QgaW5kZXggPSAwOwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1
cmUgPSBtX3RleHR1cmVQb29sWzBdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV90ZXh0
dXJlUG9vbC5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4mIHRl
eHR1cmUgPSBtX3RleHR1cmVQb29sW2ldOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBt
X3RleHR1cmVQb29sLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJl
PiB0ZXh0dXJlID0gbV90ZXh0dXJlUG9vbFtpXTsKKyAgICAgICAgLy8gSWYgdGhlIHN1cmZhY2Ug
aGFzIG9ubHkgb25lIHJlZmVyZW5jZSwgd2UgY2FuIHNhZmVseSByZXVzZSBpdC4KKyAgICAgICAg
aWYgKHRleHR1cmUtPnJlZkNvdW50KCkgPiAxKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgLy8gV2UgZGVmYXVsdCB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIHRleHR1cmUuCisgICAg
ICAgIGlmICghc2VsZWN0ZWRUZXh0dXJlKSB7CisgICAgICAgICAgICBzZWxlY3RlZFRleHR1cmUg
PSB0ZXh0dXJlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBJ
bnRTaXplIHRleHR1cmVTaXplID0gdGV4dHVyZS0+c2l6ZSgpOwogICAgICAgICBJbnRTaXplIHNl
bGVjdGVkVGV4dHVyZVNpemUgPSBzZWxlY3RlZFRleHR1cmUtPnNpemUoKTsKQEAgLTU4LDIyICs2
MCwxNiBAQCBQYXNzUmVmUHRyPEJpdG1hcFRleHR1cmU+IFRleHR1cmVNYXBwZXI6OmFjcXVpcmVU
ZXh0dXJlRnJvbVBvb2woY29uc3QgSW50U2l6ZSYgcwogICAgICAgICAgICAgY29udGludWU7CiAK
ICAgICAgICAgc2VsZWN0ZWRUZXh0dXJlID0gdGV4dHVyZTsKLSAgICAgICAgaW5kZXggPSBpOwog
ICAgIH0KIAotICAgIG1fdGV4dHVyZVBvb2wucmVtb3ZlKGluZGV4KTsKKyAgICBpZiAoIXNlbGVj
dGVkVGV4dHVyZSkgeworICAgICAgICBzZWxlY3RlZFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKCk7
CisgICAgICAgIG1fdGV4dHVyZVBvb2wuYXBwZW5kKHNlbGVjdGVkVGV4dHVyZSk7CisgICAgfQor
CiAgICAgc2VsZWN0ZWRUZXh0dXJlLT5yZXNldChzaXplLCBmYWxzZSk7Ci0gICAgc2VsZWN0ZWRU
ZXh0dXJlLT5sb2NrKCk7CiAgICAgcmV0dXJuIHNlbGVjdGVkVGV4dHVyZTsKIH0KIAotdm9pZCBU
ZXh0dXJlTWFwcGVyOjpyZWxlYXNlVGV4dHVyZVRvUG9vbChCaXRtYXBUZXh0dXJlKiB0ZXh0dXJl
KQotewotICAgIGlmICghdGV4dHVyZSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fdGV4dHVyZVBv
b2wuYXBwZW5kKHRleHR1cmUpOwotICAgIHRleHR1cmUtPnVubG9jaygpOwotfQotCiB9CiAjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9U
ZXh0dXJlTWFwcGVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAv
VGV4dHVyZU1hcHBlci5oCmluZGV4IGQ4MTMzM2QuLmMxZGNiYmQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaApA
QCAtMTI2LDcgKzEyNiw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYmVnaW5QYWludGlu
ZygpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBlbmRQYWludGluZygpIHsgfQogCi0gICAgdmlydHVh
bCB2b2lkIHJlbGVhc2VUZXh0dXJlVG9Qb29sKEJpdG1hcFRleHR1cmUqIHN1cmZhY2UpOworICAg
IC8vIEEgc3VyZmFjZSBpcyByZWxlYXNlZCBpbXBsaWNpdGx5IHdoZW4gZGVyZWZlcmVuY2VkLgog
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxCaXRtYXBUZXh0dXJlPiBhY3F1aXJlVGV4dHVyZUZyb21Q
b29sKGNvbnN0IEludFNpemUmKTsKIAogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcAppbmRleCAz
YmZkZmRlLi5iMTRkZTdjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAKQEAgLTUwLDIyICs1
MCw2IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgbWF0cml4KQogICAgIG1fdHJhbnNmb3JtLnNldExvY2FsVHJhbnNmb3Jt
KG1hdHJpeCk7CiB9CiAKLWludCBUZXh0dXJlTWFwcGVyTm9kZTo6Y291bnREZXNjZW5kYW50c1dp
dGhDb250ZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIW1fc3RhdGUudmlzaWJsZSB8fCAoIW1fc2l6
ZS53aWR0aCgpICYmICFtX3NpemUuaGVpZ2h0KCkgJiYgbV9zdGF0ZS5tYXNrc1RvQm91bmRzKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaW50IGNvdW50ID0gKG1fc2l6ZS53aWR0aCgpICYmIG1f
c2l6ZS5oZWlnaHQoKSAmJiAobV9zdGF0ZS5kcmF3c0NvbnRlbnQgfHwgbV9jdXJyZW50Q29udGVu
dC5jb250ZW50VHlwZSAhPSBIVE1MQ29udGVudFR5cGUpKSA/IDEgOiAwOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAgICAgY291bnQgKz0g
bV9jaGlsZHJlbltpXS0+Y291bnREZXNjZW5kYW50c1dpdGhDb250ZW50KCk7Ci0KLSAgICByZXR1
cm4gY291bnQ7Ci19Ci0KLXZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OmNvbXB1dGVPdmVybGFwc0lm
TmVlZGVkKCkKLXsKLSAgICBtX3N0YXRlLm1pZ2h0SGF2ZU92ZXJsYXBzID0gY291bnREZXNjZW5k
YW50c1dpdGhDb250ZW50KCkgPiAxOwotfQotCiB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpjb21w
dXRlVHJhbnNmb3Jtc1JlY3Vyc2l2ZSgpCiB7CiAgICAgaWYgKG1fc2l6ZS5pc0VtcHR5KCkgJiYg
bV9zdGF0ZS5tYXNrc1RvQm91bmRzKQpAQCAtNzMsOCArNTcsOCBAQCB2b2lkIFRleHR1cmVNYXBw
ZXJOb2RlOjpjb21wdXRlVHJhbnNmb3Jtc1JlY3Vyc2l2ZSgpCiAKICAgICAvLyBDb21wdXRlIHRy
YW5zZm9ybXMgcmVjdXJzaXZlbHkgb24gdGhlIHdheSBkb3duIHRvIGxlYWZzLgogICAgIFRyYW5z
Zm9ybWF0aW9uTWF0cml4IHBhcmVudFRyYW5zZm9ybTsKLSAgICBpZiAobV9wYXJlbnQpCi0gICAg
ICAgIHBhcmVudFRyYW5zZm9ybSA9IG1fcGFyZW50LT5tX3RyYW5zZm9ybS5jb21iaW5lZEZvckNo
aWxkcmVuKCk7CisgICAgaWYgKHBhcmVudCkKKyAgICAgICAgcGFyZW50VHJhbnNmb3JtID0gcGFy
ZW50LT5tX3RyYW5zZm9ybS5jb21iaW5lZEZvckNoaWxkcmVuKCk7CiAgICAgZWxzZSBpZiAobV9l
ZmZlY3RUYXJnZXQpCiAgICAgICAgIHBhcmVudFRyYW5zZm9ybSA9IG1fZWZmZWN0VGFyZ2V0LT5t
X3RyYW5zZm9ybS5jb21iaW5lZCgpOwogICAgIG1fdHJhbnNmb3JtLmNvbWJpbmVUcmFuc2Zvcm1z
KHBhcmVudFRyYW5zZm9ybSk7CkBAIC0yMDQsMzUgKzE4OCw2IEBAIGJvb2wgVGV4dHVyZU1hcHBl
ck5vZGU6OmNvbGxlY3RWaXNpYmxlQ29udGVudHNSZWN0cyhOb2RlUmVjdE1hcCYgcmVjdE1hcCwg
Y29uc3QKIH0KICNlbmRpZgogCi1ib29sIFRleHR1cmVNYXBwZXJOb2RlOjpoYXNNb3JlVGhhbk9u
ZVRpbGUoKSBjb25zdAotewotICAgIGludCB0aWxlcyA9IDA7Ci0KLSNpZiBVU0UoVElMRURfQkFD
S0lOR19TVE9SRSkKLSAgICBpZiAobV9zdGF0ZS50aWxlT3duZXJzaGlwID09IEV4dGVybmFsbHlN
YW5hZ2VkVGlsZXMpIHsKLSAgICAgICAgSGFzaE1hcDxpbnQsIEV4dGVybmFsbHlNYW5hZ2VkVGls
ZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fZXh0ZXJuYWxseU1hbmFnZWRUaWxlcy5lbmQoKTsK
LSAgICAgICAgZm9yIChIYXNoTWFwPGludCwgRXh0ZXJuYWxseU1hbmFnZWRUaWxlPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX2V4dGVybmFsbHlNYW5hZ2VkVGlsZXMuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5mcm9udEJ1ZmZlci50ZXh0dXJl
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrdGlsZXMgPiAxKQotICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9v
d25lZFRpbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX293bmVkVGlsZXNbaV0udGV4
dHVyZSkgewotICAgICAgICAgICAgaWYgKCsrdGlsZXMgPiAxKQotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0K
IHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnJlbmRlckNvbnRlbnQoVGV4dHVyZU1hcHBlciogdGV4
dHVyZU1hcHBlciwgR3JhcGhpY3NMYXllciogbGF5ZXIpCiB7CiAjaWYgVVNFKFRJTEVEX0JBQ0tJ
TkdfU1RPUkUpCkBAIC0zMTksMTcgKzI3NCwxNiBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpw
YWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICBp
ZiAobV9zaXplLmlzRW1wdHkoKSB8fCAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYmIG1fY3VycmVu
dENvbnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBlKSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAgIFJlZlB0cjxC
aXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAobV9zdGF0ZS5tYXNr
TGF5ZXIpCi0gICAgICAgIG1hc2tUZXh0dXJlID0gbV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUo
KTsKLSAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgbV9zdGF0ZS5yZXBsaWNhTGF5ZXIt
Pm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSBtX3N0YXRl
LnJlcGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsKLQotICAgIGZsb2F0
IG9wYWNpdHkgPSBvcHRpb25zLmlzU3VyZmFjZSA/IDEgOiBvcHRpb25zLm9wYWNpdHk7CisgICAg
ZmxvYXQgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eTsKKyAgICBCaXRtYXBUZXh0dXJlKiBtYXNr
ID0gb3B0aW9ucy5tYXNrOwogICAgIEZsb2F0UmVjdCB0YXJnZXRSZWN0ID0gdGhpcy0+dGFyZ2V0
UmVjdCgpOwogCisgICAgLy8gV2UgYXBwbHkgdGhlIHRyYW5zZm9ybSB0aGF0IGlzIGdlbmVyYXRl
ZCB0byBjb21wZW5zYXRlIGZvciBwYWludGluZyBpbnRvIGEgc3VyZmFjZS4KKyAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm0gPQorICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXgob3B0aW9ucy50cmFuc2Zvcm0pCisgICAgICAgICAgICAubXVsdGlwbHkobV90cmFuc2Zvcm0u
Y29tYmluZWQoKSkKKyAgICAgICAgICAgIC50cmFuc2xhdGUob3B0aW9ucy5vZmZzZXQud2lkdGgo
KSwgb3B0aW9ucy5vZmZzZXQuaGVpZ2h0KCkpOworCiAjaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RP
UkUpCiAgICAgVmVjdG9yPEV4dGVybmFsbHlNYW5hZ2VkVGlsZT4gdGlsZXNUb1BhaW50OwogCkBA
IC0zNTEsMjAgKzMwNSwxMSBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGYoY29u
c3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICAgICAgICAgICAgICB0
aWxlcy5wcmVwZW5kKCZpdC0+c2Vjb25kKTsKICAgICAgICAgfQogCi0gICAgICAgIFRyYW5zZm9y
bWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXg7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
dGlsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEV4dGVybmFsbHlNYW5hZ2VkVGlsZSYg
dGlsZSA9ICp0aWxlc1tpXTsKICAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0ID0gdGlsZS5mcm9u
dEJ1ZmZlci50YXJnZXRSZWN0OwotCi0gICAgICAgICAgICBmbG9hdCByZXBsaWNhT3BhY2l0eSA9
IDEuMDsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllcikgewotICAgICAgICAg
ICAgICAgIHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0u
Y29tYmluZWQoKS5zY2FsZSgxLjAgLyB0aWxlLnNjYWxlKTsKLSAgICAgICAgICAgICAgICByZXBs
aWNhT3BhY2l0eSA9IG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5Owot
ICAgICAgICAgICAgfQogICAgICAgICAgICAgQml0bWFwVGV4dHVyZSYgdGV4dHVyZSA9ICp0aWxl
LmZyb250QnVmZmVyLnRleHR1cmU7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5
ZXIpCi0gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0
ZXh0dXJlLCByZWN0LCByZXBsaWNhTWF0cml4LCByZXBsaWNhT3BhY2l0eSwgcmVwbGljYU1hc2tU
ZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwot
ICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0ZXh0dXJlLCBy
ZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/
IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPmRyYXdUZXh0dXJlKHRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7
CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM3MywyNSArMzE4LDEyIEBA
IHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZihjb25zdCBUZXh0dXJlTWFwcGVyUGFp
bnRPcHRpb25zJiBvcHRpb25zKQogICAgIC8vIE5vdyB3ZSBwYWludCBvd25lZCB0aWxlcywgaWYg
d2UncmUgaW4gT3duZWRUaWxlTW9kZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fb3du
ZWRUaWxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBCaXRtYXBUZXh0dXJlKiB0ZXh0dXJlID0g
bV9vd25lZFRpbGVzW2ldLnRleHR1cmUuZ2V0KCk7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxp
Y2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpIHsKLSAgICAgICAgICAgIG9wdGlvbnMudGV4
dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1cmUsIHRhcmdldFJlY3RGb3JUaWxlUmVjdCh0
YXJnZXRSZWN0LCBtX293bmVkVGlsZXNbaV0ucmVjdCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5lZCgpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ICogbV9zdGF0ZS5yZXBsaWNhTGF5ZXIt
Pm1fb3BhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0
dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAg
ICAgICB9Ci0KICAgICAgICAgY29uc3QgRmxvYXRSZWN0IHJlY3QgPSB0YXJnZXRSZWN0Rm9yVGls
ZVJlY3QodGFyZ2V0UmVjdCwgbV9vd25lZFRpbGVzW2ldLnJlY3QpOwotICAgICAgICBvcHRpb25z
LnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCp0ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5j
b21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5n
ZXQoKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1
cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiAgICAgfQogCi0gICAgaWYgKG1f
Y3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAmJiBtX2N1cnJl
bnRDb250ZW50Lm1lZGlhKSB7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllciAmJiAh
b3B0aW9ucy5pc1N1cmZhY2UpCi0gICAgICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5w
YWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
X3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgKiBt
X3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0dXJlID8gcmVw
bGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBtX2N1
cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVN
YXBwZXIsIHRhcmdldFJlY3QsIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIG9wYWNpdHksIG9wdGlv
bnMuaXNTdXJmYWNlID8gMCA6IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICB9CisgICAgaWYgKG1f
Y3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAmJiBtX2N1cnJl
bnRDb250ZW50Lm1lZGlhKQorICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRv
VGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsIHRyYW5zZm9y
bSwgb3BhY2l0eSwgbWFzayk7CiB9CiAKIGludCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcGFyZUdy
YXBoaWNzTGF5ZXJzWlZhbHVlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCkBAIC00MDYs
MTUwICszMzgsMTMwIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnNvcnRCeVpPcmRlcihWZWN0
b3I8VGV4dHVyZU1hcHBlck5vZGUqID4mIGFycmF5LCBpbnQgZmlyCiAgICAgcXNvcnQoYXJyYXku
ZGF0YSgpLCBhcnJheS5zaXplKCksIHNpemVvZihUZXh0dXJlTWFwcGVyTm9kZSopLCBjb21wYXJl
R3JhcGhpY3NMYXllcnNaVmFsdWUpOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWlu
dFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25z
LCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zRm9yRGVzY2VuZGFudHMpCit2b2lk
IFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFw
cGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogewogICAgIGJvb2wgaGFzQ2xpcCA9IG1fc3RhdGUu
bWFza3NUb0JvdW5kcyAmJiAhbV9jaGlsZHJlbi5pc0VtcHR5KCk7CiAgICAgaWYgKGhhc0NsaXAp
Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKG1fdHJhbnNmb3JtLmNv
bWJpbmVkKCksIEZsb2F0UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgp
KSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKFRyYW5zZm9ybWF0
aW9uTWF0cml4KG9wdGlvbnMudHJhbnNmb3JtKS5tdWx0aXBseShtX3RyYW5zZm9ybS5jb21iaW5l
ZCgpKSwgRmxvYXRSZWN0KDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpKTsK
IAogICAgIHBhaW50U2VsZihvcHRpb25zKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9j
aGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFpbnRSZWN1cnNp
dmUob3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFpbnRS
ZWN1cnNpdmUob3B0aW9ucyk7CiAKICAgICBpZiAoaGFzQ2xpcCkKICAgICAgICAgb3B0aW9ucy50
ZXh0dXJlTWFwcGVyLT5lbmRDbGlwKCk7CiB9CiAKLWJvb2wgVGV4dHVyZU1hcHBlck5vZGU6OnBh
aW50UmVmbGVjdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zLCBC
aXRtYXBUZXh0dXJlKiBjb250ZW50U3VyZmFjZSkKK0ludFJlY3QgVGV4dHVyZU1hcHBlck5vZGU6
OmJvdW5kaW5nUmVjdCgpCiB7Ci0gICAgaWYgKCFtX3N0YXRlLnJlcGxpY2FMYXllcikKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBib3VuZGluZ1JlY3QobV90cmFuc2Zvcm0uY29t
YmluZWQoKS5pbnZlcnNlKCkpOworfQogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHN1cmZh
Y2UoY29udGVudFN1cmZhY2UpOwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFj
ZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGljYU1hc2tTdXJmYWNlOwotICAgIFJl
ZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAoVGV4dHVy
ZU1hcHBlck5vZGUqIHJlcGxpY2FNYXNrID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3RhdGUu
bWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSByZXBsaWNhTWFzay0+dGV4
dHVyZSgpOwotCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAgIGlm
IChUZXh0dXJlTWFwcGVyTm9kZSogbWFzayA9IG1fc3RhdGUubWFza0xheWVyKQotICAgICAgICBt
YXNrVGV4dHVyZSA9IG1hc2stPnRleHR1cmUoKTsKLQotICAgIGNvbnN0IEludFNpemUgdmlld3Bv
cnRTaXplID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKTsKLSAgICBjb25z
dCBib29sIHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvclJlcGxpY2EgPSBtX3N0YXRlLnJlcGxpY2FM
YXllciAmJiBvcHRpb25zLm9wYWNpdHkgPCAwLjk5OwotICAgIGNvbnN0IGJvb2wgdXNlSW50ZXJt
ZWRpYXRlQnVmZmVyRm9yTWFzayA9IG1hc2tUZXh0dXJlICYmIHJlcGxpY2FNYXNrVGV4dHVyZTsK
LSAgICBjb25zdCBGbG9hdFJlY3Qgdmlld3BvcnRSZWN0KDAsIDAsIHZpZXdwb3J0U2l6ZS53aWR0
aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpOwotICAgIC8vIFJldmVyc2UgdGhpcyBsYXllcidz
IHRyYW5zZm9ybSBvbiB0aGUgcmVwbGljYSdzIHRyYW5zZm9ybSBhbmQgdXNlIGl0IHdpdGggdGhl
IGNvbnRlbnRzCi0gICAgLy8gaW50ZXJtZWRpYXRlIHN1cmZhY2UsIGFwcGxpZWQgaW4gdGhlIHZp
ZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxp
Y2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKTsK
LSAgICByZXBsaWNhTWF0cml4Lm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkuaW52ZXJz
ZSgpKTsKLQotICAgIC8vIFRoZSBtYXNrIGhhcyB0byBiZSBhZGp1c3RlZCB0byB0YXJnZXQgY29v
cmRpbmF0ZXMuCi0gICAgaWYgKG1hc2tUZXh0dXJlKSB7Ci0gICAgICAgIG1hc2tTdXJmYWNlID0g
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9wdGlvbnMudGV4
dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPmJpbmRTdXJmYWNlKG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqbWFza1RleHR1cmUuZ2V0KCksIGVudGlyZVJlY3QoKSwg
bV90cmFuc2Zvcm0uY29tYmluZWQoKSwgMSwgMCk7Ci0gICAgICAgIG1hc2tUZXh0dXJlID0gbWFz
a1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gVGhlIHJlcGxpY2EncyBtYXNrIGhhcyB0byBiZSBh
ZGp1c3RlZCB0byB0YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKHJlcGxpY2FNYXNrVGV4dHVy
ZSkgewotICAgICAgICByZXBsaWNhTWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXIt
PmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNp
emUoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UocmVwbGlj
YU1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3
VGV4dHVyZSgqcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpLCBlbnRpcmVSZWN0KCksIG1fdHJhbnNm
b3JtLmNvbWJpbmVkKCksIDEsIDApOwotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSByZXBs
aWNhTWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gV2UgbWlnaHQgbmVlZCB0byBhcHBseSB0
aGUgbWFzayBvZiB0aGUgY29udGVudCBsYXllciBiZWZvcmUgd2UgZHJhdyB0aGUgcmVmbGVjdGlv
biwgYXMgdGhlcmUgbWlnaHQgYmUgeWV0IGFub3RoZXIgbWFzayBmb3IgdGhlIHJlZmxlY3Rpb24g
aXRzZWxmLgotICAgIGlmICh1c2VJbnRlcm1lZGlhdGVCdWZmZXJGb3JNYXNrKSB7Ci0gICAgICAg
IFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBl
ci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0
U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShtYXNr
U3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1
cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwg
MSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJl
bGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBzdXJmYWNlID0gbWFz
a1N1cmZhY2U7Ci0gICAgICAgIG1hc2tUZXh0dXJlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8g
V2UgYmxlbmQgdGhlIGxheWVyIGFuZCBpdHMgcmVwbGljYSBpbiBhbiBpbnRlcm1lZGlhdGUgYnVm
ZmVyIGJlZm9yZSBibGVuZGluZyBpbnRvIHRoZSB0YXJnZXQgc3VyZmFjZS4KLSAgICBpZiAodXNl
SW50ZXJtZWRpYXRlQnVmZmVyRm9yUmVwbGljYSkgewotICAgICAgICBSZWZQdHI8Qml0bWFwVGV4
dHVyZT4gcmVwbGljYVN1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0
dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAg
ICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UocmVwbGljYVN1cmZhY2UuZ2V0
KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNl
LmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRyaXgsIG1fc3RhdGUucmVwbGljYUxheWVy
LT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwg
VHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBv
cHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2UuZ2V0KCkp
OwotICAgICAgICBzdXJmYWNlID0gcmVwbGljYVN1cmZhY2U7CitJbnRSZWN0IFRleHR1cmVNYXBw
ZXJOb2RlOjpib3VuZGluZ1JlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCkK
K3sKKyAgICBJbnRSZWN0IHJlY3Q7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbG9jYWxUcmFu
c2Zvcm0gPSBUcmFuc2Zvcm1hdGlvbk1hdHJpeChtYXRyaXgpLm11bHRpcGx5KG1fdHJhbnNmb3Jt
LmNvbWJpbmVkKCkpOworICAgIHJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGxvY2FsVHJhbnNmb3Jt
Lm1hcFJlY3QoZW50aXJlUmVjdCgpKSk7CisgICAgaWYgKCFtX3N0YXRlLm1hc2tzVG9Cb3VuZHMg
JiYgIW1fc3RhdGUubWFza0xheWVyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9j
aGlsZHJlbi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHJlY3QudW5pdGUobV9jaGlsZHJlbltp
XS0+Ym91bmRpbmdSZWN0KG1hdHJpeCkpOwogICAgIH0KIAotICAgIG9wdGlvbnMudGV4dHVyZU1h
cHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKKyAgICBpZiAobV9zdGF0ZS5yZXBs
aWNhTGF5ZXIpCisgICAgICAgIHJlY3QudW5pdGUobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPmJvdW5k
aW5nUmVjdChtYXRyaXgpKTsKKworICAgIHJldHVybiByZWN0OworfQorCitib29sIFRleHR1cmVN
YXBwZXJOb2RlOjpzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSgpIGNvbnN0Cit7Cisg
ICAgYm9vbCBoYXNPcGFjaXR5ID0gbV9zdGF0ZS5vcGFjaXR5IDwgMC45OTsKKyAgICBib29sIGhh
c0NoaWxkcmVuID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpOworICAgIGJvb2wgaGFzUmVwbGljYSA9
ICEhbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7CisgICAgYm9vbCBoYXNNYXNrID0gISFtX3N0YXRlLm1h
c2tMYXllcjsKIAotICAgIC8vIERyYXcgdGhlIHJlZmxlY3Rpb24uCi0gICAgaWYgKCF1c2VJbnRl
cm1lZGlhdGVCdWZmZXJGb3JSZXBsaWNhKQotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXIt
PmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRyaXgs
IG1fc3RhdGUucmVwbGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQo
KSk7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHR3by1wYXNzIGJsZW5kaW5nIGZvciBwcmVzZXJ2ZXMt
M2QsIHRoYXQncyBpbiBzeW5jIHdpdGggU2FmYXJpLgorICAgIGlmIChtX3N0YXRlLnByZXNlcnZl
czNEKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBEcmF3IHRoZSBvcmlnaW5hbC4K
LSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2
aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIG9wdGlvbnMub3BhY2l0eSwgbWFz
a1RleHR1cmUuZ2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRlIHN1
cmZhY2Ugd2hlbiBibGVuZGluZyBzZXZlcmFsIGl0ZW1zIHdpdGggYW4gYW5jZXN0b3Igb3BhY2l0
eS4KKyAgICAvLyBUZXN0ZWQgYnkgY29tcG9zaXRpbmcvcmVmbGVjdGlvbnMvcmVmbGVjdGlvbi1v
cGFjaXR5Lmh0bWwKKyAgICBpZiAoaGFzT3BhY2l0eSAmJiAoaGFzQ2hpbGRyZW4gfHwgaGFzUmVw
bGljYSkpCisgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVy
LT5yZWxlYXNlVGV4dHVyZVRvUG9vbChtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgb3B0aW9ucy50
ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChyZXBsaWNhTWFza1N1cmZhY2UuZ2V0
KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRlIHN1cmZhY2Ugd2l0aCBh
IG1hc2tlZCBhbmNlc3Rvci4KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiByZXBsaWNhcyB0aGUgbWFz
ayBpcyBhcHBsaWVkIGJlZm9yZSByZXBsaWNhdGluZy4KKyAgICAvLyBUZXN0ZWQgYnkgY29tcG9z
aXRpbmcvbWFza3MvbWFza2VkLWFuY2VzdG9yLmh0bWwKKyAgICBpZiAoaGFzTWFzayAmJiBoYXND
aGlsZHJlbiAmJiAhaGFzUmVwbGljYSkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICByZXR1
cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVGV4dHVyZU1hcHBlck5vZGU6
OnBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgb3B0aW9ucykKK2Jvb2wg
VGV4dHVyZU1hcHBlck5vZGU6OmlzVmlzaWJsZSgpIGNvbnN0CiB7Ci0gICAgaWYgKChtX3NpemUu
aXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMKLSAgICAgICAgfHwgbV9jaGlsZHJl
bi5pc0VtcHR5KCkpKSB8fCAhbV9zdGF0ZS52aXNpYmxlIHx8IG9wdGlvbnMub3BhY2l0eSA8IDAu
MDEgfHwgbV9vcGFjaXR5IDwgMC4wMSkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChtX3NpemUu
aXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgfHwgbV9jaGlsZHJlbi5pc0VtcHR5
KCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnZpc2libGUgfHwg
bV9zdGF0ZS5vcGFjaXR5IDwgMC4wMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVy
biB0cnVlOworfQogCi0gICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKLSAgICBSZWZQ
dHI8Qml0bWFwVGV4dHVyZT4gc3VyZmFjZTsKK3ZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50
U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9u
cyYgb3B0aW9ucykKK3sKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpIHsKKyAgICAgICAg
VGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyByZXBsaWNhT3B0aW9ucyhvcHRpb25zKTsKKyAgICAg
ICAgLy8gV2UgY2hvb3NlIGVpdGhlciB0aGUgY29udGVudCdzIG1hc2sgb3IgdGhlIHJlcGxpY2En
cyBtYXNrLgorICAgICAgICAvLyBGSVhNRTogYmxlbmQgdGhlIHR3byBpZiBib3RoIGV4aXN0Lgor
ICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3RhdGUubWFza0xheWVyKQorICAg
ICAgICAgICAgcmVwbGljYU9wdGlvbnMubWFzayA9IG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3N0
YXRlLm1hc2tMYXllci0+dGV4dHVyZSgpOwogCi0gICAgYm9vbCBoYXNSZXBsaWNhID0gbV9zdGF0
ZS5yZXBsaWNhTGF5ZXI7Ci0gICAgYm9vbCBoYXNNYXNrID0gbV9zdGF0ZS5tYXNrTGF5ZXI7Ci0g
ICAgYm9vbCBuZWVkc0JsZW5kaW5nID0gbV9vcGFjaXR5IDwgMC45OSB8fCBoYXNNYXNrOwotICAg
IGJvb2wgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpIHx8
IGhhc01vcmVUaGFuT25lVGlsZSgpIHx8IChoYXNNYXNrICYmIG1fc3RhdGUubWFza0xheWVyLT5o
YXNNb3JlVGhhbk9uZVRpbGUoKSk7Ci0gICAgYm9vbCBoYXNPdmVybGFwcyA9IG1fc3RhdGUubWln
aHRIYXZlT3ZlcmxhcHMgfHwgaGFzUmVwbGljYTsKLSAgICBjb25zdCBJbnRTaXplIHZpZXdwb3J0
U2l6ZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCk7Ci0gICAgYm9vbCBu
ZWVkc1R3b1Bhc3MgPSAoKGhhc1JlcGxpY2EgfHwgaGFzTWFzaykgJiYgcGFpbnRzTW9yZVRoYW5P
bmVUZXh0dXJlKSB8fCAobmVlZHNCbGVuZGluZyAmJiBoYXNPdmVybGFwcyk7Ci0gICAgb3B0aW9u
cy5pc1N1cmZhY2UgPSBmYWxzZTsKKyAgICAgICAgcmVwbGljYU9wdGlvbnMudHJhbnNmb3JtCisg
ICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fdHJhbnNm
b3JtLmNvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV90cmFuc2Zvcm0u
Y29tYmluZWQoKS5pbnZlcnNlKCkpOworICAgICAgICBwYWludFNlbGZBbmRDaGlsZHJlbihyZXBs
aWNhT3B0aW9ucyk7CisgICAgfQogCi0gICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyBvcHRp
b25zRm9yRGVzY2VuZGFudHMob3B0aW9ucyk7CisgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW4ob3B0
aW9ucyk7Cit9CiAKLSAgICBpZiAoIW5lZWRzVHdvUGFzcykgewotICAgICAgICBwYWludFNlbGZB
bmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFudHMpOwordm9pZCBUZXh0dXJl
TWFwcGVyTm9kZTo6cGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyBvcHRp
b25zKQoreworICAgIGlmICghaXNWaXNpYmxlKCkpCiAgICAgICAgIHJldHVybjsKLSAgICB9Cisg
ICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKKyAgICBSZWZQdHI8Qml0bWFwVGV4dHVy
ZT4gbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1fc3RhdGUubWFza0xheWVyLT50
ZXh0dXJlKCkgOiAwOwogCi0gICAgRmxvYXRSZWN0IHZpZXdwb3J0UmVjdCgwLCAwLCB2aWV3cG9y
dFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKTsKKyAgICBUZXh0dXJlTWFwcGVy
UGFpbnRPcHRpb25zIHBhaW50T3B0aW9ucyhvcHRpb25zKTsKKyAgICBwYWludE9wdGlvbnMubWFz
ayA9IG1hc2tUZXh0dXJlLmdldCgpOworICAgIEludFJlY3Qgc3VyZmFjZVJlY3Q7CiAKLSAgICBS
ZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7CisgICAgUmVmUHRyPEJpdG1hcFRleHR1
cmU+IHN1cmZhY2U7CiAKLSAgICBpZiAobV9zdGF0ZS5tYXNrTGF5ZXIpIHsKLSAgICAgICAgbWFz
a1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wo
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2UuZ2V0KCkpOwotICAgICAgICBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIG9wdGlvbnNGb3JNYXNrKG9wdGlvbnMpOwotICAgICAg
ICBvcHRpb25zRm9yTWFzay5pc1N1cmZhY2UgPSB0cnVlOwotICAgICAgICBtX3N0YXRlLm1hc2tM
YXllci0+cGFpbnRTZWxmKG9wdGlvbnNGb3JNYXNrKTsKKyAgICBpZiAoIXNob3VsZFBhaW50VG9J
bnRlcm1lZGlhdGVTdXJmYWNlKCkpIHsKKyAgICAgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRo
UmVwbGljYShwYWludE9wdGlvbnMpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3Vy
ZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRp
b25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAgICBvcHRpb25zRm9yRGVzY2Vu
ZGFudHMuc3VyZmFjZSA9IHN1cmZhY2UuZ2V0KCk7Ci0gICAgb3B0aW9ucy5pc1N1cmZhY2UgPSB0
cnVlOwotICAgIG9wdGlvbnNGb3JEZXNjZW5kYW50cy5vcGFjaXR5ID0gMTsKKyAgICAvLyBQcmVw
YXJlIGEgc3VyZmFjZSB0byBwYWludCBpbnRvLgorICAgIC8vIFdlIHBhaW50IGludG8gdGhlIHN1
cmZhY2UgaWdub3JpbmcgdGhlIG9wYWNpdHkvdHJhbnNmb3JtIG9mIHRoZSBjdXJyZW50IGxheWVy
LgorICAgIHN1cmZhY2VSZWN0ID0gYm91bmRpbmdSZWN0KCk7CisgICAgc3VyZmFjZSA9IG9wdGlv
bnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChzdXJmYWNlUmVjdC5zaXpl
KCkpOwogICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uoc3VyZmFjZS5nZXQo
KSk7CisgICAgcGFpbnRPcHRpb25zLm9wYWNpdHkgPSAxOworICAgIHBhaW50T3B0aW9ucy50cmFu
c2Zvcm0gPSBtX3RyYW5zZm9ybS5jb21iaW5lZEZvckNoaWxkcmVuKCkuaW52ZXJzZSgpOworICAg
IHBhaW50T3B0aW9ucy5vZmZzZXQgPSAtSW50U2l6ZShzdXJmYWNlUmVjdC54KCksIHN1cmZhY2VS
ZWN0LnkoKSk7CiAKLSAgICBwYWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9y
RGVzY2VuZGFudHMpOworICAgIHBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EocGFpbnRP
cHRpb25zKTsKIAotICAgIGlmICghcGFpbnRSZWZsZWN0aW9uKG9wdGlvbnMsIHN1cmZhY2UuZ2V0
KCkpKSB7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0aW9u
cy5zdXJmYWNlKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgq
c3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBvcHRp
b25zLm9wYWNpdHksIG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICB9CisgICAgLy8gSWYgd2UgcGFp
bnRlZCB0aGUgcmVwbGljYSwgdGhlIG1hc2sgaXMgYWxyZWFkeSBiYWtlZCBpbiBzbyB3ZSBkb24n
dCBuZWVkIHRvIHBhaW50IGl0IGFnYWluLgorICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllcikK
KyAgICAgICAgbWFza1RleHR1cmUgPSAwOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5y
ZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdldCgpKTsKLSAgICBvcHRpb25zLnRleHR1cmVN
YXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKG1hc2tTdXJmYWNlLmdldCgpKTsKKyAgICBvcHRp
b25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG9wdGlvbnMuc3VyZmFjZSk7CisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggdGFyZ2V0VHJhbnNmb3JtID0gVHJhbnNmb3JtYXRpb25NYXRyaXgo
KS5tdWx0aXBseShvcHRpb25zLnRyYW5zZm9ybSkubXVsdGlwbHkobV90cmFuc2Zvcm0uY29tYmlu
ZWQoKSkudHJhbnNsYXRlKG9wdGlvbnMub2Zmc2V0LndpZHRoKCksIG9wdGlvbnMub2Zmc2V0Lmhl
aWdodCgpKTsKKyAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNl
LmdldCgpLCBzdXJmYWNlUmVjdCwgdGFyZ2V0VHJhbnNmb3JtLCBvcHRpb25zLm9wYWNpdHksIG1h
c2tUZXh0dXJlLmdldCgpKTsKIH0KIAogVGV4dHVyZU1hcHBlck5vZGU6On5UZXh0dXJlTWFwcGVy
Tm9kZSgpCkBAIC03MzMsNiArNjQ1LDcgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0Nv
bXBvc2l0aW5nU3RhdGVTZWxmKEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVyKiBncmEKICAgICBt
X3N0YXRlLmJhY2tmYWNlVmlzaWJpbGl0eSA9IGdyYXBoaWNzTGF5ZXItPmJhY2tmYWNlVmlzaWJp
bGl0eSgpOwogICAgIG1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0gPSBncmFwaGljc0xheWVyLT5j
aGlsZHJlblRyYW5zZm9ybSgpOwogICAgIG1fc3RhdGUub3BhY2l0eSA9IGdyYXBoaWNzTGF5ZXIt
Pm9wYWNpdHkoKTsKKwogICAgIG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPSBwZW5kaW5n
Q29udGVudC5jb250ZW50VHlwZTsKICAgICBtX2N1cnJlbnRDb250ZW50LmltYWdlID0gcGVuZGlu
Z0NvbnRlbnQuaW1hZ2U7CiAgICAgbV9jdXJyZW50Q29udGVudC5tZWRpYSA9IHBlbmRpbmdDb250
ZW50Lm1lZGlhOwpAQCAtOTg0LDcgKzg5Nyw2IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnN5
bmNDb21wb3NpdGluZ1N0YXRlKEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVyKiBncmFwaGljCiAg
ICAgc3luY0FuaW1hdGlvbnMoZ3JhcGhpY3NMYXllcik7CiAKICAgICBjb21wdXRlVGlsZXMoKTsK
LSAgICBjb21wdXRlT3ZlcmxhcHNJZk5lZWRlZCgpOwogCiAgICAgaWYgKGdyYXBoaWNzTGF5ZXIp
CiAgICAgICAgIHJlbmRlckNvbnRlbnQodGV4dHVyZU1hcHBlciwgZ3JhcGhpY3NMYXllcik7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVy
ZU1hcHBlck5vZGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9U
ZXh0dXJlTWFwcGVyTm9kZS5oCmluZGV4IDM5NjVlZTYuLmNmOTZkYmQgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5o
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFw
cGVyTm9kZS5oCkBAIC00NCwxNSArNDQsMTYgQEAgY2xhc3MgR3JhcGhpY3NMYXllclRleHR1cmVN
YXBwZXI7CiBjbGFzcyBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIHsKIHB1YmxpYzoKICAgICBC
aXRtYXBUZXh0dXJlKiBzdXJmYWNlOwotICAgIFRleHR1cmVNYXBwZXIqIHRleHR1cmVNYXBwZXI7
Ci0KKyAgICBCaXRtYXBUZXh0dXJlKiBtYXNrOwogICAgIGZsb2F0IG9wYWNpdHk7Ci0gICAgYm9v
bCBpc1N1cmZhY2U7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtOworICAgIElu
dFNpemUgb2Zmc2V0OworICAgIFRleHR1cmVNYXBwZXIqIHRleHR1cmVNYXBwZXI7CiAgICAgVGV4
dHVyZU1hcHBlclBhaW50T3B0aW9ucygpCiAgICAgICAgIDogc3VyZmFjZSgwKQotICAgICAgICAs
IHRleHR1cmVNYXBwZXIoMCkKKyAgICAgICAgLCBtYXNrKDApCiAgICAgICAgICwgb3BhY2l0eSgx
KQotICAgICAgICAsIGlzU3VyZmFjZShmYWxzZSkKKyAgICAgICAgLCB0ZXh0dXJlTWFwcGVyKDAp
CiAgICAgeyB9CiB9OwogCkBAIC0xNzksOCArMTgwLDkgQEAgcHJpdmF0ZToKICAgICB2b2lkIGNv
bXB1dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKCk7CiAgICAgdm9pZCBjb21wdXRlT3ZlcmxhcHNJZk5l
ZWRlZCgpOwogICAgIHZvaWQgY29tcHV0ZVRpbGVzKCk7CisgICAgSW50UmVjdCBib3VuZGluZ1Jl
Y3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKyAgICBJbnRSZWN0IGJvdW5kaW5nUmVj
dCgpOwogICAgIHZvaWQgc3dhcENvbnRlbnRzQnVmZmVycygpOwotICAgIGludCBjb3VudERlc2Nl
bmRhbnRzV2l0aENvbnRlbnQoKSBjb25zdDsKICAgICBGbG9hdFJlY3QgdGFyZ2V0UmVjdEZvclRp
bGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdG90YWxUYXJnZXRSZWN0LCBjb25zdCBGbG9hdFJlY3Qm
IHRpbGVSZWN0KSBjb25zdDsKICAgICB2b2lkIGludmFsaWRhdGVWaWV3cG9ydChjb25zdCBGbG9h
dFJlY3QmKTsKICAgICB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VNYXNrKTsKQEAgLTE5Miw5ICsx
OTQsOSBAQCBwcml2YXRlOgogICAgIEJpdG1hcFRleHR1cmUqIHRleHR1cmUoKSB7IHJldHVybiBt
X293bmVkVGlsZXMuaXNFbXB0eSgpID8gMCA6IG1fb3duZWRUaWxlc1swXS50ZXh0dXJlLmdldCgp
OyB9CiAKICAgICB2b2lkIHBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMp
OwotICAgIGJvb2wgcGFpbnRSZWZsZWN0aW9uKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlv
bnMmLCBCaXRtYXBUZXh0dXJlKiBzdXJmYWNlKTsKICAgICB2b2lkIHBhaW50U2VsZihjb25zdCBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJik7Ci0gICAgdm9pZCBwYWludFNlbGZBbmRDaGlsZHJl
bihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiwgVGV4dHVyZU1hcHBlclBhaW50T3B0
aW9ucyYgb3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICB2b2lkIHBhaW50U2VsZkFuZENoaWxk
cmVuKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmKTsKKyAgICB2b2lkIHBhaW50U2Vs
ZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYp
OwogICAgIHZvaWQgcmVuZGVyQ29udGVudChUZXh0dXJlTWFwcGVyKiwgR3JhcGhpY3NMYXllciop
OwogCiAgICAgdm9pZCBzeW5jQW5pbWF0aW9ucyhHcmFwaGljc0xheWVyVGV4dHVyZU1hcHBlciop
OwpAQCAtMjA0LDcgKzIwNiw4IEBAIHByaXZhdGU6CiAgICAgdm9pZCBhcHBseVRyYW5zZm9ybUFu
aW1hdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyQW5pbWF0aW9uJiwgY29uc3QgVHJhbnNmb3JtT3Bl
cmF0aW9ucyogc3RhcnQsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIGVuZCwgZG91YmxlKTsK
ICAgICBib29sIGhhc09wYWNpdHlBbmltYXRpb24oKSBjb25zdDsKICAgICBib29sIGhhc1RyYW5z
Zm9ybUFuaW1hdGlvbigpIGNvbnN0OwotICAgIGJvb2wgaGFzTW9yZVRoYW5PbmVUaWxlKCkgY29u
c3Q7CisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdDsKKyAgICBib29sIHNob3VsZFBhaW50VG9J
bnRlcm1lZGlhdGVTdXJmYWNlKCkgY29uc3Q7CiAKICAgICBMYXllclRyYW5zZm9ybSBtX3RyYW5z
Zm9ybTsKIAo=
</data>
<flag name="commit-queue"
          id="123393"
          type_id="3"
          status="-"
          setter="webkit-ews"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122565</attachid>
            <date>2012-01-15 09:05:59 -0800</date>
            <delta_ts>2012-01-15 09:21:38 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>26123</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4OThlMTBhLi5lOGFkNzdlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzgg
QEAKKzIwMTItMDEtMTUgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBbVGV4bWFwXSBUZXh0dXJlTWFwcGVyIGNyZWF0ZXMgdHdvIG1hbnkgYmln
IGludGVybWVkaWF0ZSBzdXJmYWNlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzYzMzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGUgZm9sbG93aW5nIGhhcyBiZWVuIGRvbmUgdG8gb3B0aW1pemUgc3Vy
ZmFjZSBhbGxvY2F0aW9uOgorICAgICAgICAxLiBJbnN0ZWFkIG9mIHVzaW5nIGEgdmlld3BvcnQt
c2l6ZSBzdXJmYWNlLCB1c2UgYSBzdXJmYWNlIGluIHRoZSBzaXplIG9mIHRoZSBsYXllcidzCisg
ICAgICAgICAgIGJvdW5kaW5nIHJlY3QgYW5kIGFwcGx5IHRoZSB0cmFuc2Zvcm0gYWZ0ZXIgdGhl
IGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQgaW50byBpdC4KKyAgICAgICAgMi4gQXZvaWQgZ2Vu
ZXJhdGlnIGludGVybWVkaWF0ZSBzdXJmYWNlIGZvciBvY2Nhc2lvbnMgd2hlcmUgdGhleSdyZSBu
b3QgbmVjZXNzYXJ5LAorICAgICAgICAgICBzdWNoIGFzIG5lc3RlZCByZWZsZWN0aW9ucyB3aXRo
b3V0IG9wYWNpdHkuCisgICAgICAgIDMuIFJlbGVhc2luZyBvZiB0ZXh0dXJlcyBmcm9tIHRoZSBw
b29sIGlzIG5vdyBpbXBsaWNpdCwgYmFzZWQgb24gcmVmQ291bnQuCisgICAgICAgIDQuIERvIG5v
dCB1c2UgaW50ZXJtZWRpYXRlIHN1cmZhY2VzIGZvciBwcmVzZXJ2ZS0zZCBsYXllcnMuIFRoaXMg
aXMgaW4gYWxpZ25tZW50IHdpdGgKKyAgICAgICAgICAgb3RoZXIgcG9ydHMuCisKKyAgICAgICAg
VGVzdHMgaW4gTGF5b3V0VGVzdHMvY29tcG9zaXRpbmcvbWFza3MgYW5kIExheW91dFRlc3RzL2Nv
bXBvc2l0aW5nL3JlZmxlY3Rpb24gY292ZXIgdGhpcy4KKworICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1
cmVNYXBwZXI6OmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1
cmVNYXBwZXJOb2RlOjpjb21wdXRlVHJhbnNmb3Jtc1JlY3Vyc2l2ZSk6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlTWFwcGVyTm9kZTo6Ym91bmRpbmdSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVNYXBwZXJOb2RlOjpzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6aXNWaXNpYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbldpdGhSZXBsaWNh
KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpwYWludFJlY3Vyc2l2ZSk6
CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5nU3Rh
dGVTZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpzeW5jQ29tcG9z
aXRpbmdTdGF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVN
YXBwZXJOb2RlLmg6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25z
OjpUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zKToKKwogMjAxMi0wMS0xMyAgT2phbiBWYWZhaSAg
PG9qYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIEltcGxlbWVudCBmbGV4LWFsaWduCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1h
cHBlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVy
ZU1hcHBlci5jcHAKaW5kZXggMjYyMmQyMS4uZDE3ZTk1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcApA
QCAtMjYsMTggKzI2LDIwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogUGFzc1JlZlB0cjxCaXRt
YXBUZXh0dXJlPiBUZXh0dXJlTWFwcGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKGNvbnN0IElu
dFNpemUmIHNpemUpCiB7Ci0gICAgaWYgKG1fdGV4dHVyZVBvb2wuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1cmUgPSBjcmVhdGVUZXh0dXJl
KCk7Ci0gICAgICAgIHNlbGVjdGVkVGV4dHVyZS0+cmVzZXQoc2l6ZSwgZmFsc2UpOwotICAgICAg
ICBzZWxlY3RlZFRleHR1cmUtPmxvY2soKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkVGV4dHVy
ZTsKLSAgICB9CisgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVkVGV4dHVyZTsKIAot
ICAgIHNpemVfdCBpbmRleCA9IDA7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVk
VGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbMF07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X3RleHR1cmVQb29sLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJl
PiYgdGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbaV07CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMTsg
aSA8IG1fdGV4dHVyZVBvb2wuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgUmVmUHRyPEJpdG1hcFRl
eHR1cmU+IHRleHR1cmUgPSBtX3RleHR1cmVQb29sW2ldOworICAgICAgICAvLyBJZiB0aGUgc3Vy
ZmFjZSBoYXMgb25seSBvbmUgcmVmZXJlbmNlLCB3ZSBjYW4gc2FmZWx5IHJldXNlIGl0LgorICAg
ICAgICBpZiAodGV4dHVyZS0+cmVmQ291bnQoKSA+IDEpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAvLyBXZSBkZWZhdWx0IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgdGV4dHVyZS4K
KyAgICAgICAgaWYgKCFzZWxlY3RlZFRleHR1cmUpIHsKKyAgICAgICAgICAgIHNlbGVjdGVkVGV4
dHVyZSA9IHRleHR1cmU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAg
ICAgIEludFNpemUgdGV4dHVyZVNpemUgPSB0ZXh0dXJlLT5zaXplKCk7CiAgICAgICAgIEludFNp
emUgc2VsZWN0ZWRUZXh0dXJlU2l6ZSA9IHNlbGVjdGVkVGV4dHVyZS0+c2l6ZSgpOwpAQCAtNTgs
MjIgKzYwLDE2IEBAIFBhc3NSZWZQdHI8Qml0bWFwVGV4dHVyZT4gVGV4dHVyZU1hcHBlcjo6YWNx
dWlyZVRleHR1cmVGcm9tUG9vbChjb25zdCBJbnRTaXplJiBzCiAgICAgICAgICAgICBjb250aW51
ZTsKIAogICAgICAgICBzZWxlY3RlZFRleHR1cmUgPSB0ZXh0dXJlOwotICAgICAgICBpbmRleCA9
IGk7CiAgICAgfQogCi0gICAgbV90ZXh0dXJlUG9vbC5yZW1vdmUoaW5kZXgpOworICAgIGlmICgh
c2VsZWN0ZWRUZXh0dXJlKSB7CisgICAgICAgIHNlbGVjdGVkVGV4dHVyZSA9IGNyZWF0ZVRleHR1
cmUoKTsKKyAgICAgICAgbV90ZXh0dXJlUG9vbC5hcHBlbmQoc2VsZWN0ZWRUZXh0dXJlKTsKKyAg
ICB9CisKICAgICBzZWxlY3RlZFRleHR1cmUtPnJlc2V0KHNpemUsIGZhbHNlKTsKLSAgICBzZWxl
Y3RlZFRleHR1cmUtPmxvY2soKTsKICAgICByZXR1cm4gc2VsZWN0ZWRUZXh0dXJlOwogfQogCi12
b2lkIFRleHR1cmVNYXBwZXI6OnJlbGVhc2VUZXh0dXJlVG9Qb29sKEJpdG1hcFRleHR1cmUqIHRl
eHR1cmUpCi17Ci0gICAgaWYgKCF0ZXh0dXJlKQotICAgICAgICByZXR1cm47Ci0gICAgbV90ZXh0
dXJlUG9vbC5hcHBlbmQodGV4dHVyZSk7Ci0gICAgdGV4dHVyZS0+dW5sb2NrKCk7Ci19Ci0KIH0K
ICNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4
bWFwL1RleHR1cmVNYXBwZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Rl
eG1hcC9UZXh0dXJlTWFwcGVyLmgKaW5kZXggZDgxMzMzZC4uYzFkY2JiZCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBl
ci5oCkBAIC0xMjYsNyArMTI2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBiZWdpblBh
aW50aW5nKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGVuZFBhaW50aW5nKCkgeyB9CiAKLSAgICB2
aXJ0dWFsIHZvaWQgcmVsZWFzZVRleHR1cmVUb1Bvb2woQml0bWFwVGV4dHVyZSogc3VyZmFjZSk7
CisgICAgLy8gQSBzdXJmYWNlIGlzIHJlbGVhc2VkIGltcGxpY2l0bHkgd2hlbiBkZXJlZmVyZW5j
ZWQuCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPEJpdG1hcFRleHR1cmU+IGFjcXVpcmVUZXh0dXJl
RnJvbVBvb2woY29uc3QgSW50U2l6ZSYpOwogCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwCmlu
ZGV4IDNiZmRmZGUuLjMzN2JhZGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcApAQCAtNTAs
MjIgKzUwLDYgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6c2V0VHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgpCiAgICAgbV90cmFuc2Zvcm0uc2V0TG9jYWxUcmFu
c2Zvcm0obWF0cml4KTsKIH0KIAotaW50IFRleHR1cmVNYXBwZXJOb2RlOjpjb3VudERlc2NlbmRh
bnRzV2l0aENvbnRlbnQoKSBjb25zdAotewotICAgIGlmICghbV9zdGF0ZS52aXNpYmxlIHx8ICgh
bV9zaXplLndpZHRoKCkgJiYgIW1fc2l6ZS5oZWlnaHQoKSAmJiBtX3N0YXRlLm1hc2tzVG9Cb3Vu
ZHMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpbnQgY291bnQgPSAobV9zaXplLndpZHRoKCkg
JiYgbV9zaXplLmhlaWdodCgpICYmIChtX3N0YXRlLmRyYXdzQ29udGVudCB8fCBtX2N1cnJlbnRD
b250ZW50LmNvbnRlbnRUeXBlICE9IEhUTUxDb250ZW50VHlwZSkpID8gMSA6IDA7Ci0gICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQotICAgICAgICBjb3Vu
dCArPSBtX2NoaWxkcmVuW2ldLT5jb3VudERlc2NlbmRhbnRzV2l0aENvbnRlbnQoKTsKLQotICAg
IHJldHVybiBjb3VudDsKLX0KLQotdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcHV0ZU92ZXJs
YXBzSWZOZWVkZWQoKQotewotICAgIG1fc3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMgPSBjb3VudERl
c2NlbmRhbnRzV2l0aENvbnRlbnQoKSA+IDE7Ci19Ci0KIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6
OmNvbXB1dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKCkKIHsKICAgICBpZiAobV9zaXplLmlzRW1wdHko
KSAmJiBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMpCkBAIC0yMDQsMzUgKzE4OCw2IEBAIGJvb2wgVGV4
dHVyZU1hcHBlck5vZGU6OmNvbGxlY3RWaXNpYmxlQ29udGVudHNSZWN0cyhOb2RlUmVjdE1hcCYg
cmVjdE1hcCwgY29uc3QKIH0KICNlbmRpZgogCi1ib29sIFRleHR1cmVNYXBwZXJOb2RlOjpoYXNN
b3JlVGhhbk9uZVRpbGUoKSBjb25zdAotewotICAgIGludCB0aWxlcyA9IDA7Ci0KLSNpZiBVU0Uo
VElMRURfQkFDS0lOR19TVE9SRSkKLSAgICBpZiAobV9zdGF0ZS50aWxlT3duZXJzaGlwID09IEV4
dGVybmFsbHlNYW5hZ2VkVGlsZXMpIHsKLSAgICAgICAgSGFzaE1hcDxpbnQsIEV4dGVybmFsbHlN
YW5hZ2VkVGlsZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fZXh0ZXJuYWxseU1hbmFnZWRUaWxl
cy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoTWFwPGludCwgRXh0ZXJuYWxseU1hbmFnZWRUaWxl
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2V4dGVybmFsbHlNYW5hZ2VkVGlsZXMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5mcm9udEJ1ZmZl
ci50ZXh0dXJlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrdGlsZXMgPiAxKQotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbV9vd25lZFRpbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX293bmVkVGls
ZXNbaV0udGV4dHVyZSkgewotICAgICAgICAgICAgaWYgKCsrdGlsZXMgPiAxKQotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi0KIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnJlbmRlckNvbnRlbnQoVGV4dHVyZU1h
cHBlciogdGV4dHVyZU1hcHBlciwgR3JhcGhpY3NMYXllciogbGF5ZXIpCiB7CiAjaWYgVVNFKFRJ
TEVEX0JBQ0tJTkdfU1RPUkUpCkBAIC0zMTksMTcgKzI3NCwxNiBAQCB2b2lkIFRleHR1cmVNYXBw
ZXJOb2RlOjpwYWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9u
cykKICAgICBpZiAobV9zaXplLmlzRW1wdHkoKSB8fCAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYm
IG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBlKSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAg
IFJlZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAobV9z
dGF0ZS5tYXNrTGF5ZXIpCi0gICAgICAgIG1hc2tUZXh0dXJlID0gbV9zdGF0ZS5tYXNrTGF5ZXIt
PnRleHR1cmUoKTsKLSAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgbV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUg
PSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsKLQot
ICAgIGZsb2F0IG9wYWNpdHkgPSBvcHRpb25zLmlzU3VyZmFjZSA/IDEgOiBvcHRpb25zLm9wYWNp
dHk7CisgICAgZmxvYXQgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eTsKKyAgICBCaXRtYXBUZXh0
dXJlKiBtYXNrID0gb3B0aW9ucy5tYXNrOwogICAgIEZsb2F0UmVjdCB0YXJnZXRSZWN0ID0gdGhp
cy0+dGFyZ2V0UmVjdCgpOwogCisgICAgLy8gV2UgYXBwbHkgdGhlIHRyYW5zZm9ybSB0aGF0IGlz
IGdlbmVyYXRlZCB0byBjb21wZW5zYXRlIGZvciBwYWludGluZyBpbnRvIGEgc3VyZmFjZS4KKyAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm0gPQorICAgICAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXgob3B0aW9ucy50cmFuc2Zvcm0pCisgICAgICAgICAgICAubXVsdGlwbHkobV90
cmFuc2Zvcm0uY29tYmluZWQoKSkKKyAgICAgICAgICAgIC50cmFuc2xhdGUob3B0aW9ucy5vZmZz
ZXQud2lkdGgoKSwgb3B0aW9ucy5vZmZzZXQuaGVpZ2h0KCkpOworCiAjaWYgVVNFKFRJTEVEX0JB
Q0tJTkdfU1RPUkUpCiAgICAgVmVjdG9yPEV4dGVybmFsbHlNYW5hZ2VkVGlsZT4gdGlsZXNUb1Bh
aW50OwogCkBAIC0zNTEsMjAgKzMwNSwxMSBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWlu
dFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICAgICAg
ICAgICAgICB0aWxlcy5wcmVwZW5kKCZpdC0+c2Vjb25kKTsKICAgICAgICAgfQogCi0gICAgICAg
IFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXg7CiAgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgdGlsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEV4dGVybmFsbHlNYW5h
Z2VkVGlsZSYgdGlsZSA9ICp0aWxlc1tpXTsKICAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0ID0g
dGlsZS5mcm9udEJ1ZmZlci50YXJnZXRSZWN0OwotCi0gICAgICAgICAgICBmbG9hdCByZXBsaWNh
T3BhY2l0eSA9IDEuMDsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllcikgewot
ICAgICAgICAgICAgICAgIHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90
cmFuc2Zvcm0uY29tYmluZWQoKS5zY2FsZSgxLjAgLyB0aWxlLnNjYWxlKTsKLSAgICAgICAgICAg
ICAgICByZXBsaWNhT3BhY2l0eSA9IG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9v
cGFjaXR5OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQml0bWFwVGV4dHVyZSYgdGV4dHVy
ZSA9ICp0aWxlLmZyb250QnVmZmVyLnRleHR1cmU7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5y
ZXBsaWNhTGF5ZXIpCi0gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3
VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCByZXBsaWNhTWF0cml4LCByZXBsaWNhT3BhY2l0eSwgcmVw
bGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUu
Z2V0KCkpOwotICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0
ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlz
U3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKHRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0
eSwgbWFzayk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM3MywyNSAr
MzE4LDEyIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZihjb25zdCBUZXh0dXJl
TWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogICAgIC8vIE5vdyB3ZSBwYWludCBvd25lZCB0
aWxlcywgaWYgd2UncmUgaW4gT3duZWRUaWxlTW9kZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG1fb3duZWRUaWxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBCaXRtYXBUZXh0dXJlKiB0
ZXh0dXJlID0gbV9vd25lZFRpbGVzW2ldLnRleHR1cmUuZ2V0KCk7Ci0gICAgICAgIGlmIChtX3N0
YXRlLnJlcGxpY2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpIHsKLSAgICAgICAgICAgIG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1cmUsIHRhcmdldFJlY3RGb3JU
aWxlUmVjdCh0YXJnZXRSZWN0LCBtX293bmVkVGlsZXNbaV0ucmVjdCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5l
ZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ICogbV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fb3BhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGlj
YU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0
KCkpOwotICAgICAgICB9Ci0KICAgICAgICAgY29uc3QgRmxvYXRSZWN0IHJlY3QgPSB0YXJnZXRS
ZWN0Rm9yVGlsZVJlY3QodGFyZ2V0UmVjdCwgbV9vd25lZFRpbGVzW2ldLnJlY3QpOwotICAgICAg
ICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCp0ZXh0dXJlLCByZWN0LCBtX3Ry
YW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNr
VGV4dHVyZS5nZXQoKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1
cmUoKnRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiAgICAgfQogCi0g
ICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAm
JiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKSB7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FM
YXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpCi0gICAgICAgICAgICBtX2N1cnJlbnRDb250ZW50
Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdl
dFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9w
YWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0
dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAg
ICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25z
LnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIG9wYWNp
dHksIG9wdGlvbnMuaXNTdXJmYWNlID8gMCA6IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICB9Cisg
ICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAm
JiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKQorICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlh
LT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3Qs
IHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiB9CiAKIGludCBUZXh0dXJlTWFwcGVyTm9kZTo6
Y29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIp
CkBAIC00MDYsMTUwICszMzgsMTMwIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnNvcnRCeVpP
cmRlcihWZWN0b3I8VGV4dHVyZU1hcHBlck5vZGUqID4mIGFycmF5LCBpbnQgZmlyCiAgICAgcXNv
cnQoYXJyYXkuZGF0YSgpLCBhcnJheS5zaXplKCksIHNpemVvZihUZXh0dXJlTWFwcGVyTm9kZSop
LCBjb21wYXJlR3JhcGhpY3NMYXllcnNaVmFsdWUpOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXJO
b2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25z
JiBvcHRpb25zLCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zRm9yRGVzY2VuZGFu
dHMpCit2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogewogICAgIGJvb2wgaGFzQ2xpcCA9
IG1fc3RhdGUubWFza3NUb0JvdW5kcyAmJiAhbV9jaGlsZHJlbi5pc0VtcHR5KCk7CiAgICAgaWYg
KGhhc0NsaXApCi0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKG1fdHJh
bnNmb3JtLmNvbWJpbmVkKCksIEZsb2F0UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXpl
LmhlaWdodCgpKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKFRy
YW5zZm9ybWF0aW9uTWF0cml4KG9wdGlvbnMudHJhbnNmb3JtKS5tdWx0aXBseShtX3RyYW5zZm9y
bS5jb21iaW5lZCgpKSwgRmxvYXRSZWN0KDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVp
Z2h0KCkpKTsKIAogICAgIHBhaW50U2VsZihvcHRpb25zKTsKIAogICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFp
bnRSZWN1cnNpdmUob3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICAgICAgbV9jaGlsZHJlbltp
XS0+cGFpbnRSZWN1cnNpdmUob3B0aW9ucyk7CiAKICAgICBpZiAoaGFzQ2xpcCkKICAgICAgICAg
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5lbmRDbGlwKCk7CiB9CiAKLWJvb2wgVGV4dHVyZU1hcHBl
ck5vZGU6OnBhaW50UmVmbGVjdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBv
cHRpb25zLCBCaXRtYXBUZXh0dXJlKiBjb250ZW50U3VyZmFjZSkKK0ludFJlY3QgVGV4dHVyZU1h
cHBlck5vZGU6OmJvdW5kaW5nUmVjdCgpCiB7Ci0gICAgaWYgKCFtX3N0YXRlLnJlcGxpY2FMYXll
cikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBib3VuZGluZ1JlY3QobV90cmFu
c2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworfQogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1
cmU+IHN1cmZhY2UoY29udGVudFN1cmZhY2UpOwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBt
YXNrU3VyZmFjZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGljYU1hc2tTdXJmYWNl
OwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBp
ZiAoVGV4dHVyZU1hcHBlck5vZGUqIHJlcGxpY2FNYXNrID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXIt
Pm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSByZXBsaWNh
TWFzay0+dGV4dHVyZSgpOwotCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJl
OwotICAgIGlmIChUZXh0dXJlTWFwcGVyTm9kZSogbWFzayA9IG1fc3RhdGUubWFza0xheWVyKQot
ICAgICAgICBtYXNrVGV4dHVyZSA9IG1hc2stPnRleHR1cmUoKTsKLQotICAgIGNvbnN0IEludFNp
emUgdmlld3BvcnRTaXplID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKTsK
LSAgICBjb25zdCBib29sIHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvclJlcGxpY2EgPSBtX3N0YXRl
LnJlcGxpY2FMYXllciAmJiBvcHRpb25zLm9wYWNpdHkgPCAwLjk5OwotICAgIGNvbnN0IGJvb2wg
dXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yTWFzayA9IG1hc2tUZXh0dXJlICYmIHJlcGxpY2FNYXNr
VGV4dHVyZTsKLSAgICBjb25zdCBGbG9hdFJlY3Qgdmlld3BvcnRSZWN0KDAsIDAsIHZpZXdwb3J0
U2l6ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpOwotICAgIC8vIFJldmVyc2UgdGhp
cyBsYXllcidzIHRyYW5zZm9ybSBvbiB0aGUgcmVwbGljYSdzIHRyYW5zZm9ybSBhbmQgdXNlIGl0
IHdpdGggdGhlIGNvbnRlbnRzCi0gICAgLy8gaW50ZXJtZWRpYXRlIHN1cmZhY2UsIGFwcGxpZWQg
aW4gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29t
YmluZWQoKTsKLSAgICByZXBsaWNhTWF0cml4Lm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVk
KCkuaW52ZXJzZSgpKTsKLQotICAgIC8vIFRoZSBtYXNrIGhhcyB0byBiZSBhZGp1c3RlZCB0byB0
YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKG1hc2tUZXh0dXJlKSB7Ci0gICAgICAgIG1hc2tT
dXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0
aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqbWFza1RleHR1cmUuZ2V0KCksIGVudGly
ZVJlY3QoKSwgbV90cmFuc2Zvcm0uY29tYmluZWQoKSwgMSwgMCk7Ci0gICAgICAgIG1hc2tUZXh0
dXJlID0gbWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gVGhlIHJlcGxpY2EncyBtYXNrIGhh
cyB0byBiZSBhZGp1c3RlZCB0byB0YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKHJlcGxpY2FN
YXNrVGV4dHVyZSkgewotICAgICAgICByZXBsaWNhTWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1
cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52
aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZh
Y2UocmVwbGljYU1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5kcmF3VGV4dHVyZSgqcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpLCBlbnRpcmVSZWN0KCks
IG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIDEsIDApOwotICAgICAgICByZXBsaWNhTWFza1RleHR1
cmUgPSByZXBsaWNhTWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gV2UgbWlnaHQgbmVlZCB0
byBhcHBseSB0aGUgbWFzayBvZiB0aGUgY29udGVudCBsYXllciBiZWZvcmUgd2UgZHJhdyB0aGUg
cmVmbGVjdGlvbiwgYXMgdGhlcmUgbWlnaHQgYmUgeWV0IGFub3RoZXIgbWFzayBmb3IgdGhlIHJl
ZmxlY3Rpb24gaXRzZWxmLgotICAgIGlmICh1c2VJbnRlcm1lZGlhdGVCdWZmZXJGb3JNYXNrKSB7
Ci0gICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4
dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXIt
PnZpZXdwb3J0U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3Vy
ZmFjZShtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+
ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwgVHJhbnNmb3JtYXRpb25N
YXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVN
YXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBzdXJm
YWNlID0gbWFza1N1cmZhY2U7Ci0gICAgICAgIG1hc2tUZXh0dXJlLmNsZWFyKCk7Ci0gICAgfQot
Ci0gICAgLy8gV2UgYmxlbmQgdGhlIGxheWVyIGFuZCBpdHMgcmVwbGljYSBpbiBhbiBpbnRlcm1l
ZGlhdGUgYnVmZmVyIGJlZm9yZSBibGVuZGluZyBpbnRvIHRoZSB0YXJnZXQgc3VyZmFjZS4KLSAg
ICBpZiAodXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yUmVwbGljYSkgewotICAgICAgICBSZWZQdHI8
Qml0bWFwVGV4dHVyZT4gcmVwbGljYVN1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFj
cXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUo
KSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UocmVwbGljYVN1
cmZhY2UuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJl
KCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRyaXgsIG1fc3RhdGUucmVw
bGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSk7Ci0gICAgICAg
IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdw
b3J0UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwot
ICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZh
Y2UuZ2V0KCkpOwotICAgICAgICBzdXJmYWNlID0gcmVwbGljYVN1cmZhY2U7CitJbnRSZWN0IFRl
eHR1cmVNYXBwZXJOb2RlOjpib3VuZGluZ1JlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IG1hdHJpeCkKK3sKKyAgICBJbnRSZWN0IHJlY3Q7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgg
bG9jYWxUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1hdGlvbk1hdHJpeChtYXRyaXgpLm11bHRpcGx5KG1f
dHJhbnNmb3JtLmNvbWJpbmVkKCkpOworICAgIHJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGxvY2Fs
VHJhbnNmb3JtLm1hcFJlY3QoZW50aXJlUmVjdCgpKSk7CisgICAgaWYgKCFtX3N0YXRlLm1hc2tz
VG9Cb3VuZHMgJiYgIW1fc3RhdGUubWFza0xheWVyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHJlY3QudW5pdGUobV9j
aGlsZHJlbltpXS0+Ym91bmRpbmdSZWN0KG1hdHJpeCkpOwogICAgIH0KIAotICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKKyAgICBpZiAobV9z
dGF0ZS5yZXBsaWNhTGF5ZXIpCisgICAgICAgIHJlY3QudW5pdGUobV9zdGF0ZS5yZXBsaWNhTGF5
ZXItPmJvdW5kaW5nUmVjdChtYXRyaXgpKTsKKworICAgIHJldHVybiByZWN0OworfQorCitib29s
IFRleHR1cmVNYXBwZXJOb2RlOjpzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSgpIGNv
bnN0Cit7CisgICAgYm9vbCBoYXNPcGFjaXR5ID0gbV9zdGF0ZS5vcGFjaXR5IDwgMC45OTsKKyAg
ICBib29sIGhhc0NoaWxkcmVuID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpOworICAgIGJvb2wgaGFz
UmVwbGljYSA9ICEhbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7CisgICAgYm9vbCBoYXNNYXNrID0gISFt
X3N0YXRlLm1hc2tMYXllcjsKIAotICAgIC8vIERyYXcgdGhlIHJlZmxlY3Rpb24uCi0gICAgaWYg
KCF1c2VJbnRlcm1lZGlhdGVCdWZmZXJGb3JSZXBsaWNhKQotICAgICAgICBvcHRpb25zLnRleHR1
cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxp
Y2FNYXRyaXgsIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4
dHVyZS5nZXQoKSk7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHR3by1wYXNzIGJsZW5kaW5nIGZvciBw
cmVzZXJ2ZXMtM2QsIHRoYXQncyBpbiBzeW5jIHdpdGggU2FmYXJpLgorICAgIGlmIChtX3N0YXRl
LnByZXNlcnZlczNEKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBEcmF3IHRoZSBv
cmlnaW5hbC4KLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNl
LmdldCgpLCB2aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIG9wdGlvbnMub3Bh
Y2l0eSwgbWFza1RleHR1cmUuZ2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJt
ZWRpYXRlIHN1cmZhY2Ugd2hlbiBibGVuZGluZyBzZXZlcmFsIGl0ZW1zIHdpdGggYW4gYW5jZXN0
b3Igb3BhY2l0eS4KKyAgICAvLyBUZXN0ZWQgYnkgY29tcG9zaXRpbmcvcmVmbGVjdGlvbnMvcmVm
bGVjdGlvbi1vcGFjaXR5Lmh0bWwKKyAgICBpZiAoaGFzT3BhY2l0eSAmJiAoaGFzQ2hpbGRyZW4g
fHwgaGFzUmVwbGljYSkpCisgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgb3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAg
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChyZXBsaWNhTWFza1N1
cmZhY2UuZ2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRlIHN1cmZh
Y2Ugd2l0aCBhIG1hc2tlZCBhbmNlc3Rvci4KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiByZXBsaWNh
cyB0aGUgbWFzayBpcyBhcHBsaWVkIGJlZm9yZSByZXBsaWNhdGluZy4KKyAgICAvLyBUZXN0ZWQg
YnkgY29tcG9zaXRpbmcvbWFza3MvbWFza2VkLWFuY2VzdG9yLmh0bWwKKyAgICBpZiAoaGFzTWFz
ayAmJiBoYXNDaGlsZHJlbiAmJiAhaGFzUmVwbGljYSkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAK
LSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVGV4dHVyZU1h
cHBlck5vZGU6OnBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgb3B0aW9u
cykKK2Jvb2wgVGV4dHVyZU1hcHBlck5vZGU6OmlzVmlzaWJsZSgpIGNvbnN0CiB7Ci0gICAgaWYg
KChtX3NpemUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMKLSAgICAgICAgfHwg
bV9jaGlsZHJlbi5pc0VtcHR5KCkpKSB8fCAhbV9zdGF0ZS52aXNpYmxlIHx8IG9wdGlvbnMub3Bh
Y2l0eSA8IDAuMDEgfHwgbV9vcGFjaXR5IDwgMC4wMSkKLSAgICAgICAgcmV0dXJuOworICAgIGlm
IChtX3NpemUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgfHwgbV9jaGlsZHJl
bi5pc0VtcHR5KCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnZp
c2libGUgfHwgbV9zdGF0ZS5vcGFjaXR5IDwgMC4wMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIHJldHVybiB0cnVlOworfQogCi0gICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsK
LSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gc3VyZmFjZTsKK3ZvaWQgVGV4dHVyZU1hcHBlck5v
ZGU6OnBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVyZU1hcHBlclBh
aW50T3B0aW9ucyYgb3B0aW9ucykKK3sKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpIHsK
KyAgICAgICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyByZXBsaWNhT3B0aW9ucyhvcHRpb25z
KTsKKyAgICAgICAgLy8gV2UgY2hvb3NlIGVpdGhlciB0aGUgY29udGVudCdzIG1hc2sgb3IgdGhl
IHJlcGxpY2EncyBtYXNrLgorICAgICAgICAvLyBGSVhNRTogYmxlbmQgdGhlIHR3byBpZiBib3Ro
IGV4aXN0LgorICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3RhdGUubWFza0xh
eWVyKQorICAgICAgICAgICAgcmVwbGljYU9wdGlvbnMubWFzayA9IG1fc3RhdGUucmVwbGljYUxh
eWVyLT5tX3N0YXRlLm1hc2tMYXllci0+dGV4dHVyZSgpOwogCi0gICAgYm9vbCBoYXNSZXBsaWNh
ID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7Ci0gICAgYm9vbCBoYXNNYXNrID0gbV9zdGF0ZS5tYXNr
TGF5ZXI7Ci0gICAgYm9vbCBuZWVkc0JsZW5kaW5nID0gbV9vcGFjaXR5IDwgMC45OSB8fCBoYXNN
YXNrOwotICAgIGJvb2wgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlID0gIW1fY2hpbGRyZW4uaXNF
bXB0eSgpIHx8IGhhc01vcmVUaGFuT25lVGlsZSgpIHx8IChoYXNNYXNrICYmIG1fc3RhdGUubWFz
a0xheWVyLT5oYXNNb3JlVGhhbk9uZVRpbGUoKSk7Ci0gICAgYm9vbCBoYXNPdmVybGFwcyA9IG1f
c3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMgfHwgaGFzUmVwbGljYTsKLSAgICBjb25zdCBJbnRTaXpl
IHZpZXdwb3J0U2l6ZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCk7Ci0g
ICAgYm9vbCBuZWVkc1R3b1Bhc3MgPSAoKGhhc1JlcGxpY2EgfHwgaGFzTWFzaykgJiYgcGFpbnRz
TW9yZVRoYW5PbmVUZXh0dXJlKSB8fCAobmVlZHNCbGVuZGluZyAmJiBoYXNPdmVybGFwcyk7Ci0g
ICAgb3B0aW9ucy5pc1N1cmZhY2UgPSBmYWxzZTsKKyAgICAgICAgcmVwbGljYU9wdGlvbnMudHJh
bnNmb3JtCisgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV9zdGF0ZS5yZXBsaWNhTGF5ZXIt
Pm1fdHJhbnNmb3JtLmNvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV90
cmFuc2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworICAgICAgICBwYWludFNlbGZBbmRDaGls
ZHJlbihyZXBsaWNhT3B0aW9ucyk7CisgICAgfQogCi0gICAgVGV4dHVyZU1hcHBlclBhaW50T3B0
aW9ucyBvcHRpb25zRm9yRGVzY2VuZGFudHMob3B0aW9ucyk7CisgICAgcGFpbnRTZWxmQW5kQ2hp
bGRyZW4ob3B0aW9ucyk7Cit9CiAKLSAgICBpZiAoIW5lZWRzVHdvUGFzcykgewotICAgICAgICBw
YWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFudHMpOwordm9p
ZCBUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1hcHBlclBhaW50T3B0
aW9ucyBvcHRpb25zKQoreworICAgIGlmICghaXNWaXNpYmxlKCkpCiAgICAgICAgIHJldHVybjsK
LSAgICB9CisgICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKKyAgICBSZWZQdHI8Qml0
bWFwVGV4dHVyZT4gbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1fc3RhdGUubWFz
a0xheWVyLT50ZXh0dXJlKCkgOiAwOwogCi0gICAgRmxvYXRSZWN0IHZpZXdwb3J0UmVjdCgwLCAw
LCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKTsKKyAgICBUZXh0
dXJlTWFwcGVyUGFpbnRPcHRpb25zIHBhaW50T3B0aW9ucyhvcHRpb25zKTsKKyAgICBwYWludE9w
dGlvbnMubWFzayA9IG1hc2tUZXh0dXJlLmdldCgpOworICAgIEludFJlY3Qgc3VyZmFjZVJlY3Q7
CiAKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7CisgICAgUmVmUHRyPEJp
dG1hcFRleHR1cmU+IHN1cmZhY2U7CiAKLSAgICBpZiAobV9zdGF0ZS5tYXNrTGF5ZXIpIHsKLSAg
ICAgICAgbWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJl
RnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAg
IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2UuZ2V0KCkpOwot
ICAgICAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIG9wdGlvbnNGb3JNYXNrKG9wdGlvbnMp
OwotICAgICAgICBvcHRpb25zRm9yTWFzay5pc1N1cmZhY2UgPSB0cnVlOwotICAgICAgICBtX3N0
YXRlLm1hc2tMYXllci0+cGFpbnRTZWxmKG9wdGlvbnNGb3JNYXNrKTsKKyAgICBpZiAoIXNob3Vs
ZFBhaW50VG9JbnRlcm1lZGlhdGVTdXJmYWNlKCkpIHsKKyAgICAgICAgcGFpbnRTZWxmQW5kQ2hp
bGRyZW5XaXRoUmVwbGljYShwYWludE9wdGlvbnMpOworICAgICAgICByZXR1cm47CiAgICAgfQog
Ci0gICAgc3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9t
UG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAgICBvcHRpb25z
Rm9yRGVzY2VuZGFudHMuc3VyZmFjZSA9IHN1cmZhY2UuZ2V0KCk7Ci0gICAgb3B0aW9ucy5pc1N1
cmZhY2UgPSB0cnVlOwotICAgIG9wdGlvbnNGb3JEZXNjZW5kYW50cy5vcGFjaXR5ID0gMTsKKyAg
ICAvLyBQcmVwYXJlIGEgc3VyZmFjZSB0byBwYWludCBpbnRvLgorICAgIC8vIFdlIHBhaW50IGlu
dG8gdGhlIHN1cmZhY2UgaWdub3JpbmcgdGhlIG9wYWNpdHkvdHJhbnNmb3JtIG9mIHRoZSBjdXJy
ZW50IGxheWVyLgorICAgIHN1cmZhY2VSZWN0ID0gYm91bmRpbmdSZWN0KCk7CisgICAgc3VyZmFj
ZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChzdXJmYWNl
UmVjdC5zaXplKCkpOwogICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uoc3Vy
ZmFjZS5nZXQoKSk7CisgICAgcGFpbnRPcHRpb25zLm9wYWNpdHkgPSAxOworICAgIHBhaW50T3B0
aW9ucy50cmFuc2Zvcm0gPSBtX3RyYW5zZm9ybS5jb21iaW5lZEZvckNoaWxkcmVuKCkuaW52ZXJz
ZSgpOworICAgIHBhaW50T3B0aW9ucy5vZmZzZXQgPSAtSW50U2l6ZShzdXJmYWNlUmVjdC54KCks
IHN1cmZhY2VSZWN0LnkoKSk7CiAKLSAgICBwYWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBv
cHRpb25zRm9yRGVzY2VuZGFudHMpOworICAgIHBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxp
Y2EocGFpbnRPcHRpb25zKTsKIAotICAgIGlmICghcGFpbnRSZWZsZWN0aW9uKG9wdGlvbnMsIHN1
cmZhY2UuZ2V0KCkpKSB7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZh
Y2Uob3B0aW9ucy5zdXJmYWNlKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3
VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCgpLCBvcHRpb25zLm9wYWNpdHksIG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICB9CisgICAgLy8g
SWYgd2UgcGFpbnRlZCB0aGUgcmVwbGljYSwgdGhlIG1hc2sgaXMgYWxyZWFkeSBiYWtlZCBpbiBz
byB3ZSBkb24ndCBuZWVkIHRvIHBhaW50IGl0IGFnYWluLgorICAgIGlmIChtX3N0YXRlLnJlcGxp
Y2FMYXllcikKKyAgICAgICAgbWFza1RleHR1cmUgPSAwOwogCi0gICAgb3B0aW9ucy50ZXh0dXJl
TWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdldCgpKTsKLSAgICBvcHRpb25z
LnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKG1hc2tTdXJmYWNlLmdldCgpKTsK
KyAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG9wdGlvbnMuc3VyZmFjZSk7
CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdGFyZ2V0VHJhbnNmb3JtID0gVHJhbnNmb3JtYXRp
b25NYXRyaXgoKS5tdWx0aXBseShvcHRpb25zLnRyYW5zZm9ybSkubXVsdGlwbHkobV90cmFuc2Zv
cm0uY29tYmluZWQoKSkudHJhbnNsYXRlKG9wdGlvbnMub2Zmc2V0LndpZHRoKCksIG9wdGlvbnMu
b2Zmc2V0LmhlaWdodCgpKTsKKyAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJl
KCpzdXJmYWNlLmdldCgpLCBzdXJmYWNlUmVjdCwgdGFyZ2V0VHJhbnNmb3JtLCBvcHRpb25zLm9w
YWNpdHksIG1hc2tUZXh0dXJlLmdldCgpKTsKIH0KIAogVGV4dHVyZU1hcHBlck5vZGU6On5UZXh0
dXJlTWFwcGVyTm9kZSgpCkBAIC03MzMsNiArNjQ1LDcgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9k
ZTo6c3luY0NvbXBvc2l0aW5nU3RhdGVTZWxmKEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVyKiBn
cmEKICAgICBtX3N0YXRlLmJhY2tmYWNlVmlzaWJpbGl0eSA9IGdyYXBoaWNzTGF5ZXItPmJhY2tm
YWNlVmlzaWJpbGl0eSgpOwogICAgIG1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0gPSBncmFwaGlj
c0xheWVyLT5jaGlsZHJlblRyYW5zZm9ybSgpOwogICAgIG1fc3RhdGUub3BhY2l0eSA9IGdyYXBo
aWNzTGF5ZXItPm9wYWNpdHkoKTsKKwogICAgIG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUg
PSBwZW5kaW5nQ29udGVudC5jb250ZW50VHlwZTsKICAgICBtX2N1cnJlbnRDb250ZW50LmltYWdl
ID0gcGVuZGluZ0NvbnRlbnQuaW1hZ2U7CiAgICAgbV9jdXJyZW50Q29udGVudC5tZWRpYSA9IHBl
bmRpbmdDb250ZW50Lm1lZGlhOwpAQCAtOTg0LDcgKzg5Nyw2IEBAIHZvaWQgVGV4dHVyZU1hcHBl
ck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlKEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVyKiBn
cmFwaGljCiAgICAgc3luY0FuaW1hdGlvbnMoZ3JhcGhpY3NMYXllcik7CiAKICAgICBjb21wdXRl
VGlsZXMoKTsKLSAgICBjb21wdXRlT3ZlcmxhcHNJZk5lZWRlZCgpOwogCiAgICAgaWYgKGdyYXBo
aWNzTGF5ZXIpCiAgICAgICAgIHJlbmRlckNvbnRlbnQodGV4dHVyZU1hcHBlciwgZ3JhcGhpY3NM
YXllcik7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXht
YXAvVGV4dHVyZU1hcHBlck5vZGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5oCmluZGV4IDM5NjVlZTYuLmNmOTZkYmQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFw
cGVyTm9kZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9U
ZXh0dXJlTWFwcGVyTm9kZS5oCkBAIC00NCwxNSArNDQsMTYgQEAgY2xhc3MgR3JhcGhpY3NMYXll
clRleHR1cmVNYXBwZXI7CiBjbGFzcyBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIHsKIHB1Ymxp
YzoKICAgICBCaXRtYXBUZXh0dXJlKiBzdXJmYWNlOwotICAgIFRleHR1cmVNYXBwZXIqIHRleHR1
cmVNYXBwZXI7Ci0KKyAgICBCaXRtYXBUZXh0dXJlKiBtYXNrOwogICAgIGZsb2F0IG9wYWNpdHk7
Ci0gICAgYm9vbCBpc1N1cmZhY2U7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3Jt
OworICAgIEludFNpemUgb2Zmc2V0OworICAgIFRleHR1cmVNYXBwZXIqIHRleHR1cmVNYXBwZXI7
CiAgICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucygpCiAgICAgICAgIDogc3VyZmFjZSgwKQot
ICAgICAgICAsIHRleHR1cmVNYXBwZXIoMCkKKyAgICAgICAgLCBtYXNrKDApCiAgICAgICAgICwg
b3BhY2l0eSgxKQotICAgICAgICAsIGlzU3VyZmFjZShmYWxzZSkKKyAgICAgICAgLCB0ZXh0dXJl
TWFwcGVyKDApCiAgICAgeyB9CiB9OwogCkBAIC0xNzksOCArMTgwLDkgQEAgcHJpdmF0ZToKICAg
ICB2b2lkIGNvbXB1dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKCk7CiAgICAgdm9pZCBjb21wdXRlT3Zl
cmxhcHNJZk5lZWRlZCgpOwogICAgIHZvaWQgY29tcHV0ZVRpbGVzKCk7CisgICAgSW50UmVjdCBi
b3VuZGluZ1JlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKyAgICBJbnRSZWN0IGJv
dW5kaW5nUmVjdCgpOwogICAgIHZvaWQgc3dhcENvbnRlbnRzQnVmZmVycygpOwotICAgIGludCBj
b3VudERlc2NlbmRhbnRzV2l0aENvbnRlbnQoKSBjb25zdDsKICAgICBGbG9hdFJlY3QgdGFyZ2V0
UmVjdEZvclRpbGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdG90YWxUYXJnZXRSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIHRpbGVSZWN0KSBjb25zdDsKICAgICB2b2lkIGludmFsaWRhdGVWaWV3cG9ydChj
b25zdCBGbG9hdFJlY3QmKTsKICAgICB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VNYXNrKTsKQEAg
LTE5Miw5ICsxOTQsOSBAQCBwcml2YXRlOgogICAgIEJpdG1hcFRleHR1cmUqIHRleHR1cmUoKSB7
IHJldHVybiBtX293bmVkVGlsZXMuaXNFbXB0eSgpID8gMCA6IG1fb3duZWRUaWxlc1swXS50ZXh0
dXJlLmdldCgpOyB9CiAKICAgICB2b2lkIHBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWlu
dE9wdGlvbnMpOwotICAgIGJvb2wgcGFpbnRSZWZsZWN0aW9uKGNvbnN0IFRleHR1cmVNYXBwZXJQ
YWludE9wdGlvbnMmLCBCaXRtYXBUZXh0dXJlKiBzdXJmYWNlKTsKICAgICB2b2lkIHBhaW50U2Vs
Zihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJik7Ci0gICAgdm9pZCBwYWludFNlbGZB
bmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiwgVGV4dHVyZU1hcHBl
clBhaW50T3B0aW9ucyYgb3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICB2b2lkIHBhaW50U2Vs
ZkFuZENoaWxkcmVuKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmKTsKKyAgICB2b2lk
IHBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50
T3B0aW9ucyYpOwogICAgIHZvaWQgcmVuZGVyQ29udGVudChUZXh0dXJlTWFwcGVyKiwgR3JhcGhp
Y3NMYXllciopOwogCiAgICAgdm9pZCBzeW5jQW5pbWF0aW9ucyhHcmFwaGljc0xheWVyVGV4dHVy
ZU1hcHBlciopOwpAQCAtMjA0LDcgKzIwNiw4IEBAIHByaXZhdGU6CiAgICAgdm9pZCBhcHBseVRy
YW5zZm9ybUFuaW1hdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyQW5pbWF0aW9uJiwgY29uc3QgVHJh
bnNmb3JtT3BlcmF0aW9ucyogc3RhcnQsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIGVuZCwg
ZG91YmxlKTsKICAgICBib29sIGhhc09wYWNpdHlBbmltYXRpb24oKSBjb25zdDsKICAgICBib29s
IGhhc1RyYW5zZm9ybUFuaW1hdGlvbigpIGNvbnN0OwotICAgIGJvb2wgaGFzTW9yZVRoYW5PbmVU
aWxlKCkgY29uc3Q7CisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdDsKKyAgICBib29sIHNob3Vs
ZFBhaW50VG9JbnRlcm1lZGlhdGVTdXJmYWNlKCkgY29uc3Q7CiAKICAgICBMYXllclRyYW5zZm9y
bSBtX3RyYW5zZm9ybTsKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122566</attachid>
            <date>2012-01-15 09:21:38 -0800</date>
            <delta_ts>2012-01-16 08:24:04 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>26132</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4OThlMTBhLi5lOGFkNzdlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzgg
QEAKKzIwMTItMDEtMTUgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBbVGV4bWFwXSBUZXh0dXJlTWFwcGVyIGNyZWF0ZXMgdHdvIG1hbnkgYmln
IGludGVybWVkaWF0ZSBzdXJmYWNlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzYzMzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGUgZm9sbG93aW5nIGhhcyBiZWVuIGRvbmUgdG8gb3B0aW1pemUgc3Vy
ZmFjZSBhbGxvY2F0aW9uOgorICAgICAgICAxLiBJbnN0ZWFkIG9mIHVzaW5nIGEgdmlld3BvcnQt
c2l6ZSBzdXJmYWNlLCB1c2UgYSBzdXJmYWNlIGluIHRoZSBzaXplIG9mIHRoZSBsYXllcidzCisg
ICAgICAgICAgIGJvdW5kaW5nIHJlY3QgYW5kIGFwcGx5IHRoZSB0cmFuc2Zvcm0gYWZ0ZXIgdGhl
IGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQgaW50byBpdC4KKyAgICAgICAgMi4gQXZvaWQgZ2Vu
ZXJhdGlnIGludGVybWVkaWF0ZSBzdXJmYWNlIGZvciBvY2Nhc2lvbnMgd2hlcmUgdGhleSdyZSBu
b3QgbmVjZXNzYXJ5LAorICAgICAgICAgICBzdWNoIGFzIG5lc3RlZCByZWZsZWN0aW9ucyB3aXRo
b3V0IG9wYWNpdHkuCisgICAgICAgIDMuIFJlbGVhc2luZyBvZiB0ZXh0dXJlcyBmcm9tIHRoZSBw
b29sIGlzIG5vdyBpbXBsaWNpdCwgYmFzZWQgb24gcmVmQ291bnQuCisgICAgICAgIDQuIERvIG5v
dCB1c2UgaW50ZXJtZWRpYXRlIHN1cmZhY2VzIGZvciBwcmVzZXJ2ZS0zZCBsYXllcnMuIFRoaXMg
aXMgaW4gYWxpZ25tZW50IHdpdGgKKyAgICAgICAgICAgb3RoZXIgcG9ydHMuCisKKyAgICAgICAg
VGVzdHMgaW4gTGF5b3V0VGVzdHMvY29tcG9zaXRpbmcvbWFza3MgYW5kIExheW91dFRlc3RzL2Nv
bXBvc2l0aW5nL3JlZmxlY3Rpb24gY292ZXIgdGhpcy4KKworICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1
cmVNYXBwZXI6OmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1
cmVNYXBwZXJOb2RlOjpjb21wdXRlVHJhbnNmb3Jtc1JlY3Vyc2l2ZSk6CisgICAgICAgIChXZWJD
b3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbik6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlTWFwcGVyTm9kZTo6Ym91bmRpbmdSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVNYXBwZXJOb2RlOjpzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6aXNWaXNpYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbldpdGhSZXBsaWNh
KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpwYWludFJlY3Vyc2l2ZSk6
CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5nU3Rh
dGVTZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpzeW5jQ29tcG9z
aXRpbmdTdGF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVN
YXBwZXJOb2RlLmg6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25z
OjpUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zKToKKwogMjAxMi0wMS0xMyAgT2phbiBWYWZhaSAg
PG9qYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIEltcGxlbWVudCBmbGV4LWFsaWduCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1h
cHBlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVy
ZU1hcHBlci5jcHAKaW5kZXggMjYyMmQyMS4uZDE3ZTk1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcApA
QCAtMjYsMTggKzI2LDIwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogUGFzc1JlZlB0cjxCaXRt
YXBUZXh0dXJlPiBUZXh0dXJlTWFwcGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKGNvbnN0IElu
dFNpemUmIHNpemUpCiB7Ci0gICAgaWYgKG1fdGV4dHVyZVBvb2wuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1cmUgPSBjcmVhdGVUZXh0dXJl
KCk7Ci0gICAgICAgIHNlbGVjdGVkVGV4dHVyZS0+cmVzZXQoc2l6ZSwgZmFsc2UpOwotICAgICAg
ICBzZWxlY3RlZFRleHR1cmUtPmxvY2soKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkVGV4dHVy
ZTsKLSAgICB9CisgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVkVGV4dHVyZTsKIAot
ICAgIHNpemVfdCBpbmRleCA9IDA7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVk
VGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbMF07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X3RleHR1cmVQb29sLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJl
PiYgdGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbaV07CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMTsg
aSA8IG1fdGV4dHVyZVBvb2wuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgUmVmUHRyPEJpdG1hcFRl
eHR1cmU+IHRleHR1cmUgPSBtX3RleHR1cmVQb29sW2ldOworICAgICAgICAvLyBJZiB0aGUgc3Vy
ZmFjZSBoYXMgb25seSBvbmUgcmVmZXJlbmNlLCB3ZSBjYW4gc2FmZWx5IHJldXNlIGl0LgorICAg
ICAgICBpZiAodGV4dHVyZS0+cmVmQ291bnQoKSA+IDEpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAvLyBXZSBkZWZhdWx0IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgdGV4dHVyZS4K
KyAgICAgICAgaWYgKCFzZWxlY3RlZFRleHR1cmUpIHsKKyAgICAgICAgICAgIHNlbGVjdGVkVGV4
dHVyZSA9IHRleHR1cmU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAg
ICAgIEludFNpemUgdGV4dHVyZVNpemUgPSB0ZXh0dXJlLT5zaXplKCk7CiAgICAgICAgIEludFNp
emUgc2VsZWN0ZWRUZXh0dXJlU2l6ZSA9IHNlbGVjdGVkVGV4dHVyZS0+c2l6ZSgpOwpAQCAtNTgs
MjIgKzYwLDE2IEBAIFBhc3NSZWZQdHI8Qml0bWFwVGV4dHVyZT4gVGV4dHVyZU1hcHBlcjo6YWNx
dWlyZVRleHR1cmVGcm9tUG9vbChjb25zdCBJbnRTaXplJiBzCiAgICAgICAgICAgICBjb250aW51
ZTsKIAogICAgICAgICBzZWxlY3RlZFRleHR1cmUgPSB0ZXh0dXJlOwotICAgICAgICBpbmRleCA9
IGk7CiAgICAgfQogCi0gICAgbV90ZXh0dXJlUG9vbC5yZW1vdmUoaW5kZXgpOworICAgIGlmICgh
c2VsZWN0ZWRUZXh0dXJlKSB7CisgICAgICAgIHNlbGVjdGVkVGV4dHVyZSA9IGNyZWF0ZVRleHR1
cmUoKTsKKyAgICAgICAgbV90ZXh0dXJlUG9vbC5hcHBlbmQoc2VsZWN0ZWRUZXh0dXJlKTsKKyAg
ICB9CisKICAgICBzZWxlY3RlZFRleHR1cmUtPnJlc2V0KHNpemUsIGZhbHNlKTsKLSAgICBzZWxl
Y3RlZFRleHR1cmUtPmxvY2soKTsKICAgICByZXR1cm4gc2VsZWN0ZWRUZXh0dXJlOwogfQogCi12
b2lkIFRleHR1cmVNYXBwZXI6OnJlbGVhc2VUZXh0dXJlVG9Qb29sKEJpdG1hcFRleHR1cmUqIHRl
eHR1cmUpCi17Ci0gICAgaWYgKCF0ZXh0dXJlKQotICAgICAgICByZXR1cm47Ci0gICAgbV90ZXh0
dXJlUG9vbC5hcHBlbmQodGV4dHVyZSk7Ci0gICAgdGV4dHVyZS0+dW5sb2NrKCk7Ci19Ci0KIH0K
ICNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4
bWFwL1RleHR1cmVNYXBwZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Rl
eG1hcC9UZXh0dXJlTWFwcGVyLmgKaW5kZXggZDgxMzMzZC4uYzFkY2JiZCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBl
ci5oCkBAIC0xMjYsNyArMTI2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBiZWdpblBh
aW50aW5nKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIGVuZFBhaW50aW5nKCkgeyB9CiAKLSAgICB2
aXJ0dWFsIHZvaWQgcmVsZWFzZVRleHR1cmVUb1Bvb2woQml0bWFwVGV4dHVyZSogc3VyZmFjZSk7
CisgICAgLy8gQSBzdXJmYWNlIGlzIHJlbGVhc2VkIGltcGxpY2l0bHkgd2hlbiBkZXJlZmVyZW5j
ZWQuCiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPEJpdG1hcFRleHR1cmU+IGFjcXVpcmVUZXh0dXJl
RnJvbVBvb2woY29uc3QgSW50U2l6ZSYpOwogCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwCmlu
ZGV4IDNiZmRmZGUuLmU3ODIyZmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcApAQCAtNTAs
MjIgKzUwLDYgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6c2V0VHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgpCiAgICAgbV90cmFuc2Zvcm0uc2V0TG9jYWxUcmFu
c2Zvcm0obWF0cml4KTsKIH0KIAotaW50IFRleHR1cmVNYXBwZXJOb2RlOjpjb3VudERlc2NlbmRh
bnRzV2l0aENvbnRlbnQoKSBjb25zdAotewotICAgIGlmICghbV9zdGF0ZS52aXNpYmxlIHx8ICgh
bV9zaXplLndpZHRoKCkgJiYgIW1fc2l6ZS5oZWlnaHQoKSAmJiBtX3N0YXRlLm1hc2tzVG9Cb3Vu
ZHMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpbnQgY291bnQgPSAobV9zaXplLndpZHRoKCkg
JiYgbV9zaXplLmhlaWdodCgpICYmIChtX3N0YXRlLmRyYXdzQ29udGVudCB8fCBtX2N1cnJlbnRD
b250ZW50LmNvbnRlbnRUeXBlICE9IEhUTUxDb250ZW50VHlwZSkpID8gMSA6IDA7Ci0gICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQotICAgICAgICBjb3Vu
dCArPSBtX2NoaWxkcmVuW2ldLT5jb3VudERlc2NlbmRhbnRzV2l0aENvbnRlbnQoKTsKLQotICAg
IHJldHVybiBjb3VudDsKLX0KLQotdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcHV0ZU92ZXJs
YXBzSWZOZWVkZWQoKQotewotICAgIG1fc3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMgPSBjb3VudERl
c2NlbmRhbnRzV2l0aENvbnRlbnQoKSA+IDE7Ci19Ci0KIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6
OmNvbXB1dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKCkKIHsKICAgICBpZiAobV9zaXplLmlzRW1wdHko
KSAmJiBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMpCkBAIC0yMDQsMzUgKzE4OCw2IEBAIGJvb2wgVGV4
dHVyZU1hcHBlck5vZGU6OmNvbGxlY3RWaXNpYmxlQ29udGVudHNSZWN0cyhOb2RlUmVjdE1hcCYg
cmVjdE1hcCwgY29uc3QKIH0KICNlbmRpZgogCi1ib29sIFRleHR1cmVNYXBwZXJOb2RlOjpoYXNN
b3JlVGhhbk9uZVRpbGUoKSBjb25zdAotewotICAgIGludCB0aWxlcyA9IDA7Ci0KLSNpZiBVU0Uo
VElMRURfQkFDS0lOR19TVE9SRSkKLSAgICBpZiAobV9zdGF0ZS50aWxlT3duZXJzaGlwID09IEV4
dGVybmFsbHlNYW5hZ2VkVGlsZXMpIHsKLSAgICAgICAgSGFzaE1hcDxpbnQsIEV4dGVybmFsbHlN
YW5hZ2VkVGlsZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fZXh0ZXJuYWxseU1hbmFnZWRUaWxl
cy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoTWFwPGludCwgRXh0ZXJuYWxseU1hbmFnZWRUaWxl
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2V4dGVybmFsbHlNYW5hZ2VkVGlsZXMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5mcm9udEJ1ZmZl
ci50ZXh0dXJlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrdGlsZXMgPiAxKQotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbV9vd25lZFRpbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX293bmVkVGls
ZXNbaV0udGV4dHVyZSkgewotICAgICAgICAgICAgaWYgKCsrdGlsZXMgPiAxKQotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi0KIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnJlbmRlckNvbnRlbnQoVGV4dHVyZU1h
cHBlciogdGV4dHVyZU1hcHBlciwgR3JhcGhpY3NMYXllciogbGF5ZXIpCiB7CiAjaWYgVVNFKFRJ
TEVEX0JBQ0tJTkdfU1RPUkUpCkBAIC0zMTksMTcgKzI3NCwxNiBAQCB2b2lkIFRleHR1cmVNYXBw
ZXJOb2RlOjpwYWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9u
cykKICAgICBpZiAobV9zaXplLmlzRW1wdHkoKSB8fCAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYm
IG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBlKSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAg
IFJlZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAobV9z
dGF0ZS5tYXNrTGF5ZXIpCi0gICAgICAgIG1hc2tUZXh0dXJlID0gbV9zdGF0ZS5tYXNrTGF5ZXIt
PnRleHR1cmUoKTsKLSAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgbV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUg
PSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsKLQot
ICAgIGZsb2F0IG9wYWNpdHkgPSBvcHRpb25zLmlzU3VyZmFjZSA/IDEgOiBvcHRpb25zLm9wYWNp
dHk7CisgICAgZmxvYXQgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eTsKKyAgICBCaXRtYXBUZXh0
dXJlKiBtYXNrID0gb3B0aW9ucy5tYXNrOwogICAgIEZsb2F0UmVjdCB0YXJnZXRSZWN0ID0gdGhp
cy0+dGFyZ2V0UmVjdCgpOwogCisgICAgLy8gV2UgYXBwbHkgdGhlIHRyYW5zZm9ybSB0aGF0IGlz
IGdlbmVyYXRlZCB0byBjb21wZW5zYXRlIGZvciBwYWludGluZyBpbnRvIGEgc3VyZmFjZS4KKyAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm0gPQorICAgICAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXgob3B0aW9ucy50cmFuc2Zvcm0pCisgICAgICAgICAgICAubXVsdGlwbHkobV90
cmFuc2Zvcm0uY29tYmluZWQoKSkKKyAgICAgICAgICAgIC50cmFuc2xhdGUob3B0aW9ucy5vZmZz
ZXQud2lkdGgoKSwgb3B0aW9ucy5vZmZzZXQuaGVpZ2h0KCkpOworCiAjaWYgVVNFKFRJTEVEX0JB
Q0tJTkdfU1RPUkUpCiAgICAgVmVjdG9yPEV4dGVybmFsbHlNYW5hZ2VkVGlsZT4gdGlsZXNUb1Bh
aW50OwogCkBAIC0zNTEsMjAgKzMwNSwxMSBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWlu
dFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICAgICAg
ICAgICAgICB0aWxlcy5wcmVwZW5kKCZpdC0+c2Vjb25kKTsKICAgICAgICAgfQogCi0gICAgICAg
IFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXg7CiAgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgdGlsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEV4dGVybmFsbHlNYW5h
Z2VkVGlsZSYgdGlsZSA9ICp0aWxlc1tpXTsKICAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0ID0g
dGlsZS5mcm9udEJ1ZmZlci50YXJnZXRSZWN0OwotCi0gICAgICAgICAgICBmbG9hdCByZXBsaWNh
T3BhY2l0eSA9IDEuMDsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllcikgewot
ICAgICAgICAgICAgICAgIHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90
cmFuc2Zvcm0uY29tYmluZWQoKS5zY2FsZSgxLjAgLyB0aWxlLnNjYWxlKTsKLSAgICAgICAgICAg
ICAgICByZXBsaWNhT3BhY2l0eSA9IG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9v
cGFjaXR5OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQml0bWFwVGV4dHVyZSYgdGV4dHVy
ZSA9ICp0aWxlLmZyb250QnVmZmVyLnRleHR1cmU7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5y
ZXBsaWNhTGF5ZXIpCi0gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3
VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCByZXBsaWNhTWF0cml4LCByZXBsaWNhT3BhY2l0eSwgcmVw
bGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUu
Z2V0KCkpOwotICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0
ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlz
U3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKHRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0
eSwgbWFzayk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM3MywyNSAr
MzE4LDEyIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZihjb25zdCBUZXh0dXJl
TWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogICAgIC8vIE5vdyB3ZSBwYWludCBvd25lZCB0
aWxlcywgaWYgd2UncmUgaW4gT3duZWRUaWxlTW9kZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG1fb3duZWRUaWxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBCaXRtYXBUZXh0dXJlKiB0
ZXh0dXJlID0gbV9vd25lZFRpbGVzW2ldLnRleHR1cmUuZ2V0KCk7Ci0gICAgICAgIGlmIChtX3N0
YXRlLnJlcGxpY2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpIHsKLSAgICAgICAgICAgIG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1cmUsIHRhcmdldFJlY3RGb3JU
aWxlUmVjdCh0YXJnZXRSZWN0LCBtX293bmVkVGlsZXNbaV0ucmVjdCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5l
ZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ICogbV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fb3BhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGlj
YU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0
KCkpOwotICAgICAgICB9Ci0KICAgICAgICAgY29uc3QgRmxvYXRSZWN0IHJlY3QgPSB0YXJnZXRS
ZWN0Rm9yVGlsZVJlY3QodGFyZ2V0UmVjdCwgbV9vd25lZFRpbGVzW2ldLnJlY3QpOwotICAgICAg
ICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCp0ZXh0dXJlLCByZWN0LCBtX3Ry
YW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNr
VGV4dHVyZS5nZXQoKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1
cmUoKnRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiAgICAgfQogCi0g
ICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAm
JiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKSB7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FM
YXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpCi0gICAgICAgICAgICBtX2N1cnJlbnRDb250ZW50
Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdl
dFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9w
YWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0
dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAg
ICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25z
LnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIG9wYWNp
dHksIG9wdGlvbnMuaXNTdXJmYWNlID8gMCA6IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICB9Cisg
ICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAm
JiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKQorICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlh
LT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3Qs
IHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiB9CiAKIGludCBUZXh0dXJlTWFwcGVyTm9kZTo6
Y29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIp
CkBAIC00MDYsMTUwICszMzgsMTMwIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnNvcnRCeVpP
cmRlcihWZWN0b3I8VGV4dHVyZU1hcHBlck5vZGUqID4mIGFycmF5LCBpbnQgZmlyCiAgICAgcXNv
cnQoYXJyYXkuZGF0YSgpLCBhcnJheS5zaXplKCksIHNpemVvZihUZXh0dXJlTWFwcGVyTm9kZSop
LCBjb21wYXJlR3JhcGhpY3NMYXllcnNaVmFsdWUpOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXJO
b2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25z
JiBvcHRpb25zLCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zRm9yRGVzY2VuZGFu
dHMpCit2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogewogICAgIGJvb2wgaGFzQ2xpcCA9
IG1fc3RhdGUubWFza3NUb0JvdW5kcyAmJiAhbV9jaGlsZHJlbi5pc0VtcHR5KCk7CiAgICAgaWYg
KGhhc0NsaXApCi0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKG1fdHJh
bnNmb3JtLmNvbWJpbmVkKCksIEZsb2F0UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXpl
LmhlaWdodCgpKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKFRy
YW5zZm9ybWF0aW9uTWF0cml4KG9wdGlvbnMudHJhbnNmb3JtKS5tdWx0aXBseShtX3RyYW5zZm9y
bS5jb21iaW5lZCgpKSwgRmxvYXRSZWN0KDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVp
Z2h0KCkpKTsKIAogICAgIHBhaW50U2VsZihvcHRpb25zKTsKIAogICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFp
bnRSZWN1cnNpdmUob3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICAgICAgbV9jaGlsZHJlbltp
XS0+cGFpbnRSZWN1cnNpdmUob3B0aW9ucyk7CiAKICAgICBpZiAoaGFzQ2xpcCkKICAgICAgICAg
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5lbmRDbGlwKCk7CiB9CiAKLWJvb2wgVGV4dHVyZU1hcHBl
ck5vZGU6OnBhaW50UmVmbGVjdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBv
cHRpb25zLCBCaXRtYXBUZXh0dXJlKiBjb250ZW50U3VyZmFjZSkKK0ludFJlY3QgVGV4dHVyZU1h
cHBlck5vZGU6OmJvdW5kaW5nUmVjdCgpCiB7Ci0gICAgaWYgKCFtX3N0YXRlLnJlcGxpY2FMYXll
cikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBib3VuZGluZ1JlY3QobV90cmFu
c2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworfQogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1
cmU+IHN1cmZhY2UoY29udGVudFN1cmZhY2UpOwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBt
YXNrU3VyZmFjZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGljYU1hc2tTdXJmYWNl
OwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBp
ZiAoVGV4dHVyZU1hcHBlck5vZGUqIHJlcGxpY2FNYXNrID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXIt
Pm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSByZXBsaWNh
TWFzay0+dGV4dHVyZSgpOwotCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJl
OwotICAgIGlmIChUZXh0dXJlTWFwcGVyTm9kZSogbWFzayA9IG1fc3RhdGUubWFza0xheWVyKQot
ICAgICAgICBtYXNrVGV4dHVyZSA9IG1hc2stPnRleHR1cmUoKTsKLQotICAgIGNvbnN0IEludFNp
emUgdmlld3BvcnRTaXplID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKTsK
LSAgICBjb25zdCBib29sIHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvclJlcGxpY2EgPSBtX3N0YXRl
LnJlcGxpY2FMYXllciAmJiBvcHRpb25zLm9wYWNpdHkgPCAwLjk5OwotICAgIGNvbnN0IGJvb2wg
dXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yTWFzayA9IG1hc2tUZXh0dXJlICYmIHJlcGxpY2FNYXNr
VGV4dHVyZTsKLSAgICBjb25zdCBGbG9hdFJlY3Qgdmlld3BvcnRSZWN0KDAsIDAsIHZpZXdwb3J0
U2l6ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpOwotICAgIC8vIFJldmVyc2UgdGhp
cyBsYXllcidzIHRyYW5zZm9ybSBvbiB0aGUgcmVwbGljYSdzIHRyYW5zZm9ybSBhbmQgdXNlIGl0
IHdpdGggdGhlIGNvbnRlbnRzCi0gICAgLy8gaW50ZXJtZWRpYXRlIHN1cmZhY2UsIGFwcGxpZWQg
aW4gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29t
YmluZWQoKTsKLSAgICByZXBsaWNhTWF0cml4Lm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVk
KCkuaW52ZXJzZSgpKTsKLQotICAgIC8vIFRoZSBtYXNrIGhhcyB0byBiZSBhZGp1c3RlZCB0byB0
YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKG1hc2tUZXh0dXJlKSB7Ci0gICAgICAgIG1hc2tT
dXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0
aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqbWFza1RleHR1cmUuZ2V0KCksIGVudGly
ZVJlY3QoKSwgbV90cmFuc2Zvcm0uY29tYmluZWQoKSwgMSwgMCk7Ci0gICAgICAgIG1hc2tUZXh0
dXJlID0gbWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gVGhlIHJlcGxpY2EncyBtYXNrIGhh
cyB0byBiZSBhZGp1c3RlZCB0byB0YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKHJlcGxpY2FN
YXNrVGV4dHVyZSkgewotICAgICAgICByZXBsaWNhTWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1
cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52
aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZh
Y2UocmVwbGljYU1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5kcmF3VGV4dHVyZSgqcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpLCBlbnRpcmVSZWN0KCks
IG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIDEsIDApOwotICAgICAgICByZXBsaWNhTWFza1RleHR1
cmUgPSByZXBsaWNhTWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gV2UgbWlnaHQgbmVlZCB0
byBhcHBseSB0aGUgbWFzayBvZiB0aGUgY29udGVudCBsYXllciBiZWZvcmUgd2UgZHJhdyB0aGUg
cmVmbGVjdGlvbiwgYXMgdGhlcmUgbWlnaHQgYmUgeWV0IGFub3RoZXIgbWFzayBmb3IgdGhlIHJl
ZmxlY3Rpb24gaXRzZWxmLgotICAgIGlmICh1c2VJbnRlcm1lZGlhdGVCdWZmZXJGb3JNYXNrKSB7
Ci0gICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4
dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXIt
PnZpZXdwb3J0U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3Vy
ZmFjZShtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+
ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwgVHJhbnNmb3JtYXRpb25N
YXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVN
YXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBzdXJm
YWNlID0gbWFza1N1cmZhY2U7Ci0gICAgICAgIG1hc2tUZXh0dXJlLmNsZWFyKCk7Ci0gICAgfQot
Ci0gICAgLy8gV2UgYmxlbmQgdGhlIGxheWVyIGFuZCBpdHMgcmVwbGljYSBpbiBhbiBpbnRlcm1l
ZGlhdGUgYnVmZmVyIGJlZm9yZSBibGVuZGluZyBpbnRvIHRoZSB0YXJnZXQgc3VyZmFjZS4KLSAg
ICBpZiAodXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yUmVwbGljYSkgewotICAgICAgICBSZWZQdHI8
Qml0bWFwVGV4dHVyZT4gcmVwbGljYVN1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFj
cXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUo
KSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UocmVwbGljYVN1
cmZhY2UuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJl
KCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRyaXgsIG1fc3RhdGUucmVw
bGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSk7Ci0gICAgICAg
IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdw
b3J0UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwot
ICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZh
Y2UuZ2V0KCkpOwotICAgICAgICBzdXJmYWNlID0gcmVwbGljYVN1cmZhY2U7CitJbnRSZWN0IFRl
eHR1cmVNYXBwZXJOb2RlOjpib3VuZGluZ1JlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IG1hdHJpeCkKK3sKKyAgICBJbnRSZWN0IHJlY3Q7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgg
bG9jYWxUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1hdGlvbk1hdHJpeChtYXRyaXgpLm11bHRpcGx5KG1f
dHJhbnNmb3JtLmNvbWJpbmVkKCkpOworICAgIHJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGxvY2Fs
VHJhbnNmb3JtLm1hcFJlY3QoZW50aXJlUmVjdCgpKSk7CisgICAgaWYgKCFtX3N0YXRlLm1hc2tz
VG9Cb3VuZHMgJiYgIW1fc3RhdGUubWFza0xheWVyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHJlY3QudW5pdGUobV9j
aGlsZHJlbltpXS0+Ym91bmRpbmdSZWN0KG1hdHJpeCkpOwogICAgIH0KIAotICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKKyAgICBpZiAobV9z
dGF0ZS5yZXBsaWNhTGF5ZXIpCisgICAgICAgIHJlY3QudW5pdGUobV9zdGF0ZS5yZXBsaWNhTGF5
ZXItPmJvdW5kaW5nUmVjdChtYXRyaXgpKTsKKworICAgIHJldHVybiByZWN0OworfQorCitib29s
IFRleHR1cmVNYXBwZXJOb2RlOjpzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSgpIGNv
bnN0Cit7CisgICAgYm9vbCBoYXNPcGFjaXR5ID0gbV9vcGFjaXR5IDwgMC45OTsKKyAgICBib29s
IGhhc0NoaWxkcmVuID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpOworICAgIGJvb2wgaGFzUmVwbGlj
YSA9ICEhbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7CisgICAgYm9vbCBoYXNNYXNrID0gISFtX3N0YXRl
Lm1hc2tMYXllcjsKIAotICAgIC8vIERyYXcgdGhlIHJlZmxlY3Rpb24uCi0gICAgaWYgKCF1c2VJ
bnRlcm1lZGlhdGVCdWZmZXJGb3JSZXBsaWNhKQotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRy
aXgsIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5n
ZXQoKSk7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHR3by1wYXNzIGJsZW5kaW5nIGZvciBwcmVzZXJ2
ZXMtM2QsIHRoYXQncyBpbiBzeW5jIHdpdGggU2FmYXJpLgorICAgIGlmIChtX3N0YXRlLnByZXNl
cnZlczNEKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBEcmF3IHRoZSBvcmlnaW5h
bC4KLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgp
LCB2aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIG9wdGlvbnMub3BhY2l0eSwg
bWFza1RleHR1cmUuZ2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRl
IHN1cmZhY2Ugd2hlbiBibGVuZGluZyBzZXZlcmFsIGl0ZW1zIHdpdGggYW4gYW5jZXN0b3Igb3Bh
Y2l0eS4KKyAgICAvLyBUZXN0ZWQgYnkgY29tcG9zaXRpbmcvcmVmbGVjdGlvbnMvcmVmbGVjdGlv
bi1vcGFjaXR5Lmh0bWwKKyAgICBpZiAoaGFzT3BhY2l0eSAmJiAoaGFzQ2hpbGRyZW4gfHwgaGFz
UmVwbGljYSkpCisgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChyZXBsaWNhTWFza1N1cmZhY2Uu
Z2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRlIHN1cmZhY2Ugd2l0
aCBhIG1hc2tlZCBhbmNlc3Rvci4KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiByZXBsaWNhcyB0aGUg
bWFzayBpcyBhcHBsaWVkIGJlZm9yZSByZXBsaWNhdGluZy4KKyAgICAvLyBUZXN0ZWQgYnkgY29t
cG9zaXRpbmcvbWFza3MvbWFza2VkLWFuY2VzdG9yLmh0bWwKKyAgICBpZiAoaGFzTWFzayAmJiBo
YXNDaGlsZHJlbiAmJiAhaGFzUmVwbGljYSkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVGV4dHVyZU1hcHBlck5v
ZGU6OnBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgb3B0aW9ucykKK2Jv
b2wgVGV4dHVyZU1hcHBlck5vZGU6OmlzVmlzaWJsZSgpIGNvbnN0CiB7Ci0gICAgaWYgKChtX3Np
emUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMKLSAgICAgICAgfHwgbV9jaGls
ZHJlbi5pc0VtcHR5KCkpKSB8fCAhbV9zdGF0ZS52aXNpYmxlIHx8IG9wdGlvbnMub3BhY2l0eSA8
IDAuMDEgfHwgbV9vcGFjaXR5IDwgMC4wMSkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChtX3Np
emUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgfHwgbV9zdGF0ZS5tYXNrTGF5
ZXIgfHwgbV9jaGlsZHJlbi5pc0VtcHR5KCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKCFtX3N0YXRlLnZpc2libGUgfHwgbV9vcGFjaXR5IDwgMC4wMSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQogCi0gICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1f
b3BhY2l0eTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gc3VyZmFjZTsKK3ZvaWQgVGV4dHVy
ZU1hcHBlck5vZGU6OnBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVy
ZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKK3sKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNh
TGF5ZXIpIHsKKyAgICAgICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyByZXBsaWNhT3B0aW9u
cyhvcHRpb25zKTsKKyAgICAgICAgLy8gV2UgY2hvb3NlIGVpdGhlciB0aGUgY29udGVudCdzIG1h
c2sgb3IgdGhlIHJlcGxpY2EncyBtYXNrLgorICAgICAgICAvLyBGSVhNRTogYmxlbmQgdGhlIHR3
byBpZiBib3RoIGV4aXN0LgorICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3Rh
dGUubWFza0xheWVyKQorICAgICAgICAgICAgcmVwbGljYU9wdGlvbnMubWFzayA9IG1fc3RhdGUu
cmVwbGljYUxheWVyLT5tX3N0YXRlLm1hc2tMYXllci0+dGV4dHVyZSgpOwogCi0gICAgYm9vbCBo
YXNSZXBsaWNhID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7Ci0gICAgYm9vbCBoYXNNYXNrID0gbV9z
dGF0ZS5tYXNrTGF5ZXI7Ci0gICAgYm9vbCBuZWVkc0JsZW5kaW5nID0gbV9vcGFjaXR5IDwgMC45
OSB8fCBoYXNNYXNrOwotICAgIGJvb2wgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlID0gIW1fY2hp
bGRyZW4uaXNFbXB0eSgpIHx8IGhhc01vcmVUaGFuT25lVGlsZSgpIHx8IChoYXNNYXNrICYmIG1f
c3RhdGUubWFza0xheWVyLT5oYXNNb3JlVGhhbk9uZVRpbGUoKSk7Ci0gICAgYm9vbCBoYXNPdmVy
bGFwcyA9IG1fc3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMgfHwgaGFzUmVwbGljYTsKLSAgICBjb25z
dCBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRT
aXplKCk7Ci0gICAgYm9vbCBuZWVkc1R3b1Bhc3MgPSAoKGhhc1JlcGxpY2EgfHwgaGFzTWFzaykg
JiYgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlKSB8fCAobmVlZHNCbGVuZGluZyAmJiBoYXNPdmVy
bGFwcyk7Ci0gICAgb3B0aW9ucy5pc1N1cmZhY2UgPSBmYWxzZTsKKyAgICAgICAgcmVwbGljYU9w
dGlvbnMudHJhbnNmb3JtCisgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fdHJhbnNmb3JtLmNvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgICAubXVs
dGlwbHkobV90cmFuc2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworICAgICAgICBwYWludFNl
bGZBbmRDaGlsZHJlbihyZXBsaWNhT3B0aW9ucyk7CisgICAgfQogCi0gICAgVGV4dHVyZU1hcHBl
clBhaW50T3B0aW9ucyBvcHRpb25zRm9yRGVzY2VuZGFudHMob3B0aW9ucyk7CisgICAgcGFpbnRT
ZWxmQW5kQ2hpbGRyZW4ob3B0aW9ucyk7Cit9CiAKLSAgICBpZiAoIW5lZWRzVHdvUGFzcykgewot
ICAgICAgICBwYWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFu
dHMpOwordm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1hcHBl
clBhaW50T3B0aW9ucyBvcHRpb25zKQoreworICAgIGlmICghaXNWaXNpYmxlKCkpCiAgICAgICAg
IHJldHVybjsKLSAgICB9CisgICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKKyAgICBS
ZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1f
c3RhdGUubWFza0xheWVyLT50ZXh0dXJlKCkgOiAwOwogCi0gICAgRmxvYXRSZWN0IHZpZXdwb3J0
UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKTsK
KyAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIHBhaW50T3B0aW9ucyhvcHRpb25zKTsKKyAg
ICBwYWludE9wdGlvbnMubWFzayA9IG1hc2tUZXh0dXJlLmdldCgpOworICAgIEludFJlY3Qgc3Vy
ZmFjZVJlY3Q7CiAKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7CisgICAg
UmVmUHRyPEJpdG1hcFRleHR1cmU+IHN1cmZhY2U7CiAKLSAgICBpZiAobV9zdGF0ZS5tYXNrTGF5
ZXIpIHsKLSAgICAgICAgbWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVp
cmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7
Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2Uu
Z2V0KCkpOwotICAgICAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIG9wdGlvbnNGb3JNYXNr
KG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zRm9yTWFzay5pc1N1cmZhY2UgPSB0cnVlOwotICAg
ICAgICBtX3N0YXRlLm1hc2tMYXllci0+cGFpbnRTZWxmKG9wdGlvbnNGb3JNYXNrKTsKKyAgICBp
ZiAoIXNob3VsZFBhaW50VG9JbnRlcm1lZGlhdGVTdXJmYWNlKCkpIHsKKyAgICAgICAgcGFpbnRT
ZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShwYWludE9wdGlvbnMpOworICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgc3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRl
eHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAg
ICBvcHRpb25zRm9yRGVzY2VuZGFudHMuc3VyZmFjZSA9IHN1cmZhY2UuZ2V0KCk7Ci0gICAgb3B0
aW9ucy5pc1N1cmZhY2UgPSB0cnVlOwotICAgIG9wdGlvbnNGb3JEZXNjZW5kYW50cy5vcGFjaXR5
ID0gMTsKKyAgICAvLyBQcmVwYXJlIGEgc3VyZmFjZSB0byBwYWludCBpbnRvLgorICAgIC8vIFdl
IHBhaW50IGludG8gdGhlIHN1cmZhY2UgaWdub3JpbmcgdGhlIG9wYWNpdHkvdHJhbnNmb3JtIG9m
IHRoZSBjdXJyZW50IGxheWVyLgorICAgIHN1cmZhY2VSZWN0ID0gYm91bmRpbmdSZWN0KCk7Cisg
ICAgc3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9v
bChzdXJmYWNlUmVjdC5zaXplKCkpOwogICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1
cmZhY2Uoc3VyZmFjZS5nZXQoKSk7CisgICAgcGFpbnRPcHRpb25zLm9wYWNpdHkgPSAxOworICAg
IHBhaW50T3B0aW9ucy50cmFuc2Zvcm0gPSBtX3RyYW5zZm9ybS5jb21iaW5lZEZvckNoaWxkcmVu
KCkuaW52ZXJzZSgpOworICAgIHBhaW50T3B0aW9ucy5vZmZzZXQgPSAtSW50U2l6ZShzdXJmYWNl
UmVjdC54KCksIHN1cmZhY2VSZWN0LnkoKSk7CiAKLSAgICBwYWludFNlbGZBbmRDaGlsZHJlbihv
cHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFudHMpOworICAgIHBhaW50U2VsZkFuZENoaWxkcmVu
V2l0aFJlcGxpY2EocGFpbnRPcHRpb25zKTsKIAotICAgIGlmICghcGFpbnRSZWZsZWN0aW9uKG9w
dGlvbnMsIHN1cmZhY2UuZ2V0KCkpKSB7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+
YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCgpLCBvcHRpb25zLm9wYWNpdHksIG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICB9
CisgICAgLy8gSWYgd2UgcGFpbnRlZCB0aGUgcmVwbGljYSwgdGhlIG1hc2sgaXMgYWxyZWFkeSBi
YWtlZCBpbiBzbyB3ZSBkb24ndCBuZWVkIHRvIHBhaW50IGl0IGFnYWluLgorICAgIGlmIChtX3N0
YXRlLnJlcGxpY2FMYXllcikKKyAgICAgICAgbWFza1RleHR1cmUgPSAwOwogCi0gICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdldCgpKTsKLSAg
ICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKG1hc2tTdXJmYWNl
LmdldCgpKTsKKyAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG9wdGlvbnMu
c3VyZmFjZSk7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdGFyZ2V0VHJhbnNmb3JtID0gVHJh
bnNmb3JtYXRpb25NYXRyaXgoKS5tdWx0aXBseShvcHRpb25zLnRyYW5zZm9ybSkubXVsdGlwbHko
bV90cmFuc2Zvcm0uY29tYmluZWQoKSkudHJhbnNsYXRlKG9wdGlvbnMub2Zmc2V0LndpZHRoKCks
IG9wdGlvbnMub2Zmc2V0LmhlaWdodCgpKTsKKyAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRy
YXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCBzdXJmYWNlUmVjdCwgdGFyZ2V0VHJhbnNmb3JtLCBv
cHRpb25zLm9wYWNpdHksIG1hc2tUZXh0dXJlLmdldCgpKTsKIH0KIAogVGV4dHVyZU1hcHBlck5v
ZGU6On5UZXh0dXJlTWFwcGVyTm9kZSgpCkBAIC03MzMsNiArNjQ1LDcgQEAgdm9pZCBUZXh0dXJl
TWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5nU3RhdGVTZWxmKEdyYXBoaWNzTGF5ZXJUZXh0dXJl
TWFwcGVyKiBncmEKICAgICBtX3N0YXRlLmJhY2tmYWNlVmlzaWJpbGl0eSA9IGdyYXBoaWNzTGF5
ZXItPmJhY2tmYWNlVmlzaWJpbGl0eSgpOwogICAgIG1fc3RhdGUuY2hpbGRyZW5UcmFuc2Zvcm0g
PSBncmFwaGljc0xheWVyLT5jaGlsZHJlblRyYW5zZm9ybSgpOwogICAgIG1fc3RhdGUub3BhY2l0
eSA9IGdyYXBoaWNzTGF5ZXItPm9wYWNpdHkoKTsKKwogICAgIG1fY3VycmVudENvbnRlbnQuY29u
dGVudFR5cGUgPSBwZW5kaW5nQ29udGVudC5jb250ZW50VHlwZTsKICAgICBtX2N1cnJlbnRDb250
ZW50LmltYWdlID0gcGVuZGluZ0NvbnRlbnQuaW1hZ2U7CiAgICAgbV9jdXJyZW50Q29udGVudC5t
ZWRpYSA9IHBlbmRpbmdDb250ZW50Lm1lZGlhOwpAQCAtOTg0LDcgKzg5Nyw2IEBAIHZvaWQgVGV4
dHVyZU1hcHBlck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlKEdyYXBoaWNzTGF5ZXJUZXh0dXJl
TWFwcGVyKiBncmFwaGljCiAgICAgc3luY0FuaW1hdGlvbnMoZ3JhcGhpY3NMYXllcik7CiAKICAg
ICBjb21wdXRlVGlsZXMoKTsKLSAgICBjb21wdXRlT3ZlcmxhcHNJZk5lZWRlZCgpOwogCiAgICAg
aWYgKGdyYXBoaWNzTGF5ZXIpCiAgICAgICAgIHJlbmRlckNvbnRlbnQodGV4dHVyZU1hcHBlciwg
Z3JhcGhpY3NMYXllcik7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5oCmluZGV4IDM5NjVlZTYuLmNmOTZk
YmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9U
ZXh0dXJlTWFwcGVyTm9kZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5oCkBAIC00NCwxNSArNDQsMTYgQEAgY2xhc3MgR3Jh
cGhpY3NMYXllclRleHR1cmVNYXBwZXI7CiBjbGFzcyBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25z
IHsKIHB1YmxpYzoKICAgICBCaXRtYXBUZXh0dXJlKiBzdXJmYWNlOwotICAgIFRleHR1cmVNYXBw
ZXIqIHRleHR1cmVNYXBwZXI7Ci0KKyAgICBCaXRtYXBUZXh0dXJlKiBtYXNrOwogICAgIGZsb2F0
IG9wYWNpdHk7Ci0gICAgYm9vbCBpc1N1cmZhY2U7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgg
dHJhbnNmb3JtOworICAgIEludFNpemUgb2Zmc2V0OworICAgIFRleHR1cmVNYXBwZXIqIHRleHR1
cmVNYXBwZXI7CiAgICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucygpCiAgICAgICAgIDogc3Vy
ZmFjZSgwKQotICAgICAgICAsIHRleHR1cmVNYXBwZXIoMCkKKyAgICAgICAgLCBtYXNrKDApCiAg
ICAgICAgICwgb3BhY2l0eSgxKQotICAgICAgICAsIGlzU3VyZmFjZShmYWxzZSkKKyAgICAgICAg
LCB0ZXh0dXJlTWFwcGVyKDApCiAgICAgeyB9CiB9OwogCkBAIC0xNzksOCArMTgwLDkgQEAgcHJp
dmF0ZToKICAgICB2b2lkIGNvbXB1dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKCk7CiAgICAgdm9pZCBj
b21wdXRlT3ZlcmxhcHNJZk5lZWRlZCgpOwogICAgIHZvaWQgY29tcHV0ZVRpbGVzKCk7CisgICAg
SW50UmVjdCBib3VuZGluZ1JlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKyAgICBJ
bnRSZWN0IGJvdW5kaW5nUmVjdCgpOwogICAgIHZvaWQgc3dhcENvbnRlbnRzQnVmZmVycygpOwot
ICAgIGludCBjb3VudERlc2NlbmRhbnRzV2l0aENvbnRlbnQoKSBjb25zdDsKICAgICBGbG9hdFJl
Y3QgdGFyZ2V0UmVjdEZvclRpbGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdG90YWxUYXJnZXRSZWN0
LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0KSBjb25zdDsKICAgICB2b2lkIGludmFsaWRhdGVW
aWV3cG9ydChjb25zdCBGbG9hdFJlY3QmKTsKICAgICB2b2lkIG5vdGlmeUNoYW5nZShDaGFuZ2VN
YXNrKTsKQEAgLTE5Miw5ICsxOTQsOSBAQCBwcml2YXRlOgogICAgIEJpdG1hcFRleHR1cmUqIHRl
eHR1cmUoKSB7IHJldHVybiBtX293bmVkVGlsZXMuaXNFbXB0eSgpID8gMCA6IG1fb3duZWRUaWxl
c1swXS50ZXh0dXJlLmdldCgpOyB9CiAKICAgICB2b2lkIHBhaW50UmVjdXJzaXZlKFRleHR1cmVN
YXBwZXJQYWludE9wdGlvbnMpOwotICAgIGJvb2wgcGFpbnRSZWZsZWN0aW9uKGNvbnN0IFRleHR1
cmVNYXBwZXJQYWludE9wdGlvbnMmLCBCaXRtYXBUZXh0dXJlKiBzdXJmYWNlKTsKICAgICB2b2lk
IHBhaW50U2VsZihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJik7Ci0gICAgdm9pZCBw
YWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiwgVGV4
dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICB2b2lk
IHBhaW50U2VsZkFuZENoaWxkcmVuKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmKTsK
KyAgICB2b2lkIHBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVyZU1h
cHBlclBhaW50T3B0aW9ucyYpOwogICAgIHZvaWQgcmVuZGVyQ29udGVudChUZXh0dXJlTWFwcGVy
KiwgR3JhcGhpY3NMYXllciopOwogCiAgICAgdm9pZCBzeW5jQW5pbWF0aW9ucyhHcmFwaGljc0xh
eWVyVGV4dHVyZU1hcHBlciopOwpAQCAtMjA0LDcgKzIwNiw4IEBAIHByaXZhdGU6CiAgICAgdm9p
ZCBhcHBseVRyYW5zZm9ybUFuaW1hdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyQW5pbWF0aW9uJiwg
Y29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogc3RhcnQsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlv
bnMqIGVuZCwgZG91YmxlKTsKICAgICBib29sIGhhc09wYWNpdHlBbmltYXRpb24oKSBjb25zdDsK
ICAgICBib29sIGhhc1RyYW5zZm9ybUFuaW1hdGlvbigpIGNvbnN0OwotICAgIGJvb2wgaGFzTW9y
ZVRoYW5PbmVUaWxlKCkgY29uc3Q7CisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdDsKKyAgICBi
b29sIHNob3VsZFBhaW50VG9JbnRlcm1lZGlhdGVTdXJmYWNlKCkgY29uc3Q7CiAKICAgICBMYXll
clRyYW5zZm9ybSBtX3RyYW5zZm9ybTsKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122642</attachid>
            <date>2012-01-16 08:24:04 -0800</date>
            <delta_ts>2012-01-16 08:31:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>26503</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4OThlMTBhLi5hNTM2ODJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzgg
QEAKKzIwMTItMDEtMTUgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBbVGV4bWFwXSBUZXh0dXJlTWFwcGVyIGNyZWF0ZXMgdHdvIG1hbnkgYmln
IGludGVybWVkaWF0ZSBzdXJmYWNlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzYzMzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGUgZm9sbG93aW5nIGhhcyBiZWVuIGRvbmUgdG8gb3B0aW1pemUgc3Vy
ZmFjZSBhbGxvY2F0aW9uOgorICAgICAgICAxLiBJbnN0ZWFkIG9mIHVzaW5nIGEgdmlld3BvcnQt
c2l6ZSBzdXJmYWNlLCB1c2UgYSBzdXJmYWNlIGluIHRoZSBzaXplIG9mIHRoZSBsYXllcidzCisg
ICAgICAgICAgIGJvdW5kaW5nIHJlY3QgYW5kIGFwcGx5IHRoZSB0cmFuc2Zvcm0gYWZ0ZXIgdGhl
IGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQgaW50byBpdC4KKyAgICAgICAgMi4gQXZvaWQgZ2Vu
ZXJhdGluZyBpbnRlcm1lZGlhdGUgc3VyZmFjZSBmb3Igb2NjYXNpb25zIHdoZXJlIHRoZXkncmUg
bm90IG5lY2Vzc2FyeSwKKyAgICAgICAgICAgc3VjaCBhcyBuZXN0ZWQgcmVmbGVjdGlvbnMgd2l0
aG91dCBvcGFjaXR5LgorICAgICAgICAzLiBSZWxlYXNpbmcgb2YgdGV4dHVyZXMgZnJvbSB0aGUg
cG9vbCBpcyBub3cgaW1wbGljaXQsIGJhc2VkIG9uIHJlZkNvdW50LgorICAgICAgICA0LiBEbyBu
b3QgdXNlIGludGVybWVkaWF0ZSBzdXJmYWNlcyBmb3IgcHJlc2VydmUtM2QgbGF5ZXJzLiBUaGlz
IGlzIGluIGFsaWdubWVudCB3aXRoCisgICAgICAgICAgIG90aGVyIHBvcnRzLgorCisgICAgICAg
IFRlc3RzIGluIExheW91dFRlc3RzL2NvbXBvc2l0aW5nL21hc2tzIGFuZCBMYXlvdXRUZXN0cy9j
b21wb3NpdGluZy9yZWZsZWN0aW9uIGNvdmVyIHRoaXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlTWFwcGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlTWFwcGVyTm9kZTo6Y29tcHV0ZVRyYW5zZm9ybXNSZWN1cnNpdmUpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZik6CisgICAgICAgIChXZWJDb3JlOjpU
ZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dHVyZU1hcHBlck5vZGU6OmJvdW5kaW5nUmVjdEZvckludGVybWVkaWF0ZVN1cmZhY2Up
OgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnNob3VsZFBhaW50VG9JbnRl
cm1lZGlhdGVTdXJmYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpp
c1Zpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2Vs
ZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBl
ck5vZGU6OnBhaW50UmVjdXJzaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJO
b2RlOjpzeW5jQ29tcG9zaXRpbmdTdGF0ZVNlbGYpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVy
ZU1hcHBlck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVNYXBwZXJQYWludE9wdGlvbnM6OlRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMpOgorCiAy
MDEyLTAxLTEzICBPamFuIFZhZmFpICA8b2phbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW1w
bGVtZW50IGZsZXgtYWxpZ24KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcAppbmRleCAyNjIyZDIxLi5kMTdlOTU4
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4
dHVyZU1hcHBlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4
bWFwL1RleHR1cmVNYXBwZXIuY3BwCkBAIC0yNiwxOCArMjYsMjAgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogCiBQYXNzUmVmUHRyPEJpdG1hcFRleHR1cmU+IFRleHR1cmVNYXBwZXI6OmFjcXVpcmVU
ZXh0dXJlRnJvbVBvb2woY29uc3QgSW50U2l6ZSYgc2l6ZSkKIHsKLSAgICBpZiAobV90ZXh0dXJl
UG9vbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVk
VGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoKTsKLSAgICAgICAgc2VsZWN0ZWRUZXh0dXJlLT5yZXNl
dChzaXplLCBmYWxzZSk7Ci0gICAgICAgIHNlbGVjdGVkVGV4dHVyZS0+bG9jaygpOwotICAgICAg
ICByZXR1cm4gc2VsZWN0ZWRUZXh0dXJlOwotICAgIH0KKyAgICBSZWZQdHI8Qml0bWFwVGV4dHVy
ZT4gc2VsZWN0ZWRUZXh0dXJlOwogCi0gICAgc2l6ZV90IGluZGV4ID0gMDsKLSAgICBSZWZQdHI8
Qml0bWFwVGV4dHVyZT4gc2VsZWN0ZWRUZXh0dXJlID0gbV90ZXh0dXJlUG9vbFswXTsKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdGV4dHVyZVBvb2wuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+JiB0ZXh0dXJlID0gbV90ZXh0dXJlUG9vbFtpXTsKIAot
ICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbV90ZXh0dXJlUG9vbC5zaXplKCk7ICsraSkgewot
ICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gdGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbaV07
CisgICAgICAgIC8vIElmIHRoZSBzdXJmYWNlIGhhcyBvbmx5IG9uZSByZWZlcmVuY2UsIHdlIGNh
biBzYWZlbHkgcmV1c2UgaXQuCisgICAgICAgIGlmICh0ZXh0dXJlLT5yZWZDb3VudCgpID4gMSkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFdlIGRlZmF1bHQgdG8gdGhlIGZp
cnN0IGF2YWlsYWJsZSB0ZXh0dXJlLgorICAgICAgICBpZiAoIXNlbGVjdGVkVGV4dHVyZSkgewor
ICAgICAgICAgICAgc2VsZWN0ZWRUZXh0dXJlID0gdGV4dHVyZTsKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CiAKICAgICAgICAgSW50U2l6ZSB0ZXh0dXJlU2l6ZSA9IHRleHR1cmUt
PnNpemUoKTsKICAgICAgICAgSW50U2l6ZSBzZWxlY3RlZFRleHR1cmVTaXplID0gc2VsZWN0ZWRU
ZXh0dXJlLT5zaXplKCk7CkBAIC01OCwyMiArNjAsMTYgQEAgUGFzc1JlZlB0cjxCaXRtYXBUZXh0
dXJlPiBUZXh0dXJlTWFwcGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKGNvbnN0IEludFNpemUm
IHMKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIHNlbGVjdGVkVGV4dHVyZSA9IHRl
eHR1cmU7Ci0gICAgICAgIGluZGV4ID0gaTsKICAgICB9CiAKLSAgICBtX3RleHR1cmVQb29sLnJl
bW92ZShpbmRleCk7CisgICAgaWYgKCFzZWxlY3RlZFRleHR1cmUpIHsKKyAgICAgICAgc2VsZWN0
ZWRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZSgpOworICAgICAgICBtX3RleHR1cmVQb29sLmFwcGVu
ZChzZWxlY3RlZFRleHR1cmUpOworICAgIH0KKwogICAgIHNlbGVjdGVkVGV4dHVyZS0+cmVzZXQo
c2l6ZSwgZmFsc2UpOwotICAgIHNlbGVjdGVkVGV4dHVyZS0+bG9jaygpOwogICAgIHJldHVybiBz
ZWxlY3RlZFRleHR1cmU7CiB9CiAKLXZvaWQgVGV4dHVyZU1hcHBlcjo6cmVsZWFzZVRleHR1cmVU
b1Bvb2woQml0bWFwVGV4dHVyZSogdGV4dHVyZSkKLXsKLSAgICBpZiAoIXRleHR1cmUpCi0gICAg
ICAgIHJldHVybjsKLSAgICBtX3RleHR1cmVQb29sLmFwcGVuZCh0ZXh0dXJlKTsKLSAgICB0ZXh0
dXJlLT51bmxvY2soKTsKLX0KLQogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oIGIvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaAppbmRleCBkODEzMzNk
Li5jMWRjYmJkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90
ZXhtYXAvVGV4dHVyZU1hcHBlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmgKQEAgLTEyNiw3ICsxMjYsNyBAQCBwdWJsaWM6CiAg
ICAgdmlydHVhbCB2b2lkIGJlZ2luUGFpbnRpbmcoKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgZW5k
UGFpbnRpbmcoKSB7IH0KIAotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlVGV4dHVyZVRvUG9vbChC
aXRtYXBUZXh0dXJlKiBzdXJmYWNlKTsKKyAgICAvLyBBIHN1cmZhY2UgaXMgcmVsZWFzZWQgaW1w
bGljaXRseSB3aGVuIGRlcmVmZXJlbmNlZC4KICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Qml0bWFw
VGV4dHVyZT4gYWNxdWlyZVRleHR1cmVGcm9tUG9vbChjb25zdCBJbnRTaXplJik7CiAKIApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVN
YXBwZXJOb2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9U
ZXh0dXJlTWFwcGVyTm9kZS5jcHAKaW5kZXggM2JmZGZkZS4uYWI1NTk5YSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2Rl
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVy
ZU1hcHBlck5vZGUuY3BwCkBAIC01MCwyMiArNTAsNiBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2Rl
OjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCkKICAgICBt
X3RyYW5zZm9ybS5zZXRMb2NhbFRyYW5zZm9ybShtYXRyaXgpOwogfQogCi1pbnQgVGV4dHVyZU1h
cHBlck5vZGU6OmNvdW50RGVzY2VuZGFudHNXaXRoQ29udGVudCgpIGNvbnN0Ci17Ci0gICAgaWYg
KCFtX3N0YXRlLnZpc2libGUgfHwgKCFtX3NpemUud2lkdGgoKSAmJiAhbV9zaXplLmhlaWdodCgp
ICYmIG1fc3RhdGUubWFza3NUb0JvdW5kcykpCi0gICAgICAgIHJldHVybiAwOwotICAgIGludCBj
b3VudCA9IChtX3NpemUud2lkdGgoKSAmJiBtX3NpemUuaGVpZ2h0KCkgJiYgKG1fc3RhdGUuZHJh
d3NDb250ZW50IHx8IG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgIT0gSFRNTENvbnRlbnRU
eXBlKSkgPyAxIDogMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6
ZSgpOyArK2kpCi0gICAgICAgIGNvdW50ICs9IG1fY2hpbGRyZW5baV0tPmNvdW50RGVzY2VuZGFu
dHNXaXRoQ29udGVudCgpOwotCi0gICAgcmV0dXJuIGNvdW50OwotfQotCi12b2lkIFRleHR1cmVN
YXBwZXJOb2RlOjpjb21wdXRlT3ZlcmxhcHNJZk5lZWRlZCgpCi17Ci0gICAgbV9zdGF0ZS5taWdo
dEhhdmVPdmVybGFwcyA9IGNvdW50RGVzY2VuZGFudHNXaXRoQ29udGVudCgpID4gMTsKLX0KLQog
dm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcHV0ZVRyYW5zZm9ybXNSZWN1cnNpdmUoKQogewog
ICAgIGlmIChtX3NpemUuaXNFbXB0eSgpICYmIG1fc3RhdGUubWFza3NUb0JvdW5kcykKQEAgLTIw
NCwzNSArMTg4LDYgQEAgYm9vbCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29sbGVjdFZpc2libGVDb250
ZW50c1JlY3RzKE5vZGVSZWN0TWFwJiByZWN0TWFwLCBjb25zdAogfQogI2VuZGlmCiAKLWJvb2wg
VGV4dHVyZU1hcHBlck5vZGU6Omhhc01vcmVUaGFuT25lVGlsZSgpIGNvbnN0Ci17Ci0gICAgaW50
IHRpbGVzID0gMDsKLQotI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQotICAgIGlmIChtX3N0
YXRlLnRpbGVPd25lcnNoaXAgPT0gRXh0ZXJuYWxseU1hbmFnZWRUaWxlcykgewotICAgICAgICBI
YXNoTWFwPGludCwgRXh0ZXJuYWxseU1hbmFnZWRUaWxlPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
bV9leHRlcm5hbGx5TWFuYWdlZFRpbGVzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hNYXA8aW50
LCBFeHRlcm5hbGx5TWFuYWdlZFRpbGU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZXh0ZXJuYWxs
eU1hbmFnZWRUaWxlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGlm
IChpdC0+c2Vjb25kLmZyb250QnVmZmVyLnRleHR1cmUpIHsKLSAgICAgICAgICAgICAgICBpZiAo
Kyt0aWxlcyA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgot
Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX293bmVkVGlsZXMuc2l6ZSgpOyArK2kpIHsK
LSAgICAgICAgaWYgKG1fb3duZWRUaWxlc1tpXS50ZXh0dXJlKSB7Ci0gICAgICAgICAgICBpZiAo
Kyt0aWxlcyA+IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLQogdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6
cmVuZGVyQ29udGVudChUZXh0dXJlTWFwcGVyKiB0ZXh0dXJlTWFwcGVyLCBHcmFwaGljc0xheWVy
KiBsYXllcikKIHsKICNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKQEAgLTMxOSwxNyArMjc0
LDE2IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZihjb25zdCBUZXh0dXJlTWFw
cGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogICAgIGlmIChtX3NpemUuaXNFbXB0eSgpIHx8ICgh
bV9zdGF0ZS5kcmF3c0NvbnRlbnQgJiYgbV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9PSBI
VE1MQ29udGVudFR5cGUpKQogICAgICAgICByZXR1cm47CiAKLSAgICBSZWZQdHI8Qml0bWFwVGV4
dHVyZT4gbWFza1RleHR1cmU7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHJlcGxpY2FNYXNr
VGV4dHVyZTsKLQotICAgIGlmIChtX3N0YXRlLm1hc2tMYXllcikKLSAgICAgICAgbWFza1RleHR1
cmUgPSBtX3N0YXRlLm1hc2tMYXllci0+dGV4dHVyZSgpOwotICAgIGlmIChtX3N0YXRlLnJlcGxp
Y2FMYXllciAmJiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXIpCi0gICAg
ICAgIHJlcGxpY2FNYXNrVGV4dHVyZSA9IG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3N0YXRlLm1h
c2tMYXllci0+dGV4dHVyZSgpOwotCi0gICAgZmxvYXQgb3BhY2l0eSA9IG9wdGlvbnMuaXNTdXJm
YWNlID8gMSA6IG9wdGlvbnMub3BhY2l0eTsKKyAgICBmbG9hdCBvcGFjaXR5ID0gb3B0aW9ucy5v
cGFjaXR5OworICAgIEJpdG1hcFRleHR1cmUqIG1hc2sgPSBvcHRpb25zLm1hc2s7CiAgICAgRmxv
YXRSZWN0IHRhcmdldFJlY3QgPSB0aGlzLT50YXJnZXRSZWN0KCk7CiAKKyAgICAvLyBXZSBhcHBs
eSB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybSB0byBjb21wZW5zYXRlIGZvciBwYWludGluZyBpbnRv
IGEgc3VyZmFjZSwgYW5kIHRoZW4gYXBwbHkgdGhlIG9mZnNldCBzbyB0aGF0IHRoZSBwYWludGlu
ZyBmaXRzIGluIHRoZSB0YXJnZXQgcmVjdC4KKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFu
c2Zvcm0gPQorICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgob3B0aW9ucy50cmFuc2Zv
cm0pCisgICAgICAgICAgICAubXVsdGlwbHkobV90cmFuc2Zvcm0uY29tYmluZWQoKSkKKyAgICAg
ICAgICAgIC50cmFuc2xhdGUob3B0aW9ucy5vZmZzZXQud2lkdGgoKSwgb3B0aW9ucy5vZmZzZXQu
aGVpZ2h0KCkpOworCiAjaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCiAgICAgVmVjdG9yPEV4
dGVybmFsbHlNYW5hZ2VkVGlsZT4gdGlsZXNUb1BhaW50OwogCkBAIC0zNTEsMjAgKzMwNSwxMSBA
QCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBh
aW50T3B0aW9ucyYgb3B0aW9ucykKICAgICAgICAgICAgICAgICB0aWxlcy5wcmVwZW5kKCZpdC0+
c2Vjb25kKTsKICAgICAgICAgfQogCi0gICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxp
Y2FNYXRyaXg7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGlsZXMuc2l6ZSgpOyArK2kp
IHsKICAgICAgICAgICAgIEV4dGVybmFsbHlNYW5hZ2VkVGlsZSYgdGlsZSA9ICp0aWxlc1tpXTsK
ICAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0ID0gdGlsZS5mcm9udEJ1ZmZlci50YXJnZXRSZWN0
OwotCi0gICAgICAgICAgICBmbG9hdCByZXBsaWNhT3BhY2l0eSA9IDEuMDsKLSAgICAgICAgICAg
IGlmIChtX3N0YXRlLnJlcGxpY2FMYXllcikgewotICAgICAgICAgICAgICAgIHJlcGxpY2FNYXRy
aXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKS5zY2FsZSgx
LjAgLyB0aWxlLnNjYWxlKTsKLSAgICAgICAgICAgICAgICByZXBsaWNhT3BhY2l0eSA9IG9wYWNp
dHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5OwotICAgICAgICAgICAgfQogICAg
ICAgICAgICAgQml0bWFwVGV4dHVyZSYgdGV4dHVyZSA9ICp0aWxlLmZyb250QnVmZmVyLnRleHR1
cmU7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpCi0gICAgICAgICAgICAg
ICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCByZXBs
aWNhTWF0cml4LCByZXBsaWNhT3BhY2l0eSwgcmVwbGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1h
c2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICAgICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5j
b21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5n
ZXQoKSk7CisgICAgICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKHRl
eHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiAgICAgICAgIH0KICAgICAg
ICAgcmV0dXJuOwogICAgIH0KQEAgLTM3MywyNSArMzE4LDEyIEBAIHZvaWQgVGV4dHVyZU1hcHBl
ck5vZGU6OnBhaW50U2VsZihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25z
KQogICAgIC8vIE5vdyB3ZSBwYWludCBvd25lZCB0aWxlcywgaWYgd2UncmUgaW4gT3duZWRUaWxl
TW9kZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fb3duZWRUaWxlcy5zaXplKCk7ICsr
aSkgewogICAgICAgICBCaXRtYXBUZXh0dXJlKiB0ZXh0dXJlID0gbV9vd25lZFRpbGVzW2ldLnRl
eHR1cmUuZ2V0KCk7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllciAmJiAhb3B0aW9u
cy5pc1N1cmZhY2UpIHsKLSAgICAgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1Rl
eHR1cmUoKnRleHR1cmUsIHRhcmdldFJlY3RGb3JUaWxlUmVjdCh0YXJnZXRSZWN0LCBtX293bmVk
VGlsZXNbaV0ucmVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUucmVw
bGljYUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5lZCgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBvcGFjaXR5ICogbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fb3BhY2l0eSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tU
ZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICB9Ci0KICAgICAgICAg
Y29uc3QgRmxvYXRSZWN0IHJlY3QgPSB0YXJnZXRSZWN0Rm9yVGlsZVJlY3QodGFyZ2V0UmVjdCwg
bV9vd25lZFRpbGVzW2ldLnJlY3QpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRy
YXdUZXh0dXJlKCp0ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5
LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgIG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1cmUsIHJlY3QsIHRyYW5zZm9y
bSwgb3BhY2l0eSwgbWFzayk7CiAgICAgfQogCi0gICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29u
dGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAmJiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKSB7
Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2Up
Ci0gICAgICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBl
cihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnJlcGxpY2FMYXll
ci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXll
ci0+bV9vcGFjaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdl
dCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlh
LT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3Qs
IG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIG9wYWNpdHksIG9wdGlvbnMuaXNTdXJmYWNlID8gMCA6
IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICB9CisgICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29u
dGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAmJiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKQor
ICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRp
b25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7
CiB9CiAKIGludCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVl
KGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCkBAIC00MDYsMTUwICszMzgsMTM2IEBAIHZv
aWQgVGV4dHVyZU1hcHBlck5vZGU6OnNvcnRCeVpPcmRlcihWZWN0b3I8VGV4dHVyZU1hcHBlck5v
ZGUqID4mIGFycmF5LCBpbnQgZmlyCiAgICAgcXNvcnQoYXJyYXkuZGF0YSgpLCBhcnJheS5zaXpl
KCksIHNpemVvZihUZXh0dXJlTWFwcGVyTm9kZSopLCBjb21wYXJlR3JhcGhpY3NMYXllcnNaVmFs
dWUpOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihj
b25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zLCBUZXh0dXJlTWFwcGVyUGFp
bnRPcHRpb25zJiBvcHRpb25zRm9yRGVzY2VuZGFudHMpCit2b2lkIFRleHR1cmVNYXBwZXJOb2Rl
OjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBv
cHRpb25zKQogewogICAgIGJvb2wgaGFzQ2xpcCA9IG1fc3RhdGUubWFza3NUb0JvdW5kcyAmJiAh
bV9jaGlsZHJlbi5pc0VtcHR5KCk7CiAgICAgaWYgKGhhc0NsaXApCi0gICAgICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIEZsb2F0UmVj
dCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKSk7CisgICAgICAgIG9wdGlv
bnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKFRyYW5zZm9ybWF0aW9uTWF0cml4KG9wdGlvbnMu
dHJhbnNmb3JtKS5tdWx0aXBseShtX3RyYW5zZm9ybS5jb21iaW5lZCgpKSwgRmxvYXRSZWN0KDAs
IDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpKTsKIAogICAgIHBhaW50U2VsZihv
cHRpb25zKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsr
aSkKLSAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFpbnRSZWN1cnNpdmUob3B0aW9uc0ZvckRlc2Nl
bmRhbnRzKTsKKyAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFpbnRSZWN1cnNpdmUob3B0aW9ucyk7
CiAKICAgICBpZiAoaGFzQ2xpcCkKICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5lbmRD
bGlwKCk7CiB9CiAKLWJvb2wgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50UmVmbGVjdGlvbihjb25z
dCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zLCBCaXRtYXBUZXh0dXJlKiBjb250
ZW50U3VyZmFjZSkKK0ludFJlY3QgVGV4dHVyZU1hcHBlck5vZGU6OmludGVybWVkaWF0ZVN1cmZh
Y2VSZWN0KCkKIHsKLSAgICBpZiAoIW1fc3RhdGUucmVwbGljYUxheWVyKQotICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgLy8gRklYTUU6IEFkZCBhbiBpbnZlcnNlIHRyYW5zZm9ybSB0byBMYXll
clRyYW5zZm9ybS4KKyAgICByZXR1cm4gaW50ZXJtZWRpYXRlU3VyZmFjZVJlY3QobV90cmFuc2Zv
cm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworfQogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+
IHN1cmZhY2UoY29udGVudFN1cmZhY2UpOwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNr
U3VyZmFjZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGljYU1hc2tTdXJmYWNlOwot
ICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAo
VGV4dHVyZU1hcHBlck5vZGUqIHJlcGxpY2FNYXNrID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1f
c3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSByZXBsaWNhTWFz
ay0+dGV4dHVyZSgpOwotCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwot
ICAgIGlmIChUZXh0dXJlTWFwcGVyTm9kZSogbWFzayA9IG1fc3RhdGUubWFza0xheWVyKQotICAg
ICAgICBtYXNrVGV4dHVyZSA9IG1hc2stPnRleHR1cmUoKTsKLQotICAgIGNvbnN0IEludFNpemUg
dmlld3BvcnRTaXplID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKTsKLSAg
ICBjb25zdCBib29sIHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvclJlcGxpY2EgPSBtX3N0YXRlLnJl
cGxpY2FMYXllciAmJiBvcHRpb25zLm9wYWNpdHkgPCAwLjk5OwotICAgIGNvbnN0IGJvb2wgdXNl
SW50ZXJtZWRpYXRlQnVmZmVyRm9yTWFzayA9IG1hc2tUZXh0dXJlICYmIHJlcGxpY2FNYXNrVGV4
dHVyZTsKLSAgICBjb25zdCBGbG9hdFJlY3Qgdmlld3BvcnRSZWN0KDAsIDAsIHZpZXdwb3J0U2l6
ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpOwotICAgIC8vIFJldmVyc2UgdGhpcyBs
YXllcidzIHRyYW5zZm9ybSBvbiB0aGUgcmVwbGljYSdzIHRyYW5zZm9ybSBhbmQgdXNlIGl0IHdp
dGggdGhlIGNvbnRlbnRzCi0gICAgLy8gaW50ZXJtZWRpYXRlIHN1cmZhY2UsIGFwcGxpZWQgaW4g
dGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmlu
ZWQoKTsKLSAgICByZXBsaWNhTWF0cml4Lm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCku
aW52ZXJzZSgpKTsKLQotICAgIC8vIFRoZSBtYXNrIGhhcyB0byBiZSBhZGp1c3RlZCB0byB0YXJn
ZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKG1hc2tUZXh0dXJlKSB7Ci0gICAgICAgIG1hc2tTdXJm
YWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9wdGlv
bnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRleHR1
cmVNYXBwZXItPmJpbmRTdXJmYWNlKG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqbWFza1RleHR1cmUuZ2V0KCksIGVudGlyZVJl
Y3QoKSwgbV90cmFuc2Zvcm0uY29tYmluZWQoKSwgMSwgMCk7Ci0gICAgICAgIG1hc2tUZXh0dXJl
ID0gbWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gVGhlIHJlcGxpY2EncyBtYXNrIGhhcyB0
byBiZSBhZGp1c3RlZCB0byB0YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKHJlcGxpY2FNYXNr
VGV4dHVyZSkgewotICAgICAgICByZXBsaWNhTWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVN
YXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3
cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uo
cmVwbGljYU1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVy
LT5kcmF3VGV4dHVyZSgqcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpLCBlbnRpcmVSZWN0KCksIG1f
dHJhbnNmb3JtLmNvbWJpbmVkKCksIDEsIDApOwotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUg
PSByZXBsaWNhTWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gV2UgbWlnaHQgbmVlZCB0byBh
cHBseSB0aGUgbWFzayBvZiB0aGUgY29udGVudCBsYXllciBiZWZvcmUgd2UgZHJhdyB0aGUgcmVm
bGVjdGlvbiwgYXMgdGhlcmUgbWlnaHQgYmUgeWV0IGFub3RoZXIgbWFzayBmb3IgdGhlIHJlZmxl
Y3Rpb24gaXRzZWxmLgotICAgIGlmICh1c2VJbnRlcm1lZGlhdGVCdWZmZXJGb3JNYXNrKSB7Ci0g
ICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4dHVy
ZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZp
ZXdwb3J0U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFj
ZShtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJh
d1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRy
aXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBzdXJmYWNl
ID0gbWFza1N1cmZhY2U7Ci0gICAgICAgIG1hc2tUZXh0dXJlLmNsZWFyKCk7Ci0gICAgfQotCi0g
ICAgLy8gV2UgYmxlbmQgdGhlIGxheWVyIGFuZCBpdHMgcmVwbGljYSBpbiBhbiBpbnRlcm1lZGlh
dGUgYnVmZmVyIGJlZm9yZSBibGVuZGluZyBpbnRvIHRoZSB0YXJnZXQgc3VyZmFjZS4KLSAgICBp
ZiAodXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yUmVwbGljYSkgewotICAgICAgICBSZWZQdHI8Qml0
bWFwVGV4dHVyZT4gcmVwbGljYVN1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVp
cmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7
Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UocmVwbGljYVN1cmZh
Y2UuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpz
dXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRyaXgsIG1fc3RhdGUucmVwbGlj
YUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSk7Ci0gICAgICAgIG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0
UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAg
ICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2Uu
Z2V0KCkpOwotICAgICAgICBzdXJmYWNlID0gcmVwbGljYVN1cmZhY2U7CitJbnRSZWN0IFRleHR1
cmVNYXBwZXJOb2RlOjppbnRlcm1lZGlhdGVTdXJmYWNlUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCYgbWF0cml4KQoreworICAgIEludFJlY3QgcmVjdDsKKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBsb2NhbFRyYW5zZm9ybSA9IFRyYW5zZm9ybWF0aW9uTWF0cml4KG1hdHJpeCkubXVs
dGlwbHkobV90cmFuc2Zvcm0uY29tYmluZWQoKSk7CisgICAgcmVjdCA9IGVuY2xvc2luZ0ludFJl
Y3QobG9jYWxUcmFuc2Zvcm0ubWFwUmVjdChlbnRpcmVSZWN0KCkpKTsKKyAgICBpZiAoIW1fc3Rh
dGUubWFza3NUb0JvdW5kcyAmJiAhbV9zdGF0ZS5tYXNrTGF5ZXIpIHsKKyAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQorICAgICAgICAgICAgcmVjdC51
bml0ZShtX2NoaWxkcmVuW2ldLT5pbnRlcm1lZGlhdGVTdXJmYWNlUmVjdChtYXRyaXgpKTsKICAg
ICB9CiAKLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG9wdGlvbnMuc3Vy
ZmFjZSk7CisgICAgaWYgKG1fc3RhdGUucmVwbGljYUxheWVyKQorICAgICAgICByZWN0LnVuaXRl
KG1fc3RhdGUucmVwbGljYUxheWVyLT5pbnRlcm1lZGlhdGVTdXJmYWNlUmVjdChtYXRyaXgpKTsK
KworICAgIHJldHVybiByZWN0OworfQorCitib29sIFRleHR1cmVNYXBwZXJOb2RlOjpzaG91bGRQ
YWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSgpIGNvbnN0Cit7CisgICAgYm9vbCBoYXNPcGFjaXR5
ID0gbV9vcGFjaXR5IDwgMC45OTsKKyAgICBib29sIGhhc0NoaWxkcmVuID0gIW1fY2hpbGRyZW4u
aXNFbXB0eSgpOworICAgIGJvb2wgaGFzUmVwbGljYSA9ICEhbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7
CisgICAgYm9vbCBoYXNNYXNrID0gISFtX3N0YXRlLm1hc2tMYXllcjsKIAotICAgIC8vIERyYXcg
dGhlIHJlZmxlY3Rpb24uCi0gICAgaWYgKCF1c2VJbnRlcm1lZGlhdGVCdWZmZXJGb3JSZXBsaWNh
KQotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdl
dCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRyaXgsIG1fc3RhdGUucmVwbGljYUxheWVyLT5t
X29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgLy8gV2UgZG9uJ3QgdXNl
IHR3by1wYXNzIGJsZW5kaW5nIGZvciBwcmVzZXJ2ZXMtM2QsIHRoYXQncyBpbiBzeW5jIHdpdGgg
U2FmYXJpLgorICAgIGlmIChtX3N0YXRlLnByZXNlcnZlczNEKQorICAgICAgICByZXR1cm4gZmFs
c2U7CiAKLSAgICAvLyBEcmF3IHRoZSBvcmlnaW5hbC4KLSAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0
aW9uTWF0cml4KCksIG9wdGlvbnMub3BhY2l0eSwgbWFza1RleHR1cmUuZ2V0KCkpOworICAgIC8v
IFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRlIHN1cmZhY2Ugd2hlbiBibGVuZGluZyBzZXZl
cmFsIGl0ZW1zIHdpdGggYW4gYW5jZXN0b3Igb3BhY2l0eS4KKyAgICAvLyBUZXN0ZWQgYnkgY29t
cG9zaXRpbmcvcmVmbGVjdGlvbnMvcmVmbGVjdGlvbi1vcGFjaXR5Lmh0bWwKKyAgICBpZiAoaGFz
T3BhY2l0eSAmJiAoaGFzQ2hpbGRyZW4gfHwgaGFzUmVwbGljYSkpCisgICAgICAgIHJldHVybiB0
cnVlOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbCht
YXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4
dHVyZVRvUG9vbChyZXBsaWNhTWFza1N1cmZhY2UuZ2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1
c2UgYW4gaW50ZXJtZWRpYXRlIHN1cmZhY2Ugd2l0aCBhIG1hc2tlZCBhbmNlc3Rvci4KKyAgICAv
LyBJbiB0aGUgY2FzZSBvZiByZXBsaWNhcyB0aGUgbWFzayBpcyBhcHBsaWVkIGJlZm9yZSByZXBs
aWNhdGluZy4KKyAgICAvLyBUZXN0ZWQgYnkgY29tcG9zaXRpbmcvbWFza3MvbWFza2VkLWFuY2Vz
dG9yLmh0bWwKKyAgICBpZiAoaGFzTWFzayAmJiBoYXNDaGlsZHJlbiAmJiAhaGFzUmVwbGljYSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFs
c2U7CiB9CiAKLXZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50UmVjdXJzaXZlKFRleHR1cmVN
YXBwZXJQYWludE9wdGlvbnMgb3B0aW9ucykKK2Jvb2wgVGV4dHVyZU1hcHBlck5vZGU6OmlzVmlz
aWJsZSgpIGNvbnN0CiB7Ci0gICAgaWYgKChtX3NpemUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1h
c2tzVG9Cb3VuZHMKLSAgICAgICAgfHwgbV9jaGlsZHJlbi5pc0VtcHR5KCkpKSB8fCAhbV9zdGF0
ZS52aXNpYmxlIHx8IG9wdGlvbnMub3BhY2l0eSA8IDAuMDEgfHwgbV9vcGFjaXR5IDwgMC4wMSkK
LSAgICAgICAgcmV0dXJuOworICAgIGlmIChtX3NpemUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1h
c2tzVG9Cb3VuZHMgfHwgbV9zdGF0ZS5tYXNrTGF5ZXIgfHwgbV9jaGlsZHJlbi5pc0VtcHR5KCkp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnZpc2libGUgfHwgbV9v
cGFjaXR5IDwgMC4wMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwor
fQogCi0gICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKLSAgICBSZWZQdHI8Qml0bWFw
VGV4dHVyZT4gc3VyZmFjZTsKK3ZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZkFuZENo
aWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9u
cykKK3sKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpIHsKKyAgICAgICAgVGV4dHVyZU1h
cHBlclBhaW50T3B0aW9ucyByZXBsaWNhT3B0aW9ucyhvcHRpb25zKTsKKyAgICAgICAgLy8gV2Ug
Y2hvb3NlIGVpdGhlciB0aGUgY29udGVudCdzIG1hc2sgb3IgdGhlIHJlcGxpY2EncyBtYXNrLgor
ICAgICAgICAvLyBGSVhNRTogYmxlbmQgdGhlIHR3byBpZiBib3RoIGV4aXN0LgorICAgICAgICBp
ZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3RhdGUubWFza0xheWVyKQorICAgICAgICAgICAg
cmVwbGljYU9wdGlvbnMubWFzayA9IG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3N0YXRlLm1hc2tM
YXllci0+dGV4dHVyZSgpOwogCi0gICAgYm9vbCBoYXNSZXBsaWNhID0gbV9zdGF0ZS5yZXBsaWNh
TGF5ZXI7Ci0gICAgYm9vbCBoYXNNYXNrID0gbV9zdGF0ZS5tYXNrTGF5ZXI7Ci0gICAgYm9vbCBu
ZWVkc0JsZW5kaW5nID0gbV9vcGFjaXR5IDwgMC45OSB8fCBoYXNNYXNrOwotICAgIGJvb2wgcGFp
bnRzTW9yZVRoYW5PbmVUZXh0dXJlID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpIHx8IGhhc01vcmVU
aGFuT25lVGlsZSgpIHx8IChoYXNNYXNrICYmIG1fc3RhdGUubWFza0xheWVyLT5oYXNNb3JlVGhh
bk9uZVRpbGUoKSk7Ci0gICAgYm9vbCBoYXNPdmVybGFwcyA9IG1fc3RhdGUubWlnaHRIYXZlT3Zl
cmxhcHMgfHwgaGFzUmVwbGljYTsKLSAgICBjb25zdCBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCk7Ci0gICAgYm9vbCBuZWVkc1R3b1Bh
c3MgPSAoKGhhc1JlcGxpY2EgfHwgaGFzTWFzaykgJiYgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJl
KSB8fCAobmVlZHNCbGVuZGluZyAmJiBoYXNPdmVybGFwcyk7Ci0gICAgb3B0aW9ucy5pc1N1cmZh
Y2UgPSBmYWxzZTsKKyAgICAgICAgcmVwbGljYU9wdGlvbnMudHJhbnNmb3JtCisgICAgICAgICAg
ICAgICAgICAubXVsdGlwbHkobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fdHJhbnNmb3JtLmNvbWJp
bmVkKCkpCisgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV90cmFuc2Zvcm0uY29tYmluZWQo
KS5pbnZlcnNlKCkpOworICAgICAgICBwYWludFNlbGZBbmRDaGlsZHJlbihyZXBsaWNhT3B0aW9u
cyk7CisgICAgfQogCi0gICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyBvcHRpb25zRm9yRGVz
Y2VuZGFudHMob3B0aW9ucyk7CisgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW4ob3B0aW9ucyk7Cit9
CiAKLSAgICBpZiAoIW5lZWRzVHdvUGFzcykgewotICAgICAgICBwYWludFNlbGZBbmRDaGlsZHJl
bihvcHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFudHMpOwordm9pZCBUZXh0dXJlTWFwcGVyTm9k
ZTo6cGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyBvcHRpb25zKQorewor
ICAgIGlmICghaXNWaXNpYmxlKCkpCiAgICAgICAgIHJldHVybjsKLSAgICB9CisgICAgb3B0aW9u
cy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKKyAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1Rl
eHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1fc3RhdGUubWFza0xheWVyLT50ZXh0dXJlKCkg
OiAwOwogCi0gICAgRmxvYXRSZWN0IHZpZXdwb3J0UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lk
dGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKTsKKyAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRp
b25zIHBhaW50T3B0aW9ucyhvcHRpb25zKTsKKyAgICBwYWludE9wdGlvbnMubWFzayA9IG1hc2tU
ZXh0dXJlLmdldCgpOworICAgIEludFJlY3Qgc3VyZmFjZVJlY3Q7CiAKLSAgICBSZWZQdHI8Qml0
bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7CisgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHN1cmZh
Y2U7CiAKLSAgICBpZiAobV9zdGF0ZS5tYXNrTGF5ZXIpIHsKLSAgICAgICAgbWFza1N1cmZhY2Ug
PSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50
ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1h
cHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2UuZ2V0KCkpOwotICAgICAgICBUZXh0dXJlTWFw
cGVyUGFpbnRPcHRpb25zIG9wdGlvbnNGb3JNYXNrKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25z
Rm9yTWFzay5pc1N1cmZhY2UgPSB0cnVlOwotICAgICAgICBtX3N0YXRlLm1hc2tMYXllci0+cGFp
bnRTZWxmKG9wdGlvbnNGb3JNYXNrKTsKKyAgICBpZiAoIXNob3VsZFBhaW50VG9JbnRlcm1lZGlh
dGVTdXJmYWNlKCkpIHsKKyAgICAgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShw
YWludE9wdGlvbnMpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3VyZmFjZSA9IG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1
cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAgICBvcHRpb25zRm9yRGVzY2VuZGFudHMuc3Vy
ZmFjZSA9IHN1cmZhY2UuZ2V0KCk7Ci0gICAgb3B0aW9ucy5pc1N1cmZhY2UgPSB0cnVlOwotICAg
IG9wdGlvbnNGb3JEZXNjZW5kYW50cy5vcGFjaXR5ID0gMTsKKyAgICAvLyBQcmVwYXJlIGEgc3Vy
ZmFjZSB0byBwYWludCBpbnRvLgorICAgIC8vIFdlIHBhaW50IGludG8gdGhlIHN1cmZhY2UgaWdu
b3JpbmcgdGhlIG9wYWNpdHkvdHJhbnNmb3JtIG9mIHRoZSBjdXJyZW50IGxheWVyLgorICAgIHN1
cmZhY2VSZWN0ID0gaW50ZXJtZWRpYXRlU3VyZmFjZVJlY3QoKTsKKyAgICBzdXJmYWNlID0gb3B0
aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKHN1cmZhY2VSZWN0LnNp
emUoKSk7CiAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShzdXJmYWNlLmdl
dCgpKTsKKyAgICBwYWludE9wdGlvbnMub3BhY2l0eSA9IDE7CiAKLSAgICBwYWludFNlbGZBbmRD
aGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFudHMpOworICAgIC8vIFdlIGhhdmUg
dG8gdXNlIGNvbWJpbmVkRm9yQ2hpbGRyZW4oKSBhbmQgbm90IGNvbWJpbmVkKCksIG90aGVyd2lz
ZSBsYXllciAzRCBkb2Vzbid0IHdvcmsuCisgICAgcGFpbnRPcHRpb25zLnRyYW5zZm9ybSA9IG1f
dHJhbnNmb3JtLmNvbWJpbmVkRm9yQ2hpbGRyZW4oKS5pbnZlcnNlKCk7CisgICAgcGFpbnRPcHRp
b25zLm9mZnNldCA9IC1JbnRTaXplKHN1cmZhY2VSZWN0LngoKSwgc3VyZmFjZVJlY3QueSgpKTsK
IAotICAgIGlmICghcGFpbnRSZWZsZWN0aW9uKG9wdGlvbnMsIHN1cmZhY2UuZ2V0KCkpKSB7Ci0g
ICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNl
KTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5n
ZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBvcHRpb25zLm9wYWNp
dHksIG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICB9CisgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW5X
aXRoUmVwbGljYShwYWludE9wdGlvbnMpOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5y
ZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdldCgpKTsKLSAgICBvcHRpb25zLnRleHR1cmVN
YXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKG1hc2tTdXJmYWNlLmdldCgpKTsKKyAgICAvLyBJ
ZiB3ZSBwYWludGVkIHRoZSByZXBsaWNhLCB0aGUgbWFzayBpcyBhbHJlYWR5IGFwcGxpZWQgc28g
d2UgZG9uJ3QgbmVlZCB0byBwYWludCBpdCBhZ2Fpbi4KKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNh
TGF5ZXIpCisgICAgICAgIG1hc2tUZXh0dXJlID0gMDsKKworICAgIG9wdGlvbnMudGV4dHVyZU1h
cHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCB0YXJnZXRUcmFuc2Zvcm0gPQorICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgo
b3B0aW9ucy50cmFuc2Zvcm0pCisgICAgICAgICAgICAgICAgLm11bHRpcGx5KG1fdHJhbnNmb3Jt
LmNvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgLnRyYW5zbGF0ZShvcHRpb25zLm9mZnNldC53
aWR0aCgpLCBvcHRpb25zLm9mZnNldC5oZWlnaHQoKSk7CisgICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgc3VyZmFjZVJlY3QsIHRhcmdldFRyYW5z
Zm9ybSwgb3B0aW9ucy5vcGFjaXR5LCBtYXNrVGV4dHVyZS5nZXQoKSk7CiB9CiAKIFRleHR1cmVN
YXBwZXJOb2RlOjp+VGV4dHVyZU1hcHBlck5vZGUoKQpAQCAtNzMzLDYgKzY1MSw3IEBAIHZvaWQg
VGV4dHVyZU1hcHBlck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlU2VsZihHcmFwaGljc0xheWVy
VGV4dHVyZU1hcHBlciogZ3JhCiAgICAgbV9zdGF0ZS5iYWNrZmFjZVZpc2liaWxpdHkgPSBncmFw
aGljc0xheWVyLT5iYWNrZmFjZVZpc2liaWxpdHkoKTsKICAgICBtX3N0YXRlLmNoaWxkcmVuVHJh
bnNmb3JtID0gZ3JhcGhpY3NMYXllci0+Y2hpbGRyZW5UcmFuc2Zvcm0oKTsKICAgICBtX3N0YXRl
Lm9wYWNpdHkgPSBncmFwaGljc0xheWVyLT5vcGFjaXR5KCk7CisKICAgICBtX2N1cnJlbnRDb250
ZW50LmNvbnRlbnRUeXBlID0gcGVuZGluZ0NvbnRlbnQuY29udGVudFR5cGU7CiAgICAgbV9jdXJy
ZW50Q29udGVudC5pbWFnZSA9IHBlbmRpbmdDb250ZW50LmltYWdlOwogICAgIG1fY3VycmVudENv
bnRlbnQubWVkaWEgPSBwZW5kaW5nQ29udGVudC5tZWRpYTsKQEAgLTk4NCw3ICs5MDMsNiBAQCB2
b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpzeW5jQ29tcG9zaXRpbmdTdGF0ZShHcmFwaGljc0xheWVy
VGV4dHVyZU1hcHBlciogZ3JhcGhpYwogICAgIHN5bmNBbmltYXRpb25zKGdyYXBoaWNzTGF5ZXIp
OwogCiAgICAgY29tcHV0ZVRpbGVzKCk7Ci0gICAgY29tcHV0ZU92ZXJsYXBzSWZOZWVkZWQoKTsK
IAogICAgIGlmIChncmFwaGljc0xheWVyKQogICAgICAgICByZW5kZXJDb250ZW50KHRleHR1cmVN
YXBwZXIsIGdyYXBoaWNzTGF5ZXIpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmggYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaAppbmRleCAzOTY1ZWU2
Li4wODVhNTI4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90
ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaApAQCAtNDQsMTUgKzQ0LDE2IEBAIGNs
YXNzIEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVyOwogY2xhc3MgVGV4dHVyZU1hcHBlclBhaW50
T3B0aW9ucyB7CiBwdWJsaWM6CiAgICAgQml0bWFwVGV4dHVyZSogc3VyZmFjZTsKLSAgICBUZXh0
dXJlTWFwcGVyKiB0ZXh0dXJlTWFwcGVyOwotCisgICAgQml0bWFwVGV4dHVyZSogbWFzazsKICAg
ICBmbG9hdCBvcGFjaXR5OwotICAgIGJvb2wgaXNTdXJmYWNlOworICAgIFRyYW5zZm9ybWF0aW9u
TWF0cml4IHRyYW5zZm9ybTsKKyAgICBJbnRTaXplIG9mZnNldDsKKyAgICBUZXh0dXJlTWFwcGVy
KiB0ZXh0dXJlTWFwcGVyOwogICAgIFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMoKQogICAgICAg
ICA6IHN1cmZhY2UoMCkKLSAgICAgICAgLCB0ZXh0dXJlTWFwcGVyKDApCisgICAgICAgICwgbWFz
aygwKQogICAgICAgICAsIG9wYWNpdHkoMSkKLSAgICAgICAgLCBpc1N1cmZhY2UoZmFsc2UpCisg
ICAgICAgICwgdGV4dHVyZU1hcHBlcigwKQogICAgIHsgfQogfTsKIApAQCAtMTc5LDggKzE4MCw5
IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21wdXRlVHJhbnNmb3Jtc1JlY3Vyc2l2ZSgpOwogICAg
IHZvaWQgY29tcHV0ZU92ZXJsYXBzSWZOZWVkZWQoKTsKICAgICB2b2lkIGNvbXB1dGVUaWxlcygp
OworICAgIEludFJlY3QgaW50ZXJtZWRpYXRlU3VyZmFjZVJlY3QoY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmKTsKKyAgICBJbnRSZWN0IGludGVybWVkaWF0ZVN1cmZhY2VSZWN0KCk7CiAgICAg
dm9pZCBzd2FwQ29udGVudHNCdWZmZXJzKCk7Ci0gICAgaW50IGNvdW50RGVzY2VuZGFudHNXaXRo
Q29udGVudCgpIGNvbnN0OwogICAgIEZsb2F0UmVjdCB0YXJnZXRSZWN0Rm9yVGlsZVJlY3QoY29u
c3QgRmxvYXRSZWN0JiB0b3RhbFRhcmdldFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3Qp
IGNvbnN0OwogICAgIHZvaWQgaW52YWxpZGF0ZVZpZXdwb3J0KGNvbnN0IEZsb2F0UmVjdCYpOwog
ICAgIHZvaWQgbm90aWZ5Q2hhbmdlKENoYW5nZU1hc2spOwpAQCAtMTkyLDkgKzE5NCw5IEBAIHBy
aXZhdGU6CiAgICAgQml0bWFwVGV4dHVyZSogdGV4dHVyZSgpIHsgcmV0dXJuIG1fb3duZWRUaWxl
cy5pc0VtcHR5KCkgPyAwIDogbV9vd25lZFRpbGVzWzBdLnRleHR1cmUuZ2V0KCk7IH0KIAogICAg
IHZvaWQgcGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyk7Ci0gICAgYm9v
bCBwYWludFJlZmxlY3Rpb24oY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYsIEJpdG1h
cFRleHR1cmUqIHN1cmZhY2UpOwogICAgIHZvaWQgcGFpbnRTZWxmKGNvbnN0IFRleHR1cmVNYXBw
ZXJQYWludE9wdGlvbnMmKTsKLSAgICB2b2lkIHBhaW50U2VsZkFuZENoaWxkcmVuKGNvbnN0IFRl
eHR1cmVNYXBwZXJQYWludE9wdGlvbnMmLCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRp
b25zRm9yRGVzY2VuZGFudHMpOworICAgIHZvaWQgcGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29uc3Qg
VGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYpOworICAgIHZvaWQgcGFpbnRTZWxmQW5kQ2hpbGRy
ZW5XaXRoUmVwbGljYShjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJik7CiAgICAgdm9p
ZCByZW5kZXJDb250ZW50KFRleHR1cmVNYXBwZXIqLCBHcmFwaGljc0xheWVyKik7CiAKICAgICB2
b2lkIHN5bmNBbmltYXRpb25zKEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVyKik7CkBAIC0yMDQs
NyArMjA2LDggQEAgcHJpdmF0ZToKICAgICB2b2lkIGFwcGx5VHJhbnNmb3JtQW5pbWF0aW9uKGNv
bnN0IFRleHR1cmVNYXBwZXJBbmltYXRpb24mLCBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiBz
dGFydCwgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogZW5kLCBkb3VibGUpOwogICAgIGJvb2wg
aGFzT3BhY2l0eUFuaW1hdGlvbigpIGNvbnN0OwogICAgIGJvb2wgaGFzVHJhbnNmb3JtQW5pbWF0
aW9uKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNNb3JlVGhhbk9uZVRpbGUoKSBjb25zdDsKKyAgICBi
b29sIGlzVmlzaWJsZSgpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkUGFpbnRUb0ludGVybWVkaWF0
ZVN1cmZhY2UoKSBjb25zdDsKIAogICAgIExheWVyVHJhbnNmb3JtIG1fdHJhbnNmb3JtOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>122644</attachid>
            <date>2012-01-16 08:31:23 -0800</date>
            <delta_ts>2012-01-19 13:40:10 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>26530</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4OThlMTBhLi5hNTM2ODJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzgg
QEAKKzIwMTItMDEtMTUgIE5vJ2FtIFJvc2VudGhhbCAgPG5vYW0ucm9zZW50aGFsQG5va2lhLmNv
bT4KKworICAgICAgICBbVGV4bWFwXSBUZXh0dXJlTWFwcGVyIGNyZWF0ZXMgdHdvIG1hbnkgYmln
IGludGVybWVkaWF0ZSBzdXJmYWNlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzYzMzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBUaGUgZm9sbG93aW5nIGhhcyBiZWVuIGRvbmUgdG8gb3B0aW1pemUgc3Vy
ZmFjZSBhbGxvY2F0aW9uOgorICAgICAgICAxLiBJbnN0ZWFkIG9mIHVzaW5nIGEgdmlld3BvcnQt
c2l6ZSBzdXJmYWNlLCB1c2UgYSBzdXJmYWNlIGluIHRoZSBzaXplIG9mIHRoZSBsYXllcidzCisg
ICAgICAgICAgIGJvdW5kaW5nIHJlY3QgYW5kIGFwcGx5IHRoZSB0cmFuc2Zvcm0gYWZ0ZXIgdGhl
IGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQgaW50byBpdC4KKyAgICAgICAgMi4gQXZvaWQgZ2Vu
ZXJhdGluZyBpbnRlcm1lZGlhdGUgc3VyZmFjZSBmb3Igb2NjYXNpb25zIHdoZXJlIHRoZXkncmUg
bm90IG5lY2Vzc2FyeSwKKyAgICAgICAgICAgc3VjaCBhcyBuZXN0ZWQgcmVmbGVjdGlvbnMgd2l0
aG91dCBvcGFjaXR5LgorICAgICAgICAzLiBSZWxlYXNpbmcgb2YgdGV4dHVyZXMgZnJvbSB0aGUg
cG9vbCBpcyBub3cgaW1wbGljaXQsIGJhc2VkIG9uIHJlZkNvdW50LgorICAgICAgICA0LiBEbyBu
b3QgdXNlIGludGVybWVkaWF0ZSBzdXJmYWNlcyBmb3IgcHJlc2VydmUtM2QgbGF5ZXJzLiBUaGlz
IGlzIGluIGFsaWdubWVudCB3aXRoCisgICAgICAgICAgIG90aGVyIHBvcnRzLgorCisgICAgICAg
IFRlc3RzIGluIExheW91dFRlc3RzL2NvbXBvc2l0aW5nL21hc2tzIGFuZCBMYXlvdXRUZXN0cy9j
b21wb3NpdGluZy9yZWZsZWN0aW9uIGNvdmVyIHRoaXMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlTWFwcGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlTWFwcGVyTm9kZTo6Y29tcHV0ZVRyYW5zZm9ybXNSZWN1cnNpdmUpOgorICAgICAgICAoV2Vi
Q29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZik6CisgICAgICAgIChXZWJDb3JlOjpU
ZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dHVyZU1hcHBlck5vZGU6OmJvdW5kaW5nUmVjdEZvckludGVybWVkaWF0ZVN1cmZhY2Up
OgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnNob3VsZFBhaW50VG9JbnRl
cm1lZGlhdGVTdXJmYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpp
c1Zpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2Vs
ZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBl
ck5vZGU6OnBhaW50UmVjdXJzaXZlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJO
b2RlOjpzeW5jQ29tcG9zaXRpbmdTdGF0ZVNlbGYpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVy
ZU1hcHBlck5vZGU6OnN5bmNDb21wb3NpdGluZ1N0YXRlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHR1cmVNYXBwZXJQYWludE9wdGlvbnM6OlRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMpOgorCiAy
MDEyLTAxLTEzICBPamFuIFZhZmFpICA8b2phbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW1w
bGVtZW50IGZsZXgtYWxpZ24KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmNwcAppbmRleCAyNjIyZDIxLi5kZDMzZjBk
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4
dHVyZU1hcHBlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4
bWFwL1RleHR1cmVNYXBwZXIuY3BwCkBAIC0yNiwxOCArMjYsMjAgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogCiBQYXNzUmVmUHRyPEJpdG1hcFRleHR1cmU+IFRleHR1cmVNYXBwZXI6OmFjcXVpcmVU
ZXh0dXJlRnJvbVBvb2woY29uc3QgSW50U2l6ZSYgc2l6ZSkKIHsKLSAgICBpZiAobV90ZXh0dXJl
UG9vbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVk
VGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoKTsKLSAgICAgICAgc2VsZWN0ZWRUZXh0dXJlLT5yZXNl
dChzaXplLCBmYWxzZSk7Ci0gICAgICAgIHNlbGVjdGVkVGV4dHVyZS0+bG9jaygpOwotICAgICAg
ICByZXR1cm4gc2VsZWN0ZWRUZXh0dXJlOwotICAgIH0KKyAgICBSZWZQdHI8Qml0bWFwVGV4dHVy
ZT4gc2VsZWN0ZWRUZXh0dXJlOwogCi0gICAgc2l6ZV90IGluZGV4ID0gMDsKLSAgICBSZWZQdHI8
Qml0bWFwVGV4dHVyZT4gc2VsZWN0ZWRUZXh0dXJlID0gbV90ZXh0dXJlUG9vbFswXTsKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdGV4dHVyZVBvb2wuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+JiB0ZXh0dXJlID0gbV90ZXh0dXJlUG9vbFtpXTsKIAot
ICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbV90ZXh0dXJlUG9vbC5zaXplKCk7ICsraSkgewot
ICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gdGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbaV07
CisgICAgICAgIC8vIElmIHRoZSBzdXJmYWNlIGhhcyBvbmx5IG9uZSByZWZlcmVuY2UgKHRoZSBv
bmUgaW4gbV90ZXh0dXJlUG9vbCksIHdlIGNhbiBzYWZlbHkgcmV1c2UgaXQuCisgICAgICAgIGlm
ICh0ZXh0dXJlLT5yZWZDb3VudCgpID4gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIC8vIFdlIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSB0ZXh0dXJlLgorICAgICAg
ICBpZiAoIXNlbGVjdGVkVGV4dHVyZSkgeworICAgICAgICAgICAgc2VsZWN0ZWRUZXh0dXJlID0g
dGV4dHVyZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKICAgICAgICAgSW50
U2l6ZSB0ZXh0dXJlU2l6ZSA9IHRleHR1cmUtPnNpemUoKTsKICAgICAgICAgSW50U2l6ZSBzZWxl
Y3RlZFRleHR1cmVTaXplID0gc2VsZWN0ZWRUZXh0dXJlLT5zaXplKCk7CkBAIC01OCwyMiArNjAs
MTYgQEAgUGFzc1JlZlB0cjxCaXRtYXBUZXh0dXJlPiBUZXh0dXJlTWFwcGVyOjphY3F1aXJlVGV4
dHVyZUZyb21Qb29sKGNvbnN0IEludFNpemUmIHMKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAg
ICAgICAgIHNlbGVjdGVkVGV4dHVyZSA9IHRleHR1cmU7Ci0gICAgICAgIGluZGV4ID0gaTsKICAg
ICB9CiAKLSAgICBtX3RleHR1cmVQb29sLnJlbW92ZShpbmRleCk7CisgICAgaWYgKCFzZWxlY3Rl
ZFRleHR1cmUpIHsKKyAgICAgICAgc2VsZWN0ZWRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZSgpOwor
ICAgICAgICBtX3RleHR1cmVQb29sLmFwcGVuZChzZWxlY3RlZFRleHR1cmUpOworICAgIH0KKwog
ICAgIHNlbGVjdGVkVGV4dHVyZS0+cmVzZXQoc2l6ZSwgZmFsc2UpOwotICAgIHNlbGVjdGVkVGV4
dHVyZS0+bG9jaygpOwogICAgIHJldHVybiBzZWxlY3RlZFRleHR1cmU7CiB9CiAKLXZvaWQgVGV4
dHVyZU1hcHBlcjo6cmVsZWFzZVRleHR1cmVUb1Bvb2woQml0bWFwVGV4dHVyZSogdGV4dHVyZSkK
LXsKLSAgICBpZiAoIXRleHR1cmUpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3RleHR1cmVQb29s
LmFwcGVuZCh0ZXh0dXJlKTsKLSAgICB0ZXh0dXJlLT51bmxvY2soKTsKLX0KLQogfQogI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4
dHVyZU1hcHBlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1Rl
eHR1cmVNYXBwZXIuaAppbmRleCBkODEzMzNkLi5jMWRjYmJkIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmgKQEAg
LTEyNiw3ICsxMjYsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGJlZ2luUGFpbnRpbmco
KSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgZW5kUGFpbnRpbmcoKSB7IH0KIAotICAgIHZpcnR1YWwg
dm9pZCByZWxlYXNlVGV4dHVyZVRvUG9vbChCaXRtYXBUZXh0dXJlKiBzdXJmYWNlKTsKKyAgICAv
LyBBIHN1cmZhY2UgaXMgcmVsZWFzZWQgaW1wbGljaXRseSB3aGVuIGRlcmVmZXJlbmNlZC4KICAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8Qml0bWFwVGV4dHVyZT4gYWNxdWlyZVRleHR1cmVGcm9tUG9v
bChjb25zdCBJbnRTaXplJik7CiAKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAKaW5kZXggM2Jm
ZGZkZS4uYWI1NTk5YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwCkBAIC01MCwyMiArNTAs
NiBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIG1hdHJpeCkKICAgICBtX3RyYW5zZm9ybS5zZXRMb2NhbFRyYW5zZm9ybSht
YXRyaXgpOwogfQogCi1pbnQgVGV4dHVyZU1hcHBlck5vZGU6OmNvdW50RGVzY2VuZGFudHNXaXRo
Q29udGVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3N0YXRlLnZpc2libGUgfHwgKCFtX3NpemUu
d2lkdGgoKSAmJiAhbV9zaXplLmhlaWdodCgpICYmIG1fc3RhdGUubWFza3NUb0JvdW5kcykpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIGludCBjb3VudCA9IChtX3NpemUud2lkdGgoKSAmJiBtX3Np
emUuaGVpZ2h0KCkgJiYgKG1fc3RhdGUuZHJhd3NDb250ZW50IHx8IG1fY3VycmVudENvbnRlbnQu
Y29udGVudFR5cGUgIT0gSFRNTENvbnRlbnRUeXBlKSkgPyAxIDogMDsKLSAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyArK2kpCi0gICAgICAgIGNvdW50ICs9IG1f
Y2hpbGRyZW5baV0tPmNvdW50RGVzY2VuZGFudHNXaXRoQ29udGVudCgpOwotCi0gICAgcmV0dXJu
IGNvdW50OwotfQotCi12b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpjb21wdXRlT3ZlcmxhcHNJZk5l
ZWRlZCgpCi17Ci0gICAgbV9zdGF0ZS5taWdodEhhdmVPdmVybGFwcyA9IGNvdW50RGVzY2VuZGFu
dHNXaXRoQ29udGVudCgpID4gMTsKLX0KLQogdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcHV0
ZVRyYW5zZm9ybXNSZWN1cnNpdmUoKQogewogICAgIGlmIChtX3NpemUuaXNFbXB0eSgpICYmIG1f
c3RhdGUubWFza3NUb0JvdW5kcykKQEAgLTIwNCwzNSArMTg4LDYgQEAgYm9vbCBUZXh0dXJlTWFw
cGVyTm9kZTo6Y29sbGVjdFZpc2libGVDb250ZW50c1JlY3RzKE5vZGVSZWN0TWFwJiByZWN0TWFw
LCBjb25zdAogfQogI2VuZGlmCiAKLWJvb2wgVGV4dHVyZU1hcHBlck5vZGU6Omhhc01vcmVUaGFu
T25lVGlsZSgpIGNvbnN0Ci17Ci0gICAgaW50IHRpbGVzID0gMDsKLQotI2lmIFVTRShUSUxFRF9C
QUNLSU5HX1NUT1JFKQotICAgIGlmIChtX3N0YXRlLnRpbGVPd25lcnNoaXAgPT0gRXh0ZXJuYWxs
eU1hbmFnZWRUaWxlcykgewotICAgICAgICBIYXNoTWFwPGludCwgRXh0ZXJuYWxseU1hbmFnZWRU
aWxlPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9leHRlcm5hbGx5TWFuYWdlZFRpbGVzLmVuZCgp
OwotICAgICAgICBmb3IgKEhhc2hNYXA8aW50LCBFeHRlcm5hbGx5TWFuYWdlZFRpbGU+Ojpjb25z
dF9pdGVyYXRvciBpdCA9IG1fZXh0ZXJuYWxseU1hbmFnZWRUaWxlcy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZyb250QnVmZmVyLnRleHR1
cmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKyt0aWxlcyA+IDEpCi0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X293bmVkVGlsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKG1fb3duZWRUaWxlc1tpXS50
ZXh0dXJlKSB7Ci0gICAgICAgICAgICBpZiAoKyt0aWxlcyA+IDEpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LQogdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6cmVuZGVyQ29udGVudChUZXh0dXJlTWFwcGVyKiB0
ZXh0dXJlTWFwcGVyLCBHcmFwaGljc0xheWVyKiBsYXllcikKIHsKICNpZiBVU0UoVElMRURfQkFD
S0lOR19TVE9SRSkKQEAgLTMxOSwxNyArMjc0LDE2IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6
OnBhaW50U2VsZihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogICAg
IGlmIChtX3NpemUuaXNFbXB0eSgpIHx8ICghbV9zdGF0ZS5kcmF3c0NvbnRlbnQgJiYgbV9jdXJy
ZW50Q29udGVudC5jb250ZW50VHlwZSA9PSBIVE1MQ29udGVudFR5cGUpKQogICAgICAgICByZXR1
cm47CiAKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1RleHR1cmU7Ci0gICAgUmVmUHRy
PEJpdG1hcFRleHR1cmU+IHJlcGxpY2FNYXNrVGV4dHVyZTsKLQotICAgIGlmIChtX3N0YXRlLm1h
c2tMYXllcikKLSAgICAgICAgbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllci0+dGV4dHVy
ZSgpOwotICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllciAmJiBtX3N0YXRlLnJlcGxpY2FMYXll
ci0+bV9zdGF0ZS5tYXNrTGF5ZXIpCi0gICAgICAgIHJlcGxpY2FNYXNrVGV4dHVyZSA9IG1fc3Rh
dGUucmVwbGljYUxheWVyLT5tX3N0YXRlLm1hc2tMYXllci0+dGV4dHVyZSgpOwotCi0gICAgZmxv
YXQgb3BhY2l0eSA9IG9wdGlvbnMuaXNTdXJmYWNlID8gMSA6IG9wdGlvbnMub3BhY2l0eTsKKyAg
ICBmbG9hdCBvcGFjaXR5ID0gb3B0aW9ucy5vcGFjaXR5OworICAgIEJpdG1hcFRleHR1cmUqIG1h
c2sgPSBvcHRpb25zLm1hc2s7CiAgICAgRmxvYXRSZWN0IHRhcmdldFJlY3QgPSB0aGlzLT50YXJn
ZXRSZWN0KCk7CiAKKyAgICAvLyBXZSBhcHBseSB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybSB0byBj
b21wZW5zYXRlIGZvciBwYWludGluZyBpbnRvIGEgc3VyZmFjZSwgYW5kIHRoZW4gYXBwbHkgdGhl
IG9mZnNldCBzbyB0aGF0IHRoZSBwYWludGluZyBmaXRzIGluIHRoZSB0YXJnZXQgcmVjdC4KKyAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm0gPQorICAgICAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXgob3B0aW9ucy50cmFuc2Zvcm0pCisgICAgICAgICAgICAubXVsdGlwbHkobV90
cmFuc2Zvcm0uY29tYmluZWQoKSkKKyAgICAgICAgICAgIC50cmFuc2xhdGUob3B0aW9ucy5vZmZz
ZXQud2lkdGgoKSwgb3B0aW9ucy5vZmZzZXQuaGVpZ2h0KCkpOworCiAjaWYgVVNFKFRJTEVEX0JB
Q0tJTkdfU1RPUkUpCiAgICAgVmVjdG9yPEV4dGVybmFsbHlNYW5hZ2VkVGlsZT4gdGlsZXNUb1Bh
aW50OwogCkBAIC0zNTEsMjAgKzMwNSwxMSBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWlu
dFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICAgICAg
ICAgICAgICB0aWxlcy5wcmVwZW5kKCZpdC0+c2Vjb25kKTsKICAgICAgICAgfQogCi0gICAgICAg
IFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXg7CiAgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgdGlsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEV4dGVybmFsbHlNYW5h
Z2VkVGlsZSYgdGlsZSA9ICp0aWxlc1tpXTsKICAgICAgICAgICAgIEZsb2F0UmVjdCByZWN0ID0g
dGlsZS5mcm9udEJ1ZmZlci50YXJnZXRSZWN0OwotCi0gICAgICAgICAgICBmbG9hdCByZXBsaWNh
T3BhY2l0eSA9IDEuMDsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FMYXllcikgewot
ICAgICAgICAgICAgICAgIHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90
cmFuc2Zvcm0uY29tYmluZWQoKS5zY2FsZSgxLjAgLyB0aWxlLnNjYWxlKTsKLSAgICAgICAgICAg
ICAgICByZXBsaWNhT3BhY2l0eSA9IG9wYWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9v
cGFjaXR5OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQml0bWFwVGV4dHVyZSYgdGV4dHVy
ZSA9ICp0aWxlLmZyb250QnVmZmVyLnRleHR1cmU7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5y
ZXBsaWNhTGF5ZXIpCi0gICAgICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3
VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCByZXBsaWNhTWF0cml4LCByZXBsaWNhT3BhY2l0eSwgcmVw
bGljYU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUu
Z2V0KCkpOwotICAgICAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0
ZXh0dXJlLCByZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlz
U3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7CisgICAgICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKHRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0
eSwgbWFzayk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM3MywyNSAr
MzE4LDEyIEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50U2VsZihjb25zdCBUZXh0dXJl
TWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogICAgIC8vIE5vdyB3ZSBwYWludCBvd25lZCB0
aWxlcywgaWYgd2UncmUgaW4gT3duZWRUaWxlTW9kZS4KICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG1fb3duZWRUaWxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBCaXRtYXBUZXh0dXJlKiB0
ZXh0dXJlID0gbV9vd25lZFRpbGVzW2ldLnRleHR1cmUuZ2V0KCk7Ci0gICAgICAgIGlmIChtX3N0
YXRlLnJlcGxpY2FMYXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpIHsKLSAgICAgICAgICAgIG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnRleHR1cmUsIHRhcmdldFJlY3RGb3JU
aWxlUmVjdCh0YXJnZXRSZWN0LCBtX293bmVkVGlsZXNbaV0ucmVjdCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5l
ZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ICogbV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fb3BhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGlj
YU1hc2tUZXh0dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0
KCkpOwotICAgICAgICB9Ci0KICAgICAgICAgY29uc3QgRmxvYXRSZWN0IHJlY3QgPSB0YXJnZXRS
ZWN0Rm9yVGlsZVJlY3QodGFyZ2V0UmVjdCwgbV9vd25lZFRpbGVzW2ldLnJlY3QpOwotICAgICAg
ICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCp0ZXh0dXJlLCByZWN0LCBtX3Ry
YW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNr
VGV4dHVyZS5nZXQoKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1
cmUoKnRleHR1cmUsIHJlY3QsIHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiAgICAgfQogCi0g
ICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAm
JiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKSB7Ci0gICAgICAgIGlmIChtX3N0YXRlLnJlcGxpY2FM
YXllciAmJiAhb3B0aW9ucy5pc1N1cmZhY2UpCi0gICAgICAgICAgICBtX2N1cnJlbnRDb250ZW50
Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdl
dFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9w
YWNpdHkgKiBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGljYU1hc2tUZXh0
dXJlID8gcmVwbGljYU1hc2tUZXh0dXJlLmdldCgpIDogbWFza1RleHR1cmUuZ2V0KCkpOwotICAg
ICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhLT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25z
LnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3QsIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIG9wYWNp
dHksIG9wdGlvbnMuaXNTdXJmYWNlID8gMCA6IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICB9Cisg
ICAgaWYgKG1fY3VycmVudENvbnRlbnQuY29udGVudFR5cGUgPT0gTWVkaWFDb250ZW50VHlwZSAm
JiBtX2N1cnJlbnRDb250ZW50Lm1lZGlhKQorICAgICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlh
LT5wYWludFRvVGV4dHVyZU1hcHBlcihvcHRpb25zLnRleHR1cmVNYXBwZXIsIHRhcmdldFJlY3Qs
IHRyYW5zZm9ybSwgb3BhY2l0eSwgbWFzayk7CiB9CiAKIGludCBUZXh0dXJlTWFwcGVyTm9kZTo6
Y29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIp
CkBAIC00MDYsMTUwICszMzgsMTM2IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnNvcnRCeVpP
cmRlcihWZWN0b3I8VGV4dHVyZU1hcHBlck5vZGUqID4mIGFycmF5LCBpbnQgZmlyCiAgICAgcXNv
cnQoYXJyYXkuZGF0YSgpLCBhcnJheS5zaXplKCksIHNpemVvZihUZXh0dXJlTWFwcGVyTm9kZSop
LCBjb21wYXJlR3JhcGhpY3NMYXllcnNaVmFsdWUpOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXJO
b2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25z
JiBvcHRpb25zLCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zRm9yRGVzY2VuZGFu
dHMpCit2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBU
ZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zKQogewogICAgIGJvb2wgaGFzQ2xpcCA9
IG1fc3RhdGUubWFza3NUb0JvdW5kcyAmJiAhbV9jaGlsZHJlbi5pc0VtcHR5KCk7CiAgICAgaWYg
KGhhc0NsaXApCi0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKG1fdHJh
bnNmb3JtLmNvbWJpbmVkKCksIEZsb2F0UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXpl
LmhlaWdodCgpKSk7CisgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKFRy
YW5zZm9ybWF0aW9uTWF0cml4KG9wdGlvbnMudHJhbnNmb3JtKS5tdWx0aXBseShtX3RyYW5zZm9y
bS5jb21iaW5lZCgpKSwgRmxvYXRSZWN0KDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVp
Z2h0KCkpKTsKIAogICAgIHBhaW50U2VsZihvcHRpb25zKTsKIAogICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAgICAgbV9jaGlsZHJlbltpXS0+cGFp
bnRSZWN1cnNpdmUob3B0aW9uc0ZvckRlc2NlbmRhbnRzKTsKKyAgICAgICAgbV9jaGlsZHJlbltp
XS0+cGFpbnRSZWN1cnNpdmUob3B0aW9ucyk7CiAKICAgICBpZiAoaGFzQ2xpcCkKICAgICAgICAg
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5lbmRDbGlwKCk7CiB9CiAKLWJvb2wgVGV4dHVyZU1hcHBl
ck5vZGU6OnBhaW50UmVmbGVjdGlvbihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBv
cHRpb25zLCBCaXRtYXBUZXh0dXJlKiBjb250ZW50U3VyZmFjZSkKK0ludFJlY3QgVGV4dHVyZU1h
cHBlck5vZGU6OmludGVybWVkaWF0ZVN1cmZhY2VSZWN0KCkKIHsKLSAgICBpZiAoIW1fc3RhdGUu
cmVwbGljYUxheWVyKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gRklYTUU6IEFkZCBh
biBpbnZlcnNlIHRyYW5zZm9ybSB0byBMYXllclRyYW5zZm9ybS4KKyAgICByZXR1cm4gaW50ZXJt
ZWRpYXRlU3VyZmFjZVJlY3QobV90cmFuc2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworfQog
Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHN1cmZhY2UoY29udGVudFN1cmZhY2UpOwotICAg
IFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBtYXNrU3VyZmFjZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4
dHVyZT4gcmVwbGljYU1hc2tTdXJmYWNlOwotICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiByZXBs
aWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAoVGV4dHVyZU1hcHBlck5vZGUqIHJlcGxpY2FNYXNr
ID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBs
aWNhTWFza1RleHR1cmUgPSByZXBsaWNhTWFzay0+dGV4dHVyZSgpOwotCi0gICAgUmVmUHRyPEJp
dG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAgIGlmIChUZXh0dXJlTWFwcGVyTm9kZSogbWFz
ayA9IG1fc3RhdGUubWFza0xheWVyKQotICAgICAgICBtYXNrVGV4dHVyZSA9IG1hc2stPnRleHR1
cmUoKTsKLQotICAgIGNvbnN0IEludFNpemUgdmlld3BvcnRTaXplID0gb3B0aW9ucy50ZXh0dXJl
TWFwcGVyLT52aWV3cG9ydFNpemUoKTsKLSAgICBjb25zdCBib29sIHVzZUludGVybWVkaWF0ZUJ1
ZmZlckZvclJlcGxpY2EgPSBtX3N0YXRlLnJlcGxpY2FMYXllciAmJiBvcHRpb25zLm9wYWNpdHkg
PCAwLjk5OwotICAgIGNvbnN0IGJvb2wgdXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yTWFzayA9IG1h
c2tUZXh0dXJlICYmIHJlcGxpY2FNYXNrVGV4dHVyZTsKLSAgICBjb25zdCBGbG9hdFJlY3Qgdmll
d3BvcnRSZWN0KDAsIDAsIHZpZXdwb3J0U2l6ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0
KCkpOwotICAgIC8vIFJldmVyc2UgdGhpcyBsYXllcidzIHRyYW5zZm9ybSBvbiB0aGUgcmVwbGlj
YSdzIHRyYW5zZm9ybSBhbmQgdXNlIGl0IHdpdGggdGhlIGNvbnRlbnRzCi0gICAgLy8gaW50ZXJt
ZWRpYXRlIHN1cmZhY2UsIGFwcGxpZWQgaW4gdGhlIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3lzdGVt
LgotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHJlcGxpY2FNYXRyaXggPSBtX3N0YXRlLnJlcGxp
Y2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQoKTsKLSAgICByZXBsaWNhTWF0cml4Lm11bHRp
cGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkuaW52ZXJzZSgpKTsKLQotICAgIC8vIFRoZSBtYXNr
IGhhcyB0byBiZSBhZGp1c3RlZCB0byB0YXJnZXQgY29vcmRpbmF0ZXMuCi0gICAgaWYgKG1hc2tU
ZXh0dXJlKSB7Ci0gICAgICAgIG1hc2tTdXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5h
Y3F1aXJlVGV4dHVyZUZyb21Qb29sKG9wdGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXpl
KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKG1hc2tTdXJm
YWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgq
bWFza1RleHR1cmUuZ2V0KCksIGVudGlyZVJlY3QoKSwgbV90cmFuc2Zvcm0uY29tYmluZWQoKSwg
MSwgMCk7Ci0gICAgICAgIG1hc2tUZXh0dXJlID0gbWFza1N1cmZhY2U7Ci0gICAgfQotCi0gICAg
Ly8gVGhlIHJlcGxpY2EncyBtYXNrIGhhcyB0byBiZSBhZGp1c3RlZCB0byB0YXJnZXQgY29vcmRp
bmF0ZXMuCi0gICAgaWYgKHJlcGxpY2FNYXNrVGV4dHVyZSkgewotICAgICAgICByZXBsaWNhTWFz
a1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wo
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UocmVwbGljYU1hc2tTdXJmYWNlLmdldCgpKTsKLSAg
ICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqcmVwbGljYU1hc2tUZXh0
dXJlLmdldCgpLCBlbnRpcmVSZWN0KCksIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIDEsIDApOwot
ICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSByZXBsaWNhTWFza1N1cmZhY2U7Ci0gICAgfQot
Ci0gICAgLy8gV2UgbWlnaHQgbmVlZCB0byBhcHBseSB0aGUgbWFzayBvZiB0aGUgY29udGVudCBs
YXllciBiZWZvcmUgd2UgZHJhdyB0aGUgcmVmbGVjdGlvbiwgYXMgdGhlcmUgbWlnaHQgYmUgeWV0
IGFub3RoZXIgbWFzayBmb3IgdGhlIHJlZmxlY3Rpb24gaXRzZWxmLgotICAgIGlmICh1c2VJbnRl
cm1lZGlhdGVCdWZmZXJGb3JNYXNrKSB7Ci0gICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBt
YXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9v
bChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAg
IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdw
b3J0UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwgMSwgbWFza1RleHR1cmUuZ2V0KCkpOwot
ICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZh
Y2UuZ2V0KCkpOwotICAgICAgICBzdXJmYWNlID0gbWFza1N1cmZhY2U7Ci0gICAgICAgIG1hc2tU
ZXh0dXJlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gV2UgYmxlbmQgdGhlIGxheWVyIGFuZCBp
dHMgcmVwbGljYSBpbiBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyIGJlZm9yZSBibGVuZGluZyBpbnRv
IHRoZSB0YXJnZXQgc3VyZmFjZS4KLSAgICBpZiAodXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yUmVw
bGljYSkgewotICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGljYVN1cmZhY2UgPSBv
cHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBl
ci0+YmluZFN1cmZhY2UocmVwbGljYVN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJl
cGxpY2FNYXRyaXgsIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNr
VGV4dHVyZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1
cmUoKnN1cmZhY2UuZ2V0KCksIHZpZXdwb3J0UmVjdCwgVHJhbnNmb3JtYXRpb25NYXRyaXgoKSwg
MSwgbWFza1RleHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJl
bGVhc2VUZXh0dXJlVG9Qb29sKHN1cmZhY2UuZ2V0KCkpOwotICAgICAgICBzdXJmYWNlID0gcmVw
bGljYVN1cmZhY2U7CitJbnRSZWN0IFRleHR1cmVNYXBwZXJOb2RlOjppbnRlcm1lZGlhdGVTdXJm
YWNlUmVjdChjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4KQoreworICAgIEludFJl
Y3QgcmVjdDsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBsb2NhbFRyYW5zZm9ybSA9IFRyYW5z
Zm9ybWF0aW9uTWF0cml4KG1hdHJpeCkubXVsdGlwbHkobV90cmFuc2Zvcm0uY29tYmluZWQoKSk7
CisgICAgcmVjdCA9IGVuY2xvc2luZ0ludFJlY3QobG9jYWxUcmFuc2Zvcm0ubWFwUmVjdChlbnRp
cmVSZWN0KCkpKTsKKyAgICBpZiAoIW1fc3RhdGUubWFza3NUb0JvdW5kcyAmJiAhbV9zdGF0ZS5t
YXNrTGF5ZXIpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUo
KTsgKytpKQorICAgICAgICAgICAgcmVjdC51bml0ZShtX2NoaWxkcmVuW2ldLT5pbnRlcm1lZGlh
dGVTdXJmYWNlUmVjdChtYXRyaXgpKTsKICAgICB9CiAKLSAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPmJpbmRTdXJmYWNlKG9wdGlvbnMuc3VyZmFjZSk7CisgICAgaWYgKG1fc3RhdGUucmVwbGlj
YUxheWVyKQorICAgICAgICByZWN0LnVuaXRlKG1fc3RhdGUucmVwbGljYUxheWVyLT5pbnRlcm1l
ZGlhdGVTdXJmYWNlUmVjdChtYXRyaXgpKTsKKworICAgIHJldHVybiByZWN0OworfQorCitib29s
IFRleHR1cmVNYXBwZXJOb2RlOjpzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSgpIGNv
bnN0Cit7CisgICAgYm9vbCBoYXNPcGFjaXR5ID0gbV9vcGFjaXR5IDwgMC45OTsKKyAgICBib29s
IGhhc0NoaWxkcmVuID0gIW1fY2hpbGRyZW4uaXNFbXB0eSgpOworICAgIGJvb2wgaGFzUmVwbGlj
YSA9ICEhbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7CisgICAgYm9vbCBoYXNNYXNrID0gISFtX3N0YXRl
Lm1hc2tMYXllcjsKIAotICAgIC8vIERyYXcgdGhlIHJlZmxlY3Rpb24uCi0gICAgaWYgKCF1c2VJ
bnRlcm1lZGlhdGVCdWZmZXJGb3JSZXBsaWNhKQotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBw
ZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIHJlcGxpY2FNYXRy
aXgsIG1fc3RhdGUucmVwbGljYUxheWVyLT5tX29wYWNpdHksIHJlcGxpY2FNYXNrVGV4dHVyZS5n
ZXQoKSk7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHR3by1wYXNzIGJsZW5kaW5nIGZvciBwcmVzZXJ2
ZXMtM2QsIHRoYXQncyBpbiBzeW5jIHdpdGggU2FmYXJpLgorICAgIGlmIChtX3N0YXRlLnByZXNl
cnZlczNEKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBEcmF3IHRoZSBvcmlnaW5h
bC4KLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgp
LCB2aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIG9wdGlvbnMub3BhY2l0eSwg
bWFza1RleHR1cmUuZ2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRl
IHN1cmZhY2Ugd2hlbiBibGVuZGluZyBzZXZlcmFsIGl0ZW1zIHdpdGggYW4gYW5jZXN0b3Igb3Bh
Y2l0eS4KKyAgICAvLyBUZXN0ZWQgYnkgY29tcG9zaXRpbmcvcmVmbGVjdGlvbnMvcmVmbGVjdGlv
bi1vcGFjaXR5Lmh0bWwKKyAgICBpZiAoaGFzT3BhY2l0eSAmJiAoaGFzQ2hpbGRyZW4gfHwgaGFz
UmVwbGljYSkpCisgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChyZXBsaWNhTWFza1N1cmZhY2Uu
Z2V0KCkpOworICAgIC8vIFdlIHNob3VsZCB1c2UgYW4gaW50ZXJtZWRpYXRlIHN1cmZhY2Ugd2l0
aCBhIG1hc2tlZCBhbmNlc3Rvci4KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiByZXBsaWNhcyB0aGUg
bWFzayBpcyBhcHBsaWVkIGJlZm9yZSByZXBsaWNhdGluZy4KKyAgICAvLyBUZXN0ZWQgYnkgY29t
cG9zaXRpbmcvbWFza3MvbWFza2VkLWFuY2VzdG9yLmh0bWwKKyAgICBpZiAoaGFzTWFzayAmJiBo
YXNDaGlsZHJlbiAmJiAhaGFzUmVwbGljYSkKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVGV4dHVyZU1hcHBlck5v
ZGU6OnBhaW50UmVjdXJzaXZlKFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgb3B0aW9ucykKK2Jv
b2wgVGV4dHVyZU1hcHBlck5vZGU6OmlzVmlzaWJsZSgpIGNvbnN0CiB7Ci0gICAgaWYgKChtX3Np
emUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMKLSAgICAgICAgfHwgbV9jaGls
ZHJlbi5pc0VtcHR5KCkpKSB8fCAhbV9zdGF0ZS52aXNpYmxlIHx8IG9wdGlvbnMub3BhY2l0eSA8
IDAuMDEgfHwgbV9vcGFjaXR5IDwgMC4wMSkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChtX3Np
emUuaXNFbXB0eSgpICYmIChtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgfHwgbV9zdGF0ZS5tYXNrTGF5
ZXIgfHwgbV9jaGlsZHJlbi5pc0VtcHR5KCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKCFtX3N0YXRlLnZpc2libGUgfHwgbV9vcGFjaXR5IDwgMC4wMSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQogCi0gICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1f
b3BhY2l0eTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gc3VyZmFjZTsKK3ZvaWQgVGV4dHVy
ZU1hcHBlck5vZGU6OnBhaW50U2VsZkFuZENoaWxkcmVuV2l0aFJlcGxpY2EoY29uc3QgVGV4dHVy
ZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKK3sKKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNh
TGF5ZXIpIHsKKyAgICAgICAgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyByZXBsaWNhT3B0aW9u
cyhvcHRpb25zKTsKKyAgICAgICAgLy8gV2UgY2hvb3NlIGVpdGhlciB0aGUgY29udGVudCdzIG1h
c2sgb3IgdGhlIHJlcGxpY2EncyBtYXNrLgorICAgICAgICAvLyBGSVhNRTogYmxlbmQgdGhlIHR3
byBpZiBib3RoIGV4aXN0LgorICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fc3Rh
dGUubWFza0xheWVyKQorICAgICAgICAgICAgcmVwbGljYU9wdGlvbnMubWFzayA9IG1fc3RhdGUu
cmVwbGljYUxheWVyLT5tX3N0YXRlLm1hc2tMYXllci0+dGV4dHVyZSgpOwogCi0gICAgYm9vbCBo
YXNSZXBsaWNhID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXI7Ci0gICAgYm9vbCBoYXNNYXNrID0gbV9z
dGF0ZS5tYXNrTGF5ZXI7Ci0gICAgYm9vbCBuZWVkc0JsZW5kaW5nID0gbV9vcGFjaXR5IDwgMC45
OSB8fCBoYXNNYXNrOwotICAgIGJvb2wgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlID0gIW1fY2hp
bGRyZW4uaXNFbXB0eSgpIHx8IGhhc01vcmVUaGFuT25lVGlsZSgpIHx8IChoYXNNYXNrICYmIG1f
c3RhdGUubWFza0xheWVyLT5oYXNNb3JlVGhhbk9uZVRpbGUoKSk7Ci0gICAgYm9vbCBoYXNPdmVy
bGFwcyA9IG1fc3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMgfHwgaGFzUmVwbGljYTsKLSAgICBjb25z
dCBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRT
aXplKCk7Ci0gICAgYm9vbCBuZWVkc1R3b1Bhc3MgPSAoKGhhc1JlcGxpY2EgfHwgaGFzTWFzaykg
JiYgcGFpbnRzTW9yZVRoYW5PbmVUZXh0dXJlKSB8fCAobmVlZHNCbGVuZGluZyAmJiBoYXNPdmVy
bGFwcyk7Ci0gICAgb3B0aW9ucy5pc1N1cmZhY2UgPSBmYWxzZTsKKyAgICAgICAgcmVwbGljYU9w
dGlvbnMudHJhbnNmb3JtCisgICAgICAgICAgICAgICAgICAubXVsdGlwbHkobV9zdGF0ZS5yZXBs
aWNhTGF5ZXItPm1fdHJhbnNmb3JtLmNvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgICAubXVs
dGlwbHkobV90cmFuc2Zvcm0uY29tYmluZWQoKS5pbnZlcnNlKCkpOworICAgICAgICBwYWludFNl
bGZBbmRDaGlsZHJlbihyZXBsaWNhT3B0aW9ucyk7CisgICAgfQogCi0gICAgVGV4dHVyZU1hcHBl
clBhaW50T3B0aW9ucyBvcHRpb25zRm9yRGVzY2VuZGFudHMob3B0aW9ucyk7CisgICAgcGFpbnRT
ZWxmQW5kQ2hpbGRyZW4ob3B0aW9ucyk7Cit9CiAKLSAgICBpZiAoIW5lZWRzVHdvUGFzcykgewot
ICAgICAgICBwYWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9yRGVzY2VuZGFu
dHMpOwordm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1hcHBl
clBhaW50T3B0aW9ucyBvcHRpb25zKQoreworICAgIGlmICghaXNWaXNpYmxlKCkpCiAgICAgICAg
IHJldHVybjsKLSAgICB9CisgICAgb3B0aW9ucy5vcGFjaXR5ICo9IG1fb3BhY2l0eTsKKyAgICBS
ZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1f
c3RhdGUubWFza0xheWVyLT50ZXh0dXJlKCkgOiAwOwogCi0gICAgRmxvYXRSZWN0IHZpZXdwb3J0
UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKTsK
KyAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIHBhaW50T3B0aW9ucyhvcHRpb25zKTsKKyAg
ICBwYWludE9wdGlvbnMubWFzayA9IG1hc2tUZXh0dXJlLmdldCgpOworICAgIEludFJlY3Qgc3Vy
ZmFjZVJlY3Q7CiAKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7CisgICAg
UmVmUHRyPEJpdG1hcFRleHR1cmU+IHN1cmZhY2U7CiAKLSAgICBpZiAobV9zdGF0ZS5tYXNrTGF5
ZXIpIHsKLSAgICAgICAgbWFza1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVp
cmVUZXh0dXJlRnJvbVBvb2wob3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7
Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2Uu
Z2V0KCkpOwotICAgICAgICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIG9wdGlvbnNGb3JNYXNr
KG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zRm9yTWFzay5pc1N1cmZhY2UgPSB0cnVlOwotICAg
ICAgICBtX3N0YXRlLm1hc2tMYXllci0+cGFpbnRTZWxmKG9wdGlvbnNGb3JNYXNrKTsKKyAgICBp
ZiAoIXNob3VsZFBhaW50VG9JbnRlcm1lZGlhdGVTdXJmYWNlKCkpIHsKKyAgICAgICAgcGFpbnRT
ZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShwYWludE9wdGlvbnMpOworICAgICAgICByZXR1cm47
CiAgICAgfQogCi0gICAgc3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRl
eHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAg
ICBvcHRpb25zRm9yRGVzY2VuZGFudHMuc3VyZmFjZSA9IHN1cmZhY2UuZ2V0KCk7Ci0gICAgb3B0
aW9ucy5pc1N1cmZhY2UgPSB0cnVlOwotICAgIG9wdGlvbnNGb3JEZXNjZW5kYW50cy5vcGFjaXR5
ID0gMTsKKyAgICAvLyBQcmVwYXJlIGEgc3VyZmFjZSB0byBwYWludCBpbnRvLgorICAgIC8vIFdl
IHBhaW50IGludG8gdGhlIHN1cmZhY2UgaWdub3JpbmcgdGhlIG9wYWNpdHkvdHJhbnNmb3JtIG9m
IHRoZSBjdXJyZW50IGxheWVyLgorICAgIHN1cmZhY2VSZWN0ID0gaW50ZXJtZWRpYXRlU3VyZmFj
ZVJlY3QoKTsKKyAgICBzdXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4
dHVyZUZyb21Qb29sKHN1cmZhY2VSZWN0LnNpemUoKSk7CiAgICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5iaW5kU3VyZmFjZShzdXJmYWNlLmdldCgpKTsKKyAgICBwYWludE9wdGlvbnMub3BhY2l0
eSA9IDE7CiAKLSAgICBwYWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25zRm9yRGVz
Y2VuZGFudHMpOworICAgIC8vIFdlIGhhdmUgdG8gdXNlIGNvbWJpbmVkRm9yQ2hpbGRyZW4oKSBh
bmQgbm90IGNvbWJpbmVkKCksIG90aGVyd2lzZSBsYXllciAzRCBkb2Vzbid0IHdvcmsuCisgICAg
cGFpbnRPcHRpb25zLnRyYW5zZm9ybSA9IG1fdHJhbnNmb3JtLmNvbWJpbmVkRm9yQ2hpbGRyZW4o
KS5pbnZlcnNlKCk7CisgICAgcGFpbnRPcHRpb25zLm9mZnNldCA9IC1JbnRTaXplKHN1cmZhY2VS
ZWN0LngoKSwgc3VyZmFjZVJlY3QueSgpKTsKIAotICAgIGlmICghcGFpbnRSZWZsZWN0aW9uKG9w
dGlvbnMsIHN1cmZhY2UuZ2V0KCkpKSB7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+
YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFw
cGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCgpLCBvcHRpb25zLm9wYWNpdHksIG1hc2tTdXJmYWNlLmdldCgpKTsKLSAgICB9
CisgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShwYWludE9wdGlvbnMpOwogCi0g
ICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdl
dCgpKTsKLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJlVG9Qb29sKG1h
c2tTdXJmYWNlLmdldCgpKTsKKyAgICAvLyBJZiB3ZSBwYWludGVkIHRoZSByZXBsaWNhLCB0aGUg
bWFzayBpcyBhbHJlYWR5IGFwcGxpZWQgc28gd2UgZG9uJ3QgbmVlZCB0byBwYWludCBpdCBhZ2Fp
bi4KKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpCisgICAgICAgIG1hc2tUZXh0dXJlID0g
MDsKKworICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJm
YWNlKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0YXJnZXRUcmFuc2Zvcm0gPQorICAgICAg
ICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgob3B0aW9ucy50cmFuc2Zvcm0pCisgICAgICAgICAg
ICAgICAgLm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAg
LnRyYW5zbGF0ZShvcHRpb25zLm9mZnNldC53aWR0aCgpLCBvcHRpb25zLm9mZnNldC5oZWlnaHQo
KSk7CisgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQo
KSwgc3VyZmFjZVJlY3QsIHRhcmdldFRyYW5zZm9ybSwgb3B0aW9ucy5vcGFjaXR5LCBtYXNrVGV4
dHVyZS5nZXQoKSk7CiB9CiAKIFRleHR1cmVNYXBwZXJOb2RlOjp+VGV4dHVyZU1hcHBlck5vZGUo
KQpAQCAtNzMzLDYgKzY1MSw3IEBAIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnN5bmNDb21wb3Np
dGluZ1N0YXRlU2VsZihHcmFwaGljc0xheWVyVGV4dHVyZU1hcHBlciogZ3JhCiAgICAgbV9zdGF0
ZS5iYWNrZmFjZVZpc2liaWxpdHkgPSBncmFwaGljc0xheWVyLT5iYWNrZmFjZVZpc2liaWxpdHko
KTsKICAgICBtX3N0YXRlLmNoaWxkcmVuVHJhbnNmb3JtID0gZ3JhcGhpY3NMYXllci0+Y2hpbGRy
ZW5UcmFuc2Zvcm0oKTsKICAgICBtX3N0YXRlLm9wYWNpdHkgPSBncmFwaGljc0xheWVyLT5vcGFj
aXR5KCk7CisKICAgICBtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlID0gcGVuZGluZ0NvbnRl
bnQuY29udGVudFR5cGU7CiAgICAgbV9jdXJyZW50Q29udGVudC5pbWFnZSA9IHBlbmRpbmdDb250
ZW50LmltYWdlOwogICAgIG1fY3VycmVudENvbnRlbnQubWVkaWEgPSBwZW5kaW5nQ29udGVudC5t
ZWRpYTsKQEAgLTk4NCw3ICs5MDMsNiBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpzeW5jQ29t
cG9zaXRpbmdTdGF0ZShHcmFwaGljc0xheWVyVGV4dHVyZU1hcHBlciogZ3JhcGhpYwogICAgIHN5
bmNBbmltYXRpb25zKGdyYXBoaWNzTGF5ZXIpOwogCiAgICAgY29tcHV0ZVRpbGVzKCk7Ci0gICAg
Y29tcHV0ZU92ZXJsYXBzSWZOZWVkZWQoKTsKIAogICAgIGlmIChncmFwaGljc0xheWVyKQogICAg
ICAgICByZW5kZXJDb250ZW50KHRleHR1cmVNYXBwZXIsIGdyYXBoaWNzTGF5ZXIpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBw
ZXJOb2RlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVy
ZU1hcHBlck5vZGUuaAppbmRleCAzOTY1ZWU2Li4wODVhNTI4IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5v
ZGUuaApAQCAtNDQsMTUgKzQ0LDE2IEBAIGNsYXNzIEdyYXBoaWNzTGF5ZXJUZXh0dXJlTWFwcGVy
OwogY2xhc3MgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyB7CiBwdWJsaWM6CiAgICAgQml0bWFw
VGV4dHVyZSogc3VyZmFjZTsKLSAgICBUZXh0dXJlTWFwcGVyKiB0ZXh0dXJlTWFwcGVyOwotCisg
ICAgQml0bWFwVGV4dHVyZSogbWFzazsKICAgICBmbG9hdCBvcGFjaXR5OwotICAgIGJvb2wgaXNT
dXJmYWNlOworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKKyAgICBJbnRTaXpl
IG9mZnNldDsKKyAgICBUZXh0dXJlTWFwcGVyKiB0ZXh0dXJlTWFwcGVyOwogICAgIFRleHR1cmVN
YXBwZXJQYWludE9wdGlvbnMoKQogICAgICAgICA6IHN1cmZhY2UoMCkKLSAgICAgICAgLCB0ZXh0
dXJlTWFwcGVyKDApCisgICAgICAgICwgbWFzaygwKQogICAgICAgICAsIG9wYWNpdHkoMSkKLSAg
ICAgICAgLCBpc1N1cmZhY2UoZmFsc2UpCisgICAgICAgICwgdGV4dHVyZU1hcHBlcigwKQogICAg
IHsgfQogfTsKIApAQCAtMTc5LDggKzE4MCw5IEBAIHByaXZhdGU6CiAgICAgdm9pZCBjb21wdXRl
VHJhbnNmb3Jtc1JlY3Vyc2l2ZSgpOwogICAgIHZvaWQgY29tcHV0ZU92ZXJsYXBzSWZOZWVkZWQo
KTsKICAgICB2b2lkIGNvbXB1dGVUaWxlcygpOworICAgIEludFJlY3QgaW50ZXJtZWRpYXRlU3Vy
ZmFjZVJlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKyAgICBJbnRSZWN0IGludGVy
bWVkaWF0ZVN1cmZhY2VSZWN0KCk7CiAgICAgdm9pZCBzd2FwQ29udGVudHNCdWZmZXJzKCk7Ci0g
ICAgaW50IGNvdW50RGVzY2VuZGFudHNXaXRoQ29udGVudCgpIGNvbnN0OwogICAgIEZsb2F0UmVj
dCB0YXJnZXRSZWN0Rm9yVGlsZVJlY3QoY29uc3QgRmxvYXRSZWN0JiB0b3RhbFRhcmdldFJlY3Qs
IGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3QpIGNvbnN0OwogICAgIHZvaWQgaW52YWxpZGF0ZVZp
ZXdwb3J0KGNvbnN0IEZsb2F0UmVjdCYpOwogICAgIHZvaWQgbm90aWZ5Q2hhbmdlKENoYW5nZU1h
c2spOwpAQCAtMTkyLDkgKzE5NCw5IEBAIHByaXZhdGU6CiAgICAgQml0bWFwVGV4dHVyZSogdGV4
dHVyZSgpIHsgcmV0dXJuIG1fb3duZWRUaWxlcy5pc0VtcHR5KCkgPyAwIDogbV9vd25lZFRpbGVz
WzBdLnRleHR1cmUuZ2V0KCk7IH0KIAogICAgIHZvaWQgcGFpbnRSZWN1cnNpdmUoVGV4dHVyZU1h
cHBlclBhaW50T3B0aW9ucyk7Ci0gICAgYm9vbCBwYWludFJlZmxlY3Rpb24oY29uc3QgVGV4dHVy
ZU1hcHBlclBhaW50T3B0aW9ucyYsIEJpdG1hcFRleHR1cmUqIHN1cmZhY2UpOwogICAgIHZvaWQg
cGFpbnRTZWxmKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmKTsKLSAgICB2b2lkIHBh
aW50U2VsZkFuZENoaWxkcmVuKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmLCBUZXh0
dXJlTWFwcGVyUGFpbnRPcHRpb25zJiBvcHRpb25zRm9yRGVzY2VuZGFudHMpOworICAgIHZvaWQg
cGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYpOwor
ICAgIHZvaWQgcGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShjb25zdCBUZXh0dXJlTWFw
cGVyUGFpbnRPcHRpb25zJik7CiAgICAgdm9pZCByZW5kZXJDb250ZW50KFRleHR1cmVNYXBwZXIq
LCBHcmFwaGljc0xheWVyKik7CiAKICAgICB2b2lkIHN5bmNBbmltYXRpb25zKEdyYXBoaWNzTGF5
ZXJUZXh0dXJlTWFwcGVyKik7CkBAIC0yMDQsNyArMjA2LDggQEAgcHJpdmF0ZToKICAgICB2b2lk
IGFwcGx5VHJhbnNmb3JtQW5pbWF0aW9uKGNvbnN0IFRleHR1cmVNYXBwZXJBbmltYXRpb24mLCBj
b25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiBzdGFydCwgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9u
cyogZW5kLCBkb3VibGUpOwogICAgIGJvb2wgaGFzT3BhY2l0eUFuaW1hdGlvbigpIGNvbnN0Owog
ICAgIGJvb2wgaGFzVHJhbnNmb3JtQW5pbWF0aW9uKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNNb3Jl
VGhhbk9uZVRpbGUoKSBjb25zdDsKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0OworICAgIGJv
b2wgc2hvdWxkUGFpbnRUb0ludGVybWVkaWF0ZVN1cmZhY2UoKSBjb25zdDsKIAogICAgIExheWVy
VHJhbnNmb3JtIG1fdHJhbnNmb3JtOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>123185</attachid>
            <date>2012-01-19 13:40:27 -0800</date>
            <delta_ts>2012-01-19 17:34:40 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-76336-20120119134011.patch</filename>
            <type>text/plain</type>
            <size>26946</size>
            <attacher name="Noam Rosenthal">noam</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1NDQwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmI2NTA2NTdjZjc4Zjcy
ZjJjNWZiNmNjOWY4OWEyMTc3NjhiYTFlNy4uZmNmYzQ2MTQyZTUzN2JlNzY4MThkYzhmOTY0MGYx
NWYyYjA4NjQ5ZSAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM3IEBACisyMDEyLTAxLTE5ICBObydh
bSBSb3NlbnRoYWwgIDxub2FtLnJvc2VudGhhbEBub2tpYS5jb20+CisKKyAgICAgICAgW1RleG1h
cF0gVGV4dHVyZU1hcHBlciBjcmVhdGVzIHR3byBtYW55IGJpZyBpbnRlcm1lZGlhdGUgc3VyZmFj
ZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2MzM2
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgU2ltb24gSGF1c21hbm4uCisKKyAgICAgICAgVGhlIGZv
bGxvd2luZyBoYXMgYmVlbiBkb25lIHRvIG9wdGltaXplIHN1cmZhY2UgYWxsb2NhdGlvbjoKKyAg
ICAgICAgMS4gSW5zdGVhZCBvZiB1c2luZyBhIHZpZXdwb3J0LXNpemUgc3VyZmFjZSwgdXNlIGEg
c3VyZmFjZSBpbiB0aGUgc2l6ZSBvZiB0aGUgbGF5ZXIncworICAgICAgICAgICBib3VuZGluZyBy
ZWN0IGFuZCBhcHBseSB0aGUgdHJhbnNmb3JtIGFmdGVyIHRoZSBjb250ZW50IGhhcyBiZWVuIHJl
bmRlcmVkIGludG8gaXQuCisgICAgICAgIDIuIEF2b2lkIGdlbmVyYXRpbmcgaW50ZXJtZWRpYXRl
IHN1cmZhY2UgZm9yIG9jY2FzaW9ucyB3aGVyZSB0aGV5J3JlIG5vdCBuZWNlc3NhcnksCisgICAg
ICAgICAgIHN1Y2ggYXMgbmVzdGVkIHJlZmxlY3Rpb25zIHdpdGhvdXQgb3BhY2l0eS4KKyAgICAg
ICAgMy4gUmVsZWFzaW5nIG9mIHRleHR1cmVzIGZyb20gdGhlIHBvb2wgaXMgbm93IGltcGxpY2l0
LCBiYXNlZCBvbiByZWZDb3VudC4KKyAgICAgICAgNC4gRG8gbm90IHVzZSBpbnRlcm1lZGlhdGUg
c3VyZmFjZXMgZm9yIHByZXNlcnZlLTNkIGxheWVycy4gVGhpcyBpcyBpbiBhbGlnbm1lbnQgd2l0
aAorICAgICAgICAgICBvdGhlciBwb3J0cy4KKworICAgICAgICBUZXN0cyBpbiBMYXlvdXRUZXN0
cy9jb21wb3NpdGluZy9tYXNrcyBhbmQgTGF5b3V0VGVzdHMvY29tcG9zaXRpbmcvcmVmbGVjdGlv
biBjb3ZlciB0aGlzLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1
cmVNYXBwZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlcjo6YWNxdWlyZVRl
eHR1cmVGcm9tUG9vbCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1
cmVNYXBwZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1h
cHBlck5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OnBhaW50
U2VsZik6CisgICAgICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5k
Q2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6VGV4dHVyZU1hcHBlck5vZGU6OmludGVybWVk
aWF0ZVN1cmZhY2VSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpz
aG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0
dXJlTWFwcGVyTm9kZTo6aXNWaXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHR1cmVNYXBw
ZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbldpdGhSZXBsaWNhKToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHR1cmVNYXBwZXJOb2RlOjpwYWludFJlY3Vyc2l2ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0NvbXBvc2l0aW5nU3RhdGVTZWxmKToKKyAgICAgICAg
KFdlYkNvcmU6OlRleHR1cmVNYXBwZXJOb2RlOjpzeW5jQ29tcG9zaXRpbmdTdGF0ZSk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmg6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zOjpUZXh0dXJlTWFwcGVyUGFp
bnRPcHRpb25zKToKKwogMjAxMi0wMS0xOSAgQW5kcmVhcyBLbGluZyAgPGF3ZXNvbWVrbGluZ0Bh
cHBsZS5jb20+CiAKICAgICAgICAgVW5yZXZpZXdlZCBkZWJ1ZyBidWlsZCBmaXguCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBl
ci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1h
cHBlci5jcHAKaW5kZXggMjYyMmQyMWNhNTRkMWE2ODVkM2FkYjdhMmI1N2E3NWJlNGQ3MDBlNi4u
ZGQzM2YwZDJhNTQxYzFiMTQ3NjU3MjQzM2FlM2Y0NmNjNTY5ZDI1MyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVy
LmNwcApAQCAtMjYsMTggKzI2LDIwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogUGFzc1JlZlB0
cjxCaXRtYXBUZXh0dXJlPiBUZXh0dXJlTWFwcGVyOjphY3F1aXJlVGV4dHVyZUZyb21Qb29sKGNv
bnN0IEludFNpemUmIHNpemUpCiB7Ci0gICAgaWYgKG1fdGV4dHVyZVBvb2wuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzZWxlY3RlZFRleHR1cmUgPSBjcmVhdGVU
ZXh0dXJlKCk7Ci0gICAgICAgIHNlbGVjdGVkVGV4dHVyZS0+cmVzZXQoc2l6ZSwgZmFsc2UpOwot
ICAgICAgICBzZWxlY3RlZFRleHR1cmUtPmxvY2soKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVk
VGV4dHVyZTsKLSAgICB9CisgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNlbGVjdGVkVGV4dHVy
ZTsKIAotICAgIHNpemVfdCBpbmRleCA9IDA7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHNl
bGVjdGVkVGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbMF07CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3RleHR1cmVQb29sLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxCaXRtYXBU
ZXh0dXJlPiYgdGV4dHVyZSA9IG1fdGV4dHVyZVBvb2xbaV07CiAKLSAgICBmb3IgKHNpemVfdCBp
ID0gMTsgaSA8IG1fdGV4dHVyZVBvb2wuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgUmVmUHRyPEJp
dG1hcFRleHR1cmU+IHRleHR1cmUgPSBtX3RleHR1cmVQb29sW2ldOworICAgICAgICAvLyBJZiB0
aGUgc3VyZmFjZSBoYXMgb25seSBvbmUgcmVmZXJlbmNlICh0aGUgb25lIGluIG1fdGV4dHVyZVBv
b2wpLCB3ZSBjYW4gc2FmZWx5IHJldXNlIGl0LgorICAgICAgICBpZiAodGV4dHVyZS0+cmVmQ291
bnQoKSA+IDEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBXZSBkZWZhdWx0
IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgdGV4dHVyZS4KKyAgICAgICAgaWYgKCFzZWxlY3RlZFRl
eHR1cmUpIHsKKyAgICAgICAgICAgIHNlbGVjdGVkVGV4dHVyZSA9IHRleHR1cmU7CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAgICAgIEludFNpemUgdGV4dHVyZVNpemUg
PSB0ZXh0dXJlLT5zaXplKCk7CiAgICAgICAgIEludFNpemUgc2VsZWN0ZWRUZXh0dXJlU2l6ZSA9
IHNlbGVjdGVkVGV4dHVyZS0+c2l6ZSgpOwpAQCAtNTgsMjIgKzYwLDE2IEBAIFBhc3NSZWZQdHI8
Qml0bWFwVGV4dHVyZT4gVGV4dHVyZU1hcHBlcjo6YWNxdWlyZVRleHR1cmVGcm9tUG9vbChjb25z
dCBJbnRTaXplJiBzCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBzZWxlY3RlZFRl
eHR1cmUgPSB0ZXh0dXJlOwotICAgICAgICBpbmRleCA9IGk7CiAgICAgfQogCi0gICAgbV90ZXh0
dXJlUG9vbC5yZW1vdmUoaW5kZXgpOworICAgIGlmICghc2VsZWN0ZWRUZXh0dXJlKSB7CisgICAg
ICAgIHNlbGVjdGVkVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoKTsKKyAgICAgICAgbV90ZXh0dXJl
UG9vbC5hcHBlbmQoc2VsZWN0ZWRUZXh0dXJlKTsKKyAgICB9CisKICAgICBzZWxlY3RlZFRleHR1
cmUtPnJlc2V0KHNpemUsIGZhbHNlKTsKLSAgICBzZWxlY3RlZFRleHR1cmUtPmxvY2soKTsKICAg
ICByZXR1cm4gc2VsZWN0ZWRUZXh0dXJlOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXI6OnJlbGVh
c2VUZXh0dXJlVG9Qb29sKEJpdG1hcFRleHR1cmUqIHRleHR1cmUpCi17Ci0gICAgaWYgKCF0ZXh0
dXJlKQotICAgICAgICByZXR1cm47Ci0gICAgbV90ZXh0dXJlUG9vbC5hcHBlbmQodGV4dHVyZSk7
Ci0gICAgdGV4dHVyZS0+dW5sb2NrKCk7Ci19Ci0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyLmgKaW5k
ZXggZDgxMzMzZGFhMjYzNzA3ZmI2OWQ1Nzg1ODExOGE0NWIxNTk4NGY5MS4uYzFkY2JiZDc0Yzlm
OTAxMmQ4MWVhMWYxOTUwMzc5NTJlYzUwNDBlYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXIuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlci5oCkBAIC0xMjYsNyAr
MTI2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBiZWdpblBhaW50aW5nKCkgeyB9CiAg
ICAgdmlydHVhbCB2b2lkIGVuZFBhaW50aW5nKCkgeyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVs
ZWFzZVRleHR1cmVUb1Bvb2woQml0bWFwVGV4dHVyZSogc3VyZmFjZSk7CisgICAgLy8gQSBzdXJm
YWNlIGlzIHJlbGVhc2VkIGltcGxpY2l0bHkgd2hlbiBkZXJlZmVyZW5jZWQuCiAgICAgdmlydHVh
bCBQYXNzUmVmUHRyPEJpdG1hcFRleHR1cmU+IGFjcXVpcmVUZXh0dXJlRnJvbVBvb2woY29uc3Qg
SW50U2l6ZSYpOwogCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy90ZXhtYXAvVGV4dHVyZU1hcHBlck5vZGUuY3BwCmluZGV4IDg2YjU0ZDFiYWU0
Nzc1NmIzN2ZiYzEyNzliMDc2NDE1ZTY4OWRjYTEuLjI3NjI1MTc3NjY2OTdiYjMyYjVlNTQzZTIz
YjkxNzU2ZDk5NDM1NzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3RleG1hcC9UZXh0dXJlTWFwcGVyTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJOb2RlLmNwcApAQCAtNTAsMjIgKzUw
LDYgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6c2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4JiBtYXRyaXgpCiAgICAgbV90cmFuc2Zvcm0uc2V0TG9jYWxUcmFuc2Zvcm0o
bWF0cml4KTsKIH0KIAotaW50IFRleHR1cmVNYXBwZXJOb2RlOjpjb3VudERlc2NlbmRhbnRzV2l0
aENvbnRlbnQoKSBjb25zdAotewotICAgIGlmICghbV9zdGF0ZS52aXNpYmxlIHx8ICghbV9zaXpl
LndpZHRoKCkgJiYgIW1fc2l6ZS5oZWlnaHQoKSAmJiBtX3N0YXRlLm1hc2tzVG9Cb3VuZHMpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICBpbnQgY291bnQgPSAobV9zaXplLndpZHRoKCkgJiYgbV9z
aXplLmhlaWdodCgpICYmIChtX3N0YXRlLmRyYXdzQ29udGVudCB8fCBtX2N1cnJlbnRDb250ZW50
LmNvbnRlbnRUeXBlICE9IEhUTUxDb250ZW50VHlwZSkpID8gMSA6IDA7Ci0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQotICAgICAgICBjb3VudCArPSBt
X2NoaWxkcmVuW2ldLT5jb3VudERlc2NlbmRhbnRzV2l0aENvbnRlbnQoKTsKLQotICAgIHJldHVy
biBjb3VudDsKLX0KLQotdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6Y29tcHV0ZU92ZXJsYXBzSWZO
ZWVkZWQoKQotewotICAgIG1fc3RhdGUubWlnaHRIYXZlT3ZlcmxhcHMgPSBjb3VudERlc2NlbmRh
bnRzV2l0aENvbnRlbnQoKSA+IDE7Ci19Ci0KIHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OmNvbXB1
dGVUcmFuc2Zvcm1zUmVjdXJzaXZlKCkKIHsKICAgICBpZiAobV9zaXplLmlzRW1wdHkoKSAmJiBt
X3N0YXRlLm1hc2tzVG9Cb3VuZHMpCkBAIC0xNTcsMzQgKzE0MSw2IEBAIHZvaWQgVGV4dHVyZU1h
cHBlck5vZGU6OmNvbXB1dGVUaWxlcygpCiAgICAgICAgIG1fb3duZWRUaWxlcy5yZW1vdmUodGls
ZXNUb1JlbW92ZVtpXSk7CiB9CiAKLWJvb2wgVGV4dHVyZU1hcHBlck5vZGU6Omhhc01vcmVUaGFu
T25lVGlsZSgpIGNvbnN0Ci17Ci0gICAgaW50IHRpbGVzID0gMDsKLQotI2lmIFVTRShUSUxFRF9C
QUNLSU5HX1NUT1JFKQotICAgIGlmIChtX3N0YXRlLnRpbGVPd25lcnNoaXAgPT0gRXh0ZXJuYWxs
eU1hbmFnZWRUaWxlcykgewotICAgICAgICBIYXNoTWFwPGludCwgRXh0ZXJuYWxseU1hbmFnZWRU
aWxlPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9leHRlcm5hbGx5TWFuYWdlZFRpbGVzLmVuZCgp
OwotICAgICAgICBmb3IgKEhhc2hNYXA8aW50LCBFeHRlcm5hbGx5TWFuYWdlZFRpbGU+Ojpjb25z
dF9pdGVyYXRvciBpdCA9IG1fZXh0ZXJuYWxseU1hbmFnZWRUaWxlcy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZyb250QnVmZmVyLnRleHR1
cmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKyt0aWxlcyA+IDEpCi0gICAgICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X293bmVkVGlsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKG1fb3duZWRUaWxlc1tpXS50
ZXh0dXJlKSB7Ci0gICAgICAgICAgICBpZiAoKyt0aWxlcyA+IDEpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
IHZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnJlbmRlckNvbnRlbnQoVGV4dHVyZU1hcHBlciogdGV4
dHVyZU1hcHBlciwgR3JhcGhpY3NMYXllciogbGF5ZXIpCiB7CiAjaWYgVVNFKFRJTEVEX0JBQ0tJ
TkdfU1RPUkUpCkBAIC0yNzEsMTcgKzIyNywxNiBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpw
YWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICBp
ZiAobV9zaXplLmlzRW1wdHkoKSB8fCAoIW1fc3RhdGUuZHJhd3NDb250ZW50ICYmIG1fY3VycmVu
dENvbnRlbnQuY29udGVudFR5cGUgPT0gSFRNTENvbnRlbnRUeXBlKSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tUZXh0dXJlOwotICAgIFJlZlB0cjxC
aXRtYXBUZXh0dXJlPiByZXBsaWNhTWFza1RleHR1cmU7Ci0KLSAgICBpZiAobV9zdGF0ZS5tYXNr
TGF5ZXIpCi0gICAgICAgIG1hc2tUZXh0dXJlID0gbV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUo
KTsKLSAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgbV9zdGF0ZS5yZXBsaWNhTGF5ZXIt
Pm1fc3RhdGUubWFza0xheWVyKQotICAgICAgICByZXBsaWNhTWFza1RleHR1cmUgPSBtX3N0YXRl
LnJlcGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsKLQotICAgIGZsb2F0
IG9wYWNpdHkgPSBvcHRpb25zLmlzU3VyZmFjZSA/IDEgOiBvcHRpb25zLm9wYWNpdHk7CisgICAg
ZmxvYXQgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eTsKKyAgICBCaXRtYXBUZXh0dXJlKiBtYXNr
ID0gb3B0aW9ucy5tYXNrOwogICAgIEZsb2F0UmVjdCB0YXJnZXRSZWN0ID0gdGhpcy0+dGFyZ2V0
UmVjdCgpOwogCisgICAgLy8gV2UgYXBwbHkgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm0gdG8gY29t
cGVuc2F0ZSBmb3IgcGFpbnRpbmcgaW50byBhIHN1cmZhY2UsIGFuZCB0aGVuIGFwcGx5IHRoZSBv
ZmZzZXQgc28gdGhhdCB0aGUgcGFpbnRpbmcgZml0cyBpbiB0aGUgdGFyZ2V0IHJlY3QuCisgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtID0KKyAgICAgICAgICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4KG9wdGlvbnMudHJhbnNmb3JtKQorICAgICAgICAgICAgLm11bHRpcGx5KG1fdHJh
bnNmb3JtLmNvbWJpbmVkKCkpCisgICAgICAgICAgICAudHJhbnNsYXRlKG9wdGlvbnMub2Zmc2V0
LndpZHRoKCksIG9wdGlvbnMub2Zmc2V0LmhlaWdodCgpKTsKKwogI2lmIFVTRShUSUxFRF9CQUNL
SU5HX1NUT1JFKQogICAgIFZlY3RvcjxFeHRlcm5hbGx5TWFuYWdlZFRpbGU+IHRpbGVzVG9QYWlu
dDsKIApAQCAtMzAzLDIwICsyNTgsMTEgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRT
ZWxmKGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmIG9wdGlvbnMpCiAgICAgICAgICAg
ICAgICAgdGlsZXMucHJlcGVuZCgmaXQtPnNlY29uZCk7CiAgICAgICAgIH0KIAotICAgICAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCByZXBsaWNhTWF0cml4OwogICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IHRpbGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBFeHRlcm5hbGx5TWFuYWdl
ZFRpbGUmIHRpbGUgPSAqdGlsZXNbaV07CiAgICAgICAgICAgICBGbG9hdFJlY3QgcmVjdCA9IHRp
bGUuZnJvbnRCdWZmZXIudGFyZ2V0UmVjdDsKLQotICAgICAgICAgICAgZmxvYXQgcmVwbGljYU9w
YWNpdHkgPSAxLjA7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpIHsKLSAg
ICAgICAgICAgICAgICByZXBsaWNhTWF0cml4ID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fdHJh
bnNmb3JtLmNvbWJpbmVkKCkuc2NhbGUoMS4wIC8gdGlsZS5zY2FsZSk7Ci0gICAgICAgICAgICAg
ICAgcmVwbGljYU9wYWNpdHkgPSBvcGFjaXR5ICogbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fb3Bh
Y2l0eTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIEJpdG1hcFRleHR1cmUmIHRleHR1cmUg
PSAqdGlsZS5mcm9udEJ1ZmZlci50ZXh0dXJlOwotICAgICAgICAgICAgaWYgKG1fc3RhdGUucmVw
bGljYUxheWVyKQotICAgICAgICAgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1Rl
eHR1cmUodGV4dHVyZSwgcmVjdCwgcmVwbGljYU1hdHJpeCwgcmVwbGljYU9wYWNpdHksIHJlcGxp
Y2FNYXNrVGV4dHVyZSA/IHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSA6IG1hc2tUZXh0dXJlLmdl
dCgpKTsKLSAgICAgICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUodGV4
dHVyZSwgcmVjdCwgbV90cmFuc2Zvcm0uY29tYmluZWQoKSwgb3BhY2l0eSwgb3B0aW9ucy5pc1N1
cmZhY2UgPyAwIDogbWFza1RleHR1cmUuZ2V0KCkpOworICAgICAgICAgICAgb3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSh0ZXh0dXJlLCByZWN0LCB0cmFuc2Zvcm0sIG9wYWNpdHks
IG1hc2spOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zMjUsMjUgKzI3
MSwxMiBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpwYWludFNlbGYoY29uc3QgVGV4dHVyZU1h
cHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKICAgICAvLyBOb3cgd2UgcGFpbnQgb3duZWQgdGls
ZXMsIGlmIHdlJ3JlIGluIE93bmVkVGlsZU1vZGUuCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX293bmVkVGlsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQml0bWFwVGV4dHVyZSogdGV4
dHVyZSA9IG1fb3duZWRUaWxlc1tpXS50ZXh0dXJlLmdldCgpOwotICAgICAgICBpZiAobV9zdGF0
ZS5yZXBsaWNhTGF5ZXIgJiYgIW9wdGlvbnMuaXNTdXJmYWNlKSB7Ci0gICAgICAgICAgICBvcHRp
b25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCp0ZXh0dXJlLCB0YXJnZXRSZWN0Rm9yVGls
ZVJlY3QodGFyZ2V0UmVjdCwgbV9vd25lZFRpbGVzW2ldLnJlY3QpLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV90cmFuc2Zvcm0uY29tYmluZWQo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSAqIG1fc3RhdGUucmVwbGlj
YUxheWVyLT5tX29wYWNpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2FN
YXNrVGV4dHVyZSA/IHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSA6IG1hc2tUZXh0dXJlLmdldCgp
KTsKLSAgICAgICAgfQotCiAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCByZWN0ID0gdGFyZ2V0UmVj
dEZvclRpbGVSZWN0KHRhcmdldFJlY3QsIG1fb3duZWRUaWxlc1tpXS5yZWN0KTsKLSAgICAgICAg
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqdGV4dHVyZSwgcmVjdCwgbV90cmFu
c2Zvcm0uY29tYmluZWQoKSwgb3BhY2l0eSwgb3B0aW9ucy5pc1N1cmZhY2UgPyAwIDogbWFza1Rl
eHR1cmUuZ2V0KCkpOworICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJl
KCp0ZXh0dXJlLCByZWN0LCB0cmFuc2Zvcm0sIG9wYWNpdHksIG1hc2spOwogICAgIH0KIAotICAg
IGlmIChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlID09IE1lZGlhQ29udGVudFR5cGUgJiYg
bV9jdXJyZW50Q29udGVudC5tZWRpYSkgewotICAgICAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5
ZXIgJiYgIW9wdGlvbnMuaXNTdXJmYWNlKQotICAgICAgICAgICAgbV9jdXJyZW50Q29udGVudC5t
ZWRpYS0+cGFpbnRUb1RleHR1cmVNYXBwZXIob3B0aW9ucy50ZXh0dXJlTWFwcGVyLCB0YXJnZXRS
ZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fdHJhbnNmb3JtLmNvbWJpbmVkKCksCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFj
aXR5ICogbV9zdGF0ZS5yZXBsaWNhTGF5ZXItPm1fb3BhY2l0eSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2FNYXNrVGV4dHVy
ZSA/IHJlcGxpY2FNYXNrVGV4dHVyZS5nZXQoKSA6IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICAg
ICAgbV9jdXJyZW50Q29udGVudC5tZWRpYS0+cGFpbnRUb1RleHR1cmVNYXBwZXIob3B0aW9ucy50
ZXh0dXJlTWFwcGVyLCB0YXJnZXRSZWN0LCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCBvcGFjaXR5
LCBvcHRpb25zLmlzU3VyZmFjZSA/IDAgOiBtYXNrVGV4dHVyZS5nZXQoKSk7Ci0gICAgfQorICAg
IGlmIChtX2N1cnJlbnRDb250ZW50LmNvbnRlbnRUeXBlID09IE1lZGlhQ29udGVudFR5cGUgJiYg
bV9jdXJyZW50Q29udGVudC5tZWRpYSkKKyAgICAgICAgbV9jdXJyZW50Q29udGVudC5tZWRpYS0+
cGFpbnRUb1RleHR1cmVNYXBwZXIob3B0aW9ucy50ZXh0dXJlTWFwcGVyLCB0YXJnZXRSZWN0LCB0
cmFuc2Zvcm0sIG9wYWNpdHksIG1hc2spOwogfQogCiBpbnQgVGV4dHVyZU1hcHBlck5vZGU6OmNv
bXBhcmVHcmFwaGljc0xheWVyc1pWYWx1ZShjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKQpA
QCAtMzU4LDE1MCArMjkxLDEzOCBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpzb3J0QnlaT3Jk
ZXIoVmVjdG9yPFRleHR1cmVNYXBwZXJOb2RlKiA+JiBhcnJheSwgaW50IGZpcgogICAgIHFzb3J0
KGFycmF5LmRhdGEoKSwgYXJyYXkuc2l6ZSgpLCBzaXplb2YoVGV4dHVyZU1hcHBlck5vZGUqKSwg
Y29tcGFyZUdyYXBoaWNzTGF5ZXJzWlZhbHVlKTsKIH0KIAotdm9pZCBUZXh0dXJlTWFwcGVyTm9k
ZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYg
b3B0aW9ucywgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9uc0ZvckRlc2NlbmRhbnRz
KQordm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6cGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29uc3QgVGV4
dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0aW9ucykKIHsKICAgICBib29sIGhhc0NsaXAgPSBt
X3N0YXRlLm1hc2tzVG9Cb3VuZHMgJiYgIW1fY2hpbGRyZW4uaXNFbXB0eSgpOwogICAgIGlmICho
YXNDbGlwKQotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJlZ2luQ2xpcChtX3RyYW5z
Zm9ybS5jb21iaW5lZCgpLCBGbG9hdFJlY3QoMCwgMCwgbV9zaXplLndpZHRoKCksIG1fc2l6ZS5o
ZWlnaHQoKSkpOworICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmJlZ2luQ2xpcChUcmFu
c2Zvcm1hdGlvbk1hdHJpeChvcHRpb25zLnRyYW5zZm9ybSkubXVsdGlwbHkobV90cmFuc2Zvcm0u
Y29tYmluZWQoKSksIEZsb2F0UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdo
dCgpKSk7CiAKICAgICBwYWludFNlbGYob3B0aW9ucyk7CiAKICAgICBmb3IgKGludCBpID0gMDsg
aSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyArK2kpCi0gICAgICAgIG1fY2hpbGRyZW5baV0tPnBhaW50
UmVjdXJzaXZlKG9wdGlvbnNGb3JEZXNjZW5kYW50cyk7CisgICAgICAgIG1fY2hpbGRyZW5baV0t
PnBhaW50UmVjdXJzaXZlKG9wdGlvbnMpOwogCiAgICAgaWYgKGhhc0NsaXApCiAgICAgICAgIG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+ZW5kQ2xpcCgpOwogfQogCi1ib29sIFRleHR1cmVNYXBwZXJO
b2RlOjpwYWludFJlZmxlY3Rpb24oY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9ucyYgb3B0
aW9ucywgQml0bWFwVGV4dHVyZSogY29udGVudFN1cmZhY2UpCitJbnRSZWN0IFRleHR1cmVNYXBw
ZXJOb2RlOjppbnRlcm1lZGlhdGVTdXJmYWNlUmVjdCgpCiB7Ci0gICAgaWYgKCFtX3N0YXRlLnJl
cGxpY2FMYXllcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZJWE1FOiBBZGQgYW4g
aW52ZXJzZSB0cmFuc2Zvcm0gdG8gTGF5ZXJUcmFuc2Zvcm0uCisgICAgcmV0dXJuIGludGVybWVk
aWF0ZVN1cmZhY2VSZWN0KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkuaW52ZXJzZSgpKTsKK30KIAot
ICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiBzdXJmYWNlKGNvbnRlbnRTdXJmYWNlKTsKLSAgICBS
ZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFza1N1cmZhY2U7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1
cmU+IHJlcGxpY2FNYXNrU3VyZmFjZTsKLSAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gcmVwbGlj
YU1hc2tUZXh0dXJlOwotCi0gICAgaWYgKFRleHR1cmVNYXBwZXJOb2RlKiByZXBsaWNhTWFzayA9
IG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3N0YXRlLm1hc2tMYXllcikKLSAgICAgICAgcmVwbGlj
YU1hc2tUZXh0dXJlID0gcmVwbGljYU1hc2stPnRleHR1cmUoKTsKLQotICAgIFJlZlB0cjxCaXRt
YXBUZXh0dXJlPiBtYXNrVGV4dHVyZTsKLSAgICBpZiAoVGV4dHVyZU1hcHBlck5vZGUqIG1hc2sg
PSBtX3N0YXRlLm1hc2tMYXllcikKLSAgICAgICAgbWFza1RleHR1cmUgPSBtYXNrLT50ZXh0dXJl
KCk7Ci0KLSAgICBjb25zdCBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IG9wdGlvbnMudGV4dHVyZU1h
cHBlci0+dmlld3BvcnRTaXplKCk7Ci0gICAgY29uc3QgYm9vbCB1c2VJbnRlcm1lZGlhdGVCdWZm
ZXJGb3JSZXBsaWNhID0gbV9zdGF0ZS5yZXBsaWNhTGF5ZXIgJiYgb3B0aW9ucy5vcGFjaXR5IDwg
MC45OTsKLSAgICBjb25zdCBib29sIHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvck1hc2sgPSBtYXNr
VGV4dHVyZSAmJiByZXBsaWNhTWFza1RleHR1cmU7Ci0gICAgY29uc3QgRmxvYXRSZWN0IHZpZXdw
b3J0UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgp
KTsKLSAgICAvLyBSZXZlcnNlIHRoaXMgbGF5ZXIncyB0cmFuc2Zvcm0gb24gdGhlIHJlcGxpY2En
cyB0cmFuc2Zvcm0gYW5kIHVzZSBpdCB3aXRoIHRoZSBjb250ZW50cwotICAgIC8vIGludGVybWVk
aWF0ZSBzdXJmYWNlLCBhcHBsaWVkIGluIHRoZSB2aWV3cG9ydCBjb29yZGluYXRlIHN5c3RlbS4K
LSAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCByZXBsaWNhTWF0cml4ID0gbV9zdGF0ZS5yZXBsaWNh
TGF5ZXItPm1fdHJhbnNmb3JtLmNvbWJpbmVkKCk7Ci0gICAgcmVwbGljYU1hdHJpeC5tdWx0aXBs
eShtX3RyYW5zZm9ybS5jb21iaW5lZCgpLmludmVyc2UoKSk7Ci0KLSAgICAvLyBUaGUgbWFzayBo
YXMgdG8gYmUgYWRqdXN0ZWQgdG8gdGFyZ2V0IGNvb3JkaW5hdGVzLgotICAgIGlmIChtYXNrVGV4
dHVyZSkgewotICAgICAgICBtYXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNx
dWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgp
KTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShtYXNrU3VyZmFj
ZS5nZXQoKSk7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKm1h
c2tUZXh0dXJlLmdldCgpLCBlbnRpcmVSZWN0KCksIG1fdHJhbnNmb3JtLmNvbWJpbmVkKCksIDEs
IDApOwotICAgICAgICBtYXNrVGV4dHVyZSA9IG1hc2tTdXJmYWNlOwotICAgIH0KLQotICAgIC8v
IFRoZSByZXBsaWNhJ3MgbWFzayBoYXMgdG8gYmUgYWRqdXN0ZWQgdG8gdGFyZ2V0IGNvb3JkaW5h
dGVzLgotICAgIGlmIChyZXBsaWNhTWFza1RleHR1cmUpIHsKLSAgICAgICAgcmVwbGljYU1hc2tT
dXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9w
dGlvbnMudGV4dHVyZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRl
eHR1cmVNYXBwZXItPmJpbmRTdXJmYWNlKHJlcGxpY2FNYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAg
ICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+ZHJhd1RleHR1cmUoKnJlcGxpY2FNYXNrVGV4dHVy
ZS5nZXQoKSwgZW50aXJlUmVjdCgpLCBtX3RyYW5zZm9ybS5jb21iaW5lZCgpLCAxLCAwKTsKLSAg
ICAgICAgcmVwbGljYU1hc2tUZXh0dXJlID0gcmVwbGljYU1hc2tTdXJmYWNlOwotICAgIH0KLQot
ICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gYXBwbHkgdGhlIG1hc2sgb2YgdGhlIGNvbnRlbnQgbGF5
ZXIgYmVmb3JlIHdlIGRyYXcgdGhlIHJlZmxlY3Rpb24sIGFzIHRoZXJlIG1pZ2h0IGJlIHlldCBh
bm90aGVyIG1hc2sgZm9yIHRoZSByZWZsZWN0aW9uIGl0c2VsZi4KLSAgICBpZiAodXNlSW50ZXJt
ZWRpYXRlQnVmZmVyRm9yTWFzaykgewotICAgICAgICBSZWZQdHI8Qml0bWFwVGV4dHVyZT4gbWFz
a1N1cmZhY2UgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPmFjcXVpcmVUZXh0dXJlRnJvbVBvb2wo
b3B0aW9ucy50ZXh0dXJlTWFwcGVyLT52aWV3cG9ydFNpemUoKSk7Ci0gICAgICAgIG9wdGlvbnMu
dGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2UobWFza1N1cmZhY2UuZ2V0KCkpOwotICAgICAgICBv
cHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJlKCpzdXJmYWNlLmdldCgpLCB2aWV3cG9y
dFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIDEsIG1hc2tUZXh0dXJlLmdldCgpKTsKLSAg
ICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChzdXJmYWNl
LmdldCgpKTsKLSAgICAgICAgc3VyZmFjZSA9IG1hc2tTdXJmYWNlOwotICAgICAgICBtYXNrVGV4
dHVyZS5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIFdlIGJsZW5kIHRoZSBsYXllciBhbmQgaXRz
IHJlcGxpY2EgaW4gYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBiZWZvcmUgYmxlbmRpbmcgaW50byB0
aGUgdGFyZ2V0IHN1cmZhY2UuCi0gICAgaWYgKHVzZUludGVybWVkaWF0ZUJ1ZmZlckZvclJlcGxp
Y2EpIHsKLSAgICAgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHJlcGxpY2FTdXJmYWNlID0gb3B0
aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1aXJlVGV4dHVyZUZyb21Qb29sKG9wdGlvbnMudGV4dHVy
ZU1hcHBlci0+dmlld3BvcnRTaXplKCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXIt
PmJpbmRTdXJmYWNlKHJlcGxpY2FTdXJmYWNlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCByZXBs
aWNhTWF0cml4LCBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LCByZXBsaWNhTWFza1Rl
eHR1cmUuZ2V0KCkpOwotICAgICAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPmRyYXdUZXh0dXJl
KCpzdXJmYWNlLmdldCgpLCB2aWV3cG9ydFJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIDEs
IG1hc2tUZXh0dXJlLmdldCgpKTsKLSAgICAgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxl
YXNlVGV4dHVyZVRvUG9vbChzdXJmYWNlLmdldCgpKTsKLSAgICAgICAgc3VyZmFjZSA9IHJlcGxp
Y2FTdXJmYWNlOworSW50UmVjdCBUZXh0dXJlTWFwcGVyTm9kZTo6aW50ZXJtZWRpYXRlU3VyZmFj
ZVJlY3QoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCkKK3sKKyAgICBJbnRSZWN0
IHJlY3Q7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbG9jYWxUcmFuc2Zvcm0gPSBUcmFuc2Zv
cm1hdGlvbk1hdHJpeChtYXRyaXgpLm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkpOwor
ICAgIHJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGxvY2FsVHJhbnNmb3JtLm1hcFJlY3QoZW50aXJl
UmVjdCgpKSk7CisgICAgaWYgKCFtX3N0YXRlLm1hc2tzVG9Cb3VuZHMgJiYgIW1fc3RhdGUubWFz
a0xheWVyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7
ICsraSkKKyAgICAgICAgICAgIHJlY3QudW5pdGUobV9jaGlsZHJlbltpXS0+aW50ZXJtZWRpYXRl
U3VyZmFjZVJlY3QobWF0cml4KSk7CiAgICAgfQogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVy
LT5iaW5kU3VyZmFjZShvcHRpb25zLnN1cmZhY2UpOworICAgIGlmIChtX3N0YXRlLnJlcGxpY2FM
YXllcikKKyAgICAgICAgcmVjdC51bml0ZShtX3N0YXRlLnJlcGxpY2FMYXllci0+aW50ZXJtZWRp
YXRlU3VyZmFjZVJlY3QobWF0cml4KSk7CiAKLSAgICAvLyBEcmF3IHRoZSByZWZsZWN0aW9uLgot
ICAgIGlmICghdXNlSW50ZXJtZWRpYXRlQnVmZmVyRm9yUmVwbGljYSkKLSAgICAgICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0
LCByZXBsaWNhTWF0cml4LCBtX3N0YXRlLnJlcGxpY2FMYXllci0+bV9vcGFjaXR5LCByZXBsaWNh
TWFza1RleHR1cmUuZ2V0KCkpOworICAgIHJldHVybiByZWN0OworfQogCi0gICAgLy8gRHJhdyB0
aGUgb3JpZ2luYWwuCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3Vy
ZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBvcHRpb25z
Lm9wYWNpdHksIG1hc2tUZXh0dXJlLmdldCgpKTsKK2Jvb2wgVGV4dHVyZU1hcHBlck5vZGU6OnNo
b3VsZFBhaW50VG9JbnRlcm1lZGlhdGVTdXJmYWNlKCkgY29uc3QKK3sKKyAgICBib29sIGhhc09w
YWNpdHkgPSBtX29wYWNpdHkgPCAwLjk5OworICAgIGJvb2wgaGFzQ2hpbGRyZW4gPSAhbV9jaGls
ZHJlbi5pc0VtcHR5KCk7CisgICAgYm9vbCBoYXNSZXBsaWNhID0gISFtX3N0YXRlLnJlcGxpY2FM
YXllcjsKKyAgICBib29sIGhhc01hc2sgPSAhIW1fc3RhdGUubWFza0xheWVyOwogCi0gICAgb3B0
aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChtYXNrU3VyZmFjZS5nZXQo
KSk7Ci0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChyZXBs
aWNhTWFza1N1cmZhY2UuZ2V0KCkpOworICAgIC8vIFdlIGRvbid0IHVzZSB0d28tcGFzcyBibGVu
ZGluZyBmb3IgcHJlc2VydmVzLTNkLCB0aGF0J3MgaW4gc3luYyB3aXRoIFNhZmFyaS4KKyAgICBp
ZiAobV9zdGF0ZS5wcmVzZXJ2ZXMzRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgcmV0
dXJuIHRydWU7CisgICAgLy8gV2Ugc2hvdWxkIHVzZSBhbiBpbnRlcm1lZGlhdGUgc3VyZmFjZSB3
aGVuIGJsZW5kaW5nIHNldmVyYWwgaXRlbXMgd2l0aCBhbiBhbmNlc3RvciBvcGFjaXR5LgorICAg
IC8vIFRlc3RlZCBieSBjb21wb3NpdGluZy9yZWZsZWN0aW9ucy9yZWZsZWN0aW9uLW9wYWNpdHku
aHRtbAorICAgIGlmIChoYXNPcGFjaXR5ICYmIChoYXNDaGlsZHJlbiB8fCBoYXNSZXBsaWNhKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBXZSBzaG91bGQgdXNlIGFuIGludGVybWVk
aWF0ZSBzdXJmYWNlIHdpdGggYSBtYXNrZWQgYW5jZXN0b3IuCisgICAgLy8gSW4gdGhlIGNhc2Ug
b2YgcmVwbGljYXMgdGhlIG1hc2sgaXMgYXBwbGllZCBiZWZvcmUgcmVwbGljYXRpbmcuCisgICAg
Ly8gVGVzdGVkIGJ5IGNvbXBvc2l0aW5nL21hc2tzL21hc2tlZC1hbmNlc3Rvci5odG1sCisgICAg
aWYgKGhhc01hc2sgJiYgaGFzQ2hpbGRyZW4gJiYgIWhhc1JlcGxpY2EpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFRleHR1cmVNYXBwZXJOb2Rl
OjpwYWludFJlY3Vyc2l2ZShUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zIG9wdGlvbnMpCitib29s
IFRleHR1cmVNYXBwZXJOb2RlOjppc1Zpc2libGUoKSBjb25zdAogewotICAgIGlmICgobV9zaXpl
LmlzRW1wdHkoKSAmJiAobV9zdGF0ZS5tYXNrc1RvQm91bmRzCi0gICAgICAgIHx8IG1fY2hpbGRy
ZW4uaXNFbXB0eSgpKSkgfHwgIW1fc3RhdGUudmlzaWJsZSB8fCBvcHRpb25zLm9wYWNpdHkgPCAw
LjAxIHx8IG1fb3BhY2l0eSA8IDAuMDEpCi0gICAgICAgIHJldHVybjsKKyAgICBpZiAobV9zaXpl
LmlzRW1wdHkoKSAmJiAobV9zdGF0ZS5tYXNrc1RvQm91bmRzIHx8IG1fc3RhdGUubWFza0xheWVy
IHx8IG1fY2hpbGRyZW4uaXNFbXB0eSgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
ICghbV9zdGF0ZS52aXNpYmxlIHx8IG1fb3BhY2l0eSA8IDAuMDEpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KIAotICAgIG9wdGlvbnMub3BhY2l0eSAqPSBtX29w
YWNpdHk7Ci0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHN1cmZhY2U7Cit2b2lkIFRleHR1cmVN
YXBwZXJOb2RlOjpwYWludFNlbGZBbmRDaGlsZHJlbldpdGhSZXBsaWNhKGNvbnN0IFRleHR1cmVN
YXBwZXJQYWludE9wdGlvbnMmIG9wdGlvbnMpCit7CisgICAgaWYgKG1fc3RhdGUucmVwbGljYUxh
eWVyKSB7CisgICAgICAgIFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgcmVwbGljYU9wdGlvbnMo
b3B0aW9ucyk7CisgICAgICAgIC8vIFdlIGNob29zZSBlaXRoZXIgdGhlIGNvbnRlbnQncyBtYXNr
IG9yIHRoZSByZXBsaWNhJ3MgbWFzay4KKyAgICAgICAgLy8gRklYTUU6IGJsZW5kIHRoZSB0d28g
aWYgYm90aCBleGlzdC4KKyAgICAgICAgaWYgKG1fc3RhdGUucmVwbGljYUxheWVyLT5tX3N0YXRl
Lm1hc2tMYXllcikKKyAgICAgICAgICAgIHJlcGxpY2FPcHRpb25zLm1hc2sgPSBtX3N0YXRlLnJl
cGxpY2FMYXllci0+bV9zdGF0ZS5tYXNrTGF5ZXItPnRleHR1cmUoKTsKIAotICAgIGJvb2wgaGFz
UmVwbGljYSA9IG1fc3RhdGUucmVwbGljYUxheWVyOwotICAgIGJvb2wgaGFzTWFzayA9IG1fc3Rh
dGUubWFza0xheWVyOwotICAgIGJvb2wgbmVlZHNCbGVuZGluZyA9IG1fb3BhY2l0eSA8IDAuOTkg
fHwgaGFzTWFzazsKLSAgICBib29sIHBhaW50c01vcmVUaGFuT25lVGV4dHVyZSA9ICFtX2NoaWxk
cmVuLmlzRW1wdHkoKSB8fCBoYXNNb3JlVGhhbk9uZVRpbGUoKSB8fCAoaGFzTWFzayAmJiBtX3N0
YXRlLm1hc2tMYXllci0+aGFzTW9yZVRoYW5PbmVUaWxlKCkpOwotICAgIGJvb2wgaGFzT3Zlcmxh
cHMgPSBtX3N0YXRlLm1pZ2h0SGF2ZU92ZXJsYXBzIHx8IGhhc1JlcGxpY2E7Ci0gICAgY29uc3Qg
SW50U2l6ZSB2aWV3cG9ydFNpemUgPSBvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6
ZSgpOwotICAgIGJvb2wgbmVlZHNUd29QYXNzID0gKChoYXNSZXBsaWNhIHx8IGhhc01hc2spICYm
IHBhaW50c01vcmVUaGFuT25lVGV4dHVyZSkgfHwgKG5lZWRzQmxlbmRpbmcgJiYgaGFzT3Zlcmxh
cHMpOwotICAgIG9wdGlvbnMuaXNTdXJmYWNlID0gZmFsc2U7CisgICAgICAgIHJlcGxpY2FPcHRp
b25zLnRyYW5zZm9ybQorICAgICAgICAgICAgICAgICAgLm11bHRpcGx5KG1fc3RhdGUucmVwbGlj
YUxheWVyLT5tX3RyYW5zZm9ybS5jb21iaW5lZCgpKQorICAgICAgICAgICAgICAgICAgLm11bHRp
cGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkuaW52ZXJzZSgpKTsKKyAgICAgICAgcGFpbnRTZWxm
QW5kQ2hpbGRyZW4ocmVwbGljYU9wdGlvbnMpOworICAgIH0KIAotICAgIFRleHR1cmVNYXBwZXJQ
YWludE9wdGlvbnMgb3B0aW9uc0ZvckRlc2NlbmRhbnRzKG9wdGlvbnMpOworICAgIHBhaW50U2Vs
ZkFuZENoaWxkcmVuKG9wdGlvbnMpOworfQogCi0gICAgaWYgKCFuZWVkc1R3b1Bhc3MpIHsKLSAg
ICAgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW4ob3B0aW9ucywgb3B0aW9uc0ZvckRlc2NlbmRhbnRz
KTsKK3ZvaWQgVGV4dHVyZU1hcHBlck5vZGU6OnBhaW50UmVjdXJzaXZlKGNvbnN0IFRleHR1cmVN
YXBwZXJQYWludE9wdGlvbnMmIG9wdGlvbnMpCit7CisgICAgaWYgKCFpc1Zpc2libGUoKSkKICAg
ICAgICAgcmV0dXJuOwotICAgIH0KIAotICAgIEZsb2F0UmVjdCB2aWV3cG9ydFJlY3QoMCwgMCwg
dmlld3BvcnRTaXplLndpZHRoKCksIHZpZXdwb3J0U2l6ZS5oZWlnaHQoKSk7CisgICAgZmxvYXQg
b3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eSAqIG1fb3BhY2l0eTsKKyAgICBSZWZQdHI8Qml0bWFw
VGV4dHVyZT4gbWFza1RleHR1cmUgPSBtX3N0YXRlLm1hc2tMYXllciA/IG1fc3RhdGUubWFza0xh
eWVyLT50ZXh0dXJlKCkgOiAwOwogCi0gICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IG1hc2tTdXJm
YWNlOworICAgIFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgcGFpbnRPcHRpb25zKG9wdGlvbnMp
OworICAgIHBhaW50T3B0aW9ucy5tYXNrID0gbWFza1RleHR1cmUuZ2V0KCk7CisgICAgSW50UmVj
dCBzdXJmYWNlUmVjdDsKIAotICAgIGlmIChtX3N0YXRlLm1hc2tMYXllcikgewotICAgICAgICBt
YXNrU3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNxdWlyZVRleHR1cmVGcm9tUG9v
bChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgpKTsKLSAgICAgICAgb3B0aW9u
cy50ZXh0dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShtYXNrU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAg
IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgb3B0aW9uc0Zvck1hc2sob3B0aW9ucyk7Ci0gICAg
ICAgIG9wdGlvbnNGb3JNYXNrLmlzU3VyZmFjZSA9IHRydWU7Ci0gICAgICAgIG1fc3RhdGUubWFz
a0xheWVyLT5wYWludFNlbGYob3B0aW9uc0Zvck1hc2spOworICAgIFJlZlB0cjxCaXRtYXBUZXh0
dXJlPiBzdXJmYWNlOworCisgICAgaWYgKCFzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFj
ZSgpKSB7CisgICAgICAgIHBhaW50T3B0aW9ucy5vcGFjaXR5ID0gb3BhY2l0eTsKKyAgICAgICAg
cGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShwYWludE9wdGlvbnMpOworICAgICAgICBy
ZXR1cm47CiAgICAgfQogCi0gICAgc3VyZmFjZSA9IG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YWNx
dWlyZVRleHR1cmVGcm9tUG9vbChvcHRpb25zLnRleHR1cmVNYXBwZXItPnZpZXdwb3J0U2l6ZSgp
KTsKLSAgICBvcHRpb25zRm9yRGVzY2VuZGFudHMuc3VyZmFjZSA9IHN1cmZhY2UuZ2V0KCk7Ci0g
ICAgb3B0aW9ucy5pc1N1cmZhY2UgPSB0cnVlOwotICAgIG9wdGlvbnNGb3JEZXNjZW5kYW50cy5v
cGFjaXR5ID0gMTsKKyAgICAvLyBQcmVwYXJlIGEgc3VyZmFjZSB0byBwYWludCBpbnRvLgorICAg
IC8vIFdlIHBhaW50IGludG8gdGhlIHN1cmZhY2UgaWdub3JpbmcgdGhlIG9wYWNpdHkvdHJhbnNm
b3JtIG9mIHRoZSBjdXJyZW50IGxheWVyLgorICAgIHN1cmZhY2VSZWN0ID0gaW50ZXJtZWRpYXRl
U3VyZmFjZVJlY3QoKTsKKyAgICBzdXJmYWNlID0gb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5hY3F1
aXJlVGV4dHVyZUZyb21Qb29sKHN1cmZhY2VSZWN0LnNpemUoKSk7CiAgICAgb3B0aW9ucy50ZXh0
dXJlTWFwcGVyLT5iaW5kU3VyZmFjZShzdXJmYWNlLmdldCgpKTsKKyAgICBwYWludE9wdGlvbnMu
b3BhY2l0eSA9IDE7CiAKLSAgICBwYWludFNlbGZBbmRDaGlsZHJlbihvcHRpb25zLCBvcHRpb25z
Rm9yRGVzY2VuZGFudHMpOworICAgIC8vIFdlIGhhdmUgdG8gdXNlIGNvbWJpbmVkRm9yQ2hpbGRy
ZW4oKSBhbmQgbm90IGNvbWJpbmVkKCksIG90aGVyd2lzZSBwcmVzZXJ2ZS0zRCBkb2Vzbid0IHdv
cmsuCisgICAgcGFpbnRPcHRpb25zLnRyYW5zZm9ybSA9IG1fdHJhbnNmb3JtLmNvbWJpbmVkRm9y
Q2hpbGRyZW4oKS5pbnZlcnNlKCk7CisgICAgcGFpbnRPcHRpb25zLm9mZnNldCA9IC1JbnRTaXpl
KHN1cmZhY2VSZWN0LngoKSwgc3VyZmFjZVJlY3QueSgpKTsKIAotICAgIGlmICghcGFpbnRSZWZs
ZWN0aW9uKG9wdGlvbnMsIHN1cmZhY2UuZ2V0KCkpKSB7Ci0gICAgICAgIG9wdGlvbnMudGV4dHVy
ZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0aW9ucy5zdXJmYWNlKTsKLSAgICAgICAgb3B0aW9ucy50
ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3VyZmFjZS5nZXQoKSwgdmlld3BvcnRSZWN0LCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCBvcHRpb25zLm9wYWNpdHksIG1hc2tTdXJmYWNlLmdldCgp
KTsKLSAgICB9CisgICAgcGFpbnRTZWxmQW5kQ2hpbGRyZW5XaXRoUmVwbGljYShwYWludE9wdGlv
bnMpOwogCi0gICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5yZWxlYXNlVGV4dHVyZVRvUG9vbChz
dXJmYWNlLmdldCgpKTsKLSAgICBvcHRpb25zLnRleHR1cmVNYXBwZXItPnJlbGVhc2VUZXh0dXJl
VG9Qb29sKG1hc2tTdXJmYWNlLmdldCgpKTsKKyAgICAvLyBJZiB3ZSBwYWludGVkIHRoZSByZXBs
aWNhLCB0aGUgbWFzayBpcyBhbHJlYWR5IGFwcGxpZWQgc28gd2UgZG9uJ3QgbmVlZCB0byBwYWlu
dCBpdCBhZ2Fpbi4KKyAgICBpZiAobV9zdGF0ZS5yZXBsaWNhTGF5ZXIpCisgICAgICAgIG1hc2tU
ZXh0dXJlID0gMDsKKworICAgIG9wdGlvbnMudGV4dHVyZU1hcHBlci0+YmluZFN1cmZhY2Uob3B0
aW9ucy5zdXJmYWNlKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0YXJnZXRUcmFuc2Zvcm0g
PQorICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgob3B0aW9ucy50cmFuc2Zvcm0pCisg
ICAgICAgICAgICAgICAgLm11bHRpcGx5KG1fdHJhbnNmb3JtLmNvbWJpbmVkKCkpCisgICAgICAg
ICAgICAgICAgLnRyYW5zbGF0ZShvcHRpb25zLm9mZnNldC53aWR0aCgpLCBvcHRpb25zLm9mZnNl
dC5oZWlnaHQoKSk7CisgICAgb3B0aW9ucy50ZXh0dXJlTWFwcGVyLT5kcmF3VGV4dHVyZSgqc3Vy
ZmFjZS5nZXQoKSwgc3VyZmFjZVJlY3QsIHRhcmdldFRyYW5zZm9ybSwgb3BhY2l0eSwgbWFza1Rl
eHR1cmUuZ2V0KCkpOwogfQogCiBUZXh0dXJlTWFwcGVyTm9kZTo6flRleHR1cmVNYXBwZXJOb2Rl
KCkKQEAgLTY4NSw2ICs2MDYsNyBAQCB2b2lkIFRleHR1cmVNYXBwZXJOb2RlOjpzeW5jQ29tcG9z
aXRpbmdTdGF0ZVNlbGYoR3JhcGhpY3NMYXllclRleHR1cmVNYXBwZXIqIGdyYQogICAgIG1fc3Rh
dGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gZ3JhcGhpY3NMYXllci0+YmFja2ZhY2VWaXNpYmlsaXR5
KCk7CiAgICAgbV9zdGF0ZS5jaGlsZHJlblRyYW5zZm9ybSA9IGdyYXBoaWNzTGF5ZXItPmNoaWxk
cmVuVHJhbnNmb3JtKCk7CiAgICAgbV9zdGF0ZS5vcGFjaXR5ID0gZ3JhcGhpY3NMYXllci0+b3Bh
Y2l0eSgpOworCiAgICAgbV9jdXJyZW50Q29udGVudC5jb250ZW50VHlwZSA9IHBlbmRpbmdDb250
ZW50LmNvbnRlbnRUeXBlOwogICAgIG1fY3VycmVudENvbnRlbnQuaW1hZ2UgPSBwZW5kaW5nQ29u
dGVudC5pbWFnZTsKICAgICBtX2N1cnJlbnRDb250ZW50Lm1lZGlhID0gcGVuZGluZ0NvbnRlbnQu
bWVkaWE7CkBAIC05MzYsNyArODU4LDYgQEAgdm9pZCBUZXh0dXJlTWFwcGVyTm9kZTo6c3luY0Nv
bXBvc2l0aW5nU3RhdGUoR3JhcGhpY3NMYXllclRleHR1cmVNYXBwZXIqIGdyYXBoaWMKICAgICBz
eW5jQW5pbWF0aW9ucyhncmFwaGljc0xheWVyKTsKIAogICAgIGNvbXB1dGVUaWxlcygpOwotICAg
IGNvbXB1dGVPdmVybGFwc0lmTmVlZGVkKCk7CiAKICAgICBpZiAoZ3JhcGhpY3NMYXllcikKICAg
ICAgICAgcmVuZGVyQ29udGVudCh0ZXh0dXJlTWFwcGVyLCBncmFwaGljc0xheWVyKTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC9UZXh0dXJlTWFw
cGVyTm9kZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1
cmVNYXBwZXJOb2RlLmgKaW5kZXggM2RjYjI4MzNjOWRjOThmMDZiMzJmNjY1ZDg3ZDljOTZkOTg3
YTMyNi4uZTY0NjcyYjkyMzBkMjc2OTc3NDgwNjVkMGQwMDk1NWNiMDAxMGNhMyAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1cmVNYXBwZXJO
b2RlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL1RleHR1
cmVNYXBwZXJOb2RlLmgKQEAgLTQ0LDE1ICs0NCwxNiBAQCBjbGFzcyBHcmFwaGljc0xheWVyVGV4
dHVyZU1hcHBlcjsKIGNsYXNzIFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMgewogcHVibGljOgog
ICAgIEJpdG1hcFRleHR1cmUqIHN1cmZhY2U7Ci0gICAgVGV4dHVyZU1hcHBlciogdGV4dHVyZU1h
cHBlcjsKLQorICAgIEJpdG1hcFRleHR1cmUqIG1hc2s7CiAgICAgZmxvYXQgb3BhY2l0eTsKLSAg
ICBib29sIGlzU3VyZmFjZTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm07Cisg
ICAgSW50U2l6ZSBvZmZzZXQ7CisgICAgVGV4dHVyZU1hcHBlciogdGV4dHVyZU1hcHBlcjsKICAg
ICBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zKCkKICAgICAgICAgOiBzdXJmYWNlKDApCi0gICAg
ICAgICwgdGV4dHVyZU1hcHBlcigwKQorICAgICAgICAsIG1hc2soMCkKICAgICAgICAgLCBvcGFj
aXR5KDEpCi0gICAgICAgICwgaXNTdXJmYWNlKGZhbHNlKQorICAgICAgICAsIHRleHR1cmVNYXBw
ZXIoMCkKICAgICB7IH0KIH07CiAKQEAgLTE3OCw4ICsxNzksOSBAQCBwcml2YXRlOgogICAgIHZv
aWQgY29tcHV0ZVRyYW5zZm9ybXNSZWN1cnNpdmUoKTsKICAgICB2b2lkIGNvbXB1dGVPdmVybGFw
c0lmTmVlZGVkKCk7CiAgICAgdm9pZCBjb21wdXRlVGlsZXMoKTsKKyAgICBJbnRSZWN0IGludGVy
bWVkaWF0ZVN1cmZhY2VSZWN0KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisgICAgSW50
UmVjdCBpbnRlcm1lZGlhdGVTdXJmYWNlUmVjdCgpOwogICAgIHZvaWQgc3dhcENvbnRlbnRzQnVm
ZmVycygpOwotICAgIGludCBjb3VudERlc2NlbmRhbnRzV2l0aENvbnRlbnQoKSBjb25zdDsKICAg
ICBGbG9hdFJlY3QgdGFyZ2V0UmVjdEZvclRpbGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdG90YWxU
YXJnZXRSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0KSBjb25zdDsKICAgICB2b2lkIGlu
dmFsaWRhdGVWaWV3cG9ydChjb25zdCBGbG9hdFJlY3QmKTsKICAgICB2b2lkIG5vdGlmeUNoYW5n
ZShDaGFuZ2VNYXNrKTsKQEAgLTE5MCwxMCArMTkyLDEwIEBAIHByaXZhdGU6CiAKICAgICBCaXRt
YXBUZXh0dXJlKiB0ZXh0dXJlKCkgeyByZXR1cm4gbV9vd25lZFRpbGVzLmlzRW1wdHkoKSA/IDAg
OiBtX293bmVkVGlsZXNbMF0udGV4dHVyZS5nZXQoKTsgfQogCi0gICAgdm9pZCBwYWludFJlY3Vy
c2l2ZShUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zKTsKLSAgICBib29sIHBhaW50UmVmbGVjdGlv
bihjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRpb25zJiwgQml0bWFwVGV4dHVyZSogc3VyZmFj
ZSk7CisgICAgdm9pZCBwYWludFJlY3Vyc2l2ZShjb25zdCBUZXh0dXJlTWFwcGVyUGFpbnRPcHRp
b25zJik7CiAgICAgdm9pZCBwYWludFNlbGYoY29uc3QgVGV4dHVyZU1hcHBlclBhaW50T3B0aW9u
cyYpOwotICAgIHZvaWQgcGFpbnRTZWxmQW5kQ2hpbGRyZW4oY29uc3QgVGV4dHVyZU1hcHBlclBh
aW50T3B0aW9ucyYsIFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmIG9wdGlvbnNGb3JEZXNjZW5k
YW50cyk7CisgICAgdm9pZCBwYWludFNlbGZBbmRDaGlsZHJlbihjb25zdCBUZXh0dXJlTWFwcGVy
UGFpbnRPcHRpb25zJik7CisgICAgdm9pZCBwYWludFNlbGZBbmRDaGlsZHJlbldpdGhSZXBsaWNh
KGNvbnN0IFRleHR1cmVNYXBwZXJQYWludE9wdGlvbnMmKTsKICAgICB2b2lkIHJlbmRlckNvbnRl
bnQoVGV4dHVyZU1hcHBlciosIEdyYXBoaWNzTGF5ZXIqKTsKIAogICAgIHZvaWQgc3luY0FuaW1h
dGlvbnMoR3JhcGhpY3NMYXllclRleHR1cmVNYXBwZXIqKTsKQEAgLTIwMyw3ICsyMDUsOCBAQCBw
cml2YXRlOgogICAgIHZvaWQgYXBwbHlUcmFuc2Zvcm1BbmltYXRpb24oY29uc3QgVGV4dHVyZU1h
cHBlckFuaW1hdGlvbiYsIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHN0YXJ0LCBjb25zdCBU
cmFuc2Zvcm1PcGVyYXRpb25zKiBlbmQsIGRvdWJsZSk7CiAgICAgYm9vbCBoYXNPcGFjaXR5QW5p
bWF0aW9uKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNUcmFuc2Zvcm1BbmltYXRpb24oKSBjb25zdDsK
LSAgICBib29sIGhhc01vcmVUaGFuT25lVGlsZSgpIGNvbnN0OworICAgIGJvb2wgaXNWaXNpYmxl
KCkgY29uc3Q7CisgICAgYm9vbCBzaG91bGRQYWludFRvSW50ZXJtZWRpYXRlU3VyZmFjZSgpIGNv
bnN0OwogCiAgICAgTGF5ZXJUcmFuc2Zvcm0gbV90cmFuc2Zvcm07CiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>