<?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>71385</bug_id>
          
          <creation_ts>2011-11-02 12:32:30 -0700</creation_ts>
          <short_desc>Threaded compositor should delegate overflow div/iframe scroll events to WebKit</short_desc>
          <delta_ts>2012-07-27 02:29:43 -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>UI Events</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>79155</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Sami Kyostila">skyostil</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>andersca</cc>
    
    <cc>cc-bugs</cc>
    
    <cc>fishd</cc>
    
    <cc>jamesr</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>skyostil</cc>
    
    <cc>tkent</cc>
    
    <cc>vangelis</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>494813</commentid>
    <comment_count>0</comment_count>
    <who name="Sami Kyostila">skyostil</who>
    <bug_when>2011-11-02 12:32:30 -0700</bug_when>
    <thetext>When an input scroll event is received by the threaded compositor, it should check whether the event targets an overflow div or iframe and forward it to WebKit if that is the case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507724</commentid>
    <comment_count>1</comment_count>
      <attachid>116256</attachid>
    <who name="Sami Kyostila">skyostil</who>
    <bug_when>2011-11-22 11:41:12 -0800</bug_when>
    <thetext>Created attachment 116256
Patch for hit testing input events

The attached patch adds metadata to GraphicsLayers about scrollable elements within them. When the compositor receives an input event, it is hit tested against these elements. If the test succeeds, the event is delegated to the main thread instead of being processed by the compositor.

The patch also modifies layerTreeAsText() to accept a bitmask specifying the data to output in a similar way to renderTreeAsText().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507742</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-22 11:59:02 -0800</bug_when>
    <thetext>Attachment 116256 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;LayoutTests/ChangeLog&apos;, u&apos;LayoutTests/comp...&quot; exit_code: 1

Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.h:88:  The parameter name &quot;r&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:305:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 2 in 31 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507743</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-22 11:59:21 -0800</bug_when>
    <thetext>Please wait for approval from fishd@chromium.org before submitting because this patch contains changes to the Chromium public API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507752</commentid>
    <comment_count>4</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2011-11-22 12:14:38 -0800</bug_when>
    <thetext>I don&apos;t think it makes sense for GraphicsLayers to know anything about scrolling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507754</commentid>
    <comment_count>5</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2011-11-22 12:16:01 -0800</bug_when>
    <thetext>Since this touches a lot of stuff outside of the Chromium directories, I am removing the [Chromium] prefix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507766</commentid>
    <comment_count>6</comment_count>
      <attachid>116256</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2011-11-22 12:43:33 -0800</bug_when>
    <thetext>Comment on attachment 116256
Patch for hit testing input events

I would think that in order to effectively be able to scroll on the thread, we&apos;ll first need to promote the scrolling element into a composited layer.  Then it will be a matter of marking an entire GraphicsLayer as scrollable.  The thread won&apos;t be able to repaint/scroll composited RLs that contain more than just the scrolling element.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>508075</commentid>
    <comment_count>7</comment_count>
    <who name="Sami Kyostila">skyostil</who>
    <bug_when>2011-11-23 05:03:18 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 116256 [details])
&gt; I would think that in order to effectively be able to scroll on the thread, we&apos;ll first need to promote the scrolling element into a composited layer.  Then it will be a matter of marking an entire GraphicsLayer as scrollable.  The thread won&apos;t be able to repaint/scroll composited RLs that contain more than just the scrolling element.

I agree that for efficient scrolling we want to do exactly that. However, a concern I have is that are we really able to promote _every_ scrollable element to a GraphicsLayer? That could have significant memory and fillrate overhead. Also, I understood there is an issue with automatic promotion of overflow divs into layers due to the lack of a stacking context.

The patch I&apos;ve attached enables the &quot;slow path&quot; (main thread) scrolling for elements that do not have their own layers. The next step is to make scrolling work for fully composited layers.

Do you think this approach makes sense, or is it safe to assume that all scrollable elements can be promoted to layers?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509453</commentid>
    <comment_count>8</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-11-27 10:51:16 -0800</bug_when>
    <thetext>Can you please separate the chromium-specific pieces from the cross-platform code changes?

I agree that we should keep scrolling concerns separate from GraphicsLayer in the cross-platform logic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510016</commentid>
    <comment_count>9</comment_count>
      <attachid>116256</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-11-28 11:33:49 -0800</bug_when>
    <thetext>Comment on attachment 116256
Patch for hit testing input events

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

&gt; Source/WebCore/platform/graphics/GraphicsLayer.h:307
&gt; +    // Set coordinates of scrollable elements inside the layer. These are given
&gt; +    // in scaled document coordinates.
&gt; +    const Vector&lt;IntRect&gt;&amp; scrollableRects() const { return m_scrollableRects; }
&gt; +    virtual void setScrollableRects(const Vector&lt;IntRect&gt;&amp; r) { m_scrollableRects = r; }

It&apos;s not clear what &quot;scrollable rects&quot; are for. Why aren&apos;t the child scrollable things in their own GraphicsLayers?

&gt; Source/WebCore/rendering/RenderLayer.cpp:3884
&gt; +Vector&lt;IntRect&gt; RenderLayer::scrollableChildren() const

This isn&apos;t returning a list of children, it&apos;s returning a list of rects, so the name is wrong.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510981</commentid>
    <comment_count>10</comment_count>
    <who name="Sami Kyostila">skyostil</who>
    <bug_when>2011-11-29 12:08:08 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; Can you please separate the chromium-specific pieces from the cross-platform code changes?

Good idea, done: https://bugs.webkit.org/show_bug.cgi?id=73345
 
&gt; I agree that we should keep scrolling concerns separate from GraphicsLayer in the cross-platform logic.

Fair enough. I&apos;ll reformulate the patch without adding anything to GraphicsLayer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510996</commentid>
    <comment_count>11</comment_count>
    <who name="Sami Kyostila">skyostil</who>
    <bug_when>2011-11-29 12:25:18 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 116256 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=116256&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/GraphicsLayer.h:307
&gt; &gt; +    // Set coordinates of scrollable elements inside the layer. These are given
&gt; &gt; +    // in scaled document coordinates.
&gt; &gt; +    const Vector&lt;IntRect&gt;&amp; scrollableRects() const { return m_scrollableRects; }
&gt; &gt; +    virtual void setScrollableRects(const Vector&lt;IntRect&gt;&amp; r) { m_scrollableRects = r; }
&gt; 
&gt; It&apos;s not clear what &quot;scrollable rects&quot; are for. Why aren&apos;t the child scrollable things in their own GraphicsLayers?

Scrollable rectangles inside a layer signify areas where the chromium compositor thread should not attempt to process scroll events by itself (by translating the layer coordinates), but instead it should forward those events to the WebKit thread. These areas are created for things like iframes and elements with overflow scrolling which do not have a RenderLayerBacking of their own.

Initially I wasn&apos;t sure whether it is too much of an overhead to promote scrollable elements into composited layers -- especially if there are no graphical reasons to do so -- so I went with this approach of adding metadata  to existing GraphicsLayers.

It sounds like it would be better instead to create GraphicsLayers for those elements but still render the elements themselves into the same enclosing layer as before. That is, the GraphicsLayers would only serve as blank placeholders for compositor hit testing. Is this closer to what you had in mind?

&gt; &gt; Source/WebCore/rendering/RenderLayer.cpp:3884
&gt; &gt; +Vector&lt;IntRect&gt; RenderLayer::scrollableChildren() const
&gt; 
&gt; This isn&apos;t returning a list of children, it&apos;s returning a list of rects, so the name is wrong.

Agreed, I&apos;ll fix this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511021</commentid>
    <comment_count>12</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-11-29 12:47:29 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #9)
&gt; &gt; (From update of attachment 116256 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=116256&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/GraphicsLayer.h:307
&gt; &gt; &gt; +    // Set coordinates of scrollable elements inside the layer. These are given
&gt; &gt; &gt; +    // in scaled document coordinates.
&gt; &gt; &gt; +    const Vector&lt;IntRect&gt;&amp; scrollableRects() const { return m_scrollableRects; }
&gt; &gt; &gt; +    virtual void setScrollableRects(const Vector&lt;IntRect&gt;&amp; r) { m_scrollableRects = r; }
&gt; &gt; 
&gt; &gt; It&apos;s not clear what &quot;scrollable rects&quot; are for. Why aren&apos;t the child scrollable things in their own GraphicsLayers?
&gt; 
&gt; Scrollable rectangles inside a layer signify areas where the chromium compositor thread should not attempt to process scroll events by itself (by translating the layer coordinates), but instead it should forward those events to the WebKit thread. These areas are created for things like iframes and elements with overflow scrolling which do not have a RenderLayerBacking of their own.

This sounds like information that should be kept in the chromium layer, not pushed down to GraphicsLayer.

&gt; It sounds like it would be better instead to create GraphicsLayers for those elements but still render the elements themselves into the same enclosing layer as before. That is, the GraphicsLayers would only serve as blank placeholders for compositor hit testing. Is this closer to what you had in mind?

No. I don&apos;t want to deviate from a GraphicsLayer representing some kind of composited surface. It sounds like Chromium&apos;s scrolling needs are pretty platform-specific, so you should keep them in the Chromium layer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511858</commentid>
    <comment_count>13</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2011-11-30 10:24:27 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; (From update of attachment 116256 [details] [details] [details])
&gt; &gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=116256&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/platform/graphics/GraphicsLayer.h:307
&gt; &gt; &gt; &gt; +    // Set coordinates of scrollable elements inside the layer. These are given
&gt; &gt; &gt; &gt; +    // in scaled document coordinates.
&gt; &gt; &gt; &gt; +    const Vector&lt;IntRect&gt;&amp; scrollableRects() const { return m_scrollableRects; }
&gt; &gt; &gt; &gt; +    virtual void setScrollableRects(const Vector&lt;IntRect&gt;&amp; r) { m_scrollableRects = r; }
&gt; &gt; &gt; 
&gt; &gt; &gt; It&apos;s not clear what &quot;scrollable rects&quot; are for. Why aren&apos;t the child scrollable things in their own GraphicsLayers?
&gt; &gt; 
&gt; &gt; Scrollable rectangles inside a layer signify areas where the chromium compositor thread should not attempt to process scroll events by itself (by translating the layer coordinates), but instead it should forward those events to the WebKit thread. These areas are created for things like iframes and elements with overflow scrolling which do not have a RenderLayerBacking of their own.
&gt; 
&gt; This sounds like information that should be kept in the chromium layer, not pushed down to GraphicsLayer.

Simon: This issue seems to keep coming up a lot lately.  The background here (in case it wasn&apos;t clear) is that we&apos;re working on getting compositing to happen on a thread separate from where the rest of the webkit logic runs. We want to allow that thread to handle basic user input events (mostly scroll for now) on its own whenever possible to improve responsiveness.  In order to effectively do that, we need the composited layer tree nodes to carry more information than they currently do.  Specifically we&apos;ve had the need for:
1. Tagging fixed position layers so that the compositor can position them while scrolling
2. Tagging overflow layers as scrollable 
3. Tagging scroll areas within a layer in order to avoid scrolling the whole page when we should be scrolling an element (this patch)

With enough contortions we could call out from RLC and RLB to the ChromeClient and set those properties directly to the Chromium layers but it feels that these properties could be generally useful for other ports and should be stored directly into the GraphicsLayer&apos;s .  Thoughts?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511932</commentid>
    <comment_count>14</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-11-30 11:21:05 -0800</bug_when>
    <thetext>(In reply to comment #13)

&gt; Simon: This issue seems to keep coming up a lot lately.  The background here (in case it wasn&apos;t clear) is that we&apos;re working on getting compositing to happen on a thread separate from where the rest of the webkit logic runs. We want to allow that thread to handle basic user input events (mostly scroll for now) on its own whenever possible to improve responsiveness.  In order to effectively do that, we need the composited layer tree nodes to carry more information than they currently do.  Specifically we&apos;ve had the need for:
&gt; 1. Tagging fixed position layers so that the compositor can position them while scrolling
&gt; 2. Tagging overflow layers as scrollable 
&gt; 3. Tagging scroll areas within a layer in order to avoid scrolling the whole page when we should be scrolling an element (this patch)
&gt; 
&gt; With enough contortions we could call out from RLC and RLB to the ChromeClient and set those properties directly to the Chromium layers but it feels that these properties could be generally useful for other ports and should be stored directly into the GraphicsLayer&apos;s .  Thoughts?

The GraphicsLayers tree is an output-only construct, and I think jury-rigging it to contain additional meta-information about the compositing tree may not be the best approach.

What we really need is:
* a data structure that describes the transformations that can happen to the compositing tree via scrolling, that is accessible from another thread/process
* a way to update the (platform-specific) compositing tree on scrolling, from another thread/process
* a way to notify WebCore that scrolling happened, so it can sync up with the new scroll positions

I&apos;m concerned about trying to use the GraphicsLayer tree for event handling, also. The bounds of GraphicsLayers often do not correspond with the bounds of the element, so simply using the bounds of some GraphicsLayer to determine you should treat an event as a scroll will often be wrong. You really have to hit-test through WebCore to get the correct answer, or be willing to push a lot of information into another data structure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>513548</commentid>
    <comment_count>15</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2011-12-01 23:22:06 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; (In reply to comment #13)
&gt; 
&gt; &gt; Simon: This issue seems to keep coming up a lot lately.  The background here (in case it wasn&apos;t clear) is that we&apos;re working on getting compositing to happen on a thread separate from where the rest of the webkit logic runs. We want to allow that thread to handle basic user input events (mostly scroll for now) on its own whenever possible to improve responsiveness.  In order to effectively do that, we need the composited layer tree nodes to carry more information than they currently do.  Specifically we&apos;ve had the need for:
&gt; &gt; 1. Tagging fixed position layers so that the compositor can position them while scrolling
&gt; &gt; 2. Tagging overflow layers as scrollable 
&gt; &gt; 3. Tagging scroll areas within a layer in order to avoid scrolling the whole page when we should be scrolling an element (this patch)
&gt; &gt; 
&gt; &gt; With enough contortions we could call out from RLC and RLB to the ChromeClient and set those properties directly to the Chromium layers but it feels that these properties could be generally useful for other ports and should be stored directly into the GraphicsLayer&apos;s .  Thoughts?
&gt; 
&gt; The GraphicsLayers tree is an output-only construct, and I think jury-rigging it to contain additional meta-information about the compositing tree may not be the best approach.
&gt; 
&gt; What we really need is:
&gt; * a data structure that describes the transformations that can happen to the compositing tree via scrolling, that is accessible from another thread/process
&gt; * a way to update the (platform-specific) compositing tree on scrolling, from another thread/process
&gt; * a way to notify WebCore that scrolling happened, so it can sync up with the new scroll positions
&gt; 
&gt; I&apos;m concerned about trying to use the GraphicsLayer tree for event handling, also. The bounds of GraphicsLayers often do not correspond with the bounds of the element, so simply using the bounds of some GraphicsLayer to determine you should treat an event as a scroll will often be wrong. You really have to hit-test through WebCore to get the correct answer, or be willing to push a lot of information into another data structure.

What we&apos;re after is simply expanding the set of properties stored on the GraphicsLayers to include those necessary for handling scrolling and basic layer layout on the PlatformLayer tree. The flow of information will remain fundamentally one way: From the RenderLayers to the PlatformLayers via the GraphicsLayer tree.  The WebKit thread will always hold the ground truth for all the properties and the GraphicsLayer tree will remain an output only construct.

The model is very similar to what already exists today for transform/opacity animations that are handled by the compositor.  The compositor may be computing new transform and opacity values over time but it doesn&apos;t (AFAIK) feed them back to the main tree.  The only updates that we see computed on the compositor are additional scroll offsets that need to be reconciled with WebKit&apos;s scrolls but they won&apos;t be feeding back through the GraphicsLayer tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>680305</commentid>
    <comment_count>16</comment_count>
      <attachid>116256</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-07-27 01:49:30 -0700</bug_when>
    <thetext>Comment on attachment 116256
Patch for hit testing input events

This patch seems really old.  I&apos;m clearing the review flag.  If this patch should still be up for review, please feel free to re-nominate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>680343</commentid>
    <comment_count>17</comment_count>
    <who name="Sami Kyöstilä">skyostil</who>
    <bug_when>2012-07-27 02:29:43 -0700</bug_when>
    <thetext>This particular piece of functionality was already done in bug 79155. The remaining items for scrollable sublayers are being implemented as part of bugs 78862 and 91117.

*** This bug has been marked as a duplicate of bug 79155 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116256</attachid>
            <date>2011-11-22 11:41:12 -0800</date>
            <delta_ts>2012-07-27 01:49:29 -0700</delta_ts>
            <desc>Patch for hit testing input events</desc>
            <filename>delegate-scrolling-to-webkit-thread.patch</filename>
            <type>text/plain</type>
            <size>33255</size>
            <attacher name="Sami Kyostila">skyostil</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTAwNikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ3IEBACisyMDExLTExLTIyICBTYW1pIEt5
b3N0aWxhICA8c2t5b3N0aWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gVGhy
ZWFkZWQgY29tcG9zaXRvciBzaG91bGQgZGVsZWdhdGUgb3ZlcmZsb3cgZGl2L2lmcmFtZSBzY3Jv
bGwgZXZlbnRzIHRvIFdlYktpdCB0aHJlYWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTcxMzg1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgVGVzdDogY29tcG9zaXRpbmcvc2Nyb2xsYWJsZS1lbGVtZW50cy1p
bnNpZGUtbGF5ZXIuaHRtbAorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NM
YXllci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpkdW1wUHJvcGVydGll
cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6c2Nyb2xsYWJsZVJlY3RzKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXI6OnNldFNjcm9sbGFibGVSZWN0cyk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0U2Nyb2xsYWJsZVJlY3RzKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6dXBkYXRlU2Nyb2xsYWJs
ZVJlY3RzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xh
eWVyQ2hyb21pdW0uaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXll
ckNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnB1c2hQcm9w
ZXJ0aWVzVG8pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hy
b21pdW0uaDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2hyb21pdW06OnNjcm9sbGFibGVSZWN0
cyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpzZXRTY3JvbGxhYmxlUmVjdHMp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDSW5wdXRIYW5kbGVy
Lmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllckltcGw6OmlzSW5zaWRlU2Nyb2xsYWJsZVJl
Y3QpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBs
Lmg6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVySW1wbDo6c2Nyb2xsYWJsZVJlY3RzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJJbXBsOjpzZXRTY3JvbGxhYmxlUmVjdHMpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0SW1wbDo6Q0NMYXllclRyZWVIb3N0
SW1wbCk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3RJbXBsOjp3aW5kb3dUb1Nj
YWxlZENvbnRlbnRQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3RJbXBs
OjpzY3JvbGxCZWdpbik6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3RJbXBsOjpz
Y3JvbGxCeSk6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3RJbXBsOjpzY3JvbGxF
bmQpOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0SW1wbDo6aXNTY3JvbGxpbmcp
OgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0SW1wbDo6cGluY2hHZXN0dXJlVXBk
YXRlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJl
ZUhvc3RJbXBsLmg6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxheWVyLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckxheWVyOjpzY3JvbGxhYmxlQ2hpbGRyZW4pOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJMYXllci5oOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJMYXll
ckJhY2tpbmcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGF5ZXJCYWNraW5nOjp1cGRh
dGVHcmFwaGljc0xheWVyR2VvbWV0cnkpOgorCiAyMDExLTExLTIyICBTaGlueWEgS2F3YW5ha2Eg
IDxzaGlueWFrQGdvb2dsZS5jb20+CiAKICAgICAgICAgU3BlbGxjaGVjayBzaG91bGQgYmUgYWJs
ZSB0byBydW4gYXN5bmNocm9ub3VzbHkuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1l
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lLmNwcAkocmV2aXNp
b24gMTAxMDAzKQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTkzMyw3ICs5MzMsNyBAQCBDb2xvciBGcmFtZTo6dGlsZWRCYWNraW5nU3RvcmVCYWNr
Z3JvdW5kCiB9CiAjZW5kaWYKIAotU3RyaW5nIEZyYW1lOjpsYXllclRyZWVBc1RleHQoYm9vbCBz
aG93RGVidWdJbmZvKSBjb25zdAorU3RyaW5nIEZyYW1lOjpsYXllclRyZWVBc1RleHQodW5zaWdu
ZWQgZmxhZ3MpIGNvbnN0CiB7CiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogICAg
IGRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOwpAQCAtOTQxLDcgKzk0MSw3IEBAIFN0cmluZyBG
cmFtZTo6bGF5ZXJUcmVlQXNUZXh0KGJvb2wgc2hvd0QKICAgICBpZiAoIWNvbnRlbnRSZW5kZXJl
cigpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKLSAgICByZXR1cm4gY29udGVudFJlbmRl
cmVyKCktPmNvbXBvc2l0b3IoKS0+bGF5ZXJUcmVlQXNUZXh0KHNob3dEZWJ1Z0luZm8pOworICAg
IHJldHVybiBjb250ZW50UmVuZGVyZXIoKS0+Y29tcG9zaXRvcigpLT5sYXllclRyZWVBc1RleHQo
ZmxhZ3MpOwogI2Vsc2UKICAgICByZXR1cm4gU3RyaW5nKCk7CiAjZW5kaWYKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BhZ2UvRnJhbWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdl
L0ZyYW1lLmgJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRnJhbWUu
aAkod29ya2luZyBjb3B5KQpAQCAtMTMyLDcgKzEzMiw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAogICAgICAgICB2b2lkIGluamVjdFVzZXJTY3JpcHRzKFVzZXJTY3JpcHRJbmplY3Rpb25UaW1l
KTsKICAgICAgICAgCi0gICAgICAgIFN0cmluZyBsYXllclRyZWVBc1RleHQoYm9vbCBzaG93RGVi
dWdJbmZvID0gZmFsc2UpIGNvbnN0OworICAgICAgICBTdHJpbmcgbGF5ZXJUcmVlQXNUZXh0KHVu
c2lnbmVkIGZsYWdzID0gMFUpIGNvbnN0OwogCiAgICAgICAgIC8vIFVubGlrZSBtb3N0IGFjY2Vz
c29ycyBpbiB0aGlzIGNsYXNzLCBkb21XaW5kb3coKSBhbHdheXMgY3JlYXRlcyBhIG5ldyBET01X
aW5kb3cgaWYgbV9kb21XaW5kb3cgaXMgbnVsbC4KICAgICAgICAgLy8gQ2FsbGVycyB0aGF0IGRv
bid0IG5lZWQgYSBuZXcgRE9NV2luZG93IHRvIGJlIGNyZWF0ZWQgc2hvdWxkIHVzZSBleGlzdGlu
Z0RPTVdpbmRvdygpLgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3Jh
cGhpY3NMYXllci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NMYXllci5jcHAJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC01NjcsNiArNTY3LDEzIEBAIHZvaWQgR3JhcGhpY3NMYXllcjo6ZHVtcFByb3BlcnRpZXMoVGV4
dFMKICAgICAgICAgdHMgPDwgIilcbiI7CiAgICAgfQogICAgIAorICAgIGlmICgoYmVoYXZpb3Ig
JiBMYXllclRyZWVBc1RleHRTY3JvbGxJbmZvKSAmJiBtX3Njcm9sbGFibGVSZWN0cy5zaXplKCkp
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3Njcm9sbGFibGVSZWN0cy5zaXpl
KCk7IGkrKykgeworICAgICAgICAgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCArIDEpOworICAg
ICAgICAgICAgdHMgPDwgIihzY3JvbGxhYmxlUmVjdCAiIDw8IG1fc2Nyb2xsYWJsZVJlY3RzW2ld
LngoKSA8PCAiICIgPDwgbV9zY3JvbGxhYmxlUmVjdHNbaV0ueSgpIDw8ICIgIiA8PCBtX3Njcm9s
bGFibGVSZWN0c1tpXS53aWR0aCgpIDw8ICIgIiA8PCBtX3Njcm9sbGFibGVSZWN0c1tpXS5oZWln
aHQoKSA8PCAiKVxuIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChtX2NoaWxkcmVuLnNp
emUoKSkgewogICAgICAgICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7CiAgICAgICAgIHRz
IDw8ICIoY2hpbGRyZW4gIiA8PCBtX2NoaWxkcmVuLnNpemUoKSA8PCAiXG4iOwpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkocmV2
aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NMYXllci5oCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3NSw3IEBAIHR5cGVkZWYgdm9pZCog
UGxhdGZvcm1MYXllcjsKIGVudW0gTGF5ZXJUcmVlQXNUZXh0QmVoYXZpb3JGbGFncyB7CiAgICAg
TGF5ZXJUcmVlQXNUZXh0QmVoYXZpb3JOb3JtYWwgPSAwLAogICAgIExheWVyVHJlZUFzVGV4dERl
YnVnID0gMSA8PCAwLCAvLyBEdW1wIGV4dHJhIGRlYnVnZ2luZyBpbmZvIGxpa2UgbGF5ZXIgYWRk
cmVzc2VzLgorICAgIExheWVyVHJlZUFzVGV4dFNjcm9sbEluZm8gPSAxIDw8IDEsIC8vIER1bXAg
bGF5ZXIgc2Nyb2xsaW5nIHJlbGF0ZWQgcHJvcGVydGllcy4KIH07CiB0eXBlZGVmIHVuc2lnbmVk
IExheWVyVHJlZUFzVGV4dEJlaGF2aW9yOwogCkBAIC0zMDAsNiArMzAxLDExIEBAIHB1YmxpYzoK
ICAgICBJbnRSZWN0IGNvbnRlbnRzUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNSZWN0
OyB9CiAgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVjdChjb25zdCBJbnRSZWN0JiByKSB7
IG1fY29udGVudHNSZWN0ID0gcjsgfQogICAgIAorICAgIC8vIFNldCBjb29yZGluYXRlcyBvZiBz
Y3JvbGxhYmxlIGVsZW1lbnRzIGluc2lkZSB0aGUgbGF5ZXIuIFRoZXNlIGFyZSBnaXZlbgorICAg
IC8vIGluIHNjYWxlZCBkb2N1bWVudCBjb29yZGluYXRlcy4KKyAgICBjb25zdCBWZWN0b3I8SW50
UmVjdD4mIHNjcm9sbGFibGVSZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1fc2Nyb2xsYWJsZVJlY3Rz
OyB9CisgICAgdmlydHVhbCB2b2lkIHNldFNjcm9sbGFibGVSZWN0cyhjb25zdCBWZWN0b3I8SW50
UmVjdD4mIHIpIHsgbV9zY3JvbGxhYmxlUmVjdHMgPSByOyB9CisKICAgICAvLyBUcmFuc2l0aW9u
cyBhcmUgaWRlbnRpZmllZCBieSBhIHNwZWNpYWwgYW5pbWF0aW9uIG5hbWUgdGhhdCBjYW5ub3Qg
Y2xhc2ggd2l0aCBhIGtleWZyYW1lIGlkZW50aWZpZXIuCiAgICAgc3RhdGljIFN0cmluZyBhbmlt
YXRpb25OYW1lRm9yVHJhbnNpdGlvbihBbmltYXRlZFByb3BlcnR5SUQpOwogICAgIApAQCAtNDQ2
LDYgKzQ1Miw3IEBAIHByb3RlY3RlZDoKICAgICBGbG9hdFBvaW50IG1fcmVwbGljYXRlZExheWVy
UG9zaXRpb247IC8vIEZvciBhIHJlcGxpY2EgbGF5ZXIsIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVw
bGljYS4KIAogICAgIEludFJlY3QgbV9jb250ZW50c1JlY3Q7CisgICAgVmVjdG9yPEludFJlY3Q+
IG1fc2Nyb2xsYWJsZVJlY3RzOwogCiAgICAgaW50IG1fcmVwYWludENvdW50OwogCkBAIC00NjUs
NCArNDcyLDMgQEAgdm9pZCBzaG93R3JhcGhpY3NMYXllclRyZWUoY29uc3QgV2ViQ29yZQogI2Vu
ZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKIAogI2VuZGlmIC8vIEdyYXBoaWNz
TGF5ZXJfaAotCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHJl
dmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzNyw2ICsz
MzcsMTIgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRzUgogICAgIHVw
ZGF0ZUNvbnRlbnRzUmVjdCgpOwogfQogCit2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0
U2Nyb2xsYWJsZVJlY3RzKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcikKK3sKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRTY3JvbGxhYmxlUmVjdHMocik7CisgICAgdXBkYXRlU2Nyb2xsYWJsZVJlY3Rz
KCk7Cit9CisKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50c1RvSW1hZ2Uo
SW1hZ2UqIGltYWdlKQogewogICAgIGJvb2wgY2hpbGRyZW5DaGFuZ2VkID0gZmFsc2U7CkBAIC02
MjUsNiArNjMxLDExIEBAIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVMYXllckIK
ICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRCYWNrZ3JvdW5kQ29sb3Ioc3RhdGljX2Nhc3Q8
UkdCQTMyPigwKSk7CiB9CiAKK3ZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVTY3Jv
bGxhYmxlUmVjdHMoKQoreworICAgIG1fbGF5ZXItPnNldFNjcm9sbGFibGVSZWN0cyhtX3Njcm9s
bGFibGVSZWN0cyk7Cit9CisKIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjp1cGRhdGVDb250
ZW50c1ZpZGVvKCkKIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
cmFwaGljc0xheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmgJKHdv
cmtpbmcgY29weSkKQEAgLTg1LDYgKzg1LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBz
ZXRDb250ZW50c05lZWRzRGlzcGxheSgpOwogCiAgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRz
UmVjdChjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIHNldFNjcm9sbGFibGVSZWN0
cyhjb25zdCBWZWN0b3I8SW50UmVjdD4mIHIpOwogCiAgICAgdmlydHVhbCB2b2lkIHNldENvbnRl
bnRzVG9JbWFnZShJbWFnZSopOwogICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvTWVkaWEo
UGxhdGZvcm1MYXllciopOwpAQCAtMTIxLDYgKzEyMiw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCB1
cGRhdGVMYXllclByZXNlcnZlczNEKCk7CiAgICAgdm9pZCB1cGRhdGVMYXllckRyYXdzQ29udGVu
dCgpOwogICAgIHZvaWQgdXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICB2b2lkIHVw
ZGF0ZVNjcm9sbGFibGVSZWN0cygpOwogCiAgICAgdm9pZCB1cGRhdGVDb250ZW50c0ltYWdlKCk7
CiAgICAgdm9pZCB1cGRhdGVDb250ZW50c1ZpZGVvKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVt
LmNwcAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwMSw2ICsz
MDEsNyBAQCB2b2lkIExheWVyQ2hyb21pdW06OnB1c2hQcm9wZXJ0aWVzVG8oQ0NMCiAgICAgbGF5
ZXItPnNldFNjcm9sbFBvc2l0aW9uKG1fc2Nyb2xsUG9zaXRpb24pOwogICAgIGxheWVyLT5zZXRT
dWJsYXllclRyYW5zZm9ybShtX3N1YmxheWVyVHJhbnNmb3JtKTsKICAgICBsYXllci0+c2V0VHJh
bnNmb3JtKG1fdHJhbnNmb3JtKTsKKyAgICBsYXllci0+c2V0U2Nyb2xsYWJsZVJlY3RzKG1fc2Ny
b2xsYWJsZVJlY3RzKTsKICAgICBsYXllci0+c2V0VXBkYXRlUmVjdChtX3VwZGF0ZVJlY3QpOwog
ICAgIGxheWVyLT5zZXRTZW50U2Nyb2xsRGVsdGEoSW50U2l6ZSgpKTsKIApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVy
Q2hyb21pdW0uaAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTks
NiArMTk5LDggQEAgcHVibGljOgogICAgIHZvaWQgc2V0RHJhd2FibGVDb250ZW50UmVjdChjb25z
dCBJbnRSZWN0JiByZWN0KSB7IG1fZHJhd2FibGVDb250ZW50UmVjdCA9IHJlY3Q7IH0KICAgICBm
bG9hdCBjb250ZW50c1NjYWxlKCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50c1NjYWxlOyB9CiAg
ICAgdm9pZCBzZXRDb250ZW50c1NjYWxlKGZsb2F0KTsKKyAgICBjb25zdCBWZWN0b3I8SW50UmVj
dD4mIHNjcm9sbGFibGVSZWN0cygpIHsgcmV0dXJuIG1fc2Nyb2xsYWJsZVJlY3RzOyB9CisgICAg
dm9pZCBzZXRTY3JvbGxhYmxlUmVjdHMoY29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cykgeyBt
X3Njcm9sbGFibGVSZWN0cyA9IHJlY3RzOyB9CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW55
IG9mIHRoZSBsYXllcidzIGRlc2NlbmRhbnRzIGhhcyBjb250ZW50IHRvIGRyYXcuCiAgICAgYm9v
bCBkZXNjZW5kYW50RHJhd3NDb250ZW50KCk7CkBAIC0yNzIsNiArMjc0LDcgQEAgcHJpdmF0ZToK
ICAgICBib29sIG1fdXNlc0xheWVyQ2xpcHBpbmc7CiAgICAgYm9vbCBtX2lzTm9uQ29tcG9zaXRl
ZENvbnRlbnQ7CiAgICAgYm9vbCBtX3ByZXNlcnZlczNEOworICAgIFZlY3RvcjxJbnRSZWN0PiBt
X3Njcm9sbGFibGVSZWN0czsKIAogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fdHJhbnNmb3Jt
OwogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fc3VibGF5ZXJUcmFuc2Zvcm07CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0lucHV0SGFuZGxl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL2NjL0NDSW5wdXRIYW5kbGVyLmgJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDSW5wdXRIYW5kbGVyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQ1LDcgKzQ1LDEwIEBAIGNsYXNzIENDSW5wdXRIYW5kbGVyQ2xpZW50IHsK
IHB1YmxpYzoKICAgICB2aXJ0dWFsIGRvdWJsZSBjdXJyZW50VGltZU1zKCkgY29uc3QgPSAwOwog
ICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc1JlZHJhdygpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQg
c2Nyb2xsUm9vdExheWVyKGNvbnN0IEludFNpemUmKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNj
cm9sbEJlZ2luKGNvbnN0IEludFBvaW50JikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzY3JvbGxC
eShjb25zdCBJbnRTaXplJikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzY3JvbGxFbmQoKSA9IDA7
CisgICAgdmlydHVhbCBib29sIGlzU2Nyb2xsaW5nKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwg
Ym9vbCBoYXZlV2hlZWxFdmVudEhhbmRsZXJzKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBwaW5j
aEdlc3R1cmVCZWdpbigpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcGluY2hHZXN0dXJlVXBkYXRl
KGZsb2F0IG1hZ25pZnlEZWx0YSwgY29uc3QgSW50UG9pbnQmIGFuY2hvcikgPSAwOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL2NjL0NDTGF5ZXJJbXBsLmNwcAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMjIsNiArMTIyLDE5IEBAIHZvaWQgQ0NMYXllckltcGw6OmJpbmRDb250ZW50
c1RleHR1cmUoTGEKICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKIH0KIAorYm9vbCBDQ0xheWVy
SW1wbDo6aXNJbnNpZGVTY3JvbGxhYmxlUmVjdChjb25zdCBJbnRQb2ludCYgY29udGVudFBvaW50
KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zY3JvbGxhYmxlUmVjdHMu
c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1fc2Nyb2xsYWJsZVJlY3RzW2ldLmNvbnRhaW5z
KGNvbnRlbnRQb2ludCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlm
IChtX2NoaWxkcmVuW2ldLT5pc0luc2lkZVNjcm9sbGFibGVSZWN0KGNvbnRlbnRQb2ludCkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2
b2lkIENDTGF5ZXJJbXBsOjpzY3JvbGxCeShjb25zdCBJbnRTaXplJiBzY3JvbGwpCiB7CiAgICAg
SW50U2l6ZSBuZXdEZWx0YSA9IG1fc2Nyb2xsRGVsdGEgKyBzY3JvbGw7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
TGF5ZXJJbXBsLmgJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTE2
MCw2ICsxNjAsMTIgQEAgcHVibGljOgogICAgIGNvbnN0IEludFNpemUmIHNjcm9sbERlbHRhKCkg
Y29uc3QgeyByZXR1cm4gbV9zY3JvbGxEZWx0YTsgfQogICAgIHZvaWQgc2V0U2Nyb2xsRGVsdGEo
Y29uc3QgSW50U2l6ZSYpOwogCisgICAgY29uc3QgVmVjdG9yPEludFJlY3Q+JiBzY3JvbGxhYmxl
UmVjdHMoKSBjb25zdCB7IHJldHVybiBtX3Njcm9sbGFibGVSZWN0czsgfQorICAgIHZvaWQgc2V0
U2Nyb2xsYWJsZVJlY3RzKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMpIHsgbV9zY3JvbGxh
YmxlUmVjdHMgPSByZWN0czsgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGEgcG9pbnQgaW4g
c2NhbGVkIGNvbnRlbnQgY29vcmRpbmF0ZXMgaXMgaW5zaWRlIGEgc2Nyb2xsYWJsZSByZWN0YW5n
bGUuCisgICAgYm9vbCBpc0luc2lkZVNjcm9sbGFibGVSZWN0KGNvbnN0IEludFBvaW50JiBjb250
ZW50UG9pbnQpIGNvbnN0OworCiAgICAgZmxvYXQgcGFnZVNjYWxlRGVsdGEoKSBjb25zdCB7IHJl
dHVybiBtX3BhZ2VTY2FsZURlbHRhOyB9CiAgICAgdm9pZCBzZXRQYWdlU2NhbGVEZWx0YShmbG9h
dCk7CiAKQEAgLTIyOSw2ICsyMzUsNyBAQCBwcml2YXRlOgogICAgIEludFBvaW50IG1fc2Nyb2xs
UG9zaXRpb247CiAgICAgYm9vbCBtX3Njcm9sbGFibGU7CiAgICAgQ29sb3IgbV9iYWNrZ3JvdW5k
Q29sb3I7CisgICAgVmVjdG9yPEludFJlY3Q+IG1fc2Nyb2xsYWJsZVJlY3RzOwogCiAgICAgLy8g
V2hldGhlciB0aGUgImJhY2siIG9mIHRoaXMgbGF5ZXIgc2hvdWxkIGRyYXcuCiAgICAgYm9vbCBt
X2RvdWJsZVNpZGVkOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0SW1wbC5j
cHAJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Niw2ICs0Niw3IEBAIENDTGF5ZXJUcmVlSG9zdEltcGw6OkNDTGF5ZXJUcmVlSG9zdEltcGwKICAg
ICAsIG1fc291cmNlRnJhbWVOdW1iZXIoLTEpCiAgICAgLCBtX2ZyYW1lTnVtYmVyKDApCiAgICAg
LCBtX3NldHRpbmdzKHNldHRpbmdzKQorICAgICwgbV9pc1Njcm9sbGluZyhmYWxzZSkKICAgICAs
IG1fdmlzaWJsZSh0cnVlKQogICAgICwgbV9oYXZlV2hlZWxFdmVudEhhbmRsZXJzKGZhbHNlKQog
ICAgICwgbV9wYWdlU2NhbGUoMSkKQEAgLTI5NiwxNyArMjk3LDUwIEBAIHZvaWQgQ0NMYXllclRy
ZWVIb3N0SW1wbDo6c2V0TmVlZHNSZWRyYXcKICAgICBtX2NsaWVudC0+c2V0TmVlZHNSZWRyYXdP
bkltcGxUaHJlYWQoKTsKIH0KIAotdm9pZCBDQ0xheWVyVHJlZUhvc3RJbXBsOjpzY3JvbGxSb290
TGF5ZXIoY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEpCitJbnRQb2ludCBDQ0xheWVyVHJlZUhv
c3RJbXBsOjp3aW5kb3dUb1NjYWxlZENvbnRlbnRQb2ludChjb25zdCBJbnRQb2ludCYgd2luZG93
UG9pbnQpIGNvbnN0CiB7Ci0gICAgVFJBQ0VfRVZFTlQoIkNDTGF5ZXJUcmVlSG9zdEltcGw6OnNj
cm9sbFJvb3RMYXllciIsIHRoaXMsIDApOworICAgIEludFBvaW50IHJlc3VsdCA9IHdpbmRvd1Bv
aW50OworICAgIGlmIChtX3Njcm9sbExheWVySW1wbCkgeworICAgICAgICByZXN1bHQubW92ZUJ5
KG1fc2Nyb2xsTGF5ZXJJbXBsLT5zY3JvbGxQb3NpdGlvbigpICsgbV9zY3JvbGxMYXllckltcGwt
PnNjcm9sbERlbHRhKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIEND
TGF5ZXJUcmVlSG9zdEltcGw6OnNjcm9sbEJlZ2luKGNvbnN0IEludFBvaW50JiB3aW5kb3dQb2lu
dCkKK3sKKyAgICAvLyBGSVhNRTogQ2hlY2sgZm9yIHNjcm9sbGFibGUgc3VibGF5ZXJzLgorICAg
IEludFBvaW50IGNvbnRlbnRQb2ludCh3aW5kb3dUb1NjYWxlZENvbnRlbnRQb2ludCh3aW5kb3dQ
b2ludCkpOworICAgIGlmICghbV9zY3JvbGxMYXllckltcGwgfHwgIW1fc2Nyb2xsTGF5ZXJJbXBs
LT5zY3JvbGxhYmxlKCkgfHwgbV9zY3JvbGxMYXllckltcGwtPmlzSW5zaWRlU2Nyb2xsYWJsZVJl
Y3QoY29udGVudFBvaW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9pc1Njcm9s
bGluZyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NMYXllclRyZWVIb3N0
SW1wbDo6c2Nyb2xsQnkoY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEpCit7CisgICAgVFJBQ0Vf
RVZFTlQoIkNDTGF5ZXJUcmVlSG9zdEltcGw6OnNjcm9sbEJ5IiwgdGhpcywgMCk7CiAgICAgaWYg
KCFtX3Njcm9sbExheWVySW1wbCkKICAgICAgICAgcmV0dXJuOwogCisgICAgaWYgKCFtX2lzU2Ny
b2xsaW5nKQorICAgICAgICByZXR1cm47CisKICAgICBtX3Njcm9sbExheWVySW1wbC0+c2Nyb2xs
Qnkoc2Nyb2xsRGVsdGEpOwogICAgIG1fY2xpZW50LT5zZXROZWVkc0NvbW1pdE9uSW1wbFRocmVh
ZCgpOwogICAgIG1fY2xpZW50LT5zZXROZWVkc1JlZHJhd09uSW1wbFRocmVhZCgpOwogfQogCit2
b2lkIENDTGF5ZXJUcmVlSG9zdEltcGw6OnNjcm9sbEVuZCgpCit7CisgICAgbV9pc1Njcm9sbGlu
ZyA9IGZhbHNlOworfQorCitib29sIENDTGF5ZXJUcmVlSG9zdEltcGw6OmlzU2Nyb2xsaW5nKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9pc1Njcm9sbGluZzsKK30KKwogYm9vbCBDQ0xheWVyVHJl
ZUhvc3RJbXBsOjpoYXZlV2hlZWxFdmVudEhhbmRsZXJzKCkKIHsKICAgICByZXR1cm4gbV9oYXZl
V2hlZWxFdmVudEhhbmRsZXJzOwpAQCAtMzM1LDggKzM2OSw4IEBAIHZvaWQgQ0NMYXllclRyZWVI
b3N0SW1wbDo6cGluY2hHZXN0dXJlVXAKIAogICAgIEZsb2F0U2l6ZSBtb3ZlID0gcHJldlNjYWxl
QW5jaG9yIC0gbmV3U2NhbGVBbmNob3I7CiAKLSAgICBzY3JvbGxSb290TGF5ZXIocm91bmRlZElu
dFNpemUobW92ZSkpOwotCisgICAgbV9zY3JvbGxMYXllckltcGwtPnNjcm9sbEJ5KHJvdW5kZWRJ
bnRTaXplKG1vdmUpKTsKKyAgICBtX2NsaWVudC0+c2V0TmVlZHNDb21taXRPbkltcGxUaHJlYWQo
KTsKICAgICBtX2NsaWVudC0+c2V0TmVlZHNSZWRyYXdPbkltcGxUaHJlYWQoKTsKIH0KIApJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdEltcGwuaAkocmV2aXNpb24gMTAxMDAzKQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC02MSw3ICs2MSwxMCBAQCBwdWJsaWM6CiAg
ICAgLy8gQ0NJbnB1dEhhbmRsZXJUYXJnZXQgaW1wbGVtZW50YXRpb24KICAgICB2aXJ0dWFsIGRv
dWJsZSBjdXJyZW50VGltZU1zKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzUmVk
cmF3KCk7Ci0gICAgdmlydHVhbCB2b2lkIHNjcm9sbFJvb3RMYXllcihjb25zdCBJbnRTaXplJik7
CisgICAgdmlydHVhbCBib29sIHNjcm9sbEJlZ2luKGNvbnN0IEludFBvaW50Jik7CisgICAgdmly
dHVhbCB2b2lkIHNjcm9sbEJ5KGNvbnN0IEludFNpemUmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2Ny
b2xsRW5kKCk7CisgICAgdmlydHVhbCBib29sIGlzU2Nyb2xsaW5nKCkgY29uc3Q7CiAgICAgdmly
dHVhbCBib29sIGhhdmVXaGVlbEV2ZW50SGFuZGxlcnMoKTsKICAgICB2aXJ0dWFsIHZvaWQgcGlu
Y2hHZXN0dXJlQmVnaW4oKTsKICAgICB2aXJ0dWFsIHZvaWQgcGluY2hHZXN0dXJlVXBkYXRlKGZs
b2F0LCBjb25zdCBJbnRQb2ludCYpOwpAQCAtMTIzLDEyICsxMjYsMTQgQEAgcHJpdmF0ZToKICAg
ICB2b2lkIGFwcGx5UGFnZVNjYWxlRGVsdGFUb1Njcm9sbExheWVyKCk7CiAgICAgdm9pZCBhZGp1
c3RTY3JvbGxzRm9yUGFnZVNjYWxlQ2hhbmdlKGZsb2F0KTsKICAgICB2b2lkIHVwZGF0ZU1heFNj
cm9sbFBvc2l0aW9uKCk7CisgICAgSW50UG9pbnQgd2luZG93VG9TY2FsZWRDb250ZW50UG9pbnQo
Y29uc3QgSW50UG9pbnQmIHdpbmRvd1BvaW50KSBjb25zdDsKIAogICAgIE93blB0cjxMYXllclJl
bmRlcmVyQ2hyb21pdW0+IG1fbGF5ZXJSZW5kZXJlcjsKICAgICBSZWZQdHI8Q0NMYXllckltcGw+
IG1fcm9vdExheWVySW1wbDsKICAgICBSZWZQdHI8Q0NMYXllckltcGw+IG1fc2Nyb2xsTGF5ZXJJ
bXBsOwogICAgIENDU2V0dGluZ3MgbV9zZXR0aW5nczsKICAgICBJbnRTaXplIG1fdmlld3BvcnRT
aXplOworICAgIGJvb2wgbV9pc1Njcm9sbGluZzsKICAgICBib29sIG1fdmlzaWJsZTsKICAgICBi
b29sIG1faGF2ZVdoZWVsRXZlbnRIYW5kbGVyczsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckxheWVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyTGF5ZXIuY3BwCShyZXZpc2lvbiAxMDEwMDMpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zODgwLDYgKzM4
ODAsMzMgQEAgR3JhcGhpY3NMYXllciogUmVuZGVyTGF5ZXI6OmxheWVyRm9yU2NybwogewogICAg
IHJldHVybiBtX2JhY2tpbmcgPyBtX2JhY2tpbmctPmxheWVyRm9yU2Nyb2xsQ29ybmVyKCkgOiAw
OwogfQorCitWZWN0b3I8SW50UmVjdD4gUmVuZGVyTGF5ZXI6OnNjcm9sbGFibGVDaGlsZHJlbigp
IGNvbnN0Cit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0gcmVuZGVyZXIoKTsKKyAgICBWZWN0b3I8
SW50UmVjdD4gcmVjdHM7CisKKyAgICAvLyBTa2lwIHRoZSBlbGVtZW50IGl0c2VsZi4KKyAgICBv
ID0gby0+bmV4dEluUHJlT3JkZXIoKTsKKyAgICBjb25zdCBSZW5kZXJMYXllciogYmFzZUxheWVy
ID0gbyA/IG8tPmVuY2xvc2luZ0xheWVyKCkgOiAwOworCisgICAgd2hpbGUgKG8pIHsKKyAgICAg
ICAgUmVuZGVyQm94KiBib3ggPSAwOworICAgICAgICBpZiAoby0+aXNCb3goKSkKKyAgICAgICAg
ICAgIGJveCA9IHRvUmVuZGVyQm94KG8pOworICAgICAgICBpZiAoKGJveCAmJiBib3gtPmNhbkJl
U2Nyb2xsZWRBbmRIYXNTY3JvbGxhYmxlQXJlYSgpKSB8fCBvLT5pc1dpZGdldCgpKSB7CisgICAg
ICAgICAgICBJbnRSZWN0IHIgPSBvLT5hYnNvbHV0ZUJvdW5kaW5nQm94UmVjdCh0cnVlKTsKKyAg
ICAgICAgICAgIHJlY3RzLmFwcGVuZChyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTa2lwIGVs
ZW1lbnRzIGluIGRpZmZlcmVudCBjb21wb3NpdGVkIGxheWVycywgc2luY2Ugd2UgYXJlIG9ubHkg
aW50ZXJlc3RlZCBpbgorICAgICAgICAvLyBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJl
bnQgbGF5ZXIuCisgICAgICAgIGlmIChvLT5lbmNsb3NpbmdMYXllcigpICYmIG8tPmVuY2xvc2lu
Z0xheWVyKCkgIT0gYmFzZUxheWVyICYmIG8tPmVuY2xvc2luZ0xheWVyKCktPmlzQ29tcG9zaXRl
ZCgpKQorICAgICAgICAgICAgbyA9IG8tPm5leHRJblByZU9yZGVyQWZ0ZXJDaGlsZHJlbigpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBvID0gby0+bmV4dEluUHJlT3JkZXIoKTsKKyAgICB9
CisgICAgcmV0dXJuIHJlY3RzOworfQogI2VuZGlmCiAKIGJvb2wgUmVuZGVyTGF5ZXI6OnBhaW50
c1dpdGhUcmFuc2Zvcm0oUGFpbnRCZWhhdmlvciBwYWludEJlaGF2aW9yKSBjb25zdApJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyLmgJKHJldmlzaW9uIDEwMTAwMykKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllci5oCSh3b3JraW5nIGNvcHkpCkBA
IC01MjgsNiArNTI4LDEwIEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIEdyYXBoaWNzTGF5ZXIqIGxh
eWVyRm9ySG9yaXpvbnRhbFNjcm9sbGJhcigpIGNvbnN0OwogICAgIHZpcnR1YWwgR3JhcGhpY3NM
YXllciogbGF5ZXJGb3JWZXJ0aWNhbFNjcm9sbGJhcigpIGNvbnN0OwogICAgIHZpcnR1YWwgR3Jh
cGhpY3NMYXllciogbGF5ZXJGb3JTY3JvbGxDb3JuZXIoKSBjb25zdDsKKworICAgIC8vIEdldCB0
aGUgc2Nyb2xsYWJsZSBhcmVhcyB3aXRoaW4gdGhpcyBsYXllciBpbiBzY2FsZWQgZG9jdW1lbnQg
Y29vcmRpbmF0ZXMuIE9ubHkgdGhlIGVsZW1lbnRzCisgICAgLy8gZGlyZWN0bHkgd2l0aGluIHRo
aXMgbGF5ZXIgYXJlIGNvbnNpZGVyZWQuCisgICAgVmVjdG9yPEludFJlY3Q+IHNjcm9sbGFibGVD
aGlsZHJlbigpIGNvbnN0OwogI2Vsc2UKICAgICBib29sIGlzQ29tcG9zaXRlZCgpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CiAgICAgYm9vbCBoYXNDb21wb3NpdGVkTWFzaygpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJC
YWNraW5nLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
TGF5ZXJCYWNraW5nLmNwcAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUxMiw2ICs1
MTIsMTIgQEAgdm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTAogICAgIG1f
Z3JhcGhpY3NMYXllci0+c2V0Q29udGVudHNSZWN0KGNvbnRlbnRzQm94KCkpOwogICAgIHVwZGF0
ZURyYXdzQ29udGVudCgpOwogICAgIHVwZGF0ZUFmdGVyV2lkZ2V0UmVzaXplKCk7CisKKyAgICBW
ZWN0b3I8SW50UmVjdD4gc2Nyb2xsYWJsZVJlY3RzID0gbV9vd25pbmdMYXllci0+c2Nyb2xsYWJs
ZUNoaWxkcmVuKCk7CisgICAgLy8gUXVlcnlpbmcgc2Nyb2xsYWJsZSBlbGVtZW50IGdlb21ldHJ5
IG1pZ2h0IHRyaWdnZXIgYSBsYXlvdXQgYW5kIGFzIGEgcmVzdWx0IHdlIG1pZ2h0IG5vdCBiZQor
ICAgIC8vIGNvbXBvc2l0ZWQgYW55IGxvbmdlci4KKyAgICBpZiAobV9ncmFwaGljc0xheWVyKQor
ICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldFNjcm9sbGFibGVSZWN0cyhzY3JvbGxhYmxlUmVj
dHMpOwogfQogCiB2b2lkIFJlbmRlckxheWVyQmFja2luZzo6dXBkYXRlSW50ZXJuYWxIaWVyYXJj
aHkoKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRv
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVy
Q29tcG9zaXRvci5jcHAJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMYXllckNvbXBvc2l0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05ODYsNyAr
OTg2LDcgQEAgdm9pZCBSZW5kZXJMYXllckNvbXBvc2l0b3I6OmZyYW1lVmlld0RpZAogICAgICAg
ICBtX3Njcm9sbExheWVyLT5zZXRQb3NpdGlvbihGbG9hdFBvaW50KC1zY3JvbGxQb3NpdGlvbi54
KCksIC1zY3JvbGxQb3NpdGlvbi55KCkpKTsKIH0KIAotU3RyaW5nIFJlbmRlckxheWVyQ29tcG9z
aXRvcjo6bGF5ZXJUcmVlQXNUZXh0KGJvb2wgc2hvd0RlYnVnSW5mbykKK1N0cmluZyBSZW5kZXJM
YXllckNvbXBvc2l0b3I6OmxheWVyVHJlZUFzVGV4dChMYXllclRyZWVBc1RleHRCZWhhdmlvciBm
bGFncykKIHsKICAgICB1cGRhdGVDb21wb3NpdGluZ0xheWVycygpOwogCkBAIC05OTUsNyArOTk1
LDcgQEAgU3RyaW5nIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6bGF5ZXJUcmVlQQogCiAgICAgLy8g
V2Ugc2tpcCBkdW1waW5nIHRoZSBzY3JvbGwgYW5kIGNsaXAgbGF5ZXJzIHRvIGtlZXAgbGF5ZXJU
cmVlQXNUZXh0IG91dHB1dAogICAgIC8vIHNpbWlsYXIgYmV0d2VlbiBwbGF0Zm9ybXMuCi0gICAg
cmV0dXJuIG1fcm9vdENvbnRlbnRMYXllci0+bGF5ZXJUcmVlQXNUZXh0KHNob3dEZWJ1Z0luZm8g
PyBMYXllclRyZWVBc1RleHREZWJ1ZyA6IExheWVyVHJlZUFzVGV4dEJlaGF2aW9yTm9ybWFsKTsK
KyAgICByZXR1cm4gbV9yb290Q29udGVudExheWVyLT5sYXllclRyZWVBc1RleHQoZmxhZ3MpOwog
fQogCiBSZW5kZXJMYXllckNvbXBvc2l0b3IqIFJlbmRlckxheWVyQ29tcG9zaXRvcjo6ZnJhbWVD
b250ZW50c0NvbXBvc2l0b3IoUmVuZGVyUGFydCogcmVuZGVyZXIpCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQ29tcG9zaXRvci5oCShyZXZpc2lvbiAx
MDEwMDMpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJDb21wb3NpdG9y
LmgJKHdvcmtpbmcgY29weSkKQEAgLTE4Niw3ICsxODYsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBm
cmFtZVZpZXdEaWRDaGFuZ2VTaXplKCk7CiAgICAgdm9pZCBmcmFtZVZpZXdEaWRTY3JvbGwoY29u
c3QgTGF5b3V0UG9pbnQmID0gTGF5b3V0UG9pbnQoKSk7CiAKLSAgICBTdHJpbmcgbGF5ZXJUcmVl
QXNUZXh0KGJvb2wgc2hvd0RlYnVnSW5mbyA9IGZhbHNlKTsKKyAgICBTdHJpbmcgbGF5ZXJUcmVl
QXNUZXh0KExheWVyVHJlZUFzVGV4dEJlaGF2aW9yIGZsYWdzID0gTGF5ZXJUcmVlQXNUZXh0QmVo
YXZpb3JOb3JtYWwpOwogCiAgICAgLy8gVGhlc2UgYXJlIG5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0
cyB3aXRoIHRoZSBmdW5jdGlvbnMgaW4gR3JhcGhpY3NMYXllckNsaWVudAogICAgIC8vIFRoZXNl
IHJldHVybiB0aGUgYWN0dWFsIGludGVybmFsIHZhcmlhYmxlcy4KSW5kZXg6IFNvdXJjZS9XZWJL
aXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21p
dW0vQ2hhbmdlTG9nCShyZXZpc2lvbiAxMDEwMDYpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDExLTExLTIyICBT
YW1pIEt5b3N0aWxhICA8c2t5b3N0aWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1
bV0gVGhyZWFkZWQgY29tcG9zaXRvciBzaG91bGQgZGVsZWdhdGUgb3ZlcmZsb3cgZGl2L2lmcmFt
ZSBzY3JvbGwgZXZlbnRzIHRvIFdlYktpdCB0aHJlYWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxMzg1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvV2ViQ29tcG9zaXRvckltcGwuY3BwOgorICAg
ICAgICAoV2ViS2l0OjpXZWJDb21wb3NpdG9ySW1wbDo6aGFuZGxlSW5wdXRFdmVudCk6CisgICAg
ICAgICogdGVzdHMvQ0NMYXllckltcGxUZXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRFU1Qp
OgorICAgICAgICAqIHRlc3RzL0NDTGF5ZXJUcmVlSG9zdEltcGxUZXN0LmNwcDoKKyAgICAgICAg
KFdlYktpdDo6VEVTVF9GKToKKwogMjAxMS0xMS0yMiAgUGF2ZWwgRmVsZG1hbiAgPHBmZWxkbWFu
QGdvb2dsZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogW2Nocm9taXVtXSBmaXggaW50
ZXJuYWN0aXZlIHVpIHRlc3QgZm9yIHNjcmlwdHMgcGFuZWwuCkluZGV4OiBTb3VyY2UvV2ViS2l0
L2Nocm9taXVtL3B1YmxpYy9XZWJGcmFtZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vcHVibGljL1dlYkZyYW1lLmgJKHJldmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYkZyYW1lLmgJKHdvcmtpbmcgY29weSkKQEAgLTg4LDYg
Kzg4LDE0IEBAIHB1YmxpYzoKICAgICB9OwogICAgIHR5cGVkZWYgdW5zaWduZWQgUmVuZGVyQXNU
ZXh0Q29udHJvbHM7CiAKKyAgICAvLyBDb250cm9sIG9mIGxheWVyVHJlZUFzVGV4dCBvdXRwdXQK
KyAgICBlbnVtIExheWVyVHJlZUFzVGV4dEJlaGF2aW9yRmxhZ3MgeworICAgICAgICBMYXllclRy
ZWVBc1RleHRCZWhhdmlvck5vcm1hbCA9IDAsCisgICAgICAgIExheWVyVHJlZUFzVGV4dERlYnVn
ID0gMSA8PCAwLAorICAgICAgICBMYXllclRyZWVBc1RleHRTY3JvbGxJbmZvID0gMSA8PCAxLAor
ICAgIH07CisgICAgdHlwZWRlZiB1bnNpZ25lZCBMYXllclRyZWVBc1RleHRCZWhhdmlvcjsKKwog
ICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBsaXZlIFdlYkZyYW1lIG9iamVjdHMsIHVzZWQg
Zm9yIGxlYWsgY2hlY2tpbmcuCiAgICAgV0VCS0lUX0VYUE9SVCBzdGF0aWMgaW50IGluc3RhbmNl
Q291bnQoKTsKIApAQCAtNTk5LDcgKzYwNyw3IEBAIHB1YmxpYzoKIAogICAgIC8vIER1bXBzIHRo
ZSBsYXllciB0cmVlLCB1c2VkIGJ5IHRoZSBhY2NlbGVyYXRlZCBjb21wb3NpdG9yLCBpbgogICAg
IC8vIHRleHQgZm9ybS4gVGhpcyBpcyB1c2VkIG9ubHkgYnkgbGF5b3V0IHRlc3RzLgotICAgIHZp
cnR1YWwgV2ViU3RyaW5nIGxheWVyVHJlZUFzVGV4dChib29sIHNob3dEZWJ1Z0luZm8gPSBmYWxz
ZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGxheWVyVHJlZUFzVGV4dChMYXll
clRyZWVBc1RleHRCZWhhdmlvciBmbGFncyA9IExheWVyVHJlZUFzVGV4dEJlaGF2aW9yTm9ybWFs
KSBjb25zdCA9IDA7CiAKIHByb3RlY3RlZDoKICAgICB+V2ViRnJhbWUoKSB7IH0KSW5kZXg6IFNv
dXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkNvbXBvc2l0b3JJbXBsLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJDb21wb3NpdG9ySW1wbC5jcHAJKHJl
dmlzaW9uIDEwMTAwMykKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkNvbXBvc2l0
b3JJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTE5LDkgKzExOSwxMiBAQCB2b2lkIFdlYkNv
bXBvc2l0b3JJbXBsOjpoYW5kbGVJbnB1dEV2ZW50CiAKICAgICBpZiAoZXZlbnQudHlwZSA9PSBX
ZWJJbnB1dEV2ZW50OjpNb3VzZVdoZWVsICYmICFtX2lucHV0SGFuZGxlckNsaWVudC0+aGF2ZVdo
ZWVsRXZlbnRIYW5kbGVycygpKSB7CiAgICAgICAgIGNvbnN0IFdlYk1vdXNlV2hlZWxFdmVudCYg
d2hlZWxFdmVudCA9ICpzdGF0aWNfY2FzdDxjb25zdCBXZWJNb3VzZVdoZWVsRXZlbnQqPigmZXZl
bnQpOwotICAgICAgICBtX2lucHV0SGFuZGxlckNsaWVudC0+c2Nyb2xsUm9vdExheWVyKEludFNp
emUoLXdoZWVsRXZlbnQuZGVsdGFYLCAtd2hlZWxFdmVudC5kZWx0YVkpKTsKLSAgICAgICAgbV9j
bGllbnQtPmRpZEhhbmRsZUlucHV0RXZlbnQoKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICBp
ZiAobV9pbnB1dEhhbmRsZXJDbGllbnQtPnNjcm9sbEJlZ2luKEludFBvaW50KHdoZWVsRXZlbnQu
eCwgd2hlZWxFdmVudC55KSkpIHsKKyAgICAgICAgICAgIG1faW5wdXRIYW5kbGVyQ2xpZW50LT5z
Y3JvbGxCeShJbnRTaXplKC13aGVlbEV2ZW50LmRlbHRhWCwgLXdoZWVsRXZlbnQuZGVsdGFZKSk7
CisgICAgICAgICAgICBtX2lucHV0SGFuZGxlckNsaWVudC0+c2Nyb2xsRW5kKCk7CisgICAgICAg
ICAgICBtX2NsaWVudC0+ZGlkSGFuZGxlSW5wdXRFdmVudCgpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CiAgICAgfQogICAgIG1fY2xpZW50LT5kaWROb3RIYW5kbGVJbnB1dEV2ZW50
KHRydWUgLyogc2VuZFRvV2lkZ2V0ICovKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21p
dW0vc3JjL1dlYkZyYW1lSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJv
bWl1bS9zcmMvV2ViRnJhbWVJbXBsLmNwcAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkz
OSwxMSArMTkzOSwxMSBAQCBib29sIFdlYkZyYW1lSW1wbDo6cGF1c2VTVkdBbmltYXRpb24oY29u
CiAjZW5kaWYKIH0KIAotV2ViU3RyaW5nIFdlYkZyYW1lSW1wbDo6bGF5ZXJUcmVlQXNUZXh0KGJv
b2wgc2hvd0RlYnVnSW5mbykgY29uc3QKK1dlYlN0cmluZyBXZWJGcmFtZUltcGw6OmxheWVyVHJl
ZUFzVGV4dChMYXllclRyZWVBc1RleHRCZWhhdmlvciBmbGFncykgY29uc3QKIHsKICAgICBpZiAo
IW1fZnJhbWUpCiAgICAgICAgIHJldHVybiBXZWJTdHJpbmcoKTsKLSAgICByZXR1cm4gV2ViU3Ry
aW5nKG1fZnJhbWUtPmxheWVyVHJlZUFzVGV4dChzaG93RGVidWdJbmZvKSk7CisgICAgcmV0dXJu
IFdlYlN0cmluZyhtX2ZyYW1lLT5sYXllclRyZWVBc1RleHQoZmxhZ3MpKTsKIH0KIAogLy8gV2Vi
RnJhbWVJbXBsIHB1YmxpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KSW5kZXg6IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZy
YW1lSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZy
YW1lSW1wbC5oCShyZXZpc2lvbiAxMDEwMDMpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJGcmFtZUltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMjA2LDcgKzIwNiw3IEBAIHB1Ymxp
YzoKICAgICB2aXJ0dWFsIGJvb2wgcGF1c2VTVkdBbmltYXRpb24oY29uc3QgV2ViU3RyaW5nJiBh
bmltYXRpb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRp
bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlN0cmluZyYg
ZWxlbWVudElkKTsKLSAgICB2aXJ0dWFsIFdlYlN0cmluZyBsYXllclRyZWVBc1RleHQoYm9vbCBz
aG93RGVidWdJbmZvID0gZmFsc2UpIGNvbnN0OworICAgIHZpcnR1YWwgV2ViU3RyaW5nIGxheWVy
VHJlZUFzVGV4dChMYXllclRyZWVBc1RleHRCZWhhdmlvciBmbGFncyA9IExheWVyVHJlZUFzVGV4
dEJlaGF2aW9yTm9ybWFsKSBjb25zdDsKIAogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFdlYkZyYW1l
SW1wbD4gY3JlYXRlKFdlYkZyYW1lQ2xpZW50KiBjbGllbnQpOwogICAgIHZpcnR1YWwgfldlYkZy
YW1lSW1wbCgpOwpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVySW1w
bFRlc3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvQ0NM
YXllckltcGxUZXN0LmNwcAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYktpdC9jaHJv
bWl1bS90ZXN0cy9DQ0xheWVySW1wbFRlc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OCw2ICs4
OCw4IEBAIFRFU1QoQ0NMYXllckltcGxUZXN0LCB2ZXJpZnlMYXllckNoYW5nZXMKICAgICBDb2xv
ciBhcmJpdHJhcnlDb2xvciA9IENvbG9yKDEwLCAyMCwgMzApOwogICAgIFRyYW5zZm9ybWF0aW9u
TWF0cml4IGFyYml0cmFyeVRyYW5zZm9ybTsKICAgICBhcmJpdHJhcnlUcmFuc2Zvcm0uc2NhbGUz
ZCgwLjEsIDAuMiwgMC4zKTsKKyAgICBWZWN0b3I8SW50UmVjdD4gYXJiaXRyYXJ5SW50UmVjdFZl
Y3RvcjsKKyAgICBhcmJpdHJhcnlJbnRSZWN0VmVjdG9yLmFwcGVuZChJbnRSZWN0KDU1NSwgNjY2
LCA3NzcsIDg4OCkpOwogCiAgICAgLy8gQ2hhbmdpbmcgdGhlc2UgcHJvcGVydGllcyBhZmZlY3Rz
IHRoZSBlbnRpcmUgc3VidHJlZSBvZiBsYXllcnMuCiAgICAgRVhFQ1VURV9BTkRfVkVSSUZZX1NV
QlRSRUVfQ0hBTkdFRChyb290LT5zZXRBbmNob3JQb2ludChhcmJpdHJhcnlGbG9hdFBvaW50KSk7
CkBAIC0xNjMsNiArMTY1LDcgQEAgVEVTVChDQ0xheWVySW1wbFRlc3QsIHZlcmlmeUxheWVyQ2hh
bmdlcwogICAgIEVYRUNVVEVfQU5EX1ZFUklGWV9TVUJUUkVFX0RJRF9OT1RfQ0hBTkdFKHJvb3Qt
PnNldFVwZGF0ZVJlY3QoYXJiaXRyYXJ5RmxvYXRSZWN0KSk7CiAgICAgRVhFQ1VURV9BTkRfVkVS
SUZZX1NVQlRSRUVfRElEX05PVF9DSEFOR0Uocm9vdC0+c2V0VmlzaWJsZUxheWVyUmVjdChhcmJp
dHJhcnlJbnRSZWN0KSk7CiAgICAgRVhFQ1VURV9BTkRfVkVSSUZZX1NVQlRSRUVfRElEX05PVF9D
SEFOR0Uocm9vdC0+c2V0TWF4U2Nyb2xsUG9zaXRpb24oYXJiaXRyYXJ5SW50U2l6ZSkpOworICAg
IEVYRUNVVEVfQU5EX1ZFUklGWV9TVUJUUkVFX0RJRF9OT1RfQ0hBTkdFKHJvb3QtPnNldFNjcm9s
bGFibGVSZWN0cyhhcmJpdHJhcnlJbnRSZWN0VmVjdG9yKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNl
CkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5ZXJUcmVlSG9zdEltcGxU
ZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0NDTGF5
ZXJUcmVlSG9zdEltcGxUZXN0LmNwcAkocmV2aXNpb24gMTAxMDAzKQorKysgU291cmNlL1dlYktp
dC9jaHJvbWl1bS90ZXN0cy9DQ0xheWVyVHJlZUhvc3RJbXBsVGVzdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTE1Myw3ICsxNTMsOSBAQCBURVNUX0YoQ0NMYXllclRyZWVIb3N0SW1wbFRlc3QsIHNj
cm9sbFJvCiAgICAgcm9vdC0+c2V0U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQoMCwgMCkpOwogICAg
IHJvb3QtPnNldE1heFNjcm9sbFBvc2l0aW9uKEludFNpemUoMTAwLCAxMDApKTsKICAgICBtX2hv
c3RJbXBsLT5zZXRSb290TGF5ZXIocm9vdCk7Ci0gICAgbV9ob3N0SW1wbC0+c2Nyb2xsUm9vdExh
eWVyKEludFNpemUoMCwgMTApKTsKKyAgICBtX2hvc3RJbXBsLT5zY3JvbGxCZWdpbihJbnRQb2lu
dCgwLCAwKSk7CisgICAgbV9ob3N0SW1wbC0+c2Nyb2xsQnkoSW50U2l6ZSgwLCAxMCkpOworICAg
IG1faG9zdEltcGwtPnNjcm9sbEVuZCgpOwogICAgIEVYUEVDVF9UUlVFKG1fZGlkUmVxdWVzdFJl
ZHJhdyk7CiAgICAgRVhQRUNUX1RSVUUobV9kaWRSZXF1ZXN0Q29tbWl0KTsKIH0KSW5kZXg6IFRv
b2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0xheW91dFRlc3RDb250cm9sbGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlvdXRUZXN0Q29udHJv
bGxlci5jcHAJKHJldmlzaW9uIDEwMTAwMykKKysrIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9t
aXVtL0xheW91dFRlc3RDb250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTkxMSw3ICsx
OTExLDEwIEBAIHZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnN0YXJ0U3BlZWNoSW4KIAogdm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bGF5ZXJUcmVlQXNUZXh0KGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYgYXJncywgQ3BwVmFyaWFudCogcmVzdWx0KQogewotICAgIHJlc3VsdC0+c2V0KG1fc2hl
bGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCktPmxheWVyVHJlZUFzVGV4dChtX3Nob3dEZWJ1Z0xh
eWVyVHJlZSkudXRmOCgpKTsKKyAgICBXZWJGcmFtZTo6TGF5ZXJUcmVlQXNUZXh0QmVoYXZpb3Ig
ZmxhZ3MgPSBtX3Nob3dEZWJ1Z0xheWVyVHJlZSA/IFdlYkZyYW1lOjpMYXllclRyZWVBc1RleHRE
ZWJ1ZyA6IFdlYkZyYW1lOjpMYXllclRyZWVBc1RleHRCZWhhdmlvck5vcm1hbDsKKyAgICBpZiAo
YXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdLmlzTnVtYmVyKCkpCisgICAgICAgIGZsYWdzIHw9
IGFyZ3NbMF0udG9JbnQzMigpOworICAgIHJlc3VsdC0+c2V0KG1fc2hlbGwtPndlYlZpZXcoKS0+
bWFpbkZyYW1lKCktPmxheWVyVHJlZUFzVGV4dChmbGFncykudXRmOCgpKTsKIH0KIAogdm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6bG9zZUNvbXBvc2l0b3JDb250ZXh0KGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJncywgQ3BwVmFyaWFudCopCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMDEwMDYpCisr
KyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBAQAor
MjAxMS0xMS0yMiAgU2FtaSBLeW9zdGlsYSAgPHNreW9zdGlsQGNocm9taXVtLm9yZz4KKworICAg
ICAgICBbY2hyb21pdW1dIFRocmVhZGVkIGNvbXBvc2l0b3Igc2hvdWxkIGRlbGVnYXRlIG92ZXJm
bG93IGRpdi9pZnJhbWUgc2Nyb2xsIGV2ZW50cyB0byBXZWJLaXQgdGhyZWFkCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTM4NQorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogY29tcG9zaXRpbmcvc2Nyb2xs
YWJsZS1lbGVtZW50cy1pbnNpZGUtbGF5ZXItZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAg
KiBjb21wb3NpdGluZy9zY3JvbGxhYmxlLWVsZW1lbnRzLWluc2lkZS1sYXllci5odG1sOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1bS1saW51eC9jb21wb3NpdGluZy9zY3JvbGxh
YmxlLWVsZW1lbnRzLWluc2lkZS1sYXllci1leHBlY3RlZC50eHQ6IEFkZGVkLgorCiAyMDExLTEx
LTIyICBTaGlueWEgS2F3YW5ha2EgIDxzaGlueWFrQGdvb2dsZS5jb20+CiAKICAgICAgICAgU3Bl
bGxjaGVjayBzaG91bGQgYmUgYWJsZSB0byBydW4gYXN5bmNocm9ub3VzbHkKSW5kZXg6IExheW91
dFRlc3RzL2NvbXBvc2l0aW5nL3Njcm9sbGFibGUtZWxlbWVudHMtaW5zaWRlLWxheWVyLWV4cGVj
dGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9jb21wb3NpdGluZy9zY3JvbGxhYmxl
LWVsZW1lbnRzLWluc2lkZS1sYXllci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlv
dXRUZXN0cy9jb21wb3NpdGluZy9zY3JvbGxhYmxlLWVsZW1lbnRzLWluc2lkZS1sYXllci1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjAgQEAKKworVGVzdCB0aGF0IGEgUmVu
ZGVyTGF5ZXIgaGFzIGtub3dsZWRnZSBvZiB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50cyB3aXRoaW4g
aXQuCisKKyhHcmFwaGljc0xheWVyCisgIChib3VuZHMgODAwLjAwIDY1Ny4wMCkKKyAgKGNoaWxk
cmVuIDEKKyAgICAoR3JhcGhpY3NMYXllcgorICAgICAgKGJvdW5kcyA4MDAuMDAgNjU3LjAwKQor
ICAgICAgKHNjcm9sbGFibGVSZWN0IDAgMCA2MDAgMzAwKQorICAgICAgKHNjcm9sbGFibGVSZWN0
IDAgMzAwIDYwMCAzMDApCisgICAgICAoY2hpbGRyZW4gMQorICAgICAgICAoR3JhcGhpY3NMYXll
cgorICAgICAgICAgIChwb3NpdGlvbiAwLjAwIDY1Ny4wMCkKKyAgICAgICAgICAoYm91bmRzIDgw
MC4wMCAwLjAwKQorICAgICAgICApCisgICAgICApCisgICAgKQorICApCispCisKClByb3BlcnR5
IGNoYW5nZXMgb246IExheW91dFRlc3RzL2NvbXBvc2l0aW5nL3Njcm9sbGFibGUtZWxlbWVudHMt
aW5zaWRlLWxheWVyLWV4cGVjdGVkLnR4dApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxl
CiAgICsgTEYKCkluZGV4OiBMYXlvdXRUZXN0cy9jb21wb3NpdGluZy9zY3JvbGxhYmxlLWVsZW1l
bnRzLWluc2lkZS1sYXllci5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2NvbXBvc2l0
aW5nL3Njcm9sbGFibGUtZWxlbWVudHMtaW5zaWRlLWxheWVyLmh0bWwJKHJldmlzaW9uIDApCisr
KyBMYXlvdXRUZXN0cy9jb21wb3NpdGluZy9zY3JvbGxhYmxlLWVsZW1lbnRzLWluc2lkZS1sYXll
ci5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxo
dG1sPgorPGhlYWQ+CisgICAgPHRpdGxlPlRlc3Qgc2Nyb2xsYWJsZSBlbGVtZW50cyBpbnNpZGUg
YSBsYXllcjwvdGl0bGU+CisgICAgPHN0eWxlPgorICAgICAgICBib2R5IHsKKyAgICAgICAgICAg
IG1hcmdpbjogMHB4OworICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICAgICAgfQor
ICAgICAgICBkaXYub3V0ZXIgeworICAgICAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKKyAgICAg
ICAgICAgIHdpZHRoOiA2MDBweDsKKyAgICAgICAgICAgIGhlaWdodDogMzAwcHg7CisgICAgICAg
IH0KKyAgICAgICAgZGl2LmlubmVyIHsKKyAgICAgICAgICAgIHdpZHRoOiAxMDAwcHg7CisgICAg
ICAgICAgICBoZWlnaHQ6IDgwMHB4OworICAgICAgICB9CisgICAgICAgIGlmcmFtZSB7CisgICAg
ICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICB3aWR0aDogNjAwcHg7CisgICAgICAg
ICAgICBoZWlnaHQ6IDMwMHB4OworICAgICAgICB9CisgICAgICAgICN0cmlnZ2VyLWNvbXBvc2l0
aW9uIHsKKyAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7CisgICAg
ICAgIH0KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorPHNjcmlwdD4KKyAgICBpZiAobGF5b3V0VGVz
dENvbnRyb2xsZXIpCisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQodHJ1
ZSk7CisgICAgZnVuY3Rpb24gZG9UZXN0KCkgeworICAgICAgICBpZiAoIWxheW91dFRlc3RDb250
cm9sbGVyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2YXIgTGF5ZXJUcmVlQXNUZXh0
U2Nyb2xsSW5mbyA9IDI7CisgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYXllcnMn
KS5pbm5lclRleHQgPSBsYXlvdXRUZXN0Q29udHJvbGxlci5sYXllclRyZWVBc1RleHQoTGF5ZXJU
cmVlQXNUZXh0U2Nyb2xsSW5mbyk7CisgICAgfQorICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVy
KCdsb2FkJywgZG9UZXN0LCBmYWxzZSk7Cis8L3NjcmlwdD4KKzxib2R5PgorICAgIDxkaXYgY2xh
c3M9Im91dGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iaW5uZXIiPjwvZGl2PgorICAgIDwvZGl2
PgorCisgICAgPGlmcmFtZSBzcmM9ImlmcmFtZS9yZXNvdXJjZXMvc3ViZnJhbWUuaHRtbCI+PC9p
ZnJhbWU+CisKKyAgICA8cD5UZXN0IHRoYXQgYSBSZW5kZXJMYXllciBoYXMga25vd2xlZGdlIG9m
IHRoZSBzY3JvbGxhYmxlIGVsZW1lbnRzIHdpdGhpbiBpdC48L3A+CisgICAgPHByZSBpZD0ibGF5
ZXJzIj48L3ByZT4KKyAgICA8ZGl2IGlkPSJ0cmlnZ2VyLWNvbXBvc2l0aW9uIj4KKzwvYm9keT4K
KzwvaHRtbD4KClByb3BlcnR5IGNoYW5nZXMgb246IExheW91dFRlc3RzL2NvbXBvc2l0aW5nL3Nj
cm9sbGFibGUtZWxlbWVudHMtaW5zaWRlLWxheWVyLmh0bWwKX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3Zu
OmVvbC1zdHlsZQogICArIExGCgpJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0t
bGludXgvY29tcG9zaXRpbmcvc2Nyb2xsYWJsZS1lbGVtZW50cy1pbnNpZGUtbGF5ZXItZXhwZWN0
ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4
L2NvbXBvc2l0aW5nL3Njcm9sbGFibGUtZWxlbWVudHMtaW5zaWRlLWxheWVyLWV4cGVjdGVkLnR4
dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Nv
bXBvc2l0aW5nL3Njcm9sbGFibGUtZWxlbWVudHMtaW5zaWRlLWxheWVyLWV4cGVjdGVkLnR4dAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMCBAQAorCitUZXN0IHRoYXQgYSBSZW5kZXJMYXllciBo
YXMga25vd2xlZGdlIG9mIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnRzIHdpdGhpbiBpdC4KKworKEdy
YXBoaWNzTGF5ZXIKKyAgKGJvdW5kcyA4MDAuMDAgNjU3LjAwKQorICAoY2hpbGRyZW4gMQorICAg
IChHcmFwaGljc0xheWVyCisgICAgICAoYm91bmRzIDgwMC4wMCA2NTcuMDApCisgICAgICAoc2Ny
b2xsYWJsZVJlY3QgMCAwIDYwMCAzMDApCisgICAgICAoc2Nyb2xsYWJsZVJlY3QgMCAzMDAgNjAw
IDMwMCkKKyAgICAgIChjaGlsZHJlbiAxCisgICAgICAgIChHcmFwaGljc0xheWVyCisgICAgICAg
ICAgKHBvc2l0aW9uIDAuMDAgNjU3LjAwKQorICAgICAgICAgIChib3VuZHMgODAwLjAwIDAuMDAp
CisgICAgICAgICkKKyAgICAgICkKKyAgICApCisgICkKKykKKwoKUHJvcGVydHkgY2hhbmdlcyBv
bjogTGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvY29tcG9zaXRpbmcvc2Nyb2xs
YWJsZS1lbGVtZW50cy1pbnNpZGUtbGF5ZXItZXhwZWN0ZWQudHh0Cl9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6
IHN2bjplb2wtc3R5bGUKICAgKyBMRgoK
</data>

          </attachment>
      

    </bug>

</bugzilla>