<?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>63847</bug_id>
          
          <creation_ts>2011-07-01 14:20:22 -0700</creation_ts>
          <short_desc>[chromium] Externalize layer visibility calculation</short_desc>
          <delta_ts>2011-07-06 13:56:38 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="James Robinson">jamesr</reporter>
          <assigned_to name="James Robinson">jamesr</assigned_to>
          <cc>enne</cc>
    
    <cc>kbr</cc>
    
    <cc>nduca</cc>
    
    <cc>senorblanco</cc>
    
    <cc>vangelis</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>431441</commentid>
    <comment_count>0</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-01 14:20:22 -0700</bug_when>
    <thetext>[chromium] Externalize layer visibility calculation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431467</commentid>
    <comment_count>1</comment_count>
      <attachid>99526</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-01 14:47:57 -0700</bug_when>
    <thetext>Created attachment 99526
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431492</commentid>
    <comment_count>2</comment_count>
      <attachid>99526</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-07-01 15:36:23 -0700</bug_when>
    <thetext>Comment on attachment 99526
Patch

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

A few small questions.  In general, I really like where this is going.  :)

&gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:151
&gt;  TransformationMatrix ContentLayerChromium::tilingTransform()

Can this get pushed into LayerChromium? It&apos;d help with your ImageLayer/ContentLayer split.  It&apos;s also not really a tiling transform anymore.  It&apos;s now the scale that needs to be applied to the contents, so maybe it needs a slightly different name.

&gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:202
&gt; -void ContentLayerChromium::draw(const IntRect&amp; targetSurfaceRect)
&gt; +void ContentLayerChromium::draw()
&gt;  {
&gt; -    const TransformationMatrix transform = tilingTransform();
&gt; -    IntRect layerRect = visibleLayerRect(targetSurfaceRect);
&gt; +    const IntRect&amp; layerRect = visibleLayerRect();
&gt;      if (!layerRect.isEmpty())
&gt; -        m_tiler-&gt;draw(layerRect, transform, ccLayerImpl()-&gt;drawOpacity(), m_textureUpdater.get());
&gt; +        m_tiler-&gt;draw(layerRect, tilingTransform(), ccLayerImpl()-&gt;drawOpacity(), m_textureUpdater.get());
&gt;  }

Maybe I&apos;m just not following this, but tilingTransform() appears to longer include the translation of half the layer bounds so that the origin is the top left corner.  How does this continue to work the same way as before this patch without any changes to LayerTilerChromium?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431497</commentid>
    <comment_count>3</comment_count>
      <attachid>99526</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-01 15:58:04 -0700</bug_when>
    <thetext>Comment on attachment 99526
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:202
&gt;&gt;  }
&gt; 
&gt; Maybe I&apos;m just not following this, but tilingTransform() appears to longer include the translation of half the layer bounds so that the origin is the top left corner.  How does this continue to work the same way as before this patch without any changes to LayerTilerChromium?

there&apos;s the translate in tilingTransform() line 159 in this patch. is that what you mean?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431503</commentid>
    <comment_count>4</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-07-01 16:02:35 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 99526 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=99526&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:202
&gt; &gt;&gt;  }
&gt; &gt; 
&gt; &gt; Maybe I&apos;m just not following this, but tilingTransform() appears to longer include the translation of half the layer bounds so that the origin is the top left corner.  How does this continue to work the same way as before this patch without any changes to LayerTilerChromium?
&gt; 
&gt; there&apos;s the translate in tilingTransform() line 159 in this patch. is that what you mean?

Oh, yes.  I was just misreading the diff.  :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431524</commentid>
    <comment_count>5</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-01 16:33:25 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 99526 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=99526&amp;action=review
&gt; 
&gt; A few small questions.  In general, I really like where this is going.  :)
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:151
&gt; &gt;  TransformationMatrix ContentLayerChromium::tilingTransform()
&gt; 
&gt; Can this get pushed into LayerChromium? It&apos;d help with your ImageLayer/ContentLayer split.  It&apos;s also not really a tiling transform anymore.  It&apos;s now the scale that needs to be applied to the contents, so maybe it needs a slightly different name.
&gt; 

That&apos;s a good point.  The main reason I left it on ContentLayerChromium is I&apos;m still not entirely sure how the tiling transform and the draw transform are supposed to interact.  My initial instinct was to just do all of this in the draw transform, but I couldn&apos;t get the math worked out properly for sublayers, and maybe they are separate concepts after all.

Anyway leaving it down on ContentLayerChromium is a slightly smaller delta from the status quo (which is nice) and it actually merged really well with the content/image layer split (I&apos;ve merged together all the branches locally to make sure).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431552</commentid>
    <comment_count>6</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-07-01 17:37:46 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #2)
&gt; &gt; (From update of attachment 99526 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=99526&amp;action=review
&gt; &gt; 
&gt; &gt; A few small questions.  In general, I really like where this is going.  :)
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:151
&gt; &gt; &gt;  TransformationMatrix ContentLayerChromium::tilingTransform()
&gt; &gt; 
&gt; &gt; Can this get pushed into LayerChromium? It&apos;d help with your ImageLayer/ContentLayer split.  It&apos;s also not really a tiling transform anymore.  It&apos;s now the scale that needs to be applied to the contents, so maybe it needs a slightly different name.
&gt; &gt; 
&gt; 
&gt; That&apos;s a good point.  The main reason I left it on ContentLayerChromium is I&apos;m still not entirely sure how the tiling transform and the draw transform are supposed to interact.  My initial instinct was to just do all of this in the draw transform, but I couldn&apos;t get the math worked out properly for sublayers, and maybe they are separate concepts after all.

We could certainly clean up that distinction in a separate patch.

&gt; Anyway leaving it down on ContentLayerChromium is a slightly smaller delta from the status quo (which is nice) and it actually merged really well with the content/image layer split (I&apos;ve merged together all the branches locally to make sure).

In that case, that sounds fine to me.

Unofficially, it looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431570</commentid>
    <comment_count>7</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-01 18:53:27 -0700</bug_when>
    <thetext>Cool, thanks!  Ken or Stephen - would you mind giving this an official review?  Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431953</commentid>
    <comment_count>8</comment_count>
      <attachid>99526</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-07-04 09:00:06 -0700</bug_when>
    <thetext>Comment on attachment 99526
Patch

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

I leave it up to you to decide if my comments are relevant here.

Looks good.  r=me.

&gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:156
&gt; +    transform.scaleNonUniform(bounds().width() / static_cast&lt;double&gt;(contentBounds().width()),
&gt; +                              bounds().height() / static_cast&lt;double&gt;(contentBounds().height()));

This could be a div-zero if contentBounds() has zero width or height.  Dunno if that&apos;s an issue here.

&gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:370
&gt; +    transform.scaleNonUniform(bounds.width() / static_cast&lt;double&gt;(contentBounds.width()),
&gt; +                              bounds.height() / static_cast&lt;double&gt;(contentBounds.height()));

Same as above; potential div-zero.

&gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:449
&gt; +                    maskLayer-&gt;setVisibleLayerRect(IntRect(IntPoint(), maskLayer-&gt;contentBounds()));
&gt; +                    maskLayer-&gt;paintContentsIfDirty();

This function-pair is called four times here; could potentially be refactored.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432974</commentid>
    <comment_count>9</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-06 13:24:11 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 99526 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=99526&amp;action=review
&gt; 
&gt; I leave it up to you to decide if my comments are relevant here.
&gt; 
&gt; Looks good.  r=me.

Thanks!

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/ContentLayerChromium.cpp:156
&gt; &gt; +    transform.scaleNonUniform(bounds().width() / static_cast&lt;double&gt;(contentBounds().width()),
&gt; &gt; +                              bounds().height() / static_cast&lt;double&gt;(contentBounds().height()));
&gt; 
&gt; This could be a div-zero if contentBounds() has zero width or height.  Dunno if that&apos;s an issue here.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:370
&gt; &gt; +    transform.scaleNonUniform(bounds.width() / static_cast&lt;double&gt;(contentBounds.width()),
&gt; &gt; +                              bounds.height() / static_cast&lt;double&gt;(contentBounds.height()));
&gt; 
&gt; Same as above; potential div-zero.

Good point on both counts, I&apos;ll add some early-outs for empty contentBounds().

&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:449
&gt; &gt; +                    maskLayer-&gt;setVisibleLayerRect(IntRect(IntPoint(), maskLayer-&gt;contentBounds()));
&gt; &gt; +                    maskLayer-&gt;paintContentsIfDirty();
&gt; 
&gt; This function-pair is called four times here; could potentially be refactored.

I&apos;ll add a helper.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>433010</commentid>
    <comment_count>10</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-07-06 13:56:38 -0700</bug_when>
    <thetext>Committed r90492: &lt;http://trac.webkit.org/changeset/90492&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99526</attachid>
            <date>2011-07-01 14:47:57 -0700</date>
            <delta_ts>2011-07-04 09:00:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-63847-20110701144756.patch</filename>
            <type>text/plain</type>
            <size>33146</size>
            <attacher name="James Robinson">jamesr</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTAyNjcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAwMjg2ZDkzYzM3MGQ0N2Y0
NGFlM2U3ZTBlN2U4YTNiODVlYjQ4NTc4Li41ZGM4YTJlNzdjMWU2YWVmYmQzZWU3NDlmNzI4YWEw
MGI5YzA2MWI0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjAgQEAKKzIwMTEtMDctMDEgIEphbWVz
IFJvYmluc29uICA8amFtZXNyQGNocm9taXVtLm9yZz4KKworICAgICAgICBbY2hyb21pdW1dIEV4
dGVybmFsaXplIGxheWVyIHZpc2liaWxpdHkgY2FsY3VsYXRpb24KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzODQ3CisKKyAgICAgICAgVGhpcyBtb3Zl
cyB0aGUgbGF5ZXIgdmlzaWJpbGl0eSBjYWxjdWxhdGlvbiBmcm9tIHRoZSBsYXllciBpdHNlbGYg
b3V0IHRvIExheWVyUmVuZGVyZXJDaHJvbWl1bSwgbGlrZSB0aGUgb3RoZXIKKyAgICAgICAgY2Fs
Y3VsYXRlZCBwcm9wZXJ0aWVzLiAgUHJldmlvdXNseSwgd2Ugd2VyZSBkb2luZyB0aGlzIGNhbGN1
bGF0aW5nIGF0IHBhaW50IHRpbWUgYW5kIGFnYWluIGF0IGRyYXcgdGltZSBhbmQKKyAgICAgICAg
cmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IHRoaXMgcHJvZHVjZWQgdGhlIHNhbWUgdmFsdWUuICBU
aGlzIGF2b2lkcyB0aGUgcmVkdW5kYW50IGNhbGN1bGF0aW9uLgorCisgICAgICAgIENvdmVyZWQg
YnkgZXhpc3RpbmcgY29tcG9zaXRpbmcvIGxheW91dCB0ZXN0cy4KKworICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRlbnRMYXllckNocm9taXVtOjpDb250ZW50TGF5ZXJDaHJvbWl1bSk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb250ZW50TGF5ZXJDaHJvbWl1bTo6cGFpbnRDb250ZW50c0lmRGly
dHkpOgorICAgICAgICAoV2ViQ29yZTo6Q29udGVudExheWVyQ2hyb21pdW06OnRpbGluZ1RyYW5z
Zm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50TGF5ZXJDaHJvbWl1bTo6Y29udGVudEJv
dW5kcyk6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50TGF5ZXJDaHJvbWl1bTo6dXBkYXRlTGF5
ZXJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRMYXllckNocm9taXVtOjpkcmF3KToK
KyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRMYXllckNocm9taXVtOjpzZXRUaWxpbmdPcHRpb24p
OgorICAgICAgICAoV2ViQ29yZTo6Q29udGVudExheWVyQ2hyb21pdW06OnNldElzTWFzayk6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0u
aDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9JbWFnZUxheWVyQ2hyb21p
dW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VMYXllckNocm9taXVtOjpwYWludENvbnRl
bnRzSWZEaXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUxheWVyQ2hyb21pdW06OmNvbnRl
bnRCb3VuZHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ltYWdlTGF5
ZXJDaHJvbWl1bS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVy
Q2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6cHVzaFByb3Bl
cnRpZXNUbyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJv
bWl1bS5oOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVudEJvdW5kcyk6
CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjp2aXNpYmxlTGF5ZXJSZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNldFZpc2libGVMYXllclJlY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6ZHJhdyk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmNhbGN1bGF0ZVZpc2libGVMYXllclJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJSZW5kZXJlckNocm9taXVtOjpwYWludExheWVyQ29udGVudHMpOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJlckNocm9taXVtOjpkcmF3TGF5ZXIpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJTdXJmYWNlQ2hyb21pdW06OmRyYXcpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDQ2FudmFzTGF5ZXJJbXBsLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkNDQ2FudmFzTGF5ZXJJbXBsOjpkcmF3KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ0NhbnZhc0xheWVySW1wbC5oOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkNDTGF5ZXJJbXBsOjpkcmF3KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ0xheWVySW1wbC5oOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllckltcGw6OmNvbnRl
bnRCb3VuZHMpOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllckltcGw6OnNldENvbnRlbnRCb3Vu
ZHMpOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllckltcGw6OnZpc2libGVMYXllclJlY3QpOgor
ICAgICAgICAoV2ViQ29yZTo6Q0NMYXllckltcGw6OnNldFZpc2libGVMYXllclJlY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6Q0NMYXllckltcGw6OmRvdWJsZVNpZGVkKToKKyAgICAgICAgKFdlYkNv
cmU6OkNDTGF5ZXJJbXBsOjpzZXREb3VibGVTaWRlZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vY2MvQ0NQbHVnaW5MYXllckltcGwuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Q0NQbHVnaW5MYXllckltcGw6OmRyYXcpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDUGx1Z2luTGF5ZXJJbXBsLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vY2MvQ0NWaWRlb0xheWVySW1wbC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDQ1ZpZGVvTGF5ZXJJbXBsOjpkcmF3KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ1ZpZGVvTGF5ZXJJbXBsLmg6CisKIDIwMTEtMDctMDEgIFZhbmdlbGlzIEtv
a2tldmlzICA8dmFuZ2VsaXNAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEph
bWVzIFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0uY3BwCmluZGV4IDA4
ZTU3N2UxODVhZjRlYzY1MzQ4NmMxMmE4ZTQxNWU0NzBjM2YyMDcuLmI2YTUxOTMwYTgxZTZiMzQ0
NTdkYzk0ZWZkZjU4NmQxODA3YzdiMDggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJvbWl1
bS5jcHAKQEAgLTkyLDcgKzkyLDYgQEAgUGFzc1JlZlB0cjxDb250ZW50TGF5ZXJDaHJvbWl1bT4g
Q29udGVudExheWVyQ2hyb21pdW06OmNyZWF0ZShHcmFwaGljc0xheWVyQ2hyb20KIENvbnRlbnRM
YXllckNocm9taXVtOjpDb250ZW50TGF5ZXJDaHJvbWl1bShHcmFwaGljc0xheWVyQ2hyb21pdW0q
IG93bmVyKQogICAgIDogTGF5ZXJDaHJvbWl1bShvd25lcikKICAgICAsIG1fdGlsaW5nT3B0aW9u
KENvbnRlbnRMYXllckNocm9taXVtOjpBdXRvVGlsZSkKLSAgICAsIG1faXNNYXNrKGZhbHNlKQog
ewogfQogCkBAIC0xMDEsMTkgKzEwMCwxOSBAQCBDb250ZW50TGF5ZXJDaHJvbWl1bTo6fkNvbnRl
bnRMYXllckNocm9taXVtKCkKICAgICBjbGVhbnVwUmVzb3VyY2VzKCk7CiB9CiAKLXZvaWQgQ29u
dGVudExheWVyQ2hyb21pdW06OnBhaW50Q29udGVudHNJZkRpcnR5KGNvbnN0IEludFJlY3QmIHRh
cmdldFN1cmZhY2VSZWN0KQordm9pZCBDb250ZW50TGF5ZXJDaHJvbWl1bTo6cGFpbnRDb250ZW50
c0lmRGlydHkoKQogewogICAgIEFTU0VSVChkcmF3c0NvbnRlbnQoKSk7CiAgICAgQVNTRVJUKGxh
eWVyUmVuZGVyZXIoKSk7CiAKLSAgICB1cGRhdGVMYXllclNpemUobGF5ZXJCb3VuZHMoKS5zaXpl
KCkpOworICAgIHVwZGF0ZUxheWVyU2l6ZSgpOwogCi0gICAgSW50UmVjdCBsYXllclJlY3QgPSB2
aXNpYmxlTGF5ZXJSZWN0KHRhcmdldFN1cmZhY2VSZWN0KTsKKyAgICBjb25zdCBJbnRSZWN0JiBs
YXllclJlY3QgPSB2aXNpYmxlTGF5ZXJSZWN0KCk7CiAgICAgaWYgKGxheWVyUmVjdC5pc0VtcHR5
KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIEludFJlY3QgZGlydHkgPSBlbmNsb3NpbmdJbnRS
ZWN0KG1fZGlydHlSZWN0KTsKLSAgICBkaXJ0eS5pbnRlcnNlY3QobGF5ZXJCb3VuZHMoKSk7Cisg
ICAgZGlydHkuaW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQoKSwgY29udGVudEJvdW5kcygpKSk7
CiAgICAgbV90aWxlci0+aW52YWxpZGF0ZVJlY3QoZGlydHkpOwogCiAgICAgaWYgKCFkcmF3c0Nv
bnRlbnQoKSkKQEAgLTE1Miw2NiArMTUxLDMzIEBAIHZvaWQgQ29udGVudExheWVyQ2hyb21pdW06
OmNyZWF0ZVRleHR1cmVVcGRhdGVySWZOZWVkZWQoKQogVHJhbnNmb3JtYXRpb25NYXRyaXggQ29u
dGVudExheWVyQ2hyb21pdW06OnRpbGluZ1RyYW5zZm9ybSgpCiB7CiAgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggdHJhbnNmb3JtID0gY2NMYXllckltcGwoKS0+ZHJhd1RyYW5zZm9ybSgpOwotICAg
IC8vIFRpbGVyIGRyYXdzIGZyb20gdGhlIHVwcGVyIGxlZnQgY29ybmVyLiBUaGUgZHJhdyB0cmFu
c2Zvcm0KLSAgICAvLyBzcGVjaWZpZXMgdGhlIG1pZGRsZSBvZiB0aGUgbGF5ZXIuCi0gICAgSW50
U2l6ZSBzaXplID0gYm91bmRzKCk7Ci0gICAgdHJhbnNmb3JtLnRyYW5zbGF0ZSgtc2l6ZS53aWR0
aCgpIC8gMi4wLCAtc2l6ZS5oZWlnaHQoKSAvIDIuMCk7CiAKLSAgICByZXR1cm4gdHJhbnNmb3Jt
OwotfQorICAgIHRyYW5zZm9ybS5zY2FsZU5vblVuaWZvcm0oYm91bmRzKCkud2lkdGgoKSAvIHN0
YXRpY19jYXN0PGRvdWJsZT4oY29udGVudEJvdW5kcygpLndpZHRoKCkpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYm91bmRzKCkuaGVpZ2h0KCkgLyBzdGF0aWNfY2FzdDxkb3VibGU+
KGNvbnRlbnRCb3VuZHMoKS5oZWlnaHQoKSkpOwogCi1JbnRSZWN0IENvbnRlbnRMYXllckNocm9t
aXVtOjp2aXNpYmxlTGF5ZXJSZWN0KGNvbnN0IEludFJlY3QmIHRhcmdldFN1cmZhY2VSZWN0KQot
ewotICAgIGlmICh0YXJnZXRTdXJmYWNlUmVjdC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiB0
YXJnZXRTdXJmYWNlUmVjdDsKLQotICAgIGNvbnN0IEludFJlY3QgbGF5ZXJCb3VuZFJlY3QgPSBs
YXllckJvdW5kcygpOwotCi0gICAgLy8gTWFzayBsYXllcnMgZG9uJ3QgaGF2ZSB0aGVpciBvd24g
ZHJhdyB0cmFuc2Zvcm0gc28gd2UgcmV0dXJuIHRoZSBlbnRpcmUKLSAgICAvLyBsYXllciBib3Vu
ZHMgYXMgdGhlIHZpc2libGUgcmVjdC4KLSAgICBpZiAobV9pc01hc2spCi0gICAgICAgIHJldHVy
biBsYXllckJvdW5kUmVjdDsKLQotICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5z
Zm9ybSA9IHRpbGluZ1RyYW5zZm9ybSgpOwotCi0gICAgLy8gSXMgdGhpcyBsYXllciBmdWxseSBj
b250YWluZWQgd2l0aGluIHRoZSB0YXJnZXQgc3VyZmFjZT8KLSAgICBJbnRSZWN0IGxheWVySW5T
dXJmYWNlU3BhY2UgPSB0cmFuc2Zvcm0ubWFwUmVjdChsYXllckJvdW5kUmVjdCk7Ci0gICAgaWYg
KHRhcmdldFN1cmZhY2VSZWN0LmNvbnRhaW5zKGxheWVySW5TdXJmYWNlU3BhY2UpKQotICAgICAg
ICByZXR1cm4gbGF5ZXJCb3VuZFJlY3Q7Ci0KLSAgICAvLyBJZiB0aGUgbGF5ZXIgZG9lc24ndCBm
aWxsIHVwIHRoZSBlbnRpcmUgc3VyZmFjZSwgdGhlbiBmaW5kIHRoZSBwYXJ0IG9mCi0gICAgLy8g
dGhlIHN1cmZhY2UgcmVjdCB3aGVyZSB0aGUgbGF5ZXIgY291bGQgYmUgdmlzaWJsZS4gVGhpcyBh
dm9pZHMgdHJ5aW5nIHRvCi0gICAgLy8gcHJvamVjdCBzdXJmYWNlIHJlY3QgcG9pbnRzIHRoYXQg
YXJlIGJlaGluZCB0aGUgcHJvamVjdGlvbiBwb2ludC4KLSAgICBJbnRSZWN0IG1pbmltYWxTdXJm
YWNlUmVjdCA9IHRhcmdldFN1cmZhY2VSZWN0OwotICAgIG1pbmltYWxTdXJmYWNlUmVjdC5pbnRl
cnNlY3QobGF5ZXJJblN1cmZhY2VTcGFjZSk7Ci0KLSAgICAvLyBQcm9qZWN0IHRoZSBjb3JuZXJz
IG9mIHRoZSB0YXJnZXQgc3VyZmFjZSByZWN0IGludG8gdGhlIGxheWVyIHNwYWNlLgotICAgIC8v
IFRoaXMgYm91bmRpbmcgcmVjdGFuZ2xlIG1heSBiZSBsYXJnZXIgdGhhbiBpdCBuZWVkcyB0byBi
ZSAoYmVpbmcKLSAgICAvLyBheGlzLWFsaWduZWQpLCBidXQgaXMgYSByZWFzb25hYmxlIGZpbHRl
ciBvbiB0aGUgc3BhY2UgdG8gY29uc2lkZXIuCi0gICAgLy8gTm9uLWludmVydGlibGUgdHJhbnNm
b3JtcyB3aWxsIGNyZWF0ZSBhbiBlbXB0eSByZWN0IGhlcmUuCi0gICAgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXggc3VyZmFjZVRvTGF5ZXIgPSB0cmFuc2Zvcm0uaW52ZXJzZSgpOwotICAgIElu
dFJlY3QgbGF5ZXJSZWN0ID0gc3VyZmFjZVRvTGF5ZXIucHJvamVjdFF1YWQoRmxvYXRRdWFkKEZs
b2F0UmVjdChtaW5pbWFsU3VyZmFjZVJlY3QpKSkuZW5jbG9zaW5nQm91bmRpbmdCb3goKTsKLSAg
ICBsYXllclJlY3QuaW50ZXJzZWN0KGxheWVyQm91bmRSZWN0KTsKLSAgICByZXR1cm4gbGF5ZXJS
ZWN0OworICAgIC8vIFRpbGVyIGRyYXdzIHdpdGggYSBkaWZmZXJlbnQgb3JpZ2luIGZyb20gb3Ro
ZXIgbGF5ZXJzLgorICAgIHRyYW5zZm9ybS50cmFuc2xhdGUoLWNvbnRlbnRCb3VuZHMoKS53aWR0
aCgpIC8gMi4wLCAtY29udGVudEJvdW5kcygpLmhlaWdodCgpIC8gMi4wKTsKKworICAgIHJldHVy
biB0cmFuc2Zvcm07CiB9CiAKLUludFJlY3QgQ29udGVudExheWVyQ2hyb21pdW06OmxheWVyQm91
bmRzKCkgY29uc3QKK0ludFNpemUgQ29udGVudExheWVyQ2hyb21pdW06OmNvbnRlbnRCb3VuZHMo
KSBjb25zdAogewotICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KDAsIDApLCBib3VuZHMoKSk7
CisgICAgcmV0dXJuIGJvdW5kcygpOwogfQogCi12b2lkIENvbnRlbnRMYXllckNocm9taXVtOjp1
cGRhdGVMYXllclNpemUoY29uc3QgSW50U2l6ZSYgbGF5ZXJTaXplKQordm9pZCBDb250ZW50TGF5
ZXJDaHJvbWl1bTo6dXBkYXRlTGF5ZXJTaXplKCkKIHsKICAgICBpZiAoIW1fdGlsZXIpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIGNvbnN0IEludFNpemUgdGlsZVNpemUobWluKGRlZmF1bHRUaWxl
U2l6ZSwgbGF5ZXJTaXplLndpZHRoKCkpLCBtaW4oZGVmYXVsdFRpbGVTaXplLCBsYXllclNpemUu
aGVpZ2h0KCkpKTsKKyAgICBjb25zdCBJbnRTaXplIHRpbGVTaXplKG1pbihkZWZhdWx0VGlsZVNp
emUsIGNvbnRlbnRCb3VuZHMoKS53aWR0aCgpKSwgbWluKGRlZmF1bHRUaWxlU2l6ZSwgY29udGVu
dEJvdW5kcygpLmhlaWdodCgpKSk7CiAKICAgICAvLyBUaWxlIGlmIGJvdGggZGltZW5zaW9ucyBs
YXJnZSwgb3IgYW55IG9uZSBkaW1lbnNpb24gbGFyZ2UgYW5kIHRoZSBvdGhlcgogICAgIC8vIGV4
dGVuZHMgaW50byBhIHNlY29uZCB0aWxlLiBUaGlzIGhldXJpc3RpYyBhbGxvd3MgZm9yIGxvbmcg
c2tpbm55IGxheWVycwogICAgIC8vIChlLmcuIHNjcm9sbGJhcnMpIHRoYXQgYXJlIE54MSB0aWxl
cyB0byBtaW5pbWl6ZSB3YXN0ZWQgdGV4dHVyZSBzcGFjZS4KLSAgICBjb25zdCBib29sIGFueURp
bWVuc2lvbkxhcmdlID0gbGF5ZXJTaXplLndpZHRoKCkgPiBtYXhVbnRpbGVkU2l6ZSB8fCBsYXll
clNpemUuaGVpZ2h0KCkgPiBtYXhVbnRpbGVkU2l6ZTsKLSAgICBjb25zdCBib29sIGFueURpbWVu
c2lvbk9uZVRpbGUgPSBsYXllclNpemUud2lkdGgoKSA8PSBkZWZhdWx0VGlsZVNpemUgfHwgbGF5
ZXJTaXplLmhlaWdodCgpIDw9IGRlZmF1bHRUaWxlU2l6ZTsKKyAgICBjb25zdCBib29sIGFueURp
bWVuc2lvbkxhcmdlID0gY29udGVudEJvdW5kcygpLndpZHRoKCkgPiBtYXhVbnRpbGVkU2l6ZSB8
fCBjb250ZW50Qm91bmRzKCkuaGVpZ2h0KCkgPiBtYXhVbnRpbGVkU2l6ZTsKKyAgICBjb25zdCBi
b29sIGFueURpbWVuc2lvbk9uZVRpbGUgPSBjb250ZW50Qm91bmRzKCkud2lkdGgoKSA8PSBkZWZh
dWx0VGlsZVNpemUgfHwgY29udGVudEJvdW5kcygpLmhlaWdodCgpIDw9IGRlZmF1bHRUaWxlU2l6
ZTsKICAgICBjb25zdCBib29sIGF1dG9UaWxlZCA9IGFueURpbWVuc2lvbkxhcmdlICYmICFhbnlE
aW1lbnNpb25PbmVUaWxlOwogCiAgICAgYm9vbCBpc1RpbGVkOwpAQCAtMjIyLDE4ICsxODgsMTcg
QEAgdm9pZCBDb250ZW50TGF5ZXJDaHJvbWl1bTo6dXBkYXRlTGF5ZXJTaXplKGNvbnN0IEludFNp
emUmIGxheWVyU2l6ZSkKICAgICBlbHNlCiAgICAgICAgIGlzVGlsZWQgPSBhdXRvVGlsZWQ7CiAK
LSAgICBJbnRTaXplIHJlcXVlc3RlZFNpemUgPSBpc1RpbGVkID8gdGlsZVNpemUgOiBsYXllclNp
emU7CisgICAgSW50U2l6ZSByZXF1ZXN0ZWRTaXplID0gaXNUaWxlZCA/IHRpbGVTaXplIDogY29u
dGVudEJvdW5kcygpOwogICAgIGNvbnN0IGludCBtYXhTaXplID0gbGF5ZXJSZW5kZXJlcigpLT5t
YXhUZXh0dXJlU2l6ZSgpOwogICAgIEludFNpemUgY2xhbXBlZFNpemUgPSByZXF1ZXN0ZWRTaXpl
LnNocnVua1RvKEludFNpemUobWF4U2l6ZSwgbWF4U2l6ZSkpOwogICAgIG1fdGlsZXItPnNldFRp
bGVTaXplKGNsYW1wZWRTaXplKTsKIH0KIAotdm9pZCBDb250ZW50TGF5ZXJDaHJvbWl1bTo6ZHJh
dyhjb25zdCBJbnRSZWN0JiB0YXJnZXRTdXJmYWNlUmVjdCkKK3ZvaWQgQ29udGVudExheWVyQ2hy
b21pdW06OmRyYXcoKQogewotICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9y
bSA9IHRpbGluZ1RyYW5zZm9ybSgpOwotICAgIEludFJlY3QgbGF5ZXJSZWN0ID0gdmlzaWJsZUxh
eWVyUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCk7CisgICAgY29uc3QgSW50UmVjdCYgbGF5ZXJSZWN0
ID0gdmlzaWJsZUxheWVyUmVjdCgpOwogICAgIGlmICghbGF5ZXJSZWN0LmlzRW1wdHkoKSkKLSAg
ICAgICAgbV90aWxlci0+ZHJhdyhsYXllclJlY3QsIHRyYW5zZm9ybSwgY2NMYXllckltcGwoKS0+
ZHJhd09wYWNpdHkoKSwgbV90ZXh0dXJlVXBkYXRlci5nZXQoKSk7CisgICAgICAgIG1fdGlsZXIt
PmRyYXcobGF5ZXJSZWN0LCB0aWxpbmdUcmFuc2Zvcm0oKSwgY2NMYXllckltcGwoKS0+ZHJhd09w
YWNpdHkoKSwgbV90ZXh0dXJlVXBkYXRlci5nZXQoKSk7CiB9CiAKIGJvb2wgQ29udGVudExheWVy
Q2hyb21pdW06OmRyYXdzQ29udGVudCgpIGNvbnN0CkBAIC0yNzEsNyArMjM2LDcgQEAgdm9pZCBD
b250ZW50TGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygpCiB2b2lkIENv
bnRlbnRMYXllckNocm9taXVtOjpzZXRUaWxpbmdPcHRpb24oVGlsaW5nT3B0aW9uIG9wdGlvbikK
IHsKICAgICBtX3RpbGluZ09wdGlvbiA9IG9wdGlvbjsKLSAgICB1cGRhdGVMYXllclNpemUoYm91
bmRzKCkpOworICAgIHVwZGF0ZUxheWVyU2l6ZSgpOwogfQogCiB2b2lkIENvbnRlbnRMYXllckNo
cm9taXVtOjpiaW5kQ29udGVudHNUZXh0dXJlKCkKQEAgLTI4OSw3ICsyNTQsNiBAQCB2b2lkIENv
bnRlbnRMYXllckNocm9taXVtOjpiaW5kQ29udGVudHNUZXh0dXJlKCkKIHZvaWQgQ29udGVudExh
eWVyQ2hyb21pdW06OnNldElzTWFzayhib29sIGlzTWFzaykKIHsKICAgICBzZXRUaWxpbmdPcHRp
b24oaXNNYXNrID8gTmV2ZXJUaWxlIDogQXV0b1RpbGUpOwotICAgIG1faXNNYXNrID0gaXNNYXNr
OwogfQogCiBzdGF0aWMgdm9pZCB3cml0ZUluZGVudChUZXh0U3RyZWFtJiB0cywgaW50IGluZGVu
dCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0NvbnRlbnRMYXllckNocm9taXVtLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJvbWl1bS5oCmluZGV4IDc4NGFiMzMxNDc2Njc5NTRh
MTFkNmJiZjBlYmNmYWE3MWQyMTJjZWUuLjliNTcwOTRlYmU1YTM3MmMzNzAyZGNiODc4M2E5ZjRm
MTViNjY2ZWQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29udGVudExheWVyQ2hyb21pdW0uaApAQCAtNTIsMTIgKzUy
LDEyIEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgfkNvbnRlbnRMYXllckNocm9taXVtKCk7CiAK
LSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRDb250ZW50c0lmRGlydHkoY29uc3QgSW50UmVjdCYgdGFy
Z2V0U3VyZmFjZVJlY3QpOworICAgIHZpcnR1YWwgdm9pZCBwYWludENvbnRlbnRzSWZEaXJ0eSgp
OwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKCk7CiAgICAgdmly
dHVhbCB2b2lkIHNldElzTWFzayhib29sKTsKICAgICB2aXJ0dWFsIHZvaWQgYmluZENvbnRlbnRz
VGV4dHVyZSgpOwogCi0gICAgdmlydHVhbCB2b2lkIGRyYXcoY29uc3QgSW50UmVjdCYgdGFyZ2V0
U3VyZmFjZVJlY3QpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3KCk7CiAgICAgdmlydHVhbCBib29s
IGRyYXdzQ29udGVudCgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CkBAIC02OSwxNSArNjksMTEgQEAg
cHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBjbGVhbnVwUmVzb3VyY2VzKCk7CiAgICAgdmly
dHVhbCB2b2lkIHNldExheWVyUmVuZGVyZXIoTGF5ZXJSZW5kZXJlckNocm9taXVtKik7CiAKLSAg
ICB2aXJ0dWFsIEludFJlY3QgbGF5ZXJCb3VuZHMoKSBjb25zdDsKKyAgICB2aXJ0dWFsIEludFNp
emUgY29udGVudEJvdW5kcygpIGNvbnN0OwogCi0gICAgdmlydHVhbCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCB0aWxpbmdUcmFuc2Zvcm0oKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0aWxpbmdU
cmFuc2Zvcm0oKTsKIAotICAgIC8vIEZvciBhIGdpdmVuIHJlbmRlciBzdXJmYWNlIHJlY3QgdGhh
dCB0aGlzIGxheWVyIHdpbGwgYmUgdHJhbnNmb3JtZWQgYW5kCi0gICAgLy8gZHJhd24gaW50bywg
cmV0dXJuIHRoZSBsYXllciBzcGFjZSByZWN0IHRoYXQgaXMgdmlzaWJsZSBpbiB0aGF0IHN1cmZh
Y2UuCi0gICAgSW50UmVjdCB2aXNpYmxlTGF5ZXJSZWN0KGNvbnN0IEludFJlY3QmKTsKLQotICAg
IHZvaWQgdXBkYXRlTGF5ZXJTaXplKGNvbnN0IEludFNpemUmKTsKKyAgICB2b2lkIHVwZGF0ZUxh
eWVyU2l6ZSgpOwogICAgIHZvaWQgY3JlYXRlVGlsZXJJZk5lZWRlZCgpOwogICAgIHZpcnR1YWwg
dm9pZCBjcmVhdGVUZXh0dXJlVXBkYXRlcklmTmVlZGVkKCk7CiAgICAgdm9pZCBzZXRUaWxpbmdP
cHRpb24oVGlsaW5nT3B0aW9uKTsKQEAgLTg1LDcgKzgxLDYgQEAgcHJvdGVjdGVkOgogICAgIE93
blB0cjxMYXllclRleHR1cmVVcGRhdGVyPiBtX3RleHR1cmVVcGRhdGVyOwogICAgIE93blB0cjxM
YXllclRpbGVyQ2hyb21pdW0+IG1fdGlsZXI7CiAgICAgVGlsaW5nT3B0aW9uIG1fdGlsaW5nT3B0
aW9uOwotICAgIGJvb2wgbV9pc01hc2s7CiB9OwogCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9JbWFnZUxheWVyQ2hyb21pdW0uY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSW1hZ2VMYXllckNocm9t
aXVtLmNwcAppbmRleCBmMTlmNGM3Njc5Yzc2YmI1NzllZTM0OWE1MGRmZWMwZDMyYTczZDJjLi42
Mzg1ZmMzZjFmZDFhMWE0Nzg2MzYxZjEzMTcxMTlmNDJkMDk0ZTQ1IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9JbWFnZUxheWVyQ2hyb21pdW0u
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ltYWdl
TGF5ZXJDaHJvbWl1bS5jcHAKQEAgLTE0MCw3ICsxNDAsNyBAQCB2b2lkIEltYWdlTGF5ZXJDaHJv
bWl1bTo6c2V0Q29udGVudHMoSW1hZ2UqIGNvbnRlbnRzKQogICAgIHNldE5lZWRzRGlzcGxheSgp
OwogfQogCi12b2lkIEltYWdlTGF5ZXJDaHJvbWl1bTo6cGFpbnRDb250ZW50c0lmRGlydHkoY29u
c3QgSW50UmVjdCYgdGFyZ2V0U3VyZmFjZVJlY3QpCit2b2lkIEltYWdlTGF5ZXJDaHJvbWl1bTo6
cGFpbnRDb250ZW50c0lmRGlydHkoKQogewogICAgIEFTU0VSVChsYXllclJlbmRlcmVyKCkpOwog
CkBAIC0xNDgsMTggKzE0OCwxNSBAQCB2b2lkIEltYWdlTGF5ZXJDaHJvbWl1bTo6cGFpbnRDb250
ZW50c0lmRGlydHkoY29uc3QgSW50UmVjdCYgdGFyZ2V0U3VyZmFjZVJlY3QpCiAgICAgICAgIC8v
IEZJWE1FOiBUaGlzIGRvd25jYXN0IGlzIGJhZC4gVGhlIGZpeCBpcyB0byBtYWtlIEltYWdlTGF5
ZXJDaHJvbWl1bSBub3QgZGVyaXZlIGZyb20gQ29udGVudExheWVyQ2hyb21pdW0uCiAgICAgICAg
IEltYWdlTGF5ZXJUZXh0dXJlVXBkYXRlciogaW1hZ2VUZXh0dXJlVXBkYXRlciA9IHN0YXRpY19j
YXN0PEltYWdlTGF5ZXJUZXh0dXJlVXBkYXRlcio+KG1fdGV4dHVyZVVwZGF0ZXIuZ2V0KCkpOwog
ICAgICAgICBpbWFnZVRleHR1cmVVcGRhdGVyLT51cGRhdGVGcm9tSW1hZ2UobV9jb250ZW50cy0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKSk7Ci0gICAgICAgIHVwZGF0ZUxheWVyU2l6ZShp
bWFnZVRleHR1cmVVcGRhdGVyLT5pbWFnZVNpemUoKSk7Ci0gICAgICAgIEludFJlY3QgcGFpbnRS
ZWN0KEludFBvaW50KDAsIDApLCBpbWFnZVRleHR1cmVVcGRhdGVyLT5pbWFnZVNpemUoKSk7Cisg
ICAgICAgIHVwZGF0ZUxheWVyU2l6ZSgpOworICAgICAgICBJbnRSZWN0IHBhaW50UmVjdChJbnRQ
b2ludCgpLCBjb250ZW50Qm91bmRzKCkpOwogICAgICAgICBpZiAoIW1fZGlydHlSZWN0LmlzRW1w
dHkoKSkgewogICAgICAgICAgICAgbV90aWxlci0+aW52YWxpZGF0ZVJlY3QocGFpbnRSZWN0KTsK
ICAgICAgICAgICAgIG1fZGlydHlSZWN0ID0gSW50UmVjdCgpOwogICAgICAgICB9CiAgICAgfQot
ICAgIEludFJlY3QgbGF5ZXJSZWN0ID0gdmlzaWJsZUxheWVyUmVjdCh0YXJnZXRTdXJmYWNlUmVj
dCk7Ci0gICAgaWYgKGxheWVyUmVjdC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKIAotICAg
IG1fdGlsZXItPnByZXBhcmVUb1VwZGF0ZShsYXllclJlY3QsIG1fdGV4dHVyZVVwZGF0ZXIuZ2V0
KCkpOworICAgIG1fdGlsZXItPnByZXBhcmVUb1VwZGF0ZSh2aXNpYmxlTGF5ZXJSZWN0KCksIG1f
dGV4dHVyZVVwZGF0ZXIuZ2V0KCkpOwogfQogCiB2b2lkIEltYWdlTGF5ZXJDaHJvbWl1bTo6dXBk
YXRlQ29tcG9zaXRvclJlc291cmNlcygpCkBAIC0xNjcsNDQgKzE2NCwxNSBAQCB2b2lkIEltYWdl
TGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygpCiAgICAgbV90aWxlci0+
dXBkYXRlUmVjdChtX3RleHR1cmVVcGRhdGVyLmdldCgpKTsKIH0KIAotdm9pZCBJbWFnZUxheWVy
Q2hyb21pdW06OnNldExheWVyUmVuZGVyZXIoTGF5ZXJSZW5kZXJlckNocm9taXVtKiBuZXdMYXll
clJlbmRlcmVyKQotewotICAgIGlmIChuZXdMYXllclJlbmRlcmVyICE9IGxheWVyUmVuZGVyZXIo
KSkKLSAgICAgICAgbV90ZXh0dXJlVXBkYXRlci5jbGVhcigpOwotICAgIENvbnRlbnRMYXllckNo
cm9taXVtOjpzZXRMYXllclJlbmRlcmVyKG5ld0xheWVyUmVuZGVyZXIpOwotfQotCiB2b2lkIElt
YWdlTGF5ZXJDaHJvbWl1bTo6Y3JlYXRlVGV4dHVyZVVwZGF0ZXJJZk5lZWRlZCgpCiB7CiAgICAg
aWYgKCFtX3RleHR1cmVVcGRhdGVyKQogICAgICAgICBtX3RleHR1cmVVcGRhdGVyID0gSW1hZ2VM
YXllclRleHR1cmVVcGRhdGVyOjpjcmVhdGUobGF5ZXJSZW5kZXJlckNvbnRleHQoKSwgbGF5ZXJS
ZW5kZXJlcigpLT5jb250ZXh0U3VwcG9ydHNNYXBTdWIoKSk7CiB9CiAKLUludFJlY3QgSW1hZ2VM
YXllckNocm9taXVtOjpsYXllckJvdW5kcygpIGNvbnN0CitJbnRTaXplIEltYWdlTGF5ZXJDaHJv
bWl1bTo6Y29udGVudEJvdW5kcygpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3RleHR1cmVVcGRhdGVy
KQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotICAgIEltYWdlTGF5ZXJUZXh0dXJlVXBkYXRl
ciogaW1hZ2VUZXh0dXJlVXBkYXRlciA9IHN0YXRpY19jYXN0PEltYWdlTGF5ZXJUZXh0dXJlVXBk
YXRlcio+KG1fdGV4dHVyZVVwZGF0ZXIuZ2V0KCkpOwotICAgIHJldHVybiBJbnRSZWN0KEludFBv
aW50KCksIGltYWdlVGV4dHVyZVVwZGF0ZXItPmltYWdlU2l6ZSgpKTsKLX0KLQotVHJhbnNmb3Jt
YXRpb25NYXRyaXggSW1hZ2VMYXllckNocm9taXVtOjp0aWxpbmdUcmFuc2Zvcm0oKQotewotICAg
IC8vIFRpbGVyIGRyYXdzIGZyb20gdGhlIHVwcGVyIGxlZnQgY29ybmVyLiBUaGUgZHJhdyB0cmFu
c2Zvcm0KLSAgICAvLyBzcGVjaWZpZXMgdGhlIG1pZGRsZSBvZiB0aGUgbGF5ZXIuCi0gICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtID0gY2NMYXllckltcGwoKS0+ZHJhd1RyYW5zZm9y
bSgpOwotICAgIGNvbnN0IEludFJlY3Qgc291cmNlUmVjdCA9IGxheWVyQm91bmRzKCk7Ci0gICAg
Y29uc3QgSW50U2l6ZSBkZXN0U2l6ZSA9IGJvdW5kcygpOwotCi0gICAgdHJhbnNmb3JtLnRyYW5z
bGF0ZSgtZGVzdFNpemUud2lkdGgoKSAvIDIuMCwgLWRlc3RTaXplLmhlaWdodCgpIC8gMi4wKTsK
LQotICAgIC8vIFRpbGVyIGFsc28gZHJhd3MgYXQgdGhlIG9yaWdpbmFsIGNvbnRlbnQgc2l6ZSwg
c28gcmVzY2FsZSB0aGUgb3JpZ2luYWwKLSAgICAvLyBpbWFnZSBkaW1lbnNpb25zIHRvIHRoZSBi
b3VuZHMgdGhhdCBpdCBpcyBtZWFudCB0byBiZSBkcmF3biBhdC4KLSAgICBmbG9hdCBzY2FsZVgg
PSBkZXN0U2l6ZS53aWR0aCgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNvdXJjZVJlY3Quc2l6ZSgp
LndpZHRoKCkpOwotICAgIGZsb2F0IHNjYWxlWSA9IGRlc3RTaXplLmhlaWdodCgpIC8gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHNvdXJjZVJlY3Quc2l6ZSgpLmhlaWdodCgpKTsKLSAgICB0cmFuc2Zvcm0u
c2NhbGUzZChzY2FsZVgsIHNjYWxlWSwgMS4wZik7Ci0KLSAgICByZXR1cm4gdHJhbnNmb3JtOwor
ICAgIHJldHVybiBtX2NvbnRlbnRzLT5zaXplKCk7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ltYWdlTGF5ZXJDaHJvbWl1bS5o
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSW1hZ2VMYXllckNo
cm9taXVtLmgKaW5kZXggMzMxM2MxNGUyMGJjNWY2MjEyODYwNTYwZTJmYThhY2IzM2M3OGUwOC4u
NmE3NDc2MTBmNzkwZWY1NjA2ODZlODFjZWQzY2EyMDY5ZTA1NjYzNyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSW1hZ2VMYXllckNocm9taXVt
LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSW1hZ2VM
YXllckNocm9taXVtLmgKQEAgLTUxLDcgKzUxLDcgQEAgcHVibGljOgogICAgIHN0YXRpYyBQYXNz
UmVmUHRyPEltYWdlTGF5ZXJDaHJvbWl1bT4gY3JlYXRlKEdyYXBoaWNzTGF5ZXJDaHJvbWl1bSog
b3duZXIgPSAwKTsKICAgICB2aXJ0dWFsIH5JbWFnZUxheWVyQ2hyb21pdW0oKTsKIAotICAgIHZp
cnR1YWwgdm9pZCBwYWludENvbnRlbnRzSWZEaXJ0eShjb25zdCBJbnRSZWN0JiB0YXJnZXRTdXJm
YWNlUmVjdCk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50Q29udGVudHNJZkRpcnR5KCk7CiAgICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoKTsKICAgICB2aXJ0dWFsIGJv
b2wgZHJhd3NDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50czsgfQogCkBAIC02MCwx
MCArNjAsNyBAQCBwdWJsaWM6CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBs
YXllclR5cGVBc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuICJJbWFnZUxheWVyIjsgfQogCi0gICAg
dmlydHVhbCB2b2lkIHNldExheWVyUmVuZGVyZXIoTGF5ZXJSZW5kZXJlckNocm9taXVtKik7Ci0K
LSAgICB2aXJ0dWFsIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRpbGluZ1RyYW5zZm9ybSgpOwotICAg
IHZpcnR1YWwgSW50UmVjdCBsYXllckJvdW5kcygpIGNvbnN0OworICAgIHZpcnR1YWwgSW50U2l6
ZSBjb250ZW50Qm91bmRzKCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgSW1hZ2VMYXllckNocm9t
aXVtKEdyYXBoaWNzTGF5ZXJDaHJvbWl1bSogb3duZXIpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcApp
bmRleCBiNjE2MjhiYjY3YWQzMDFkN2IzYTFmZGM1ZGNmZWJlNWQxZmJkY2Q0Li40Yzk4YzQ4ZWQz
ZThlOGVkODYzZTA4NzIyZTUxYTc3NTlhZGFmMGE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcApA
QCAtMjkxLDYgKzI5MSw3IEBAIHZvaWQgTGF5ZXJDaHJvbWl1bTo6cHVzaFByb3BlcnRpZXNUbyhD
Q0xheWVySW1wbCogbGF5ZXIpCiAgICAgbGF5ZXItPnNldEFuY2hvclBvaW50KG1fYW5jaG9yUG9p
bnQpOwogICAgIGxheWVyLT5zZXRBbmNob3JQb2ludFoobV9hbmNob3JQb2ludFopOwogICAgIGxh
eWVyLT5zZXRCb3VuZHMobV9ib3VuZHMpOworICAgIGxheWVyLT5zZXRDb250ZW50Qm91bmRzKGNv
bnRlbnRCb3VuZHMoKSk7CiAgICAgbGF5ZXItPnNldERlYnVnQm9yZGVyQ29sb3IobV9kZWJ1Z0Jv
cmRlckNvbG9yKTsKICAgICBsYXllci0+c2V0RGVidWdCb3JkZXJXaWR0aChtX2RlYnVnQm9yZGVy
V2lkdGgpOwogICAgIGxheWVyLT5zZXREb3VibGVTaWRlZChtX2RvdWJsZVNpZGVkKTsKQEAgLTMw
Miw2ICszMDMsNyBAQCB2b2lkIExheWVyQ2hyb21pdW06OnB1c2hQcm9wZXJ0aWVzVG8oQ0NMYXll
ckltcGwqIGxheWVyKQogICAgIGxheWVyLT5zZXRQcmVzZXJ2ZXMzRChwcmVzZXJ2ZXMzRCgpKTsK
ICAgICBsYXllci0+c2V0U3VibGF5ZXJUcmFuc2Zvcm0obV9zdWJsYXllclRyYW5zZm9ybSk7CiAg
ICAgbGF5ZXItPnNldFRyYW5zZm9ybShtX3RyYW5zZm9ybSk7CisgICAgbGF5ZXItPnNldFZpc2li
bGVMYXllclJlY3QobV92aXNpYmxlTGF5ZXJSZWN0KTsKIAogICAgIGlmIChtYXNrTGF5ZXIoKSkK
ICAgICAgICAgbWFza0xheWVyKCktPnB1c2hQcm9wZXJ0aWVzVG8obGF5ZXItPm1hc2tMYXllcigp
KTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0xheWVyQ2hyb21pdW0uaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0xheWVyQ2hyb21pdW0uaAppbmRleCBiNGExMTJmMGEzNDhiZWIzNmJkNTQ2MDFkYjBlZGJk
ZTdlYjZlNzMwLi5kNDYzOTAzMzQxZWNkN2ViZWVhYzBiNDRmMzA5MDFiNGQyMzFlYTczIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNo
cm9taXVtLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
TGF5ZXJDaHJvbWl1bS5oCkBAIC04Niw2ICs4Niw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgc2V0
Qm91bmRzKGNvbnN0IEludFNpemUmKTsKICAgICBjb25zdCBJbnRTaXplJiBib3VuZHMoKSBjb25z
dCB7IHJldHVybiBtX2JvdW5kczsgfQorICAgIHZpcnR1YWwgSW50U2l6ZSBjb250ZW50Qm91bmRz
KCkgY29uc3QgeyByZXR1cm4gYm91bmRzKCk7IH0KIAogICAgIHZvaWQgc2V0Q2xlYXJzQ29udGV4
dChib29sIGNsZWFycykgeyBtX2NsZWFyc0NvbnRleHQgPSBjbGVhcnM7IHNldE5lZWRzQ29tbWl0
KCk7IH0KICAgICBib29sIGNsZWFyc0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NsZWFyc0Nv
bnRleHQ7IH0KQEAgLTEzMiw2ICsxMzMsOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRUcmFuc2Zv
cm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSkgeyBtX3RyYW5zZm9ybSA9
IHRyYW5zZm9ybTsgc2V0TmVlZHNDb21taXQoKTsgfQogICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiB0cmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3RyYW5zZm9ybTsgfQogCisgICAg
Y29uc3QgSW50UmVjdCYgdmlzaWJsZUxheWVyUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fdmlzaWJs
ZUxheWVyUmVjdDsgfQorICAgIHZvaWQgc2V0VmlzaWJsZUxheWVyUmVjdChjb25zdCBJbnRSZWN0
JiB2aXNpYmxlTGF5ZXJSZWN0KSB7IG1fdmlzaWJsZUxheWVyUmVjdCA9IHZpc2libGVMYXllclJl
Y3Q7IH0KKwogICAgIGJvb2wgZG91YmxlU2lkZWQoKSBjb25zdCB7IHJldHVybiBtX2RvdWJsZVNp
ZGVkOyB9CiAgICAgdm9pZCBzZXREb3VibGVTaWRlZChib29sIGRvdWJsZVNpZGVkKSB7IG1fZG91
YmxlU2lkZWQgPSBkb3VibGVTaWRlZDsgc2V0TmVlZHNDb21taXQoKTsgfQogCkBAIC0xNTIsMTMg
KzE1NiwxMiBAQCBwdWJsaWM6CiAKICAgICAvLyBUaGVzZSBtZXRob2RzIHR5cGljYWxseSBuZWVk
IHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy4KICAgICB2aXJ0dWFsIGJvb2wg
ZHJhd3NDb250ZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
cGFpbnRDb250ZW50c0lmRGlydHkoY29uc3QgSW50UmVjdCYpIHsgfQogICAgIHZpcnR1YWwgdm9p
ZCBwYWludENvbnRlbnRzSWZEaXJ0eSgpIHsgfQogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb21w
b3NpdG9yUmVzb3VyY2VzKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIHNldElzTWFzayhib29sKSB7
fQogICAgIHZpcnR1YWwgdm9pZCB1bnJlc2VydmVDb250ZW50c1RleHR1cmUoKSB7IH0KICAgICB2
aXJ0dWFsIHZvaWQgYmluZENvbnRlbnRzVGV4dHVyZSgpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBk
cmF3KGNvbnN0IEludFJlY3QmKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZHJhdygpIHsgfQogCiAg
ICAgLy8gVGhlc2UgZXhpc3RzIGp1c3QgZm9yIGRlYnVnZ2luZyAodmlhIGRyYXdEZWJ1Z0JvcmRl
cigpKS4KICAgICB2b2lkIHNldEJvcmRlckNvbG9yKGNvbnN0IENvbG9yJik7CkBAIC0yNDksNiAr
MjUyLDcgQEAgcHJpdmF0ZToKIAogICAgIC8vIExheWVyIHByb3BlcnRpZXMuCiAgICAgSW50U2l6
ZSBtX2JvdW5kczsKKyAgICBJbnRSZWN0IG1fdmlzaWJsZUxheWVyUmVjdDsKICAgICBGbG9hdFBv
aW50IG1fcG9zaXRpb247CiAgICAgRmxvYXRQb2ludCBtX2FuY2hvclBvaW50OwogICAgIENvbG9y
IG1fYmFja2dyb3VuZENvbG9yOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAK
aW5kZXggODBmOGI5OGNkOGVjOGRiODdiOTcxODJmNTNkNWFmZmYzNDc4ZDEyNC4uMTExNzY1ZTkw
YzU1MTliMDAwMzNmYmU2NDdkMjFmNTRiNWIxYTZmMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclJlbmRl
cmVyQ2hyb21pdW0uY3BwCkBAIC0zNTgsNiArMzU4LDM5IEBAIHZvaWQgTGF5ZXJSZW5kZXJlckNo
cm9taXVtOjp1cGRhdGVMYXllcnMoTGF5ZXJMaXN0JiByZW5kZXJTdXJmYWNlTGF5ZXJMaXN0KQog
ICAgIH0KIH0KIAorc3RhdGljIEludFJlY3QgY2FsY3VsYXRlVmlzaWJsZUxheWVyUmVjdChjb25z
dCBJbnRSZWN0JiB0YXJnZXRTdXJmYWNlUmVjdCwgY29uc3QgSW50U2l6ZSYgYm91bmRzLCBjb25z
dCBJbnRTaXplJiBjb250ZW50Qm91bmRzLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdGls
aW5nVHJhbnNmb3JtKQoreworICAgIGlmICh0YXJnZXRTdXJmYWNlUmVjdC5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiB0YXJnZXRTdXJmYWNlUmVjdDsKKworICAgIGNvbnN0IEludFJlY3QgbGF5
ZXJCb3VuZFJlY3QgPSBJbnRSZWN0KEludFBvaW50KCksIGNvbnRlbnRCb3VuZHMpOworICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybSA9IHRpbGluZ1RyYW5zZm9ybTsKKworICAgIHRy
YW5zZm9ybS5zY2FsZU5vblVuaWZvcm0oYm91bmRzLndpZHRoKCkgLyBzdGF0aWNfY2FzdDxkb3Vi
bGU+KGNvbnRlbnRCb3VuZHMud2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBib3VuZHMuaGVpZ2h0KCkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGNvbnRlbnRCb3VuZHMuaGVp
Z2h0KCkpKTsKKyAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKC1jb250ZW50Qm91bmRzLndpZHRoKCkg
LyAyLjAsIC1jb250ZW50Qm91bmRzLmhlaWdodCgpIC8gMi4wKTsKKworICAgIC8vIElzIHRoaXMg
bGF5ZXIgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgdGFyZ2V0IHN1cmZhY2U/CisgICAgSW50
UmVjdCBsYXllckluU3VyZmFjZVNwYWNlID0gdHJhbnNmb3JtLm1hcFJlY3QobGF5ZXJCb3VuZFJl
Y3QpOworICAgIGlmICh0YXJnZXRTdXJmYWNlUmVjdC5jb250YWlucyhsYXllckluU3VyZmFjZVNw
YWNlKSkKKyAgICAgICAgcmV0dXJuIGxheWVyQm91bmRSZWN0OworCisgICAgLy8gSWYgdGhlIGxh
eWVyIGRvZXNuJ3QgZmlsbCB1cCB0aGUgZW50aXJlIHN1cmZhY2UsIHRoZW4gZmluZCB0aGUgcGFy
dCBvZgorICAgIC8vIHRoZSBzdXJmYWNlIHJlY3Qgd2hlcmUgdGhlIGxheWVyIGNvdWxkIGJlIHZp
c2libGUuIFRoaXMgYXZvaWRzIHRyeWluZyB0bworICAgIC8vIHByb2plY3Qgc3VyZmFjZSByZWN0
IHBvaW50cyB0aGF0IGFyZSBiZWhpbmQgdGhlIHByb2plY3Rpb24gcG9pbnQuCisgICAgSW50UmVj
dCBtaW5pbWFsU3VyZmFjZVJlY3QgPSB0YXJnZXRTdXJmYWNlUmVjdDsKKyAgICBtaW5pbWFsU3Vy
ZmFjZVJlY3QuaW50ZXJzZWN0KGxheWVySW5TdXJmYWNlU3BhY2UpOworCisgICAgLy8gUHJvamVj
dCB0aGUgY29ybmVycyBvZiB0aGUgdGFyZ2V0IHN1cmZhY2UgcmVjdCBpbnRvIHRoZSBsYXllciBz
cGFjZS4KKyAgICAvLyBUaGlzIGJvdW5kaW5nIHJlY3RhbmdsZSBtYXkgYmUgbGFyZ2VyIHRoYW4g
aXQgbmVlZHMgdG8gYmUgKGJlaW5nCisgICAgLy8gYXhpcy1hbGlnbmVkKSwgYnV0IGlzIGEgcmVh
c29uYWJsZSBmaWx0ZXIgb24gdGhlIHNwYWNlIHRvIGNvbnNpZGVyLgorICAgIC8vIE5vbi1pbnZl
cnRpYmxlIHRyYW5zZm9ybXMgd2lsbCBjcmVhdGUgYW4gZW1wdHkgcmVjdCBoZXJlLgorICAgIGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4IHN1cmZhY2VUb0xheWVyID0gdHJhbnNmb3JtLmludmVy
c2UoKTsKKyAgICBJbnRSZWN0IGxheWVyUmVjdCA9IHN1cmZhY2VUb0xheWVyLnByb2plY3RRdWFk
KEZsb2F0UXVhZChGbG9hdFJlY3QobWluaW1hbFN1cmZhY2VSZWN0KSkpLmVuY2xvc2luZ0JvdW5k
aW5nQm94KCk7CisgICAgbGF5ZXJSZWN0LmludGVyc2VjdChsYXllckJvdW5kUmVjdCk7CisgICAg
cmV0dXJuIGxheWVyUmVjdDsKK30KKwogdm9pZCBMYXllclJlbmRlcmVyQ2hyb21pdW06OnBhaW50
TGF5ZXJDb250ZW50cyhjb25zdCBMYXllckxpc3QmIHJlbmRlclN1cmZhY2VMYXllckxpc3QpCiB7
CiAgICAgZm9yIChpbnQgc3VyZmFjZUluZGV4ID0gcmVuZGVyU3VyZmFjZUxheWVyTGlzdC5zaXpl
KCkgLSAxOyBzdXJmYWNlSW5kZXggPj0gMCA7IC0tc3VyZmFjZUluZGV4KSB7CkBAIC0zOTgsMjAg
KzQzMSwzOCBAQCB2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6cGFpbnRMYXllckNvbnRlbnRz
KGNvbnN0IExheWVyTGlzdCYgcmVuZGVyU3VyZmFjZUxheQogICAgICAgICAgICAgfQogCiAgICAg
ICAgICAgICBpZiAobGF5ZXItPmJvdW5kcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgIEludFJlY3Qg
dGFyZ2V0U3VyZmFjZVJlY3QgPSBjY0xheWVySW1wbC0+dGFyZ2V0UmVuZGVyU3VyZmFjZSgpID8g
Y2NMYXllckltcGwtPnRhcmdldFJlbmRlclN1cmZhY2UoKS0+Y29udGVudFJlY3QoKSA6IG1fZGVm
YXVsdFJlbmRlclN1cmZhY2UtPmNvbnRlbnRSZWN0KCk7CiAgICAgICAgICAgICBpZiAobGF5ZXIt
PmNjTGF5ZXJJbXBsKCktPnVzZXNMYXllclNjaXNzb3IoKSkKICAgICAgICAgICAgICAgICB0YXJn
ZXRTdXJmYWNlUmVjdC5pbnRlcnNlY3QobGF5ZXItPmNjTGF5ZXJJbXBsKCktPnNjaXNzb3JSZWN0
KCkpOworICAgICAgICAgICAgSW50UmVjdCB2aXNpYmxlTGF5ZXJSZWN0ID0gY2FsY3VsYXRlVmlz
aWJsZUxheWVyUmVjdCh0YXJnZXRTdXJmYWNlUmVjdCwgbGF5ZXItPmJvdW5kcygpLCBsYXllci0+
Y29udGVudEJvdW5kcygpLCBjY0xheWVySW1wbC0+ZHJhd1RyYW5zZm9ybSgpKTsKIAotICAgICAg
ICAgICAgaWYgKGxheWVyLT5kcmF3c0NvbnRlbnQoKSkKLSAgICAgICAgICAgICAgICBsYXllci0+
cGFpbnRDb250ZW50c0lmRGlydHkodGFyZ2V0U3VyZmFjZVJlY3QpOwotICAgICAgICAgICAgaWYg
KGxheWVyLT5tYXNrTGF5ZXIoKSAmJiBsYXllci0+bWFza0xheWVyKCktPmRyYXdzQ29udGVudCgp
KQotICAgICAgICAgICAgICAgIGxheWVyLT5tYXNrTGF5ZXIoKS0+cGFpbnRDb250ZW50c0lmRGly
dHkodGFyZ2V0U3VyZmFjZVJlY3QpOwotICAgICAgICAgICAgaWYgKGxheWVyLT5yZXBsaWNhTGF5
ZXIoKSAmJiBsYXllci0+cmVwbGljYUxheWVyKCktPmRyYXdzQ29udGVudCgpKQotICAgICAgICAg
ICAgICAgIGxheWVyLT5yZXBsaWNhTGF5ZXIoKS0+cGFpbnRDb250ZW50c0lmRGlydHkodGFyZ2V0
U3VyZmFjZVJlY3QpOwotICAgICAgICAgICAgaWYgKGxheWVyLT5yZXBsaWNhTGF5ZXIoKSAmJiBs
YXllci0+cmVwbGljYUxheWVyKCktPm1hc2tMYXllcigpICYmIGxheWVyLT5yZXBsaWNhTGF5ZXIo
KS0+bWFza0xheWVyKCktPmRyYXdzQ29udGVudCgpKQotICAgICAgICAgICAgICAgIGxheWVyLT5y
ZXBsaWNhTGF5ZXIoKS0+bWFza0xheWVyKCktPnBhaW50Q29udGVudHNJZkRpcnR5KHRhcmdldFN1
cmZhY2VSZWN0KTsKKyAgICAgICAgICAgIGlmIChsYXllci0+ZHJhd3NDb250ZW50KCkpIHsKKyAg
ICAgICAgICAgICAgICBsYXllci0+c2V0VmlzaWJsZUxheWVyUmVjdCh2aXNpYmxlTGF5ZXJSZWN0
KTsKKyAgICAgICAgICAgICAgICBsYXllci0+cGFpbnRDb250ZW50c0lmRGlydHkoKTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgaWYgKExheWVyQ2hyb21pdW0qIG1hc2tMYXllciA9IGxh
eWVyLT5tYXNrTGF5ZXIoKSkgeworICAgICAgICAgICAgICAgIGlmIChtYXNrTGF5ZXItPmRyYXdz
Q29udGVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0VmlzaWJsZUxh
eWVyUmVjdChJbnRSZWN0KEludFBvaW50KCksIG1hc2tMYXllci0+Y29udGVudEJvdW5kcygpKSk7
CisgICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+cGFpbnRDb250ZW50c0lmRGlydHkoKTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChMYXll
ckNocm9taXVtKiByZXBsaWNhTGF5ZXIgPSBsYXllci0+cmVwbGljYUxheWVyKCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAocmVwbGljYUxheWVyLT5kcmF3c0NvbnRlbnQoKSkgeworICAgICAgICAg
ICAgICAgICAgICByZXBsaWNhTGF5ZXItPnNldFZpc2libGVMYXllclJlY3QodmlzaWJsZUxheWVy
UmVjdCk7CisgICAgICAgICAgICAgICAgICAgIHJlcGxpY2FMYXllci0+cGFpbnRDb250ZW50c0lm
RGlydHkoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoTGF5ZXJD
aHJvbWl1bSogcmVwbGljYU1hc2tMYXllciA9IHJlcGxpY2FMYXllci0+bWFza0xheWVyKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxpY2FNYXNrTGF5ZXItPmRyYXdzQ29udGVudCgp
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWNhTWFza0xheWVyLT5zZXRWaXNpYmxl
TGF5ZXJSZWN0KEludFJlY3QoSW50UG9pbnQoKSwgcmVwbGljYU1hc2tMYXllci0+Y29udGVudEJv
dW5kcygpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWNhTWFza0xheWVyLT5wYWlu
dENvbnRlbnRzSWZEaXJ0eSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTg1LDcgKzEwMzYs
NyBAQCB2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1bTo6ZHJhd0xheWVyKENDTGF5ZXJJbXBsKiBs
YXllciwgUmVuZGVyU3VyZmFjZUNocm9taXVtKgogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0K
IAotICAgIGxheWVyLT5kcmF3KHRhcmdldFN1cmZhY2VSZWN0KTsKKyAgICBsYXllci0+ZHJhdygp
OwogCiAgICAgLy8gRHJhdyB0aGUgZGVidWcgYm9yZGVyIGlmIHRoZXJlIGlzIG9uZS4KICAgICBs
YXllci0+ZHJhd0RlYnVnQm9yZGVyKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SZW5kZXJTdXJmYWNlQ2hyb21pdW0uY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmVuZGVyU3VyZmFjZUNocm9taXVt
LmNwcAppbmRleCBhMmI0NTVjODU1ZDQzZDExODZhMjZhYTUxNTkyNTY5ZDEwMjY1ZTUwLi5iOTYx
ZTQ3ZTVjMmY1MTM1NDJkYzg4YmFlNWIwMGY4MWE5ZjA1Y2MxIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SZW5kZXJTdXJmYWNlQ2hyb21pdW0u
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JlbmRl
clN1cmZhY2VDaHJvbWl1bS5jcHAKQEAgLTE2Niw3ICsxNjYsNyBAQCB2b2lkIFJlbmRlclN1cmZh
Y2VDaHJvbWl1bTo6ZHJhdyhjb25zdCBJbnRSZWN0JikKIAogCiAgICAgLy8gUmVmbGVjdGlvbiBk
cmF3cyBiZWZvcmUgdGhlIGxheWVyLgotICAgIGlmIChtX293bmluZ0xheWVyLT5yZXBsaWNhTGF5
ZXIoKSkgCisgICAgaWYgKG1fb3duaW5nTGF5ZXItPnJlcGxpY2FMYXllcigpKQogICAgICAgICBk
cmF3U3VyZmFjZShyZXBsaWNhTWFza0xheWVyLCBtX3JlcGxpY2FEcmF3VHJhbnNmb3JtKTsKIAog
ICAgIGRyYXdTdXJmYWNlKG1fbWFza0xheWVyLCBtX2RyYXdUcmFuc2Zvcm0pOwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NDYW52YXNM
YXllckltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NDYW52YXNMYXllckltcGwuY3BwCmluZGV4IGZjZjJmN2ZhNjY4NjNlNDEwOWYxNTJkYWIx
N2U1OWUwNzBjOWQzZDQuLjcxMjViOTY4MDdiNDBmYzM0ZWIxYzg0ZTdhOWQ5ODMxNzVhMTgzZWIg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDQ2FudmFzTGF5ZXJJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ0NhbnZhc0xheWVySW1wbC5jcHAKQEAgLTQ4LDcgKzQ4LDcgQEAg
Q0NDYW52YXNMYXllckltcGw6On5DQ0NhbnZhc0xheWVySW1wbCgpCiB7CiB9CiAKLXZvaWQgQ0ND
YW52YXNMYXllckltcGw6OmRyYXcoY29uc3QgSW50UmVjdCYpCit2b2lkIENDQ2FudmFzTGF5ZXJJ
bXBsOjpkcmF3KCkKIHsKICAgICBBU1NFUlQobGF5ZXJSZW5kZXJlcigpKTsKICAgICBjb25zdCBD
Q0NhbnZhc0xheWVySW1wbDo6UHJvZ3JhbSogcHJvZ3JhbSA9IGxheWVyUmVuZGVyZXIoKS0+Y2Fu
dmFzTGF5ZXJQcm9ncmFtKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ0NhbnZhc0xheWVySW1wbC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NDYW52YXNMYXllckltcGwuaAppbmRleCAy
YWJhNDdlOWQ2NmNkNTlhZTIwZjc4ZDhkZGIyNTAxY2YyZWQzMjkxLi5jMTdhZjVmYzdlYmNlMjUw
YTM2YzM2YjhjZTU4MTE5MGVlOTEzYTk3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0NhbnZhc0xheWVySW1wbC5oCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDQ2FudmFzTGF5ZXJJbXBs
LmgKQEAgLTQyLDcgKzQyLDcgQEAgcHVibGljOgogCiAgICAgdHlwZWRlZiBQcm9ncmFtQmluZGlu
ZzxWZXJ0ZXhTaGFkZXJQb3NUZXgsIEZyYWdtZW50U2hhZGVyUkdCQVRleEZsaXBBbHBoYT4gUHJv
Z3JhbTsKIAotICAgIHZpcnR1YWwgdm9pZCBkcmF3KGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZHJhdygpOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMYXllclByb3BlcnRpZXMo
VGV4dFN0cmVhbSYsIGludCBpbmRlbnQpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5jcHAK
aW5kZXggM2Y3NDc3OGQ2OTQ5YjViMDEyYjgxMGEwYTA2NWU1MjhmNWI0MDUwNi4uZTE4ZDU0Zjhh
ODAxMGE0MzlmZjNiZmNkMDZkMTZlNzVjYTg3NWI2YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmNw
cApAQCAtMTQyLDkgKzE0Miw5IEBAIGJvb2wgQ0NMYXllckltcGw6OmRyYXdzQ29udGVudCgpIGNv
bnN0CiAgICAgcmV0dXJuIG1fb3duZXItPmRyYXdzQ29udGVudCgpOwogfQogCi12b2lkIENDTGF5
ZXJJbXBsOjpkcmF3KGNvbnN0IEludFJlY3QmIHRhcmdldFN1cmZhY2VSZWN0KQordm9pZCBDQ0xh
eWVySW1wbDo6ZHJhdygpCiB7Ci0gICAgcmV0dXJuIG1fb3duZXItPmRyYXcodGFyZ2V0U3VyZmFj
ZVJlY3QpOworICAgIHJldHVybiBtX293bmVyLT5kcmF3KCk7CiB9CiAKIHZvaWQgQ0NMYXllcklt
cGw6OnVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmgKaW5kZXgg
OWUyZGExY2ZmMDg1NWUyYmZjZDdkZDcyYTcxM2NhNzE5YjQxNmIzZC4uZDc5NTRjYjZlZWI5MTU0
NzU3MjNiYmI0ZmQ4YzVkYmNkMTVlM2ZiMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5oCkBAIC02OSw3
ICs2OSw3IEBAIHB1YmxpYzoKICAgICBpbnQgZGVidWdJRCgpIGNvbnN0IHsgcmV0dXJuIG1fZGVi
dWdJRDsgfQogI2VuZGlmCiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhdyhjb25zdCBJbnRSZWN0JiBj
b250ZW50UmVjdCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXcoKTsKICAgICB2aXJ0dWFsIHZvaWQg
dXBkYXRlQ29tcG9zaXRvclJlc291cmNlcygpOwogICAgIHZvaWQgdW5yZXNlcnZlQ29udGVudHNU
ZXh0dXJlKCk7CiAgICAgdm9pZCBiaW5kQ29udGVudHNUZXh0dXJlKCk7CkBAIC0xMjcsMTggKzEy
NywyOCBAQCBwdWJsaWM6CiAKICAgICBSZW5kZXJTdXJmYWNlQ2hyb21pdW0qIHJlbmRlclN1cmZh
Y2UoKSBjb25zdCB7IHJldHVybiBtX3JlbmRlclN1cmZhY2UuZ2V0KCk7IH0KICAgICB2b2lkIGNs
ZWFyUmVuZGVyU3VyZmFjZSgpIHsgbV9yZW5kZXJTdXJmYWNlLmNsZWFyKCk7IH0KKwogICAgIGZs
b2F0IGRyYXdPcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbV9kcmF3T3BhY2l0eTsgfQogICAgIHZv
aWQgc2V0RHJhd09wYWNpdHkoZmxvYXQgb3BhY2l0eSkgeyBtX2RyYXdPcGFjaXR5ID0gb3BhY2l0
eTsgfQorCiAgICAgY29uc3QgSW50UmVjdCYgc2Npc3NvclJlY3QoKSBjb25zdCB7IHJldHVybiBt
X3NjaXNzb3JSZWN0OyB9CiAgICAgdm9pZCBzZXRTY2lzc29yUmVjdChjb25zdCBJbnRSZWN0JiBy
ZWN0KSB7IG1fc2Npc3NvclJlY3QgPSByZWN0OyB9CisKICAgICBSZW5kZXJTdXJmYWNlQ2hyb21p
dW0qIHRhcmdldFJlbmRlclN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX3RhcmdldFJlbmRlclN1
cmZhY2U7IH0KICAgICB2b2lkIHNldFRhcmdldFJlbmRlclN1cmZhY2UoUmVuZGVyU3VyZmFjZUNo
cm9taXVtKiBzdXJmYWNlKSB7IG1fdGFyZ2V0UmVuZGVyU3VyZmFjZSA9IHN1cmZhY2U7IH0KIAot
ICAgIGJvb2wgZG91YmxlU2lkZWQoKSBjb25zdCB7IHJldHVybiBtX2RvdWJsZVNpZGVkOyB9Ci0g
ICAgdm9pZCBzZXREb3VibGVTaWRlZChib29sIGRvdWJsZVNpZGVkKSB7IG1fZG91YmxlU2lkZWQg
PSBkb3VibGVTaWRlZDsgfQogICAgIGNvbnN0IEludFNpemUmIGJvdW5kcygpIGNvbnN0IHsgcmV0
dXJuIG1fYm91bmRzOyB9CiAgICAgdm9pZCBzZXRCb3VuZHMoY29uc3QgSW50U2l6ZSYgYm91bmRz
KSB7IG1fYm91bmRzID0gYm91bmRzOyB9CiAKKyAgICBjb25zdCBJbnRTaXplJiBjb250ZW50Qm91
bmRzKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50Qm91bmRzOyB9CisgICAgdm9pZCBzZXRDb250
ZW50Qm91bmRzKGNvbnN0IEludFNpemUmIGNvbnRlbnRCb3VuZHMpIHsgbV9jb250ZW50Qm91bmRz
ID0gY29udGVudEJvdW5kczsgfQorCisgICAgY29uc3QgSW50UmVjdCYgdmlzaWJsZUxheWVyUmVj
dCgpIGNvbnN0IHsgcmV0dXJuIG1fdmlzaWJsZUxheWVyUmVjdDsgfQorICAgIHZvaWQgc2V0Vmlz
aWJsZUxheWVyUmVjdChjb25zdCBJbnRSZWN0JiB2aXNpYmxlTGF5ZXJSZWN0KSB7IG1fdmlzaWJs
ZUxheWVyUmVjdCA9IHZpc2libGVMYXllclJlY3Q7IH0KKworICAgIGJvb2wgZG91YmxlU2lkZWQo
KSBjb25zdCB7IHJldHVybiBtX2RvdWJsZVNpZGVkOyB9CisgICAgdm9pZCBzZXREb3VibGVTaWRl
ZChib29sIGRvdWJsZVNpZGVkKSB7IG1fZG91YmxlU2lkZWQgPSBkb3VibGVTaWRlZDsgfQorCiAg
ICAgLy8gUmV0dXJucyB0aGUgcmVjdCBjb250YWludGFpbmluZyB0aGlzIGxheWVyIGluIHRoZSBj
dXJyZW50IHZpZXcncyBjb29yZGluYXRlIHN5c3RlbS4KICAgICBjb25zdCBJbnRSZWN0IGdldERy
YXdSZWN0KCkgY29uc3Q7CiAKQEAgLTE1Miw2ICsxNjIsNyBAQCBwdWJsaWM6CiAgICAgLy8gSEFD
SyBUT0RPIGZpeCB0aGlzCiAgICAgTGF5ZXJDaHJvbWl1bSogb3duZXIoKSBjb25zdCB7IHJldHVy
biBtX293bmVyOyB9CiAgICAgdm9pZCBjbGVhck93bmVyKCkgeyBtX293bmVyID0gMDsgfQorCiBw
cm90ZWN0ZWQ6CiAgICAgLy8gRm9yIG5vdywgQ0NMYXllckltcGxzIGhhdmUgYSBiYWNrIHBvaW50
ZXIgdG8gdGhlaXIgTGF5ZXJDaHJvbWl1bS4KICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgYWZ0
ZXIgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU4ODMzIGlzIGZpeGVk
LgpAQCAtMTc2LDYgKzE4Nyw4IEBAIHByaXZhdGU6CiAgICAgRmxvYXRQb2ludCBtX2FuY2hvclBv
aW50OwogICAgIGZsb2F0IG1fYW5jaG9yUG9pbnRaOwogICAgIEludFNpemUgbV9ib3VuZHM7Cisg
ICAgSW50U2l6ZSBtX2NvbnRlbnRCb3VuZHM7CisgICAgSW50UmVjdCBtX3Zpc2libGVMYXllclJl
Y3Q7CiAKICAgICAvLyBXaGV0aGVyIHRoZSAiYmFjayIgb2YgdGhpcyBsYXllciBzaG91bGQgZHJh
dy4KICAgICBib29sIG1fZG91YmxlU2lkZWQ7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1BsdWdpbkxheWVySW1wbC5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1BsdWdpbkxheWVySW1w
bC5jcHAKaW5kZXggNGVhM2ZjMGU2NzY3ZjQ5OTZkMzFjNTk4ZDE5MmNhNjI4ZGI1MGFmMi4uZGVl
MWVmMGI3ZTZhMmRkYWQzNzVmODkxZjlkZTA1NjU5ZDI4NmMyMSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NQbHVnaW5MYXllckltcGwu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
UGx1Z2luTGF5ZXJJbXBsLmNwcApAQCAtNDYsNyArNDYsNyBAQCBDQ1BsdWdpbkxheWVySW1wbDo6
fkNDUGx1Z2luTGF5ZXJJbXBsKCkKIHsKIH0KIAotdm9pZCBDQ1BsdWdpbkxheWVySW1wbDo6ZHJh
dyhjb25zdCBJbnRSZWN0JikKK3ZvaWQgQ0NQbHVnaW5MYXllckltcGw6OmRyYXcoKQogewogICAg
IEFTU0VSVChsYXllclJlbmRlcmVyKCkpOwogICAgIGNvbnN0IENDUGx1Z2luTGF5ZXJJbXBsOjpQ
cm9ncmFtKiBwcm9ncmFtID0gbGF5ZXJSZW5kZXJlcigpLT5wbHVnaW5MYXllclByb2dyYW0oKTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDUGx1Z2luTGF5ZXJJbXBsLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ1BsdWdpbkxheWVySW1wbC5oCmluZGV4IDdhN2VhZjU4OTM1NGM3YjNlMGIy
NzViMmMwOGUyYTgwMDNkYzg2NDcuLjZlNDgyZDE0NjRiMGY4ZTc4OTIwNjE3NWQyMTIwM2E4OWUw
OGQyNzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL2NjL0NDUGx1Z2luTGF5ZXJJbXBsLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NQbHVnaW5MYXllckltcGwuaApAQCAtNDIsNyArNDIsNyBA
QCBwdWJsaWM6CiAKICAgICB0eXBlZGVmIFByb2dyYW1CaW5kaW5nPFZlcnRleFNoYWRlclBvc1Rl
eCwgRnJhZ21lbnRTaGFkZXJSR0JBVGV4RmxpcEFscGhhPiBQcm9ncmFtOwogCi0gICAgdmlydHVh
bCB2b2lkIGRyYXcoY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3KCk7CiAK
ICAgICB2aXJ0dWFsIHZvaWQgZHVtcExheWVyUHJvcGVydGllcyhUZXh0U3RyZWFtJiwgaW50IGlu
ZGVudCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDVmlkZW9MYXllckltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NWaWRlb0xheWVySW1wbC5jcHAKaW5kZXggY2Vm
MjdjNjc1NzJkYTFmYTU3ZmZlYzE5ZmFjZWNlZTdkYjNjOTliZS4uZjQ0YWJiMDYxMWRlYzdjZjgx
NjAxNzg4YzljNDU1YmI1ZTk3OGE5YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NWaWRlb0xheWVySW1wbC5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NWaWRlb0xheWVySW1wbC5j
cHAKQEAgLTc1LDcgKzc1LDcgQEAgdm9pZCBDQ1ZpZGVvTGF5ZXJJbXBsOjpzZXRUZXh0dXJlKHNp
emVfdCBpLCBWaWRlb0xheWVyQ2hyb21pdW06OlRleHR1cmUgdGV4dHVyZSkKICAgICBtX3RleHR1
cmVzW2ldID0gdGV4dHVyZTsKIH0KIAotdm9pZCBDQ1ZpZGVvTGF5ZXJJbXBsOjpkcmF3KGNvbnN0
IEludFJlY3QmKQordm9pZCBDQ1ZpZGVvTGF5ZXJJbXBsOjpkcmF3KCkKIHsKICAgICBpZiAobV9z
a2lwc0RyYXcpCiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVmlkZW9MYXllckltcGwuaCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDVmlkZW9MYXllckltcGwuaApp
bmRleCA0MDg2OWM0ZWNmZmVkYzc2NzEwZDI4NzdiOGY5OWFlY2JiNGQ4OGI1Li5mYzA3Zjc3MmU2
MThjODljOGUyNDRjYWZjNTU4YzM3ZTk5Y2ViYjZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1ZpZGVvTGF5ZXJJbXBsLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NWaWRlb0xheWVy
SW1wbC5oCkBAIC00Nyw3ICs0Nyw3IEBAIHB1YmxpYzoKICAgICB0eXBlZGVmIFByb2dyYW1CaW5k
aW5nPFZlcnRleFNoYWRlclBvc1RleFRyYW5zZm9ybSwgRnJhZ21lbnRTaGFkZXJSR0JBVGV4Rmxp
cEFscGhhPiBSR0JBUHJvZ3JhbTsKICAgICB0eXBlZGVmIFByb2dyYW1CaW5kaW5nPFZlcnRleFNo
YWRlclBvc1RleFlVVlN0cmV0Y2gsIEZyYWdtZW50U2hhZGVyWVVWVmlkZW8+IFlVVlByb2dyYW07
CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHJhdyhjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2
b2lkIGRyYXcoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wTGF5ZXJQcm9wZXJ0aWVzKFRleHRT
dHJlYW0mLCBpbnQgaW5kZW50KSBjb25zdDsKIAo=
</data>
<flag name="review"
          id="94036"
          type_id="1"
          status="+"
          setter="senorblanco"
    />
          </attachment>
      

    </bug>

</bugzilla>