<?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>131553</bug_id>
          
          <creation_ts>2014-04-11 11:55:49 -0700</creation_ts>
          <short_desc>Snapshotted plugins may need to be restarted if style properties are changed after initial load of plugin.</short_desc>
          <delta_ts>2014-04-15 17:27:32 -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>Plug-ins</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="Roger Fong">roger_fong</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dino</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>jonlee</cc>
    
    <cc>roger_fong</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>999964</commentid>
    <comment_count>0</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-11 11:55:49 -0700</bug_when>
    <thetext>When looking at the method subframeLoaderWillCreatePlugin you&apos;ll notice that the state of the plugin sometimes can depend on the style.
The style can change at any point. It can also be resolved after the initial load of the plugin, which could cause a plugin to be snapshotted when it shouldn&apos;t be.

For example, consider a plugin that is styled to be 1x1. 
The 1x1 plugin should never be snapshotted but if the style isn&apos;t resolved before the initial load of the plugin we assume the default RenderReplaced size for the plugin (300 x 150).
A plugin at this size will indeed get snapshotted. Thus we end up with a 1x1 plugin that is snapshotted.

When performing postLayoutTasks we checkSnapshotStatus. 
I think this would be a good place to also check to see if the style conditions are met.
If they are and the plugin is currently snapshotted then we should restart the plugin so that it actually runs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>999972</commentid>
    <comment_count>1</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-11 12:09:26 -0700</bug_when>
    <thetext>&lt;rdar://problem/15443375&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>999979</commentid>
    <comment_count>2</comment_count>
      <attachid>229149</attachid>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-11 12:15:51 -0700</bug_when>
    <thetext>Created attachment 229149
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>999996</commentid>
    <comment_count>3</comment_count>
      <attachid>229149</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2014-04-11 13:17:41 -0700</bug_when>
    <thetext>Comment on attachment 229149
patch

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

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:620
&gt; +            auto&amp; style = renderEmbedded.style();
&gt; +            bool isFullPage = is100Percent(style.width()) &amp;&amp; is100Percent(style.height());
&gt; +            IntSize visibleViewSize = document().frame()-&gt;view()-&gt;visibleSize();
&gt; +            float contentArea = contentWidth * contentHeight;
&gt; +            float visibleArea = visibleViewSize.width() * visibleViewSize.height();
&gt; +            if (isFullPage &amp;&amp; contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold) {

You should share this code with HTMLPlugInImageElement::subframeLoaderWillCreatePlugIn().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000057</commentid>
    <comment_count>4</comment_count>
      <attachid>229149</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-04-11 15:23:24 -0700</bug_when>
    <thetext>Comment on attachment 229149
patch

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

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:634
&gt; +        checkSizeChangeForSnapshotting();

This has weird indention. Is this the only thing that the &apos;if&apos; statement is meant to control? Or do you need brackets so the return is part of this test, too?

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:640
&gt; +    }

Bad whitespace.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000085</commentid>
    <comment_count>5</comment_count>
      <attachid>229173</attachid>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-11 16:03:52 -0700</bug_when>
    <thetext>Created attachment 229173
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000095</commentid>
    <comment_count>6</comment_count>
      <attachid>229173</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2014-04-11 16:09:59 -0700</bug_when>
    <thetext>Comment on attachment 229173
patch

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

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:604
&gt; +bool HTMLPlugInImageElement::isTopLevelFullPage(const RenderEmbeddedObject&amp; renderEmbedded, int contentWidth, int contentHeight)

Fewer weird abbreviations please!
isTopLevelFullPagePlugin(const RenderEmbeddedObject&amp; embeddedObject, ...

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:606
&gt; +    if (document().frame()-&gt;isMainFrame()) {

if (!document().frame()-&gt;isMainFrame())
  return false

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:613
&gt; +        if (isFullPage &amp;&amp; contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold)
&gt; +            return true;

return isFullPage &amp;&amp; (contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold);

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:622
&gt; +    if (contentWidth &lt;= sizingTinyDimensionThreshold || contentHeight &lt;= sizingTinyDimensionThreshold)
&gt; +        return true;
&gt; +    return false;

return (contentWidth &lt;= sizingTinyDimensionThreshold || contentHeight &lt;= sizingTinyDimensionThreshold)

This could be a local static function.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:630
&gt; +        auto&amp; renderEmbedded = toRenderEmbeddedObject(*this-&gt;renderer());

Why not use the renderEmbeddedObject() function (and check its return value)?

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:642
&gt; +        if (displayState() == Playing)
&gt; +        checkSizeChangeForSnapshotting();

Wrong indentation.

&gt; Source/WebCore/html/HTMLPlugInImageElement.h:144
&gt; +    bool isTopLevelFullPage(const RenderEmbeddedObject&amp;, int contentWidth, int contentHeight);

Should be a const function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000105</commentid>
    <comment_count>7</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-11 16:28:42 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 229173 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=229173&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:604
&gt; &gt; +bool HTMLPlugInImageElement::isTopLevelFullPage(const RenderEmbeddedObject&amp; renderEmbedded, int contentWidth, int contentHeight)
&gt; 
&gt; Fewer weird abbreviations please!
&gt; isTopLevelFullPagePlugin(const RenderEmbeddedObject&amp; embeddedObject, ...
&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:606
&gt; &gt; +    if (document().frame()-&gt;isMainFrame()) {
&gt; 
&gt; if (!document().frame()-&gt;isMainFrame())
&gt;   return false
&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:613
&gt; &gt; +        if (isFullPage &amp;&amp; contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold)
&gt; &gt; +            return true;
&gt; 
&gt; return isFullPage &amp;&amp; (contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold);
&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:622
&gt; &gt; +    if (contentWidth &lt;= sizingTinyDimensionThreshold || contentHeight &lt;= sizingTinyDimensionThreshold)
&gt; &gt; +        return true;
&gt; &gt; +    return false;
&gt; 
&gt; return (contentWidth &lt;= sizingTinyDimensionThreshold || contentHeight &lt;= sizingTinyDimensionThreshold)
&gt; 
&gt; This could be a local static function.
&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:630
&gt; &gt; +        auto&amp; renderEmbedded = toRenderEmbeddedObject(*this-&gt;renderer());
&gt; 
&gt; Why not use the renderEmbeddedObject() function (and check its return value)?

Should I assert that it&apos;s not null? When would it not exist?

&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:642
&gt; &gt; +        if (displayState() == Playing)
&gt; &gt; +        checkSizeChangeForSnapshotting();
&gt; 
&gt; Wrong indentation.
&gt; 
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.h:144
&gt; &gt; +    bool isTopLevelFullPage(const RenderEmbeddedObject&amp;, int contentWidth, int contentHeight);
&gt; 
&gt; Should be a const function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000109</commentid>
    <comment_count>8</comment_count>
      <attachid>229179</attachid>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-11 16:38:08 -0700</bug_when>
    <thetext>Created attachment 229179
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000216</commentid>
    <comment_count>9</comment_count>
      <attachid>229179</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-04-12 13:04:07 -0700</bug_when>
    <thetext>Comment on attachment 229179
patch

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

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:604
&gt; +static inline bool isSmallerThanTinySizingThreshold(int contentWidth, int contentHeight)

This should take a LayoutSize instead of two ints for the height and width. I would suggest just calling it size. I’m not sure that “content size” says anything more than “size” does. What other size would it be?

Maybe a const LayoutSize&amp; or maybe just LayoutSize would be better.

Or maybe we should just have this function take a RenderEmbeddedObject&amp; instead. That would be more convenient in both call sites.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:606
&gt; +    return (contentWidth &lt;= sizingTinyDimensionThreshold || contentHeight &lt;= sizingTinyDimensionThreshold);

No need for the parentheses here.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:609
&gt; +bool HTMLPlugInImageElement::isTopLevelFullPagePlugin(const RenderEmbeddedObject* renderEmbedded, int contentWidth, int contentHeight) const

This should take a RenderEmbeddedObject&amp;, not a const RenderEmbeddedObject*. Or const if you insist, but it should not be a pointer since it can never be null. Also, I suggest naming this just “renderer”. There’s no need to encode the type in the name.

This function should get the contentBoxRect from the renderer. It’s not really valuable to pass it in, since both callers compute it the same way.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:612
&gt; +    if (!document().frame()-&gt;isMainFrame())
&gt; +        return false;

Since we use Frame more than once in this function I suggest putting it in a reference:

    Frame&amp; frame = *document().frame();

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:615
&gt; +    bool isFullPage = is100Percent(style.width()) &amp;&amp; is100Percent(style.height());

Instead of a boolean, we should have an early return here. That’s one of the advantages of moving this to a separate function. No need to compute the areas below if the styles aren’t 100%.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:619
&gt; +    IntSize visibleViewSize = document().frame()-&gt;view()-&gt;visibleSize();
&gt; +    float contentArea = contentWidth * contentHeight;
&gt; +    float visibleArea = visibleViewSize.width() * visibleViewSize.height();
&gt; +    return isFullPage &amp;&amp; (contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold);

If we made an area helper function (overloaded for IntSize and LayoutSize) then these four lines could be written in one line like this:

    return area(renderer.contentBoxRect()) &gt; area(frame.view()-&gt;visibleSize()) * sizingFullPageAreaRatioThreshold;

I think that’s better.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:627
&gt; +        RenderEmbeddedObject* renderEmbedded = renderEmbeddedObject();

This should be a reference. The code above will already crash if the renderer is null so there is no point in using a pointer.

The type of this should be RenderSnapshottedPlugIn, not RenderEmbeddedObject. We always want to use the most-specific type we can, based on the type check we did. And here, the type check is isSnapshottedPlugIn, not isEmbeddedObject.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:628
&gt; +        ASSERT(renderer);

Looks like this won’t compile, because the code above uses the name renderEmbedded.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:732
&gt; +    RenderEmbeddedObject* renderer = renderEmbeddedObject();

This local variable should remain a reference, not a pointer. The patch changes it to a pointer for no good reason.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000396</commentid>
    <comment_count>10</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2014-04-13 23:22:09 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; &gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:619
&gt; &gt; +    IntSize visibleViewSize = document().frame()-&gt;view()-&gt;visibleSize();
&gt; &gt; +    float contentArea = contentWidth * contentHeight;
&gt; &gt; +    float visibleArea = visibleViewSize.width() * visibleViewSize.height();
&gt; &gt; +    return isFullPage &amp;&amp; (contentArea &gt; visibleArea * sizingFullPageAreaRatioThreshold);
&gt; 
&gt; If we made an area helper function (overloaded for IntSize and LayoutSize) then these four lines could be written in one line like this:
&gt; 
&gt;     return area(renderer.contentBoxRect()) &gt; area(frame.view()-&gt;visibleSize()) * sizingFullPageAreaRatioThreshold;
&gt; 

There already is an area() member function on IntSize. We don&apos;t have one on LayoutSize. I like the idea of a helper function so here is a patch: http://webkit.org/b/131606</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000521</commentid>
    <comment_count>11</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2014-04-14 10:18:27 -0700</bug_when>
    <thetext>I have some concerns here that it’s possible for a plugin to resize thrice to get to a non snapshotted state with this patch.

- Plugin starts off small, decision = MaySnapshotWhenResized

- Plugin gets resized larger, decision = Snapshotted

- Plugin gets resized small again; we restart the plugin but decision remains Snapshotted

- Plugin gets resized large again; the plugin does not get snapshotted

I think we need to make sure that the restart path we’re allowing here is specifically the case where the plugin starts off at the default plugin size (300x150) and then gets resized later to a small size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000524</commentid>
    <comment_count>12</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2014-04-14 10:22:29 -0700</bug_when>
    <thetext>Also, can we write a test for this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000538</commentid>
    <comment_count>13</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-14 10:52:43 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; I have some concerns here that it’s possible for a plugin to resize thrice to get to a non snapshotted state with this patch.
&gt; 
&gt; - Plugin starts off small, decision = MaySnapshotWhenResized
&gt; 
&gt; - Plugin gets resized larger, decision = Snapshotted
&gt; 
&gt; - Plugin gets resized small again; we restart the plugin but decision remains Snapshotted
&gt; 
&gt; - Plugin gets resized large again; the plugin does not get snapshotted

Shouldn&apos;t we just change the decision everytime the plugin gets resized?

&gt; 
&gt; I think we need to make sure that the restart path we’re allowing here is specifically the case where the plugin starts off at the default plugin size (300x150) and then gets resized later to a small size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000539</commentid>
    <comment_count>14</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-14 10:55:32 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; Also, can we write a test for this?

Hmm...I guess we could do something have a timer to apply CSS and then check to see if the plugin has shadow dom content (the snapshot), I&apos;m assuming this is doable via layout tests somehow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000540</commentid>
    <comment_count>15</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-14 10:57:23 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #11)
&gt; &gt; I have some concerns here that it’s possible for a plugin to resize thrice to get to a non snapshotted state with this patch.
&gt; &gt; 
&gt; &gt; - Plugin starts off small, decision = MaySnapshotWhenResized
&gt; &gt; 
&gt; &gt; - Plugin gets resized larger, decision = Snapshotted
&gt; &gt; 
&gt; &gt; - Plugin gets resized small again; we restart the plugin but decision remains Snapshotted

Wouldn&apos;t setting decision = MaySnapshotWhenResized here (which is the change I made comes into play), do the trick?

&gt; &gt; 
&gt; &gt; - Plugin gets resized large again; the plugin does not get snapshotted
&gt; 
&gt; Shouldn&apos;t we just change the decision everytime the plugin gets resized?
&gt; 
&gt; &gt; 
&gt; &gt; I think we need to make sure that the restart path we’re allowing here is specifically the case where the plugin starts off at the default plugin size (300x150) and then gets resized later to a small size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1000667</commentid>
    <comment_count>16</comment_count>
      <attachid>229326</attachid>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-14 17:20:59 -0700</bug_when>
    <thetext>Created attachment 229326
patch

In this version of the patch we only restart the plugin if the dimensions are changed to being too small if the existing dimensions were not specified yet (using default intrinsic size).

If the dimensions were already specified then we want to stick with whatever snapshotting decision was made with those initial dimensions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1001018</commentid>
    <comment_count>17</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-15 16:18:13 -0700</bug_when>
    <thetext>ping</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1001027</commentid>
    <comment_count>18</comment_count>
      <attachid>229326</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-04-15 16:27:00 -0700</bug_when>
    <thetext>Comment on attachment 229326
patch

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

This is fine with me as long as the behavior is fine with Jon/Dean, but please confirm.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:609
&gt; +    int contentWidth = contentRect.width();
&gt; +    int contentHeight = contentRect.height();

why the temporaries? they&apos;re only used once below.

&gt; Source/WebCore/html/HTMLPlugInImageElement.cpp:646
&gt; +    if (!renderer()-&gt;isSnapshottedPlugIn()) {

if you move this above the previous block, you can get rid of that check in its condition

&gt; LayoutTests/plugins/snapshotting/set-plugin-size-to-tiny.html:15
&gt; +        testRunner.notifyDone()

semicolon</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1001051</commentid>
    <comment_count>19</comment_count>
    <who name="Roger Fong">roger_fong</who>
    <bug_when>2014-04-15 17:27:32 -0700</bug_when>
    <thetext>Committed http://trac.webkit.org/changeset/167339
w/ Tim&apos;s comments.

Behavior was discussed with Jon earlier.
thx!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>229149</attachid>
            <date>2014-04-11 12:15:51 -0700</date>
            <delta_ts>2014-04-11 16:03:52 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>4119</size>
            <attacher name="Roger Fong">roger_fong</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NzEwNykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE5IEBACisyMDE0LTA0LTEwICBSb2dlciBG
b25nICA8cm9nZXJfZm9uZ0BhcHBsZS5jb20+CisKKyAgICAgICAgU25hcHNob3R0ZWQgcGx1Z2lu
cyBtYXkgbmVlZCB0byBiZSByZXN0YXJ0ZWQgaWYgc3R5bGUgcHJvcGVydGllcyBhcmUgY2hhbmdl
ZCBhZnRlciBpbml0aWFsIGxvYWQgb2YgcGx1Z2luLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNTUzLgorICAgICAgICA8cmRhcjovL3Byb2JsZW0v
MTU0NDMzNzU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2hlbiB1cGRhdGluZyBlbWJlZGRlZCBvYmplY3RzIGR1cmluZyBvdXIgcG9zdCBsYXlvdXQg
Y2hlY2tzLCBjaGVjayBmb3IgY2VydGFpbiBzdHlsZSBjaGFuZ2VzCisgICAgICAgIHRoYXQgbWF5
IHJlc3VsdCBpbiB0aGUgcGx1Z2luIG5lZWRpbmcgdG8gYmUgcmVzdGFydGVkLgorCisgICAgICAg
ICogaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxQbHVnSW5JbWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMpOgorICAgICAgICBUb29r
IHN0eWxlIHJlbGF0ZWQgY2hlY2tzIGZyb20gc3ViZnJhbWVMb2FkZXJXaWxsQ3JlYXRlUGx1Z2lu
IGFuZCBjaGVja2VkIGZvciB0aGVtIGhlcmUgYXMgd2VsbAorICAgICAgICB0byBkZXRlcm1pbmUg
d2hldGhlciBvciBub3Qgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBzbmFwc2hvdHRlZCBwbHVnaW4u
CisKIDIwMTQtMDQtMTAgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KIAogICAg
ICAgICBpT1MgYnVpbGQgZml4IHRvIGRlYWwgd2l0aCBDb3JlVGV4dCBjaGFuZ2VzLgpJbmRleDog
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCShyZXZp
c2lvbiAxNjY4OTQpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1l
bnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNTIsMTggKzM1Miw2IEBAIHZvaWQgSFRNTFBsdWdJ
bkltYWdlRWxlbWVudDo6dXBkYXRlU25hcHMKICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgp
OwogfQogCi12b2lkIEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMo
KQotewotICAgIGlmICghcmVuZGVyZXIoKS0+aXNTbmFwc2hvdHRlZFBsdWdJbigpKSB7Ci0gICAg
ICAgIGlmIChkaXNwbGF5U3RhdGUoKSA9PSBQbGF5aW5nKQotICAgICAgICAgICAgY2hlY2tTaXpl
Q2hhbmdlRm9yU25hcHNob3R0aW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAv
LyBOb3RpZnkgdGhlIHNoYWRvdyByb290IHRoYXQgdGhlIHNpemUgY2hhbmdlZCBzbyB0aGF0IHdl
IG1heSB1cGRhdGUgdGhlIG92ZXJsYXkgbGF5b3V0LgotICAgIGVuc3VyZVVzZXJBZ2VudFNoYWRv
d1Jvb3QoKS5kaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlc2l6ZUV2
ZW50LCB0cnVlLCBmYWxzZSkpOwotfQotCiBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBwbHVnSW5J
bWFnZUVsZW1lbnRJc29sYXRlZFdvcmxkKCkKIHsKICAgICBzdGF0aWMgRE9NV3JhcHBlcldvcmxk
JiBpc29sYXRlZFdvcmxkID0gKkRPTVdyYXBwZXJXb3JsZDo6Y3JlYXRlKEpTRE9NV2luZG93Ojpj
b21tb25WTSgpKS5sZWFrUmVmKCk7CkBAIC02MTMsNiArNjAxLDQ0IEBAIHN0YXRpYyBpbmxpbmUg
Ym9vbCBpczEwMFBlcmNlbnQoTGVuZ3RoIGwKICAgICByZXR1cm4gbGVuZ3RoLmlzUGVyY2VudCgp
ICYmIGxlbmd0aC5wZXJjZW50KCkgPT0gMTAwOwogfQogCit2b2lkIEhUTUxQbHVnSW5JbWFnZUVs
ZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMoKQoreworICAgIGF1dG8mIHJlbmRlckVtYmVkZGVk
ID0gdG9SZW5kZXJFbWJlZGRlZE9iamVjdCgqdGhpcy0+cmVuZGVyZXIoKSk7CisgICAgTGF5b3V0
UmVjdCBjb250ZW50UmVjdCA9IHJlbmRlckVtYmVkZGVkLmNvbnRlbnRCb3hSZWN0KCk7CisgICAg
aW50IGNvbnRlbnRXaWR0aCA9IGNvbnRlbnRSZWN0LndpZHRoKCk7CisgICAgaW50IGNvbnRlbnRI
ZWlnaHQgPSBjb250ZW50UmVjdC5oZWlnaHQoKTsKKyAgICAKKyAgICAvLyBTbmFwc2hvdCBzdGF0
dXMgY291bGQgYmUgYWZmZWN0ZWQgYnkgc3R5bGUgY2hhbmdlcy4KKyAgICAvLyBJZiB0aGUgc3R5
bGUgaGFzIGNoYW5nZWQgb24gdXMgYW5kIHdlJ3ZlIHNuYXBzaG90dGVkIHRoZSBwbHVnaW4gd2Ug
bmVlZCB0byByZXN0YXJ0IHRoZSBwbHVnaW4gc28gdGhhdCB0aGUgc3RhdGUgY2FuIGJlIHVwZGF0
ZWQgYXBwcm9wcmlhdGVseS4KKyAgICBpZiAoIWRvY3VtZW50KCkucGFnZSgpLT5zZXR0aW5ncygp
LnNuYXBzaG90QWxsUGx1Z0lucygpICYmIHJlbmRlcmVyKCktPmlzU25hcHNob3R0ZWRQbHVnSW4o
KSAmJiBkaXNwbGF5U3RhdGUoKSA8PSBEaXNwbGF5aW5nU25hcHNob3QpIHsKKyAgICAgICAgaWYg
KGRvY3VtZW50KCkuZnJhbWUoKS0+aXNNYWluRnJhbWUoKSkgeworICAgICAgICAgICAgYXV0byYg
c3R5bGUgPSByZW5kZXJFbWJlZGRlZC5zdHlsZSgpOworICAgICAgICAgICAgYm9vbCBpc0Z1bGxQ
YWdlID0gaXMxMDBQZXJjZW50KHN0eWxlLndpZHRoKCkpICYmIGlzMTAwUGVyY2VudChzdHlsZS5o
ZWlnaHQoKSk7CisgICAgICAgICAgICBJbnRTaXplIHZpc2libGVWaWV3U2l6ZSA9IGRvY3VtZW50
KCkuZnJhbWUoKS0+dmlldygpLT52aXNpYmxlU2l6ZSgpOworICAgICAgICAgICAgZmxvYXQgY29u
dGVudEFyZWEgPSBjb250ZW50V2lkdGggKiBjb250ZW50SGVpZ2h0OworICAgICAgICAgICAgZmxv
YXQgdmlzaWJsZUFyZWEgPSB2aXNpYmxlVmlld1NpemUud2lkdGgoKSAqIHZpc2libGVWaWV3U2l6
ZS5oZWlnaHQoKTsKKyAgICAgICAgICAgIGlmIChpc0Z1bGxQYWdlICYmIGNvbnRlbnRBcmVhID4g
dmlzaWJsZUFyZWEgKiBzaXppbmdGdWxsUGFnZUFyZWFSYXRpb1RocmVzaG9sZCkgeworICAgICAg
ICAgICAgICAgIHJlc3RhcnRTbmFwc2hvdHRlZFBsdWdJbigpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNv
bnRlbnRXaWR0aCA8PSBzaXppbmdUaW55RGltZW5zaW9uVGhyZXNob2xkIHx8IGNvbnRlbnRIZWln
aHQgPD0gc2l6aW5nVGlueURpbWVuc2lvblRocmVzaG9sZCkgeworICAgICAgICAgICAgcmVzdGFy
dFNuYXBzaG90dGVkUGx1Z0luKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgaWYgKCFyZW5kZXJlcigpLT5pc1NuYXBzaG90dGVkUGx1Z0luKCkpIHsK
KyAgICAgICAgaWYgKGRpc3BsYXlTdGF0ZSgpID09IFBsYXlpbmcpCisgICAgICAgIGNoZWNrU2l6
ZUNoYW5nZUZvclNuYXBzaG90dGluZygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAor
ICAgIC8vIE5vdGlmeSB0aGUgc2hhZG93IHJvb3QgdGhhdCB0aGUgc2l6ZSBjaGFuZ2VkIHNvIHRo
YXQgd2UgbWF5IHVwZGF0ZSB0aGUgb3ZlcmxheSBsYXlvdXQuCisgICAgZW5zdXJlVXNlckFnZW50
U2hhZG93Um9vdCgpLmRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkucmVz
aXplRXZlbnQsIHRydWUsIGZhbHNlKSk7CisgICAgfQorICAgIAogdm9pZCBIVE1MUGx1Z0luSW1h
Z2VFbGVtZW50OjpzdWJmcmFtZUxvYWRlcldpbGxDcmVhdGVQbHVnSW4oY29uc3QgVVJMJiB1cmwp
CiB7CiAgICAgTE9HKFBsdWdpbnMsICIlcCBQbHVnLWluIFVSTDogJXMiLCB0aGlzLCBtX3VybC51
dGY4KCkuZGF0YSgpKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>229173</attachid>
            <date>2014-04-11 16:03:52 -0700</date>
            <delta_ts>2014-04-11 16:38:08 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>7160</size>
            <attacher name="Roger Fong">roger_fong</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NzE2NikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDE0LTA0LTEwICBSb2dlciBG
b25nICA8cm9nZXJfZm9uZ0BhcHBsZS5jb20+CisKKyAgICAgICAgU25hcHNob3R0ZWQgcGx1Z2lu
cyBtYXkgbmVlZCB0byBiZSByZXN0YXJ0ZWQgaWYgc3R5bGUgcHJvcGVydGllcyBhcmUgY2hhbmdl
ZCBhZnRlciBpbml0aWFsIGxvYWQgb2YgcGx1Z2luLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNTUzLgorICAgICAgICA8cmRhcjovL3Byb2JsZW0v
MTU0NDMzNzU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2hlbiB1cGRhdGluZyBlbWJlZGRlZCBvYmplY3RzIGR1cmluZyBvdXIgcG9zdCBsYXlvdXQg
Y2hlY2tzLCBjaGVjayBmb3IgY2VydGFpbiBzdHlsZSBjaGFuZ2VzCisgICAgICAgIHRoYXQgbWF5
IHJlc3VsdCBpbiB0aGUgcGx1Z2luIG5lZWRpbmcgdG8gYmUgcmVzdGFydGVkLgorCisgICAgICAg
ICogaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxQbHVnSW5JbWFnZUVsZW1lbnQ6OmlzVG9wTGV2ZWxGdWxsUGFnZSk6IAorICAgICAgICBSZWZh
Y3RvcmluZywgbW92ZSBjaGVjayBmb3Igd2hldGhlciBvciBub3QgcGx1Z2luIGlzIHRvcCBsZXZl
bCBmdWxsIHBhZ2UgdG8gdGhpcyBtZXRob2QuCisgICAgICAgIChXZWJDb3JlOjpIVE1MUGx1Z0lu
SW1hZ2VFbGVtZW50Ojppc1NtYWxsZXJUaGFuVGlueVNpemluZ1RocmVzaG9sZCk6IAorICAgICAg
ICBSZWZhY3RvcmluZywgbW92ZSBjaGVjayBmb3Igd2hldGhlciBvciBub3QgcGx1Z2luIGlzIHNt
YWxsZXIgdGhhbiB0aGUgdGlueSBwbHVnaW4gc2l6ZSB0aHJlc2hvbGQgdG8gdGhpcyBtZXRob2Qu
CisgICAgICAgIChXZWJDb3JlOjpIVE1MUGx1Z0luSW1hZ2VFbGVtZW50OjpjaGVja1NuYXBzaG90
U3RhdHVzKTogCisgICAgICAgIFVzZSByZWZhY3RvcmVkIGNoZWNrcyBoZXJlIGFzIHdlbGwgdG8g
ZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgc25hcHNob3R0
ZWQgcGx1Z2luLgorICAgICAgICAoV2ViQ29yZTo6SFRNTFBsdWdJbkltYWdlRWxlbWVudDo6c3Vi
ZnJhbWVMb2FkZXJXaWxsQ3JlYXRlUGx1Z0luKTogVXNlIHJlZmFjdG9yZWQgY2hlY2tzLgorICAg
ICAgICAqIGh0bWwvSFRNTFBsdWdJbkltYWdlRWxlbWVudC5oOgorCiAyMDE0LTA0LTExICBCZW0g
Sm9uZXMtQmV5ICA8YmpvbmVzYmVAYWRvYmUuY29tPgogCiAgICAgICAgIENsZWFyIHNpYmxpbmcg
ZmxvYXRzIHdoaWxlIHNwbGl0dGluZyBpbmxpbmUgZmxvdwpJbmRleDogU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNjY4OTQpCisr
KyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNTIsMTggKzM1Miw2IEBAIHZvaWQgSFRNTFBsdWdJbkltYWdlRWxlbWVudDo6
dXBkYXRlU25hcHMKICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwogfQogCi12b2lkIEhU
TUxQbHVnSW5JbWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMoKQotewotICAgIGlmICgh
cmVuZGVyZXIoKS0+aXNTbmFwc2hvdHRlZFBsdWdJbigpKSB7Ci0gICAgICAgIGlmIChkaXNwbGF5
U3RhdGUoKSA9PSBQbGF5aW5nKQotICAgICAgICAgICAgY2hlY2tTaXplQ2hhbmdlRm9yU25hcHNo
b3R0aW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHNo
YWRvdyByb290IHRoYXQgdGhlIHNpemUgY2hhbmdlZCBzbyB0aGF0IHdlIG1heSB1cGRhdGUgdGhl
IG92ZXJsYXkgbGF5b3V0LgotICAgIGVuc3VyZVVzZXJBZ2VudFNoYWRvd1Jvb3QoKS5kaXNwYXRj
aEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlc2l6ZUV2ZW50LCB0cnVlLCBmYWxz
ZSkpOwotfQotCiBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBwbHVnSW5JbWFnZUVsZW1lbnRJc29s
YXRlZFdvcmxkKCkKIHsKICAgICBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBpc29sYXRlZFdvcmxk
ID0gKkRPTVdyYXBwZXJXb3JsZDo6Y3JlYXRlKEpTRE9NV2luZG93Ojpjb21tb25WTSgpKS5sZWFr
UmVmKCk7CkBAIC02MTIsNyArNjAwLDUzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpczEwMFBlcmNl
bnQoTGVuZ3RoIGwKIHsKICAgICByZXR1cm4gbGVuZ3RoLmlzUGVyY2VudCgpICYmIGxlbmd0aC5w
ZXJjZW50KCkgPT0gMTAwOwogfQotCisgICAgCitib29sIEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ6
OmlzVG9wTGV2ZWxGdWxsUGFnZShjb25zdCBSZW5kZXJFbWJlZGRlZE9iamVjdCYgcmVuZGVyRW1i
ZWRkZWQsIGludCBjb250ZW50V2lkdGgsIGludCBjb250ZW50SGVpZ2h0KQoreworICAgIGlmIChk
b2N1bWVudCgpLmZyYW1lKCktPmlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgYXV0byYgc3R5bGUg
PSByZW5kZXJFbWJlZGRlZC5zdHlsZSgpOworICAgICAgICBib29sIGlzRnVsbFBhZ2UgPSBpczEw
MFBlcmNlbnQoc3R5bGUud2lkdGgoKSkgJiYgaXMxMDBQZXJjZW50KHN0eWxlLmhlaWdodCgpKTsK
KyAgICAgICAgSW50U2l6ZSB2aXNpYmxlVmlld1NpemUgPSBkb2N1bWVudCgpLmZyYW1lKCktPnZp
ZXcoKS0+dmlzaWJsZVNpemUoKTsKKyAgICAgICAgZmxvYXQgY29udGVudEFyZWEgPSBjb250ZW50
V2lkdGggKiBjb250ZW50SGVpZ2h0OworICAgICAgICBmbG9hdCB2aXNpYmxlQXJlYSA9IHZpc2li
bGVWaWV3U2l6ZS53aWR0aCgpICogdmlzaWJsZVZpZXdTaXplLmhlaWdodCgpOworICAgICAgICBp
ZiAoaXNGdWxsUGFnZSAmJiBjb250ZW50QXJlYSA+IHZpc2libGVBcmVhICogc2l6aW5nRnVsbFBh
Z2VBcmVhUmF0aW9UaHJlc2hvbGQpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorICAgIAorYm9vbCBIVE1MUGx1Z0luSW1hZ2VFbGVtZW50Ojpp
c1NtYWxsZXJUaGFuVGlueVNpemluZ1RocmVzaG9sZChpbnQgY29udGVudFdpZHRoLCBpbnQgY29u
dGVudEhlaWdodCkKK3sKKyAgICBpZiAoY29udGVudFdpZHRoIDw9IHNpemluZ1RpbnlEaW1lbnNp
b25UaHJlc2hvbGQgfHwgY29udGVudEhlaWdodCA8PSBzaXppbmdUaW55RGltZW5zaW9uVGhyZXNo
b2xkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisgICAgCit2
b2lkIEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMoKQoreworICAg
IC8vIFNuYXBzaG90IHN0YXR1cyBjb3VsZCBiZSBhZmZlY3RlZCBieSBzdHlsZSBjaGFuZ2VzLgor
ICAgIC8vIElmIHRoZSBzdHlsZSBoYXMgY2hhbmdlZCBvbiB1cyBhbmQgd2UndmUgc25hcHNob3R0
ZWQgdGhlIHBsdWdpbiB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHBsdWdpbiBzbyB0aGF0IHRoZSBz
dGF0ZSBjYW4gYmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5LgorICAgIGlmICghZG9jdW1lbnQoKS5w
YWdlKCktPnNldHRpbmdzKCkuc25hcHNob3RBbGxQbHVnSW5zKCkgJiYgcmVuZGVyZXIoKS0+aXNT
bmFwc2hvdHRlZFBsdWdJbigpICYmIGRpc3BsYXlTdGF0ZSgpIDw9IERpc3BsYXlpbmdTbmFwc2hv
dCkgeworICAgICAgICBhdXRvJiByZW5kZXJFbWJlZGRlZCA9IHRvUmVuZGVyRW1iZWRkZWRPYmpl
Y3QoKnRoaXMtPnJlbmRlcmVyKCkpOworICAgICAgICBMYXlvdXRSZWN0IGNvbnRlbnRSZWN0ID0g
cmVuZGVyRW1iZWRkZWQuY29udGVudEJveFJlY3QoKTsKKyAgICAgICAgaW50IGNvbnRlbnRXaWR0
aCA9IGNvbnRlbnRSZWN0LndpZHRoKCk7CisgICAgICAgIGludCBjb250ZW50SGVpZ2h0ID0gY29u
dGVudFJlY3QuaGVpZ2h0KCk7CisgICAgICAgIGlmIChpc1RvcExldmVsRnVsbFBhZ2UocmVuZGVy
RW1iZWRkZWQsIGNvbnRlbnRXaWR0aCwgY29udGVudEhlaWdodCkgfHwgaXNTbWFsbGVyVGhhblRp
bnlTaXppbmdUaHJlc2hvbGQoY29udGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KSkgeworICAgICAg
ICAgICAgcmVzdGFydFNuYXBzaG90dGVkUGx1Z0luKCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFyZW5kZXJlcigpLT5pc1NuYXBzaG90dGVk
UGx1Z0luKCkpIHsKKyAgICAgICAgaWYgKGRpc3BsYXlTdGF0ZSgpID09IFBsYXlpbmcpCisgICAg
ICAgIGNoZWNrU2l6ZUNoYW5nZUZvclNuYXBzaG90dGluZygpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIAorICAgIC8vIE5vdGlmeSB0aGUgc2hhZG93IHJvb3QgdGhhdCB0aGUgc2l6ZSBj
aGFuZ2VkIHNvIHRoYXQgd2UgbWF5IHVwZGF0ZSB0aGUgb3ZlcmxheSBsYXlvdXQuCisgICAgZW5z
dXJlVXNlckFnZW50U2hhZG93Um9vdCgpLmRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVu
dE5hbWVzKCkucmVzaXplRXZlbnQsIHRydWUsIGZhbHNlKSk7Cit9CisgICAgCiB2b2lkIEhUTUxQ
bHVnSW5JbWFnZUVsZW1lbnQ6OnN1YmZyYW1lTG9hZGVyV2lsbENyZWF0ZVBsdWdJbihjb25zdCBV
UkwmIHVybCkKIHsKICAgICBMT0coUGx1Z2lucywgIiVwIFBsdWctaW4gVVJMOiAlcyIsIHRoaXMs
IG1fdXJsLnV0ZjgoKS5kYXRhKCkpOwpAQCAtNjk2LDI2ICs3MzAsMTkgQEAgdm9pZCBIVE1MUGx1
Z0luSW1hZ2VFbGVtZW50OjpzdWJmcmFtZUxvYQogICAgICAgICBtX3NuYXBzaG90RGVjaXNpb24g
PSBOZXZlclNuYXBzaG90OwogICAgICAgICByZXR1cm47CiAgICAgfQotCisgICAgCiAgICAgYXV0
byYgcmVuZGVyZXIgPSB0b1JlbmRlckVtYmVkZGVkT2JqZWN0KCp0aGlzLT5yZW5kZXJlcigpKTsK
ICAgICBMYXlvdXRSZWN0IGNvbnRlbnRSZWN0ID0gcmVuZGVyZXIuY29udGVudEJveFJlY3QoKTsK
ICAgICBpbnQgY29udGVudFdpZHRoID0gY29udGVudFJlY3Qud2lkdGgoKTsKICAgICBpbnQgY29u
dGVudEhlaWdodCA9IGNvbnRlbnRSZWN0LmhlaWdodCgpOwotCi0gICAgaWYgKGluTWFpbkZyYW1l
KSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0gcmVuZGVyZXIuc3R5bGUoKTsKLSAgICAgICAgYm9v
bCBpc0Z1bGxQYWdlID0gaXMxMDBQZXJjZW50KHN0eWxlLndpZHRoKCkpICYmIGlzMTAwUGVyY2Vu
dChzdHlsZS5oZWlnaHQoKSk7Ci0gICAgICAgIEludFNpemUgdmlzaWJsZVZpZXdTaXplID0gZG9j
dW1lbnQoKS5mcmFtZSgpLT52aWV3KCktPnZpc2libGVTaXplKCk7Ci0gICAgICAgIGZsb2F0IGNv
bnRlbnRBcmVhID0gY29udGVudFdpZHRoICogY29udGVudEhlaWdodDsKLSAgICAgICAgZmxvYXQg
dmlzaWJsZUFyZWEgPSB2aXNpYmxlVmlld1NpemUud2lkdGgoKSAqIHZpc2libGVWaWV3U2l6ZS5o
ZWlnaHQoKTsKLSAgICAgICAgaWYgKGlzRnVsbFBhZ2UgJiYgY29udGVudEFyZWEgPiB2aXNpYmxl
QXJlYSAqIHNpemluZ0Z1bGxQYWdlQXJlYVJhdGlvVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICBM
T0coUGx1Z2lucywgIiVwIFBsdWctaW4gaXMgdG9wIGxldmVsIGZ1bGwgcGFnZSwgc2V0IHRvIHBs
YXkiLCB0aGlzKTsKLSAgICAgICAgICAgIG1fc25hcHNob3REZWNpc2lvbiA9IE5ldmVyU25hcHNo
b3Q7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAKKyAgICBpZiAoaXNUb3BM
ZXZlbEZ1bGxQYWdlKHJlbmRlcmVyLCBjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQpKSB7Cisg
ICAgICAgIExPRyhQbHVnaW5zLCAiJXAgUGx1Zy1pbiBpcyB0b3AgbGV2ZWwgZnVsbCBwYWdlLCBz
ZXQgdG8gcGxheSIsIHRoaXMpOworICAgICAgICBtX3NuYXBzaG90RGVjaXNpb24gPSBOZXZlclNu
YXBzaG90OworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGNvbnRlbnRXaWR0aCA8
PSBzaXppbmdUaW55RGltZW5zaW9uVGhyZXNob2xkIHx8IGNvbnRlbnRIZWlnaHQgPD0gc2l6aW5n
VGlueURpbWVuc2lvblRocmVzaG9sZCkgeworICAgIGlmIChpc1NtYWxsZXJUaGFuVGlueVNpemlu
Z1RocmVzaG9sZChjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQpKSB7CiAgICAgICAgIExPRyhQ
bHVnaW5zLCAiJXAgUGx1Zy1pbiBpcyB2ZXJ5IHNtYWxsICVkeCVkLCBzZXQgdG8gcGxheSIsIHRo
aXMsIGNvbnRlbnRXaWR0aCwgY29udGVudEhlaWdodCk7CiAgICAgICAgIG1fc2l6ZVdoZW5TbmFw
c2hvdHRlZCA9IEludFNpemUoY29udGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KTsKICAgICAgICAg
bV9zbmFwc2hvdERlY2lzaW9uID0gTWF5U25hcHNob3RXaGVuUmVzaXplZDsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTFBsdWdJbkltYWdlRWxlbWVudC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2h0bWwvSFRNTFBsdWdJbkltYWdlRWxlbWVudC5oCShyZXZpc2lvbiAxNjY4
OTQpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuaAkod29y
a2luZyBjb3B5KQpAQCAtMTQxLDYgKzE0MSw4IEBAIHByaXZhdGU6CiAKICAgICB2b2lkIHJlc3Rh
cnRTaW1pbGFyUGx1Z0lucygpOwogICAgIHZvaWQgcmVtb3ZlU25hcHNob3RUaW1lckZpcmVkKFRp
bWVyPEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ+Jik7CisgICAgYm9vbCBpc1RvcExldmVsRnVsbFBh
Z2UoY29uc3QgUmVuZGVyRW1iZWRkZWRPYmplY3QmLCBpbnQgY29udGVudFdpZHRoLCBpbnQgY29u
dGVudEhlaWdodCk7CisgICAgYm9vbCBpc1NtYWxsZXJUaGFuVGlueVNpemluZ1RocmVzaG9sZChp
bnQgY29udGVudFdpZHRoLCBpbnQgY29udGVudEhlaWdodCk7CiAKICAgICBVUkwgbV9sb2FkZWRV
cmw7CiAgICAgYm9vbCBtX25lZWRzV2lkZ2V0VXBkYXRlOwo=
</data>
<flag name="review"
          id="253538"
          type_id="1"
          status="-"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>229179</attachid>
            <date>2014-04-11 16:38:08 -0700</date>
            <delta_ts>2014-04-14 17:20:59 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>7184</size>
            <attacher name="Roger Fong">roger_fong</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NzE2OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBACisyMDE0LTA0LTEwICBSb2dlciBG
b25nICA8cm9nZXJfZm9uZ0BhcHBsZS5jb20+CisKKyAgICAgICAgU25hcHNob3R0ZWQgcGx1Z2lu
cyBtYXkgbmVlZCB0byBiZSByZXN0YXJ0ZWQgaWYgc3R5bGUgcHJvcGVydGllcyBhcmUgY2hhbmdl
ZCBhZnRlciBpbml0aWFsIGxvYWQgb2YgcGx1Z2luLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNTUzLgorICAgICAgICA8cmRhcjovL3Byb2JsZW0v
MTU0NDMzNzU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2hlbiB1cGRhdGluZyBlbWJlZGRlZCBvYmplY3RzIGR1cmluZyBvdXIgcG9zdCBsYXlvdXQg
Y2hlY2tzLCBjaGVjayBmb3IgY2VydGFpbiBzdHlsZSBjaGFuZ2VzCisgICAgICAgIHRoYXQgbWF5
IHJlc3VsdCBpbiB0aGUgcGx1Z2luIG5lZWRpbmcgdG8gYmUgcmVzdGFydGVkLgorCisgICAgICAg
ICogaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Omlz
U21hbGxlclRoYW5UaW55U2l6aW5nVGhyZXNob2xkKToKKyAgICAgICAgUmVmYWN0b3JpbmcsIG1v
dmUgY2hlY2sgZm9yIHdoZXRoZXIgb3Igbm90IHBsdWdpbiBpcyBzbWFsbGVyIHRoYW4gdGhlIHRp
bnkgcGx1Z2luIHNpemUgdGhyZXNob2xkIHRvIHRoaXMgbWV0aG9kLgorICAgICAgICAoV2ViQ29y
ZTo6SFRNTFBsdWdJbkltYWdlRWxlbWVudDo6aXNUb3BMZXZlbEZ1bGxQYWdlKTogCisgICAgICAg
IFJlZmFjdG9yaW5nLCBtb3ZlIGNoZWNrIGZvciB3aGV0aGVyIG9yIG5vdCBwbHVnaW4gaXMgdG9w
IGxldmVsIGZ1bGwgcGFnZSB0byB0aGlzIG1ldGhvZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQ
bHVnSW5JbWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMpOiAKKyAgICAgICAgVXNlIHJl
ZmFjdG9yZWQgY2hlY2tzIGhlcmUgYXMgd2VsbCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qg
d2UgbmVlZCB0byByZXN0YXJ0IHRoZSBzbmFwc2hvdHRlZCBwbHVnaW4uCisgICAgICAgIChXZWJD
b3JlOjpIVE1MUGx1Z0luSW1hZ2VFbGVtZW50OjpzdWJmcmFtZUxvYWRlcldpbGxDcmVhdGVQbHVn
SW4pOiBVc2UgcmVmYWN0b3JlZCBjaGVja3MuCisgICAgICAgICogaHRtbC9IVE1MUGx1Z0luSW1h
Z2VFbGVtZW50Lmg6CisKIDIwMTQtMDQtMTEgIE93ZW4gVGF5bG9yICA8b3RheWxvckByZWRoYXQu
Y29tPgogCiAgICAgICAgIFtHVEtdIEFkZCBIaWdoRFBJIHN1cHBvcnQgZm9yIG5vbi1hY2NlbGVy
YXRlZCBjb21wb3NpdGluZyBjb250ZW50cwpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
UGx1Z0luSW1hZ2VFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNjY4OTQpCisrKyBTb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zNTIsMTggKzM1Miw2IEBAIHZvaWQgSFRNTFBsdWdJbkltYWdlRWxlbWVudDo6dXBkYXRlU25h
cHMKICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwogfQogCi12b2lkIEhUTUxQbHVnSW5J
bWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMoKQotewotICAgIGlmICghcmVuZGVyZXIo
KS0+aXNTbmFwc2hvdHRlZFBsdWdJbigpKSB7Ci0gICAgICAgIGlmIChkaXNwbGF5U3RhdGUoKSA9
PSBQbGF5aW5nKQotICAgICAgICAgICAgY2hlY2tTaXplQ2hhbmdlRm9yU25hcHNob3R0aW5nKCk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHNoYWRvdyByb290
IHRoYXQgdGhlIHNpemUgY2hhbmdlZCBzbyB0aGF0IHdlIG1heSB1cGRhdGUgdGhlIG92ZXJsYXkg
bGF5b3V0LgotICAgIGVuc3VyZVVzZXJBZ2VudFNoYWRvd1Jvb3QoKS5kaXNwYXRjaEV2ZW50KEV2
ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlc2l6ZUV2ZW50LCB0cnVlLCBmYWxzZSkpOwotfQot
CiBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBwbHVnSW5JbWFnZUVsZW1lbnRJc29sYXRlZFdvcmxk
KCkKIHsKICAgICBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBpc29sYXRlZFdvcmxkID0gKkRPTVdy
YXBwZXJXb3JsZDo6Y3JlYXRlKEpTRE9NV2luZG93Ojpjb21tb25WTSgpKS5sZWFrUmVmKCk7CkBA
IC02MTIsNyArNjAwLDUxIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpczEwMFBlcmNlbnQoTGVuZ3Ro
IGwKIHsKICAgICByZXR1cm4gbGVuZ3RoLmlzUGVyY2VudCgpICYmIGxlbmd0aC5wZXJjZW50KCkg
PT0gMTAwOwogfQorICAgIAorc3RhdGljIGlubGluZSBib29sIGlzU21hbGxlclRoYW5UaW55U2l6
aW5nVGhyZXNob2xkKGludCBjb250ZW50V2lkdGgsIGludCBjb250ZW50SGVpZ2h0KQoreworICAg
IHJldHVybiAoY29udGVudFdpZHRoIDw9IHNpemluZ1RpbnlEaW1lbnNpb25UaHJlc2hvbGQgfHwg
Y29udGVudEhlaWdodCA8PSBzaXppbmdUaW55RGltZW5zaW9uVGhyZXNob2xkKTsKK30KIAorYm9v
bCBIVE1MUGx1Z0luSW1hZ2VFbGVtZW50Ojppc1RvcExldmVsRnVsbFBhZ2VQbHVnaW4oY29uc3Qg
UmVuZGVyRW1iZWRkZWRPYmplY3QqIHJlbmRlckVtYmVkZGVkLCBpbnQgY29udGVudFdpZHRoLCBp
bnQgY29udGVudEhlaWdodCkgY29uc3QKK3sKKyAgICBpZiAoIWRvY3VtZW50KCkuZnJhbWUoKS0+
aXNNYWluRnJhbWUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGF1dG8mIHN0
eWxlID0gcmVuZGVyRW1iZWRkZWQtPnN0eWxlKCk7CisgICAgYm9vbCBpc0Z1bGxQYWdlID0gaXMx
MDBQZXJjZW50KHN0eWxlLndpZHRoKCkpICYmIGlzMTAwUGVyY2VudChzdHlsZS5oZWlnaHQoKSk7
CisgICAgSW50U2l6ZSB2aXNpYmxlVmlld1NpemUgPSBkb2N1bWVudCgpLmZyYW1lKCktPnZpZXco
KS0+dmlzaWJsZVNpemUoKTsKKyAgICBmbG9hdCBjb250ZW50QXJlYSA9IGNvbnRlbnRXaWR0aCAq
IGNvbnRlbnRIZWlnaHQ7CisgICAgZmxvYXQgdmlzaWJsZUFyZWEgPSB2aXNpYmxlVmlld1NpemUu
d2lkdGgoKSAqIHZpc2libGVWaWV3U2l6ZS5oZWlnaHQoKTsKKyAgICByZXR1cm4gaXNGdWxsUGFn
ZSAmJiAoY29udGVudEFyZWEgPiB2aXNpYmxlQXJlYSAqIHNpemluZ0Z1bGxQYWdlQXJlYVJhdGlv
VGhyZXNob2xkKTsKK30KKyAgICAKK3ZvaWQgSFRNTFBsdWdJbkltYWdlRWxlbWVudDo6Y2hlY2tT
bmFwc2hvdFN0YXR1cygpCit7CisgICAgLy8gU25hcHNob3Qgc3RhdHVzIGNvdWxkIGJlIGFmZmVj
dGVkIGJ5IHN0eWxlIGNoYW5nZXMuCisgICAgLy8gSWYgdGhlIHN0eWxlIGhhcyBjaGFuZ2VkIG9u
IHVzIGFuZCB3ZSd2ZSBzbmFwc2hvdHRlZCB0aGUgcGx1Z2luIHdlIG5lZWQgdG8gcmVzdGFydCB0
aGUgcGx1Z2luIHNvIHRoYXQgdGhlIHN0YXRlIGNhbiBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHku
CisgICAgaWYgKCFkb2N1bWVudCgpLnBhZ2UoKS0+c2V0dGluZ3MoKS5zbmFwc2hvdEFsbFBsdWdJ
bnMoKSAmJiByZW5kZXJlcigpLT5pc1NuYXBzaG90dGVkUGx1Z0luKCkgJiYgZGlzcGxheVN0YXRl
KCkgPD0gRGlzcGxheWluZ1NuYXBzaG90KSB7CisgICAgICAgIFJlbmRlckVtYmVkZGVkT2JqZWN0
KiByZW5kZXJFbWJlZGRlZCA9IHJlbmRlckVtYmVkZGVkT2JqZWN0KCk7CisgICAgICAgIEFTU0VS
VChyZW5kZXJlcik7CisgICAgICAgIExheW91dFJlY3QgY29udGVudFJlY3QgPSByZW5kZXJFbWJl
ZGRlZC0+Y29udGVudEJveFJlY3QoKTsKKyAgICAgICAgaW50IGNvbnRlbnRXaWR0aCA9IGNvbnRl
bnRSZWN0LndpZHRoKCk7CisgICAgICAgIGludCBjb250ZW50SGVpZ2h0ID0gY29udGVudFJlY3Qu
aGVpZ2h0KCk7CisgICAgICAgIGlmIChpc1RvcExldmVsRnVsbFBhZ2VQbHVnaW4ocmVuZGVyRW1i
ZWRkZWQsIGNvbnRlbnRXaWR0aCwgY29udGVudEhlaWdodCkgfHwgaXNTbWFsbGVyVGhhblRpbnlT
aXppbmdUaHJlc2hvbGQoY29udGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KSkgeworICAgICAgICAg
ICAgcmVzdGFydFNuYXBzaG90dGVkUGx1Z0luKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFyZW5kZXJlcigpLT5pc1NuYXBzaG90dGVkUGx1
Z0luKCkpIHsKKyAgICAgICAgaWYgKGRpc3BsYXlTdGF0ZSgpID09IFBsYXlpbmcpCisgICAgICAg
ICAgICBjaGVja1NpemVDaGFuZ2VGb3JTbmFwc2hvdHRpbmcoKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICAKKyAgICAvLyBOb3RpZnkgdGhlIHNoYWRvdyByb290IHRoYXQgdGhlIHNpemUg
Y2hhbmdlZCBzbyB0aGF0IHdlIG1heSB1cGRhdGUgdGhlIG92ZXJsYXkgbGF5b3V0LgorICAgIGVu
c3VyZVVzZXJBZ2VudFNoYWRvd1Jvb3QoKS5kaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZl
bnROYW1lcygpLnJlc2l6ZUV2ZW50LCB0cnVlLCBmYWxzZSkpOworfQorICAgIAogdm9pZCBIVE1M
UGx1Z0luSW1hZ2VFbGVtZW50OjpzdWJmcmFtZUxvYWRlcldpbGxDcmVhdGVQbHVnSW4oY29uc3Qg
VVJMJiB1cmwpCiB7CiAgICAgTE9HKFBsdWdpbnMsICIlcCBQbHVnLWluIFVSTDogJXMiLCB0aGlz
LCBtX3VybC51dGY4KCkuZGF0YSgpKTsKQEAgLTY5NiwyNiArNzI4LDIwIEBAIHZvaWQgSFRNTFBs
dWdJbkltYWdlRWxlbWVudDo6c3ViZnJhbWVMb2EKICAgICAgICAgbV9zbmFwc2hvdERlY2lzaW9u
ID0gTmV2ZXJTbmFwc2hvdDsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIGF1dG8mIHJl
bmRlcmVyID0gdG9SZW5kZXJFbWJlZGRlZE9iamVjdCgqdGhpcy0+cmVuZGVyZXIoKSk7Ci0gICAg
TGF5b3V0UmVjdCBjb250ZW50UmVjdCA9IHJlbmRlcmVyLmNvbnRlbnRCb3hSZWN0KCk7CisgICAg
CisgICAgUmVuZGVyRW1iZWRkZWRPYmplY3QqIHJlbmRlcmVyID0gcmVuZGVyRW1iZWRkZWRPYmpl
Y3QoKTsKKyAgICBBU1NFUlQocmVuZGVyZXIpOworICAgIExheW91dFJlY3QgY29udGVudFJlY3Qg
PSByZW5kZXJlci0+Y29udGVudEJveFJlY3QoKTsKICAgICBpbnQgY29udGVudFdpZHRoID0gY29u
dGVudFJlY3Qud2lkdGgoKTsKICAgICBpbnQgY29udGVudEhlaWdodCA9IGNvbnRlbnRSZWN0Lmhl
aWdodCgpOwotCi0gICAgaWYgKGluTWFpbkZyYW1lKSB7Ci0gICAgICAgIGF1dG8mIHN0eWxlID0g
cmVuZGVyZXIuc3R5bGUoKTsKLSAgICAgICAgYm9vbCBpc0Z1bGxQYWdlID0gaXMxMDBQZXJjZW50
KHN0eWxlLndpZHRoKCkpICYmIGlzMTAwUGVyY2VudChzdHlsZS5oZWlnaHQoKSk7Ci0gICAgICAg
IEludFNpemUgdmlzaWJsZVZpZXdTaXplID0gZG9jdW1lbnQoKS5mcmFtZSgpLT52aWV3KCktPnZp
c2libGVTaXplKCk7Ci0gICAgICAgIGZsb2F0IGNvbnRlbnRBcmVhID0gY29udGVudFdpZHRoICog
Y29udGVudEhlaWdodDsKLSAgICAgICAgZmxvYXQgdmlzaWJsZUFyZWEgPSB2aXNpYmxlVmlld1Np
emUud2lkdGgoKSAqIHZpc2libGVWaWV3U2l6ZS5oZWlnaHQoKTsKLSAgICAgICAgaWYgKGlzRnVs
bFBhZ2UgJiYgY29udGVudEFyZWEgPiB2aXNpYmxlQXJlYSAqIHNpemluZ0Z1bGxQYWdlQXJlYVJh
dGlvVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICBMT0coUGx1Z2lucywgIiVwIFBsdWctaW4gaXMg
dG9wIGxldmVsIGZ1bGwgcGFnZSwgc2V0IHRvIHBsYXkiLCB0aGlzKTsKLSAgICAgICAgICAgIG1f
c25hcHNob3REZWNpc2lvbiA9IE5ldmVyU25hcHNob3Q7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KKyAgICAKKyAgICBpZiAoaXNUb3BMZXZlbEZ1bGxQYWdlUGx1Z2luKHJlbmRlcmVy
LCBjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQpKSB7CisgICAgICAgIExPRyhQbHVnaW5zLCAi
JXAgUGx1Zy1pbiBpcyB0b3AgbGV2ZWwgZnVsbCBwYWdlLCBzZXQgdG8gcGxheSIsIHRoaXMpOwor
ICAgICAgICBtX3NuYXBzaG90RGVjaXNpb24gPSBOZXZlclNuYXBzaG90OworICAgICAgICByZXR1
cm47CiAgICAgfQogCi0gICAgaWYgKGNvbnRlbnRXaWR0aCA8PSBzaXppbmdUaW55RGltZW5zaW9u
VGhyZXNob2xkIHx8IGNvbnRlbnRIZWlnaHQgPD0gc2l6aW5nVGlueURpbWVuc2lvblRocmVzaG9s
ZCkgeworICAgIGlmIChpc1NtYWxsZXJUaGFuVGlueVNpemluZ1RocmVzaG9sZChjb250ZW50V2lk
dGgsIGNvbnRlbnRIZWlnaHQpKSB7CiAgICAgICAgIExPRyhQbHVnaW5zLCAiJXAgUGx1Zy1pbiBp
cyB2ZXJ5IHNtYWxsICVkeCVkLCBzZXQgdG8gcGxheSIsIHRoaXMsIGNvbnRlbnRXaWR0aCwgY29u
dGVudEhlaWdodCk7CiAgICAgICAgIG1fc2l6ZVdoZW5TbmFwc2hvdHRlZCA9IEludFNpemUoY29u
dGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KTsKICAgICAgICAgbV9zbmFwc2hvdERlY2lzaW9uID0g
TWF5U25hcHNob3RXaGVuUmVzaXplZDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFBs
dWdJbkltYWdlRWxlbWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRN
TFBsdWdJbkltYWdlRWxlbWVudC5oCShyZXZpc2lvbiAxNjY4OTQpCisrKyBTb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMTQxLDYg
KzE0MSw3IEBAIHByaXZhdGU6CiAKICAgICB2b2lkIHJlc3RhcnRTaW1pbGFyUGx1Z0lucygpOwog
ICAgIHZvaWQgcmVtb3ZlU25hcHNob3RUaW1lckZpcmVkKFRpbWVyPEhUTUxQbHVnSW5JbWFnZUVs
ZW1lbnQ+Jik7CisgICAgYm9vbCBpc1RvcExldmVsRnVsbFBhZ2VQbHVnaW4oY29uc3QgUmVuZGVy
RW1iZWRkZWRPYmplY3QqLCBpbnQgY29udGVudFdpZHRoLCBpbnQgY29udGVudEhlaWdodCkgY29u
c3Q7CiAKICAgICBVUkwgbV9sb2FkZWRVcmw7CiAgICAgYm9vbCBtX25lZWRzV2lkZ2V0VXBkYXRl
Owo=
</data>
<flag name="review"
          id="253544"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>229326</attachid>
            <date>2014-04-14 17:20:59 -0700</date>
            <delta_ts>2014-04-15 16:27:00 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>12366</size>
            <attacher name="Roger Fong">roger_fong</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NzI3OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMwIEBACisyMDE0LTA0LTEwICBSb2dlciBG
b25nICA8cm9nZXJfZm9uZ0BhcHBsZS5jb20+CisKKyAgICAgICAgU25hcHNob3R0ZWQgcGx1Z2lu
cyBtYXkgbmVlZCB0byBiZSByZXN0YXJ0ZWQgaWYgc3R5bGUgcHJvcGVydGllcyBhcmUgY2hhbmdl
ZCBhZnRlciBpbml0aWFsIGxvYWQgb2YgcGx1Z2luLgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNTUzLgorICAgICAgICA8cmRhcjovL3Byb2JsZW0v
MTU0NDMzNzU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgVGVzdDogcGx1Z2lucy9zbmFwc2hvdHRpbmcvc2V0LXBsdWdpbi1zaXplLXRvLXRpbnkuaHRt
bAorCisgICAgICAgIFdoZW4gdXBkYXRpbmcgZW1iZWRkZWQgb2JqZWN0cyBkdXJpbmcgb3VyIHBv
c3QgbGF5b3V0IGNoZWNrcywgY2hlY2sgZm9yIGNlcnRhaW4gc3R5bGUgY2hhbmdlcworICAgICAg
ICB0aGF0IG1heSByZXN1bHQgaW4gdGhlIHBsdWdpbiBuZWVkaW5nIHRvIGJlIHJlc3RhcnRlZC4K
KworICAgICAgICAqIGh0bWwvSFRNTFBsdWdJbkltYWdlRWxlbWVudC5oOiAKKyAgICAgICAgQWRk
IG1fcGx1Z0luRGltZW5zaW9uc1NwZWNpZmllZCBmaWVsZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRo
ZXIgb3Igbm90IGRpbWVuc2lvbnMgb24gdGhlIHBsdWdpbuKAmXMgcmVuZGVyZXIgaGF2ZSBiZWVu
IHNwZWNpZmllZC4KKyAgICAgICAgKiBodG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFBsdWdJbkltYWdlRWxlbWVudDo6SFRNTFBsdWdJbkltYWdl
RWxlbWVudCk6CisgICAgICAgIEluaXRpYWxpemUgbV9wbHVnSW5EaW1lbnNpb25zU3BlY2lmaWVk
LgorICAgICAgICAoV2ViQ29yZTo6aXNTbWFsbGVyVGhhblRpbnlTaXppbmdUaHJlc2hvbGQpOgor
ICAgICAgICBSZWZhY3RvcmluZywgbW92ZSBjaGVjayBmb3Igd2hldGhlciBvciBub3QgcGx1Z2lu
IGlzIHNtYWxsZXIgdGhhbiB0aGUgdGlueSBwbHVnaW4gc2l6ZSB0aHJlc2hvbGQgdG8gdGhpcyBt
ZXRob2QuCisgICAgICAgIChXZWJDb3JlOjpIVE1MUGx1Z0luSW1hZ2VFbGVtZW50Ojppc1RvcExl
dmVsRnVsbFBhZ2UpOiAKKyAgICAgICAgUmVmYWN0b3JpbmcsIG1vdmUgY2hlY2sgZm9yIHdoZXRo
ZXIgb3Igbm90IHBsdWdpbiBpcyB0b3AgbGV2ZWwgZnVsbCBwYWdlIHRvIHRoaXMgbWV0aG9kLgor
ICAgICAgICAoV2ViQ29yZTo6SFRNTFBsdWdJbkltYWdlRWxlbWVudDo6Y2hlY2tTbmFwc2hvdFN0
YXR1cyk6IAorICAgICAgICBVc2UgcmVmYWN0b3JlZCBjaGVja3MgaGVyZSBhcyB3ZWxsIHRvIGRl
dGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHNuYXBzaG90dGVk
IHBsdWdpbi4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ6OnN1YmZy
YW1lTG9hZGVyV2lsbENyZWF0ZVBsdWdJbik6IFVzZSByZWZhY3RvcmVkIGNoZWNrcy4KKyAgICAg
ICAgSWYgcGx1Z2luIGRpbWVuc2lvbnMgd2VyZSBzcGVjaWZpZWQsIHNldCBtX3BsdWdJbkRpbWVu
c2lvbnNTcGVjaWZpZWQgdG8gdHJ1ZS4KKwogMjAxNC0wNC0xNCAgQW5kcmVhcyBLbGluZyAgPGFr
bGluZ0BhcHBsZS5jb20+CiAKICAgICAgICAgQnVpbGQgZml4YWdlLgpJbmRleDogU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNjY4
OTQpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQbHVnSW5JbWFnZUVsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMjEsNiArMTIxLDcgQEAgSFRNTFBsdWdJbkltYWdlRWxlbWVudDo6
SFRNTFBsdWdJbkltYWdlRQogICAgICwgbV9wbHVnSW5XYXNDcmVhdGVkKGZhbHNlKQogICAgICwg
bV9kZWZlcnJlZFByb21vdGlvblRvUHJpbWFyeVBsdWdJbihmYWxzZSkKICAgICAsIG1fc25hcHNo
b3REZWNpc2lvbihTbmFwc2hvdE5vdFlldERlY2lkZWQpCisgICAgLCBtX3BsdWdJbkRpbWVuc2lv
bnNTcGVjaWZpZWQoZmFsc2UpCiB7CiAgICAgc2V0SGFzQ3VzdG9tU3R5bGVSZXNvbHZlQ2FsbGJh
Y2tzKCk7CiB9CkBAIC0zNTIsMTggKzM1Myw2IEBAIHZvaWQgSFRNTFBsdWdJbkltYWdlRWxlbWVu
dDo6dXBkYXRlU25hcHMKICAgICAgICAgcmVuZGVyZXIoKS0+cmVwYWludCgpOwogfQogCi12b2lk
IEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ6OmNoZWNrU25hcHNob3RTdGF0dXMoKQotewotICAgIGlm
ICghcmVuZGVyZXIoKS0+aXNTbmFwc2hvdHRlZFBsdWdJbigpKSB7Ci0gICAgICAgIGlmIChkaXNw
bGF5U3RhdGUoKSA9PSBQbGF5aW5nKQotICAgICAgICAgICAgY2hlY2tTaXplQ2hhbmdlRm9yU25h
cHNob3R0aW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhl
IHNoYWRvdyByb290IHRoYXQgdGhlIHNpemUgY2hhbmdlZCBzbyB0aGF0IHdlIG1heSB1cGRhdGUg
dGhlIG92ZXJsYXkgbGF5b3V0LgotICAgIGVuc3VyZVVzZXJBZ2VudFNoYWRvd1Jvb3QoKS5kaXNw
YXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLnJlc2l6ZUV2ZW50LCB0cnVlLCBm
YWxzZSkpOwotfQotCiBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBwbHVnSW5JbWFnZUVsZW1lbnRJ
c29sYXRlZFdvcmxkKCkKIHsKICAgICBzdGF0aWMgRE9NV3JhcHBlcldvcmxkJiBpc29sYXRlZFdv
cmxkID0gKkRPTVdyYXBwZXJXb3JsZDo6Y3JlYXRlKEpTRE9NV2luZG93Ojpjb21tb25WTSgpKS5s
ZWFrUmVmKCk7CkBAIC02MTIsNyArNjAxLDU4IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpczEwMFBl
cmNlbnQoTGVuZ3RoIGwKIHsKICAgICByZXR1cm4gbGVuZ3RoLmlzUGVyY2VudCgpICYmIGxlbmd0
aC5wZXJjZW50KCkgPT0gMTAwOwogfQotCisgICAgCitzdGF0aWMgaW5saW5lIGJvb2wgaXNTbWFs
bGVyVGhhblRpbnlTaXppbmdUaHJlc2hvbGQoY29uc3QgUmVuZGVyRW1iZWRkZWRPYmplY3QmIHJl
bmRlcmVyKQoreworICAgIExheW91dFJlY3QgY29udGVudFJlY3QgPSByZW5kZXJlci5jb250ZW50
Qm94UmVjdCgpOworICAgIGludCBjb250ZW50V2lkdGggPSBjb250ZW50UmVjdC53aWR0aCgpOwor
ICAgIGludCBjb250ZW50SGVpZ2h0ID0gY29udGVudFJlY3QuaGVpZ2h0KCk7CisgICAgcmV0dXJu
IGNvbnRlbnRXaWR0aCA8PSBzaXppbmdUaW55RGltZW5zaW9uVGhyZXNob2xkIHx8IGNvbnRlbnRI
ZWlnaHQgPD0gc2l6aW5nVGlueURpbWVuc2lvblRocmVzaG9sZDsKK30KKyAgICAKK2Jvb2wgSFRN
TFBsdWdJbkltYWdlRWxlbWVudDo6aXNUb3BMZXZlbEZ1bGxQYWdlUGx1Z2luKGNvbnN0IFJlbmRl
ckVtYmVkZGVkT2JqZWN0JiByZW5kZXJlcikgY29uc3QKK3sKKyAgICBGcmFtZSYgZnJhbWUgPSAq
ZG9jdW1lbnQoKS5mcmFtZSgpOworICAgIGlmICghZnJhbWUuaXNNYWluRnJhbWUoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGF1dG8mIHN0eWxlID0gcmVuZGVyZXIuc3R5bGUo
KTsKKyAgICBJbnRTaXplIHZpc2libGVTaXplID0gZnJhbWUudmlldygpLT52aXNpYmxlU2l6ZSgp
OworICAgIExheW91dFJlY3QgY29udGVudFJlY3QgPSByZW5kZXJlci5jb250ZW50Qm94UmVjdCgp
OworICAgIGludCBjb250ZW50V2lkdGggPSBjb250ZW50UmVjdC53aWR0aCgpOworICAgIGludCBj
b250ZW50SGVpZ2h0ID0gY29udGVudFJlY3QuaGVpZ2h0KCk7CisgICAgcmV0dXJuIGlzMTAwUGVy
Y2VudChzdHlsZS53aWR0aCgpKSAmJiBpczEwMFBlcmNlbnQoc3R5bGUuaGVpZ2h0KCkpICYmIGNv
bnRlbnRXaWR0aCAqIGNvbnRlbnRIZWlnaHQgPiB2aXNpYmxlU2l6ZS5hcmVhKCkgKiBzaXppbmdG
dWxsUGFnZUFyZWFSYXRpb1RocmVzaG9sZDsKK30KKyAgICAKK3ZvaWQgSFRNTFBsdWdJbkltYWdl
RWxlbWVudDo6Y2hlY2tTbmFwc2hvdFN0YXR1cygpCit7CisgICAgLy8gSWYgd2lkdGggYW5kIGhl
aWdodCBzdHlsZXMgd2VyZSBwcmV2aW91c2x5IG5vdCBzZXQgYW5kIHdlJ3ZlIHNuYXBzaG90dGVk
IHRoZSBwbHVnaW4gd2UgbWF5IG5lZWQgdG8gcmVzdGFydCB0aGUgcGx1Z2luIHNvIHRoYXQgaXRz
IHN0YXRlIGNhbiBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgICAgaWYgKCFkb2N1bWVudCgp
LnBhZ2UoKS0+c2V0dGluZ3MoKS5zbmFwc2hvdEFsbFBsdWdJbnMoKSAmJiByZW5kZXJlcigpLT5p
c1NuYXBzaG90dGVkUGx1Z0luKCkgJiYgZGlzcGxheVN0YXRlKCkgPD0gRGlzcGxheWluZ1NuYXBz
aG90ICYmICFtX3BsdWdJbkRpbWVuc2lvbnNTcGVjaWZpZWQpIHsKKyAgICAgICAgUmVuZGVyU25h
cHNob3R0ZWRQbHVnSW4mIHJlbmRlcmVyID0gdG9SZW5kZXJTbmFwc2hvdHRlZFBsdWdJbigqdGhp
cy0+cmVuZGVyZXIoKSk7CisgICAgICAgIGlmICghcmVuZGVyZXIuc3R5bGUoKS5sb2dpY2FsV2lk
dGgoKS5pc1NwZWNpZmllZCgpICYmICFyZW5kZXJlci5zdHlsZSgpLmxvZ2ljYWxIZWlnaHQoKS5p
c1NwZWNpZmllZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgbV9w
bHVnSW5EaW1lbnNpb25zU3BlY2lmaWVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGlzVG9wTGV2ZWxG
dWxsUGFnZVBsdWdpbihyZW5kZXJlcikpIHsKKyAgICAgICAgICAgIG1fc25hcHNob3REZWNpc2lv
biA9IE5ldmVyU25hcHNob3Q7CisgICAgICAgICAgICByZXN0YXJ0U25hcHNob3R0ZWRQbHVnSW4o
KTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1NtYWxsZXJUaGFuVGlueVNpemluZ1RocmVzaG9sZChy
ZW5kZXJlcikpIHsKKyAgICAgICAgICAgIG1fc25hcHNob3REZWNpc2lvbiA9IE1heVNuYXBzaG90
V2hlblJlc2l6ZWQ7CisgICAgICAgICAgICByZXN0YXJ0U25hcHNob3R0ZWRQbHVnSW4oKTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmICghcmVuZGVyZXIo
KS0+aXNTbmFwc2hvdHRlZFBsdWdJbigpKSB7CisgICAgICAgIGlmIChkaXNwbGF5U3RhdGUoKSA9
PSBQbGF5aW5nKQorICAgICAgICAgICAgY2hlY2tTaXplQ2hhbmdlRm9yU25hcHNob3R0aW5nKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gTm90aWZ5IHRoZSBzaGFkb3cg
cm9vdCB0aGF0IHRoZSBzaXplIGNoYW5nZWQgc28gdGhhdCB3ZSBtYXkgdXBkYXRlIHRoZSBvdmVy
bGF5IGxheW91dC4KKyAgICBlbnN1cmVVc2VyQWdlbnRTaGFkb3dSb290KCkuZGlzcGF0Y2hFdmVu
dChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5yZXNpemVFdmVudCwgdHJ1ZSwgZmFsc2UpKTsK
K30KKyAgICAKIHZvaWQgSFRNTFBsdWdJbkltYWdlRWxlbWVudDo6c3ViZnJhbWVMb2FkZXJXaWxs
Q3JlYXRlUGx1Z0luKGNvbnN0IFVSTCYgdXJsKQogewogICAgIExPRyhQbHVnaW5zLCAiJXAgUGx1
Zy1pbiBVUkw6ICVzIiwgdGhpcywgbV91cmwudXRmOCgpLmRhdGEoKSk7CkBAIC02OTYsMjYgKzcz
NiwyMSBAQCB2b2lkIEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQ6OnN1YmZyYW1lTG9hCiAgICAgICAg
IG1fc25hcHNob3REZWNpc2lvbiA9IE5ldmVyU25hcHNob3Q7CiAgICAgICAgIHJldHVybjsKICAg
ICB9Ci0KKyAgICAKICAgICBhdXRvJiByZW5kZXJlciA9IHRvUmVuZGVyRW1iZWRkZWRPYmplY3Qo
KnRoaXMtPnJlbmRlcmVyKCkpOwogICAgIExheW91dFJlY3QgY29udGVudFJlY3QgPSByZW5kZXJl
ci5jb250ZW50Qm94UmVjdCgpOwogICAgIGludCBjb250ZW50V2lkdGggPSBjb250ZW50UmVjdC53
aWR0aCgpOwogICAgIGludCBjb250ZW50SGVpZ2h0ID0gY29udGVudFJlY3QuaGVpZ2h0KCk7Ci0K
LSAgICBpZiAoaW5NYWluRnJhbWUpIHsKLSAgICAgICAgYXV0byYgc3R5bGUgPSByZW5kZXJlci5z
dHlsZSgpOwotICAgICAgICBib29sIGlzRnVsbFBhZ2UgPSBpczEwMFBlcmNlbnQoc3R5bGUud2lk
dGgoKSkgJiYgaXMxMDBQZXJjZW50KHN0eWxlLmhlaWdodCgpKTsKLSAgICAgICAgSW50U2l6ZSB2
aXNpYmxlVmlld1NpemUgPSBkb2N1bWVudCgpLmZyYW1lKCktPnZpZXcoKS0+dmlzaWJsZVNpemUo
KTsKLSAgICAgICAgZmxvYXQgY29udGVudEFyZWEgPSBjb250ZW50V2lkdGggKiBjb250ZW50SGVp
Z2h0OwotICAgICAgICBmbG9hdCB2aXNpYmxlQXJlYSA9IHZpc2libGVWaWV3U2l6ZS53aWR0aCgp
ICogdmlzaWJsZVZpZXdTaXplLmhlaWdodCgpOwotICAgICAgICBpZiAoaXNGdWxsUGFnZSAmJiBj
b250ZW50QXJlYSA+IHZpc2libGVBcmVhICogc2l6aW5nRnVsbFBhZ2VBcmVhUmF0aW9UaHJlc2hv
bGQpIHsKLSAgICAgICAgICAgIExPRyhQbHVnaW5zLCAiJXAgUGx1Zy1pbiBpcyB0b3AgbGV2ZWwg
ZnVsbCBwYWdlLCBzZXQgdG8gcGxheSIsIHRoaXMpOwotICAgICAgICAgICAgbV9zbmFwc2hvdERl
Y2lzaW9uID0gTmV2ZXJTbmFwc2hvdDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQor
ICAgIAorICAgIG1fcGx1Z0luRGltZW5zaW9uc1NwZWNpZmllZCA9IHJlbmRlcmVyLnN0eWxlKCku
bG9naWNhbFdpZHRoKCkuaXNTcGVjaWZpZWQoKSB8fCByZW5kZXJlci5zdHlsZSgpLmxvZ2ljYWxI
ZWlnaHQoKS5pc1NwZWNpZmllZCgpOworICAgIAorICAgIGlmIChpc1RvcExldmVsRnVsbFBhZ2VQ
bHVnaW4ocmVuZGVyZXIpKSB7CisgICAgICAgIExPRyhQbHVnaW5zLCAiJXAgUGx1Zy1pbiBpcyB0
b3AgbGV2ZWwgZnVsbCBwYWdlLCBzZXQgdG8gcGxheSIsIHRoaXMpOworICAgICAgICBtX3NuYXBz
aG90RGVjaXNpb24gPSBOZXZlclNuYXBzaG90OworICAgICAgICByZXR1cm47CiAgICAgfQogCi0g
ICAgaWYgKGNvbnRlbnRXaWR0aCA8PSBzaXppbmdUaW55RGltZW5zaW9uVGhyZXNob2xkIHx8IGNv
bnRlbnRIZWlnaHQgPD0gc2l6aW5nVGlueURpbWVuc2lvblRocmVzaG9sZCkgeworICAgIGlmIChp
c1NtYWxsZXJUaGFuVGlueVNpemluZ1RocmVzaG9sZChyZW5kZXJlcikpIHsKICAgICAgICAgTE9H
KFBsdWdpbnMsICIlcCBQbHVnLWluIGlzIHZlcnkgc21hbGwgJWR4JWQsIHNldCB0byBwbGF5Iiwg
dGhpcywgY29udGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KTsKICAgICAgICAgbV9zaXplV2hlblNu
YXBzaG90dGVkID0gSW50U2l6ZShjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQpOwogICAgICAg
ICBtX3NuYXBzaG90RGVjaXNpb24gPSBNYXlTbmFwc2hvdFdoZW5SZXNpemVkOwpJbmRleDogU291
cmNlL1dlYkNvcmUvaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUGx1Z0luSW1hZ2VFbGVtZW50LmgJKHJldmlzaW9uIDE2
Njg5NCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFBsdWdJbkltYWdlRWxlbWVudC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xNDEsNiArMTQxLDcgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgcmVz
dGFydFNpbWlsYXJQbHVnSW5zKCk7CiAgICAgdm9pZCByZW1vdmVTbmFwc2hvdFRpbWVyRmlyZWQo
VGltZXI8SFRNTFBsdWdJbkltYWdlRWxlbWVudD4mKTsKKyAgICBib29sIGlzVG9wTGV2ZWxGdWxs
UGFnZVBsdWdpbihjb25zdCBSZW5kZXJFbWJlZGRlZE9iamVjdCYpIGNvbnN0OwogCiAgICAgVVJM
IG1fbG9hZGVkVXJsOwogICAgIGJvb2wgbV9uZWVkc1dpZGdldFVwZGF0ZTsKQEAgLTE1Nyw2ICsx
NTgsNyBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9kZWZlcnJlZFByb21vdGlvblRvUHJpbWFyeVBs
dWdJbjsKICAgICBJbnRTaXplIG1fc2l6ZVdoZW5TbmFwc2hvdHRlZDsKICAgICBTbmFwc2hvdERl
Y2lzaW9uIG1fc25hcHNob3REZWNpc2lvbjsKKyAgICBib29sIG1fcGx1Z0luRGltZW5zaW9uc1Nw
ZWNpZmllZDsKIH07CiAKIHZvaWQgaXNIVE1MUGx1Z0luSW1hZ2VFbGVtZW50KGNvbnN0IEhUTUxQ
bHVnSW5JbWFnZUVsZW1lbnQmKTsgLy8gQ2F0Y2ggdW5uZWNlc3NhcnkgcnVudGltZSBjaGVjayBv
ZiB0eXBlIGtub3duIGF0IGNvbXBpbGUgdGltZS4KSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxv
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NzI3OSkK
KysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBA
CisyMDE0LTA0LTE0ICBSb2dlciBGb25nICA8cm9nZXJfZm9uZ0BhcHBsZS5jb20+CisKKyAgICAg
ICAgU25hcHNob3R0ZWQgcGx1Z2lucyBtYXkgbmVlZCB0byBiZSByZXN0YXJ0ZWQgaWYgc3R5bGUg
cHJvcGVydGllcyBhcmUgY2hhbmdlZCBhZnRlciBpbml0aWFsIGxvYWQgb2YgcGx1Z2luLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNTUzLgorICAg
ICAgICA8cmRhcjovL3Byb2JsZW0vMTU0NDMzNzU+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMtd2syL3BsdWdpbnMvc25hcHNo
b3R0aW5nL3NldC1wbHVnaW4tc2l6ZS10by10aW55LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAg
ICAgICogcGx1Z2lucy9zbmFwc2hvdHRpbmcvc2V0LXBsdWdpbi1zaXplLXRvLXRpbnkuaHRtbDog
QWRkZWQuCisKIDIwMTQtMDQtMTQgIE9saXZlciBIdW50ICA8b2xpdmVyQGFwcGxlLmNvbT4KIAog
ICAgICAgICBGdW5jdGlvbi5iaW5kIGl0c2VsZiBpcyB0b28gc2xvdwpJbmRleDogTGF5b3V0VGVz
dHMvcGxhdGZvcm0vbWFjLXdrMi9wbHVnaW5zL3NuYXBzaG90dGluZy9zZXQtcGx1Z2luLXNpemUt
dG8tdGlueS1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0v
bWFjLXdrMi9wbHVnaW5zL3NuYXBzaG90dGluZy9zZXQtcGx1Z2luLXNpemUtdG8tdGlueS1leHBl
Y3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMtd2syL3Bs
dWdpbnMvc25hcHNob3R0aW5nL3NldC1wbHVnaW4tc2l6ZS10by10aW55LWV4cGVjdGVkLnR4dAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACitsYXllciBhdCAoMCwwKSBzaXplIDgwMHg2
MDAKKyAgUmVuZGVyVmlldyBhdCAoMCwwKSBzaXplIDgwMHg2MDAKK2xheWVyIGF0ICgwLDApIHNp
emUgODAweDYwMAorICBSZW5kZXJCbG9jayB7SFRNTH0gYXQgKDAsMCkgc2l6ZSA4MDB4NjAwCisg
ICAgUmVuZGVyQm9keSB7Qk9EWX0gYXQgKDgsOCkgc2l6ZSA3ODR4NTg0CisgICAgICBSZW5kZXJC
bG9jayB7UH0gYXQgKDAsMCkgc2l6ZSA3ODR4MTgKKyAgICAgICAgUmVuZGVyVGV4dCB7I3RleHR9
IGF0ICgwLDApIHNpemUgNjQyeDE4CisgICAgICAgICAgdGV4dCBydW4gYXQgKDAsMCkgd2lkdGgg
NjQyOiAiVGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCBpZiB3ZSBoYXZlIHNldCBhIHBsdWdpbiB0byBi
ZSB0b28gc21hbGwgYWZ0ZXIgdGhlIGluaXRpYWwgbG9hZCB0aGF0IGl0IHN0aWxsIGdldHMgcGxh
eWVkLiIKKyAgICAgIFJlbmRlckJsb2NrIHtQfSBhdCAoMCwzNCkgc2l6ZSA3ODR4MTgKKyAgICAg
ICAgUmVuZGVyVGV4dCB7I3RleHR9IGF0ICgwLDApIHNpemUgNzAxeDE4CisgICAgICAgICAgdGV4
dCBydW4gYXQgKDAsMCkgd2lkdGggNzAxOiAiQWxzbyBlbnN1cmUgdGhhdCB0aGUgcGx1Z2luIHJl
bWFpbnMgc25hcHNob3R0ZWQgaWYgdGhlIHNpemUgd2FzIGluaXRpYWxseSBzcGVjaWZpZWQgYnV0
IG1hZGUgdG9vIHNtYWxsIGFmdGVyd2FyZHMuIgorICAgICAgUmVuZGVyQmxvY2sgKGFub255bW91
cykgYXQgKDAsNjgpIHNpemUgNzg0eDQ0CisgICAgICAgIFJlbmRlclRleHQgeyN0ZXh0fSBhdCAo
NDAsMjYpIHNpemUgNHgxOAorICAgICAgICAgIHRleHQgcnVuIGF0ICg0MCwyNikgd2lkdGggNDog
IiAiCisgICAgICAgIFJlbmRlclNuYXBzaG90dGVkUGx1Z0luIHtFTUJFRH0gYXQgKDQ0LDApIHNp
emUgNDB4NDAKKyAgICAgICAgUmVuZGVyVGV4dCB7I3RleHR9IGF0ICgwLDApIHNpemUgMHgwCits
YXllciBhdCAoOCw3Nikgc2l6ZSA0MHg0MAorICBSZW5kZXJFbWJlZGRlZE9iamVjdCB7RU1CRUR9
IGF0ICgwLDApIHNpemUgNDB4NDAKK2xheWVyIGF0ICg1Miw3Nikgc2l6ZSA0MHg0MAorICBSZW5k
ZXJCbG9jayAocmVsYXRpdmUgcG9zaXRpb25lZCkge0RJVn0gYXQgKDAsMCkgc2l6ZSA0MHg0MAor
bGF5ZXIgYXQgKDU3LDgxKSBzaXplIDMweDMwCisgIFJlbmRlckZsZXhpYmxlQm94IHtESVZ9IGF0
ICg1LDUpIHNpemUgMzB4MzAgW2JnY29sb3I9I0ZGRkZGRkJGXQorICAgIFJlbmRlckJsb2NrIHtE
SVZ9IGF0ICgwLC0zKSBzaXplIDMweDM2CitsYXllciBhdCAoNTcsNzgpIHNpemUgMzB4MTggc2Ny
b2xsV2lkdGggMTM5CisgIFJlbmRlckJsb2NrIHtESVZ9IGF0ICgwLDApIHNpemUgMzB4MTgKKyAg
ICBSZW5kZXJUZXh0IHsjdGV4dH0gYXQgKDAsMCkgc2l6ZSAxMzl4MTgKKyAgICAgIHRleHQgcnVu
IGF0ICgwLDApIHdpZHRoIDEzOTogIlNuYXBzaG90dGVkIFBsdWctSW4iCitsYXllciBhdCAoNTcs
OTYpIHNpemUgMzB4MTggc2Nyb2xsV2lkdGggOTQKKyAgUmVuZGVyQmxvY2sge0RJVn0gYXQgKDAs
MTgpIHNpemUgMzB4MTggW2NvbG9yPSM0NDQ0NDRdCisgICAgUmVuZGVyVGV4dCB7I3RleHR9IGF0
ICgwLDApIHNpemUgOTR4MTgKKyAgICAgIHRleHQgcnVuIGF0ICgwLDApIHdpZHRoIDk0OiAiQ2xp
Y2sgdG8gcmVzdGFydCIKSW5kZXg6IExheW91dFRlc3RzL3BsdWdpbnMvc25hcHNob3R0aW5nL3Nl
dC1wbHVnaW4tc2l6ZS10by10aW55Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGx1
Z2lucy9zbmFwc2hvdHRpbmcvc2V0LXBsdWdpbi1zaXplLXRvLXRpbnkuaHRtbAkocmV2aXNpb24g
MCkKKysrIExheW91dFRlc3RzL3BsdWdpbnMvc25hcHNob3R0aW5nL3NldC1wbHVnaW4tc2l6ZS10
by10aW55Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMCBAQAorPHA+VGhpcyB0ZXN0
IGVuc3VyZXMgdGhhdCBpZiB3ZSBoYXZlIHNldCBhIHBsdWdpbiB0byBiZSB0b28gc21hbGwgYWZ0
ZXIgdGhlIGluaXRpYWwgbG9hZCB0aGF0IGl0IHN0aWxsIGdldHMgcGxheWVkLjwvcD4KKzxwPkFs
c28gZW5zdXJlIHRoYXQgdGhlIHBsdWdpbiByZW1haW5zIHNuYXBzaG90dGVkIGlmIHRoZSBzaXpl
IHdhcyBpbml0aWFsbHkgc3BlY2lmaWVkIGJ1dCBtYWRlIHRvbyBzbWFsbCBhZnRlcndhcmRzLjwv
cD4KKzxzY3JpcHQ+CitpZiAod2luZG93LnRlc3RSdW5uZXIpIHsKKyAgICB3aW5kb3cuaW50ZXJu
YWxzLnNldHRpbmdzLnNldFBsdWdJblNuYXBzaG90dGluZ0VuYWJsZWQodHJ1ZSk7CisgICAgd2lu
ZG93LmludGVybmFscy5zZXR0aW5ncy5zZXRNYXhpbXVtUGx1Z0luU25hcHNob3RBdHRlbXB0cygw
KTsKKyAgICB0ZXN0UnVubmVyLndhaXRVbnRpbERvbmUoKTsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0
aW9uICgpIHsKKyAgICAgICAgdmFyIGVtYmVkRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJlbWJlZCIpOworICAgICAgICBlbWJlZEVsZW1lbnQuc3R5bGUud2lkdGggPSA0MDsKKyAg
ICAgICAgZW1iZWRFbGVtZW50LnN0eWxlLmhlaWdodCA9IDQwOworICAgICAgICB2YXIgZW1iZWRF
bGVtZW50MiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbWJlZDIiKTsKKyAgICAgICAgZW1i
ZWRFbGVtZW50Mi5zdHlsZS53aWR0aCA9IDQwOworICAgICAgICBlbWJlZEVsZW1lbnQyLnN0eWxl
LmhlaWdodCA9IDQwOworICAgICAgICB0ZXN0UnVubmVyLm5vdGlmeURvbmUoKQorICAgIH0sIDIw
MDApOworfQorPC9zY3JpcHQ+Cis8ZW1iZWQgaWQ9ImVtYmVkIiBzcmM9Ii4uL3Jlc291cmNlcy9s
aW5lcy5zd2YiPjwvZW1iZWQ+Cis8ZW1iZWQgaWQ9ImVtYmVkMiIgc3JjPSIuLi9yZXNvdXJjZXMv
bGluZXMuc3dmIiBzdHlsZT0id2lkdGg6MzAwcHg7IGhlaWdodDozMDBweCI+PC9lbWJlZD4K
</data>
<flag name="review"
          id="253695"
          type_id="1"
          status="+"
          setter="thorton"
    />
          </attachment>
      

    </bug>

</bugzilla>